diff --git a/right/usb_keyboard_descriptors.c b/right/usb_keyboard_descriptors.c new file mode 100644 index 0000000..7aef0fe --- /dev/null +++ b/right/usb_keyboard_descriptors.c @@ -0,0 +1,117 @@ +#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_keyboard_descriptors.h" + +static usb_device_endpoint_struct_t UsbKeyboardEndpoints[USB_HID_KEYBOARD_ENDPOINT_COUNT] = +{ + { + USB_HID_KEYBOARD_ENDPOINT_IN | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), + USB_ENDPOINT_INTERRUPT, FS_HID_KEYBOARD_INTERRUPT_IN_PACKET_SIZE, + }, +}; + +static usb_device_interface_struct_t UsbKeyboardInterface[] = +{ + { + USB_KEYBOARD_INTERFACE_ALTERNATE_SETTING, + { + USB_HID_KEYBOARD_ENDPOINT_COUNT, + UsbKeyboardEndpoints, + }, + NULL, + } +}; + +static usb_device_interfaces_struct_t UsbKeyboardInterfaces[USB_HID_KEYBOARD_INTERFACE_COUNT] = +{ + { + USB_HID_KEYBOARD_CLASS, + USB_HID_KEYBOARD_SUBCLASS, + USB_HID_KEYBOARD_PROTOCOL, + USB_HID_KEYBOARD_INTERFACE_INDEX, + UsbKeyboardInterface, + sizeof(UsbKeyboardInterface) / sizeof(usb_device_interfaces_struct_t), + }, +}; + +static usb_device_interface_list_t UsbKeyboardInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = +{ + { + USB_HID_KEYBOARD_INTERFACE_COUNT, + UsbKeyboardInterfaces, + }, +}; + +usb_device_class_struct_t UsbKeyboardClass = { + UsbKeyboardInterfaceList, + kUSB_DeviceClassTypeHid, + USB_DEVICE_CONFIGURATION_COUNT, +}; + +uint8_t UsbKeyboardReportDescriptor[USB_DESCRIPTOR_LENGTH_HID_KEYBOARD_REPORT] = { + 0x05U, 0x01U, // Usage Page (Generic Desktop) + 0x09U, 0x06U, // Usage (Keyboard) + 0xA1U, 0x01U, // Collection (Application) + 0x75U, 0x01U, // Report Size (1U) + 0x95U, 0x08U, // Report Count (8U) + 0x05U, 0x07U, // Usage Page (Key Codes) + 0x19U, 0xE0U, // Usage Minimum (224U) + 0x29U, 0xE7U, // Usage Maximum (231U) + + 0x15U, 0x00U, // Logical Minimum (0U) + 0x25U, 0x01U, // Logical Maximum (1U) + 0x81U, 0x02U, // Input(Data, Variable, Absolute) Modifier byte + + 0x95U, 0x01U, // Report count (1U) + 0x75U, 0x08U, // Report Size (8U) + 0x81U, 0x01U, // Input (Constant), Reserved byte + 0x95U, 0x05U, // Report count (5U) + 0x75U, 0x01U, // Report Size (1U) + + 0x05U, 0x01U, // Usage Page (Page# for LEDs) + 0x19U, 0x01U, // Usage Minimum (1U) + 0x29U, 0x05U, // Usage Maximum (5U) + 0x91U, 0x02U, // Output (Data, Variable, Absolute) LED report + 0x95U, 0x01U, // Report count (1U) + 0x75U, 0x03U, // Report Size (3U) + 0x91U, 0x01U, // Output (Constant), LED report padding + + 0x95U, 0x06U, // Report count (6U) + 0x75U, 0x08U, // Report Size (8U) + 0x15U, 0x00U, // Logical Minimum (0U) + 0x25U, 0xFFU, // Logical Maximum (255U) + 0x05U, 0x07U, // Usage Page (Key Codes) + 0x19U, 0x00U, // Usage Minimum (0U) + 0x29U, 0xFFU, // Usage Maximum (255U) + + 0x81U, 0x00U, // Input(Data, Array), Key arrays(6U bytes) + 0xC0U, // End collection +}; + +uint8_t g_UsbKeyboardString[USB_KEYBOARD_STRING_DESCRIPTOR_LENGTH] = { + sizeof(g_UsbKeyboardString), + USB_DESCRIPTOR_TYPE_STRING, + 'H', 0x00U, + 'I', 0x00U, + 'D', 0x00U, + ' ', 0x00U, + 'K', 0x00U, + 'E', 0x00U, + 'Y', 0x00U, + 'B', 0x00U, + 'O', 0x00U, + 'A', 0x00U, + 'R', 0x00U, + 'D', 0x00U, + ' ', 0x00U, + 'D', 0x00U, + 'E', 0x00U, + 'V', 0x00U, + 'I', 0x00U, + 'C', 0x00U, + 'E', 0x00U, +}; diff --git a/right/usb_keyboard_descriptors.h b/right/usb_keyboard_descriptors.h new file mode 100644 index 0000000..75f5319 --- /dev/null +++ b/right/usb_keyboard_descriptors.h @@ -0,0 +1,27 @@ +#ifndef __USB_KEYBOARD_DESCRIPTORS_H__ +#define __USB_KEYBOARD_DESCRIPTORS_H__ + +// Macros: + + #define USB_HID_KEYBOARD_INTERFACE_COUNT (1U) + #define USB_DESCRIPTOR_LENGTH_HID_KEYBOARD_REPORT (63U) + #define USB_KEYBOARD_STRING_DESCRIPTOR_LENGTH (40U) + #define USB_KEYBOARD_INTERFACE_ALTERNATE_SETTING (0U) + #define USB_HID_KEYBOARD_ENDPOINT_IN (2U) + #define FS_HID_KEYBOARD_INTERRUPT_IN_PACKET_SIZE (8U) + #define USB_HID_KEYBOARD_ENDPOINT_COUNT (1U) + #define USB_HID_KEYBOARD_CLASS (0x03U) + #define USB_HID_KEYBOARD_SUBCLASS (0x01U) + #define USB_HID_KEYBOARD_PROTOCOL (0x01U) + #define USB_HID_KEYBOARD_INTERFACE_INDEX (1U) + #define USB_HID_KEYBOARD_IN_BUFFER_LENGTH (8U) + #define FS_HID_KEYBOARD_INTERRUPT_IN_INTERVAL (0x04U) + #define USB_HID_KEYBOARD_REPORT_LENGTH (0x08U) + +// Variables: + + extern uint8_t g_UsbKeyboardString[USB_KEYBOARD_STRING_DESCRIPTOR_LENGTH]; + extern usb_device_class_struct_t UsbKeyboardClass; + extern uint8_t UsbKeyboardReportDescriptor[USB_DESCRIPTOR_LENGTH_HID_KEYBOARD_REPORT]; + +#endif