Dela via


WinUSB-funktioner för ändring av kanallpolicy

För att möjliggöra för program att hämta standardprincipparametrar för ett slutpunktsrör, exponerar Winusb.dll funktionen WinUsb_GetPipePolicy för att hämta rörens standardprincip. Med funktionen WinUsb_SetPipePolicy kan ett program ange ett nytt värde för principparametern.

Med WinUSB kan du ändra standardbeteendet genom att tillämpa principer på en slutpunkts pipe. Genom att använda dessa principer kan du konfigurera WinUSB så att den bäst matchar enhetens funktioner. Följande tabell innehåller en lista över de pipe-principer som stöds av WinUSB.

Anmärkning

De principer som beskrivs i tabellen är endast giltiga för de angivna slutpunkterna. Att ange principen på andra slutpunkter påverkar inte WinUSB:s beteende för läs- eller skrivbegäranden.

Försäkringsnummer Policynamn Beskrivning Slutpunkt (riktning) Standardvärde
0x01 SHORT_PACKET_TERMINATE Skickar ett paket med noll längd för en skrivbegäran där bufferten är en multipel av den maximala paketstorlek som stöds av slutpunkten. Bulk (OUT)

Avbrott (OUT)
Falskt
0x02 AUTOMATISK_AVSTÄNGNING_FELSÖKNING Rensar automatiskt en stoppad rörledning utan att stoppa dataflödet. Bulk (IN)

Avbrott (IN)
Falskt
0x03 PIPE_TRANSFER_TIMEOUT Väntar på ett tidsgränsintervall i millisekunder innan begäran avbryts. Bulk (IN)

Bulk (UTGÅENDE)

Avbrott (IN)

Avbrott (UT)
5 sekunder (5 000 millisekunder) för kontroll; 0 för andra
0x04 IGNORE_SHORT_PACKETS Slutför en läsbegäran när ett kort paket tas emot eller ett visst antal byte läss. Om filstorleken är okänd avslutas begäran med ett kort paket. Bulk (IN)

Avbrott (IN)
Falskt
0x05 ALLOW_PARTIAL_READS Tillåter läsbegäranden från en enhet som returnerar mer data än vad som begärs av anroparen. Bulk (IN)

Avbrott (IN)
TRUE
0x06 AUTO_FLUSH Sparar överflödiga data från läsbegäran och lägger till dem i nästa läsbegäran eller tar bort överflödiga data. Bulk (IN)

Avbrott (IN)
Falskt
0x07 RAW_IO Kringgår kö- och felhantering för att öka prestandan för flera läsbegäranden. Bulk (IN)

Avbrott (IN)
Falskt
0x08 MAXIMAL ÖVERFÖRINGSSTORLEK Hämtar den maximala storleken på en USB-överföring som stöds av WinUSB. Det här är en skrivskyddad policy som kan hämtas genom att anropa WinUsb_GetPipePolicy. Bulk (IN)

Bulk (OUT)

Avbrott (IN)

Avbrott (OUT)
0x09 ÅTERSTÄLL_RÖR_VID_ÅTERUPPTAGNING Återställer slutpunktens pipe efter att ha fortsatt från viloläge innan nya förfrågningar accepteras. Bulk (IN)

Bulk (OUT)

Avbrott (IN)

Avbrott (OUT)
Falskt

Följande tabell identifierar metodtips för hur du använder var och en av pipe-principerna och beskriver det resulterande beteendet när principen är aktiverad.

Riktlinje Aktivera om... Beteende
SHORT_PACKET_TERMINATE(0x01) Enheten kräver att OUT-överföringarna avslutas med ett paket med noll längd. De flesta enheter har inte det här kravet. Om aktiverad (principparametervärdet är TRUE eller nonzero) följs varje skrivbegäran som är en multipel av den maximala paketstorleken som stöds av slutpunkten av ett paket med noll längd.

Efter att ha skickat data till värdkontrollanten skickar WinUSB en skrivbegäran med ett paket med noll längd och slutför sedan den begäran som skapades av WinUsb_WritePipe.
AUTO_CLEAR_STALL Du vill inte att de misslyckade överföringarna ska lämna slutpunkten i ett fastnat läge. Den här principen är endast användbar när du har flera väntande läsbegäranden till slutpunkten när RAW_IO är inaktiverad.
  • Om aktiverat (om policyparametervärdet är SANT eller icke-noll) rensas ett dödläge automatiskt. Den här principparametern påverkar inte kontrollpipor.

    När en läsbegäran misslyckas och värdstyrenheten returnerar en annan status än STATUS_CANCELLED eller STATUS_DEVICE_NOT_CONNECTED återställer WinUSB röret innan den misslyckade begäran slutförs. Genom att återställa kanalen rensas stoppvillkoret utan att dataflödet avbryts. Data fortsätter att flöda i slutpunkterna så länge nya överföringar fortsätter att komma från enheten. En ny överföring kan omfatta en som fanns i kön när stoppet inträffade.

    Om du aktiverar den här principen påverkas inte prestandan nämnvärt.

  • Om inaktiverat (principparametervärdet är FALSE eller noll) misslyckas alla överföringar som kommer till slutpunkten efter den stoppade överföringen tills anroparen återställer slutpunktens pipe manuellt genom att anropa WinUsb_ResetPipe.
