~ruther/qmk_firmware

96bfce70009ac15f21e440fd3894e6c11e1b7615 — foxx1337 5 years ago d68c4d8
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>
M tmk_core/protocol/arm_atsam/main_arm_atsam.c => tmk_core/protocol/arm_atsam/main_arm_atsam.c +9 -0
@@ 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) {

M tmk_core/protocol/arm_atsam/usb/conf_usb.h => tmk_core/protocol/arm_atsam/usb/conf_usb.h +1 -0
@@ 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

//@}

M tmk_core/protocol/arm_atsam/usb/main_usb.c => tmk_core/protocol/arm_atsam/usb/main_usb.c +7 -0
@@ 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

M tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c => tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c +28 -1
@@ 641,6 641,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)


@@ 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

M tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h => tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h +1 -0
@@ 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

//@}

M tmk_core/protocol/arm_atsam/usb/usb_main.h => tmk_core/protocol/arm_atsam/usb/usb_main.h +1 -0
@@ 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_