Bladeren bron

Add RawHID support to ATSAM (Massdrop boards) (#8530)

* Add support for RAW endpoint for arm_atsam

This the excellent work from helluvamatt/qmk_firmware in bb6eeb93b.

* Reformat arm_atsam RAW endpoint code

Co-authored-by: Matt Schneeberger <helluvamatt@gmail.com>
foxx1337 5 jaren geleden
bovenliggende
commit
96bfce7000

+ 9 - 0
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) {

+ 1 - 0
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
 
 //@}

+ 7 - 0
tmk_core/protocol/arm_atsam/usb/main_usb.c

@@ -18,6 +18,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #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

+ 28 - 1
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

+ 1 - 0
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
 
 //@}

+ 1 - 0
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_