diff options
Diffstat (limited to 'tmk_core/protocol/chibios')
-rw-r--r-- | tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h | 8 | ||||
-rw-r--r-- | tmk_core/protocol/chibios/main.c | 180 | ||||
-rw-r--r-- | tmk_core/protocol/chibios/usb_driver.c | 435 | ||||
-rw-r--r-- | tmk_core/protocol/chibios/usb_driver.h | 168 | ||||
-rw-r--r-- | tmk_core/protocol/chibios/usb_main.c | 1048 | ||||
-rw-r--r-- | tmk_core/protocol/chibios/usb_main.h | 7 |
6 files changed, 873 insertions, 973 deletions
diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h index a5374d820c..f59c8d1dda 100644 --- a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h +++ b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h @@ -2,7 +2,7 @@ #include "stddef.h" #include "inttypes.h" -#define ATTR_PACKED __attribute__ ((packed)) +#define ATTR_PACKED __attribute__((packed)) /** Concatenates the given input into a single token, via the C Preprocessor. * * \param[in] x First item to concatenate. @@ -10,7 +10,7 @@ * * \return Concatenated version of the input. */ -#define CONCAT(x, y) x ## y +#define CONCAT(x, y) x##y /** CConcatenates the given input into a single token after macro expansion, via the C Preprocessor. * @@ -19,8 +19,8 @@ * * \return Concatenated version of the expanded input. */ -#define CONCAT_EXPANDED(x, y) CONCAT(x, y) -#define CPU_TO_LE16(x) (x) +#define CONCAT_EXPANDED(x, y) CONCAT(x, y) +#define CPU_TO_LE16(x) (x) // We don't need anything from the following files, or we have defined it already #define __LUFA_COMMON_H__ diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index 8de55bfe3f..de2b493b84 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -33,19 +33,19 @@ #include "debug.h" #include "printf.h" #ifdef SLEEP_LED_ENABLE -#include "sleep_led.h" +# include "sleep_led.h" #endif #ifdef SERIAL_LINK_ENABLE -#include "serial_link/system/serial_link.h" +# include "serial_link/system/serial_link.h" #endif #ifdef VISUALIZER_ENABLE -#include "visualizer/visualizer.h" +# include "visualizer/visualizer.h" #endif #ifdef MIDI_ENABLE -#include "qmk_midi.h" +# include "qmk_midi.h" #endif #ifdef STM32_EEPROM_ENABLE -#include "eeprom_stm32.h" +# include "eeprom_stm32.h" #endif #include "suspend.h" #include "wait.h" @@ -57,19 +57,13 @@ /* 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); +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, - send_mouse, - send_system, - send_consumer -}; +host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer}; #ifdef VIRTSER_ENABLE void virtser_task(void); @@ -103,127 +97,123 @@ void console_task(void); // } // } - - /* Main thread */ int main(void) { - /* ChibiOS/RT init */ - halInit(); - chSysInit(); + /* ChibiOS/RT init */ + halInit(); + chSysInit(); #ifdef STM32_EEPROM_ENABLE - EEPROM_Init(); + EEPROM_Init(); #endif - // TESTING - // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); + // TESTING + // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - keyboard_setup(); + keyboard_setup(); - /* Init USB */ - init_usb_driver(&USB_DRIVER); + /* Init USB */ + init_usb_driver(&USB_DRIVER); - /* init printf */ - init_printf(NULL,sendchar_pf); + /* init printf */ + init_printf(NULL, sendchar_pf); #ifdef MIDI_ENABLE - setup_midi(); + setup_midi(); #endif #ifdef SERIAL_LINK_ENABLE - init_serial_link(); + init_serial_link(); #endif #ifdef VISUALIZER_ENABLE - visualizer_init(); + visualizer_init(); #endif + host_driver_t *driver = NULL; - host_driver_t* driver = NULL; - - /* Wait until the USB or serial link is active */ - while (true) { + /* Wait until the USB or serial link is active */ + while (true) { #if defined(WAIT_FOR_USB) || defined(SERIAL_LINK_ENABLE) - if(USB_DRIVER.state == USB_ACTIVE) { - driver = &chibios_driver; - break; - } + if (USB_DRIVER.state == USB_ACTIVE) { + driver = &chibios_driver; + break; + } #else - driver = &chibios_driver; - break; + driver = &chibios_driver; + break; #endif #ifdef SERIAL_LINK_ENABLE - if(is_serial_link_connected()) { - driver = get_serial_link_driver(); - break; - } - serial_link_update(); + if (is_serial_link_connected()) { + driver = get_serial_link_driver(); + break; + } + serial_link_update(); #endif - wait_ms(50); - } + wait_ms(50); + } - /* Do need to wait here! - * Otherwise the next print might start a transfer on console EP - * before the USB is completely ready, which sometimes causes - * HardFaults. - */ - wait_ms(50); + /* Do need to wait here! + * Otherwise the next print might start a transfer on console EP + * before the USB is completely ready, which sometimes causes + * HardFaults. + */ + wait_ms(50); - print("USB configured.\n"); + print("USB configured.\n"); - /* init TMK modules */ - keyboard_init(); - host_set_driver(driver); + /* init TMK modules */ + keyboard_init(); + host_set_driver(driver); #ifdef SLEEP_LED_ENABLE - sleep_led_init(); + sleep_led_init(); #endif - print("Keyboard start.\n"); - - /* Main loop */ - while(true) { + print("Keyboard start.\n"); + /* Main loop */ + while (true) { #if !defined(NO_USB_STARTUP_CHECK) - if(USB_DRIVER.state == USB_SUSPENDED) { - print("[s]"); -#ifdef VISUALIZER_ENABLE - visualizer_suspend(); -#endif - while(USB_DRIVER.state == USB_SUSPENDED) { - /* Do this in the suspended state */ -#ifdef SERIAL_LINK_ENABLE - serial_link_update(); -#endif - suspend_power_down(); // on AVR this deep sleeps for 15ms - /* Remote wakeup */ - if(suspend_wakeup_condition()) { - usbWakeupHost(&USB_DRIVER); + if (USB_DRIVER.state == USB_SUSPENDED) { + print("[s]"); +# ifdef VISUALIZER_ENABLE + visualizer_suspend(); +# endif + while (USB_DRIVER.state == USB_SUSPENDED) { + /* Do this in the suspended state */ +# ifdef SERIAL_LINK_ENABLE + serial_link_update(); +# endif + suspend_power_down(); // on AVR this deep sleeps for 15ms + /* Remote wakeup */ + if (suspend_wakeup_condition()) { + usbWakeupHost(&USB_DRIVER); + } + } + /* Woken up */ + // variables has been already cleared by the wakeup hook + send_keyboard_report(); +# ifdef MOUSEKEY_ENABLE + mousekey_send(); +# endif /* MOUSEKEY_ENABLE */ + +# ifdef VISUALIZER_ENABLE + visualizer_resume(); +# endif } - } - /* Woken up */ - // variables has been already cleared by the wakeup hook - send_keyboard_report(); -#ifdef MOUSEKEY_ENABLE - mousekey_send(); -#endif /* MOUSEKEY_ENABLE */ - -#ifdef VISUALIZER_ENABLE - visualizer_resume(); -#endif - } #endif - keyboard_task(); + keyboard_task(); #ifdef CONSOLE_ENABLE - console_task(); + console_task(); #endif #ifdef VIRTSER_ENABLE - virtser_task(); + virtser_task(); #endif #ifdef RAW_ENABLE - raw_hid_task(); + raw_hid_task(); #endif - } + } } diff --git a/tmk_core/protocol/chibios/usb_driver.c b/tmk_core/protocol/chibios/usb_driver.c index fe535eeb3a..28a8c66635 100644 --- a/tmk_core/protocol/chibios/usb_driver.c +++ b/tmk_core/protocol/chibios/usb_driver.c @@ -41,93 +41,62 @@ /* * Current Line Coding. */ -static cdc_linecoding_t linecoding = { - {0x00, 0x96, 0x00, 0x00}, /* 38400. */ - LC_STOP_1, LC_PARITY_NONE, 8 -}; +static cdc_linecoding_t linecoding = {{0x00, 0x96, 0x00, 0x00}, /* 38400. */ + LC_STOP_1, + LC_PARITY_NONE, + 8}; /*===========================================================================*/ /* Driver local functions. */ /*===========================================================================*/ static bool qmkusb_start_receive(QMKUSBDriver *qmkusbp) { - uint8_t *buf; - - /* If the USB driver is not in the appropriate state then transactions - must not be started.*/ - if ((usbGetDriverStateI(qmkusbp->config->usbp) != USB_ACTIVE) || - (qmkusbp->state != QMKUSB_READY)) { - return true; - } - - /* Checking if there is already a transaction ongoing on the endpoint.*/ - if (usbGetReceiveStatusI(qmkusbp->config->usbp, qmkusbp->config->bulk_in)) { - return true; - } - - /* Checking if there is a buffer ready for incoming data.*/ - buf = ibqGetEmptyBufferI(&qmkusbp->ibqueue); - if (buf == NULL) { - return true; - } - - /* Buffer found, starting a new transaction.*/ - usbStartReceiveI(qmkusbp->config->usbp, qmkusbp->config->bulk_out, - buf, qmkusbp->ibqueue.bsize - sizeof(size_t)); - - return false; -} - -/* - * Interface implementation. - */ - -static size_t _write(void *ip, const uint8_t *bp, size_t n) { + uint8_t *buf; - return obqWriteTimeout(&((QMKUSBDriver *)ip)->obqueue, bp, - n, TIME_INFINITE); -} + /* If the USB driver is not in the appropriate state then transactions + must not be started.*/ + if ((usbGetDriverStateI(qmkusbp->config->usbp) != USB_ACTIVE) || (qmkusbp->state != QMKUSB_READY)) { + return true; + } -static size_t _read(void *ip, uint8_t *bp, size_t n) { + /* Checking if there is already a transaction ongoing on the endpoint.*/ + if (usbGetReceiveStatusI(qmkusbp->config->usbp, qmkusbp->config->bulk_in)) { + return true; + } - return ibqReadTimeout(&((QMKUSBDriver *)ip)->ibqueue, bp, - n, TIME_INFINITE); -} + /* Checking if there is a buffer ready for incoming data.*/ + buf = ibqGetEmptyBufferI(&qmkusbp->ibqueue); + if (buf == NULL) { + return true; + } -static msg_t _put(void *ip, uint8_t b) { + /* Buffer found, starting a new transaction.*/ + usbStartReceiveI(qmkusbp->config->usbp, qmkusbp->config->bulk_out, buf, qmkusbp->ibqueue.bsize - sizeof(size_t)); - return obqPutTimeout(&((QMKUSBDriver *)ip)->obqueue, b, TIME_INFINITE); + return false; } -static msg_t _get(void *ip) { - - return ibqGetTimeout(&((QMKUSBDriver *)ip)->ibqueue, TIME_INFINITE); -} +/* + * Interface implementation. + */ -static msg_t _putt(void *ip, uint8_t b, systime_t timeout) { +static size_t _write(void *ip, const uint8_t *bp, size_t n) { return obqWriteTimeout(&((QMKUSBDriver *)ip)->obqueue, bp, n, TIME_INFINITE); } - return obqPutTimeout(&((QMKUSBDriver *)ip)->obqueue, b, timeout); -} +static size_t _read(void *ip, uint8_t *bp, size_t n) { return ibqReadTimeout(&((QMKUSBDriver *)ip)->ibqueue, bp, n, TIME_INFINITE); } -static msg_t _gett(void *ip, systime_t timeout) { +static msg_t _put(void *ip, uint8_t b) { return obqPutTimeout(&((QMKUSBDriver *)ip)->obqueue, b, TIME_INFINITE); } - return ibqGetTimeout(&((QMKUSBDriver *)ip)->ibqueue, timeout); -} +static msg_t _get(void *ip) { return ibqGetTimeout(&((QMKUSBDriver *)ip)->ibqueue, TIME_INFINITE); } -static size_t _writet(void *ip, const uint8_t *bp, size_t n, systime_t timeout) { +static msg_t _putt(void *ip, uint8_t b, systime_t timeout) { return obqPutTimeout(&((QMKUSBDriver *)ip)->obqueue, b, timeout); } - return obqWriteTimeout(&((QMKUSBDriver *)ip)->obqueue, bp, n, timeout); -} +static msg_t _gett(void *ip, systime_t timeout) { return ibqGetTimeout(&((QMKUSBDriver *)ip)->ibqueue, timeout); } -static size_t _readt(void *ip, uint8_t *bp, size_t n, systime_t timeout) { +static size_t _writet(void *ip, const uint8_t *bp, size_t n, systime_t timeout) { return obqWriteTimeout(&((QMKUSBDriver *)ip)->obqueue, bp, n, timeout); } - return ibqReadTimeout(&((QMKUSBDriver *)ip)->ibqueue, bp, n, timeout); -} +static size_t _readt(void *ip, uint8_t *bp, size_t n, systime_t timeout) { return ibqReadTimeout(&((QMKUSBDriver *)ip)->ibqueue, bp, n, timeout); } -static const struct QMKUSBDriverVMT vmt = { - _write, _read, _put, _get, - _putt, _gett, _writet, _readt -}; +static const struct QMKUSBDriverVMT vmt = {_write, _read, _put, _get, _putt, _gett, _writet, _readt}; /** * @brief Notification of empty buffer released into the input buffers queue. @@ -135,8 +104,8 @@ static const struct QMKUSBDriverVMT vmt = { * @param[in] bqp the buffers queue pointer. */ static void ibnotify(io_buffers_queue_t *bqp) { - QMKUSBDriver *qmkusbp = bqGetLinkX(bqp); - (void) qmkusb_start_receive(qmkusbp); + QMKUSBDriver *qmkusbp = bqGetLinkX(bqp); + (void)qmkusb_start_receive(qmkusbp); } /** @@ -145,25 +114,24 @@ static void ibnotify(io_buffers_queue_t *bqp) { * @param[in] bqp the buffers queue pointer. */ static void obnotify(io_buffers_queue_t *bqp) { - size_t n; - QMKUSBDriver *qmkusbp = bqGetLinkX(bqp); - - /* If the USB driver is not in the appropriate state then transactions - must not be started.*/ - if ((usbGetDriverStateI(qmkusbp->config->usbp) != USB_ACTIVE) || - (qmkusbp->state != QMKUSB_READY)) { - return; - } - - /* Checking if there is already a transaction ongoing on the endpoint.*/ - if (!usbGetTransmitStatusI(qmkusbp->config->usbp, qmkusbp->config->bulk_in)) { - /* Trying to get a full buffer.*/ - uint8_t *buf = obqGetFullBufferI(&qmkusbp->obqueue, &n); - if (buf != NULL) { - /* Buffer found, starting a new transaction.*/ - usbStartTransmitI(qmkusbp->config->usbp, qmkusbp->config->bulk_in, buf, n); + size_t n; + QMKUSBDriver *qmkusbp = bqGetLinkX(bqp); + + /* If the USB driver is not in the appropriate state then transactions + must not be started.*/ + if ((usbGetDriverStateI(qmkusbp->config->usbp) != USB_ACTIVE) || (qmkusbp->state != QMKUSB_READY)) { + return; + } + + /* Checking if there is already a transaction ongoing on the endpoint.*/ + if (!usbGetTransmitStatusI(qmkusbp->config->usbp, qmkusbp->config->bulk_in)) { + /* Trying to get a full buffer.*/ + uint8_t *buf = obqGetFullBufferI(&qmkusbp->obqueue, &n); + if (buf != NULL) { + /* Buffer found, starting a new transaction.*/ + usbStartTransmitI(qmkusbp->config->usbp, qmkusbp->config->bulk_in, buf, n); + } } - } } /*===========================================================================*/ @@ -177,8 +145,7 @@ static void obnotify(io_buffers_queue_t *bqp) { * * @init */ -void qmkusbInit(void) { -} +void qmkusbInit(void) {} /** * @brief Initializes a generic full duplex driver object. @@ -190,17 +157,12 @@ void qmkusbInit(void) { * @init */ void qmkusbObjectInit(QMKUSBDriver *qmkusbp, const QMKUSBConfig *config) { - - qmkusbp->vmt = &vmt; - osalEventObjectInit(&qmkusbp->event); - qmkusbp->state = QMKUSB_STOP; - // Note that the config uses the USB direction naming - ibqObjectInit(&qmkusbp->ibqueue, true, config->ob, - config->out_size, config->out_buffers, - ibnotify, qmkusbp); - obqObjectInit(&qmkusbp->obqueue, true, config->ib, - config->in_size, config->in_buffers, - obnotify, qmkusbp); + qmkusbp->vmt = &vmt; + osalEventObjectInit(&qmkusbp->event); + qmkusbp->state = QMKUSB_STOP; + // Note that the config uses the USB direction naming + ibqObjectInit(&qmkusbp->ibqueue, true, config->ob, config->out_size, config->out_buffers, ibnotify, qmkusbp); + obqObjectInit(&qmkusbp->obqueue, true, config->ib, config->in_size, config->in_buffers, obnotify, qmkusbp); } /** @@ -212,21 +174,20 @@ void qmkusbObjectInit(QMKUSBDriver *qmkusbp, const QMKUSBConfig *config) { * @api */ void qmkusbStart(QMKUSBDriver *qmkusbp, const QMKUSBConfig *config) { - USBDriver *usbp = config->usbp; - - osalDbgCheck(qmkusbp != NULL); - - osalSysLock(); - osalDbgAssert((qmkusbp->state == QMKUSB_STOP) || (qmkusbp->state == QMKUSB_READY), - "invalid state"); - usbp->in_params[config->bulk_in - 1U] = qmkusbp; - usbp->out_params[config->bulk_out - 1U] = qmkusbp; - if (config->int_in > 0U) { - usbp->in_params[config->int_in - 1U] = qmkusbp; - } - qmkusbp->config = config; - qmkusbp->state = QMKUSB_READY; - osalSysUnlock(); + USBDriver *usbp = config->usbp; + + osalDbgCheck(qmkusbp != NULL); + + osalSysLock(); + osalDbgAssert((qmkusbp->state == QMKUSB_STOP) || (qmkusbp->state == QMKUSB_READY), "invalid state"); + usbp->in_params[config->bulk_in - 1U] = qmkusbp; + usbp->out_params[config->bulk_out - 1U] = qmkusbp; + if (config->int_in > 0U) { + usbp->in_params[config->int_in - 1U] = qmkusbp; + } + qmkusbp->config = config; + qmkusbp->state = QMKUSB_READY; + osalSysUnlock(); } /** @@ -239,31 +200,30 @@ void qmkusbStart(QMKUSBDriver *qmkusbp, const QMKUSBConfig *config) { * @api */ void qmkusbStop(QMKUSBDriver *qmkusbp) { - USBDriver *usbp = qmkusbp->config->usbp; + USBDriver *usbp = qmkusbp->config->usbp; - osalDbgCheck(qmkusbp != NULL); + osalDbgCheck(qmkusbp != NULL); - osalSysLock(); + osalSysLock(); - osalDbgAssert((qmkusbp->state == QMKUSB_STOP) || (qmkusbp->state == QMKUSB_READY), - "invalid state"); + osalDbgAssert((qmkusbp->state == QMKUSB_STOP) || (qmkusbp->state == QMKUSB_READY), "invalid state"); - /* Driver in stopped state.*/ - usbp->in_params[qmkusbp->config->bulk_in - 1U] = NULL; - usbp->out_params[qmkusbp->config->bulk_out - 1U] = NULL; - if (qmkusbp->config->int_in > 0U) { - usbp->in_params[qmkusbp->config->int_in - 1U] = NULL; - } - qmkusbp->config = NULL; - qmkusbp->state = QMKUSB_STOP; + /* Driver in stopped state.*/ + usbp->in_params[qmkusbp->config->bulk_in - 1U] = NULL; + usbp->out_params[qmkusbp->config->bulk_out - 1U] = NULL; + if (qmkusbp->config->int_in > 0U) { + usbp->in_params[qmkusbp->config->int_in - 1U] = NULL; + } + qmkusbp->config = NULL; + qmkusbp->state = QMKUSB_STOP; - /* Enforces a disconnection.*/ - chnAddFlagsI(qmkusbp, CHN_DISCONNECTED); - ibqResetI(&qmkusbp->ibqueue); - obqResetI(&qmkusbp->obqueue); - osalOsRescheduleS(); + /* Enforces a disconnection.*/ + chnAddFlagsI(qmkusbp, CHN_DISCONNECTED); + ibqResetI(&qmkusbp->ibqueue); + obqResetI(&qmkusbp->obqueue); + osalOsRescheduleS(); - osalSysUnlock(); + osalSysUnlock(); } /** @@ -279,10 +239,9 @@ void qmkusbStop(QMKUSBDriver *qmkusbp) { * @iclass */ void qmkusbSuspendHookI(QMKUSBDriver *qmkusbp) { - - chnAddFlagsI(qmkusbp, CHN_DISCONNECTED); - bqSuspendI(&qmkusbp->ibqueue); - bqSuspendI(&qmkusbp->obqueue); + chnAddFlagsI(qmkusbp, CHN_DISCONNECTED); + bqSuspendI(&qmkusbp->ibqueue); + bqSuspendI(&qmkusbp->obqueue); } /** @@ -298,10 +257,9 @@ void qmkusbSuspendHookI(QMKUSBDriver *qmkusbp) { * @iclass */ void qmkusbWakeupHookI(QMKUSBDriver *qmkusbp) { - - chnAddFlagsI(qmkusbp, CHN_CONNECTED); - bqResumeX(&qmkusbp->ibqueue); - bqResumeX(&qmkusbp->obqueue); + chnAddFlagsI(qmkusbp, CHN_CONNECTED); + bqResumeX(&qmkusbp->ibqueue); + bqResumeX(&qmkusbp->obqueue); } /** @@ -312,13 +270,12 @@ void qmkusbWakeupHookI(QMKUSBDriver *qmkusbp) { * @iclass */ void qmkusbConfigureHookI(QMKUSBDriver *qmkusbp) { - - ibqResetI(&qmkusbp->ibqueue); - bqResumeX(&qmkusbp->ibqueue); - obqResetI(&qmkusbp->obqueue); - bqResumeX(&qmkusbp->obqueue); - chnAddFlagsI(qmkusbp, CHN_CONNECTED); - (void) qmkusb_start_receive(qmkusbp); + ibqResetI(&qmkusbp->ibqueue); + bqResumeX(&qmkusbp->ibqueue); + obqResetI(&qmkusbp->obqueue); + bqResumeX(&qmkusbp->obqueue); + chnAddFlagsI(qmkusbp, CHN_CONNECTED); + (void)qmkusb_start_receive(qmkusbp); } /** @@ -337,24 +294,23 @@ void qmkusbConfigureHookI(QMKUSBDriver *qmkusbp) { * @retval false Message not handled. */ bool qmkusbRequestsHook(USBDriver *usbp) { - - if ((usbp->setup[0] & USB_RTYPE_TYPE_MASK) == USB_RTYPE_TYPE_CLASS) { - switch (usbp->setup[1]) { - case CDC_GET_LINE_CODING: - usbSetupTransfer(usbp, (uint8_t *)&linecoding, sizeof(linecoding), NULL); - return true; - case CDC_SET_LINE_CODING: - usbSetupTransfer(usbp, (uint8_t *)&linecoding, sizeof(linecoding), NULL); - return true; - case CDC_SET_CONTROL_LINE_STATE: - /* Nothing to do, there are no control lines.*/ - usbSetupTransfer(usbp, NULL, 0, NULL); - return true; - default: - return false; + if ((usbp->setup[0] & USB_RTYPE_TYPE_MASK) == USB_RTYPE_TYPE_CLASS) { + switch (usbp->setup[1]) { + case CDC_GET_LINE_CODING: + usbSetupTransfer(usbp, (uint8_t *)&linecoding, sizeof(linecoding), NULL); + return true; + case CDC_SET_LINE_CODING: + usbSetupTransfer(usbp, (uint8_t *)&linecoding, sizeof(linecoding), NULL); + return true; + case CDC_SET_CONTROL_LINE_STATE: + /* Nothing to do, there are no control lines.*/ + usbSetupTransfer(usbp, NULL, 0, NULL); + return true; + default: + return false; + } } - } - return false; + return false; } /** @@ -367,36 +323,34 @@ bool qmkusbRequestsHook(USBDriver *usbp) { * @iclass */ void qmkusbSOFHookI(QMKUSBDriver *qmkusbp) { + /* If the USB driver is not in the appropriate state then transactions + must not be started.*/ + if ((usbGetDriverStateI(qmkusbp->config->usbp) != USB_ACTIVE) || (qmkusbp->state != QMKUSB_READY)) { + return; + } - /* If the USB driver is not in the appropriate state then transactions - must not be started.*/ - if ((usbGetDriverStateI(qmkusbp->config->usbp) != USB_ACTIVE) || - (qmkusbp->state != QMKUSB_READY)) { - return; - } - - /* If there is already a transaction ongoing then another one cannot be - started.*/ - if (usbGetTransmitStatusI(qmkusbp->config->usbp, qmkusbp->config->bulk_in)) { - return; - } - - /* Checking if there only a buffer partially filled, if so then it is - enforced in the queue and transmitted.*/ - if (obqTryFlushI(&qmkusbp->obqueue)) { - size_t n; - uint8_t *buf = obqGetFullBufferI(&qmkusbp->obqueue, &n); - - /* For fixed size drivers, fill the end with zeros */ - if (qmkusbp->config->fixed_size) { - memset(buf + n, 0, qmkusbp->config->in_size - n); - n = qmkusbp->config->in_size; + /* If there is already a transaction ongoing then another one cannot be + started.*/ + if (usbGetTransmitStatusI(qmkusbp->config->usbp, qmkusbp->config->bulk_in)) { + return; } - osalDbgAssert(buf != NULL, "queue is empty"); + /* Checking if there only a buffer partially filled, if so then it is + enforced in the queue and transmitted.*/ + if (obqTryFlushI(&qmkusbp->obqueue)) { + size_t n; + uint8_t *buf = obqGetFullBufferI(&qmkusbp->obqueue, &n); - usbStartTransmitI(qmkusbp->config->usbp, qmkusbp->config->bulk_in, buf, n); - } + /* For fixed size drivers, fill the end with zeros */ + if (qmkusbp->config->fixed_size) { + memset(buf + n, 0, qmkusbp->config->in_size - n); + n = qmkusbp->config->in_size; + } + + osalDbgAssert(buf != NULL, "queue is empty"); + + usbStartTransmitI(qmkusbp->config->usbp, qmkusbp->config->bulk_in, buf, n); + } } /** @@ -408,49 +362,45 @@ void qmkusbSOFHookI(QMKUSBDriver *qmkusbp) { * @param[in] ep IN endpoint number */ void qmkusbDataTransmitted(USBDriver *usbp, usbep_t ep) { - uint8_t *buf; - size_t n; - QMKUSBDriver *qmkusbp = usbp->in_params[ep - 1U]; + uint8_t * buf; + size_t n; + QMKUSBDriver *qmkusbp = usbp->in_params[ep - 1U]; - if (qmkusbp == NULL) { - return; - } + if (qmkusbp == NULL) { + return; + } - osalSysLockFromISR(); + osalSysLockFromISR(); - /* Signaling that space is available in the output queue.*/ - chnAddFlagsI(qmkusbp, CHN_OUTPUT_EMPTY); + /* Signaling that space is available in the output queue.*/ + chnAddFlagsI(qmkusbp, CHN_OUTPUT_EMPTY); - /* Freeing the buffer just transmitted, if it was not a zero size packet.*/ - if (usbp->epc[ep]->in_state->txsize > 0U) { - obqReleaseEmptyBufferI(&qmkusbp->obqueue); - } + /* Freeing the buffer just transmitted, if it was not a zero size packet.*/ + if (usbp->epc[ep]->in_state->txsize > 0U) { + obqReleaseEmptyBufferI(&qmkusbp->obqueue); + } - /* Checking if there is a buffer ready for transmission.*/ - buf = obqGetFullBufferI(&qmkusbp->obqueue, &n); + /* Checking if there is a buffer ready for transmission.*/ + buf = obqGetFullBufferI(&qmkusbp->obqueue, &n); - if (buf != NULL) { - /* The endpoint cannot be busy, we are in the context of the callback, - so it is safe to transmit without a check.*/ - usbStartTransmitI(usbp, ep, buf, n); - } - else if ((usbp->epc[ep]->in_state->txsize > 0U) && - ((usbp->epc[ep]->in_state->txsize & - ((size_t)usbp->epc[ep]->in_maxsize - 1U)) == 0U)) { - /* Transmit zero sized packet in case the last one has maximum allowed - size. Otherwise the recipient may expect more data coming soon and - not return buffered data to app. See section 5.8.3 Bulk Transfer - Packet Size Constraints of the USB Specification document.*/ - if (!qmkusbp->config->fixed_size) { - usbStartTransmitI(usbp, ep, usbp->setup, 0); + if (buf != NULL) { + /* The endpoint cannot be busy, we are in the context of the callback, + so it is safe to transmit without a check.*/ + usbStartTransmitI(usbp, ep, buf, n); + } else if ((usbp->epc[ep]->in_state->txsize > 0U) && ((usbp->epc[ep]->in_state->txsize & ((size_t)usbp->epc[ep]->in_maxsize - 1U)) == 0U)) { + /* Transmit zero sized packet in case the last one has maximum allowed + size. Otherwise the recipient may expect more data coming soon and + not return buffered data to app. See section 5.8.3 Bulk Transfer + Packet Size Constraints of the USB Specification document.*/ + if (!qmkusbp->config->fixed_size) { + usbStartTransmitI(usbp, ep, usbp->setup, 0); + } + + } else { + /* Nothing to transmit.*/ } - } - else { - /* Nothing to transmit.*/ - } - - osalSysUnlockFromISR(); + osalSysUnlockFromISR(); } /** @@ -462,27 +412,25 @@ void qmkusbDataTransmitted(USBDriver *usbp, usbep_t ep) { * @param[in] ep OUT endpoint number */ void qmkusbDataReceived(USBDriver *usbp, usbep_t ep) { - QMKUSBDriver *qmkusbp = usbp->out_params[ep - 1U]; - if (qmkusbp == NULL) { - return; - } + QMKUSBDriver *qmkusbp = usbp->out_params[ep - 1U]; + if (qmkusbp == NULL) { + return; + } - osalSysLockFromISR(); + osalSysLockFromISR(); - /* Signaling that data is available in the input queue.*/ - chnAddFlagsI(qmkusbp, CHN_INPUT_AVAILABLE); + /* Signaling that data is available in the input queue.*/ + chnAddFlagsI(qmkusbp, CHN_INPUT_AVAILABLE); - /* Posting the filled buffer in the queue.*/ - ibqPostFullBufferI(&qmkusbp->ibqueue, - usbGetReceiveTransactionSizeX(qmkusbp->config->usbp, - qmkusbp->config->bulk_out)); + /* Posting the filled buffer in the queue.*/ + ibqPostFullBufferI(&qmkusbp->ibqueue, usbGetReceiveTransactionSizeX(qmkusbp->config->usbp, qmkusbp->config->bulk_out)); - /* The endpoint cannot be busy, we are in the context of the callback, - so a packet is in the buffer for sure. Trying to get a free buffer - for the next transaction.*/ - (void) qmkusb_start_receive(qmkusbp); + /* The endpoint cannot be busy, we are in the context of the callback, + so a packet is in the buffer for sure. Trying to get a free buffer + for the next transaction.*/ + (void)qmkusb_start_receive(qmkusbp); - osalSysUnlockFromISR(); + osalSysUnlockFromISR(); } /** @@ -494,9 +442,8 @@ void qmkusbDataReceived(USBDriver *usbp, usbep_t ep) { * @param[in] ep endpoint number */ void qmkusbInterruptTransmitted(USBDriver *usbp, usbep_t ep) { - - (void)usbp; - (void)ep; + (void)usbp; + (void)ep; } /** @} */ diff --git a/tmk_core/protocol/chibios/usb_driver.h b/tmk_core/protocol/chibios/usb_driver.h index 558479e197..77dff80669 100644 --- a/tmk_core/protocol/chibios/usb_driver.h +++ b/tmk_core/protocol/chibios/usb_driver.h @@ -23,9 +23,9 @@ */ #ifndef USB_DRIVER_H -#define USB_DRIVER_H +# define USB_DRIVER_H -#include "hal_usb_cdc.h" +# include "hal_usb_cdc.h" /*===========================================================================*/ /* Driver constants. */ @@ -35,9 +35,9 @@ /* Derived constants and error checks. */ /*===========================================================================*/ -#if HAL_USE_USB == FALSE -#error "The USB Driver requires HAL_USE_USB" -#endif +# if HAL_USE_USB == FALSE +# error "The USB Driver requires HAL_USE_USB" +# endif /*===========================================================================*/ /* Driver data structures and types. */ @@ -47,9 +47,9 @@ * @brief Driver state machine possible states. */ typedef enum { - QMKUSB_UNINIT = 0, /**< Not initialized. */ - QMKUSB_STOP = 1, /**< Stopped. */ - QMKUSB_READY = 2 /**< Ready. */ + QMKUSB_UNINIT = 0, /**< Not initialized. */ + QMKUSB_STOP = 1, /**< Stopped. */ + QMKUSB_READY = 2 /**< Ready. */ } qmkusbstate_t; /** @@ -63,72 +63,70 @@ typedef struct QMKUSBDriver QMKUSBDriver; * in order to configure and start the driver operations. */ typedef struct { - /** - * @brief USB driver to use. - */ - USBDriver *usbp; - /** - * @brief Bulk IN endpoint used for outgoing data transfer. - */ - usbep_t bulk_in; - /** - * @brief Bulk OUT endpoint used for incoming data transfer. - */ - usbep_t bulk_out; - /** - * @brief Interrupt IN endpoint used for notifications. - * @note If set to zero then the INT endpoint is assumed to be not - * present, USB descriptors must be changed accordingly. - */ - usbep_t int_in; - - /** - * @brief The number of buffers in the queues - */ - size_t in_buffers; - size_t out_buffers; - - /** - * @brief The size of each buffer in the queue, typically the same as the endpoint size - */ - size_t in_size; - size_t out_size; - - /** - * @brief Always send full buffers in_size (the rest is filled with zeroes) - */ - bool fixed_size; - - /* Input buffer - * @note needs to be initialized with a memory buffer of the right size - */ - uint8_t* ib; - /* Output buffer - * @note needs to be initialized with a memory buffer of the right size - */ - uint8_t* ob; + /** + * @brief USB driver to use. + */ + USBDriver *usbp; + /** + * @brief Bulk IN endpoint used for outgoing data transfer. + */ + usbep_t bulk_in; + /** + * @brief Bulk OUT endpoint used for incoming data transfer. + */ + usbep_t bulk_out; + /** + * @brief Interrupt IN endpoint used for notifications. + * @note If set to zero then the INT endpoint is assumed to be not + * present, USB descriptors must be changed accordingly. + */ + usbep_t int_in; + + /** + * @brief The number of buffers in the queues + */ + size_t in_buffers; + size_t out_buffers; + + /** + * @brief The size of each buffer in the queue, typically the same as the endpoint size + */ + size_t in_size; + size_t out_size; + + /** + * @brief Always send full buffers in_size (the rest is filled with zeroes) + */ + bool fixed_size; + + /* Input buffer + * @note needs to be initialized with a memory buffer of the right size + */ + uint8_t *ib; + /* Output buffer + * @note needs to be initialized with a memory buffer of the right size + */ + uint8_t *ob; } QMKUSBConfig; /** |