Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 2e72894

Browse filesBrowse files
USBHIDKeyboard: Fix 200ms delay for every key (espressif#7218)
Arduino-esp32 2.0.4 was released with a version of TinyUSB hid_device.h that uses uint16_t for the last argument: https://github.com/espressif/arduino-esp32/blob/2.0.4/tools/sdk/esp32s2/include/arduino_tinyusb/tinyusb/src/class/hid/hid_device.h TU_ATTR_WEAK void tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, uint16_t len); But USBHID implements this callback with uint8_t: https://github.com/espressif/arduino-esp32/blob/2.0.4/libraries/USB/src/USBHID.cpp void tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, uint8_t len){ if (tinyusb_hid_device_input_sem) { xSemaphoreGive(tinyusb_hid_device_input_sem); } } The result is that when USBHIDKeyboard sends a report to the host, it times out, waiting 100 ms for the callback to be called. It does this once for pressing the key and once for releasing the key, so 100 ms * 2 = 200 ms. The latest version of hid_device.h reverts the last argument to uint8_t: https://github.com/espressif/arduino-esp32/blob/860b104691a28f77896ac544c7745de1ba53642d/tools/sdk/esp32s2/include/arduino_tinyusb/tinyusb/src/class/hid/hid_device.h TU_ATTR_WEAK void tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, /*uint16_t*/ uint8_t len ); But these commits suggest that the last argument will eventually be changed to uint16_t: hathach/tinyusb@556b5d5 change report len in hid API from uint8_t to uint16_t since HS interrupt endpoint can be up to 1024, 8-bit is not enough. affected APIs are: - tud_hid_n_report() / tud_hid_report() - tud_hid_report_complete_cb() hathach/tinyusb@b495d6f temporarily revert len back to uint8_t in tud_hid_report_complete_cb() for up coming release To prevent this from becoming broken again, in preparation for the change to uint16_t, make USBHID resilient to any type for the last argument for tud_hid_report_complete_cb() by using some C++ template metaprogramming, adapted from https://stackoverflow.com/a/22632571. Co-authored-by: Rodrigo Garcia <rodrigo.garcia@espressif.com>
1 parent 8510734 commit 2e72894
Copy full SHA for 2e72894

File tree

Expand file treeCollapse file tree

1 file changed

+15
-1
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+15
-1
lines changed

‎libraries/USB/src/USBHID.cpp

Copy file name to clipboardExpand all lines: libraries/USB/src/USBHID.cpp
+15-1Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,21 @@ bool USBHID::ready(void){
310310
return tud_hid_n_ready(0);
311311
}
312312

313-
void tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, uint8_t len){
313+
// TinyUSB is in the process of changing the type of the last argument to
314+
// tud_hid_report_complete_cb(), so extract the type from the version of TinyUSB that we're
315+
// compiled with.
316+
template <class F> struct ArgType;
317+
318+
template <class R, class T1, class T2, class T3>
319+
struct ArgType<R(*)(T1, T2, T3)> {
320+
typedef T1 type1;
321+
typedef T2 type2;
322+
typedef T3 type3;
323+
};
324+
325+
typedef ArgType<decltype(&tud_hid_report_complete_cb)>::type3 tud_hid_report_complete_cb_len_t;
326+
327+
void tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, tud_hid_report_complete_cb_len_t len){
314328
if (tinyusb_hid_device_input_sem) {
315329
xSemaphoreGive(tinyusb_hid_device_input_sem);
316330
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.