diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index e952a427ef..93f34d9c3b 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -206,10 +206,19 @@ void main_subtask_usb_extra_device(void) { } } +#ifdef RAW_ENABLE +void main_subtask_raw(void) { + udi_hid_raw_receive_report(); +} +#endif + void main_subtasks(void) { main_subtask_usb_state(); main_subtask_power_check(); main_subtask_usb_extra_device(); +#ifdef RAW_ENABLE + main_subtask_raw(); +#endif } int main(void) { diff --git a/tmk_core/protocol/arm_atsam/usb/conf_usb.h b/tmk_core/protocol/arm_atsam/usb/conf_usb.h index f23c2a80dd..f236427ca1 100644 --- a/tmk_core/protocol/arm_atsam/usb/conf_usb.h +++ b/tmk_core/protocol/arm_atsam/usb/conf_usb.h @@ -146,6 +146,7 @@ #ifdef RAW # define UDI_HID_RAW_ENABLE_EXT() main_raw_enable() # define UDI_HID_RAW_DISABLE_EXT() main_raw_disable() +# define UDI_HID_RAW_RECEIVE(buffer, len) main_raw_receive(buffer, len) #endif //@} diff --git a/tmk_core/protocol/arm_atsam/usb/main_usb.c b/tmk_core/protocol/arm_atsam/usb/main_usb.c index 82ab123fd0..24630d9492 100644 --- a/tmk_core/protocol/arm_atsam/usb/main_usb.c +++ b/tmk_core/protocol/arm_atsam/usb/main_usb.c @@ -18,6 +18,9 @@ along with this program. If not, see . #include "samd51j18a.h" #include "conf_usb.h" #include "udd.h" +#ifdef RAW +#include "raw_hid.h" +#endif uint8_t keyboard_protocol = 1; @@ -89,4 +92,8 @@ bool main_raw_enable(void) { } void main_raw_disable(void) { main_b_raw_enable = false; } + +void main_raw_receive(uint8_t *buffer, uint8_t len) { + raw_hid_receive(buffer, len); +} #endif diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c index cf9297dc78..8142f297d4 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c @@ -640,6 +640,9 @@ static bool udi_hid_raw_b_report_trans_ongoing; COMPILER_WORD_ALIGNED static uint8_t udi_hid_raw_report_trans[UDI_HID_RAW_REPORT_SIZE]; +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_raw_report_recv[UDI_HID_RAW_REPORT_SIZE]; + COMPILER_WORD_ALIGNED UDC_DESC_STORAGE udi_hid_raw_report_desc_t udi_hid_raw_report_desc = {{ 0x06, 0x60, 0xFF, // Usage Page (Vendor Defined) @@ -663,6 +666,7 @@ static bool udi_hid_raw_setreport(void); static void udi_hid_raw_setreport_valid(void); static void udi_hid_raw_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep); +static void udi_hid_raw_report_rcvd(udd_ep_status_t status, iram_size_t nb_rcvd, udd_ep_id_t ep); bool udi_hid_raw_enable(void) { // Initialize internal values @@ -719,7 +723,30 @@ static void udi_hid_raw_report_sent(udd_ep_status_t status, iram_size_t nb_sent, static void udi_hid_raw_setreport_valid(void) {} -#endif // RAW +void raw_hid_send(uint8_t *data, uint8_t length) { + if (main_b_raw_enable && !udi_hid_raw_b_report_trans_ongoing && length == UDI_HID_RAW_REPORT_SIZE) { + memcpy(udi_hid_raw_report, data, UDI_HID_RAW_REPORT_SIZE); + udi_hid_raw_send_report(); + } +} + +bool udi_hid_raw_receive_report(void) { + if (!main_b_raw_enable) { + return false; + } + + return udd_ep_run(UDI_HID_RAW_EP_OUT | USB_EP_DIR_OUT, false, udi_hid_raw_report_recv, UDI_HID_RAW_REPORT_SIZE, udi_hid_raw_report_rcvd); +} + +static void udi_hid_raw_report_rcvd(udd_ep_status_t status, iram_size_t nb_rcvd, udd_ep_id_t ep) { + UNUSED(ep); + + if (status == UDD_EP_TRANSFER_OK && nb_rcvd == UDI_HID_RAW_REPORT_SIZE) { + UDI_HID_RAW_RECEIVE(udi_hid_raw_report_recv, UDI_HID_RAW_REPORT_SIZE); + } +} + +#endif //RAW //******************************************************************************************** // CON diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h index 82b1cbfe07..6dc1fed3ef 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h @@ -111,6 +111,7 @@ bool udi_hid_mou_send_report(void); #ifdef RAW extern UDC_DESC_STORAGE udi_api_t udi_api_hid_raw; bool udi_hid_raw_send_report(void); +bool udi_hid_raw_receive_report(void); #endif // RAW //@} diff --git a/tmk_core/protocol/arm_atsam/usb/usb_main.h b/tmk_core/protocol/arm_atsam/usb/usb_main.h index e1ffa3e184..3191b2fc13 100644 --- a/tmk_core/protocol/arm_atsam/usb/usb_main.h +++ b/tmk_core/protocol/arm_atsam/usb/usb_main.h @@ -97,6 +97,7 @@ void main_mou_disable(void); extern volatile bool main_b_raw_enable; bool main_raw_enable(void); void main_raw_disable(void); +void main_raw_receive(uint8_t *buffer, uint8_t len); #endif // RAW #endif // _MAIN_H_