From ad15e39e30be9f4a32303b937eff08aafd822d7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sun, 28 Feb 2016 23:16:50 +0100 Subject: [PATCH] Add generic HID interface. --- right/build/kds/.project | 20 +++++++ right/composite.c | 25 ++++++-- right/composite.h | 1 + right/hid_generic.c | 89 ++++++++++++++++++++++++++++ right/hid_generic.h | 23 ++++++++ right/include/board/pin_mux.c | 9 +++ right/usb_device_config.h | 4 +- right/usb_device_descriptor.c | 50 ++++++++++++++++ right/usb_device_descriptor.h | 8 ++- right/usb_generic_hid_descriptors.c | 92 +++++++++++++++++++++++++++++ right/usb_generic_hid_descriptors.h | 32 ++++++++++ 11 files changed, 344 insertions(+), 9 deletions(-) create mode 100644 right/hid_generic.c create mode 100644 right/hid_generic.h create mode 100644 right/usb_generic_hid_descriptors.c create mode 100644 right/usb_generic_hid_descriptors.h diff --git a/right/build/kds/.project b/right/build/kds/.project index ab1370d..56b9945 100644 --- a/right/build/kds/.project +++ b/right/build/kds/.project @@ -185,6 +185,16 @@ 1 PARENT-2-PROJECT_LOC/composite.h + + sources/hid_generic.c + 1 + PARENT-2-PROJECT_LOC/hid_generic.c + + + sources/hid_generic.h + 1 + PARENT-2-PROJECT_LOC/hid_generic.h + sources/hid_keyboard.c 1 @@ -225,6 +235,16 @@ 1 PARENT-2-PROJECT_LOC/usb_device_descriptor.h + + sources/usb_generic_hid_descriptors.c + 1 + PARENT-2-PROJECT_LOC/usb_generic_hid_descriptors.c + + + sources/usb_generic_hid_descriptors.h + 1 + PARENT-2-PROJECT_LOC/usb_generic_hid_descriptors.h + sources/usb_keyboard_descriptors.c 1 diff --git a/right/composite.c b/right/composite.c index 4c09249..281b123 100644 --- a/right/composite.c +++ b/right/composite.c @@ -8,6 +8,7 @@ #include "composite.h" #include "hid_keyboard.h" #include "hid_mouse.h" +#include "hid_generic.h" #include "fsl_device_registers.h" #include "include/board/clock_config.h" #include "include/board/board.h" @@ -18,13 +19,15 @@ #include "include/board/pin_mux.h" #include "usb_keyboard_descriptors.h" #include "usb_mouse_descriptors.h" +#include "usb_generic_hid_descriptors.h" static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event, void *param); usb_device_composite_struct_t UsbCompositeDevice; usb_device_class_config_struct_t UsbDeviceCompositeClassConfig[USB_COMPOSITE_INTERFACE_COUNT] = { - {UsbKeyboardCallback, (class_handle_t)NULL, &UsbKeyboardClass}, - {UsbMouseCallback, (class_handle_t)NULL, &UsbMouseClass} + {UsbKeyboardCallback, (class_handle_t)NULL, &UsbKeyboardClass}, + {UsbMouseCallback, (class_handle_t)NULL, &UsbMouseClass}, + {UsbGenericHidCallback, (class_handle_t)NULL, &UsbGenericHidClass} }; usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = { @@ -66,8 +69,7 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event, if (interface < USB_COMPOSITE_INTERFACE_COUNT) { UsbCompositeDevice.currentInterfaceAlternateSetting[interface] = alternateSetting; UsbMouseSetInterface(UsbCompositeDevice.mouseHandle, interface, alternateSetting); - UsbKeyboardSetInterface(UsbCompositeDevice.keyboardHandle, interface, - alternateSetting); + UsbKeyboardSetInterface(UsbCompositeDevice.keyboardHandle, interface, alternateSetting); error = kStatus_USB_Success; } } @@ -122,6 +124,7 @@ static void USB_DeviceApplicationInit(void) USB_DeviceClassInit(CONTROLLER_ID, &UsbDeviceCompositeConfigList, &UsbCompositeDevice.deviceHandle); UsbCompositeDevice.keyboardHandle = UsbDeviceCompositeConfigList.config[0].classHandle; UsbCompositeDevice.mouseHandle = UsbDeviceCompositeConfigList.config[1].classHandle; + UsbCompositeDevice.genericHidHandle = UsbDeviceCompositeConfigList.config[2].classHandle; NVIC_SetPriority((IRQn_Type)irqNumber, USB_DEVICE_INTERRUPT_PRIORITY); NVIC_EnableIRQ((IRQn_Type)irqNumber); @@ -134,6 +137,20 @@ void main(void) BOARD_InitPins(); BOARD_BootClockHSRUN(); BOARD_InitDebugConsole(); + + gpio_pin_config_t led_config = { + kGPIO_DigitalOutput, 0, + }; + + // Init output LED GPIO. + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PIN, &led_config); + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PIN, &led_config); + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PIN, &led_config); + + GPIO_SetPinsOutput(BOARD_LED_RED_GPIO, 1U << BOARD_LED_RED_GPIO_PIN); + GPIO_SetPinsOutput(BOARD_LED_GREEN_GPIO, 1U << BOARD_LED_GREEN_GPIO_PIN); + GPIO_SetPinsOutput(BOARD_LED_BLUE_GPIO, 1U << BOARD_LED_BLUE_GPIO_PIN); + USB_DeviceApplicationInit(); while (1U) { diff --git a/right/composite.h b/right/composite.h index cde8130..430e89d 100644 --- a/right/composite.h +++ b/right/composite.h @@ -12,6 +12,7 @@ usb_device_handle deviceHandle; class_handle_t mouseHandle; class_handle_t keyboardHandle; + class_handle_t genericHidHandle; uint8_t speed; uint8_t attach; uint8_t currentConfiguration; diff --git a/right/hid_generic.c b/right/hid_generic.c new file mode 100644 index 0000000..5cf8477 --- /dev/null +++ b/right/hid_generic.c @@ -0,0 +1,89 @@ +#include "include/board/board.h" +#include "fsl_gpio.h" +#include "usb_device_config.h" +#include "usb.h" +#include "usb_device.h" +#include "include/usb/usb_device_class.h" +#include "include/usb/usb_device_hid.h" +#include "include/usb/usb_device_ch9.h" +#include "usb_device_descriptor.h" +#include "composite.h" +#include "scancodes.h" +#include "hid_generic.h" + +static usb_device_generic_hid_struct_t UsbGenericHidDevice; + +usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void *param) +{ + usb_status_t error = kStatus_USB_Error; + + switch (event) + { + case kUSB_DeviceHidEventSendResponse: + break; + case kUSB_DeviceHidEventRecvResponse: + GPIO_SetPinsOutput(BOARD_LED_RED_GPIO, 1U << BOARD_LED_RED_GPIO_PIN); + GPIO_SetPinsOutput(BOARD_LED_GREEN_GPIO, 1U << BOARD_LED_GREEN_GPIO_PIN); + GPIO_SetPinsOutput(BOARD_LED_BLUE_GPIO, 1U << BOARD_LED_BLUE_GPIO_PIN); + + uint8_t* cp = (uint8_t*)&UsbGenericHidDevice.buffer[UsbGenericHidDevice.bufferIndex][0]; + uint8_t c = *(cp+0); + if (c == 'r') { + GPIO_ClearPinsOutput(BOARD_LED_RED_GPIO, 1U << BOARD_LED_RED_GPIO_PIN); + } + if (c == 'g') { + GPIO_ClearPinsOutput(BOARD_LED_GREEN_GPIO, 1U << BOARD_LED_GREEN_GPIO_PIN); + } + if (c == 'b') { + GPIO_ClearPinsOutput(BOARD_LED_BLUE_GPIO, 1U << BOARD_LED_BLUE_GPIO_PIN); + } + + USB_DeviceHidSend(UsbCompositeDevice.genericHidHandle, USB_GENERIC_HID_ENDPOINT_IN_ID, + (uint8_t *)&UsbGenericHidDevice.buffer[UsbGenericHidDevice.bufferIndex][0], + USB_GENERIC_HID_OUT_BUFFER_LENGTH); + UsbGenericHidDevice.bufferIndex ^= 1U; + return USB_DeviceHidRecv(UsbCompositeDevice.genericHidHandle, USB_GENERIC_HID_ENDPOINT_OUT_ID, + (uint8_t *)&UsbGenericHidDevice.buffer[UsbGenericHidDevice.bufferIndex][0], + USB_GENERIC_HID_OUT_BUFFER_LENGTH); + break; + case kUSB_DeviceHidEventGetReport: + case kUSB_DeviceHidEventSetReport: + case kUSB_DeviceHidEventRequestReportBuffer: + error = kStatus_USB_InvalidRequest; + break; + case kUSB_DeviceHidEventGetIdle: + case kUSB_DeviceHidEventGetProtocol: + case kUSB_DeviceHidEventSetIdle: + case kUSB_DeviceHidEventSetProtocol: + break; + default: + break; + } + + return error; +} +usb_status_t UsbGenericHidSetConfigure(class_handle_t handle, uint8_t configuration) +{ + if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) { + return USB_DeviceHidRecv( + UsbCompositeDevice.genericHidHandle, USB_GENERIC_HID_ENDPOINT_OUT_ID, + (uint8_t *)&UsbGenericHidDevice.buffer[UsbGenericHidDevice.bufferIndex][0], + USB_GENERIC_HID_OUT_BUFFER_LENGTH); + } + return kStatus_USB_Error; +} + +usb_status_t UsbGenericHidSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) +{ + if (USB_KEYBOARD_INTERFACE_INDEX == interface) { + UsbCompositeDevice.currentInterfaceAlternateSetting[interface] = alternateSetting; + if (alternateSetting == 0U) + { + return USB_DeviceHidRecv( + UsbCompositeDevice.genericHidHandle, USB_GENERIC_HID_ENDPOINT_OUT_ID, + (uint8_t *)&UsbGenericHidDevice.buffer[UsbGenericHidDevice.bufferIndex][0], + USB_GENERIC_HID_OUT_BUFFER_LENGTH); + } + } + return kStatus_USB_Error; +} diff --git a/right/hid_generic.h b/right/hid_generic.h new file mode 100644 index 0000000..8876cfa --- /dev/null +++ b/right/hid_generic.h @@ -0,0 +1,23 @@ +#ifndef __HID_GENERIC_H__ +#define __HID_GENERIC_H__ + +// Macros: + + #define USB_GENERIC_HID_IN_BUFFER_LENGTH (64U) + #define USB_GENERIC_HID_OUT_BUFFER_LENGTH (64U) + +// Typedefs: + + typedef struct _usb_device_generic_hid_struct { + uint32_t buffer[2][USB_GENERIC_HID_IN_BUFFER_LENGTH >> 2]; + uint8_t bufferIndex; + uint8_t idleRate; + } usb_device_generic_hid_struct_t; + +// Functions: + + extern usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void *param); + extern usb_status_t UsbGenericHidSetConfigure(class_handle_t handle, uint8_t configuration); + extern usb_status_t UsbGenericHidSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting); + +#endif diff --git a/right/include/board/pin_mux.c b/right/include/board/pin_mux.c index 46e4349..e824548 100644 --- a/right/include/board/pin_mux.c +++ b/right/include/board/pin_mux.c @@ -49,4 +49,13 @@ void BOARD_InitPins(void) // Set up SW3. CLOCK_EnableClock(kCLOCK_PortB); PORT_SetPinConfig(BOARD_SW3_PORT, BOARD_SW3_GPIO_PIN, &switchConfig); + + // Enable LED port clock + CLOCK_EnableClock(kCLOCK_PortA); + CLOCK_EnableClock(kCLOCK_PortD); + + // Led pin mux Configuration + PORT_SetPinMux(BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, kPORT_MuxAsGpio); + PORT_SetPinMux(BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, kPORT_MuxAsGpio); + PORT_SetPinMux(BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, kPORT_MuxAsGpio); } diff --git a/right/usb_device_config.h b/right/usb_device_config.h index f0c873b..74d7b6f 100644 --- a/right/usb_device_config.h +++ b/right/usb_device_config.h @@ -8,7 +8,7 @@ #define USB_DEVICE_CONFIG_NUM (1U) /*! @brief HID instance count */ -#define USB_DEVICE_CONFIG_HID (2U) +#define USB_DEVICE_CONFIG_HID (3U) /*! @brief Whether device is self power. 1U supported, 0U not supported */ #define USB_DEVICE_CONFIG_SELF_POWER (1U) @@ -17,7 +17,7 @@ #define USB_DEVICE_CONFIG_REMOTE_WAKEUP (0U) /*! @brief How many endpoints are supported in the stack. */ -#define USB_DEVICE_CONFIG_ENDPOINTS (4U) +#define USB_DEVICE_CONFIG_ENDPOINTS (6U) /*! @brief The MAX buffer length for the KHCI DMA workaround.*/ #define USB_DEVICE_CONFIG_KHCI_DMA_ALIGN_BUFFER_LENGTH (64U) diff --git a/right/usb_device_descriptor.c b/right/usb_device_descriptor.c index 39b0ab8..9363e32 100644 --- a/right/usb_device_descriptor.c +++ b/right/usb_device_descriptor.c @@ -7,6 +7,7 @@ #include "composite.h" #include "hid_keyboard.h" #include "hid_mouse.h" +#include "hid_generic.h" uint8_t UsbDeviceDescriptor[USB_DESCRIPTOR_LENGTH_DEVICE] = { USB_DESCRIPTOR_LENGTH_DEVICE, @@ -112,6 +113,50 @@ uint8_t UsbConfigurationDescriptor[USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH] = USB_SHORT_GET_LOW(USB_KEYBOARD_INTERRUPT_IN_PACKET_SIZE), USB_SHORT_GET_HIGH(USB_KEYBOARD_INTERRUPT_IN_PACKET_SIZE), USB_KEYBOARD_INTERRUPT_IN_INTERVAL, + +// Generic HID interface descriptor + + USB_DESCRIPTOR_LENGTH_INTERFACE, + USB_DESCRIPTOR_TYPE_INTERFACE, + USB_GENERIC_HID_INTERFACE_INDEX, + USB_INTERFACE_ALTERNATE_SETTING_NONE, + USB_GENERIC_HID_ENDPOINT_COUNT, + USB_GENERIC_HID_CLASS, + USB_GENERIC_HID_SUBCLASS, + USB_GENERIC_HID_PROTOCOL, + USB_STRING_DESCRIPTOR_ID_GENERIC_HID, + +// Generic HID descriptor + + USB_HID_DESCRIPTOR_LENGTH, + USB_DESCRIPTOR_TYPE_HID, + USB_SHORT_GET_LOW(USB_HID_VERSION), + USB_SHORT_GET_HIGH(USB_HID_VERSION), + USB_HID_COUNTRY_CODE_NOT_SUPPORTED, + USB_REPORT_DESCRIPTOR_COUNT_PER_HID_DEVICE, + USB_DESCRIPTOR_TYPE_HID_REPORT, + USB_SHORT_GET_LOW(USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH), + USB_SHORT_GET_HIGH(USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH), + +// Generic HID IN endpoint descriptor + + USB_DESCRIPTOR_LENGTH_ENDPOINT, + USB_DESCRIPTOR_TYPE_ENDPOINT, + USB_GENERIC_HID_ENDPOINT_IN_ID | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), + USB_ENDPOINT_INTERRUPT, + USB_SHORT_GET_LOW(USB_GENERIC_HID_INTERRUPT_IN_PACKET_SIZE), + USB_SHORT_GET_HIGH(USB_GENERIC_HID_INTERRUPT_IN_PACKET_SIZE), + USB_GENERIC_HID_INTERRUPT_IN_INTERVAL, + +// Generic HID OUT endpoint descriptor + + USB_DESCRIPTOR_LENGTH_ENDPOINT, + USB_DESCRIPTOR_TYPE_ENDPOINT, + USB_GENERIC_HID_ENDPOINT_OUT_ID | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), + USB_ENDPOINT_INTERRUPT, + USB_SHORT_GET_LOW(USB_GENERIC_HID_INTERRUPT_OUT_PACKET_SIZE), + USB_SHORT_GET_HIGH(USB_GENERIC_HID_INTERRUPT_OUT_PACKET_SIZE), + USB_GENERIC_HID_INTERRUPT_IN_INTERVAL, }; uint8_t UsbLanguageListStringDescriptor[USB_LANGUAGE_LIST_STRING_DESCRIPTOR_LENGTH] = { @@ -181,6 +226,7 @@ uint32_t UsbStringDescriptorLengths[USB_STRING_DESCRIPTOR_COUNT] = { sizeof(UsbProductString), sizeof(UsbMouseString), sizeof(UsbKeyboardString), + sizeof(UsbGenericHidString), }; uint8_t *UsbStringDescriptors[USB_STRING_DESCRIPTOR_COUNT] = { @@ -189,6 +235,7 @@ uint8_t *UsbStringDescriptors[USB_STRING_DESCRIPTOR_COUNT] = { UsbProductString, UsbMouseString, UsbKeyboardString, + UsbGenericHidString, }; usb_status_t USB_DeviceGetDeviceDescriptor( @@ -242,6 +289,9 @@ usb_status_t USB_DeviceGetHidReportDescriptor( } else if (USB_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) { hidReportDescriptor->buffer = UsbKeyboardReportDescriptor; hidReportDescriptor->length = USB_KEYBOARD_REPORT_DESCRIPTOR_LENGTH; + } else if (USB_GENERIC_HID_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) { + hidReportDescriptor->buffer = UsbGenericHidReportDescriptor; + hidReportDescriptor->length = USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH; } else { return kStatus_USB_InvalidRequest; } diff --git a/right/usb_device_descriptor.h b/right/usb_device_descriptor.h index a072f3a..7545246 100644 --- a/right/usb_device_descriptor.h +++ b/right/usb_device_descriptor.h @@ -5,6 +5,7 @@ #include "usb_keyboard_descriptors.h" #include "usb_mouse_descriptors.h" + #include "usb_generic_hid_descriptors.h" // Macros: @@ -23,7 +24,7 @@ #define USB_DEVICE_CONFIGURATION_COUNT (1U) #define USB_REPORT_DESCRIPTOR_COUNT_PER_HID_DEVICE (1U) #define USB_DEVICE_MAX_POWER (50U) // Expressed in 2mA units - #define USB_COMPOSITE_INTERFACE_COUNT (USB_KEYBOARD_INTERFACE_COUNT + USB_MOUSE_INTERFACE_COUNT) + #define USB_COMPOSITE_INTERFACE_COUNT (USB_KEYBOARD_INTERFACE_COUNT + USB_MOUSE_INTERFACE_COUNT + USB_GENERIC_HID_INTERFACE_COUNT) #define USB_LANGUAGE_ID_UNITED_STATES (0x0409U) #define USB_HID_COUNTRY_CODE_NOT_SUPPORTED (0x00U) @@ -33,11 +34,11 @@ // Descriptor lengths #define USB_HID_DESCRIPTOR_LENGTH (9U) - #define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH (59U) + #define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH (91U) // String descriptors - #define USB_STRING_DESCRIPTOR_COUNT (5U) + #define USB_STRING_DESCRIPTOR_COUNT (6U) #define USB_LANGUAGE_LIST_STRING_DESCRIPTOR_LENGTH (4U) #define USB_MANUFACTURER_STRING_DESCRIPTOR_LENGTH (58U) @@ -48,6 +49,7 @@ #define USB_STRING_DESCRIPTOR_ID_PRODUCT 2U #define USB_STRING_DESCRIPTOR_ID_MOUSE 3U #define USB_STRING_DESCRIPTOR_ID_KEYBOARD 4U + #define USB_STRING_DESCRIPTOR_ID_GENERIC_HID 5U // Functions: diff --git a/right/usb_generic_hid_descriptors.c b/right/usb_generic_hid_descriptors.c new file mode 100644 index 0000000..2bd893a --- /dev/null +++ b/right/usb_generic_hid_descriptors.c @@ -0,0 +1,92 @@ +#include "usb_device_config.h" +#include "usb.h" +#include "usb_device.h" +#include "include/usb/usb_device_class.h" +#include "include/usb/usb_device_hid.h" +#include "usb_device_descriptor.h" +#include "usb_generic_hid_descriptors.h" + +static usb_device_endpoint_struct_t UsbGenericHidEndpoints[USB_GENERIC_HID_ENDPOINT_COUNT] = +{ + { + USB_GENERIC_HID_ENDPOINT_IN_ID | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), + USB_ENDPOINT_INTERRUPT, + USB_GENERIC_HID_INTERRUPT_IN_PACKET_SIZE, + }, + { + USB_GENERIC_HID_ENDPOINT_OUT_ID | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), + USB_ENDPOINT_INTERRUPT, + USB_GENERIC_HID_INTERRUPT_OUT_PACKET_SIZE, + } +}; + +static usb_device_interface_struct_t UsbGenericHidInterface[] = {{ + USB_KEYBOARD_INTERFACE_ALTERNATE_SETTING, + {USB_GENERIC_HID_ENDPOINT_COUNT, UsbGenericHidEndpoints}, + NULL, +}}; + +static usb_device_interfaces_struct_t UsbGenericHidInterfaces[USB_GENERIC_HID_INTERFACE_COUNT] = {{ + USB_GENERIC_HID_CLASS, + USB_GENERIC_HID_SUBCLASS, + USB_GENERIC_HID_PROTOCOL, + USB_GENERIC_HID_INTERFACE_INDEX, + UsbGenericHidInterface, + sizeof(UsbGenericHidInterface) / sizeof(usb_device_interfaces_struct_t), +}}; + +static usb_device_interface_list_t UsbGenericHidInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = {{ + USB_GENERIC_HID_INTERFACE_COUNT, + UsbGenericHidInterfaces, +}}; + +usb_device_class_struct_t UsbGenericHidClass = { + UsbGenericHidInterfaceList, + kUSB_DeviceClassTypeHid, + USB_DEVICE_CONFIGURATION_COUNT, +}; + +uint8_t UsbGenericHidReportDescriptor[USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH] = { + 0x05U, 0x81U, /* Usage Page (Vendor defined)*/ + 0x09U, 0x82U, /* Usage (Vendor defined) */ + 0xA1U, 0x01U, /* Collection (Application) */ + 0x09U, 0x83U, /* Usage (Vendor defined) */ + + 0x09U, 0x84U, /* Usage (Vendor defined) */ + 0x15U, 0x80U, /* Logical Minimum (-128) */ + 0x25U, 0x7FU, /* Logical Maximum (127) */ + 0x75U, 0x08U, /* Report Size (8U) */ + 0x95U, 0x08U, /* Report Count (8U) */ + 0x81U, 0x02U, /* Input(Data, Variable, Absolute) */ + + 0x09U, 0x84U, /* Usage (Vendor defined) */ + 0x15U, 0x80U, /* logical Minimum (-128) */ + 0x25U, 0x7FU, /* logical Maximum (127) */ + 0x75U, 0x08U, /* Report Size (8U) */ + 0x95U, 0x08U, /* Report Count (8U) */ + 0x91U, 0x02U, /* Input (Data, Variable, Absolute) */ + 0xC0U, /* End collection */ +}; + +uint8_t UsbGenericHidString[USB_GENERIC_HID_STRING_DESCRIPTOR_LENGTH] = { + sizeof(UsbGenericHidString), + USB_DESCRIPTOR_TYPE_STRING, + 'H', 0x00U, + 'I', 0x00U, + 'D', 0x00U, + ' ', 0x00U, + 'G', 0x00U, + 'E', 0x00U, + 'N', 0x00U, + 'E', 0x00U, + 'R', 0x00U, + 'I', 0x00U, + 'C', 0x00U, + ' ', 0x00U, + 'D', 0x00U, + 'E', 0x00U, + 'V', 0x00U, + 'I', 0x00U, + 'C', 0x00U, + 'E', 0x00U, +}; diff --git a/right/usb_generic_hid_descriptors.h b/right/usb_generic_hid_descriptors.h new file mode 100644 index 0000000..ea0b1ae --- /dev/null +++ b/right/usb_generic_hid_descriptors.h @@ -0,0 +1,32 @@ +#ifndef __USB_GENERIC_HID_DESCRIPTORS_H__ +#define __USB_GENERIC_HID_DESCRIPTORS_H__ + +// Macros: + + #define USB_GENERIC_HID_CLASS (0x03U) + #define USB_GENERIC_HID_SUBCLASS (0x00U) + #define USB_GENERIC_HID_PROTOCOL (0x00U) + + #define USB_GENERIC_HID_INTERFACE_INDEX (2U) + #define USB_GENERIC_HID_INTERFACE_COUNT (1U) + #define USB_GENERIC_HID_INTERFACE_ALTERNATE_SETTING (0U) + + #define USB_GENERIC_HID_ENDPOINT_IN_ID (3U) + #define USB_GENERIC_HID_ENDPOINT_OUT_ID (4U) + #define USB_GENERIC_HID_ENDPOINT_COUNT (2U) + + #define USB_GENERIC_HID_INTERRUPT_IN_PACKET_SIZE (64U) + #define USB_GENERIC_HID_INTERRUPT_IN_INTERVAL (0x04U) + #define USB_GENERIC_HID_INTERRUPT_OUT_PACKET_SIZE (64U) + #define USB_GENERIC_HID_INTERRUPT_OUT_INTERVAL (0x04U) + + #define USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH (33U) + #define USB_GENERIC_HID_STRING_DESCRIPTOR_LENGTH (38U) + +// Variables: + + extern usb_device_class_struct_t UsbGenericHidClass; + extern uint8_t UsbGenericHidReportDescriptor[USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH]; + extern uint8_t UsbGenericHidString[USB_GENERIC_HID_STRING_DESCRIPTOR_LENGTH]; + +#endif