From 1a0ffcee25566c03cc267c96cceb7a0189d2b026 Mon Sep 17 00:00:00 2001 From: hathach Date: Tue, 31 Jul 2018 13:31:03 +0700 Subject: [PATCH] add tud_hid_generic_report() --- src/class/hid/hid_device.c | 44 +++++++++++++++++++++++++++----------- src/class/hid/hid_device.h | 2 +- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/class/hid/hid_device.c b/src/class/hid/hid_device.c index d6671e4f3..e52952e08 100644 --- a/src/class/hid/hid_device.c +++ b/src/class/hid/hid_device.c @@ -53,7 +53,13 @@ //--------------------------------------------------------------------+ // Max report len is keyboard's one with 8 byte + 1 byte report id -#define REPORT_BUFSIZE 9 +#define REPORT_BUFSIZE 12 + + +#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 ) typedef struct { @@ -85,12 +91,6 @@ typedef struct hidd_interface_t* itf; } hidd_report_t ; - -#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 ) - CFG_TUSB_ATTR_USBRAM static hidd_interface_t _hidd_itf[ITF_COUNT]; @@ -102,7 +102,7 @@ static hidd_report_t _kbd_rpt; static hidd_report_t _mse_rpt; #endif -/*------------- -------------*/ +/*------------- Helpers -------------*/ static inline hidd_interface_t* get_interface_by_itfnum(uint8_t itf_num) { @@ -118,15 +118,35 @@ 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) { -#if TUD_OPT_HID_GENERIC return (_hidd_itf[ITF_IDX_GENERIC].ep_in != 0) && !dcd_edpt_busy(TUD_OPT_RHPORT, _hidd_itf[ITF_IDX_GENERIC].ep_in); -#else - return false; -#endif } +bool tud_hid_generic_report(uint8_t report_id, void const* report, uint8_t len) +{ + VERIFY( tud_hid_generic_ready() && (len < REPORT_BUFSIZE) ); + + hidd_interface_t * p_hid = &_hidd_itf[ITF_IDX_GENERIC]; + + // If report id = 0, skip ID field + if (report_id) + { + p_hid->report_buf[0] = report_id; + memcpy(p_hid->report_buf+1, report, len); + }else + { + memcpy(p_hid->report_buf, report, len); + } + + // TODO idle rate + 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 //--------------------------------------------------------------------+ diff --git a/src/class/hid/hid_device.h b/src/class/hid/hid_device.h index 5f21878e0..43181b1a9 100644 --- a/src/class/hid/hid_device.h +++ b/src/class/hid/hid_device.h @@ -71,7 +71,7 @@ // HID GENERIC API //--------------------------------------------------------------------+ bool tud_hid_generic_ready(void); -bool tud_hid_generic_report(void); +bool tud_hid_generic_report(uint8_t report_id, void const* report, uint8_t len); /*------------- Callbacks -------------*/ ATTR_WEAK uint16_t tud_hid_generic_get_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen);