Introducción al estándar USB

USB (Universal Serial Bus) es un estándar desarrollado a mediados de los 90’s que define los cables, conectores y protocolos usados para la conexión, comunicación y alimentación entre computadoras y dispositivos electrónicos.

Componentes del Bus

Las comunicaciones USB necesitan una computadora host con soporte USB. La computadora host es una PC u otra computadora que posea un controlador de host USB y un concentrador de raíz. El concentrador de raíz o root hub es el primer hub al que se le conecta cualquier dispositivo USB y esta embebido en el controlador de host.

El controlador de host da formato a los datos par la transmisión en el bus y traduce los datos recibidos a un formato que los componentes del sistema operativo puedan entender.

El concentrador de raíz y el controlador de host juntos, detectan los dispositivos conectados y desconectados, se encargan de las peticiones de SALIDA del controlador de host, y pasan datos entre los dispositivos y el controlador host. Además del concentrador de raíz,  el bus puede tener uno o mas hubs externos.

Topología

La topología o arreglo de las conexiones en el bus, es de tipo estrella con niveles. En el centro de cada estrella esta un hub, y cada conexión al hub es un punto en la estrella. El concentrador de raíz esta en el host. Un hub externo tiene una conexión ascendente (lado del host) para la conexión con el host y una o más conectores o conexiones internas descendentes (lado del dispositivo) hacia los dispositivos embebidos.

Hasta 5 hubs externos se pueden conectar en serie con un limite de 127 periféricos y hubs incluyendo el concentrador de raíz. Sin embargo, los límites de ancho de banda y de programación (scheduling) pueden prevenir que un solo controlador host se comunique con esta cantidad de dispositivos. Para incrementar el ancho de banda disponible para los dispositivos USB, muchas PC’s tienen múltiples controladores de host, cada uno controlando independientemente un Bus.


Consideraciones sobre la velocidad del Bus

Un host USB 3.0 soporta las cuatro velocidades (incluida la superspeed). Un host USB 2.0 soporta las velocidades low, full y high speed. Un host USB 1.x soporta las velocidades low y full speed solamente.

Terminología

En el mundo del USB, las palabras función y dispositivo tienen un significado específico. Además es importante el concepto de un puerto USB y como es diferente de los otros puertos como el RS-232.

Función

Una función USB es un conjunto de una o más interfaces relacionadas que tienen una capacidad. Ejemplos de funciones son un mouse, un conjunto de bocinas, una unidad de adquisición de datos o un hub. Un solo dispositivo físico puede tener múltiples funciones. Por ejemplo, un dispositivo podría tener la función de impresora y escáner. El host identifica las funciones del dispositivo solicitando un descriptor de dispositivo (de ahora en adelante device descriptor) y uno o más descriptores de la interfaz (interface descriptor) al dispositivo.

Dispositivo

Un dispositivo es una entidad lógica o física que lleva a cabo una o más funciones. Los hubs y los periféricos son dispositivos (devices). El host asigna una dirección única a cada dispositivo en el bus. Un dispositivo compuesto contiene un hub con uno o más dispositivos conectados permanentemente. El host trata al dispositivo compuesto de la misma forma que si el hub y sus funciones fueran dispositivos físicos separados. El hub y los dispositivos embebidos tienen una única dirección.

un dispositivo compuesto tiene una dirección de bus pero múltiples interfaces independientes, cada una proporcionando una función. Cada interfaz puede usar un driver diferente en el host. Por ejemplo, un dispositivo compuesto puede tener interfaces para almacenamiento masivo y un teclado.

Puerto

En términos generales, una puerto de computadora es una ubicación direccionable que puede conectarse a los circuitos físicos. Para el USB, cada conector en un hub representa un puerto USB. Las aplicaciones host no pueden acceder a los puertos directamente sino que se comunican con los drivers asignados a los dispositivos conectados a los puertos. Un controlador de host USB puede residir en una serie de direcciones del puerto que el sistema del CPU accede, pero estos puertos son distintos de los puertos del Bus.

Energía

Un dispositivo de alta potencia USB 2.0 puede exigir hasta 500 mA al bus. Los puertos en algunos host alimentados por baterías y hubs solamente soportan dispositivos de baja potencia, que están limitados a 100 mA. Para conservar la energía cuando el bus está sin actividad, el host puede pedir a los dispositivos que entren en un estado de baja potencia y reducir el uso de la corriente del bus.

