From fe0be19143034b62891eb84c724881096e052b00 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 2 Dec 2017 21:00:26 +0200 Subject: [PATCH 01/31] Move lufa descriptor to protocol/usb_descriptor --- tmk_core/common/report.h | 2 +- tmk_core/protocol/lufa.mk | 4 ++-- tmk_core/protocol/lufa/lufa.c | 2 +- tmk_core/protocol/{lufa/descriptor.c => usb_descriptor.c} | 2 +- tmk_core/protocol/{lufa/descriptor.h => usb_descriptor.h} | 0 5 files changed, 5 insertions(+), 5 deletions(-) rename tmk_core/protocol/{lufa/descriptor.c => usb_descriptor.c} (99%) rename tmk_core/protocol/{lufa/descriptor.h => usb_descriptor.h} (100%) diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index a0811f9a3c8d..f6757069c5c3 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -80,7 +80,7 @@ along with this program. If not, see . # define KEYBOARD_REPORT_BITS (KBD2_SIZE - 1) #elif defined(PROTOCOL_LUFA) && defined(NKRO_ENABLE) -# include "protocol/lufa/descriptor.h" +# include "protocol/usb_descriptor.h" # define KEYBOARD_REPORT_SIZE NKRO_EPSIZE # define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) # define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk index 4d005debcd56..bb82a31e17cc 100644 --- a/tmk_core/protocol/lufa.mk +++ b/tmk_core/protocol/lufa.mk @@ -15,7 +15,7 @@ else endif LUFA_SRC = lufa.c \ - descriptor.c \ + usb_descriptor.c \ outputselect.c \ $(LUFA_SRC_USB) @@ -64,7 +64,7 @@ LUFA_OPTS = -DUSB_DEVICE_ONLY LUFA_OPTS += -DUSE_FLASH_DESCRIPTORS LUFA_OPTS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" #LUFA_OPTS += -DINTERRUPT_CONTROL_ENDPOINT -LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 LUFA_OPTS += -DFIXED_NUM_CONFIGURATIONS=1 diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index e3f8724e81c0..929aec70d52c 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -49,7 +49,7 @@ #endif #include "suspend.h" -#include "descriptor.h" +#include "usb_descriptor.h" #include "lufa.h" #include "quantum.h" #include diff --git a/tmk_core/protocol/lufa/descriptor.c b/tmk_core/protocol/usb_descriptor.c similarity index 99% rename from tmk_core/protocol/lufa/descriptor.c rename to tmk_core/protocol/usb_descriptor.c index bfa91f25510d..a27842f3f197 100644 --- a/tmk_core/protocol/lufa/descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -38,7 +38,7 @@ #include "util.h" #include "report.h" -#include "descriptor.h" +#include "usb_descriptor.h" #ifndef USB_MAX_POWER_CONSUMPTION #define USB_MAX_POWER_CONSUMPTION 500 diff --git a/tmk_core/protocol/lufa/descriptor.h b/tmk_core/protocol/usb_descriptor.h similarity index 100% rename from tmk_core/protocol/lufa/descriptor.h rename to tmk_core/protocol/usb_descriptor.h From 0fefb3c40361bc13c4a54602f730647a03810e01 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 2 Dec 2017 21:05:17 +0200 Subject: [PATCH 02/31] Try to compile usb_descriptor on ChibiOS --- tmk_core/protocol/chibios.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/tmk_core/protocol/chibios.mk b/tmk_core/protocol/chibios.mk index 3f4e0a71fc85..3b5de5e2f830 100644 --- a/tmk_core/protocol/chibios.mk +++ b/tmk_core/protocol/chibios.mk @@ -4,6 +4,7 @@ CHIBIOS_DIR = $(PROTOCOL_DIR)/chibios SRC += $(CHIBIOS_DIR)/usb_main.c SRC += $(CHIBIOS_DIR)/main.c +SRC += usb_descriptor.c VPATH += $(TMK_PATH)/$(PROTOCOL_DIR) VPATH += $(TMK_PATH)/$(CHIBIOS_DIR) From cdaa810dc9119f77e6200feee5e2f0ef7981dbee Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 2 Dec 2017 22:16:08 +0200 Subject: [PATCH 03/31] Add lufa_utils for ChibiOS Lufa USB descriptors for ChibiOS --- tmk_core/protocol/chibios.mk | 2 +- .../Drivers/USB/Class/Common/HIDClassCommon.h | 681 ++++++++++++++++ .../LUFA/Drivers/USB/Core/StdDescriptors.h | 765 ++++++++++++++++++ .../chibios/lufa_utils/LUFA/Drivers/USB/USB.h | 8 + tmk_core/protocol/usb_descriptor.h | 2 - 5 files changed, 1455 insertions(+), 3 deletions(-) create mode 100644 tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h create mode 100644 tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/StdDescriptors.h create mode 100644 tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h diff --git a/tmk_core/protocol/chibios.mk b/tmk_core/protocol/chibios.mk index 3b5de5e2f830..4e225084ced4 100644 --- a/tmk_core/protocol/chibios.mk +++ b/tmk_core/protocol/chibios.mk @@ -8,4 +8,4 @@ SRC += usb_descriptor.c VPATH += $(TMK_PATH)/$(PROTOCOL_DIR) VPATH += $(TMK_PATH)/$(CHIBIOS_DIR) - +VPATH += $(TMK_PATH)/$(CHIBIOS_DIR)/lufa_utils diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h new file mode 100644 index 000000000000..3091000f248b --- /dev/null +++ b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h @@ -0,0 +1,681 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2017. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Common definitions and declarations for the library USB HID Class driver. + * + * Common definitions and declarations for the library USB HID Class driver. + * + * \note This file should not be included directly. It is automatically included as needed by the USB module driver + * dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassHID + * \defgroup Group_USBClassHIDCommon Common Class Definitions + * + * \section Sec_USBClassHIDCommon_ModDescription Module Description + * Constants, Types and Enum definitions that are common to both Device and Host modes for the USB + * HID Class. + * + * @{ + */ + +#ifndef _HID_CLASS_COMMON_H_ +#define _HID_CLASS_COMMON_H_ + + /* Includes: */ + #include "../../Core/StdDescriptors.h" + //#include "HIDParser.h" + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_HID_DRIVER) + #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. + #endif + + /* Macros: */ + /** \name Keyboard Standard Report Modifier Masks */ + //@{ + /** Constant for a keyboard report modifier byte, indicating that the keyboard's left control key is currently pressed. */ + #define HID_KEYBOARD_MODIFIER_LEFTCTRL (1 << 0) + + /** Constant for a keyboard report modifier byte, indicating that the keyboard's left shift key is currently pressed. */ + #define HID_KEYBOARD_MODIFIER_LEFTSHIFT (1 << 1) + + /** Constant for a keyboard report modifier byte, indicating that the keyboard's left alt key is currently pressed. */ + #define HID_KEYBOARD_MODIFIER_LEFTALT (1 << 2) + + /** Constant for a keyboard report modifier byte, indicating that the keyboard's left GUI key is currently pressed. */ + #define HID_KEYBOARD_MODIFIER_LEFTGUI (1 << 3) + + /** Constant for a keyboard report modifier byte, indicating that the keyboard's right control key is currently pressed. */ + #define HID_KEYBOARD_MODIFIER_RIGHTCTRL (1 << 4) + + /** Constant for a keyboard report modifier byte, indicating that the keyboard's right shift key is currently pressed. */ + #define HID_KEYBOARD_MODIFIER_RIGHTSHIFT (1 << 5) + + /** Constant for a keyboard report modifier byte, indicating that the keyboard's right alt key is currently pressed. */ + #define HID_KEYBOARD_MODIFIER_RIGHTALT (1 << 6) + + /** Constant for a keyboard report modifier byte, indicating that the keyboard's right GUI key is currently pressed. */ + #define HID_KEYBOARD_MODIFIER_RIGHTGUI (1 << 7) + //@} + + /** \name Keyboard Standard Report LED Masks */ + //@{ + /** Constant for a keyboard output report LED byte, indicating that the host's NUM LOCK mode is currently set. */ + #define HID_KEYBOARD_LED_NUMLOCK (1 << 0) + + /** Constant for a keyboard output report LED byte, indicating that the host's CAPS LOCK mode is currently set. */ + #define HID_KEYBOARD_LED_CAPSLOCK (1 << 1) + + /** Constant for a keyboard output report LED byte, indicating that the host's SCROLL LOCK mode is currently set. */ + #define HID_KEYBOARD_LED_SCROLLLOCK (1 << 2) + + /** Constant for a keyboard output report LED byte, indicating that the host's COMPOSE mode is currently set. */ + #define HID_KEYBOARD_LED_COMPOSE (1 << 3) + + /** Constant for a keyboard output report LED byte, indicating that the host's KANA mode is currently set. */ + #define HID_KEYBOARD_LED_KANA (1 << 4) + //@} + + /** \name Keyboard Standard Report Key Scan-codes */ + //@{ + #define HID_KEYBOARD_SC_ERROR_ROLLOVER 0x01 + #define HID_KEYBOARD_SC_POST_FAIL 0x02 + #define HID_KEYBOARD_SC_ERROR_UNDEFINED 0x03 + #define HID_KEYBOARD_SC_A 0x04 + #define HID_KEYBOARD_SC_B 0x05 + #define HID_KEYBOARD_SC_C 0x06 + #define HID_KEYBOARD_SC_D 0x07 + #define HID_KEYBOARD_SC_E 0x08 + #define HID_KEYBOARD_SC_F 0x09 + #define HID_KEYBOARD_SC_G 0x0A + #define HID_KEYBOARD_SC_H 0x0B + #define HID_KEYBOARD_SC_I 0x0C + #define HID_KEYBOARD_SC_J 0x0D + #define HID_KEYBOARD_SC_K 0x0E + #define HID_KEYBOARD_SC_L 0x0F + #define HID_KEYBOARD_SC_M 0x10 + #define HID_KEYBOARD_SC_N 0x11 + #define HID_KEYBOARD_SC_O 0x12 + #define HID_KEYBOARD_SC_P 0x13 + #define HID_KEYBOARD_SC_Q 0x14 + #define HID_KEYBOARD_SC_R 0x15 + #define HID_KEYBOARD_SC_S 0x16 + #define HID_KEYBOARD_SC_T 0x17 + #define HID_KEYBOARD_SC_U 0x18 + #define HID_KEYBOARD_SC_V 0x19 + #define HID_KEYBOARD_SC_W 0x1A + #define HID_KEYBOARD_SC_X 0x1B + #define HID_KEYBOARD_SC_Y 0x1C + #define HID_KEYBOARD_SC_Z 0x1D + #define HID_KEYBOARD_SC_1_AND_EXCLAMATION 0x1E + #define HID_KEYBOARD_SC_2_AND_AT 0x1F + #define HID_KEYBOARD_SC_3_AND_HASHMARK 0x20 + #define HID_KEYBOARD_SC_4_AND_DOLLAR 0x21 + #define HID_KEYBOARD_SC_5_AND_PERCENTAGE 0x22 + #define HID_KEYBOARD_SC_6_AND_CARET 0x23 + #define HID_KEYBOARD_SC_7_AND_AMPERSAND 0x24 + #define HID_KEYBOARD_SC_8_AND_ASTERISK 0x25 + #define HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS 0x26 + #define HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS 0x27 + #define HID_KEYBOARD_SC_ENTER 0x28 + #define HID_KEYBOARD_SC_ESCAPE 0x29 + #define HID_KEYBOARD_SC_BACKSPACE 0x2A + #define HID_KEYBOARD_SC_TAB 0x2B + #define HID_KEYBOARD_SC_SPACE 0x2C + #define HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE 0x2D + #define HID_KEYBOARD_SC_EQUAL_AND_PLUS 0x2E + #define HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE 0x2F + #define HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE 0x30 + #define HID_KEYBOARD_SC_BACKSLASH_AND_PIPE 0x31 + #define HID_KEYBOARD_SC_NON_US_HASHMARK_AND_TILDE 0x32 + #define HID_KEYBOARD_SC_SEMICOLON_AND_COLON 0x33 + #define HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE 0x34 + #define HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE 0x35 + #define HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN 0x36 + #define HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN 0x37 + #define HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK 0x38 + #define HID_KEYBOARD_SC_CAPS_LOCK 0x39 + #define HID_KEYBOARD_SC_F1 0x3A + #define HID_KEYBOARD_SC_F2 0x3B + #define HID_KEYBOARD_SC_F3 0x3C + #define HID_KEYBOARD_SC_F4 0x3D + #define HID_KEYBOARD_SC_F5 0x3E + #define HID_KEYBOARD_SC_F6 0x3F + #define HID_KEYBOARD_SC_F7 0x40 + #define HID_KEYBOARD_SC_F8 0x41 + #define HID_KEYBOARD_SC_F9 0x42 + #define HID_KEYBOARD_SC_F10 0x43 + #define HID_KEYBOARD_SC_F11 0x44 + #define HID_KEYBOARD_SC_F12 0x45 + #define HID_KEYBOARD_SC_PRINT_SCREEN 0x46 + #define HID_KEYBOARD_SC_SCROLL_LOCK 0x47 + #define HID_KEYBOARD_SC_PAUSE 0x48 + #define HID_KEYBOARD_SC_INSERT 0x49 + #define HID_KEYBOARD_SC_HOME 0x4A + #define HID_KEYBOARD_SC_PAGE_UP 0x4B + #define HID_KEYBOARD_SC_DELETE 0x4C + #define HID_KEYBOARD_SC_END 0x4D + #define HID_KEYBOARD_SC_PAGE_DOWN 0x4E + #define HID_KEYBOARD_SC_RIGHT_ARROW 0x4F + #define HID_KEYBOARD_SC_LEFT_ARROW 0x50 + #define HID_KEYBOARD_SC_DOWN_ARROW 0x51 + #define HID_KEYBOARD_SC_UP_ARROW 0x52 + #define HID_KEYBOARD_SC_NUM_LOCK 0x53 + #define HID_KEYBOARD_SC_KEYPAD_SLASH 0x54 + #define HID_KEYBOARD_SC_KEYPAD_ASTERISK 0x55 + #define HID_KEYBOARD_SC_KEYPAD_MINUS 0x56 + #define HID_KEYBOARD_SC_KEYPAD_PLUS 0x57 + #define HID_KEYBOARD_SC_KEYPAD_ENTER 0x58 + #define HID_KEYBOARD_SC_KEYPAD_1_AND_END 0x59 + #define HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW 0x5A + #define HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN 0x5B + #define HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW 0x5C + #define HID_KEYBOARD_SC_KEYPAD_5 0x5D + #define HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW 0x5E + #define HID_KEYBOARD_SC_KEYPAD_7_AND_HOME 0x5F + #define HID_KEYBOARD_SC_KEYPAD_8_AND_UP_ARROW 0x60 + #define HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP 0x61 + #define HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT 0x62 + #define HID_KEYBOARD_SC_KEYPAD_DOT_AND_DELETE 0x63 + #define HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE 0x64 + #define HID_KEYBOARD_SC_APPLICATION 0x65 + #define HID_KEYBOARD_SC_POWER 0x66 + #define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN 0x67 + #define HID_KEYBOARD_SC_F13 0x68 + #define HID_KEYBOARD_SC_F14 0x69 + #define HID_KEYBOARD_SC_F15 0x6A + #define HID_KEYBOARD_SC_F16 0x6B + #define HID_KEYBOARD_SC_F17 0x6C + #define HID_KEYBOARD_SC_F18 0x6D + #define HID_KEYBOARD_SC_F19 0x6E + #define HID_KEYBOARD_SC_F20 0x6F + #define HID_KEYBOARD_SC_F21 0x70 + #define HID_KEYBOARD_SC_F22 0x71 + #define HID_KEYBOARD_SC_F23 0x72 + #define HID_KEYBOARD_SC_F24 0x73 + #define HID_KEYBOARD_SC_EXECUTE 0x74 + #define HID_KEYBOARD_SC_HELP 0x75 + #define HID_KEYBOARD_SC_MENU 0x76 + #define HID_KEYBOARD_SC_SELECT 0x77 + #define HID_KEYBOARD_SC_STOP 0x78 + #define HID_KEYBOARD_SC_AGAIN 0x79 + #define HID_KEYBOARD_SC_UNDO 0x7A + #define HID_KEYBOARD_SC_CUT 0x7B + #define HID_KEYBOARD_SC_COPY 0x7C + #define HID_KEYBOARD_SC_PASTE 0x7D + #define HID_KEYBOARD_SC_FIND 0x7E + #define HID_KEYBOARD_SC_MUTE 0x7F + #define HID_KEYBOARD_SC_VOLUME_UP 0x80 + #define HID_KEYBOARD_SC_VOLUME_DOWN 0x81 + #define HID_KEYBOARD_SC_LOCKING_CAPS_LOCK 0x82 + #define HID_KEYBOARD_SC_LOCKING_NUM_LOCK 0x83 + #define HID_KEYBOARD_SC_LOCKING_SCROLL_LOCK 0x84 + #define HID_KEYBOARD_SC_KEYPAD_COMMA 0x85 + #define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN_AS400 0x86 + #define HID_KEYBOARD_SC_INTERNATIONAL1 0x87 + #define HID_KEYBOARD_SC_INTERNATIONAL2 0x88 + #define HID_KEYBOARD_SC_INTERNATIONAL3 0x89 + #define HID_KEYBOARD_SC_INTERNATIONAL4 0x8A + #define HID_KEYBOARD_SC_INTERNATIONAL5 0x8B + #define HID_KEYBOARD_SC_INTERNATIONAL6 0x8C + #define HID_KEYBOARD_SC_INTERNATIONAL7 0x8D + #define HID_KEYBOARD_SC_INTERNATIONAL8 0x8E + #define HID_KEYBOARD_SC_INTERNATIONAL9 0x8F + #define HID_KEYBOARD_SC_LANG1 0x90 + #define HID_KEYBOARD_SC_LANG2 0x91 + #define HID_KEYBOARD_SC_LANG3 0x92 + #define HID_KEYBOARD_SC_LANG4 0x93 + #define HID_KEYBOARD_SC_LANG5 0x94 + #define HID_KEYBOARD_SC_LANG6 0x95 + #define HID_KEYBOARD_SC_LANG7 0x96 + #define HID_KEYBOARD_SC_LANG8 0x97 + #define HID_KEYBOARD_SC_LANG9 0x98 + #define HID_KEYBOARD_SC_ALTERNATE_ERASE 0x99 + #define HID_KEYBOARD_SC_SYSREQ 0x9A + #define HID_KEYBOARD_SC_CANCEL 0x9B + #define HID_KEYBOARD_SC_CLEAR 0x9C + #define HID_KEYBOARD_SC_PRIOR 0x9D + #define HID_KEYBOARD_SC_RETURN 0x9E + #define HID_KEYBOARD_SC_SEPARATOR 0x9F + #define HID_KEYBOARD_SC_OUT 0xA0 + #define HID_KEYBOARD_SC_OPER 0xA1 + #define HID_KEYBOARD_SC_CLEAR_AND_AGAIN 0xA2 + #define HID_KEYBOARD_SC_CRSEL_AND_PROPS 0xA3 + #define HID_KEYBOARD_SC_EXSEL 0xA4 + #define HID_KEYBOARD_SC_KEYPAD_00 0xB0 + #define HID_KEYBOARD_SC_KEYPAD_000 0xB1 + #define HID_KEYBOARD_SC_THOUSANDS_SEPARATOR 0xB2 + #define HID_KEYBOARD_SC_DECIMAL_SEPARATOR 0xB3 + #define HID_KEYBOARD_SC_CURRENCY_UNIT 0xB4 + #define HID_KEYBOARD_SC_CURRENCY_SUB_UNIT 0xB5 + #define HID_KEYBOARD_SC_KEYPAD_OPENING_PARENTHESIS 0xB6 + #define HID_KEYBOARD_SC_KEYPAD_CLOSING_PARENTHESIS 0xB7 + #define HID_KEYBOARD_SC_KEYPAD_OPENING_BRACE 0xB8 + #define HID_KEYBOARD_SC_KEYPAD_CLOSING_BRACE 0xB9 + #define HID_KEYBOARD_SC_KEYPAD_TAB 0xBA + #define HID_KEYBOARD_SC_KEYPAD_BACKSPACE 0xBB + #define HID_KEYBOARD_SC_KEYPAD_A 0xBC + #define HID_KEYBOARD_SC_KEYPAD_B 0xBD + #define HID_KEYBOARD_SC_KEYPAD_C 0xBE + #define HID_KEYBOARD_SC_KEYPAD_D 0xBF + #define HID_KEYBOARD_SC_KEYPAD_E 0xC0 + #define HID_KEYBOARD_SC_KEYPAD_F 0xC1 + #define HID_KEYBOARD_SC_KEYPAD_XOR 0xC2 + #define HID_KEYBOARD_SC_KEYPAD_CARET 0xC3 + #define HID_KEYBOARD_SC_KEYPAD_PERCENTAGE 0xC4 + #define HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN 0xC5 + #define HID_KEYBOARD_SC_KEYPAD_GREATER_THAN_SIGN 0xC6 + #define HID_KEYBOARD_SC_KEYPAD_AMP 0xC7 + #define HID_KEYBOARD_SC_KEYPAD_AMP_AMP 0xC8 + #define HID_KEYBOARD_SC_KEYPAD_PIPE 0xC9 + #define HID_KEYBOARD_SC_KEYPAD_PIPE_PIPE 0xCA + #define HID_KEYBOARD_SC_KEYPAD_COLON 0xCB + #define HID_KEYBOARD_SC_KEYPAD_HASHMARK 0xCC + #define HID_KEYBOARD_SC_KEYPAD_SPACE 0xCD + #define HID_KEYBOARD_SC_KEYPAD_AT 0xCE + #define HID_KEYBOARD_SC_KEYPAD_EXCLAMATION_SIGN 0xCF + #define HID_KEYBOARD_SC_KEYPAD_MEMORY_STORE 0xD0 + #define HID_KEYBOARD_SC_KEYPAD_MEMORY_RECALL 0xD1 + #define HID_KEYBOARD_SC_KEYPAD_MEMORY_CLEAR 0xD2 + #define HID_KEYBOARD_SC_KEYPAD_MEMORY_ADD 0xD3 + #define HID_KEYBOARD_SC_KEYPAD_MEMORY_SUBTRACT 0xD4 + #define HID_KEYBOARD_SC_KEYPAD_MEMORY_MULTIPLY 0xD5 + #define HID_KEYBOARD_SC_KEYPAD_MEMORY_DIVIDE 0xD6 + #define HID_KEYBOARD_SC_KEYPAD_PLUS_AND_MINUS 0xD7 + #define HID_KEYBOARD_SC_KEYPAD_CLEAR 0xD8 + #define HID_KEYBOARD_SC_KEYPAD_CLEAR_ENTRY 0xD9 + #define HID_KEYBOARD_SC_KEYPAD_BINARY 0xDA + #define HID_KEYBOARD_SC_KEYPAD_OCTAL 0xDB + #define HID_KEYBOARD_SC_KEYPAD_DECIMAL 0xDC + #define HID_KEYBOARD_SC_KEYPAD_HEXADECIMAL 0xDD + #define HID_KEYBOARD_SC_LEFT_CONTROL 0xE0 + #define HID_KEYBOARD_SC_LEFT_SHIFT 0xE1 + #define HID_KEYBOARD_SC_LEFT_ALT 0xE2 + #define HID_KEYBOARD_SC_LEFT_GUI 0xE3 + #define HID_KEYBOARD_SC_RIGHT_CONTROL 0xE4 + #define HID_KEYBOARD_SC_RIGHT_SHIFT 0xE5 + #define HID_KEYBOARD_SC_RIGHT_ALT 0xE6 + #define HID_KEYBOARD_SC_RIGHT_GUI 0xE7 + #define HID_KEYBOARD_SC_MEDIA_PLAY 0xE8 + #define HID_KEYBOARD_SC_MEDIA_STOP 0xE9 + #define HID_KEYBOARD_SC_MEDIA_PREVIOUS_TRACK 0xEA + #define HID_KEYBOARD_SC_MEDIA_NEXT_TRACK 0xEB + #define HID_KEYBOARD_SC_MEDIA_EJECT 0xEC + #define HID_KEYBOARD_SC_MEDIA_VOLUME_UP 0xED + #define HID_KEYBOARD_SC_MEDIA_VOLUME_DOWN 0xEE + #define HID_KEYBOARD_SC_MEDIA_MUTE 0xEF + #define HID_KEYBOARD_SC_MEDIA_WWW 0xF0 + #define HID_KEYBOARD_SC_MEDIA_BACKWARD 0xF1 + #define HID_KEYBOARD_SC_MEDIA_FORWARD 0xF2 + #define HID_KEYBOARD_SC_MEDIA_CANCEL 0xF3 + #define HID_KEYBOARD_SC_MEDIA_SEARCH 0xF4 + #define HID_KEYBOARD_SC_MEDIA_SLEEP 0xF8 + #define HID_KEYBOARD_SC_MEDIA_LOCK 0xF9 + #define HID_KEYBOARD_SC_MEDIA_RELOAD 0xFA + #define HID_KEYBOARD_SC_MEDIA_CALCULATOR 0xFB + //@} + + /** \name Common HID Device Report Descriptors */ + //@{ + /** \hideinitializer + * A list of HID report item array elements that describe a typical HID USB Joystick. The resulting report + * descriptor is structured according to the following layout: + * + * \code + * struct + * { + * intA_t X; // Signed X axis value + * intA_t Y; // Signed Y axis value + * intA_t Z; // Signed Z axis value + * uintB_t Buttons; // Pressed buttons bitmask + * } Joystick_Report; + * \endcode + * + * Where \c uintA_t is a type large enough to hold the ranges of the signed \c MinAxisVal and \c MaxAxisVal values, + * and \c intB_t is a type large enough to hold one bit per button. + * + * \param[in] MinAxisVal Minimum logical axis value (16-bit). + * \param[in] MaxAxisVal Maximum logical axis value (16-bit). + * \param[in] MinPhysicalVal Minimum physical axis value, for movement resolution calculations (16-bit). + * \param[in] MaxPhysicalVal Maximum physical axis value, for movement resolution calculations (16-bit). + * \param[in] Buttons Total number of buttons in the device (8-bit). + */ + #define HID_DESCRIPTOR_JOYSTICK(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons) \ + HID_RI_USAGE_PAGE(8, 0x01), \ + HID_RI_USAGE(8, 0x04), \ + HID_RI_COLLECTION(8, 0x01), \ + HID_RI_USAGE(8, 0x01), \ + HID_RI_COLLECTION(8, 0x00), \ + HID_RI_USAGE(8, 0x30), \ + HID_RI_USAGE(8, 0x31), \ + HID_RI_USAGE(8, 0x32), \ + HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \ + HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \ + HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \ + HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \ + HID_RI_REPORT_COUNT(8, 3), \ + HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \ + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ + HID_RI_END_COLLECTION(0), \ + HID_RI_USAGE_PAGE(8, 0x09), \ + HID_RI_USAGE_MINIMUM(8, 0x01), \ + HID_RI_USAGE_MAXIMUM(8, Buttons), \ + HID_RI_LOGICAL_MINIMUM(8, 0x00), \ + HID_RI_LOGICAL_MAXIMUM(8, 0x01), \ + HID_RI_REPORT_SIZE(8, 0x01), \ + HID_RI_REPORT_COUNT(8, Buttons), \ + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ + HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \ + HID_RI_REPORT_COUNT(8, 0x01), \ + HID_RI_INPUT(8, HID_IOF_CONSTANT), \ + HID_RI_END_COLLECTION(0) + + /** \hideinitializer + * A list of HID report item array elements that describe a typical HID USB keyboard. The resulting report descriptor + * is compatible with \ref USB_KeyboardReport_Data_t when \c MaxKeys is equal to 6. For other values, the report will + * be structured according to the following layout: + * + * \code + * struct + * { + * uint8_t Modifier; // Keyboard modifier byte indicating pressed modifier keys (\c HID_KEYBOARD_MODIFER_* masks) + * uint8_t Reserved; // Reserved for OEM use, always set to 0. + * uint8_t KeyCode[MaxKeys]; // Length determined by the number of keys that can be reported + * } Keyboard_Report; + * \endcode + * + * \param[in] MaxKeys Number of simultaneous keys that can be reported at the one time (8-bit). + */ + #define HID_DESCRIPTOR_KEYBOARD(MaxKeys) \ + HID_RI_USAGE_PAGE(8, 0x01), \ + HID_RI_USAGE(8, 0x06), \ + HID_RI_COLLECTION(8, 0x01), \ + HID_RI_USAGE_PAGE(8, 0x07), \ + HID_RI_USAGE_MINIMUM(8, 0xE0), \ + HID_RI_USAGE_MAXIMUM(8, 0xE7), \ + HID_RI_LOGICAL_MINIMUM(8, 0x00), \ + HID_RI_LOGICAL_MAXIMUM(8, 0x01), \ + HID_RI_REPORT_SIZE(8, 0x01), \ + HID_RI_REPORT_COUNT(8, 0x08), \ + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ + HID_RI_REPORT_COUNT(8, 0x01), \ + HID_RI_REPORT_SIZE(8, 0x08), \ + HID_RI_INPUT(8, HID_IOF_CONSTANT), \ + HID_RI_USAGE_PAGE(8, 0x08), \ + HID_RI_USAGE_MINIMUM(8, 0x01), \ + HID_RI_USAGE_MAXIMUM(8, 0x05), \ + HID_RI_REPORT_COUNT(8, 0x05), \ + HID_RI_REPORT_SIZE(8, 0x01), \ + HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \ + HID_RI_REPORT_COUNT(8, 0x01), \ + HID_RI_REPORT_SIZE(8, 0x03), \ + HID_RI_OUTPUT(8, HID_IOF_CONSTANT), \ + HID_RI_LOGICAL_MINIMUM(8, 0x00), \ + HID_RI_LOGICAL_MAXIMUM(16, 0xFF), \ + HID_RI_USAGE_PAGE(8, 0x07), \ + HID_RI_USAGE_MINIMUM(8, 0x00), \ + HID_RI_USAGE_MAXIMUM(8, 0xFF), \ + HID_RI_REPORT_COUNT(8, MaxKeys), \ + HID_RI_REPORT_SIZE(8, 0x08), \ + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), \ + HID_RI_END_COLLECTION(0) + + /** \hideinitializer + * A list of HID report item array elements that describe a typical HID USB mouse. The resulting report descriptor + * is compatible with \ref USB_MouseReport_Data_t if the \c MinAxisVal and \c MaxAxisVal values fit within a \c int8_t range + * and the number of Buttons is less than 8. For other values, the report is structured according to the following layout: + * + * \code + * struct + * { + * uintA_t Buttons; // Pressed buttons bitmask + * intB_t X; // X axis value + * intB_t Y; // Y axis value + * } Mouse_Report; + * \endcode + * + * Where \c intA_t is a type large enough to hold one bit per button, and \c intB_t is a type large enough to hold the + * ranges of the signed \c MinAxisVal and \c MaxAxisVal values. + * + * \param[in] MinAxisVal Minimum X/Y logical axis value (16-bit). + * \param[in] MaxAxisVal Maximum X/Y logical axis value (16-bit). + * \param[in] MinPhysicalVal Minimum X/Y physical axis value, for movement resolution calculations (16-bit). + * \param[in] MaxPhysicalVal Maximum X/Y physical axis value, for movement resolution calculations (16-bit). + * \param[in] Buttons Total number of buttons in the device (8-bit). + * \param[in] AbsoluteCoords Boolean \c true to use absolute X/Y coordinates (e.g. touchscreen). + */ + #define HID_DESCRIPTOR_MOUSE(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, AbsoluteCoords) \ + HID_RI_USAGE_PAGE(8, 0x01), \ + HID_RI_USAGE(8, 0x02), \ + HID_RI_COLLECTION(8, 0x01), \ + HID_RI_USAGE(8, 0x01), \ + HID_RI_COLLECTION(8, 0x00), \ + HID_RI_USAGE_PAGE(8, 0x09), \ + HID_RI_USAGE_MINIMUM(8, 0x01), \ + HID_RI_USAGE_MAXIMUM(8, Buttons), \ + HID_RI_LOGICAL_MINIMUM(8, 0x00), \ + HID_RI_LOGICAL_MAXIMUM(8, 0x01), \ + HID_RI_REPORT_COUNT(8, Buttons), \ + HID_RI_REPORT_SIZE(8, 0x01), \ + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ + HID_RI_REPORT_COUNT(8, 0x01), \ + HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \ + HID_RI_INPUT(8, HID_IOF_CONSTANT), \ + HID_RI_USAGE_PAGE(8, 0x01), \ + HID_RI_USAGE(8, 0x30), \ + HID_RI_USAGE(8, 0x31), \ + HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \ + HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \ + HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \ + HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \ + HID_RI_REPORT_COUNT(8, 0x02), \ + HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \ + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | (AbsoluteCoords ? HID_IOF_ABSOLUTE : HID_IOF_RELATIVE)), \ + HID_RI_END_COLLECTION(0), \ + HID_RI_END_COLLECTION(0) + + /** \hideinitializer + * A list of HID report item array elements that describe a typical Vendor Defined byte array HID report descriptor, + * used for transporting arbitrary data between the USB host and device via HID reports. The resulting report should be + * a \c uint8_t byte array of the specified length in both Device to Host (IN) and Host to Device (OUT) directions. + * + * \param[in] VendorPageNum Vendor Defined HID Usage Page index, ranging from 0x00 to 0xFF. + * \param[in] CollectionUsage Vendor Usage for the encompassing report IN and OUT collection, ranging from 0x00 to 0xFF. + * \param[in] DataINUsage Vendor Usage for the IN report data, ranging from 0x00 to 0xFF. + * \param[in] DataOUTUsage Vendor Usage for the OUT report data, ranging from 0x00 to 0xFF. + * \param[in] NumBytes Length of the data IN and OUT reports. + */ + #define HID_DESCRIPTOR_VENDOR(VendorPageNum, CollectionUsage, DataINUsage, DataOUTUsage, NumBytes) \ + HID_RI_USAGE_PAGE(16, (0xFF00 | VendorPageNum)), \ + HID_RI_USAGE(8, CollectionUsage), \ + HID_RI_COLLECTION(8, 0x01), \ + HID_RI_USAGE(8, DataINUsage), \ + HID_RI_LOGICAL_MINIMUM(8, 0x00), \ + HID_RI_LOGICAL_MAXIMUM(8, 0xFF), \ + HID_RI_REPORT_SIZE(8, 0x08), \ + HID_RI_REPORT_COUNT(8, NumBytes), \ + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ + HID_RI_USAGE(8, DataOUTUsage), \ + HID_RI_LOGICAL_MINIMUM(8, 0x00), \ + HID_RI_LOGICAL_MAXIMUM(8, 0xFF), \ + HID_RI_REPORT_SIZE(8, 0x08), \ + HID_RI_REPORT_COUNT(8, NumBytes), \ + HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \ + HID_RI_END_COLLECTION(0) + //@} + + /* Type Defines: */ + /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the HID + * device class. + */ + enum HID_Descriptor_ClassSubclassProtocol_t + { + HID_CSCP_HIDClass = 0x03, /**< Descriptor Class value indicating that the device or interface + * belongs to the HID class. + */ + HID_CSCP_NonBootSubclass = 0x00, /**< Descriptor Subclass value indicating that the device or interface + * does not implement a HID boot protocol. + */ + HID_CSCP_BootSubclass = 0x01, /**< Descriptor Subclass value indicating that the device or interface + * implements a HID boot protocol. + */ + HID_CSCP_NonBootProtocol = 0x00, /**< Descriptor Protocol value indicating that the device or interface + * does not belong to a HID boot protocol. + */ + HID_CSCP_KeyboardBootProtocol = 0x01, /**< Descriptor Protocol value indicating that the device or interface + * belongs to the Keyboard HID boot protocol. + */ + HID_CSCP_MouseBootProtocol = 0x02, /**< Descriptor Protocol value indicating that the device or interface + * belongs to the Mouse HID boot protocol. + */ + }; + + /** Enum for the HID class specific control requests that can be issued by the USB bus host. */ + enum HID_ClassRequests_t + { + HID_REQ_GetReport = 0x01, /**< HID class-specific Request to get the current HID report from the device. */ + HID_REQ_GetIdle = 0x02, /**< HID class-specific Request to get the current device idle count. */ + HID_REQ_GetProtocol = 0x03, /**< HID class-specific Request to get the current HID report protocol mode. */ + HID_REQ_SetReport = 0x09, /**< HID class-specific Request to set the current HID report to the device. */ + HID_REQ_SetIdle = 0x0A, /**< HID class-specific Request to set the device's idle count. */ + HID_REQ_SetProtocol = 0x0B, /**< HID class-specific Request to set the current HID report protocol mode. */ + }; + + /** Enum for the HID class specific descriptor types. */ + enum HID_DescriptorTypes_t + { + HID_DTYPE_HID = 0x21, /**< Descriptor header type value, to indicate a HID class HID descriptor. */ + HID_DTYPE_Report = 0x22, /**< Descriptor header type value, to indicate a HID class HID report descriptor. */ + }; + + /** Enum for the different types of HID reports. */ + enum HID_ReportItemTypes_t + { + HID_REPORT_ITEM_In = 0, /**< Indicates that the item is an IN report type. */ + HID_REPORT_ITEM_Out = 1, /**< Indicates that the item is an OUT report type. */ + HID_REPORT_ITEM_Feature = 2, /**< Indicates that the item is a FEATURE report type. */ + }; + + /** \brief HID class-specific HID Descriptor (LUFA naming conventions). + * + * Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID + * specification for details on the structure elements. + * + * \see \ref USB_HID_StdDescriptor_HID_t for the version of this type with standard element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ + + uint16_t HIDSpec; /**< BCD encoded version that the HID descriptor and device complies to. + * + * \see \ref VERSION_BCD() utility macro. + */ + uint8_t CountryCode; /**< Country code of the localized device, or zero if universal. */ + + uint8_t TotalReportDescriptors; /**< Total number of HID report descriptors for the interface. */ + + uint8_t HIDReportType; /**< Type of HID report, set to \ref HID_DTYPE_Report. */ + uint16_t HIDReportLength; /**< Length of the associated HID report descriptor, in bytes. */ + } ATTR_PACKED USB_HID_Descriptor_HID_t; + + /** \brief HID class-specific HID Descriptor (USB-IF naming conventions). + * + * Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID + * specification for details on the structure elements. + * + * \see \ref USB_HID_Descriptor_HID_t for the version of this type with non-standard LUFA specific + * element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint8_t bLength; /**< Size of the descriptor, in bytes. */ + uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value + * given by the specific class. + */ + + uint16_t bcdHID; /**< BCD encoded version that the HID descriptor and device complies to. + * + * \see \ref VERSION_BCD() utility macro. + */ + uint8_t bCountryCode; /**< Country code of the localized device, or zero if universal. */ + + uint8_t bNumDescriptors; /**< Total number of HID report descriptors for the interface. */ + + uint8_t bDescriptorType2; /**< Type of HID report, set to \ref HID_DTYPE_Report. */ + uint16_t wDescriptorLength; /**< Length of the associated HID report descriptor, in bytes. */ + } ATTR_PACKED USB_HID_StdDescriptor_HID_t; + + /** \brief Standard HID Boot Protocol Mouse Report. + * + * Type define for a standard Boot Protocol Mouse report + */ + typedef struct + { + uint8_t Button; /**< Button mask for currently pressed buttons in the mouse. */ + int8_t X; /**< Current delta X movement of the mouse. */ + int8_t Y; /**< Current delta Y movement on the mouse. */ + } ATTR_PACKED USB_MouseReport_Data_t; + + /** \brief Standard HID Boot Protocol Keyboard Report. + * + * Type define for a standard Boot Protocol Keyboard report + */ + typedef struct + { + uint8_t Modifier; /**< Keyboard modifier byte, indicating pressed modifier keys (a combination of + * \c HID_KEYBOARD_MODIFER_* masks). + */ + uint8_t Reserved; /**< Reserved for OEM use, always set to 0. */ + uint8_t KeyCode[6]; /**< Key codes of the currently pressed keys. */ + } ATTR_PACKED USB_KeyboardReport_Data_t; + + /** Type define for the data type used to store HID report descriptor elements. */ + typedef uint8_t USB_Descriptor_HIDReport_Datatype_t; + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/StdDescriptors.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/StdDescriptors.h new file mode 100644 index 000000000000..1003b258c2b0 --- /dev/null +++ b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/StdDescriptors.h @@ -0,0 +1,765 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2017. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Common standard USB Descriptor definitions for all architectures. + * \copydetails Group_StdDescriptors + * + * \note This file should not be included directly. It is automatically included as needed by the USB driver + * dispatch header located in LUFA/Drivers/USB/USB.h. + */ + +/** \ingroup Group_USB + * \defgroup Group_StdDescriptors USB Descriptors + * \brief Standard USB Descriptor definitions. + * + * Standard USB device descriptor defines and retrieval routines, for USB devices. This module contains + * structures and macros for the easy creation of standard USB descriptors in USB device projects. + * + * @{ + */ + +#ifndef __USBDESCRIPTORS_H__ +#define __USBDESCRIPTORS_H__ + + /* Includes: */ + //#include "../../../Common/Common.h" + //#include "USBMode.h" + //#include "Events.h" + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_USB_DRIVER) + #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** Indicates that a given descriptor does not exist in the device. This can be used inside descriptors + * for string descriptor indexes, or may be use as a return value for GetDescriptor when the specified + * descriptor does not exist. + */ + #define NO_DESCRIPTOR 0 + + /** Macro to calculate the power value for the configuration descriptor, from a given number of milliamperes. + * + * \param[in] mA Maximum number of milliamps the device consumes when the given configuration is selected. + */ + #define USB_CONFIG_POWER_MA(mA) ((mA) >> 1) + + /** Macro to calculate the Unicode length of a string with a given number of Unicode characters. + * Should be used in string descriptor's headers for giving the string descriptor's byte length. + * + * \param[in] UnicodeChars Number of Unicode characters in the string text. + */ + #define USB_STRING_LEN(UnicodeChars) (sizeof(USB_Descriptor_Header_t) + ((UnicodeChars) << 1)) + + /** Convenience macro to easily create \ref USB_Descriptor_String_t instances from a wide character string. + * + * \note This macro is for little-endian systems only. + * + * \param[in] String String to initialize a USB String Descriptor structure with. + */ + #define USB_STRING_DESCRIPTOR(String) { .Header = {.Size = sizeof(USB_Descriptor_Header_t) + (sizeof(String) - 2), .Type = DTYPE_String}, .UnicodeString = String } + + /** Convenience macro to easily create \ref USB_Descriptor_String_t instances from an array of characters. + * + * \param[in] ... Characters to initialize a USB String Descriptor structure with. + */ + #define USB_STRING_DESCRIPTOR_ARRAY(...) { .Header = {.Size = sizeof(USB_Descriptor_Header_t) + sizeof((uint16_t){__VA_ARGS__}), .Type = DTYPE_String}, .UnicodeString = {__VA_ARGS__} } + + /** Macro to encode a given major/minor/revision version number into Binary Coded Decimal format for descriptor + * fields requiring BCD encoding, such as the USB version number in the standard device descriptor. + * + * \note This value is automatically converted into Little Endian, suitable for direct use inside device + * descriptors on all architectures without endianness conversion macros. + * + * \param[in] Major Major version number to encode. + * \param[in] Minor Minor version number to encode. + * \param[in] Revision Revision version number to encode. + */ + #define VERSION_BCD(Major, Minor, Revision) \ + CPU_TO_LE16( ((Major & 0xFF) << 8) | \ + ((Minor & 0x0F) << 4) | \ + (Revision & 0x0F) ) + + /** String language ID for the English language. Should be used in \ref USB_Descriptor_String_t descriptors + * to indicate that the English language is supported by the device in its string descriptors. + */ + #define LANGUAGE_ID_ENG 0x0409 + + /** \name USB Configuration Descriptor Attribute Masks */ + //@{ + /** Mask for the reserved bit in the Configuration Descriptor's \c ConfigAttributes field, which must be set on all + * devices for historical purposes. + */ + #define USB_CONFIG_ATTR_RESERVED 0x80 + + /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t + * descriptor's \c ConfigAttributes value to indicate that the specified configuration can draw its power + * from the device's own power source. + */ + #define USB_CONFIG_ATTR_SELFPOWERED 0x40 + + /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t + * descriptor's \c ConfigAttributes value to indicate that the specified configuration supports the + * remote wakeup feature of the USB standard, allowing a suspended USB device to wake up the host upon + * request. + */ + #define USB_CONFIG_ATTR_REMOTEWAKEUP 0x20 + //@} + + /** \name Endpoint Descriptor Attribute Masks */ + //@{ + /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's + * \c Attributes value to indicate that the specified endpoint is not synchronized. + * + * \see The USB specification for more details on the possible Endpoint attributes. + */ + #define ENDPOINT_ATTR_NO_SYNC (0 << 2) + + /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's + * \c Attributes value to indicate that the specified endpoint is asynchronous. + * + * \see The USB specification for more details on the possible Endpoint attributes. + */ + #define ENDPOINT_ATTR_ASYNC (1 << 2) + + /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's + * \c Attributes value to indicate that the specified endpoint is adaptive. + * + * \see The USB specification for more details on the possible Endpoint attributes. + */ + #define ENDPOINT_ATTR_ADAPTIVE (2 << 2) + + /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's + * \c Attributes value to indicate that the specified endpoint is synchronized. + * + * \see The USB specification for more details on the possible Endpoint attributes. + */ + #define ENDPOINT_ATTR_SYNC (3 << 2) + //@} + + /** \name Endpoint Descriptor Usage Masks */ + //@{ + /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's + * \c Attributes value to indicate that the specified endpoint is used for data transfers. + * + * \see The USB specification for more details on the possible Endpoint usage attributes. + */ + #define ENDPOINT_USAGE_DATA (0 << 4) + + /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's + * \c Attributes value to indicate that the specified endpoint is used for feedback. + * + * \see The USB specification for more details on the possible Endpoint usage attributes. + */ + #define ENDPOINT_USAGE_FEEDBACK (1 << 4) + + /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's + * \c Attributes value to indicate that the specified endpoint is used for implicit feedback. + * + * \see The USB specification for more details on the possible Endpoint usage attributes. + */ + #define ENDPOINT_USAGE_IMPLICIT_FEEDBACK (2 << 4) + //@} + + /* Enums: */ + /** Enum for the possible standard descriptor types, as given in each descriptor's header. */ + enum USB_DescriptorTypes_t + { + DTYPE_Device = 0x01, /**< Indicates that the descriptor is a device descriptor. */ + DTYPE_Configuration = 0x02, /**< Indicates that the descriptor is a configuration descriptor. */ + DTYPE_String = 0x03, /**< Indicates that the descriptor is a string descriptor. */ + DTYPE_Interface = 0x04, /**< Indicates that the descriptor is an interface descriptor. */ + DTYPE_Endpoint = 0x05, /**< Indicates that the descriptor is an endpoint descriptor. */ + DTYPE_DeviceQualifier = 0x06, /**< Indicates that the descriptor is a device qualifier descriptor. */ + DTYPE_Other = 0x07, /**< Indicates that the descriptor is of other type. */ + DTYPE_InterfacePower = 0x08, /**< Indicates that the descriptor is an interface power descriptor. */ + DTYPE_InterfaceAssociation = 0x0B, /**< Indicates that the descriptor is an interface association descriptor. */ + DTYPE_CSInterface = 0x24, /**< Indicates that the descriptor is a class specific interface descriptor. */ + DTYPE_CSEndpoint = 0x25, /**< Indicates that the descriptor is a class specific endpoint descriptor. */ + }; + + /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors. */ + enum USB_Descriptor_ClassSubclassProtocol_t + { + USB_CSCP_NoDeviceClass = 0x00, /**< Descriptor Class value indicating that the device does not belong + * to a particular class at the device level. + */ + USB_CSCP_NoDeviceSubclass = 0x00, /**< Descriptor Subclass value indicating that the device does not belong + * to a particular subclass at the device level. + */ + USB_CSCP_NoDeviceProtocol = 0x00, /**< Descriptor Protocol value indicating that the device does not belong + * to a particular protocol at the device level. + */ + USB_CSCP_VendorSpecificClass = 0xFF, /**< Descriptor Class value indicating that the device/interface belongs + * to a vendor specific class. + */ + USB_CSCP_VendorSpecificSubclass = 0xFF, /**< Descriptor Subclass value indicating that the device/interface belongs + * to a vendor specific subclass. + */ + USB_CSCP_VendorSpecificProtocol = 0xFF, /**< Descriptor Protocol value indicating that the device/interface belongs + * to a vendor specific protocol. + */ + USB_CSCP_IADDeviceClass = 0xEF, /**< Descriptor Class value indicating that the device belongs to the + * Interface Association Descriptor class. + */ + USB_CSCP_IADDeviceSubclass = 0x02, /**< Descriptor Subclass value indicating that the device belongs to the + * Interface Association Descriptor subclass. + */ + USB_CSCP_IADDeviceProtocol = 0x01, /**< Descriptor Protocol value indicating that the device belongs to the + * Interface Association Descriptor protocol. + */ + }; + + /* Type Defines: */ + /** \brief Standard USB Descriptor Header (LUFA naming conventions). + * + * Type define for all descriptors' standard header, indicating the descriptor's length and type. This structure + * uses LUFA-specific element names to make each element's purpose clearer. + * + * \see \ref USB_StdDescriptor_Header_t for the version of this type with standard element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint8_t Size; /**< Size of the descriptor, in bytes. */ + uint8_t Type; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value + * given by the specific class. + */ + } ATTR_PACKED USB_Descriptor_Header_t; + + /** \brief Standard USB Descriptor Header (USB-IF naming conventions). + * + * Type define for all descriptors' standard header, indicating the descriptor's length and type. This structure + * uses the relevant standard's given element names to ensure compatibility with the standard. + * + * \see \ref USB_Descriptor_Header_t for the version of this type with non-standard LUFA specific element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint8_t bLength; /**< Size of the descriptor, in bytes. */ + uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value + * given by the specific class. + */ + } ATTR_PACKED USB_StdDescriptor_Header_t; + + /** \brief Standard USB Device Descriptor (LUFA naming conventions). + * + * Type define for a standard Device Descriptor. This structure uses LUFA-specific element names to make each + * element's purpose clearer. + * + * \see \ref USB_StdDescriptor_Device_t for the version of this type with standard element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + + uint16_t USBSpecification; /**< BCD of the supported USB specification. + * + * \see \ref VERSION_BCD() utility macro. + */ + uint8_t Class; /**< USB device class. */ + uint8_t SubClass; /**< USB device subclass. */ + uint8_t Protocol; /**< USB device protocol. */ + + uint8_t Endpoint0Size; /**< Size of the control (address 0) endpoint's bank in bytes. */ + + uint16_t VendorID; /**< Vendor ID for the USB product. */ + uint16_t ProductID; /**< Unique product ID for the USB product. */ + uint16_t ReleaseNumber; /**< Product release (version) number. + * + * \see \ref VERSION_BCD() utility macro. + */ + uint8_t ManufacturerStrIndex; /**< String index for the manufacturer's name. The + * host will request this string via a separate + * control request for the string descriptor. + * + * \note If no string supplied, use \ref NO_DESCRIPTOR. + */ + uint8_t ProductStrIndex; /**< String index for the product name/details. + * + * \see ManufacturerStrIndex structure entry. + */ + uint8_t SerialNumStrIndex; /**< String index for the product's globally unique hexadecimal + * serial number, in uppercase Unicode ASCII. + * + * \note On some microcontroller models, there is an embedded serial number + * in the chip which can be used for the device serial number. + * To use this serial number, set this to \c USE_INTERNAL_SERIAL. + * On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR + * and will cause the host to generate a pseudo-unique value for the + * device upon insertion. + * + * \see \c ManufacturerStrIndex structure entry. + */ + uint8_t NumberOfConfigurations; /**< Total number of configurations supported by + * the device. + */ + } ATTR_PACKED USB_Descriptor_Device_t; + + /** \brief Standard USB Device Descriptor (USB-IF naming conventions). + * + * Type define for a standard Device Descriptor. This structure uses the relevant standard's given element names + * to ensure compatibility with the standard. + * + * \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint8_t bLength; /**< Size of the descriptor, in bytes. */ + uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value + * given by the specific class. + */ + uint16_t bcdUSB; /**< BCD of the supported USB specification. + * + * \see \ref VERSION_BCD() utility macro. + */ + uint8_t bDeviceClass; /**< USB device class. */ + uint8_t bDeviceSubClass; /**< USB device subclass. */ + uint8_t bDeviceProtocol; /**< USB device protocol. */ + uint8_t bMaxPacketSize0; /**< Size of the control (address 0) endpoint's bank in bytes. */ + uint16_t idVendor; /**< Vendor ID for the USB product. */ + uint16_t idProduct; /**< Unique product ID for the USB product. */ + uint16_t bcdDevice; /**< Product release (version) number. + * + * \see \ref VERSION_BCD() utility macro. + */ + uint8_t iManufacturer; /**< String index for the manufacturer's name. The + * host will request this string via a separate + * control request for the string descriptor. + * + * \note If no string supplied, use \ref NO_DESCRIPTOR. + */ + uint8_t iProduct; /**< String index for the product name/details. + * + * \see ManufacturerStrIndex structure entry. + */ + uint8_t iSerialNumber; /**< String index for the product's globally unique hexadecimal + * serial number, in uppercase Unicode ASCII. + * + * \note On some microcontroller models, there is an embedded serial number + * in the chip which can be used for the device serial number. + * To use this serial number, set this to \c USE_INTERNAL_SERIAL. + * On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR + * and will cause the host to generate a pseudo-unique value for the + * device upon insertion. + * + * \see \c ManufacturerStrIndex structure entry. + */ + uint8_t bNumConfigurations; /**< Total number of configurations supported by + * the device. + */ + } ATTR_PACKED USB_StdDescriptor_Device_t; + + /** \brief Standard USB Device Qualifier Descriptor (LUFA naming conventions). + * + * Type define for a standard Device Qualifier Descriptor. This structure uses LUFA-specific element names + * to make each element's purpose clearer. + * + * \see \ref USB_StdDescriptor_DeviceQualifier_t for the version of this type with standard element names. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + + uint16_t USBSpecification; /**< BCD of the supported USB specification. + * + * \see \ref VERSION_BCD() utility macro. + */ + uint8_t Class; /**< USB device class. */ + uint8_t SubClass; /**< USB device subclass. */ + uint8_t Protocol; /**< USB device protocol. */ + + uint8_t Endpoint0Size; /**< Size of the control (address 0) endpoint's bank in bytes. */ + uint8_t NumberOfConfigurations; /**< Total number of configurations supported by + * the device. + */ + uint8_t Reserved; /**< Reserved for future use, must be 0. */ + } ATTR_PACKED USB_Descriptor_DeviceQualifier_t; + + /** \brief Standard USB Device Qualifier Descriptor (USB-IF naming conventions). + * + * Type define for a standard Device Qualifier Descriptor. This structure uses the relevant standard's given element names + * to ensure compatibility with the standard. + * + * \see \ref USB_Descriptor_DeviceQualifier_t for the version of this type with non-standard LUFA specific element names. + */ + typedef struct + { + uint8_t bLength; /**< Size of the descriptor, in bytes. */ + uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value + * given by the specific class. + */ + uint16_t bcdUSB; /**< BCD of the supported USB specification. + * + * \see \ref VERSION_BCD() utility macro. + */ + uint8_t bDeviceClass; /**< USB device class. */ + uint8_t bDeviceSubClass; /**< USB device subclass. */ + uint8_t bDeviceProtocol; /**< USB device protocol. */ + uint8_t bMaxPacketSize0; /**< Size of the control (address 0) endpoint's bank in bytes. */ + uint8_t bNumConfigurations; /**< Total number of configurations supported by + * the device. + */ + uint8_t bReserved; /**< Reserved for future use, must be 0. */ + } ATTR_PACKED USB_StdDescriptor_DeviceQualifier_t; + + /** \brief Standard USB Configuration Descriptor (LUFA naming conventions). + * + * Type define for a standard Configuration Descriptor header. This structure uses LUFA-specific element names + * to make each element's purpose clearer. + * + * \see \ref USB_StdDescriptor_Configuration_Header_t for the version of this type with standard element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + + uint16_t TotalConfigurationSize; /**< Size of the configuration descriptor header, + * and all sub descriptors inside the configuration. + */ + uint8_t TotalInterfaces; /**< Total number of interfaces in the configuration. */ + + uint8_t ConfigurationNumber; /**< Configuration index of the current configuration. */ + uint8_t ConfigurationStrIndex; /**< Index of a string descriptor describing the configuration. */ + + uint8_t ConfigAttributes; /**< Configuration attributes, comprised of a mask of \c USB_CONFIG_ATTR_* masks. + * On all devices, this should include USB_CONFIG_ATTR_RESERVED at a minimum. + */ + + uint8_t MaxPowerConsumption; /**< Maximum power consumption of the device while in the + * current configuration, calculated by the \ref USB_CONFIG_POWER_MA() + * macro. + */ + } ATTR_PACKED USB_Descriptor_Configuration_Header_t; + + /** \brief Standard USB Configuration Descriptor (USB-IF naming conventions). + * + * Type define for a standard Configuration Descriptor header. This structure uses the relevant standard's given element names + * to ensure compatibility with the standard. + * + * \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint8_t bLength; /**< Size of the descriptor, in bytes. */ + uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value + * given by the specific class. + */ + uint16_t wTotalLength; /**< Size of the configuration descriptor header, + * and all sub descriptors inside the configuration. + */ + uint8_t bNumInterfaces; /**< Total number of interfaces in the configuration. */ + uint8_t bConfigurationValue; /**< Configuration index of the current configuration. */ + uint8_t iConfiguration; /**< Index of a string descriptor describing the configuration. */ + uint8_t bmAttributes; /**< Configuration attributes, comprised of a mask of \c USB_CONFIG_ATTR_* masks. + * On all devices, this should include USB_CONFIG_ATTR_RESERVED at a minimum. + */ + uint8_t bMaxPower; /**< Maximum power consumption of the device while in the + * current configuration, calculated by the \ref USB_CONFIG_POWER_MA() + * macro. + */ + } ATTR_PACKED USB_StdDescriptor_Configuration_Header_t; + + /** \brief Standard USB Interface Descriptor (LUFA naming conventions). + * + * Type define for a standard Interface Descriptor. This structure uses LUFA-specific element names + * to make each element's purpose clearer. + * + * \see \ref USB_StdDescriptor_Interface_t for the version of this type with standard element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + + uint8_t InterfaceNumber; /**< Index of the interface in the current configuration. */ + uint8_t AlternateSetting; /**< Alternate setting for the interface number. The same + * interface number can have multiple alternate settings + * with different endpoint configurations, which can be + * selected by the host. + */ + uint8_t TotalEndpoints; /**< Total number of endpoints in the interface. */ + + uint8_t Class; /**< Interface class ID. */ + uint8_t SubClass; /**< Interface subclass ID. */ + uint8_t Protocol; /**< Interface protocol ID. */ + + uint8_t InterfaceStrIndex; /**< Index of the string descriptor describing the interface. */ + } ATTR_PACKED USB_Descriptor_Interface_t; + + /** \brief Standard USB Interface Descriptor (USB-IF naming conventions). + * + * Type define for a standard Interface Descriptor. This structure uses the relevant standard's given element names + * to ensure compatibility with the standard. + * + * \see \ref USB_Descriptor_Interface_t for the version of this type with non-standard LUFA specific element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint8_t bLength; /**< Size of the descriptor, in bytes. */ + uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value + * given by the specific class. + */ + uint8_t bInterfaceNumber; /**< Index of the interface in the current configuration. */ + uint8_t bAlternateSetting; /**< Alternate setting for the interface number. The same + * interface number can have multiple alternate settings + * with different endpoint configurations, which can be + * selected by the host. + */ + uint8_t bNumEndpoints; /**< Total number of endpoints in the interface. */ + uint8_t bInterfaceClass; /**< Interface class ID. */ + uint8_t bInterfaceSubClass; /**< Interface subclass ID. */ + uint8_t bInterfaceProtocol; /**< Interface protocol ID. */ + uint8_t iInterface; /**< Index of the string descriptor describing the + * interface. + */ + } ATTR_PACKED USB_StdDescriptor_Interface_t; + + /** \brief Standard USB Interface Association Descriptor (LUFA naming conventions). + * + * Type define for a standard Interface Association Descriptor. This structure uses LUFA-specific element names + * to make each element's purpose clearer. + * + * This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at + * http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf. It allows composite + * devices with multiple interfaces related to the same function to have the multiple interfaces bound + * together at the point of enumeration, loading one generic driver for all the interfaces in the single + * function. Read the ECN for more information. + * + * \see \ref USB_StdDescriptor_Interface_Association_t for the version of this type with standard element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + + uint8_t FirstInterfaceIndex; /**< Index of the first associated interface. */ + uint8_t TotalInterfaces; /**< Total number of associated interfaces. */ + + uint8_t Class; /**< Interface class ID. */ + uint8_t SubClass; /**< Interface subclass ID. */ + uint8_t Protocol; /**< Interface protocol ID. */ + + uint8_t IADStrIndex; /**< Index of the string descriptor describing the + * interface association. + */ + } ATTR_PACKED USB_Descriptor_Interface_Association_t; + + /** \brief Standard USB Interface Association Descriptor (USB-IF naming conventions). + * + * Type define for a standard Interface Association Descriptor. This structure uses the relevant standard's given + * element names to ensure compatibility with the standard. + * + * This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at + * http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf. It allows composite + * devices with multiple interfaces related to the same function to have the multiple interfaces bound + * together at the point of enumeration, loading one generic driver for all the interfaces in the single + * function. Read the ECN for more information. + * + * \see \ref USB_Descriptor_Interface_Association_t for the version of this type with non-standard LUFA specific + * element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint8_t bLength; /**< Size of the descriptor, in bytes. */ + uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value + * given by the specific class. + */ + uint8_t bFirstInterface; /**< Index of the first associated interface. */ + uint8_t bInterfaceCount; /**< Total number of associated interfaces. */ + uint8_t bFunctionClass; /**< Interface class ID. */ + uint8_t bFunctionSubClass; /**< Interface subclass ID. */ + uint8_t bFunctionProtocol; /**< Interface protocol ID. */ + uint8_t iFunction; /**< Index of the string descriptor describing the + * interface association. + */ + } ATTR_PACKED USB_StdDescriptor_Interface_Association_t; + + /** \brief Standard USB Endpoint Descriptor (LUFA naming conventions). + * + * Type define for a standard Endpoint Descriptor. This structure uses LUFA-specific element names + * to make each element's purpose clearer. + * + * \see \ref USB_StdDescriptor_Endpoint_t for the version of this type with standard element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + + uint8_t EndpointAddress; /**< Logical address of the endpoint within the device for the current + * configuration, including direction mask. + */ + uint8_t Attributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (EP_TYPE_*) + * and attributes (ENDPOINT_ATTR_*) masks. + */ + uint16_t EndpointSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet + * size that the endpoint can receive at a time. + */ + uint8_t PollingIntervalMS; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT + * or ISOCHRONOUS type. + */ + } ATTR_PACKED USB_Descriptor_Endpoint_t; + + /** \brief Standard USB Endpoint Descriptor (USB-IF naming conventions). + * + * Type define for a standard Endpoint Descriptor. This structure uses the relevant standard's given + * element names to ensure compatibility with the standard. + * + * \see \ref USB_Descriptor_Endpoint_t for the version of this type with non-standard LUFA specific + * element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint8_t bLength; /**< Size of the descriptor, in bytes. */ + uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a + * value given by the specific class. + */ + uint8_t bEndpointAddress; /**< Logical address of the endpoint within the device for the current + * configuration, including direction mask. + */ + uint8_t bmAttributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (EP_TYPE_*) + * and attributes (ENDPOINT_ATTR_*) masks. + */ + uint16_t wMaxPacketSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet size + * that the endpoint can receive at a time. + */ + uint8_t bInterval; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT or + * ISOCHRONOUS type. + */ + } ATTR_PACKED USB_StdDescriptor_Endpoint_t; + + /** \brief Standard USB String Descriptor (LUFA naming conventions). + * + * Type define for a standard string descriptor. Unlike other standard descriptors, the length + * of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN() + * macro rather than by the size of the descriptor structure, as the length is not fixed. + * + * This structure should also be used for string index 0, which contains the supported language IDs for + * the device as an array. + * + * This structure uses LUFA-specific element names to make each element's purpose clearer. + * + * \see \ref USB_StdDescriptor_String_t for the version of this type with standard element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + + #if (((ARCH == ARCH_AVR8) || (ARCH == ARCH_XMEGA)) && !defined(__DOXYGEN__)) + wchar_t UnicodeString[]; + #else + uint16_t UnicodeString[]; /**< String data, as unicode characters (alternatively, + * string language IDs). If normal ASCII characters are + * to be used, they must be added as an array of characters + * rather than a normal C string so that they are widened to + * Unicode size. + * + * Under GCC, strings prefixed with the "L" character (before + * the opening string quotation mark) are considered to be + * Unicode strings, and may be used instead of an explicit + * array of ASCII characters on little endian devices with + * UTF-16-LE \c wchar_t encoding. + */ + #endif + } ATTR_PACKED USB_Descriptor_String_t; + + /** \brief Standard USB String Descriptor (USB-IF naming conventions). + * + * Type define for a standard string descriptor. Unlike other standard descriptors, the length + * of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN() + * macro rather than by the size of the descriptor structure, as the length is not fixed. + * + * This structure should also be used for string index 0, which contains the supported language IDs for + * the device as an array. + * + * This structure uses the relevant standard's given element names to ensure compatibility with the standard. + * + * \see \ref USB_Descriptor_String_t for the version of this type with with non-standard LUFA specific + * element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint8_t bLength; /**< Size of the descriptor, in bytes. */ + uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t + * or a value given by the specific class. + */ + uint16_t bString[]; /**< String data, as unicode characters (alternatively, string language IDs). + * If normal ASCII characters are to be used, they must be added as an array + * of characters rather than a normal C string so that they are widened to + * Unicode size. + * + * Under GCC, strings prefixed with the "L" character (before the opening string + * quotation mark) are considered to be Unicode strings, and may be used instead + * of an explicit array of ASCII characters. + */ + } ATTR_PACKED USB_StdDescriptor_String_t; + + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h new file mode 100644 index 000000000000..080ddc5085fa --- /dev/null +++ b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h @@ -0,0 +1,8 @@ +#define __INCLUDE_FROM_USB_DRIVER +#define __INCLUDE_FROM_HID_DRIVER + +#define ATTR_PACKED __attribute__ ((packed)) +#include "Class/Common/HIDClassCommon.h" +#include "Core/StdDescriptors.h" + + diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index 61c42c9dfc0d..bfdb785f1df9 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h @@ -45,8 +45,6 @@ #define _DESCRIPTORS_H_ #include -#include - typedef struct { From 33b5b9aae0d0ef4a7610e6fd32c3f7746250564c Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sun, 3 Dec 2017 00:10:52 +0200 Subject: [PATCH 04/31] More lufa_util compatibility fixes --- .../Drivers/USB/Class/Common/HIDReportData.h | 126 +++++++++++++ .../LUFA/Drivers/USB/Core/USBController.h | 167 ++++++++++++++++++ .../chibios/lufa_utils/LUFA/Drivers/USB/USB.h | 28 +++ 3 files changed, 321 insertions(+) create mode 100644 tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDReportData.h create mode 100644 tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/USBController.h diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDReportData.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDReportData.h new file mode 100644 index 000000000000..fe1c4df94352 --- /dev/null +++ b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDReportData.h @@ -0,0 +1,126 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2017. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Constants for HID report item attributes. + * + * HID report item constants for report item attributes. Refer to the HID specification for + * details on each flag's meaning when applied to an IN, OUT or FEATURE item. + */ + +/** \ingroup Group_HIDParser + * \defgroup Group_HIDReportItemConst HID Report Descriptor Item Constants + * + * General HID constant definitions for HID Report Descriptor elements. + * + * @{ + */ + +#ifndef __HIDREPORTDATA_H__ +#define __HIDREPORTDATA_H__ + + /* Private Interface - For use in library only: */ + #if !defined(__DOXYGEN__) + /* Macros: */ + #define HID_RI_DATA_SIZE_MASK 0x03 + #define HID_RI_TYPE_MASK 0x0C + #define HID_RI_TAG_MASK 0xF0 + + #define HID_RI_TYPE_MAIN 0x00 + #define HID_RI_TYPE_GLOBAL 0x04 + #define HID_RI_TYPE_LOCAL 0x08 + + #define HID_RI_DATA_BITS_0 0x00 + #define HID_RI_DATA_BITS_8 0x01 + #define HID_RI_DATA_BITS_16 0x02 + #define HID_RI_DATA_BITS_32 0x03 + #define HID_RI_DATA_BITS(DataBits) CONCAT_EXPANDED(HID_RI_DATA_BITS_, DataBits) + + #define _HID_RI_ENCODE_0(Data) + #define _HID_RI_ENCODE_8(Data) , (Data & 0xFF) + #define _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_8(Data) _HID_RI_ENCODE_8(Data >> 8) + #define _HID_RI_ENCODE_32(Data) _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_16(Data >> 16) + #define _HID_RI_ENCODE(DataBits, ...) CONCAT_EXPANDED(_HID_RI_ENCODE_, DataBits(__VA_ARGS__)) + + #define _HID_RI_ENTRY(Type, Tag, DataBits, ...) (Type | Tag | HID_RI_DATA_BITS(DataBits)) _HID_RI_ENCODE(DataBits, (__VA_ARGS__)) + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** \name HID Input, Output and Feature Report Descriptor Item Flags */ + //@{ + #define HID_IOF_CONSTANT (1 << 0) + #define HID_IOF_DATA (0 << 0) + #define HID_IOF_VARIABLE (1 << 1) + #define HID_IOF_ARRAY (0 << 1) + #define HID_IOF_RELATIVE (1 << 2) + #define HID_IOF_ABSOLUTE (0 << 2) + #define HID_IOF_WRAP (1 << 3) + #define HID_IOF_NO_WRAP (0 << 3) + #define HID_IOF_NON_LINEAR (1 << 4) + #define HID_IOF_LINEAR (0 << 4) + #define HID_IOF_NO_PREFERRED_STATE (1 << 5) + #define HID_IOF_PREFERRED_STATE (0 << 5) + #define HID_IOF_NULLSTATE (1 << 6) + #define HID_IOF_NO_NULL_POSITION (0 << 6) + #define HID_IOF_VOLATILE (1 << 7) + #define HID_IOF_NON_VOLATILE (0 << 7) + #define HID_IOF_BUFFERED_BYTES (1 << 8) + #define HID_IOF_BITFIELD (0 << 8) + //@} + + /** \name HID Report Descriptor Item Macros */ + //@{ + #define HID_RI_INPUT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0x80, DataBits, __VA_ARGS__) + #define HID_RI_OUTPUT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0x90, DataBits, __VA_ARGS__) + #define HID_RI_COLLECTION(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xA0, DataBits, __VA_ARGS__) + #define HID_RI_FEATURE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xB0, DataBits, __VA_ARGS__) + #define HID_RI_END_COLLECTION(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xC0, DataBits, __VA_ARGS__) + #define HID_RI_USAGE_PAGE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x00, DataBits, __VA_ARGS__) + #define HID_RI_LOGICAL_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x10, DataBits, __VA_ARGS__) + #define HID_RI_LOGICAL_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x20, DataBits, __VA_ARGS__) + #define HID_RI_PHYSICAL_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x30, DataBits, __VA_ARGS__) + #define HID_RI_PHYSICAL_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x40, DataBits, __VA_ARGS__) + #define HID_RI_UNIT_EXPONENT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x50, DataBits, __VA_ARGS__) + #define HID_RI_UNIT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x60, DataBits, __VA_ARGS__) + #define HID_RI_REPORT_SIZE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x70, DataBits, __VA_ARGS__) + #define HID_RI_REPORT_ID(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x80, DataBits, __VA_ARGS__) + #define HID_RI_REPORT_COUNT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x90, DataBits, __VA_ARGS__) + #define HID_RI_PUSH(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xA0, DataBits, __VA_ARGS__) + #define HID_RI_POP(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xB0, DataBits, __VA_ARGS__) + #define HID_RI_USAGE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x00, DataBits, __VA_ARGS__) + #define HID_RI_USAGE_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x10, DataBits, __VA_ARGS__) + #define HID_RI_USAGE_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x20, DataBits, __VA_ARGS__) + //@} + +/** @} */ + +#endif + diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/USBController.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/USBController.h new file mode 100644 index 000000000000..acf16dc72f05 --- /dev/null +++ b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/USBController.h @@ -0,0 +1,167 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2017. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Common USB Controller definitions for all architectures. + * \copydetails Group_USBManagement + * + * \note This file should not be included directly. It is automatically included as needed by the USB driver + * dispatch header located in LUFA/Drivers/USB/USB.h. + */ + +/** \ingroup Group_USB + * \defgroup Group_USBManagement USB Interface Management + * \brief USB Controller definitions for general USB controller management. + * + * Functions, macros, variables, enums and types related to the setup and management of the USB interface. + * + * @{ + */ + +#ifndef __USBCONTROLLER_H__ +#define __USBCONTROLLER_H__ + + /* Includes: */ + //#include "../../../Common/Common.h" + //#include "USBMode.h" + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks and Defines: */ + #if !defined(__INCLUDE_FROM_USB_DRIVER) + #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. + #endif + + /* Defines: */ + /** \name Endpoint Direction Masks */ + //@{ + /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's + * direction for comparing with the \c ENDPOINT_DIR_* masks. + */ + #define ENDPOINT_DIR_MASK 0x80 + + /** Endpoint address direction mask for an OUT direction (Host to Device) endpoint. This may be ORed with + * the index of the address within a device to obtain the full endpoint address. + */ + #define ENDPOINT_DIR_OUT 0x00 + + /** Endpoint address direction mask for an IN direction (Device to Host) endpoint. This may be ORed with + * the index of the address within a device to obtain the full endpoint address. + */ + #define ENDPOINT_DIR_IN 0x80 + //@} + + /** \name Pipe Direction Masks */ + //@{ + /** Pipe direction mask, for masking against pipe addresses to retrieve the pipe's + * direction for comparing with the \c PIPE_DIR_* masks. + */ + #define PIPE_DIR_MASK 0x80 + + /** Endpoint address direction mask for an OUT direction (Host to Device) endpoint. This may be ORed with + * the index of the address within a device to obtain the full endpoint address. + */ + #define PIPE_DIR_OUT 0x00 + + /** Endpoint address direction mask for an IN direction (Device to Host) endpoint. This may be ORed with + * the index of the address within a device to obtain the full endpoint address. + */ + #define PIPE_DIR_IN 0x80 + //@} + + /** \name Endpoint/Pipe Type Masks */ + //@{ + /** Mask for determining the type of an endpoint from an endpoint descriptor. This should then be compared + * with the \c EP_TYPE_* masks to determine the exact type of the endpoint. + */ + #define EP_TYPE_MASK 0x03 + + /** Mask for a CONTROL type endpoint or pipe. + * + * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions. + */ + #define EP_TYPE_CONTROL 0x00 + + /** Mask for an ISOCHRONOUS type endpoint or pipe. + * + * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions. + */ + #define EP_TYPE_ISOCHRONOUS 0x01 + + /** Mask for a BULK type endpoint or pipe. + * + * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions. + */ + #define EP_TYPE_BULK 0x02 + + /** Mask for an INTERRUPT type endpoint or pipe. + * + * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions. + */ + #define EP_TYPE_INTERRUPT 0x03 + //@} + + /* Enums: */ + /** Enum for the possible USB controller modes, for initialization via \ref USB_Init() and indication back to the + * user application via \ref USB_CurrentMode. + */ + enum USB_Modes_t + { + USB_MODE_None = 0, /**< Indicates that the controller is currently not initialized in any specific USB mode. */ + USB_MODE_Device = 1, /**< Indicates that the controller is currently initialized in USB Device mode. */ + USB_MODE_Host = 2, /**< Indicates that the controller is currently initialized in USB Host mode. */ + USB_MODE_UID = 3, /**< Indicates that the controller should determine the USB mode from the UID pin of the + * USB connector. + */ + }; + +#if 0 + /* Architecture Includes: */ + #if (ARCH == ARCH_AVR8) + #include "AVR8/USBController_AVR8.h" + #elif (ARCH == ARCH_UC3) + #include "UC3/USBController_UC3.h" + #elif (ARCH == ARCH_XMEGA) + #include "XMEGA/USBController_XMEGA.h" + #endif +#endif + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h index 080ddc5085fa..1bae83088f23 100644 --- a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h +++ b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h @@ -1,8 +1,36 @@ #define __INCLUDE_FROM_USB_DRIVER #define __INCLUDE_FROM_HID_DRIVER +#include "progmem.h" +#include "stddef.h" #define ATTR_PACKED __attribute__ ((packed)) +/** Concatenates the given input into a single token, via the C Preprocessor. + * + * \param[in] x First item to concatenate. + * \param[in] y Second item to concatenate. + * + * \return Concatenated version of the input. + */ +#define CONCAT(x, y) x ## y + +/** CConcatenates the given input into a single token after macro expansion, via the C Preprocessor. + * + * \param[in] x First item to concatenate. + * \param[in] y Second item to concatenate. + * + * \return Concatenated version of the expanded input. + */ +#define CONCAT_EXPANDED(x, y) CONCAT(x, y) +#define CPU_TO_LE16(x) (x) + +/** Endpoint address direction mask for an IN direction (Device to Host) endpoint. This may be ORed with + * the index of the address within a device to obtain the full endpoint address. + */ +#define ENDPOINT_DIR_IN 0x80 + #include "Class/Common/HIDClassCommon.h" #include "Core/StdDescriptors.h" +#include "Class/Common/HIDReportData.h" +#include "Core/USBController.h" From 7ea56b165d0710b0c90f99ebbed88703cdad6679 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sun, 3 Dec 2017 00:12:41 +0200 Subject: [PATCH 05/31] First compiling version of shared USB descriptor --- tmk_core/common/report.h | 30 +- tmk_core/protocol/chibios.mk | 5 + tmk_core/protocol/chibios/usb_main.c | 565 ++------------------------- tmk_core/protocol/chibios/usb_main.h | 26 -- tmk_core/protocol/lufa/lufa.c | 9 + tmk_core/protocol/usb_descriptor.c | 6 +- tmk_core/protocol/usb_descriptor.h | 9 +- 7 files changed, 58 insertions(+), 592 deletions(-) diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index f6757069c5c3..6c27eb9dc650 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -73,22 +73,20 @@ along with this program. If not, see . /* key report size(NKRO or boot mode) */ -#if defined(PROTOCOL_PJRC) && defined(NKRO_ENABLE) -# include "usb.h" -# define KEYBOARD_REPORT_SIZE KBD2_SIZE -# define KEYBOARD_REPORT_KEYS (KBD2_SIZE - 2) -# define KEYBOARD_REPORT_BITS (KBD2_SIZE - 1) - -#elif defined(PROTOCOL_LUFA) && defined(NKRO_ENABLE) -# include "protocol/usb_descriptor.h" -# define KEYBOARD_REPORT_SIZE NKRO_EPSIZE -# define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) -# define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) -#elif defined(PROTOCOL_CHIBIOS) && defined(NKRO_ENABLE) -# include "protocol/chibios/usb_main.h" -# define KEYBOARD_REPORT_SIZE NKRO_EPSIZE -# define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) -# define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) +#if defined(NKRO_ENABLE) + #if defined(PROTOCOL_PJRC) + #include "usb.h" + #define KEYBOARD_REPORT_SIZE KBD2_SIZE + #define KEYBOARD_REPORT_KEYS (KBD2_SIZE - 2) + #define KEYBOARD_REPORT_BITS (KBD2_SIZE - 1) + #elif defined(PROTOCOL_LUFA) || defined(PROTOCOL_CHIBIOS) + #include "protocol/usb_descriptor.h" + #define KEYBOARD_REPORT_SIZE NKRO_EPSIZE + #define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) + #define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) + #else + #error "NKRO not supported with this protocol" +#endif #else # define KEYBOARD_REPORT_SIZE 8 diff --git a/tmk_core/protocol/chibios.mk b/tmk_core/protocol/chibios.mk index 4e225084ced4..b2f55b5b3564 100644 --- a/tmk_core/protocol/chibios.mk +++ b/tmk_core/protocol/chibios.mk @@ -9,3 +9,8 @@ SRC += usb_descriptor.c VPATH += $(TMK_PATH)/$(PROTOCOL_DIR) VPATH += $(TMK_PATH)/$(CHIBIOS_DIR) VPATH += $(TMK_PATH)/$(CHIBIOS_DIR)/lufa_utils + +OPT_DEFS += -DFIXED_CONTROL_ENDPOINT_SIZE=64 +OPT_DEFS += -DFIXED_NUM_CONFIGURATIONS=1 + + diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index caa2770b5c53..d13281b28c22 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -28,6 +28,7 @@ #include "led.h" #endif #include "wait.h" +#include "usb_descriptor.h" #ifdef NKRO_ENABLE #include "keycode_config.h" @@ -79,8 +80,6 @@ static void console_flush_cb(void *arg); */ /* HID specific constants */ -#define USB_DESCRIPTOR_HID 0x21 -#define USB_DESCRIPTOR_HID_REPORT 0x22 #define HID_GET_REPORT 0x01 #define HID_GET_IDLE 0x02 #define HID_GET_PROTOCOL 0x03 @@ -88,524 +87,6 @@ static void console_flush_cb(void *arg); #define HID_SET_IDLE 0x0A #define HID_SET_PROTOCOL 0x0B -/* USB Device Descriptor */ -static const uint8_t usb_device_descriptor_data[] = { - USB_DESC_DEVICE(0x0200, // bcdUSB (1.1) - 0, // bDeviceClass (defined in later in interface) - 0, // bDeviceSubClass - 0, // bDeviceProtocol - 64, // bMaxPacketSize (64 bytes) (the driver didn't work with 32) - VENDOR_ID, // idVendor - PRODUCT_ID, // idProduct - DEVICE_VER, // bcdDevice - 1, // iManufacturer - 2, // iProduct - 3, // iSerialNumber - 1) // bNumConfigurations -}; - -/* Device Descriptor wrapper */ -static const USBDescriptor usb_device_descriptor = { - sizeof usb_device_descriptor_data, - usb_device_descriptor_data -}; - -/* - * HID Report Descriptor - * - * See "Device Class Definition for Human Interface Devices (HID)" - * (http://www.usb.org/developers/hidpage/HID1_11.pdf) for the - * detailed descrition of all the fields - */ - -/* Keyboard Protocol 1, HID 1.11 spec, Appendix B, page 59-60 */ -static const uint8_t keyboard_hid_report_desc_data[] = { - 0x05, 0x01, // Usage Page (Generic Desktop), - 0x09, 0x06, // Usage (Keyboard), - 0xA1, 0x01, // Collection (Application), - 0x75, 0x01, // Report Size (1), - 0x95, 0x08, // Report Count (8), - 0x05, 0x07, // Usage Page (Key Codes), - 0x19, 0xE0, // Usage Minimum (224), - 0x29, 0xE7, // Usage Maximum (231), - 0x15, 0x00, // Logical Minimum (0), - 0x25, 0x01, // Logical Maximum (1), - 0x81, 0x02, // Input (Data, Variable, Absolute), ;Modifier byte - 0x95, 0x01, // Report Count (1), - 0x75, 0x08, // Report Size (8), - 0x81, 0x03, // Input (Constant), ;Reserved byte - 0x95, 0x05, // Report Count (5), - 0x75, 0x01, // Report Size (1), - 0x05, 0x08, // Usage Page (LEDs), - 0x19, 0x01, // Usage Minimum (1), - 0x29, 0x05, // Usage Maximum (5), - 0x91, 0x02, // Output (Data, Variable, Absolute), ;LED report - 0x95, 0x01, // Report Count (1), - 0x75, 0x03, // Report Size (3), - 0x91, 0x03, // Output (Constant), ;LED report padding - 0x95, KBD_REPORT_KEYS, // Report Count (), - 0x75, 0x08, // Report Size (8), - 0x15, 0x00, // Logical Minimum (0), - 0x26, 0xFF, 0x00, // Logical Maximum(255), - 0x05, 0x07, // Usage Page (Key Codes), - 0x19, 0x00, // Usage Minimum (0), - 0x29, 0xFF, // Usage Maximum (255), - 0x81, 0x00, // Input (Data, Array), - 0xc0 // End Collection -}; -/* wrapper */ -static const USBDescriptor keyboard_hid_report_descriptor = { - sizeof keyboard_hid_report_desc_data, - keyboard_hid_report_desc_data -}; - -#ifdef NKRO_ENABLE -static const uint8_t nkro_hid_report_desc_data[] = { - 0x05, 0x01, // Usage Page (Generic Desktop), - 0x09, 0x06, // Usage (Keyboard), - 0xA1, 0x01, // Collection (Application), - // bitmap of modifiers - 0x75, 0x01, // Report Size (1), - 0x95, 0x08, // Report Count (8), - 0x05, 0x07, // Usage Page (Key Codes), - 0x19, 0xE0, // Usage Minimum (224), - 0x29, 0xE7, // Usage Maximum (231), - 0x15, 0x00, // Logical Minimum (0), - 0x25, 0x01, // Logical Maximum (1), - 0x81, 0x02, // Input (Data, Variable, Absolute), ;Modifier byte - // LED output report - 0x95, 0x05, // Report Count (5), - 0x75, 0x01, // Report Size (1), - 0x05, 0x08, // Usage Page (LEDs), - 0x19, 0x01, // Usage Minimum (1), - 0x29, 0x05, // Usage Maximum (5), - 0x91, 0x02, // Output (Data, Variable, Absolute), - 0x95, 0x01, // Report Count (1), - 0x75, 0x03, // Report Size (3), - 0x91, 0x03, // Output (Constant), - // bitmap of keys - 0x95, NKRO_REPORT_KEYS * 8, // Report Count (), - 0x75, 0x01, // Report Size (1), - 0x15, 0x00, // Logical Minimum (0), - 0x25, 0x01, // Logical Maximum(1), - 0x05, 0x07, // Usage Page (Key Codes), - 0x19, 0x00, // Usage Minimum (0), - 0x29, NKRO_REPORT_KEYS * 8 - 1, // Usage Maximum (), - 0x81, 0x02, // Input (Data, Variable, Absolute), - 0xc0 // End Collection -}; -/* wrapper */ -static const USBDescriptor nkro_hid_report_descriptor = { - sizeof nkro_hid_report_desc_data, - nkro_hid_report_desc_data -}; -#endif /* NKRO_ENABLE */ - -#ifdef MOUSE_ENABLE -/* Mouse Protocol 1, HID 1.11 spec, Appendix B, page 59-60, with wheel extension - * http://www.microchip.com/forums/tm.aspx?high=&m=391435&mpage=1#391521 - * http://www.keil.com/forum/15671/ - * http://www.microsoft.com/whdc/device/input/wheel.mspx */ -static const uint8_t mouse_hid_report_desc_data[] = { - /* mouse */ - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) - 0x09, 0x02, // USAGE (Mouse) - 0xa1, 0x01, // COLLECTION (Application) - //0x85, REPORT_ID_MOUSE, // REPORT_ID (1) - 0x09, 0x01, // USAGE (Pointer) - 0xa1, 0x00, // COLLECTION (Physical) - // ---------------------------- Buttons - 0x05, 0x09, // USAGE_PAGE (Button) - 0x19, 0x01, // USAGE_MINIMUM (Button 1) - 0x29, 0x05, // USAGE_MAXIMUM (Button 5) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x25, 0x01, // LOGICAL_MAXIMUM (1) - 0x75, 0x01, // REPORT_SIZE (1) - 0x95, 0x05, // REPORT_COUNT (5) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x75, 0x03, // REPORT_SIZE (3) - 0x95, 0x01, // REPORT_COUNT (1) - 0x81, 0x03, // INPUT (Cnst,Var,Abs) - // ---------------------------- X,Y position - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) - 0x09, 0x30, // USAGE (X) - 0x09, 0x31, // USAGE (Y) - 0x15, 0x81, // LOGICAL_MINIMUM (-127) - 0x25, 0x7f, // LOGICAL_MAXIMUM (127) - 0x75, 0x08, // REPORT_SIZE (8) - 0x95, 0x02, // REPORT_COUNT (2) - 0x81, 0x06, // INPUT (Data,Var,Rel) - // ---------------------------- Vertical wheel - 0x09, 0x38, // USAGE (Wheel) - 0x15, 0x81, // LOGICAL_MINIMUM (-127) - 0x25, 0x7f, // LOGICAL_MAXIMUM (127) - 0x35, 0x00, // PHYSICAL_MINIMUM (0) - reset physical - 0x45, 0x00, // PHYSICAL_MAXIMUM (0) - 0x75, 0x08, // REPORT_SIZE (8) - 0x95, 0x01, // REPORT_COUNT (1) - 0x81, 0x06, // INPUT (Data,Var,Rel) - // ---------------------------- Horizontal wheel - 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) - 0x0a, 0x38, 0x02, // USAGE (AC Pan) - 0x15, 0x81, // LOGICAL_MINIMUM (-127) - 0x25, 0x7f, // LOGICAL_MAXIMUM (127) - 0x75, 0x08, // REPORT_SIZE (8) - 0x95, 0x01, // REPORT_COUNT (1) - 0x81, 0x06, // INPUT (Data,Var,Rel) - 0xc0, // END_COLLECTION - 0xc0, // END_COLLECTION -}; -/* wrapper */ -static const USBDescriptor mouse_hid_report_descriptor = { - sizeof mouse_hid_report_desc_data, - mouse_hid_report_desc_data -}; -#endif /* MOUSE_ENABLE */ - -#ifdef CONSOLE_ENABLE -static const uint8_t console_hid_report_desc_data[] = { - 0x06, 0x31, 0xFF, // Usage Page 0xFF31 (vendor defined) - 0x09, 0x74, // Usage 0x74 - 0xA1, 0x53, // Collection 0x53 - 0x75, 0x08, // report size = 8 bits - 0x15, 0x00, // logical minimum = 0 - 0x26, 0xFF, 0x00, // logical maximum = 255 - 0x95, CONSOLE_EPSIZE, // report count - 0x09, 0x75, // usage - 0x81, 0x02, // Input (array) - 0xC0 // end collection -}; -/* wrapper */ -static const USBDescriptor console_hid_report_descriptor = { - sizeof console_hid_report_desc_data, - console_hid_report_desc_data -}; -#endif /* CONSOLE_ENABLE */ - -#ifdef EXTRAKEY_ENABLE -/* audio controls & system controls - * http://www.microsoft.com/whdc/archive/w2kbd.mspx */ -static const uint8_t extra_hid_report_desc_data[] = { - /* system control */ - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) - 0x09, 0x80, // USAGE (System Control) - 0xa1, 0x01, // COLLECTION (Application) - 0x85, REPORT_ID_SYSTEM, // REPORT_ID (2) - 0x15, 0x01, // LOGICAL_MINIMUM (0x1) - 0x25, 0xb7, // LOGICAL_MAXIMUM (0xb7) - 0x19, 0x01, // USAGE_MINIMUM (0x1) - 0x29, 0xb7, // USAGE_MAXIMUM (0xb7) - 0x75, 0x10, // REPORT_SIZE (16) - 0x95, 0x01, // REPORT_COUNT (1) - 0x81, 0x00, // INPUT (Data,Array,Abs) - 0xc0, // END_COLLECTION - /* consumer */ - 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) - 0x09, 0x01, // USAGE (Consumer Control) - 0xa1, 0x01, // COLLECTION (Application) - 0x85, REPORT_ID_CONSUMER, // REPORT_ID (3) - 0x15, 0x01, // LOGICAL_MINIMUM (0x1) - 0x26, 0x9c, 0x02, // LOGICAL_MAXIMUM (0x29c) - 0x19, 0x01, // USAGE_MINIMUM (0x1) - 0x2a, 0x9c, 0x02, // USAGE_MAXIMUM (0x29c) - 0x75, 0x10, // REPORT_SIZE (16) - 0x95, 0x01, // REPORT_COUNT (1) - 0x81, 0x00, // INPUT (Data,Array,Abs) - 0xc0, // END_COLLECTION -}; -/* wrapper */ -static const USBDescriptor extra_hid_report_descriptor = { - sizeof extra_hid_report_desc_data, - extra_hid_report_desc_data -}; -#endif /* EXTRAKEY_ENABLE */ - - -/* - * Configuration Descriptor tree for a HID device - * - * The HID Specifications version 1.11 require the following order: - * - Configuration Descriptor - * - Interface Descriptor - * - HID Descriptor - * - Endpoints Descriptors - */ -#define KBD_HID_DESC_NUM 0 -#define KBD_HID_DESC_OFFSET (9 + (9 + 9 + 7) * KBD_HID_DESC_NUM + 9) - -#ifdef MOUSE_ENABLE -# define MOUSE_HID_DESC_NUM (KBD_HID_DESC_NUM + 1) -# define MOUSE_HID_DESC_OFFSET (9 + (9 + 9 + 7) * MOUSE_HID_DESC_NUM + 9) -#else /* MOUSE_ENABLE */ -# define MOUSE_HID_DESC_NUM (KBD_HID_DESC_NUM + 0) -#endif /* MOUSE_ENABLE */ - -#ifdef CONSOLE_ENABLE -#define CONSOLE_HID_DESC_NUM (MOUSE_HID_DESC_NUM + 1) -#define CONSOLE_HID_DESC_OFFSET (9 + (9 + 9 + 7) * CONSOLE_HID_DESC_NUM + 9) -#else /* CONSOLE_ENABLE */ -# define CONSOLE_HID_DESC_NUM (MOUSE_HID_DESC_NUM + 0) -#endif /* CONSOLE_ENABLE */ - -#ifdef EXTRAKEY_ENABLE -# define EXTRA_HID_DESC_NUM (CONSOLE_HID_DESC_NUM + 1) -# define EXTRA_HID_DESC_OFFSET (9 + (9 + 9 + 7) * EXTRA_HID_DESC_NUM + 9) -#else /* EXTRAKEY_ENABLE */ -# define EXTRA_HID_DESC_NUM (CONSOLE_HID_DESC_NUM + 0) -#endif /* EXTRAKEY_ENABLE */ - -#ifdef NKRO_ENABLE -# define NKRO_HID_DESC_NUM (EXTRA_HID_DESC_NUM + 1) -# define NKRO_HID_DESC_OFFSET (9 + (9 + 9 + 7) * EXTRA_HID_DESC_NUM + 9) -#else /* NKRO_ENABLE */ -# define NKRO_HID_DESC_NUM (EXTRA_HID_DESC_NUM + 0) -#endif /* NKRO_ENABLE */ - -#define NUM_INTERFACES (NKRO_HID_DESC_NUM + 1) -#define CONFIG1_DESC_SIZE (9 + (9 + 9 + 7) * NUM_INTERFACES) - -static const uint8_t hid_configuration_descriptor_data[] = { - /* Configuration Descriptor (9 bytes) USB spec 9.6.3, page 264-266, Table 9-10 */ - USB_DESC_CONFIGURATION(CONFIG1_DESC_SIZE, // wTotalLength - NUM_INTERFACES, // bNumInterfaces - 1, // bConfigurationValue - 0, // iConfiguration - 0xA0, // bmAttributes (RESERVED|REMOTEWAKEUP) - 50), // bMaxPower (50mA) - - /* Interface Descriptor (9 bytes) USB spec 9.6.5, page 267-269, Table 9-12 */ - USB_DESC_INTERFACE(KBD_INTERFACE, // bInterfaceNumber - 0, // bAlternateSetting - 1, // bNumEndpoints - 0x03, // bInterfaceClass: HID - 0x01, // bInterfaceSubClass: Boot - 0x01, // bInterfaceProtocol: Keyboard - 0), // iInterface - - /* HID descriptor (9 bytes) HID 1.11 spec, section 6.2.1 */ - USB_DESC_BYTE(9), // bLength - USB_DESC_BYTE(0x21), // bDescriptorType (HID class) - USB_DESC_BCD(0x0111), // bcdHID: HID version 1.11 - USB_DESC_BYTE(0), // bCountryCode - USB_DESC_BYTE(1), // bNumDescriptors - USB_DESC_BYTE(0x22), // bDescriptorType (report desc) - USB_DESC_WORD(sizeof(keyboard_hid_report_desc_data)), // wDescriptorLength - - /* Endpoint Descriptor (7 bytes) USB spec 9.6.6, page 269-271, Table 9-13 */ - USB_DESC_ENDPOINT(KBD_ENDPOINT | 0x80, // bEndpointAddress - 0x03, // bmAttributes (Interrupt) - KBD_EPSIZE,// wMaxPacketSize - 10), // bInterval - - #ifdef MOUSE_ENABLE - /* Interface Descriptor (9 bytes) USB spec 9.6.5, page 267-269, Table 9-12 */ - USB_DESC_INTERFACE(MOUSE_INTERFACE, // bInterfaceNumber - 0, // bAlternateSetting - 1, // bNumEndpoints - 0x03, // bInterfaceClass (0x03 = HID) - // ThinkPad T23 BIOS doesn't work with boot mouse. - 0x00, // bInterfaceSubClass (0x01 = Boot) - 0x00, // bInterfaceProtocol (0x02 = Mouse) - /* - 0x01, // bInterfaceSubClass (0x01 = Boot) - 0x02, // bInterfaceProtocol (0x02 = Mouse) - */ - 0), // iInterface - - /* HID descriptor (9 bytes) HID 1.11 spec, section 6.2.1 */ - USB_DESC_BYTE(9), // bLength - USB_DESC_BYTE(0x21), // bDescriptorType (HID class) - USB_DESC_BCD(0x0111), // bcdHID: HID version 1.11 - USB_DESC_BYTE(0), // bCountryCode - USB_DESC_BYTE(1), // bNumDescriptors - USB_DESC_BYTE(0x22), // bDescriptorType (report desc) - USB_DESC_WORD(sizeof(mouse_hid_report_desc_data)), // wDescriptorLength - - /* Endpoint Descriptor (7 bytes) USB spec 9.6.6, page 269-271, Table 9-13 */ - USB_DESC_ENDPOINT(MOUSE_ENDPOINT | 0x80, // bEndpointAddress - 0x03, // bmAttributes (Interrupt) - MOUSE_EPSIZE, // wMaxPacketSize - 1), // bInterval - #endif /* MOUSE_ENABLE */ - - #ifdef CONSOLE_ENABLE - /* Interface Descriptor (9 bytes) USB spec 9.6.5, page 267-269, Table 9-12 */ - USB_DESC_INTERFACE(CONSOLE_INTERFACE, // bInterfaceNumber - 0, // bAlternateSetting - 1, // bNumEndpoints - 0x03, // bInterfaceClass: HID - 0x00, // bInterfaceSubClass: None - 0x00, // bInterfaceProtocol: None - 0), // iInterface - - /* HID descriptor (9 bytes) HID 1.11 spec, section 6.2.1 */ - USB_DESC_BYTE(9), // bLength - USB_DESC_BYTE(0x21), // bDescriptorType (HID class) - USB_DESC_BCD(0x0111), // bcdHID: HID version 1.11 - USB_DESC_BYTE(0), // bCountryCode - USB_DESC_BYTE(1), // bNumDescriptors - USB_DESC_BYTE(0x22), // bDescriptorType (report desc) - USB_DESC_WORD(sizeof(console_hid_report_desc_data)), // wDescriptorLength - - /* Endpoint Descriptor (7 bytes) USB spec 9.6.6, page 269-271, Table 9-13 */ - USB_DESC_ENDPOINT(CONSOLE_ENDPOINT | 0x80, // bEndpointAddress - 0x03, // bmAttributes (Interrupt) - CONSOLE_EPSIZE, // wMaxPacketSize - 1), // bInterval - #endif /* CONSOLE_ENABLE */ - - #ifdef EXTRAKEY_ENABLE - /* Interface Descriptor (9 bytes) USB spec 9.6.5, page 267-269, Table 9-12 */ - USB_DESC_INTERFACE(EXTRA_INTERFACE, // bInterfaceNumber - 0, // bAlternateSetting - 1, // bNumEndpoints - 0x03, // bInterfaceClass: HID - 0x00, // bInterfaceSubClass: None - 0x00, // bInterfaceProtocol: None - 0), // iInterface - - /* HID descriptor (9 bytes) HID 1.11 spec, section 6.2.1 */ - USB_DESC_BYTE(9), // bLength - USB_DESC_BYTE(0x21), // bDescriptorType (HID class) - USB_DESC_BCD(0x0111), // bcdHID: HID version 1.11 - USB_DESC_BYTE(0), // bCountryCode - USB_DESC_BYTE(1), // bNumDescriptors - USB_DESC_BYTE(0x22), // bDescriptorType (report desc) - USB_DESC_WORD(sizeof(extra_hid_report_desc_data)), // wDescriptorLength - - /* Endpoint Descriptor (7 bytes) USB spec 9.6.6, page 269-271, Table 9-13 */ - USB_DESC_ENDPOINT(EXTRA_ENDPOINT | 0x80, // bEndpointAddress - 0x03, // bmAttributes (Interrupt) - EXTRA_EPSIZE, // wMaxPacketSize - 10), // bInterval - #endif /* EXTRAKEY_ENABLE */ - - #ifdef NKRO_ENABLE - /* Interface Descriptor (9 bytes) USB spec 9.6.5, page 267-269, Table 9-12 */ - USB_DESC_INTERFACE(NKRO_INTERFACE, // bInterfaceNumber - 0, // bAlternateSetting - 1, // bNumEndpoints - 0x03, // bInterfaceClass: HID - 0x00, // bInterfaceSubClass: None - 0x00, // bInterfaceProtocol: None - 0), // iInterface - - /* HID descriptor (9 bytes) HID 1.11 spec, section 6.2.1 */ - USB_DESC_BYTE(9), // bLength - USB_DESC_BYTE(0x21), // bDescriptorType (HID class) - USB_DESC_BCD(0x0111), // bcdHID: HID version 1.11 - USB_DESC_BYTE(0), // bCountryCode - USB_DESC_BYTE(1), // bNumDescriptors - USB_DESC_BYTE(0x22), // bDescriptorType (report desc) - USB_DESC_WORD(sizeof(nkro_hid_report_desc_data)), // wDescriptorLength - - /* Endpoint Descriptor (7 bytes) USB spec 9.6.6, page 269-271, Table 9-13 */ - USB_DESC_ENDPOINT(NKRO_ENDPOINT | 0x80, // bEndpointAddress - 0x03, // bmAttributes (Interrupt) - NKRO_EPSIZE, // wMaxPacketSize - 1), // bInterval - #endif /* NKRO_ENABLE */ -}; - -/* Configuration Descriptor wrapper */ -static const USBDescriptor hid_configuration_descriptor = { - sizeof hid_configuration_descriptor_data, - hid_configuration_descriptor_data -}; - -/* wrappers */ -#define HID_DESCRIPTOR_SIZE 9 -static const USBDescriptor keyboard_hid_descriptor = { - HID_DESCRIPTOR_SIZE, - &hid_configuration_descriptor_data[KBD_HID_DESC_OFFSET] -}; -#ifdef MOUSE_ENABLE -static const USBDescriptor mouse_hid_descriptor = { - HID_DESCRIPTOR_SIZE, - &hid_configuration_descriptor_data[MOUSE_HID_DESC_OFFSET] -}; -#endif /* MOUSE_ENABLE */ -#ifdef CONSOLE_ENABLE -static const USBDescriptor console_hid_descriptor = { - HID_DESCRIPTOR_SIZE, - &hid_configuration_descriptor_data[CONSOLE_HID_DESC_OFFSET] -}; -#endif /* CONSOLE_ENABLE */ -#ifdef EXTRAKEY_ENABLE -static const USBDescriptor extra_hid_descriptor = { - HID_DESCRIPTOR_SIZE, - &hid_configuration_descriptor_data[EXTRA_HID_DESC_OFFSET] -}; -#endif /* EXTRAKEY_ENABLE */ -#ifdef NKRO_ENABLE -static const USBDescriptor nkro_hid_descriptor = { - HID_DESCRIPTOR_SIZE, - &hid_configuration_descriptor_data[NKRO_HID_DESC_OFFSET] -}; -#endif /* NKRO_ENABLE */ - - -/* U.S. English language identifier */ -static const uint8_t usb_string_langid[] = { - USB_DESC_BYTE(4), // bLength - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), // bDescriptorType - USB_DESC_WORD(0x0409) // wLANGID (U.S. English) -}; - -/* ugly ugly hack */ -#define PP_NARG(...) \ - PP_NARG_(__VA_ARGS__,PP_RSEQ_N()) -#define PP_NARG_(...) \ - PP_ARG_N(__VA_ARGS__) -#define PP_ARG_N( \ - _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \ - _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \ - _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \ - _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \ - _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \ - _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \ - _61,_62,_63,N,...) N -#define PP_RSEQ_N() \ - 63,62,61,60, \ - 59,58,57,56,55,54,53,52,51,50, \ - 49,48,47,46,45,44,43,42,41,40, \ - 39,38,37,36,35,34,33,32,31,30, \ - 29,28,27,26,25,24,23,22,21,20, \ - 19,18,17,16,15,14,13,12,11,10, \ - 9,8,7,6,5,4,3,2,1,0 - -/* Vendor string = manufacturer */ -static const uint8_t usb_string_vendor[] = { - USB_DESC_BYTE(PP_NARG(USBSTR_MANUFACTURER)+2), // bLength - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), // bDescriptorType - USBSTR_MANUFACTURER -}; - -/* Device Description string = product */ -static const uint8_t usb_string_description[] = { - USB_DESC_BYTE(PP_NARG(USBSTR_PRODUCT)+2), // bLength - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), // bDescriptorType - USBSTR_PRODUCT -}; - -/* Serial Number string (will be filled by the function init_usb_serial_string) */ -static uint8_t usb_string_serial[] = { - USB_DESC_BYTE(22), // bLength - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), // bDescriptorType - '0', 0, 'x', 0, 'D', 0, 'E', 0, 'A', 0, 'D', 0, 'B', 0, 'E', 0, 'E', 0, 'F', 0 -}; - -/* Strings wrappers array */ -static const USBDescriptor usb_strings[] = { - { sizeof usb_string_langid, usb_string_langid } - , - { sizeof usb_string_vendor, usb_string_vendor } - , - { sizeof usb_string_description, usb_string_description } - , - { sizeof usb_string_serial, usb_string_serial } -}; - /* * Handles the GET_DESCRIPTOR callback * @@ -614,6 +95,7 @@ static const USBDescriptor usb_strings[] = { static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype, uint8_t dindex, uint16_t lang) { (void)usbp; (void)lang; + #if 0 switch(dtype) { /* Generic descriptors */ case USB_DESCRIPTOR_DEVICE: /* Device Descriptor */ @@ -674,6 +156,7 @@ static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype #endif /* NKRO_ENABLE */ } } +#endif return NULL; } @@ -685,7 +168,7 @@ static const USBEndpointConfig kbd_ep_config = { NULL, /* SETUP packet notification callback */ kbd_in_cb, /* IN notification callback */ NULL, /* OUT notification callback */ - KBD_EPSIZE, /* IN maximum packet size */ + KEYBOARD_EPSIZE, /* IN maximum packet size */ 0, /* OUT maximum packet size */ &kbd_ep_state, /* IN Endpoint state */ NULL, /* OUT endpoint state */ @@ -741,7 +224,7 @@ static const USBEndpointConfig extra_ep_config = { NULL, /* SETUP packet notification callback */ extra_in_cb, /* IN notification callback */ NULL, /* OUT notification callback */ - EXTRA_EPSIZE, /* IN maximum packet size */ + EXTRAKEY_EPSIZE, /* IN maximum packet size */ 0, /* OUT maximum packet size */ &extra_ep_state, /* IN Endpoint state */ NULL, /* OUT endpoint state */ @@ -784,19 +267,19 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { case USB_EVENT_CONFIGURED: osalSysLockFromISR(); /* Enable the endpoints specified into the configuration. */ - usbInitEndpointI(usbp, KBD_ENDPOINT, &kbd_ep_config); + usbInitEndpointI(usbp, KEYBOARD_IN_EPNUM, &kbd_ep_config); #ifdef MOUSE_ENABLE - usbInitEndpointI(usbp, MOUSE_ENDPOINT, &mouse_ep_config); + usbInitEndpointI(usbp, MOUSE_IN_EPNUM, &mouse_ep_config); #endif /* MOUSE_ENABLE */ #ifdef CONSOLE_ENABLE usbInitEndpointI(usbp, CONSOLE_ENDPOINT, &console_ep_config); /* don't need to start the flush timer, it starts from console_in_cb automatically */ #endif /* CONSOLE_ENABLE */ #ifdef EXTRAKEY_ENABLE - usbInitEndpointI(usbp, EXTRA_ENDPOINT, &extra_ep_config); + usbInitEndpointI(usbp, EXTRAKEY_IN_EPNUM, &extra_ep_config); #endif /* EXTRAKEY_ENABLE */ #ifdef NKRO_ENABLE - usbInitEndpointI(usbp, NKRO_ENDPOINT, &nkro_ep_config); + usbInitEndpointI(usbp, NKRO_IN_EPNUM, &nkro_ep_config); #endif /* NKRO_ENABLE */ osalSysUnlockFromISR(); return; @@ -868,7 +351,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) { switch(usbp->setup[1]) { /* bRequest */ case HID_GET_REPORT: switch(usbp->setup[4]) { /* LSB(wIndex) (check MSB==0?) */ - case KBD_INTERFACE: + case KEYBOARD_INTERFACE: #ifdef NKRO_ENABLE case NKRO_INTERFACE: #endif /* NKRO_ENABLE */ @@ -891,7 +374,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) { #endif /* CONSOLE_ENABLE */ #ifdef EXTRAKEY_ENABLE - case EXTRA_INTERFACE: + case EXTRAKEY_INTERFACE: if(usbp->setup[3] == 1) { /* MSB(wValue) [Report Type] == 1 [Input Report] */ switch(usbp->setup[2]) { /* LSB(wValue) [Report ID] */ case REPORT_ID_SYSTEM: @@ -921,7 +404,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) { break; case HID_GET_PROTOCOL: - if((usbp->setup[4] == KBD_INTERFACE) && (usbp->setup[5] == 0)) { /* wIndex */ + if((usbp->setup[4] == KEYBOARD_INTERFACE) && (usbp->setup[5] == 0)) { /* wIndex */ usbSetupTransfer(usbp, &keyboard_protocol, 1, NULL); return TRUE; } @@ -938,7 +421,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) { switch(usbp->setup[1]) { /* bRequest */ case HID_SET_REPORT: switch(usbp->setup[4]) { /* LSB(wIndex) (check MSB==0 and wLength==1?) */ - case KBD_INTERFACE: + case KEYBOARD_INTERFACE: #ifdef NKRO_ENABLE case NKRO_INTERFACE: #endif /* NKRO_ENABLE */ @@ -951,7 +434,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) { break; case HID_SET_PROTOCOL: - if((usbp->setup[4] == KBD_INTERFACE) && (usbp->setup[5] == 0)) { /* wIndex */ + if((usbp->setup[4] == KEYBOARD_INTERFACE) && (usbp->setup[5] == 0)) { /* wIndex */ keyboard_protocol = ((usbp->setup[2]) != 0x00); /* LSB(wValue) */ #ifdef NKRO_ENABLE keymap_config.nkro = !!keyboard_protocol; @@ -1084,8 +567,8 @@ static void keyboard_idle_timer_cb(void *arg) { if(keyboard_idle) { #endif /* NKRO_ENABLE */ /* TODO: are we sure we want the KBD_ENDPOINT? */ - if(!usbGetTransmitStatusI(usbp, KBD_ENDPOINT)) { - usbStartTransmitI(usbp, KBD_ENDPOINT, (uint8_t *)&keyboard_report_sent, KBD_EPSIZE); + if(!usbGetTransmitStatusI(usbp, KEYBOARD_IN_EPNUM)) { + usbStartTransmitI(usbp, KEYBOARD_IN_EPNUM, (uint8_t *)&keyboard_report_sent, KEYBOARD_EPSIZE); } /* rearm the timer */ chVTSetI(&keyboard_idle_timer, 4*MS2ST(keyboard_idle), keyboard_idle_timer_cb, (void *)usbp); @@ -1119,14 +602,14 @@ void send_keyboard(report_keyboard_t *report) { * this is more efficient */ /* busy wait, should be short and not very common */ osalSysLock(); - if(usbGetTransmitStatusI(&USB_DRIVER, NKRO_ENDPOINT)) { + if(usbGetTransmitStatusI(&USB_DRIVER, NKRO_IN_EPNUM)) { /* Need to either suspend, or loop and call unlock/lock during * every iteration - otherwise the system will remain locked, * no interrupts served, so USB not going through as well. * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ - osalThreadSuspendS(&(&USB_DRIVER)->epc[NKRO_ENDPOINT]->in_state->thread); + osalThreadSuspendS(&(&USB_DRIVER)->epc[NKRO_IN_EPNUM]->in_state->thread); } - usbStartTransmitI(&USB_DRIVER, NKRO_ENDPOINT, (uint8_t *)report, sizeof(report_keyboard_t)); + usbStartTransmitI(&USB_DRIVER, NKRO_IN_EPNUM, (uint8_t *)report, sizeof(report_keyboard_t)); osalSysUnlock(); } else #endif /* NKRO_ENABLE */ @@ -1134,14 +617,14 @@ void send_keyboard(report_keyboard_t *report) { /* need to wait until the previous packet has made it through */ /* busy wait, should be short and not very common */ osalSysLock(); - if(usbGetTransmitStatusI(&USB_DRIVER, KBD_ENDPOINT)) { + if(usbGetTransmitStatusI(&USB_DRIVER, KEYBOARD_IN_EPNUM)) { /* Need to either suspend, or loop and call unlock/lock during * every iteration - otherwise the system will remain locked, * no interrupts served, so USB not going through as well. * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ - osalThreadSuspendS(&(&USB_DRIVER)->epc[KBD_ENDPOINT]->in_state->thread); + osalThreadSuspendS(&(&USB_DRIVER)->epc[KEYBOARD_IN_EPNUM]->in_state->thread); } - usbStartTransmitI(&USB_DRIVER, KBD_ENDPOINT, (uint8_t *)report, KBD_EPSIZE); + usbStartTransmitI(&USB_DRIVER, KEYBOARD_IN_EPNUM, (uint8_t *)report, KEYBOARD_EPSIZE); osalSysUnlock(); } keyboard_report_sent = *report; @@ -1174,7 +657,7 @@ void send_mouse(report_mouse_t *report) { */ osalSysLock(); - usbStartTransmitI(&USB_DRIVER, MOUSE_ENDPOINT, (uint8_t *)report, sizeof(report_mouse_t)); + usbStartTransmitI(&USB_DRIVER, MOUSE_IN_EPNUM, (uint8_t *)report, sizeof(report_mouse_t)); osalSysUnlock(); } @@ -1210,7 +693,7 @@ static void send_extra_report(uint8_t report_id, uint16_t data) { .usage = data }; - usbStartTransmitI(&USB_DRIVER, EXTRA_ENDPOINT, (uint8_t *)&report, sizeof(report_extra_t)); + usbStartTransmitI(&USB_DRIVER, EXTRAKEY_IN_EPNUM, (uint8_t *)&report, sizeof(report_extra_t)); osalSysUnlock(); } diff --git a/tmk_core/protocol/chibios/usb_main.h b/tmk_core/protocol/chibios/usb_main.h index b4f894f2f3da..28e21ea5f45c 100644 --- a/tmk_core/protocol/chibios/usb_main.h +++ b/tmk_core/protocol/chibios/usb_main.h @@ -41,20 +41,6 @@ void init_usb_driver(USBDriver *usbp); * --------------- */ -/* main keyboard (6kro) */ -#define KBD_INTERFACE 0 -#define KBD_ENDPOINT 1 -#define KBD_EPSIZE 8 -#define KBD_REPORT_KEYS (KBD_EPSIZE - 2) - -/* secondary keyboard */ -#ifdef NKRO_ENABLE -#define NKRO_INTERFACE 4 -#define NKRO_ENDPOINT 5 -#define NKRO_EPSIZE 16 -#define NKRO_REPORT_KEYS (NKRO_EPSIZE - 1) -#endif - /* extern report_keyboard_t keyboard_report_sent; */ /* keyboard IN request callback handler */ @@ -75,10 +61,6 @@ void nkro_in_cb(USBDriver *usbp, usbep_t ep); #ifdef MOUSE_ENABLE -#define MOUSE_INTERFACE 1 -#define MOUSE_ENDPOINT 2 -#define MOUSE_EPSIZE 8 - /* mouse IN request callback handler */ void mouse_in_cb(USBDriver *usbp, usbep_t ep); #endif /* MOUSE_ENABLE */ @@ -90,10 +72,6 @@ void mouse_in_cb(USBDriver *usbp, usbep_t ep); #ifdef EXTRAKEY_ENABLE -#define EXTRA_INTERFACE 3 -#define EXTRA_ENDPOINT 4 -#define EXTRA_EPSIZE 8 - /* extrakey IN request callback handler */ void extra_in_cb(USBDriver *usbp, usbep_t ep); @@ -111,10 +89,6 @@ typedef struct { #ifdef CONSOLE_ENABLE -#define CONSOLE_INTERFACE 2 -#define CONSOLE_ENDPOINT 3 -#define CONSOLE_EPSIZE 16 - /* Number of IN reports that can be stored inside the output queue */ #define CONSOLE_QUEUE_CAPACITY 4 diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 929aec70d52c..e16a18177c09 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -1291,3 +1291,12 @@ void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t #endif + + +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint16_t wIndex, + const void** const DescriptorAddress) +{ + return get_usb_descriptor(wValue, wIndex, DescriptorAddress); +} + diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index a27842f3f197..08bc39314a12 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -879,9 +879,9 @@ const USB_Descriptor_String_t PROGMEM SerialNumberString = * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the * USB host. */ -uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint16_t wIndex, - const void** const DescriptorAddress) +uint16_t get_usb_descriptor(const uint16_t wValue, + const uint16_t wIndex, + const void** const DescriptorAddress) { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorIndex = (wValue & 0xFF); diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index bfdb785f1df9..3ca50af880ec 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h @@ -254,12 +254,9 @@ typedef struct #define CDC_NOTIFICATION_EPSIZE 8 #define CDC_EPSIZE 16 - -uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, - const uint16_t wIndex, - const void** const DescriptorAddress) - ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); - +uint16_t get_usb_descriptor(const uint16_t wValue, + const uint16_t wIndex, + const void** const DescriptorAddress); /* new API */ #if LUFA_VERSION_INTEGER < 0x140302 From 629a2938fcf3670f5c95201685ca90d0cf826b47 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sun, 3 Dec 2017 00:57:05 +0200 Subject: [PATCH 06/31] Send the usb descriptors --- tmk_core/protocol/chibios/usb_main.c | 74 ++++------------------------ 1 file changed, 9 insertions(+), 65 deletions(-) diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index d13281b28c22..a103754bfaa7 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -92,72 +92,16 @@ static void console_flush_cb(void *arg); * * Returns the proper descriptor */ -static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype, uint8_t dindex, uint16_t lang) { +static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype, uint8_t dindex, uint16_t wIndex) { (void)usbp; - (void)lang; - #if 0 - switch(dtype) { - /* Generic descriptors */ - case USB_DESCRIPTOR_DEVICE: /* Device Descriptor */ - return &usb_device_descriptor; - - case USB_DESCRIPTOR_CONFIGURATION: /* Configuration Descriptor */ - return &hid_configuration_descriptor; - - case USB_DESCRIPTOR_STRING: /* Strings */ - if(dindex < 4) - return &usb_strings[dindex]; - break; - - /* HID specific descriptors */ - case USB_DESCRIPTOR_HID: /* HID Descriptors */ - switch(lang) { /* yea, poor label, it's actually wIndex from the setup packet */ - case KBD_INTERFACE: - return &keyboard_hid_descriptor; - -#ifdef MOUSE_ENABLE - case MOUSE_INTERFACE: - return &mouse_hid_descriptor; -#endif /* MOUSE_ENABLE */ -#ifdef CONSOLE_ENABLE - case CONSOLE_INTERFACE: - return &console_hid_descriptor; -#endif /* CONSOLE_ENABLE */ -#ifdef EXTRAKEY_ENABLE - case EXTRA_INTERFACE: - return &extra_hid_descriptor; -#endif /* EXTRAKEY_ENABLE */ -#ifdef NKRO_ENABLE - case NKRO_INTERFACE: - return &nkro_hid_descriptor; -#endif /* NKRO_ENABLE */ - } - - case USB_DESCRIPTOR_HID_REPORT: /* HID Report Descriptor */ - switch(lang) { - case KBD_INTERFACE: - return &keyboard_hid_report_descriptor; - -#ifdef MOUSE_ENABLE - case MOUSE_INTERFACE: - return &mouse_hid_report_descriptor; -#endif /* MOUSE_ENABLE */ -#ifdef CONSOLE_ENABLE - case CONSOLE_INTERFACE: - return &console_hid_report_descriptor; -#endif /* CONSOLE_ENABLE */ -#ifdef EXTRAKEY_ENABLE - case EXTRA_INTERFACE: - return &extra_hid_report_descriptor; -#endif /* EXTRAKEY_ENABLE */ -#ifdef NKRO_ENABLE - case NKRO_INTERFACE: - return &nkro_hid_report_descriptor; -#endif /* NKRO_ENABLE */ - } - } -#endif - return NULL; + static USBDescriptor desc; + uint16_t wValue = ((uint16_t)dtype << 8) | dindex; + desc.ud_string = NULL; + desc.ud_size = get_usb_descriptor(wValue, wIndex, (const void** const)&desc.ud_string); + if (desc.ud_string == NULL) + return NULL; + else + return &desc; } /* keyboard endpoint state structure */ From 02724ad2239864175b8a8bc4e2d766645a727a0c Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sun, 3 Dec 2017 21:00:58 +0200 Subject: [PATCH 07/31] Fix the CONSOLE output on ChibiOS --- tmk_core/protocol/chibios/usb_main.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index a103754bfaa7..3c9c81a1646a 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -216,7 +216,7 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { usbInitEndpointI(usbp, MOUSE_IN_EPNUM, &mouse_ep_config); #endif /* MOUSE_ENABLE */ #ifdef CONSOLE_ENABLE - usbInitEndpointI(usbp, CONSOLE_ENDPOINT, &console_ep_config); + usbInitEndpointI(usbp, CONSOLE_IN_EPNUM, &console_ep_config); /* don't need to start the flush timer, it starts from console_in_cb automatically */ #endif /* CONSOLE_ENABLE */ #ifdef EXTRAKEY_ENABLE @@ -667,7 +667,7 @@ void send_consumer(uint16_t data) { /* console IN callback hander */ void console_in_cb(USBDriver *usbp, usbep_t ep) { - (void)ep; /* should have ep == CONSOLE_ENDPOINT, so use that to save time/space */ + (void)ep; /* should have ep == CONSOLE_IN_EPNUM, so use that to save time/space */ uint8_t *buf; size_t n; @@ -677,7 +677,7 @@ void console_in_cb(USBDriver *usbp, usbep_t ep) { chVTSetI(&console_flush_timer, MS2ST(CONSOLE_FLUSH_MS), console_flush_cb, (void *)usbp); /* Freeing the buffer just transmitted, if it was not a zero size packet.*/ - if (usbp->epc[CONSOLE_ENDPOINT]->in_state->txsize > 0U) { + if (usbp->epc[CONSOLE_IN_EPNUM]->in_state->txsize > 0U) { obqReleaseEmptyBufferI(&console_buf_queue); } @@ -688,7 +688,7 @@ void console_in_cb(USBDriver *usbp, usbep_t ep) { /* The endpoint cannot be busy, we are in the context of the callback, so it is safe to transmit without a check.*/ /* Should have n == CONSOLE_EPSIZE; check it? */ - usbStartTransmitI(usbp, CONSOLE_ENDPOINT, buf, CONSOLE_EPSIZE); + usbStartTransmitI(usbp, CONSOLE_IN_EPNUM, buf, CONSOLE_EPSIZE); } else { /* Nothing to transmit.*/ } @@ -706,13 +706,13 @@ void console_queue_onotify(io_buffers_queue_t *bqp) { return; /* Checking if there is already a transaction ongoing on the endpoint.*/ - if (!usbGetTransmitStatusI(usbp, CONSOLE_ENDPOINT)) { + if (!usbGetTransmitStatusI(usbp, CONSOLE_IN_EPNUM)) { /* Trying to get a full buffer.*/ uint8_t *buf = obqGetFullBufferI(&console_buf_queue, &n); if (buf != NULL) { /* Buffer found, starting a new transaction.*/ /* Should have n == CONSOLE_EPSIZE; check this? */ - usbStartTransmitI(usbp, CONSOLE_ENDPOINT, buf, CONSOLE_EPSIZE); + usbStartTransmitI(usbp, CONSOLE_IN_EPNUM, buf, CONSOLE_EPSIZE); } } } @@ -733,7 +733,7 @@ static void console_flush_cb(void *arg) { /* If there is already a transaction ongoing then another one cannot be started.*/ - if (usbGetTransmitStatusI(usbp, CONSOLE_ENDPOINT)) { + if (usbGetTransmitStatusI(usbp, CONSOLE_IN_EPNUM)) { /* rearm the timer */ chVTSetI(&console_flush_timer, MS2ST(CONSOLE_FLUSH_MS), console_flush_cb, (void *)usbp); osalSysUnlockFromISR(); @@ -751,7 +751,7 @@ static void console_flush_cb(void *arg) { /* zero the rest of the buffer (buf should point to allocated space) */ for(i=n; i Date: Sun, 3 Dec 2017 21:47:21 +0200 Subject: [PATCH 08/31] Add errors for unsupported interfaces --- tmk_core/protocol/chibios/usb_main.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 3c9c81a1646a..b972bc8f9ab0 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -196,6 +196,19 @@ static const USBEndpointConfig nkro_ep_config = { }; #endif /* NKRO_ENABLE */ +#ifdef RAW_ENABLE +#error "Raw interfaces not yet supported on ChibiOS" +#endif + +#ifdef MIDI_ENABLE +#error "Midi interfaces not yet supported on ChibiOS" +#endif + +#ifdef VIRTSER_ENABLE +#error "Virtual serial port interfaces not yet supported on ChibiOS" +#endif + + /* --------------------------------------------------------- * USB driver functions * --------------------------------------------------------- From 669b1322705b273a39926b63e3d6788e8864de88 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sun, 3 Dec 2017 22:08:40 +0200 Subject: [PATCH 09/31] Enable support for vitual serial port USB descriptors --- .../Drivers/USB/Class/Common/CDCClassCommon.h | 391 ++++++++++++++++++ .../chibios/lufa_utils/LUFA/Drivers/USB/USB.h | 2 + 2 files changed, 393 insertions(+) create mode 100644 tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h new file mode 100644 index 000000000000..1ad49eca1439 --- /dev/null +++ b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h @@ -0,0 +1,391 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2017. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Common definitions and declarations for the library USB CDC Class driver. + * + * Common definitions and declarations for the library USB CDC Class driver. + * + * \note This file should not be included directly. It is automatically included as needed by the USB module driver + * dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassCDC + * \defgroup Group_USBClassCDCCommon Common Class Definitions + * + * \section Sec_USBClassCDCCommon_ModDescription Module Description + * Constants, Types and Enum definitions that are common to both Device and Host modes for the USB + * CDC Class. + * + * @{ + */ + +#ifndef _CDC_CLASS_COMMON_H_ +#define _CDC_CLASS_COMMON_H_ + + /* Includes: */ + #include "../../Core/StdDescriptors.h" + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_CDC_DRIVER) + #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. + #endif + + /* Macros: */ + /** \name Virtual Control Line Masks */ + //@{ + /** Mask for the DTR handshake line for use with the \ref CDC_REQ_SetControlLineState class-specific request + * from the host, to indicate that the DTR line state should be high. + */ + #define CDC_CONTROL_LINE_OUT_DTR (1 << 0) + + /** Mask for the RTS handshake line for use with the \ref CDC_REQ_SetControlLineState class-specific request + * from the host, to indicate that the RTS line state should be high. + */ + #define CDC_CONTROL_LINE_OUT_RTS (1 << 1) + + /** Mask for the DCD handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification + * from the device to the host, to indicate that the DCD line state is currently high. + */ + #define CDC_CONTROL_LINE_IN_DCD (1 << 0) + + /** Mask for the DSR handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification + * from the device to the host, to indicate that the DSR line state is currently high. + */ + #define CDC_CONTROL_LINE_IN_DSR (1 << 1) + + /** Mask for the BREAK handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification + * from the device to the host, to indicate that the BREAK line state is currently high. + */ + #define CDC_CONTROL_LINE_IN_BREAK (1 << 2) + + /** Mask for the RING handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification + * from the device to the host, to indicate that the RING line state is currently high. + */ + #define CDC_CONTROL_LINE_IN_RING (1 << 3) + + /** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host, + * to indicate that a framing error has occurred on the virtual serial port. + */ + #define CDC_CONTROL_LINE_IN_FRAMEERROR (1 << 4) + + /** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host, + * to indicate that a parity error has occurred on the virtual serial port. + */ + #define CDC_CONTROL_LINE_IN_PARITYERROR (1 << 5) + + /** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host, + * to indicate that a data overrun error has occurred on the virtual serial port. + */ + #define CDC_CONTROL_LINE_IN_OVERRUNERROR (1 << 6) + //@} + + /** Macro to define a CDC class-specific functional descriptor. CDC functional descriptors have a + * uniform structure but variable sized data payloads, thus cannot be represented accurately by + * a single \c typedef \c struct. A macro is used instead so that functional descriptors can be created + * easily by specifying the size of the payload. This allows \c sizeof() to work correctly. + * + * \param[in] DataSize Size in bytes of the CDC functional descriptor's data payload. + */ + #define CDC_FUNCTIONAL_DESCRIPTOR(DataSize) \ + struct \ + { \ + USB_Descriptor_Header_t Header; \ + uint8_t SubType; \ + uint8_t Data[DataSize]; \ + } + + /* Enums: */ + /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the CDC + * device class. + */ + enum CDC_Descriptor_ClassSubclassProtocol_t + { + CDC_CSCP_CDCClass = 0x02, /**< Descriptor Class value indicating that the device or interface + * belongs to the CDC class. + */ + CDC_CSCP_NoSpecificSubclass = 0x00, /**< Descriptor Subclass value indicating that the device or interface + * belongs to no specific subclass of the CDC class. + */ + CDC_CSCP_ACMSubclass = 0x02, /**< Descriptor Subclass value indicating that the device or interface + * belongs to the Abstract Control Model CDC subclass. + */ + CDC_CSCP_ATCommandProtocol = 0x01, /**< Descriptor Protocol value indicating that the device or interface + * belongs to the AT Command protocol of the CDC class. + */ + CDC_CSCP_NoSpecificProtocol = 0x00, /**< Descriptor Protocol value indicating that the device or interface + * belongs to no specific protocol of the CDC class. + */ + CDC_CSCP_VendorSpecificProtocol = 0xFF, /**< Descriptor Protocol value indicating that the device or interface + * belongs to a vendor-specific protocol of the CDC class. + */ + CDC_CSCP_CDCDataClass = 0x0A, /**< Descriptor Class value indicating that the device or interface + * belongs to the CDC Data class. + */ + CDC_CSCP_NoDataSubclass = 0x00, /**< Descriptor Subclass value indicating that the device or interface + * belongs to no specific subclass of the CDC data class. + */ + CDC_CSCP_NoDataProtocol = 0x00, /**< Descriptor Protocol value indicating that the device or interface + * belongs to no specific protocol of the CDC data class. + */ + }; + + /** Enum for the CDC class specific control requests that can be issued by the USB bus host. */ + enum CDC_ClassRequests_t + { + CDC_REQ_SendEncapsulatedCommand = 0x00, /**< CDC class-specific request to send an encapsulated command to the device. */ + CDC_REQ_GetEncapsulatedResponse = 0x01, /**< CDC class-specific request to retrieve an encapsulated command response from the device. */ + CDC_REQ_SetLineEncoding = 0x20, /**< CDC class-specific request to set the current virtual serial port configuration settings. */ + CDC_REQ_GetLineEncoding = 0x21, /**< CDC class-specific request to get the current virtual serial port configuration settings. */ + CDC_REQ_SetControlLineState = 0x22, /**< CDC class-specific request to set the current virtual serial port handshake line states. */ + CDC_REQ_SendBreak = 0x23, /**< CDC class-specific request to send a break to the receiver via the carrier channel. */ + }; + + /** Enum for the CDC class specific notification requests that can be issued by a CDC device to a host. */ + enum CDC_ClassNotifications_t + { + CDC_NOTIF_SerialState = 0x20, /**< Notification type constant for a change in the virtual serial port + * handshake line states, for use with a \ref USB_Request_Header_t + * notification structure when sent to the host via the CDC notification + * endpoint. + */ + }; + + /** Enum for the CDC class specific interface descriptor subtypes. */ + enum CDC_DescriptorSubtypes_t + { + CDC_DSUBTYPE_CSInterface_Header = 0x00, /**< CDC class-specific Header functional descriptor. */ + CDC_DSUBTYPE_CSInterface_CallManagement = 0x01, /**< CDC class-specific Call Management functional descriptor. */ + CDC_DSUBTYPE_CSInterface_ACM = 0x02, /**< CDC class-specific Abstract Control Model functional descriptor. */ + CDC_DSUBTYPE_CSInterface_DirectLine = 0x03, /**< CDC class-specific Direct Line functional descriptor. */ + CDC_DSUBTYPE_CSInterface_TelephoneRinger = 0x04, /**< CDC class-specific Telephone Ringer functional descriptor. */ + CDC_DSUBTYPE_CSInterface_TelephoneCall = 0x05, /**< CDC class-specific Telephone Call functional descriptor. */ + CDC_DSUBTYPE_CSInterface_Union = 0x06, /**< CDC class-specific Union functional descriptor. */ + CDC_DSUBTYPE_CSInterface_CountrySelection = 0x07, /**< CDC class-specific Country Selection functional descriptor. */ + CDC_DSUBTYPE_CSInterface_TelephoneOpModes = 0x08, /**< CDC class-specific Telephone Operation Modes functional descriptor. */ + CDC_DSUBTYPE_CSInterface_USBTerminal = 0x09, /**< CDC class-specific USB Terminal functional descriptor. */ + CDC_DSUBTYPE_CSInterface_NetworkChannel = 0x0A, /**< CDC class-specific Network Channel functional descriptor. */ + CDC_DSUBTYPE_CSInterface_ProtocolUnit = 0x0B, /**< CDC class-specific Protocol Unit functional descriptor. */ + CDC_DSUBTYPE_CSInterface_ExtensionUnit = 0x0C, /**< CDC class-specific Extension Unit functional descriptor. */ + CDC_DSUBTYPE_CSInterface_MultiChannel = 0x0D, /**< CDC class-specific Multi-Channel Management functional descriptor. */ + CDC_DSUBTYPE_CSInterface_CAPI = 0x0E, /**< CDC class-specific Common ISDN API functional descriptor. */ + CDC_DSUBTYPE_CSInterface_Ethernet = 0x0F, /**< CDC class-specific Ethernet functional descriptor. */ + CDC_DSUBTYPE_CSInterface_ATM = 0x10, /**< CDC class-specific Asynchronous Transfer Mode functional descriptor. */ + }; + + /** Enum for the possible line encoding formats of a virtual serial port. */ + enum CDC_LineEncodingFormats_t + { + CDC_LINEENCODING_OneStopBit = 0, /**< Each frame contains one stop bit. */ + CDC_LINEENCODING_OneAndAHalfStopBits = 1, /**< Each frame contains one and a half stop bits. */ + CDC_LINEENCODING_TwoStopBits = 2, /**< Each frame contains two stop bits. */ + }; + + /** Enum for the possible line encoding parity settings of a virtual serial port. */ + enum CDC_LineEncodingParity_t + { + CDC_PARITY_None = 0, /**< No parity bit mode on each frame. */ + CDC_PARITY_Odd = 1, /**< Odd parity bit mode on each frame. */ + CDC_PARITY_Even = 2, /**< Even parity bit mode on each frame. */ + CDC_PARITY_Mark = 3, /**< Mark parity bit mode on each frame. */ + CDC_PARITY_Space = 4, /**< Space parity bit mode on each frame. */ + }; + + /* Type Defines: */ + /** \brief CDC class-specific Functional Header Descriptor (LUFA naming conventions). + * + * Type define for a CDC class-specific functional header descriptor. This indicates to the host that the device + * contains one or more CDC functional data descriptors, which give the CDC interface's capabilities and configuration. + * See the CDC class specification for more details. + * + * \see \ref USB_CDC_StdDescriptor_FunctionalHeader_t for the version of this type with standard element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ + uint8_t Subtype; /**< Sub type value used to distinguish between CDC class-specific descriptors, + * must be \ref CDC_DSUBTYPE_CSInterface_Header. + */ + uint16_t CDCSpecification; /**< Version number of the CDC specification implemented by the device, + * encoded in BCD format. + * + * \see \ref VERSION_BCD() utility macro. + */ + } ATTR_PACKED USB_CDC_Descriptor_FunctionalHeader_t; + + /** \brief CDC class-specific Functional Header Descriptor (USB-IF naming conventions). + * + * Type define for a CDC class-specific functional header descriptor. This indicates to the host that the device + * contains one or more CDC functional data descriptors, which give the CDC interface's capabilities and configuration. + * See the CDC class specification for more details. + * + * \see \ref USB_CDC_Descriptor_FunctionalHeader_t for the version of this type with non-standard LUFA specific + * element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint8_t bFunctionLength; /**< Size of the descriptor, in bytes. */ + uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value + * given by the specific class. + */ + uint8_t bDescriptorSubType; /**< Sub type value used to distinguish between CDC class-specific descriptors, + * must be \ref CDC_DSUBTYPE_CSInterface_Header. + */ + uint16_t bcdCDC; /**< Version number of the CDC specification implemented by the device, encoded in BCD format. + * + * \see \ref VERSION_BCD() utility macro. + */ + } ATTR_PACKED USB_CDC_StdDescriptor_FunctionalHeader_t; + + /** \brief CDC class-specific Functional ACM Descriptor (LUFA naming conventions). + * + * Type define for a CDC class-specific functional ACM descriptor. This indicates to the host that the CDC interface + * supports the CDC ACM subclass of the CDC specification. See the CDC class specification for more details. + * + * \see \ref USB_CDC_StdDescriptor_FunctionalACM_t for the version of this type with standard element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ + uint8_t Subtype; /**< Sub type value used to distinguish between CDC class-specific descriptors, + * must be \ref CDC_DSUBTYPE_CSInterface_ACM. + */ + uint8_t Capabilities; /**< Capabilities of the ACM interface, given as a bit mask. For most devices, + * this should be set to a fixed value of \c 0x06 - for other capabilities, refer + * to the CDC ACM specification. + */ + } ATTR_PACKED USB_CDC_Descriptor_FunctionalACM_t; + + /** \brief CDC class-specific Functional ACM Descriptor (USB-IF naming conventions). + * + * Type define for a CDC class-specific functional ACM descriptor. This indicates to the host that the CDC interface + * supports the CDC ACM subclass of the CDC specification. See the CDC class specification for more details. + * + * \see \ref USB_CDC_Descriptor_FunctionalACM_t for the version of this type with non-standard LUFA specific + * element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint8_t bFunctionLength; /**< Size of the descriptor, in bytes. */ + uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value + * given by the specific class. + */ + uint8_t bDescriptorSubType; /**< Sub type value used to distinguish between CDC class-specific descriptors, + * must be \ref CDC_DSUBTYPE_CSInterface_ACM. + */ + uint8_t bmCapabilities; /**< Capabilities of the ACM interface, given as a bit mask. For most devices, + * this should be set to a fixed value of 0x06 - for other capabilities, refer + * to the CDC ACM specification. + */ + } ATTR_PACKED USB_CDC_StdDescriptor_FunctionalACM_t; + + /** \brief CDC class-specific Functional Union Descriptor (LUFA naming conventions). + * + * Type define for a CDC class-specific functional Union descriptor. This indicates to the host that specific + * CDC control and data interfaces are related. See the CDC class specification for more details. + * + * \see \ref USB_CDC_StdDescriptor_FunctionalUnion_t for the version of this type with standard element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ + uint8_t Subtype; /**< Sub type value used to distinguish between CDC class-specific descriptors, + * must be \ref CDC_DSUBTYPE_CSInterface_Union. + */ + uint8_t MasterInterfaceNumber; /**< Interface number of the CDC Control interface. */ + uint8_t SlaveInterfaceNumber; /**< Interface number of the CDC Data interface. */ + } ATTR_PACKED USB_CDC_Descriptor_FunctionalUnion_t; + + /** \brief CDC class-specific Functional Union Descriptor (USB-IF naming conventions). + * + * Type define for a CDC class-specific functional Union descriptor. This indicates to the host that specific + * CDC control and data interfaces are related. See the CDC class specification for more details. + * + * \see \ref USB_CDC_Descriptor_FunctionalUnion_t for the version of this type with non-standard LUFA specific + * element names. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint8_t bFunctionLength; /**< Size of the descriptor, in bytes. */ + uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value + * given by the specific class. + */ + uint8_t bDescriptorSubType; /**< Sub type value used to distinguish between CDC class-specific descriptors, + * must be \ref CDC_DSUBTYPE_CSInterface_Union. + */ + uint8_t bMasterInterface; /**< Interface number of the CDC Control interface. */ + uint8_t bSlaveInterface0; /**< Interface number of the CDC Data interface. */ + } ATTR_PACKED USB_CDC_StdDescriptor_FunctionalUnion_t; + + /** \brief CDC Virtual Serial Port Line Encoding Settings Structure. + * + * Type define for a CDC Line Encoding structure, used to hold the various encoding parameters for a virtual + * serial port. + * + * \note Regardless of CPU architecture, these values should be stored as little endian. + */ + typedef struct + { + uint32_t BaudRateBPS; /**< Baud rate of the virtual serial port, in bits per second. */ + uint8_t CharFormat; /**< Character format of the virtual serial port, a value from the + * \ref CDC_LineEncodingFormats_t enum. + */ + uint8_t ParityType; /**< Parity setting of the virtual serial port, a value from the + * \ref CDC_LineEncodingParity_t enum. + */ + uint8_t DataBits; /**< Bits of data per character of the virtual serial port. */ + } ATTR_PACKED CDC_LineEncoding_t; + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h index 1bae83088f23..04b978803e7e 100644 --- a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h +++ b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h @@ -1,5 +1,6 @@ #define __INCLUDE_FROM_USB_DRIVER #define __INCLUDE_FROM_HID_DRIVER +#define __INCLUDE_FROM_CDC_DRIVER #include "progmem.h" #include "stddef.h" @@ -31,6 +32,7 @@ #include "Class/Common/HIDClassCommon.h" #include "Core/StdDescriptors.h" #include "Class/Common/HIDReportData.h" +#include "Class/Common/CDCClassCommon.h" #include "Core/USBController.h" From 7dc858cea5803e9d8ec004a273d46574d90cee5a Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Mon, 4 Dec 2017 10:22:52 +0200 Subject: [PATCH 10/31] Implement virtual serial port for ChibiOS --- tmk_core/protocol/chibios/main.c | 7 ++ tmk_core/protocol/chibios/usb_main.c | 104 ++++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 2 deletions(-) diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index 47a7eb09abc1..bf08484c141a 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -65,6 +65,10 @@ host_driver_t chibios_driver = { send_consumer }; +#ifdef VIRTSER_ENABLE +void virtser_task(void); +#endif + /* TESTING * Amber LED blinker thread, times are in milliseconds. @@ -182,5 +186,8 @@ int main(void) { } keyboard_task(); +#ifdef VIRTSER_ENABLE + virtser_task(); +#endif } } diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index b972bc8f9ab0..96b59461e95a 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -205,9 +205,59 @@ static const USBEndpointConfig nkro_ep_config = { #endif #ifdef VIRTSER_ENABLE -#error "Virtual serial port interfaces not yet supported on ChibiOS" -#endif +SerialUSBDriver SDU1; + +static USBOutEndpointState virtser_out_ep_state; +static USBInEndpointState virtser_in_ep_state; +static USBInEndpointState virtser_int_ep_state; + +static const USBEndpointConfig virtser_in_ep_config = { + USB_EP_MODE_TYPE_BULK, + NULL, + sduDataTransmitted, + NULL, + CDC_EPSIZE, + 0, + &virtser_in_ep_state, + NULL, + 2, + NULL +}; + +static const USBEndpointConfig virtser_out_ep_config = { + USB_EP_MODE_TYPE_BULK, + NULL, + NULL, + sduDataReceived, + 0, + CDC_EPSIZE, + NULL, + &virtser_out_ep_state, + 2, + NULL +}; +static const USBEndpointConfig virtser_int_ep_config = { + USB_EP_MODE_TYPE_INTR, + NULL, + sduInterruptTransmitted, + NULL, + CDC_NOTIFICATION_EPSIZE, + 0, + &virtser_int_ep_state, + NULL, + 1, + NULL +}; + +const SerialUSBConfig serusbcfg = { + &USB_DRIVER, + CDC_IN_EPNUM, + CDC_OUT_EPNUM, + CDC_NOTIFICATION_EPNUM +}; + +#endif /* --------------------------------------------------------- * USB driver functions @@ -238,10 +288,24 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { #ifdef NKRO_ENABLE usbInitEndpointI(usbp, NKRO_IN_EPNUM, &nkro_ep_config); #endif /* NKRO_ENABLE */ +#ifdef VIRTSER_ENABLE + /* Enables the endpoints specified into the configuration. + Note, this callback is invoked from an ISR so I-Class functions + must be used.*/ + usbInitEndpointI(usbp, CDC_IN_EPNUM, &virtser_in_ep_config); + usbInitEndpointI(usbp, CDC_OUT_EPNUM, &virtser_out_ep_config); + usbInitEndpointI(usbp, CDC_NOTIFICATION_EPNUM, &virtser_int_ep_config); + + /* Resetting the state of the CDC subsystem.*/ + sduConfigureHookI(&SDU1); +#endif osalSysUnlockFromISR(); return; case USB_EVENT_SUSPEND: //TODO: from ISR! print("[S]"); +#ifdef VIRTSER_ENABLE + sduDisconnectI(&SDU1); +#endif #ifdef SLEEP_LED_ENABLE sleep_led_enable(); #endif /* SLEEP_LED_ENABLE */ @@ -437,6 +501,9 @@ static bool usb_request_hook_cb(USBDriver *usbp) { usbSetupTransfer(usbp, (uint8_t *)dp->ud_string, dp->ud_size, NULL); return TRUE; } + #ifdef VIRTSER_ENABLE + return sduRequestsHook(usbp); + #endif return FALSE; } @@ -444,6 +511,11 @@ static bool usb_request_hook_cb(USBDriver *usbp) { /* Start-of-frame callback */ static void usb_sof_cb(USBDriver *usbp) { kbd_sof_cb(usbp); +#ifdef VIRTSER_ENABLE + osalSysLockFromISR(); + sduSOFHookI(&SDU1); + osalSysUnlockFromISR(); +#endif } @@ -459,6 +531,9 @@ static const USBConfig usbcfg = { * Initialize the USB driver */ void init_usb_driver(USBDriver *usbp) { + sduObjectInit(&SDU1); + sduStart(&SDU1, &serusbcfg); + /* * Activates the USB driver and then the USB bus pull-up on D+. * Note, a delay is inserted in order to not have to disconnect the cable @@ -800,3 +875,28 @@ void sendchar_pf(void *p, char c) { (void)p; sendchar((uint8_t)c); } + +#ifdef VIRTSER_ENABLE + +void virtser_send(const uint8_t byte) { + chnWrite(&SDU1, &byte, 1); +} + +__attribute__ ((weak)) +void virtser_recv(uint8_t c) +{ + // Ignore by default +} + +void virtser_task(void) { + uint8_t numBytesReceived = 0; + uint8_t buffer[16]; + do { + numBytesReceived = chnReadTimeout(&SDU1, buffer, sizeof(buffer), TIME_IMMEDIATE); + for (int i=0;i 0); +} + +#endif From 95f49a34541e501c9080ef5880f62344761a7ba3 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 6 Dec 2017 12:16:24 +0200 Subject: [PATCH 11/31] Cleanup the lufa_utils Use the default lufa header files --- .../Drivers/USB/Class/Common/CDCClassCommon.h | 391 --------- .../Drivers/USB/Class/Common/HIDClassCommon.h | 681 ---------------- .../Drivers/USB/Class/Common/HIDReportData.h | 126 --- .../LUFA/Drivers/USB/Core/StdDescriptors.h | 765 ------------------ .../LUFA/Drivers/USB/Core/USBController.h | 167 ---- .../chibios/lufa_utils/LUFA/Drivers/USB/USB.h | 27 +- 6 files changed, 13 insertions(+), 2144 deletions(-) delete mode 100644 tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h delete mode 100644 tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h delete mode 100644 tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDReportData.h delete mode 100644 tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/StdDescriptors.h delete mode 100644 tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/USBController.h diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h deleted file mode 100644 index 1ad49eca1439..000000000000 --- a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h +++ /dev/null @@ -1,391 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2017. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaims all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * \brief Common definitions and declarations for the library USB CDC Class driver. - * - * Common definitions and declarations for the library USB CDC Class driver. - * - * \note This file should not be included directly. It is automatically included as needed by the USB module driver - * dispatch header located in LUFA/Drivers/USB.h. - */ - -/** \ingroup Group_USBClassCDC - * \defgroup Group_USBClassCDCCommon Common Class Definitions - * - * \section Sec_USBClassCDCCommon_ModDescription Module Description - * Constants, Types and Enum definitions that are common to both Device and Host modes for the USB - * CDC Class. - * - * @{ - */ - -#ifndef _CDC_CLASS_COMMON_H_ -#define _CDC_CLASS_COMMON_H_ - - /* Includes: */ - #include "../../Core/StdDescriptors.h" - - /* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { - #endif - - /* Preprocessor Checks: */ - #if !defined(__INCLUDE_FROM_CDC_DRIVER) - #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. - #endif - - /* Macros: */ - /** \name Virtual Control Line Masks */ - //@{ - /** Mask for the DTR handshake line for use with the \ref CDC_REQ_SetControlLineState class-specific request - * from the host, to indicate that the DTR line state should be high. - */ - #define CDC_CONTROL_LINE_OUT_DTR (1 << 0) - - /** Mask for the RTS handshake line for use with the \ref CDC_REQ_SetControlLineState class-specific request - * from the host, to indicate that the RTS line state should be high. - */ - #define CDC_CONTROL_LINE_OUT_RTS (1 << 1) - - /** Mask for the DCD handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification - * from the device to the host, to indicate that the DCD line state is currently high. - */ - #define CDC_CONTROL_LINE_IN_DCD (1 << 0) - - /** Mask for the DSR handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification - * from the device to the host, to indicate that the DSR line state is currently high. - */ - #define CDC_CONTROL_LINE_IN_DSR (1 << 1) - - /** Mask for the BREAK handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification - * from the device to the host, to indicate that the BREAK line state is currently high. - */ - #define CDC_CONTROL_LINE_IN_BREAK (1 << 2) - - /** Mask for the RING handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification - * from the device to the host, to indicate that the RING line state is currently high. - */ - #define CDC_CONTROL_LINE_IN_RING (1 << 3) - - /** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host, - * to indicate that a framing error has occurred on the virtual serial port. - */ - #define CDC_CONTROL_LINE_IN_FRAMEERROR (1 << 4) - - /** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host, - * to indicate that a parity error has occurred on the virtual serial port. - */ - #define CDC_CONTROL_LINE_IN_PARITYERROR (1 << 5) - - /** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host, - * to indicate that a data overrun error has occurred on the virtual serial port. - */ - #define CDC_CONTROL_LINE_IN_OVERRUNERROR (1 << 6) - //@} - - /** Macro to define a CDC class-specific functional descriptor. CDC functional descriptors have a - * uniform structure but variable sized data payloads, thus cannot be represented accurately by - * a single \c typedef \c struct. A macro is used instead so that functional descriptors can be created - * easily by specifying the size of the payload. This allows \c sizeof() to work correctly. - * - * \param[in] DataSize Size in bytes of the CDC functional descriptor's data payload. - */ - #define CDC_FUNCTIONAL_DESCRIPTOR(DataSize) \ - struct \ - { \ - USB_Descriptor_Header_t Header; \ - uint8_t SubType; \ - uint8_t Data[DataSize]; \ - } - - /* Enums: */ - /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the CDC - * device class. - */ - enum CDC_Descriptor_ClassSubclassProtocol_t - { - CDC_CSCP_CDCClass = 0x02, /**< Descriptor Class value indicating that the device or interface - * belongs to the CDC class. - */ - CDC_CSCP_NoSpecificSubclass = 0x00, /**< Descriptor Subclass value indicating that the device or interface - * belongs to no specific subclass of the CDC class. - */ - CDC_CSCP_ACMSubclass = 0x02, /**< Descriptor Subclass value indicating that the device or interface - * belongs to the Abstract Control Model CDC subclass. - */ - CDC_CSCP_ATCommandProtocol = 0x01, /**< Descriptor Protocol value indicating that the device or interface - * belongs to the AT Command protocol of the CDC class. - */ - CDC_CSCP_NoSpecificProtocol = 0x00, /**< Descriptor Protocol value indicating that the device or interface - * belongs to no specific protocol of the CDC class. - */ - CDC_CSCP_VendorSpecificProtocol = 0xFF, /**< Descriptor Protocol value indicating that the device or interface - * belongs to a vendor-specific protocol of the CDC class. - */ - CDC_CSCP_CDCDataClass = 0x0A, /**< Descriptor Class value indicating that the device or interface - * belongs to the CDC Data class. - */ - CDC_CSCP_NoDataSubclass = 0x00, /**< Descriptor Subclass value indicating that the device or interface - * belongs to no specific subclass of the CDC data class. - */ - CDC_CSCP_NoDataProtocol = 0x00, /**< Descriptor Protocol value indicating that the device or interface - * belongs to no specific protocol of the CDC data class. - */ - }; - - /** Enum for the CDC class specific control requests that can be issued by the USB bus host. */ - enum CDC_ClassRequests_t - { - CDC_REQ_SendEncapsulatedCommand = 0x00, /**< CDC class-specific request to send an encapsulated command to the device. */ - CDC_REQ_GetEncapsulatedResponse = 0x01, /**< CDC class-specific request to retrieve an encapsulated command response from the device. */ - CDC_REQ_SetLineEncoding = 0x20, /**< CDC class-specific request to set the current virtual serial port configuration settings. */ - CDC_REQ_GetLineEncoding = 0x21, /**< CDC class-specific request to get the current virtual serial port configuration settings. */ - CDC_REQ_SetControlLineState = 0x22, /**< CDC class-specific request to set the current virtual serial port handshake line states. */ - CDC_REQ_SendBreak = 0x23, /**< CDC class-specific request to send a break to the receiver via the carrier channel. */ - }; - - /** Enum for the CDC class specific notification requests that can be issued by a CDC device to a host. */ - enum CDC_ClassNotifications_t - { - CDC_NOTIF_SerialState = 0x20, /**< Notification type constant for a change in the virtual serial port - * handshake line states, for use with a \ref USB_Request_Header_t - * notification structure when sent to the host via the CDC notification - * endpoint. - */ - }; - - /** Enum for the CDC class specific interface descriptor subtypes. */ - enum CDC_DescriptorSubtypes_t - { - CDC_DSUBTYPE_CSInterface_Header = 0x00, /**< CDC class-specific Header functional descriptor. */ - CDC_DSUBTYPE_CSInterface_CallManagement = 0x01, /**< CDC class-specific Call Management functional descriptor. */ - CDC_DSUBTYPE_CSInterface_ACM = 0x02, /**< CDC class-specific Abstract Control Model functional descriptor. */ - CDC_DSUBTYPE_CSInterface_DirectLine = 0x03, /**< CDC class-specific Direct Line functional descriptor. */ - CDC_DSUBTYPE_CSInterface_TelephoneRinger = 0x04, /**< CDC class-specific Telephone Ringer functional descriptor. */ - CDC_DSUBTYPE_CSInterface_TelephoneCall = 0x05, /**< CDC class-specific Telephone Call functional descriptor. */ - CDC_DSUBTYPE_CSInterface_Union = 0x06, /**< CDC class-specific Union functional descriptor. */ - CDC_DSUBTYPE_CSInterface_CountrySelection = 0x07, /**< CDC class-specific Country Selection functional descriptor. */ - CDC_DSUBTYPE_CSInterface_TelephoneOpModes = 0x08, /**< CDC class-specific Telephone Operation Modes functional descriptor. */ - CDC_DSUBTYPE_CSInterface_USBTerminal = 0x09, /**< CDC class-specific USB Terminal functional descriptor. */ - CDC_DSUBTYPE_CSInterface_NetworkChannel = 0x0A, /**< CDC class-specific Network Channel functional descriptor. */ - CDC_DSUBTYPE_CSInterface_ProtocolUnit = 0x0B, /**< CDC class-specific Protocol Unit functional descriptor. */ - CDC_DSUBTYPE_CSInterface_ExtensionUnit = 0x0C, /**< CDC class-specific Extension Unit functional descriptor. */ - CDC_DSUBTYPE_CSInterface_MultiChannel = 0x0D, /**< CDC class-specific Multi-Channel Management functional descriptor. */ - CDC_DSUBTYPE_CSInterface_CAPI = 0x0E, /**< CDC class-specific Common ISDN API functional descriptor. */ - CDC_DSUBTYPE_CSInterface_Ethernet = 0x0F, /**< CDC class-specific Ethernet functional descriptor. */ - CDC_DSUBTYPE_CSInterface_ATM = 0x10, /**< CDC class-specific Asynchronous Transfer Mode functional descriptor. */ - }; - - /** Enum for the possible line encoding formats of a virtual serial port. */ - enum CDC_LineEncodingFormats_t - { - CDC_LINEENCODING_OneStopBit = 0, /**< Each frame contains one stop bit. */ - CDC_LINEENCODING_OneAndAHalfStopBits = 1, /**< Each frame contains one and a half stop bits. */ - CDC_LINEENCODING_TwoStopBits = 2, /**< Each frame contains two stop bits. */ - }; - - /** Enum for the possible line encoding parity settings of a virtual serial port. */ - enum CDC_LineEncodingParity_t - { - CDC_PARITY_None = 0, /**< No parity bit mode on each frame. */ - CDC_PARITY_Odd = 1, /**< Odd parity bit mode on each frame. */ - CDC_PARITY_Even = 2, /**< Even parity bit mode on each frame. */ - CDC_PARITY_Mark = 3, /**< Mark parity bit mode on each frame. */ - CDC_PARITY_Space = 4, /**< Space parity bit mode on each frame. */ - }; - - /* Type Defines: */ - /** \brief CDC class-specific Functional Header Descriptor (LUFA naming conventions). - * - * Type define for a CDC class-specific functional header descriptor. This indicates to the host that the device - * contains one or more CDC functional data descriptors, which give the CDC interface's capabilities and configuration. - * See the CDC class specification for more details. - * - * \see \ref USB_CDC_StdDescriptor_FunctionalHeader_t for the version of this type with standard element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ - uint8_t Subtype; /**< Sub type value used to distinguish between CDC class-specific descriptors, - * must be \ref CDC_DSUBTYPE_CSInterface_Header. - */ - uint16_t CDCSpecification; /**< Version number of the CDC specification implemented by the device, - * encoded in BCD format. - * - * \see \ref VERSION_BCD() utility macro. - */ - } ATTR_PACKED USB_CDC_Descriptor_FunctionalHeader_t; - - /** \brief CDC class-specific Functional Header Descriptor (USB-IF naming conventions). - * - * Type define for a CDC class-specific functional header descriptor. This indicates to the host that the device - * contains one or more CDC functional data descriptors, which give the CDC interface's capabilities and configuration. - * See the CDC class specification for more details. - * - * \see \ref USB_CDC_Descriptor_FunctionalHeader_t for the version of this type with non-standard LUFA specific - * element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint8_t bFunctionLength; /**< Size of the descriptor, in bytes. */ - uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value - * given by the specific class. - */ - uint8_t bDescriptorSubType; /**< Sub type value used to distinguish between CDC class-specific descriptors, - * must be \ref CDC_DSUBTYPE_CSInterface_Header. - */ - uint16_t bcdCDC; /**< Version number of the CDC specification implemented by the device, encoded in BCD format. - * - * \see \ref VERSION_BCD() utility macro. - */ - } ATTR_PACKED USB_CDC_StdDescriptor_FunctionalHeader_t; - - /** \brief CDC class-specific Functional ACM Descriptor (LUFA naming conventions). - * - * Type define for a CDC class-specific functional ACM descriptor. This indicates to the host that the CDC interface - * supports the CDC ACM subclass of the CDC specification. See the CDC class specification for more details. - * - * \see \ref USB_CDC_StdDescriptor_FunctionalACM_t for the version of this type with standard element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ - uint8_t Subtype; /**< Sub type value used to distinguish between CDC class-specific descriptors, - * must be \ref CDC_DSUBTYPE_CSInterface_ACM. - */ - uint8_t Capabilities; /**< Capabilities of the ACM interface, given as a bit mask. For most devices, - * this should be set to a fixed value of \c 0x06 - for other capabilities, refer - * to the CDC ACM specification. - */ - } ATTR_PACKED USB_CDC_Descriptor_FunctionalACM_t; - - /** \brief CDC class-specific Functional ACM Descriptor (USB-IF naming conventions). - * - * Type define for a CDC class-specific functional ACM descriptor. This indicates to the host that the CDC interface - * supports the CDC ACM subclass of the CDC specification. See the CDC class specification for more details. - * - * \see \ref USB_CDC_Descriptor_FunctionalACM_t for the version of this type with non-standard LUFA specific - * element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint8_t bFunctionLength; /**< Size of the descriptor, in bytes. */ - uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value - * given by the specific class. - */ - uint8_t bDescriptorSubType; /**< Sub type value used to distinguish between CDC class-specific descriptors, - * must be \ref CDC_DSUBTYPE_CSInterface_ACM. - */ - uint8_t bmCapabilities; /**< Capabilities of the ACM interface, given as a bit mask. For most devices, - * this should be set to a fixed value of 0x06 - for other capabilities, refer - * to the CDC ACM specification. - */ - } ATTR_PACKED USB_CDC_StdDescriptor_FunctionalACM_t; - - /** \brief CDC class-specific Functional Union Descriptor (LUFA naming conventions). - * - * Type define for a CDC class-specific functional Union descriptor. This indicates to the host that specific - * CDC control and data interfaces are related. See the CDC class specification for more details. - * - * \see \ref USB_CDC_StdDescriptor_FunctionalUnion_t for the version of this type with standard element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ - uint8_t Subtype; /**< Sub type value used to distinguish between CDC class-specific descriptors, - * must be \ref CDC_DSUBTYPE_CSInterface_Union. - */ - uint8_t MasterInterfaceNumber; /**< Interface number of the CDC Control interface. */ - uint8_t SlaveInterfaceNumber; /**< Interface number of the CDC Data interface. */ - } ATTR_PACKED USB_CDC_Descriptor_FunctionalUnion_t; - - /** \brief CDC class-specific Functional Union Descriptor (USB-IF naming conventions). - * - * Type define for a CDC class-specific functional Union descriptor. This indicates to the host that specific - * CDC control and data interfaces are related. See the CDC class specification for more details. - * - * \see \ref USB_CDC_Descriptor_FunctionalUnion_t for the version of this type with non-standard LUFA specific - * element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint8_t bFunctionLength; /**< Size of the descriptor, in bytes. */ - uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value - * given by the specific class. - */ - uint8_t bDescriptorSubType; /**< Sub type value used to distinguish between CDC class-specific descriptors, - * must be \ref CDC_DSUBTYPE_CSInterface_Union. - */ - uint8_t bMasterInterface; /**< Interface number of the CDC Control interface. */ - uint8_t bSlaveInterface0; /**< Interface number of the CDC Data interface. */ - } ATTR_PACKED USB_CDC_StdDescriptor_FunctionalUnion_t; - - /** \brief CDC Virtual Serial Port Line Encoding Settings Structure. - * - * Type define for a CDC Line Encoding structure, used to hold the various encoding parameters for a virtual - * serial port. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint32_t BaudRateBPS; /**< Baud rate of the virtual serial port, in bits per second. */ - uint8_t CharFormat; /**< Character format of the virtual serial port, a value from the - * \ref CDC_LineEncodingFormats_t enum. - */ - uint8_t ParityType; /**< Parity setting of the virtual serial port, a value from the - * \ref CDC_LineEncodingParity_t enum. - */ - uint8_t DataBits; /**< Bits of data per character of the virtual serial port. */ - } ATTR_PACKED CDC_LineEncoding_t; - - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } - #endif - -#endif - -/** @} */ - diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h deleted file mode 100644 index 3091000f248b..000000000000 --- a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h +++ /dev/null @@ -1,681 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2017. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaims all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * \brief Common definitions and declarations for the library USB HID Class driver. - * - * Common definitions and declarations for the library USB HID Class driver. - * - * \note This file should not be included directly. It is automatically included as needed by the USB module driver - * dispatch header located in LUFA/Drivers/USB.h. - */ - -/** \ingroup Group_USBClassHID - * \defgroup Group_USBClassHIDCommon Common Class Definitions - * - * \section Sec_USBClassHIDCommon_ModDescription Module Description - * Constants, Types and Enum definitions that are common to both Device and Host modes for the USB - * HID Class. - * - * @{ - */ - -#ifndef _HID_CLASS_COMMON_H_ -#define _HID_CLASS_COMMON_H_ - - /* Includes: */ - #include "../../Core/StdDescriptors.h" - //#include "HIDParser.h" - - /* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { - #endif - - /* Preprocessor Checks: */ - #if !defined(__INCLUDE_FROM_HID_DRIVER) - #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. - #endif - - /* Macros: */ - /** \name Keyboard Standard Report Modifier Masks */ - //@{ - /** Constant for a keyboard report modifier byte, indicating that the keyboard's left control key is currently pressed. */ - #define HID_KEYBOARD_MODIFIER_LEFTCTRL (1 << 0) - - /** Constant for a keyboard report modifier byte, indicating that the keyboard's left shift key is currently pressed. */ - #define HID_KEYBOARD_MODIFIER_LEFTSHIFT (1 << 1) - - /** Constant for a keyboard report modifier byte, indicating that the keyboard's left alt key is currently pressed. */ - #define HID_KEYBOARD_MODIFIER_LEFTALT (1 << 2) - - /** Constant for a keyboard report modifier byte, indicating that the keyboard's left GUI key is currently pressed. */ - #define HID_KEYBOARD_MODIFIER_LEFTGUI (1 << 3) - - /** Constant for a keyboard report modifier byte, indicating that the keyboard's right control key is currently pressed. */ - #define HID_KEYBOARD_MODIFIER_RIGHTCTRL (1 << 4) - - /** Constant for a keyboard report modifier byte, indicating that the keyboard's right shift key is currently pressed. */ - #define HID_KEYBOARD_MODIFIER_RIGHTSHIFT (1 << 5) - - /** Constant for a keyboard report modifier byte, indicating that the keyboard's right alt key is currently pressed. */ - #define HID_KEYBOARD_MODIFIER_RIGHTALT (1 << 6) - - /** Constant for a keyboard report modifier byte, indicating that the keyboard's right GUI key is currently pressed. */ - #define HID_KEYBOARD_MODIFIER_RIGHTGUI (1 << 7) - //@} - - /** \name Keyboard Standard Report LED Masks */ - //@{ - /** Constant for a keyboard output report LED byte, indicating that the host's NUM LOCK mode is currently set. */ - #define HID_KEYBOARD_LED_NUMLOCK (1 << 0) - - /** Constant for a keyboard output report LED byte, indicating that the host's CAPS LOCK mode is currently set. */ - #define HID_KEYBOARD_LED_CAPSLOCK (1 << 1) - - /** Constant for a keyboard output report LED byte, indicating that the host's SCROLL LOCK mode is currently set. */ - #define HID_KEYBOARD_LED_SCROLLLOCK (1 << 2) - - /** Constant for a keyboard output report LED byte, indicating that the host's COMPOSE mode is currently set. */ - #define HID_KEYBOARD_LED_COMPOSE (1 << 3) - - /** Constant for a keyboard output report LED byte, indicating that the host's KANA mode is currently set. */ - #define HID_KEYBOARD_LED_KANA (1 << 4) - //@} - - /** \name Keyboard Standard Report Key Scan-codes */ - //@{ - #define HID_KEYBOARD_SC_ERROR_ROLLOVER 0x01 - #define HID_KEYBOARD_SC_POST_FAIL 0x02 - #define HID_KEYBOARD_SC_ERROR_UNDEFINED 0x03 - #define HID_KEYBOARD_SC_A 0x04 - #define HID_KEYBOARD_SC_B 0x05 - #define HID_KEYBOARD_SC_C 0x06 - #define HID_KEYBOARD_SC_D 0x07 - #define HID_KEYBOARD_SC_E 0x08 - #define HID_KEYBOARD_SC_F 0x09 - #define HID_KEYBOARD_SC_G 0x0A - #define HID_KEYBOARD_SC_H 0x0B - #define HID_KEYBOARD_SC_I 0x0C - #define HID_KEYBOARD_SC_J 0x0D - #define HID_KEYBOARD_SC_K 0x0E - #define HID_KEYBOARD_SC_L 0x0F - #define HID_KEYBOARD_SC_M 0x10 - #define HID_KEYBOARD_SC_N 0x11 - #define HID_KEYBOARD_SC_O 0x12 - #define HID_KEYBOARD_SC_P 0x13 - #define HID_KEYBOARD_SC_Q 0x14 - #define HID_KEYBOARD_SC_R 0x15 - #define HID_KEYBOARD_SC_S 0x16 - #define HID_KEYBOARD_SC_T 0x17 - #define HID_KEYBOARD_SC_U 0x18 - #define HID_KEYBOARD_SC_V 0x19 - #define HID_KEYBOARD_SC_W 0x1A - #define HID_KEYBOARD_SC_X 0x1B - #define HID_KEYBOARD_SC_Y 0x1C - #define HID_KEYBOARD_SC_Z 0x1D - #define HID_KEYBOARD_SC_1_AND_EXCLAMATION 0x1E - #define HID_KEYBOARD_SC_2_AND_AT 0x1F - #define HID_KEYBOARD_SC_3_AND_HASHMARK 0x20 - #define HID_KEYBOARD_SC_4_AND_DOLLAR 0x21 - #define HID_KEYBOARD_SC_5_AND_PERCENTAGE 0x22 - #define HID_KEYBOARD_SC_6_AND_CARET 0x23 - #define HID_KEYBOARD_SC_7_AND_AMPERSAND 0x24 - #define HID_KEYBOARD_SC_8_AND_ASTERISK 0x25 - #define HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS 0x26 - #define HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS 0x27 - #define HID_KEYBOARD_SC_ENTER 0x28 - #define HID_KEYBOARD_SC_ESCAPE 0x29 - #define HID_KEYBOARD_SC_BACKSPACE 0x2A - #define HID_KEYBOARD_SC_TAB 0x2B - #define HID_KEYBOARD_SC_SPACE 0x2C - #define HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE 0x2D - #define HID_KEYBOARD_SC_EQUAL_AND_PLUS 0x2E - #define HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE 0x2F - #define HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE 0x30 - #define HID_KEYBOARD_SC_BACKSLASH_AND_PIPE 0x31 - #define HID_KEYBOARD_SC_NON_US_HASHMARK_AND_TILDE 0x32 - #define HID_KEYBOARD_SC_SEMICOLON_AND_COLON 0x33 - #define HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE 0x34 - #define HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE 0x35 - #define HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN 0x36 - #define HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN 0x37 - #define HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK 0x38 - #define HID_KEYBOARD_SC_CAPS_LOCK 0x39 - #define HID_KEYBOARD_SC_F1 0x3A - #define HID_KEYBOARD_SC_F2 0x3B - #define HID_KEYBOARD_SC_F3 0x3C - #define HID_KEYBOARD_SC_F4 0x3D - #define HID_KEYBOARD_SC_F5 0x3E - #define HID_KEYBOARD_SC_F6 0x3F - #define HID_KEYBOARD_SC_F7 0x40 - #define HID_KEYBOARD_SC_F8 0x41 - #define HID_KEYBOARD_SC_F9 0x42 - #define HID_KEYBOARD_SC_F10 0x43 - #define HID_KEYBOARD_SC_F11 0x44 - #define HID_KEYBOARD_SC_F12 0x45 - #define HID_KEYBOARD_SC_PRINT_SCREEN 0x46 - #define HID_KEYBOARD_SC_SCROLL_LOCK 0x47 - #define HID_KEYBOARD_SC_PAUSE 0x48 - #define HID_KEYBOARD_SC_INSERT 0x49 - #define HID_KEYBOARD_SC_HOME 0x4A - #define HID_KEYBOARD_SC_PAGE_UP 0x4B - #define HID_KEYBOARD_SC_DELETE 0x4C - #define HID_KEYBOARD_SC_END 0x4D - #define HID_KEYBOARD_SC_PAGE_DOWN 0x4E - #define HID_KEYBOARD_SC_RIGHT_ARROW 0x4F - #define HID_KEYBOARD_SC_LEFT_ARROW 0x50 - #define HID_KEYBOARD_SC_DOWN_ARROW 0x51 - #define HID_KEYBOARD_SC_UP_ARROW 0x52 - #define HID_KEYBOARD_SC_NUM_LOCK 0x53 - #define HID_KEYBOARD_SC_KEYPAD_SLASH 0x54 - #define HID_KEYBOARD_SC_KEYPAD_ASTERISK 0x55 - #define HID_KEYBOARD_SC_KEYPAD_MINUS 0x56 - #define HID_KEYBOARD_SC_KEYPAD_PLUS 0x57 - #define HID_KEYBOARD_SC_KEYPAD_ENTER 0x58 - #define HID_KEYBOARD_SC_KEYPAD_1_AND_END 0x59 - #define HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW 0x5A - #define HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN 0x5B - #define HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW 0x5C - #define HID_KEYBOARD_SC_KEYPAD_5 0x5D - #define HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW 0x5E - #define HID_KEYBOARD_SC_KEYPAD_7_AND_HOME 0x5F - #define HID_KEYBOARD_SC_KEYPAD_8_AND_UP_ARROW 0x60 - #define HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP 0x61 - #define HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT 0x62 - #define HID_KEYBOARD_SC_KEYPAD_DOT_AND_DELETE 0x63 - #define HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE 0x64 - #define HID_KEYBOARD_SC_APPLICATION 0x65 - #define HID_KEYBOARD_SC_POWER 0x66 - #define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN 0x67 - #define HID_KEYBOARD_SC_F13 0x68 - #define HID_KEYBOARD_SC_F14 0x69 - #define HID_KEYBOARD_SC_F15 0x6A - #define HID_KEYBOARD_SC_F16 0x6B - #define HID_KEYBOARD_SC_F17 0x6C - #define HID_KEYBOARD_SC_F18 0x6D - #define HID_KEYBOARD_SC_F19 0x6E - #define HID_KEYBOARD_SC_F20 0x6F - #define HID_KEYBOARD_SC_F21 0x70 - #define HID_KEYBOARD_SC_F22 0x71 - #define HID_KEYBOARD_SC_F23 0x72 - #define HID_KEYBOARD_SC_F24 0x73 - #define HID_KEYBOARD_SC_EXECUTE 0x74 - #define HID_KEYBOARD_SC_HELP 0x75 - #define HID_KEYBOARD_SC_MENU 0x76 - #define HID_KEYBOARD_SC_SELECT 0x77 - #define HID_KEYBOARD_SC_STOP 0x78 - #define HID_KEYBOARD_SC_AGAIN 0x79 - #define HID_KEYBOARD_SC_UNDO 0x7A - #define HID_KEYBOARD_SC_CUT 0x7B - #define HID_KEYBOARD_SC_COPY 0x7C - #define HID_KEYBOARD_SC_PASTE 0x7D - #define HID_KEYBOARD_SC_FIND 0x7E - #define HID_KEYBOARD_SC_MUTE 0x7F - #define HID_KEYBOARD_SC_VOLUME_UP 0x80 - #define HID_KEYBOARD_SC_VOLUME_DOWN 0x81 - #define HID_KEYBOARD_SC_LOCKING_CAPS_LOCK 0x82 - #define HID_KEYBOARD_SC_LOCKING_NUM_LOCK 0x83 - #define HID_KEYBOARD_SC_LOCKING_SCROLL_LOCK 0x84 - #define HID_KEYBOARD_SC_KEYPAD_COMMA 0x85 - #define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN_AS400 0x86 - #define HID_KEYBOARD_SC_INTERNATIONAL1 0x87 - #define HID_KEYBOARD_SC_INTERNATIONAL2 0x88 - #define HID_KEYBOARD_SC_INTERNATIONAL3 0x89 - #define HID_KEYBOARD_SC_INTERNATIONAL4 0x8A - #define HID_KEYBOARD_SC_INTERNATIONAL5 0x8B - #define HID_KEYBOARD_SC_INTERNATIONAL6 0x8C - #define HID_KEYBOARD_SC_INTERNATIONAL7 0x8D - #define HID_KEYBOARD_SC_INTERNATIONAL8 0x8E - #define HID_KEYBOARD_SC_INTERNATIONAL9 0x8F - #define HID_KEYBOARD_SC_LANG1 0x90 - #define HID_KEYBOARD_SC_LANG2 0x91 - #define HID_KEYBOARD_SC_LANG3 0x92 - #define HID_KEYBOARD_SC_LANG4 0x93 - #define HID_KEYBOARD_SC_LANG5 0x94 - #define HID_KEYBOARD_SC_LANG6 0x95 - #define HID_KEYBOARD_SC_LANG7 0x96 - #define HID_KEYBOARD_SC_LANG8 0x97 - #define HID_KEYBOARD_SC_LANG9 0x98 - #define HID_KEYBOARD_SC_ALTERNATE_ERASE 0x99 - #define HID_KEYBOARD_SC_SYSREQ 0x9A - #define HID_KEYBOARD_SC_CANCEL 0x9B - #define HID_KEYBOARD_SC_CLEAR 0x9C - #define HID_KEYBOARD_SC_PRIOR 0x9D - #define HID_KEYBOARD_SC_RETURN 0x9E - #define HID_KEYBOARD_SC_SEPARATOR 0x9F - #define HID_KEYBOARD_SC_OUT 0xA0 - #define HID_KEYBOARD_SC_OPER 0xA1 - #define HID_KEYBOARD_SC_CLEAR_AND_AGAIN 0xA2 - #define HID_KEYBOARD_SC_CRSEL_AND_PROPS 0xA3 - #define HID_KEYBOARD_SC_EXSEL 0xA4 - #define HID_KEYBOARD_SC_KEYPAD_00 0xB0 - #define HID_KEYBOARD_SC_KEYPAD_000 0xB1 - #define HID_KEYBOARD_SC_THOUSANDS_SEPARATOR 0xB2 - #define HID_KEYBOARD_SC_DECIMAL_SEPARATOR 0xB3 - #define HID_KEYBOARD_SC_CURRENCY_UNIT 0xB4 - #define HID_KEYBOARD_SC_CURRENCY_SUB_UNIT 0xB5 - #define HID_KEYBOARD_SC_KEYPAD_OPENING_PARENTHESIS 0xB6 - #define HID_KEYBOARD_SC_KEYPAD_CLOSING_PARENTHESIS 0xB7 - #define HID_KEYBOARD_SC_KEYPAD_OPENING_BRACE 0xB8 - #define HID_KEYBOARD_SC_KEYPAD_CLOSING_BRACE 0xB9 - #define HID_KEYBOARD_SC_KEYPAD_TAB 0xBA - #define HID_KEYBOARD_SC_KEYPAD_BACKSPACE 0xBB - #define HID_KEYBOARD_SC_KEYPAD_A 0xBC - #define HID_KEYBOARD_SC_KEYPAD_B 0xBD - #define HID_KEYBOARD_SC_KEYPAD_C 0xBE - #define HID_KEYBOARD_SC_KEYPAD_D 0xBF - #define HID_KEYBOARD_SC_KEYPAD_E 0xC0 - #define HID_KEYBOARD_SC_KEYPAD_F 0xC1 - #define HID_KEYBOARD_SC_KEYPAD_XOR 0xC2 - #define HID_KEYBOARD_SC_KEYPAD_CARET 0xC3 - #define HID_KEYBOARD_SC_KEYPAD_PERCENTAGE 0xC4 - #define HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN 0xC5 - #define HID_KEYBOARD_SC_KEYPAD_GREATER_THAN_SIGN 0xC6 - #define HID_KEYBOARD_SC_KEYPAD_AMP 0xC7 - #define HID_KEYBOARD_SC_KEYPAD_AMP_AMP 0xC8 - #define HID_KEYBOARD_SC_KEYPAD_PIPE 0xC9 - #define HID_KEYBOARD_SC_KEYPAD_PIPE_PIPE 0xCA - #define HID_KEYBOARD_SC_KEYPAD_COLON 0xCB - #define HID_KEYBOARD_SC_KEYPAD_HASHMARK 0xCC - #define HID_KEYBOARD_SC_KEYPAD_SPACE 0xCD - #define HID_KEYBOARD_SC_KEYPAD_AT 0xCE - #define HID_KEYBOARD_SC_KEYPAD_EXCLAMATION_SIGN 0xCF - #define HID_KEYBOARD_SC_KEYPAD_MEMORY_STORE 0xD0 - #define HID_KEYBOARD_SC_KEYPAD_MEMORY_RECALL 0xD1 - #define HID_KEYBOARD_SC_KEYPAD_MEMORY_CLEAR 0xD2 - #define HID_KEYBOARD_SC_KEYPAD_MEMORY_ADD 0xD3 - #define HID_KEYBOARD_SC_KEYPAD_MEMORY_SUBTRACT 0xD4 - #define HID_KEYBOARD_SC_KEYPAD_MEMORY_MULTIPLY 0xD5 - #define HID_KEYBOARD_SC_KEYPAD_MEMORY_DIVIDE 0xD6 - #define HID_KEYBOARD_SC_KEYPAD_PLUS_AND_MINUS 0xD7 - #define HID_KEYBOARD_SC_KEYPAD_CLEAR 0xD8 - #define HID_KEYBOARD_SC_KEYPAD_CLEAR_ENTRY 0xD9 - #define HID_KEYBOARD_SC_KEYPAD_BINARY 0xDA - #define HID_KEYBOARD_SC_KEYPAD_OCTAL 0xDB - #define HID_KEYBOARD_SC_KEYPAD_DECIMAL 0xDC - #define HID_KEYBOARD_SC_KEYPAD_HEXADECIMAL 0xDD - #define HID_KEYBOARD_SC_LEFT_CONTROL 0xE0 - #define HID_KEYBOARD_SC_LEFT_SHIFT 0xE1 - #define HID_KEYBOARD_SC_LEFT_ALT 0xE2 - #define HID_KEYBOARD_SC_LEFT_GUI 0xE3 - #define HID_KEYBOARD_SC_RIGHT_CONTROL 0xE4 - #define HID_KEYBOARD_SC_RIGHT_SHIFT 0xE5 - #define HID_KEYBOARD_SC_RIGHT_ALT 0xE6 - #define HID_KEYBOARD_SC_RIGHT_GUI 0xE7 - #define HID_KEYBOARD_SC_MEDIA_PLAY 0xE8 - #define HID_KEYBOARD_SC_MEDIA_STOP 0xE9 - #define HID_KEYBOARD_SC_MEDIA_PREVIOUS_TRACK 0xEA - #define HID_KEYBOARD_SC_MEDIA_NEXT_TRACK 0xEB - #define HID_KEYBOARD_SC_MEDIA_EJECT 0xEC - #define HID_KEYBOARD_SC_MEDIA_VOLUME_UP 0xED - #define HID_KEYBOARD_SC_MEDIA_VOLUME_DOWN 0xEE - #define HID_KEYBOARD_SC_MEDIA_MUTE 0xEF - #define HID_KEYBOARD_SC_MEDIA_WWW 0xF0 - #define HID_KEYBOARD_SC_MEDIA_BACKWARD 0xF1 - #define HID_KEYBOARD_SC_MEDIA_FORWARD 0xF2 - #define HID_KEYBOARD_SC_MEDIA_CANCEL 0xF3 - #define HID_KEYBOARD_SC_MEDIA_SEARCH 0xF4 - #define HID_KEYBOARD_SC_MEDIA_SLEEP 0xF8 - #define HID_KEYBOARD_SC_MEDIA_LOCK 0xF9 - #define HID_KEYBOARD_SC_MEDIA_RELOAD 0xFA - #define HID_KEYBOARD_SC_MEDIA_CALCULATOR 0xFB - //@} - - /** \name Common HID Device Report Descriptors */ - //@{ - /** \hideinitializer - * A list of HID report item array elements that describe a typical HID USB Joystick. The resulting report - * descriptor is structured according to the following layout: - * - * \code - * struct - * { - * intA_t X; // Signed X axis value - * intA_t Y; // Signed Y axis value - * intA_t Z; // Signed Z axis value - * uintB_t Buttons; // Pressed buttons bitmask - * } Joystick_Report; - * \endcode - * - * Where \c uintA_t is a type large enough to hold the ranges of the signed \c MinAxisVal and \c MaxAxisVal values, - * and \c intB_t is a type large enough to hold one bit per button. - * - * \param[in] MinAxisVal Minimum logical axis value (16-bit). - * \param[in] MaxAxisVal Maximum logical axis value (16-bit). - * \param[in] MinPhysicalVal Minimum physical axis value, for movement resolution calculations (16-bit). - * \param[in] MaxPhysicalVal Maximum physical axis value, for movement resolution calculations (16-bit). - * \param[in] Buttons Total number of buttons in the device (8-bit). - */ - #define HID_DESCRIPTOR_JOYSTICK(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons) \ - HID_RI_USAGE_PAGE(8, 0x01), \ - HID_RI_USAGE(8, 0x04), \ - HID_RI_COLLECTION(8, 0x01), \ - HID_RI_USAGE(8, 0x01), \ - HID_RI_COLLECTION(8, 0x00), \ - HID_RI_USAGE(8, 0x30), \ - HID_RI_USAGE(8, 0x31), \ - HID_RI_USAGE(8, 0x32), \ - HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \ - HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \ - HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \ - HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \ - HID_RI_REPORT_COUNT(8, 3), \ - HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \ - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ - HID_RI_END_COLLECTION(0), \ - HID_RI_USAGE_PAGE(8, 0x09), \ - HID_RI_USAGE_MINIMUM(8, 0x01), \ - HID_RI_USAGE_MAXIMUM(8, Buttons), \ - HID_RI_LOGICAL_MINIMUM(8, 0x00), \ - HID_RI_LOGICAL_MAXIMUM(8, 0x01), \ - HID_RI_REPORT_SIZE(8, 0x01), \ - HID_RI_REPORT_COUNT(8, Buttons), \ - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ - HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \ - HID_RI_REPORT_COUNT(8, 0x01), \ - HID_RI_INPUT(8, HID_IOF_CONSTANT), \ - HID_RI_END_COLLECTION(0) - - /** \hideinitializer - * A list of HID report item array elements that describe a typical HID USB keyboard. The resulting report descriptor - * is compatible with \ref USB_KeyboardReport_Data_t when \c MaxKeys is equal to 6. For other values, the report will - * be structured according to the following layout: - * - * \code - * struct - * { - * uint8_t Modifier; // Keyboard modifier byte indicating pressed modifier keys (\c HID_KEYBOARD_MODIFER_* masks) - * uint8_t Reserved; // Reserved for OEM use, always set to 0. - * uint8_t KeyCode[MaxKeys]; // Length determined by the number of keys that can be reported - * } Keyboard_Report; - * \endcode - * - * \param[in] MaxKeys Number of simultaneous keys that can be reported at the one time (8-bit). - */ - #define HID_DESCRIPTOR_KEYBOARD(MaxKeys) \ - HID_RI_USAGE_PAGE(8, 0x01), \ - HID_RI_USAGE(8, 0x06), \ - HID_RI_COLLECTION(8, 0x01), \ - HID_RI_USAGE_PAGE(8, 0x07), \ - HID_RI_USAGE_MINIMUM(8, 0xE0), \ - HID_RI_USAGE_MAXIMUM(8, 0xE7), \ - HID_RI_LOGICAL_MINIMUM(8, 0x00), \ - HID_RI_LOGICAL_MAXIMUM(8, 0x01), \ - HID_RI_REPORT_SIZE(8, 0x01), \ - HID_RI_REPORT_COUNT(8, 0x08), \ - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ - HID_RI_REPORT_COUNT(8, 0x01), \ - HID_RI_REPORT_SIZE(8, 0x08), \ - HID_RI_INPUT(8, HID_IOF_CONSTANT), \ - HID_RI_USAGE_PAGE(8, 0x08), \ - HID_RI_USAGE_MINIMUM(8, 0x01), \ - HID_RI_USAGE_MAXIMUM(8, 0x05), \ - HID_RI_REPORT_COUNT(8, 0x05), \ - HID_RI_REPORT_SIZE(8, 0x01), \ - HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \ - HID_RI_REPORT_COUNT(8, 0x01), \ - HID_RI_REPORT_SIZE(8, 0x03), \ - HID_RI_OUTPUT(8, HID_IOF_CONSTANT), \ - HID_RI_LOGICAL_MINIMUM(8, 0x00), \ - HID_RI_LOGICAL_MAXIMUM(16, 0xFF), \ - HID_RI_USAGE_PAGE(8, 0x07), \ - HID_RI_USAGE_MINIMUM(8, 0x00), \ - HID_RI_USAGE_MAXIMUM(8, 0xFF), \ - HID_RI_REPORT_COUNT(8, MaxKeys), \ - HID_RI_REPORT_SIZE(8, 0x08), \ - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), \ - HID_RI_END_COLLECTION(0) - - /** \hideinitializer - * A list of HID report item array elements that describe a typical HID USB mouse. The resulting report descriptor - * is compatible with \ref USB_MouseReport_Data_t if the \c MinAxisVal and \c MaxAxisVal values fit within a \c int8_t range - * and the number of Buttons is less than 8. For other values, the report is structured according to the following layout: - * - * \code - * struct - * { - * uintA_t Buttons; // Pressed buttons bitmask - * intB_t X; // X axis value - * intB_t Y; // Y axis value - * } Mouse_Report; - * \endcode - * - * Where \c intA_t is a type large enough to hold one bit per button, and \c intB_t is a type large enough to hold the - * ranges of the signed \c MinAxisVal and \c MaxAxisVal values. - * - * \param[in] MinAxisVal Minimum X/Y logical axis value (16-bit). - * \param[in] MaxAxisVal Maximum X/Y logical axis value (16-bit). - * \param[in] MinPhysicalVal Minimum X/Y physical axis value, for movement resolution calculations (16-bit). - * \param[in] MaxPhysicalVal Maximum X/Y physical axis value, for movement resolution calculations (16-bit). - * \param[in] Buttons Total number of buttons in the device (8-bit). - * \param[in] AbsoluteCoords Boolean \c true to use absolute X/Y coordinates (e.g. touchscreen). - */ - #define HID_DESCRIPTOR_MOUSE(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, AbsoluteCoords) \ - HID_RI_USAGE_PAGE(8, 0x01), \ - HID_RI_USAGE(8, 0x02), \ - HID_RI_COLLECTION(8, 0x01), \ - HID_RI_USAGE(8, 0x01), \ - HID_RI_COLLECTION(8, 0x00), \ - HID_RI_USAGE_PAGE(8, 0x09), \ - HID_RI_USAGE_MINIMUM(8, 0x01), \ - HID_RI_USAGE_MAXIMUM(8, Buttons), \ - HID_RI_LOGICAL_MINIMUM(8, 0x00), \ - HID_RI_LOGICAL_MAXIMUM(8, 0x01), \ - HID_RI_REPORT_COUNT(8, Buttons), \ - HID_RI_REPORT_SIZE(8, 0x01), \ - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ - HID_RI_REPORT_COUNT(8, 0x01), \ - HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \ - HID_RI_INPUT(8, HID_IOF_CONSTANT), \ - HID_RI_USAGE_PAGE(8, 0x01), \ - HID_RI_USAGE(8, 0x30), \ - HID_RI_USAGE(8, 0x31), \ - HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \ - HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \ - HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \ - HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \ - HID_RI_REPORT_COUNT(8, 0x02), \ - HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \ - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | (AbsoluteCoords ? HID_IOF_ABSOLUTE : HID_IOF_RELATIVE)), \ - HID_RI_END_COLLECTION(0), \ - HID_RI_END_COLLECTION(0) - - /** \hideinitializer - * A list of HID report item array elements that describe a typical Vendor Defined byte array HID report descriptor, - * used for transporting arbitrary data between the USB host and device via HID reports. The resulting report should be - * a \c uint8_t byte array of the specified length in both Device to Host (IN) and Host to Device (OUT) directions. - * - * \param[in] VendorPageNum Vendor Defined HID Usage Page index, ranging from 0x00 to 0xFF. - * \param[in] CollectionUsage Vendor Usage for the encompassing report IN and OUT collection, ranging from 0x00 to 0xFF. - * \param[in] DataINUsage Vendor Usage for the IN report data, ranging from 0x00 to 0xFF. - * \param[in] DataOUTUsage Vendor Usage for the OUT report data, ranging from 0x00 to 0xFF. - * \param[in] NumBytes Length of the data IN and OUT reports. - */ - #define HID_DESCRIPTOR_VENDOR(VendorPageNum, CollectionUsage, DataINUsage, DataOUTUsage, NumBytes) \ - HID_RI_USAGE_PAGE(16, (0xFF00 | VendorPageNum)), \ - HID_RI_USAGE(8, CollectionUsage), \ - HID_RI_COLLECTION(8, 0x01), \ - HID_RI_USAGE(8, DataINUsage), \ - HID_RI_LOGICAL_MINIMUM(8, 0x00), \ - HID_RI_LOGICAL_MAXIMUM(8, 0xFF), \ - HID_RI_REPORT_SIZE(8, 0x08), \ - HID_RI_REPORT_COUNT(8, NumBytes), \ - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ - HID_RI_USAGE(8, DataOUTUsage), \ - HID_RI_LOGICAL_MINIMUM(8, 0x00), \ - HID_RI_LOGICAL_MAXIMUM(8, 0xFF), \ - HID_RI_REPORT_SIZE(8, 0x08), \ - HID_RI_REPORT_COUNT(8, NumBytes), \ - HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \ - HID_RI_END_COLLECTION(0) - //@} - - /* Type Defines: */ - /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the HID - * device class. - */ - enum HID_Descriptor_ClassSubclassProtocol_t - { - HID_CSCP_HIDClass = 0x03, /**< Descriptor Class value indicating that the device or interface - * belongs to the HID class. - */ - HID_CSCP_NonBootSubclass = 0x00, /**< Descriptor Subclass value indicating that the device or interface - * does not implement a HID boot protocol. - */ - HID_CSCP_BootSubclass = 0x01, /**< Descriptor Subclass value indicating that the device or interface - * implements a HID boot protocol. - */ - HID_CSCP_NonBootProtocol = 0x00, /**< Descriptor Protocol value indicating that the device or interface - * does not belong to a HID boot protocol. - */ - HID_CSCP_KeyboardBootProtocol = 0x01, /**< Descriptor Protocol value indicating that the device or interface - * belongs to the Keyboard HID boot protocol. - */ - HID_CSCP_MouseBootProtocol = 0x02, /**< Descriptor Protocol value indicating that the device or interface - * belongs to the Mouse HID boot protocol. - */ - }; - - /** Enum for the HID class specific control requests that can be issued by the USB bus host. */ - enum HID_ClassRequests_t - { - HID_REQ_GetReport = 0x01, /**< HID class-specific Request to get the current HID report from the device. */ - HID_REQ_GetIdle = 0x02, /**< HID class-specific Request to get the current device idle count. */ - HID_REQ_GetProtocol = 0x03, /**< HID class-specific Request to get the current HID report protocol mode. */ - HID_REQ_SetReport = 0x09, /**< HID class-specific Request to set the current HID report to the device. */ - HID_REQ_SetIdle = 0x0A, /**< HID class-specific Request to set the device's idle count. */ - HID_REQ_SetProtocol = 0x0B, /**< HID class-specific Request to set the current HID report protocol mode. */ - }; - - /** Enum for the HID class specific descriptor types. */ - enum HID_DescriptorTypes_t - { - HID_DTYPE_HID = 0x21, /**< Descriptor header type value, to indicate a HID class HID descriptor. */ - HID_DTYPE_Report = 0x22, /**< Descriptor header type value, to indicate a HID class HID report descriptor. */ - }; - - /** Enum for the different types of HID reports. */ - enum HID_ReportItemTypes_t - { - HID_REPORT_ITEM_In = 0, /**< Indicates that the item is an IN report type. */ - HID_REPORT_ITEM_Out = 1, /**< Indicates that the item is an OUT report type. */ - HID_REPORT_ITEM_Feature = 2, /**< Indicates that the item is a FEATURE report type. */ - }; - - /** \brief HID class-specific HID Descriptor (LUFA naming conventions). - * - * Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID - * specification for details on the structure elements. - * - * \see \ref USB_HID_StdDescriptor_HID_t for the version of this type with standard element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ - - uint16_t HIDSpec; /**< BCD encoded version that the HID descriptor and device complies to. - * - * \see \ref VERSION_BCD() utility macro. - */ - uint8_t CountryCode; /**< Country code of the localized device, or zero if universal. */ - - uint8_t TotalReportDescriptors; /**< Total number of HID report descriptors for the interface. */ - - uint8_t HIDReportType; /**< Type of HID report, set to \ref HID_DTYPE_Report. */ - uint16_t HIDReportLength; /**< Length of the associated HID report descriptor, in bytes. */ - } ATTR_PACKED USB_HID_Descriptor_HID_t; - - /** \brief HID class-specific HID Descriptor (USB-IF naming conventions). - * - * Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID - * specification for details on the structure elements. - * - * \see \ref USB_HID_Descriptor_HID_t for the version of this type with non-standard LUFA specific - * element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint8_t bLength; /**< Size of the descriptor, in bytes. */ - uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value - * given by the specific class. - */ - - uint16_t bcdHID; /**< BCD encoded version that the HID descriptor and device complies to. - * - * \see \ref VERSION_BCD() utility macro. - */ - uint8_t bCountryCode; /**< Country code of the localized device, or zero if universal. */ - - uint8_t bNumDescriptors; /**< Total number of HID report descriptors for the interface. */ - - uint8_t bDescriptorType2; /**< Type of HID report, set to \ref HID_DTYPE_Report. */ - uint16_t wDescriptorLength; /**< Length of the associated HID report descriptor, in bytes. */ - } ATTR_PACKED USB_HID_StdDescriptor_HID_t; - - /** \brief Standard HID Boot Protocol Mouse Report. - * - * Type define for a standard Boot Protocol Mouse report - */ - typedef struct - { - uint8_t Button; /**< Button mask for currently pressed buttons in the mouse. */ - int8_t X; /**< Current delta X movement of the mouse. */ - int8_t Y; /**< Current delta Y movement on the mouse. */ - } ATTR_PACKED USB_MouseReport_Data_t; - - /** \brief Standard HID Boot Protocol Keyboard Report. - * - * Type define for a standard Boot Protocol Keyboard report - */ - typedef struct - { - uint8_t Modifier; /**< Keyboard modifier byte, indicating pressed modifier keys (a combination of - * \c HID_KEYBOARD_MODIFER_* masks). - */ - uint8_t Reserved; /**< Reserved for OEM use, always set to 0. */ - uint8_t KeyCode[6]; /**< Key codes of the currently pressed keys. */ - } ATTR_PACKED USB_KeyboardReport_Data_t; - - /** Type define for the data type used to store HID report descriptor elements. */ - typedef uint8_t USB_Descriptor_HIDReport_Datatype_t; - - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } - #endif - -#endif - -/** @} */ diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDReportData.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDReportData.h deleted file mode 100644 index fe1c4df94352..000000000000 --- a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Class/Common/HIDReportData.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2017. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaims all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * \brief Constants for HID report item attributes. - * - * HID report item constants for report item attributes. Refer to the HID specification for - * details on each flag's meaning when applied to an IN, OUT or FEATURE item. - */ - -/** \ingroup Group_HIDParser - * \defgroup Group_HIDReportItemConst HID Report Descriptor Item Constants - * - * General HID constant definitions for HID Report Descriptor elements. - * - * @{ - */ - -#ifndef __HIDREPORTDATA_H__ -#define __HIDREPORTDATA_H__ - - /* Private Interface - For use in library only: */ - #if !defined(__DOXYGEN__) - /* Macros: */ - #define HID_RI_DATA_SIZE_MASK 0x03 - #define HID_RI_TYPE_MASK 0x0C - #define HID_RI_TAG_MASK 0xF0 - - #define HID_RI_TYPE_MAIN 0x00 - #define HID_RI_TYPE_GLOBAL 0x04 - #define HID_RI_TYPE_LOCAL 0x08 - - #define HID_RI_DATA_BITS_0 0x00 - #define HID_RI_DATA_BITS_8 0x01 - #define HID_RI_DATA_BITS_16 0x02 - #define HID_RI_DATA_BITS_32 0x03 - #define HID_RI_DATA_BITS(DataBits) CONCAT_EXPANDED(HID_RI_DATA_BITS_, DataBits) - - #define _HID_RI_ENCODE_0(Data) - #define _HID_RI_ENCODE_8(Data) , (Data & 0xFF) - #define _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_8(Data) _HID_RI_ENCODE_8(Data >> 8) - #define _HID_RI_ENCODE_32(Data) _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_16(Data >> 16) - #define _HID_RI_ENCODE(DataBits, ...) CONCAT_EXPANDED(_HID_RI_ENCODE_, DataBits(__VA_ARGS__)) - - #define _HID_RI_ENTRY(Type, Tag, DataBits, ...) (Type | Tag | HID_RI_DATA_BITS(DataBits)) _HID_RI_ENCODE(DataBits, (__VA_ARGS__)) - #endif - - /* Public Interface - May be used in end-application: */ - /* Macros: */ - /** \name HID Input, Output and Feature Report Descriptor Item Flags */ - //@{ - #define HID_IOF_CONSTANT (1 << 0) - #define HID_IOF_DATA (0 << 0) - #define HID_IOF_VARIABLE (1 << 1) - #define HID_IOF_ARRAY (0 << 1) - #define HID_IOF_RELATIVE (1 << 2) - #define HID_IOF_ABSOLUTE (0 << 2) - #define HID_IOF_WRAP (1 << 3) - #define HID_IOF_NO_WRAP (0 << 3) - #define HID_IOF_NON_LINEAR (1 << 4) - #define HID_IOF_LINEAR (0 << 4) - #define HID_IOF_NO_PREFERRED_STATE (1 << 5) - #define HID_IOF_PREFERRED_STATE (0 << 5) - #define HID_IOF_NULLSTATE (1 << 6) - #define HID_IOF_NO_NULL_POSITION (0 << 6) - #define HID_IOF_VOLATILE (1 << 7) - #define HID_IOF_NON_VOLATILE (0 << 7) - #define HID_IOF_BUFFERED_BYTES (1 << 8) - #define HID_IOF_BITFIELD (0 << 8) - //@} - - /** \name HID Report Descriptor Item Macros */ - //@{ - #define HID_RI_INPUT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0x80, DataBits, __VA_ARGS__) - #define HID_RI_OUTPUT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0x90, DataBits, __VA_ARGS__) - #define HID_RI_COLLECTION(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xA0, DataBits, __VA_ARGS__) - #define HID_RI_FEATURE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xB0, DataBits, __VA_ARGS__) - #define HID_RI_END_COLLECTION(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xC0, DataBits, __VA_ARGS__) - #define HID_RI_USAGE_PAGE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x00, DataBits, __VA_ARGS__) - #define HID_RI_LOGICAL_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x10, DataBits, __VA_ARGS__) - #define HID_RI_LOGICAL_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x20, DataBits, __VA_ARGS__) - #define HID_RI_PHYSICAL_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x30, DataBits, __VA_ARGS__) - #define HID_RI_PHYSICAL_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x40, DataBits, __VA_ARGS__) - #define HID_RI_UNIT_EXPONENT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x50, DataBits, __VA_ARGS__) - #define HID_RI_UNIT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x60, DataBits, __VA_ARGS__) - #define HID_RI_REPORT_SIZE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x70, DataBits, __VA_ARGS__) - #define HID_RI_REPORT_ID(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x80, DataBits, __VA_ARGS__) - #define HID_RI_REPORT_COUNT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x90, DataBits, __VA_ARGS__) - #define HID_RI_PUSH(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xA0, DataBits, __VA_ARGS__) - #define HID_RI_POP(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xB0, DataBits, __VA_ARGS__) - #define HID_RI_USAGE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x00, DataBits, __VA_ARGS__) - #define HID_RI_USAGE_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x10, DataBits, __VA_ARGS__) - #define HID_RI_USAGE_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x20, DataBits, __VA_ARGS__) - //@} - -/** @} */ - -#endif - diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/StdDescriptors.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/StdDescriptors.h deleted file mode 100644 index 1003b258c2b0..000000000000 --- a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/StdDescriptors.h +++ /dev/null @@ -1,765 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2017. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaims all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * \brief Common standard USB Descriptor definitions for all architectures. - * \copydetails Group_StdDescriptors - * - * \note This file should not be included directly. It is automatically included as needed by the USB driver - * dispatch header located in LUFA/Drivers/USB/USB.h. - */ - -/** \ingroup Group_USB - * \defgroup Group_StdDescriptors USB Descriptors - * \brief Standard USB Descriptor definitions. - * - * Standard USB device descriptor defines and retrieval routines, for USB devices. This module contains - * structures and macros for the easy creation of standard USB descriptors in USB device projects. - * - * @{ - */ - -#ifndef __USBDESCRIPTORS_H__ -#define __USBDESCRIPTORS_H__ - - /* Includes: */ - //#include "../../../Common/Common.h" - //#include "USBMode.h" - //#include "Events.h" - - /* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { - #endif - - /* Preprocessor Checks: */ - #if !defined(__INCLUDE_FROM_USB_DRIVER) - #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. - #endif - - /* Public Interface - May be used in end-application: */ - /* Macros: */ - /** Indicates that a given descriptor does not exist in the device. This can be used inside descriptors - * for string descriptor indexes, or may be use as a return value for GetDescriptor when the specified - * descriptor does not exist. - */ - #define NO_DESCRIPTOR 0 - - /** Macro to calculate the power value for the configuration descriptor, from a given number of milliamperes. - * - * \param[in] mA Maximum number of milliamps the device consumes when the given configuration is selected. - */ - #define USB_CONFIG_POWER_MA(mA) ((mA) >> 1) - - /** Macro to calculate the Unicode length of a string with a given number of Unicode characters. - * Should be used in string descriptor's headers for giving the string descriptor's byte length. - * - * \param[in] UnicodeChars Number of Unicode characters in the string text. - */ - #define USB_STRING_LEN(UnicodeChars) (sizeof(USB_Descriptor_Header_t) + ((UnicodeChars) << 1)) - - /** Convenience macro to easily create \ref USB_Descriptor_String_t instances from a wide character string. - * - * \note This macro is for little-endian systems only. - * - * \param[in] String String to initialize a USB String Descriptor structure with. - */ - #define USB_STRING_DESCRIPTOR(String) { .Header = {.Size = sizeof(USB_Descriptor_Header_t) + (sizeof(String) - 2), .Type = DTYPE_String}, .UnicodeString = String } - - /** Convenience macro to easily create \ref USB_Descriptor_String_t instances from an array of characters. - * - * \param[in] ... Characters to initialize a USB String Descriptor structure with. - */ - #define USB_STRING_DESCRIPTOR_ARRAY(...) { .Header = {.Size = sizeof(USB_Descriptor_Header_t) + sizeof((uint16_t){__VA_ARGS__}), .Type = DTYPE_String}, .UnicodeString = {__VA_ARGS__} } - - /** Macro to encode a given major/minor/revision version number into Binary Coded Decimal format for descriptor - * fields requiring BCD encoding, such as the USB version number in the standard device descriptor. - * - * \note This value is automatically converted into Little Endian, suitable for direct use inside device - * descriptors on all architectures without endianness conversion macros. - * - * \param[in] Major Major version number to encode. - * \param[in] Minor Minor version number to encode. - * \param[in] Revision Revision version number to encode. - */ - #define VERSION_BCD(Major, Minor, Revision) \ - CPU_TO_LE16( ((Major & 0xFF) << 8) | \ - ((Minor & 0x0F) << 4) | \ - (Revision & 0x0F) ) - - /** String language ID for the English language. Should be used in \ref USB_Descriptor_String_t descriptors - * to indicate that the English language is supported by the device in its string descriptors. - */ - #define LANGUAGE_ID_ENG 0x0409 - - /** \name USB Configuration Descriptor Attribute Masks */ - //@{ - /** Mask for the reserved bit in the Configuration Descriptor's \c ConfigAttributes field, which must be set on all - * devices for historical purposes. - */ - #define USB_CONFIG_ATTR_RESERVED 0x80 - - /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t - * descriptor's \c ConfigAttributes value to indicate that the specified configuration can draw its power - * from the device's own power source. - */ - #define USB_CONFIG_ATTR_SELFPOWERED 0x40 - - /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t - * descriptor's \c ConfigAttributes value to indicate that the specified configuration supports the - * remote wakeup feature of the USB standard, allowing a suspended USB device to wake up the host upon - * request. - */ - #define USB_CONFIG_ATTR_REMOTEWAKEUP 0x20 - //@} - - /** \name Endpoint Descriptor Attribute Masks */ - //@{ - /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's - * \c Attributes value to indicate that the specified endpoint is not synchronized. - * - * \see The USB specification for more details on the possible Endpoint attributes. - */ - #define ENDPOINT_ATTR_NO_SYNC (0 << 2) - - /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's - * \c Attributes value to indicate that the specified endpoint is asynchronous. - * - * \see The USB specification for more details on the possible Endpoint attributes. - */ - #define ENDPOINT_ATTR_ASYNC (1 << 2) - - /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's - * \c Attributes value to indicate that the specified endpoint is adaptive. - * - * \see The USB specification for more details on the possible Endpoint attributes. - */ - #define ENDPOINT_ATTR_ADAPTIVE (2 << 2) - - /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's - * \c Attributes value to indicate that the specified endpoint is synchronized. - * - * \see The USB specification for more details on the possible Endpoint attributes. - */ - #define ENDPOINT_ATTR_SYNC (3 << 2) - //@} - - /** \name Endpoint Descriptor Usage Masks */ - //@{ - /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's - * \c Attributes value to indicate that the specified endpoint is used for data transfers. - * - * \see The USB specification for more details on the possible Endpoint usage attributes. - */ - #define ENDPOINT_USAGE_DATA (0 << 4) - - /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's - * \c Attributes value to indicate that the specified endpoint is used for feedback. - * - * \see The USB specification for more details on the possible Endpoint usage attributes. - */ - #define ENDPOINT_USAGE_FEEDBACK (1 << 4) - - /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's - * \c Attributes value to indicate that the specified endpoint is used for implicit feedback. - * - * \see The USB specification for more details on the possible Endpoint usage attributes. - */ - #define ENDPOINT_USAGE_IMPLICIT_FEEDBACK (2 << 4) - //@} - - /* Enums: */ - /** Enum for the possible standard descriptor types, as given in each descriptor's header. */ - enum USB_DescriptorTypes_t - { - DTYPE_Device = 0x01, /**< Indicates that the descriptor is a device descriptor. */ - DTYPE_Configuration = 0x02, /**< Indicates that the descriptor is a configuration descriptor. */ - DTYPE_String = 0x03, /**< Indicates that the descriptor is a string descriptor. */ - DTYPE_Interface = 0x04, /**< Indicates that the descriptor is an interface descriptor. */ - DTYPE_Endpoint = 0x05, /**< Indicates that the descriptor is an endpoint descriptor. */ - DTYPE_DeviceQualifier = 0x06, /**< Indicates that the descriptor is a device qualifier descriptor. */ - DTYPE_Other = 0x07, /**< Indicates that the descriptor is of other type. */ - DTYPE_InterfacePower = 0x08, /**< Indicates that the descriptor is an interface power descriptor. */ - DTYPE_InterfaceAssociation = 0x0B, /**< Indicates that the descriptor is an interface association descriptor. */ - DTYPE_CSInterface = 0x24, /**< Indicates that the descriptor is a class specific interface descriptor. */ - DTYPE_CSEndpoint = 0x25, /**< Indicates that the descriptor is a class specific endpoint descriptor. */ - }; - - /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors. */ - enum USB_Descriptor_ClassSubclassProtocol_t - { - USB_CSCP_NoDeviceClass = 0x00, /**< Descriptor Class value indicating that the device does not belong - * to a particular class at the device level. - */ - USB_CSCP_NoDeviceSubclass = 0x00, /**< Descriptor Subclass value indicating that the device does not belong - * to a particular subclass at the device level. - */ - USB_CSCP_NoDeviceProtocol = 0x00, /**< Descriptor Protocol value indicating that the device does not belong - * to a particular protocol at the device level. - */ - USB_CSCP_VendorSpecificClass = 0xFF, /**< Descriptor Class value indicating that the device/interface belongs - * to a vendor specific class. - */ - USB_CSCP_VendorSpecificSubclass = 0xFF, /**< Descriptor Subclass value indicating that the device/interface belongs - * to a vendor specific subclass. - */ - USB_CSCP_VendorSpecificProtocol = 0xFF, /**< Descriptor Protocol value indicating that the device/interface belongs - * to a vendor specific protocol. - */ - USB_CSCP_IADDeviceClass = 0xEF, /**< Descriptor Class value indicating that the device belongs to the - * Interface Association Descriptor class. - */ - USB_CSCP_IADDeviceSubclass = 0x02, /**< Descriptor Subclass value indicating that the device belongs to the - * Interface Association Descriptor subclass. - */ - USB_CSCP_IADDeviceProtocol = 0x01, /**< Descriptor Protocol value indicating that the device belongs to the - * Interface Association Descriptor protocol. - */ - }; - - /* Type Defines: */ - /** \brief Standard USB Descriptor Header (LUFA naming conventions). - * - * Type define for all descriptors' standard header, indicating the descriptor's length and type. This structure - * uses LUFA-specific element names to make each element's purpose clearer. - * - * \see \ref USB_StdDescriptor_Header_t for the version of this type with standard element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint8_t Size; /**< Size of the descriptor, in bytes. */ - uint8_t Type; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value - * given by the specific class. - */ - } ATTR_PACKED USB_Descriptor_Header_t; - - /** \brief Standard USB Descriptor Header (USB-IF naming conventions). - * - * Type define for all descriptors' standard header, indicating the descriptor's length and type. This structure - * uses the relevant standard's given element names to ensure compatibility with the standard. - * - * \see \ref USB_Descriptor_Header_t for the version of this type with non-standard LUFA specific element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint8_t bLength; /**< Size of the descriptor, in bytes. */ - uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value - * given by the specific class. - */ - } ATTR_PACKED USB_StdDescriptor_Header_t; - - /** \brief Standard USB Device Descriptor (LUFA naming conventions). - * - * Type define for a standard Device Descriptor. This structure uses LUFA-specific element names to make each - * element's purpose clearer. - * - * \see \ref USB_StdDescriptor_Device_t for the version of this type with standard element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ - - uint16_t USBSpecification; /**< BCD of the supported USB specification. - * - * \see \ref VERSION_BCD() utility macro. - */ - uint8_t Class; /**< USB device class. */ - uint8_t SubClass; /**< USB device subclass. */ - uint8_t Protocol; /**< USB device protocol. */ - - uint8_t Endpoint0Size; /**< Size of the control (address 0) endpoint's bank in bytes. */ - - uint16_t VendorID; /**< Vendor ID for the USB product. */ - uint16_t ProductID; /**< Unique product ID for the USB product. */ - uint16_t ReleaseNumber; /**< Product release (version) number. - * - * \see \ref VERSION_BCD() utility macro. - */ - uint8_t ManufacturerStrIndex; /**< String index for the manufacturer's name. The - * host will request this string via a separate - * control request for the string descriptor. - * - * \note If no string supplied, use \ref NO_DESCRIPTOR. - */ - uint8_t ProductStrIndex; /**< String index for the product name/details. - * - * \see ManufacturerStrIndex structure entry. - */ - uint8_t SerialNumStrIndex; /**< String index for the product's globally unique hexadecimal - * serial number, in uppercase Unicode ASCII. - * - * \note On some microcontroller models, there is an embedded serial number - * in the chip which can be used for the device serial number. - * To use this serial number, set this to \c USE_INTERNAL_SERIAL. - * On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR - * and will cause the host to generate a pseudo-unique value for the - * device upon insertion. - * - * \see \c ManufacturerStrIndex structure entry. - */ - uint8_t NumberOfConfigurations; /**< Total number of configurations supported by - * the device. - */ - } ATTR_PACKED USB_Descriptor_Device_t; - - /** \brief Standard USB Device Descriptor (USB-IF naming conventions). - * - * Type define for a standard Device Descriptor. This structure uses the relevant standard's given element names - * to ensure compatibility with the standard. - * - * \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint8_t bLength; /**< Size of the descriptor, in bytes. */ - uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value - * given by the specific class. - */ - uint16_t bcdUSB; /**< BCD of the supported USB specification. - * - * \see \ref VERSION_BCD() utility macro. - */ - uint8_t bDeviceClass; /**< USB device class. */ - uint8_t bDeviceSubClass; /**< USB device subclass. */ - uint8_t bDeviceProtocol; /**< USB device protocol. */ - uint8_t bMaxPacketSize0; /**< Size of the control (address 0) endpoint's bank in bytes. */ - uint16_t idVendor; /**< Vendor ID for the USB product. */ - uint16_t idProduct; /**< Unique product ID for the USB product. */ - uint16_t bcdDevice; /**< Product release (version) number. - * - * \see \ref VERSION_BCD() utility macro. - */ - uint8_t iManufacturer; /**< String index for the manufacturer's name. The - * host will request this string via a separate - * control request for the string descriptor. - * - * \note If no string supplied, use \ref NO_DESCRIPTOR. - */ - uint8_t iProduct; /**< String index for the product name/details. - * - * \see ManufacturerStrIndex structure entry. - */ - uint8_t iSerialNumber; /**< String index for the product's globally unique hexadecimal - * serial number, in uppercase Unicode ASCII. - * - * \note On some microcontroller models, there is an embedded serial number - * in the chip which can be used for the device serial number. - * To use this serial number, set this to \c USE_INTERNAL_SERIAL. - * On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR - * and will cause the host to generate a pseudo-unique value for the - * device upon insertion. - * - * \see \c ManufacturerStrIndex structure entry. - */ - uint8_t bNumConfigurations; /**< Total number of configurations supported by - * the device. - */ - } ATTR_PACKED USB_StdDescriptor_Device_t; - - /** \brief Standard USB Device Qualifier Descriptor (LUFA naming conventions). - * - * Type define for a standard Device Qualifier Descriptor. This structure uses LUFA-specific element names - * to make each element's purpose clearer. - * - * \see \ref USB_StdDescriptor_DeviceQualifier_t for the version of this type with standard element names. - */ - typedef struct - { - USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ - - uint16_t USBSpecification; /**< BCD of the supported USB specification. - * - * \see \ref VERSION_BCD() utility macro. - */ - uint8_t Class; /**< USB device class. */ - uint8_t SubClass; /**< USB device subclass. */ - uint8_t Protocol; /**< USB device protocol. */ - - uint8_t Endpoint0Size; /**< Size of the control (address 0) endpoint's bank in bytes. */ - uint8_t NumberOfConfigurations; /**< Total number of configurations supported by - * the device. - */ - uint8_t Reserved; /**< Reserved for future use, must be 0. */ - } ATTR_PACKED USB_Descriptor_DeviceQualifier_t; - - /** \brief Standard USB Device Qualifier Descriptor (USB-IF naming conventions). - * - * Type define for a standard Device Qualifier Descriptor. This structure uses the relevant standard's given element names - * to ensure compatibility with the standard. - * - * \see \ref USB_Descriptor_DeviceQualifier_t for the version of this type with non-standard LUFA specific element names. - */ - typedef struct - { - uint8_t bLength; /**< Size of the descriptor, in bytes. */ - uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value - * given by the specific class. - */ - uint16_t bcdUSB; /**< BCD of the supported USB specification. - * - * \see \ref VERSION_BCD() utility macro. - */ - uint8_t bDeviceClass; /**< USB device class. */ - uint8_t bDeviceSubClass; /**< USB device subclass. */ - uint8_t bDeviceProtocol; /**< USB device protocol. */ - uint8_t bMaxPacketSize0; /**< Size of the control (address 0) endpoint's bank in bytes. */ - uint8_t bNumConfigurations; /**< Total number of configurations supported by - * the device. - */ - uint8_t bReserved; /**< Reserved for future use, must be 0. */ - } ATTR_PACKED USB_StdDescriptor_DeviceQualifier_t; - - /** \brief Standard USB Configuration Descriptor (LUFA naming conventions). - * - * Type define for a standard Configuration Descriptor header. This structure uses LUFA-specific element names - * to make each element's purpose clearer. - * - * \see \ref USB_StdDescriptor_Configuration_Header_t for the version of this type with standard element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ - - uint16_t TotalConfigurationSize; /**< Size of the configuration descriptor header, - * and all sub descriptors inside the configuration. - */ - uint8_t TotalInterfaces; /**< Total number of interfaces in the configuration. */ - - uint8_t ConfigurationNumber; /**< Configuration index of the current configuration. */ - uint8_t ConfigurationStrIndex; /**< Index of a string descriptor describing the configuration. */ - - uint8_t ConfigAttributes; /**< Configuration attributes, comprised of a mask of \c USB_CONFIG_ATTR_* masks. - * On all devices, this should include USB_CONFIG_ATTR_RESERVED at a minimum. - */ - - uint8_t MaxPowerConsumption; /**< Maximum power consumption of the device while in the - * current configuration, calculated by the \ref USB_CONFIG_POWER_MA() - * macro. - */ - } ATTR_PACKED USB_Descriptor_Configuration_Header_t; - - /** \brief Standard USB Configuration Descriptor (USB-IF naming conventions). - * - * Type define for a standard Configuration Descriptor header. This structure uses the relevant standard's given element names - * to ensure compatibility with the standard. - * - * \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint8_t bLength; /**< Size of the descriptor, in bytes. */ - uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value - * given by the specific class. - */ - uint16_t wTotalLength; /**< Size of the configuration descriptor header, - * and all sub descriptors inside the configuration. - */ - uint8_t bNumInterfaces; /**< Total number of interfaces in the configuration. */ - uint8_t bConfigurationValue; /**< Configuration index of the current configuration. */ - uint8_t iConfiguration; /**< Index of a string descriptor describing the configuration. */ - uint8_t bmAttributes; /**< Configuration attributes, comprised of a mask of \c USB_CONFIG_ATTR_* masks. - * On all devices, this should include USB_CONFIG_ATTR_RESERVED at a minimum. - */ - uint8_t bMaxPower; /**< Maximum power consumption of the device while in the - * current configuration, calculated by the \ref USB_CONFIG_POWER_MA() - * macro. - */ - } ATTR_PACKED USB_StdDescriptor_Configuration_Header_t; - - /** \brief Standard USB Interface Descriptor (LUFA naming conventions). - * - * Type define for a standard Interface Descriptor. This structure uses LUFA-specific element names - * to make each element's purpose clearer. - * - * \see \ref USB_StdDescriptor_Interface_t for the version of this type with standard element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ - - uint8_t InterfaceNumber; /**< Index of the interface in the current configuration. */ - uint8_t AlternateSetting; /**< Alternate setting for the interface number. The same - * interface number can have multiple alternate settings - * with different endpoint configurations, which can be - * selected by the host. - */ - uint8_t TotalEndpoints; /**< Total number of endpoints in the interface. */ - - uint8_t Class; /**< Interface class ID. */ - uint8_t SubClass; /**< Interface subclass ID. */ - uint8_t Protocol; /**< Interface protocol ID. */ - - uint8_t InterfaceStrIndex; /**< Index of the string descriptor describing the interface. */ - } ATTR_PACKED USB_Descriptor_Interface_t; - - /** \brief Standard USB Interface Descriptor (USB-IF naming conventions). - * - * Type define for a standard Interface Descriptor. This structure uses the relevant standard's given element names - * to ensure compatibility with the standard. - * - * \see \ref USB_Descriptor_Interface_t for the version of this type with non-standard LUFA specific element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint8_t bLength; /**< Size of the descriptor, in bytes. */ - uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value - * given by the specific class. - */ - uint8_t bInterfaceNumber; /**< Index of the interface in the current configuration. */ - uint8_t bAlternateSetting; /**< Alternate setting for the interface number. The same - * interface number can have multiple alternate settings - * with different endpoint configurations, which can be - * selected by the host. - */ - uint8_t bNumEndpoints; /**< Total number of endpoints in the interface. */ - uint8_t bInterfaceClass; /**< Interface class ID. */ - uint8_t bInterfaceSubClass; /**< Interface subclass ID. */ - uint8_t bInterfaceProtocol; /**< Interface protocol ID. */ - uint8_t iInterface; /**< Index of the string descriptor describing the - * interface. - */ - } ATTR_PACKED USB_StdDescriptor_Interface_t; - - /** \brief Standard USB Interface Association Descriptor (LUFA naming conventions). - * - * Type define for a standard Interface Association Descriptor. This structure uses LUFA-specific element names - * to make each element's purpose clearer. - * - * This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at - * http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf. It allows composite - * devices with multiple interfaces related to the same function to have the multiple interfaces bound - * together at the point of enumeration, loading one generic driver for all the interfaces in the single - * function. Read the ECN for more information. - * - * \see \ref USB_StdDescriptor_Interface_Association_t for the version of this type with standard element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ - - uint8_t FirstInterfaceIndex; /**< Index of the first associated interface. */ - uint8_t TotalInterfaces; /**< Total number of associated interfaces. */ - - uint8_t Class; /**< Interface class ID. */ - uint8_t SubClass; /**< Interface subclass ID. */ - uint8_t Protocol; /**< Interface protocol ID. */ - - uint8_t IADStrIndex; /**< Index of the string descriptor describing the - * interface association. - */ - } ATTR_PACKED USB_Descriptor_Interface_Association_t; - - /** \brief Standard USB Interface Association Descriptor (USB-IF naming conventions). - * - * Type define for a standard Interface Association Descriptor. This structure uses the relevant standard's given - * element names to ensure compatibility with the standard. - * - * This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at - * http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf. It allows composite - * devices with multiple interfaces related to the same function to have the multiple interfaces bound - * together at the point of enumeration, loading one generic driver for all the interfaces in the single - * function. Read the ECN for more information. - * - * \see \ref USB_Descriptor_Interface_Association_t for the version of this type with non-standard LUFA specific - * element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint8_t bLength; /**< Size of the descriptor, in bytes. */ - uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value - * given by the specific class. - */ - uint8_t bFirstInterface; /**< Index of the first associated interface. */ - uint8_t bInterfaceCount; /**< Total number of associated interfaces. */ - uint8_t bFunctionClass; /**< Interface class ID. */ - uint8_t bFunctionSubClass; /**< Interface subclass ID. */ - uint8_t bFunctionProtocol; /**< Interface protocol ID. */ - uint8_t iFunction; /**< Index of the string descriptor describing the - * interface association. - */ - } ATTR_PACKED USB_StdDescriptor_Interface_Association_t; - - /** \brief Standard USB Endpoint Descriptor (LUFA naming conventions). - * - * Type define for a standard Endpoint Descriptor. This structure uses LUFA-specific element names - * to make each element's purpose clearer. - * - * \see \ref USB_StdDescriptor_Endpoint_t for the version of this type with standard element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ - - uint8_t EndpointAddress; /**< Logical address of the endpoint within the device for the current - * configuration, including direction mask. - */ - uint8_t Attributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (EP_TYPE_*) - * and attributes (ENDPOINT_ATTR_*) masks. - */ - uint16_t EndpointSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet - * size that the endpoint can receive at a time. - */ - uint8_t PollingIntervalMS; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT - * or ISOCHRONOUS type. - */ - } ATTR_PACKED USB_Descriptor_Endpoint_t; - - /** \brief Standard USB Endpoint Descriptor (USB-IF naming conventions). - * - * Type define for a standard Endpoint Descriptor. This structure uses the relevant standard's given - * element names to ensure compatibility with the standard. - * - * \see \ref USB_Descriptor_Endpoint_t for the version of this type with non-standard LUFA specific - * element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint8_t bLength; /**< Size of the descriptor, in bytes. */ - uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a - * value given by the specific class. - */ - uint8_t bEndpointAddress; /**< Logical address of the endpoint within the device for the current - * configuration, including direction mask. - */ - uint8_t bmAttributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (EP_TYPE_*) - * and attributes (ENDPOINT_ATTR_*) masks. - */ - uint16_t wMaxPacketSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet size - * that the endpoint can receive at a time. - */ - uint8_t bInterval; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT or - * ISOCHRONOUS type. - */ - } ATTR_PACKED USB_StdDescriptor_Endpoint_t; - - /** \brief Standard USB String Descriptor (LUFA naming conventions). - * - * Type define for a standard string descriptor. Unlike other standard descriptors, the length - * of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN() - * macro rather than by the size of the descriptor structure, as the length is not fixed. - * - * This structure should also be used for string index 0, which contains the supported language IDs for - * the device as an array. - * - * This structure uses LUFA-specific element names to make each element's purpose clearer. - * - * \see \ref USB_StdDescriptor_String_t for the version of this type with standard element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ - - #if (((ARCH == ARCH_AVR8) || (ARCH == ARCH_XMEGA)) && !defined(__DOXYGEN__)) - wchar_t UnicodeString[]; - #else - uint16_t UnicodeString[]; /**< String data, as unicode characters (alternatively, - * string language IDs). If normal ASCII characters are - * to be used, they must be added as an array of characters - * rather than a normal C string so that they are widened to - * Unicode size. - * - * Under GCC, strings prefixed with the "L" character (before - * the opening string quotation mark) are considered to be - * Unicode strings, and may be used instead of an explicit - * array of ASCII characters on little endian devices with - * UTF-16-LE \c wchar_t encoding. - */ - #endif - } ATTR_PACKED USB_Descriptor_String_t; - - /** \brief Standard USB String Descriptor (USB-IF naming conventions). - * - * Type define for a standard string descriptor. Unlike other standard descriptors, the length - * of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN() - * macro rather than by the size of the descriptor structure, as the length is not fixed. - * - * This structure should also be used for string index 0, which contains the supported language IDs for - * the device as an array. - * - * This structure uses the relevant standard's given element names to ensure compatibility with the standard. - * - * \see \ref USB_Descriptor_String_t for the version of this type with with non-standard LUFA specific - * element names. - * - * \note Regardless of CPU architecture, these values should be stored as little endian. - */ - typedef struct - { - uint8_t bLength; /**< Size of the descriptor, in bytes. */ - uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t - * or a value given by the specific class. - */ - uint16_t bString[]; /**< String data, as unicode characters (alternatively, string language IDs). - * If normal ASCII characters are to be used, they must be added as an array - * of characters rather than a normal C string so that they are widened to - * Unicode size. - * - * Under GCC, strings prefixed with the "L" character (before the opening string - * quotation mark) are considered to be Unicode strings, and may be used instead - * of an explicit array of ASCII characters. - */ - } ATTR_PACKED USB_StdDescriptor_String_t; - - - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } - #endif - -#endif - -/** @} */ - diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/USBController.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/USBController.h deleted file mode 100644 index acf16dc72f05..000000000000 --- a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/Core/USBController.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2017. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaims all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * \brief Common USB Controller definitions for all architectures. - * \copydetails Group_USBManagement - * - * \note This file should not be included directly. It is automatically included as needed by the USB driver - * dispatch header located in LUFA/Drivers/USB/USB.h. - */ - -/** \ingroup Group_USB - * \defgroup Group_USBManagement USB Interface Management - * \brief USB Controller definitions for general USB controller management. - * - * Functions, macros, variables, enums and types related to the setup and management of the USB interface. - * - * @{ - */ - -#ifndef __USBCONTROLLER_H__ -#define __USBCONTROLLER_H__ - - /* Includes: */ - //#include "../../../Common/Common.h" - //#include "USBMode.h" - - /* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { - #endif - - /* Preprocessor Checks and Defines: */ - #if !defined(__INCLUDE_FROM_USB_DRIVER) - #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. - #endif - - /* Defines: */ - /** \name Endpoint Direction Masks */ - //@{ - /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's - * direction for comparing with the \c ENDPOINT_DIR_* masks. - */ - #define ENDPOINT_DIR_MASK 0x80 - - /** Endpoint address direction mask for an OUT direction (Host to Device) endpoint. This may be ORed with - * the index of the address within a device to obtain the full endpoint address. - */ - #define ENDPOINT_DIR_OUT 0x00 - - /** Endpoint address direction mask for an IN direction (Device to Host) endpoint. This may be ORed with - * the index of the address within a device to obtain the full endpoint address. - */ - #define ENDPOINT_DIR_IN 0x80 - //@} - - /** \name Pipe Direction Masks */ - //@{ - /** Pipe direction mask, for masking against pipe addresses to retrieve the pipe's - * direction for comparing with the \c PIPE_DIR_* masks. - */ - #define PIPE_DIR_MASK 0x80 - - /** Endpoint address direction mask for an OUT direction (Host to Device) endpoint. This may be ORed with - * the index of the address within a device to obtain the full endpoint address. - */ - #define PIPE_DIR_OUT 0x00 - - /** Endpoint address direction mask for an IN direction (Device to Host) endpoint. This may be ORed with - * the index of the address within a device to obtain the full endpoint address. - */ - #define PIPE_DIR_IN 0x80 - //@} - - /** \name Endpoint/Pipe Type Masks */ - //@{ - /** Mask for determining the type of an endpoint from an endpoint descriptor. This should then be compared - * with the \c EP_TYPE_* masks to determine the exact type of the endpoint. - */ - #define EP_TYPE_MASK 0x03 - - /** Mask for a CONTROL type endpoint or pipe. - * - * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions. - */ - #define EP_TYPE_CONTROL 0x00 - - /** Mask for an ISOCHRONOUS type endpoint or pipe. - * - * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions. - */ - #define EP_TYPE_ISOCHRONOUS 0x01 - - /** Mask for a BULK type endpoint or pipe. - * - * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions. - */ - #define EP_TYPE_BULK 0x02 - - /** Mask for an INTERRUPT type endpoint or pipe. - * - * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions. - */ - #define EP_TYPE_INTERRUPT 0x03 - //@} - - /* Enums: */ - /** Enum for the possible USB controller modes, for initialization via \ref USB_Init() and indication back to the - * user application via \ref USB_CurrentMode. - */ - enum USB_Modes_t - { - USB_MODE_None = 0, /**< Indicates that the controller is currently not initialized in any specific USB mode. */ - USB_MODE_Device = 1, /**< Indicates that the controller is currently initialized in USB Device mode. */ - USB_MODE_Host = 2, /**< Indicates that the controller is currently initialized in USB Host mode. */ - USB_MODE_UID = 3, /**< Indicates that the controller should determine the USB mode from the UID pin of the - * USB connector. - */ - }; - -#if 0 - /* Architecture Includes: */ - #if (ARCH == ARCH_AVR8) - #include "AVR8/USBController_AVR8.h" - #elif (ARCH == ARCH_UC3) - #include "UC3/USBController_UC3.h" - #elif (ARCH == ARCH_XMEGA) - #include "XMEGA/USBController_XMEGA.h" - #endif -#endif - - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } - #endif - -#endif - -/** @} */ - diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h index 04b978803e7e..279b85a7f6ff 100644 --- a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h +++ b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h @@ -1,6 +1,3 @@ -#define __INCLUDE_FROM_USB_DRIVER -#define __INCLUDE_FROM_HID_DRIVER -#define __INCLUDE_FROM_CDC_DRIVER #include "progmem.h" #include "stddef.h" @@ -24,15 +21,17 @@ #define CONCAT_EXPANDED(x, y) CONCAT(x, y) #define CPU_TO_LE16(x) (x) -/** Endpoint address direction mask for an IN direction (Device to Host) endpoint. This may be ORed with - * the index of the address within a device to obtain the full endpoint address. - */ -#define ENDPOINT_DIR_IN 0x80 - -#include "Class/Common/HIDClassCommon.h" -#include "Core/StdDescriptors.h" -#include "Class/Common/HIDReportData.h" -#include "Class/Common/CDCClassCommon.h" -#include "Core/USBController.h" - +// We don't need anything from the following files, or we have defined it already +#define __LUFA_COMMON_H__ +#define __USBMODE_H__ +#define __USBEVENTS_H__ +#define __HIDPARSER_H__ +#define __USBCONTROLLER_AVR8_H__ +#define __INCLUDE_FROM_USB_DRIVER +#define __INCLUDE_FROM_HID_DRIVER +#define __INCLUDE_FROM_CDC_DRIVER +#include "lib/lufa/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h" +#include "lib/lufa/LUFA/Drivers/USB/Class/Common/HIDReportData.h" +#include "lib/lufa/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h" +#include "lib/lufa/LUFA/Drivers/USB/Core/USBController.h" From 1d97c9bf4e52f6f75d2b6200940294b8b7eed389 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 6 Dec 2017 21:30:38 +0200 Subject: [PATCH 12/31] Add raw hid support for ChibiOS This is completely untested --- tmk_core/protocol/chibios/main.c | 6 ++ tmk_core/protocol/chibios/usb_main.c | 136 ++++++++++++++++++++++++++- 2 files changed, 141 insertions(+), 1 deletion(-) diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index bf08484c141a..847917413c76 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -69,6 +69,9 @@ host_driver_t chibios_driver = { void virtser_task(void); #endif +#ifdef RAW_HID_ENABLE +void raw_hid_task(void); +#endif /* TESTING * Amber LED blinker thread, times are in milliseconds. @@ -188,6 +191,9 @@ int main(void) { keyboard_task(); #ifdef VIRTSER_ENABLE virtser_task(); +#endif +#ifdef RAW_HID_ENABLE + raw_hid_task(); #endif } } diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 96b59461e95a..a2dbf47f50cb 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -74,6 +74,16 @@ void console_queue_onotify(io_buffers_queue_t *bqp); static void console_flush_cb(void *arg); #endif /* CONSOLE_ENABLE */ +#ifdef RAW_ENABLE +#define RAW_QUEUE_CAPACITY 4 +static input_buffers_queue_t raw_buf_queue; +static void raw_queue_inotify(io_buffers_queue_t *bqp); +static void raw_in_cb(USBDriver *usbp, usbep_t ep); +static void raw_out_cb(USBDriver *usbp, usbep_t ep); +static void configure_raw_interface(void); +static uint8_t raw_queue_buffer[BQ_BUFFER_SIZE(RAW_QUEUE_CAPACITY, RAW_EPSIZE)]; +#endif + /* --------------------------------------------------------- * Descriptors and USB driver objects * --------------------------------------------------------- @@ -197,7 +207,36 @@ static const USBEndpointConfig nkro_ep_config = { #endif /* NKRO_ENABLE */ #ifdef RAW_ENABLE -#error "Raw interfaces not yet supported on ChibiOS" +/* console endpoint state structure */ +static USBInEndpointState raw_in_ep_state; +static USBOutEndpointState raw_out_ep_state; + +/* console endpoint initialization structure (IN) */ +static const USBEndpointConfig raw_in_ep_config = { + USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ + NULL, /* SETUP packet notification callback */ + raw_in_cb, /* IN notification callback */ + NULL, /* OUT notification callback */ + RAW_EPSIZE, /* IN maximum packet size */ + 0, /* OUT maximum packet size */ + &raw_in_ep_state, /* IN Endpoint state */ + NULL, /* OUT endpoint state */ + 2, /* IN multiplier */ + NULL /* SETUP buffer (not a SETUP endpoint) */ +}; + +static const USBEndpointConfig raw_out_ep_config = { + USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ + NULL, /* SETUP packet notification callback */ + NULL, /* IN notification callback */ + &raw_out_cb, /* OUT notification callback */ + 0, /* IN maximum packet size */ + RAW_EPSIZE, /* OUT maximum packet size */ + NULL, /* IN Endpoint state */ + &raw_out_ep_state, /* OUT endpoint state */ + 2, /* IN multiplier */ + NULL /* SETUP buffer (not a SETUP endpoint) */ +}; #endif #ifdef MIDI_ENABLE @@ -288,6 +327,11 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { #ifdef NKRO_ENABLE usbInitEndpointI(usbp, NKRO_IN_EPNUM, &nkro_ep_config); #endif /* NKRO_ENABLE */ +#ifdef RAW_ENABLE + usbInitEndpointI(usbp, RAW_IN_EPNUM, &raw_in_ep_config); + usbInitEndpointI(usbp, RAW_OUT_EPNUM, &raw_out_ep_config); + configure_raw_interface(); +#endif #ifdef VIRTSER_ENABLE /* Enables the endpoints specified into the configuration. Note, this callback is invoked from an ISR so I-Class functions @@ -531,8 +575,10 @@ static const USBConfig usbcfg = { * Initialize the USB driver */ void init_usb_driver(USBDriver *usbp) { +#ifdef VIRTSER_ENABLE sduObjectInit(&SDU1); sduStart(&SDU1, &serusbcfg); +#endif /* * Activates the USB driver and then the USB bus pull-up on D+. @@ -549,6 +595,9 @@ void init_usb_driver(USBDriver *usbp) { obqObjectInit(&console_buf_queue, false, console_queue_buffer, CONSOLE_EPSIZE, CONSOLE_QUEUE_CAPACITY, console_queue_onotify, (void*)usbp); chVTObjectInit(&console_flush_timer); #endif +#ifdef RAW_ENABLE + ibqObjectInit(&raw_buf_queue, raw_queue_buffer, RAW_EPSIZE, RAW_QUEUE_CAPACITY, raw_queue_inotify, (void*)usbp); +#endif } /* --------------------------------------------------------- @@ -876,6 +925,91 @@ void sendchar_pf(void *p, char c) { sendchar((uint8_t)c); } +#ifdef RAW_ENABLE +void raw_hid_send( uint8_t *data, uint8_t length ) { + // TODO: implement variable size packet + if ( length != RAW_EPSIZE ) + { + return; + + } + osalSysLock(); + if(usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) { + osalSysUnlock(); + return; + } + if(usbGetTransmitStatusI(&USB_DRIVER, RAW_IN_EPNUM)) { + /* Need to either suspend, or loop and call unlock/lock during + * every iteration - otherwise the system will remain locked, + * no interrupts served, so USB not going through as well. + * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ + osalThreadSuspendS(&(&USB_DRIVER)->epc[RAW_IN_EPNUM]->in_state->thread); + } + + usbStartTransmitI(&USB_DRIVER, RAW_IN_EPNUM, data, length); + osalSysUnlock(); +} + +__attribute__ ((weak)) +void raw_hid_receive( uint8_t *data, uint8_t length ) { + // Users should #include "raw_hid.h" in their own code + // and implement this function there. Leave this as weak linkage + // so users can opt to not handle data coming in. +} + +void raw_hid_task(void) { + uint8_t buffer[RAW_EPSIZE]; + size_t size = 0; + do { + size = ibqReadTimeout(&raw_buf_queue, buffer, RAW_EPSIZE, TIME_IMMEDIATE); + if (size == RAW_EPSIZE) { + raw_hid_receive(buffer, size); + } + } while(size>0); +} + +static void raw_in_cb(USBDriver* usbp, usbep_t ep) { +} + +static void start_receive_raw(void) { + return; + /* If the USB driver is not in the appropriate state then transactions + must not be started.*/ + if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) { + return; + } + + /* Checking if there is already a transaction ongoing on the endpoint.*/ + if (!usbGetReceiveStatusI(&USB_DRIVER, RAW_IN_EPNUM)) { + /* Trying to get a free buffer.*/ + uint8_t *buf = ibqGetEmptyBufferI(&raw_buf_queue); + if (buf != NULL) { + /* Buffer found, starting a new transaction.*/ + usbStartReceiveI(&USB_DRIVER, RAW_IN_EPNUM, buf, RAW_EPSIZE); + } + } +} + +static void raw_out_cb(USBDriver* usbp, usbep_t ep) { + osalSysLockFromISR(); + + /* Posting the filled buffer in the queue.*/ + ibqPostFullBufferI(&raw_buf_queue, usbGetReceiveTransactionSizeX(usbp, ep)); + start_receive_raw(); + + osalSysUnlockFromISR(); +} + +static void raw_queue_inotify(io_buffers_queue_t *bqp) { + start_receive_raw(); +} + +static void configure_raw_interface(void) { + ibqResetI(&raw_buf_queue); + start_receive_raw(); +} +#endif + #ifdef VIRTSER_ENABLE void virtser_send(const uint8_t byte) { From a6720ac380446b99ee3e62ea11a682ac491c2bb0 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 6 Dec 2017 22:17:01 +0200 Subject: [PATCH 13/31] Enable midi compilation on ChibiOS --- build_keyboard.mk | 7 +++++-- quantum/process_keycode/process_midi.c | 3 ++- quantum/quantum.h | 1 - tmk_core/protocol/chibios.mk | 3 +++ .../chibios/lufa_utils/LUFA/Drivers/USB/USB.h | 4 ++++ tmk_core/protocol/chibios/usb_main.c | 1 - tmk_core/protocol/lufa/lufa.h | 3 +-- tmk_core/protocol/midi.mk | 2 +- .../protocol/midi/bytequeue/interrupt_setting.c | 14 +++++++++++++- tmk_core/protocol/midi/qmk_midi.h | 4 ++++ 10 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 tmk_core/protocol/midi/qmk_midi.h diff --git a/build_keyboard.mk b/build_keyboard.mk index bee8fcc8748a..921159a5dda8 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -121,7 +121,6 @@ else endif ifeq ($(PLATFORM),CHIBIOS) - include $(TMK_PATH)/protocol/chibios.mk include $(TMK_PATH)/chibios.mk OPT_OS = chibios ifneq ("$(wildcard $(KEYBOARD_PATH_5)/bootloader_defs.h)","") @@ -197,7 +196,7 @@ else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","") KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1) else ifneq ($(LAYOUTS),) include build_layout.mk -else +else $(error Could not find keymap) # this state should never be reached endif @@ -247,6 +246,10 @@ endif include $(TMK_PATH)/avr.mk endif +ifeq ($(PLATFORM),CHIBIOS) + include $(TMK_PATH)/protocol/chibios.mk +endif + ifeq ($(strip $(VISUALIZER_ENABLE)), yes) VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer VISUALIZER_PATH = $(QUANTUM_PATH)/visualizer diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 9184feaae846..bc71d01f31f9 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -17,10 +17,11 @@ #ifdef MIDI_ENABLE #include "midi.h" +#include "qmk_midi.h" #ifdef MIDI_BASIC -void process_midi_basic_noteon(uint8_t note) +void process_midi_basic_noteon(uint8_t note) { midi_send_noteon(&midi_device, 0, note, 128); } diff --git a/quantum/quantum.h b/quantum/quantum.h index 6ca5ecb5cf59..b4c9e0b894c4 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -49,7 +49,6 @@ extern uint32_t default_layer_state; #endif #ifdef MIDI_ENABLE - #include #ifdef MIDI_ADVANCED #include "process_midi.h" #endif diff --git a/tmk_core/protocol/chibios.mk b/tmk_core/protocol/chibios.mk index b2f55b5b3564..6e7cfbd83298 100644 --- a/tmk_core/protocol/chibios.mk +++ b/tmk_core/protocol/chibios.mk @@ -13,4 +13,7 @@ VPATH += $(TMK_PATH)/$(CHIBIOS_DIR)/lufa_utils OPT_DEFS += -DFIXED_CONTROL_ENDPOINT_SIZE=64 OPT_DEFS += -DFIXED_NUM_CONFIGURATIONS=1 +ifeq ($(strip $(MIDI_ENABLE)), yes) + include $(TMK_PATH)/protocol/midi.mk +endif diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h index 279b85a7f6ff..492960cd9872 100644 --- a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h +++ b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h @@ -31,7 +31,11 @@ #define __INCLUDE_FROM_USB_DRIVER #define __INCLUDE_FROM_HID_DRIVER #define __INCLUDE_FROM_CDC_DRIVER +#define __INCLUDE_FROM_AUDIO_DRIVER +#define __INCLUDE_FROM_MIDI_DRIVER #include "lib/lufa/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h" #include "lib/lufa/LUFA/Drivers/USB/Class/Common/HIDReportData.h" #include "lib/lufa/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h" +#include "lib/lufa/LUFA/Drivers/USB/Class/Common/AudioClassCommon.h" +#include "lib/lufa/LUFA/Drivers/USB/Class/Common/MIDIClassCommon.h" #include "lib/lufa/LUFA/Drivers/USB/Core/USBController.h" diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index a2dbf47f50cb..f58ebad5bfaf 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -240,7 +240,6 @@ static const USBEndpointConfig raw_out_ep_config = { #endif #ifdef MIDI_ENABLE -#error "Midi interfaces not yet supported on ChibiOS" #endif #ifdef VIRTSER_ENABLE diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h index a515737862df..84a67e861349 100644 --- a/tmk_core/protocol/lufa/lufa.h +++ b/tmk_core/protocol/lufa/lufa.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2012 Jun Wako * This file is based on: * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse @@ -69,7 +69,6 @@ typedef struct { #ifdef MIDI_ENABLE void MIDI_Task(void); - MidiDevice midi_device; #endif #ifdef API_ENABLE diff --git a/tmk_core/protocol/midi.mk b/tmk_core/protocol/midi.mk index 4855b23d3017..bee774728a04 100644 --- a/tmk_core/protocol/midi.mk +++ b/tmk_core/protocol/midi.mk @@ -7,4 +7,4 @@ SRC += midi.c \ sysex_tools.c \ $(LUFA_SRC_USBCLASS) -VPATH += $(TMK_PATH)/$(MIDI_DIR) \ No newline at end of file +VPATH += $(TMK_PATH)/$(MIDI_DIR) diff --git a/tmk_core/protocol/midi/bytequeue/interrupt_setting.c b/tmk_core/protocol/midi/bytequeue/interrupt_setting.c index eafef527c023..cfb6b2dfa83c 100755 --- a/tmk_core/protocol/midi/bytequeue/interrupt_setting.c +++ b/tmk_core/protocol/midi/bytequeue/interrupt_setting.c @@ -1,5 +1,5 @@ //Copyright 20010 Alex Norman -//writen by Alex Norman +//writen by Alex Norman // //This file is part of avr-bytequeue. // @@ -22,6 +22,7 @@ //implementations of the typedef and these functions #include "interrupt_setting.h" +#ifdef PLATFORM_AVR #include interrupt_setting_t store_and_clear_interrupt(void) { @@ -33,4 +34,15 @@ interrupt_setting_t store_and_clear_interrupt(void) { void restore_interrupt_setting(interrupt_setting_t setting) { SREG = setting; } +#elif PLATFORM_CHIBIOS + +interrupt_setting_t store_and_clear_interrupt(void) { + chSysLock(); + return 0; +} + +void restore_interrupt_setting(interrupt_setting_t setting) { + chSysUnlock(); +} +#endif diff --git a/tmk_core/protocol/midi/qmk_midi.h b/tmk_core/protocol/midi/qmk_midi.h new file mode 100644 index 000000000000..4485048d7825 --- /dev/null +++ b/tmk_core/protocol/midi/qmk_midi.h @@ -0,0 +1,4 @@ +#pragma once +#ifdef MIDI_ENABLE + MidiDevice midi_device; +#endif From 98979a0a01f385a25d78155020aad0e2e89c83d1 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Thu, 7 Dec 2017 09:21:49 +0200 Subject: [PATCH 14/31] Move midi functionality out of lufa.c --- quantum/process_keycode/process_midi.c | 3 + tmk_core/common/host_driver.h | 5 - tmk_core/protocol/lufa/lufa.c | 334 ++---------------- tmk_core/protocol/lufa/lufa.h | 4 - tmk_core/protocol/midi.mk | 1 + .../midi/bytequeue/interrupt_setting.c | 4 +- tmk_core/protocol/midi/qmk_midi.c | 180 ++++++++++ tmk_core/protocol/midi/qmk_midi.h | 7 +- 8 files changed, 215 insertions(+), 323 deletions(-) create mode 100644 tmk_core/protocol/midi/qmk_midi.c diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index bc71d01f31f9..6bfa05b80173 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -73,6 +73,8 @@ void midi_init(void) void midi_task(void) { + midi_device_process(&midi_device); +#ifdef MIDI_ADVANCED if (timer_elapsed(midi_modulation_timer) < midi_config.modulation_interval) return; midi_modulation_timer = timer_read(); @@ -93,6 +95,7 @@ void midi_task(void) if (midi_modulation > 127) midi_modulation = 127; } +#endif } uint8_t midi_compute_note(uint16_t keycode) diff --git a/tmk_core/common/host_driver.h b/tmk_core/common/host_driver.h index 588d1c0be8f3..e40f0bfd6590 100644 --- a/tmk_core/common/host_driver.h +++ b/tmk_core/common/host_driver.h @@ -30,11 +30,6 @@ typedef struct { void (*send_mouse)(report_mouse_t *); void (*send_system)(uint16_t); void (*send_consumer)(uint16_t); -#ifdef MIDI_ENABLE - void (*usb_send_func)(MidiDevice *, uint16_t, uint8_t, uint8_t, uint8_t); - void (*usb_get_midi)(MidiDevice *); - void (*midi_usb_init)(MidiDevice *); -#endif } host_driver_t; #endif diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index e16a18177c09..7c2ec5563c33 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -83,7 +83,7 @@ #endif #ifdef MIDI_ENABLE - #include "sysex_tools.h" + #include "qmk_midi.h" #endif #ifdef RAW_ENABLE @@ -97,12 +97,6 @@ static uint8_t keyboard_led_stats = 0; static report_keyboard_t keyboard_report_sent; -#ifdef MIDI_ENABLE -static void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2); -static void usb_get_midi(MidiDevice * device); -static void midi_usb_init(MidiDevice * device); -#endif - /* Host driver */ static uint8_t keyboard_leds(void); static void send_keyboard(report_keyboard_t *report); @@ -115,48 +109,8 @@ host_driver_t lufa_driver = { send_mouse, send_system, send_consumer, -#ifdef MIDI_ENABLE - usb_send_func, - usb_get_midi, - midi_usb_init -#endif -}; - -/******************************************************************************* - * MIDI - ******************************************************************************/ - -#ifdef MIDI_ENABLE -USB_ClassInfo_MIDI_Device_t USB_MIDI_Interface = -{ - .Config = - { - .StreamingInterfaceNumber = AS_INTERFACE, - .DataINEndpoint = - { - .Address = MIDI_STREAM_IN_EPADDR, - .Size = MIDI_STREAM_EPSIZE, - .Banks = 1, - }, - .DataOUTEndpoint = - { - .Address = MIDI_STREAM_OUT_EPADDR, - .Size = MIDI_STREAM_EPSIZE, - .Banks = 1, - }, - }, }; -#define SYSEX_START_OR_CONT 0x40 -#define SYSEX_ENDS_IN_1 0x50 -#define SYSEX_ENDS_IN_2 0x60 -#define SYSEX_ENDS_IN_3 0x70 - -#define SYS_COMMON_1 0x50 -#define SYS_COMMON_2 0x20 -#define SYS_COMMON_3 0x30 -#endif - #ifdef VIRTSER_ENABLE USB_ClassInfo_CDC_Device_t cdc_device = { @@ -853,170 +807,32 @@ int8_t sendchar(uint8_t c) ******************************************************************************/ #ifdef MIDI_ENABLE -static void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2) { - MIDI_EventPacket_t event; - event.Data1 = byte0; - event.Data2 = byte1; - event.Data3 = byte2; - - uint8_t cable = 0; - -// Endpoint_SelectEndpoint(MIDI_STREAM_IN_EPNUM); - - //if the length is undefined we assume it is a SYSEX message - if (midi_packet_length(byte0) == UNDEFINED) { - switch(cnt) { - case 3: - if (byte2 == SYSEX_END) - event.Event = MIDI_EVENT(cable, SYSEX_ENDS_IN_3); - else - event.Event = MIDI_EVENT(cable, SYSEX_START_OR_CONT); - break; - case 2: - if (byte1 == SYSEX_END) - event.Event = MIDI_EVENT(cable, SYSEX_ENDS_IN_2); - else - event.Event = MIDI_EVENT(cable, SYSEX_START_OR_CONT); - break; - case 1: - if (byte0 == SYSEX_END) - event.Event = MIDI_EVENT(cable, SYSEX_ENDS_IN_1); - else - event.Event = MIDI_EVENT(cable, SYSEX_START_OR_CONT); - break; - default: - return; //invalid cnt - } - } else { - //deal with 'system common' messages - //TODO are there any more? - switch(byte0 & 0xF0){ - case MIDI_SONGPOSITION: - event.Event = MIDI_EVENT(cable, SYS_COMMON_3); - break; - case MIDI_SONGSELECT: - case MIDI_TC_QUARTERFRAME: - event.Event = MIDI_EVENT(cable, SYS_COMMON_2); - break; - default: - event.Event = MIDI_EVENT(cable, byte0); - break; - } - } - -// Endpoint_Write_Stream_LE(&event, sizeof(event), NULL); -// Endpoint_ClearIN(); - - MIDI_Device_SendEventPacket(&USB_MIDI_Interface, &event); - MIDI_Device_Flush(&USB_MIDI_Interface); - MIDI_Device_USBTask(&USB_MIDI_Interface); - USB_USBTask(); -} - -static void usb_get_midi(MidiDevice * device) { - MIDI_EventPacket_t event; - while (MIDI_Device_ReceiveEventPacket(&USB_MIDI_Interface, &event)) { - - midi_packet_length_t length = midi_packet_length(event.Data1); - uint8_t input[3]; - input[0] = event.Data1; - input[1] = event.Data2; - input[2] = event.Data3; - if (length == UNDEFINED) { - //sysex - if (event.Event == MIDI_EVENT(0, SYSEX_START_OR_CONT) || event.Event == MIDI_EVENT(0, SYSEX_ENDS_IN_3)) { - length = 3; - } else if (event.Event == MIDI_EVENT(0, SYSEX_ENDS_IN_2)) { - length = 2; - } else if(event.Event == MIDI_EVENT(0, SYSEX_ENDS_IN_1)) { - length = 1; - } else { - //XXX what to do? - } - } - - //pass the data to the device input function - if (length != UNDEFINED) - midi_device_input(device, length, input); - } - MIDI_Device_USBTask(&USB_MIDI_Interface); - USB_USBTask(); -} - -static void midi_usb_init(MidiDevice * device){ - midi_device_init(device); - midi_device_set_send_func(device, usb_send_func); - midi_device_set_pre_input_process_func(device, usb_get_midi); - - // SetupHardware(); - sei(); -} - -void MIDI_Task(void) +USB_ClassInfo_MIDI_Device_t USB_MIDI_Interface = { - - /* Device must be connected and configured for the task to run */ - dprint("in MIDI_TASK\n"); - if (USB_DeviceState != DEVICE_STATE_Configured) - return; - dprint("continuing in MIDI_TASK\n"); - - Endpoint_SelectEndpoint(MIDI_STREAM_IN_EPADDR); - - if (Endpoint_IsINReady()) + .Config = + { + .StreamingInterfaceNumber = AS_INTERFACE, + .DataINEndpoint = { - - dprint("Endpoint is ready\n"); - - uint8_t MIDICommand = 0; - uint8_t MIDIPitch; - - /* Get board button status - if pressed use channel 10 (percussion), otherwise use channel 1 */ - uint8_t Channel = MIDI_CHANNEL(1); - - MIDICommand = MIDI_COMMAND_NOTE_ON; - MIDIPitch = 0x3E; - - /* Check if a MIDI command is to be sent */ - if (MIDICommand) - { - dprint("Command exists\n"); - MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t) - { - .Event = MIDI_EVENT(0, MIDICommand), - - .Data1 = MIDICommand | Channel, - .Data2 = MIDIPitch, - .Data3 = MIDI_STANDARD_VELOCITY, - }; - - /* Write the MIDI event packet to the endpoint */ - Endpoint_Write_Stream_LE(&MIDIEvent, sizeof(MIDIEvent), NULL); - - /* Send the data in the endpoint to the host */ - Endpoint_ClearIN(); - } - } - - - /* Select the MIDI OUT stream */ - Endpoint_SelectEndpoint(MIDI_STREAM_OUT_EPADDR); - - /* Check if a MIDI command has been received */ - if (Endpoint_IsOUTReceived()) + .Address = MIDI_STREAM_IN_EPADDR, + .Size = MIDI_STREAM_EPSIZE, + .Banks = 1, + }, + .DataOUTEndpoint = { - MIDI_EventPacket_t MIDIEvent; + .Address = MIDI_STREAM_OUT_EPADDR, + .Size = MIDI_STREAM_EPSIZE, + .Banks = 1, + }, + }, +}; - /* Read the MIDI event packet from the endpoint */ - Endpoint_Read_Stream_LE(&MIDIEvent, sizeof(MIDIEvent), NULL); +void send_midi_packet(MIDI_EventPacket_t* event) { + MIDI_Device_SendEventPacket(&USB_MIDI_Interface, event); +} - /* If the endpoint is now empty, clear the bank */ - if (!(Endpoint_BytesInEndpoint())) - { - /* Clear the endpoint ready for new packet */ - Endpoint_ClearOUT(); - } - } +bool recv_midi_packet(MIDI_EventPacket_t* const event) { + return MIDI_Device_ReceiveEventPacket(&USB_MIDI_Interface, event); } #endif @@ -1105,26 +921,6 @@ static void setup_usb(void) print_set_sendchar(sendchar); } - -#ifdef MIDI_ENABLE -void fallthrough_callback(MidiDevice * device, - uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2); -void cc_callback(MidiDevice * device, - uint8_t chan, uint8_t num, uint8_t val); -void sysex_callback(MidiDevice * device, - uint16_t start, uint8_t length, uint8_t * data); - -void setup_midi(void) -{ -#ifdef MIDI_ADVANCED - midi_init(); -#endif - midi_device_init(&midi_device); - midi_device_set_send_func(&midi_device, usb_send_func); - midi_device_set_pre_input_process_func(&midi_device, usb_get_midi); -} -#endif - int main(void) __attribute__ ((weak)); int main(void) { @@ -1137,18 +933,6 @@ int main(void) setup_usb(); sei(); -#ifdef MIDI_ENABLE - midi_register_fallthrough_callback(&midi_device, fallthrough_callback); - midi_register_cc_callback(&midi_device, cc_callback); - midi_register_sysex_callback(&midi_device, sysex_callback); - - // init_notes(); - // midi_send_cc(&midi_device, 0, 1, 2); - // midi_send_cc(&midi_device, 15, 1, 0); - // midi_send_noteon(&midi_device, 0, 64, 127); - // midi_send_noteoff(&midi_device, 0, 64, 127); -#endif - #if defined(MODULE_ADAFRUIT_EZKEY) || defined(MODULE_RN42) serial_init(); #endif @@ -1193,10 +977,8 @@ int main(void) keyboard_task(); #ifdef MIDI_ENABLE - midi_device_process(&midi_device); -#ifdef MIDI_ADVANCED midi_task(); -#endif + MIDI_Device_USBTask(&USB_MIDI_Interface); #endif #if defined(RGBLIGHT_ANIMATIONS) & defined(RGBLIGHT_ENABLE) @@ -1223,76 +1005,6 @@ int main(void) } } -#ifdef MIDI_ENABLE -void fallthrough_callback(MidiDevice * device, - uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2){ - -#ifdef AUDIO_ENABLE - if (cnt == 3) { - switch (byte0 & 0xF0) { - case MIDI_NOTEON: - play_note(((double)261.6)*pow(2.0, -4.0)*pow(2.0,(byte1 & 0x7F)/12.0), (byte2 & 0x7F) / 8); - break; - case MIDI_NOTEOFF: - stop_note(((double)261.6)*pow(2.0, -4.0)*pow(2.0,(byte1 & 0x7F)/12.0)); - break; - } - } - if (byte0 == MIDI_STOP) { - stop_all_notes(); - } -#endif -} - - -void cc_callback(MidiDevice * device, - uint8_t chan, uint8_t num, uint8_t val) { - //sending it back on the next channel - // midi_send_cc(device, (chan + 1) % 16, num, val); -} - -#ifdef API_SYSEX_ENABLE -uint8_t midi_buffer[MIDI_SYSEX_BUFFER] = {0}; -#endif - -void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data) { - #ifdef API_SYSEX_ENABLE - // SEND_STRING("\n"); - // send_word(start); - // SEND_STRING(": "); - // Don't store the header - int16_t pos = start - 4; - for (uint8_t place = 0; place < length; place++) { - // send_byte(*data); - if (pos >= 0) { - if (*data == 0xF7) { - // SEND_STRING("\nRD: "); - // for (uint8_t i = 0; i < start + place + 1; i++){ - // send_byte(midi_buffer[i]); - // SEND_STRING(" "); - // } - const unsigned decoded_length = sysex_decoded_length(pos); - uint8_t decoded[API_SYSEX_MAX_SIZE]; - sysex_decode(decoded, midi_buffer, pos); - process_api(decoded_length, decoded); - return; - } - else if (pos >= MIDI_SYSEX_BUFFER) { - return; - } - midi_buffer[pos] = *data; - } - // SEND_STRING(" "); - data++; - pos++; - } - #endif -} - - -#endif - - uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint16_t wIndex, const void** const DescriptorAddress) diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h index 84a67e861349..bc7d95472efc 100644 --- a/tmk_core/protocol/lufa/lufa.h +++ b/tmk_core/protocol/lufa/lufa.h @@ -67,10 +67,6 @@ typedef struct { uint16_t usage; } __attribute__ ((packed)) report_extra_t; -#ifdef MIDI_ENABLE - void MIDI_Task(void); -#endif - #ifdef API_ENABLE #include "api.h" #endif diff --git a/tmk_core/protocol/midi.mk b/tmk_core/protocol/midi.mk index bee774728a04..a5f76b2d31f6 100644 --- a/tmk_core/protocol/midi.mk +++ b/tmk_core/protocol/midi.mk @@ -5,6 +5,7 @@ SRC += midi.c \ bytequeue/bytequeue.c \ bytequeue/interrupt_setting.c \ sysex_tools.c \ + qmk_midi.c \ $(LUFA_SRC_USBCLASS) VPATH += $(TMK_PATH)/$(MIDI_DIR) diff --git a/tmk_core/protocol/midi/bytequeue/interrupt_setting.c b/tmk_core/protocol/midi/bytequeue/interrupt_setting.c index cfb6b2dfa83c..e5e509274574 100755 --- a/tmk_core/protocol/midi/bytequeue/interrupt_setting.c +++ b/tmk_core/protocol/midi/bytequeue/interrupt_setting.c @@ -22,7 +22,7 @@ //implementations of the typedef and these functions #include "interrupt_setting.h" -#ifdef PLATFORM_AVR +#if defined(__AVR__) #include interrupt_setting_t store_and_clear_interrupt(void) { @@ -34,7 +34,7 @@ interrupt_setting_t store_and_clear_interrupt(void) { void restore_interrupt_setting(interrupt_setting_t setting) { SREG = setting; } -#elif PLATFORM_CHIBIOS +#elif defined(__arm__) interrupt_setting_t store_and_clear_interrupt(void) { chSysLock(); diff --git a/tmk_core/protocol/midi/qmk_midi.c b/tmk_core/protocol/midi/qmk_midi.c new file mode 100644 index 000000000000..2b3f21236149 --- /dev/null +++ b/tmk_core/protocol/midi/qmk_midi.c @@ -0,0 +1,180 @@ +#include +#include "qmk_midi.h" +#include "sysex_tools.h" +#include "midi.h" +#include "usb_descriptor.h" + +/******************************************************************************* + * MIDI + ******************************************************************************/ + +MidiDevice midi_device; + +#define SYSEX_START_OR_CONT 0x40 +#define SYSEX_ENDS_IN_1 0x50 +#define SYSEX_ENDS_IN_2 0x60 +#define SYSEX_ENDS_IN_3 0x70 + +#define SYS_COMMON_1 0x50 +#define SYS_COMMON_2 0x20 +#define SYS_COMMON_3 0x30 + +static void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2) { + MIDI_EventPacket_t event; + event.Data1 = byte0; + event.Data2 = byte1; + event.Data3 = byte2; + + uint8_t cable = 0; + + //if the length is undefined we assume it is a SYSEX message + if (midi_packet_length(byte0) == UNDEFINED) { + switch(cnt) { + case 3: + if (byte2 == SYSEX_END) + event.Event = MIDI_EVENT(cable, SYSEX_ENDS_IN_3); + else + event.Event = MIDI_EVENT(cable, SYSEX_START_OR_CONT); + break; + case 2: + if (byte1 == SYSEX_END) + event.Event = MIDI_EVENT(cable, SYSEX_ENDS_IN_2); + else + event.Event = MIDI_EVENT(cable, SYSEX_START_OR_CONT); + break; + case 1: + if (byte0 == SYSEX_END) + event.Event = MIDI_EVENT(cable, SYSEX_ENDS_IN_1); + else + event.Event = MIDI_EVENT(cable, SYSEX_START_OR_CONT); + break; + default: + return; //invalid cnt + } + } else { + //deal with 'system common' messages + //TODO are there any more? + switch(byte0 & 0xF0){ + case MIDI_SONGPOSITION: + event.Event = MIDI_EVENT(cable, SYS_COMMON_3); + break; + case MIDI_SONGSELECT: + case MIDI_TC_QUARTERFRAME: + event.Event = MIDI_EVENT(cable, SYS_COMMON_2); + break; + default: + event.Event = MIDI_EVENT(cable, byte0); + break; + } + } + + send_midi_packet(&event); +} + +static void usb_get_midi(MidiDevice * device) { + MIDI_EventPacket_t event; + while (recv_midi_packet(&event)) { + + midi_packet_length_t length = midi_packet_length(event.Data1); + uint8_t input[3]; + input[0] = event.Data1; + input[1] = event.Data2; + input[2] = event.Data3; + if (length == UNDEFINED) { + //sysex + if (event.Event == MIDI_EVENT(0, SYSEX_START_OR_CONT) || event.Event == MIDI_EVENT(0, SYSEX_ENDS_IN_3)) { + length = 3; + } else if (event.Event == MIDI_EVENT(0, SYSEX_ENDS_IN_2)) { + length = 2; + } else if(event.Event == MIDI_EVENT(0, SYSEX_ENDS_IN_1)) { + length = 1; + } else { + //XXX what to do? + } + } + + //pass the data to the device input function + if (length != UNDEFINED) + midi_device_input(device, length, input); + } +} + +static void fallthrough_callback(MidiDevice * device, + uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2){ + +#ifdef AUDIO_ENABLE + if (cnt == 3) { + switch (byte0 & 0xF0) { + case MIDI_NOTEON: + play_note(((double)261.6)*pow(2.0, -4.0)*pow(2.0,(byte1 & 0x7F)/12.0), (byte2 & 0x7F) / 8); + break; + case MIDI_NOTEOFF: + stop_note(((double)261.6)*pow(2.0, -4.0)*pow(2.0,(byte1 & 0x7F)/12.0)); + break; + } + } + if (byte0 == MIDI_STOP) { + stop_all_notes(); + } +#endif +} + + +static void cc_callback(MidiDevice * device, + uint8_t chan, uint8_t num, uint8_t val) { + //sending it back on the next channel + // midi_send_cc(device, (chan + 1) % 16, num, val); +} + +#ifdef API_SYSEX_ENABLE +uint8_t midi_buffer[MIDI_SYSEX_BUFFER] = {0}; +#endif + +static void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data) { + #ifdef API_SYSEX_ENABLE + // SEND_STRING("\n"); + // send_word(start); + // SEND_STRING(": "); + // Don't store the header + int16_t pos = start - 4; + for (uint8_t place = 0; place < length; place++) { + // send_byte(*data); + if (pos >= 0) { + if (*data == 0xF7) { + // SEND_STRING("\nRD: "); + // for (uint8_t i = 0; i < start + place + 1; i++){ + // send_byte(midi_buffer[i]); + // SEND_STRING(" "); + // } + const unsigned decoded_length = sysex_decoded_length(pos); + uint8_t decoded[API_SYSEX_MAX_SIZE]; + sysex_decode(decoded, midi_buffer, pos); + process_api(decoded_length, decoded); + return; + } + else if (pos >= MIDI_SYSEX_BUFFER) { + return; + } + midi_buffer[pos] = *data; + } + // SEND_STRING(" "); + data++; + pos++; + } + #endif +} + +void midi_init(void); + +void setup_midi(void) +{ +#ifdef MIDI_ADVANCED + midi_init(); +#endif + midi_device_init(&midi_device); + midi_device_set_send_func(&midi_device, usb_send_func); + midi_device_set_pre_input_process_func(&midi_device, usb_get_midi); + midi_register_fallthrough_callback(&midi_device, fallthrough_callback); + midi_register_cc_callback(&midi_device, cc_callback); + midi_register_sysex_callback(&midi_device, sysex_callback); +} diff --git a/tmk_core/protocol/midi/qmk_midi.h b/tmk_core/protocol/midi/qmk_midi.h index 4485048d7825..7282a19d408a 100644 --- a/tmk_core/protocol/midi/qmk_midi.h +++ b/tmk_core/protocol/midi/qmk_midi.h @@ -1,4 +1,9 @@ #pragma once + #ifdef MIDI_ENABLE - MidiDevice midi_device; + #include "midi.h" + extern MidiDevice midi_device; + void setup_midi(void); + void send_midi_packet(MIDI_EventPacket_t* event); + bool recv_midi_packet(MIDI_EventPacket_t* const event); #endif From 35b727c6ba191cd491df4b60897ed834ede21e33 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Thu, 7 Dec 2017 09:26:40 +0200 Subject: [PATCH 15/31] Don't register sysex callback when not needed --- tmk_core/protocol/midi/qmk_midi.c | 64 +++++++++++++++---------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/tmk_core/protocol/midi/qmk_midi.c b/tmk_core/protocol/midi/qmk_midi.c index 2b3f21236149..82b1dda2a59c 100644 --- a/tmk_core/protocol/midi/qmk_midi.c +++ b/tmk_core/protocol/midi/qmk_midi.c @@ -128,41 +128,39 @@ static void cc_callback(MidiDevice * device, #ifdef API_SYSEX_ENABLE uint8_t midi_buffer[MIDI_SYSEX_BUFFER] = {0}; -#endif static void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data) { - #ifdef API_SYSEX_ENABLE - // SEND_STRING("\n"); - // send_word(start); - // SEND_STRING(": "); - // Don't store the header - int16_t pos = start - 4; - for (uint8_t place = 0; place < length; place++) { - // send_byte(*data); - if (pos >= 0) { - if (*data == 0xF7) { - // SEND_STRING("\nRD: "); - // for (uint8_t i = 0; i < start + place + 1; i++){ - // send_byte(midi_buffer[i]); - // SEND_STRING(" "); - // } - const unsigned decoded_length = sysex_decoded_length(pos); - uint8_t decoded[API_SYSEX_MAX_SIZE]; - sysex_decode(decoded, midi_buffer, pos); - process_api(decoded_length, decoded); - return; - } - else if (pos >= MIDI_SYSEX_BUFFER) { - return; - } - midi_buffer[pos] = *data; - } - // SEND_STRING(" "); - data++; - pos++; - } - #endif + // SEND_STRING("\n"); + // send_word(start); + // SEND_STRING(": "); + // Don't store the header + int16_t pos = start - 4; + for (uint8_t place = 0; place < length; place++) { + // send_byte(*data); + if (pos >= 0) { + if (*data == 0xF7) { + // SEND_STRING("\nRD: "); + // for (uint8_t i = 0; i < start + place + 1; i++){ + // send_byte(midi_buffer[i]); + // SEND_STRING(" "); + // } + const unsigned decoded_length = sysex_decoded_length(pos); + uint8_t decoded[API_SYSEX_MAX_SIZE]; + sysex_decode(decoded, midi_buffer, pos); + process_api(decoded_length, decoded); + return; + } + else if (pos >= MIDI_SYSEX_BUFFER) { + return; + } + midi_buffer[pos] = *data; + } + // SEND_STRING(" "); + data++; + pos++; + } } +#endif void midi_init(void); @@ -176,5 +174,7 @@ void setup_midi(void) midi_device_set_pre_input_process_func(&midi_device, usb_get_midi); midi_register_fallthrough_callback(&midi_device, fallthrough_callback); midi_register_cc_callback(&midi_device, cc_callback); +#ifdef API_SYSEX_ENABLE midi_register_sysex_callback(&midi_device, sysex_callback); +#endif } From 6b3ded2f7e4adfa551d2c2ac04d20eadd30eb7ba Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Thu, 7 Dec 2017 09:29:42 +0200 Subject: [PATCH 16/31] ChibiOS compilation fixes --- tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h | 1 + tmk_core/protocol/midi/bytequeue/interrupt_setting.c | 1 + 2 files changed, 2 insertions(+) diff --git a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h index 492960cd9872..a5374d820c01 100644 --- a/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h +++ b/tmk_core/protocol/chibios/lufa_utils/LUFA/Drivers/USB/USB.h @@ -1,5 +1,6 @@ #include "progmem.h" #include "stddef.h" +#include "inttypes.h" #define ATTR_PACKED __attribute__ ((packed)) /** Concatenates the given input into a single token, via the C Preprocessor. diff --git a/tmk_core/protocol/midi/bytequeue/interrupt_setting.c b/tmk_core/protocol/midi/bytequeue/interrupt_setting.c index e5e509274574..0ab8b546208a 100755 --- a/tmk_core/protocol/midi/bytequeue/interrupt_setting.c +++ b/tmk_core/protocol/midi/bytequeue/interrupt_setting.c @@ -35,6 +35,7 @@ void restore_interrupt_setting(interrupt_setting_t setting) { SREG = setting; } #elif defined(__arm__) +#include "ch.h" interrupt_setting_t store_and_clear_interrupt(void) { chSysLock(); From aeb5045802c44e61c9d43ed7300008e4a092bb3b Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 13 Dec 2017 09:25:40 +0200 Subject: [PATCH 17/31] Update ChibiOS submodule --- lib/chibios | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/chibios b/lib/chibios index e26cb16a7296..587968d6cbc2 160000 --- a/lib/chibios +++ b/lib/chibios @@ -1 +1 @@ -Subproject commit e26cb16a7296a196d7c74eae22cbee00989cb7b6 +Subproject commit 587968d6cbc2b0e1c7147540872f2a67e59ca18b From 9d1aa6a5f93b51c705ae3d4a52f2d0467aa36996 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 13 Dec 2017 09:31:24 +0200 Subject: [PATCH 18/31] Fix the Midi USB descriptor It didn't work properly when both Midi and Virtual serial port was enabled. --- tmk_core/protocol/usb_descriptor.c | 18 ++++++++++++++-- tmk_core/protocol/usb_descriptor.h | 33 +++++++++++++++--------------- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index 08bc39314a12..cab344675245 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -571,6 +571,19 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = #endif #ifdef MIDI_ENABLE + .Audio_Interface_Association = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_Association_t), .Type = DTYPE_InterfaceAssociation}, + + .FirstInterfaceIndex = AC_INTERFACE, + .TotalInterfaces = 2, + + .Class = AUDIO_CSCP_AudioClass, + .SubClass = AUDIO_CSCP_ControlSubclass, + .Protocol = AUDIO_CSCP_ControlProtocol, + + .IADStrIndex = NO_DESCRIPTOR, + }, .Audio_ControlInterface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, @@ -622,8 +635,9 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .AudioSpecification = VERSION_BCD(1,0,0), - .TotalLength = (sizeof(USB_Descriptor_Configuration_t) - - offsetof(USB_Descriptor_Configuration_t, Audio_StreamInterface_SPC)) + .TotalLength = offsetof(USB_Descriptor_Configuration_t, MIDI_Out_Jack_Endpoint_SPC) + + sizeof(USB_MIDI_Descriptor_Jack_Endpoint_t) + - offsetof(USB_Descriptor_Configuration_t, Audio_StreamInterface_SPC) }, .MIDI_In_Jack_Emb = diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index 3ca50af880ec..144df967fd7a 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h @@ -93,25 +93,26 @@ typedef struct #endif #ifdef MIDI_ENABLE - // MIDI Audio Control Interface - USB_Descriptor_Interface_t Audio_ControlInterface; - USB_Audio_Descriptor_Interface_AC_t Audio_ControlInterface_SPC; - - // MIDI Audio Streaming Interface - USB_Descriptor_Interface_t Audio_StreamInterface; - USB_MIDI_Descriptor_AudioInterface_AS_t Audio_StreamInterface_SPC; - USB_MIDI_Descriptor_InputJack_t MIDI_In_Jack_Emb; - USB_MIDI_Descriptor_InputJack_t MIDI_In_Jack_Ext; - USB_MIDI_Descriptor_OutputJack_t MIDI_Out_Jack_Emb; - USB_MIDI_Descriptor_OutputJack_t MIDI_Out_Jack_Ext; - USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_In_Jack_Endpoint; - USB_MIDI_Descriptor_Jack_Endpoint_t MIDI_In_Jack_Endpoint_SPC; - USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_Out_Jack_Endpoint; - USB_MIDI_Descriptor_Jack_Endpoint_t MIDI_Out_Jack_Endpoint_SPC; + USB_Descriptor_Interface_Association_t Audio_Interface_Association; + // MIDI Audio Control Interface + USB_Descriptor_Interface_t Audio_ControlInterface; + USB_Audio_Descriptor_Interface_AC_t Audio_ControlInterface_SPC; + + // MIDI Audio Streaming Interface + USB_Descriptor_Interface_t Audio_StreamInterface; + USB_MIDI_Descriptor_AudioInterface_AS_t Audio_StreamInterface_SPC; + USB_MIDI_Descriptor_InputJack_t MIDI_In_Jack_Emb; + USB_MIDI_Descriptor_InputJack_t MIDI_In_Jack_Ext; + USB_MIDI_Descriptor_OutputJack_t MIDI_Out_Jack_Emb; + USB_MIDI_Descriptor_OutputJack_t MIDI_Out_Jack_Ext; + USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_In_Jack_Endpoint; + USB_MIDI_Descriptor_Jack_Endpoint_t MIDI_In_Jack_Endpoint_SPC; + USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_Out_Jack_Endpoint; + USB_MIDI_Descriptor_Jack_Endpoint_t MIDI_Out_Jack_Endpoint_SPC; #endif #ifdef VIRTSER_ENABLE - USB_Descriptor_Interface_Association_t CDC_Interface_Association; + USB_Descriptor_Interface_Association_t CDC_Interface_Association; // CDC Control Interface USB_Descriptor_Interface_t CDC_CCI_Interface; From 423174a5baf6eb3737e7e18b4e38a97dad414eae Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 13 Dec 2017 09:44:40 +0200 Subject: [PATCH 19/31] Add MIDI support for ChibiOS --- quantum/process_keycode/process_midi.c | 57 ++++++++-------- quantum/process_keycode/process_midi.h | 5 +- tmk_core/common/keyboard.c | 7 ++ tmk_core/protocol/chibios/main.c | 7 ++ tmk_core/protocol/chibios/usb_main.c | 90 ++++++++++++++++++++++++-- tmk_core/protocol/lufa/lufa.c | 1 - tmk_core/protocol/lufa/lufa.h | 3 - tmk_core/protocol/midi/qmk_midi.c | 1 + 8 files changed, 131 insertions(+), 40 deletions(-) diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 6bfa05b80173..3b0847fe0b95 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -47,6 +47,7 @@ static uint8_t tone_status[MIDI_TONE_COUNT]; static uint8_t midi_modulation; static int8_t midi_modulation_step; static uint16_t midi_modulation_timer; +midi_config_t midi_config; inline uint8_t compute_velocity(uint8_t setting) { @@ -71,33 +72,6 @@ void midi_init(void) midi_modulation_timer = 0; } -void midi_task(void) -{ - midi_device_process(&midi_device); -#ifdef MIDI_ADVANCED - if (timer_elapsed(midi_modulation_timer) < midi_config.modulation_interval) - return; - midi_modulation_timer = timer_read(); - - if (midi_modulation_step != 0) - { - dprintf("midi modulation %d\n", midi_modulation); - midi_send_cc(&midi_device, midi_config.channel, 0x1, midi_modulation); - - if (midi_modulation_step < 0 && midi_modulation < -midi_modulation_step) { - midi_modulation = 0; - midi_modulation_step = 0; - return; - } - - midi_modulation += midi_modulation_step; - - if (midi_modulation > 127) - midi_modulation = 127; - } -#endif -} - uint8_t midi_compute_note(uint16_t keycode) { return 12 * midi_config.octave + (keycode - MIDI_TONE_MIN) + midi_config.transpose; @@ -254,4 +228,33 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) #endif // MIDI_ADVANCED +void midi_task(void) +{ + midi_device_process(&midi_device); +#ifdef MIDI_ADVANCED + if (timer_elapsed(midi_modulation_timer) < midi_config.modulation_interval) + return; + midi_modulation_timer = timer_read(); + + if (midi_modulation_step != 0) + { + dprintf("midi modulation %d\n", midi_modulation); + midi_send_cc(&midi_device, midi_config.channel, 0x1, midi_modulation); + + if (midi_modulation_step < 0 && midi_modulation < -midi_modulation_step) { + midi_modulation = 0; + midi_modulation_step = 0; + return; + } + + midi_modulation += midi_modulation_step; + + if (midi_modulation > 127) + midi_modulation = 127; + } +#endif +} + + + #endif // MIDI_ENABLE diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h index ccac8981a6e4..1968fbe3fa9b 100644 --- a/quantum/process_keycode/process_midi.h +++ b/quantum/process_keycode/process_midi.h @@ -27,6 +27,8 @@ void process_midi_basic_noteoff(uint8_t note); void process_midi_all_notes_off(void); #endif +void midi_task(void); + #ifdef MIDI_ADVANCED typedef union { uint32_t raw; @@ -39,10 +41,9 @@ typedef union { }; } midi_config_t; -midi_config_t midi_config; +extern midi_config_t midi_config; void midi_init(void); -void midi_task(void); bool process_midi(uint16_t keycode, keyrecord_t *record); #define MIDI_INVALID_NOTE 0xFF diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 436fb6073475..001fb00ce52f 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -66,6 +66,9 @@ along with this program. If not, see . #ifdef POINTING_DEVICE_ENABLE # include "pointing_device.h" #endif +#ifdef MIDI_ENABLE +# include "process_midi.h" +#endif #ifdef MATRIX_HAS_GHOST extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; @@ -260,6 +263,10 @@ void keyboard_task(void) pointing_device_task(); #endif +#ifdef MIDI_ENABLE + midi_task(); +#endif + // update LED if (led_status != host_keyboard_leds()) { led_status = host_keyboard_leds(); diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index 847917413c76..a5625decb328 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -41,6 +41,9 @@ #ifdef VISUALIZER_ENABLE #include "visualizer/visualizer.h" #endif +#ifdef MIDI_ENABLE +#include "qmk_midi.h" +#endif #include "suspend.h" #include "wait.h" @@ -111,6 +114,10 @@ int main(void) { /* init printf */ init_printf(NULL,sendchar_pf); +#ifdef MIDI_ENABLE + setup_midi(); +#endif + #ifdef SERIAL_LINK_ENABLE init_serial_link(); #endif diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index f58ebad5bfaf..ecccfed03413 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -84,6 +84,12 @@ static void configure_raw_interface(void); static uint8_t raw_queue_buffer[BQ_BUFFER_SIZE(RAW_QUEUE_CAPACITY, RAW_EPSIZE)]; #endif +#ifdef MIDI_ENABLE +#define MIDI_QUEUE_CAPACITY 4 +static uint8_t midi_queue_buffer_in[BQ_BUFFER_SIZE(MIDI_QUEUE_CAPACITY, MIDI_STREAM_EPSIZE)]; +static uint8_t midi_queue_buffer_out[BQ_BUFFER_SIZE(MIDI_QUEUE_CAPACITY, MIDI_STREAM_EPSIZE)]; +#endif + /* --------------------------------------------------------- * Descriptors and USB driver objects * --------------------------------------------------------- @@ -207,11 +213,9 @@ static const USBEndpointConfig nkro_ep_config = { #endif /* NKRO_ENABLE */ #ifdef RAW_ENABLE -/* console endpoint state structure */ static USBInEndpointState raw_in_ep_state; static USBOutEndpointState raw_out_ep_state; -/* console endpoint initialization structure (IN) */ static const USBEndpointConfig raw_in_ep_config = { USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ NULL, /* SETUP packet notification callback */ @@ -240,6 +244,42 @@ static const USBEndpointConfig raw_out_ep_config = { #endif #ifdef MIDI_ENABLE +static USBInEndpointState midi_in_ep_state; +static USBOutEndpointState midi_out_ep_state; + +static const USBEndpointConfig midi_in_ep_config = { + USB_EP_MODE_TYPE_BULK, /* Bulk EP */ + NULL, /* SETUP packet notification callback */ + sduDataTransmitted, /* IN notification callback */ + NULL, /* OUT notification callback */ + MIDI_STREAM_EPSIZE, /* IN maximum packet size */ + 0, /* OUT maximum packet size */ + &midi_in_ep_state, /* IN Endpoint state */ + NULL, /* OUT endpoint state */ + 2, /* IN multiplier */ + NULL /* SETUP buffer (not a SETUP endpoint) */ +}; + +static const USBEndpointConfig midi_out_ep_config = { + USB_EP_MODE_TYPE_BULK, /* Bulk EP */ + NULL, /* SETUP packet notification callback */ + NULL, /* IN notification callback */ + sduDataReceived, /* OUT notification callback */ + 0, /* IN maximum packet size */ + MIDI_STREAM_EPSIZE, /* OUT maximum packet size */ + NULL, /* IN Endpoint state */ + &midi_out_ep_state, /* OUT endpoint state */ + 2, /* IN multiplier */ + NULL /* SETUP buffer (not a SETUP endpoint) */ +}; + +SerialUSBDriver midi_driver; +const SerialUSBConfig midi_driver_conf = { + &USB_DRIVER, + MIDI_STREAM_IN_EPNUM, + MIDI_STREAM_OUT_EPNUM, + 0, +}; #endif #ifdef VIRTSER_ENABLE @@ -331,6 +371,11 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { usbInitEndpointI(usbp, RAW_OUT_EPNUM, &raw_out_ep_config); configure_raw_interface(); #endif +#ifdef MIDI_ENABLE + usbInitEndpointI(usbp, MIDI_STREAM_IN_EPNUM, &midi_in_ep_config); + usbInitEndpointI(usbp, MIDI_STREAM_OUT_EPNUM, &midi_out_ep_config); + sduConfigureHookI(&midi_driver); +#endif #ifdef VIRTSER_ENABLE /* Enables the endpoints specified into the configuration. Note, this callback is invoked from an ISR so I-Class functions @@ -349,6 +394,9 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { #ifdef VIRTSER_ENABLE sduDisconnectI(&SDU1); #endif +#ifdef MIDI_ENABLE + sduDisconnectI(&midi_driver); +#endif #ifdef SLEEP_LED_ENABLE sleep_led_enable(); #endif /* SLEEP_LED_ENABLE */ @@ -554,9 +602,14 @@ static bool usb_request_hook_cb(USBDriver *usbp) { /* Start-of-frame callback */ static void usb_sof_cb(USBDriver *usbp) { kbd_sof_cb(usbp); -#ifdef VIRTSER_ENABLE +#if defined(VIRTSER_ENABLE) || defined(MIDI_ENABLE) osalSysLockFromISR(); + #ifdef VIRTSER_ENABLE sduSOFHookI(&SDU1); + #endif + #ifdef MIDI_ENABLE + sduSOFHookI(&midi_driver); + #endif osalSysUnlockFromISR(); #endif } @@ -579,6 +632,20 @@ void init_usb_driver(USBDriver *usbp) { sduStart(&SDU1, &serusbcfg); #endif +#ifdef MIDI_ENABLE + sduObjectInit(&midi_driver); + bqnotify_t notify = midi_driver.ibqueue.notify; + ibqObjectInit(&midi_driver.ibqueue, midi_queue_buffer_in, MIDI_STREAM_EPSIZE, MIDI_QUEUE_CAPACITY, notify, &midi_driver); + notify = midi_driver.obqueue.notify; + obqObjectInit(&midi_driver.obqueue, midi_queue_buffer_out, MIDI_STREAM_EPSIZE, MIDI_QUEUE_CAPACITY, notify, &midi_driver); + sduStart(&midi_driver, &midi_driver_conf); +#endif + +#ifdef CONSOLE_ENABLE + obqObjectInit(&console_buf_queue, console_queue_buffer, CONSOLE_EPSIZE, CONSOLE_QUEUE_CAPACITY, console_queue_onotify, (void*)usbp); + chVTObjectInit(&console_flush_timer); +#endif + /* * Activates the USB driver and then the USB bus pull-up on D+. * Note, a delay is inserted in order to not have to disconnect the cable @@ -590,10 +657,6 @@ void init_usb_driver(USBDriver *usbp) { usbConnectBus(usbp); chVTObjectInit(&keyboard_idle_timer); -#ifdef CONSOLE_ENABLE - obqObjectInit(&console_buf_queue, false, console_queue_buffer, CONSOLE_EPSIZE, CONSOLE_QUEUE_CAPACITY, console_queue_onotify, (void*)usbp); - chVTObjectInit(&console_flush_timer); -#endif #ifdef RAW_ENABLE ibqObjectInit(&raw_buf_queue, raw_queue_buffer, RAW_EPSIZE, RAW_QUEUE_CAPACITY, raw_queue_inotify, (void*)usbp); #endif @@ -1009,6 +1072,19 @@ static void configure_raw_interface(void) { } #endif +#ifdef MIDI_ENABLE + +void send_midi_packet(MIDI_EventPacket_t* event) { + chnWrite(&midi_driver, (uint8_t*)event, sizeof(MIDI_EventPacket_t)); +} + +bool recv_midi_packet(MIDI_EventPacket_t* const event) { + size_t size = chnReadTimeout(&midi_driver, (uint8_t*)event, sizeof(MIDI_EventPacket_t), TIME_IMMEDIATE); + return size == sizeof(MIDI_EventPacket_t); +} + +#endif + #ifdef VIRTSER_ENABLE void virtser_send(const uint8_t byte) { diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 7c2ec5563c33..a1cab98a66ab 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -977,7 +977,6 @@ int main(void) keyboard_task(); #ifdef MIDI_ENABLE - midi_task(); MIDI_Device_USBTask(&USB_MIDI_Interface); #endif diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h index bc7d95472efc..7364cdf7ceb3 100644 --- a/tmk_core/protocol/lufa/lufa.h +++ b/tmk_core/protocol/lufa/lufa.h @@ -48,9 +48,6 @@ #include #include #include "host.h" -#ifdef MIDI_ENABLE - #include "process_midi.h" -#endif #ifdef __cplusplus extern "C" { #endif diff --git a/tmk_core/protocol/midi/qmk_midi.c b/tmk_core/protocol/midi/qmk_midi.c index 82b1dda2a59c..275c69863137 100644 --- a/tmk_core/protocol/midi/qmk_midi.c +++ b/tmk_core/protocol/midi/qmk_midi.c @@ -3,6 +3,7 @@ #include "sysex_tools.h" #include "midi.h" #include "usb_descriptor.h" +#include "process_midi.h" /******************************************************************************* * MIDI From 232d89306214cad2ceeca41c2ffedd7b79976f5a Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 13 Dec 2017 09:58:00 +0200 Subject: [PATCH 20/31] Fix USB descriptor strings on ChibiOS --- keyboards/chibios_test/config.h | 8 +++----- keyboards/clueboard/60/config.h | 8 +++----- keyboards/ergodox_infinity/config.h | 8 ++------ keyboards/infinity60/config.h | 6 ++---- keyboards/jm60/config.h | 8 +++----- keyboards/whitefox/config.h | 8 +++----- tmk_core/chibios.mk | 2 ++ 7 files changed, 18 insertions(+), 30 deletions(-) diff --git a/keyboards/chibios_test/config.h b/keyboards/chibios_test/config.h index c32a77b37f72..89eb1f33b4d5 100644 --- a/keyboards/chibios_test/config.h +++ b/keyboards/chibios_test/config.h @@ -24,11 +24,9 @@ along with this program. If not, see . #define DEVICE_VER 0x0001 /* in python2: list(u"whatever".encode('utf-16-le')) */ /* at most 32 characters or the ugly hack in usb_main.c borks */ -#define MANUFACTURER "QMK" -#define USBSTR_MANUFACTURER 'T', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00', '\xc6', '\x00' -#define PRODUCT "ChibiOS QMK test" -#define USBSTR_PRODUCT 'C', '\x00', 'h', '\x00', 'i', '\x00', 'b', '\x00', 'i', '\x00', 'O', '\x00', 'S', '\x00', ' ', '\x00', 'Q', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00', 't', '\x00', 'e', '\x00', 's', '\x00', 't', '\x00' -#define DESCRIPTION "QMK keyboard firmware test for ChibiOS" +#define MANUFACTURER QMK +#define PRODUCT ChibiOS QMK test +#define DESCRIPTION QMK keyboard firmware test for ChibiOS /* key matrix size */ #define MATRIX_ROWS 1 diff --git a/keyboards/clueboard/60/config.h b/keyboards/clueboard/60/config.h index 333698a0877b..5c5a86296f95 100644 --- a/keyboards/clueboard/60/config.h +++ b/keyboards/clueboard/60/config.h @@ -22,11 +22,9 @@ #define VENDOR_ID 0xC1ED #define PRODUCT_ID 0x2350 #define DEVICE_VER 0x0001 -#define MANUFACTURER "Clueboard" -#define USBSTR_MANUFACTURER 'C', '\x00', 'l', '\x00', 'u', '\x00', 'e', '\x00', 'b', '\x00', 'o', '\x00', 'a', '\x00', 'r', '\x00', 'd', '\x00' -#define PRODUCT "Clueboard60" -#define USBSTR_PRODUCT 'C', '\x00', 'l', '\x00', 'u', '\x00', 'e', '\x00', 'b', '\x00', 'o', '\x00', 'a', '\x00', 'r', '\x00', 'd', '\x00', ' ', '\x00', '6', '\x00', '0', '\x00', '%', '\x00' -#define DESCRIPTION "Clueboard 60%" +#define MANUFACTURER Clueboard +#define PRODUCT Clueboard 60% +#define DESCRIPTION Clueboard 60% /* key matrix size */ #define MATRIX_ROWS 5 diff --git a/keyboards/ergodox_infinity/config.h b/keyboards/ergodox_infinity/config.h index 094761e0b472..2f1be0d28288 100644 --- a/keyboards/ergodox_infinity/config.h +++ b/keyboards/ergodox_infinity/config.h @@ -23,12 +23,8 @@ along with this program. If not, see . #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x6464 #define DEVICE_VER 0x0001 -/* in python2: list(u"whatever".encode('utf-16-le')) */ -/* at most 32 characters or the ugly hack in usb_main.c borks */ -#define MANUFACTURER "TMK" -#define USBSTR_MANUFACTURER 'T', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00' -#define PRODUCT "Infinity keyboard/TMK" -#define USBSTR_PRODUCT 'I', '\x00', 'n', '\x00', 'f', '\x00', 'i', '\x00', 'n', '\x00', 'i', '\x00', 't', '\x00', 'y', '\x00', ' ', '\x00', 'k', '\x00', 'e', '\x00', 'y', '\x00', 'b', '\x00', 'o', '\x00', 'a', '\x00', 'r', '\x00', 'd', '\x00', '/', '\x00', 'T', '\x00', 'M', '\x00', 'K', '\x00' +#define MANUFACTURER Input Club +#define PRODUCT Ergodox Infinity (QMK) #define MOUSEKEY_INTERVAL 20 #define MOUSEKEY_DELAY 0 diff --git a/keyboards/infinity60/config.h b/keyboards/infinity60/config.h index 83930901cb58..0a2f93e22bde 100644 --- a/keyboards/infinity60/config.h +++ b/keyboards/infinity60/config.h @@ -26,10 +26,8 @@ along with this program. If not, see . #define DEVICE_VER 0x0001 /* in python2: list(u"whatever".encode('utf-16-le')) */ /* at most 32 characters or the ugly hack in usb_main.c borks */ -#define MANUFACTURER "Input Club" -#define USBSTR_MANUFACTURER 'I', '\x00', 'n', '\x00', 'p', '\x00', 'u', '\x00', 't', '\x00', ' ', '\x00', 'C', '\x00', 'l', '\x00', 'u', '\x00', 'b', '\x00' -#define PRODUCT "Infinity keyboard/QMK" -#define USBSTR_PRODUCT 'I', '\x00', 'n', '\x00', 'f', '\x00', 'i', '\x00', 'n', '\x00', 'i', '\x00', 't', '\x00', 'y', '\x00', ' ', '\x00', 'k', '\x00', 'e', '\x00', 'y', '\x00', 'b', '\x00', 'o', '\x00', 'a', '\x00', 'r', '\x00', 'd', '\x00', '/', '\x00', 'Q', '\x00', 'M', '\x00', 'K', '\x00' +#define MANUFACTURER Input Club +#define PRODUCT Infinity 60% keyboard (QMK) /* key matrix size */ #define MATRIX_ROWS 9 #define MATRIX_COLS 7 diff --git a/keyboards/jm60/config.h b/keyboards/jm60/config.h index 2596413313ed..847cf20780f0 100644 --- a/keyboards/jm60/config.h +++ b/keyboards/jm60/config.h @@ -26,11 +26,9 @@ along with this program. If not, see . #define DEVICE_VER 0x0001 /* in python2: list(u"whatever".encode('utf-16-le')) */ /* at most 32 characters or the ugly hack in usb_main.c borks */ -#define MANUFACTURER "JMWS" -#define USBSTR_MANUFACTURER 'J', '\x00', 'M', '\x00', 'W', '\x00', 'S', '\x00' -#define PRODUCT "JM60 RGB Keyboard(QMK)" -#define USBSTR_PRODUCT 'J', '\x00', 'M', '\x00', '6', '\x00', '0', '\x00', ' ', '\x00', 'R', '\x00', 'G', '\x00', 'B', '\x00', ' ', '\x00', 'K', '\x00', 'e', '\x00', 'y', '\x00', 'b', '\x00', 'o', '\x00', 'a', '\x00', 'r', '\x00', 'd', '\x00', '(', '\x00', 'Q', '\x00', 'M', '\x00', 'K', '\x00', ')', '\x00' -#define DESCRIPTION "QMK keyboard firmware for JM60 RGB Keyboard" +#define MANUFACTURER JMWS +#define PRODUCT JM60 RGB Keyboard(QMK) +#define DESCRIPTION QMK keyboard firmware for JM60 RGB Keyboard /* key matrix size */ #define MATRIX_ROWS 5 diff --git a/keyboards/whitefox/config.h b/keyboards/whitefox/config.h index dc33a7ce5bc6..9397bd61f84e 100644 --- a/keyboards/whitefox/config.h +++ b/keyboards/whitefox/config.h @@ -26,10 +26,8 @@ along with this program. If not, see . #define DEVICE_VER 0x0001 /* in python2: list(u"whatever".encode('utf-16-le')) */ /* at most 32 characters or the ugly hack in usb_main.c borks */ -#define MANUFACTURER "Input Club" -#define USBSTR_MANUFACTURER 'I', '\x00', 'n', '\x00', 'p', '\x00', 'u', '\x00', 't', '\x00', ' ', '\x00', 'C', '\x00', 'l', '\x00', 'u', '\x00', 'b', '\x00' -#define PRODUCT "WhiteFox/QMK" -#define USBSTR_PRODUCT 'W', '\x00', 'h', '\x00', 'i', '\x00', 't', '\x00', 'e', '\x00', 'F', '\x00', 'o', '\x00', 'x', '\x00', ' ', '\x00' +#define MANUFACTURER Input Club +#define PRODUCT WhiteFox (QMK) /* key matrix size */ #define MATRIX_ROWS 9 @@ -81,4 +79,4 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -#endif \ No newline at end of file +#endif diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk index df9fa8498118..2021340df70a 100644 --- a/tmk_core/chibios.mk +++ b/tmk_core/chibios.mk @@ -149,6 +149,7 @@ COMPILEFLAGS += -falign-functions=16 COMPILEFLAGS += -ffunction-sections COMPILEFLAGS += -fdata-sections COMPILEFLAGS += -fno-common +COMPILEFLAGS += -fshort-wchar COMPILEFLAGS += $(THUMBFLAGS) CFLAGS += $(COMPILEFLAGS) @@ -159,6 +160,7 @@ CPPFLAGS += $(COMPILEFLAGS) CPPFLAGS += -fno-rtti LDFLAGS +=-Wl,--gc-sections +LDFLAGS +=-Wl,--no-wchar-size-warning LDFLAGS += -mno-thumb-interwork -mthumb LDSYMBOLS =,--defsym=__process_stack_size__=$(USE_PROCESS_STACKSIZE) LDSYMBOLS :=$(LDSYMBOLS),--defsym=__main_stack_size__=$(USE_EXCEPTIONS_STACKSIZE) From 3f44fb9b0d53fad55fda258e6805ff317bb32e8a Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 13 Dec 2017 10:55:46 +0200 Subject: [PATCH 21/31] Use serial usb driver for raw hid --- tmk_core/protocol/chibios/usb_main.c | 133 +++++++++------------------ 1 file changed, 45 insertions(+), 88 deletions(-) diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index ecccfed03413..70d3651d5fc3 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -74,22 +74,6 @@ void console_queue_onotify(io_buffers_queue_t *bqp); static void console_flush_cb(void *arg); #endif /* CONSOLE_ENABLE */ -#ifdef RAW_ENABLE -#define RAW_QUEUE_CAPACITY 4 -static input_buffers_queue_t raw_buf_queue; -static void raw_queue_inotify(io_buffers_queue_t *bqp); -static void raw_in_cb(USBDriver *usbp, usbep_t ep); -static void raw_out_cb(USBDriver *usbp, usbep_t ep); -static void configure_raw_interface(void); -static uint8_t raw_queue_buffer[BQ_BUFFER_SIZE(RAW_QUEUE_CAPACITY, RAW_EPSIZE)]; -#endif - -#ifdef MIDI_ENABLE -#define MIDI_QUEUE_CAPACITY 4 -static uint8_t midi_queue_buffer_in[BQ_BUFFER_SIZE(MIDI_QUEUE_CAPACITY, MIDI_STREAM_EPSIZE)]; -static uint8_t midi_queue_buffer_out[BQ_BUFFER_SIZE(MIDI_QUEUE_CAPACITY, MIDI_STREAM_EPSIZE)]; -#endif - /* --------------------------------------------------------- * Descriptors and USB driver objects * --------------------------------------------------------- @@ -213,13 +197,17 @@ static const USBEndpointConfig nkro_ep_config = { #endif /* NKRO_ENABLE */ #ifdef RAW_ENABLE +#define RAW_QUEUE_CAPACITY 4 +static uint8_t raw_queue_buffer_in[BQ_BUFFER_SIZE(RAW_QUEUE_CAPACITY, RAW_EPSIZE)]; +static uint8_t raw_queue_buffer_out[BQ_BUFFER_SIZE(RAW_QUEUE_CAPACITY, RAW_EPSIZE)]; + static USBInEndpointState raw_in_ep_state; static USBOutEndpointState raw_out_ep_state; static const USBEndpointConfig raw_in_ep_config = { USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ NULL, /* SETUP packet notification callback */ - raw_in_cb, /* IN notification callback */ + sduDataTransmitted, /* IN notification callback */ NULL, /* OUT notification callback */ RAW_EPSIZE, /* IN maximum packet size */ 0, /* OUT maximum packet size */ @@ -233,7 +221,7 @@ static const USBEndpointConfig raw_out_ep_config = { USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ NULL, /* SETUP packet notification callback */ NULL, /* IN notification callback */ - &raw_out_cb, /* OUT notification callback */ + &sduDataReceived, /* OUT notification callback */ 0, /* IN maximum packet size */ RAW_EPSIZE, /* OUT maximum packet size */ NULL, /* IN Endpoint state */ @@ -241,9 +229,21 @@ static const USBEndpointConfig raw_out_ep_config = { 2, /* IN multiplier */ NULL /* SETUP buffer (not a SETUP endpoint) */ }; + +SerialUSBDriver raw_driver; +const SerialUSBConfig raw_driver_conf = { + &USB_DRIVER, + RAW_IN_EPNUM, + RAW_OUT_EPNUM, + 0, +}; #endif #ifdef MIDI_ENABLE +#define MIDI_QUEUE_CAPACITY 4 +static uint8_t midi_queue_buffer_in[BQ_BUFFER_SIZE(MIDI_QUEUE_CAPACITY, MIDI_STREAM_EPSIZE)]; +static uint8_t midi_queue_buffer_out[BQ_BUFFER_SIZE(MIDI_QUEUE_CAPACITY, MIDI_STREAM_EPSIZE)]; + static USBInEndpointState midi_in_ep_state; static USBOutEndpointState midi_out_ep_state; @@ -369,7 +369,7 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { #ifdef RAW_ENABLE usbInitEndpointI(usbp, RAW_IN_EPNUM, &raw_in_ep_config); usbInitEndpointI(usbp, RAW_OUT_EPNUM, &raw_out_ep_config); - configure_raw_interface(); + sduConfigureHookI(&raw_driver); #endif #ifdef MIDI_ENABLE usbInitEndpointI(usbp, MIDI_STREAM_IN_EPNUM, &midi_in_ep_config); @@ -394,6 +394,9 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { #ifdef VIRTSER_ENABLE sduDisconnectI(&SDU1); #endif +#ifdef RAW_ENABLE + sduDisconnectI(&raw_driver); +#endif #ifdef MIDI_ENABLE sduDisconnectI(&midi_driver); #endif @@ -602,11 +605,14 @@ static bool usb_request_hook_cb(USBDriver *usbp) { /* Start-of-frame callback */ static void usb_sof_cb(USBDriver *usbp) { kbd_sof_cb(usbp); -#if defined(VIRTSER_ENABLE) || defined(MIDI_ENABLE) +#if defined(VIRTSER_ENABLE) || defined(MIDI_ENABLE) || defined(RAW_ENABLE) osalSysLockFromISR(); #ifdef VIRTSER_ENABLE sduSOFHookI(&SDU1); #endif + #ifdef RAW_ENABLE + sduSOFHookI(&raw_driver); + #endif #ifdef MIDI_ENABLE sduSOFHookI(&midi_driver); #endif @@ -623,6 +629,15 @@ static const USBConfig usbcfg = { usb_sof_cb /* Start Of Frame callback */ }; +static void init_usb_stream(SerialUSBDriver* driver, const SerialUSBConfig* config, uint8_t* queue_buffer_in, uint8_t* queue_buffer_out, uint16_t epsize, uint16_t queue_size) { + sduObjectInit(driver); + bqnotify_t notify = driver->ibqueue.notify; + ibqObjectInit(&driver->ibqueue, queue_buffer_in, epsize, queue_size, notify, driver); + notify = driver->obqueue.notify; + obqObjectInit(&driver->obqueue, queue_buffer_out, epsize, queue_size, notify, driver); + sduStart(driver, config); +} + /* * Initialize the USB driver */ @@ -632,13 +647,12 @@ void init_usb_driver(USBDriver *usbp) { sduStart(&SDU1, &serusbcfg); #endif +#ifdef RAW_ENABLE + init_usb_stream(&raw_driver, &raw_driver_conf, raw_queue_buffer_in, raw_queue_buffer_out, RAW_EPSIZE, RAW_QUEUE_CAPACITY); +#endif + #ifdef MIDI_ENABLE - sduObjectInit(&midi_driver); - bqnotify_t notify = midi_driver.ibqueue.notify; - ibqObjectInit(&midi_driver.ibqueue, midi_queue_buffer_in, MIDI_STREAM_EPSIZE, MIDI_QUEUE_CAPACITY, notify, &midi_driver); - notify = midi_driver.obqueue.notify; - obqObjectInit(&midi_driver.obqueue, midi_queue_buffer_out, MIDI_STREAM_EPSIZE, MIDI_QUEUE_CAPACITY, notify, &midi_driver); - sduStart(&midi_driver, &midi_driver_conf); + init_usb_stream(&midi_driver, &midi_driver_conf, midi_queue_buffer_in, midi_queue_buffer_out, MIDI_STREAM_EPSIZE, MIDI_QUEUE_CAPACITY); #endif #ifdef CONSOLE_ENABLE @@ -657,9 +671,6 @@ void init_usb_driver(USBDriver *usbp) { usbConnectBus(usbp); chVTObjectInit(&keyboard_idle_timer); -#ifdef RAW_ENABLE - ibqObjectInit(&raw_buf_queue, raw_queue_buffer, RAW_EPSIZE, RAW_QUEUE_CAPACITY, raw_queue_inotify, (void*)usbp); -#endif } /* --------------------------------------------------------- @@ -995,21 +1006,7 @@ void raw_hid_send( uint8_t *data, uint8_t length ) { return; } - osalSysLock(); - if(usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) { - osalSysUnlock(); - return; - } - if(usbGetTransmitStatusI(&USB_DRIVER, RAW_IN_EPNUM)) { - /* Need to either suspend, or loop and call unlock/lock during - * every iteration - otherwise the system will remain locked, - * no interrupts served, so USB not going through as well. - * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ - osalThreadSuspendS(&(&USB_DRIVER)->epc[RAW_IN_EPNUM]->in_state->thread); - } - - usbStartTransmitI(&USB_DRIVER, RAW_IN_EPNUM, data, length); - osalSysUnlock(); + chnWrite(&raw_driver, data, length); } __attribute__ ((weak)) @@ -1023,53 +1020,13 @@ void raw_hid_task(void) { uint8_t buffer[RAW_EPSIZE]; size_t size = 0; do { - size = ibqReadTimeout(&raw_buf_queue, buffer, RAW_EPSIZE, TIME_IMMEDIATE); - if (size == RAW_EPSIZE) { - raw_hid_receive(buffer, size); - } - } while(size>0); -} - -static void raw_in_cb(USBDriver* usbp, usbep_t ep) { -} - -static void start_receive_raw(void) { - return; - /* If the USB driver is not in the appropriate state then transactions - must not be started.*/ - if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) { - return; - } - - /* Checking if there is already a transaction ongoing on the endpoint.*/ - if (!usbGetReceiveStatusI(&USB_DRIVER, RAW_IN_EPNUM)) { - /* Trying to get a free buffer.*/ - uint8_t *buf = ibqGetEmptyBufferI(&raw_buf_queue); - if (buf != NULL) { - /* Buffer found, starting a new transaction.*/ - usbStartReceiveI(&USB_DRIVER, RAW_IN_EPNUM, buf, RAW_EPSIZE); + size_t size = chnReadTimeout(&raw_driver, buffer, sizeof(buffer), TIME_IMMEDIATE); + if (size > 0) { + raw_hid_receive(buffer, size); } - } + } while(size > 0); } -static void raw_out_cb(USBDriver* usbp, usbep_t ep) { - osalSysLockFromISR(); - - /* Posting the filled buffer in the queue.*/ - ibqPostFullBufferI(&raw_buf_queue, usbGetReceiveTransactionSizeX(usbp, ep)); - start_receive_raw(); - - osalSysUnlockFromISR(); -} - -static void raw_queue_inotify(io_buffers_queue_t *bqp) { - start_receive_raw(); -} - -static void configure_raw_interface(void) { - ibqResetI(&raw_buf_queue); - start_receive_raw(); -} #endif #ifdef MIDI_ENABLE From 9ae339346ee994ab879720d6ebd443861eca5524 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Thu, 14 Dec 2017 11:51:40 +0200 Subject: [PATCH 22/31] Generalize the ChibiOS stream like drivers This makes the initialization much more simple and eliminates a lot of the code duplication. --- tmk_core/protocol/chibios/usb_main.c | 342 +++++++++++---------------- 1 file changed, 141 insertions(+), 201 deletions(-) diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 70d3651d5fc3..1579d03ace66 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -196,146 +196,118 @@ static const USBEndpointConfig nkro_ep_config = { }; #endif /* NKRO_ENABLE */ +typedef struct { + size_t queue_capacity_in; + size_t queue_capacity_out; + uint8_t* queue_buffer_in; + uint8_t* queue_buffer_out; + USBInEndpointState in_ep_state; + USBOutEndpointState out_ep_state; + USBInEndpointState int_ep_state; + USBEndpointConfig in_ep_config; + USBEndpointConfig out_ep_config; + USBEndpointConfig int_ep_config; + const SerialUSBConfig config; + SerialUSBDriver driver; +} stream_driver_t; + +#define STREAM_DRIVER(stream, notification) { \ + .queue_capacity_in = stream##_IN_CAPACITY, \ + .queue_capacity_out = stream##_OUT_CAPACITY, \ + .queue_buffer_in = (uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]) {}, \ + .queue_buffer_out = (uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY,stream##_EPSIZE)]) {}, \ + .in_ep_config = { \ + .ep_mode = stream##_IN_MODE, \ + .setup_cb = NULL, \ + .in_cb = sduDataTransmitted, \ + .out_cb = NULL, \ + .in_maxsize = stream##_EPSIZE, \ + .out_maxsize = 0, \ + /* The pointer to the states will be filled during initialization */ \ + .in_state = NULL, \ + .out_state = NULL, \ + .ep_buffers = 2, \ + .setup_buf = NULL \ + }, \ + .out_ep_config = { \ + .ep_mode = stream##_OUT_MODE, \ + .setup_cb = NULL, \ + .in_cb = NULL, \ + .out_cb = sduDataReceived, \ + .in_maxsize = 0, \ + .out_maxsize = stream##_EPSIZE, \ + /* The pointer to the states will be filled during initialization */ \ + .in_state = NULL, \ + .out_state = NULL, \ + .ep_buffers = 2, \ + .setup_buf = NULL, \ + }, \ + .int_ep_config = { \ + .ep_mode = USB_EP_MODE_TYPE_INTR, \ + .setup_cb = NULL, \ + .in_cb = sduInterruptTransmitted, \ + .out_cb = NULL, \ + .in_maxsize = CDC_NOTIFICATION_EPSIZE, \ + .out_maxsize = 0, \ + /* The pointer to the states will be filled during initialization */ \ + .in_state = NULL, \ + .out_state = NULL, \ + .ep_buffers = 2, \ + .setup_buf = NULL, \ + }, \ + .config = { \ + .usbp = &USB_DRIVER, \ + .bulk_in = stream##_IN_EPNUM, \ + .bulk_out = stream##_OUT_EPNUM, \ + .int_in = notification \ + } \ +} + +typedef struct { + union { + struct { #ifdef RAW_ENABLE -#define RAW_QUEUE_CAPACITY 4 -static uint8_t raw_queue_buffer_in[BQ_BUFFER_SIZE(RAW_QUEUE_CAPACITY, RAW_EPSIZE)]; -static uint8_t raw_queue_buffer_out[BQ_BUFFER_SIZE(RAW_QUEUE_CAPACITY, RAW_EPSIZE)]; - -static USBInEndpointState raw_in_ep_state; -static USBOutEndpointState raw_out_ep_state; - -static const USBEndpointConfig raw_in_ep_config = { - USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ - NULL, /* SETUP packet notification callback */ - sduDataTransmitted, /* IN notification callback */ - NULL, /* OUT notification callback */ - RAW_EPSIZE, /* IN maximum packet size */ - 0, /* OUT maximum packet size */ - &raw_in_ep_state, /* IN Endpoint state */ - NULL, /* OUT endpoint state */ - 2, /* IN multiplier */ - NULL /* SETUP buffer (not a SETUP endpoint) */ -}; - -static const USBEndpointConfig raw_out_ep_config = { - USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ - NULL, /* SETUP packet notification callback */ - NULL, /* IN notification callback */ - &sduDataReceived, /* OUT notification callback */ - 0, /* IN maximum packet size */ - RAW_EPSIZE, /* OUT maximum packet size */ - NULL, /* IN Endpoint state */ - &raw_out_ep_state, /* OUT endpoint state */ - 2, /* IN multiplier */ - NULL /* SETUP buffer (not a SETUP endpoint) */ -}; - -SerialUSBDriver raw_driver; -const SerialUSBConfig raw_driver_conf = { - &USB_DRIVER, - RAW_IN_EPNUM, - RAW_OUT_EPNUM, - 0, -}; + stream_driver_t raw_driver; #endif - #ifdef MIDI_ENABLE -#define MIDI_QUEUE_CAPACITY 4 -static uint8_t midi_queue_buffer_in[BQ_BUFFER_SIZE(MIDI_QUEUE_CAPACITY, MIDI_STREAM_EPSIZE)]; -static uint8_t midi_queue_buffer_out[BQ_BUFFER_SIZE(MIDI_QUEUE_CAPACITY, MIDI_STREAM_EPSIZE)]; - -static USBInEndpointState midi_in_ep_state; -static USBOutEndpointState midi_out_ep_state; - -static const USBEndpointConfig midi_in_ep_config = { - USB_EP_MODE_TYPE_BULK, /* Bulk EP */ - NULL, /* SETUP packet notification callback */ - sduDataTransmitted, /* IN notification callback */ - NULL, /* OUT notification callback */ - MIDI_STREAM_EPSIZE, /* IN maximum packet size */ - 0, /* OUT maximum packet size */ - &midi_in_ep_state, /* IN Endpoint state */ - NULL, /* OUT endpoint state */ - 2, /* IN multiplier */ - NULL /* SETUP buffer (not a SETUP endpoint) */ -}; + stream_driver_t midi_driver; +#endif +#ifdef VIRTSER_ENABLE + stream_driver_t serial_driver; +#endif + }; + stream_driver_t array[0]; + }; +} stream_drivers_t; -static const USBEndpointConfig midi_out_ep_config = { - USB_EP_MODE_TYPE_BULK, /* Bulk EP */ - NULL, /* SETUP packet notification callback */ - NULL, /* IN notification callback */ - sduDataReceived, /* OUT notification callback */ - 0, /* IN maximum packet size */ - MIDI_STREAM_EPSIZE, /* OUT maximum packet size */ - NULL, /* IN Endpoint state */ - &midi_out_ep_state, /* OUT endpoint state */ - 2, /* IN multiplier */ - NULL /* SETUP buffer (not a SETUP endpoint) */ -}; +static stream_drivers_t drivers = { +#ifdef RAW_ENABLE + #define RAW_IN_CAPACITY 4 + #define RAW_OUT_CAPACITY 4 + #define RAW_IN_MODE USB_EP_MODE_TYPE_INTR + #define RAW_OUT_MODE USB_EP_MODE_TYPE_INTR + .raw_driver = STREAM_DRIVER(RAW, 0), +#endif -SerialUSBDriver midi_driver; -const SerialUSBConfig midi_driver_conf = { - &USB_DRIVER, - MIDI_STREAM_IN_EPNUM, - MIDI_STREAM_OUT_EPNUM, - 0, -}; +#ifdef MIDI_ENABLE + #define MIDI_STREAM_IN_CAPACITY 4 + #define MIDI_STREAM_OUT_CAPACITY 4 + #define MIDI_STREAM_IN_MODE USB_EP_MODE_TYPE_BULK + #define MIDI_STREAM_OUT_MODE USB_EP_MODE_TYPE_BULK + .midi_driver = STREAM_DRIVER(MIDI_STREAM, 0), #endif #ifdef VIRTSER_ENABLE -SerialUSBDriver SDU1; - -static USBOutEndpointState virtser_out_ep_state; -static USBInEndpointState virtser_in_ep_state; -static USBInEndpointState virtser_int_ep_state; - -static const USBEndpointConfig virtser_in_ep_config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - NULL, - CDC_EPSIZE, - 0, - &virtser_in_ep_state, - NULL, - 2, - NULL -}; - -static const USBEndpointConfig virtser_out_ep_config = { - USB_EP_MODE_TYPE_BULK, - NULL, - NULL, - sduDataReceived, - 0, - CDC_EPSIZE, - NULL, - &virtser_out_ep_state, - 2, - NULL -}; - -static const USBEndpointConfig virtser_int_ep_config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - CDC_NOTIFICATION_EPSIZE, - 0, - &virtser_int_ep_state, - NULL, - 1, - NULL + #define CDC_IN_CAPACITY 4 + #define CDC_OUT_CAPACITY 4 + #define CDC_IN_MODE USB_EP_MODE_TYPE_BULK + #define CDC_OUT_MODE USB_EP_MODE_TYPE_BULK + .serial_driver = STREAM_DRIVER(CDC, CDC_NOTIFICATION_EPNUM), +#endif }; -const SerialUSBConfig serusbcfg = { - &USB_DRIVER, - CDC_IN_EPNUM, - CDC_OUT_EPNUM, - CDC_NOTIFICATION_EPNUM -}; +#define NUM_STREAM_DRIVERS (sizeof(drivers) / sizeof(stream_driver_t)) -#endif /* --------------------------------------------------------- * USB driver functions @@ -366,40 +338,21 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { #ifdef NKRO_ENABLE usbInitEndpointI(usbp, NKRO_IN_EPNUM, &nkro_ep_config); #endif /* NKRO_ENABLE */ -#ifdef RAW_ENABLE - usbInitEndpointI(usbp, RAW_IN_EPNUM, &raw_in_ep_config); - usbInitEndpointI(usbp, RAW_OUT_EPNUM, &raw_out_ep_config); - sduConfigureHookI(&raw_driver); -#endif -#ifdef MIDI_ENABLE - usbInitEndpointI(usbp, MIDI_STREAM_IN_EPNUM, &midi_in_ep_config); - usbInitEndpointI(usbp, MIDI_STREAM_OUT_EPNUM, &midi_out_ep_config); - sduConfigureHookI(&midi_driver); -#endif -#ifdef VIRTSER_ENABLE - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, CDC_IN_EPNUM, &virtser_in_ep_config); - usbInitEndpointI(usbp, CDC_OUT_EPNUM, &virtser_out_ep_config); - usbInitEndpointI(usbp, CDC_NOTIFICATION_EPNUM, &virtser_int_ep_config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(&SDU1); -#endif + for (int i=0;iud_string, dp->ud_size, NULL); return TRUE; } - #ifdef VIRTSER_ENABLE - return sduRequestsHook(usbp); - #endif + + for (int i=0;iibqueue.notify; - ibqObjectInit(&driver->ibqueue, queue_buffer_in, epsize, queue_size, notify, driver); - notify = driver->obqueue.notify; - obqObjectInit(&driver->obqueue, queue_buffer_out, epsize, queue_size, notify, driver); - sduStart(driver, config); -} - /* * Initialize the USB driver */ void init_usb_driver(USBDriver *usbp) { -#ifdef VIRTSER_ENABLE - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); -#endif - -#ifdef RAW_ENABLE - init_usb_stream(&raw_driver, &raw_driver_conf, raw_queue_buffer_in, raw_queue_buffer_out, RAW_EPSIZE, RAW_QUEUE_CAPACITY); -#endif - -#ifdef MIDI_ENABLE - init_usb_stream(&midi_driver, &midi_driver_conf, midi_queue_buffer_in, midi_queue_buffer_out, MIDI_STREAM_EPSIZE, MIDI_QUEUE_CAPACITY); -#endif + for (int i=0; iibqueue.notify; + ibqObjectInit(&driver->ibqueue, drivers.array[i].queue_buffer_in, drivers.array[i].in_ep_config.in_maxsize, drivers.array[i].queue_capacity_in, notify, driver); + notify = driver->obqueue.notify; + ibqObjectInit(&driver->ibqueue, drivers.array[i].queue_buffer_out, drivers.array[i].out_ep_config.out_maxsize, drivers.array[i].queue_capacity_out, notify, driver); + sduStart(driver, &drivers.array[i].config); + } #ifdef CONSOLE_ENABLE obqObjectInit(&console_buf_queue, console_queue_buffer, CONSOLE_EPSIZE, CONSOLE_QUEUE_CAPACITY, console_queue_onotify, (void*)usbp); @@ -1006,7 +946,7 @@ void raw_hid_send( uint8_t *data, uint8_t length ) { return; } - chnWrite(&raw_driver, data, length); + chnWrite(&drivers.raw_driver.driver, data, length); } __attribute__ ((weak)) @@ -1020,7 +960,7 @@ void raw_hid_task(void) { uint8_t buffer[RAW_EPSIZE]; size_t size = 0; do { - size_t size = chnReadTimeout(&raw_driver, buffer, sizeof(buffer), TIME_IMMEDIATE); + size_t size = chnReadTimeout(&drivers.raw_driver.driver, buffer, sizeof(buffer), TIME_IMMEDIATE); if (size > 0) { raw_hid_receive(buffer, size); } @@ -1032,11 +972,11 @@ void raw_hid_task(void) { #ifdef MIDI_ENABLE void send_midi_packet(MIDI_EventPacket_t* event) { - chnWrite(&midi_driver, (uint8_t*)event, sizeof(MIDI_EventPacket_t)); + chnWrite(&drivers.midi_driver.driver, (uint8_t*)event, sizeof(MIDI_EventPacket_t)); } bool recv_midi_packet(MIDI_EventPacket_t* const event) { - size_t size = chnReadTimeout(&midi_driver, (uint8_t*)event, sizeof(MIDI_EventPacket_t), TIME_IMMEDIATE); + size_t size = chnReadTimeout(&drivers.midi_driver.driver, (uint8_t*)event, sizeof(MIDI_EventPacket_t), TIME_IMMEDIATE); return size == sizeof(MIDI_EventPacket_t); } @@ -1045,7 +985,7 @@ bool recv_midi_packet(MIDI_EventPacket_t* const event) { #ifdef VIRTSER_ENABLE void virtser_send(const uint8_t byte) { - chnWrite(&SDU1, &byte, 1); + chnWrite(&drivers.serial_driver.driver, &byte, 1); } __attribute__ ((weak)) @@ -1058,7 +998,7 @@ void virtser_task(void) { uint8_t numBytesReceived = 0; uint8_t buffer[16]; do { - numBytesReceived = chnReadTimeout(&SDU1, buffer, sizeof(buffer), TIME_IMMEDIATE); + numBytesReceived = chnReadTimeout(&drivers.serial_driver.driver, buffer, sizeof(buffer), TIME_IMMEDIATE); for (int i=0;i Date: Mon, 18 Dec 2017 08:19:16 +0200 Subject: [PATCH 23/31] Convert console output to chibios stream driver --- tmk_core/protocol/chibios/main.c | 7 + tmk_core/protocol/chibios/usb_main.c | 263 +++++++-------------------- tmk_core/protocol/chibios/usb_main.h | 8 - tmk_core/protocol/usb_descriptor.h | 8 +- 4 files changed, 84 insertions(+), 202 deletions(-) diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index a5625decb328..f2abc438d47d 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -76,6 +76,10 @@ void virtser_task(void); void raw_hid_task(void); #endif +#ifdef CONSOLE_ENABLE +void console_task(void); +#endif + /* TESTING * Amber LED blinker thread, times are in milliseconds. */ @@ -196,6 +200,9 @@ int main(void) { } keyboard_task(); +#ifdef CONSOLE_ENABLE + console_task(); +#endif #ifdef VIRTSER_ENABLE virtser_task(); #endif diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 1579d03ace66..b1120e3e597d 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -64,16 +64,6 @@ report_mouse_t mouse_report_blank = {0}; uint8_t extra_report_blank[3] = {0}; #endif /* EXTRAKEY_ENABLE */ -#ifdef CONSOLE_ENABLE -/* The emission buffers queue */ -output_buffers_queue_t console_buf_queue; -static uint8_t console_queue_buffer[BQ_BUFFER_SIZE(CONSOLE_QUEUE_CAPACITY, CONSOLE_EPSIZE)]; - -static virtual_timer_t console_flush_timer; -void console_queue_onotify(io_buffers_queue_t *bqp); -static void console_flush_cb(void *arg); -#endif /* CONSOLE_ENABLE */ - /* --------------------------------------------------------- * Descriptors and USB driver objects * --------------------------------------------------------- @@ -139,25 +129,6 @@ static const USBEndpointConfig mouse_ep_config = { }; #endif /* MOUSE_ENABLE */ -#ifdef CONSOLE_ENABLE -/* console endpoint state structure */ -static USBInEndpointState console_ep_state; - -/* console endpoint initialization structure (IN) */ -static const USBEndpointConfig console_ep_config = { - USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ - NULL, /* SETUP packet notification callback */ - console_in_cb, /* IN notification callback */ - NULL, /* OUT notification callback */ - CONSOLE_EPSIZE, /* IN maximum packet size */ - 0, /* OUT maximum packet size */ - &console_ep_state, /* IN Endpoint state */ - NULL, /* OUT endpoint state */ - 2, /* IN multiplier */ - NULL /* SETUP buffer (not a SETUP endpoint) */ -}; -#endif /* CONSOLE_ENABLE */ - #ifdef EXTRAKEY_ENABLE /* extrakey endpoint state structure */ static USBInEndpointState extra_ep_state; @@ -212,48 +183,48 @@ typedef struct { } stream_driver_t; #define STREAM_DRIVER(stream, notification) { \ - .queue_capacity_in = stream##_IN_CAPACITY, \ - .queue_capacity_out = stream##_OUT_CAPACITY, \ - .queue_buffer_in = (uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]) {}, \ - .queue_buffer_out = (uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY,stream##_EPSIZE)]) {}, \ - .in_ep_config = { \ - .ep_mode = stream##_IN_MODE, \ - .setup_cb = NULL, \ - .in_cb = sduDataTransmitted, \ - .out_cb = NULL, \ - .in_maxsize = stream##_EPSIZE, \ - .out_maxsize = 0, \ - /* The pointer to the states will be filled during initialization */ \ - .in_state = NULL, \ - .out_state = NULL, \ - .ep_buffers = 2, \ - .setup_buf = NULL \ - }, \ - .out_ep_config = { \ - .ep_mode = stream##_OUT_MODE, \ - .setup_cb = NULL, \ - .in_cb = NULL, \ - .out_cb = sduDataReceived, \ - .in_maxsize = 0, \ - .out_maxsize = stream##_EPSIZE, \ - /* The pointer to the states will be filled during initialization */ \ - .in_state = NULL, \ - .out_state = NULL, \ - .ep_buffers = 2, \ - .setup_buf = NULL, \ - }, \ - .int_ep_config = { \ - .ep_mode = USB_EP_MODE_TYPE_INTR, \ - .setup_cb = NULL, \ - .in_cb = sduInterruptTransmitted, \ - .out_cb = NULL, \ - .in_maxsize = CDC_NOTIFICATION_EPSIZE, \ - .out_maxsize = 0, \ - /* The pointer to the states will be filled during initialization */ \ - .in_state = NULL, \ - .out_state = NULL, \ - .ep_buffers = 2, \ - .setup_buf = NULL, \ + .queue_capacity_in = stream##_IN_CAPACITY, \ + .queue_capacity_out = stream##_OUT_CAPACITY, \ + .queue_buffer_in = (uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]) {}, \ + .queue_buffer_out = (uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY,stream##_EPSIZE)]) {}, \ + .in_ep_config = { \ + .ep_mode = stream##_IN_MODE, \ + .setup_cb = NULL, \ + .in_cb = sduDataTransmitted, \ + .out_cb = NULL, \ + .in_maxsize = stream##_EPSIZE, \ + .out_maxsize = 0, \ + /* The pointer to the states will be filled during initialization */ \ + .in_state = NULL, \ + .out_state = NULL, \ + .ep_buffers = 2, \ + .setup_buf = NULL \ + }, \ + .out_ep_config = { \ + .ep_mode = stream##_OUT_MODE, \ + .setup_cb = NULL, \ + .in_cb = NULL, \ + .out_cb = sduDataReceived, \ + .in_maxsize = 0, \ + .out_maxsize = stream##_EPSIZE, \ + /* The pointer to the states will be filled during initialization */ \ + .in_state = NULL, \ + .out_state = NULL, \ + .ep_buffers = 2, \ + .setup_buf = NULL, \ + }, \ + .int_ep_config = { \ + .ep_mode = USB_EP_MODE_TYPE_INTR, \ + .setup_cb = NULL, \ + .in_cb = sduInterruptTransmitted, \ + .out_cb = NULL, \ + .in_maxsize = CDC_NOTIFICATION_EPSIZE, \ + .out_maxsize = 0, \ + /* The pointer to the states will be filled during initialization */ \ + .in_state = NULL, \ + .out_state = NULL, \ + .ep_buffers = 2, \ + .setup_buf = NULL, \ }, \ .config = { \ .usbp = &USB_DRIVER, \ @@ -266,6 +237,9 @@ typedef struct { typedef struct { union { struct { +#ifdef CONSOLE_ENABLE + stream_driver_t console_driver; +#endif #ifdef RAW_ENABLE stream_driver_t raw_driver; #endif @@ -281,6 +255,13 @@ typedef struct { } stream_drivers_t; static stream_drivers_t drivers = { +#ifdef CONSOLE_ENABLE + #define CONSOLE_IN_CAPACITY 4 + #define CONSOLE_OUT_CAPACITY 4 + #define CONSOLE_IN_MODE USB_EP_MODE_TYPE_INTR + #define CONSOLE_OUT_MODE USB_EP_MODE_TYPE_INTR + .console_driver = STREAM_DRIVER(CONSOLE, 0), +#endif #ifdef RAW_ENABLE #define RAW_IN_CAPACITY 4 #define RAW_OUT_CAPACITY 4 @@ -328,10 +309,6 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { #ifdef MOUSE_ENABLE usbInitEndpointI(usbp, MOUSE_IN_EPNUM, &mouse_ep_config); #endif /* MOUSE_ENABLE */ -#ifdef CONSOLE_ENABLE - usbInitEndpointI(usbp, CONSOLE_IN_EPNUM, &console_ep_config); - /* don't need to start the flush timer, it starts from console_in_cb automatically */ -#endif /* CONSOLE_ENABLE */ #ifdef EXTRAKEY_ENABLE usbInitEndpointI(usbp, EXTRAKEY_IN_EPNUM, &extra_ep_config); #endif /* EXTRAKEY_ENABLE */ @@ -434,13 +411,6 @@ static bool usb_request_hook_cb(USBDriver *usbp) { break; #endif /* MOUSE_ENABLE */ -#ifdef CONSOLE_ENABLE - case CONSOLE_INTERFACE: - usbSetupTransfer(usbp, console_queue_buffer, CONSOLE_EPSIZE, NULL); - return TRUE; - break; -#endif /* CONSOLE_ENABLE */ - #ifdef EXTRAKEY_ENABLE case EXTRAKEY_INTERFACE: if(usbp->setup[3] == 1) { /* MSB(wValue) [Report Type] == 1 [Input Report] */ @@ -595,11 +565,6 @@ void init_usb_driver(USBDriver *usbp) { sduStart(driver, &drivers.array[i].config); } -#ifdef CONSOLE_ENABLE - obqObjectInit(&console_buf_queue, console_queue_buffer, CONSOLE_EPSIZE, CONSOLE_QUEUE_CAPACITY, console_queue_onotify, (void*)usbp); - chVTObjectInit(&console_flush_timer); -#endif - /* * Activates the USB driver and then the USB bus pull-up on D+. * Note, a delay is inserted in order to not have to disconnect the cable @@ -617,7 +582,6 @@ void init_usb_driver(USBDriver *usbp) { * Keyboard functions * --------------------------------------------------------- */ - /* keyboard IN callback hander (a kbd report has made it IN) */ void kbd_in_cb(USBDriver *usbp, usbep_t ep) { /* STUB */ @@ -815,115 +779,28 @@ void send_consumer(uint16_t data) { #ifdef CONSOLE_ENABLE -/* console IN callback hander */ -void console_in_cb(USBDriver *usbp, usbep_t ep) { - (void)ep; /* should have ep == CONSOLE_IN_EPNUM, so use that to save time/space */ - uint8_t *buf; - size_t n; - - osalSysLockFromISR(); - - /* rearm the timer */ - chVTSetI(&console_flush_timer, MS2ST(CONSOLE_FLUSH_MS), console_flush_cb, (void *)usbp); - - /* Freeing the buffer just transmitted, if it was not a zero size packet.*/ - if (usbp->epc[CONSOLE_IN_EPNUM]->in_state->txsize > 0U) { - obqReleaseEmptyBufferI(&console_buf_queue); - } - - /* Checking if there is a buffer ready for transmission.*/ - buf = obqGetFullBufferI(&console_buf_queue, &n); - - if (buf != NULL) { - /* The endpoint cannot be busy, we are in the context of the callback, - so it is safe to transmit without a check.*/ - /* Should have n == CONSOLE_EPSIZE; check it? */ - usbStartTransmitI(usbp, CONSOLE_IN_EPNUM, buf, CONSOLE_EPSIZE); - } else { - /* Nothing to transmit.*/ - } - - osalSysUnlockFromISR(); -} - -/* Callback when data is inserted into the output queue - * Called from a locked state */ -void console_queue_onotify(io_buffers_queue_t *bqp) { - size_t n; - USBDriver *usbp = bqGetLinkX(bqp); - - if(usbGetDriverStateI(usbp) != USB_ACTIVE) - return; - - /* Checking if there is already a transaction ongoing on the endpoint.*/ - if (!usbGetTransmitStatusI(usbp, CONSOLE_IN_EPNUM)) { - /* Trying to get a full buffer.*/ - uint8_t *buf = obqGetFullBufferI(&console_buf_queue, &n); - if (buf != NULL) { - /* Buffer found, starting a new transaction.*/ - /* Should have n == CONSOLE_EPSIZE; check this? */ - usbStartTransmitI(usbp, CONSOLE_IN_EPNUM, buf, CONSOLE_EPSIZE); - } - } +int8_t sendchar(uint8_t c) { + // The previous implmentation had timeouts, but I think it's better to just slow down + // and make sure that everything is transferred, rather than dropping stuff + return chnWrite(&drivers.console_driver.driver, &c, 1); } -/* Flush timer code - * callback (called from ISR, unlocked state) */ -static void console_flush_cb(void *arg) { - USBDriver *usbp = (USBDriver *)arg; - osalSysLockFromISR(); - - /* check that the states of things are as they're supposed to */ - if(usbGetDriverStateI(usbp) != USB_ACTIVE) { - /* rearm the timer */ - chVTSetI(&console_flush_timer, MS2ST(CONSOLE_FLUSH_MS), console_flush_cb, (void *)usbp); - osalSysUnlockFromISR(); - return; - } - - /* If there is already a transaction ongoing then another one cannot be - started.*/ - if (usbGetTransmitStatusI(usbp, CONSOLE_IN_EPNUM)) { - /* rearm the timer */ - chVTSetI(&console_flush_timer, MS2ST(CONSOLE_FLUSH_MS), console_flush_cb, (void *)usbp); - osalSysUnlockFromISR(); - return; - } - - /* Checking if there only a buffer partially filled, if so then it is - enforced in the queue and transmitted.*/ - if(obqTryFlushI(&console_buf_queue)) { - size_t n,i; - uint8_t *buf = obqGetFullBufferI(&console_buf_queue, &n); - - osalDbgAssert(buf != NULL, "queue is empty"); - - /* zero the rest of the buffer (buf should point to allocated space) */ - for(i=n; i 0) { + console_receive(buffer, size); + } + } while(size > 0); } #else /* CONSOLE_ENABLE */ diff --git a/tmk_core/protocol/chibios/usb_main.h b/tmk_core/protocol/chibios/usb_main.h index 28e21ea5f45c..1f7eb12f8db5 100644 --- a/tmk_core/protocol/chibios/usb_main.h +++ b/tmk_core/protocol/chibios/usb_main.h @@ -89,20 +89,12 @@ typedef struct { #ifdef CONSOLE_ENABLE -/* Number of IN reports that can be stored inside the output queue */ -#define CONSOLE_QUEUE_CAPACITY 4 - -/* Console flush time */ -#define CONSOLE_FLUSH_MS 50 - /* Putchar over the USB console */ int8_t sendchar(uint8_t c); /* Flush output (send everything immediately) */ void console_flush_output(void); -/* console IN request callback handler */ -void console_in_cb(USBDriver *usbp, usbep_t ep); #endif /* CONSOLE_ENABLE */ void sendchar_pf(void *p, char c); diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index 144df967fd7a..ecdcb217192e 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h @@ -207,8 +207,14 @@ typedef struct #ifdef CONSOLE_ENABLE # define CONSOLE_IN_EPNUM (RAW_OUT_EPNUM + 1) -//# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 2) +#ifdef PROTOCOL_CHIBIOS +// ChibiOS has enough memory and descriptor to actually enable the endpoint +// It could use the same endpoint numbers, as that's supported by ChibiOS +// But the QMK code currently assumes that the endpoint numbers are different +# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 2) +#else # define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 1) +#endif #else # define CONSOLE_OUT_EPNUM RAW_OUT_EPNUM #endif From 2c11f8c9c81d8f158bc22e93aef6aa63c1388f5e Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 3 Feb 2018 19:27:16 +0200 Subject: [PATCH 24/31] Fixes for ChibiOS update --- tmk_core/protocol/chibios/usb_main.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index b1120e3e597d..f980024ab80d 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -326,10 +326,6 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { osalSysUnlockFromISR(); return; case USB_EVENT_SUSPEND: - for (int i=0;iibqueue.notify; - ibqObjectInit(&driver->ibqueue, drivers.array[i].queue_buffer_in, drivers.array[i].in_ep_config.in_maxsize, drivers.array[i].queue_capacity_in, notify, driver); + ibqObjectInit(&driver->ibqueue, false, drivers.array[i].queue_buffer_in, drivers.array[i].in_ep_config.in_maxsize, drivers.array[i].queue_capacity_in, notify, driver); notify = driver->obqueue.notify; - ibqObjectInit(&driver->ibqueue, drivers.array[i].queue_buffer_out, drivers.array[i].out_ep_config.out_maxsize, drivers.array[i].queue_capacity_out, notify, driver); + ibqObjectInit(&driver->ibqueue, false, drivers.array[i].queue_buffer_out, drivers.array[i].out_ep_config.out_maxsize, drivers.array[i].queue_capacity_out, notify, driver); sduStart(driver, &drivers.array[i].config); } From b852787d7106f306eaece4b8a8762f43d7f9e8ff Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Thu, 8 Feb 2018 09:19:30 +0200 Subject: [PATCH 25/31] Update the ChibiOS contrib submodule To include the usb data toggle synchronization fixes --- lib/chibios-contrib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/chibios-contrib b/lib/chibios-contrib index 432bc1762f17..ede48346eee4 160000 --- a/lib/chibios-contrib +++ b/lib/chibios-contrib @@ -1 +1 @@ -Subproject commit 432bc1762f17eb7b506e8fbca8ec30a3d61629b8 +Subproject commit ede48346eee4b8d6847c19bc01420bee76a5e486 From 82965735b68ff629703d73ab310ef4e702dd0736 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Thu, 8 Feb 2018 09:22:43 +0200 Subject: [PATCH 26/31] Fix duplicate reset enumeration on ChibiOS --- quantum/keymap.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/quantum/keymap.h b/quantum/keymap.h index 5d64be19c87f..bfcb2f7cd517 100644 --- a/quantum/keymap.h +++ b/quantum/keymap.h @@ -23,6 +23,9 @@ along with this program. If not, see . #include "action.h" #if defined(__AVR__) #include +#elif defined PROTOCOL_CHIBIOS +//We need to ensure that chibios is include before redefining reset +#include "ch.h" #endif #include "keycode.h" #include "action_macro.h" From 0419402ebeb19f98bcf44d3884d27426a9b22c0f Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Thu, 8 Feb 2018 09:23:50 +0200 Subject: [PATCH 27/31] Add missing include --- quantum/process_keycode/process_midi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 3b0847fe0b95..9728076dfd3d 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -16,6 +16,7 @@ #include "process_midi.h" #ifdef MIDI_ENABLE +#include #include "midi.h" #include "qmk_midi.h" From c6ee2c7e7a1a6bde36b1a229d6b7f27687586720 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Thu, 8 Feb 2018 09:48:05 +0200 Subject: [PATCH 28/31] Add number of endpoints check for ChibiOS --- tmk_core/protocol/usb_descriptor.h | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index ecdcb217192e..1eedfe5a5c90 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h @@ -45,6 +45,9 @@ #define _DESCRIPTORS_H_ #include +#ifdef PROTOCOL_CHIBIOS +#include "hal.h" +#endif typedef struct { @@ -246,19 +249,19 @@ typedef struct # define CDC_OUT_EPNUM MIDI_STREAM_OUT_EPNUM #endif -#if (defined(__AVR_ATmega32U2__) && CDC_OUT_EPNUM > 4) || \ - (defined(__AVR_ATmega32U4__) && CDC_OUT_EPNUM > 6) -# error "Endpoints are not available enough to support all functions. Remove some in Makefile.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL)" +#if (defined(PROTOCOL_LUFA) && CDC_OUT_EPNUM > (ENDPOINT_TOTAL_ENDPOINTS - 1)) || \ + (defined(PROTOCOL_CHIBIOS) && CDC_OUT_EPNUM > USB_MAX_ENDPOINTS) +# 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)" #endif #define KEYBOARD_EPSIZE 8 #define MOUSE_EPSIZE 8 #define EXTRAKEY_EPSIZE 8 -#define RAW_EPSIZE 32 +#define RAW_EPSIZE 32 #define CONSOLE_EPSIZE 32 #define NKRO_EPSIZE 32 #define MIDI_STREAM_EPSIZE 64 -#define CDC_NOTIFICATION_EPSIZE 8 +#define CDC_NOTIFICATION_EPSIZE 32 #define CDC_EPSIZE 16 uint16_t get_usb_descriptor(const uint16_t wValue, From 18861d4b68737414fe4eb5a762ef7f3f46e2239d Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Thu, 8 Feb 2018 10:24:22 +0200 Subject: [PATCH 29/31] Enable serial USB driver on all keyboards --- keyboards/chibios_test/stm32_f072_onekey/halconf.h | 2 +- keyboards/chibios_test/stm32_f103_onekey/halconf.h | 2 +- keyboards/chibios_test/teensy_lc_onekey/halconf.h | 2 +- keyboards/infinity60/halconf.h | 2 +- keyboards/jm60/halconf.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/keyboards/chibios_test/stm32_f072_onekey/halconf.h b/keyboards/chibios_test/stm32_f072_onekey/halconf.h index 1a450d632733..46b37a4f4696 100644 --- a/keyboards/chibios_test/stm32_f072_onekey/halconf.h +++ b/keyboards/chibios_test/stm32_f072_onekey/halconf.h @@ -139,7 +139,7 @@ * @brief Enables the SERIAL over USB subsystem. */ #if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE +#define HAL_USE_SERIAL_USB TRUE #endif /** diff --git a/keyboards/chibios_test/stm32_f103_onekey/halconf.h b/keyboards/chibios_test/stm32_f103_onekey/halconf.h index 1a450d632733..46b37a4f4696 100644 --- a/keyboards/chibios_test/stm32_f103_onekey/halconf.h +++ b/keyboards/chibios_test/stm32_f103_onekey/halconf.h @@ -139,7 +139,7 @@ * @brief Enables the SERIAL over USB subsystem. */ #if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE +#define HAL_USE_SERIAL_USB TRUE #endif /** diff --git a/keyboards/chibios_test/teensy_lc_onekey/halconf.h b/keyboards/chibios_test/teensy_lc_onekey/halconf.h index 0436408b09c6..f7121f1a9056 100644 --- a/keyboards/chibios_test/teensy_lc_onekey/halconf.h +++ b/keyboards/chibios_test/teensy_lc_onekey/halconf.h @@ -139,7 +139,7 @@ * @brief Enables the SERIAL over USB subsystem. */ #if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE +#define HAL_USE_SERIAL_USB TRUE #endif /** diff --git a/keyboards/infinity60/halconf.h b/keyboards/infinity60/halconf.h index f89dfc2e1ef0..b38031529881 100644 --- a/keyboards/infinity60/halconf.h +++ b/keyboards/infinity60/halconf.h @@ -139,7 +139,7 @@ * @brief Enables the SERIAL over USB subsystem. */ #if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE +#define HAL_USE_SERIAL_USB TRUE #endif /** diff --git a/keyboards/jm60/halconf.h b/keyboards/jm60/halconf.h index 1a450d632733..46b37a4f4696 100644 --- a/keyboards/jm60/halconf.h +++ b/keyboards/jm60/halconf.h @@ -139,7 +139,7 @@ * @brief Enables the SERIAL over USB subsystem. */ #if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE +#define HAL_USE_SERIAL_USB TRUE #endif /** From 320b82b7d9f7ab24228068ea68af0bda280c3670 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Thu, 8 Feb 2018 10:35:32 +0200 Subject: [PATCH 30/31] Add missing includes when API is enabled withot midi --- quantum/api/api_sysex.c | 1 + quantum/quantum.c | 4 ++++ tmk_core/protocol/midi/qmk_midi.c | 3 +++ 3 files changed, 8 insertions(+) diff --git a/quantum/api/api_sysex.c b/quantum/api/api_sysex.c index 6a2ee90124a0..89c66a2a20d0 100644 --- a/quantum/api/api_sysex.c +++ b/quantum/api/api_sysex.c @@ -16,6 +16,7 @@ #include "api_sysex.h" #include "sysex_tools.h" #include "print.h" +#include "qmk_midi.h" void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint16_t length) { // SEND_STRING("\nTX: "); diff --git a/quantum/quantum.c b/quantum/quantum.c index d3685f50b864..065594fe752d 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -34,6 +34,10 @@ extern backlight_config_t backlight_config; #include "fauxclicky.h" #endif +#ifdef API_ENABLE +#include "api.h" +#endif + #ifdef AUDIO_ENABLE #ifndef GOODBYE_SONG #define GOODBYE_SONG SONG(GOODBYE_SOUND) diff --git a/tmk_core/protocol/midi/qmk_midi.c b/tmk_core/protocol/midi/qmk_midi.c index 275c69863137..d4de6caa7dca 100644 --- a/tmk_core/protocol/midi/qmk_midi.c +++ b/tmk_core/protocol/midi/qmk_midi.c @@ -4,6 +4,9 @@ #include "midi.h" #include "usb_descriptor.h" #include "process_midi.h" +#if API_SYSEX_ENABLE +#include "api.h" +#endif /******************************************************************************* * MIDI From 6d0423875c5eebebc682dade8a97776a0026b07e Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Thu, 8 Feb 2018 10:50:30 +0200 Subject: [PATCH 31/31] Add another missing inlcude --- quantum/quantum.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/quantum/quantum.c b/quantum/quantum.c index 065594fe752d..bd95d5ea8088 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -38,6 +38,10 @@ extern backlight_config_t backlight_config; #include "api.h" #endif +#ifdef MIDI_ENABLE +#include "process_midi.h" +#endif + #ifdef AUDIO_ENABLE #ifndef GOODBYE_SONG #define GOODBYE_SONG SONG(GOODBYE_SOUND)