|
|
@ -37,6 +37,7 @@ |
|
|
|
*/ |
|
|
|
|
|
|
|
#include "util.h" |
|
|
|
#include "report.h" |
|
|
|
#include "descriptor.h" |
|
|
|
|
|
|
|
|
|
|
@ -86,27 +87,43 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = |
|
|
|
HID_RI_COLLECTION(8, 0x01), /* Application */ |
|
|
|
HID_RI_USAGE(8, 0x01), /* Pointer */ |
|
|
|
HID_RI_COLLECTION(8, 0x00), /* Physical */ |
|
|
|
|
|
|
|
HID_RI_USAGE_PAGE(8, 0x09), /* Button */ |
|
|
|
HID_RI_USAGE_MINIMUM(8, 0x01), |
|
|
|
HID_RI_USAGE_MAXIMUM(8, 0x03), |
|
|
|
HID_RI_USAGE_MINIMUM(8, 0x01), /* Button 1 */ |
|
|
|
HID_RI_USAGE_MAXIMUM(8, 0x05), /* Button 5 */ |
|
|
|
HID_RI_LOGICAL_MINIMUM(8, 0x00), |
|
|
|
HID_RI_LOGICAL_MAXIMUM(8, 0x01), |
|
|
|
HID_RI_REPORT_COUNT(8, 0x03), |
|
|
|
HID_RI_REPORT_COUNT(8, 0x05), |
|
|
|
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, 0x05), |
|
|
|
HID_RI_REPORT_SIZE(8, 0x03), |
|
|
|
HID_RI_INPUT(8, HID_IOF_CONSTANT), |
|
|
|
|
|
|
|
HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ |
|
|
|
HID_RI_USAGE(8, 0x30), /* Usage X */ |
|
|
|
HID_RI_USAGE(8, 0x31), /* Usage Y */ |
|
|
|
HID_RI_LOGICAL_MINIMUM(8, -1), |
|
|
|
HID_RI_LOGICAL_MAXIMUM(8, 1), |
|
|
|
HID_RI_PHYSICAL_MINIMUM(8, -1), |
|
|
|
HID_RI_PHYSICAL_MAXIMUM(8, 1), |
|
|
|
HID_RI_LOGICAL_MINIMUM(8, -127), |
|
|
|
HID_RI_LOGICAL_MAXIMUM(8, 127), |
|
|
|
HID_RI_REPORT_COUNT(8, 0x02), |
|
|
|
HID_RI_REPORT_SIZE(8, 0x08), |
|
|
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), |
|
|
|
|
|
|
|
HID_RI_USAGE(8, 0x38), /* Wheel */ |
|
|
|
HID_RI_LOGICAL_MINIMUM(8, -127), |
|
|
|
HID_RI_LOGICAL_MAXIMUM(8, 127), |
|
|
|
HID_RI_REPORT_COUNT(8, 0x01), |
|
|
|
HID_RI_REPORT_SIZE(8, 0x08), |
|
|
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), |
|
|
|
|
|
|
|
HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */ |
|
|
|
HID_RI_USAGE(16, 0x0238), /* AC Pan (Horizontal wheel) */ |
|
|
|
HID_RI_LOGICAL_MINIMUM(8, -127), |
|
|
|
HID_RI_LOGICAL_MAXIMUM(8, 127), |
|
|
|
HID_RI_REPORT_COUNT(8, 0x01), |
|
|
|
HID_RI_REPORT_SIZE(8, 0x08), |
|
|
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), |
|
|
|
|
|
|
|
HID_RI_END_COLLECTION(0), |
|
|
|
HID_RI_END_COLLECTION(0), |
|
|
|
}; |
|
|
@ -115,22 +132,50 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = |
|
|
|
{ |
|
|
|
HID_RI_USAGE_PAGE(16, 0xFF00), /* Vendor Page 0 */ |
|
|
|
HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */ |
|
|
|
HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */ |
|
|
|
HID_RI_COLLECTION(8, 0x01), /* Application */ |
|
|
|
HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */ |
|
|
|
HID_RI_LOGICAL_MINIMUM(8, 0x00), |
|
|
|
HID_RI_LOGICAL_MAXIMUM(8, 0xFF), |
|
|
|
HID_RI_REPORT_SIZE(8, 0x08), |
|
|
|
HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE), |
|
|
|
HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE), |
|
|
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), |
|
|
|
HID_RI_USAGE(8, 0x03), /* Vendor Usage 3 */ |
|
|
|
HID_RI_LOGICAL_MINIMUM(8, 0x00), |
|
|
|
HID_RI_LOGICAL_MAXIMUM(8, 0xFF), |
|
|
|
HID_RI_REPORT_SIZE(8, 0x08), |
|
|
|
HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE), |
|
|
|
HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE), |
|
|
|
HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), |
|
|
|
HID_RI_END_COLLECTION(0), |
|
|
|
}; |
|
|
|
|
|
|
|
const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtraReport[] = |
|
|
|
{ |
|
|
|
HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ |
|
|
|
HID_RI_USAGE(8, 0x80), /* System Control */ |
|
|
|
HID_RI_COLLECTION(8, 0x01), /* Application */ |
|
|
|
HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM), |
|
|
|
HID_RI_LOGICAL_MINIMUM(16, 0x0081), |
|
|
|
HID_RI_LOGICAL_MAXIMUM(16, 0x00B7), |
|
|
|
HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */ |
|
|
|
HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */ |
|
|
|
HID_RI_REPORT_SIZE(8, 16), |
|
|
|
HID_RI_REPORT_COUNT(8, 1), |
|
|
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), |
|
|
|
HID_RI_END_COLLECTION(0), |
|
|
|
|
|
|
|
HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */ |
|
|
|
HID_RI_USAGE(8, 0x01), /* Consumer Control */ |
|
|
|
HID_RI_COLLECTION(8, 0x01), /* Application */ |
|
|
|
HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER), |
|
|
|
HID_RI_LOGICAL_MINIMUM(16, 0x0010), |
|
|
|
HID_RI_LOGICAL_MAXIMUM(16, 0x029C), |
|
|
|
HID_RI_USAGE_MINIMUM(16, 0x0010), /* +10 */ |
|
|
|
HID_RI_USAGE_MAXIMUM(16, 0x029C), /* AC Distribute Vertically */ |
|
|
|
HID_RI_REPORT_SIZE(8, 16), |
|
|
|
HID_RI_REPORT_COUNT(8, 1), |
|
|
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), |
|
|
|
HID_RI_END_COLLECTION(0), |
|
|
|
}; |
|
|
|
|
|
|
|
/******************************************************************************* |
|
|
|
* Device Descriptors |
|
|
@ -167,7 +212,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = |
|
|
|
.Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, |
|
|
|
|
|
|
|
.TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), |
|
|
|
.TotalInterfaces = 3, |
|
|
|
.TotalInterfaces = TOTAL_INTERFACES, |
|
|
|
|
|
|
|
.ConfigurationNumber = 1, |
|
|
|
.ConfigurationStrIndex = NO_DESCRIPTOR, |
|
|
@ -177,9 +222,9 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = |
|
|
|
.MaxPowerConsumption = USB_CONFIG_POWER_MA(100) |
|
|
|
}, |
|
|
|
|
|
|
|
/* |
|
|
|
* Keyboard |
|
|
|
*/ |
|
|
|
/* |
|
|
|
* Keyboard |
|
|
|
*/ |
|
|
|
.Keyboard_Interface = |
|
|
|
{ |
|
|
|
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, |
|
|
@ -213,7 +258,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = |
|
|
|
|
|
|
|
.EndpointAddress = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM), |
|
|
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), |
|
|
|
.EndpointSize = HID_EPSIZE, |
|
|
|
.EndpointSize = KEYBOARD_EPSIZE, |
|
|
|
.PollingIntervalMS = 0x01 |
|
|
|
}, |
|
|
|
|
|
|
@ -253,7 +298,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = |
|
|
|
|
|
|
|
.EndpointAddress = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM), |
|
|
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), |
|
|
|
.EndpointSize = HID_EPSIZE, |
|
|
|
.EndpointSize = MOUSE_EPSIZE, |
|
|
|
.PollingIntervalMS = 0x01 |
|
|
|
}, |
|
|
|
|
|
|
@ -264,7 +309,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = |
|
|
|
{ |
|
|
|
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, |
|
|
|
|
|
|
|
.InterfaceNumber = GENERIC_INTERFACE, |
|
|
|
.InterfaceNumber = CONSOLE_INTERFACE, |
|
|
|
.AlternateSetting = 0x00, |
|
|
|
|
|
|
|
.TotalEndpoints = 2, |
|
|
@ -291,9 +336,9 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = |
|
|
|
{ |
|
|
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, |
|
|
|
|
|
|
|
.EndpointAddress = (ENDPOINT_DIR_IN | GENERIC_IN_EPNUM), |
|
|
|
.EndpointAddress = (ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM), |
|
|
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), |
|
|
|
.EndpointSize = GENERIC_EPSIZE, |
|
|
|
.EndpointSize = CONSOLE_EPSIZE, |
|
|
|
.PollingIntervalMS = 0x01 |
|
|
|
}, |
|
|
|
|
|
|
@ -301,11 +346,51 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = |
|
|
|
{ |
|
|
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, |
|
|
|
|
|
|
|
.EndpointAddress = (ENDPOINT_DIR_OUT | GENERIC_OUT_EPNUM), |
|
|
|
.EndpointAddress = (ENDPOINT_DIR_OUT | CONSOLE_OUT_EPNUM), |
|
|
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), |
|
|
|
.EndpointSize = CONSOLE_EPSIZE, |
|
|
|
.PollingIntervalMS = 0x01 |
|
|
|
}, |
|
|
|
|
|
|
|
/* |
|
|
|
* Extra |
|
|
|
*/ |
|
|
|
.Extra_Interface = |
|
|
|
{ |
|
|
|
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, |
|
|
|
|
|
|
|
.InterfaceNumber = EXTRA_INTERFACE, |
|
|
|
.AlternateSetting = 0x00, |
|
|
|
|
|
|
|
.TotalEndpoints = 1, |
|
|
|
|
|
|
|
.Class = HID_CSCP_HIDClass, |
|
|
|
.SubClass = HID_CSCP_NonBootSubclass, |
|
|
|
.Protocol = HID_CSCP_NonBootProtocol, |
|
|
|
|
|
|
|
.InterfaceStrIndex = NO_DESCRIPTOR |
|
|
|
}, |
|
|
|
|
|
|
|
.Extra_HID = |
|
|
|
{ |
|
|
|
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, |
|
|
|
|
|
|
|
.HIDSpec = VERSION_BCD(01.11), |
|
|
|
.CountryCode = 0x00, |
|
|
|
.TotalReportDescriptors = 1, |
|
|
|
.HIDReportType = HID_DTYPE_Report, |
|
|
|
.HIDReportLength = sizeof(ExtraReport) |
|
|
|
}, |
|
|
|
|
|
|
|
.Extra_INEndpoint = |
|
|
|
{ |
|
|
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, |
|
|
|
|
|
|
|
.EndpointAddress = (ENDPOINT_DIR_IN | EXTRA_IN_EPNUM), |
|
|
|
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), |
|
|
|
.EndpointSize = GENERIC_EPSIZE, |
|
|
|
.EndpointSize = EXTRA_EPSIZE, |
|
|
|
.PollingIntervalMS = 0x01 |
|
|
|
} |
|
|
|
}, |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
@ -387,10 +472,14 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, |
|
|
|
Address = &ConfigurationDescriptor.Mouse_HID; |
|
|
|
Size = sizeof(USB_HID_Descriptor_HID_t); |
|
|
|
break; |
|
|
|
case GENERIC_INTERFACE: |
|
|
|
case CONSOLE_INTERFACE: |
|
|
|
Address = &ConfigurationDescriptor.Console_HID; |
|
|
|
Size = sizeof(USB_HID_Descriptor_HID_t); |
|
|
|
break; |
|
|
|
case EXTRA_INTERFACE: |
|
|
|
Address = &ConfigurationDescriptor.Extra_HID; |
|
|
|
Size = sizeof(USB_HID_Descriptor_HID_t); |
|
|
|
break; |
|
|
|
} |
|
|
|
break; |
|
|
|
case HID_DTYPE_Report: |
|
|
@ -403,10 +492,14 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, |
|
|
|
Address = &MouseReport; |
|
|
|
Size = sizeof(MouseReport); |
|
|
|
break; |
|
|
|
case GENERIC_INTERFACE: |
|
|
|
case CONSOLE_INTERFACE: |
|
|
|
Address = &ConsoleReport; |
|
|
|
Size = sizeof(ConsoleReport); |
|
|
|
break; |
|
|
|
case EXTRA_INTERFACE: |
|
|
|
Address = &ExtraReport; |
|
|
|
Size = sizeof(ExtraReport); |
|
|
|
break; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|