Sfoglia il codice sorgente

dev hid enhancement, add report descriptor templates for keyboard, mouse, consumer, syscontrol, gamepad

hathach 7 anni fa
parent
commit
9444d45af6
5 ha cambiato i file con 181 aggiunte e 111 eliminazioni
  1. 0 100
      src/class/hid/hid.h
  2. 1 7
      src/class/hid/hid_device.c
  3. 169 0
      src/class/hid/hid_device.h
  4. 3 0
      src/device/usbd_auto_desc.c
  5. 8 4
      src/tusb_option.h

+ 0 - 100
src/class/hid/hid.h

@@ -609,106 +609,6 @@ enum
   HID_USAGE_CONSUMER_AC_PAN                            = 0x0238,
 };
 
-//--------------------------------------------------------------------+
-// HID Report Descriptor Template
-//--------------------------------------------------------------------+
-
-/*------------- Keyboard Descriptor Template -------------*/
-#define HID_REPORT_DESC_KEYBOARD(...) \
-  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP     )                    ,\
-  HID_USAGE      ( HID_USAGE_DESKTOP_KEYBOARD )                    ,\
-  HID_COLLECTION ( HID_COLLECTION_APPLICATION )                    ,\
-    /* 8 bits Modifier Keys (Shfit, Control, Alt) */ \
-    __VA_ARGS__ \
-    HID_USAGE_PAGE ( HID_USAGE_PAGE_KEYBOARD )                     ,\
-      HID_USAGE_MIN    ( 224                                    )  ,\
-      HID_USAGE_MAX    ( 231                                    )  ,\
-      HID_LOGICAL_MIN  ( 0                                      )  ,\
-      HID_LOGICAL_MAX  ( 1                                      )  ,\
-      HID_REPORT_COUNT ( 8                                      )  ,\
-      HID_REPORT_SIZE  ( 1                                      )  ,\
-      HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE )  ,\
-      /* 8 bit reserved */ \
-      HID_REPORT_COUNT ( 1                                      )  ,\
-      HID_REPORT_SIZE  ( 8                                      )  ,\
-      HID_INPUT        ( HID_CONSTANT                           )  ,\
-    /* 6-byte Keycodes */ \
-    HID_USAGE_PAGE ( HID_USAGE_PAGE_KEYBOARD )                     ,\
-      HID_USAGE_MIN    ( 0                                   )     ,\
-      HID_USAGE_MAX    ( 255                                 )     ,\
-      HID_LOGICAL_MIN  ( 0                                   )     ,\
-      HID_LOGICAL_MAX  ( 255                                 )     ,\
-      HID_REPORT_COUNT ( 6                                   )     ,\
-      HID_REPORT_SIZE  ( 8                                   )     ,\
-      HID_INPUT        ( HID_DATA | HID_ARRAY | HID_ABSOLUTE )     ,\
-    /* 5-bit LED Indicator Kana | Compose | ScrollLock | CapsLock | NumLock */ \
-    HID_USAGE_PAGE  ( HID_USAGE_PAGE_LED                   )       ,\
-      HID_USAGE_MIN    ( 1                                       ) ,\
-      HID_USAGE_MAX    ( 5                                       ) ,\
-      HID_REPORT_COUNT ( 5                                       ) ,\
-      HID_REPORT_SIZE  ( 1                                       ) ,\
-      HID_OUTPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE  ) ,\
-      /* led padding */ \
-      HID_REPORT_COUNT ( 1                                       ) ,\
-      HID_REPORT_SIZE  ( 3                                       ) ,\
-      HID_OUTPUT       ( HID_CONSTANT                            ) ,\
-  HID_COLLECTION_END \
-
-/*------------- Mouse Descriptor Template -------------*/
-#define HID_REPORT_DESC_MOUSE(...) \
-  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP      )                    ,\
-  HID_USAGE      ( HID_USAGE_DESKTOP_MOUSE     )                    ,\
-  HID_COLLECTION ( HID_COLLECTION_APPLICATION  )                    ,\
-    __VA_ARGS__ \
-    HID_USAGE      ( HID_USAGE_DESKTOP_POINTER )                    ,\
-    HID_COLLECTION ( HID_COLLECTION_PHYSICAL   )                    ,\
-      HID_USAGE_PAGE  ( HID_USAGE_PAGE_BUTTON  )                    ,\
-        HID_USAGE_MIN    ( 1                                      ) ,\
-        HID_USAGE_MAX    ( 3                                      ) ,\
-        HID_LOGICAL_MIN  ( 0                                      ) ,\
-        HID_LOGICAL_MAX  ( 1                                      ) ,\
-        /* Left, Right, Middle, Backward, Forward mouse buttons */   \
-        HID_REPORT_COUNT ( 3                                      ) ,\
-        HID_REPORT_SIZE  ( 1                                      ) ,\
-        HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\
-        /* 3 bit padding */ \
-        HID_REPORT_COUNT ( 1                                      ) ,\
-        HID_REPORT_SIZE  ( 5                                      ) ,\
-        HID_INPUT        ( HID_CONSTANT                           ) ,\
-      HID_USAGE_PAGE  ( HID_USAGE_PAGE_DESKTOP )                    ,\
-        /* X, Y position [-127, 127] */ \
-        HID_USAGE        ( HID_USAGE_DESKTOP_X                    ) ,\
-        HID_USAGE        ( HID_USAGE_DESKTOP_Y                    ) ,\
-        HID_LOGICAL_MIN  ( 0x81                                   ) ,\
-        HID_LOGICAL_MAX  ( 0x7f                                   ) ,\
-        HID_REPORT_COUNT ( 2                                      ) ,\
-        HID_REPORT_SIZE  ( 8                                      ) ,\
-        HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_RELATIVE ) ,\
-        /* Mouse scroll [-127, 127] */ \
-        HID_USAGE       ( HID_USAGE_DESKTOP_WHEEL                )  ,\
-        HID_LOGICAL_MIN ( 0x81                                   )  ,\
-        HID_LOGICAL_MAX ( 0x7f                                   )  ,\
-        HID_REPORT_COUNT( 1                                      )  ,\
-        HID_REPORT_SIZE ( 8                                      )  ,\
-        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_RELATIVE )  ,\
-    HID_COLLECTION_END                                              ,\
-  HID_COLLECTION_END \
-
-//------------- Consumer Control Report Template -------------//
-#define HID_REPORT_DESC_CONSUMER(...) \
-  HID_USAGE_PAGE ( HID_USAGE_PAGE_CONSUMER    )              ,\
-  HID_USAGE      ( HID_USAGE_CONSUMER_CONTROL )              ,\
-  HID_COLLECTION ( HID_COLLECTION_APPLICATION )              ,\
-    __VA_ARGS__ \
-    HID_LOGICAL_MIN  ( 0x00                                ) ,\
-    HID_LOGICAL_MAX_N( 0x03FF, 2                           ) ,\
-    HID_USAGE_MIN    ( 0x00                                ) ,\
-    HID_USAGE_MAX_N  ( 0x03FF, 2                           ) ,\
-    HID_REPORT_COUNT ( 1                                   ) ,\
-    HID_REPORT_SIZE  ( 16                                  ) ,\
-    HID_INPUT        ( HID_DATA | HID_ARRAY | HID_ABSOLUTE ) ,\
-  HID_COLLECTION_END \
-
 
 #ifdef __cplusplus
  }

