Fix ChibiOS USB config for chips which support OTGv1 (#7564)
* Align endpoint config as per rest of file (fixes #4783) * Add comments about explicit order use * Update tmk_core/protocol/chibios/usb_main.c Co-Authored-By: fauxpark <fauxpark@gmail.com>
This commit is contained in:
parent
707d449ba0
commit
80c2e26741
1 changed files with 69 additions and 55 deletions
|
@ -15,6 +15,16 @@
|
|||
* GPL v2 or later.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Implementation notes:
|
||||
*
|
||||
* USBEndpointConfig - Configured using explicit order instead of struct member name.
|
||||
* This is due to ChibiOS hal LLD differences, which is dependent on hardware,
|
||||
* "USBv1" devices have `ep_buffers` and "OTGv1" have `in_multiplier`.
|
||||
* Given `USBv1/hal_usb_lld.h` marks the field as "not currently used" this code file
|
||||
* makes the assumption this is safe to avoid littering with preprocessor directives.
|
||||
*/
|
||||
|
||||
#include "ch.h"
|
||||
#include "hal.h"
|
||||
|
||||
|
@ -98,7 +108,7 @@ static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype
|
|||
#ifndef KEYBOARD_SHARED_EP
|
||||
/* keyboard endpoint state structure */
|
||||
static USBInEndpointState kbd_ep_state;
|
||||
/* keyboard endpoint initialization structure (IN) */
|
||||
/* keyboard endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
|
||||
static const USBEndpointConfig kbd_ep_config = {
|
||||
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
|
||||
NULL, /* SETUP packet notification callback */
|
||||
|
@ -117,7 +127,7 @@ static const USBEndpointConfig kbd_ep_config = {
|
|||
/* mouse endpoint state structure */
|
||||
static USBInEndpointState mouse_ep_state;
|
||||
|
||||
/* mouse endpoint initialization structure (IN) */
|
||||
/* mouse endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
|
||||
static const USBEndpointConfig mouse_ep_config = {
|
||||
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
|
||||
NULL, /* SETUP packet notification callback */
|
||||
|
@ -136,7 +146,7 @@ static const USBEndpointConfig mouse_ep_config = {
|
|||
/* shared endpoint state structure */
|
||||
static USBInEndpointState shared_ep_state;
|
||||
|
||||
/* shared endpoint initialization structure (IN) */
|
||||
/* shared endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
|
||||
static const USBEndpointConfig shared_ep_config = {
|
||||
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
|
||||
NULL, /* SETUP packet notification callback */
|
||||
|
@ -164,58 +174,62 @@ typedef struct {
|
|||
QMKUSBDriver driver;
|
||||
} usb_driver_config_t;
|
||||
|
||||
#define QMK_USB_DRIVER_CONFIG(stream, notification, fixedsize) \
|
||||
{ \
|
||||
.queue_capacity_in = stream##_IN_CAPACITY, .queue_capacity_out = stream##_OUT_CAPACITY, \
|
||||
.in_ep_config = {.ep_mode = stream##_IN_MODE, \
|
||||
.setup_cb = NULL, \
|
||||
.in_cb = qmkusbDataTransmitted, \
|
||||
.out_cb = NULL, \
|
||||
.in_maxsize = stream##_EPSIZE, \
|
||||
.out_maxsize = 0, /* The pointer to the states will be filled during initialization */ \
|
||||
.in_state = NULL, \
|
||||
.out_state = NULL, \
|
||||
.ep_buffers = 2, \
|
||||
.setup_buf = NULL}, \
|
||||
.out_ep_config = \
|
||||
{ \
|
||||
.ep_mode = stream##_OUT_MODE, \
|
||||
.setup_cb = NULL, \
|
||||
.in_cb = NULL, \
|
||||
.out_cb = qmkusbDataReceived, \
|
||||
.in_maxsize = 0, \
|
||||
.out_maxsize = stream##_EPSIZE, /* The pointer to the states will be filled during initialization */ \
|
||||
.in_state = NULL, \
|
||||
.out_state = NULL, \
|
||||
.ep_buffers = 2, \
|
||||
.setup_buf = NULL, \
|
||||
}, \
|
||||
.int_ep_config = \
|
||||
{ \
|
||||
.ep_mode = USB_EP_MODE_TYPE_INTR, \
|
||||
.setup_cb = NULL, \
|
||||
.in_cb = qmkusbInterruptTransmitted, \
|
||||
.out_cb = NULL, \
|
||||
.in_maxsize = CDC_NOTIFICATION_EPSIZE, \
|
||||
.out_maxsize = 0, /* The pointer to the states will be filled during initialization */ \
|
||||
.in_state = NULL, \
|
||||
.out_state = NULL, \
|
||||
.ep_buffers = 2, \
|
||||
.setup_buf = NULL, \
|
||||
}, \
|
||||
.config = { \
|
||||
.usbp = &USB_DRIVER, \
|
||||
.bulk_in = stream##_IN_EPNUM, \
|
||||
.bulk_out = stream##_OUT_EPNUM, \
|
||||
.int_in = notification, \
|
||||
.in_buffers = stream##_IN_CAPACITY, \
|
||||
.out_buffers = stream##_OUT_CAPACITY, \
|
||||
.in_size = stream##_EPSIZE, \
|
||||
.out_size = stream##_EPSIZE, \
|
||||
.fixed_size = fixedsize, \
|
||||
.ib = (uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]){}, \
|
||||
.ob = (uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY, stream##_EPSIZE)]){}, \
|
||||
} \
|
||||
/* Reusable initialization structure - see USBEndpointConfig comment at top of file */
|
||||
#define QMK_USB_DRIVER_CONFIG(stream, notification, fixedsize) \
|
||||
{ \
|
||||
.queue_capacity_in = stream##_IN_CAPACITY, .queue_capacity_out = stream##_OUT_CAPACITY, \
|
||||
.in_ep_config = \
|
||||
{ \
|
||||
stream##_IN_MODE, /* Interrupt EP */ \
|
||||
NULL, /* SETUP packet notification callback */ \
|
||||
qmkusbDataTransmitted, /* IN notification callback */ \
|
||||
NULL, /* OUT notification callback */ \
|
||||
stream##_EPSIZE, /* IN maximum packet size */ \
|
||||
0, /* OUT maximum packet size */ \
|
||||
NULL, /* IN Endpoint state */ \
|
||||
NULL, /* OUT endpoint state */ \
|
||||
2, /* IN multiplier */ \
|
||||
NULL /* SETUP buffer (not a SETUP endpoint) */ \
|
||||
}, \
|
||||
.out_ep_config = \
|
||||
{ \
|
||||
stream##_OUT_MODE, /* Interrupt EP */ \
|
||||
NULL, /* SETUP packet notification callback */ \
|
||||
NULL, /* IN notification callback */ \
|
||||
qmkusbDataReceived, /* OUT notification callback */ \
|
||||
0, /* IN maximum packet size */ \
|
||||
stream##_EPSIZE, /* OUT maximum packet size */ \
|
||||
NULL, /* IN Endpoint state */ \
|
||||
NULL, /* OUT endpoint state */ \
|
||||
2, /* IN multiplier */ \
|
||||
NULL, /* SETUP buffer (not a SETUP endpoint) */ \
|
||||
}, \
|
||||
.int_ep_config = \
|
||||
{ \
|
||||
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ \
|
||||
NULL, /* SETUP packet notification callback */ \
|
||||
qmkusbInterruptTransmitted, /* IN notification callback */ \
|
||||
NULL, /* OUT notification callback */ \
|
||||
CDC_NOTIFICATION_EPSIZE, /* IN maximum packet size */ \
|
||||
0, /* OUT maximum packet size */ \
|
||||
NULL, /* IN Endpoint state */ \
|
||||
NULL, /* OUT endpoint state */ \
|
||||
2, /* IN multiplier */ \
|
||||
NULL, /* SETUP buffer (not a SETUP endpoint) */ \
|
||||
}, \
|
||||
.config = { \
|
||||
.usbp = &USB_DRIVER, \
|
||||
.bulk_in = stream##_IN_EPNUM, \
|
||||
.bulk_out = stream##_OUT_EPNUM, \
|
||||
.int_in = notification, \
|
||||
.in_buffers = stream##_IN_CAPACITY, \
|
||||
.out_buffers = stream##_OUT_CAPACITY, \
|
||||
.in_size = stream##_EPSIZE, \
|
||||
.out_size = stream##_EPSIZE, \
|
||||
.fixed_size = fixedsize, \
|
||||
.ib = (uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]){}, \
|
||||
.ob = (uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY, stream##_EPSIZE)]){}, \
|
||||
} \
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
|
|
Loading…
Reference in a new issue