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.
Este artigo fornece informações sobre USB ContainerIDs para o sistema operacional Windows. Inclui orientações para os fabricantes de dispositivos programarem os seus dispositivos USB multifunções para que sejam corretamente detetados pelo Windows.
Os usuários podem tirar proveito de todos os recursos dos dispositivos que estão conectados aos seus computadores. Isso inclui dispositivos multifuncionais, como uma impressora combinada, scanner e dispositivo copiador. O Windows inclui suporte para consolidar todas as funcionalidades de um único dispositivo físico em um contêiner de dispositivo. Um contêiner de dispositivo é uma representação virtual do dispositivo físico. Essa consolidação é obtida atribuindo uma propriedade ContainerID a cada função de dispositivo enumerada para o dispositivo físico. Ao atribuir o mesmo valor ContainerID a cada função de dispositivo, o Windows reconhece que todas as funções do dispositivo pertencem ao mesmo dispositivo físico.
Todos os tipos de dispositivos que se conectam a um computador através de diferentes tipos de barramento podem suportar contêineres de dispositivos. No entanto, nem todos os tipos de barramento usam o mesmo mecanismo de geração de um ContainerID. Para dispositivos USB, os fornecedores de dispositivos podem usar um descritor ContainerID para descrever o ContainerID de um dispositivo físico. Um descritor ContainerID é um descritor de recurso do sistema operacional Microsoft que pode ser armazenado no firmware do dispositivo USB. Os fabricantes de dispositivos USB devem implementar corretamente esses descritores ContainerID em seus dispositivos para aproveitar os novos recursos de dispositivo disponíveis no Windows. Os fabricantes de dispositivos USB precisam implementar apenas um único ContainerID para cada dispositivo físico, independentemente de quantas funções do dispositivo são suportadas pelo dispositivo.
Para obter mais informações sobre como consolidar todas as funcionalidades de um único dispositivo em um contêiner de dispositivo, consulte Como IDs de contêiner são geradas.
Para obter mais informações sobre os descritores do sistema operacional Microsoft para dispositivos USB, consulte Descritores do sistema operacional Microsoft para dispositivos USB.
Como um USB ContainerID é gerado
A seguir estão duas maneiras de gerar um ContainerID para um dispositivo USB:
- O fabricante do dispositivo USB especifica o ContainerID no firmware do dispositivo usando um descritor ContainerID do Microsoft OS.
- O driver de hub USB da Microsoft cria automaticamente um ContainerID para o dispositivo a partir da combinação de ID do produto (PID), ID do fornecedor (VID), número de revisão e número de série. Nessa situação, o driver de hub USB da Microsoft cria um ContainerID com funcionalidade mínima. Este método aplica-se apenas a dispositivos que têm um número de série exclusivo.
Conteúdo do USB ContainerID
Um USB ContainerID é apresentado ao sistema operacional na forma de uma cadeia de caracteres de identificador universalmente exclusivo (UUID). O UUID ContainerID está contido num descritor ContainerID. Um descritor ContainerID é um descritor de recursos do Microsoft OS no nível do dispositivo. Como tal, quando o sistema operativo solicita um USB ContainerID, o campo wValue do pedido do descritor deve ser sempre definido como zero. Para obter mais informações sobre descritores de recursos do sistema operacional Microsoft e solicitações de descritores, consulte Especificação de descritores do Microsoft OS 1.0.
Um descritor ContainerID consiste em uma seção de cabeçalho.
| Compensação | Campo | Tamanho | Tipo | Descrição |
|---|---|---|---|---|
| 0 | dwLength | 4 | DWord não assinado | O comprimento, em bytes, de todo o descritor ContainerID . Este campo deve ser sempre definido com um valor de 0x18. |
| 4 | bcdVersion | 2 | BCD | O número de versão do descritor ContainerID em código decimal binário (BCD), onde cada nibble corresponde a um dígito. O byte mais significativo (MSB) contém os dois dígitos antes do ponto decimal, e o byte menos significativo (LSB) contém os dois dígitos após o ponto decimal. Por exemplo, a versão 1.00 é representada como 0x0100. Este campo deve ser sempre definido como 0x0100. |
| 6 | wÍndice | 2 | Palavra | Este campo é sempre definido como 6 para descritores USB ContainerID . |
Um descritor ContainerID consiste em uma seção ContainerID.
| Compensação | Campo | Tamanho | Tipo | Descrição |
|---|---|---|---|---|
| 0 | bContainerID | 16 | DWord não assinado | Dados do ContainerID |
Os fabricantes de dispositivos são responsáveis por garantir que cada instância de um dispositivo tenha um valor universalmente exclusivo de 16 bytes para o ContainerID. Além disso, um dispositivo deve relatar o mesmo valor de ContainerID cada vez que estiver ligado. Existem vários algoritmos estabelecidos para gerar UUIDs com chance quase zero de duplicação. Os fabricantes de dispositivos podem selecionar o algoritmo de geração UUID que melhor se adapta às suas necessidades. Não importa qual algoritmo de geração UUID é usado, desde que o resultado seja único.
Sintaxe do ContainerID USB
Um ContainerID é relatado no formato de cadeia de caracteres UUID padrão de {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}. Segue-se um exemplo de representação no firmware para um 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07 USB ContainerID, que está formatado como uma cadeia de caracteres UUID {2CA7B40C-7BD1-4F25-B573-A13A975DDC07}.
UCHAR ExampleContainerIDDescriptor[24] =
{
0x18, 0x00, 0x00, 0x00, // dwLength - 24 bytes
0x00, 0x01, // bcdVersion - 1.00
0x06, 0x00, // wIndex – 6 for a ContainerID
0x0C, 0xB4, 0xA7, 0x2C, // bContainerID -
0xD1, 0x7B, 0x25, 0x4F, // {2CA7B40C-7BD1-4F25-B573-A13A975DDC07}
0xB5, 0x73, 0xA1, 0x3A, // 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07
0x97, 0x5D, 0xDC, 0x07 //
}
Observe a alteração na ordem de bytes dos primeiros 8 bytes quando ele é formatado como uma cadeia de caracteres UUID.
Alterações no descritor do sistema operacional Microsoft
Para preservar a funcionalidade ContainerID herdada, o descritor de cadeia de caracteres do sistema operacional Microsoft contém um campo flags que pode ser usado para indicar o suporte para o descritor ContainerID .
A definição atual do descritor de cadeia de caracteres do sistema operacional Microsoft inclui um campo pad de 1 byte, bPad, no final do descritor que normalmente é definido como zero. Para dispositivos USB que suportam o novo ContainerID, o campo bPad é redefinido como um campo flags, bFlags. O bit 1 deste campo é usado para indicar o suporte para o descritor ContainerID . A Tabela 3 descreve os campos do descritor de cadeia de caracteres do sistema operacional Microsoft para dispositivos USB.
| Campo | Tamanho (bytes) | Valor | Descrição |
|---|---|---|---|
| bComprimento | 1 | 0x12 | Comprimento do descritor. |
| bDescritorType | 1 | 0x03 | Tipo de descritor. Um valor de 0x03 indica um descritor de cadeia de caracteres do Microsoft OS. |
| qwAssinatura | 14 | 'MSFT100' | Campo de assinatura. |
| bMS_VendorCode | 1 | Código do fornecedor | Código do fornecedor. |
| bBandeiras | 1 | 0x02 | Bit 0: Reservado Bit 1: Suporte a ContainerID 0: Não suporta ContainerID 1: Suporta ContainerID Bits 2–7: Reservado |
Atualmente, os dispositivos USB enviados que suportam o descritor do sistema operacional Microsoft, mas não suportam o descritor ContainerID , têm o campo bPad definido como 0x00. O driver do hub USB não consulta esses dispositivos para o descritor USB ContainerID .
Vista de contentor de um dispositivo multifunções USB
O ContainerID fornece informações para consolidar dispositivos para dispositivos USB multifuncionais. A Figura 1 mostra um exemplo de como todos os dispositivos em uma impressora multifuncional são consolidados em um único contêiner de dispositivo quando todos os dispositivos individuais dentro do produto usam o mesmo ContainerID.
Requisitos do USB ContainerID HCK
Os fabricantes de dispositivos devem garantir que cada instância de um dispositivo que eles produzem tenha um valor ContainerID globalmente exclusivo para que o Windows possa consolidar com êxito a funcionalidade de cada dispositivo multifuncional USB. A Certificação de Hardware do Windows, Kit de Certificação de Hardware do Windows, inclui um requisito, DEVFUND-0034, para um ContainerID USB se for implementado num dispositivo. Se um dispositivo implementa um USB ContainerID, a Certificação de Hardware do Windows testa o ContainerID como parte dos testes do Microsoft OS Descriptor e verifica se o valor ContainerID é globalmente exclusivo. Para obter mais informações sobre esses requisitos de Certificação de Hardware do Windows, consulte o site de Certificação de Hardware do Windows.
Recomendações para implementar um USB ContainerID A seguir estão recomendações para fornecedores de dispositivos que projetam, fabricam e enviam dispositivos USB:
Saiba como o Windows melhora o suporte para dispositivos USB multifuncionais e de transporte múltiplo usando um ContainerID. Recomendamos que comece por ler o documento "Multifunction Device Support and Device Container Groupings in Windows".
Certifique-se de que o número de série em cada dispositivo USB é exclusivo. Um requisito de Certificação de Hardware do Windows indica que, se o dispositivo incluir um número de série, o número de série deve ser exclusivo para cada instância do dispositivo.
Não forneça um ContainerID para um dispositivo USB incorporado em um sistema. Os dispositivos USB integrados devem depender das configurações do BIOS ACPI ou do descritor de hub USB DeviceRemovable bit para a porta.
Certifique-se de que todos os dispositivos USB conectados a um sistema tenham valores exclusivos de ContainerID . Não partilhe valores ContainerID ou números de série USB nas suas linhas de produtos.
Certifique-se de definir a capacidade de dispositivo removível corretamente para o seu dispositivo.
Observação
Os fornecedores de dispositivos que adicionam um descritor USB ContainerID a um dispositivo USB enviado anteriormente devem incrementar o número de liberação do dispositivo (bcdDevice) no descritor de dispositivo do dispositivo. Isso é necessário porque o driver do hub USB armazena em cache o descritor de cadeia de caracteres do sistema operacional Microsoft (ou a falta de um) com base na ID do fornecedor, na ID do produto e no número da versão do dispositivo. Se não incrementar o número de lançamento do dispositivo, o driver do hub não consultará o ContainerID USB de um novo dispositivo se tiver enumerado anteriormente uma instância do dispositivo com o mesmo ID de fornecedor, ID de produto e número de lançamento do dispositivo que não suportava o descritor USB ContainerID.