PIPE_TRANSFER_TIMEOUT Du förväntar dig att överföringar till en slutpunkt slutförs inom en viss tid.
  • Om värdet är noll (standard), kommer överföringarna inte att avbrytas eftersom värdstyrenheten inte avbryter överföringen. I det här fallet väntar överföringen på obestämd tid tills den avbryts manuellt eller överföringen slutförs normalt.
  • Om värdet är inställt på ett icke-nollvärde (tidsgränsintervall) startar värdstyrenheten en timer när den tar emot överföringsbegäran. När timern överskrider det angivna tidsgränsintervallet avbryts begäran.

    En mindre prestandapåverkan uppstår på grund av timerhantering.

    Begäranden överskrider inte tidsgränsen när de väntar i en WinUSB-kö.

    I Windows Vista, för alla överföringar (utom överföringar med RAW_IO aktiverat) köar WinUSB begäran tills alla tidigare överföringar på målslutpunkten har slutförts. Värdstyrenheten inkluderar inte kötiden i beräkningen av tidsgränsintervallet.

    Med RAW_IO aktiverat köar WinUSB inte begäran. I stället skickas begäran direkt till USB-stacken, oavsett om USB-stacken är upptagen med att bearbeta tidigare överföringar. Om USB-stacken är upptagen kan det fördröja bearbetningen av den nya begäran. Detta kan orsaka en timeout.
IGNORE_SHORT_PACKETS RAW_IO är inaktiverat och du vill inte att korta paket ska slutföra läsbegäranden.
  • Om aktiverad (principparametervärdet är TRUE eller nonzero) slutför värdstyrenheten inte en läsåtgärd omedelbart efter att den har fått ett kort paket. I stället slutförs åtgärden endast om:
    • Ett fel inträffar.
    • Begäran avbryts.
    • Alla begärda byte har tagits emot.
  • Om inaktiverat (principparametervärdet är FALSE eller noll) slutför värdstyrenheten en läsåtgärd efter att den har läst det begärda antalet byte eller tagit emot ett kort paket.
ALLOW_PARTIAL_READS Enheten kan skicka mer data än vad som begärts om storleken på din begärandebuffert är en multipel av den maximala slutpunktspaketstorleken.

Använd om din applikation vill läsa ett fåtal byte för att avgöra hur många byte som totalt ska läsas.
  • Om inaktiverat (principparametervärdet är FALSE eller noll) och enheten returnerar mer data än vad som begärdes, slutför WinUSB begäran med ett fel.
  • Om aktiverad (principparametervärdet är TRUE eller nonzero) och enheten returnerar mer data än vad som begärdes kan WinUSB (beroende på AUTO_FLUSH inställningar) lägga till överflödiga data från läsbegäran i början av nästa läsbegäran eller ta bort överflödiga data.

    Om det är aktiverat slutför WinUSB omedelbart läsbegäranden för noll byte och skickar inte begäranden nedåt i stacken.
AUTO_FLUSH ALLOW_PARTIAL_READS-policy är aktiverad.

Enheten kan skicka mer data än vad som begärdes och programmet kräver inga andra data. Detta är möjligt om storleken på din begärandebuffert är en multipel av den maximala slutpunktspaketstorleken.
AUTO_FLUSH definierar WinUSB:s beteende när ALLOW_PARTIAL_READS är aktiverat. Om ALLOW_PARTIAL_READS är inaktiverat ignoreras värdet för AUTO_FLUSH av WinUSB.

WinUSB kan antingen ta bort återstående data eller skicka dem med uppringarens nästa läsbegäran.

  • Om aktiverad (principparametervärdet är TRUE eller nonzero) tar WinUSB bort de extra byteen utan felkod.
  • Om inaktiverat (principparametervärdet är FALSE eller noll) sparar WinUSB de extra byteen, lägger till dem i början av anroparens nästa läsbegäran och skickar sedan data till anroparen i nästa läsåtgärd.
RAW_IO Prestanda är en prioritet och programmet skickar samtidiga läsbegäranden till samma slutpunkt.

RAW_IO inför vissa begränsningar för bufferten som skickas av anroparen i WinUsb_ReadPipe:

  • Buffertlängden måste vara en multipel av den maximala slutpunktspaketstorleken.
  • Längden måste vara mindre än eller lika med värdet för MAXIMUM_TRANSFER_SIZE som hämtas av WinUsb_GetPipePolicy.
Om det är aktiverat kringgår överföringar köer och felhantering för att öka prestandan för flera läsbegäranden. WinUSB hanterar läsbegäranden på följande sätt:

  • En begäran som inte är en multipel av den maximala slutpunktspaketstorleken misslyckas.
  • En begäran som är större än den maximala överföringsstorlek som stöds av WinUSB misslyckas.
  • Alla välformulerade begäranden skickas omedelbart ned till USB-kärnstacken för schemaläggning i hostkontrollanten.


Om du aktiverar den här inställningen förbättras prestanda avsevärt för flera läsbegäranden genom att minska fördröjningen mellan det sista paketet för en överföring och det första paketet i nästa överföring.
ÅTERSTÄLL_RÖR_VID_ÅTERUPPTAGNING Enheten bevarar inte sitt dataväxlingstillstånd över vila. Vid återställning från paus återställer WinUSB slutpunkten innan den tillåter anroparen att skicka nya begäranden till slutpunkten.