Depuración del string descriptor y LANGID USB
Cómo depurar fallos del USB string descriptor, fallos en peticiones LANGID, bugs del descriptor de número de serie, nombres de fabricante y producto, números de serie duplicados y problemas de binding de driver.
Los USB string descriptor parecen inofensivos, pero unos strings mal pueden romper el binding de driver, la identidad del dispositivo, la persistencia del puerto serie, la automatización del laboratorio, las herramientas de actualización de firmware y los flujos de soporte. Los usuarios buscan "USB string descriptor failed", "LANGID descriptor", "USB serial number descriptor missing", "duplicate USB serial number", "USB product string wrong" y "Windows shows unknown USB device name" cuando el dispositivo enumera pero la identidad es inestable.
Bus Scope ayuda porque los fallos de string descriptor pasan durante la enumeración como transferencias de control. El host pide los language IDs soportados y luego pide los strings de fabricante, producto y número de serie. Si algún paso devuelve datos mal formados, el SO puede seguir pero guardar identidad mala.
LANGID descriptor
Antes de pedir strings concretos, el host puede pedir el string descriptor cero. Devuelve los language IDs soportados.
Evidencia típica:
GET_DESCRIPTOR String index 0
LANGID list returned
GET_DESCRIPTOR String index 1
GET_DESCRIPTOR String index 2
GET_DESCRIPTOR String index 3
Si el string descriptor cero falla, las peticiones de string posteriores pueden comportarse de forma inconsistente entre hosts.
Strings de fabricante, producto y serie
Índices de string habituales:
iManufacturer.iProduct.iSerialNumber.
Estos campos se referencian desde el Device Descriptor. Si el dispositivo anuncia un índice de string distinto de cero pero falla al devolverlo, el comportamiento del host puede variar.
Síntomas:
- El dispositivo aparece como "Unknown Device".
- El nombre de producto sale corrupto.
- El número de serie está vacío.
- Windows crea un COM nuevo tras cada enchufado.
- Las reglas udev de Linux no emparejan de forma fiable.
- La herramienta de actualización de firmware no puede identificar el target.
- Varias unidades colapsan en una sola identidad.
Números de serie duplicados
Los números de serie USB duplicados son un problema serio de producción. Dos dispositivos físicos con el mismo VID, PID y número de serie pueden ser tratados como la misma instancia.
Consecuencias:
- Se carga el calibration data equivocado.
- La estación de test escribe logs en la unidad equivocada.
- La asignación de COM cambia de forma impredecible.
- El licenciamiento o provisioning se ata al hardware que no es.
- El soporte de campo no puede distinguir dispositivos.
Una captura de paquetes puede demostrar si los bytes del descriptor de número de serie están realmente duplicados o si la capa de display del SO está tapando un problema más profundo.
Falta el número de serie
Algunos dispositivos omiten a propósito el número de serie. Puede ser aceptable para periféricos simples, pero causa problemas cuando importa una identidad estable.
Términos de búsqueda habituales:
- "USB device new COM port every time"
- "USB serial number missing"
- "Windows USB device instance path changes"
- "Linux udev match USB serial"
Si falta el número de serie, el SO puede identificar el dispositivo por topología de puerto en lugar de por identidad hardware.
Strings UTF-16LE mal formados
Los strings USB se codifican como strings Unicode. Bugs típicos del firmware:
- Longitud de descriptor incorrecta.
- Conteo de bytes impar.
- Falta el descriptor type.
- Bytes UTF-16LE inválidos.
- Falta la terminación nula o desajuste de expectativa.
- Devolver bytes ASCII en lugar del formato USB string.
- Truncar números de serie largos.
Algunos hosts lo toleran. Otros rechazan el descriptor o muestran texto corrupto.
Timing y reintentos de la petición de string
Los hosts pueden pedir el mismo string varias veces con longitudes distintas. Un dispositivo debería manejar tanto peticiones cortas de prueba como peticiones de longitud completa.
Patrones de fallo:
- El dispositivo devuelve correctos los primeros 2 bytes pero falla en la petición completa.
- El firmware asume que
wLengthsiempre es igual a la longitud del descriptor. - El endpoint de control hace STALL en peticiones repetidas del string.
- El dispositivo devuelve un número de serie distinto tras un reset.
- El bootloader y el firmware de aplicación reportan identidades distintas.
Es habitual en flujos de actualización de firmware.
Impacto en el binding de driver
La selección de driver suele depender de VID/PID/clase, pero los string descriptors afectan a la identidad visible para el usuario y a veces a las herramientas vendor. Los dispositivos compuestos, los CDC serie, las herramientas HID y los DFU bootloaders suelen apoyarse en los strings para soporte y automatización.
Si un ticket dice "nombre de dispositivo USB incorrecto", no lo deseches como cosmético. Puede indicar corrupción de descriptor o confusión de estado del firmware.
Checklist de depuración
Usa este proceso:
- Captura la enumeración desde el plug-in.
- Inspecciona los índices de string del Device Descriptor.
- Comprueba el string descriptor cero para LANGID.
- Decodifica el string de fabricante.
- Decodifica el string de producto.
- Decodifica el string de número de serie.
- Compara dos unidades físicas.
- Compara bootloader y firmware de aplicación.
- Comprueba el comportamiento tras reset y reenchufado.
- Conserva los bytes de descriptor en crudo para los fixes de firmware.
Diagnóstico final
Los problemas de USB string descriptor y LANGID afectan a la identidad del dispositivo, la persistencia del puerto serie, los tests de fabricación, el soporte de campo y los flujos de driver. La evidencia clave no es la etiqueta del sistema operativo sino las transferencias de control reales del descriptor.
Bus Scope ayuda a mostrar LANGID, fabricante, producto, número de serie, strings mal formados, seriales duplicados y reintentos de enumeración en una sola vista de diagnóstico.