summaryrefslogtreecommitdiff
path: root/tmk_core
diff options
context:
space:
mode:
authorRyan <fauxpark@gmail.com>2023-11-26 22:50:53 +1100
committerGitHub <noreply@github.com>2023-11-26 22:50:53 +1100
commit4601f339e48b0116ca139dd06ce55ef0b9ed598f (patch)
tree6a260961924333e3c37720d40eba0910e2f723fd /tmk_core
parentcbf538aaaae837971a5b54aaddb9f92b3ac0a8c0 (diff)
V-USB: implement NKRO (#22398)
Diffstat (limited to 'tmk_core')
-rw-r--r--tmk_core/protocol/vusb/vusb.c49
1 files changed, 45 insertions, 4 deletions
diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c
index 1750afc562..d09b2f19b7 100644
--- a/tmk_core/protocol/vusb/vusb.c
+++ b/tmk_core/protocol/vusb/vusb.c
@@ -230,10 +230,6 @@ static void send_keyboard(report_keyboard_t *report) {
keyboard_report_sent = *report;
}
-static void send_nkro(report_nkro_t *report) {
- // TODO: Implement NKRO
-}
-
#ifndef KEYBOARD_SHARED_EP
# define MOUSE_IN_EPNUM 3
# define SHARED_IN_EPNUM 3
@@ -242,6 +238,12 @@ static void send_nkro(report_nkro_t *report) {
# define SHARED_IN_EPNUM 1
#endif
+static void send_nkro(report_nkro_t *report) {
+#ifdef NKRO_ENABLE
+ send_report(3, report, sizeof(report_nkro_t));
+#endif
+}
+
static void send_mouse(report_mouse_t *report) {
#ifdef MOUSE_ENABLE
send_report(MOUSE_IN_EPNUM, report, sizeof(report_mouse_t));
@@ -433,6 +435,45 @@ const PROGMEM uchar shared_hid_report[] = {
# define SHARED_REPORT_STARTED
#endif
+#ifdef NKRO_ENABLE
+ // NKRO report descriptor
+ 0x05, 0x01, // Usage Page (Generic Desktop)
+ 0x09, 0x06, // Usage (Keyboard)
+ 0xA1, 0x01, // Collection (Application)
+ 0x85, REPORT_ID_NKRO, // Report ID
+ // Modifiers (8 bits)
+ 0x05, 0x07, // Usage Page (Keyboard/Keypad)
+ 0x19, 0xE0, // Usage Minimum (Keyboard Left Control)
+ 0x29, 0xE7, // Usage Maximum (Keyboard Right GUI)
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x25, 0x01, // Logical Maximum (1)
+ 0x95, 0x08, // Report Count (8)
+ 0x75, 0x01, // Report Size (1)
+ 0x81, 0x02, // Input (Data, Variable, Absolute)
+ // Keycodes
+ 0x05, 0x07, // Usage Page (Keyboard/Keypad)
+ 0x19, 0x00, // Usage Minimum (0)
+ 0x29, NKRO_REPORT_BITS * 8 - 1, // Usage Maximum
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x25, 0x01, // Logical Maximum (1)
+ 0x95, NKRO_REPORT_BITS * 8, // Report Count
+ 0x75, 0x01, // Report Size (1)
+ 0x81, 0x02, // Input (Data, Variable, Absolute)
+
+ // Status LEDs (5 bits)
+ 0x05, 0x08, // Usage Page (LED)
+ 0x19, 0x01, // Usage Minimum (Num Lock)
+ 0x29, 0x05, // Usage Maximum (Kana)
+ 0x95, 0x05, // Report Count (5)
+ 0x75, 0x01, // Report Size (1)
+ 0x91, 0x02, // Output (Data, Variable, Absolute)
+ // LED padding (3 bits)
+ 0x95, 0x01, // Report Count (1)
+ 0x75, 0x03, // Report Size (3)
+ 0x91, 0x03, // Output (Constant)
+ 0xC0, // End Collection
+#endif
+
#ifdef MOUSE_ENABLE
// Mouse report descriptor
0x05, 0x01, // Usage Page (Generic Desktop)