|
|
|
@ -23,77 +23,36 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
#include "compiler.h" |
|
|
|
|
#include "usb_protocol_hid.h" |
|
|
|
|
|
|
|
|
|
#define DEVICE_CLASS 0 |
|
|
|
|
#define DEVICE_SUBCLASS 0 |
|
|
|
|
#define DEVICE_PROTOCOL 0 |
|
|
|
|
|
|
|
|
|
#define KBD |
|
|
|
|
|
|
|
|
|
//#define MOUSE_ENABLE //rules.mk
|
|
|
|
|
#ifdef MOUSE_ENABLE |
|
|
|
|
# define MOU |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
//#define EXTRAKEY_ENABLE //rules.mk
|
|
|
|
|
#ifdef EXTRAKEY_ENABLE |
|
|
|
|
# define EXK |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
//#define RAW_ENABLE //rules.mk
|
|
|
|
|
#ifdef RAW_ENABLE |
|
|
|
|
# define RAW |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
//#define CONSOLE_ENABLE //rules.mk
|
|
|
|
|
#ifdef CONSOLE_ENABLE |
|
|
|
|
# define CON |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
//#define NKRO_ENABLE //rules.mk
|
|
|
|
|
#ifdef NKRO_ENABLE |
|
|
|
|
# define NKRO |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
//#define MIDI_ENABLE //deferred implementation
|
|
|
|
|
//#ifdef MIDI_ENABLE
|
|
|
|
|
//#define MIDI
|
|
|
|
|
//#endif
|
|
|
|
|
|
|
|
|
|
//#define VIRTSER_ENABLE //rules.mk
|
|
|
|
|
#ifdef VIRTSER_ENABLE |
|
|
|
|
# define CDC |
|
|
|
|
// because CDC uses IAD (interface association descriptor
|
|
|
|
|
// per USB Interface Association Descriptor Device Class Code and Use Model 7/23/2003 Rev 1.0)
|
|
|
|
|
# undef DEVICE_CLASS |
|
|
|
|
# define DEVICE_CLASS 0xEF |
|
|
|
|
# undef DEVICE_SUBCLASS |
|
|
|
|
# define DEVICE_SUBCLASS 0x02 |
|
|
|
|
# undef DEVICE_PROTOCOL |
|
|
|
|
# define DEVICE_PROTOCOL 0x01 |
|
|
|
|
#else |
|
|
|
|
# define DEVICE_CLASS 0x00 |
|
|
|
|
# define DEVICE_SUBCLASS 0x00 |
|
|
|
|
# define DEVICE_PROTOCOL 0x00 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* number of interfaces */ |
|
|
|
|
#define NEXT_INTERFACE_0 0 |
|
|
|
|
|
|
|
|
|
#ifdef KBD |
|
|
|
|
# define KEYBOARD_INTERFACE NEXT_INTERFACE_0 |
|
|
|
|
# define NEXT_INTERFACE_1 (KEYBOARD_INTERFACE + 1) |
|
|
|
|
# define UDI_HID_KBD_IFACE_NUMBER KEYBOARD_INTERFACE |
|
|
|
|
#else |
|
|
|
|
# define NEXT_INTERFACE_1 NEXT_INTERFACE_0 |
|
|
|
|
#endif |
|
|
|
|
#define KEYBOARD_INTERFACE NEXT_INTERFACE_0 |
|
|
|
|
#define NEXT_INTERFACE_1 (KEYBOARD_INTERFACE + 1) |
|
|
|
|
#define UDI_HID_KBD_IFACE_NUMBER KEYBOARD_INTERFACE |
|
|
|
|
|
|
|
|
|
// It is important that the Raw HID interface is at a constant
|
|
|
|
|
// interface number, to support Linux/OSX platforms and chrome.hid
|
|
|
|
|
// If Raw HID is enabled, let it be always 1.
|
|
|
|
|
#ifdef RAW |
|
|
|
|
#ifdef RAW_ENABLE |
|
|
|
|
# define RAW_INTERFACE NEXT_INTERFACE_1 |
|
|
|
|
# define NEXT_INTERFACE_2 (RAW_INTERFACE + 1) |
|
|
|
|
#else |
|
|
|
|
# define NEXT_INTERFACE_2 NEXT_INTERFACE_1 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MOU |
|
|
|
|
#ifdef MOUSE_ENABLE |
|
|
|
|
# define MOUSE_INTERFACE NEXT_INTERFACE_2 |
|
|
|
|
# define UDI_HID_MOU_IFACE_NUMBER MOUSE_INTERFACE |
|
|
|
|
# define NEXT_INTERFACE_3 (MOUSE_INTERFACE + 1) |
|
|
|
@ -101,7 +60,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
# define NEXT_INTERFACE_3 NEXT_INTERFACE_2 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef EXK |
|
|
|
|
#ifdef EXTRAKEY_ENABLE |
|
|
|
|
# define EXTRAKEY_INTERFACE NEXT_INTERFACE_3 |
|
|
|
|
# define NEXT_INTERFACE_4 (EXTRAKEY_INTERFACE + 1) |
|
|
|
|
# define UDI_HID_EXK_IFACE_NUMBER EXTRAKEY_INTERFACE |
|
|
|
@ -109,7 +68,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
# define NEXT_INTERFACE_4 NEXT_INTERFACE_3 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef CON |
|
|
|
|
#ifdef CONSOLE_ENABLE |
|
|
|
|
# define CON_INTERFACE NEXT_INTERFACE_4 |
|
|
|
|
# define NEXT_INTERFACE_5 (CON_INTERFACE + 1) |
|
|
|
|
# define UDI_HID_CON_IFACE_NUMBER CON_INTERFACE |
|
|
|
@ -117,7 +76,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
# define NEXT_INTERFACE_5 NEXT_INTERFACE_4 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef NKRO |
|
|
|
|
#ifdef NKRO_ENABLE |
|
|
|
|
# define NKRO_INTERFACE NEXT_INTERFACE_5 |
|
|
|
|
# define NEXT_INTERFACE_6 (NKRO_INTERFACE + 1) |
|
|
|
|
# define UDI_HID_NKRO_IFACE_NUMBER NKRO_INTERFACE |
|
|
|
@ -125,7 +84,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
# define NEXT_INTERFACE_6 NEXT_INTERFACE_5 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MIDI |
|
|
|
|
#ifdef MIDI_ENABLE |
|
|
|
|
# define AC_INTERFACE NEXT_INTERFACE_6 |
|
|
|
|
# define AS_INTERFACE (AC_INTERFACE + 1) |
|
|
|
|
# define NEXT_INTERFACE_7 (AS_INTERFACE + 1) |
|
|
|
@ -133,7 +92,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
# define NEXT_INTERFACE_7 NEXT_INTERFACE_6 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef CDC |
|
|
|
|
#ifdef VIRTSER_ENABLE |
|
|
|
|
# define CCI_INTERFACE NEXT_INTERFACE_7 |
|
|
|
|
# define CDI_INTERFACE (CCI_INTERFACE + 1) |
|
|
|
|
# define NEXT_INTERFACE_8 (CDI_INTERFACE + 1) |
|
|
|
@ -155,20 +114,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
#define NEXT_IN_EPNUM_0 1 |
|
|
|
|
#define NEXT_OUT_EPNUM_0 1 |
|
|
|
|
|
|
|
|
|
#ifdef KBD |
|
|
|
|
# define KEYBOARD_IN_EPNUM NEXT_IN_EPNUM_0 |
|
|
|
|
# define UDI_HID_KBD_EP_IN KEYBOARD_IN_EPNUM |
|
|
|
|
# define NEXT_IN_EPNUM_1 (KEYBOARD_IN_EPNUM + 1) |
|
|
|
|
# define UDI_HID_KBD_EP_SIZE KEYBOARD_EPSIZE |
|
|
|
|
# define KBD_POLLING_INTERVAL 10 |
|
|
|
|
# ifndef UDI_HID_KBD_STRING_ID |
|
|
|
|
# define UDI_HID_KBD_STRING_ID 0 |
|
|
|
|
# endif |
|
|
|
|
#else |
|
|
|
|
# define NEXT_IN_EPNUM_1 NEXT_IN_EPNUM_0 |
|
|
|
|
#define KEYBOARD_IN_EPNUM NEXT_IN_EPNUM_0 |
|
|
|
|
#define UDI_HID_KBD_EP_IN KEYBOARD_IN_EPNUM |
|
|
|
|
#define NEXT_IN_EPNUM_1 (KEYBOARD_IN_EPNUM + 1) |
|
|
|
|
#define UDI_HID_KBD_EP_SIZE KEYBOARD_EPSIZE |
|
|
|
|
#define KBD_POLLING_INTERVAL 10 |
|
|
|
|
#ifndef UDI_HID_KBD_STRING_ID |
|
|
|
|
# define UDI_HID_KBD_STRING_ID 0 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MOU |
|
|
|
|
#ifdef MOUSE_ENABLE |
|
|
|
|
# define MOUSE_IN_EPNUM NEXT_IN_EPNUM_1 |
|
|
|
|
# define NEXT_IN_EPNUM_2 (MOUSE_IN_EPNUM + 1) |
|
|
|
|
# define UDI_HID_MOU_EP_IN MOUSE_IN_EPNUM |
|
|
|
@ -181,7 +136,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
# define NEXT_IN_EPNUM_2 NEXT_IN_EPNUM_1 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef EXK |
|
|
|
|
#ifdef EXTRAKEY_ENABLE |
|
|
|
|
# define EXTRAKEY_IN_EPNUM NEXT_IN_EPNUM_2 |
|
|
|
|
# define UDI_HID_EXK_EP_IN EXTRAKEY_IN_EPNUM |
|
|
|
|
# define NEXT_IN_EPNUM_3 (EXTRAKEY_IN_EPNUM + 1) |
|
|
|
@ -194,7 +149,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
# define NEXT_IN_EPNUM_3 NEXT_IN_EPNUM_2 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef RAW |
|
|
|
|
#ifdef RAW_ENABLE |
|
|
|
|
# define RAW_IN_EPNUM NEXT_IN_EPNUM_3 |
|
|
|
|
# define UDI_HID_RAW_EP_IN RAW_IN_EPNUM |
|
|
|
|
# define NEXT_IN_EPNUM_4 (RAW_IN_EPNUM + 1) |
|
|
|
@ -210,7 +165,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
# define NEXT_OUT_EPNUM_1 NEXT_OUT_EPNUM_0 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef CON |
|
|
|
|
#ifdef CONSOLE_ENABLE |
|
|
|
|
# define CON_IN_EPNUM NEXT_IN_EPNUM_4 |
|
|
|
|
# define UDI_HID_CON_EP_IN CON_IN_EPNUM |
|
|
|
|
# define NEXT_IN_EPNUM_5 (CON_IN_EPNUM + 1) |
|
|
|
@ -226,7 +181,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
# define NEXT_OUT_EPNUM_2 NEXT_OUT_EPNUM_1 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef NKRO |
|
|
|
|
#ifdef NKRO_ENABLE |
|
|
|
|
# define NKRO_IN_EPNUM NEXT_IN_EPNUM_5 |
|
|
|
|
# define UDI_HID_NKRO_EP_IN NKRO_IN_EPNUM |
|
|
|
|
# define NEXT_IN_EPNUM_6 (NKRO_IN_EPNUM + 1) |
|
|
|
@ -239,7 +194,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
# define NEXT_IN_EPNUM_6 NEXT_IN_EPNUM_5 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MIDI |
|
|
|
|
#ifdef MIDI_ENABLE |
|
|
|
|
# define MIDI_STREAM_IN_EPNUM NEXT_IN_EPNUM_6 |
|
|
|
|
# define NEXT_IN_EPNUM_7 (MIDI_STREAM_IN_EPNUM + 1) |
|
|
|
|
# define MIDI_STREAM_OUT_EPNUM NEXT_OUT_EPNUM_2 |
|
|
|
@ -250,7 +205,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
# define NEXT_OUT_EPNUM_3 NEXT_OUT_EPNUM_2 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef CDC |
|
|
|
|
#ifdef VIRTSER_ENABLE |
|
|
|
|
# define CDC_NOTIFICATION_EPNUM NEXT_IN_EPNUM_7 |
|
|
|
|
# define CDC_ACM_ENDPOINT CDC_NOTIFICATION_EPNUM |
|
|
|
|
# define CDC_TX_ENDPOINT (CDC_NOTIFICATION_EPNUM + 1) |
|
|
|
@ -285,8 +240,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
// **********************************************************************
|
|
|
|
|
// KBD Descriptor structure and content
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
#ifdef KBD |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_SET(1) |
|
|
|
|
|
|
|
|
|
typedef struct { |
|
|
|
@ -299,8 +252,40 @@ typedef struct { |
|
|
|
|
uint8_t array[59]; |
|
|
|
|
} udi_hid_kbd_report_desc_t; |
|
|
|
|
|
|
|
|
|
# define UDI_HID_KBD_DESC \ |
|
|
|
|
{ .iface.bLength = sizeof(usb_iface_desc_t), .iface.bDescriptorType = USB_DT_INTERFACE, .iface.bInterfaceNumber = UDI_HID_KBD_IFACE_NUMBER, .iface.bAlternateSetting = 0, .iface.bNumEndpoints = 1, .iface.bInterfaceClass = HID_CLASS, .iface.bInterfaceSubClass = HID_SUB_CLASS_BOOT, .iface.bInterfaceProtocol = HID_PROTOCOL_KEYBOARD, .iface.iInterface = UDI_HID_KBD_STRING_ID, .hid.bLength = sizeof(usb_hid_descriptor_t), .hid.bDescriptorType = USB_DT_HID, .hid.bcdHID = LE16(USB_HID_BDC_V1_11), .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE, .hid.bNumDescriptors = USB_HID_NUM_DESC, .hid.bRDescriptorType = USB_DT_HID_REPORT, .hid.wDescriptorLength = LE16(sizeof(udi_hid_kbd_report_desc_t)), .ep.bLength = sizeof(usb_ep_desc_t), .ep.bDescriptorType = USB_DT_ENDPOINT, .ep.bEndpointAddress = UDI_HID_KBD_EP_IN | USB_EP_DIR_IN, .ep.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep.wMaxPacketSize = LE16(UDI_HID_KBD_EP_SIZE), .ep.bInterval = KBD_POLLING_INTERVAL, } |
|
|
|
|
// clang-format off
|
|
|
|
|
|
|
|
|
|
# define UDI_HID_KBD_DESC { \ |
|
|
|
|
.iface = { \
|
|
|
|
|
.bLength = sizeof(usb_iface_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_INTERFACE, \
|
|
|
|
|
.bInterfaceNumber = UDI_HID_KBD_IFACE_NUMBER, \
|
|
|
|
|
.bAlternateSetting = 0, \
|
|
|
|
|
.bNumEndpoints = 1, \
|
|
|
|
|
.bInterfaceClass = HID_CLASS, \
|
|
|
|
|
.bInterfaceSubClass = HID_SUB_CLASS_BOOT, \
|
|
|
|
|
.bInterfaceProtocol = HID_PROTOCOL_KEYBOARD, \
|
|
|
|
|
.iInterface = UDI_HID_KBD_STRING_ID, \
|
|
|
|
|
}, \
|
|
|
|
|
.hid = { \
|
|
|
|
|
.bLength = sizeof(usb_hid_descriptor_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_HID, \
|
|
|
|
|
.bcdHID = LE16(USB_HID_BDC_V1_11), \
|
|
|
|
|
.bCountryCode = USB_HID_NO_COUNTRY_CODE, \
|
|
|
|
|
.bNumDescriptors = USB_HID_NUM_DESC, \
|
|
|
|
|
.bRDescriptorType = USB_DT_HID_REPORT, \
|
|
|
|
|
.wDescriptorLength = LE16(sizeof(udi_hid_kbd_report_desc_t)), \
|
|
|
|
|
}, \
|
|
|
|
|
.ep = { \
|
|
|
|
|
.bLength = sizeof(usb_ep_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_ENDPOINT, \
|
|
|
|
|
.bEndpointAddress = UDI_HID_KBD_EP_IN | USB_EP_DIR_IN, \
|
|
|
|
|
.bmAttributes = USB_EP_TYPE_INTERRUPT, \
|
|
|
|
|
.wMaxPacketSize = LE16(UDI_HID_KBD_EP_SIZE), \
|
|
|
|
|
.bInterval = KBD_POLLING_INTERVAL \
|
|
|
|
|
} \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
|
|
// set report buffer (from host)
|
|
|
|
|
extern uint8_t udi_hid_kbd_report_set; |
|
|
|
@ -311,12 +296,10 @@ extern uint8_t udi_hid_kbd_report[UDI_HID_KBD_REPORT_SIZE]; |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_RESET() |
|
|
|
|
|
|
|
|
|
#endif // KBD
|
|
|
|
|
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
// EXK Descriptor structure and content
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
#ifdef EXK |
|
|
|
|
#ifdef EXTRAKEY_ENABLE |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_SET(1) |
|
|
|
|
|
|
|
|
@ -330,8 +313,40 @@ typedef struct { |
|
|
|
|
uint8_t array[50]; |
|
|
|
|
} udi_hid_exk_report_desc_t; |
|
|
|
|
|
|
|
|
|
# define UDI_HID_EXK_DESC \ |
|
|
|
|
{ .iface.bLength = sizeof(usb_iface_desc_t), .iface.bDescriptorType = USB_DT_INTERFACE, .iface.bInterfaceNumber = UDI_HID_EXK_IFACE_NUMBER, .iface.bAlternateSetting = 0, .iface.bNumEndpoints = 1, .iface.bInterfaceClass = HID_CLASS, .iface.bInterfaceSubClass = HID_SUB_CLASS_BOOT, .iface.bInterfaceProtocol = HID_PROTOCOL_GENERIC, .iface.iInterface = UDI_HID_EXK_STRING_ID, .hid.bLength = sizeof(usb_hid_descriptor_t), .hid.bDescriptorType = USB_DT_HID, .hid.bcdHID = LE16(USB_HID_BDC_V1_11), .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE, .hid.bNumDescriptors = USB_HID_NUM_DESC, .hid.bRDescriptorType = USB_DT_HID_REPORT, .hid.wDescriptorLength = LE16(sizeof(udi_hid_exk_report_desc_t)), .ep.bLength = sizeof(usb_ep_desc_t), .ep.bDescriptorType = USB_DT_ENDPOINT, .ep.bEndpointAddress = UDI_HID_EXK_EP_IN | USB_EP_DIR_IN, .ep.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep.wMaxPacketSize = LE16(UDI_HID_EXK_EP_SIZE), .ep.bInterval = EXTRAKEY_POLLING_INTERVAL, } |
|
|
|
|
// clang-format off
|
|
|
|
|
|
|
|
|
|
# define UDI_HID_EXK_DESC { \ |
|
|
|
|
.iface = { \
|
|
|
|
|
.bLength = sizeof(usb_iface_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_INTERFACE, \
|
|
|
|
|
.bInterfaceNumber = UDI_HID_EXK_IFACE_NUMBER, \
|
|
|
|
|
.bAlternateSetting = 0, \
|
|
|
|
|
.bNumEndpoints = 1, \
|
|
|
|
|
.bInterfaceClass = HID_CLASS, \
|
|
|
|
|
.bInterfaceSubClass = HID_SUB_CLASS_BOOT, \
|
|
|
|
|
.bInterfaceProtocol = HID_PROTOCOL_GENERIC, \
|
|
|
|
|
.iInterface = UDI_HID_EXK_STRING_ID \
|
|
|
|
|
}, \
|
|
|
|
|
.hid = { \
|
|
|
|
|
.bLength = sizeof(usb_hid_descriptor_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_HID, \
|
|
|
|
|
.bcdHID = LE16(USB_HID_BDC_V1_11), \
|
|
|
|
|
.bCountryCode = USB_HID_NO_COUNTRY_CODE, \
|
|
|
|
|
.bNumDescriptors = USB_HID_NUM_DESC, \
|
|
|
|
|
.bRDescriptorType = USB_DT_HID_REPORT, \
|
|
|
|
|
.wDescriptorLength = LE16(sizeof(udi_hid_exk_report_desc_t)) \
|
|
|
|
|
}, \
|
|
|
|
|
.ep = { \
|
|
|
|
|
.bLength = sizeof(usb_ep_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_ENDPOINT, \
|
|
|
|
|
.bEndpointAddress = UDI_HID_EXK_EP_IN | USB_EP_DIR_IN, \
|
|
|
|
|
.bmAttributes = USB_EP_TYPE_INTERRUPT, \
|
|
|
|
|
.wMaxPacketSize = LE16(UDI_HID_EXK_EP_SIZE), \
|
|
|
|
|
.bInterval = EXTRAKEY_POLLING_INTERVAL \
|
|
|
|
|
} \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
|
|
// set report buffer (from host)
|
|
|
|
|
extern uint8_t udi_hid_exk_report_set; |
|
|
|
@ -351,12 +366,12 @@ extern udi_hid_exk_report_t udi_hid_exk_report; |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_RESET() |
|
|
|
|
|
|
|
|
|
#endif // EXK
|
|
|
|
|
#endif // EXTRAKEY_ENABLE
|
|
|
|
|
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
// NKRO Descriptor structure and content
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
#ifdef NKRO |
|
|
|
|
#ifdef NKRO_ENABLE |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_SET(1) |
|
|
|
|
|
|
|
|
@ -370,8 +385,40 @@ typedef struct { |
|
|
|
|
uint8_t array[57]; |
|
|
|
|
} udi_hid_nkro_report_desc_t; |
|
|
|
|
|
|
|
|
|
# define UDI_HID_NKRO_DESC \ |
|
|
|
|
{ .iface.bLength = sizeof(usb_iface_desc_t), .iface.bDescriptorType = USB_DT_INTERFACE, .iface.bInterfaceNumber = UDI_HID_NKRO_IFACE_NUMBER, .iface.bAlternateSetting = 0, .iface.bNumEndpoints = 1, .iface.bInterfaceClass = HID_CLASS, .iface.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT, .iface.bInterfaceProtocol = HID_PROTOCOL_KEYBOARD, .iface.iInterface = UDI_HID_NKRO_STRING_ID, .hid.bLength = sizeof(usb_hid_descriptor_t), .hid.bDescriptorType = USB_DT_HID, .hid.bcdHID = LE16(USB_HID_BDC_V1_11), .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE, .hid.bNumDescriptors = USB_HID_NUM_DESC, .hid.bRDescriptorType = USB_DT_HID_REPORT, .hid.wDescriptorLength = LE16(sizeof(udi_hid_nkro_report_desc_t)), .ep.bLength = sizeof(usb_ep_desc_t), .ep.bDescriptorType = USB_DT_ENDPOINT, .ep.bEndpointAddress = UDI_HID_NKRO_EP_IN | USB_EP_DIR_IN, .ep.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep.wMaxPacketSize = LE16(UDI_HID_NKRO_EP_SIZE), .ep.bInterval = NKRO_POLLING_INTERVAL, } |
|
|
|
|
// clang-format off
|
|
|
|
|
|
|
|
|
|
# define UDI_HID_NKRO_DESC { \ |
|
|
|
|
.iface = { \
|
|
|
|
|
.bLength = sizeof(usb_iface_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_INTERFACE, \
|
|
|
|
|
.bInterfaceNumber = UDI_HID_NKRO_IFACE_NUMBER, \
|
|
|
|
|
.bAlternateSetting = 0, \
|
|
|
|
|
.bNumEndpoints = 1, \
|
|
|
|
|
.bInterfaceClass = HID_CLASS, \
|
|
|
|
|
.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT, \
|
|
|
|
|
.bInterfaceProtocol = HID_PROTOCOL_KEYBOARD, \
|
|
|
|
|
.iInterface = UDI_HID_NKRO_STRING_ID \
|
|
|
|
|
}, \
|
|
|
|
|
.hid = { \
|
|
|
|
|
.bLength = sizeof(usb_hid_descriptor_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_HID, \
|
|
|
|
|
.bcdHID = LE16(USB_HID_BDC_V1_11), \
|
|
|
|
|
.bCountryCode = USB_HID_NO_COUNTRY_CODE, \
|
|
|
|
|
.bNumDescriptors = USB_HID_NUM_DESC, \
|
|
|
|
|
.bRDescriptorType = USB_DT_HID_REPORT, \
|
|
|
|
|
.wDescriptorLength = LE16(sizeof(udi_hid_nkro_report_desc_t)) \
|
|
|
|
|
}, \
|
|
|
|
|
.ep = { \
|
|
|
|
|
.bLength = sizeof(usb_ep_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_ENDPOINT, \
|
|
|
|
|
.bEndpointAddress = UDI_HID_NKRO_EP_IN | USB_EP_DIR_IN, \
|
|
|
|
|
.bmAttributes = USB_EP_TYPE_INTERRUPT, \
|
|
|
|
|
.wMaxPacketSize = LE16(UDI_HID_NKRO_EP_SIZE), \
|
|
|
|
|
.bInterval = NKRO_POLLING_INTERVAL \
|
|
|
|
|
} \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
|
|
// set report buffer
|
|
|
|
|
extern uint8_t udi_hid_nkro_report_set; |
|
|
|
@ -382,12 +429,12 @@ extern uint8_t udi_hid_nkro_report[UDI_HID_NKRO_REPORT_SIZE]; |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_RESET() |
|
|
|
|
|
|
|
|
|
#endif // NKRO
|
|
|
|
|
#endif // NKRO_ENABLE
|
|
|
|
|
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
// MOU Descriptor structure and content
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
#ifdef MOU |
|
|
|
|
#ifdef MOUSE_ENABLE |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_SET(1) |
|
|
|
|
|
|
|
|
@ -401,10 +448,40 @@ typedef struct { |
|
|
|
|
uint8_t array[77]; // MOU PDS
|
|
|
|
|
} udi_hid_mou_report_desc_t; |
|
|
|
|
|
|
|
|
|
# define UDI_HID_MOU_DESC \ |
|
|
|
|
{ .iface.bLength = sizeof(usb_iface_desc_t), .iface.bDescriptorType = USB_DT_INTERFACE, .iface.bInterfaceNumber = MOUSE_INTERFACE, .iface.bAlternateSetting = 0, .iface.bNumEndpoints = 1, .iface.bInterfaceClass = HID_CLASS, .iface.bInterfaceSubClass = HID_SUB_CLASS_BOOT, .iface.bInterfaceProtocol = HID_PROTOCOL_MOUSE, .iface.iInterface = UDI_HID_MOU_STRING_ID, .hid.bLength = sizeof(usb_hid_descriptor_t), .hid.bDescriptorType = USB_DT_HID, .hid.bcdHID = LE16(USB_HID_BDC_V1_11), .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE, .hid.bNumDescriptors = USB_HID_NUM_DESC, .hid.bRDescriptorType = USB_DT_HID_REPORT, .hid.wDescriptorLength = LE16(sizeof(udi_hid_mou_report_desc_t)), .ep.bLength = sizeof(usb_ep_desc_t), .ep.bDescriptorType = USB_DT_ENDPOINT, .ep.bEndpointAddress = UDI_HID_MOU_EP_IN | USB_EP_DIR_IN, .ep.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep.wMaxPacketSize = LE16(UDI_HID_MOU_EP_SIZE), .ep.bInterval = MOU_POLLING_INTERVAL, } |
|
|
|
|
|
|
|
|
|
// no set report buffer
|
|
|
|
|
// clang-format off
|
|
|
|
|
|
|
|
|
|
# define UDI_HID_MOU_DESC { \ |
|
|
|
|
.iface = { \
|
|
|
|
|
.bLength = sizeof(usb_iface_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_INTERFACE, \
|
|
|
|
|
.bInterfaceNumber = MOUSE_INTERFACE, \
|
|
|
|
|
.bAlternateSetting = 0, \
|
|
|
|
|
.bNumEndpoints = 1, \
|
|
|
|
|
.bInterfaceClass = HID_CLASS, \
|
|
|
|
|
.bInterfaceSubClass = HID_SUB_CLASS_BOOT, \
|
|
|
|
|
.bInterfaceProtocol = HID_PROTOCOL_MOUSE, \
|
|
|
|
|
.iInterface = UDI_HID_MOU_STRING_ID \
|
|
|
|
|
}, \
|
|
|
|
|
.hid = { \
|
|
|
|
|
.bLength = sizeof(usb_hid_descriptor_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_HID, \
|
|
|
|
|
.bcdHID = LE16(USB_HID_BDC_V1_11), \
|
|
|
|
|
.bCountryCode = USB_HID_NO_COUNTRY_CODE, \
|
|
|
|
|
.bNumDescriptors = USB_HID_NUM_DESC, \
|
|
|
|
|
.bRDescriptorType = USB_DT_HID_REPORT, \
|
|
|
|
|
.wDescriptorLength = LE16(sizeof(udi_hid_mou_report_desc_t)) \
|
|
|
|
|
}, \
|
|
|
|
|
.ep = { \
|
|
|
|
|
.bLength = sizeof(usb_ep_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_ENDPOINT, \
|
|
|
|
|
.bEndpointAddress = UDI_HID_MOU_EP_IN | USB_EP_DIR_IN, \
|
|
|
|
|
.bmAttributes = USB_EP_TYPE_INTERRUPT, \
|
|
|
|
|
.wMaxPacketSize = LE16(UDI_HID_MOU_EP_SIZE), \
|
|
|
|
|
.bInterval = MOU_POLLING_INTERVAL \
|
|
|
|
|
} \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
|
|
// report buffer
|
|
|
|
|
# define UDI_HID_MOU_REPORT_SIZE 5 // MOU PDS
|
|
|
|
@ -412,12 +489,12 @@ extern uint8_t udi_hid_mou_report[UDI_HID_MOU_REPORT_SIZE]; |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_RESET() |
|
|
|
|
|
|
|
|
|
#endif // MOU
|
|
|
|
|
#endif // MOUSE_ENABLE
|
|
|
|
|
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
// RAW Descriptor structure and content
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
#ifdef RAW |
|
|
|
|
#ifdef RAW_ENABLE |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_SET(1) |
|
|
|
|
|
|
|
|
@ -432,11 +509,48 @@ typedef struct { |
|
|
|
|
uint8_t array[26]; |
|
|
|
|
} udi_hid_raw_report_desc_t; |
|
|
|
|
|
|
|
|
|
# define UDI_HID_RAW_DESC \ |
|
|
|
|
{ \
|
|
|
|
|
.iface.bLength = sizeof(usb_iface_desc_t), .iface.bDescriptorType = USB_DT_INTERFACE, .iface.bInterfaceNumber = RAW_INTERFACE, .iface.bAlternateSetting = 0, .iface.bNumEndpoints = 2, .iface.bInterfaceClass = HID_CLASS, .iface.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT, .iface.bInterfaceProtocol = HID_SUB_CLASS_NOBOOT, .iface.iInterface = UDI_HID_RAW_STRING_ID, .hid.bLength = sizeof(usb_hid_descriptor_t), .hid.bDescriptorType = USB_DT_HID, .hid.bcdHID = LE16(USB_HID_BDC_V1_11), .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE, .hid.bNumDescriptors = USB_HID_NUM_DESC, .hid.bRDescriptorType = USB_DT_HID_REPORT, .hid.wDescriptorLength = LE16(sizeof(udi_hid_raw_report_desc_t)), .ep_out.bLength = sizeof(usb_ep_desc_t), .ep_out.bDescriptorType = USB_DT_ENDPOINT, .ep_out.bEndpointAddress = UDI_HID_RAW_EP_OUT | USB_EP_DIR_OUT, .ep_out.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep_out.wMaxPacketSize = LE16(RAW_EPSIZE), .ep_out.bInterval = RAW_POLLING_INTERVAL, \
|
|
|
|
|
.ep_in.bLength = sizeof(usb_ep_desc_t), .ep_in.bDescriptorType = USB_DT_ENDPOINT, .ep_in.bEndpointAddress = UDI_HID_RAW_EP_IN | USB_EP_DIR_IN, .ep_in.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep_in.wMaxPacketSize = LE16(RAW_EPSIZE), .ep_in.bInterval = RAW_POLLING_INTERVAL, \
|
|
|
|
|
} |
|
|
|
|
// clang-format off
|
|
|
|
|
|
|
|
|
|
# define UDI_HID_RAW_DESC { \ |
|
|
|
|
.iface = { \
|
|
|
|
|
.bLength = sizeof(usb_iface_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_INTERFACE, \
|
|
|
|
|
.bInterfaceNumber = RAW_INTERFACE, \
|
|
|
|
|
.bAlternateSetting = 0, \
|
|
|
|
|
.bNumEndpoints = 2, \
|
|
|
|
|
.bInterfaceClass = HID_CLASS, \
|
|
|
|
|
.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT, \
|
|
|
|
|
.bInterfaceProtocol = HID_SUB_CLASS_NOBOOT, \
|
|
|
|
|
.iInterface = UDI_HID_RAW_STRING_ID \
|
|
|
|
|
}, \
|
|
|
|
|
.hid = { \
|
|
|
|
|
.bLength = sizeof(usb_hid_descriptor_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_HID, \
|
|
|
|
|
.bcdHID = LE16(USB_HID_BDC_V1_11), \
|
|
|
|
|
.bCountryCode = USB_HID_NO_COUNTRY_CODE, \
|
|
|
|
|
.bNumDescriptors = USB_HID_NUM_DESC, \
|
|
|
|
|
.bRDescriptorType = USB_DT_HID_REPORT, \
|
|
|
|
|
.wDescriptorLength = LE16(sizeof(udi_hid_raw_report_desc_t)) \
|
|
|
|
|
}, \
|
|
|
|
|
.ep_out = { \
|
|
|
|
|
.bLength = sizeof(usb_ep_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_ENDPOINT, \
|
|
|
|
|
.bEndpointAddress = UDI_HID_RAW_EP_OUT | USB_EP_DIR_OUT, \
|
|
|
|
|
.bmAttributes = USB_EP_TYPE_INTERRUPT, \
|
|
|
|
|
.wMaxPacketSize = LE16(RAW_EPSIZE), \
|
|
|
|
|
.bInterval = RAW_POLLING_INTERVAL \
|
|
|
|
|
}, \
|
|
|
|
|
.ep_in = { \
|
|
|
|
|
.bLength = sizeof(usb_ep_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_ENDPOINT, \
|
|
|
|
|
.bEndpointAddress = UDI_HID_RAW_EP_IN | USB_EP_DIR_IN, \
|
|
|
|
|
.bmAttributes = USB_EP_TYPE_INTERRUPT, \
|
|
|
|
|
.wMaxPacketSize = LE16(RAW_EPSIZE), \
|
|
|
|
|
.bInterval = RAW_POLLING_INTERVAL \
|
|
|
|
|
} \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
|
|
# define UDI_HID_RAW_REPORT_SIZE RAW_EPSIZE |
|
|
|
|
|
|
|
|
@ -447,12 +561,12 @@ extern uint8_t udi_hid_raw_report[UDI_HID_RAW_REPORT_SIZE]; |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_RESET() |
|
|
|
|
|
|
|
|
|
#endif // RAW
|
|
|
|
|
#endif // RAW_ENABLE
|
|
|
|
|
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
// CON Descriptor structure and content
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
#ifdef CON |
|
|
|
|
#ifdef CONSOLE_ENABLE |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_SET(1) |
|
|
|
|
|
|
|
|
@ -467,11 +581,48 @@ typedef struct { |
|
|
|
|
uint8_t array[34]; |
|
|
|
|
} udi_hid_con_report_desc_t; |
|
|
|
|
|
|
|
|
|
# define UDI_HID_CON_DESC \ |
|
|
|
|
{ \
|
|
|
|
|
.iface.bLength = sizeof(usb_iface_desc_t), .iface.bDescriptorType = USB_DT_INTERFACE, .iface.bInterfaceNumber = UDI_HID_CON_IFACE_NUMBER, .iface.bAlternateSetting = 0, .iface.bNumEndpoints = 2, .iface.bInterfaceClass = HID_CLASS, .iface.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT, .iface.bInterfaceProtocol = HID_SUB_CLASS_NOBOOT, .iface.iInterface = UDI_HID_CON_STRING_ID, .hid.bLength = sizeof(usb_hid_descriptor_t), .hid.bDescriptorType = USB_DT_HID, .hid.bcdHID = LE16(USB_HID_BDC_V1_11), .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE, .hid.bNumDescriptors = USB_HID_NUM_DESC, .hid.bRDescriptorType = USB_DT_HID_REPORT, .hid.wDescriptorLength = LE16(sizeof(udi_hid_con_report_desc_t)), .ep_out.bLength = sizeof(usb_ep_desc_t), .ep_out.bDescriptorType = USB_DT_ENDPOINT, .ep_out.bEndpointAddress = UDI_HID_CON_EP_OUT | USB_EP_DIR_OUT, .ep_out.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep_out.wMaxPacketSize = LE16(CONSOLE_EPSIZE), .ep_out.bInterval = CON_POLLING_INTERVAL, \
|
|
|
|
|
.ep_in.bLength = sizeof(usb_ep_desc_t), .ep_in.bDescriptorType = USB_DT_ENDPOINT, .ep_in.bEndpointAddress = UDI_HID_CON_EP_IN | USB_EP_DIR_IN, .ep_in.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep_in.wMaxPacketSize = LE16(CONSOLE_EPSIZE), .ep_in.bInterval = CON_POLLING_INTERVAL, \
|
|
|
|
|
} |
|
|
|
|
// clang-format off
|
|
|
|
|
|
|
|
|
|
# define UDI_HID_CON_DESC { \ |
|
|
|
|
.iface = { \
|
|
|
|
|
.bLength = sizeof(usb_iface_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_INTERFACE, \
|
|
|
|
|
.bInterfaceNumber = UDI_HID_CON_IFACE_NUMBER, \
|
|
|
|
|
.bAlternateSetting = 0, \
|
|
|
|
|
.bNumEndpoints = 2, \
|
|
|
|
|
.bInterfaceClass = HID_CLASS, \
|
|
|
|
|
.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT, \
|
|
|
|
|
.bInterfaceProtocol = HID_SUB_CLASS_NOBOOT, \
|
|
|
|
|
.iInterface = UDI_HID_CON_STRING_ID \
|
|
|
|
|
}, \
|
|
|
|
|
.hid = { \
|
|
|
|
|
.bLength = sizeof(usb_hid_descriptor_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_HID, \
|
|
|
|
|
.bcdHID = LE16(USB_HID_BDC_V1_11), \
|
|
|
|
|
.bCountryCode = USB_HID_NO_COUNTRY_CODE, \
|
|
|
|
|
.bNumDescriptors = USB_HID_NUM_DESC, \
|
|
|
|
|
.bRDescriptorType = USB_DT_HID_REPORT, \
|
|
|
|
|
.wDescriptorLength = LE16(sizeof(udi_hid_con_report_desc_t)) \
|
|
|
|
|
}, \
|
|
|
|
|
.ep_out = { \
|
|
|
|
|
.bLength = sizeof(usb_ep_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_ENDPOINT, \
|
|
|
|
|
.bEndpointAddress = UDI_HID_CON_EP_OUT | USB_EP_DIR_OUT, \
|
|
|
|
|
.bmAttributes = USB_EP_TYPE_INTERRUPT, \
|
|
|
|
|
.wMaxPacketSize = LE16(CONSOLE_EPSIZE), \
|
|
|
|
|
.bInterval = CON_POLLING_INTERVAL \
|
|
|
|
|
}, \
|
|
|
|
|
.ep_in = { \
|
|
|
|
|
.bLength = sizeof(usb_ep_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_ENDPOINT, \
|
|
|
|
|
.bEndpointAddress = UDI_HID_CON_EP_IN | USB_EP_DIR_IN, \
|
|
|
|
|
.bmAttributes = USB_EP_TYPE_INTERRUPT, \
|
|
|
|
|
.wMaxPacketSize = LE16(CONSOLE_EPSIZE), \
|
|
|
|
|
.bInterval = CON_POLLING_INTERVAL \
|
|
|
|
|
} \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
|
|
# define UDI_HID_CON_REPORT_SIZE CONSOLE_EPSIZE |
|
|
|
|
|
|
|
|
@ -482,12 +633,12 @@ extern uint8_t udi_hid_con_report[UDI_HID_CON_REPORT_SIZE]; |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_RESET() |
|
|
|
|
|
|
|
|
|
#endif // CON
|
|
|
|
|
#endif // CONSOLE_ENABLE
|
|
|
|
|
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
// CDC Descriptor structure and content
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
#ifdef CDC |
|
|
|
|
#ifdef VIRTSER_ENABLE |
|
|
|
|
|
|
|
|
|
COMPILER_PACK_SET(1) |
|
|
|
|
|
|
|
|
@ -534,16 +685,98 @@ typedef struct { |
|
|
|
|
usb_ep_desc_t ep_rx; |
|
|
|
|
} udi_cdc_desc_t; |
|
|
|
|
|
|
|
|
|
# define CDC_DESCRIPTOR \ |
|
|
|
|
{ \
|
|
|
|
|
.iaface.bLength = sizeof(usb_association_desc_t), .iaface.bDescriptorType = USB_DT_IAD, .iaface.bFirstInterface = CDC_STATUS_INTERFACE, .iaface.bInterfaceCount = 2, .iaface.bFunctionClass = CDC_CLASS_DEVICE, .iaface.bFunctionSubClass = CDC_SUBCLASS_ACM, .iaface.bFunctionProtocol = CDC_PROTOCOL_V25TER, .iaface.iFunction = 0, .iface_c.bLength = sizeof(usb_iface_desc_t), .iface_c.bDescriptorType = USB_DT_INTERFACE, .iface_c.bInterfaceNumber = CDC_STATUS_INTERFACE, .iface_c.bAlternateSetting = 0, .iface_c.bNumEndpoints = 1, .iface_c.bInterfaceClass = 0x02, .iface_c.bInterfaceSubClass = 0x02, .iface_c.bInterfaceProtocol = CDC_PROTOCOL_V25TER, .iface_c.iInterface = 0, .fd.bFunctionLength = sizeof(usb_cdc_hdr_desc_t), .fd.bDescriptorType = CDC_CS_INTERFACE, .fd.bDescriptorSubtype = CDC_SCS_HEADER, .fd.bcdCDC = 0x0110, .mfd.bFunctionLength = sizeof(usb_cdc_call_mgmt_desc_t), .mfd.bDescriptorType = CDC_CS_INTERFACE, .mfd.bDescriptorSubtype = CDC_SCS_CALL_MGMT, \
|
|
|
|
|
.mfd.bmCapabilities = CDC_CALL_MGMT_SUPPORTED, .mfd.bDataInterface = CDC_DATA_INTERFACE, .acmd.bFunctionLength = sizeof(usb_cdc_acm_desc_t), .acmd.bDescriptorType = CDC_CS_INTERFACE, .acmd.bDescriptorSubtype = CDC_SCS_ACM, .acmd.bmCapabilities = CDC_ACM_SUPPORT_LINE_REQUESTS, .ufd.bFunctionLength = sizeof(usb_cdc_union_desc_t), .ufd.bDescriptorType = CDC_CS_INTERFACE, .ufd.bDescriptorSubtype = CDC_SCS_UNION, .ufd.bMasterInterface = CDC_STATUS_INTERFACE, .ufd.bSlaveInterface0 = CDC_DATA_INTERFACE, .ep_c.bLength = sizeof(usb_ep_desc_t), .ep_c.bDescriptorType = USB_DT_ENDPOINT, .ep_c.bEndpointAddress = CDC_ACM_ENDPOINT | USB_EP_DIR_IN, .ep_c.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep_c.wMaxPacketSize = LE16(CDC_ACM_SIZE), .ep_c.bInterval = CDC_EP_INTERVAL_STATUS, .iface_d.bLength = sizeof(usb_iface_desc_t), .iface_d.bDescriptorType = USB_DT_INTERFACE, .iface_d.bInterfaceNumber = CDC_DATA_INTERFACE, .iface_d.bAlternateSetting = 0, .iface_d.bNumEndpoints = 2, \
|
|
|
|
|
.iface_d.bInterfaceClass = CDC_CLASS_DATA, .iface_d.bInterfaceSubClass = 0, .iface_d.bInterfaceProtocol = 0, .iface_d.iInterface = 0, .ep_rx.bLength = sizeof(usb_ep_desc_t), .ep_rx.bDescriptorType = USB_DT_ENDPOINT, .ep_rx.bEndpointAddress = CDC_RX_ENDPOINT | USB_EP_DIR_OUT, .ep_rx.bmAttributes = USB_EP_TYPE_BULK, .ep_rx.wMaxPacketSize = LE16(CDC_RX_SIZE), .ep_rx.bInterval = CDC_EP_INTERVAL_DATA, .ep_tx.bLength = sizeof(usb_ep_desc_t), .ep_tx.bDescriptorType = USB_DT_ENDPOINT, .ep_tx.bEndpointAddress = CDC_TX_ENDPOINT | USB_EP_DIR_IN, .ep_tx.bmAttributes = USB_EP_TYPE_BULK, .ep_tx.wMaxPacketSize = LE16(CDC_TX_SIZE), .ep_tx.bInterval = CDC_EP_INTERVAL_DATA, \
|
|
|
|
|
} |
|
|
|
|
// clang-format off
|
|
|
|
|
|
|
|
|
|
# define CDC_DESCRIPTOR { \ |
|
|
|
|
.iaface = { \
|
|
|
|
|
.bLength = sizeof(usb_association_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_IAD, \
|
|
|
|
|
.bFirstInterface = CDC_STATUS_INTERFACE, \
|
|
|
|
|
.bInterfaceCount = 2, \
|
|
|
|
|
.bFunctionClass = CDC_CLASS_DEVICE, \
|
|
|
|
|
.bFunctionSubClass = CDC_SUBCLASS_ACM, \
|
|
|
|
|
.bFunctionProtocol = CDC_PROTOCOL_V25TER, \
|
|
|
|
|
.iFunction = 0 \
|
|
|
|
|
}, \
|
|
|
|
|
.iface_c = { \
|
|
|
|
|
.bLength = sizeof(usb_iface_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_INTERFACE, \
|
|
|
|
|
.bInterfaceNumber = CDC_STATUS_INTERFACE, \
|
|
|
|
|
.bAlternateSetting = 0, \
|
|
|
|
|
.bNumEndpoints = 1, \
|
|
|
|
|
.bInterfaceClass = 0x02, \
|
|
|
|
|
.bInterfaceSubClass = 0x02, \
|
|
|
|
|
.bInterfaceProtocol = CDC_PROTOCOL_V25TER, \
|
|
|
|
|
.iInterface = 0 \
|
|
|
|
|
}, \
|
|
|
|
|
.fd = { \
|
|
|
|
|
.bFunctionLength = sizeof(usb_cdc_hdr_desc_t), \
|
|
|
|
|
.bDescriptorType = CDC_CS_INTERFACE, \
|
|
|
|
|
.bDescriptorSubtype = CDC_SCS_HEADER, \
|
|
|
|
|
.bcdCDC = 0x0110 \
|
|
|
|
|
}, \
|
|
|
|
|
.mfd = { \
|
|
|
|
|
.bFunctionLength = sizeof(usb_cdc_call_mgmt_desc_t), \
|
|
|
|
|
.bDescriptorType = CDC_CS_INTERFACE, \
|
|
|
|
|
.bDescriptorSubtype = CDC_SCS_CALL_MGMT, \
|
|
|
|
|
.bmCapabilities = CDC_CALL_MGMT_SUPPORTED, \
|
|
|
|
|
.bDataInterface = CDC_DATA_INTERFACE \
|
|
|
|
|
}, \
|
|
|
|
|
.acmd = { \
|
|
|
|
|
.bFunctionLength = sizeof(usb_cdc_acm_desc_t), \
|
|
|
|
|
.bDescriptorType = CDC_CS_INTERFACE, \
|
|
|
|
|
.bDescriptorSubtype = CDC_SCS_ACM, \
|
|
|
|
|
.bmCapabilities = CDC_ACM_SUPPORT_LINE_REQUESTS \
|
|
|
|
|
}, \
|
|
|
|
|
.ufd = { \
|
|
|
|
|
.bFunctionLength = sizeof(usb_cdc_union_desc_t), \
|
|
|
|
|
.bDescriptorType = CDC_CS_INTERFACE, \
|
|
|
|
|
.bDescriptorSubtype = CDC_SCS_UNION, \
|
|
|
|
|
.bMasterInterface = CDC_STATUS_INTERFACE, \
|
|
|
|
|
.bSlaveInterface0 = CDC_DATA_INTERFACE \
|
|
|
|
|
}, \
|
|
|
|
|
.ep_c = { \
|
|
|
|
|
.bLength = sizeof(usb_ep_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_ENDPOINT, \
|
|
|
|
|
.bEndpointAddress = CDC_ACM_ENDPOINT | USB_EP_DIR_IN, \
|
|
|
|
|
.bmAttributes = USB_EP_TYPE_INTERRUPT, \
|
|
|
|
|
.wMaxPacketSize = LE16(CDC_ACM_SIZE), \
|
|
|
|
|
.bInterval = CDC_EP_INTERVAL_STATUS \
|
|
|
|
|
}, \
|
|
|
|
|
.iface_d = { \
|
|
|
|
|
.bLength = sizeof(usb_iface_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_INTERFACE, \
|
|
|
|
|
.bInterfaceNumber = CDC_DATA_INTERFACE, \
|
|
|
|
|
.bAlternateSetting = 0, \
|
|
|
|
|
.bNumEndpoints = 2, \
|
|
|
|
|
.bInterfaceClass = CDC_CLASS_DATA, \
|
|
|
|
|
.bInterfaceSubClass = 0, \
|
|
|
|
|
.bInterfaceProtocol = 0, \
|
|
|
|
|
.iInterface = 0 \
|
|
|
|
|
}, \
|
|
|
|
|
.ep_rx = { \
|
|
|
|
|
.bLength = sizeof(usb_ep_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_ENDPOINT, \
|
|
|
|
|
.bEndpointAddress = CDC_RX_ENDPOINT | USB_EP_DIR_OUT, \
|
|
|
|
|
.bmAttributes = USB_EP_TYPE_BULK, \
|
|
|
|
|
.wMaxPacketSize = LE16(CDC_RX_SIZE), \
|
|
|
|
|
.bInterval = CDC_EP_INTERVAL_DATA \
|
|
|
|
|
}, \
|
|
|
|
|
.ep_tx = { \
|
|
|
|
|
.bLength = sizeof(usb_ep_desc_t), \
|
|
|
|
|
.bDescriptorType = USB_DT_ENDPOINT, \
|
|
|
|
|
.bEndpointAddress = CDC_TX_ENDPOINT | USB_EP_DIR_IN, \
|
|
|
|
|
.bmAttributes = USB_EP_TYPE_BULK, \
|
|
|
|
|
.wMaxPacketSize = LE16(CDC_TX_SIZE), \
|
|
|
|
|
.bInterval = CDC_EP_INTERVAL_DATA \
|
|
|
|
|
} \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
|
|
COMPILER_PACK_RESET() |
|
|
|
|
|
|
|
|
|
#endif // CDC
|
|
|
|
|
#endif // VIRTSER_ENABLE
|
|
|
|
|
|
|
|
|
|
// **********************************************************************
|
|
|
|
|
// CONFIGURATION Descriptor structure and content
|
|
|
|
@ -552,28 +785,26 @@ COMPILER_PACK_SET(1) |
|
|
|
|
|
|
|
|
|
typedef struct { |
|
|
|
|
usb_conf_desc_t conf; |
|
|
|
|
#ifdef KBD |
|
|
|
|
udi_hid_kbd_desc_t hid_kbd; |
|
|
|
|
#endif |
|
|
|
|
#ifdef MOU |
|
|
|
|
#ifdef MOUSE_ENABLE |
|
|
|
|
udi_hid_mou_desc_t hid_mou; |
|
|
|
|
#endif |
|
|
|
|
#ifdef EXK |
|
|
|
|
#ifdef EXTRAKEY_ENABLE |
|
|
|
|
udi_hid_exk_desc_t hid_exk; |
|
|
|
|
#endif |
|
|
|
|
#ifdef RAW |
|
|
|
|
#ifdef RAW_ENABLE |
|
|
|
|
udi_hid_raw_desc_t hid_raw; |
|
|
|
|
#endif |
|
|
|
|
#ifdef CON |
|
|
|
|
#ifdef CONSOLE_ENABLE |
|
|
|
|
udi_hid_con_desc_t hid_con; |
|
|
|
|
#endif |
|
|
|
|
#ifdef NKRO |
|
|
|
|
#ifdef NKRO_ENABLE |
|
|
|
|
udi_hid_nkro_desc_t hid_nkro; |
|
|
|
|
#endif |
|
|
|
|
#ifdef MIDI |
|
|
|
|
#ifdef MIDI_ENABLE |
|
|
|
|
udi_hid_midi_desc_t hid_midi; |
|
|
|
|
#endif |
|
|
|
|
#ifdef CDC |
|
|
|
|
#ifdef VIRTSER_ENABLE |
|
|
|
|
udi_cdc_desc_t cdc_serial; |
|
|
|
|
#endif |
|
|
|
|
} udc_desc_t; |
|
|
|
|