Compartilhar via


Configurar pontos de extremidade USB em um driver de controlador de host USB

O UCX gerencia a criação de objetos de ponto de extremidade e notifica o controlador de host para programar ou desprogramar pontos de extremidade no controlador de host USB.

Embora um ponto de extremidade seja programado, ele também é gerenciado pelo UCX. O estado de um ponto de extremidade muda à medida que os dispositivos são conectados e desconectados do barramento, experimentam eventos de energia, como suspensão e redefinição, e passam pela criação de novos pontos de extremidade, como alterações de configuração alternativas.

Configuração de ponto de extremidade

O UCX invoca funções de retorno de chamada implementadas pelo driver do controlador de host para notificar o driver quando os pontos de extremidade devem ser programados no controlador de host USB ou liberados. Quando EVT_UCX_USBDEVICE_ENABLE é chamado, o driver prepara o controlador para executar transferências para o ponto de extremidade padrão do dispositivo. Preparar o controlador inclui a programação do ponto de extremidade padrão. Quando EVT_UCX_USBDEVICE_DISABLE é chamado, o driver desprograma o ponto de extremidade padrão e libera outros recursos do controlador associados ao dispositivo. Quando EVT_UCX_USBDEVICE_ENDPOINTS_CONFIGURE é chamado, o driver recebe uma lista de pontos de extremidade não padrão para programar no controlador e recebe outra lista de pontos de extremidade não padrão a serem removidos do controlador. Em seguida, o driver do controlador de host programa os pontos de extremidade não padrão especificados no controlador e também remove os pontos de extremidade não padrão (especificados na outra lista) do controlador.

Gerenciamento de estado da fila

O UCX invoca funções de retorno de chamada implementadas pelo driver do controlador de host para executar alterações no estado da fila do ponto de extremidade. Em seguida, o driver executa a ação correspondente na fila do ponto de extremidade fornecida ao UCX e em todas as filas de segundo nível mantidas dentro do driver. As filas de ponto de extremidade são anuladas ou limpas nestes cenários:

  • O driver cliente do dispositivo USB envia uma solicitação de URB_FUNCTION_ABORT_PIPE.
  • Durante a suspensão.
  • Quando o hub ao qual um dispositivo está anexado, detecta uma desconexão de dispositivo.
  • Durante uma solicitação de configuração de interface de seleção.

Para notificar o driver do controlador de host sobre uma anulação ou limpeza de fila, o UCX chama EVT_UCX_ENDPOINT_ABORT ou EVT_UCX_ENDPOINT_PURGE. Se em algum momento posterior a fila do ponto de extremidade for necessária pelo UCX, o UCX invocará o retorno de chamada EVT_UCX_ENDPOINT_START para notificar o driver para iniciar a fila.

Transferir cancelamento

Para qualquer controlador para o qual o driver do controlador host declara GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL, o driver deve chamar UcxEndpointNeedToCancelTransfers e implementar EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS para cancelar transferências USB assíncronas (em massa ou controle) para um dispositivo USB de alta ou baixa velocidade que esteja por trás de um hub TT (Tradutor de Transações). Em todos os outros casos, o driver pode, opcionalmente, chamar UcxEndpointNeedToCancelTransfers para obter uma notificação de EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS que indica que o cancelamento de transferências é permitido nesse ponto de extremidade e o driver pode continuar a cancelar as transferências. Como alternativa, o driver pode cancelar transferências diretamente sem chamar UcxEndpointNeedToCancelTransfers.

Se o driver do controlador de host sempre falhar na solicitação desse GUID, ele poderá ignorar essas duas chamadas de função inteiramente.

Se o driver nunca chamar UcxEndpointNeedToCancelTransfers, o retorno de chamada EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS do driver não será chamado e poderá ser NULL durante o registro de retorno de chamada.

Se o driver pretende usar UcxEndpointNeedToCancelTransfers, o driver deve chamar o método quando uma transferência foi programada para o controlador e, em seguida, cancelada e aguarda EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS antes de concluí-lo.