Drivers de cliente USB para Media-Agnostic (MA-USB)

no Windows 10, a versão 1709, pilha de drivers usb pode enviar pacotes usb por meio de meios físicos não USB, como o Wi-Fi usando o protocolo de usb (MA-usb) independente de mídia. O novo recurso foi projetado de forma que as alterações necessárias para os drivers de cliente USB existente sejam mínimas. Esse conjunto de alterações inclui informações adicionais sobre o transporte:

  • Para dispositivos com pontos de extremidade de isochronous/streaming, o driver do cliente precisa saber os atrasos associados à programação de transferência e à conclusão da transferência para que o driver possa garantir que o dispositivo obtenha os pacotes isochronous no tempo.

  • O driver do cliente pode usar esse informationf para otimizar a seleção de protocolos de camada superior. Por exemplo, um driver de vídeo pode usar as informações de latência e largura de banda para escolher os melhores codecs e esquemas de buffer. Como essas características podem ser alteradas dinamicamente, o driver precisa determinar as alterações.

Obtendo os atrasos para transferências de isochronous

Para pontos de extremidade isochronous, o driver do cliente precisa saber a latência máxima de programação e a latência máxima de conclusão. Essa solicitação deve ser direcionada para um pipe específico porque essa latência pode ser diferente para diferentes pontos de extremidade no mesmo dispositivo que a especificação MA-USB fornece mecanismos para que o host Calcule esses valores.

Para compilar essa solicitação, o driver deve usar o _URB_GET_ISOCH_PIPE_TRANSFER_PATH_DELAYS URB.

Observação

Nesta versão, esse recurso está disponível apenas para drivers baseados em KMDF e WDM.

Aqui estão algumas práticas recomendadas para a criação deste URB:

  • O dirver do cliente deve alocar esse URB chamando WdfUsbTargetDeviceCreateUrb ou USBD_UrbAllocate.
  • O URB pode ser enviado em = nível de < expedição.
  • Se o URB for direcionado a um ponto de extremidade não isochronous, a pilha de drivers USB falhará na solicitação.
  • O driver do cliente não deve supor que essa URB seja suportada por pilhas USB de terceiros. Ele terá suporte de todos os drivers de cliente USB da caixa de entrada Microsoft = fornecidos.

Para um isochronous contínuo no streaming, o driver de cliente normalmente emite várias solicitações de leitura pendentes. O driver pode usar o tempo de ida e volta para calcular o número de pacotes isochronous que precisam estar em uma solicitação de leitura com base no número de solicitações de leitura pendentes.

Por exemplo, se o número de solicitações pendentes for dois, o número de pacotes isochronous em um URB deverá ser pelo menos (tempo de ida e volta total)/(comprimento do intervalo de serviço) em que o total de tempo de ida e hora = MaximumSendPathDelayInMilliSeconds + MaximumCompletionPathDelayInMilliSeconds

Se o atraso de envio = 10 ms, atraso de conclusão = 15msec, em seguida, o total de ida e volta = 25msec. Se o comprimento do intervalo de serviço = 5 ms for o número de isochronous URBs = 2 para streaming contínuo, o número de pacotes isochronous em cada isochronous URBs deve ser pelo menos = 25/5 = 5 pacotes.

Obtendo as características de transporte do controlador de host

Um driver de cliente pode recuperar as características de transporte enviando essas solicitações de IOCTLs:

As características de transporte podem ou não estar disponíveis em todos os casos porque a pilha de driver USB depende do transporte subjacente para expor esses valores. Portanto, o driver do cliente deve determinar as informações por meio de outros mecanismos quando as solicitações de IOCTL falham.

Consulta para o characterisctics de transporte atual

O driver do cliente pode consultar as características de transporte em um horário específico enviando a solicitação de IOCTL_USB_GET_TRANSPORT_CHARACTERISTICS . Ao receber a solicitação, a pilha de drivers USB a conclui imediatamente com as informações sobre as características de transporte atuais em uma estrutura de USB_TRANSPORT_CHARACTERISTICS. Considerando que as informações não indicam alterações em todos os momentos, essa solicitação pode ser usada pelo driver para decidir o algoritmo ou iniciar um fluxo.

Receber alterações em características do trasport

Para MA-USB, o transporte subjacente pode ser Wired, Wireless. As características de transporte dessas médias podem variar significativamente ao longo do tempo. O driver do cliente pode ser notificado sobre as alterações em andamento.

  1. Envie uma solicitação de IOCTL_USB_REGISTER_FOR_TRANSPORT_CHARACTERISTICS_CHANGE para se registrar para notificações. Se o registro for bem-sucedido, o driver do cliente receberá um identificador e os valores iniciais das características de transporte.

  2. Envie uma solicitação de IOCTL_USB_NOTIFY_ON_TRANSPORT_CHARACTERISTICS_CHANGE com o identificador de registro obtido na etapa 1. A pilha de drivers USB mantém a solicitação pendente. Sempre que as características de transporte mudam, a solicitação pendente é concluída com os novos valores das características de transporte.

  3. Depois que o cliente é concluído e não está interessado em obter notificações adicionais, ele deve garantir que não haja IOCTLs pendentes na pilha e, em seguida, enviar o IOCTL com o subcódigo IOCTL_USB_UNREGISTER_FOR_TRANSPORT_CHARACTERISTICS_CHANGE, passando o identificador de registro. Se o cliente cancelar o registro com a solicitação de alteração pendente, a pilha USB a concluirá antes de concluir o cancelamento do registro do IOCTL.

