Ver Fonte

add hid support

tfx2001 há 4 anos atrás
pai
commit
5f65cbebbc

+ 3 - 0
rt-thread/SConscript

@@ -29,6 +29,9 @@ if GetDepend(["PKG_TINYUSB_DEVICE_CDC"]):
 if GetDepend(["PKG_TINYUSB_DEVICE_MSC"]):
     src += ["../src/class/msc/msc_device.c", "port/msc_device_port.c"]
 
+if GetDepend(["PKG_TINYUSB_DEVICE_HID"]):
+    src += ["../src/class/hid/hid_device.c", "port/hid_device_port.c"]
+
 if GetDepend(["PKG_TINYUSB_DEVICE_EXAMPLE_CDC"]):
     src += ["example/cdc_example.c"]
   

+ 21 - 0
rt-thread/port/hid_device_port.c

@@ -0,0 +1,21 @@
+#include <tusb.h>
+
+TU_ATTR_WEAK uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen)
+{
+    (void) instance;
+    (void) report_id;
+    (void) report_type;
+    (void) buffer;
+    (void) reqlen;
+	
+		return 0;
+}
+
+TU_ATTR_WEAK void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize)
+{
+    (void) instance;
+    (void) report_id;
+    (void) report_type;
+    (void) buffer;
+    (void) bufsize;
+}

+ 4 - 2
rt-thread/tusb_config.h

@@ -108,11 +108,13 @@ extern "C" {
 #endif
 
 // CDC FIFO size of TX and RX
-#define CFG_TUD_CDC_RX_BUFSIZE   64
-#define CFG_TUD_CDC_TX_BUFSIZE   64
+#define CFG_TUD_CDC_RX_BUFSIZE    64
+#define CFG_TUD_CDC_TX_BUFSIZE    64
 
 #define CFG_TUD_MSC_EP_BUFSIZE    4096
 
+#define CFG_TUD_HID_EP_BUFSIZE    16
+
 
 #ifdef __cplusplus
 }

+ 90 - 54
rt-thread/usb_descriptor.c

@@ -23,64 +23,92 @@
  *
  */
 
-#include <tusb.h>
-
-/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.
- * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.
- *
- * Auto ProductID layout's Bitmap:
- *   [MSB]         HID | MSC | CDC          [LSB]
- */
-#define _PID_MAP(itf, n)  ( (CFG_TUD_##itf) << (n) )
-#define USB_PID           (0x4000 | _PID_MAP(CDC, 0) | _PID_MAP(MSC, 1) | _PID_MAP(HID, 2) | \
-                           _PID_MAP(MIDI, 3) | _PID_MAP(VENDOR, 4) )
+#include "tusb.h"
+#include "usb_descriptor.h"
 
 //--------------------------------------------------------------------+
 // Device Descriptors
 //--------------------------------------------------------------------+
 tusb_desc_device_t const desc_device =
-        {
-                .bLength            = sizeof(tusb_desc_device_t),
-                .bDescriptorType    = TUSB_DESC_DEVICE,
-                .bcdUSB             = 0x0200,
-                .bDeviceClass       = 0x00,
-                .bDeviceSubClass    = 0x00,
-                .bDeviceProtocol    = 0x00,
-                .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,
+{
+        .bLength            = sizeof(tusb_desc_device_t),
+        .bDescriptorType    = TUSB_DESC_DEVICE,
+        .bcdUSB             = 0x0200,
+        .bDeviceClass       = 0x00,
+        .bDeviceSubClass    = 0x00,
+        .bDeviceProtocol    = 0x00,
+        .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,
+
+        .idVendor           = PKG_TINYUSB_DEVICE_VID,
+        .idProduct          = PKG_TINYUSB_DEVICE_PID,
+        .bcdDevice          = 0x0100,
+
+        .iManufacturer      = 0x01,
+        .iProduct           = 0x02,
+        .iSerialNumber      = 0x03,
+
+        .bNumConfigurations = 0x01
+};
 
-                .idVendor           = 0xCafe,
-                .idProduct          = USB_PID,
-                .bcdDevice          = 0x0100,
+// Invoked when received GET DEVICE DESCRIPTOR
+// Application return pointer to descriptor
+uint8_t const *tud_descriptor_device_cb(void)
+{
+    return (uint8_t const *) &desc_device;
+}
 
-                .iManufacturer      = 0x01,
-                .iProduct           = 0x02,
-                .iSerialNumber      = 0x03,
+//--------------------------------------------------------------------+
+// HID Report Descriptor
+//--------------------------------------------------------------------+
 
-                .bNumConfigurations = 0x01
-        };
+uint8_t const desc_hid_report[] =
+{
+#ifdef PKG_TINYUSB_DEVICE_HID_KEYBOARD
+    TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(REPORT_ID_KEYBOARD)),
+#endif
+#ifdef PKG_TINYUSB_DEVICE_HID_MOUSE
+    TUD_HID_REPORT_DESC_MOUSE(HID_REPORT_ID(REPORT_ID_MOUSE)),
+#endif
+#ifdef PKG_TINYUSB_DEVICE_HID_CONSUMER
+    TUD_HID_REPORT_DESC_CONSUMER(HID_REPORT_ID(REPORT_ID_CONSUMER_CONTROL)),
+#endif
+#ifdef PKG_TINYUSB_DEVICE_HID_GAMEPAD
+    TUD_HID_REPORT_DESC_GAMEPAD(HID_REPORT_ID(REPORT_ID_GAMEPAD))
+#endif
+};
 