+ 1 - 7
src/class/hid/hid_device.c

@@ -59,7 +59,7 @@
 #define ITF_IDX_BOOT_KBD   0
 #define ITF_IDX_BOOT_MSE   ( ITF_IDX_BOOT_KBD + (CFG_TUD_HID_KEYBOARD && CFG_TUD_HID_KEYBOARD_BOOT) )
 #define ITF_IDX_GENERIC    ( ITF_IDX_BOOT_MSE + (CFG_TUD_HID_MOUSE && CFG_TUD_HID_MOUSE_BOOT) )
-#define ITF_COUNT          ( ITF_IDX_GENERIC + TUD_OPT_HID_GENERIC )
+#define ITF_COUNT          ( ITF_IDX_GENERIC + 1 )
 
 typedef struct
 {
@@ -118,8 +118,6 @@ static inline hidd_interface_t* get_interface_by_itfnum(uint8_t itf_num)
 //--------------------------------------------------------------------+
 // HID GENERIC API
 //--------------------------------------------------------------------+
-#if TUD_OPT_HID_GENERIC
-
 bool tud_hid_generic_ready(void)
 {
   return (_hidd_itf[ITF_IDX_GENERIC].ep_in != 0) && !dcd_edpt_busy(TUD_OPT_RHPORT, _hidd_itf[ITF_IDX_GENERIC].ep_in);
@@ -145,8 +143,6 @@ bool tud_hid_generic_report(uint8_t report_id, void const* report, uint8_t len)
   return dcd_edpt_xfer(TUD_OPT_RHPORT, p_hid->ep_in, p_hid->report_buf, len + ( report_id ? 1 : 0) );
 }
 
-#endif // TUD_OPT_HID_GENERIC
-
 //--------------------------------------------------------------------+
 // KEYBOARD APPLICATION API
 //--------------------------------------------------------------------+
@@ -384,14 +380,12 @@ tusb_error_t hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, u
   /*------------- Generic (multiple report) -------------*/
   else
   {
-    #if TUD_OPT_HID_GENERIC
     // TODO parse report ID for keyboard, mouse
     p_hid = &_hidd_itf[ITF_IDX_GENERIC];
 
     p_hid->desc_report   = tud_desc_set.hid_report.generic;
     p_hid->get_report_cb = tud_hid_generic_get_report_cb;
     p_hid->set_report_cb = tud_hid_generic_set_report_cb;
-    #endif
 
     TU_ASSERT(p_hid, ERR_TUD_INVALID_DESCRIPTOR);
   }

+ 169 - 0
src/class/hid/hid_device.h

@@ -197,6 +197,175 @@ ATTR_WEAK void tud_hid_mouse_set_report_cb(uint8_t report_id, hid_report_type_t
 
 #endif
 
+
+//--------------------------------------------------------------------+
+// HID Report Descriptor Template
+//--------------------------------------------------------------------+
+/* These template should be used as follow
+ * - Only 1 report : no parameter
+ *      uint8_t report_desc[] = { ID_REPORT_DESC_KEYBOARD() };
+ *
+ * - Multiple Reports: "HID_REPORT_ID(ID)," must be passed to template
+ *      uint8_t report_desc[] = {
+ *          ID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(1) ,) ,
+ *          HID_REPORT_DESC_MOUSE  ( HID_REPORT_ID(2) ,)
+ *      };
+ */
+
+/*------------- Keyboard Descriptor Template -------------*/
+#define HID_REPORT_DESC_KEYBOARD(...) \
+  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP     )                    ,\
+  HID_USAGE      ( HID_USAGE_DESKTOP_KEYBOARD )                    ,\
+  HID_COLLECTION ( HID_COLLECTION_APPLICATION )                    ,\
+    /* 8 bits Modifier Keys (Shfit, Control, Alt) */ \
+    __VA_ARGS__ \
+    HID_USAGE_PAGE ( HID_USAGE_PAGE_KEYBOARD )                     ,\
+      HID_USAGE_MIN    ( 224                                    )  ,\
+      HID_USAGE_MAX    ( 231                                    )  ,\
+      HID_LOGICAL_MIN  ( 0                                      )  ,\
+      HID_LOGICAL_MAX  ( 1                                      )  ,\
+      HID_REPORT_COUNT ( 8                                      )  ,\
+      HID_REPORT_SIZE  ( 1                                      )  ,\
+      HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE )  ,\
+      /* 8 bit reserved */ \
+      HID_REPORT_COUNT ( 1                                      )  ,\
+      HID_REPORT_SIZE  ( 8                                      )  ,\
+      HID_INPUT        ( HID_CONSTANT                           )  ,\
+    /* 6-byte Keycodes */ \
+    HID_USAGE_PAGE ( HID_USAGE_PAGE_KEYBOARD )                     ,\
+      HID_USAGE_MIN    ( 0                                   )     ,\
+      HID_USAGE_MAX    ( 255                                 )     ,\
+      HID_LOGICAL_MIN  ( 0                                   )     ,\
+      HID_LOGICAL_MAX  ( 255                                 )     ,\
+      HID_REPORT_COUNT ( 6                                   )     ,\
+      HID_REPORT_SIZE  ( 8                                   )     ,\
+      HID_INPUT        ( HID_DATA | HID_ARRAY | HID_ABSOLUTE )     ,\
+    /* 5-bit LED Indicator Kana | Compose | ScrollLock | CapsLock | NumLock */ \
+    HID_USAGE_PAGE  ( HID_USAGE_PAGE_LED                   )       ,\
+      HID_USAGE_MIN    ( 1                                       ) ,\
+      HID_USAGE_MAX    ( 5                                       ) ,\
+      HID_REPORT_COUNT ( 5                                       ) ,\
+      HID_REPORT_SIZE  ( 1                                       ) ,\
+      HID_OUTPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE  ) ,\
+      /* led padding */ \
+      HID_REPORT_COUNT ( 1                                       ) ,\
+      HID_REPORT_SIZE  ( 3                                       ) ,\
+      HID_OUTPUT       ( HID_CONSTANT                            ) ,\
+  HID_COLLECTION_END \
+
+/*------------- Mouse Descriptor Template -------------*/
+#define HID_REPORT_DESC_MOUSE(...) \
+  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP      )                    ,\
+  HID_USAGE      ( HID_USAGE_DESKTOP_MOUSE     )                    ,\
+  HID_COLLECTION ( HID_COLLECTION_APPLICATION  )                    ,\
+    __VA_ARGS__ \
+    HID_USAGE      ( HID_USAGE_DESKTOP_POINTER )                    ,\
+    HID_COLLECTION ( HID_COLLECTION_PHYSICAL   )                    ,\
+      HID_USAGE_PAGE  ( HID_USAGE_PAGE_BUTTON  )                    ,\
+        HID_USAGE_MIN    ( 1                                      ) ,\
+        HID_USAGE_MAX    ( 3                                      ) ,\
+        HID_LOGICAL_MIN  ( 0                                      ) ,\
+        HID_LOGICAL_MAX  ( 1                                      ) ,\
+        /* Left, Right, Middle, Backward, Forward mouse buttons */   \
+        HID_REPORT_COUNT ( 3                                      ) ,\
+        HID_REPORT_SIZE  ( 1                                      ) ,\
+        HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\
+        /* 3 bit padding */ \
+        HID_REPORT_COUNT ( 1                                      ) ,\
+        HID_REPORT_SIZE  ( 5                                      ) ,\
+        HID_INPUT        ( HID_CONSTANT                           ) ,\
+      HID_USAGE_PAGE  ( HID_USAGE_PAGE_DESKTOP )                    ,\
+        /* X, Y position [-127, 127] */ \
+        HID_USAGE        ( HID_USAGE_DESKTOP_X                    ) ,\
+        HID_USAGE        ( HID_USAGE_DESKTOP_Y                    ) ,\
+        HID_LOGICAL_MIN  ( 0x81                                   ) ,\
+        HID_LOGICAL_MAX  ( 0x7f                                   ) ,\
+        HID_REPORT_COUNT ( 2                                      ) ,\
+        HID_REPORT_SIZE  ( 8                                      ) ,\
+        HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_RELATIVE ) ,\
+        /* Mouse scroll [-127, 127] */ \
+        HID_USAGE       ( HID_USAGE_DESKTOP_WHEEL                )  ,\
+        HID_LOGICAL_MIN ( 0x81                                   )  ,\
+        HID_LOGICAL_MAX ( 0x7f                                   )  ,\
+        HID_REPORT_COUNT( 1                                      )  ,\
+        HID_REPORT_SIZE ( 8                                      )  ,\
+        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_RELATIVE )  ,\
+    HID_COLLECTION_END                                              ,\
+  HID_COLLECTION_END \
+
+//------------- Consumer Control Report Template -------------//
+#define HID_REPORT_DESC_CONSUMER(...) \
+  HID_USAGE_PAGE ( HID_USAGE_PAGE_CONSUMER    )              ,\
+  HID_USAGE      ( HID_USAGE_CONSUMER_CONTROL )              ,\
+  HID_COLLECTION ( HID_COLLECTION_APPLICATION )              ,\
+    __VA_ARGS__ \
+    HID_LOGICAL_MIN  ( 0x00                                ) ,\
+    HID_LOGICAL_MAX_N( 0x03FF, 2                           ) ,\
+    HID_USAGE_MIN    ( 0x00                                ) ,\
+    HID_USAGE_MAX_N  ( 0x03FF, 2                           ) ,\
+    HID_REPORT_COUNT ( 1                                   ) ,\
+    HID_REPORT_SIZE  ( 16                                  ) ,\
+    HID_INPUT        ( HID_DATA | HID_ARRAY | HID_ABSOLUTE ) ,\
+  HID_COLLECTION_END \
+
+//------------- System Control Report Template -------------//
+/* 0x00 - do nothing
+ * 0x01 - Power Off
+ * 0x02 - Standby
+ * 0x04 - Wake Host
+ */
+#define HID_REPORT_DESC_SYSTEM_CONTROL(...) \
+  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP           )        ,\
+  HID_USAGE      ( HID_USAGE_DESKTOP_SYSTEM_CONTROL )        ,\
+  HID_COLLECTION ( HID_COLLECTION_APPLICATION       )        ,\
+    __VA_ARGS__ \
+    /* 2 bit system power control */ \
+    HID_LOGICAL_MIN  ( 1                                   ) ,\
+    HID_LOGICAL_MAX  ( 3                                   ) ,\
+    HID_REPORT_COUNT ( 1                                   ) ,\
+    HID_REPORT_SIZE  ( 2                                   ) ,\
+    HID_USAGE        ( HID_USAGE_DESKTOP_SYSTEM_SLEEP      ) ,\
+    HID_USAGE        ( HID_USAGE_DESKTOP_SYSTEM_POWER_DOWN ) ,\
+    HID_USAGE        ( HID_USAGE_DESKTOP_SYSTEM_WAKE_UP    ) ,\
+    HID_INPUT        ( HID_DATA | HID_ARRAY | HID_ABSOLUTE ) ,\
+    /* 6 bit padding */ \
+    HID_REPORT_COUNT ( 1                                   ) ,\
+    HID_REPORT_SIZE  ( 6                                   ) ,\
+    HID_INPUT        ( HID_CONSTANT                        ) ,\
+  HID_COLLECTION_END \
+
+//------------- Gamepad Report Template -------------//
+// Gamepad with 16 buttons and 2 joysticks
+// | Button Map (2 bytes) |  X | Y | Z | Rz
+#define HID_REPORT_DESC_GAMEPAD(...) \
+  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP     )        ,\
+  HID_USAGE      ( HID_USAGE_DESKTOP_GAMEPAD  )        ,\
+  HID_COLLECTION ( HID_COLLECTION_APPLICATION )        ,\
+    __VA_ARGS__ \
+    /* 16 bit Button Map */ \
+    HID_USAGE_PAGE   ( HID_USAGE_PAGE_BUTTON                  ) ,\
+    HID_USAGE_MIN    ( 1                                      ) ,\
+    HID_USAGE_MAX    ( 16                                     ) ,\
+    HID_LOGICAL_MIN  ( 0                                      ) ,\
+    HID_LOGICAL_MAX  ( 1                                      ) ,\
+    HID_REPORT_COUNT ( 16                                     ) ,\
+    HID_REPORT_SIZE  ( 1                                      ) ,\
+    HID_INPUT        ( HID_DATA | HID_ARRAY | HID_ABSOLUTE    ) ,\
+    /* X, Y, Z, Rz (min -127, max 127 ) */ \
+    HID_USAGE_PAGE   ( HID_USAGE_PAGE_DESKTOP                 ) ,\
+    HID_LOGICAL_MIN  ( 0x81                                   ) ,\
+    HID_LOGICAL_MAX  ( 0x7f                                   ) ,\
+    HID_USAGE        ( HID_USAGE_DESKTOP_X                    ) ,\
+    HID_USAGE        ( HID_USAGE_DESKTOP_Y                    ) ,\
+    HID_USAGE        ( HID_USAGE_DESKTOP_Z                    ) ,\
+    HID_USAGE        ( HID_USAGE_DESKTOP_RZ                   ) ,\
+    HID_REPORT_COUNT ( 4                                      ) ,\
+    HID_REPORT_SIZE  ( 8                                      ) ,\
+    HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\
+  HID_COLLECTION_END \
+
+
+
 /** @} */
 /** @} */
 