Consultar características do dispositivo

Para determione as características do erais sobre um dispositivo USB, como o máximo de atrasos de envio e recebimento para qualquer solicitação, o driver do cliente pode enviar a solicitação de IOCTL_USB_GET_DEVICE_CHARACTERISTICS .

Definindo a prioridade para um ponto de extremidade em massa

Pode haver casos em que determinados drivers de cliente usam o ponto de extremidade em massa para transportar diferentes tipos de dados que não se ajustam à classe de prioridade de transferências em massa. Por exemplo, um driver de vídeo USB pode usar um ponto de extremidade em massa para carregar quadros de exibição e atualizações de cursor. Um driver de áudio USB para MIDI pode usar o ponto de extremidade em massa para transportar dados de áudio/voz. Para uma boa experiência de usuário sobre MA-USB com esses drivers de cliente, o driver deve priorizar as transferências em massa com base no tipo de dados. Por exemplo, um ponto de extremidade em massa que tenha uma atualização de cursor de mouse ou dados de áudio/voz deve ser marcado como prioridade mais alta, enquanto um ponto de extremidade em massa com dados de exibição/vídeo ou armazenamento deve ser marcado como prioridade média.

O driver do cliente pode definir as opções definindo o priorties de pontos de extremidade específicos em massa na subchave de parâmetros do dispositivo da chave do registro de HW do dispositivo.

O formato do valor do registro é um multistring chamado EndpointPriorities. Cada cadeia de caracteres de cadeia de caracteres múltipla define a prioridade de um ponto de extremidade específico. O formato da cadeia de caracteres é o seguinte: <CONFIG>,<INTERFACE>,<ALTSETTING>,<TYPE>,<ORDER>,<PRIORITY>

Em que:

  • CONFIGURAÇÃO – um valor decimal que indica o valor de bConfigurationValue para a configuração que contém o ponto de extremidade, conforme definido no descritor de configuração. Um valor de 0 não é válido. Um valor curinga de "*" pode ser especificado para indicar que ele se aplica a todas as configurações.

  • INTERFACE – um valor decimal que indica o bInterfaceNumber para a interface dentro da configuração que contém o ponto de extremidade, conforme definido no descritor de interface. Um valor curinga de "*" pode ser especificado para indicar que ele se aplica a todas as interfaces. Nos casos em que a configuração do registro está sendo aplicada a uma função USB composta em vez de um dispositivo USB inteiro, o valor da interface indicará.

  • ALTSETTING-um valor decimal que indica o valor de bAlternateSetting para a configuração alternativa da interface. Um valor curinga de "*" pode ser usado para indicar que ele se aplica a todas as configurações alternativas na interface.

  • TIPO-indica o tipo e a direção do ponto de extremidade que está sendo especificado. As cadeias de caracteres válidas são BULK_IN, BULK_OUT, INTERRUPT_IN, INTERRUPT_OUT, ISOCHRONOUS_IN, ISOCHRONOUS_OUTe controle.

  • POSIÇÃO – um valor decimal com base em zero indicando a qual ponto de extremidade na interface a prioridade se aplica. Por exemplo, se uma interface tiver três pontos de extremidade de BULK_OUT, o primeiro ponto de extremidade será especificado por um valor de posição de 0, o segundo ponto de extremidade em 1 e assim por diante. Para uma função em um dispositivo USB composto, os números de interface são relativos às interfaces atribuídas à função composta, não ao dispositivo USB pai.

Por exemplo,


REG_MULTI_SZ:"EndpointPriorities" = 
“"1,0,*,BULK_IN,0,VIDEO",   // BULK IN endpoint in interface 0, configuration 1, all alternate settings has VIDEO priority. 
"1,1,*,BULK_OUT,0,VOICE",  // First BULK OUT endpoint in interface 1, configuration 1, all alternate settings has VOICE priority. 
"2,1,0,BULK_OUT,1,INTERACTIVE"” // BULK OUT endpoint in configuration 2, interface 1, alt setting 1 has INTERACTIVE priority.

Consulte Também

WdfUsbTargetDeviceCreateUrb

USBD_UrbAllocateIOCTL_USB_GET_TRANSPORT_CHARACTERISTICS

IOCTL_USB_REGISTER_FOR_TRANSPORT_CHARACTERISTICS_CHANGE

IOCTL_USB_NOTIFY_ON_TRANSPORT_CHARACTERISTICS_CHANGE

IOCTL_USB_UNREGISTER_FOR_TRANSPORT_CHARACTERISTICS_CHANGE