Lo esencial de las transferencias USB

Cada comunicación USB (con la excepción del USB 3.0) es entre el host y un dispositivo. El host gestiona el tráfico en el bus, y el dispositivo responde a las comunicaciones desde el host. Un endpoint es un dispositivo buffer que almacena los datos recibidos o transmitidos. Cada endpoint tiene un número, una dirección y un número máximo de bytes de datos que el endpoint puede enviar o recibir en una transacción.

Cada transferencia USB consiste en una o mas transacciones que pueden transportar los datos desde o hacia un endpoint. Una transacción USB 2.0 empieza cuando el host manda un paquete token hacia el bus. El paquete token contiene el numero del endpoint objetivo y la dirección. Un paquete token de ENTRADA solicita un paquete de datos desde el endpoint. Un paquete token de SALIDA precede el paquete de datos desde el host. Además de los datos, cada paquete de datos contiene bits de comprobación de error y un paquete ID (PID). Muchas transacciones también tienen in paquete handshake donde el receptor de los datos reporta el éxito o la falla en la transacción.

El estándar USB soporta cuatro tipos de transferencias: control, bulk, interrupt e isochronous.

Endpoints

Todo el tráfico del bus viaja hacia o desde un endpoint. El endpoint es un buffer que almacena típicamente múltiples bytes y consiste en un bloque de memoria de datos o un registro en el controlador de dispositivo del chip. Los datos almacenados en un endpoint pueden ser los datos recibidos o los datos en espera para su transmisión. El host también tiene buffers que retienen los datos recibidos o los datos en espera para su transmisión, pero el host no tiene endpoints. En su lugar, el host sirve como la fuente y el destino para la comunicación con los endpoints del dispositivo.

La dirección de un endpoint consiste en un numero de endpoint y una dirección. El valor de este número esta en el rango del 0 al 15. La dirección esta definida desde la perspectiva del host: un enpoint de ENTRADA proporciona datos para mandar al host y un endpoint de SALIDA almacena los datos recibidos desde el host. Un endpoint configurado para transferencias de control debe transmitir datos en ambas direcciones, así que, un endpoint de control consiste en un par de direcciones de endpoints de ENTRADA y de SALIDA que comparten el mismo numero de endpoint.

Para otros tipos de transferencias, los datos fluyen en una sola dirección, aunque la información de estado y de control pueden viajar en direcciones opuestas. Un solo numero de endpoint puede soportar ambas direcciones de endpoint de ENTRADA y SALIDA. Por ejemplo, un dispositivo puede tener el endpoint 1 de ENTRADA para mandar datos al host y el endpoint 1 de SALIDA para recibir datos del host.

Además del endpoint cero, un dispositivo full o high speed puede tener hasta 30 endpoints adicionales (1-15 de ENTRADA y SALIDA). Un dispositivo low speed puede tener como máximo dos direeciones de endpoints adicionales que pueden ser dos de ENTRADA y dos de SALIDA o una en cada dirección.

Tipos de transacción

Cada transacción USB 2.0 empieza con un paquete que contiene un numero de endpoint y un código que indica la dirección del flujo de datos y cuando la transacción está iniciando una transferencia de control:

Tipo de transacción Origen de los datos Tipos de transferencias que utilizan el tipo de transacción Contenido
ENTRADA dispositivo todas datos o información sobre el estado
SALIDA host todas datos o información del estado
Configuración host control una petición

Así como con las direcciones en los endpoints, se toma por convención las transacciones de ENTRADA y SALIDA desde el punto de vista del host. En una transacción de ENTRADA, los datos viajan desde el dispositivo hacia el host. En una transacción de SALIDA, los datos viajan desde el host hacia el dispositivo.

Una transacción de configuración es como una transacción de SALIDA porqué los datos viajan desde el host hacia el dispositivo, pero una transacción de configuración es un caso especial porqué es la que inicia una transferencia de control.

En cada transacción USB 2.0, el host envía un direccionamiento triple que consiste en una dirección de dispositivo, un numero de endpoint y una dirección de endpoint. En la recepción de un paquete de ENTRADA o de configuración, el endpoint almacena los datos que siguen al paquete, y el hardware del dispositivo normalmente activa una interrupción. En la recepción de un paquete de ENTRADA, si el endpoint ya tiene datos que mandar al host, el hardware manda los datos al bus y normalmente activa una interrupcion.

