diff --git a/right/src/usb_descriptors/usb_descriptor_configuration.h b/right/src/usb_descriptors/usb_descriptor_configuration.h index 57869cd..6595f22 100644 --- a/right/src/usb_descriptors/usb_descriptor_configuration.h +++ b/right/src/usb_descriptors/usb_descriptor_configuration.h @@ -14,6 +14,10 @@ #define USB_COMPOSITE_CONFIGURATION_INDEX 1 #define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH 141 +// Variables: + + extern uint8_t UsbConfigurationDescriptor[USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH]; + // Functions: usb_status_t USB_DeviceGetConfigurationDescriptor( diff --git a/right/src/usb_descriptors/usb_descriptor_hid.c b/right/src/usb_descriptors/usb_descriptor_hid.c index 4e3ba9c..f70dfa1 100644 --- a/right/src/usb_descriptors/usb_descriptor_hid.c +++ b/right/src/usb_descriptors/usb_descriptor_hid.c @@ -2,11 +2,52 @@ #include "usb_descriptor_hid.h" #include "usb_descriptor_mouse_report.h" #include "usb_descriptor_generic_hid_report.h" +#include "usb_descriptor_configuration.h" + +#define USB_GENERIC_HID_DESCRIPTOR_INDEX \ + (USB_DESCRIPTOR_LENGTH_CONFIGURE + USB_DESCRIPTOR_LENGTH_INTERFACE) + +#define USB_BASIC_KEYBOARD_HID_DESCRIPTOR_INDEX \ + (USB_GENERIC_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \ + 2 * USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE) + +#define USB_MEDIA_KEYBOARD_HID_DESCRIPTOR_INDEX \ + (USB_BASIC_KEYBOARD_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \ + USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE) + +#define USB_SYSTEM_KEYBOARD_HID_DESCRIPTOR_INDEX \ + (USB_MEDIA_KEYBOARD_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \ + USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE) + +#define USB_MOUSE_HID_DESCRIPTOR_INDEX \ + (USB_SYSTEM_KEYBOARD_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \ + USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE) usb_status_t USB_DeviceGetHidDescriptor( usb_device_handle handle, usb_device_get_hid_descriptor_struct_t *hidDescriptor) { - return kStatus_USB_InvalidRequest; + hidDescriptor->length = USB_DESCRIPTOR_LENGTH_HID; + + switch (hidDescriptor->interfaceNumber) { + case USB_GENERIC_HID_INTERFACE_INDEX: + hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_GENERIC_HID_DESCRIPTOR_INDEX]; + break; + case USB_BASIC_KEYBOARD_INTERFACE_INDEX: + hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_BASIC_KEYBOARD_HID_DESCRIPTOR_INDEX]; + break; + case USB_MEDIA_KEYBOARD_INTERFACE_INDEX: + hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_MEDIA_KEYBOARD_HID_DESCRIPTOR_INDEX]; + break; + case USB_SYSTEM_KEYBOARD_INTERFACE_INDEX: + hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_SYSTEM_KEYBOARD_HID_DESCRIPTOR_INDEX]; + break; + case USB_MOUSE_INTERFACE_INDEX: + hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_MOUSE_HID_DESCRIPTOR_INDEX]; + break; + default: + return kStatus_USB_InvalidRequest; + } + return kStatus_USB_Success; } usb_status_t USB_DeviceGetHidReportDescriptor(