sxkbd

Firmware for RP2040-based corne split keyboard
git clone https://git.sinitax.com/sinitax/sxkbd
Log | Files | Refs | Submodules | README | LICENSE | sfeed.txt

commit d315f8801413aaf3c7013bff05a75b38a5f36e3a
parent 11f93b19cc46f445531145b197bb7ef8cce26cf6
Author: Louis Burda <quent.burda@gmail.com>
Date:   Wed, 28 Dec 2022 01:41:19 +0100

Use separate hid interface for keyboard proto

Diffstat:
Msrc/hid.c | 111++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Msrc/hid.h | 4++--
Msrc/tusb_config.h | 4+---
Msrc/usb_descriptors.c | 107+++++++++++++++++++++++++++++++++++++++++--------------------------------------
4 files changed, 127 insertions(+), 99 deletions(-)

diff --git a/src/hid.c b/src/hid.c @@ -1,16 +1,17 @@ #include "hid.h" -#include "keysym/consumer.h" -#include "keysym/system.h" -#include "hid/keyboard.h" -#include "hid/consumer.h" -#include "hid/system.h" - +#include "led.h" #include "split.h" #include "keymat.h" #include "keysym.h" #include "keymap.h" +#include "class/hid/hid.h" +#include "keysym/consumer.h" +#include "keysym/system.h" +#include "hid/keyboard.h" +#include "hid/consumer.h" +#include "hid/system.h" #include "hardware/timer.h" #include "bsp/board.h" #include "pico/types.h" @@ -95,6 +96,8 @@ static bool macro_held_find(uint32_t keysym); static void add_keycode(uint8_t keycode); +/* TODO: add static prototypes */ + void active_layers_reset(void) { @@ -384,6 +387,28 @@ send_keyboard_report(void) } bool +send_mouse_report(void) +{ + bool sent; + + sent = false; + if (memcmp(&mouse_report, &mouse_report_prev, + sizeof(mouse_report))) { + tud_hid_n_mouse_report(INST_HID_MISC, + REPORT_ID_MOUSE, mouse_report.btns, + mouse_report.x, mouse_report.y, + mouse_report.h, mouse_report.v); + memcpy(&mouse_report_prev, &mouse_report, + sizeof(mouse_report)); + sent = true; + } + + memset(&mouse_report, 0, sizeof(mouse_report)); + + return sent; +} + +bool send_consumer_report(void) { bool sent; @@ -391,7 +416,8 @@ send_consumer_report(void) sent = false; if (memcmp(&consumer_report, &consumer_report_prev, sizeof(consumer_report))) { - tud_hid_report(REPORT_ID_CONSUMER, + INFO("CONSUMER SEND"); + tud_hid_n_report(INST_HID_MISC, REPORT_ID_CONSUMER, &consumer_report.code, 2); memcpy(&consumer_report_prev, &consumer_report, sizeof(consumer_report)); @@ -411,7 +437,7 @@ send_system_report(void) sent = false; if (memcmp(&system_report, &system_report_prev, sizeof(system_report))) { - tud_hid_report(REPORT_ID_SYSTEM, + tud_hid_n_report(INST_HID_MISC, REPORT_ID_SYSTEM, &system_report.code, 2); memcpy(&system_report_prev, &system_report, sizeof(system_report)); @@ -424,27 +450,6 @@ send_system_report(void) } bool -send_mouse_report(void) -{ - bool sent; - - sent = false; - if (memcmp(&mouse_report, &mouse_report_prev, - sizeof(mouse_report))) { - tud_hid_mouse_report(REPORT_ID_NONE, mouse_report.btns, - mouse_report.x, mouse_report.y, - mouse_report.h, mouse_report.v); - memcpy(&mouse_report_prev, &mouse_report, - sizeof(mouse_report)); - sent = true; - } - - memset(&mouse_report, 0, sizeof(mouse_report)); - - return sent; -} - -bool send_gamepad_report(void) { bool sent; @@ -452,7 +457,7 @@ send_gamepad_report(void) sent = false; if (memcmp(&gamepad_report, &gamepad_report_prev, sizeof(gamepad_report))) { - tud_hid_gamepad_report(REPORT_ID_GAMEPAD, + tud_hid_n_gamepad_report(INST_HID_MISC, REPORT_ID_GAMEPAD, gamepad_report.x, gamepad_report.y, gamepad_report.z, gamepad_report.rz, gamepad_report.rx, gamepad_report.ry, gamepad_report.hat, gamepad_report.btns); @@ -470,12 +475,12 @@ bool send_hid_report(int id) { switch (id) { + case REPORT_ID_MOUSE: + return send_mouse_report(); case REPORT_ID_CONSUMER: return send_consumer_report(); case REPORT_ID_SYSTEM: return send_system_report(); - case REPORT_ID_MOUSE: - return send_mouse_report(); case REPORT_ID_GAMEPAD: return send_gamepad_report(); } @@ -494,11 +499,31 @@ send_next_hid_report(uint8_t min) } } +bool +hid_ready() +{ + return tud_hid_n_ready(INST_HID_KBD) + && tud_hid_n_ready(INST_HID_MISC); +} + +void +tud_hid_set_protocol_cb(uint8_t instance, uint8_t protocol) +{ + if (protocol == HID_PROTOCOL_BOOT) { + led_rgb = WS2812_U32RGB(100, 100, 0); + } else { + led_rgb = WS2812_U32RGB(100, 0, 100); + } + led_mode = LED_ON; + led_reset = true; +} + void tud_hid_report_complete_cb(uint8_t instance, uint8_t const *report, uint8_t len) { - send_next_hid_report(report[0] + 1); + if (report[0] >= REPORT_ID_MIN) + send_next_hid_report(report[0] + 1); } void @@ -538,11 +563,12 @@ hid_send_macro(const uint32_t *keysyms, uint cnt) active_mods = 0; active_weak_mods = 0; + macro_running = true; memset(&keyboard_report, 0, sizeof(keyboard_report)); memset(&keyboard_report_prev, 0, sizeof(keyboard_report)); memset(&seen_mat, 0, sizeof(seen_mat)); + while (!hid_ready()) tud_task(); - macro_running = true; for (i = 0; i < cnt; i++) { if (IS_MACRO_DELAY(keysyms[i])) { start_ms = board_millis(); @@ -579,22 +605,19 @@ hid_send_macro(const uint32_t *keysyms, uint cnt) process_keydown(keysyms[i], mx, my); } - while (!tud_hid_n_ready(INST_HID_KBD)) - tud_task(); - send_next_hid_report(REPORT_ID_MIN); + send_keyboard_report(); + while (!hid_ready()) tud_task(); if (IS_MACRO_PRESS(keysyms[i])) { memcpy(&keyboard_report, &tmp, sizeof(keyboard_report)); - while (!tud_hid_n_ready(INST_HID_KBD)) - tud_task(); - send_next_hid_report(REPORT_ID_MIN); + send_keyboard_report(); + while (!hid_ready()) tud_task(); } } memset(&keyboard_report, 0, sizeof(keyboard_report)); - send_next_hid_report(REPORT_ID_MIN); - while (!tud_hid_n_ready(INST_HID_KBD)) - tud_task(); + send_keyboard_report(); + while (!hid_ready()) tud_task(); macro_running = false; } @@ -605,5 +628,7 @@ hid_task(void) update_report(); if (tud_hid_n_ready(INST_HID_KBD)) send_keyboard_report(); + if (tud_hid_n_ready(INST_HID_MISC)) + send_next_hid_report(REPORT_ID_MIN); } diff --git a/src/hid.h b/src/hid.h @@ -12,9 +12,9 @@ #define REPORT_ID_MIN 1 enum { - REPORT_ID_CONSUMER = REPORT_ID_MIN, + REPORT_ID_MOUSE = REPORT_ID_MIN, + REPORT_ID_CONSUMER, REPORT_ID_SYSTEM, - REPORT_ID_MOUSE, REPORT_ID_GAMEPAD, REPORT_ID_MAX }; diff --git a/src/tusb_config.h b/src/tusb_config.h @@ -42,12 +42,10 @@ extern "C" { #define CFG_TUD_CDC 1 #define CFG_TUD_MSC 0 -#define CFG_TUD_HID 1 +#define CFG_TUD_HID 2 #define CFG_TUD_MIDI 0 #define CFG_TUD_VENDOR 0 -#define CFG_TUD_HID_EP_BUFSIZE 16 - #define CFG_TUD_CDC_EP_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) #define CFG_TUD_CDC_RX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) #define CFG_TUD_CDC_TX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) diff --git a/src/usb_descriptors.c b/src/usb_descriptors.c @@ -12,26 +12,28 @@ #define USB_PID (0x4000 | _PID_MAP(CDC, 0) | _PID_MAP(MSC, 1) \ | _PID_MAP(HID, 2) | _PID_MAP(MIDI, 3) | _PID_MAP(VENDOR, 4)) -#define USB_VID 0x1523 -#define USB_BCD 0x0200 +#define USB_VID 0x1209 +#define USB_BCD 0xDDDD #define CONFIG_TOTAL_LEN \ - (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN + TUD_HID_DESC_LEN) + (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN + 2 * TUD_HID_DESC_LEN) /* MCU-specific! */ -#define EPNUM_CDC_NOTIF 0x81 -#define EPNUM_CDC_OUT 0x02 -#define EPNUM_CDC_IN 0x82 -#define EPNUM_HID 0x83 +#define EPNUM_HID_KBD 0x81 +#define EPNUM_HID_MISC 0x82 +#define EPNUM_CDC_NOTIF 0x84 +#define EPNUM_CDC_IN 0x85 +#define EPNUM_CDC_OUT 0x05 enum { ITF_NUM_CDC, ITF_NUM_CDC_DATA, ITF_NUM_HID_KBD, + ITF_NUM_HID_MISC, ITF_NUM_TOTAL }; -tusb_desc_device_t const desc_device = { +static const tusb_desc_device_t desc_device = { .bLength = sizeof(tusb_desc_device_t), .bDescriptorType = TUSB_DESC_DEVICE, .bcdUSB = USB_BCD, @@ -53,18 +55,18 @@ tusb_desc_device_t const desc_device = { .bNumConfigurations = 0x01 }; -uint8_t const desc_hid_kbd_report[] = { +static const uint8_t desc_hid_kbd_report[] = { TUD_HID_REPORT_DESC_KEYBOARD() }; -uint8_t const desc_hid_misc_report[] = { +static const uint8_t desc_hid_misc_report[] = { TUD_HID_REPORT_DESC_MOUSE(HID_REPORT_ID(REPORT_ID_MOUSE)), TUD_HID_REPORT_DESC_CONSUMER(HID_REPORT_ID(REPORT_ID_CONSUMER)), TUD_HID_REPORT_DESC_SYSTEM_CONTROL(HID_REPORT_ID(REPORT_ID_SYSTEM)), TUD_HID_REPORT_DESC_GAMEPAD(HID_REPORT_ID(REPORT_ID_GAMEPAD)) }; -uint8_t const desc_fs_configuration[] = { +static const uint8_t desc_fs_configuration[] = { /* Config number, interface count, string index, * total length, attribute, power in mA */ TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, @@ -78,11 +80,13 @@ uint8_t const desc_fs_configuration[] = { /* Interface number, string index, protocol, report descriptor len, * EP In address, size & polling interval */ TUD_HID_DESCRIPTOR(ITF_NUM_HID_KBD, 0, HID_ITF_PROTOCOL_KEYBOARD, - sizeof(desc_hid_kbd_report), EPNUM_HID, 8, 1) + sizeof(desc_hid_kbd_report), EPNUM_HID_KBD, 8, 1), + TUD_HID_DESCRIPTOR(ITF_NUM_HID_MISC, 0, HID_ITF_PROTOCOL_NONE, + sizeof(desc_hid_misc_report), EPNUM_HID_MISC, 16, 1) }; #if TUD_OPT_HIGH_SPEED -uint8_t const desc_hs_configuration[] = { +static const uint8_t desc_hs_configuration[] = { /* Config number, interface count, string index, * total length, attribute, power in mA */ TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, @@ -96,12 +100,14 @@ uint8_t const desc_hs_configuration[] = { /* Interface number, string index, protocol, report descriptor len, * EP In address, size & polling interval */ TUD_HID_DESCRIPTOR(ITF_NUM_HID_KBD, 0, HID_ITF_PROTOCOL_KEYBOARD, - sizeof(desc_hid_kbd_report), EPNUM_HID, 8, 1) + sizeof(desc_hid_kbd_report), EPNUM_HID_KBD, 8, 1), + TUD_HID_DESCRIPTOR(ITF_NUM_HID_MISC, 0, HID_ITF_PROTOCOL_NONE, + sizeof(desc_hid_misc_report), EPNUM_HID_MISC, 16, 1) }; -uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN]; +static uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN]; -tusb_desc_device_qualifier_t const desc_device_qualifier = +static const tusb_desc_device_qualifier_t desc_device_qualifier = { .bLength = sizeof(tusb_desc_device_qualifier_t), .bDescriptorType = TUSB_DESC_DEVICE_QUALIFIER, @@ -117,54 +123,52 @@ tusb_desc_device_qualifier_t const desc_device_qualifier = }; #endif -char const *string_desc_arr[] = { - [0] = "\x07\x04", /* LangID: German (0x0407) */ - [1] = "TinyUSB", /* Manufacturer */ - [2] = "TinyUSB Device", /* Product */ - [3] = "123456", /* Serials, should use chip ID */ - [4] = "SXKBD CDC", +static const char *string_desc_arr[] = { + [0] = "\x07\x04", /* LangID: German (0x0407) */ + [1] = "SNX", /* Manufacturer */ + [2] = "SXKBD Keyboard", /* Product */ + [3] = "000001", /* Serial Number */ + [4] = "HID-CDC", + [5] = "HID-KBD", + [6] = "HID-MISC" }; static uint16_t _desc_str[32]; -/* Invoked on GET DEVICE DESCRIPTOR */ -uint8_t const * +const uint8_t * tud_descriptor_device_cb(void) { - return (uint8_t const *) &desc_device; + return (const uint8_t *) &desc_device; } -/* Invoked on GET HID REPORT DESCRIPTOR */ -uint8_t const * -tud_hid_descriptor_report_cb(uint8_t itf) +const uint8_t * +tud_hid_descriptor_report_cb(uint8_t instance) { - (void) itf; - return desc_hid_kbd_report; + if (instance == INST_HID_KBD) + return desc_hid_kbd_report; + else + return desc_hid_misc_report; } -/* Invoked on GET CONFIGURATION DESCRIPTOR */ -uint8_t const * -tud_descriptor_configuration_cb(uint8_t index) +const uint8_t * +tud_descriptor_configuration_cb(uint8_t instance) { - (void) index; - #if TUD_OPT_HIGH_SPEED - return (tud_speed_get() == TUSB_SPEED_HIGH) ? - desc_hs_configuration : desc_fs_configuration; + if (tud_speed_get() == TUSB_SPEED_HIGH) + return desc_hs_configuration; + else + return desc_fs_configuration; #else return desc_fs_configuration; #endif } -/* Invoked on GET STRING DESCRIPTOR */ -uint16_t const * +const uint16_t * tud_descriptor_string_cb(uint8_t index, uint16_t langid) { const char *str; uint8_t i, chr_count; - (void) langid; - if (index == 0) { memcpy(&_desc_str[1], string_desc_arr[0], 2); chr_count = 1; @@ -190,21 +194,22 @@ tud_descriptor_string_cb(uint8_t index, uint16_t langid) } #if TUD_OPT_HIGH_SPEED -uint8_t const * +const uint8_t * tud_descriptor_device_qualifier_cb(void) { - return (uint8_t const*) &desc_device_qualifier; + return (const uint8_t*) &desc_device_qualifier; } -/* Invoked on GET OTHER SEED CONFIGURATION DESCRIPTOR */ -uint8_t const * -tud_descriptor_other_speed_configuration_cb(uint8_t index) +const uint8_t * +tud_descriptor_other_speed_configuration_cb(uint8_t instance) { - (void) index; - - memcpy(desc_other_speed_config, (tud_speed_get() == TUSB_SPEED_HIGH) - ? desc_fs_configuration : desc_hs_configuration, - CONFIG_TOTAL_LEN); + if (tud_speed_get() == TUSB_SPEED_HIGH) { + memcpy(desc_other_speed_config, desc_hs_configuration, + CONFIG_TOTAL_LEN); + } else { + memcpy(desc_other_speed_config, desc_fs_configuration, + CONFIG_TOTAL_LEN); + } desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;