Paso 3: Determinar los descriptores
Lo mejor para hacer una vez que haya determinado el VID/PID es identificar el descriptor del dispositivo. Un descriptor es una especie de 'menú' de lo que puede hacer el dispositivo y cómo le gusta a transferir datos. En general, cada dispositivo tiene un descriptor. A veces un dispositivo tiene más de un descriptor y puede que uno quiera pero no es muy común por lo que sólo vamos a ignorarlo. Una fantástica forma de obtener el descriptor sin tener que escribir cualquier software debe ejecutar lsusb - vv en un equipo linux. No hemos encontrado un equivalente para Windows o Mac, así que encontrar un amigo con un ordenador Linux. (Probar la herramienta "USB Prober" de Apple para Mac OS X).Aquí está la salida de lsusb para el Motor de NUI
Descriptor del dispositivo:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (definido a nivel de interfaz)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x045e Microsoft Corp.
idProduct 0x02b0
bcdDevice 1.05
iManufacturer 1 Microsoft
iProduct 2 Xbox NUI Motor
iSerial 0
bNumConfigurations 1
Descriptor de configuración:
bLength 9
bDescriptorType 2
wTotalLength 18
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Autoalimentado
MaxPower 100mA
Descriptor de interfaz:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 255 clase específica de proveedor
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Estado del dispositivo: 0 x 0000
(Bus Powered)
Vamos a ver lo que tenemos. Puede ver el VID y PID para arriba allí. A continuación vamos a ver en bNumConfigurations (cuántos descriptores diferentes tenemos) y por suerte para nosotros el número es 1. A continuación, ver el Descriptor de interfaz en bNumEndpoints particular, que es 0. Esto significa que hay no hay extremos.
Criterios de valoración son un tipo de USB 'pipe datos' - hay 4 tipos:
Extremos a granel son para transferir muchos datos, como una unidad de disco. Está bien si tarda un poco más pero queremos paquetes grandes. Este parámetro va sólo en una dirección (para leer y escribir que desea dos)
Interrumpir extremos son para transferir pequeñas cantidades de datos muy rápidamente, como para un ratón USB. En este caso, el dispositivo tiene que ser sensible por lo que queremos que un movimiento rápido. Este parámetro va sólo en una dirección
Isócronos extremos son para transferir una gran cantidad de datos donde los datos deben aparecer al mismo tiempo y si no puede él sólo deben dejarse caer. Esto es para cosas como Audio y Video donde la sincronización es clave. Este parámetro va sólo en una dirección (modo bidireccional audio para auriculares y micrófono tendría dos EPs)
Control extremos son esta raro no-absolutamente-an-Endpoint Endpoint. Se utilizan para transferir pequeñas cantidades de datos a decir activar un dispositivo o desactivar. Son muy baratos desarrollar, y cada dispositivo tiene una aunque no mencionado.
Por ejemplo, un puerto serial puede tener dos extremos interrupción para transferir datos hacia adentro y hacia afuera y luego un extremo control para ajustar la velocidad en baudios.
Para más detalles realmente sugerimos leer todo en lvr.com acerca de USB ya que es complejo.
Este dispositivo del motor no tiene extremos, pero eso no significa que no se puede comunicar con él. Sólo significa que sólo utiliza una bidireccional Control extremo. Esto no es sorprendente, los motores son lentos y no requieren una gran cantidad de datos al control.
Contraste esto con el dispositivo de cámara de vídeo:
Descriptor del dispositivo:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (definido a nivel de interfaz)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x045e Microsoft Corp.
idProduct 0x02ae
bcdDevice 1.0b
iManufacturer 2 Microsoft
iProduct 1 Xbox NUI cámara
iSerial 3 A00366A08793039A
bNumConfigurations 1
Descriptor de configuración:
bLength 9
bDescriptorType 2
wTotalLength 32
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Autoalimentado
MaxPower 16mA
Descriptor de interfaz:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 clase específica de proveedor
bInterfaceSubClass 255 subclase específica de proveedor
bInterfaceProtocol 255 protocolo específico del proveedor
iInterface 0
Descriptor de Endpoint:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 1
Tipo de transferencia isócrona
Sincronización de tipo ninguno
Datos de tipo de uso
wMaxPacketSize 0x0bc0 2 x 960 bytes
bInterval 1
Descriptor de Endpoint:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 1
Tipo de transferencia isócrona
Sincronización de tipo ninguno
Datos de tipo de uso
wMaxPacketSize 0x0bc0 2 x 960 bytes
bInterval 1
Dispositivo de clasificación (para otros dispositivo de velocidad):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 0 (definido a nivel de interfaz)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
bNumConfigurations 1
Estado del dispositivo: 0x0001
Autoalimentado
Este dispositivo tiene dos extremos isócronos, los cuales son de tipo (datos en el ordenador). Esto tiene sentido: el Kinect tiene una cámara de profundidad infrarrojos y una cámara VGA normal. Dos cámaras, dos puntos finales. Por supuesto, también hay un extremo Control no mencionado aquí, el endpoint de Control puede utilizarse para definir cosas como apertura, corrección gamma, cualquier tipo de filtro incorporado, etc..