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