Werken met USB Pipes

Het framework vertegenwoordigt elke pijp in een USB-interface als een framework USB-pijpobject. Wanneer een stuurprogramma een USB-apparaat configureert, maakt het framework een framework USB-pijpobject voor elke pijp in elke geselecteerde interface. Met pipe-objectmethoden kan een stuurprogramma de volgende bewerkingen uitvoeren:

pijpinformatie verkrijgen

Nadat u WdfUsbInterfaceGetConfiguredPipe hebt aangeroepen om een ingang te verkrijgen voor een framework USB-pijpobject, kan uw stuurprogramma de volgende methoden aanroepen die het USB-pijpobject definieert voor het verkrijgen van informatie over de USB-pijp:

WdfUsbTargetPipeGetIoTarget
Retourneert een ingang naar het I/O-doelobject dat is gekoppeld aan een USB-pijp. Het stuurprogramma kan deze handle doorgeven aan WdfRequestSend.

WdfUsbTargetPipeGetInformation
Haalt informatie op over een USB-pijp en het eindpunt.

WdfUsbTargetPipeGetType
Retourneert het type USB-pijp.

WdfUsbTargetPipeIsInEndpoint
Bepaalt of een USB-pijp is verbonden met een ingangseindpunt.

WdfUsbTargetPipeIsOutEndpoint
Bepaalt of een USB-pijp is verbonden met een uitvoereindpunt.

WDF_USB_PIPE_DIRECTION_IN
Bepaalt of een USB-eindpunt een invoereindpunt is.

WDF_USB_PIPE_DIRECTION_OUT
Bepaalt of een USB-eindpunt een uitvoereindpunt is.

Zie USB-pijpen opsommenvoor verwante informatie.

lezen vanuit een pijp

Als u gegevens wilt lezen uit een USB-invoerpijp, kan uw stuurprogramma een (of alle) van de volgende drie technieken gebruiken:

  • Gegevens synchroon lezen

    Als u gegevens synchroon wilt lezen vanuit een USB-invoerpijp, kan uw stuurprogramma de WdfUsbTargetPipeReadSynchronously methode aanroepen. Met deze methode wordt een leesaanvraag gebouwd en verzonden. Deze wordt geretourneerd nadat de I/O-bewerking is voltooid.

  • Gegevens asynchroon lezen

    Als u gegevens asynchroon wilt lezen vanuit een USB-invoerpijp, kan uw stuurprogramma de methode WdfUsbTargetPipeFormatRequestForRead methode aanroepen om een leesaanvraag te maken. Vervolgens kan het stuurprogramma WdfRequestSend aanroepen om de aanvraag asynchroon (of synchroon) te verzenden.

  • Gegevens asynchroon en continu lezen

    Een continue lezer is een mechanisme dat door het framework wordt geleverd om ervoor te zorgen dat een leesaanvraag altijd beschikbaar is voor een USB-pijp. Dit mechanisme garandeert dat het stuurprogramma altijd gereed is voor het ontvangen van gegevens van een apparaat dat een asynchrone, ongevraagde invoerstroom biedt. Een stuurprogramma voor een netwerkinterfacekaart (NIC) kan bijvoorbeeld een continue lezer gebruiken om invoergegevens te ontvangen.

    Als u een doorlopende lezer wilt configureren voor een invoerpijp, moet de EvtDevicePrepareHardware callback-functie van het stuurprogramma de methode WdfUsbTargetPipeConfigContinuousReader aanroepen. Met deze methode wordt een reeks leesaanvragen naar het I/O-doel van het apparaat in de wachtrij geplaatst.

    Daarnaast moet de callback-functie van de EvtDeviceD0Entry van het stuurprogramma de WdfIoTargetStart aanroepen om de lezer continu te starten, en moet de callback-functie van de EvtDeviceD0Exit de WdfIoTargetStop aanroepen om de lezer continu te stoppen.

    Telkens wanneer de gegevens beschikbaar zijn vanaf het apparaat, wordt een leesaanvraag voltooid en wordt in het framework een van de twee callback-functies aangeroepen: EvtUsbTargetPipeReadComplete, als het I/O-doel de gegevens heeft gelezen of EvtUsbTargetPipeReadersFailed, als het I/O-doel een fout meldt.

    Als u de optionele EvtUsbTargetPipeReadersFailed callback niet opgeeft, reageert het framework op een mislukte leespoging door een andere leesaanvraag te verzenden. Als de bus zich daarom in een toestand bevindt waarin leesbewerkingen niet worden geaccepteerd, verzendt het framework voortdurend nieuwe aanvragen om te herstellen na een mislukte leesbewerking.

    Nadat een stuurprogramma WdfUsbTargetPipeConfigContinuousReaderheeft aangeroepen, kan het stuurprogramma niet WdfUsbTargetPipeReadSynchronously of WdfRequestS gebruiken om I/O-aanvragen naar de pijp te verzenden, tenzij de EvtUsbTargetPipeReadersFailed callback-functie wordt aangeroepen en retourneert FALSE.

Standaard rapporteert het framework een fout als uw stuurprogramma een leesbuffer opgeeft die geen veelvoud is van de maximale pakketgrootte van de pijp. Uw stuurprogramma kan WdfUsbTargetPipeSetNoMaximumPacketSizeCheck aanroepen om deze test van leesbuffergrootten uit te schakelen.

