Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for shared EP on V-USB boards #11103

Merged
merged 2 commits into from
Jan 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions tmk_core/common/report.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,6 @@ enum desktop_usages {

#define KEYBOARD_REPORT_KEYS 6

/* VUSB hardcodes keyboard and mouse+extrakey only */
#if defined(PROTOCOL_VUSB)
# undef KEYBOARD_SHARED_EP
# undef MOUSE_SHARED_EP
#endif

#ifdef __cplusplus
extern "C" {
#endif
Expand Down
123 changes: 90 additions & 33 deletions tmk_core/protocol/vusb/vusb.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,28 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
* Interface indexes
*/
enum usb_interfaces {
#ifndef KEYBOARD_SHARED_EP
KEYBOARD_INTERFACE = NEXT_INTERFACE,
#else
SHARED_INTERFACE = NEXT_INTERFACE,
# define KEYBOARD_INTERFACE SHARED_INTERFACE
#endif

// It is important that the Raw HID interface is at a constant
// interface number, to support Linux/OSX platforms and chrome.hid
// If Raw HID is enabled, let it be always 1.
#ifdef RAW_ENABLE
RAW_INTERFACE = NEXT_INTERFACE,
#endif
#if (defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE))
MOUSE_EXTRA_INTERFACE = NEXT_INTERFACE,

#if defined(SHARED_EP_ENABLE) && !defined(KEYBOARD_SHARED_EP)
SHARED_INTERFACE = NEXT_INTERFACE,
#endif

#ifdef CONSOLE_ENABLE
CONSOLE_INTERFACE = NEXT_INTERFACE,
#endif

TOTAL_INTERFACES = NEXT_INTERFACE
};

Expand Down Expand Up @@ -90,7 +99,16 @@ void vusb_transfer_keyboard(void) {
for (int i = 0; i < VUSB_TRANSFER_KEYBOARD_MAX_TRIES; i++) {
if (usbInterruptIsReady()) {
if (kbuf_head != kbuf_tail) {
#ifndef KEYBOARD_SHARED_EP
usbSetInterrupt((void *)&kbuf[kbuf_tail], sizeof(report_keyboard_t));
#else
// Ugly hack! :(
usbSetInterrupt((void *)&kbuf[kbuf_tail], sizeof(report_keyboard_t) - 1);
while (!usbInterruptIsReady()) {
usbPoll();
}
usbSetInterrupt((void *)(&(kbuf[kbuf_tail].keys[5])), 1);
#endif
kbuf_tail = (kbuf_tail + 1) % KBUF_SIZE;
if (debug_keyboard) {
dprintf("V-USB: kbuf[%d->%d](%02X)\n", kbuf_tail, kbuf_head, (kbuf_head < kbuf_tail) ? (KBUF_SIZE - kbuf_tail + kbuf_head) : (kbuf_head - kbuf_tail));
Expand Down Expand Up @@ -230,16 +248,18 @@ static void send_keyboard(report_keyboard_t *report) {
keyboard_report_sent = *report;
}

typedef struct {
uint8_t report_id;
report_mouse_t report;
} __attribute__((packed)) vusb_mouse_report_t;
#ifndef KEYBOARD_SHARED_EP
# define usbInterruptIsReadyShared usbInterruptIsReady3
# define usbSetInterruptShared usbSetInterrupt3
#else
# define usbInterruptIsReadyShared usbInterruptIsReady
# define usbSetInterruptShared usbSetInterrupt
#endif

static void send_mouse(report_mouse_t *report) {
#ifdef MOUSE_ENABLE
vusb_mouse_report_t r = {.report_id = REPORT_ID_MOUSE, .report = *report};
if (usbInterruptIsReady3()) {
usbSetInterrupt3((void *)&r, sizeof(vusb_mouse_report_t));
if (usbInterruptIsReadyShared()) {
usbSetInterruptShared((void *)report, sizeof(report_mouse_t));
}
#endif
}
Expand All @@ -253,8 +273,8 @@ static void send_extra(uint8_t report_id, uint16_t data) {
last_data = data;

report_extra_t report = {.report_id = report_id, .usage = data};
if (usbInterruptIsReady3()) {
usbSetInterrupt3((void *)&report, sizeof(report));
if (usbInterruptIsReadyShared()) {
usbSetInterruptShared((void *)&report, sizeof(report_extra_t));
}
}
#endif
Expand Down Expand Up @@ -360,10 +380,18 @@ void usbFunctionWriteOut(uchar *data, uchar len) {
* Descriptors *
*------------------------------------------------------------------*/

#ifdef KEYBOARD_SHARED_EP
const PROGMEM uchar shared_hid_report[] = {
# define SHARED_REPORT_STARTED
#else
const PROGMEM uchar keyboard_hid_report[] = {
#endif
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection (Application)
#ifdef KEYBOARD_SHARED_EP
0x85, REPORT_ID_KEYBOARD, // Report ID
#endif
// Modifiers (8 bits)
0x05, 0x07, // Usage Page (Keyboard/Keypad)
0x19, 0xE0, // Usage Minimum (Keyboard Left Control)
Expand Down Expand Up @@ -398,12 +426,17 @@ const PROGMEM uchar keyboard_hid_report[] = {
0x95, 0x01, // Report Count (1)
0x75, 0x03, // Report Size (3)
0x91, 0x03, // Output (Constant)
0xC0 // End Collection
0xC0, // End Collection
#ifndef KEYBOARD_SHARED_EP
};
#endif

#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
const PROGMEM uchar mouse_extra_hid_report[] = {
# ifdef MOUSE_ENABLE
#if defined(SHARED_EP_ENABLE) && !defined(SHARED_REPORT_STARTED)
const PROGMEM uchar shared_hid_report[] = {
# define SHARED_REPORT_STARTED
#endif

#ifdef MOUSE_ENABLE
// Mouse report descriptor
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x02, // Usage (Mouse)
Expand Down Expand Up @@ -452,9 +485,9 @@ const PROGMEM uchar mouse_extra_hid_report[] = {
0x81, 0x06, // Input (Data, Variable, Relative)
0xC0, // End Collection
0xC0, // End Collection
# endif
#endif

# ifdef EXTRAKEY_ENABLE
#ifdef EXTRAKEY_ENABLE
// Extrakeys report descriptor
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x80, // Usage (System Control)
Expand All @@ -481,7 +514,8 @@ const PROGMEM uchar mouse_extra_hid_report[] = {
0x75, 0x10, // Report Size (16)
0x81, 0x00, // Input (Data, Array, Absolute)
0xC0 // End Collection
# endif
#endif
#ifdef SHARED_EP_ENABLE
};
#endif

Expand Down Expand Up @@ -616,6 +650,7 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
.bMaxPower = USB_MAX_POWER_CONSUMPTION / 2
},

# ifndef KEYBOARD_SHARED_EP
/*
* Keyboard
*/
Expand Down Expand Up @@ -653,6 +688,7 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
.wMaxPacketSize = 8,
.bInterval = USB_POLLING_INTERVAL_MS
},
# endif

# if defined(RAW_ENABLE)
/*
Expand Down Expand Up @@ -703,24 +739,30 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
.bInterval = USB_POLLING_INTERVAL_MS
},
# endif
# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)

# ifdef SHARED_EP_ENABLE
/*
* Mouse/Extrakeys
* Shared
*/
.mouseExtraInterface = {
.sharedInterface = {
.header = {
.bLength = sizeof(usbInterfaceDescriptor_t),
.bDescriptorType = USBDESCR_INTERFACE
},
.bInterfaceNumber = MOUSE_EXTRA_INTERFACE,
.bInterfaceNumber = SHARED_INTERFACE,
.bAlternateSetting = 0x00,
.bNumEndpoints = 1,
.bInterfaceClass = 0x03,
# ifdef KEYBOARD_SHARED_EP
.bInterfaceSubClass = 0x01,
.bInterfaceProtocol = 0x01,
# else
.bInterfaceSubClass = 0x00,
.bInterfaceProtocol = 0x00,
# endif
.iInterface = 0x00
},
.mouseExtraHID = {
.sharedHID = {
.header = {
.bLength = sizeof(usbHIDDescriptor_t),
.bDescriptorType = USBDESCR_HID
Expand All @@ -729,19 +771,24 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
.bCountryCode = 0x00,
.bNumDescriptors = 1,
.bDescriptorType = USBDESCR_HID_REPORT,
.wDescriptorLength = sizeof(mouse_extra_hid_report)
.wDescriptorLength = sizeof(shared_hid_report)
},
.mouseExtraINEndpoint = {
.sharedINEndpoint = {
.header = {
.bLength = sizeof(usbEndpointDescriptor_t),
.bDescriptorType = USBDESCR_ENDPOINT
},
# ifdef KEYBOARD_SHARED_EP
.bEndpointAddress = (USBRQ_DIR_DEVICE_TO_HOST | 1),
# else
.bEndpointAddress = (USBRQ_DIR_DEVICE_TO_HOST | USB_CFG_EP3_NUMBER),
# endif
.bmAttributes = 0x03,
.wMaxPacketSize = 8,
.bInterval = USB_POLLING_INTERVAL_MS
},
# endif

# if defined(CONSOLE_ENABLE)
/*
* Console
Expand Down Expand Up @@ -789,7 +836,7 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
.bmAttributes = 0x03,
.wMaxPacketSize = CONSOLE_EPSIZE,
.bInterval = 0x01
},
}
# endif
};

Expand Down Expand Up @@ -829,22 +876,27 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
break;
case USBDESCR_HID:
switch (rq->wValue.bytes[0]) {
#ifndef KEYBOARD_SHARED_EP
case KEYBOARD_INTERFACE:
usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.keyboardHID;
len = sizeof(usbHIDDescriptor_t);
break;
#endif

#if defined(RAW_ENABLE)
case RAW_INTERFACE:
usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.rawHID;
len = sizeof(usbHIDDescriptor_t);
break;
#endif
#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
case MOUSE_EXTRA_INTERFACE:
usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.mouseExtraHID;

#ifdef SHARED_EP_ENABLE
case SHARED_INTERFACE:
usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.sharedHID;
len = sizeof(usbHIDDescriptor_t);
break;
#endif

#if defined(CONSOLE_ENABLE)
case CONSOLE_INTERFACE:
usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.consoleHID;
Expand All @@ -856,22 +908,27 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
case USBDESCR_HID_REPORT:
/* interface index */
switch (rq->wIndex.word) {
#ifndef KEYBOARD_SHARED_EP
case KEYBOARD_INTERFACE:
usbMsgPtr = (usbMsgPtr_t)keyboard_hid_report;
len = sizeof(keyboard_hid_report);
break;
#endif

#if defined(RAW_ENABLE)
case RAW_INTERFACE:
usbMsgPtr = (usbMsgPtr_t)raw_hid_report;
len = sizeof(raw_hid_report);
break;
#endif
#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
case MOUSE_EXTRA_INTERFACE:
usbMsgPtr = (usbMsgPtr_t)mouse_extra_hid_report;
len = sizeof(mouse_extra_hid_report);

#ifdef SHARED_EP_ENABLE
case SHARED_INTERFACE:
usbMsgPtr = (usbMsgPtr_t)shared_hid_report;
len = sizeof(shared_hid_report);
break;
#endif

#if defined(CONSOLE_ENABLE)
case CONSOLE_INTERFACE:
usbMsgPtr = (usbMsgPtr_t)console_hid_report;
Expand Down
21 changes: 14 additions & 7 deletions tmk_core/protocol/vusb/vusb.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,16 @@ typedef struct usbHIDDescriptor {

typedef struct usbConfigurationDescriptor {
usbConfigurationDescriptorHeader_t header;
usbInterfaceDescriptor_t keyboardInterface;
usbHIDDescriptor_t keyboardHID;
usbEndpointDescriptor_t keyboardINEndpoint;

#ifndef KEYBOARD_SHARED_EP
usbInterfaceDescriptor_t keyboardInterface;
usbHIDDescriptor_t keyboardHID;
usbEndpointDescriptor_t keyboardINEndpoint;
#else
usbInterfaceDescriptor_t sharedInterface;
usbHIDDescriptor_t sharedHID;
usbEndpointDescriptor_t sharedINEndpoint;
#endif

#if defined(RAW_ENABLE)
usbInterfaceDescriptor_t rawInterface;
Expand All @@ -96,10 +103,10 @@ typedef struct usbConfigurationDescriptor {
usbEndpointDescriptor_t rawOUTEndpoint;
#endif

#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
usbInterfaceDescriptor_t mouseExtraInterface;
usbHIDDescriptor_t mouseExtraHID;
usbEndpointDescriptor_t mouseExtraINEndpoint;
#if defined(SHARED_EP_ENABLE) && !defined(KEYBOARD_SHARED_EP)
usbInterfaceDescriptor_t sharedInterface;
usbHIDDescriptor_t sharedHID;
usbEndpointDescriptor_t sharedINEndpoint;
#endif

#if defined(CONSOLE_ENABLE)
Expand Down