summaryrefslogtreecommitdiff
path: root/tmk_core/protocol/chibios
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/protocol/chibios')
-rw-r--r--tmk_core/protocol/chibios/chibios.c7
-rw-r--r--tmk_core/protocol/chibios/usb_main.c247
-rw-r--r--tmk_core/protocol/chibios/usb_main.h44
-rw-r--r--tmk_core/protocol/chibios/usb_util.c6
4 files changed, 104 insertions, 200 deletions
diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c
index c9a480c325..10a976608a 100644
--- a/tmk_core/protocol/chibios/chibios.c
+++ b/tmk_core/protocol/chibios/chibios.c
@@ -58,13 +58,10 @@
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_programmable_button(uint32_t data);
-void send_digitizer(report_digitizer_t *report);
+void send_extra(report_extra_t *report);
/* host struct */
-host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_programmable_button};
+host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_extra};
#ifdef VIRTSER_ENABLE
void virtser_task(void);
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c
index eb9ef82554..fb3d575846 100644
--- a/tmk_core/protocol/chibios/usb_main.c
+++ b/tmk_core/protocol/chibios/usb_main.c
@@ -50,10 +50,6 @@
extern keymap_config_t keymap_config;
#endif
-#ifdef JOYSTICK_ENABLE
-# include "joystick.h"
-#endif
-
/* ---------------------------------------------------------
* Global interface variables and declarations
* ---------------------------------------------------------
@@ -124,6 +120,16 @@ static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype
return &desc;
}
+/*
+ * USB notification callback that does nothing. Needed to work around bugs in
+ * some USB LLDs that fail to resume the waiting thread when the notification
+ * callback pointer is NULL.
+ */
+static void dummy_usb_cb(USBDriver *usbp, usbep_t ep) {
+ (void)usbp;
+ (void)ep;
+}
+
#ifndef KEYBOARD_SHARED_EP
/* keyboard endpoint state structure */
static USBInEndpointState kbd_ep_state;
@@ -131,7 +137,7 @@ static USBInEndpointState kbd_ep_state;
static const USBEndpointConfig kbd_ep_config = {
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
NULL, /* SETUP packet notification callback */
- kbd_in_cb, /* IN notification callback */
+ dummy_usb_cb, /* IN notification callback */
NULL, /* OUT notification callback */
KEYBOARD_EPSIZE, /* IN maximum packet size */
0, /* OUT maximum packet size */
@@ -149,7 +155,7 @@ static USBInEndpointState mouse_ep_state;
static const USBEndpointConfig mouse_ep_config = {
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
NULL, /* SETUP packet notification callback */
- mouse_in_cb, /* IN notification callback */
+ dummy_usb_cb, /* IN notification callback */
NULL, /* OUT notification callback */
MOUSE_EPSIZE, /* IN maximum packet size */
0, /* OUT maximum packet size */
@@ -167,7 +173,7 @@ static USBInEndpointState shared_ep_state;
static const USBEndpointConfig shared_ep_config = {
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
NULL, /* SETUP packet notification callback */
- shared_in_cb, /* IN notification callback */
+ dummy_usb_cb, /* IN notification callback */
NULL, /* OUT notification callback */
SHARED_EPSIZE, /* IN maximum packet size */
0, /* OUT maximum packet size */
@@ -177,6 +183,42 @@ static const USBEndpointConfig shared_ep_config = {
};
#endif
+#ifdef JOYSTICK_ENABLE
+/* joystick endpoint state structure */
+static USBInEndpointState joystick_ep_state;
+
+/* joystick endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
+static const USBEndpointConfig joystick_ep_config = {
+ USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
+ NULL, /* SETUP packet notification callback */
+ dummy_usb_cb, /* IN notification callback */
+ NULL, /* OUT notification callback */
+ JOYSTICK_EPSIZE, /* IN maximum packet size */
+ 0, /* OUT maximum packet size */
+ &joystick_ep_state, /* IN Endpoint state */
+ NULL, /* OUT endpoint state */
+ usb_lld_endpoint_fields /* USB driver specific endpoint fields */
+};
+#endif
+
+#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
+/* digitizer endpoint state structure */
+static USBInEndpointState digitizer_ep_state;
+
+/* digitizer endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
+static const USBEndpointConfig digitizer_ep_config = {
+ USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
+ NULL, /* SETUP packet notification callback */
+ dummy_usb_cb, /* IN notification callback */
+ NULL, /* OUT notification callback */
+ DIGITIZER_EPSIZE, /* IN maximum packet size */
+ 0, /* OUT maximum packet size */
+ &digitizer_ep_state, /* IN Endpoint state */
+ NULL, /* OUT endpoint state */
+ usb_lld_endpoint_fields /* USB driver specific endpoint fields */
+};
+#endif
+
#ifdef USB_ENDPOINTS_ARE_REORDERABLE
typedef struct {
size_t queue_capacity_in;
@@ -319,12 +361,6 @@ typedef struct {
#ifdef VIRTSER_ENABLE
usb_driver_config_t serial_driver;
#endif
-#ifdef JOYSTICK_ENABLE
- usb_driver_config_t joystick_driver;
-#endif
-#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
- usb_driver_config_t digitizer_driver;
-#endif
};
usb_driver_config_t array[0];
};
@@ -365,22 +401,6 @@ static usb_driver_configs_t drivers = {
# define CDC_OUT_MODE USB_EP_MODE_TYPE_BULK
.serial_driver = QMK_USB_DRIVER_CONFIG(CDC, CDC_NOTIFICATION_EPNUM, false),
#endif
-
-#ifdef JOYSTICK_ENABLE
-# define JOYSTICK_IN_CAPACITY 4
-# define JOYSTICK_OUT_CAPACITY 4
-# define JOYSTICK_IN_MODE USB_EP_MODE_TYPE_BULK
-# define JOYSTICK_OUT_MODE USB_EP_MODE_TYPE_BULK
- .joystick_driver = QMK_USB_DRIVER_CONFIG(JOYSTICK, 0, false),
-#endif
-
-#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
-# define DIGITIZER_IN_CAPACITY 4
-# define DIGITIZER_OUT_CAPACITY 4
-# define DIGITIZER_IN_MODE USB_EP_MODE_TYPE_BULK
-# define DIGITIZER_OUT_MODE USB_EP_MODE_TYPE_BULK
- .digitizer_driver = QMK_USB_DRIVER_CONFIG(DIGITIZER, 0, false),
-#endif
};
#define NUM_USB_DRIVERS (sizeof(drivers) / sizeof(usb_driver_config_t))
@@ -487,6 +507,12 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) {
#ifdef SHARED_EP_ENABLE
usbInitEndpointI(usbp, SHARED_IN_EPNUM, &shared_ep_config);
#endif
+#ifdef JOYSTICK_ENABLE
+ usbInitEndpointI(usbp, JOYSTICK_IN_EPNUM, &joystick_ep_config);
+#endif
+#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
+ usbInitEndpointI(usbp, DIGITIZER_IN_EPNUM, &digitizer_ep_config);
+#endif
for (int i = 0; i < NUM_USB_DRIVERS; i++) {
#ifdef USB_ENDPOINTS_ARE_REORDERABLE
usbInitEndpointI(usbp, drivers.array[i].config.bulk_in, &drivers.array[i].inout_ep_config);
@@ -694,7 +720,6 @@ static bool usb_request_hook_cb(USBDriver *usbp) {
/* Start-of-frame callback */
static void usb_sof_cb(USBDriver *usbp) {
- kbd_sof_cb(usbp);
osalSysLockFromISR();
for (int i = 0; i < NUM_USB_DRIVERS; i++) {
qmkusbSOFHookI(&drivers.array[i].driver);
@@ -738,6 +763,7 @@ void init_usb_driver(USBDriver *usbp) {
* after a reset.
*/
usbDisconnectBus(usbp);
+ usbStop(usbp);
wait_ms(50);
usbStart(usbp, &usbcfg);
usbConnectBus(usbp);
@@ -746,8 +772,8 @@ void init_usb_driver(USBDriver *usbp) {
}
__attribute__((weak)) void restart_usb_driver(USBDriver *usbp) {
- usbStop(usbp);
usbDisconnectBus(usbp);
+ usbStop(usbp);
#if USB_SUSPEND_WAKEUP_DELAY > 0
// Some hubs, kvm switches, and monitors do
@@ -767,21 +793,6 @@ __attribute__((weak)) void restart_usb_driver(USBDriver *usbp) {
* Keyboard functions
* ---------------------------------------------------------
*/
-/* keyboard IN callback hander (a kbd report has made it IN) */
-#ifndef KEYBOARD_SHARED_EP
-void kbd_in_cb(USBDriver *usbp, usbep_t ep) {
- /* STUB */
- (void)usbp;
- (void)ep;
-}
-#endif
-
-/* start-of-frame handler
- * TODO: i guess it would be better to re-implement using timers,
- * so that this is not going to have to be checked every 1ms */
-void kbd_sof_cb(USBDriver *usbp) {
- (void)usbp;
-}
/* Idle requests timer code
* callback (called from ISR, unlocked state) */
@@ -892,15 +903,6 @@ unlock:
*/
#ifdef MOUSE_ENABLE
-
-# ifndef MOUSE_SHARED_EP
-/* mouse IN callback hander (a mouse report has made it IN) */
-void mouse_in_cb(USBDriver *usbp, usbep_t ep) {
- (void)usbp;
- (void)ep;
-}
-# endif
-
void send_mouse(report_mouse_t *report) {
osalSysLock();
if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) {
@@ -929,25 +931,12 @@ void send_mouse(report_mouse_t *report) {
#endif /* MOUSE_ENABLE */
/* ---------------------------------------------------------
- * Shared EP functions
- * ---------------------------------------------------------
- */
-#ifdef SHARED_EP_ENABLE
-/* shared IN callback hander */
-void shared_in_cb(USBDriver *usbp, usbep_t ep) {
- /* STUB */
- (void)usbp;
- (void)ep;
-}
-#endif
-
-/* ---------------------------------------------------------
* Extrakey functions
* ---------------------------------------------------------
*/
+void send_extra(report_extra_t *report) {
#ifdef EXTRAKEY_ENABLE
-static void send_extra(uint8_t report_id, uint16_t data) {
osalSysLock();
if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) {
osalSysUnlock();
@@ -965,27 +954,12 @@ static void send_extra(uint8_t report_id, uint16_t data) {
}
}
- static report_extra_t report;
- report = (report_extra_t){.report_id = report_id, .usage = data};
-
- usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)&report, sizeof(report_extra_t));
+ usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)report, sizeof(report_extra_t));
osalSysUnlock();
-}
-#endif
-
-void send_system(uint16_t data) {
-#ifdef EXTRAKEY_ENABLE
- send_extra(REPORT_ID_SYSTEM, data);
-#endif
-}
-
-void send_consumer(uint16_t data) {
-#ifdef EXTRAKEY_ENABLE
- send_extra(REPORT_ID_CONSUMER, data);
#endif
}
-void send_programmable_button(uint32_t data) {
+void send_programmable_button(report_programmable_button_t *report) {
#ifdef PROGRAMMABLE_BUTTON_ENABLE
osalSysLock();
if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) {
@@ -1003,31 +977,57 @@ void send_programmable_button(uint32_t data) {
return;
}
}
- static report_programmable_button_t report = {
- .report_id = REPORT_ID_PROGRAMMABLE_BUTTON,
- };
- report.usage = data;
+ usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)report, sizeof(report_programmable_button_t));
+ osalSysUnlock();
+#endif
+}
+
+void send_joystick(report_joystick_t *report) {
+#ifdef JOYSTICK_ENABLE
+ osalSysLock();
+ if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) {
+ osalSysUnlock();
+ return;
+ }
- usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)&report, sizeof(report));
+ if (usbGetTransmitStatusI(&USB_DRIVER, JOYSTICK_IN_EPNUM)) {
+ /* Need to either suspend, or loop and call unlock/lock during
+ * every iteration - otherwise the system will remain locked,
+ * no interrupts served, so USB not going through as well.
+ * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */
+ if (osalThreadSuspendTimeoutS(&(&USB_DRIVER)->epc[JOYSTICK_IN_EPNUM]->in_state->thread, TIME_MS2I(10)) == MSG_TIMEOUT) {
+ osalSysUnlock();
+ return;
+ }
+ }
+
+ usbStartTransmitI(&USB_DRIVER, JOYSTICK_IN_EPNUM, (uint8_t *)report, sizeof(report_joystick_t));
osalSysUnlock();
#endif
}
void send_digitizer(report_digitizer_t *report) {
#ifdef DIGITIZER_ENABLE
-# ifdef DIGITIZER_SHARED_EP
osalSysLock();
if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) {
osalSysUnlock();
return;
}
+ if (usbGetTransmitStatusI(&USB_DRIVER, DIGITIZER_IN_EPNUM)) {
+ /* Need to either suspend, or loop and call unlock/lock during
+ * every iteration - otherwise the system will remain locked,
+ * no interrupts served, so USB not going through as well.
+ * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */
+ if (osalThreadSuspendTimeoutS(&(&USB_DRIVER)->epc[DIGITIZER_IN_EPNUM]->in_state->thread, TIME_MS2I(10)) == MSG_TIMEOUT) {
+ osalSysUnlock();
+ return;
+ }
+ }
+
usbStartTransmitI(&USB_DRIVER, DIGITIZER_IN_EPNUM, (uint8_t *)report, sizeof(report_digitizer_t));
osalSysUnlock();
-# else
- chnWrite(&drivers.digitizer_driver.driver, (uint8_t *)report, sizeof(report_digitizer_t));
-# endif
#endif
}
@@ -1162,60 +1162,3 @@ void virtser_task(void) {
}
#endif
-
-#ifdef JOYSTICK_ENABLE
-
-void send_joystick_packet(joystick_t *joystick) {
- static joystick_report_t rep;
- rep = (joystick_report_t) {
-# if JOYSTICK_AXES_COUNT > 0
- .axes =
- { joystick->axes[0],
-
-# if JOYSTICK_AXES_COUNT >= 2
- joystick->axes[1],
-# endif
-# if JOYSTICK_AXES_COUNT >= 3
- joystick->axes[2],
-# endif
-# if JOYSTICK_AXES_COUNT >= 4
- joystick->axes[3],
-# endif
-# if JOYSTICK_AXES_COUNT >= 5
- joystick->axes[4],
-# endif
-# if JOYSTICK_AXES_COUNT >= 6
- joystick->axes[5],
-# endif
- },
-# endif // JOYSTICK_AXES_COUNT>0
-
-# if JOYSTICK_BUTTON_COUNT > 0
- .buttons = {
- joystick->buttons[0],
-
-# if JOYSTICK_BUTTON_COUNT > 8
- joystick->buttons[1],
-# endif
-# if JOYSTICK_BUTTON_COUNT > 16
- joystick->buttons[2],
-# endif
-# if JOYSTICK_BUTTON_COUNT > 24
- joystick->buttons[3],
-# endif
- }
-# endif // JOYSTICK_BUTTON_COUNT>0
- };
-
- // chnWrite(&drivers.joystick_driver.driver, (uint8_t *)&rep, sizeof(rep));
- osalSysLock();
- if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) {
- osalSysUnlock();
- return;
- }
-
- usbStartTransmitI(&USB_DRIVER, JOYSTICK_IN_EPNUM, (uint8_t *)&rep, sizeof(joystick_report_t));
- osalSysUnlock();
-}
-
-#endif
diff --git a/tmk_core/protocol/chibios/usb_main.h b/tmk_core/protocol/chibios/usb_main.h
index fb33c8cd0f..07186f76b8 100644
--- a/tmk_core/protocol/chibios/usb_main.h
+++ b/tmk_core/protocol/chibios/usb_main.h
@@ -17,9 +17,6 @@
#pragma once
-// TESTING
-// extern uint8_t blinkLed;
-
#include <ch.h>
#include <hal.h>
@@ -29,7 +26,9 @@
*/
/* The USB driver to use */
-#define USB_DRIVER USBD1
+#ifndef USB_DRIVER
+# define USB_DRIVER USBD1
+#endif // USB_DRIVER
/* Initialize the USB driver and bus */
void init_usb_driver(USBDriver *usbp);
@@ -48,43 +47,6 @@ void usb_event_queue_init(void);
/* Task to dequeue and execute any handlers for the USB events on the main thread */
void usb_event_queue_task(void);
-/* ---------------
- * Keyboard header
- * ---------------
- */
-
-/* extern report_keyboard_t keyboard_report_sent; */
-
-/* keyboard IN request callback handler */
-void kbd_in_cb(USBDriver *usbp, usbep_t ep);
-
-/* start-of-frame handler */
-void kbd_sof_cb(USBDriver *usbp);
-
-#ifdef NKRO_ENABLE
-/* nkro IN callback hander */
-void nkro_in_cb(USBDriver *usbp, usbep_t ep);
-#endif /* NKRO_ENABLE */
-
-/* ------------
- * Mouse header
- * ------------
- */
-
-#ifdef MOUSE_ENABLE
-
-/* mouse IN request callback handler */
-void mouse_in_cb(USBDriver *usbp, usbep_t ep);
-#endif /* MOUSE_ENABLE */
-
-/* ---------------
- * Shared EP header
- * ---------------
- */
-
-/* shared IN request callback handler */
-void shared_in_cb(USBDriver *usbp, usbep_t ep);
-
/* --------------
* Console header
* --------------
diff --git a/tmk_core/protocol/chibios/usb_util.c b/tmk_core/protocol/chibios/usb_util.c
index c8b435db0c..9d8b2c4007 100644
--- a/tmk_core/protocol/chibios/usb_util.c
+++ b/tmk_core/protocol/chibios/usb_util.c
@@ -14,12 +14,14 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <hal.h>
+#include "usb_main.h"
#include "usb_util.h"
void usb_disconnect(void) {
- usbStop(&USBD1);
+ usbDisconnectBus(&USB_DRIVER);
+ usbStop(&USB_DRIVER);
}
bool usb_connected_state(void) {
- return usbGetDriverStateI(&USBD1) == USB_ACTIVE;
+ return usbGetDriverStateI(&USB_DRIVER) == USB_ACTIVE;
}