From a24ddf3403670724b798d18e1d39bc3f0751aecf Mon Sep 17 00:00:00 2001 From: flabbergast Date: Thu, 10 Sep 2015 12:48:44 +0100 Subject: [PATCH] NKRO fixes. --- tmk_core/common/report.h | 5 ++++ tmk_core/protocol/chibios/main.c | 23 ++++++++++----- tmk_core/protocol/chibios/usb_main.c | 42 ++++++++++++++-------------- tmk_core/protocol/chibios/usb_main.h | 31 +++++++------------- 4 files changed, 52 insertions(+), 49 deletions(-) diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index f6c0a315..0c799eca 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -84,6 +84,11 @@ along with this program. If not, see . # define KEYBOARD_REPORT_SIZE NKRO_EPSIZE # define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) # define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) +#elif defined(PROTOCOL_CHIBIOS) && defined(NKRO_ENABLE) +# include "protocol/chibios/usb_main.h" +# define KEYBOARD_REPORT_SIZE NKRO_EPSIZE +# define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) +# define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) #else # define KEYBOARD_REPORT_SIZE 8 diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index 7aec7e3e..589675aa 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -40,6 +40,14 @@ * ------------------------- */ +/* declarations */ +uint8_t keyboard_leds(void); +void send_keyboard(report_keyboard_t *report); +void send_mouse(report_mouse_t *report); +void send_system(uint16_t data); +void send_consumer(uint16_t data); + +/* host struct */ host_driver_t chibios_driver = { keyboard_leds, send_keyboard, @@ -52,14 +60,15 @@ host_driver_t chibios_driver = { /* TESTING * Amber LED blinker thread, times are in milliseconds. */ -// uint8_t blinkLedState = 0; -// static THD_WORKING_AREA(waThread1, 128); -// static THD_FUNCTION(Thread1, arg) { +/* set this variable to non-zero anywhere to blink once */ +// uint8_t blinkLed = 0; +// static THD_WORKING_AREA(waBlinkerThread, 128); +// static THD_FUNCTION(blinkerThread, arg) { // (void)arg; -// chRegSetThreadName("blinker1"); +// chRegSetThreadName("blinkOrange"); // while(true) { -// if(blinkLedState) { -// blinkLedState = 0; +// if(blinkLed) { +// blinkLed = 0; // palSetPad(GPIOC, GPIOC_LED_ORANGE); // chThdSleepMilliseconds(100); // palClearPad(GPIOC, GPIOC_LED_ORANGE); @@ -82,7 +91,7 @@ int main(void) { palClearPad(GPIOC, GPIOC_LED_BLUE); // TESTING - // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); + // chThdCreateStatic(waBlinkerThread, sizeof(waBlinkerThread), NORMALPRIO, blinkerThread, NULL); /* Init USB */ init_usb_driver(&USB_DRIVER); diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index daefc490..f5f2dad7 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -20,11 +20,11 @@ #include "usb_main.h" +#include "host.h" #include "debug.h" #ifdef SLEEP_LED_ENABLE #include "sleep_led.h" #include "led.h" -#include "host.h" #endif /* --------------------------------------------------------- @@ -39,7 +39,7 @@ volatile uint16_t keyboard_idle_count = 0; static virtual_timer_t keyboard_idle_timer; static void keyboard_idle_timer_cb(void *arg); #ifdef NKRO_ENABLE -bool keyboard_nkro = true; +extern bool keyboard_nkro; #endif /* NKRO_ENABLE */ report_keyboard_t keyboard_report_sent = {{0}}; @@ -250,7 +250,7 @@ static const uint8_t console_hid_report_desc_data[] = { 0x75, 0x08, // report size = 8 bits 0x15, 0x00, // logical minimum = 0 0x26, 0xFF, 0x00, // logical maximum = 255 - 0x95, CONSOLE_SIZE, // report count + 0x95, CONSOLE_EPSIZE, // report count 0x09, 0x75, // usage 0x81, 0x02, // Input (array) 0xC0 // end collection @@ -374,7 +374,7 @@ static const uint8_t hid_configuration_descriptor_data[] = { /* Endpoint Descriptor (7 bytes) USB spec 9.6.6, page 269-271, Table 9-13 */ USB_DESC_ENDPOINT(KBD_ENDPOINT | 0x80, // bEndpointAddress 0x03, // bmAttributes (Interrupt) - KBD_SIZE, // wMaxPacketSize + KBD_EPSIZE,// wMaxPacketSize 10), // bInterval #ifdef MOUSE_ENABLE @@ -404,7 +404,7 @@ static const uint8_t hid_configuration_descriptor_data[] = { /* Endpoint Descriptor (7 bytes) USB spec 9.6.6, page 269-271, Table 9-13 */ USB_DESC_ENDPOINT(MOUSE_ENDPOINT | 0x80, // bEndpointAddress 0x03, // bmAttributes (Interrupt) - MOUSE_SIZE, // wMaxPacketSize + MOUSE_EPSIZE, // wMaxPacketSize 1), // bInterval #endif /* MOUSE_ENABLE */ @@ -430,7 +430,7 @@ static const uint8_t hid_configuration_descriptor_data[] = { /* Endpoint Descriptor (7 bytes) USB spec 9.6.6, page 269-271, Table 9-13 */ USB_DESC_ENDPOINT(CONSOLE_ENDPOINT | 0x80, // bEndpointAddress 0x03, // bmAttributes (Interrupt) - CONSOLE_SIZE, // wMaxPacketSize + CONSOLE_EPSIZE, // wMaxPacketSize 1), // bInterval #endif /* CONSOLE_ENABLE */ @@ -456,7 +456,7 @@ static const uint8_t hid_configuration_descriptor_data[] = { /* Endpoint Descriptor (7 bytes) USB spec 9.6.6, page 269-271, Table 9-13 */ USB_DESC_ENDPOINT(EXTRA_ENDPOINT | 0x80, // bEndpointAddress 0x03, // bmAttributes (Interrupt) - EXTRA_SIZE, // wMaxPacketSize + EXTRA_EPSIZE, // wMaxPacketSize 10), // bInterval #endif /* EXTRAKEY_ENABLE */ @@ -482,7 +482,7 @@ static const uint8_t hid_configuration_descriptor_data[] = { /* Endpoint Descriptor (7 bytes) USB spec 9.6.6, page 269-271, Table 9-13 */ USB_DESC_ENDPOINT(NKRO_ENDPOINT | 0x80, // bEndpointAddress 0x03, // bmAttributes (Interrupt) - NKRO_SIZE, // wMaxPacketSize + NKRO_EPSIZE, // wMaxPacketSize 1), // bInterval #endif /* NKRO_ENABLE */ }; @@ -665,7 +665,7 @@ static const USBEndpointConfig kbd_ep_config = { NULL, /* SETUP packet notification callback */ kbd_in_cb, /* IN notification callback */ NULL, /* OUT notification callback */ - KBD_SIZE, /* IN maximum packet size */ + KBD_EPSIZE, /* IN maximum packet size */ 0, /* OUT maximum packet size */ &kbd_ep_state, /* IN Endpoint state */ NULL, /* OUT endpoint state */ @@ -683,7 +683,7 @@ static const USBEndpointConfig mouse_ep_config = { NULL, /* SETUP packet notification callback */ mouse_in_cb, /* IN notification callback */ NULL, /* OUT notification callback */ - MOUSE_SIZE, /* IN maximum packet size */ + MOUSE_EPSIZE, /* IN maximum packet size */ 0, /* OUT maximum packet size */ &mouse_ep_state, /* IN Endpoint state */ NULL, /* OUT endpoint state */ @@ -702,7 +702,7 @@ static const USBEndpointConfig console_ep_config = { NULL, /* SETUP packet notification callback */ console_in_cb, /* IN notification callback */ NULL, /* OUT notification callback */ - CONSOLE_SIZE, /* IN maximum packet size */ + CONSOLE_EPSIZE, /* IN maximum packet size */ 0, /* OUT maximum packet size */ &console_ep_state, /* IN Endpoint state */ NULL, /* OUT endpoint state */ @@ -721,7 +721,7 @@ static const USBEndpointConfig extra_ep_config = { NULL, /* SETUP packet notification callback */ extra_in_cb, /* IN notification callback */ NULL, /* OUT notification callback */ - EXTRA_SIZE, /* IN maximum packet size */ + EXTRA_EPSIZE, /* IN maximum packet size */ 0, /* OUT maximum packet size */ &extra_ep_state, /* IN Endpoint state */ NULL, /* OUT endpoint state */ @@ -740,7 +740,7 @@ static const USBEndpointConfig nkro_ep_config = { NULL, /* SETUP packet notification callback */ nkro_in_cb, /* IN notification callback */ NULL, /* OUT notification callback */ - NKRO_SIZE, /* IN maximum packet size */ + NKRO_EPSIZE, /* IN maximum packet size */ 0, /* OUT maximum packet size */ &nkro_ep_state, /* IN Endpoint state */ NULL, /* OUT endpoint state */ @@ -1178,9 +1178,9 @@ void console_in_cb(USBDriver *usbp, usbep_t ep) { chVTSetI(&console_flush_timer, MS2ST(CONSOLE_FLUSH_MS), console_flush_cb, (void *)usbp); /* Check if there is data to send left in the output queue */ - if(chOQGetFullI(&console_queue) >= CONSOLE_SIZE) { + if(chOQGetFullI(&console_queue) >= CONSOLE_EPSIZE) { osalSysUnlockFromISR(); - usbPrepareQueuedTransmit(usbp, CONSOLE_ENDPOINT, &console_queue, CONSOLE_SIZE); + usbPrepareQueuedTransmit(usbp, CONSOLE_ENDPOINT, &console_queue, CONSOLE_EPSIZE); osalSysLockFromISR(); usbStartTransmitI(usbp, CONSOLE_ENDPOINT); } @@ -1197,9 +1197,9 @@ void console_queue_onotify(io_queue_t *qp) { return; if(!usbGetTransmitStatusI(usbp, CONSOLE_ENDPOINT) - && (chOQGetFullI(&console_queue) >= CONSOLE_SIZE)) { + && (chOQGetFullI(&console_queue) >= CONSOLE_EPSIZE)) { osalSysUnlock(); - usbPrepareQueuedTransmit(usbp, CONSOLE_ENDPOINT, &console_queue, CONSOLE_SIZE); + usbPrepareQueuedTransmit(usbp, CONSOLE_ENDPOINT, &console_queue, CONSOLE_EPSIZE); osalSysLock(); usbStartTransmitI(usbp, CONSOLE_ENDPOINT); } @@ -1210,7 +1210,7 @@ void console_queue_onotify(io_queue_t *qp) { static void console_flush_cb(void *arg) { USBDriver *usbp = (USBDriver *)arg; size_t i, n; - uint8_t buf[CONSOLE_SIZE]; /* TODO: a solution without extra buffer? */ + uint8_t buf[CONSOLE_EPSIZE]; /* TODO: a solution without extra buffer? */ osalSysLockFromISR(); /* check that the states of things are as they're supposed to */ @@ -1222,7 +1222,7 @@ static void console_flush_cb(void *arg) { } /* don't do anything if the queue is empty or has enough stuff in it */ - if(((n = oqGetFullI(&console_queue)) == 0) || (n >= CONSOLE_SIZE)) { + if(((n = oqGetFullI(&console_queue)) == 0) || (n >= CONSOLE_EPSIZE)) { /* rearm the timer */ chVTSetI(&console_flush_timer, MS2ST(CONSOLE_FLUSH_MS), console_flush_cb, (void *)usbp); osalSysUnlockFromISR(); @@ -1232,10 +1232,10 @@ static void console_flush_cb(void *arg) { /* there's stuff hanging in the queue - so dequeue and send */ for(i = 0; i < n; i++) buf[i] = (uint8_t)oqGetI(&console_queue); - for(i = n; i < CONSOLE_SIZE; i++) + for(i = n; i < CONSOLE_EPSIZE; i++) buf[i] = 0; osalSysUnlockFromISR(); - usbPrepareTransmit(usbp, CONSOLE_ENDPOINT, buf, CONSOLE_SIZE); + usbPrepareTransmit(usbp, CONSOLE_ENDPOINT, buf, CONSOLE_EPSIZE); osalSysLockFromISR(); (void)usbStartTransmitI(usbp, CONSOLE_ENDPOINT); diff --git a/tmk_core/protocol/chibios/usb_main.h b/tmk_core/protocol/chibios/usb_main.h index 5897375b..3a7e76fc 100644 --- a/tmk_core/protocol/chibios/usb_main.h +++ b/tmk_core/protocol/chibios/usb_main.h @@ -20,7 +20,7 @@ #define _USB_MAIN_H_ // TESTING -// extern uint8_t blinkLedState; +// extern uint8_t blinkLed; #include "ch.h" #include "hal.h" @@ -44,19 +44,19 @@ void init_usb_driver(USBDriver *usbp); /* main keyboard (6kro) */ #define KBD_INTERFACE 0 #define KBD_ENDPOINT 1 -#define KBD_SIZE 8 -#define KBD_REPORT_KEYS (KBD_SIZE - 2) +#define KBD_EPSIZE 8 +#define KBD_REPORT_KEYS (KBD_EPSIZE - 2) /* secondary keyboard */ #ifdef NKRO_ENABLE #define NKRO_INTERFACE 4 #define NKRO_ENDPOINT 5 -#define NKRO_SIZE 16 -#define NKRO_REPORT_KEYS (NKRO_SIZE - 1) +#define NKRO_EPSIZE 16 +#define NKRO_REPORT_KEYS (NKRO_EPSIZE - 1) #endif /* this defines report_keyboard_t and computes REPORT_SIZE defines */ -#include "report.h" +// #include "report.h" /* extern report_keyboard_t keyboard_report_sent; */ @@ -80,7 +80,7 @@ void nkro_in_cb(USBDriver *usbp, usbep_t ep); #define MOUSE_INTERFACE 1 #define MOUSE_ENDPOINT 2 -#define MOUSE_SIZE 8 +#define MOUSE_EPSIZE 8 /* mouse IN request callback handler */ void mouse_in_cb(USBDriver *usbp, usbep_t ep); @@ -95,7 +95,7 @@ void mouse_in_cb(USBDriver *usbp, usbep_t ep); #define EXTRA_INTERFACE 3 #define EXTRA_ENDPOINT 4 -#define EXTRA_SIZE 8 +#define EXTRA_EPSIZE 8 /* extrakey IN request callback handler */ void extra_in_cb(USBDriver *usbp, usbep_t ep); @@ -116,11 +116,11 @@ typedef struct { #define CONSOLE_INTERFACE 2 #define CONSOLE_ENDPOINT 3 -#define CONSOLE_SIZE 16 +#define CONSOLE_EPSIZE 16 /* Number of IN reports that can be stored inside the output queue */ #define CONSOLE_QUEUE_CAPACITY 2 -#define CONSOLE_QUEUE_BUFFER_SIZE (CONSOLE_QUEUE_CAPACITY * CONSOLE_SIZE) +#define CONSOLE_QUEUE_BUFFER_SIZE (CONSOLE_QUEUE_CAPACITY * CONSOLE_EPSIZE) /* Console flush time */ #define CONSOLE_FLUSH_MS 50 @@ -138,15 +138,4 @@ void console_in_cb(USBDriver *usbp, usbep_t ep); void sendchar_pf(void *p, char c); -/* --------------------------- - * Host driver functions (TMK) - * --------------------------- - */ - -uint8_t keyboard_leds(void); -void send_keyboard(report_keyboard_t *report); -void send_mouse(report_mouse_t *report); -void send_system(uint16_t data); -void send_consumer(uint16_t data); - #endif /* _USB_MAIN_H_ */ -- 2.39.3