Identificadores de contenedor USB en Windows

En este documento se proporciona información sobre los ContainerIDde USB para el sistema operativo Windows. Incluye directrices para que los fabricantes de dispositivos programen sus dispositivos USB multifunción para que Windows los pueda detectar correctamente.

A partir de Windows 7, los usuarios pueden aprovechar todas las funcionalidades de los dispositivos conectados a sus equipos. Esto incluye dispositivos multifunción, como una impresora combinada, escáner y dispositivo copiador. Windows 7 incluye compatibilidad para consolidar toda la funcionalidad de un único dispositivo físico en un contenedor de dispositivos. Un contenedor de dispositivos es una representación virtual del dispositivo físico. Esta consolidación se logra mediante la asignación de una propiedad ContainerID a cada función de dispositivo que se enumera para el dispositivo físico. Al asignar el mismo valor containerID a cada función de dispositivo, Windows 7 reconoce que todas las funciones del dispositivo pertenecen al mismo dispositivo físico.

Todos los tipos de dispositivos que se conectan a un equipo a través de diferentes tipos de bus pueden admitir contenedores de dispositivos. Sin embargo, no todos los tipos de bus usan el mismo mecanismo para generar un ContainerID. En el caso de los dispositivos USB, los proveedores de dispositivos pueden usar un descriptor ContainerID para describir containerID para un dispositivo físico. Un descriptor ContainerID es un descriptor de características del sistema operativo de Microsoft que se puede almacenar en el firmware del dispositivo USB. Los fabricantes de dispositivos USB deben implementar correctamente estos descriptores containerID en sus dispositivos para aprovechar las nuevas funcionalidades de dispositivo que están disponibles en Windows 7. Los fabricantes de dispositivos USB deben implementar solo un ContainerID para cada dispositivo físico, independientemente de cuántas funciones de dispositivo sean compatibles con el dispositivo.

Para obtener más información sobre cómo consolidar toda la funcionalidad de un único dispositivo en un contenedor de dispositivos, consulte Cómo se generan los identificadores de contenedor.

Para obtener más información sobre los descriptores del sistema operativo de Microsoft para dispositivos USB, consulte Descriptores de so de Microsoft para dispositivos USB.

Cómo se genera un containerID USB

A continuación se muestran dos maneras de generar un ContainerID para un dispositivo USB:

  • El fabricante del dispositivo USB especifica el ContainerID en el firmware del dispositivo mediante un descriptor ContainerID de So de Microsoft.
  • El controlador del concentrador USB de Microsoft crea automáticamente un ContainerID para el dispositivo a partir de la combinación del identificador de producto (PID) del dispositivo, el identificador de proveedor (VID), el número de revisión y el número de serie. En esta situación, el controlador del concentrador USB de Microsoft crea un ContainerID con una funcionalidad mínima. Este método solo se aplica a los dispositivos que tienen un número de serie único.

Contenido de ContainerID de USB

Un ContainerID USB se presenta al sistema operativo en forma de una cadena de identificador único universal (UUID). El UUID de ContainerID se encuentra dentro de un descriptor ContainerID . Un descriptor ContainerID es un descriptor de características del sistema operativo Microsoft de nivel de dispositivo. Por lo tanto, cuando el sistema operativo solicita un ContainerID USB, el campo wValue de la solicitud descriptor siempre debe establecerse en cero. Para obtener más información sobre los descriptores de características del sistema operativo de Microsoft y las solicitudes de descriptores, vea Microsoft OS 1.0 Descriptores Specification( Especificación de descriptores de Microsoft OS 1.0).

Un descriptor ContainerID consta de una sección de encabezado.

Offset Campo Size Tipo Descripción
0 dwLength 4 DWord sin firmar Longitud, en bytes, de todo el descriptor ContainerID . Este campo siempre debe establecerse en un valor de 0x18.
4 bcdVersion 2 BCD Número de versión del descriptor ContainerID , en decimal codificado binario (BCD), donde cada nibble corresponde a un dígito. El byte más significativo (MSB) contiene los dos dígitos antes del separador decimal y el byte menos significativo (LSB) contiene los dos dígitos después del separador decimal. Por ejemplo, la versión 1.00 se representa como 0x0100. Este campo siempre debe establecerse en 0x0100.
6 Windex 2 Palabra Este campo siempre se establece en 6 para descriptores usb ContainerID .

Un descriptor ContainerID consta de una sección ContainerID.

Offset Campo Size Tipo Descripción
0 bContainerID 16 DWord sin firmar Datos containerID .

Los fabricantes de dispositivos son responsables de garantizar que cada instancia de un dispositivo tenga un valor universal de 16 bytes para containerID. Además, un dispositivo debe notificar el mismo valor containerID cada vez que se enciende. Hay varios algoritmos establecidos para generar UUID con casi cero probabilidades de duplicación. Los fabricantes de dispositivos pueden seleccionar el algoritmo de generación UUID que mejor se adapte a sus necesidades. No importa qué algoritmo de generación UUID se use siempre que el resultado sea único.

Sintaxis de ContainerID de USB

Un ContainerID se notifica en el formato de cadena UUID estándar de {xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}. A continuación se muestra una representación de ejemplo en firmware para un ContainerID USB 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07 USB ContainerID, que tiene el formato {2CA7B40C-7BD1-4F25-B573-A13A975DDC07} UUID.

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      //
}

