Skip to content

Commit 58b0611

Browse files
committed
nkro through rf
1 parent edb498d commit 58b0611

File tree

9 files changed

+480
-49
lines changed

9 files changed

+480
-49
lines changed

docs/keyboards/nuphy-air60.md

Lines changed: 354 additions & 1 deletion
Large diffs are not rendered by default.

src/kb/kb.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
#include <stdbool.h>
66

77
void kb_init();
8-
void kb_send_report(report_keyboard_t *report);
9-
void kb_send_nkro(report_nkro_t *report);
10-
void kb_send_extra(report_extra_t *report);
8+
void kb_send_report(__xdata report_keyboard_t *report);
9+
void kb_send_nkro(__xdata report_nkro_t *report);
10+
void kb_send_extra(__xdata report_extra_t *report);
1111

1212
bool kb_process_record(uint16_t keycode, bool key_pressed);
1313
void kb_update_switches();

src/keyboards/nuphy-air60/kb.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ bool kb_process_record(uint16_t keycode, bool key_pressed)
7676
}
7777
}
7878

79-
void kb_send_report(report_keyboard_t *report)
79+
void kb_send_report(__xdata report_keyboard_t *report)
8080
{
8181
switch (user_keyboard_state.conn_mode) {
8282
case KEYBOARD_CONN_MODE_USB:
@@ -90,21 +90,21 @@ void kb_send_report(report_keyboard_t *report)
9090
}
9191
}
9292

93-
void kb_send_nkro(report_nkro_t *report)
93+
void kb_send_nkro(__xdata report_nkro_t *report)
9494
{
9595
switch (user_keyboard_state.conn_mode) {
9696
case KEYBOARD_CONN_MODE_USB:
9797
usb_send_nkro(report);
9898
break;
9999
#ifdef RF_ENABLED
100100
case KEYBOARD_CONN_MODE_RF:
101-
// TODO: implement rf
101+
rf_send_nkro(report);
102102
break;
103103
#endif
104104
}
105105
}
106106