Pipes

Antes de que los datos puedan ser transmitidos, el host y el dispositivo deben establecer un pipe (conducto). Un pipe es una asociación entre el endpoint del dispositivo y el software del controlador de host. El software del host establece un pipe con la dirección de cada endpoint con el que el host debe comunicarse.

El host puede solicitar nuevos pipes o eliminar los pipes que ya no se necesitan usando transferencias de control. Cada dispositivo tiene un pipe de control por defecto que utiliza el endpoint zero.

Comparación entre los tipos de transferencias

Características principales:

Tipo de transferencia Control Bulk Interrupt Isochronous
Uso típico Identificación y configuración Impresora, escáner, drive Mouse, teclado Transmisión de audio, video.
Requiere que el dispositivo lo soporte Si No No No
Se permite usarlo en baja velocidad Si No Si No
Tamaño máximo de paquetes; numero de
paquetes/intervalo garantizados (superspeed)
512;
ninguno
1024;
ninguno
1024;
3 / 125 uSeg
1024;
48 / 125 uSeg
Tamaño máximo de paquetes; numero de
paquetes/intervalo garantizados (high speed)
64;
ninguno
512;
ninguno
1024;
3 / 125 uSeg
1024;
3 / 125 uSeg
Tamaño máximo de paquetes; numero de
paquetes/intervalo garantizados (full speed)
64;
ninguno
64;
ninguno
64:
1 / ms
1023;
1 / ms
Tamaño máximo de paquetes; numero de
paquetes/intervalo garantizados (low speed)
8;
ninguno
no permitido 8;
1 / 10 ms
no permitido
Dirección del flujo de datos ENTRADA y SALIDA ENTRADA o SALIDA ENTRADA o SALIDA (ENTRADA solamente para USB 1.0) ENTRADA o SALIDA
Ancho de banda reservado para todas las transferencias según el tipo 10% a low/full speed, 20% a high speed y superspeed ninguno 90% a low/full speed, 80% a high speed y superspeed 90% a low/full speed, 80% a high speed y superspeed
Mensajes o flujo de datos Mensajes Flujo Flujo Flujo
Corrección de errores Si Si Si No
Velocidad de transmisión garantizada No No No Si
Latencia garantizada (tiempo máximo entre intentos de transferencia) No No Si Si

Transferencia de control

Las transferencias de control se utilizan de dos formas diferentes. Para todos los dispositivos, las transferencias de control transportan las solicitudes estándar que el host utiliza para aprender sobre el dispositivo y su configuración. Las transferencias de control también pueden transportar solicitudes definidas por una clase o un proveedor para cualquier propósito.

Todos los dispositivos deben soportar las transferencias de control sobre el pipe por defecto en el endpoint zero. Un dispositivo puede tener pipes adicionales para las transferencias de control, pero en la práctica no hay necesidad de mas de uno.

El tamaño máximo de paquetes varía con la velocidad del bus:

Velocidad del bus Tamaño máximo del paquete de datos
Low 8
Full 8,16,32, o 64
High 64
SuperSpeed 512

 

Transferencias Bulk

Las transferencias Bulk son útiles para transferir datos cuando el tiempo de transmisión no es critico. Una transferencia Bulk puede mandar grandes cantidades de datos sin saturar el bus por que estas transferencias se postergan, en espera de que los otros tipos de transferencias terminen. Los usos de este tipo de transferencias incluyen mandar datos a una impresora, mandar datos a un escáner y leer y escribir a un drive. En caso de que el bus este desocupado, las transferencias Bulk es el tipo de transferencia mas rápido.

La velocidad Low Speed no soporta las transferencias Bulk. No se requiere que los dispositivos soporten las transferencias Bulk, pero una clase específica de dispositivo puede necesitarlas. Por ejemplo, un dispositivo de almacenamiento masivo debe tener un enpoint tipo Bulk en cada dirección.

El tamaño máximo de paquetes varía con la velocidad del bus:

Velocidad del bus Tamaño máximo del paquete de datos
Full 8,16,32,64
High 512
SuperSpeed 1024

Estos bytes solo incluyen la información transferida en el paquete de datos, excluyendo los bits PID y CRC.