Zie voor gerelateerde informatie:

Schrijven naar een pijp

Als u gegevens wilt schrijven naar een USB-uitvoerpijp, kan uw stuurprogramma een (of beide) van de volgende technieken gebruiken:

  • Gegevens synchroon schrijven

    Als u gegevens synchroon wilt schrijven naar een USB-uitvoerpijp, kan uw stuurprogramma de WdfUsbTargetPipeWriteSynchronously methode aanroepen. Met deze methode wordt een schrijfaanvraag gebouwd en verzonden. Deze wordt geretourneerd nadat de I/O-bewerking is voltooid.

  • Gegevens asynchroon schrijven

    Als u gegevens asynchroon naar een USB-invoerpijp wilt schrijven, kan uw stuurprogramma de WdfUsbTargetPipeFormatRequestForWrite methode aanroepen om een schrijfaanvraag te maken. Vervolgens kan het stuurprogramma WdfRequestSend aanroepen om de aanvraag asynchroon te verzenden.

Zie Hoe USB bulktranferverzoeken te verzendenvoor gerelateerde informatie.

een pijp stoppen en opnieuw instellen

Uw stuurprogramma kan de volgende methoden aanroepen om een USB-pijp te stoppen of opnieuw in te stellen:

WdfUsbTargetPipeAbortSynchronously
Verzendt synchroon een aanvraag om een USB-pijp te stoppen.

WdfUsbTargetPipeFormatRequestForAbort
Hiermee wordt een aanvraag opgemaakt om een USB-pijp te stoppen. Het stuurprogramma kan WdfRequestSend aanroepen om de aanvraag synchroon of asynchroon te verzenden.

WdfUsbTargetPipeResetSynchronously
Verzendt synchroon een aanvraag om een USB-pijp opnieuw in te stellen.

WdfUsbTargetPipeFormatRequestForReset
Hiermee wordt een aanvraag voor het opnieuw instellen van een USB-pijp opgemaakt. Het stuurprogramma moet WdfRequestSend aanroepen om de aanvraag synchroon of asynchroon te verzenden.

Als het USB-doel van uw stuurprogramma een I/O-aanvraag voltooit met een foutstatuswaarde, moet uw stuurprogramma het volgende doen:

  1. Stop de pijp en annuleer eventuele aanvullende I/O-aanvragen die het stuurprogramma naar het USB-doel heeft verzonden, als het doel de aanvragen niet heeft voltooid.

    Roep WdfIoTargetStop aan met de vlag WdfIoTargetCancelSentIo.

  2. Verzend een afbreekverzoek synchroon naar de pijp.

    Roep WdfUsbTargetPipeAbortSynchronouslyaan of roep WdfUsbTargetPipeFormatRequestForAbort aan, gevolgd door WdfRequestSend, met de WDF_REQUEST_SEND_OPTION_SYNCHRONOUS vlag ingesteld.

  3. Verzend synchroon een resetaanvraag naar de pijp.

    Roep WdfUsbTargetPipeResetSynchronouslyaan of roep WdfUsbTargetPipeFormatRequestForReset gevolgd door WdfRequestSend met de WDF_REQUEST_SEND_OPTION_SYNCHRONOUS vlag ingeschakeld.

  4. Start de pijp opnieuw op.

    Bel WdfIoTargetStart.

  5. Verzend de I/O-aanvraag die is mislukt opnieuw en alle I/O-aanvragen die de mislukte aanvraag hebben gevolgd.

Na een aanzienlijk aantal storingen moet het stuurprogramma proberen de USB-poort opnieuw in te stellen door het volgende te doen:

  1. Stop alle actieve pijpen en annuleer eventuele extra I/O-aanvragen die het stuurprogramma naar het USB-doel van elke pijp heeft verzonden, als het doel ze niet heeft voltooid.

    Roep voor elke actieve pijp WdfIoTargetStop aan met de vlag WdfIoTargetCancelSentIo ingesteld.

  2. Verzend synchroon een aanvraag om de USB-poort opnieuw in te stellen.

    Roep WdfUsbTargetDeviceResetPortSynchronouslyaan.

  3. Start de pijpen opnieuw op.

    Roep WdfIoTargetStart aan voor elke buis die het stuurprogramma heeft stopgezet.

  4. Verzend de laatste I/O-aanvraag die is mislukt opnieuw en alle I/O-aanvragen die de mislukte aanvraag hebben gevolgd.

Zie Hoe herstel je USB-pijplijnfoutenvoor verwante informatie.

een URB naar een pijp verzenden

Als uw KMDF-stuurprogramma communiceert met een USB-pijp door I/O-aanvragen met URL's te verzenden, kan het stuurprogramma de volgende methoden aanroepen:

WdfUsbTargetPipeSendUrbSynchronously (alleen KMDF)
Verzendt synchroon een I/O-aanvraag die een URB bevat.

WdfUsbTargetPipeFormatRequestForUrb (alleen KMDF)
Hiermee wordt een I/O-verzoek geformatteerd dat een URB bevat. Het stuurprogramma kan WdfRequestSend aanroepen om de aanvraag synchroon of asynchroon te verzenden.

WdfUsbTargetPipeWdmGetPipeHandle (alleen KMDF)
Retourneert de USBD-pijpgreep van een apparaat. Voor sommige URB's is deze referentie vereist.