Tenga en cuenta el cambio en el orden de bytes de los primeros 8 bytes cuando se da formato como una cadena UUID.

Cambios en el descriptor del sistema operativo de Microsoft

Para conservar la funcionalidad de ContainerID heredada, se ha agregado un nuevo campo de marcas al descriptor de cadena del sistema operativo de Microsoft que se puede usar para indicar la compatibilidad con el descriptor ContainerID .

La definición actual del descriptor de cadena del sistema operativo de Microsoft incluye un campo de panel de 1 byte, bPad, al final del descriptor que normalmente se establece en cero. En el caso de los dispositivos USB que admiten el nuevo ContainerID, el campo bPad se vuelve a definir como un campo flags, bFlags. El bit 1 de este campo se usa para indicar la compatibilidad con el descriptor ContainerID . En la tabla 3 se describen los campos del descriptor de cadena del sistema operativo de Microsoft para dispositivos USB.

Campo Longitud (bytes) Value Descripción
BLength 1 0x12 Longitud del descriptor.
bDescriptorType 1 0x03 Tipo de descriptor. Un valor de 0x03 indica un descriptor de cadena del sistema operativo de Microsoft.
qwSignature 14 "MSFT100" Campo Firma.
bMS_VendorCode 1 Código de proveedor Código de proveedor.
bFlags 1 0x02 Bit 0: Reservado
Bit 1: Compatibilidad con ContainerID
 0: No admite ContainerID
 1: Admite ContainerID
Bits de 2 a 7: Reservado

Actualmente, los dispositivos USB que admiten el descriptor del sistema operativo de Microsoft, pero que no admiten el descriptor ContainerID tienen el campo bPad establecido en 0x00. El controlador del concentrador USB no consulta estos dispositivos para el descriptor USB ContainerID .

Vista de contenedor de un dispositivo multifunción USB

ContainerID proporciona información para consolidar dispositivos para dispositivos USB multifunción. En la figura 1 se muestra un ejemplo de cómo todos los dispositivos de una impresora multifunción se consolidan en un único contenedor de dispositivos cuando todos los dispositivos individuales del producto usan el mismo ContainerID.

consolidación de todos los dispositivos en una impresora multifunción.

Al consolidar todos los dispositivos para un dispositivo USB multifunción, el producto físico se puede mostrar como un único dispositivo en Dispositivos e impresoras en Windows 7. En la figura 2 se muestra un ejemplo de un teclado multifunción USB y un dispositivo de mouse que aparece como un único dispositivo en Dispositivos e impresoras.

dispositivo multifunción en dispositivos e impresoras.

Requisitos de HCK de ContainerID USB

Los fabricantes de dispositivos deben asegurarse de que cada instancia de un dispositivo que producen tenga un valor ContainerID único globalmente para que Windows pueda consolidar correctamente la funcionalidad de cada dispositivo multifunción USB. La certificación de hardware de Windows Kit de certificación de hardware de Windows incluye un requisito, DEVFUND-0034, para un ContainerID USB si se implementa en un dispositivo. Si un dispositivo implementa un ContainerID USB, la certificación de hardware de Windows prueba containerID como parte de las pruebas del descriptor del sistema operativo de Microsoft y comprueba si el valor de ContainerID es único globalmente. Para obtener más información sobre estos requisitos de certificación de hardware de Windows, consulta el sitio web de certificación de hardware de Windows.

Recomendaciones para implementar un ContainerID USB Las siguientes son recomendaciones para los proveedores de dispositivos que diseñan, fabrican y envían dispositivos USB:

  • Obtenga información sobre cómo Windows 7 mejora la compatibilidad con dispositivos USB multifunción y transporte a través del uso de un ContainerID. Te recomendamos que empieces leyendo "Compatibilidad multifunción de dispositivos y agrupaciones de contenedores de dispositivos en Windows 7".
  • Asegúrese de que el número de serie de cada dispositivo USB sea único. Un requisito de certificación de hardware de Windows indica que, si el dispositivo incluye un número de serie, el número de serie debe ser único para cada instancia del dispositivo.
  • No proporcione un ContainerID para un dispositivo USB incrustado en un sistema. Los dispositivos USB integrados deben basarse en la configuración del BIOS ACPI o en el descriptor de concentrador USB DeviceRemovable bit (Dispositivo extraíble ) para el puerto.
  • Asegúrese de que todos los dispositivos USB conectados a un sistema tengan valores Únicos containerID . No comparta valores containerID ni números de serie USB en las líneas de producto.
  • Asegúrese de establecer la funcionalidad del dispositivo extraíble correctamente para el dispositivo. Nota Los proveedores de dispositivos que agreguen un descriptor ContainerID USB a un dispositivo USB de envío anterior deben incrementar el número de versión del dispositivo (bcdDevice) en el descriptor de dispositivo del dispositivo. Esto es necesario porque el controlador del concentrador USB almacena en caché el descriptor de cadena del sistema operativo de Microsoft (o la falta de uno) en función del identificador de proveedor, el identificador de producto y el número de versión del dispositivo del dispositivo. Si no incrementa el número de versión del dispositivo, el controlador del concentrador no consulta el ContainerID USB de un nuevo dispositivo si ha enumerado previamente una instancia del dispositivo con el mismo identificador de proveedor, id. de producto y número de versión del dispositivo que no admitía el descriptor USB ContainerID .

Creación de dispositivos USB para Windows
Identificadores de contenedor para dispositivos USB