summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfoxx1337 <foxx1337@yahoo.com>2020-03-26 03:34:57 +0100
committerFlorian Didron <fdidron@users.noreply.github.com>2020-06-12 17:00:27 +0900
commit694777041b1d08cca595cfcb65c5e7a8528ed1ba (patch)
tree9fa12d1ff470b33e539c65aeb9d8c465e72b59f2
parenta4fcea7a9045d6f31ffaec3bb8131a7c11f29a70 (diff)
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>
-rw-r--r--tmk_core/protocol/arm_atsam/main_arm_atsam.c7
-rw-r--r--tmk_core/protocol/arm_atsam/usb/conf_usb.h1
-rw-r--r--tmk_core/protocol/arm_atsam/usb/main_usb.c5
-rw-r--r--tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c29
-rw-r--r--tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h1
-rw-r--r--tmk_core/protocol/arm_atsam/usb/usb_main.h1
6 files changed, 43 insertions, 1 deletions
diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c
index e952a427ef..e4e79d3510 100644
--- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c
+++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c
@@ -206,10 +206,17 @@ 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..3809e1fd02 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 <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,6 @@ 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 5b32954071..e94beb1254 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
+++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
@@ -647,6 +647,9 @@ 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)
0x09, 0x61, // Usage (Vendor Defined)
@@ -669,6 +672,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
@@ -725,7 +729,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_