Compartilhar via


Arquitetura de pilha do driver de função dupla USB

Agora há suporte para controladores de Função Dupla USB no Windows, começando com Windows 10 para edições da área de trabalho (Home, Pro, Enterprise e Education) e Windows 10 Mobile.

Introdução

O recurso de Função Dupla USB possibilita que um sistema seja um dispositivo USB ou um host USB. A especificação detalhada da Função Dupla USB pode ser encontrada no USB do USB-IF na página de informações do Go .

O ponto significativo aqui é que o recurso de função dupla permite que um dispositivo móvel, como um telefone, um phablet ou um tablet, se designe como um dispositivo ou um host.

Quando um dispositivo móvel está no modo de função , ele é anexado a um computador ou outro dispositivo que atua como um host para o dispositivo móvel anexado.

Quando um dispositivo móvel está no modo de host , os usuários podem anexar seus dispositivos, como um mouse ou um teclado, a ele. Nesse caso, o dispositivo móvel hospeda os dispositivos anexados.

Ao fornecer suporte para a função dupla USB em Windows 10, fornecemos os seguintes benefícios:

  • Conectividade com dispositivos periféricos móveis por meio de USB, que oferece uma largura de banda de dados maior em comparação com protocolos sem fio, como Bluetooth.
  • A opção de carregamento de bateria por USB enquanto estiver conectada e comunicando-se com outros dispositivos USB (desde que o suporte de hardware necessário esteja presente).
  • Habilite os clientes que provavelmente terão um dispositivo móvel, como um telefone inteligente para todo o seu trabalho. Esse recurso permitirá maior produtividade em um cenário de encaixe com fio, em que um dispositivo móvel encaixa e, portanto, hospeda dispositivos periféricos.

A tabela a seguir mostra a lista de drivers de classe de host disponíveis em SKUs móveis e desktop do Windows.

Drivers de classe de host USB Windows 10 Mobile Windows 10 para edições de área de trabalho
Hubs USB (USBHUB) Yes Sim (desde o Windows 2000)
HID - Teclado/Mouses (HidClass, KBDCLass, MouClass, KBDHid, MouHid) Yes Sim (desde o Windows 2000)
Armazenamento em massa USB (UASP de & em massa) Yes Sim (desde o Windows 2000)
Driver de host USB genérico (WinUSB) Yes Sim (desde o Windows Vista)
Entrada/saída de áudio USB (USBAUDIO) Yes Sim (desde o Windows XP)
Dispositivos serial (USBSER) Yes Sim (desde Windows 10)
Bluetooth (BTHUSB) Yes Sim (desde o Windows XP)
Impressão (usbprint) No Sim (desde o Windows XP)
Verificação (USBSCAN) No Sim (desde o Windows 2000)
WebCam (USBVIDEO) No Sim (desde o Windows Vista)
Protocolo de Transferência de Mídia (Iniciador mtp) No Sim (desde o Windows Vista)
NDIS remoto (RNDIS) No Sim (desde o Windows XP)
IP por USB (IPoverUSB) No Sim (Novo para Windows 10)

Os drivers de classe na tabela foram selecionados com base na telemetria da classe de dispositivo e com base nos principais cenários selecionados para Windows 10. Planejamos incluir um número limitado de caixa de entrada, drivers de host de terceiros, para dar suporte a dispositivos-chave em Windows 10 Mobile. E para Windows 10 para edições da área de trabalho, esses drivers estarão disponíveis no site do OEM ou por meio de Windows Update (WU).

Para Windows 10 Mobile, os drivers de terceiros que não estão incluídos na caixa de entrada não estarão disponíveis no WU. O volume de disco da pilha de host USB + HID foi mantido pequeno. É por isso que nem todos os drivers de classe e muito poucos drivers de terceiros são incluídos na caixa de entrada para Windows 10 Mobile. Um OEM que deseja disponibilizar drivers de terceiros pode usar um Pacote de Suporte de Placa (BSP) para adicioná-los às imagens do sistema operacional para seus dispositivos móveis.

A tabela a seguir mostra os drivers de classe de função que estão disponíveis em SKUs móveis do Windows.

Observação

Os drivers de função não estão disponíveis em Windows 10 para edições da área de trabalho.

Drivers de classe de função USB Windows 10 Mobile Windows 10 para edições de área de trabalho Observações
Protocolo de Transferência de Mídia (Respondente MTP) Yes No Não há cenários para o respondente MTP na Área de Trabalho. Cenários P2P entre sistemas de área de trabalho foram habilitados por meio de Easy-MigCable sobre o WinUSB.
Vídeo Exibido (vidstream) Yes No
Driver de função USB genérico (GenericUSBFn) Yes No Isso será necessário pelo IPoverUSB e outros cenários de flash da área de trabalho.