-// Invoked when received GET DEVICE DESCRIPTOR
+// Invoked when received GET HID REPORT DESCRIPTOR
 // Application return pointer to descriptor
-uint8_t const *tud_descriptor_device_cb(void) {
-    return (uint8_t const *) &desc_device;
+// Descriptor contents must exist long enough for transfer to complete
+uint8_t const *tud_hid_descriptor_report_cb(uint8_t instance)
+{
+    (void)instance;
+    return desc_hid_report;
 }
 
 //--------------------------------------------------------------------+
 // Configuration Descriptor
 //--------------------------------------------------------------------+
 
-enum {
+enum
+{
 #if CFG_TUD_CDC
     ITF_NUM_CDC = 0,
     ITF_NUM_CDC_DATA,
 #endif
 #if CFG_TUD_MSC
     ITF_NUM_MSC,
+#endif
+#if CFG_TUD_HID
+    ITF_NUM_HID,
 #endif
     ITF_NUM_TOTAL
 };
 
-#define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + TUD_MSC_DESC_LEN * CFG_TUD_MSC + TUD_CDC_DESC_LEN * CFG_TUD_CDC)
+#define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + \
+                             TUD_MSC_DESC_LEN * CFG_TUD_MSC + \
+                             TUD_CDC_DESC_LEN * CFG_TUD_CDC + \
+                             TUD_HID_DESC_LEN * CFG_TUD_HID)
 
 #define EPNUM_CDC_NOTIF   0x81
 #define EPNUM_CDC_OUT     0x02
@@ -89,21 +117,27 @@ enum {
 #define EPNUM_MSC_OUT     0x03
 #define EPNUM_MSC_IN      0x83
 
+#define EPNUM_HID     0x84
+
 uint8_t const desc_fs_configuration[] =
-        {
-                TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),
+{
+    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),
 #if CFG_TUD_CDC
-                TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64),
+    TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64),
 #endif
 #if CFG_TUD_MSC
-                TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 4 + CFG_TUD_CDC, EPNUM_MSC_OUT, EPNUM_MSC_IN, 64),
+    TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 5, EPNUM_MSC_OUT, EPNUM_MSC_IN, 64),
 #endif
-        };
+#if CFG_TUD_HID
+    TUD_HID_DESCRIPTOR(ITF_NUM_HID, 6, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report), EPNUM_HID, CFG_TUD_HID_EP_BUFSIZE, 5)
+#endif
+};
 
 // Invoked when received GET CONFIGURATION DESCRIPTOR
 // Application return pointer to descriptor
 // Descriptor contents must exist long enough for transfer to complete
-uint8_t const *tud_descriptor_configuration_cb(uint8_t index) {
+uint8_t const *tud_descriptor_configuration_cb(uint8_t index)
+{
     (void) index; // for multiple configurations
 
     return desc_fs_configuration;
@@ -115,32 +149,33 @@ uint8_t const *tud_descriptor_configuration_cb(uint8_t index) {
 
 // array of pointer to string descriptors
 char const *string_desc_arr[] =
-        {
-                (const char[]) {0x09, 0x04}, // 0: is supported language is English (0x0409)
-                "TinyUSB",                     // 1: Manufacturer
-                "TinyUSB Device",              // 2: Product
-                "123456",                      // 3: Serials, should use chip ID
-#if CFG_TUD_CDC
-                "TinyUSB CDC",
-#endif
-#if CFG_TUD_MSC
-                "TinyUSB MSC",
-#endif
-        };
+{
+        (const char[]) {0x09, 0x04},   // 0: is supported language is English (0x0409)
+        "TinyUSB",                     // 1: Manufacturer
+        "TinyUSB Device",              // 2: Product
+        "123456",                      // 3: Serials, should use chip ID
+        "TinyUSB CDC",
+        "TinyUSB MSC",
+        "TinyUSB HID",
+};
 
 static uint16_t desc_str[32];
 
 // Invoked when received GET STRING DESCRIPTOR request
 // Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
-uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {
+uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid)
+{
     (void) langid;
 
     uint8_t chr_count;
 
-    if (index == 0) {
+    if (index == 0)
+    {
         memcpy(&desc_str[1], string_desc_arr[0], 2);
         chr_count = 1;
-    } else {
+    }
+    else
+    {
         // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.
         // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors
 
@@ -153,7 +188,8 @@ uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {
         if (chr_count > 31) chr_count = 31;
 
         // Convert ASCII string into UTF-16
-        for (uint8_t i = 0; i < chr_count; i++) {
+        for (uint8_t i = 0; i < chr_count; i++)
+        {
             desc_str[1 + i] = str[i];
         }
     }

+ 24 - 0
rt-thread/usb_descriptor.h

@@ -0,0 +1,24 @@
+#ifndef USB_DESCRIPTORS_H_
+#define USB_DESCRIPTORS_H_
+
+#include <rtconfig.h>
+
+enum
+{
+    REPORT_ID_BEGIN = 0,
+#ifdef PKG_TINYUSB_DEVICE_HID_KEYBOARD
+    REPORT_ID_KEYBOARD,
+#endif
+#ifdef PKG_TINYUSB_DEVICE_HID_MOUSE
+    REPORT_ID_MOUSE,
+#endif
+#ifdef PKG_TINYUSB_DEVICE_HID_CONSUMER
+    REPORT_ID_CONSUMER_CONTROL,
+#endif
+#ifdef PKG_TINYUSB_DEVICE_HID_GAMEPAD
+    REPORT_ID_GAMEPAD,
+#endif
+    REPORT_ID_COUNT
+};
+
+#endif /* USB_DESCRIPTORS_H_ */