diff options
Diffstat (limited to 'tmk_core')
| -rw-r--r-- | tmk_core/common.mk | 21 | ||||
| -rw-r--r-- | tmk_core/common/host.c | 22 | ||||
| -rw-r--r-- | tmk_core/common/report.c | 21 | ||||
| -rw-r--r-- | tmk_core/common/report.h | 46 | ||||
| -rw-r--r-- | tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c | 5 | ||||
| -rw-r--r-- | tmk_core/protocol/chibios/usb_main.c | 176 | ||||
| -rw-r--r-- | tmk_core/protocol/chibios/usb_main.h | 11 | ||||
| -rw-r--r-- | tmk_core/protocol/lufa/lufa.c | 92 | ||||
| -rw-r--r-- | tmk_core/protocol/usb_descriptor.c | 213 | ||||
| -rw-r--r-- | tmk_core/protocol/usb_descriptor.h | 170 |
10 files changed, 397 insertions, 380 deletions
diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 8eac1734f..063115acb 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk | |||
| @@ -82,15 +82,31 @@ else | |||
| 82 | TMK_COMMON_SRC += $(COMMON_DIR)/magic.c | 82 | TMK_COMMON_SRC += $(COMMON_DIR)/magic.c |
| 83 | endif | 83 | endif |
| 84 | 84 | ||
| 85 | SHARED_EP_ENABLE = no | ||
| 86 | MOUSE_SHARED_EP ?= yes | ||
| 87 | ifeq ($(strip $(KEYBOARD_SHARED_EP)), yes) | ||
| 88 | TMK_COMMON_DEFS += -DKEYBOARD_SHARED_EP | ||
| 89 | SHARED_EP_ENABLE = yes | ||
| 90 | # With the current usb_descriptor.c code, | ||
| 91 | # you can't share kbd without sharing mouse; | ||
| 92 | # that would be a very unexpected use case anyway | ||
| 93 | MOUSE_SHARED_EP = yes | ||
| 94 | endif | ||
| 85 | 95 | ||
| 86 | ifeq ($(strip $(MOUSEKEY_ENABLE)), yes) | 96 | ifeq ($(strip $(MOUSEKEY_ENABLE)), yes) |
| 87 | TMK_COMMON_SRC += $(COMMON_DIR)/mousekey.c | 97 | TMK_COMMON_SRC += $(COMMON_DIR)/mousekey.c |
| 88 | TMK_COMMON_DEFS += -DMOUSEKEY_ENABLE | 98 | TMK_COMMON_DEFS += -DMOUSEKEY_ENABLE |
| 89 | TMK_COMMON_DEFS += -DMOUSE_ENABLE | 99 | TMK_COMMON_DEFS += -DMOUSE_ENABLE |
| 100 | |||
| 101 | ifeq ($(strip $(MOUSE_SHARED_EP)), yes) | ||
| 102 | TMK_COMMON_DEFS += -DMOUSE_SHARED_EP | ||
| 103 | SHARED_EP_ENABLE = yes | ||
| 104 | endif | ||
| 90 | endif | 105 | endif |
| 91 | 106 | ||
| 92 | ifeq ($(strip $(EXTRAKEY_ENABLE)), yes) | 107 | ifeq ($(strip $(EXTRAKEY_ENABLE)), yes) |
| 93 | TMK_COMMON_DEFS += -DEXTRAKEY_ENABLE | 108 | TMK_COMMON_DEFS += -DEXTRAKEY_ENABLE |
| 109 | SHARED_EP_ENABLE = yes | ||
| 94 | endif | 110 | endif |
| 95 | 111 | ||
| 96 | ifeq ($(strip $(RAW_ENABLE)), yes) | 112 | ifeq ($(strip $(RAW_ENABLE)), yes) |
| @@ -111,6 +127,7 @@ endif | |||
| 111 | 127 | ||
| 112 | ifeq ($(strip $(NKRO_ENABLE)), yes) | 128 | ifeq ($(strip $(NKRO_ENABLE)), yes) |
| 113 | TMK_COMMON_DEFS += -DNKRO_ENABLE | 129 | TMK_COMMON_DEFS += -DNKRO_ENABLE |
| 130 | SHARED_EP_ENABLE = yes | ||
| 114 | endif | 131 | endif |
| 115 | 132 | ||
| 116 | ifeq ($(strip $(USB_6KRO_ENABLE)), yes) | 133 | ifeq ($(strip $(USB_6KRO_ENABLE)), yes) |
| @@ -182,6 +199,10 @@ ifeq ($(strip $(KEYMAP_SECTION_ENABLE)), yes) | |||
| 182 | endif | 199 | endif |
| 183 | endif | 200 | endif |
| 184 | 201 | ||
| 202 | ifeq ($(strip $(SHARED_EP_ENABLE)), yes) | ||
| 203 | TMK_COMMON_DEFS += -DSHARED_EP_ENABLE | ||
| 204 | endif | ||
| 205 | |||
| 185 | # Bootloader address | 206 | # Bootloader address |
| 186 | ifdef STM32_BOOTLOADER_ADDRESS | 207 | ifdef STM32_BOOTLOADER_ADDRESS |
| 187 | TMK_COMMON_DEFS += -DSTM32_BOOTLOADER_ADDRESS=$(STM32_BOOTLOADER_ADDRESS) | 208 | TMK_COMMON_DEFS += -DSTM32_BOOTLOADER_ADDRESS=$(STM32_BOOTLOADER_ADDRESS) |
diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c index e12b62216..f5d041699 100644 --- a/tmk_core/common/host.c +++ b/tmk_core/common/host.c | |||
| @@ -22,6 +22,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 22 | #include "util.h" | 22 | #include "util.h" |
| 23 | #include "debug.h" | 23 | #include "debug.h" |
| 24 | 24 | ||
| 25 | #ifdef NKRO_ENABLE | ||
| 26 | #include "keycode_config.h" | ||
| 27 | extern keymap_config_t keymap_config; | ||
| 28 | #endif | ||
| 29 | |||
| 25 | static host_driver_t *driver; | 30 | static host_driver_t *driver; |
| 26 | static uint16_t last_system_report = 0; | 31 | static uint16_t last_system_report = 0; |
| 27 | static uint16_t last_consumer_report = 0; | 32 | static uint16_t last_consumer_report = 0; |
| @@ -46,6 +51,20 @@ uint8_t host_keyboard_leds(void) | |||
| 46 | void host_keyboard_send(report_keyboard_t *report) | 51 | void host_keyboard_send(report_keyboard_t *report) |
| 47 | { | 52 | { |
| 48 | if (!driver) return; | 53 | if (!driver) return; |
| 54 | #if defined(NKRO_ENABLE) && defined(NKRO_SHARED_EP) | ||
| 55 | if (keyboard_protocol && keymap_config.nkro) { | ||
| 56 | /* The callers of this function assume that report->mods is where mods go in. | ||
| 57 | * But report->nkro.mods can be at a different offset if core keyboard does not have a report ID. | ||
| 58 | */ | ||
| 59 | report->nkro.mods = report->mods; | ||
| 60 | report->nkro.report_id = REPORT_ID_NKRO; | ||
| 61 | } else | ||
| 62 | #endif | ||
| 63 | { | ||
| 64 | #ifdef KEYBOARD_SHARED_EP | ||
| 65 | report->report_id = REPORT_ID_KEYBOARD; | ||
| 66 | #endif | ||
| 67 | } | ||
| 49 | (*driver->send_keyboard)(report); | 68 | (*driver->send_keyboard)(report); |
| 50 | 69 | ||
| 51 | if (debug_keyboard) { | 70 | if (debug_keyboard) { |
| @@ -60,6 +79,9 @@ void host_keyboard_send(report_keyboard_t *report) | |||
| 60 | void host_mouse_send(report_mouse_t *report) | 79 | void host_mouse_send(report_mouse_t *report) |
| 61 | { | 80 | { |
| 62 | if (!driver) return; | 81 | if (!driver) return; |
| 82 | #ifdef MOUSE_SHARED_EP | ||
| 83 | report->report_id = REPORT_ID_MOUSE; | ||
| 84 | #endif | ||
| 63 | (*driver->send_mouse)(report); | 85 | (*driver->send_mouse)(report); |
| 64 | } | 86 | } |
| 65 | 87 | ||
diff --git a/tmk_core/common/report.c b/tmk_core/common/report.c index eb3b44312..6a06b70c6 100644 --- a/tmk_core/common/report.c +++ b/tmk_core/common/report.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include "keycode_config.h" | 19 | #include "keycode_config.h" |
| 20 | #include "debug.h" | 20 | #include "debug.h" |
| 21 | #include "util.h" | 21 | #include "util.h" |
| 22 | #include <string.h> | ||
| 22 | 23 | ||
| 23 | /** \brief has_anykey | 24 | /** \brief has_anykey |
| 24 | * | 25 | * |
| @@ -27,8 +28,16 @@ | |||
| 27 | uint8_t has_anykey(report_keyboard_t* keyboard_report) | 28 | uint8_t has_anykey(report_keyboard_t* keyboard_report) |
| 28 | { | 29 | { |
| 29 | uint8_t cnt = 0; | 30 | uint8_t cnt = 0; |
| 30 | for (uint8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) { | 31 | uint8_t *p = keyboard_report->keys; |
| 31 | if (keyboard_report->raw[i]) | 32 | uint8_t lp = sizeof(keyboard_report->keys); |
| 33 | #ifdef NKRO_ENABLE | ||
| 34 | if (keyboard_protocol && keymap_config.nkro) { | ||
| 35 | p = keyboard_report->nkro.bits; | ||
| 36 | lp = sizeof(keyboard_report->nkro.bits); | ||
| 37 | } | ||
| 38 | #endif | ||
| 39 | while (lp--) { | ||
| 40 | if (*p++) | ||
| 32 | cnt++; | 41 | cnt++; |
| 33 | } | 42 | } |
| 34 | return cnt; | 43 | return cnt; |
| @@ -237,7 +246,11 @@ void del_key_from_report(report_keyboard_t* keyboard_report, uint8_t key) | |||
| 237 | void clear_keys_from_report(report_keyboard_t* keyboard_report) | 246 | void clear_keys_from_report(report_keyboard_t* keyboard_report) |
| 238 | { | 247 | { |
| 239 | // not clear mods | 248 | // not clear mods |
| 240 | for (int8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) { | 249 | #ifdef NKRO_ENABLE |
| 241 | keyboard_report->raw[i] = 0; | 250 | if (keyboard_protocol && keymap_config.nkro) { |
| 251 | memset(keyboard_report->nkro.bits, 0, sizeof(keyboard_report->nkro.bits)); | ||
| 252 | return; | ||
| 242 | } | 253 | } |
| 254 | #endif | ||
| 255 | memset(keyboard_report->keys, 0, sizeof(keyboard_report->keys)); | ||
| 243 | } | 256 | } |
diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 167f38275..5a1a6b19c 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h | |||
| @@ -23,9 +23,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 23 | 23 | ||
| 24 | 24 | ||
| 25 | /* report id */ | 25 | /* report id */ |
| 26 | #define REPORT_ID_MOUSE 1 | 26 | #define REPORT_ID_KEYBOARD 1 |
| 27 | #define REPORT_ID_SYSTEM 2 | 27 | #define REPORT_ID_MOUSE 2 |
| 28 | #define REPORT_ID_CONSUMER 3 | 28 | #define REPORT_ID_SYSTEM 3 |
| 29 | #define REPORT_ID_CONSUMER 4 | ||
| 30 | #define REPORT_ID_NKRO 5 | ||
| 29 | 31 | ||
| 30 | /* mouse buttons */ | 32 | /* mouse buttons */ |
| 31 | #define MOUSE_BTN1 (1<<0) | 33 | #define MOUSE_BTN1 (1<<0) |
| @@ -72,32 +74,35 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 72 | #define SYSTEM_WAKE_UP 0x0083 | 74 | #define SYSTEM_WAKE_UP 0x0083 |
| 73 | 75 | ||
| 74 | 76 | ||
| 77 | #define NKRO_SHARED_EP | ||
| 75 | /* key report size(NKRO or boot mode) */ | 78 | /* key report size(NKRO or boot mode) */ |
| 76 | #if defined(NKRO_ENABLE) | 79 | #if defined(NKRO_ENABLE) |
| 77 | #if defined(PROTOCOL_PJRC) | 80 | #if defined(PROTOCOL_LUFA) || defined(PROTOCOL_CHIBIOS) |
| 78 | #include "usb.h" | ||
| 79 | #define KEYBOARD_REPORT_SIZE KBD2_SIZE | ||
| 80 | #define KEYBOARD_REPORT_KEYS (KBD2_SIZE - 2) | ||
| 81 | #define KEYBOARD_REPORT_BITS (KBD2_SIZE - 1) | ||
| 82 | #elif defined(PROTOCOL_LUFA) || defined(PROTOCOL_CHIBIOS) | ||
| 83 | #include "protocol/usb_descriptor.h" | 81 | #include "protocol/usb_descriptor.h" |
| 84 | #define KEYBOARD_REPORT_SIZE NKRO_EPSIZE | 82 | #define KEYBOARD_REPORT_BITS (SHARED_EPSIZE - 2) |
| 85 | #define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) | ||
| 86 | #define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) | ||
| 87 | #elif defined(PROTOCOL_ARM_ATSAM) | 83 | #elif defined(PROTOCOL_ARM_ATSAM) |
| 88 | #include "protocol/arm_atsam/usb/udi_device_epsize.h" | 84 | #include "protocol/arm_atsam/usb/udi_device_epsize.h" |
| 89 | #define KEYBOARD_REPORT_SIZE NKRO_EPSIZE | ||
| 90 | #define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) | ||
| 91 | #define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) | 85 | #define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) |
| 86 | #undef NKRO_SHARED_EP | ||
| 87 | #undef MOUSE_SHARED_EP | ||
| 92 | #else | 88 | #else |
| 93 | #error "NKRO not supported with this protocol" | 89 | #error "NKRO not supported with this protocol" |
| 90 | #endif | ||
| 94 | #endif | 91 | #endif |
| 95 | 92 | ||
| 93 | #ifdef KEYBOARD_SHARED_EP | ||
| 94 | # define KEYBOARD_REPORT_SIZE 9 | ||
| 96 | #else | 95 | #else |
| 97 | # define KEYBOARD_REPORT_SIZE 8 | 96 | # define KEYBOARD_REPORT_SIZE 8 |
| 98 | # define KEYBOARD_REPORT_KEYS 6 | ||
| 99 | #endif | 97 | #endif |
| 100 | 98 | ||
| 99 | #define KEYBOARD_REPORT_KEYS 6 | ||
| 100 | |||
| 101 | /* VUSB hardcodes keyboard and mouse+extrakey only */ | ||
| 102 | #if defined(PROTOCOL_VUSB) | ||
| 103 | #undef KEYBOARD_SHARED_EP | ||
| 104 | #undef MOUSE_SHARED_EP | ||
| 105 | #endif | ||
| 101 | 106 | ||
| 102 | #ifdef __cplusplus | 107 | #ifdef __cplusplus |
| 103 | extern "C" { | 108 | extern "C" { |
| @@ -126,12 +131,18 @@ extern "C" { | |||
| 126 | typedef union { | 131 | typedef union { |
| 127 | uint8_t raw[KEYBOARD_REPORT_SIZE]; | 132 | uint8_t raw[KEYBOARD_REPORT_SIZE]; |
| 128 | struct { | 133 | struct { |
| 134 | #ifdef KEYBOARD_SHARED_EP | ||
| 135 | uint8_t report_id; | ||
| 136 | #endif | ||
| 129 | uint8_t mods; | 137 | uint8_t mods; |
| 130 | uint8_t reserved; | 138 | uint8_t reserved; |
| 131 | uint8_t keys[KEYBOARD_REPORT_KEYS]; | 139 | uint8_t keys[KEYBOARD_REPORT_KEYS]; |
| 132 | }; | 140 | }; |
| 133 | #ifdef NKRO_ENABLE | 141 | #ifdef NKRO_ENABLE |
| 134 | struct { | 142 | struct nkro_report { |
| 143 | #ifdef NKRO_SHARED_EP | ||
| 144 | uint8_t report_id; | ||
| 145 | #endif | ||
| 135 | uint8_t mods; | 146 | uint8_t mods; |
| 136 | uint8_t bits[KEYBOARD_REPORT_BITS]; | 147 | uint8_t bits[KEYBOARD_REPORT_BITS]; |
| 137 | } nkro; | 148 | } nkro; |
| @@ -139,6 +150,9 @@ typedef union { | |||
| 139 | } __attribute__ ((packed)) report_keyboard_t; | 150 | } __attribute__ ((packed)) report_keyboard_t; |
| 140 | 151 | ||
| 141 | typedef struct { | 152 | typedef struct { |
| 153 | #ifdef MOUSE_SHARED_EP | ||
| 154 | uint8_t report_id; | ||
| 155 | #endif | ||
| 142 | uint8_t buttons; | 156 | uint8_t buttons; |
| 143 | int8_t x; | 157 | int8_t x; |
| 144 | int8_t y; | 158 | int8_t y; |
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c index 18f9784ae..c263ac4aa 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | #include "udi_hid.h" | 54 | #include "udi_hid.h" |
| 55 | #include "udi_hid_kbd.h" | 55 | #include "udi_hid_kbd.h" |
| 56 | #include <string.h> | 56 | #include <string.h> |
| 57 | #include "report.h" | ||
| 57 | 58 | ||
| 58 | //*************************************************************************** | 59 | //*************************************************************************** |
| 59 | // KBD | 60 | // KBD |
| @@ -430,7 +431,7 @@ UDC_DESC_STORAGE udi_hid_exk_report_desc_t udi_hid_exk_report_desc = { | |||
| 430 | 0x05, 0x01, // Usage Page (Generic Desktop), | 431 | 0x05, 0x01, // Usage Page (Generic Desktop), |
| 431 | 0x09, 0x80, // Usage (System Control), | 432 | 0x09, 0x80, // Usage (System Control), |
| 432 | 0xA1, 0x01, // Collection (Application), | 433 | 0xA1, 0x01, // Collection (Application), |
| 433 | 0x85, 0x02, // Report ID (2) (System), | 434 | 0x85, REPORT_ID_SYSTEM, // Report ID (2) (System), |
| 434 | 0x16, 0x01, 0x00, // Logical Minimum (1), | 435 | 0x16, 0x01, 0x00, // Logical Minimum (1), |
| 435 | 0x26, 0x03, 0x00, // Logical Maximum (3), | 436 | 0x26, 0x03, 0x00, // Logical Maximum (3), |
| 436 | 0x1A, 0x81, 0x00, // Usage Minimum (81) (System Power Down), | 437 | 0x1A, 0x81, 0x00, // Usage Minimum (81) (System Power Down), |
| @@ -445,7 +446,7 @@ UDC_DESC_STORAGE udi_hid_exk_report_desc_t udi_hid_exk_report_desc = { | |||
| 445 | 0x05, 0x0C, // Usage Page (Consumer), | 446 | 0x05, 0x0C, // Usage Page (Consumer), |
| 446 | 0x09, 0x01, // Usage (Consumer Control), | 447 | 0x09, 0x01, // Usage (Consumer Control), |
| 447 | 0xA1, 0x01, // Collection (Application), | 448 | 0xA1, 0x01, // Collection (Application), |
| 448 | 0x85, 0x03, // Report ID (3) (Consumer), | 449 | 0x85, REPORT_ID_CONSUMER, // Report ID (3) (Consumer), |
| 449 | 0x16, 0x01, 0x00, // Logical Minimum (1), | 450 | 0x16, 0x01, 0x00, // Logical Minimum (1), |
| 450 | 0x26, 0x9C, 0x02, // Logical Maximum (668), | 451 | 0x26, 0x9C, 0x02, // Logical Maximum (668), |
| 451 | 0x1A, 0x01, 0x00, // Usage Minimum (1), | 452 | 0x1A, 0x01, 0x00, // Usage Minimum (1), |
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 71892c4f4..3028e7ea2 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c | |||
| @@ -95,6 +95,7 @@ static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype | |||
| 95 | return &desc; | 95 | return &desc; |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | #ifndef KEYBOARD_SHARED_EP | ||
| 98 | /* keyboard endpoint state structure */ | 99 | /* keyboard endpoint state structure */ |
| 99 | static USBInEndpointState kbd_ep_state; | 100 | static USBInEndpointState kbd_ep_state; |
| 100 | /* keyboard endpoint initialization structure (IN) */ | 101 | /* keyboard endpoint initialization structure (IN) */ |
| @@ -110,8 +111,9 @@ static const USBEndpointConfig kbd_ep_config = { | |||
| 110 | 2, /* IN multiplier */ | 111 | 2, /* IN multiplier */ |
| 111 | NULL /* SETUP buffer (not a SETUP endpoint) */ | 112 | NULL /* SETUP buffer (not a SETUP endpoint) */ |
| 112 | }; | 113 | }; |
| 114 | #endif | ||
| 113 | 115 | ||
| 114 | #ifdef MOUSE_ENABLE | 116 | #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) |
| 115 | /* mouse endpoint state structure */ | 117 | /* mouse endpoint state structure */ |
| 116 | static USBInEndpointState mouse_ep_state; | 118 | static USBInEndpointState mouse_ep_state; |
| 117 | 119 | ||
| @@ -128,45 +130,26 @@ static const USBEndpointConfig mouse_ep_config = { | |||
| 128 | 2, /* IN multiplier */ | 130 | 2, /* IN multiplier */ |
| 129 | NULL /* SETUP buffer (not a SETUP endpoint) */ | 131 | NULL /* SETUP buffer (not a SETUP endpoint) */ |
| 130 | }; | 132 | }; |
| 131 | #endif /* MOUSE_ENABLE */ | 133 | #endif |
| 132 | |||
| 133 | #ifdef EXTRAKEY_ENABLE | ||
| 134 | /* extrakey endpoint state structure */ | ||
| 135 | static USBInEndpointState extra_ep_state; | ||
| 136 | |||
| 137 | /* extrakey endpoint initialization structure (IN) */ | ||
| 138 | static const USBEndpointConfig extra_ep_config = { | ||
| 139 | USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ | ||
| 140 | NULL, /* SETUP packet notification callback */ | ||
| 141 | extra_in_cb, /* IN notification callback */ | ||
| 142 | NULL, /* OUT notification callback */ | ||
| 143 | EXTRAKEY_EPSIZE, /* IN maximum packet size */ | ||
| 144 | 0, /* OUT maximum packet size */ | ||
| 145 | &extra_ep_state, /* IN Endpoint state */ | ||
| 146 | NULL, /* OUT endpoint state */ | ||
| 147 | 2, /* IN multiplier */ | ||
| 148 | NULL /* SETUP buffer (not a SETUP endpoint) */ | ||
| 149 | }; | ||
| 150 | #endif /* EXTRAKEY_ENABLE */ | ||
| 151 | 134 | ||
| 152 | #ifdef NKRO_ENABLE | 135 | #ifdef SHARED_EP_ENABLE |
| 153 | /* nkro endpoint state structure */ | 136 | /* shared endpoint state structure */ |
| 154 | static USBInEndpointState nkro_ep_state; | 137 | static USBInEndpointState shared_ep_state; |
| 155 | 138 | ||
| 156 | /* nkro endpoint initialization structure (IN) */ | 139 | /* shared endpoint initialization structure (IN) */ |
| 157 | static const USBEndpointConfig nkro_ep_config = { | 140 | static const USBEndpointConfig shared_ep_config = { |
| 158 | USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ | 141 | USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ |
| 159 | NULL, /* SETUP packet notification callback */ | 142 | NULL, /* SETUP packet notification callback */ |
| 160 | nkro_in_cb, /* IN notification callback */ | 143 | shared_in_cb, /* IN notification callback */ |
| 161 | NULL, /* OUT notification callback */ | 144 | NULL, /* OUT notification callback */ |
| 162 | NKRO_EPSIZE, /* IN maximum packet size */ | 145 | SHARED_EPSIZE, /* IN maximum packet size */ |
| 163 | 0, /* OUT maximum packet size */ | 146 | 0, /* OUT maximum packet size */ |
| 164 | &nkro_ep_state, /* IN Endpoint state */ | 147 | &shared_ep_state, /* IN Endpoint state */ |
| 165 | NULL, /* OUT endpoint state */ | 148 | NULL, /* OUT endpoint state */ |
| 166 | 2, /* IN multiplier */ | 149 | 2, /* IN multiplier */ |
| 167 | NULL /* SETUP buffer (not a SETUP endpoint) */ | 150 | NULL /* SETUP buffer (not a SETUP endpoint) */ |
| 168 | }; | 151 | }; |
| 169 | #endif /* NKRO_ENABLE */ | 152 | #endif |
| 170 | 153 | ||
| 171 | typedef struct { | 154 | typedef struct { |
| 172 | size_t queue_capacity_in; | 155 | size_t queue_capacity_in; |
| @@ -309,16 +292,15 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { | |||
| 309 | case USB_EVENT_CONFIGURED: | 292 | case USB_EVENT_CONFIGURED: |
| 310 | osalSysLockFromISR(); | 293 | osalSysLockFromISR(); |
| 311 | /* Enable the endpoints specified into the configuration. */ | 294 | /* Enable the endpoints specified into the configuration. */ |
| 295 | #ifndef KEYBOARD_SHARED_EP | ||
| 312 | usbInitEndpointI(usbp, KEYBOARD_IN_EPNUM, &kbd_ep_config); | 296 | usbInitEndpointI(usbp, KEYBOARD_IN_EPNUM, &kbd_ep_config); |
| 313 | #ifdef MOUSE_ENABLE | 297 | #endif |
| 298 | #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) | ||
| 314 | usbInitEndpointI(usbp, MOUSE_IN_EPNUM, &mouse_ep_config); | 299 | usbInitEndpointI(usbp, MOUSE_IN_EPNUM, &mouse_ep_config); |
| 315 | #endif /* MOUSE_ENABLE */ | 300 | #endif |
| 316 | #ifdef EXTRAKEY_ENABLE | 301 | #ifdef SHARED_EP_ENABLE |
| 317 | usbInitEndpointI(usbp, EXTRAKEY_IN_EPNUM, &extra_ep_config); | 302 | usbInitEndpointI(usbp, SHARED_IN_EPNUM, &shared_ep_config); |
| 318 | #endif /* EXTRAKEY_ENABLE */ | 303 | #endif |
| 319 | #ifdef NKRO_ENABLE | ||
| 320 | usbInitEndpointI(usbp, NKRO_IN_EPNUM, &nkro_ep_config); | ||
| 321 | #endif /* NKRO_ENABLE */ | ||
| 322 | for (int i=0;i<NUM_USB_DRIVERS;i++) { | 304 | for (int i=0;i<NUM_USB_DRIVERS;i++) { |
| 323 | usbInitEndpointI(usbp, drivers.array[i].config.bulk_in, &drivers.array[i].in_ep_config); | 305 | usbInitEndpointI(usbp, drivers.array[i].config.bulk_in, &drivers.array[i].in_ep_config); |
| 324 | usbInitEndpointI(usbp, drivers.array[i].config.bulk_out, &drivers.array[i].out_ep_config); | 306 | usbInitEndpointI(usbp, drivers.array[i].config.bulk_out, &drivers.array[i].out_ep_config); |
| @@ -389,9 +371,20 @@ static uint16_t get_hword(uint8_t *p) { | |||
| 389 | * Other Device Required Optional Optional Optional Optional Optional | 371 | * Other Device Required Optional Optional Optional Optional Optional |
| 390 | */ | 372 | */ |
| 391 | 373 | ||
| 374 | #ifdef SHARED_EP_ENABLE | ||
| 375 | static uint8_t set_report_buf[2] __attribute__((aligned(2))); | ||
| 376 | static void set_led_transfer_cb(USBDriver *usbp) { | ||
| 377 | if ((set_report_buf[0] == REPORT_ID_KEYBOARD) || | ||
| 378 | (set_report_buf[0] == REPORT_ID_NKRO)) { | ||
| 379 | keyboard_led_stats = set_report_buf[1]; | ||
| 380 | } | ||
| 381 | } | ||
| 382 | #endif | ||
| 383 | |||
| 392 | /* Callback for SETUP request on the endpoint 0 (control) */ | 384 | /* Callback for SETUP request on the endpoint 0 (control) */ |
| 393 | static bool usb_request_hook_cb(USBDriver *usbp) { | 385 | static bool usb_request_hook_cb(USBDriver *usbp) { |
| 394 | const USBDescriptor *dp; | 386 | const USBDescriptor *dp; |
| 387 | int has_report_id; | ||
| 395 | 388 | ||
| 396 | /* usbp->setup fields: | 389 | /* usbp->setup fields: |
| 397 | * 0: bmRequestType (bitmask) | 390 | * 0: bmRequestType (bitmask) |
| @@ -409,42 +402,16 @@ static bool usb_request_hook_cb(USBDriver *usbp) { | |||
| 409 | case HID_GET_REPORT: | 402 | case HID_GET_REPORT: |
| 410 | switch(usbp->setup[4]) { /* LSB(wIndex) (check MSB==0?) */ | 403 | switch(usbp->setup[4]) { /* LSB(wIndex) (check MSB==0?) */ |
| 411 | case KEYBOARD_INTERFACE: | 404 | case KEYBOARD_INTERFACE: |
| 412 | #ifdef NKRO_ENABLE | ||
| 413 | case NKRO_INTERFACE: | ||
| 414 | #endif /* NKRO_ENABLE */ | ||
| 415 | usbSetupTransfer(usbp, (uint8_t *)&keyboard_report_sent, sizeof(keyboard_report_sent), NULL); | 405 | usbSetupTransfer(usbp, (uint8_t *)&keyboard_report_sent, sizeof(keyboard_report_sent), NULL); |
| 416 | return TRUE; | 406 | return TRUE; |
| 417 | break; | 407 | break; |
| 418 | 408 | ||
| 419 | #ifdef MOUSE_ENABLE | 409 | #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) |
| 420 | case MOUSE_INTERFACE: | 410 | case MOUSE_INTERFACE: |
| 421 | usbSetupTransfer(usbp, (uint8_t *)&mouse_report_blank, sizeof(mouse_report_blank), NULL); | 411 | usbSetupTransfer(usbp, (uint8_t *)&mouse_report_blank, sizeof(mouse_report_blank), NULL); |
| 422 | return TRUE; | 412 | return TRUE; |
| 423 | break; | 413 | break; |
| 424 | #endif /* MOUSE_ENABLE */ | 414 | #endif |
| 425 | |||
| 426 | #ifdef EXTRAKEY_ENABLE | ||
| 427 | case EXTRAKEY_INTERFACE: | ||
| 428 | if(usbp->setup[3] == 1) { /* MSB(wValue) [Report Type] == 1 [Input Report] */ | ||
| 429 | switch(usbp->setup[2]) { /* LSB(wValue) [Report ID] */ | ||
| 430 | case REPORT_ID_SYSTEM: | ||
| 431 | extra_report_blank[0] = REPORT_ID_SYSTEM; | ||
| 432 | usbSetupTransfer(usbp, (uint8_t *)extra_report_blank, sizeof(extra_report_blank), NULL); | ||
| 433 | return TRUE; | ||
| 434 | break; | ||
| 435 | case REPORT_ID_CONSUMER: | ||
| 436 | extra_report_blank[0] = REPORT_ID_CONSUMER; | ||
| 437 | usbSetupTransfer(usbp, (uint8_t *)extra_report_blank, sizeof(extra_report_blank), NULL); | ||
| 438 | return TRUE; | ||
| 439 | break; | ||
| 440 | default: | ||
| 441 | return FALSE; | ||
| 442 | } | ||
| 443 | } else { | ||
| 444 | return FALSE; | ||
| 445 | } | ||
| 446 | break; | ||
| 447 | #endif /* EXTRAKEY_ENABLE */ | ||
| 448 | 415 | ||
| 449 | default: | 416 | default: |
| 450 | usbSetupTransfer(usbp, NULL, 0, NULL); | 417 | usbSetupTransfer(usbp, NULL, 0, NULL); |
| @@ -472,12 +439,25 @@ static bool usb_request_hook_cb(USBDriver *usbp) { | |||
| 472 | case HID_SET_REPORT: | 439 | case HID_SET_REPORT: |
| 473 | switch(usbp->setup[4]) { /* LSB(wIndex) (check MSB==0 and wLength==1?) */ | 440 | switch(usbp->setup[4]) { /* LSB(wIndex) (check MSB==0 and wLength==1?) */ |
| 474 | case KEYBOARD_INTERFACE: | 441 | case KEYBOARD_INTERFACE: |
| 475 | #ifdef NKRO_ENABLE | 442 | #if defined(SHARED_EP_ENABLE) && !defined(KEYBOARD_SHARED_EP) |
| 476 | case NKRO_INTERFACE: | 443 | case SHARED_INTERFACE: |
| 477 | #endif /* NKRO_ENABLE */ | 444 | #endif |
| 478 | /* keyboard_led_stats = <read byte from next OUT report> | 445 | /* keyboard_led_stats = <read byte from next OUT report> |
| 479 | * keyboard_led_stats needs be word (or dword), otherwise we get an exception on F0 */ | 446 | * keyboard_led_stats needs be word (or dword), otherwise we get an exception on F0 */ |
| 480 | usbSetupTransfer(usbp, (uint8_t *)&keyboard_led_stats, 1, NULL); | 447 | has_report_id = 0; |
| 448 | #if defined(SHARED_EP_ENABLE) | ||
| 449 | if (usbp->setup[4] == SHARED_INTERFACE) { | ||
| 450 | has_report_id = 1; | ||
| 451 | } | ||
| 452 | #endif | ||
| 453 | if (usbp->setup[4] == KEYBOARD_INTERFACE && !keyboard_protocol) { | ||
| 454 | has_report_id = 0; | ||
| 455 | } | ||
| 456 | if (has_report_id) { | ||
| 457 | usbSetupTransfer(usbp, set_report_buf, sizeof(set_report_buf), set_led_transfer_cb); | ||
| 458 | } else { | ||
| 459 | usbSetupTransfer(usbp, (uint8_t *)&keyboard_led_stats, 1, NULL); | ||
| 460 | } | ||
| 481 | return TRUE; | 461 | return TRUE; |
| 482 | break; | 462 | break; |
| 483 | } | 463 | } |
| @@ -591,20 +571,13 @@ void init_usb_driver(USBDriver *usbp) { | |||
| 591 | * --------------------------------------------------------- | 571 | * --------------------------------------------------------- |
| 592 | */ | 572 | */ |
| 593 | /* keyboard IN callback hander (a kbd report has made it IN) */ | 573 | /* keyboard IN callback hander (a kbd report has made it IN) */ |
| 574 | #ifndef KEYBOARD_SHARED_EP | ||
| 594 | void kbd_in_cb(USBDriver *usbp, usbep_t ep) { | 575 | void kbd_in_cb(USBDriver *usbp, usbep_t ep) { |
| 595 | /* STUB */ | 576 | /* STUB */ |
| 596 | (void)usbp; | 577 | (void)usbp; |
| 597 | (void)ep; | 578 | (void)ep; |
| 598 | } | 579 | } |
| 599 | 580 | #endif | |
| 600 | #ifdef NKRO_ENABLE | ||
| 601 | /* nkro IN callback hander (a nkro report has made it IN) */ | ||
| 602 | void nkro_in_cb(USBDriver *usbp, usbep_t ep) { | ||
| 603 | /* STUB */ | ||
| 604 | (void)usbp; | ||
| 605 | (void)ep; | ||
| 606 | } | ||
| 607 | #endif /* NKRO_ENABLE */ | ||
| 608 | 581 | ||
| 609 | /* start-of-frame handler | 582 | /* start-of-frame handler |
| 610 | * TODO: i guess it would be better to re-implement using timers, | 583 | * TODO: i guess it would be better to re-implement using timers, |
| @@ -628,9 +601,9 @@ static void keyboard_idle_timer_cb(void *arg) { | |||
| 628 | } | 601 | } |
| 629 | 602 | ||
| 630 | #ifdef NKRO_ENABLE | 603 | #ifdef NKRO_ENABLE |
| 631 | if(!keymap_config.nkro && keyboard_idle) { | 604 | if(!keymap_config.nkro && keyboard_idle && keyboard_protocol) { |
| 632 | #else /* NKRO_ENABLE */ | 605 | #else /* NKRO_ENABLE */ |
| 633 | if(keyboard_idle) { | 606 | if(keyboard_idle && keyboard_protocol) { |
| 634 | #endif /* NKRO_ENABLE */ | 607 | #endif /* NKRO_ENABLE */ |
| 635 | /* TODO: are we sure we want the KBD_ENDPOINT? */ | 608 | /* TODO: are we sure we want the KBD_ENDPOINT? */ |
| 636 | if(!usbGetTransmitStatusI(usbp, KEYBOARD_IN_EPNUM)) { | 609 | if(!usbGetTransmitStatusI(usbp, KEYBOARD_IN_EPNUM)) { |
| @@ -661,25 +634,25 @@ void send_keyboard(report_keyboard_t *report) { | |||
| 661 | osalSysUnlock(); | 634 | osalSysUnlock(); |
| 662 | 635 | ||
| 663 | #ifdef NKRO_ENABLE | 636 | #ifdef NKRO_ENABLE |
| 664 | if(keymap_config.nkro) { /* NKRO protocol */ | 637 | if(keymap_config.nkro && keyboard_protocol) { /* NKRO protocol */ |
| 665 | /* need to wait until the previous packet has made it through */ | 638 | /* need to wait until the previous packet has made it through */ |
| 666 | /* can rewrite this using the synchronous API, then would wait | 639 | /* can rewrite this using the synchronous API, then would wait |
| 667 | * until *after* the packet has been transmitted. I think | 640 | * until *after* the packet has been transmitted. I think |
| 668 | * this is more efficient */ | 641 | * this is more efficient */ |
| 669 | /* busy wait, should be short and not very common */ | 642 | /* busy wait, should be short and not very common */ |
| 670 | osalSysLock(); | 643 | osalSysLock(); |
| 671 | if(usbGetTransmitStatusI(&USB_DRIVER, NKRO_IN_EPNUM)) { | 644 | if(usbGetTransmitStatusI(&USB_DRIVER, SHARED_IN_EPNUM)) { |
| 672 | /* Need to either suspend, or loop and call unlock/lock during | 645 | /* Need to either suspend, or loop and call unlock/lock during |
| 673 | * every iteration - otherwise the system will remain locked, | 646 | * every iteration - otherwise the system will remain locked, |
| 674 | * no interrupts served, so USB not going through as well. | 647 | * no interrupts served, so USB not going through as well. |
| 675 | * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ | 648 | * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ |
| 676 | osalThreadSuspendS(&(&USB_DRIVER)->epc[NKRO_IN_EPNUM]->in_state->thread); | 649 | osalThreadSuspendS(&(&USB_DRIVER)->epc[SHARED_IN_EPNUM]->in_state->thread); |
| 677 | } | 650 | } |
| 678 | usbStartTransmitI(&USB_DRIVER, NKRO_IN_EPNUM, (uint8_t *)report, sizeof(report_keyboard_t)); | 651 | usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)report, sizeof(struct nkro_report)); |
| 679 | osalSysUnlock(); | 652 | osalSysUnlock(); |
| 680 | } else | 653 | } else |
| 681 | #endif /* NKRO_ENABLE */ | 654 | #endif /* NKRO_ENABLE */ |
| 682 | { /* boot protocol */ | 655 | { /* regular protocol */ |
| 683 | /* need to wait until the previous packet has made it through */ | 656 | /* need to wait until the previous packet has made it through */ |
| 684 | /* busy wait, should be short and not very common */ | 657 | /* busy wait, should be short and not very common */ |
| 685 | osalSysLock(); | 658 | osalSysLock(); |
| @@ -690,7 +663,15 @@ void send_keyboard(report_keyboard_t *report) { | |||
| 690 | * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ | 663 | * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ |
| 691 | osalThreadSuspendS(&(&USB_DRIVER)->epc[KEYBOARD_IN_EPNUM]->in_state->thread); | 664 | osalThreadSuspendS(&(&USB_DRIVER)->epc[KEYBOARD_IN_EPNUM]->in_state->thread); |
| 692 | } | 665 | } |
| 693 | usbStartTransmitI(&USB_DRIVER, KEYBOARD_IN_EPNUM, (uint8_t *)report, KEYBOARD_EPSIZE); | 666 | uint8_t *data, size; |
| 667 | if (keyboard_protocol) { | ||
| 668 | data = (uint8_t*)report; | ||
| 669 | size = KEYBOARD_REPORT_SIZE; | ||
| 670 | } else { /* boot protocol */ | ||
| 671 | data = &report->mods; | ||
| 672 | size = 8; | ||
| 673 | } | ||
| 674 | usbStartTransmitI(&USB_DRIVER, KEYBOARD_IN_EPNUM, data, size); | ||
| 694 | osalSysUnlock(); | 675 | osalSysUnlock(); |
| 695 | } | 676 | } |
| 696 | keyboard_report_sent = *report; | 677 | keyboard_report_sent = *report; |
| @@ -703,11 +684,13 @@ void send_keyboard(report_keyboard_t *report) { | |||
| 703 | 684 | ||
| 704 | #ifdef MOUSE_ENABLE | 685 | #ifdef MOUSE_ENABLE |
| 705 | 686 | ||
| 687 | #ifndef MOUSE_SHARED_EP | ||
| 706 | /* mouse IN callback hander (a mouse report has made it IN) */ | 688 | /* mouse IN callback hander (a mouse report has made it IN) */ |
| 707 | void mouse_in_cb(USBDriver *usbp, usbep_t ep) { | 689 | void mouse_in_cb(USBDriver *usbp, usbep_t ep) { |
| 708 | (void)usbp; | 690 | (void)usbp; |
| 709 | (void)ep; | 691 | (void)ep; |
| 710 | } | 692 | } |
| 693 | #endif | ||
| 711 | 694 | ||
| 712 | void send_mouse(report_mouse_t *report) { | 695 | void send_mouse(report_mouse_t *report) { |
| 713 | osalSysLock(); | 696 | osalSysLock(); |
| @@ -737,19 +720,24 @@ void send_mouse(report_mouse_t *report) { | |||
| 737 | #endif /* MOUSE_ENABLE */ | 720 | #endif /* MOUSE_ENABLE */ |
| 738 | 721 | ||
| 739 | /* --------------------------------------------------------- | 722 | /* --------------------------------------------------------- |
| 740 | * Extrakey functions | 723 | * Shared EP functions |
| 741 | * --------------------------------------------------------- | 724 | * --------------------------------------------------------- |
| 742 | */ | 725 | */ |
| 743 | 726 | #ifdef SHARED_EP_ENABLE | |
| 744 | #ifdef EXTRAKEY_ENABLE | 727 | /* shared IN callback hander */ |
| 745 | 728 | void shared_in_cb(USBDriver *usbp, usbep_t ep) { | |
| 746 | /* extrakey IN callback hander */ | ||
| 747 | void extra_in_cb(USBDriver *usbp, usbep_t ep) { | ||
| 748 | /* STUB */ | 729 | /* STUB */ |
| 749 | (void)usbp; | 730 | (void)usbp; |
| 750 | (void)ep; | 731 | (void)ep; |
| 751 | } | 732 | } |
| 733 | #endif | ||
| 734 | |||
| 735 | /* --------------------------------------------------------- | ||
| 736 | * Extrakey functions | ||
| 737 | * --------------------------------------------------------- | ||
| 738 | */ | ||
| 752 | 739 | ||
| 740 | #ifdef EXTRAKEY_ENABLE | ||
| 753 | static void send_extra_report(uint8_t report_id, uint16_t data) { | 741 | static void send_extra_report(uint8_t report_id, uint16_t data) { |
| 754 | osalSysLock(); | 742 | osalSysLock(); |
| 755 | if(usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) { | 743 | if(usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) { |
| @@ -762,7 +750,7 @@ static void send_extra_report(uint8_t report_id, uint16_t data) { | |||
| 762 | .usage = data | 750 | .usage = data |
| 763 | }; | 751 | }; |
| 764 | 752 | ||
| 765 | usbStartTransmitI(&USB_DRIVER, EXTRAKEY_IN_EPNUM, (uint8_t *)&report, sizeof(report_extra_t)); | 753 | usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)&report, sizeof(report_extra_t)); |
| 766 | osalSysUnlock(); | 754 | osalSysUnlock(); |
| 767 | } | 755 | } |
| 768 | 756 | ||
diff --git a/tmk_core/protocol/chibios/usb_main.h b/tmk_core/protocol/chibios/usb_main.h index 1f7eb12f8..55e8882cc 100644 --- a/tmk_core/protocol/chibios/usb_main.h +++ b/tmk_core/protocol/chibios/usb_main.h | |||
| @@ -66,15 +66,20 @@ void mouse_in_cb(USBDriver *usbp, usbep_t ep); | |||
| 66 | #endif /* MOUSE_ENABLE */ | 66 | #endif /* MOUSE_ENABLE */ |
| 67 | 67 | ||
| 68 | /* --------------- | 68 | /* --------------- |
| 69 | * Shared EP header | ||
| 70 | * --------------- | ||
| 71 | */ | ||
| 72 | |||
| 73 | /* shared IN request callback handler */ | ||
| 74 | void shared_in_cb(USBDriver *usbp, usbep_t ep); | ||
| 75 | |||
| 76 | /* --------------- | ||
| 69 | * Extrakey header | 77 | * Extrakey header |
| 70 | * --------------- | 78 | * --------------- |
| 71 | */ | 79 | */ |
| 72 | 80 | ||
| 73 | #ifdef EXTRAKEY_ENABLE | 81 | #ifdef EXTRAKEY_ENABLE |
| 74 | 82 | ||
| 75 | /* extrakey IN request callback handler */ | ||
| 76 | void extra_in_cb(USBDriver *usbp, usbep_t ep); | ||
| 77 | |||
| 78 | /* extra report structure */ | 83 | /* extra report structure */ |
| 79 | typedef struct { | 84 | typedef struct { |
| 80 | uint8_t report_id; | 85 | uint8_t report_id; |
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 95e0b95b2..e88e6f34a 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c | |||
| @@ -409,19 +409,21 @@ void EVENT_USB_Device_ConfigurationChanged(void) | |||
| 409 | bool ConfigSuccess = true; | 409 | bool ConfigSuccess = true; |
| 410 | 410 | ||
| 411 | /* Setup Keyboard HID Report Endpoints */ | 411 | /* Setup Keyboard HID Report Endpoints */ |
| 412 | #ifndef KEYBOARD_SHARED_EP | ||
| 412 | ConfigSuccess &= ENDPOINT_CONFIG(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, | 413 | ConfigSuccess &= ENDPOINT_CONFIG(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, |
| 413 | KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE); | 414 | KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE); |
| 415 | #endif | ||
| 414 | 416 | ||
| 415 | #ifdef MOUSE_ENABLE | 417 | #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) |
| 416 | /* Setup Mouse HID Report Endpoint */ | 418 | /* Setup Mouse HID Report Endpoint */ |
| 417 | ConfigSuccess &= ENDPOINT_CONFIG(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, | 419 | ConfigSuccess &= ENDPOINT_CONFIG(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, |
| 418 | MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE); | 420 | MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE); |
| 419 | #endif | 421 | #endif |
| 420 | 422 | ||
| 421 | #ifdef EXTRAKEY_ENABLE | 423 | #ifdef SHARED_EP_ENABLE |
| 422 | /* Setup Extra HID Report Endpoint */ | 424 | /* Setup Shared HID Report Endpoint */ |
| 423 | ConfigSuccess &= ENDPOINT_CONFIG(EXTRAKEY_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, | 425 | ConfigSuccess &= ENDPOINT_CONFIG(SHARED_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, |
| 424 | EXTRAKEY_EPSIZE, ENDPOINT_BANK_SINGLE); | 426 | SHARED_EPSIZE, ENDPOINT_BANK_SINGLE); |
| 425 | #endif | 427 | #endif |
| 426 | 428 | ||
| 427 | #ifdef RAW_ENABLE | 429 | #ifdef RAW_ENABLE |
| @@ -442,12 +444,6 @@ void EVENT_USB_Device_ConfigurationChanged(void) | |||
| 442 | #endif | 444 | #endif |
| 443 | #endif | 445 | #endif |
| 444 | 446 | ||
| 445 | #ifdef NKRO_ENABLE | ||
| 446 | /* Setup NKRO HID Report Endpoints */ | ||
| 447 | ConfigSuccess &= ENDPOINT_CONFIG(NKRO_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, | ||
| 448 | NKRO_EPSIZE, ENDPOINT_BANK_SINGLE); | ||
| 449 | #endif | ||
| 450 | |||
| 451 | #ifdef MIDI_ENABLE | 447 | #ifdef MIDI_ENABLE |
| 452 | ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_IN_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); | 448 | ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_IN_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); |
| 453 | ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_OUT_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); | 449 | ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_OUT_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); |
| @@ -512,8 +508,8 @@ void EVENT_USB_Device_ControlRequest(void) | |||
| 512 | // Interface | 508 | // Interface |
| 513 | switch (USB_ControlRequest.wIndex) { | 509 | switch (USB_ControlRequest.wIndex) { |
| 514 | case KEYBOARD_INTERFACE: | 510 | case KEYBOARD_INTERFACE: |
| 515 | #ifdef NKRO_ENABLE | 511 | #if defined(SHARED_EP_ENABLE) && !defined(KEYBOARD_SHARED_EP) |
| 516 | case NKRO_INTERFACE: | 512 | case SHARED_INTERFACE: |
| 517 | #endif | 513 | #endif |
| 518 | Endpoint_ClearSETUP(); | 514 | Endpoint_ClearSETUP(); |
| 519 | 515 | ||
| @@ -521,7 +517,17 @@ void EVENT_USB_Device_ControlRequest(void) | |||
| 521 | if (USB_DeviceState == DEVICE_STATE_Unattached) | 517 | if (USB_DeviceState == DEVICE_STATE_Unattached) |
| 522 | return; | 518 | return; |
| 523 | } | 519 | } |
| 520 | #if defined(SHARED_EP_ENABLE) | ||
| 521 | uint8_t report_id = REPORT_ID_KEYBOARD; | ||
| 522 | if (keyboard_protocol) { | ||
| 523 | report_id = Endpoint_Read_8(); | ||
| 524 | } | ||
| 525 | if (report_id == REPORT_ID_KEYBOARD || report_id == REPORT_ID_NKRO) { | ||
| 526 | keyboard_led_stats = Endpoint_Read_8(); | ||
| 527 | } | ||
| 528 | #else | ||
| 524 | keyboard_led_stats = Endpoint_Read_8(); | 529 | keyboard_led_stats = Endpoint_Read_8(); |
| 530 | #endif | ||
| 525 | 531 | ||
| 526 | Endpoint_ClearOUT(); | 532 | Endpoint_ClearOUT(); |
| 527 | Endpoint_ClearStatusStage(); | 533 | Endpoint_ClearStatusStage(); |
| @@ -612,16 +618,20 @@ static void send_keyboard(report_keyboard_t *report) | |||
| 612 | #ifdef MODULE_ADAFRUIT_BLE | 618 | #ifdef MODULE_ADAFRUIT_BLE |
| 613 | adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys)); | 619 | adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys)); |
| 614 | #elif MODULE_RN42 | 620 | #elif MODULE_RN42 |
| 615 | bluefruit_serial_send(0xFD); | 621 | bluefruit_serial_send(0xFD); |
| 616 | bluefruit_serial_send(0x09); | 622 | bluefruit_serial_send(0x09); |
| 617 | bluefruit_serial_send(0x01); | 623 | bluefruit_serial_send(0x01); |
| 618 | for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { | 624 | bluefruit_serial_send(report->mods); |
| 619 | bluefruit_serial_send(report->raw[i]); | 625 | bluefruit_serial_send(report->reserved); |
| 620 | } | 626 | for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { |
| 627 | bluefruit_serial_send(report->keys[i]); | ||
| 628 | } | ||
| 621 | #else | 629 | #else |
| 622 | bluefruit_serial_send(0xFD); | 630 | bluefruit_serial_send(0xFD); |
| 623 | for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { | 631 | bluefruit_serial_send(report->mods); |
| 624 | bluefruit_serial_send(report->raw[i]); | 632 | bluefruit_serial_send(report->reserved); |
| 633 | for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { | ||
| 634 | bluefruit_serial_send(report->keys[i]); | ||
| 625 | } | 635 | } |
| 626 | #endif | 636 | #endif |
| 627 | } | 637 | } |
| @@ -632,30 +642,24 @@ static void send_keyboard(report_keyboard_t *report) | |||
| 632 | } | 642 | } |
| 633 | 643 | ||
| 634 | /* Select the Keyboard Report Endpoint */ | 644 | /* Select the Keyboard Report Endpoint */ |
| 645 | uint8_t ep = KEYBOARD_IN_EPNUM; | ||
| 646 | uint8_t size = KEYBOARD_REPORT_SIZE; | ||
| 635 | #ifdef NKRO_ENABLE | 647 | #ifdef NKRO_ENABLE |
| 636 | if (keyboard_protocol && keymap_config.nkro) { | 648 | if (keyboard_protocol && keymap_config.nkro) { |
| 637 | /* Report protocol - NKRO */ | 649 | ep = SHARED_IN_EPNUM; |
| 638 | Endpoint_SelectEndpoint(NKRO_IN_EPNUM); | 650 | size = sizeof(struct nkro_report); |
| 639 | |||
| 640 | /* Check if write ready for a polling interval around 1ms */ | ||
| 641 | while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(4); | ||
| 642 | if (!Endpoint_IsReadWriteAllowed()) return; | ||
| 643 | |||
| 644 | /* Write Keyboard Report Data */ | ||
| 645 | Endpoint_Write_Stream_LE(report, NKRO_EPSIZE, NULL); | ||
| 646 | } | 651 | } |
| 647 | else | ||
| 648 | #endif | 652 | #endif |
| 649 | { | 653 | Endpoint_SelectEndpoint(ep); |
| 650 | /* Boot protocol */ | 654 | /* Check if write ready for a polling interval around 10ms */ |
| 651 | Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM); | 655 | while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); |
| 652 | 656 | if (!Endpoint_IsReadWriteAllowed()) return; | |
| 653 | /* Check if write ready for a polling interval around 10ms */ | ||
| 654 | while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); | ||
| 655 | if (!Endpoint_IsReadWriteAllowed()) return; | ||
| 656 | 657 | ||
| 657 | /* Write Keyboard Report Data */ | 658 | /* If we're in Boot Protocol, don't send any report ID or other funky fields */ |
| 658 | Endpoint_Write_Stream_LE(report, KEYBOARD_EPSIZE, NULL); | 659 | if (!keyboard_protocol) { |
| 660 | Endpoint_Write_Stream_LE(&report->mods, 8, NULL); | ||
| 661 | } else { | ||
| 662 | Endpoint_Write_Stream_LE(report, size, NULL); | ||
| 659 | } | 663 | } |
| 660 | 664 | ||
| 661 | /* Finalize the stream transfer to send the last packet */ | 665 | /* Finalize the stream transfer to send the last packet */ |
| @@ -718,6 +722,7 @@ static void send_mouse(report_mouse_t *report) | |||
| 718 | */ | 722 | */ |
| 719 | static void send_system(uint16_t data) | 723 | static void send_system(uint16_t data) |
| 720 | { | 724 | { |
| 725 | #ifdef EXTRAKEY_ENABLE | ||
| 721 | uint8_t timeout = 255; | 726 | uint8_t timeout = 255; |
| 722 | 727 | ||
| 723 | if (USB_DeviceState != DEVICE_STATE_Configured) | 728 | if (USB_DeviceState != DEVICE_STATE_Configured) |
| @@ -727,7 +732,7 @@ static void send_system(uint16_t data) | |||
| 727 | .report_id = REPORT_ID_SYSTEM, | 732 | .report_id = REPORT_ID_SYSTEM, |
| 728 | .usage = data - SYSTEM_POWER_DOWN + 1 | 733 | .usage = data - SYSTEM_POWER_DOWN + 1 |
| 729 | }; | 734 | }; |
| 730 | Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); | 735 | Endpoint_SelectEndpoint(SHARED_IN_EPNUM); |
| 731 | 736 | ||
| 732 | /* Check if write ready for a polling interval around 10ms */ | 737 | /* Check if write ready for a polling interval around 10ms */ |
| 733 | while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); | 738 | while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); |
| @@ -735,6 +740,7 @@ static void send_system(uint16_t data) | |||
| 735 | 740 | ||
| 736 | Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); | 741 | Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); |
| 737 | Endpoint_ClearIN(); | 742 | Endpoint_ClearIN(); |
| 743 | #endif | ||
| 738 | } | 744 | } |
| 739 | 745 | ||
| 740 | /** \brief Send Consumer | 746 | /** \brief Send Consumer |
| @@ -743,6 +749,7 @@ static void send_system(uint16_t data) | |||
| 743 | */ | 749 | */ |
| 744 | static void send_consumer(uint16_t data) | 750 | static void send_consumer(uint16_t data) |
| 745 | { | 751 | { |
| 752 | #ifdef EXTRAKEY_ENABLE | ||
| 746 | uint8_t timeout = 255; | 753 | uint8_t timeout = 255; |
| 747 | uint8_t where = where_to_send(); | 754 | uint8_t where = where_to_send(); |
| 748 | 755 | ||
| @@ -786,7 +793,7 @@ static void send_consumer(uint16_t data) | |||
| 786 | .report_id = REPORT_ID_CONSUMER, | 793 | .report_id = REPORT_ID_CONSUMER, |
| 787 | .usage = data | 794 | .usage = data |
| 788 | }; | 795 | }; |
| 789 | Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); | 796 | Endpoint_SelectEndpoint(SHARED_IN_EPNUM); |
| 790 | 797 | ||
| 791 | /* Check if write ready for a polling interval around 10ms */ | 798 | /* Check if write ready for a polling interval around 10ms */ |
| 792 | while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); | 799 | while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); |
| @@ -794,6 +801,7 @@ static void send_consumer(uint16_t data) | |||
| 794 | 801 | ||
| 795 | Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); | 802 | Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); |
| 796 | Endpoint_ClearIN(); | 803 | Endpoint_ClearIN(); |
| 804 | #endif | ||
| 797 | } | 805 | } |
| 798 | 806 | ||
| 799 | 807 | ||
diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index cab344675..589ad23cd 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c | |||
| @@ -47,11 +47,18 @@ | |||
| 47 | /******************************************************************************* | 47 | /******************************************************************************* |
| 48 | * HID Report Descriptors | 48 | * HID Report Descriptors |
| 49 | ******************************************************************************/ | 49 | ******************************************************************************/ |
| 50 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = | 50 | #ifdef KEYBOARD_SHARED_EP |
| 51 | { | 51 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { |
| 52 | #define SHARED_REPORT_STARTED | ||
| 53 | #else | ||
| 54 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = { | ||
| 55 | #endif | ||
| 52 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ | 56 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ |
| 53 | HID_RI_USAGE(8, 0x06), /* Keyboard */ | 57 | HID_RI_USAGE(8, 0x06), /* Keyboard */ |
| 54 | HID_RI_COLLECTION(8, 0x01), /* Application */ | 58 | HID_RI_COLLECTION(8, 0x01), /* Application */ |
| 59 | # ifdef KEYBOARD_SHARED_EP | ||
| 60 | HID_RI_REPORT_ID(8, REPORT_ID_KEYBOARD), | ||
| 61 | # endif | ||
| 55 | HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ | 62 | HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ |
| 56 | HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ | 63 | HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ |
| 57 | HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ | 64 | HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ |
| @@ -84,14 +91,25 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = | |||
| 84 | HID_RI_REPORT_SIZE(8, 0x08), | 91 | HID_RI_REPORT_SIZE(8, 0x08), |
| 85 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), | 92 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), |
| 86 | HID_RI_END_COLLECTION(0), | 93 | HID_RI_END_COLLECTION(0), |
| 94 | |||
| 95 | #ifndef KEYBOARD_SHARED_EP | ||
| 87 | }; | 96 | }; |
| 97 | #endif | ||
| 88 | 98 | ||
| 89 | #ifdef MOUSE_ENABLE | 99 | #if defined(MOUSE_ENABLE) |
| 90 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = | 100 | |
| 91 | { | 101 | # if !defined(MOUSE_SHARED_EP) |
| 102 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = { | ||
| 103 | # elif !defined(SHARED_REPORT_STARTED) | ||
| 104 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { | ||
| 105 | #define SHARED_REPORT_STARTED | ||
| 106 | # endif | ||
| 92 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ | 107 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ |
| 93 | HID_RI_USAGE(8, 0x02), /* Mouse */ | 108 | HID_RI_USAGE(8, 0x02), /* Mouse */ |
| 94 | HID_RI_COLLECTION(8, 0x01), /* Application */ | 109 | HID_RI_COLLECTION(8, 0x01), /* Application */ |
| 110 | # ifdef MOUSE_SHARED_EP | ||
| 111 | HID_RI_REPORT_ID(8, REPORT_ID_MOUSE), | ||
| 112 | # endif | ||
| 95 | HID_RI_USAGE(8, 0x01), /* Pointer */ | 113 | HID_RI_USAGE(8, 0x01), /* Pointer */ |
| 96 | HID_RI_COLLECTION(8, 0x00), /* Physical */ | 114 | HID_RI_COLLECTION(8, 0x00), /* Physical */ |
| 97 | 115 | ||
| @@ -133,12 +151,15 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = | |||
| 133 | 151 | ||
| 134 | HID_RI_END_COLLECTION(0), | 152 | HID_RI_END_COLLECTION(0), |
| 135 | HID_RI_END_COLLECTION(0), | 153 | HID_RI_END_COLLECTION(0), |
| 154 | # ifndef MOUSE_SHARED_EP | ||
| 136 | }; | 155 | }; |
| 156 | # endif | ||
| 137 | #endif | 157 | #endif |
| 138 | 158 | ||
| 139 | #ifdef EXTRAKEY_ENABLE | 159 | #if defined(SHARED_EP_ENABLE) && !defined(SHARED_REPORT_STARTED) |
| 140 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = | 160 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { |
| 141 | { | 161 | #endif |
| 162 | # ifdef EXTRAKEY_ENABLE | ||
| 142 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ | 163 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ |
| 143 | HID_RI_USAGE(8, 0x80), /* System Control */ | 164 | HID_RI_USAGE(8, 0x80), /* System Control */ |
| 144 | HID_RI_COLLECTION(8, 0x01), /* Application */ | 165 | HID_RI_COLLECTION(8, 0x01), /* Application */ |
| @@ -164,6 +185,43 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = | |||
| 164 | HID_RI_REPORT_COUNT(8, 1), | 185 | HID_RI_REPORT_COUNT(8, 1), |
| 165 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), | 186 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), |
| 166 | HID_RI_END_COLLECTION(0), | 187 | HID_RI_END_COLLECTION(0), |
| 188 | # endif | ||
| 189 | |||
| 190 | # ifdef NKRO_ENABLE | ||
| 191 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ | ||
| 192 | HID_RI_USAGE(8, 0x06), /* Keyboard */ | ||
| 193 | HID_RI_COLLECTION(8, 0x01), /* Application */ | ||
| 194 | HID_RI_REPORT_ID(8, REPORT_ID_NKRO), | ||
| 195 | HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ | ||
| 196 | HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ | ||
| 197 | HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ | ||
| 198 | HID_RI_LOGICAL_MINIMUM(8, 0x00), | ||
| 199 | HID_RI_LOGICAL_MAXIMUM(8, 0x01), | ||
| 200 | HID_RI_REPORT_COUNT(8, 0x08), | ||
| 201 | HID_RI_REPORT_SIZE(8, 0x01), | ||
| 202 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), | ||
| 203 | |||
| 204 | HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */ | ||
| 205 | HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */ | ||
| 206 | HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */ | ||
| 207 | HID_RI_REPORT_COUNT(8, 0x05), | ||
| 208 | HID_RI_REPORT_SIZE(8, 0x01), | ||
| 209 | HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), | ||
| 210 | HID_RI_REPORT_COUNT(8, 0x01), | ||
| 211 | HID_RI_REPORT_SIZE(8, 0x03), | ||
| 212 | HID_RI_OUTPUT(8, HID_IOF_CONSTANT), | ||
| 213 | |||
| 214 | HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ | ||
| 215 | HID_RI_USAGE_MINIMUM(8, 0x00), /* Keyboard 0 */ | ||
| 216 | HID_RI_USAGE_MAXIMUM(8, KEYBOARD_REPORT_BITS*8-1), | ||
| 217 | HID_RI_LOGICAL_MINIMUM(8, 0x00), | ||
| 218 | HID_RI_LOGICAL_MAXIMUM(8, 0x01), | ||
| 219 | HID_RI_REPORT_COUNT(8, KEYBOARD_REPORT_BITS*8), | ||
| 220 | HID_RI_REPORT_SIZE(8, 0x01), | ||
| 221 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), | ||
| 222 | HID_RI_END_COLLECTION(0), | ||
| 223 | # endif | ||
| 224 | #ifdef SHARED_EP_ENABLE | ||
| 167 | }; | 225 | }; |
| 168 | #endif | 226 | #endif |
| 169 | 227 | ||
| @@ -211,42 +269,6 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = | |||
| 211 | }; | 269 | }; |
| 212 | #endif | 270 | #endif |
| 213 | 271 | ||
| 214 | #ifdef NKRO_ENABLE | ||
| 215 | const USB_Descriptor_HIDReport_Datatype_t PROGMEM NKROReport[] = | ||
| 216 | { | ||
| 217 | HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ | ||
| 218 | HID_RI_USAGE(8, 0x06), /* Keyboard */ | ||
| 219 | HID_RI_COLLECTION(8, 0x01), /* Application */ | ||
| 220 | HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ | ||
| 221 | HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ | ||
| 222 | HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ | ||
| 223 | HID_RI_LOGICAL_MINIMUM(8, 0x00), | ||
| 224 | HID_RI_LOGICAL_MAXIMUM(8, 0x01), | ||
| 225 | HID_RI_REPORT_COUNT(8, 0x08), | ||
| 226 | HID_RI_REPORT_SIZE(8, 0x01), | ||
| 227 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), | ||
| 228 | |||
| 229 | HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */ | ||
| 230 | HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */ | ||
| 231 | HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */ | ||
| 232 | HID_RI_REPORT_COUNT(8, 0x05), | ||
| 233 | HID_RI_REPORT_SIZE(8, 0x01), | ||
| 234 | HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), | ||
| 235 | HID_RI_REPORT_COUNT(8, 0x01), | ||
| 236 | HID_RI_REPORT_SIZE(8, 0x03), | ||
| 237 | HID_RI_OUTPUT(8, HID_IOF_CONSTANT), | ||
| 238 | |||
| 239 | HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ | ||
| 240 | HID_RI_USAGE_MINIMUM(8, 0x00), /* Keyboard 0 */ | ||
| 241 | HID_RI_USAGE_MAXIMUM(8, (NKRO_EPSIZE-1)*8-1), /* Keyboard Right GUI */ | ||
| 242 | HID_RI_LOGICAL_MINIMUM(8, 0x00), | ||
| 243 | HID_RI_LOGICAL_MAXIMUM(8, 0x01), | ||
| 244 | HID_RI_REPORT_COUNT(8, (NKRO_EPSIZE-1)*8), | ||
| 245 | HID_RI_REPORT_SIZE(8, 0x01), | ||
| 246 | HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), | ||
| 247 | HID_RI_END_COLLECTION(0), | ||
| 248 | }; | ||
| 249 | #endif | ||
| 250 | 272 | ||
| 251 | /******************************************************************************* | 273 | /******************************************************************************* |
| 252 | * Device Descriptors | 274 | * Device Descriptors |
| @@ -303,6 +325,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
| 303 | /* | 325 | /* |
| 304 | * Keyboard | 326 | * Keyboard |
| 305 | */ | 327 | */ |
| 328 | #ifndef KEYBOARD_SHARED_EP | ||
| 306 | .Keyboard_Interface = | 329 | .Keyboard_Interface = |
| 307 | { | 330 | { |
| 308 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | 331 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, |
| @@ -339,11 +362,12 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
| 339 | .EndpointSize = KEYBOARD_EPSIZE, | 362 | .EndpointSize = KEYBOARD_EPSIZE, |
| 340 | .PollingIntervalMS = 0x0A | 363 | .PollingIntervalMS = 0x0A |
| 341 | }, | 364 | }, |
| 365 | #endif | ||
| 342 | 366 | ||
| 343 | /* | 367 | /* |
| 344 | * Mouse | 368 | * Mouse |
| 345 | */ | 369 | */ |
| 346 | #ifdef MOUSE_ENABLE | 370 | #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) |
| 347 | .Mouse_Interface = | 371 | .Mouse_Interface = |
| 348 | { | 372 | { |
| 349 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | 373 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, |
| @@ -383,26 +407,31 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
| 383 | #endif | 407 | #endif |
| 384 | 408 | ||
| 385 | /* | 409 | /* |
| 386 | * Extra | 410 | * Shared |
| 387 | */ | 411 | */ |
| 388 | #ifdef EXTRAKEY_ENABLE | 412 | #ifdef SHARED_EP_ENABLE |
| 389 | .Extrakey_Interface = | 413 | .Shared_Interface = |
| 390 | { | 414 | { |
| 391 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | 415 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, |
| 392 | 416 | ||
| 393 | .InterfaceNumber = EXTRAKEY_INTERFACE, | 417 | .InterfaceNumber = SHARED_INTERFACE, |
| 394 | .AlternateSetting = 0x00, | 418 | .AlternateSetting = 0x00, |
| 395 | 419 | ||
| 396 | .TotalEndpoints = 1, | 420 | .TotalEndpoints = 1, |
| 397 | 421 | ||
| 398 | .Class = HID_CSCP_HIDClass, | 422 | .Class = HID_CSCP_HIDClass, |
| 423 | # ifdef KEYBOARD_SHARED_EP | ||
| 424 | .SubClass = HID_CSCP_BootSubclass, | ||
| 425 | .Protocol = HID_CSCP_KeyboardBootProtocol, | ||
| 426 | # else | ||
| 399 | .SubClass = HID_CSCP_NonBootSubclass, | 427 | .SubClass = HID_CSCP_NonBootSubclass, |
| 400 | .Protocol = HID_CSCP_NonBootProtocol, | 428 | .Protocol = HID_CSCP_NonBootProtocol, |
| 429 | #endif | ||
| 401 | 430 | ||
| 402 | .InterfaceStrIndex = NO_DESCRIPTOR | 431 | .InterfaceStrIndex = NO_DESCRIPTOR |
| 403 | }, | 432 | }, |
| 404 | 433 | ||
| 405 | .Extrakey_HID = | 434 | .Shared_HID = |
| 406 | { | 435 | { |
| 407 | .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | 436 | .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, |
| 408 | 437 | ||
| @@ -410,16 +439,16 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
| 410 | .CountryCode = 0x00, | 439 | .CountryCode = 0x00, |
| 411 | .TotalReportDescriptors = 1, | 440 | .TotalReportDescriptors = 1, |
| 412 | .HIDReportType = HID_DTYPE_Report, | 441 | .HIDReportType = HID_DTYPE_Report, |
| 413 | .HIDReportLength = sizeof(ExtrakeyReport) | 442 | .HIDReportLength = sizeof(SharedReport) |
| 414 | }, | 443 | }, |
| 415 | 444 | ||
| 416 | .Extrakey_INEndpoint = | 445 | .Shared_INEndpoint = |
| 417 | { | 446 | { |
| 418 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | 447 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, |
| 419 | 448 | ||
| 420 | .EndpointAddress = (ENDPOINT_DIR_IN | EXTRAKEY_IN_EPNUM), | 449 | .EndpointAddress = (ENDPOINT_DIR_IN | SHARED_IN_EPNUM), |
| 421 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | 450 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), |
| 422 | .EndpointSize = EXTRAKEY_EPSIZE, | 451 | .EndpointSize = SHARED_EPSIZE, |
| 423 | .PollingIntervalMS = 0x0A | 452 | .PollingIntervalMS = 0x0A |
| 424 | }, | 453 | }, |
| 425 | #endif | 454 | #endif |
| @@ -528,48 +557,6 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
| 528 | }, | 557 | }, |
| 529 | #endif | 558 | #endif |
| 530 | 559 | ||
| 531 | /* | ||
| 532 | * NKRO | ||
| 533 | */ | ||
| 534 | #ifdef NKRO_ENABLE | ||
| 535 | .NKRO_Interface = | ||
| 536 | { | ||
| 537 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||
| 538 | |||
| 539 | .InterfaceNumber = NKRO_INTERFACE, | ||
| 540 | .AlternateSetting = 0x00, | ||
| 541 | |||
| 542 | .TotalEndpoints = 1, | ||
| 543 | |||
| 544 | .Class = HID_CSCP_HIDClass, | ||
| 545 | .SubClass = HID_CSCP_NonBootSubclass, | ||
| 546 | .Protocol = HID_CSCP_NonBootProtocol, | ||
| 547 | |||
| 548 | .InterfaceStrIndex = NO_DESCRIPTOR | ||
| 549 | }, | ||
| 550 | |||
| 551 | .NKRO_HID = | ||
| 552 | { | ||
| 553 | .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | ||
| 554 | |||
| 555 | .HIDSpec = VERSION_BCD(1,1,1), | ||
| 556 | .CountryCode = 0x00, | ||
| 557 | .TotalReportDescriptors = 1, | ||
| 558 | .HIDReportType = HID_DTYPE_Report, | ||
| 559 | .HIDReportLength = sizeof(NKROReport) | ||
| 560 | }, | ||
| 561 | |||
| 562 | .NKRO_INEndpoint = | ||
| 563 | { | ||
| 564 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||
| 565 | |||
| 566 | .EndpointAddress = (ENDPOINT_DIR_IN | NKRO_IN_EPNUM), | ||
| 567 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||
| 568 | .EndpointSize = NKRO_EPSIZE, | ||
| 569 | .PollingIntervalMS = 0x01 | ||
| 570 | }, | ||
| 571 | #endif | ||
| 572 | |||
| 573 | #ifdef MIDI_ENABLE | 560 | #ifdef MIDI_ENABLE |
| 574 | .Audio_Interface_Association = | 561 | .Audio_Interface_Association = |
| 575 | { | 562 | { |
| @@ -936,19 +923,21 @@ uint16_t get_usb_descriptor(const uint16_t wValue, | |||
| 936 | break; | 923 | break; |
| 937 | case HID_DTYPE_HID: | 924 | case HID_DTYPE_HID: |
| 938 | switch (wIndex) { | 925 | switch (wIndex) { |
| 926 | #ifndef KEYBOARD_SHARED_EP | ||
| 939 | case KEYBOARD_INTERFACE: | 927 | case KEYBOARD_INTERFACE: |
| 940 | Address = &ConfigurationDescriptor.Keyboard_HID; | 928 | Address = &ConfigurationDescriptor.Keyboard_HID; |
| 941 | Size = sizeof(USB_HID_Descriptor_HID_t); | 929 | Size = sizeof(USB_HID_Descriptor_HID_t); |
| 942 | break; | 930 | break; |
| 943 | #ifdef MOUSE_ENABLE | 931 | #endif |
| 932 | #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) | ||
| 944 | case MOUSE_INTERFACE: | 933 | case MOUSE_INTERFACE: |
| 945 | Address = &ConfigurationDescriptor.Mouse_HID; | 934 | Address = &ConfigurationDescriptor.Mouse_HID; |
| 946 | Size = sizeof(USB_HID_Descriptor_HID_t); | 935 | Size = sizeof(USB_HID_Descriptor_HID_t); |
| 947 | break; | 936 | break; |
| 948 | #endif | 937 | #endif |
| 949 | #ifdef EXTRAKEY_ENABLE | 938 | #ifdef SHARED_EP_ENABLE |
| 950 | case EXTRAKEY_INTERFACE: | 939 | case SHARED_INTERFACE: |
| 951 | Address = &ConfigurationDescriptor.Extrakey_HID; | 940 | Address = &ConfigurationDescriptor.Shared_HID; |
| 952 | Size = sizeof(USB_HID_Descriptor_HID_t); | 941 | Size = sizeof(USB_HID_Descriptor_HID_t); |
| 953 | break; | 942 | break; |
| 954 | #endif | 943 | #endif |
| @@ -964,30 +953,26 @@ uint16_t get_usb_descriptor(const uint16_t wValue, | |||
| 964 | Size = sizeof(USB_HID_Descriptor_HID_t); | 953 | Size = sizeof(USB_HID_Descriptor_HID_t); |
| 965 | break; | 954 | break; |
| 966 | #endif | 955 | #endif |
| 967 | #ifdef NKRO_ENABLE | ||
| 968 | case NKRO_INTERFACE: | ||
| 969 | Address = &ConfigurationDescriptor.NKRO_HID; | ||
| 970 | Size = sizeof(USB_HID_Descriptor_HID_t); | ||
| 971 | break; | ||
| 972 | #endif | ||
| 973 | } | 956 | } |
| 974 | break; | 957 | break; |
| 975 | case HID_DTYPE_Report: | 958 | case HID_DTYPE_Report: |
| 976 | switch (wIndex) { | 959 | switch (wIndex) { |
| 960 | #ifndef KEYBOARD_SHARED_EP | ||
| 977 | case KEYBOARD_INTERFACE: | 961 | case KEYBOARD_INTERFACE: |
| 978 | Address = &KeyboardReport; | 962 | Address = &KeyboardReport; |
| 979 | Size = sizeof(KeyboardReport); | 963 | Size = sizeof(KeyboardReport); |
| 980 | break; | 964 | break; |
| 981 | #ifdef MOUSE_ENABLE | 965 | #endif |
| 966 | #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) | ||
| 982 | case MOUSE_INTERFACE: | 967 | case MOUSE_INTERFACE: |
| 983 | Address = &MouseReport; | 968 | Address = &MouseReport; |
| 984 | Size = sizeof(MouseReport); | 969 | Size = sizeof(MouseReport); |
| 985 | break; | 970 | break; |
| 986 | #endif | 971 | #endif |
| 987 | #ifdef EXTRAKEY_ENABLE | 972 | #ifdef SHARED_EP_ENABLE |
| 988 | case EXTRAKEY_INTERFACE: | 973 | case SHARED_INTERFACE: |
| 989 | Address = &ExtrakeyReport; | 974 | Address = &SharedReport; |
| 990 | Size = sizeof(ExtrakeyReport); | 975 | Size = sizeof(SharedReport); |
| 991 | break; | 976 | break; |
| 992 | #endif | 977 | #endif |
| 993 | #ifdef RAW_ENABLE | 978 | #ifdef RAW_ENABLE |
| @@ -1002,12 +987,6 @@ uint16_t get_usb_descriptor(const uint16_t wValue, | |||
| 1002 | Size = sizeof(ConsoleReport); | 987 | Size = sizeof(ConsoleReport); |
| 1003 | break; | 988 | break; |
| 1004 | #endif | 989 | #endif |
| 1005 | #ifdef NKRO_ENABLE | ||
| 1006 | case NKRO_INTERFACE: | ||
| 1007 | Address = &NKROReport; | ||
| 1008 | Size = sizeof(NKROReport); | ||
| 1009 | break; | ||
| 1010 | #endif | ||
| 1011 | } | 990 | } |
| 1012 | break; | 991 | break; |
| 1013 | } | 992 | } |
diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index 586d07df6..3ca0c00b3 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h | |||
| @@ -53,26 +53,27 @@ typedef struct | |||
| 53 | { | 53 | { |
| 54 | USB_Descriptor_Configuration_Header_t Config; | 54 | USB_Descriptor_Configuration_Header_t Config; |
| 55 | 55 | ||
| 56 | #ifndef KEYBOARD_SHARED_EP | ||
| 56 | // Keyboard HID Interface | 57 | // Keyboard HID Interface |
| 57 | USB_Descriptor_Interface_t Keyboard_Interface; | 58 | USB_Descriptor_Interface_t Keyboard_Interface; |
| 58 | USB_HID_Descriptor_HID_t Keyboard_HID; | 59 | USB_HID_Descriptor_HID_t Keyboard_HID; |
| 59 | USB_Descriptor_Endpoint_t Keyboard_INEndpoint; | 60 | USB_Descriptor_Endpoint_t Keyboard_INEndpoint; |
| 61 | #endif | ||
| 60 | 62 | ||
| 61 | #ifdef MOUSE_ENABLE | 63 | #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) |
| 62 | // Mouse HID Interface | 64 | // Mouse HID Interface |
| 63 | USB_Descriptor_Interface_t Mouse_Interface; | 65 | USB_Descriptor_Interface_t Mouse_Interface; |
| 64 | USB_HID_Descriptor_HID_t Mouse_HID; | 66 | USB_HID_Descriptor_HID_t Mouse_HID; |
| 65 | USB_Descriptor_Endpoint_t Mouse_INEndpoint; | 67 | USB_Descriptor_Endpoint_t Mouse_INEndpoint; |
| 66 | #endif | 68 | #endif |
| 67 | 69 | ||
| 68 | #ifdef EXTRAKEY_ENABLE | 70 | #if defined(SHARED_EP_ENABLE) |
| 69 | // Extrakey HID Interface | 71 | USB_Descriptor_Interface_t Shared_Interface; |
| 70 | USB_Descriptor_Interface_t Extrakey_Interface; | 72 | USB_HID_Descriptor_HID_t Shared_HID; |
| 71 | USB_HID_Descriptor_HID_t Extrakey_HID; | 73 | USB_Descriptor_Endpoint_t Shared_INEndpoint; |
| 72 | USB_Descriptor_Endpoint_t Extrakey_INEndpoint; | ||
| 73 | #endif | 74 | #endif |
| 74 | 75 | ||
| 75 | #ifdef RAW_ENABLE | 76 | #if defined(RAW_ENABLE) |
| 76 | // Raw HID Interface | 77 | // Raw HID Interface |
| 77 | USB_Descriptor_Interface_t Raw_Interface; | 78 | USB_Descriptor_Interface_t Raw_Interface; |
| 78 | USB_HID_Descriptor_HID_t Raw_HID; | 79 | USB_HID_Descriptor_HID_t Raw_HID; |
| @@ -88,13 +89,6 @@ typedef struct | |||
| 88 | USB_Descriptor_Endpoint_t Console_OUTEndpoint; | 89 | USB_Descriptor_Endpoint_t Console_OUTEndpoint; |
| 89 | #endif | 90 | #endif |
| 90 | 91 | ||
| 91 | #ifdef NKRO_ENABLE | ||
| 92 | // NKRO HID Interface | ||
| 93 | USB_Descriptor_Interface_t NKRO_Interface; | ||
| 94 | USB_HID_Descriptor_HID_t NKRO_HID; | ||
| 95 | USB_Descriptor_Endpoint_t NKRO_INEndpoint; | ||
| 96 | #endif | ||
| 97 | |||
| 98 | #ifdef MIDI_ENABLE | 92 | #ifdef MIDI_ENABLE |
| 99 | USB_Descriptor_Interface_Association_t Audio_Interface_Association; | 93 | USB_Descriptor_Interface_Association_t Audio_Interface_Association; |
| 100 | // MIDI Audio Control Interface | 94 | // MIDI Audio Control Interface |
| @@ -133,133 +127,105 @@ typedef struct | |||
| 133 | 127 | ||
| 134 | 128 | ||
| 135 | /* index of interface */ | 129 | /* index of interface */ |
| 136 | #define KEYBOARD_INTERFACE 0 | 130 | enum usb_interfaces { |
| 137 | 131 | #if !defined(KEYBOARD_SHARED_EP) | |
| 132 | KEYBOARD_INTERFACE, | ||
| 133 | #else | ||
| 134 | # define KEYBOARD_INTERFACE SHARED_INTERFACE | ||
| 135 | #endif | ||
| 138 | // It is important that the Raw HID interface is at a constant | 136 | // It is important that the Raw HID interface is at a constant |
| 139 | // interface number, to support Linux/OSX platforms and chrome.hid | 137 | // interface number, to support Linux/OSX platforms and chrome.hid |
| 140 | // If Raw HID is enabled, let it be always 1. | 138 | // If Raw HID is enabled, let it be always 1. |
| 141 | #ifdef RAW_ENABLE | 139 | #if defined(RAW_ENABLE) |
| 142 | # define RAW_INTERFACE (KEYBOARD_INTERFACE + 1) | 140 | RAW_INTERFACE, |
| 143 | #else | ||
| 144 | # define RAW_INTERFACE KEYBOARD_INTERFACE | ||
| 145 | #endif | 141 | #endif |
| 146 | 142 | #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) | |
| 147 | #ifdef MOUSE_ENABLE | 143 | MOUSE_INTERFACE, |
| 148 | # define MOUSE_INTERFACE (RAW_INTERFACE + 1) | ||
| 149 | #else | ||
| 150 | # define MOUSE_INTERFACE RAW_INTERFACE | ||
| 151 | #endif | 144 | #endif |
| 152 | 145 | #if defined(SHARED_EP_ENABLE) | |
| 153 | #ifdef EXTRAKEY_ENABLE | 146 | SHARED_INTERFACE, |
| 154 | # define EXTRAKEY_INTERFACE (MOUSE_INTERFACE + 1) | ||
| 155 | #else | ||
| 156 | # define EXTRAKEY_INTERFACE MOUSE_INTERFACE | ||
| 157 | #endif | 147 | #endif |
| 158 | 148 | #if defined(CONSOLE_ENABLE) | |
| 159 | #ifdef CONSOLE_ENABLE | 149 | CONSOLE_INTERFACE, |
| 160 | # define CONSOLE_INTERFACE (EXTRAKEY_INTERFACE + 1) | ||
| 161 | #else | ||
| 162 | # define CONSOLE_INTERFACE EXTRAKEY_INTERFACE | ||
| 163 | #endif | ||
| 164 | |||
| 165 | #ifdef NKRO_ENABLE | ||
| 166 | # define NKRO_INTERFACE (CONSOLE_INTERFACE + 1) | ||
| 167 | #else | ||
| 168 | # define NKRO_INTERFACE CONSOLE_INTERFACE | ||
| 169 | #endif | 150 | #endif |
| 170 | 151 | #if defined(MIDI_ENABLE) | |
| 171 | #ifdef MIDI_ENABLE | 152 | AC_INTERFACE, |
| 172 | # define AC_INTERFACE (NKRO_INTERFACE + 1) | 153 | AS_INTERFACE, |
| 173 | # define AS_INTERFACE (NKRO_INTERFACE + 2) | ||
| 174 | #else | ||
| 175 | # define AS_INTERFACE NKRO_INTERFACE | ||
| 176 | #endif | 154 | #endif |
| 177 | 155 | #if defined(VIRTSER_ENABLE) | |
| 178 | #ifdef VIRTSER_ENABLE | 156 | CCI_INTERFACE, |
| 179 | # define CCI_INTERFACE (AS_INTERFACE + 1) | 157 | CDI_INTERFACE, |
| 180 | # define CDI_INTERFACE (AS_INTERFACE + 2) | ||
| 181 | #else | ||
| 182 | # define CDI_INTERFACE AS_INTERFACE | ||
| 183 | #endif | 158 | #endif |
| 159 | TOTAL_INTERFACES | ||
| 160 | }; | ||
| 184 | 161 | ||
| 185 | /* nubmer of interfaces */ | 162 | #define NEXT_EPNUM __COUNTER__ |
| 186 | #define TOTAL_INTERFACES (CDI_INTERFACE + 1) | ||
| 187 | |||
| 188 | 163 | ||
| 189 | // Endopoint number and size | 164 | enum usb_endpoints { |
| 190 | #define KEYBOARD_IN_EPNUM 1 | 165 | __unused_epnum__ = NEXT_EPNUM, /* EP numbering starts at 1 */ |
| 191 | 166 | #if !defined(KEYBOARD_SHARED_EP) | |
| 192 | #ifdef MOUSE_ENABLE | 167 | KEYBOARD_IN_EPNUM = NEXT_EPNUM, |
| 193 | # define MOUSE_IN_EPNUM (KEYBOARD_IN_EPNUM + 1) | ||
| 194 | #else | 168 | #else |
| 195 | # define MOUSE_IN_EPNUM KEYBOARD_IN_EPNUM | 169 | # define KEYBOARD_IN_EPNUM SHARED_IN_EPNUM |
| 196 | #endif | 170 | #endif |
| 197 | 171 | #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) | |
| 198 | #ifdef EXTRAKEY_ENABLE | 172 | MOUSE_IN_EPNUM = NEXT_EPNUM, |
| 199 | # define EXTRAKEY_IN_EPNUM (MOUSE_IN_EPNUM + 1) | ||
| 200 | #else | 173 | #else |
| 201 | # define EXTRAKEY_IN_EPNUM MOUSE_IN_EPNUM | 174 | # define MOUSE_IN_EPNUM SHARED_IN_EPNUM |
| 202 | #endif | 175 | #endif |
| 203 | 176 | #if defined(RAW_ENABLE) | |
| 204 | #ifdef RAW_ENABLE | 177 | RAW_IN_EPNUM = NEXT_EPNUM, |
| 205 | # define RAW_IN_EPNUM (EXTRAKEY_IN_EPNUM + 1) | 178 | RAW_OUT_EPNUM = NEXT_EPNUM, |
| 206 | # define RAW_OUT_EPNUM (EXTRAKEY_IN_EPNUM + 2) | ||
| 207 | #else | ||
| 208 | # define RAW_OUT_EPNUM EXTRAKEY_IN_EPNUM | ||
| 209 | #endif | 179 | #endif |
| 210 | 180 | #if defined(SHARED_EP_ENABLE) | |
| 211 | #ifdef CONSOLE_ENABLE | 181 | SHARED_IN_EPNUM = NEXT_EPNUM, |
| 212 | # define CONSOLE_IN_EPNUM (RAW_OUT_EPNUM + 1) | 182 | #endif |
| 183 | #if defined(CONSOLE_ENABLE) | ||
| 184 | CONSOLE_IN_EPNUM = NEXT_EPNUM, | ||
| 213 | #ifdef PROTOCOL_CHIBIOS | 185 | #ifdef PROTOCOL_CHIBIOS |
| 214 | // ChibiOS has enough memory and descriptor to actually enable the endpoint | 186 | // ChibiOS has enough memory and descriptor to actually enable the endpoint |
| 215 | // It could use the same endpoint numbers, as that's supported by ChibiOS | 187 | // It could use the same endpoint numbers, as that's supported by ChibiOS |
| 216 | // But the QMK code currently assumes that the endpoint numbers are different | 188 | // But the QMK code currently assumes that the endpoint numbers are different |
| 217 | # define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 2) | 189 | CONSOLE_OUT_EPNUM = NEXT_EPNUM, |
| 218 | #else | 190 | #else |
| 219 | # define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 1) | 191 | #define CONSOLE_OUT_EPNUM CONSOLE_IN_EPNUM |
| 220 | #endif | 192 | #endif |
| 221 | #else | ||
| 222 | # define CONSOLE_OUT_EPNUM RAW_OUT_EPNUM | ||
| 223 | #endif | 193 | #endif |
| 224 | |||
| 225 | #ifdef NKRO_ENABLE | ||
| 226 | # define NKRO_IN_EPNUM (CONSOLE_OUT_EPNUM + 1) | ||
| 227 | #else | ||
| 228 | # define NKRO_IN_EPNUM CONSOLE_OUT_EPNUM | ||
| 229 | #endif | ||
| 230 | |||
| 231 | #ifdef MIDI_ENABLE | 194 | #ifdef MIDI_ENABLE |
| 232 | # define MIDI_STREAM_IN_EPNUM (NKRO_IN_EPNUM + 1) | 195 | MIDI_STREAM_IN_EPNUM = NEXT_EPNUM, |
| 233 | // # define MIDI_STREAM_OUT_EPNUM (NKRO_IN_EPNUM + 1) | 196 | MIDI_STREAM_OUT_EPNUM = NEXT_EPNUM, |
| 234 | # define MIDI_STREAM_OUT_EPNUM (NKRO_IN_EPNUM + 2) | ||
| 235 | # define MIDI_STREAM_IN_EPADDR (ENDPOINT_DIR_IN | MIDI_STREAM_IN_EPNUM) | 197 | # define MIDI_STREAM_IN_EPADDR (ENDPOINT_DIR_IN | MIDI_STREAM_IN_EPNUM) |
| 236 | # define MIDI_STREAM_OUT_EPADDR (ENDPOINT_DIR_OUT | MIDI_STREAM_OUT_EPNUM) | 198 | # define MIDI_STREAM_OUT_EPADDR (ENDPOINT_DIR_OUT | MIDI_STREAM_OUT_EPNUM) |
| 237 | #else | ||
| 238 | # define MIDI_STREAM_OUT_EPNUM NKRO_IN_EPNUM | ||
| 239 | #endif | 199 | #endif |
| 240 | |||
| 241 | #ifdef VIRTSER_ENABLE | 200 | #ifdef VIRTSER_ENABLE |
| 242 | # define CDC_NOTIFICATION_EPNUM (MIDI_STREAM_OUT_EPNUM + 1) | 201 | CDC_NOTIFICATION_EPNUM = NEXT_EPNUM, |
| 243 | # define CDC_IN_EPNUM (MIDI_STREAM_OUT_EPNUM + 2) | 202 | CDC_IN_EPNUM = NEXT_EPNUM, |
| 244 | # define CDC_OUT_EPNUM (MIDI_STREAM_OUT_EPNUM + 3) | 203 | CDC_OUT_EPNUM = NEXT_EPNUM, |
| 245 | # define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM) | 204 | # define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM) |
| 246 | # define CDC_IN_EPADDR (ENDPOINT_DIR_IN | CDC_IN_EPNUM) | 205 | # define CDC_IN_EPADDR (ENDPOINT_DIR_IN | CDC_IN_EPNUM) |
| 247 | # define CDC_OUT_EPADDR (ENDPOINT_DIR_OUT | CDC_OUT_EPNUM) | 206 | # define CDC_OUT_EPADDR (ENDPOINT_DIR_OUT | CDC_OUT_EPNUM) |
| 248 | #else | ||
| 249 | # define CDC_OUT_EPNUM MIDI_STREAM_OUT_EPNUM | ||
| 250 | #endif | 207 | #endif |
| 208 | }; | ||
| 209 | |||
| 210 | #if defined(PROTOCOL_LUFA) | ||
| 211 | /* LUFA tells us total endpoints including control */ | ||
| 212 | #define MAX_ENDPOINTS (ENDPOINT_TOTAL_ENDPOINTS - 1) | ||
| 213 | #elif defined(PROTOCOL_CHIBIOS) | ||
| 214 | /* ChibiOS gives us number of available user endpoints, not control */ | ||
| 215 | #define MAX_ENDPOINTS USB_MAX_ENDPOINTS | ||
| 216 | #endif | ||
| 217 | /* TODO - ARM_ATSAM */ | ||
| 218 | |||
| 251 | 219 | ||
| 252 | #if (defined(PROTOCOL_LUFA) && CDC_OUT_EPNUM > (ENDPOINT_TOTAL_ENDPOINTS - 1)) || \ | 220 | #if (NEXT_EPNUM - 1) > MAX_ENDPOINTS |
| 253 | (defined(PROTOCOL_CHIBIOS) && CDC_OUT_EPNUM > USB_MAX_ENDPOINTS) | 221 | # error There are not enough available endpoints to support all functions. Remove some in the rules.mk file. (MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL, STENO) |
| 254 | # error "There are not enough available endpoints to support all functions. Remove some in the rules.mk file.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL, STENO)" | ||
| 255 | #endif | 222 | #endif |
| 256 | 223 | ||
| 257 | #define KEYBOARD_EPSIZE 8 | 224 | #define KEYBOARD_EPSIZE 8 |
| 225 | #define SHARED_EPSIZE 32 | ||
| 258 | #define MOUSE_EPSIZE 8 | 226 | #define MOUSE_EPSIZE 8 |
| 259 | #define EXTRAKEY_EPSIZE 8 | ||
| 260 | #define RAW_EPSIZE 32 | 227 | #define RAW_EPSIZE 32 |
| 261 | #define CONSOLE_EPSIZE 32 | 228 | #define CONSOLE_EPSIZE 32 |
| 262 | #define NKRO_EPSIZE 32 | ||
| 263 | #define MIDI_STREAM_EPSIZE 64 | 229 | #define MIDI_STREAM_EPSIZE 64 |
| 264 | #define CDC_NOTIFICATION_EPSIZE 8 | 230 | #define CDC_NOTIFICATION_EPSIZE 8 |
| 265 | #define CDC_EPSIZE 16 | 231 | #define CDC_EPSIZE 16 |
