Skip to content

Commit 90aeb6c

Browse files
committed
nkro support (untested)
1 parent a569ef5 commit 90aeb6c

File tree

13 files changed

+234
-12
lines changed

13 files changed

+234
-12
lines changed

meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ cc_base_args = [
111111
'--out-fmt-ihx',
112112

113113
'-DSMK_VERSION=@0@'.format(meson.project_version()),
114+
'-DNKRO_ENABLE=1', # TODO: move it into a feature
114115
]
115116

116117
if get_option('buildtype') == 'debug'

src/kb/kb.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
void kb_init();
88
void kb_send_report(report_keyboard_t *report);
9+
void kb_send_nkro(report_nkro_t *report);
910
void kb_send_extra(report_extra_t *report);
1011

1112
bool kb_process_record(uint16_t keycode, bool key_pressed);

src/keyboards/example/kb.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ void kb_send_report(report_keyboard_t *report)
66
usb_send_report(report);
77
}
88

9+
void kb_send_nkro(report_nkro_t *report)
10+
{
11+
usb_send_nkro(report);
12+
}
13+
914
void kb_send_extra(report_extra_t *report)
1015
{
1116
usb_send_extra(report);

src/keyboards/eyooso-z11/kb.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ void kb_send_report(report_keyboard_t *report)
66
usb_send_report(report);
77
}
88

9+
void kb_send_nkro(report_nkro_t *report)
10+
{
11+
usb_send_nkro(report);
12+
}
13+
914
void kb_send_extra(report_extra_t *report)
1015
{
1116
usb_send_extra(report);

src/keyboards/nuphy-air60/kb.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,20 @@ void kb_send_report(report_keyboard_t *report)
9090
}
9191
}
9292

93+
void kb_send_nkro(report_nkro_t *report)
94+
{
95+
switch (user_keyboard_state.conn_mode) {
96+
case KEYBOARD_CONN_MODE_USB:
97+
usb_send_nkro(report);
98+
break;
99+
#ifdef RF_ENABLED
100+
case KEYBOARD_CONN_MODE_RF:
101+
// TODO: implement rf
102+
break;
103+
#endif
104+
}
105+
}
106+
93107
void kb_send_extra(report_extra_t *report)
94108
{
95109
switch (user_keyboard_state.conn_mode) {

src/platform/sh68f90a/usb.c

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,20 +127,23 @@ const uint8_t hid_report_desc_extra[] = {
127127
HID_RI_FEATURE(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
128128
HID_RI_END_COLLECTION(0),
129129

130+
#ifdef NKRO_ENABLE
130131
HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop
131132
HID_RI_USAGE(8, 0x06), // Keyboard
132133
HID_RI_COLLECTION(8, 0x01), // Application
133134
HID_RI_REPORT_ID(8, REPORT_ID_NKRO),
134135
// Modifiers (8 bits)
135136
HID_RI_USAGE_PAGE(8, 0x07), // Keyboard/Keypad
136-
HID_RI_USAGE_MINIMUM(8, 0x04),
137-
HID_RI_USAGE_MAXIMUM(8, 0x70),
137+
HID_RI_USAGE_MINIMUM(8, 0x00), // was 0x04
138+
HID_RI_USAGE_MAXIMUM(8, NKRO_REPORT_BITS * 8 - 1), // was 0x70
138139
HID_RI_LOGICAL_MINIMUM(8, 0x00),
139140
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
140141
HID_RI_REPORT_SIZE(8, 1),
141-
HID_RI_REPORT_COUNT(8, 120),
142+
HID_RI_REPORT_COUNT(8, NKRO_REPORT_BITS * 8), // was 120
142143
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
143144
HID_RI_END_COLLECTION(0),
145+
#endif // NKRO_ENABLE
146+
144147
// clang-format on
145148
};
146149

@@ -358,6 +361,20 @@ void usb_send_report(report_keyboard_t *report)
358361
SET_EP1_IN_RDY;
359362
}
360363

364+
void usb_send_nkro(report_nkro_t *report)
365+
{
366+
uint8_t timeout = 0;
367+
while (timeout < 255 && EP2CON & _IEP2RDY) {
368+
delay_us(40);
369+
timeout++;
370+
}
371+
372+
set_ep2_in_buffer(report->raw, sizeof(report_nkro_t));
373+
374+
SET_EP2_CNT(sizeof(report_nkro_t));
375+
SET_EP2_IN_RDY;
376+
}
377+
361378
void usb_send_extra(report_extra_t *report)
362379
{
363380
uint8_t timeout = 0;
@@ -366,12 +383,17 @@ void usb_send_extra(report_extra_t *report)
366383
timeout++;
367384
}
368385

369-
set_ep2_in_buffer((uint8_t *)report, sizeof(report_extra_t));
386+
set_ep2_in_buffer(report->raw, sizeof(report_extra_t));
370387

371388
SET_EP2_CNT(sizeof(report_extra_t));
372389
SET_EP2_IN_RDY;
373390
}
374391

392+
uint8_t usb_device_state_get_protocol()
393+
{
394+
return interface0_protocol;
395+
}
396+
375397
static void usb_setup_irq()
376398
{
377399
usb_req_setup_x req;

src/platform/sh68f90a/usb.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,15 @@
44
#include "report.h"
55
#include <stdint.h>
66

7-
void usb_init();
8-
void usb_send_report(report_keyboard_t *report);
9-
void usb_send_extra(report_extra_t *report);
7+
enum {
8+
USB_PROTOCOL_BOOT = 0,
9+
USB_PROTOCOL_REPORT = 1,
10+
};
11+
12+
void usb_init();
13+
void usb_send_report(report_keyboard_t *report);
14+
void usb_send_nkro(report_nkro_t *report);
15+
void usb_send_extra(report_extra_t *report);
16+
uint8_t usb_device_state_get_protocol();
1017

1118
void usb_interrupt_handler() __interrupt(_INT_USB);

src/smk/host.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ void host_keyboard_send(report_keyboard_t *report)
1111
kb_send_report(report);
1212
}
1313

14+
void host_nkro_send(report_nkro_t *report)
15+
{
16+
kb_send_nkro(report);
17+
}
18+
1419
void host_system_send(uint16_t usage)
1520
{
1621
if (usage == last_system_usage) return;

src/smk/host.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
#include "report.h"
55

66
void host_keyboard_send(report_keyboard_t *report);
7+
void host_nkro_send(report_nkro_t *report);
78
void host_system_send(uint16_t usage);
89
void host_consumer_send(uint16_t usage);

src/smk/keyboard.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@
33

44
volatile __xdata keyboard_state_t keyboard_state;
55

6+
__xdata keymap_config_t keymap_config;
7+
68
void keyboard_init()
79
{
810
keyboard_state.led_state = 0x00;
11+
12+
#ifdef NKRO_ENABLE
13+
keymap_config.nkro = 1;
14+
#endif
915
}

0 commit comments

Comments
 (0)