Compartilhar via


Manipular solicitações de E/S em um driver de controlador de host USB

Práticas recomendadas para um driver de controlador de host para lidar com solicitações de E/S enviadas pelo UCX.

O UCX controla todos os pontos de extremidade que foram criados pelo driver do controlador de host para dispositivos no barramento USB. Todas as solicitações de transferência de dados enviadas pelo driver do hub ou por outro driver mais alto na pilha de dispositivos USB são primeiro tratadas pelo UCX. O UCX é responsável por encaminhar o objeto de solicitação de estrutura para a fila correta do ponto de extremidade. O URB (Bloco de Solicitação USB) contido na solicitação pode especificar um identificador de ponto de extremidade. Se um identificador de ponto de extremidade for especificado, o UCX verificará o ponto de extremidade correspondente entre os pontos de extremidade presentes para o dispositivo. Se o identificador de ponto de extremidade especificado estiver presente, a solicitação será encaminhada para a fila do ponto de extremidade. Se o identificador de ponto de extremidade especificado não for encontrado, a solicitação falhará. Se nenhum identificador for especificado, a solicitação será para o ponto de extremidade padrão e o UCX encaminhará a solicitação para a fila de pontos de extremidade padrão do driver do controlador host para esse dispositivo.

Para garantir a compatibilidade com os drivers USB existentes, o controlador de host deve estar em conformidade com os seguintes requisitos ao concluir a solicitação URB:

  • WdfRequestComplete deve ser chamado em DISPATCH_LEVEL.
  • Se o URB foi entregue à sua fila de estrutura e o driver começou a processá-lo de forma síncrona no thread do driver de chamada ou no DPC, a solicitação também não deve ser concluída de forma síncrona. A solicitação deve ser concluída em um DPC separado, que pode ser agendado com uma chamada para WdfDpcEnqueue.
  • Semelhante ao requisito anterior, ao receber EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE ou EVT_WDF_REQUEST_CANCEL, o driver do controlador de host deve concluir a solicitação URB em um DPC separado do thread de chamada ou do DPC. Por padrão, o WDF conclui as solicitações canceladas na fila de forma síncrona. Esse comportamento pode causar problemas para solicitações URB. Por esse motivo, o driver deve fornecer um retorno de chamada EvtIoCanceledOnQueue para suas filas URB.

O objeto de solicitação de estrutura de um IOCTL_INTERNAL_USB_SUBMIT_URB contém um URB localizado em Parameters.Others.Arg1 da solicitação. Quando a solicitação for concluída, o status URB deverá ser definido como USBD_STATUS_SUCCESS ou como uma falha status que indique a natureza da falha. A falha status valores são definidos no arquivo de cabeçalho usb.h.