107-
void kb_send_extra(report_extra_t *report)
107+
void kb_send_extra(__xdata report_extra_t *report)
108108
{
109109
switch (user_keyboard_state.conn_mode) {
110110
case KEYBOARD_CONN_MODE_USB:

src/platform/bk3632/rf_controller.c

Lines changed: 105 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ void rf_send_blank_report();
3333
bool rf_get_status(uint8_t status_bytes[2]);
3434
void rf_cmd_01(uint8_t mode, uint8_t pairing);
3535
void rf_cmd_02(uint8_t *buffer);
36+
void rf_cmd_02_nkro(__xdata uint8_t mods, __xdata uint8_t *nkro_buffer);
3637
void rf_cmd_03(uint8_t param);
3738
void rf_cmd_04();
3839
void rf_cmd_05(uint16_t consumer, uint16_t system);
@@ -70,46 +71,78 @@ void rf_init()
7071
rf_send_blank_report();
7172
}
7273

73-
void rf_send_report(report_keyboard_t *report)
74-
{
75-
__xdata uint8_t buffer[6];
74+
__xdata uint8_t kro6buffer[6];
7675

77-
buffer[0] = report->raw[0];
78-
buffer[1] = report->raw[2];
79-
buffer[2] = report->raw[3];
80-
buffer[3] = report->raw[4];
81-
buffer[4] = report->raw[5];
82-
buffer[5] = report->raw[6];
76+
void rf_send_report(__xdata report_keyboard_t *report)
77+
{
78+
kro6buffer[0] = report->raw[0];
79+
kro6buffer[1] = report->raw[2];
80+
kro6buffer[2] = report->raw[3];
81+
kro6buffer[3] = report->raw[4];
82+
kro6buffer[4] = report->raw[5];
83+
kro6buffer[5] = report->raw[6];
8384

8485
bool blank = true;
85-
for (int i = 0; i < 6; i++) {
86-
if (buffer[i] != 0) {
86+
for (__xdata int i = 0; i < 6; i++) {
87+
if (kro6buffer[i] != 0) {
88+
blank = false;
89+
}
90+
}
91+
92+
if (blank) {
93+
// blanking sequence
94+
kro6buffer[1] = 0x00;
95+
rf_cmd_02(kro6buffer);
96+
kro6buffer[1] = 0x01;
97+
rf_cmd_02(kro6buffer);
98+
kro6buffer[1] = 0x00;
99+
rf_cmd_02(kro6buffer);
100+
kro6buffer[1] = 0x01;
101+
rf_cmd_02(kro6buffer);
102+
kro6buffer[1] = 0x00;
103+
rf_cmd_02(kro6buffer);
104+
kro6buffer[1] = 0x01;
105+
rf_cmd_02(kro6buffer);
106+
kro6buffer[1] = 0x00;
107+
rf_cmd_02(kro6buffer);
108+
} else {
109+
rf_cmd_02(kro6buffer);
110+
}
111+
}
112+
113+
void rf_send_nkro(__xdata report_nkro_t *report)
114+
{
115+
__xdata bool blank = true;
116+
for (__xdata int i = 1; i < NKRO_REPORT_SIZE - 1; i++) {
117+
if (report->raw[i] != 0) {
87118
blank = false;
88119
}
89120
}
90121

122+
dprintf("is blank: %d\r\n", blank); // FIXME: a delay is necessary here
123+
91124
if (blank) {
92125
// blanking sequence
93-
buffer[1] = 0x00;
94-
rf_cmd_02(buffer);
95-
buffer[1] = 0x01;
96-
rf_cmd_02(buffer);
97-
buffer[1] = 0x00;
98-
rf_cmd_02(buffer);
99-
buffer[1] = 0x01;
100-
rf_cmd_02(buffer);
101-
buffer[1] = 0x00;
102-
rf_cmd_02(buffer);
103-
buffer[1] = 0x01;
104-
rf_cmd_02(buffer);
105-
buffer[1] = 0x00;
106-
rf_cmd_02(buffer);
126+
kro6buffer[1] = 0x00;
127+
rf_cmd_02(kro6buffer);
128+
kro6buffer[1] = 0x01;
129+
rf_cmd_02(kro6buffer);
130+
kro6buffer[1] = 0x00;
131+
rf_cmd_02(kro6buffer);
132+
kro6buffer[1] = 0x01;
133+
rf_cmd_02(kro6buffer);
134+
kro6buffer[1] = 0x00;
135+
rf_cmd_02(kro6buffer);
136+
kro6buffer[1] = 0x01;
137+
rf_cmd_02(kro6buffer);
138+
kro6buffer[1] = 0x00;
139+
rf_cmd_02(kro6buffer);
107140
} else {
108-
rf_cmd_02(buffer);
141+
rf_cmd_02_nkro(report->mods, report->bits);
109142
}
110143
}
111144

112-
void rf_send_extra(report_extra_t *report)
145+
void rf_send_extra(__xdata report_extra_t *report)
113146
{
114147
switch (report->report_id) {
115148
case REPORT_ID_SYSTEM:
@@ -215,7 +248,6 @@ void rf_cmd_02(uint8_t *buffer)
215248
rf_tx_buf[6] = buffer[3];
216249
rf_tx_buf[7] = buffer[4];
217250
rf_tx_buf[8] = buffer[5];
218-
// FIXME: last keyboard report key is lost
219251
rf_tx_buf[9] = 0x00; // 0x00 or 0x01
220252

221253
for (int i = 10; i < 31; i++) { // FIXME: NKRO bytes are blanked out until they are implemented
@@ -227,6 +259,51 @@ void rf_cmd_02(uint8_t *buffer)
227259
bb_spi_xfer(rf_tx_buf, len);
228260
}
229261

262+
void rf_cmd_02_nkro(__xdata uint8_t mods, __xdata uint8_t *nkro_buffer)
263+
{
264+
const uint8_t len = 32;
265+
266+
rf_tx_buf[0] = MAGIC_BYTE;
267+
rf_tx_buf[1] = len - 3;
268+
rf_tx_buf[2] = CMD_REPORT;
269+
rf_tx_buf[3] = mods;
270+
271+
rf_tx_buf[4] = 0x00;
272+
rf_tx_buf[5] = 0x00;
273+
rf_tx_buf[6] = 0x00;
274+
rf_tx_buf[7] = 0x00;
275+
rf_tx_buf[8] = 0x00;
276+
277+
rf_tx_buf[9] = 0x00; // 0x00 or 0x01
278+
279+
rf_tx_buf[10] = nkro_buffer[0];
280+
rf_tx_buf[11] = nkro_buffer[1];
281+
rf_tx_buf[12] = nkro_buffer[2];
282+
rf_tx_buf[13] = nkro_buffer[3];
283+
rf_tx_buf[14] = nkro_buffer[4];
284+
rf_tx_buf[15] = nkro_buffer[5];
285+
rf_tx_buf[16] = nkro_buffer[6];
286+
rf_tx_buf[17] = nkro_buffer[7];
287+
rf_tx_buf[18] = nkro_buffer[8];
288+
rf_tx_buf[19] = nkro_buffer[9];
289+
rf_tx_buf[20] = nkro_buffer[10];
290+
rf_tx_buf[21] = nkro_buffer[11];
291+
rf_tx_buf[22] = nkro_buffer[12];
292+
rf_tx_buf[23] = nkro_buffer[13];
293+
rf_tx_buf[24] = nkro_buffer[14];
294+
rf_tx_buf[25] = nkro_buffer[15];
295+
rf_tx_buf[26] = nkro_buffer[16];
296+
rf_tx_buf[27] = nkro_buffer[17];
297+
rf_tx_buf[28] = nkro_buffer[18];
298+
rf_tx_buf[29] = nkro_buffer[19];
299+
300+
rf_tx_buf[30] = 0x00;
301+
302+
rf_tx_buf[31] = checksum(rf_tx_buf, len - 1);
303+
304+
bb_spi_xfer(rf_tx_buf, len);
305+
}
306+
230307
void rf_cmd_03(uint8_t param) // ?? or 0x02
231308
{
232309
const uint8_t len = 6;

src/platform/bk3632/rf_controller.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "keyboard.h"
55

66
void rf_init();
7-
void rf_send_report(report_keyboard_t *report);
8-
void rf_send_extra(report_extra_t *report);
7+
void rf_send_report(__xdata report_keyboard_t *report);
8+
void rf_send_nkro(__xdata report_nkro_t *report);
9+
void rf_send_extra(__xdata report_extra_t *report);
910
void rf_update_keyboard_state(keyboard_state_t *keyboard);

src/platform/sh68f90a/usb.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,12 @@ const uint8_t hid_report_desc_extra[] = {
144144

145145
// NKRO
146146
HID_RI_USAGE_PAGE(8, 0x07), // Keyboard/Keypad
147-
HID_RI_USAGE_MINIMUM(8, 0x00), // was 0x04
148-
HID_RI_USAGE_MAXIMUM(8, NKRO_REPORT_BITS * 8 - 1), // was 0x70
147+
HID_RI_USAGE_MINIMUM(8, 0x00),
148+
HID_RI_USAGE_MAXIMUM(8, NKRO_REPORT_BITS * 8 - 1),
149149
HID_RI_LOGICAL_MINIMUM(8, 0x00),
150150
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
151151
HID_RI_REPORT_SIZE(8, 1),
152-
HID_RI_REPORT_COUNT(8, NKRO_REPORT_BITS * 8), // was 120
152+
HID_RI_REPORT_COUNT(8, NKRO_REPORT_BITS * 8),
153153
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
154154
HID_RI_END_COLLECTION(0),
155155
#endif // NKRO_ENABLE
@@ -201,8 +201,8 @@ usb_desc_endpoint_c usb_desc_endpoint_main = {
201201
.bDescriptorType = USB_DESC_ENDPOINT,
202202
.bEndpointAddress = 1 | USB_DIR_IN,
203203
.bmAttributes = USB_XFER_INTERRUPT,
204-
.wMaxPacketSize = 8, // 8 bytes
205-
.bInterval = 1, // 1ms
204+
.wMaxPacketSize = 16, // 16 bytes
205+
.bInterval = 1, // 1ms
206206
};
207207

208208
usb_desc_interface_c usb_desc_interface_extra = {
@@ -232,7 +232,7 @@ usb_desc_endpoint_c usb_desc_endpoint_extra = {
232232
.bDescriptorType = USB_DESC_ENDPOINT,
233233
.bEndpointAddress = 2 | USB_DIR_IN,
234234
.bmAttributes = USB_XFER_INTERRUPT,
235-
.wMaxPacketSize = 16, // 16 bytes
235+
.wMaxPacketSize = 64, // 64 bytes
236236
.bInterval = 1, // 1ms
237237
};
238238

src/smk/host.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
static __xdata uint16_t last_system_usage = 0;
77
static __xdata uint16_t last_consumer_usage = 0;
88

9-
void host_keyboard_send(report_keyboard_t *report)
9+
void host_keyboard_send(__xdata report_keyboard_t *report)
1010
{
1111
kb_send_report(report);
1212
}
1313

14-
void host_nkro_send(report_nkro_t *report)
14+
void host_nkro_send(__xdata report_nkro_t *report)
1515
{
1616
kb_send_nkro(report);
1717
}

src/smk/host.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include <stdint.h>
44
#include "report.h"
55

6-
void host_keyboard_send(report_keyboard_t *report);
7-
void host_nkro_send(report_nkro_t *report);
6+
void host_keyboard_send(__xdata report_keyboard_t *report);
7+
void host_nkro_send(__xdata report_nkro_t *report);
88
void host_system_send(uint16_t usage);
99
void host_consumer_send(uint16_t usage);

src/smk/report.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#define KEYBOARD_REPORT_SIZE 8
88
#define KEYBOARD_REPORT_KEYS 6
99

10-
#define NKRO_REPORT_BITS 13
10+
#define NKRO_REPORT_BITS 20 // limited by wireless dongle hid descriptor
1111
#define NKRO_REPORT_SIZE 2 + NKRO_REPORT_BITS
1212

1313
#define EXTRA_REPORT_SIZE 3

0 commit comments

Comments
 (0)