Просмотр исходного кода

update tud_hid_boot_mode_cb/tud_hid_set_idle_cb support mul interfaces

also clean up code
hathach 5 лет назад
Родитель
Сommit
8ba0c362cc
2 измененных файлов с 50 добавлено и 45 удалено
  1. 47 43
      src/class/hid/hid_device.c
  2. 3 2
      src/class/hid/hid_device.h

+ 47 - 43
src/class/hid/hid_device.c

@@ -57,17 +57,7 @@ typedef struct
 CFG_TUSB_MEM_SECTION static hidd_interface_t _hidd_itf[CFG_TUD_HID];
 
 /*------------- Helpers -------------*/
-static inline hidd_interface_t* get_interface_by_itfnum(uint8_t itf_num)
-{
-  for (uint8_t i=0; i < CFG_TUD_HID; i++ )
-  {
-    if ( itf_num == _hidd_itf[i].itf_num ) return &_hidd_itf[i];
-  }
-
-  return NULL;
-}
-
-static inline uint8_t get_hid_index_by_itfnum(uint8_t itf_num)
+static inline uint8_t get_index_by_itfnum(uint8_t itf_num)
 {
 	for (uint8_t i=0; i < CFG_TUD_HID; i++ )
 	{
@@ -227,13 +217,10 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request
 {
   TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE);
 
-  hidd_interface_t* p_hid = get_interface_by_itfnum( (uint8_t) request->wIndex );
-  TU_ASSERT(p_hid);
+  uint8_t const hid_itf = get_index_by_itfnum((uint8_t) request->wIndex);
+  TU_VERIFY(hid_itf < CFG_TUD_HID);
 
-  #if CFG_TUD_HID>1
-  uint8_t const hid_itf = get_hid_index_by_itfnum((uint8_t) request->wIndex);
-  TU_VERIFY(hid_itf<0xFF);
-  #endif
+  hidd_interface_t* p_hid = &_hidd_itf[hid_itf];
 
   if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD)
   {
@@ -249,11 +236,11 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request
     }
     else if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT)
     {
-      #if CFG_TUD_HID>1
-      uint8_t const * desc_report = tud_hid_descriptor_report_cb(hid_itf);
-      #else
-      uint8_t const * desc_report = tud_hid_descriptor_report_cb();
-      #endif
+      uint8_t const * desc_report = tud_hid_descriptor_report_cb(
+          #if CFG_TUD_HID > 1
+          hid_itf // TODO for backward compatible callback, remove later when appropriate
+          #endif
+      );
       tud_control_xfer(rhport, request, (void*) desc_report, p_hid->report_desc_len);
     }
     else
@@ -272,11 +259,12 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request
         uint8_t const report_type = tu_u16_high(request->wValue);
         uint8_t const report_id   = tu_u16_low(request->wValue);
 
-        #if CFG_TUD_HID>1
-        uint16_t xferlen  = tud_hid_get_report_cb(hid_itf, report_id, (hid_report_type_t) report_type, p_hid->epin_buf, request->wLength);
-        #else
-        uint16_t xferlen  = tud_hid_get_report_cb(report_id, (hid_report_type_t) report_type, p_hid->epin_buf, request->wLength);
-        #endif
+        uint16_t xferlen  = tud_hid_get_report_cb(
+            #if CFG_TUD_HID > 1
+            hid_itf, // TODO for backward compatible callback, remove later when appropriate
+            #endif
+            report_id, (hid_report_type_t) report_type, p_hid->epin_buf, request->wLength
+        );
         TU_ASSERT( xferlen > 0 );
 
         tud_control_xfer(rhport, request, p_hid->epin_buf, xferlen);
@@ -293,7 +281,12 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request
         if ( tud_hid_set_idle_cb )
         {
           // stall request if callback return false
-          if ( !tud_hid_set_idle_cb(p_hid->idle_rate) ) return false;
+          TU_VERIFY( tud_hid_set_idle_cb(
+                          #if CFG_TUD_HID > 1
+                          hid_itf, // TODO for backward compatible callback, remove later when appropriate
+                          #endif
+                          p_hid->idle_rate)
+          );
         }
 
         tud_control_status(rhport, request);
@@ -314,7 +307,15 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request
       case HID_REQ_CONTROL_SET_PROTOCOL:
         p_hid->boot_mode = 1 - request->wValue; // 0 is Boot, 1 is Report protocol
 
