diff options
Diffstat (limited to 'tmk_core/protocol')
-rw-r--r-- | tmk_core/protocol/bluefruit.mk | 11 | ||||
-rw-r--r-- | tmk_core/protocol/bluefruit/bluefruit.c | 168 | ||||
-rw-r--r-- | tmk_core/protocol/bluefruit/bluefruit.h | 24 | ||||
-rw-r--r-- | tmk_core/protocol/bluefruit/main.c | 87 | ||||
-rw-r--r-- | tmk_core/protocol/ibm4704.c | 4 | ||||
-rw-r--r-- | tmk_core/protocol/lufa/lufa.c | 2 | ||||
-rw-r--r-- | tmk_core/protocol/vusb.mk | 7 | ||||
-rw-r--r-- | tmk_core/protocol/vusb/main.c | 47 | ||||
-rw-r--r-- | tmk_core/protocol/vusb/usbconfig.h | 16 | ||||
-rw-r--r-- | tmk_core/protocol/vusb/vusb.c | 279 | ||||
-rw-r--r-- | tmk_core/protocol/vusb/vusb.h | 23 |
11 files changed, 301 insertions, 367 deletions
diff --git a/tmk_core/protocol/bluefruit.mk b/tmk_core/protocol/bluefruit.mk deleted file mode 100644 index 13a0693c57..0000000000 --- a/tmk_core/protocol/bluefruit.mk +++ /dev/null @@ -1,11 +0,0 @@ -BLUEFRUIT_DIR = protocol/bluefruit - -SRC += $(BLUEFRUIT_DIR)/main.c \ - $(BLUEFRUIT_DIR)/bluefruit.c \ - serial_uart.c - -# Search Path -VPATH += $(TMK_DIR)/$(BLUEFRUIT_DIR) -#VPATH += $(TMK_DIR)/$(BLUEFRUIT_DIR)/usb_debug_only - -OPT_DEFS += -DPROTOCOL_BLUEFRUIT diff --git a/tmk_core/protocol/bluefruit/bluefruit.c b/tmk_core/protocol/bluefruit/bluefruit.c deleted file mode 100644 index fb001855ea..0000000000 --- a/tmk_core/protocol/bluefruit/bluefruit.c +++ /dev/null @@ -1,168 +0,0 @@ -/* -Bluefruit Protocol for TMK firmware -Author: Benjamin Gould, 2013 -Based on code Copyright 2011 Jun Wako <wakojun@gmail.com> -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include <stdint.h> -#include "host.h" -#include "report.h" -#include "print.h" -#include "debug.h" -#include "host_driver.h" -#include "serial.h" -#include "bluefruit.h" - -#define BLUEFRUIT_TRACE_SERIAL 1 - -static uint8_t bluefruit_keyboard_leds = 0; - -static void bluefruit_serial_send(uint8_t); - -void bluefruit_keyboard_print_report(report_keyboard_t *report) { - if (!debug_keyboard) return; - dprintf("keys: "); - for (int i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - debug_hex8(report->keys[i]); - dprintf(" "); - } - dprintf(" mods: "); - debug_hex8(report->mods); - dprintf(" reserved: "); - debug_hex8(report->reserved); - dprintf("\n"); -} - -#ifdef BLUEFRUIT_TRACE_SERIAL -static void bluefruit_trace_header() { - dprintf("+------------------------------------+\n"); - dprintf("| HID report to Bluefruit via serial |\n"); - dprintf("+------------------------------------+\n|"); -} - -static void bluefruit_trace_footer() { dprintf("|\n+------------------------------------+\n\n"); } -#endif - -static void bluefruit_serial_send(uint8_t data) { -#ifdef BLUEFRUIT_TRACE_SERIAL - dprintf(" "); - debug_hex8(data); - dprintf(" "); -#endif - serial_send(data); -} - -/*------------------------------------------------------------------* - * Host driver - *------------------------------------------------------------------*/ - -static uint8_t keyboard_leds(void); -static void send_keyboard(report_keyboard_t *report); -static void send_mouse(report_mouse_t *report); -static void send_system(uint16_t data); -static void send_consumer(uint16_t data); - -void sendString(char string[], int length) { - for (int i = 0; i < length; i++) { - serial_send(string[i]); - } -} - -static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer}; - -host_driver_t *bluefruit_driver(void) { return &driver; } - -static uint8_t keyboard_leds(void) { return bluefruit_keyboard_leds; } - -static void send_keyboard(report_keyboard_t *report) { -#ifdef BLUEFRUIT_TRACE_SERIAL - bluefruit_trace_header(); -#endif - bluefruit_serial_send(0xFD); - for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) { - bluefruit_serial_send(report->raw[i]); - } -#ifdef BLUEFRUIT_TRACE_SERIAL - bluefruit_trace_footer(); -#endif -} - -static void send_mouse(report_mouse_t *report) { -#ifdef BLUEFRUIT_TRACE_SERIAL - bluefruit_trace_header(); -#endif - bluefruit_serial_send(0xFD); - bluefruit_serial_send(0x00); - bluefruit_serial_send(0x03); - bluefruit_serial_send(report->buttons); - bluefruit_serial_send(report->x); - bluefruit_serial_send(report->y); - bluefruit_serial_send(report->v); // should try sending the wheel v here - bluefruit_serial_send(report->h); // should try sending the wheel h here - bluefruit_serial_send(0x00); -#ifdef BLUEFRUIT_TRACE_SERIAL - bluefruit_trace_footer(); -#endif -} - -static void send_system(uint16_t data) {} - -/* -+-----------------+-------------------+-------+ -| Consumer Key | Bit Map | Hex | -+-----------------+-------------------+-------+ -| Home | 00000001 00000000 | 01 00 | -| KeyboardLayout | 00000010 00000000 | 02 00 | -| Search | 00000100 00000000 | 04 00 | -| Snapshot | 00001000 00000000 | 08 00 | -| VolumeUp | 00010000 00000000 | 10 00 | -| VolumeDown | 00100000 00000000 | 20 00 | -| Play/Pause | 01000000 00000000 | 40 00 | -| Fast Forward | 10000000 00000000 | 80 00 | -| Rewind | 00000000 00000001 | 00 01 | -| Scan Next Track | 00000000 00000010 | 00 02 | -| Scan Prev Track | 00000000 00000100 | 00 04 | -| Random Play | 00000000 00001000 | 00 08 | -| Stop | 00000000 00010000 | 00 10 | -+-------------------------------------+-------+ -*/ -#define CONSUMER2BLUEFRUIT(usage) (usage == AUDIO_MUTE ? 0x0000 : (usage == AUDIO_VOL_UP ? 0x1000 : (usage == AUDIO_VOL_DOWN ? 0x2000 : (usage == TRANSPORT_NEXT_TRACK ? 0x0002 : (usage == TRANSPORT_PREV_TRACK ? 0x0004 : (usage == TRANSPORT_STOP ? 0x0010 : (usage == TRANSPORT_STOP_EJECT ? 0x0000 : (usage == TRANSPORT_PLAY_PAUSE ? 0x4000 : (usage == AL_CC_CONFIG ? 0x0000 : (usage == AL_EMAIL ? 0x0000 : (usage == AL_CALCULATOR ? 0x0000 : (usage == AL_LOCAL_BROWSER ? 0x0000 : (usage == AC_SEARCH ? 0x0400 : (usage == AC_HOME ? 0x0100 : (usage == AC_BACK ? 0x0000 : (usage == AC_FORWARD ? 0x0000 : (usage == AC_STOP ? 0x0000 : (usage == AC_REFRESH ? 0x0000 : (usage == AC_BOOKMARKS ? 0x0000 : 0))))))))))))))))))) - -static void send_consumer(uint16_t data) { - static uint16_t last_data = 0; - if (data == last_data) return; - last_data = data; - - uint16_t bitmap = CONSUMER2BLUEFRUIT(data); - -#ifdef BLUEFRUIT_TRACE_SERIAL - dprintf("\nData: "); - debug_hex16(data); - dprintf("; bitmap: "); - debug_hex16(bitmap); - dprintf("\n"); - bluefruit_trace_header(); -#endif - bluefruit_serial_send(0xFD); - bluefruit_serial_send(0x00); - bluefruit_serial_send(0x02); - bluefruit_serial_send((bitmap >> 8) & 0xFF); - bluefruit_serial_send(bitmap & 0xFF); - bluefruit_serial_send(0x00); - bluefruit_serial_send(0x00); - bluefruit_serial_send(0x00); - bluefruit_serial_send(0x00); -#ifdef BLUEFRUIT_TRACE_SERIAL - bluefruit_trace_footer(); -#endif -}
\ No newline at end of file diff --git a/tmk_core/protocol/bluefruit/bluefruit.h b/tmk_core/protocol/bluefruit/bluefruit.h deleted file mode 100644 index 7b636abb95..0000000000 --- a/tmk_core/protocol/bluefruit/bluefruit.h +++ /dev/null @@ -1,24 +0,0 @@ -/* -Bluefruit Protocol for TMK firmware -Author: Benjamin Gould, 2013 -Based on code Copyright 2011 Jun Wako <wakojun@gmail.com> -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef VUSB_H -#define VUSB_H - -#include "host_driver.h" - -host_driver_t *bluefruit_driver(void); - -#endif
\ No newline at end of file diff --git a/tmk_core/protocol/bluefruit/main.c b/tmk_core/protocol/bluefruit/main.c deleted file mode 100644 index aca46206d5..0000000000 --- a/tmk_core/protocol/bluefruit/main.c +++ /dev/null @@ -1,87 +0,0 @@ -/* -Bluefruit Protocol for TMK firmware -Author: Benjamin Gould, 2013 -Based on code Copyright 2011 Jun Wako <wakojun@gmail.com> - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include <stdint.h> -#include <avr/interrupt.h> -#include <avr/wdt.h> -#include <avr/sleep.h> -#include <util/delay.h> -#include "../serial.h" -#include "keyboard.h" -#include "host.h" -#include "timer.h" -#include "print.h" -#include "debug.h" -#include "sendchar.h" -#include "suspend.h" -#include "bluefruit.h" - -#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) - -int main(void) { - CPU_PRESCALE(0); - - // DDRD = _BV(PD5); - // DDRB = _BV(PB0); - - // PORTD = _BV(PD5); - // PORTB = _BV(PB0); - - print_set_sendchar(sendchar); - - keyboard_setup(); - - dprintf("Initializing keyboard...\n"); - keyboard_init(); - - dprintf("Setting host driver to bluefruit...\n"); - host_set_driver(bluefruit_driver()); - - dprintf("Initializing serial...\n"); - serial_init(); - - // char swpa[] = "+++\r\n"; - // for (int i = 0; i < 5; i++) { - // serial_send(swpa[i]); - // } - - // char ble_enable[] = "AT+BLEKEYBOARDEN=1\r\n"; - // for (int i = 0; i < 20; i++) { - // serial_send(ble_enable[i]); - // } - - // char reset[] = "ATZ\r\n"; - // for (int i = 0; i < 5; i++) { - // serial_send(reset[i]); - // } - - // for (int i = 0; i < 5; i++) { - // serial_send(swpa[i]); - // } - - // wait an extra second for the PC's operating system - // to load drivers and do whatever it does to actually - // be ready for input - _delay_ms(1000); - // PORTD = ~_BV(PD5); - dprintf("Starting main loop"); - while (1) { - keyboard_task(); - } -} diff --git a/tmk_core/protocol/ibm4704.c b/tmk_core/protocol/ibm4704.c index fd8fc4dbd5..a19443976e 100644 --- a/tmk_core/protocol/ibm4704.c +++ b/tmk_core/protocol/ibm4704.c @@ -161,7 +161,9 @@ ISR(IBM4704_INT_VECT) { case STOP: // Data:Low WAIT(data_lo, 100, state); - rbuf_enqueue(data); + if (!rbuf_enqueue(data)) { + print("rbuf: full\n"); + } ibm4704_error = IBM4704_ERR_NONE; goto DONE; break; diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index d673841fd5..374add20f9 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -801,8 +801,6 @@ ERROR_EXIT: Endpoint_SelectEndpoint(ep); return -1; } -#else -int8_t sendchar(uint8_t c) { return 0; } #endif /******************************************************************************* diff --git a/tmk_core/protocol/vusb.mk b/tmk_core/protocol/vusb.mk index 897b833e1a..6df0d0d339 100644 --- a/tmk_core/protocol/vusb.mk +++ b/tmk_core/protocol/vusb.mk @@ -9,13 +9,12 @@ SRC += $(VUSB_DIR)/main.c \ $(VUSB_DIR)/usbdrv/oddebug.c -ifdef NO_UART -SRC += $(COMMON_DIR)/sendchar_null.c -else +ifneq ($(strip $(CONSOLE_ENABLE)), yes) +ifndef NO_UART SRC += $(COMMON_DIR)/sendchar_uart.c \ $(COMMON_DIR)/uart.c endif - +endif # Search Path VPATH += $(TMK_PATH)/$(VUSB_DIR) diff --git a/tmk_core/protocol/vusb/main.c b/tmk_core/protocol/vusb/main.c index 610638e7d4..7dc16926d2 100644 --- a/tmk_core/protocol/vusb/main.c +++ b/tmk_core/protocol/vusb/main.c @@ -21,12 +21,23 @@ #include "uart.h" #include "debug.h" #include "suspend.h" +#include "wait.h" +#include "sendchar.h" + #ifdef SLEEP_LED_ENABLE # include "sleep_led.h" #endif #define UART_BAUD_RATE 115200 +#ifdef CONSOLE_ENABLE +void console_task(void); +#endif + +#ifdef RAW_ENABLE +void raw_hid_task(void); +#endif + /* This is from main.c of USBaspLoader */ static void initForUsbConnectivity(void) { uint8_t i = 0; @@ -39,10 +50,9 @@ static void initForUsbConnectivity(void) { _delay_ms(1); } usbDeviceConnect(); - sei(); } -void usb_remote_wakeup(void) { +static void usb_remote_wakeup(void) { cli(); int8_t ddr_orig = USBDDR; @@ -59,6 +69,23 @@ void usb_remote_wakeup(void) { sei(); } +/** \brief Setup USB + * + * FIXME: Needs doc + */ +static void setup_usb(void) { + // debug("initForUsbConnectivity()\n"); + initForUsbConnectivity(); + + // for Console_Task + print_set_sendchar(sendchar); +} + +/** \brief Main + * + * FIXME: Needs doc + */ +int main(void) __attribute__((weak)); int main(void) { bool suspended = false; #if USB_COUNT_SOF @@ -76,8 +103,10 @@ int main(void) { keyboard_setup(); host_set_driver(vusb_driver()); - debug("initForUsbConnectivity()\n"); - initForUsbConnectivity(); + setup_usb(); + sei(); + + wait_ms(50); keyboard_init(); #ifdef SLEEP_LED_ENABLE @@ -120,12 +149,13 @@ int main(void) { if (!suspended) { usbPoll(); - // TODO: configuration process is incosistent. it sometime fails. + // TODO: configuration process is inconsistent. it sometime fails. // To prevent failing to configure NOT scan keyboard during configuration if (usbConfiguration && usbInterruptIsReady()) { keyboard_task(); } vusb_transfer_keyboard(); + #ifdef RAW_ENABLE usbPoll(); @@ -133,6 +163,13 @@ int main(void) { raw_hid_task(); } #endif +#ifdef CONSOLE_ENABLE + usbPoll(); + + if (usbConfiguration && usbInterruptIsReady3()) { + console_task(); + } +#endif } else if (suspend_wakeup_condition()) { usb_remote_wakeup(); } diff --git a/tmk_core/protocol/vusb/usbconfig.h b/tmk_core/protocol/vusb/usbconfig.h index f118dc8ede..dcef7584c4 100644 --- a/tmk_core/protocol/vusb/usbconfig.h +++ b/tmk_core/protocol/vusb/usbconfig.h @@ -24,15 +24,21 @@ section at the end of this file). /* ---------------------------- Hardware Config ---------------------------- */ +#ifndef USB_CFG_IOPORTNAME #define USB_CFG_IOPORTNAME D +#endif /* This is the port where the USB bus is connected. When you configure it to * "B", the registers PORTB, PINB and DDRB will be used. */ +#ifndef USB_CFG_DMINUS_BIT #define USB_CFG_DMINUS_BIT 3 +#endif /* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. * This may be any bit in the port. */ +#ifndef USB_CFG_DPLUS_BIT #define USB_CFG_DPLUS_BIT 2 +#endif /* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. * This may be any bit in the port. Please note that D+ must also be connected * to interrupt pin INT0! [You can also use other interrupts, see section @@ -151,7 +157,9 @@ section at the end of this file). /* This macro (if defined) is executed when a USB SET_ADDRESS request was * received. */ +#ifndef USB_COUNT_SOF #define USB_COUNT_SOF 1 +#endif /* define this macro to 1 if you need the global variable "usbSofCount" which * counts SOF packets. This feature requires that the hardware interrupt is * connected to D- instead of D+. @@ -321,10 +329,18 @@ section at the end of this file). /* Set INT1 for D- falling edge to count SOF */ /* #define USB_INTR_CFG EICRA */ +#ifndef USB_INTR_CFG_SET #define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10)) +#endif /* #define USB_INTR_CFG_CLR 0 */ /* #define USB_INTR_ENABLE EIMSK */ +#ifndef USB_INTR_ENABLE_BIT #define USB_INTR_ENABLE_BIT INT1 +#endif /* #define USB_INTR_PENDING EIFR */ +#ifndef USB_INTR_PENDING_BIT #define USB_INTR_PENDING_BIT INTF1 +#endif +#ifndef USB_INTR_VECTOR #define USB_INTR_VECTOR INT1_vect +#endif diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index c4baf5ab04..a9f37c61b0 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -15,25 +15,53 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <avr/eeprom.h> #include <avr/wdt.h> +#include <util/delay.h> #include <stdint.h> #include "usbdrv.h" #include "usbconfig.h" #include "host.h" #include "report.h" -#include "print.h" -#include "debug.h" #include "host_driver.h" #include "vusb.h" -#include <util/delay.h> +#include "print.h" +#include "debug.h" #ifdef RAW_ENABLE # include "raw_hid.h" #endif -#if (defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)) && defined(RAW_ENABLE) -# error "Enabling Mousekeys/Extrakeys and Raw HID at the same time is not currently supported on V-USB." +#if defined(CONSOLE_ENABLE) +# define RBUF_SIZE 128 +# include "ring_buffer.h" +#endif + +#define NEXT_INTERFACE __COUNTER__ + +/* + * Interface indexes + */ +enum usb_interfaces { + KEYBOARD_INTERFACE = NEXT_INTERFACE, +// 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, +#endif +#ifdef CONSOLE_ENABLE + CONSOLE_INTERFACE = NEXT_INTERFACE, +#endif + TOTAL_INTERFACES = NEXT_INTERFACE, +}; + +#define MAX_INTERFACES 2 + +#if (NEXT_INTERFACE - 1) > MAX_INTERFACES +# error There are not enough available interfaces to support all functions. Please disable one or more of the following: Mouse Keys, Extra Keys, Raw HID, Console #endif static uint8_t vusb_keyboard_leds = 0; @@ -120,7 +148,60 @@ void raw_hid_task(void) { raw_output_received_bytes = 0; } } +#endif + +/*------------------------------------------------------------------* + * Console + *------------------------------------------------------------------*/ +#ifdef CONSOLE_ENABLE +# define CONSOLE_BUFFER_SIZE 32 +# define CONSOLE_EPSIZE 8 + +int8_t sendchar(uint8_t c) { + rbuf_enqueue(c); + return 0; +} + +static inline bool usbSendData3(char *data, uint8_t len) { + uint8_t retries = 5; + while (!usbInterruptIsReady3()) { + if (!(retries--)) { + return false; + } + usbPoll(); + } + + usbSetInterrupt3((unsigned char *)data, len); + return true; +} +void console_task(void) { + if (!usbConfiguration) { + return; + } + + if (!rbuf_has_data()) { + return; + } + + // Send in chunks of 8 padded to 32 + char send_buf[CONSOLE_BUFFER_SIZE] = {0}; + uint8_t send_buf_count = 0; + while (rbuf_has_data() && send_buf_count < CONSOLE_EPSIZE) { + send_buf[send_buf_count++] = rbuf_dequeue(); + } + + char *temp = send_buf; + for (uint8_t i = 0; i < 4; i++) { + if (!usbSendData3(temp, 8)) { + break; + } + temp += 8; + } + + usbSendData3(0, 0); + usbPoll(); +} #endif /*------------------------------------------------------------------* @@ -326,6 +407,29 @@ const PROGMEM uchar keyboard_hid_report[] = { 0xC0 // End Collection }; +#ifdef RAW_ENABLE +const PROGMEM uchar raw_hid_report[] = { + 0x06, 0x60, 0xFF, // Usage Page (Vendor Defined) + 0x09, 0x61, // Usage (Vendor Defined) + 0xA1, 0x01, // Collection (Application) + // Data to host + 0x09, 0x62, // Usage (Vendor Defined) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, RAW_BUFFER_SIZE, // Report Count + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data, Variable, Absolute) + // Data from host + 0x09, 0x63, // Usage (Vendor Defined) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, RAW_BUFFER_SIZE, // Report Count + 0x75, 0x08, // Report Size (8) + 0x91, 0x02, // Output (Data, Variable, Absolute) + 0xC0 // End Collection +}; +#endif + #if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) const PROGMEM uchar mouse_extra_hid_report[] = { # ifdef MOUSE_ENABLE @@ -410,26 +514,26 @@ const PROGMEM uchar mouse_extra_hid_report[] = { }; #endif -#ifdef RAW_ENABLE -const PROGMEM uchar raw_hid_report[] = { - 0x06, 0x60, 0xFF, // Usage Page (Vendor Defined) - 0x09, 0x61, // Usage (Vendor Defined) +#if defined(CONSOLE_ENABLE) +const PROGMEM uchar console_hid_report[] = { + 0x06, 0x31, 0xFF, // Usage Page (Vendor Defined - PJRC Teensy compatible) + 0x09, 0x74, // Usage (Vendor Defined - PJRC Teensy compatible) 0xA1, 0x01, // Collection (Application) // Data to host - 0x09, 0x62, // Usage (Vendor Defined) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, RAW_BUFFER_SIZE, // Report Count - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data, Variable, Absolute) + 0x09, 0x75, // Usage (Vendor Defined) + 0x15, 0x00, // Logical Minimum (0x00) + 0x26, 0xFF, 0x00, // Logical Maximum (0x00FF) + 0x95, CONSOLE_BUFFER_SIZE, // Report Count + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data, Variable, Absolute) // Data from host - 0x09, 0x63, // Usage (Vendor Defined) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, RAW_BUFFER_SIZE, // Report Count - 0x75, 0x08, // Report Size (8) - 0x91, 0x02, // Output (Data, Variable, Absolute) - 0xC0, // End Collection + 0x09, 0x76, // Usage (Vendor Defined) + 0x15, 0x00, // Logical Minimum (0x00) + 0x26, 0xFF, 0x00, // Logical Maximum (0x00FF) + 0x95, CONSOLE_BUFFER_SIZE, // Report Count + 0x75, 0x08, // Report Size (8) + 0x91, 0x02, // Output (Data) + 0xC0 // End Collection }; #endif @@ -511,11 +615,7 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = { .bDescriptorType = USBDESCR_CONFIG }, .wTotalLength = sizeof(usbConfigurationDescriptor_t), -# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) || defined(RAW_ENABLE) - .bNumInterfaces = 2, -# else - .bNumInterfaces = 1, -# endif + .bNumInterfaces = TOTAL_INTERFACES, .bConfigurationValue = 0x01, .iConfiguration = 0x00, .bmAttributes = (1 << 7) | USBATTR_REMOTEWAKE, @@ -530,7 +630,7 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = { .bLength = sizeof(usbInterfaceDescriptor_t), .bDescriptorType = USBDESCR_INTERFACE }, - .bInterfaceNumber = 0, + .bInterfaceNumber = KEYBOARD_INTERFACE, .bAlternateSetting = 0x00, .bNumEndpoints = 1, .bInterfaceClass = 0x03, @@ -560,6 +660,55 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = { .bInterval = USB_POLLING_INTERVAL_MS }, +# if defined(RAW_ENABLE) + /* + * RAW HID + */ + .rawInterface = { + .header = { + .bLength = sizeof(usbInterfaceDescriptor_t), + .bDescriptorType = USBDESCR_INTERFACE + }, + .bInterfaceNumber = RAW_INTERFACE, + .bAlternateSetting = 0x00, + .bNumEndpoints = 2, + .bInterfaceClass = 0x03, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00 + }, + .rawHID = { + .header = { + .bLength = sizeof(usbHIDDescriptor_t), + .bDescriptorType = USBDESCR_HID + }, + .bcdHID = 0x0101, + .bCountryCode = 0x00, + .bNumDescriptors = 2, + .bDescriptorType = USBDESCR_HID_REPORT, + .wDescriptorLength = sizeof(raw_hid_report) + }, + .rawINEndpoint = { + .header = { + .bLength = sizeof(usbEndpointDescriptor_t), + .bDescriptorType = USBDESCR_ENDPOINT + }, + .bEndpointAddress = (USBRQ_DIR_DEVICE_TO_HOST | USB_CFG_EP3_NUMBER), + .bmAttributes = 0x03, + .wMaxPacketSize = RAW_EPSIZE, + .bInterval = USB_POLLING_INTERVAL_MS + }, + .rawOUTEndpoint = { + .header = { + .bLength = sizeof(usbEndpointDescriptor_t), + .bDescriptorType = USBDESCR_ENDPOINT + }, + .bEndpointAddress = (USBRQ_DIR_HOST_TO_DEVICE | USB_CFG_EP3_NUMBER), + .bmAttributes = 0x03, + .wMaxPacketSize = RAW_EPSIZE, + .bInterval = USB_POLLING_INTERVAL_MS + }, +# endif # if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) /* * Mouse/Extrakeys @@ -569,7 +718,7 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = { .bLength = sizeof(usbInterfaceDescriptor_t), .bDescriptorType = USBDESCR_INTERFACE }, - .bInterfaceNumber = 1, + .bInterfaceNumber = MOUSE_EXTRA_INTERFACE, .bAlternateSetting = 0x00, .bNumEndpoints = 1, .bInterfaceClass = 0x03, @@ -597,14 +746,18 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = { .bmAttributes = 0x03, .wMaxPacketSize = 8, .bInterval = USB_POLLING_INTERVAL_MS - } -# elif defined(RAW_ENABLE) - .rawInterface = { + }, +# endif +# if defined(CONSOLE_ENABLE) + /* + * Console + */ + .consoleInterface = { .header = { .bLength = sizeof(usbInterfaceDescriptor_t), .bDescriptorType = USBDESCR_INTERFACE }, - .bInterfaceNumber = 1, + .bInterfaceNumber = CONSOLE_INTERFACE, .bAlternateSetting = 0x00, .bNumEndpoints = 2, .bInterfaceClass = 0x03, @@ -612,37 +765,37 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = { .bInterfaceProtocol = 0x00, .iInterface = 0x00 }, - .rawHID = { + .consoleHID = { .header = { .bLength = sizeof(usbHIDDescriptor_t), .bDescriptorType = USBDESCR_HID }, - .bcdHID = 0x0101, + .bcdHID = 0x0111, .bCountryCode = 0x00, - .bNumDescriptors = 2, + .bNumDescriptors = 1, .bDescriptorType = USBDESCR_HID_REPORT, - .wDescriptorLength = sizeof(raw_hid_report) + .wDescriptorLength = sizeof(console_hid_report) }, - .rawINEndpoint = { + .consoleINEndpoint = { .header = { .bLength = sizeof(usbEndpointDescriptor_t), .bDescriptorType = USBDESCR_ENDPOINT }, .bEndpointAddress = (USBRQ_DIR_DEVICE_TO_HOST | USB_CFG_EP3_NUMBER), .bmAttributes = 0x03, - .wMaxPacketSize = RAW_EPSIZE, - .bInterval = USB_POLLING_INTERVAL_MS + .wMaxPacketSize = CONSOLE_EPSIZE, + .bInterval = 0x01 }, - .rawOUTEndpoint = { + .consoleOUTEndpoint = { .header = { .bLength = sizeof(usbEndpointDescriptor_t), .bDescriptorType = USBDESCR_ENDPOINT }, .bEndpointAddress = (USBRQ_DIR_HOST_TO_DEVICE | USB_CFG_EP3_NUMBER), .bmAttributes = 0x03, - .wMaxPacketSize = RAW_EPSIZE, - .bInterval = USB_POLLING_INTERVAL_MS - } + .wMaxPacketSize = CONSOLE_EPSIZE, + .bInterval = 0x01 + }, # endif }; @@ -690,18 +843,25 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) { break; case USBDESCR_HID: switch (rq->wValue.bytes[0]) { - case 0: + case KEYBOARD_INTERFACE: usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.keyboardHID; len = sizeof(usbHIDDescriptor_t); break; +#if defined(RAW_ENABLE) + case RAW_INTERFACE: + usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.rawHID; + len = sizeof(usbHIDDescriptor_t); + break; +#endif #if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) - case 1: + case MOUSE_EXTRA_INTERFACE: usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.mouseExtraHID; len = sizeof(usbHIDDescriptor_t); break; -#elif defined(RAW_ENABLE) - case 1: - usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.rawHID; +#endif +#if defined(CONSOLE_ENABLE) + case CONSOLE_INTERFACE: + usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.consoleHID; len = sizeof(usbHIDDescriptor_t); break; #endif @@ -710,19 +870,26 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) { case USBDESCR_HID_REPORT: /* interface index */ switch (rq->wIndex.word) { - case 0: + case KEYBOARD_INTERFACE: usbMsgPtr = (unsigned char *)keyboard_hid_report; len = sizeof(keyboard_hid_report); break; +#if defined(RAW_ENABLE) + case RAW_INTERFACE: + usbMsgPtr = (unsigned char *)raw_hid_report; + len = sizeof(raw_hid_report); + break; +#endif #if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) - case 1: + case MOUSE_EXTRA_INTERFACE: usbMsgPtr = (unsigned char *)mouse_extra_hid_report; len = sizeof(mouse_extra_hid_report); break; -#elif defined(RAW_ENABLE) - case 1: - usbMsgPtr = (unsigned char *)raw_hid_report; - len = sizeof(raw_hid_report); +#endif +#if defined(CONSOLE_ENABLE) + case CONSOLE_INTERFACE: + usbMsgPtr = (unsigned char *)console_hid_report; + len = sizeof(console_hid_report); break; #endif } diff --git a/tmk_core/protocol/vusb/vusb.h b/tmk_core/protocol/vusb/vusb.h index e097323fd0..828960fc35 100644 --- a/tmk_core/protocol/vusb/vusb.h +++ b/tmk_core/protocol/vusb/vusb.h @@ -89,23 +89,28 @@ typedef struct usbConfigurationDescriptor { usbHIDDescriptor_t keyboardHID; usbEndpointDescriptor_t keyboardINEndpoint; -#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) - usbInterfaceDescriptor_t mouseExtraInterface; - usbHIDDescriptor_t mouseExtraHID; - usbEndpointDescriptor_t mouseExtraINEndpoint; -#elif defined(RAW_ENABLE) +#if defined(RAW_ENABLE) usbInterfaceDescriptor_t rawInterface; usbHIDDescriptor_t rawHID; usbEndpointDescriptor_t rawINEndpoint; usbEndpointDescriptor_t rawOUTEndpoint; #e |