Durante la enumeración, el host lee el tamaño máximo del paquete para cada endpoint tipo Bulk desde el descriptor del dispositivo. La cantidad de datos en una transferencia puee ser menor, igual o más grande que el tamaño máximo del paquete. Si los datos no caben en un solo paquete, el host utiliza múltiples transacciones para completar la transferencia.

El controlador de host garantiza que las transferencias Bulk se completarán eventualmente pero no reserva ancho de banda para ellas. Las transferencias de control tienen garantizados un 10% del ancho de banda en velocidades low y full y 20% en high speed y SuperSpeed. Es posible que  las transferencias Interrupt e isochronous usen el resto. Así que si el bus esta muy ocupado, una transferencia Bulk puede tomar mucho tiempo en completarse.

Sin embargo, cuando el bus esta desocupado, las transferencias Bulk puede usar el mayor ancho de banda comparado con las demás transferencias por lo tanto son las más rápidas de todas.

Transferencias Interrupt

Las transferencias Interrupt (interrupción) son útiles cuando los datos deben ser transferidos sin retraso. Las aplicaciones típicas incluyen teclados, dispositivos apuntadores, controles de juegos, y los reportes de estado de los hubs. Los usuarios no desean que exista un retardo cuando presionan una tecla o mueven el mouse. Un hub debe reportar la conexión o desconexión de un dispositivo rápidamente. Es mas probable que los dispositivos de baja velocidad que soporta solo transferencias de control y de interrupción, usen este tipo de transferencias.

Las transferencias Interrupt son llamadadas de interrupción por que garantizan una rápida respuesta del host.

Todas las velocidades admiten transferencias Interrupt. No se requiere que los dispositivos soporten las transferencias Interrupt, pero una clase de dispositivo puede que la requiera. Por ejemplo, un dispositivo HID (Human Interface Device) debe soportar transferencias Interrupt de ENTRADA para mandar transferencias al host.

El numero máximo de bytes de datos en  un paquete para una transacción de interrupción cambia con la velocidad del bus y el numero de paquetes por microframe.

Velocidad del bus Tamaño máximo del paquete de datos Máximo numero de paquetes/intervalo garantizados
Low 1-8 1 / 10 frames
Full 1-64 1 / frame
High 1-1024 1 / microframe
  513-1024 2 / microframe
  683-1024 3 / microframe
SuperSpeed 1-1024 y bMaxBurst = 0 1 / bus interval
  1024 y bMaxBurst > 0 3 / bus interval

Estos bytes solo incluyen la información transferida en el paquete de datos, excluyendo los bits PID y CRC.

Transferencias Isochronous

Las transferencias Isochronous son de flujo, transferencias en tiempo real que son útiles cuando los datos deben llegar a un ritmo constante o con un tiempo limite especifico y errores ocasionales son tolerables. A velocidades Full y SuperSpeed, las transferencias Isochronous pueden transferir mas datos por frame o intervalo de bus comparado con las transferencias Interrupt, pero este tipo de transferencia no soporta la retransmisión de datos cuando ocurre un error.

Ejemplos de usos para las transferencias Isochronous incluyen codificación de voz y la música que es tocada en tiempo real. Los datos que serán eventualmente consumidos a una tasa constante no siempre requieren transferencias Isochronous. Ni los datos en una transferencia Isochronous deben ser en tiempo real como el audio y el video. Una transferencia Isochronous es una manera de asegurar que cualquier bloque de datos tiene un ancho de banda reservado en un bus ocupado.

La velocidad Low no soporta transferencias Isochronous. El soporte de las transferencias Isochronous no es requerido pero una clase de dispositivo puede que lo necesite. Por ejemplo, muchas clases de dispositivos  de audio y video utilizan Isochronous endpoints.

El numero máximo de bytes de datos en los paquetes de las transacciones Isochronous cambia con la velocidad del bus y el numero de paquetes por microframe.

Velocidad del bus Tamaño máximo del paquete de datos Máximo numero de paquetes/intervalo garantizados
Full 0-1023 1 / frame
High 0-1024 1 / microframe
  513-1024 2 / microframe
  683-1024 3 / microframe
SuperSpeed 0-1024 y bMaxBurst = 0 3 / bus interval
  1024 y bMaxBurst > 0 48 / bus interval

Estos bytes solo incluyen la información transferida en el paquete de datos, excluyendo los bits PID y CRC.

