Share via


Configurare gli endpoint USB in un driver del controller host USB

UCX gestisce la creazione di oggetti endpoint e notifica al controller host di programmare o deprogramma gli endpoint nel controller host USB.

Anche se un endpoint è programmato, è gestito anche da UCX. Lo stato di un endpoint cambia quando i dispositivi sono connessi e disconnettersi dal bus, sperimentare eventi di alimentazione, ad esempio sospensione e reimpostazione, e subire la creazione di nuovi endpoint, ad esempio modifiche alle impostazioni alternative.

Configurazione dell'endpoint

UCX richiama le funzioni di callback implementate dal driver del controller host per notificare al driver quando gli endpoint devono essere programmati nel controller host USB o rilasciati. Quando viene chiamato EVT_UCX_USBDEVICE_ENABLE , il driver prepara il controller per eseguire i trasferimenti all'endpoint predefinito del dispositivo. La preparazione del controller include la programmazione dell'endpoint predefinito. Quando viene chiamato EVT_UCX_USBDEVICE_DISABLE , il driver degramma l'endpoint predefinito e libera altre risorse controller associate al dispositivo. Quando viene chiamato EVT_UCX_USBDEVICE_ENDPOINTS_CONFIGURE , il driver viene assegnato un elenco di endpoint non predefiniti da programmare nel controller e viene assegnato un altro elenco di endpoint non predefiniti da rimuovere dal controller. Il driver del controller host programma quindi gli endpoint non predefiniti specificati nel controller e rimuove anche gli endpoint non predefiniti (specificati nell'altro elenco) dal controller.

Gestione dello stato della coda

UCX richiama le funzioni di callback implementate dal driver del controller host per eseguire modifiche allo stato della coda dell'endpoint. Il driver esegue quindi l'azione corrispondente nella coda dell'endpoint assegnata a UCX e in qualsiasi coda di secondo livello gestita all'interno del driver. Le code degli endpoint vengono interrotte o eliminate in questi scenari:

  • Il driver client del dispositivo USB invia una richiesta di URB_FUNCTION_ABORT_PIPE.
  • Durante la sospensione.
  • Quando l'hub a cui è collegato un dispositivo, rileva una disconnessione del dispositivo.
  • Durante una richiesta di impostazione dell'interfaccia selezionata.

Per notificare al driver del controller host informazioni sull'interruzione o l'eliminazione di una coda, UCX chiama EVT_UCX_ENDPOINT_ABORT o EVT_UCX_ENDPOINT_PURGE. Se in un secondo momento la coda dell'endpoint è necessaria da UCX, UCX richiama il callback EVT_UCX_ENDPOINT_START per notificare al driver di avviare la coda.

Annullamento trasferimento

Per qualsiasi controller per cui il driver del controller host dichiara GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL, il driver deve chiamare UcxEndpointNeedToCancelTransfers e implementare EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS per annullare il trasferimento asincrono (Bulk o Control) USB a un dispositivo USB full o low speed che si trova dietro un hub TT (Transaction Translator). In tutti gli altri casi, il driver può chiamare facoltativamente UcxEndpointNeedToCancelTransfers per ottenere una notifica di EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS che indica che l'annullamento dei trasferimenti è consentito in questo endpoint e il driver può procedere per annullare i trasferimenti. In alternativa, il driver può annullare i trasferimenti direttamente senza chiamare UcxEndpointNeedToCancelTransfers.

Se il driver del controller host ha sempre esito negativo la richiesta per questo GUID, può ignorare completamente queste due chiamate di funzione.

Se il driver non chiama mai UcxEndpointNeedToCancelTransfers, il callback del driver EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS non viene chiamato e può essere NULL durante la registrazione del callback.

Se il driver intende usare UcxEndpointNeedToCancelTransfers, il driver deve chiamare il metodo quando un trasferimento è stato programmato nel controller e quindi annullato e quindi attende di EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS prima di completarlo.