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>
This commit is contained in:
parent
d68c4d8106
commit
96bfce7000
6 changed files with 47 additions and 1 deletions
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
||||
//@}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
//@}
|
||||
|
|
|
@ -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_
|
||||
|
|
Loading…
Reference in a new issue