Enumeración

Antes de que las aplicaciones puedan comunicarse con el dispositivo, el host necesita aprender acerca del dispositivo y asignarle un driver. Enumeración es el intercambio de información que lleva a cabo estas tareas. El proceso incluye asignarle una dirección al dispositivo, leer los descriptores desde el dispositivo,  asignación y carga de un driver y la selección de una configuración que especifica los requerimientos de energía del dispositivo e interfaces. El dispositivo entonces esta listo para transferir los datos.

Descriptores

Los descriptores USB son las estructuras de datos que hacen posible que el host puede aprender acerca de un dispositivo. Cada descriptor contiene información acerca de los dispositivos como un todo o como un elemento en el dispositivo.

Tipos

Excepto por los dispositivos compuestos, cada dispositivo tiene solo un descriptor de dispositivo que contiene información acerca del dispositvo y especifica el numero de las configuraciones que el dispositivo soporta. Por cada configuración, cada dispositivo tiene un descriptor de configuración con información acerca del uso de energía y el número  de interfaces que la configuración soporta. Para cada interface, el dispositivo tiene un descriptor de interface que especifica el numero de endpoints. Cada endpoint tiene un descriptor de endpoint que contiene la información necesaria para comunicarse con el endpoint. Una interfaz sin descriptores de endpoints usa el endpoint de control para todas las comunicaciones.

bDescriptorType Tipo de descriptor Requerido
01h device Si
02h configuration Si
03h string No, a menos que el driver lo requiera.
04h interface Si
05h endpoint Si, para usar otros endpoints además del zero.
06h device_qualifier Si para dispositivos que soportan velocidades full y high. No disponible para otros dispositivos.
07h other_speed_configuration Si para dispositivos que soportan velocidades full y high. No disponible para otros dispositivos.
08h interface_power No (propuesto pero nunca aprobado o implementado)
09h OTG Si para dispositivos On-The-Go
0Ah debug No
0Bh interface_association Si para algunos dispositivos compuestos
0Ch security Para dispositivos inalámbricos
0Dh key Para dispositivos inalámbricos
0Eh encryption type Para dispositivos inalámbricos
0Fh binary device object store (BOS) Si para dispositivos SuperSpeed, dispositivos inalámbricos, y dispositivos que soportan link power management
10h device capability Si para dispositivos SuperSpeed, dispositivos inalámbricos, y dispositivos que soportan link power management
11h wireless endpoint companion Para dispositivos inalámbricos
30h SuperSpeed_endpoint_companion Si para dispositivos SuperSpeed. No soportado para otras velocidades

Descriptor Device

El descriptor device es el primer descriptor que el host lee cuando un dispositivo es conectado. El descriptor contiene información que el host necesita para recuperar información adicional desde el dispositivo.

Offset (decimal) Campo Tamaño (bytes) Descripción
0 bLength 1 Tamaño del descriptor en bytes (12h)
1 bDescriptorType 1 La constante DEVICE (01h)
2 bcdUSB 2 Número de especificación de la publicación USB (BCD)
4 bDeviceClass 1 Código de la clase
5 bDeviceSubClass 1 Código de la subclase
6 bDeviceProtocol 1 Código del protocolo
7 bMaxPacketSize0 1 Tamaño máximo del paquete para el endpoint zero
8 idVendor 2 Identificación del vendedor
10 idProduct 2 Identificación del Producto
12 bcdDevice 2 Número del lanzamiento del dispositivo (BCD)
14 iManufacturer 1 Índice de la cadena de texto del descriptor para el fabricante.
15 iProduct 1 Índice de la cadena de texto del descriptor para el producto
16 iSerialNumber 1 Índice de la cadena de texto del descriptor para el numero de serie
17 bNumConfigurations 1 Numero de configuraciones posibles

bcdUSB es la versión de la especificación USB del dispositivo en formato BCD (decimal codificado a binario). USB 1.1 es 0110h (no 0101h). USB 2.0 es es 0200h. USB 3.0 es 0300h.

bDeviceClass especifica la clase del dispositivo cuya función esta definida a nivel de dispositivo. Los valores desde 01h a FEh estan reservadas para las clases definidas por la especificación USB. Clases definidas por el vendedor usa FFh.

