Share via


Gestire le richieste di I/O in un driver controller host USB

Procedure consigliate per un driver del controller host per la gestione delle richieste di I/O inviate da UCX.

UCX tiene traccia di tutti gli endpoint creati dal driver del controller host per i dispositivi nel bus USB. Tutte le richieste di trasferimento dei dati inviate dal driver hub o da un altro driver superiore nello stack di dispositivi USB vengono prima gestite da UCX. UCX è responsabile dell'inoltro dell'oggetto richiesta framework alla coda dell'endpoint corretta. Il blocco di richieste USB (BLOCK) contenuto nella richiesta può specificare un handle endpoint. Se viene specificato un handle di endpoint, UCX verifica la presenza dell'endpoint corrispondente tra gli endpoint presenti per il dispositivo. Se l'handle endpoint specificato è presente, la richiesta viene inoltrata alla coda dell'endpoint. Se l'handle dell'endpoint specificato non viene trovato, la richiesta non è riuscita. Se non viene specificato alcun handle, la richiesta è per l'endpoint predefinito e UCX inoltra la richiesta alla coda endpoint predefinita del driver del controller host per tale dispositivo.

Per garantire la compatibilità con i driver USB esistenti, il controller host deve rispettare i requisiti seguenti durante il completamento della richiesta ODBC:

  • WdfRequestComplete deve essere chiamato in DISPATCH_LEVEL.
  • Se l'elemento ODBC è stato recapitato alla coda del framework e il driver ha iniziato a elaborarlo in modo sincrono sul thread del driver chiamante o sul DPC, la richiesta non deve essere completata in modo sincrono. La richiesta deve essere completata in un DPC separato, che può essere pianificato con una chiamata a WdfDpcEnqueue.
  • Analogamente al requisito precedente, al momento della ricezione di EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE o EVT_WDF_REQUEST_CANCEL, il driver del controller host deve completare la richiesta ATTESTAZIONe in un DPC separato dal thread chiamante o DPC. Per impostazione predefinita, WDF completa in modo sincrono le richieste annullate nella coda. Questo comportamento potrebbe causare problemi per le richieste DELL'OGGETTO. Per questo motivo, il driver deve fornire un callback EvtIoCanceledOnQueue per le code DELL'OGGETTO.

L'oggetto richiesta del framework per un IOCTL_INTERNAL_USB_SUBMIT_URB contiene un oggettoITEM che si trova in Parameters.Others.Arg1 della richiesta. Al termine della richiesta, lo stato DELL'OGGETTO deve essere impostato su USBD_STATUS_SUCCESS o su uno stato di errore che indica la natura dell'errore. I valori di stato dell'errore sono definiti nel file di intestazione usb.h.