¿Diseño de teclado numérico USB?
Discusión relacionada con la introducción del informe USB HID y el descriptor del informe: /blog/computer00/14382/category.aspx
En USB, USB HOST identifica dispositivos a través de varios descriptores Sí, hay descriptores de dispositivo , descriptores de configuración, descriptores de interfaz, descriptores de puntos finales, descriptores de cadenas, descriptores de informes, etc.
El Descriptor de Informe USB (Descriptor de Informe) es un descriptor en el dispositivo HID. Es un descriptor relativamente
complejo.
Los dispositivos USB HID transmiten datos a través de informes. Los informes incluyen informes de entrada e informes de salida.
El informe de entrada es enviado por el dispositivo USB al host, como el mouse USB que devuelve el movimiento del mouse y los clics del mouse, etc.
La información se devuelve a la computadora, y el teclado devuelve datos clave a la computadora, etc. El informe lo envía el host al dispositivo USB, como la luz de bloqueo del teclado numérico y la luz de bloqueo de letras mayúsculas en el teclado. Un informe es
un paquete que contiene los datos a transmitir. El informe de entrada se ingresa a través del punto final de entrada de interrupción
, y el informe de salida es un poco diferente. Cuando no hay un punto final de salida de interrupción, se puede enviar a través de la salida de control
. punto final 0. Cuando hay una interrupción, el punto final de salida se emite a través del punto final de salida de interrupción.
El descriptor de informe describe un informe y para qué se utilizan los datos del informe.
A través de él, USB HOST puede analizar el significado de los datos del informe. Se devuelve a través de la entrada de control
punto final 0. El host utiliza el comando get report descriptor para obtener el descriptor del informe. Tenga en cuenta que esta solicitud
se envía a la interfaz, no a la. dispositivo. Un descriptor de informe puede describir varios informes. Diferentes
informes se identifican mediante el ID del informe, que se encuentra al principio del informe, es decir, el primer byte. Cuando el descriptor del informe
no especifica un ID de informe, no habrá ningún campo de ID en el informe y comenzarán los datos. Para obtener instrucciones más detalladas, consulte
Protocolo USB HID, que se puede descargar desde /Upload/Blog/2007/4/2/af7c3443-ad61-4465-ADC7-a74d28bbc322.zip
A continuación se describen los descriptores de informes y los informes a través del mouse USB y el teclado USB generados por la herramienta HID Descriptor.
código char KeyBoardReportDescriptor[63] = {
//Indica que la página de propósito es un dispositivo de escritorio general
0x05, 0x01, // USAGE_PAGE (Genérico Desktop)
//Indica que el propósito es el teclado
0x09, 0x06, // USAGE (Teclado)
//Indica la colección de aplicaciones, que debe terminará con END_COLLECTION Ver el último END_COLLECTION
0xa1, 0x01, // COLLECTION (Aplicación)
//Indica que la página de propósito es un botón
0x05. , 0x07, // USAGE_PAGE (Teclado)
//Usa el valor mínimo, aquí está la tecla Ctrl izquierda
0x19, 0xe0, // USAGE_MINIMUM (Control izquierdo del teclado)
//Utilice el valor máximo, aquí está la tecla GUI derecha, es decir, la tecla de ventana
0x29, 0xe7, // USAGE_MAXIMUM (GUI derecho del teclado)
// El valor mínimo lógico es 0
0x15, 0x00, // LOGICAL_MINIMUM (0)
//El valor máximo lógico es 1
0x25, 0x01, / / LOGICAL_MAXIMUM (1)
// El tamaño del informe (es decir, el ancho de este campo) es de 1 bit, por lo que el valor mínimo lógico anterior es 0 y el valor máximo lógico es 1
0x75, 0x01, // REPORT_SIZE (1)
//El número de informes es 8, es decir, hay 8 bits en total
0x95, 0x08, / /REPORT_COUNT (8)
//Entrada, variable, valor, valor absoluto. Cosas como el teclado generalmente reportan valores absolutos,
//Pero cosas como el movimiento del mouse reportan valores relativos, indicando cuánto se ha movido el mouse
0x81, 0x02, // INPUT (Datos, Var, Abs)
//Los elementos anteriores describen un campo de entrada, con un total de 8 bits, cada bit representa un botón
//Respectivamente desde la tecla Ctrl izquierda a la GUI derecha llave. Estos 8 bits constituyen exactamente un byte, que se encuentra en el primer byte del informe.
//El bit más bajo, bit-0, corresponde a la tecla Ctrl izquierda. Si el bit en los datos devueltos es 1, significa que se presionó la tecla Ctrl izquierda. > / /De lo contrario, no se presiona la tecla Ctrl izquierda. El bit más alto, bit-7, indica la pulsación de la tecla GUI derecha. Los bits intermedios,
// deben determinarse de acuerdo con la tabla de páginas de uso (tablas de uso de HID) especificada en el protocolo HID.
Esto generalmente se usa para representar
//Teclas especiales, como teclas Ctrl, Mayús, Supr, etc.
//El número de dichos segmentos de datos es 1
0x95 , 0x01, // REPORT_COUNT (1)
//La longitud de cada segmento es 8 bits
0x75, 0x08, // REPORT_SIZE (8)
// Entrada, constante, valor, valor absoluto
0x81, 0x03, // ENTRADA (Cnst,Var,Abs)
//Los 8 bits anteriores son constantes y el dispositivo debe devolver 0
//El número de dichos segmentos de datos es 5
0x95, 0x05, // REPORT_COUNT (5)
//El tamaño de cada segmento es 1 bit
0x75, 0x01, // REPORT_SIZE (1)
//El propósito es el LED, que se usa para controlar el LED en el teclado, por lo que A continuación se explicará que se utiliza para la salida
0x05, 0x08, // USAGE_PAGE (LED)
//El valor mínimo es Num Lock, que es la luz de bloqueo de teclas numéricas
0x19, 0x01, // USAGE_MINIMUM (Bloq Num)
//El valor máximo es Kana, no sé qué tipo de luz es esta^_^
0x29, 0x05, // USAGE_MAXIMUM (Kana)
// Como se mencionó anteriormente, este campo se usa para salida y se usa para controlar el LED. Variable, valor, valor absoluto.
//1 significa que la luz está encendida, 0 significa que la luz está apagada
0x91, 0x02, // SALIDA (Datos,Var,Abs)
//Dichos datos El número de segmentos es 1
0x95, 0x01, // REPORT_COUNT (1)
//El tamaño de cada segmento es 3 bits
0x75, 0x03, // REPORT_SIZE (3)
//Salida, constante, valor, absoluto
0x91, 0x03, // SALIDA (Cnst,Var,Abs)
//Dado que debe alinearse por byte, y solo se usan 5 bits para controlar el LED anteriormente,
//Por lo tanto, 3 bits no utilizados deben agregarse más adelante y establecerse como constantes.
//El número de informes es 6
0x95, 0x06, // REPORT_COUNT (6)
//El tamaño de cada segmento es 8bits
0x75, 0x08, // REPORT_SIZE (8)
//Valor mínimo lógico 0
0x15, 0x00, // LOGICAL_MINIMUM (0)
//Valor máximo lógico 255
0x25, 0xFF, // LOGICAL_MAXIMUM (255)
//Usar página para botones
0x05, 0x07, / / USAGE_PAGE (Teclado)
//Utiliza el valor mínimo de 0
0x19, 0x00, // USAGE_MINIMUM (Reservado (no se indica ningún evento))
/ /Usa el valor máximo El valor es 0x65
0x29, 0x65, // USAGE_MAXIMUM (Aplicación de teclado)
//Entrada, variable, matriz, valor absoluto
0x81, 0x00, // ENTRADA (Datos, Ary, Abs)
//Lo anterior define seis matrices de 8 bits de ancho. Cada 8 bits (es decir, un byte) se utiliza para representar un botón. para que pueda usarse al mismo tiempo
//Hay 6 botones presionados. Cuando no se presiona ningún botón, todos los retornos son 0. Si se presionan demasiadas teclas, el teclado escaneará el sistema
// Cuando no se puedan distinguir las teclas, se devolverán todos los 0x01, es decir, 6 0x01. Si se presiona una tecla, el primer
// byte de estos 6 bytes es el valor de clave correspondiente (consulte las tablas de uso de HID para valores específicos, entonces la primera y la segunda dos<). /p>
// los bytes son los valores clave correspondientes, y así sucesivamente.
//Cerrar la colección, correspondiente a lo anterior
0xc0 // END_COLLECTION
};
A través del análisis anterior, saber Solo hay un informe en este informe, por lo que no hay ningún ID de informe,
Por lo tanto, todos los datos devueltos son datos de uso reales. Hay 8 bytes de entrada y 1 byte de salida. El primer byte ingresado
se utiliza para representar claves especiales, el segundo byte está reservado y los siguientes seis bytes son claves ordinarias. Si
solo se presiona la tecla Ctrl izquierda, se devuelve 01 00 00 00 00 00 00 00 (hexadecimal). Si
solo se presiona la tecla numérica 1, se devuelve 00. 00 59 00 00 00 00 00, si se presionan las teclas numéricas 1 y 2 al mismo tiempo, volverá a 00 00 59 5A 00 00 00 00, si se presiona nuevamente la tecla Mayús izquierda, luego regresará 02 00 59 5A 00 00 00 00,
Luego suelta la tecla 1, luego regresa 02 00 5A 00 00 00 00 00,
Luego suelta todas las teclas, luego regresa 00 00 00 00 00 00 00 00.
Estos datos (es decir, informes) se devuelven a través del punto final de interrupción. Cuando se presiona la tecla Bloq Num, la PC enviará un informe de salida. Desde el descriptor del informe, sabemos que el LED de Bloq Num corresponde al bit más bajo del informe de salida cuando el número Cuando el teclado numérico está encendido, xxxxxxx1. (binario, x está determinado por el estado de otros LED) se emite
Cuando el teclado numérico está apagado, se emite xxxxxxx0 (igual que antes). Saque el bit más bajo para controlar el LED de bloqueo de la tecla numérica.
El descriptor de informe a continuación es el descriptor de informe del mouse USB, que es más simple que el del teclado.
Describe 4 bytes, el primer byte representa el botón, el segundo byte representa el eje x (es decir, el mouse se mueve hacia la izquierda y hacia la derecha,
0 significa no moverse, positivo El valor significa moverse hacia la derecha, el valor negativo significa moverse hacia la izquierda), el tercer byte significa el eje y (es decir, el mouse
se mueve hacia arriba y hacia abajo, 0 significa no moverse, el valor positivo significa moverse hacia abajo, el valor negativo significa subir), el cuarto byte
representa la rueda del mouse (el valor positivo significa desplazarse hacia arriba, el valor negativo significa desplazarse hacia abajo).
código char MouseReportDescriptor[52] = {
//Dispositivo de escritorio genérico
0x05, 0x01, // USAGE_PAGE (Escritorio genérico)
//Ratón
0x09, 0x02, // USO (Ratón)
//Colección
0xa1, 0x01, // COLECCIÓN (Aplicación)
//Dispositivo puntero
0x09, 0x01, // USO (Puntero)
//Colección
0xa1, 0x00, // COLLECTION (Físico)
//Botón
0x05, 0x09, // USAGE_PAGE (Botón)
//Usar valor mínimo 1
0x19, 0x01, // USAGE_MINIMUM (Botón 1)
//Utiliza el valor máximo de 3.
1 significa botón izquierdo, 2 significa botón derecho, 3 significa botón central
0x29, 0x03, // USAGE_MAXIMUM (Botón 3)
//Valor mínimo lógico 0
0x15, 0x00, // LOGICAL_MINIMUM (0)
//Valor máximo lógico 1
0x25, 0x01, // LOGICAL_MAXIMUM (1)
/ / La cantidad es 3
0x95, 0x03, // REPORT_COUNT (3)
//El tamaño es 1bit
0x75, 0x01, // REPORT_SIZE ( 1)
//Entrada, variable, valor numérico, valor absoluto
//Los tres bits anteriores representan los tres botones del mouse respectivamente, y el bit más bajo (bit-0 ) es el botón izquierdo
p>//bit-1 es el botón derecho, bit-2 es el botón central, el valor de bit correspondiente cuando se presiona es 1 y el valor correspondiente cuando se suelta es 0
0x81, 0x02, // ENTRADA (Datos,Var,Abs)
//Rellena 5 bits y forma un byte
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x03, // ENTRADA (Cnst,Var,Abs)
/ /Usar página para escritorio general
0x05, 0x01, // USAGE_PAGE (Escritorio genérico)
//Usado para X
0x09, 0x30, // USAGE (X)
//El uso es Y
0x09, 0x31, // USO (Y)
//El uso es rueda
0x09, 0x38, // USAGE (Rueda)
//El valor mínimo lógico es -127
0x15, 0x81, // LOGICAL_MINIMUM (-127)
//El valor máximo lógico es +127
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
//El tamaño es 8 bits
0x75 , 0x08, // REPORT_SIZE (8)
//El número es 3, que representa x, y y la rueda respectivamente
0x95, 0x03,
// REPORT_COUNT (3)
//Entrada, variable, valor, valor relativo
0x81, 0x06, // ENTRADA (Datos,Var,Rel)
//Cerrar colección
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};
Al analizar el informe anterior, Sabemos que el informe devuelve 4 bytes y ningún ID de informe. Si se presiona el botón izquierdo del mouse,
devuelve 01 00 00 00 (valor hexadecimal), si se presiona el botón derecho, se devuelve 02 00 00 00, si se presiona el botón central,
Devuelve 04 00 00 00. Si se presionan tres teclas al mismo tiempo, devuelve 07 00 00 00. Si el mouse se mueve hacia la derecha,
el segundo byte devuelve un valor positivo. Cuanto mayor sea el valor, más rápida será la velocidad de movimiento. Otras analogías.