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.
|
* 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 "ch.h"
|
||||||
#include "hal.h"
|
#include "hal.h"
|
||||||
|
|
||||||
|
@ -98,7 +108,7 @@ static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype
|
||||||
#ifndef KEYBOARD_SHARED_EP
|
#ifndef KEYBOARD_SHARED_EP
|
||||||
/* keyboard endpoint state structure */
|
/* keyboard endpoint state structure */
|
||||||
static USBInEndpointState kbd_ep_state;
|
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 = {
|
static const USBEndpointConfig kbd_ep_config = {
|
||||||
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
|
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
|
||||||
NULL, /* SETUP packet notification callback */
|
NULL, /* SETUP packet notification callback */
|
||||||
|
@ -117,7 +127,7 @@ static const USBEndpointConfig kbd_ep_config = {
|
||||||
/* mouse endpoint state structure */
|
/* mouse endpoint state structure */
|
||||||
static USBInEndpointState mouse_ep_state;
|
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 = {
|
static const USBEndpointConfig mouse_ep_config = {
|
||||||
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
|
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
|
||||||
NULL, /* SETUP packet notification callback */
|
NULL, /* SETUP packet notification callback */
|
||||||
|
@ -136,7 +146,7 @@ static const USBEndpointConfig mouse_ep_config = {
|
||||||
/* shared endpoint state structure */
|
/* shared endpoint state structure */
|
||||||
static USBInEndpointState shared_ep_state;
|
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 = {
|
static const USBEndpointConfig shared_ep_config = {
|
||||||
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
|
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
|
||||||
NULL, /* SETUP packet notification callback */
|
NULL, /* SETUP packet notification callback */
|
||||||
|
@ -164,58 +174,62 @@ typedef struct {
|
||||||
QMKUSBDriver driver;
|
QMKUSBDriver driver;
|
||||||
} usb_driver_config_t;
|
} usb_driver_config_t;
|
||||||
|
|
||||||
#define QMK_USB_DRIVER_CONFIG(stream, notification, fixedsize) \
|
/* 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 = {.ep_mode = stream##_IN_MODE, \
|
.queue_capacity_in = stream##_IN_CAPACITY, .queue_capacity_out = stream##_OUT_CAPACITY, \
|
||||||
.setup_cb = NULL, \
|
.in_ep_config = \
|
||||||
.in_cb = qmkusbDataTransmitted, \
|
{ \
|
||||||
.out_cb = NULL, \
|
stream##_IN_MODE, /* Interrupt EP */ \
|
||||||
.in_maxsize = stream##_EPSIZE, \
|
NULL, /* SETUP packet notification callback */ \
|
||||||
.out_maxsize = 0, /* The pointer to the states will be filled during initialization */ \
|
qmkusbDataTransmitted, /* IN notification callback */ \
|
||||||
.in_state = NULL, \
|
NULL, /* OUT notification callback */ \
|
||||||
.out_state = NULL, \
|
stream##_EPSIZE, /* IN maximum packet size */ \
|
||||||
.ep_buffers = 2, \
|
0, /* OUT maximum packet size */ \
|
||||||
.setup_buf = NULL}, \
|
NULL, /* IN Endpoint state */ \
|
||||||
.out_ep_config = \
|
NULL, /* OUT endpoint state */ \
|
||||||
{ \
|
2, /* IN multiplier */ \
|
||||||
.ep_mode = stream##_OUT_MODE, \
|
NULL /* SETUP buffer (not a SETUP endpoint) */ \
|
||||||
.setup_cb = NULL, \
|
}, \
|
||||||
.in_cb = NULL, \
|
.out_ep_config = \
|
||||||
.out_cb = qmkusbDataReceived, \
|
{ \
|
||||||
.in_maxsize = 0, \
|
stream##_OUT_MODE, /* Interrupt EP */ \
|
||||||
.out_maxsize = stream##_EPSIZE, /* The pointer to the states will be filled during initialization */ \
|
NULL, /* SETUP packet notification callback */ \
|
||||||
.in_state = NULL, \
|
NULL, /* IN notification callback */ \
|
||||||
.out_state = NULL, \
|
qmkusbDataReceived, /* OUT notification callback */ \
|
||||||
.ep_buffers = 2, \
|
0, /* IN maximum packet size */ \
|
||||||
.setup_buf = NULL, \
|
stream##_EPSIZE, /* OUT maximum packet size */ \
|
||||||
}, \
|
NULL, /* IN Endpoint state */ \
|
||||||
.int_ep_config = \
|
NULL, /* OUT endpoint state */ \
|
||||||
{ \
|
2, /* IN multiplier */ \
|
||||||
.ep_mode = USB_EP_MODE_TYPE_INTR, \
|
NULL, /* SETUP buffer (not a SETUP endpoint) */ \
|
||||||
.setup_cb = NULL, \
|
}, \
|
||||||
.in_cb = qmkusbInterruptTransmitted, \
|
.int_ep_config = \
|
||||||
.out_cb = NULL, \
|
{ \
|
||||||
.in_maxsize = CDC_NOTIFICATION_EPSIZE, \
|
USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ \
|
||||||
.out_maxsize = 0, /* The pointer to the states will be filled during initialization */ \
|
NULL, /* SETUP packet notification callback */ \
|
||||||
.in_state = NULL, \
|
qmkusbInterruptTransmitted, /* IN notification callback */ \
|
||||||
.out_state = NULL, \
|
NULL, /* OUT notification callback */ \
|
||||||
.ep_buffers = 2, \
|
CDC_NOTIFICATION_EPSIZE, /* IN maximum packet size */ \
|
||||||
.setup_buf = NULL, \
|
0, /* OUT maximum packet size */ \
|
||||||
}, \
|
NULL, /* IN Endpoint state */ \
|
||||||
.config = { \
|
NULL, /* OUT endpoint state */ \
|
||||||
.usbp = &USB_DRIVER, \
|
2, /* IN multiplier */ \
|
||||||
.bulk_in = stream##_IN_EPNUM, \
|
NULL, /* SETUP buffer (not a SETUP endpoint) */ \
|
||||||
.bulk_out = stream##_OUT_EPNUM, \
|
}, \
|
||||||
.int_in = notification, \
|
.config = { \
|
||||||
.in_buffers = stream##_IN_CAPACITY, \
|
.usbp = &USB_DRIVER, \
|
||||||
.out_buffers = stream##_OUT_CAPACITY, \
|
.bulk_in = stream##_IN_EPNUM, \
|
||||||
.in_size = stream##_EPSIZE, \
|
.bulk_out = stream##_OUT_EPNUM, \
|
||||||
.out_size = stream##_EPSIZE, \
|
.int_in = notification, \
|
||||||
.fixed_size = fixedsize, \
|
.in_buffers = stream##_IN_CAPACITY, \
|
||||||
.ib = (uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]){}, \
|
.out_buffers = stream##_OUT_CAPACITY, \
|
||||||
.ob = (uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY, stream##_EPSIZE)]){}, \
|
.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 {
|
typedef struct {
|
||||||
|
|
Loading…
Reference in a new issue