-        if (tud_hid_boot_mode_cb) tud_hid_boot_mode_cb(p_hid->boot_mode);
+        if (tud_hid_boot_mode_cb)
+        {
+          tud_hid_boot_mode_cb(
+              #if CFG_TUD_HID > 1
+              hid_itf, // TODO for backward compatible callback, remove later when appropriate
+              #endif
+              p_hid->boot_mode
+          );
+        }
 
         tud_control_status(rhport, request);
       break;
@@ -334,8 +335,11 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request
 bool hidd_control_complete(uint8_t rhport, tusb_control_request_t const * p_request)
 {
   (void) rhport;
-  hidd_interface_t* p_hid = get_interface_by_itfnum( (uint8_t) p_request->wIndex );
-  TU_ASSERT(p_hid);
+
+  uint8_t const hid_itf = get_index_by_itfnum((uint8_t) p_request->wIndex);
+  TU_VERIFY(hid_itf < CFG_TUD_HID);
+
+  hidd_interface_t* p_hid = &_hidd_itf[hid_itf];
 
   if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS &&
       p_request->bRequest == HID_REQ_CONTROL_SET_REPORT)
@@ -344,13 +348,12 @@ bool hidd_control_complete(uint8_t rhport, tusb_control_request_t const * p_requ
     uint8_t const report_type = tu_u16_high(p_request->wValue);
     uint8_t const report_id   = tu_u16_low(p_request->wValue);
 
-    #if CFG_TUD_HID>1
-    uint8_t const hid_itf = get_hid_index_by_itfnum((uint8_t)p_request->wIndex);
-    TU_VERIFY(hid_itf<0xFF);
-    tud_hid_set_report_cb(hid_itf, report_id, (hid_report_type_t) report_type, p_hid->epout_buf, p_request->wLength);
-    #else
-    tud_hid_set_report_cb(report_id, (hid_report_type_t) report_type, p_hid->epout_buf, p_request->wLength);
-    #endif
+    tud_hid_set_report_cb(
+        #if CFG_TUD_HID > 1
+        hid_itf, // TODO for backward compatible callback, remove later when appropriate
+        #endif
+        report_id, (hid_report_type_t) report_type, p_hid->epout_buf, p_request->wLength
+    );
   }
 
   return true;
@@ -372,11 +375,12 @@ bool hidd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
 
   if (ep_addr == p_hid->ep_out)
   {
-    #if CFG_TUD_HID>1
-    tud_hid_set_report_cb(itf,  0, HID_REPORT_TYPE_INVALID, p_hid->epout_buf, xferred_bytes);
-    #else
-    tud_hid_set_report_cb(0, HID_REPORT_TYPE_INVALID, p_hid->epout_buf, xferred_bytes);
-    #endif
+    tud_hid_set_report_cb(
+        #if CFG_TUD_HID > 1
+        itf, // TODO for backward compatible callback, remove later when appropriate
+        #endif
+        0, HID_REPORT_TYPE_INVALID, p_hid->epout_buf, xferred_bytes
+    );
     TU_ASSERT(usbd_edpt_xfer(rhport, p_hid->ep_out, p_hid->epout_buf, sizeof(p_hid->epout_buf)));
   }
 

+ 3 - 2
src/class/hid/hid_device.h

@@ -100,15 +100,16 @@ uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t
 void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize);
 
 // Invoked when received SET_PROTOCOL request ( mode switch Boot <-> Report )
-TU_ATTR_WEAK void tud_hid_boot_mode_cb(uint8_t boot_mode);
+TU_ATTR_WEAK void tud_hid_boot_mode_cb(uint8_t itf, uint8_t boot_mode);
 
 // Invoked when received SET_IDLE request. return false will stall the request
 // - Idle Rate = 0 : only send report if there is changes, i.e skip duplication
 // - Idle Rate > 0 : skip duplication, but send at least 1 report every idle rate (in unit of 4 ms).
-TU_ATTR_WEAK bool tud_hid_set_idle_cb(uint8_t idle_rate);
+TU_ATTR_WEAK bool tud_hid_set_idle_cb(uint8_t itf, uint8_t idle_rate);
 
 #else
 
+// TODO for backward compatible callback, remove later when appropriate
 uint8_t const * tud_hid_descriptor_report_cb(void);
 uint16_t tud_hid_get_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen);
 void tud_hid_set_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize);