teclado serial protocolo pro mini micro como biblioteca arduino hid emulation

serial - Emulación de teclado genérico con Arduino Leonardo



hid project (2)

Estoy tratando de usar un Arduino Leonardo para la emulación de teclado, ya que esa es una de sus características anunciadas. He estado jugando con Leonardo y escribí un boceto muy simple basado en el ejemplo de Blink.

// Pin 13 has an LED connected on most Arduino boards. int led = 13; // The setup routine runs once when you press reset: void setup() { // Initialize the digital pin as an output. pinMode(led, OUTPUT); } // The loop routine runs over and over again forever: void loop() { delay(5000); // Wait for five seconds digitalWrite(led, HIGH); // Turn the LED on (HIGH is the voltage level) delay(100); // Wait for a secondA digitalWrite(led, LOW); // Turn the LED off by making the voltage LOW Keyboard.write(''A''); // Write an A using keyboard emulator }

Ahora este ejemplo funciona muy bien en mi máquina con Windows XP. Se reconoce como un teclado HID genérico y escribirá una ''A'' cada cinco segundos.

El entorno de destino está ejecutando DOS, por lo que yo sé que necesito que Arduino Leonardo sea reconocido por el BIOS en esta máquina, que no lo es y no escribe la ''A'' en DOS.

He estado haciendo modificaciones en el descriptor del dispositivo USB del Leonardo, tratando de hacer que coincida con un Dell L100 tanto como sea posible. Las modificaciones que he hecho no han ayudado, y sospecho que es porque el Leonardo es un dispositivo compuesto que expone la comunicación en serie, la emulación del teclado y la emulación del mouse en el mismo puerto USB. El código fuente de los descriptores / configuración USB está disponible para ser editado y se encuentra en:

  • Arduino_Installation / hardware / arduino / cores / arduino / HID.cpp
  • Arduino_Installation / hardware / arduino / cores / arduino / USBDesc.h
  • Arduino_Installation / hardware / arduino / cores / arduino / USBCore.h
  • Arduino_Installation / hardware / arduino / cores / arduino / USBCore.cpp

El siguiente es un volcado desde USB Device Viewer para el Leonardo:

[Port3] : USB Composite Device ---===>Device Information<===--- English product name: "Arduino Leonardo" ConnectionStatus: Current Config Value: 0x01 -> Device Bus Speed: Full Device Address: 0x03 Open Pipes: 4 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x81 -> Direction: IN - EndpointID: 1 bmAttributes: 0x03 -> Interrupt Transfer Type wMaxPacketSize: 0x0010 = 0x10 bytes bInterval: 0x40 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x02 -> Direction: OUT - EndpointID: 2 bmAttributes: 0x02 -> Bulk Transfer Type wMaxPacketSize: 0x0040 = 0x40 bytes bInterval: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x02 -> Bulk Transfer Type wMaxPacketSize: 0x0040 = 0x40 bytes bInterval: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x84 -> Direction: IN - EndpointID: 4 bmAttributes: 0x03 -> Interrupt Transfer Type wMaxPacketSize: 0x0040 = 0x40 bytes bInterval: 0x01 ===>Device Descriptor<=== bLength: 0x12 bDescriptorType: 0x01 bcdUSB: 0x0110 bDeviceClass: 0x00 *!*ERROR: device class should be Multi-interface Function 0xEF When IAD descriptor is used bDeviceSubClass: 0x00 *!*ERROR: device SubClass should be USB Common Sub Class 2 When IAD descriptor is used bDeviceProtocol: 0x00 *!*ERROR: device Protocol should be USB IAD Protocol 1 When IAD descriptor is used bMaxPacketSize0: 0x40 = (64) Bytes idVendor: 0x2341 = Vendor ID not listed with USB.org as of 03-19-2008 idProduct: 0x8036 bcdDevice: 0x0100 iManufacturer: 0x01 English (United States) "Arduino LLC" iProduct: 0x02 English (United States) "Arduino Leonardo" iSerialNumber: 0x00 bNumConfigurations: 0x01 ===>Configuration Descriptor<=== bLength: 0x09 bDescriptorType: 0x02 wTotalLength: 0x0064 -> Validated bNumInterfaces: 0x03 bConfigurationValue: 0x01 iConfiguration: 0x00 bmAttributes: 0x80 -> Bus Powered MaxPower: 0xFA = 500 mA ===>IAD Descriptor<=== bLength: 0x08 bDescriptorType: 0x0B bFirstInterface: 0x00 bInterfaceCount: 0x02 bFunctionClass: 0x02 -> This is Communications (CDC Control) USB Device Interface Class bFunctionSubClass: 0x01 bFunctionProtocol: 0x01 iFunction: 0x00 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x00 bAlternateSetting: 0x00 bNumEndpoints: 0x01 bInterfaceClass: 0x02 -> This is Communications (CDC Control) USB Device Interface Class bInterfaceSubClass: 0x01 bInterfaceProtocol: 0x00 CAUTION: This may be an invalid bInterfaceProtocol iInterface: 0x00 -> This is a Communications (CDC Control) USB Device Interface Class ===>Descriptor Hex Dump<=== bLength: 0x05 bDescriptorType: 0x24 05 24 00 10 01 -> This is a Communications (CDC Control) USB Device Interface Class ===>Descriptor Hex Dump<=== bLength: 0x05 bDescriptorType: 0x24 05 24 01 01 01 -> This is a Communications (CDC Control) USB Device Interface Class ===>Descriptor Hex Dump<=== bLength: 0x04 bDescriptorType: 0x24 04 24 02 06 -> This is a Communications (CDC Control) USB Device Interface Class ===>Descriptor Hex Dump<=== bLength: 0x05 bDescriptorType: 0x24 05 24 06 00 01 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x81 -> Direction: IN - EndpointID: 1 bmAttributes: 0x03 -> Interrupt Transfer Type wMaxPacketSize: 0x0010 = 0x10 bytes bInterval: 0x40 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x00 bNumEndpoints: 0x02 bInterfaceClass: 0x0A -> This is a CDC Data USB Device Interface Class bInterfaceSubClass: 0x01 bInterfaceProtocol: 0x00 CAUTION: This may be an invalid bInterfaceProtocol iInterface: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x02 -> Direction: OUT - EndpointID: 2 bmAttributes: 0x02 -> Bulk Transfer Type wMaxPacketSize: 0x0040 = 0x40 bytes bInterval: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x02 -> Bulk Transfer Type wMaxPacketSize: 0x0040 = 0x40 bytes bInterval: 0x00 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x02 bAlternateSetting: 0x00 bNumEndpoints: 0x01 bInterfaceClass: 0x03 -> HID Interface Class bInterfaceSubClass: 0x01 bInterfaceProtocol: 0x00 CAUTION: This may be an invalid bInterfaceProtocol iInterface: 0x00 ===>HID Descriptor<=== bLength: 0x09 bDescriptorType: 0x21 bcdHID: 0x0101 bCountryCode: 0x00 bNumDescriptors: 0x01 bDescriptorType: 0x22 wDescriptorLength: 0x0065 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x84 -> Direction: IN - EndpointID: 4 bmAttributes: 0x03 -> Interrupt Transfer Type wMaxPacketSize: 0x0040 = 0x40 bytes bInterval: 0x01

¿Cómo podría obtener este Leonardo reconocido por un BIOS como un teclado genérico?


Puede que me equivoque, pero si quiere que se reconozca su dispositivo durante el arranque, es que el bInterfaceSubClass debe ser 0x01 (Subclase del dispositivo de arranque). En los archivos de origen que ha señalado, hay una subclase en todas partes configurada en 0x00.

Puede intentar establecer la subclase en todos los usos de la macro D_INTERFACE desde USBCore.h a 0x01.

No soy usuario de Arduino, solo estaba jugando una vez con la emulación de teclado HID en AVR usando V-USB . Puede intentar encontrar información detallada sobre las descripciones usb en USB.org en la documentación. Pero es un montón de páginas para leer.

Aquí hay una parte del volcado del descriptor HID de mi teclado, observe los valores en el Descriptor de interfaz:

Bus 005 Device 002: ID 046d:c30e Logitech, Inc. UltraX Keyboard (Y-BL49) Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x046d Logitech, Inc. idProduct 0xc30e UltraX Keyboard (Y-BL49) bcdDevice 1.80 iManufacturer 1 Logitech iProduct 2 HID compliant keyboard iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 59 bNumInterfaces 2 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xa0 (Bus Powered) Remote Wakeup MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 1 Boot Interface Subclass bInterfaceProtocol 1 Keyboard iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.10 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 62

El volcado se realizó utilizando "lsusb -v" como raíz en Linux.


Arduino no es compatible con el protocolo de arranque. Empecé a usar Teensy (que es compatible con Arduino), y funciona bastante bien.