Monitoraremos os dados de anexo do dispositivo para nos informar se precisamos fornecer suporte adicional ao driver de classe, à medida que a lista de popularidade da classe de dispositivo muda ao longo do tempo.

Implementação do driver

O driver URS (Comutador de Função USB) da Microsoft permite que um implementador de sistema aproveite a funcionalidade USB de dupla função de sua plataforma.

O driver de URS destina-se a fornecer funcionalidade de função dupla para plataformas que usam um único controlador USB que pode operar em funções de host e periféricas em uma única porta. A função periférica também é conhecida como uma função de função. O driver de URS gerencia a função atual da porta e o carregamento e o descarregamento das pilhas de software apropriadas, com base em eventos de hardware da plataforma.

Em um sistema que tem um conector USB micro-AB, o driver usa interrupções de hardware que indicam o estado do pino de ID no conector. Esse pin é usado para detectar se o controlador precisa assumir a função de host ou a função de função em uma conexão. Para obter mais informações, consulte a especificação USB On-The-Go. Em sistemas com um conector USB Tipo C, espera-se que o implementador OEM forneça um driver de cliente do conector usando as interfaces de programação do driver do conector USB Tipo C. O driver cliente se comunica com a UcmCx (extensão de classe do Gerenciador de Conectores USB) fornecida pela Microsoft para gerenciar todos os aspectos do conector USB Type-C, como detecção de CC, mensagens PD e outros. Para a troca de função, o driver do cliente comunica o estado do conector USB Tipo C ao driver de URS.

O diagrama a seguir mostra a pilha de driver de software USB para um controlador de função dupla que usa o driver de URS.

arquitetura de pilha do driver usb role-switch.

Observe que o driver de URS nunca carregará as pilhas de Função e Host mostradas no diagrama anterior simultaneamente. O driver URS carregará a pilha de funções ou a pilha host , dependendo da função do controlador USB.

Requisitos de hardware

Se você estiver desenvolvendo uma plataforma que aproveitará o driver de URS para fornecer funcionalidade USB de função dupla, os seguintes requisitos de hardware deverão ser atendidos:

  • Controlador USB

    Esses drivers são fornecidos pela Microsoft como drivers in-box.

    Controlador Synopsys DesignWare Core USB 3.0. INF da caixa de entrada: UrsSynopsys.inf.

    Chipidea High-Speed controlador OTG USB. INF da caixa de entrada: UrsChipidea.inf.

  • Interrupções de pino de ID

    As interrupções de pino de ID para sistemas tipo C não USB podem ser implementadas de duas maneiras:

    Duas interrupções disparadas por borda: uma que é disparada quando o pino de ID no conector é aterrado e outro que é acionado quando o pino de ID está flutuando.

    Uma única interrupção ativa-ambas que está no nível ativo quando o pino de ID é aterrado.

  • Enumeração do controlador USB

    O controlador de função dupla USB deve ser enumerado por ACPI.

  • Suporte a software

    O driver de URS espera uma interface de software que permita o controle do VBus sobre o conector. Essa interface é específica do SoC. Entre em contato com o fornecedor do SoC para obter mais detalhes.

Não há suporte para esses recursos de OTG USB no Windows:

  • ACA (Detecção do Adaptador do Carregador acessório).
  • PROTOCOLOS (Protocolo de Solicitação de Sessão).
  • HNP (Protocolo de Negociação de Host).
  • ADP (Protocolo de Detecção de Anexação).

Configuração do sistema ACPI

Para usar o driver de URS, você deve criar um arquivo de definição de ACPI para o sistema. Além disso, há algumas considerações relacionadas ao driver que você deve levar em conta.

Aqui está uma definição de ACPI de exemplo para um controlador de função dupla USB.

