Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Práticas recomendadas para um driver de controlador host para lidar com solicitações de E/S enviadas pela UCX.
UCX mantém o controle de todos os endpoints que foram criados pelo driver do controlador host para dispositivos no barramento USB. Todas as solicitações de transferência de dados enviadas pelo driver do hub, ou por outro driver que esteja mais acima na pilha de dispositivos USB, são primeiro tratadas pela UCX. O UCX é responsável por encaminhar o objeto de solicitação do framework para a fila de endpoint correta. O USB Request Block (URB) contido na solicitação pode especificar um identificador de ponto final. Se um identificador de ponto de extremidade for especificado, o UCX verificará o ponto de extremidade correspondente entre os pontos de extremidade presentes no dispositivo. Se o identificador de endpoint especificado estiver presente, a solicitação será encaminhada para a fila do endpoint. 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 ponto de extremidade padrão do driver do controlador host para esse dispositivo.
Para garantir a compatibilidade com os drivers USB existentes, o controlador host deve cumprir os seguintes requisitos ao concluir a solicitação URB:
- WdfRequestComplete deve ser chamado em DISPATCH_LEVEL.
- Se o URB foi entregue em sua fila de estrutura e o driver começou a processá-lo de forma síncrona no thread do driver de chamada ou 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 host deve concluir a solicitação URB em um DPC separado do thread de chamada ou DPC. Por padrão, o WDF conclui solicitações canceladas na fila de forma síncrona. Esse comportamento pode causar problemas para as solicitações de URB. Por esse motivo, o driver deve fornecer um retorno de chamada EvtIoCanceledOnQueue para as suas filas URB.
O objeto de requisição do framework para um IOCTL_INTERNAL_USB_SUBMIT_URB contém um URB localizado em Parameters.Others.Arg1 da requisição. Quando a solicitação é concluída, o status URB deve ser definido como USBD_STATUS_SUCCESS ou como um status de falha que indique a natureza da falha. Os valores de status de falha são definidos no arquivo de cabeçalho usb.h.