vDeviceClass Descripción
00h El descriptor de interfaz especifica la clase y la función no utiliza un descriptor de asociación de interfaz. (Ver EFh)
02h Dispositivo de comunicaciones
09h Hub
0Fh Dispositivo médico personal (preferida su declaración a nivel de interfaz)
DCh Dispositivo de diagnóstico ( puede ser declarado a nivel de interfaz)
bDeviceSubclass=01h, bDeviceProtocol=01h: dispositivo USB2
E0h Controlador inalámbrico
bDeviceSubclass=01h:Interfaz de programación Bluetooth
EFh Misceláneo
bDeviceProtocol = 01h
  bDeviceProtocol = 01h: active sync
  bDeviceProtocol = 02h: palm sync
bDeviceSubclass = 02h
  bDeviceProtocol = 01h: Descriptor de asociación de interfaz
  bDeviceProtocol = 01h: Periférico multifunción de adaptador de cable (USB inalámbrico)
FFh Específico del fabricante.

bDeviceSubclass puede especificar una subclase dentro de una clase. Una subclase puede añadir soporte para características adicionales y habilidades que se comparten por un grupo de funciones en una clase. Si bDeviceClass es 00h, bDeviceSubclass debe ser 00h.

bDeviceProtocol puede especificar un protocolo para la clase seleccionada y la subclase. Por ejemplo , un hub USB 2.0 utiliza este campo para indicar cuando el hub soporta la velocidad high speed.

bMaxPacketSize0 especifica el tamaño máximo del paquete para el endpoint zero. Para USB 2.0, el tamaño máximo del paquete es igual al valor del campo y debe ser 8 para low speed; 8,16,32 o 64 para full speed, y 64 para high speed.

idVendor es la identificación del vendedor asignada por el USB-IF (foro de implementadores USB) a los miembros de el USB-IF y otros que pagan una tarifa administrativa. El host puede tener un archivo INF que contiene este valor, y si es así, Windows puede usar este valor para sleccionar un driver par el dispositivo. Excepto por los dispositivos usados solamente en casa donde el usuario es responsable de prevenir conflictos, cada dispositivo debe tener una identificación del vendedor válida en este campo.

idProduct es la identificación del producto que identifica el dispositivo del vendedor. El dueño del Vendor ID asigna el Product iD El archivo INF puede contener estos dos valores para que Windows los utilice para seleccionar un driver. Cada Product ID es específica para cada Vendor ID, así que los vendedores pueden usar el mismo Product ID sin que exista conflicto.

bcdDevice es el numero de lanzamiento del dispositivo en formato BCD. El vendedor asigna este valor.

iManufacturer es un índice que apunta a una cadena que describe el fabricante o cero si no hay un descriptor del fabricante.

iProduct es un índice que apunta a una cadena que describe el producto o cero si no hay un descriptor del producto.

iSerialNumber es un índice que apunta a una cadena que contiene el número de serie del  dispositivo o 00h si no hay un numero de serie. Los números de serie son útiles cuando el usuario puede tener mas dispositivos idénticos en el bus y el host necesita recordar cual dispositivo es cual después de un reinicio.

bNumConfigurations es igual al numero de configuraciones que el dispositivo soporta con la velocidad de operación que se esta usando.

Descriptor Configuration

Cada dispositivo tiene por lo menos una configuración que especifica las características del dispositivo y sus habilidades. Típicamente una sola configuración es suficiente, pero con el soporte del driver, un dispositivo con múltiples usos o múltiples opciones de energía pueden soportar múltiples configuraciones. Solo una configuración esta activa a la vez.

Offset (decimal) Campo Tamaño (bytes) Descripción
0 bLenght 1 Tamaño del descriptor en bytes (09h)
1 bDescriptorType 1 La constatne del descriptor CONFIGURATION (02h)
2 wTotalLenght 2 El número de bytes en el descriptor configuration y todos sus descriptores subordinados.
4 bNumInterfaces 1 Numero de interfaces en la configuración
5 bConfigurationValue 1 Identificador para las solicitudes Set Configuration y Get Configuration
6 iConfiguration 1 Índice de la cadena de texto del descriptor para la configuración
7 bmAttributes 1 Configuración de las opciones de energía.
8 bMaxPower 1 Energía que necesita del Bus en unidades de 2 mA (USB 2.0) o 8 mA (SuperSpeed)

El host selecciona una configuración con la solicitud Set Configuration y lee el número de configuración que se esta usando con una solicitud Get Configuration.