//
// You may name the device whatever you want; we don't depend on it being called 'URS0'.
//
Device(URS0)
{
    //
    // Replace with your own hardware ID. Microsoft will add it to the inbox INF,
    // or you may choose to author a custom INF that uses Needs & Includes directives
    // to include sections from the inbox INF.
    //
    Name(_HID, "ABCD1234")

    Name(_CRS, ResourceTemplate() {
        //
        // The register space for the controller must be defined here.
        //
        Memory32Fixed(ReadWrite, 0xf1000000, 0xfffff)


        //
        // The ID pin interrupts, if you are using two edge-triggered interrupts.
        //
        GpioInt(Edge, ActiveHigh, Exclusive, PullUp, 0, "\\_SB.GPI0", 0, ResourceConsumer, , ){0x1001}
        GpioInt(Edge, ActiveHigh, Exclusive, PullUp, 0, "\\_SB.GPI0", 0, ResourceConsumer, , ){0x1002}

        //
        // Following is an example of a single active-both interrupt.
        //
        // GpioInt(Edge, ActiveBoth, Exclusive, PullUp, 0, "\\_SB.GPI0", 0, ResourceConsumer, , ){0x12}
        //

        //
        // For a Type-C platform, you do not need to specify any interrupts here.
        //
    })

    //
    // This child device represents the USB host controller. This device node is in effect
    // when the controller is in host mode.
    // You may name the device whatever you want; we don't depend on it being called 'USB0'.
    //
    Device(USB0)
    {
        //
        // The host controller device node needs to have an address of '0'
        //
        Name(_ADR, 0)
        Name(_CRS, ResourceTemplate() {

            //
            // The controller interrupt.
            //
            Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive, , , ){0x10}
        })
    }

    //
    // This child device represents the USB function controller. This device node is in effect
    // when the controller is in device/function/peripheral mode.
    // You may name the device whatever you want; we don't depend on it being called 'UFN0'.
    //
    Device(UFN0)
    {
        //
        // The function controller device node needs to have an address of '1'
        //
        Name(_ADR, 1)
        Name(_CRS, ResourceTemplate() {

            //
            // The controller interrupt (this could be the same as the one defined in
            // the host controller).
            //
            Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive, , , ){0x11}
        })
    }
}

Aqui estão algumas explicações para as seções main do arquivo ACPI:

  • URS0 é a definição de ACPI para o controlador de função dupla USB. Esse é o dispositivo ACPI no qual o driver de URS será carregado.

  • USB0 e UFN0 são dispositivos filho dentro do escopo do URS0. USB0 e UFN0 representam as duas pilhas filho que serão enumeradas pelo driver urs e as pilhas de host e função, respectivamente. Observe que _ADR é o meio pelo qual a ACPI corresponde a essas definições de dispositivo com os objetos de dispositivo que o driver urs cria.

  • Se o controlador usar a mesma interrupção para ambas as funções, a mesma interrupção do controlador poderá ser descrita em ambos os dispositivos filho. Mesmo nesse caso, a interrupção ainda pode ser descrita como "Exclusiva".

  • Você pode fazer adições a esse arquivo de definição de ACPI conforme necessário. Por exemplo, você pode definir quaisquer outros métodos ou propriedades necessários em qualquer um dos dispositivos no arquivo de definição acpi. Essas adições não interferirão na operação do driver de URS. Todos os recursos adicionais necessários em qualquer uma das pilhas também podem ser descritos no _CRS do dispositivo apropriado.

O driver urs atribui IDs de hardware às pilhas de host e de função. Essas IDs de hardware são derivadas da ID de hardware do dispositivo URS. Por exemplo, se você tiver um dispositivo URS cuja ID de Hardware seja ACPI\ABCD1234, o driver de URS criará IDs de Hardware para as pilhas de host e função da seguinte maneira:

  • Pilha de host: URS\ABCD1234&HOST

  • Pilha de funções: URS\ABCD1234&FUNCTION

Pacotes de instalação do driver INF

Os pacotes de driver de terceiros podem assumir uma dependência desse esquema, se necessário.

Se você é um IHV ou um OEM e está pensando em fornecer seu próprio pacote de driver, aqui estão algumas coisas a serem consideradas:

  • Pacote de driver de URS

    Espera-se que a ID de Hardware para o controlador de função dupla em cada plataforma seja adicionada ao INF da caixa de entrada para URS. No entanto, se por algum motivo a ID não puder ser adicionada, o IHV/OEM poderá fornecer um pacote de driver com um INF que precisa/inclui o INF da caixa de entrada e corresponde à ID de Hardware.

    Isso é necessário no caso em que o IHV/OEM exige que um driver de filtro esteja presente na pilha de driver.

  • Pacote de driver de host.

    Um pacote de driver fornecido por IHV/OEM que precisa/inclui o usbxhci.inf da caixa de entrada e corresponde à ID de hardware do dispositivo host é necessário. A correspondência de ID de hardware seria baseada no esquema descrito na seção anterior.

    Isso é necessário no caso em que o IHV/OEM exige que um driver de filtro esteja presente na pilha de driver.

    Há um trabalho em andamento para fazer com que o driver de URS atribua a ID compatível com XHCI para o dispositivo host.

  • Pacote de driver de função

    Um pacote de driver fornecido por IHV/OEM que precisa/inclui a caixa de entrada Ufxsynopsys.inf e corresponde à ID de hardware do dispositivo periférico é necessária. A correspondência de ID de hardware seria baseada no esquema descrito na seção anterior.

    O IHV/OEM também pode incluir um driver de filtro no pacote de driver.

Consulte Também

Referência de driver de controlador de função dupla