diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 19a8243d6f..2bc8502cdd 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -92,6 +92,11 @@ ifeq ($(MUSIC_ENABLE), yes) SRC += $(QUANTUM_DIR)/process_keycode/process_music.c endif +ifeq ($(strip $(PLOVER_HID_ENABLE)), yes) + OPT_DEFS += -DPLOVER_HID_ENABLE + SRC += $(QUANTUM_DIR)/process_keycode/process_plover_hid.c +endif + ifeq ($(strip $(STENO_ENABLE)), yes) OPT_DEFS += -DSTENO_ENABLE VIRTSER_ENABLE ?= yes diff --git a/builddefs/show_options.mk b/builddefs/show_options.mk index f67d009191..8aa2f42ee2 100644 --- a/builddefs/show_options.mk +++ b/builddefs/show_options.mk @@ -66,6 +66,7 @@ OTHER_OPTION_NAMES = \ KEYLOGGER_ENABLE \ LCD_BACKLIGHT_ENABLE \ MACROS_ENABLED \ + PLOVER_HID_ENABLE \ PS2_MOUSE_ENABLE \ RAW_ENABLE \ SWAP_HANDS_ENABLE \ diff --git a/keyboards/gboards/georgi/georgi.c b/keyboards/gboards/georgi/georgi.c index 8866886ce7..0574d1da7c 100644 --- a/keyboards/gboards/georgi/georgi.c +++ b/keyboards/gboards/georgi/georgi.c @@ -4,7 +4,9 @@ bool i2c_initialized = 0; i2c_status_t mcp23018_status = 0x20; void matrix_init_kb(void) { +#ifdef STENO_ENABLE steno_set_mode(STENO_MODE_GEMINI); // or STENO_MODE_BOLT +#endif // (tied to Vcc for hardware convenience) //DDRB &= ~(1<<4); // set B(4) as input diff --git a/keyboards/gboards/georgi/keymaps/plover-hid/keymap.c b/keyboards/gboards/georgi/keymaps/plover-hid/keymap.c new file mode 100644 index 0000000000..66ba17c7f1 --- /dev/null +++ b/keyboards/gboards/georgi/keymaps/plover-hid/keymap.c @@ -0,0 +1,51 @@ +/* + * Good on you for modifying your layout, this is the most nonQMK layout you will come across + * There are three modes, Steno (the default), QWERTY (Toggleable) and a Momentary symbol layer + * + * Don't modify the steno layer directly, instead add chords using the keycodes and macros + * from sten.h to the layout you want to modify. + * + * Observe the comment above processQWERTY! + * + * http://docs.gboards.ca + */ + +#include QMK_KEYBOARD_H +//#include "sten.h" +#include "keymap_plover_hid.h" + +// Proper Layers +#define FUNCT (LSD | LK | LP | LH) +#define MEDIA (LSD | LK | LW | LR) +#define MOVE (ST1 | ST2) + +// QMK Layers +#define STENO_LAYER 0 + +/* Keyboard Layout + * ,---------------------------------. ,------------------------------. + * | FN | LSU | LFT | LP | LH | ST1 | | ST3 | RF | RP | RL | RT | RD | + * |-----+-----+-----+----+----|-----| |-----|----+----+----+----+----| + * | PWR | LSD | LK | LW | LR | ST2 | | ST4 | RR | BB | RG | RS | RZ | + * `---------------------------------' `------------------------------' + * ,---------------, .---------------. + * | LNO | LA | LO | | RE | RU | RNO | + * `---------------' `---------------' + */ + +// "Layers" +// Steno layer should be first in your map. +// When PWR | FN | ST3 | ST4 is pressed, the layer is increased to the next map. You must return to STENO_LAYER at the end. +// If you need more space for chords, remove the two gaming layers. +// Note: If using NO_ACTION_TAPPING, LT will not work! + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Main layer, everything goes through here + [0] = LAYOUT_georgi( + PLV_X1, PLV_SL, PLV_TL, PLV_PL, PLV_HL, PLV_STR, PLV_STR, PLV_FR, PLV_PR, PLV_LR, PLV_TR, PLV_DR, + PLV_X2, PLV_SL, PLV_KL, PLV_WL, PLV_RL, PLV_STR, PLV_STR, PLV_RR, PLV_BR, PLV_GR, PLV_SR, PLV_ZR, + PLV_NUM, PLV_A, PLV_O, PLV_E, PLV_U, PLV_NUM + ) +}; +// Don't fuck with this, thanks. +size_t keymapsCount = sizeof(keymaps)/sizeof(keymaps[0]); diff --git a/keyboards/gboards/georgi/keymaps/plover-hid/readme.md b/keyboards/gboards/georgi/keymaps/plover-hid/readme.md new file mode 100644 index 0000000000..0bfdd79b4a --- /dev/null +++ b/keyboards/gboards/georgi/keymaps/plover-hid/readme.md @@ -0,0 +1,14 @@ +# Georgi Plover HID firmware + +This is a steno-only firmware for the Georgi using the (as of now) experimental Plover HID protocol +instead of a serial steno protocol. + +This firmware only defines a keymap of the form: + +``` +X1 S1- T- P- H- S1 S3 -F -P -L -T -D +X2 S2- X- W- R- S2 S4 -R -B -G -S -Z + #1 A O E U #7 +``` + +and is meant to be used with the [plover-machine-hid](https://github.com/dnaq/plover-machine-hid) plugin. diff --git a/keyboards/gboards/georgi/keymaps/plover-hid/rules.mk b/keyboards/gboards/georgi/keymaps/plover-hid/rules.mk new file mode 100644 index 0000000000..666b7be058 --- /dev/null +++ b/keyboards/gboards/georgi/keymaps/plover-hid/rules.mk @@ -0,0 +1,46 @@ +#---------------------------------------------------------------------------- +# make georgi:default:dfu +# Make sure you have dfu-programmer installed! +#---------------------------------------------------------------------------- + +NO_REPEAT = no +VERBOSE = yes +KEYBOARD_SHARED_EP = yes +CUSTOM_MATRIX = yes + +#Firmware reduction options +MOUSEKEY_ENABLE = no # 1500 bytes +NO_TAPPING = yes # 2000 bytes +NO_PRINT = yes + +#Debug options +CONSOLE_ENABLE = no +DEBUG_MATRIX_SCAN_RATE = no +DEBUG_MATRIX = no +ONLY_QWERTY = no + +# A bunch of stuff that you shouldn't touch unless you +# know what you're doing. +# +# No touchy, capiche? +SRC += matrix.c i2c_master.c +ifeq ($(strip $(DEBUG_MATRIX)), yes) + OPT_DEFS += -DDEBUG_MATRIX +endif +ifeq ($(strip $(NO_REPEAT)), yes) + OPT_DEFS += -DNO_REPEAT +endif +ifeq ($(strip $(NO_PRINT)), yes) + OPT_DEFS += -DNO_PRINT -DNO_DEBUG +endif +ifeq ($(strip $(ONLY_QWERTY)), yes) + OPT_DEFS += -DONLYQWERTY +endif +ifeq ($(strip $(NO_TAPPING)), yes) + OPT_DEFS += -DNO_ACTION_TAPPING +endif + +USER_NAME := notexisting + +PLOVER_HID_ENABLE := yes +STENO_ENABLE := no diff --git a/keyboards/gboards/georgi/sten.c b/keyboards/gboards/georgi/sten.c index c7469b6394..46d8103e0b 100644 --- a/keyboards/gboards/georgi/sten.c +++ b/keyboards/gboards/georgi/sten.c @@ -50,6 +50,7 @@ uint16_t repTimer = 0; bool inMouse = false; int8_t mousePress; +#ifdef STENO_ENABLE // All processing done at chordUp goes through here bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[6]) { // Check for mousekeys, this is release @@ -146,6 +147,7 @@ out: return false; } +#endif // Update Chord State bool process_steno_user(uint16_t keycode, keyrecord_t *record) { diff --git a/quantum/keymap_extras/keymap_plover_hid.h b/quantum/keymap_extras/keymap_plover_hid.h new file mode 100644 index 0000000000..6a8d52d087 --- /dev/null +++ b/quantum/keymap_extras/keymap_plover_hid.h @@ -0,0 +1,89 @@ +/* Copyright 2017 Joseph Wasson + * + * 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 . + */ + +#pragma once + +#include "keymap.h" + +// List of keycodes for the plover HID. +enum steno_keycodes { + PLV__MIN = QK_PLOVER_HID, + PLV_SL = PLV__MIN, + PLV_TL, + PLV_KL, + PLV_PL, + PLV_WL, + PLV_HL, + PLV_RL, + PLV_A, + PLV_O, + PLV_STR, + PLV_E, + PLV_U, + PLV_FR, + PLV_RR, + PLV_PR, + PLV_BR, + PLV_LR, + PLV_GR, + PLV_TR, + PLV_SR, + PLV_DR, + PLV_ZR, + PLV_NUM, + PLV_X1, + PLV_X2, + PLV_X3, + PLV_X4, + PLV_X5, + PLV_X6, + PLV_X7, + PLV_X8, + PLV_X9, + PLV_X10, + PLV_X11, + PLV_X12, + PLV_X13, + PLV_X14, + PLV_X15, + PLV_X16, + PLV_X17, + PLV_X18, + PLV_X19, + PLV_X20, + PLV_X21, + PLV_X22, + PLV_X23, + PLV_X24, + PLV_X25, + PLV_X26, + PLV_X27, + PLV_X28, + PLV_X29, + PLV_X30, + PLV_X31, + PLV_X32, + PLV_X33, + PLV_X34, + PLV_X35, + PLV_X36, + PLV_X37, + PLV_X38, + PLV_X39, + PLV_X40, + PLV_X41, + PLV__MAX = PLV_X41, +}; diff --git a/quantum/plover_hid.h b/quantum/plover_hid.h new file mode 100644 index 0000000000..c21487ead2 --- /dev/null +++ b/quantum/plover_hid.h @@ -0,0 +1,4 @@ +#pragma once + +void plover_hid_update(uint8_t button, bool pressed); +void plover_hid_task(void); diff --git a/quantum/process_keycode/process_plover_hid.c b/quantum/process_keycode/process_plover_hid.c new file mode 100644 index 0000000000..7d7f97cfc2 --- /dev/null +++ b/quantum/process_keycode/process_plover_hid.c @@ -0,0 +1,11 @@ +#include "process_plover_hid.h" +#include "keymap_plover_hid.h" +#include "plover_hid.h" + +bool process_plover_hid(uint16_t keycode, keyrecord_t *record) { + if (keycode < PLV__MIN || keycode > PLV__MAX) { + return true; + } + plover_hid_update(keycode - PLV__MIN, record->event.pressed); + return false; +} diff --git a/quantum/process_keycode/process_plover_hid.h b/quantum/process_keycode/process_plover_hid.h new file mode 100644 index 0000000000..dd9bdb353a --- /dev/null +++ b/quantum/process_keycode/process_plover_hid.h @@ -0,0 +1,20 @@ +/* Copyright 2021 The QMK Project + * + * 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 . + */ +#pragma once + +#include "quantum.h" + +bool process_plover_hid(uint16_t keycode, keyrecord_t *record); diff --git a/quantum/quantum.c b/quantum/quantum.c index 33121f6b95..bdd14f4622 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -277,6 +277,9 @@ bool process_record_quantum(keyrecord_t *record) { #if defined(BACKLIGHT_ENABLE) || defined(LED_MATRIX_ENABLE) process_backlight(keycode, record) && #endif +#ifdef PLOVER_HID_ENABLE + process_plover_hid(keycode, record) && +#endif #ifdef STENO_ENABLE process_steno(keycode, record) && #endif diff --git a/quantum/quantum.h b/quantum/quantum.h index 92e1af1c40..fc11c3491b 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -81,6 +81,10 @@ extern layer_state_t layer_state; # endif #endif +#ifdef PLOVER_HID_ENABLE +# include "process_plover_hid.h" +#endif + #ifdef STENO_ENABLE # include "process_steno.h" #endif diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 40355d799a..3527de5950 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -65,6 +65,8 @@ enum quantum_keycodes { QK_STENO_COMB = 0x5A32, QK_STENO_COMB_MAX = 0x5A3C, QK_STENO_MAX = 0x5A3F, + QK_PLOVER_HID = 0x5A40, + QK_PLOVER_HID_MAX = 0x5A80, // 0x5C00 - 0x5FFF are reserved, see below QK_MOD_TAP = 0x6000, QK_MOD_TAP_MAX = 0x7FFF, diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index c9a480c325..3b2e21c6f6 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -74,6 +74,10 @@ void virtser_task(void); void raw_hid_task(void); #endif +#ifdef PLOVER_HID_ENABLE +void plover_hid_task(void); +#endif + #ifdef CONSOLE_ENABLE void console_task(void); #endif @@ -218,4 +222,7 @@ void protocol_post_task(void) { #ifdef RAW_ENABLE raw_hid_task(); #endif +#ifdef PLOVER_HID_ENABLE + plover_hid_task(); +#endif } diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 19e2e858fc..9100092b7d 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -313,6 +313,9 @@ typedef struct { #ifdef RAW_ENABLE usb_driver_config_t raw_driver; #endif +#ifdef PLOVER_HID_ENABLE + usb_driver_config_t plover_hid_driver; +#endif #ifdef MIDI_ENABLE usb_driver_config_t midi_driver; #endif @@ -350,6 +353,14 @@ static usb_driver_configs_t drivers = { .raw_driver = QMK_USB_DRIVER_CONFIG(RAW, 0, false), #endif +#ifdef PLOVER_HID_ENABLE +# define PLOVER_HID_IN_CAPACITY 4 +# define PLOVER_HID_OUT_CAPACITY 4 +# define PLOVER_HID_IN_MODE USB_EP_MODE_TYPE_INTR +# define PLOVER_HID_OUT_MODE USB_EP_MODE_TYPE_INTR + .plover_hid_driver = QMK_USB_DRIVER_CONFIG(PLOVER_HID, 0, false), +#endif + #ifdef MIDI_ENABLE # define MIDI_STREAM_IN_CAPACITY 4 # define MIDI_STREAM_OUT_CAPACITY 4 @@ -1087,6 +1098,26 @@ void console_task(void) { #endif /* CONSOLE_ENABLE */ +#ifdef PLOVER_HID_ENABLE +static bool plover_hid_report_updated = false; +static uint8_t plover_hid_current_report[PLOVER_HID_EPSIZE] = {0x50}; +void plover_hid_update(uint8_t button, bool pressed) { + if (pressed) { + plover_hid_current_report[1 + button/8] |= (1 << (7 - (button % 8))); + } else { + plover_hid_current_report[1 + button/8] &= ~(1 << (7 - (button % 8))); + } + plover_hid_report_updated = true; +} + +void plover_hid_task(void) { + if (plover_hid_report_updated) { + chnWrite(&drivers.plover_hid_driver.driver, plover_hid_current_report, sizeof(plover_hid_current_report)); + plover_hid_report_updated = false; + } +} +#endif + #ifdef RAW_ENABLE void raw_hid_send(uint8_t *data, uint8_t length) { // TODO: implement variable size packet diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index b4b03357a3..9a0549f6ec 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -86,6 +86,10 @@ extern keymap_config_t keymap_config; # include "raw_hid.h" #endif +#ifdef PLOVER_HID_ENABLE +# include "plover_hid.h" +#endif + #ifdef JOYSTICK_ENABLE # include "joystick.h" #endif @@ -209,6 +213,43 @@ static void raw_hid_task(void) { } #endif +#ifdef PLOVER_HID_ENABLE +static bool plover_hid_report_updated = false; +static uint8_t plover_hid_current_report[PLOVER_HID_EPSIZE] = {0x50}; +void plover_hid_update(uint8_t button, bool pressed) { + if (pressed) { + plover_hid_current_report[1 + button/8] |= (1 << (7 - (button % 8))); + } else { + plover_hid_current_report[1 + button/8] &= ~(1 << (7 - (button % 8))); + } + plover_hid_report_updated = true; +} + +void plover_hid_task(void) { + if (USB_DeviceState != DEVICE_STATE_Configured) { + return; + } + if (!plover_hid_report_updated) { + return; + } + + uint8_t ep = Endpoint_GetCurrentEndpoint(); + + Endpoint_SelectEndpoint(PLOVER_HID_IN_EPNUM); + + if (Endpoint_IsINReady()) { + // Write data + Endpoint_Write_Stream_LE(plover_hid_current_report, sizeof(plover_hid_current_report), NULL); + // Finalize The stream transfer to send the last packet + Endpoint_ClearIN(); + plover_hid_report_updated = false; + } + + Endpoint_SelectEndpoint(ep); + +} +#endif + /******************************************************************************* * Console ******************************************************************************/ @@ -436,6 +477,7 @@ void EVENT_USB_Device_StartOfFrame(void) { if (!console_flush) return; Console_Task(); console_flush = false; + } #endif @@ -471,6 +513,11 @@ void EVENT_USB_Device_ConfigurationChanged(void) { ConfigSuccess &= Endpoint_ConfigureEndpoint((RAW_OUT_EPNUM | ENDPOINT_DIR_OUT), EP_TYPE_INTERRUPT, RAW_EPSIZE, 1); #endif +#ifdef PLOVER_HID_ENABLE + /* Setup Plover HID endpoint */ + ConfigSuccess &= Endpoint_ConfigureEndpoint((PLOVER_HID_IN_EPNUM | ENDPOINT_DIR_IN), EP_TYPE_INTERRUPT, PLOVER_HID_EPSIZE, 1); +#endif + #ifdef CONSOLE_ENABLE /* Setup console endpoint */ ConfigSuccess &= Endpoint_ConfigureEndpoint((CONSOLE_IN_EPNUM | ENDPOINT_DIR_IN), EP_TYPE_INTERRUPT, CONSOLE_EPSIZE, 1); @@ -1096,6 +1143,10 @@ void protocol_post_task(void) { raw_hid_task(); #endif +#ifdef PLOVER_HID_ENABLE + plover_hid_task(); +#endif + #if !defined(INTERRUPT_CONTROL_ENDPOINT) USB_USBTask(); #endif diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index 063bd2c3f1..10f6c39dc0 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -322,6 +322,24 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM RawReport[] = { }; #endif +#ifdef PLOVER_HID_ENABLE +const USB_Descriptor_HIDReport_Datatype_t PROGMEM PloverReport[] = { + HID_RI_USAGE_PAGE(16, 0xff50), // + HID_RI_USAGE(16, 0x4c56), // Vendor Defined (0xff P L V) + HID_RI_COLLECTION(8, 0x01), // Application + HID_RI_REPORT_ID(8, 80), + HID_RI_LOGICAL_MINIMUM(8, 0), + HID_RI_LOGICAL_MAXIMUM(8, 1), + HID_RI_REPORT_SIZE(8, 1), + HID_RI_REPORT_COUNT(8, 64), + HID_RI_USAGE_PAGE(8, 0x0a), // Usage Page: Ordinal + HID_RI_USAGE_MINIMUM(8, 0), + HID_RI_USAGE_MAXIMUM(8, 63), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + HID_RI_END_COLLECTION(0), +}; +#endif + #ifdef CONSOLE_ENABLE const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = { HID_RI_USAGE_PAGE(16, 0xFF31), // Vendor Defined (PJRC Teensy compatible) @@ -554,6 +572,46 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = { }, #endif +#ifdef PLOVER_HID_ENABLE + /* + * Plover HID + */ + .Plover_Interface = { + .Header = { + .Size = sizeof(USB_Descriptor_Interface_t), + .Type = DTYPE_Interface + }, + .InterfaceNumber = PLOVER_HID_INTERFACE, + .AlternateSetting = 0x00, + .TotalEndpoints = 1, + .Class = HID_CSCP_HIDClass, + .SubClass = HID_CSCP_NonBootSubclass, + .Protocol = HID_CSCP_NonBootProtocol, + .InterfaceStrIndex = NO_DESCRIPTOR + }, + .Plover_HID = { + .Header = { + .Size = sizeof(USB_HID_Descriptor_HID_t), + .Type = HID_DTYPE_HID + }, + .HIDSpec = VERSION_BCD(1, 1, 1), + .CountryCode = 0x00, + .TotalReportDescriptors = 1, + .HIDReportType = HID_DTYPE_Report, + .HIDReportLength = sizeof(PloverReport) + }, + .Plover_INEndpoint = { + .Header = { + .Size = sizeof(USB_Descriptor_Endpoint_t), + .Type = DTYPE_Endpoint + }, + .EndpointAddress = (ENDPOINT_DIR_IN | PLOVER_HID_IN_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = RAW_EPSIZE, + .PollingIntervalMS = 0x01 + }, +#endif + #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) /* * Mouse @@ -1148,6 +1206,14 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const break; #endif +#ifdef PLOVER_HID_ENABLE + case PLOVER_HID_INTERFACE: + Address = &ConfigurationDescriptor.Plover_HID; + Size = sizeof(USB_HID_Descriptor_HID_t); + + break; +#endif + #ifdef CONSOLE_ENABLE case CONSOLE_INTERFACE: Address = &ConfigurationDescriptor.Console_HID; @@ -1205,6 +1271,14 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const break; #endif +#ifdef PLOVER_HID_ENABLE + case PLOVER_HID_INTERFACE: + Address = &PloverReport; + Size = sizeof(PloverReport); + + break; +#endif + #ifdef CONSOLE_ENABLE case CONSOLE_INTERFACE: Address = &ConsoleReport; diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index 6c3424145c..229dd3c2be 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h @@ -75,6 +75,13 @@ typedef struct { USB_Descriptor_Endpoint_t Raw_OUTEndpoint; #endif +#ifdef PLOVER_HID_ENABLE + // Plover HID Interface + USB_Descriptor_Interface_t Plover_Interface; + USB_HID_Descriptor_HID_t Plover_HID; + USB_Descriptor_Endpoint_t Plover_INEndpoint; +#endif + #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) // Mouse HID Interface USB_Descriptor_Interface_t Mouse_Interface; @@ -162,6 +169,10 @@ enum usb_interfaces { RAW_INTERFACE, #endif +#ifdef PLOVER_HID_ENABLE + PLOVER_HID_INTERFACE, +#endif + #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) MOUSE_INTERFACE, #endif @@ -223,6 +234,11 @@ enum usb_endpoints { # endif #endif +#ifdef PLOVER_HID_ENABLE + PLOVER_HID_IN_EPNUM = NEXT_EPNUM, + PLOVER_HID_OUT_EPNUM = NEXT_EPNUM, +#endif + #ifdef SHARED_EP_ENABLE SHARED_IN_EPNUM = NEXT_EPNUM, #endif @@ -303,6 +319,7 @@ enum usb_endpoints { #define SHARED_EPSIZE 32 #define MOUSE_EPSIZE 8 #define RAW_EPSIZE 32 +#define PLOVER_HID_EPSIZE 9 #define CONSOLE_EPSIZE 32 #define MIDI_STREAM_EPSIZE 64 #define CDC_NOTIFICATION_EPSIZE 8