wTotalLenght es igual al número de bytes en el descriptor Configuration y todos sus descriptores subordinados.

bNumInterfaces es igual al número de interfaces en la configuración. El mínimo es 01h.

bConfigurationValue identifica la configuración cuando se solicita con Get Configuration o Set configuration y debe ser 01h o mayor.  Una solicitud Set Configuration con un valor de cero provoca que el dispositivo entre en el estado No Configurado.

iConfiguration es un índice a una cadena de texto que describe la configuración. Este valor es cero si no hay un descriptor de cadena.

bmAttributes pone el bit 6 = 1 si el dispositivo es alimentado por sí mismo y cero si es alimentado por el bus. Bit 5 = 1 si el dispositivo soporta la característica Remote WakeUp, la cual posibilita a un dispositivo en estado suspendido decir al host si el dispositivo quiere comunicarse. los otros bits en el campo no se usan. Bits 4..0 dben ser cero. Bit 7 debe ser igual a 1 por compatibilidad con USB 1.0.

bMaxPower. Especifica cuanta corriente proveniente del bus necesita el dispositivo. Para USB 2.0, bMaxPower está en unidades de 2 mA. Si el dispositivo requiere 200mA, bMaxPower=64h.

Descriptor Interface

El descriptor Interface proporciona información acerca de una función o característica que un dispositivo implementa. El descriptor contiene información sobre la clase, subclase y el protocolo y el número de endpoints que la interfaz utiliza.

Una configuración puede tener múltiples interfaces que están activas al mismo tiempo. Las interfaces pueden estar asociadas con una única función o pueden no estar relacionadas. Cada interfaz tiene su propio descriptor Interface y un descriptor subordinado. Cada una de estas interfaces puede también tener uno o más configuraciones de interfaz alternativas. Estas configuraciones son mutuamente excluyentes; solo una está activa a la vez. Los dispositivos que usan transferencias isochronous tienen configuraciones alternativas de interfaz porqué la interfaz por defecto puede solicitar un ancho de banda no isochronous.

Offset (decimal) Campo Tamaño (bytes) Descripción
0 bLenght 1 Tamaño del descriptor en bytes (09h)
1 bDescriptorType 1 La constante Interface (04h)
2 bInterfaceNumber 1 El número que identifica esta interfaz
3 bAlternateSetting 1 Un número que identifica el descriptor con la configuración alternativa para este bInterfaNumber
4 bNumEndpoints 1 Número de endpoints soportados sin contar al endpoint zero
5 bInterfaceClass 1 Código de la clase
6 bInterfaceSubClass 1 Código de la subclase
7 bInterfaceProtocol 1 Código del protocolo
8 iInterface 1 Índice del descriptor de cadena para la interfaz

bInterfaceNumber identifica la interfaz. En un dispositivo compuesto, una configuración tiene interfaces múltiples que están activas al mismo tiempo. Cada interfaz debe tener un descriptor con un valor único en este campo. La interfaz por defecto es 00h.

bAlternateSetting identifica la configuración de la interfaz por defecto o una configuración alternativa. Para cada bInterfaceNumber, el dispositivo proporciona un descriptor de interfaz con bAlternateSetting = 00h. Esta es la configuración por defecto.

bNumEndpoints es igual al numero de endpoints que la interfaz soporta además del endpoint zero. Para un dispositivo que solo soporta el endpoint zero, este campo es cero.

bInterfazClass es similar a bDeviceClass en el descriptor del dispositivo, pero para dispositivos con una clase especificada por la interfaz.

 

Código de la clase (hexadecimal) Descripción
00 Reservado
01 Audio
02 Clase de dispositivo de comunicaciones: interfaz de comunicaciones
03 Dispositivo de interfaz humana
05 Físico
06 Imagen
07 Impresora
08 Almacenamiento masivo
09 Hub
0A Clase de dispositivo de comunicaciones: interfaz de datos
0B Smart Card
0D Seguridad de contenidos
0E Video
0F Dispositivo médico personal
DC Dispositivo de diagnostico
E0 Controlador inalámbrico
EF Misceláneo
FE De aplicación especifica
bInterfaceSubclass = 01h. Actualización del firmware del dispositivo
bInterfaceSubclass = 02h. Puente IrDA
bInterfaceSubclass = 03h. Pruebas y medición
FF Especifico del vendedor