+ 3 - 0
src/device/usbd_auto_desc.c

@@ -49,6 +49,9 @@
 // Auto Description Default Configure & Validation
 //--------------------------------------------------------------------+
 
+// IF HID Generic is required, it is multiple Report : Keyboard + Mouse + Gamepad + Joystick
+#define TUD_OPT_HID_GENERIC    (CFG_TUD_HID && ((CFG_TUD_HID_KEYBOARD && !CFG_TUD_HID_KEYBOARD_BOOT) || \
+                                                (CFG_TUD_HID_MOUSE && !CFG_TUD_HID_MOUSE_BOOT)) )
 /*------------- VID/PID -------------*/
 #ifndef CFG_TUD_DESC_VID
 #define CFG_TUD_DESC_VID       0xCAFE

+ 8 - 4
src/tusb_option.h

@@ -171,6 +171,14 @@
     #define CFG_TUD_MSC          0
   #endif
 
+  #ifndef CFG_TUD_HID_KEYBOARD
+  #define CFG_TUD_HID_KEYBOARD        0
+  #endif
+
+  #ifndef CFG_TUD_HID_MOUSE
+  #define CFG_TUD_HID_MOUSE           0
+  #endif
+
   #ifndef CFG_TUD_HID_KEYBOARD_BOOT
     #define CFG_TUD_HID_KEYBOARD_BOOT 0
   #endif
@@ -179,10 +187,6 @@
     #define CFG_TUD_HID_MOUSE_BOOT 0
   #endif
 
-  // IF HID Generic is required, it is multiple Report : Keyboard + Mouse + Gamepad + Joystick
-  #define TUD_OPT_HID_GENERIC    ( (CFG_TUD_HID_KEYBOARD && !CFG_TUD_HID_KEYBOARD_BOOT) || \
-                                   (CFG_TUD_HID_MOUSE && !CFG_TUD_HID_MOUSE_BOOT) )
-
 #endif // TUSB_OPT_DEVICE_ENABLED
 
 //--------------------------------------------------------------------