Valores 01h-FEh estan reservados para las clases definidas por USB. El cero esta reservado.

bInterfaceSubclass es similar a bDeviceSubclass en el descriptor de dispositivo, pero para dispositivos con una clase definida por la interfaz.

bInterfaceProtocol es similar a bDeviceProtocol en el descriptor del dispositivo, pero para dispositivos cuya clase esta definida por la interfaz.

iInterface es el índice a la cadena que describe a la interfaz. Este valor es cero si no hay un descriptor de cadena.

Endpoint

Cada endpoint especificado en el descriptor de la interfaz tiene un descriptor de endpoint. El endpoint zero no tiene nunca un descriptor porque todos los dispositivos deben soportar el endpoint zero, el descriptor del dispositivo contiene el máximo tamaño del paquete y la especificación USB define todo lo demás acerca del endpoint.

Offset (decimal) Campo Tamaño (bytes) Descripción
0 bLength 1 Tamaño del descriptor en bytes (07h)
1 bDescriptorType 1 La constante Endpoint (05h)
2 bEndpointAddres 1 Número y dirección del endpoint
3 bmAttributes 1 Tipo de transferencia e información suplementaria
4 wMaxPacketSize 2 Tamaño máximo del paquete soportado
6 bInterval 1 Intervalo de servicio o tasa NAK

bEndpointAddress especifica el número de endpoint y dirección. Bits 3..0 son el número de endpoint. Los dispositivos low speed pueden tener un máximo de 3 endpoints (usualmente en el rango 0-2), mientras que las velocidades full y high pueden tener 16 (0-15). Bit 7 es la dirección, SALIDA = 0, ENTRADA = 1. Bits 6..4 no se utilizan y deben ser cero.

bmAttributes establece los bits 1..0 para escificar el tipo de transferencia que el endpoint soporta: 00 = control, 01 = isocrhonous, 10 = bulk, 11 = interrupt. Bits 7..6 son reservados y deben ser cero. Las funciones de los bits restantes varían con el tipo de endpoint y la velocidad. Para endpoints isochronous, los bits 5..2 pueden indicar un tipo de sincronización y el tipo de uso de datos o de realimentación.

wMaxPacketSize especifica el número máximo de bytes de datos que el endpoint puede transferir en una transacción. Los valores permitidos pueden variar con la velocidad del dispositivo y el tipo de transferencia.

Para USB 2.0, bits 10..0 son el tamaño máximo de paquete con un rango de 0-1024. Para USB 1.x, el rango es 0-1023. En USB 2.0, bits 12..11 indica cuantas transacciones adicionales por microframe a velocidad high speed  para endpoints Interrupt o Isochronous soporta: 00 = sin transacciones adicionales (total de 1 / microframe), 01 = uno adicional (total de 2 / microframe), 10 = 2 adicionales (total de 3 / microframe), 11 = reservado. En USB 1.x estos bits eran reservados y cero. Bits 15..13 son reservados y cero.

bInterval especifica el intervalo de servicio para los endpoints Interrupt e Isochronous. El intervalo de servicio es un periodo dentro del cualel host debe reservar tiempo para una transacción del endpoint.

Descriptor String

Un descriptor String (de cadena) contiene texto descriptivo. Otros descriptores pueden contener índices a cadenas que describen el fabricante, producto, el numero de serie, la configuración y la interfaz. Descriptores específicos a la clase y al vendedor pueden contener descriptores String adicionales.

Offset (decimal) Campos Tamaño (bytes) Descripción
0 bLenght 1 Tamaño del dispositivo en bytes (variable)
1 bDescriptorType 1 La constante String (03h)
2 bString o wLANGID varia Para el descriptor String cero, un arreglo de uno o mas códigos de indentificador de lenguaje. Para los otros descriptores String, una cadena Unicode UTF-16LE.

wLANGID[0..n] es valido para el descriptor cero solamente. Este campo contiene uno o mas códigos de identificación de lenguaje de 16 bits que indican el lenguaje de la cadena. El inglés de los Estados Unidos (0409h) es probablemente el único código soportado por el sistema operativo.

bString es una cadena válida en formato Unicode UTF-16LE.

Estos son los descriptores que se modificarán comúnmente  en las próximas entradas.

0 comentarios:

Publicar un comentario