forked from mfulz_github/qmk_firmware
Add new HID_DESCRIPTOR_VENDOR() macro, change over all projects and Device ClassDriver demos to use it.
Fix reversed byte ordering of multi-byte HID data. Added support to the HID parser for extended USAGE items that contain the usage page as well as the usage index. Removed the HID_IOF_NON_VOLATILE and HID_IOF_VOLATILE flags from HID INPUT items where the flag is invalid. Changed over HID OUTPUT items to use HID_IOF_NON_VOLATILE. Change over MagStripe project to use HID_DESCRIPTOR_KEYBOARD() for its HID report. Change over MouseHostDevice demo to use HID_DESCRIPTOR_MOUSE() for its HID report.
This commit is contained in:
parent
a852ea8e43
commit
e6dc951630
|
@ -45,22 +45,14 @@
|
||||||
*/
|
*/
|
||||||
USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] =
|
USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] =
|
||||||
{
|
{
|
||||||
HID_RI_USAGE_PAGE(16, 0x00FF), /* Vendor Page 1 */
|
/* Use the HID class driver's standard Joystick report.
|
||||||
HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */
|
* Vendor Usage Page: 1
|
||||||
HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */
|
* Vendor Collection Usage: 1
|
||||||
HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
|
* Vendor Report IN Usage: 2
|
||||||
HID_RI_LOGICAL_MINIMUM(8, 0x00),
|
* Vendor Report OUT Usage: 3
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
|
* Vendor Report Size: GENERIC_REPORT_SIZE
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
*/
|
||||||
HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE),
|
HID_DESCRIPTOR_VENDOR(0x00, 0x01, 0x02, 0x03, GENERIC_REPORT_SIZE)
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
|
|
||||||
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_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
|
|
||||||
HID_RI_END_COLLECTION(0),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
||||||
|
|
|
@ -44,14 +44,14 @@
|
||||||
* more details on HID report descriptors.
|
* more details on HID report descriptors.
|
||||||
*/
|
*/
|
||||||
USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] =
|
USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] =
|
||||||
{
|
{
|
||||||
/* Use the HID class driver's standard Joystick report.
|
/* Use the HID class driver's standard Joystick report.
|
||||||
* Min X/Y Axis values: -100
|
* Min X/Y Axis values: -100
|
||||||
* Max X/Y Axis values: 100
|
* Max X/Y Axis values: 100
|
||||||
* Buttons: 2
|
* Buttons: 2
|
||||||
*/
|
*/
|
||||||
HID_DESCRIPTOR_JOYSTICK(-100, 100, 2)
|
HID_DESCRIPTOR_JOYSTICK(-100, 100, 2)
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
||||||
* device characteristics, including the supported USB version, control endpoint size and the
|
* device characteristics, including the supported USB version, control endpoint size and the
|
||||||
|
|
|
@ -51,10 +51,10 @@
|
||||||
USB_Descriptor_Configuration_Header_t Config;
|
USB_Descriptor_Configuration_Header_t Config;
|
||||||
USB_Descriptor_Interface_t HID1_KeyboardInterface;
|
USB_Descriptor_Interface_t HID1_KeyboardInterface;
|
||||||
USB_HID_Descriptor_HID_t HID1_KeyboardHID;
|
USB_HID_Descriptor_HID_t HID1_KeyboardHID;
|
||||||
USB_Descriptor_Endpoint_t HID1_ReportINEndpoint;
|
USB_Descriptor_Endpoint_t HID1_ReportINEndpoint;
|
||||||
USB_Descriptor_Interface_t HID2_MouseInterface;
|
USB_Descriptor_Interface_t HID2_MouseInterface;
|
||||||
USB_HID_Descriptor_HID_t HID2_MouseHID;
|
USB_HID_Descriptor_HID_t HID2_MouseHID;
|
||||||
USB_Descriptor_Endpoint_t HID2_ReportINEndpoint;
|
USB_Descriptor_Endpoint_t HID2_ReportINEndpoint;
|
||||||
} USB_Descriptor_Configuration_t;
|
} USB_Descriptor_Configuration_t;
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
|
|
|
@ -61,7 +61,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM HIDReport[] =
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
||||||
HID_RI_REPORT_COUNT(8, 0x03),
|
HID_RI_REPORT_COUNT(8, 0x03),
|
||||||
HID_RI_REPORT_SIZE(8, 0x01),
|
HID_RI_REPORT_SIZE(8, 0x01),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||||
HID_RI_REPORT_COUNT(8, 0x01),
|
HID_RI_REPORT_COUNT(8, 0x01),
|
||||||
HID_RI_REPORT_SIZE(8, 0x05),
|
HID_RI_REPORT_SIZE(8, 0x05),
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
||||||
|
@ -74,7 +74,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM HIDReport[] =
|
||||||
HID_RI_PHYSICAL_MAXIMUM(8, 1),
|
HID_RI_PHYSICAL_MAXIMUM(8, 1),
|
||||||
HID_RI_REPORT_COUNT(8, 0x02),
|
HID_RI_REPORT_COUNT(8, 0x02),
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE | HID_IOF_NON_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
|
||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM HIDReport[] =
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
||||||
HID_RI_REPORT_SIZE(8, 0x01),
|
HID_RI_REPORT_SIZE(8, 0x01),
|
||||||
HID_RI_REPORT_COUNT(8, 0x08),
|
HID_RI_REPORT_COUNT(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||||
HID_RI_REPORT_COUNT(8, 0x01),
|
HID_RI_REPORT_COUNT(8, 0x01),
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
||||||
|
@ -110,7 +110,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM HIDReport[] =
|
||||||
HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
|
HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
|
||||||
HID_RI_REPORT_COUNT(8, 0x06),
|
HID_RI_REPORT_COUNT(8, 0x06),
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
|
||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
USB_Descriptor_Configuration_Header_t Config;
|
USB_Descriptor_Configuration_Header_t Config;
|
||||||
USB_Descriptor_Interface_t HID_Interface;
|
USB_Descriptor_Interface_t HID_Interface;
|
||||||
USB_HID_Descriptor_HID_t HID_HIDData;
|
USB_HID_Descriptor_HID_t HID_HIDData;
|
||||||
USB_Descriptor_Endpoint_t HID_ReportINEndpoint;
|
USB_Descriptor_Endpoint_t HID_ReportINEndpoint;
|
||||||
} USB_Descriptor_Configuration_t;
|
} USB_Descriptor_Configuration_t;
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
*/
|
*/
|
||||||
USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] =
|
USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] =
|
||||||
{
|
{
|
||||||
HID_RI_USAGE_PAGE(16, 0x00FF), /* Vendor Page 1 */
|
HID_RI_USAGE_PAGE(16, 0xFF00), /* Vendor Page 1 */
|
||||||
HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */
|
HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */
|
||||||
HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */
|
HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */
|
||||||
HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
|
HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
|
||||||
|
@ -53,13 +53,13 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] =
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
|
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE),
|
HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||||
HID_RI_USAGE(8, 0x03), /* Vendor Usage 3 */
|
HID_RI_USAGE(8, 0x03), /* Vendor Usage 3 */
|
||||||
HID_RI_LOGICAL_MINIMUM(8, 0x00),
|
HID_RI_LOGICAL_MINIMUM(8, 0x00),
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
|
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE),
|
HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE),
|
||||||
HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
|
HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] =
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 100),
|
HID_RI_LOGICAL_MAXIMUM(8, 100),
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_REPORT_COUNT(8, 0x02),
|
HID_RI_REPORT_COUNT(8, 0x02),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
HID_RI_USAGE_PAGE(8, 0x09), /* Button */
|
HID_RI_USAGE_PAGE(8, 0x09), /* Button */
|
||||||
HID_RI_USAGE_MINIMUM(8, 0x01),
|
HID_RI_USAGE_MINIMUM(8, 0x01),
|
||||||
|
@ -65,7 +65,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] =
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
||||||
HID_RI_REPORT_SIZE(8, 0x01),
|
HID_RI_REPORT_SIZE(8, 0x01),
|
||||||
HID_RI_REPORT_COUNT(8, 0x02),
|
HID_RI_REPORT_COUNT(8, 0x02),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||||
HID_RI_REPORT_SIZE(8, 0x06),
|
HID_RI_REPORT_SIZE(8, 0x06),
|
||||||
HID_RI_REPORT_COUNT(8, 0x01),
|
HID_RI_REPORT_COUNT(8, 0x01),
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
||||||
|
|
|
@ -56,7 +56,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
||||||
HID_RI_REPORT_SIZE(8, 0x01),
|
HID_RI_REPORT_SIZE(8, 0x01),
|
||||||
HID_RI_REPORT_COUNT(8, 0x08),
|
HID_RI_REPORT_COUNT(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||||
HID_RI_REPORT_COUNT(8, 0x01),
|
HID_RI_REPORT_COUNT(8, 0x01),
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
||||||
|
@ -76,7 +76,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
|
||||||
HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
|
HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
|
||||||
HID_RI_REPORT_COUNT(8, 0x06),
|
HID_RI_REPORT_COUNT(8, 0x06),
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
|
||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
||||||
HID_RI_REPORT_COUNT(8, 0x03),
|
HID_RI_REPORT_COUNT(8, 0x03),
|
||||||
HID_RI_REPORT_SIZE(8, 0x01),
|
HID_RI_REPORT_SIZE(8, 0x01),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||||
HID_RI_REPORT_COUNT(8, 0x01),
|
HID_RI_REPORT_COUNT(8, 0x01),
|
||||||
HID_RI_REPORT_SIZE(8, 0x05),
|
HID_RI_REPORT_SIZE(8, 0x05),
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
||||||
|
@ -73,7 +73,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
|
||||||
HID_RI_PHYSICAL_MAXIMUM(8, 1),
|
HID_RI_PHYSICAL_MAXIMUM(8, 1),
|
||||||
HID_RI_REPORT_COUNT(8, 0x02),
|
HID_RI_REPORT_COUNT(8, 0x02),
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE | HID_IOF_NON_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
|
||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
};
|
};
|
||||||
|
@ -91,7 +91,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
||||||
HID_RI_REPORT_SIZE(8, 0x01),
|
HID_RI_REPORT_SIZE(8, 0x01),
|
||||||
HID_RI_REPORT_COUNT(8, 0x08),
|
HID_RI_REPORT_COUNT(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||||
HID_RI_REPORT_COUNT(8, 0x01),
|
HID_RI_REPORT_COUNT(8, 0x01),
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
||||||
|
@ -111,7 +111,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
|
||||||
HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
|
HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
|
||||||
HID_RI_REPORT_COUNT(8, 0x06),
|
HID_RI_REPORT_COUNT(8, 0x06),
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
|
||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
||||||
HID_RI_REPORT_COUNT(8, 0x03),
|
HID_RI_REPORT_COUNT(8, 0x03),
|
||||||
HID_RI_REPORT_SIZE(8, 0x01),
|
HID_RI_REPORT_SIZE(8, 0x01),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||||
HID_RI_REPORT_COUNT(8, 0x01),
|
HID_RI_REPORT_COUNT(8, 0x01),
|
||||||
HID_RI_REPORT_SIZE(8, 0x05),
|
HID_RI_REPORT_SIZE(8, 0x05),
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
||||||
|
@ -70,7 +70,7 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
|
||||||
HID_RI_PHYSICAL_MAXIMUM(8, 1),
|
HID_RI_PHYSICAL_MAXIMUM(8, 1),
|
||||||
HID_RI_REPORT_COUNT(8, 0x02),
|
HID_RI_REPORT_COUNT(8, 0x02),
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
HID_RI_REPORT_SIZE(8, 0x08),
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE | HID_IOF_NON_VOLATILE),
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
|
||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
};
|
};
|
||||||
|
|
|
@ -45,34 +45,15 @@
|
||||||
*/
|
*/
|
||||||
USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
|
USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
|
||||||
{
|
{
|
||||||
HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
|
/* Use the HID class driver's standard Mouse report.
|
||||||
HID_RI_USAGE(8, 0x02), /* Mouse */
|
* Min X/Y Axis values: -1
|
||||||
HID_RI_COLLECTION(8, 0x01), /* Application */
|
* Max X/Y Axis values: 1
|
||||||
HID_RI_USAGE(8, 0x01), /* Pointer */
|
* Min physical X/Y Axis values (used to determine resolution): -1
|
||||||
HID_RI_COLLECTION(8, 0x00), /* Physical */
|
* Max physical X/Y Axis values (used to determine resolution): 1
|
||||||
HID_RI_USAGE_PAGE(8, 0x09), /* Button */
|
* Buttons: 3
|
||||||
HID_RI_USAGE_MINIMUM(8, 0x01),
|
* Absolute screen coordinates: false
|
||||||
HID_RI_USAGE_MAXIMUM(8, 0x03),
|
*/
|
||||||
HID_RI_LOGICAL_MINIMUM(8, 0x00),
|
HID_DESCRIPTOR_MOUSE(-1, 1, -1, 1, 3, false)
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
|
||||||
HID_RI_REPORT_COUNT(8, 0x03),
|
|
||||||
HID_RI_REPORT_SIZE(8, 0x01),
|
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
|
|
||||||
HID_RI_REPORT_COUNT(8, 0x01),
|
|
||||||
HID_RI_REPORT_SIZE(8, 0x05),
|
|
||||||
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_REPORT_COUNT(8, 0x02),
|
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE | HID_IOF_NON_VOLATILE),
|
|
||||||
HID_RI_END_COLLECTION(0),
|
|
||||||
HID_RI_END_COLLECTION(0),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
||||||
|
|
|
@ -348,28 +348,28 @@
|
||||||
* \param[in] Buttons Total number of buttons in the device
|
* \param[in] Buttons Total number of buttons in the device
|
||||||
*/
|
*/
|
||||||
#define HID_DESCRIPTOR_JOYSTICK(MinAxisVal, MaxAxisVal, Buttons) \
|
#define HID_DESCRIPTOR_JOYSTICK(MinAxisVal, MaxAxisVal, Buttons) \
|
||||||
HID_RI_USAGE_PAGE(8, 0x01), \
|
HID_RI_USAGE_PAGE(8, 0x01), \
|
||||||
HID_RI_USAGE(8, 0x04), \
|
HID_RI_USAGE(8, 0x04), \
|
||||||
HID_RI_COLLECTION(8, 0x01), \
|
HID_RI_COLLECTION(8, 0x01), \
|
||||||
HID_RI_USAGE(8, 0x01), \
|
HID_RI_USAGE(8, 0x01), \
|
||||||
HID_RI_COLLECTION(8, 0x00), \
|
HID_RI_COLLECTION(8, 0x00), \
|
||||||
HID_RI_USAGE(8, 0x30), \
|
HID_RI_USAGE(8, 0x30), \
|
||||||
HID_RI_USAGE(8, 0x31), \
|
HID_RI_USAGE(8, 0x31), \
|
||||||
HID_RI_REPORT_SIZE(8, (((((uint16_t)MinAxisVal > 0xFF) && ((uint16_t)MaxAxisVal < 0xFF)) ? 8 : 16))), \
|
HID_RI_REPORT_SIZE(8, (((((uint16_t)MinAxisVal > 0xFF) && ((uint16_t)MaxAxisVal < 0xFF)) ? 8 : 16))), \
|
||||||
HID_RI_REPORT_COUNT(8, 0x02), \
|
HID_RI_REPORT_COUNT(8, 0x02), \
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
|
||||||
HID_RI_END_COLLECTION(0), \
|
HID_RI_END_COLLECTION(0), \
|
||||||
HID_RI_USAGE_PAGE(8, 0x09), \
|
HID_RI_USAGE_PAGE(8, 0x09), \
|
||||||
HID_RI_USAGE_MINIMUM(8, 0x01), \
|
HID_RI_USAGE_MINIMUM(8, 0x01), \
|
||||||
HID_RI_USAGE_MAXIMUM(8, Buttons), \
|
HID_RI_USAGE_MAXIMUM(8, Buttons), \
|
||||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
|
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
|
HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
|
||||||
HID_RI_REPORT_SIZE(8, 0x01), \
|
HID_RI_REPORT_SIZE(8, 0x01), \
|
||||||
HID_RI_REPORT_COUNT(8, Buttons), \
|
HID_RI_REPORT_COUNT(8, Buttons), \
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
|
||||||
HID_RI_REPORT_SIZE(8, (8 - (Buttons % 8))), \
|
HID_RI_REPORT_SIZE(8, (8 - (Buttons % 8))), \
|
||||||
HID_RI_REPORT_COUNT(8, 0x01), \
|
HID_RI_REPORT_COUNT(8, 0x01), \
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT), \
|
HID_RI_INPUT(8, HID_IOF_CONSTANT), \
|
||||||
HID_RI_END_COLLECTION(0)
|
HID_RI_END_COLLECTION(0)
|
||||||
|
|
||||||
/** \hideinitializer
|
/** \hideinitializer
|
||||||
|
@ -389,38 +389,38 @@
|
||||||
* \param[in] MaxKeys Number of simultaneous keys that can be reported at the one time (a value between 1 and
|
* \param[in] MaxKeys Number of simultaneous keys that can be reported at the one time (a value between 1 and
|
||||||
* (ENDPOINT_SIZE - 2) )
|
* (ENDPOINT_SIZE - 2) )
|
||||||
*/
|
*/
|
||||||
#define HID_DESCRIPTOR_KEYBOARD(MaxKeys) \
|
#define HID_DESCRIPTOR_KEYBOARD(MaxKeys) \
|
||||||
HID_RI_USAGE_PAGE(8, 0x01), \
|
HID_RI_USAGE_PAGE(8, 0x01), \
|
||||||
HID_RI_USAGE(8, 0x06), \
|
HID_RI_USAGE(8, 0x06), \
|
||||||
HID_RI_COLLECTION(8, 0x01), \
|
HID_RI_COLLECTION(8, 0x01), \
|
||||||
HID_RI_USAGE_PAGE(8, 0x07), \
|
HID_RI_USAGE_PAGE(8, 0x07), \
|
||||||
HID_RI_USAGE_MINIMUM(8, 0xE0), \
|
HID_RI_USAGE_MINIMUM(8, 0xE0), \
|
||||||
HID_RI_USAGE_MAXIMUM(8, 0xE7), \
|
HID_RI_USAGE_MAXIMUM(8, 0xE7), \
|
||||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
|
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
|
HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
|
||||||
HID_RI_REPORT_SIZE(8, 0x01), \
|
HID_RI_REPORT_SIZE(8, 0x01), \
|
||||||
HID_RI_REPORT_COUNT(8, 0x08), \
|
HID_RI_REPORT_COUNT(8, 0x08), \
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
|
||||||
HID_RI_REPORT_COUNT(8, 0x01), \
|
HID_RI_REPORT_COUNT(8, 0x01), \
|
||||||
HID_RI_REPORT_SIZE(8, 0x08), \
|
HID_RI_REPORT_SIZE(8, 0x08), \
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT), \
|
HID_RI_INPUT(8, HID_IOF_CONSTANT), \
|
||||||
HID_RI_USAGE_PAGE(8, 0x08), \
|
HID_RI_USAGE_PAGE(8, 0x08), \
|
||||||
HID_RI_USAGE_MINIMUM(8, 0x01), \
|
HID_RI_USAGE_MINIMUM(8, 0x01), \
|
||||||
HID_RI_USAGE_MAXIMUM(8, 0x05), \
|
HID_RI_USAGE_MAXIMUM(8, 0x05), \
|
||||||
HID_RI_REPORT_COUNT(8, 0x05), \
|
HID_RI_REPORT_COUNT(8, 0x05), \
|
||||||
HID_RI_REPORT_SIZE(8, 0x01), \
|
HID_RI_REPORT_SIZE(8, 0x01), \
|
||||||
HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
|
HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
|
||||||
HID_RI_REPORT_COUNT(8, 0x01), \
|
HID_RI_REPORT_COUNT(8, 0x01), \
|
||||||
HID_RI_REPORT_SIZE(8, 0x03), \
|
HID_RI_REPORT_SIZE(8, 0x03), \
|
||||||
HID_RI_OUTPUT(8, HID_IOF_CONSTANT), \
|
HID_RI_OUTPUT(8, HID_IOF_CONSTANT), \
|
||||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
|
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x65), \
|
HID_RI_LOGICAL_MAXIMUM(8, 0x65), \
|
||||||
HID_RI_USAGE_PAGE(8, 0x07), \
|
HID_RI_USAGE_PAGE(8, 0x07), \
|
||||||
HID_RI_USAGE_MINIMUM(8, 0x00), \
|
HID_RI_USAGE_MINIMUM(8, 0x00), \
|
||||||
HID_RI_USAGE_MAXIMUM(8, 0x65), \
|
HID_RI_USAGE_MAXIMUM(8, 0x65), \
|
||||||
HID_RI_REPORT_COUNT(8, MaxKeys), \
|
HID_RI_REPORT_COUNT(8, MaxKeys), \
|
||||||
HID_RI_REPORT_SIZE(8, 0x08), \
|
HID_RI_REPORT_SIZE(8, 0x08), \
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), \
|
||||||
HID_RI_END_COLLECTION(0)
|
HID_RI_END_COLLECTION(0)
|
||||||
|
|
||||||
/** \hideinitializer
|
/** \hideinitializer
|
||||||
|
@ -448,34 +448,63 @@
|
||||||
* \param[in] AbsoluteCoords Boolean true to use absolute X/Y coordinates (e.g. touchscreen)
|
* \param[in] AbsoluteCoords Boolean true to use absolute X/Y coordinates (e.g. touchscreen)
|
||||||
*/
|
*/
|
||||||
#define HID_DESCRIPTOR_MOUSE(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, AbsoluteCoords) \
|
#define HID_DESCRIPTOR_MOUSE(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, AbsoluteCoords) \
|
||||||
HID_RI_USAGE_PAGE(8, 0x01), \
|
HID_RI_USAGE_PAGE(8, 0x01), \
|
||||||
HID_RI_USAGE(8, 0x02), \
|
HID_RI_USAGE(8, 0x02), \
|
||||||
HID_RI_COLLECTION(8, 0x01), \
|
HID_RI_COLLECTION(8, 0x01), \
|
||||||
HID_RI_USAGE(8, 0x01), \
|
HID_RI_USAGE(8, 0x01), \
|
||||||
HID_RI_COLLECTION(8, 0x00), \
|
HID_RI_COLLECTION(8, 0x00), \
|
||||||
HID_RI_USAGE_PAGE(8, 0x09), \
|
HID_RI_USAGE_PAGE(8, 0x09), \
|
||||||
HID_RI_USAGE_MINIMUM(8, 0x01), \
|
HID_RI_USAGE_MINIMUM(8, 0x01), \
|
||||||
HID_RI_USAGE_MAXIMUM(8, Buttons), \
|
HID_RI_USAGE_MAXIMUM(8, Buttons), \
|
||||||
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
|
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
|
HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
|
||||||
HID_RI_REPORT_COUNT(8, Buttons), \
|
HID_RI_REPORT_COUNT(8, Buttons), \
|
||||||
HID_RI_REPORT_SIZE(8, 0x01), \
|
HID_RI_REPORT_SIZE(8, 0x01), \
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE), \
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
|
||||||
HID_RI_REPORT_COUNT(8, 0x01), \
|
HID_RI_REPORT_COUNT(8, 0x01), \
|
||||||
HID_RI_REPORT_SIZE(8, (8 - (Buttons % 8))), \
|
HID_RI_REPORT_SIZE(8, (8 - (Buttons % 8))), \
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT), \
|
HID_RI_INPUT(8, HID_IOF_CONSTANT), \
|
||||||
HID_RI_USAGE_PAGE(8, 0x01), \
|
HID_RI_USAGE_PAGE(8, 0x01), \
|
||||||
HID_RI_USAGE(8, 0x30), \
|
HID_RI_USAGE(8, 0x30), \
|
||||||
HID_RI_USAGE(8, 0x31), \
|
HID_RI_USAGE(8, 0x31), \
|
||||||
HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \
|
HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \
|
||||||
HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \
|
HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \
|
||||||
HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \
|
HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \
|
||||||
HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \
|
HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \
|
||||||
HID_RI_REPORT_COUNT(8, 0x02), \
|
HID_RI_REPORT_COUNT(8, 0x02), \
|
||||||
HID_RI_REPORT_SIZE(8, (((((uint16_t)MinAxisVal > 0xFF) && ((uint16_t)MaxAxisVal < 0xFF)) ? 8 : 16))), \
|
HID_RI_REPORT_SIZE(8, (((((uint16_t)MinAxisVal > 0xFF) && ((uint16_t)MaxAxisVal < 0xFF)) ? 8 : 16))), \
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | (AbsoluteCoords ? HID_IOF_ABSOLUTE : HID_IOF_RELATIVE) | HID_IOF_NON_VOLATILE), \
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | (AbsoluteCoords ? HID_IOF_ABSOLUTE : HID_IOF_RELATIVE)), \
|
||||||
HID_RI_END_COLLECTION(0), \
|
HID_RI_END_COLLECTION(0), \
|
||||||
HID_RI_END_COLLECTION(0)
|
HID_RI_END_COLLECTION(0)
|
||||||
|
|
||||||
|
/** \hideinitializer
|
||||||
|
* A list of HID report item array elements that describe a typical Vendor Defined byte array HID report descriptor,
|
||||||
|
* used for transporting abitrary data between the USB host and device via HID reports. The resulting report should be
|
||||||
|
* a uint8_t byte array of the specified length in both Device to Host (IN) and Host to Device (OUT) directions.
|
||||||
|
*
|
||||||
|
* \param[in] VendorPageNum Vendor Defined HID Usage Page index, ranging from 0x00 to 0xFF
|
||||||
|
* \param[in] CollectionUsage Vendor Usage for the encompasing report IN and OUT collection, ranging from 0x00 to 0xFF
|
||||||
|
* \param[in] DataINUsage Vendor Usage for the IN report data, ranging from 0x00 to 0xFF
|
||||||
|
* \param[in] DataOUTUsage Vendor Usage for the OUT report data, ranging from 0x00 to 0xFF
|
||||||
|
* \param[in] NumBytes Length of the data IN and OUT reports
|
||||||
|
*/
|
||||||
|
#define HID_DESCRIPTOR_VENDOR(VendorPageNum, CollectionUsage, DataINUsage, DataOUTUsage, NumBytes) \
|
||||||
|
HID_RI_USAGE_PAGE(16, (0xFF00 | VendorPageNum)), \
|
||||||
|
HID_RI_USAGE(8, CollectionUsage), \
|
||||||
|
HID_RI_COLLECTION(8, 0x01), \
|
||||||
|
HID_RI_USAGE(8, DataINUsage), \
|
||||||
|
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
|
||||||
|
HID_RI_LOGICAL_MAXIMUM(8, 0xFF), \
|
||||||
|
HID_RI_REPORT_SIZE(8, 0x08), \
|
||||||
|
HID_RI_REPORT_COUNT(8, NumBytes), \
|
||||||
|
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
|
||||||
|
HID_RI_USAGE(8, DataOUTUsage), \
|
||||||
|
HID_RI_LOGICAL_MINIMUM(8, 0x00), \
|
||||||
|
HID_RI_LOGICAL_MAXIMUM(8, 0xFF), \
|
||||||
|
HID_RI_REPORT_SIZE(8, 0x08), \
|
||||||
|
HID_RI_REPORT_COUNT(8, NumBytes), \
|
||||||
|
HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
|
||||||
|
HID_RI_END_COLLECTION(0)
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
/* Type Defines: */
|
/* Type Defines: */
|
||||||
|
|
|
@ -96,6 +96,9 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
|
||||||
CurrStateTable--;
|
CurrStateTable--;
|
||||||
break;
|
break;
|
||||||
case HID_RI_USAGE_PAGE(0):
|
case HID_RI_USAGE_PAGE(0):
|
||||||
|
if ((HIDReportItem & HID_RI_DATA_SIZE_MASK) == HID_RI_DATA_BITS_32)
|
||||||
|
CurrStateTable->Attributes.Usage.Page = (ReportItemData >> 16);
|
||||||
|
|
||||||
CurrStateTable->Attributes.Usage.Page = ReportItemData;
|
CurrStateTable->Attributes.Usage.Page = ReportItemData;
|
||||||
break;
|
break;
|
||||||
case HID_RI_LOGICAL_MINIMUM(0):
|
case HID_RI_LOGICAL_MINIMUM(0):
|
||||||
|
|
|
@ -217,7 +217,7 @@
|
||||||
{
|
{
|
||||||
uint16_t BitOffset; /**< Bit offset in the IN, OUT or FEATURE report of the item. */
|
uint16_t BitOffset; /**< Bit offset in the IN, OUT or FEATURE report of the item. */
|
||||||
uint8_t ItemType; /**< Report item type, a value in \ref HID_ReportItemTypes_t. */
|
uint8_t ItemType; /**< Report item type, a value in \ref HID_ReportItemTypes_t. */
|
||||||
uint16_t ItemFlags; /**< Item data flags, such as constant/variable, etc. */
|
uint16_t ItemFlags; /**< Item data flags, a mask of HID_IOF_* constants. */
|
||||||
uint8_t ReportID; /**< Report ID this item belongs to, or 0x00 if device has only one report */
|
uint8_t ReportID; /**< Report ID this item belongs to, or 0x00 if device has only one report */
|
||||||
HID_CollectionPath_t* CollectionPath; /**< Collection path of the item. */
|
HID_CollectionPath_t* CollectionPath; /**< Collection path of the item. */
|
||||||
|
|
||||||
|
|
|
@ -49,76 +49,76 @@
|
||||||
/* Private Interface - For use in library only: */
|
/* Private Interface - For use in library only: */
|
||||||
#if !defined(__DOXYGEN__)
|
#if !defined(__DOXYGEN__)
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
#define HID_RI_DATA_SIZE_MASK 0x03
|
#define HID_RI_DATA_SIZE_MASK 0x03
|
||||||
#define HID_RI_TYPE_MASK 0x0C
|
#define HID_RI_TYPE_MASK 0x0C
|
||||||
#define HID_RI_TAG_MASK 0xF0
|
#define HID_RI_TAG_MASK 0xF0
|
||||||
|
|
||||||
#define HID_RI_TYPE_MAIN 0x00
|
#define HID_RI_TYPE_MAIN 0x00
|
||||||
#define HID_RI_TYPE_GLOBAL 0x04
|
#define HID_RI_TYPE_GLOBAL 0x04
|
||||||
#define HID_RI_TYPE_LOCAL 0x08
|
#define HID_RI_TYPE_LOCAL 0x08
|
||||||
|
|
||||||
#define HID_RI_DATA_BITS_0 0x00
|
#define HID_RI_DATA_BITS_0 0x00
|
||||||
#define HID_RI_DATA_BITS_8 0x01
|
#define HID_RI_DATA_BITS_8 0x01
|
||||||
#define HID_RI_DATA_BITS_16 0x02
|
#define HID_RI_DATA_BITS_16 0x02
|
||||||
#define HID_RI_DATA_BITS_32 0x03
|
#define HID_RI_DATA_BITS_32 0x03
|
||||||
#define HID_RI_DATA_BITS(DataBits) HID_RI_DATA_BITS_ ## DataBits
|
#define HID_RI_DATA_BITS(DataBits) HID_RI_DATA_BITS_ ## DataBits
|
||||||
|
|
||||||
#define _HID_RI_ENCODE_0(Data) /* No Data */
|
#define _HID_RI_ENCODE_0(Data)
|
||||||
#define _HID_RI_ENCODE_8(Data) , (Data & 0xFF)
|
#define _HID_RI_ENCODE_8(Data) , (Data & 0xFF)
|
||||||
#define _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_8(Data >> 8) _HID_RI_ENCODE_8(Data)
|
#define _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_8(Data) _HID_RI_ENCODE_8(Data >> 8)
|
||||||
#define _HID_RI_ENCODE_32(Data) _HID_RI_ENCODE_16(Data >> 16) _HID_RI_ENCODE_16(Data)
|
#define _HID_RI_ENCODE_32(Data) _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_16(Data >> 16)
|
||||||
#define _HID_RI_ENCODE(DataBits, ...) _HID_RI_ENCODE_ ## DataBits(__VA_ARGS__)
|
#define _HID_RI_ENCODE(DataBits, ...) _HID_RI_ENCODE_ ## DataBits(__VA_ARGS__)
|
||||||
|
|
||||||
#define _HID_RI_ENTRY(Type, Tag, DataBits, ...) \
|
#define _HID_RI_ENTRY(Type, Tag, DataBits, ...) \
|
||||||
(Type | Tag | HID_RI_DATA_BITS(DataBits)) _HID_RI_ENCODE(DataBits, (__VA_ARGS__))
|
(Type | Tag | HID_RI_DATA_BITS(DataBits)) _HID_RI_ENCODE(DataBits, (__VA_ARGS__))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Public Interface - May be used in end-application: */
|
/* Public Interface - May be used in end-application: */
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** \name HID Input, Output and Feature Report Descriptor Item Flags */
|
/** \name HID Input, Output and Feature Report Descriptor Item Flags */
|
||||||
//@{
|
//@{
|
||||||
#define HID_IOF_CONSTANT (1 << 0)
|
#define HID_IOF_CONSTANT (1 << 0)
|
||||||
#define HID_IOF_DATA (0 << 0)
|
#define HID_IOF_DATA (0 << 0)
|
||||||
#define HID_IOF_VARIABLE (1 << 1)
|
#define HID_IOF_VARIABLE (1 << 1)
|
||||||
#define HID_IOF_ARRAY (0 << 1)
|
#define HID_IOF_ARRAY (0 << 1)
|
||||||
#define HID_IOF_RELATIVE (1 << 2)
|
#define HID_IOF_RELATIVE (1 << 2)
|
||||||
#define HID_IOF_ABSOLUTE (0 << 2)
|
#define HID_IOF_ABSOLUTE (0 << 2)
|
||||||
#define HID_IOF_WRAP (1 << 3)
|
#define HID_IOF_WRAP (1 << 3)
|
||||||
#define HID_IOF_NO_WRAP (0 << 3)
|
#define HID_IOF_NO_WRAP (0 << 3)
|
||||||
#define HID_IOF_NON_LINEAR (1 << 4)
|
#define HID_IOF_NON_LINEAR (1 << 4)
|
||||||
#define HID_IOF_LINEAR (0 << 4)
|
#define HID_IOF_LINEAR (0 << 4)
|
||||||
#define HID_IOF_NO_PREFERRED_STATE (1 << 5)
|
#define HID_IOF_NO_PREFERRED_STATE (1 << 5)
|
||||||
#define HID_IOF_PREFERRED_STATE (0 << 5)
|
#define HID_IOF_PREFERRED_STATE (0 << 5)
|
||||||
#define HID_IOF_NULLSTATE (1 << 6)
|
#define HID_IOF_NULLSTATE (1 << 6)
|
||||||
#define HID_IOF_NO_NULL_POSITION (0 << 6)
|
#define HID_IOF_NO_NULL_POSITION (0 << 6)
|
||||||
#define HID_IOF_VOLATILE (1 << 7)
|
#define HID_IOF_VOLATILE (1 << 7)
|
||||||
#define HID_IOF_NON_VOLATILE (0 << 7)
|
#define HID_IOF_NON_VOLATILE (0 << 7)
|
||||||
#define HID_IOF_BUFFERED_BYTES (1 << 8)
|
#define HID_IOF_BUFFERED_BYTES (1 << 8)
|
||||||
#define HID_IOF_BITFIELD (0 << 8)
|
#define HID_IOF_BITFIELD (0 << 8)
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
/** \name HID Report Descriptor Item Macros */
|
/** \name HID Report Descriptor Item Macros */
|
||||||
//@{
|
//@{
|
||||||
#define HID_RI_INPUT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0x80, DataBits, __VA_ARGS__)
|
#define HID_RI_INPUT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0x80, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_OUTPUT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0x90, DataBits, __VA_ARGS__)
|
#define HID_RI_OUTPUT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0x90, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_COLLECTION(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xA0, DataBits, __VA_ARGS__)
|
#define HID_RI_COLLECTION(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xA0, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_FEATURE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xB0, DataBits, __VA_ARGS__)
|
#define HID_RI_FEATURE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xB0, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_END_COLLECTION(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xC0, DataBits, __VA_ARGS__)
|
#define HID_RI_END_COLLECTION(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_MAIN , 0xC0, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_USAGE_PAGE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x00, DataBits, __VA_ARGS__)
|
#define HID_RI_USAGE_PAGE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x00, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_LOGICAL_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x10, DataBits, __VA_ARGS__)
|
#define HID_RI_LOGICAL_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x10, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_LOGICAL_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x20, DataBits, __VA_ARGS__)
|
#define HID_RI_LOGICAL_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x20, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_PHYSICAL_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x30, DataBits, __VA_ARGS__)
|
#define HID_RI_PHYSICAL_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x30, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_PHYSICAL_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x40, DataBits, __VA_ARGS__)
|
#define HID_RI_PHYSICAL_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x40, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_UNIT_EXPONENT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x50, DataBits, __VA_ARGS__)
|
#define HID_RI_UNIT_EXPONENT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x50, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_UNIT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x60, DataBits, __VA_ARGS__)
|
#define HID_RI_UNIT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x60, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_REPORT_SIZE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x70, DataBits, __VA_ARGS__)
|
#define HID_RI_REPORT_SIZE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x70, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_REPORT_ID(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x80, DataBits, __VA_ARGS__)
|
#define HID_RI_REPORT_ID(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x80, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_REPORT_COUNT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x90, DataBits, __VA_ARGS__)
|
#define HID_RI_REPORT_COUNT(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x90, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_PUSH(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xA0, DataBits, __VA_ARGS__)
|
#define HID_RI_PUSH(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xA0, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_POP(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xB0, DataBits, __VA_ARGS__)
|
#define HID_RI_POP(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xB0, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_USAGE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x00, DataBits, __VA_ARGS__)
|
#define HID_RI_USAGE(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x00, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_USAGE_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x10, DataBits, __VA_ARGS__)
|
#define HID_RI_USAGE_MINIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x10, DataBits, __VA_ARGS__)
|
||||||
#define HID_RI_USAGE_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x20, DataBits, __VA_ARGS__)
|
#define HID_RI_USAGE_MAXIMUM(DataBits, ...) _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x20, DataBits, __VA_ARGS__)
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -320,9 +320,9 @@
|
||||||
* This event is time-critical; it is run once per millisecond and thus long handlers will significantly
|
* This event is time-critical; it is run once per millisecond and thus long handlers will significantly
|
||||||
* degrade device performance. This event should only be enabled when needed to reduce device wake-ups.
|
* degrade device performance. This event should only be enabled when needed to reduce device wake-ups.
|
||||||
*
|
*
|
||||||
* \note This event is not normally active - it must be manually enabled and disabled via the
|
* \pre This event is not normally active - it must be manually enabled and disabled via the
|
||||||
* \ref USB_Device_EnableSOFEvents() and \ref USB_Device_DisableSOFEvents() commands after enumeration.
|
* \ref USB_Device_EnableSOFEvents() and \ref USB_Device_DisableSOFEvents() commands after enumeration.
|
||||||
* \n\n
|
* \n\n
|
||||||
*
|
*
|
||||||
* \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
|
* \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
|
||||||
* \ref Group_USBManagement documentation).
|
* \ref Group_USBManagement documentation).
|
||||||
|
|
|
@ -60,11 +60,11 @@
|
||||||
/* Private Interface - For use in library only: */
|
/* Private Interface - For use in library only: */
|
||||||
#if !defined(__DOXYGEN__)
|
#if !defined(__DOXYGEN__)
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
#define USB_INT_Enable(int) do { USB_INT_GET_EN_REG(int) |= USB_INT_GET_EN_MASK(int); } while(0)
|
#define USB_INT_Enable(int) MACROS{ USB_INT_GET_EN_REG(int) |= USB_INT_GET_EN_MASK(int); }MACROE
|
||||||
#define USB_INT_Disable(int) do { USB_INT_GET_EN_REG(int) &= ~(USB_INT_GET_EN_MASK(int)); } while(0)
|
#define USB_INT_Disable(int) MACROS{ USB_INT_GET_EN_REG(int) &= ~(USB_INT_GET_EN_MASK(int)); }MACROE
|
||||||
#define USB_INT_Clear(int) do { USB_INT_GET_INT_REG(int) &= ~(USB_INT_GET_INT_MASK(int)); } while(0)
|
#define USB_INT_Clear(int) MACROS{ USB_INT_GET_INT_REG(int) &= ~(USB_INT_GET_INT_MASK(int)); }MACROE
|
||||||
#define USB_INT_IsEnabled(int) ((USB_INT_GET_EN_REG(int) & USB_INT_GET_EN_MASK(int)) ? true : false)
|
#define USB_INT_IsEnabled(int) ((USB_INT_GET_EN_REG(int) & USB_INT_GET_EN_MASK(int)) ? true : false)
|
||||||
#define USB_INT_HasOccurred(int) ((USB_INT_GET_INT_REG(int) & USB_INT_GET_INT_MASK(int)) ? true : false)
|
#define USB_INT_HasOccurred(int) ((USB_INT_GET_INT_REG(int) & USB_INT_GET_INT_MASK(int)) ? true : false)
|
||||||
|
|
||||||
#define USB_INT_GET_EN_REG(a, b, c, d) a
|
#define USB_INT_GET_EN_REG(a, b, c, d) a
|
||||||
#define USB_INT_GET_EN_MASK(a, b, c, d) b
|
#define USB_INT_GET_EN_MASK(a, b, c, d) b
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
* - Added new Endpoint_Null_Stream() and Pipe_Null_stream() functions
|
* - Added new Endpoint_Null_Stream() and Pipe_Null_stream() functions
|
||||||
* - Added new ADC_GET_CHANNEL_MASK() convenience macro
|
* - Added new ADC_GET_CHANNEL_MASK() convenience macro
|
||||||
* - Added new HID report item macros (with HID_RI_ prefix) to allow for easy creation and editing of HID report descriptors
|
* - Added new HID report item macros (with HID_RI_ prefix) to allow for easy creation and editing of HID report descriptors
|
||||||
* - Added new HID_DESCRIPTOR_MOUSE, HID_DESCRIPTOR_KEYBOARD and HID_DESCRIPTOR_JOYSTICK macros for easy automatic creation of
|
* - Added new HID_DESCRIPTOR_MOUSE, HID_DESCRIPTOR_KEYBOARD, HID_DESCRIPTOR_JOYSTICK and HID_DESCRIPTOR_VENDOR macros
|
||||||
* basic USB HID device reports
|
* for easy automatic creation of basic USB HID device reports
|
||||||
* - Added new MAX() and MIN() convenience macros
|
* - Added new MAX() and MIN() convenience macros
|
||||||
* - Library Applications:
|
* - Library Applications:
|
||||||
* - Added ability to write protect Mass Storage disk write operations from the host OS
|
* - Added ability to write protect Mass Storage disk write operations from the host OS
|
||||||
|
@ -39,6 +39,7 @@
|
||||||
* - The NO_STREAM_CALLBACKS compile time option has now been removed due to the new partial stream transfer feature
|
* - The NO_STREAM_CALLBACKS compile time option has now been removed due to the new partial stream transfer feature
|
||||||
* - Changed over all project and demo HID report descriptors to use the new HID report item macros
|
* - Changed over all project and demo HID report descriptors to use the new HID report item macros
|
||||||
* - Moved the HIDParser.c source file to the LUFA/Drivers/USB/Class/Common/ directory from the LUFA/Drivers/USB/Class/Host/
|
* - Moved the HIDParser.c source file to the LUFA/Drivers/USB/Class/Common/ directory from the LUFA/Drivers/USB/Class/Host/
|
||||||
|
* - Added support to the HID parser for extended USAGE items that contain the usage page as well as the usage index
|
||||||
* - Library Applications:
|
* - Library Applications:
|
||||||
* - Changed the XPLAINBridge software UART to use the regular timer CTC mode instead of the alternative CTC mode
|
* - Changed the XPLAINBridge software UART to use the regular timer CTC mode instead of the alternative CTC mode
|
||||||
* via the Input Capture register, to reduce user confusion
|
* via the Input Capture register, to reduce user confusion
|
||||||
|
|
|
@ -106,6 +106,9 @@ int main(void)
|
||||||
/* Check if the millisecond timer has elapsed */
|
/* Check if the millisecond timer has elapsed */
|
||||||
if (TIFR0 & (1 << OCF0A))
|
if (TIFR0 & (1 << OCF0A))
|
||||||
{
|
{
|
||||||
|
/* Clear flush timer expiry flag */
|
||||||
|
TIFR0 |= (1 << TOV0);
|
||||||
|
|
||||||
/* Check if the reset pulse period has elapsed, if so tristate the target reset line */
|
/* Check if the reset pulse period has elapsed, if so tristate the target reset line */
|
||||||
if (PulseMSRemaining.ResetPulse && !(--PulseMSRemaining.ResetPulse))
|
if (PulseMSRemaining.ResetPulse && !(--PulseMSRemaining.ResetPulse))
|
||||||
{
|
{
|
||||||
|
@ -132,31 +135,29 @@ int main(void)
|
||||||
uint16_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer);
|
uint16_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer);
|
||||||
if (!(--FlushPeriodRemaining) || (BufferCount > 200))
|
if (!(--FlushPeriodRemaining) || (BufferCount > 200))
|
||||||
{
|
{
|
||||||
/* Echo bytes from the target to the host via the virtual serial port */
|
FlushPeriodRemaining = RECEIVE_BUFFER_FLUSH_MS;
|
||||||
|
|
||||||
|
/* Start RX LED indicator pulse */
|
||||||
if (BufferCount)
|
if (BufferCount)
|
||||||
{
|
{
|
||||||
while (BufferCount--)
|
|
||||||
{
|
|
||||||
/* Try to send the next byte of data to the host, abort if there is an error without dequeuing */
|
|
||||||
if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,
|
|
||||||
RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */
|
|
||||||
RingBuffer_Remove(&USARTtoUSB_Buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
LEDs_TurnOnLEDs(LEDMASK_RX);
|
LEDs_TurnOnLEDs(LEDMASK_RX);
|
||||||
PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS;
|
PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS;
|
||||||
}
|
}
|
||||||
|
|
||||||
FlushPeriodRemaining = RECEIVE_BUFFER_FLUSH_MS;
|
/* Echo bytes from the target to the host via the virtual serial port */
|
||||||
|
while (BufferCount--)
|
||||||
|
{
|
||||||
|
/* Try to send the next byte of data to the host, abort if there is an error without dequeuing */
|
||||||
|
if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,
|
||||||
|
RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */
|
||||||
|
RingBuffer_Remove(&USARTtoUSB_Buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear the millisecond timer CTC flag (cleared by writing logic one to the register) */
|
|
||||||
TIFR0 |= (1 << OCF0A);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
|
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
|
||||||
|
|
|
@ -131,7 +131,7 @@ LUFA_OPTS += -D AVR_RESET_LINE_MASK="(1 << 4)"
|
||||||
LUFA_OPTS += -D AVR_RESET_PULSE_MS=10
|
LUFA_OPTS += -D AVR_RESET_PULSE_MS=10
|
||||||
LUFA_OPTS += -D TX_RX_LED_PULSE_MS=30
|
LUFA_OPTS += -D TX_RX_LED_PULSE_MS=30
|
||||||
LUFA_OPTS += -D PING_PONG_LED_PULSE_MS=100
|
LUFA_OPTS += -D PING_PONG_LED_PULSE_MS=100
|
||||||
LUFA_OPTS += -D RECEIVE_BUFFER_FLUSH_MS=20
|
LUFA_OPTS += -D RECEIVE_BUFFER_FLUSH_MS=10
|
||||||
|
|
||||||
|
|
||||||
# Create the LUFA source path variables by including the LUFA root makefile
|
# Create the LUFA source path variables by including the LUFA root makefile
|
||||||
|
|
|
@ -46,38 +46,10 @@
|
||||||
*/
|
*/
|
||||||
USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
|
USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
|
||||||
{
|
{
|
||||||
HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
|
/* Use the HID class driver's standard Keyboard report.
|
||||||
HID_RI_USAGE(8, 0x06), /* Keyboard */
|
* Max simultaneous keys: 6
|
||||||
HID_RI_COLLECTION(8, 0x01), /* Application */
|
*/
|
||||||
HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
|
HID_DESCRIPTOR_KEYBOARD(6)
|
||||||
HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */
|
|
||||||
HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */
|
|
||||||
HID_RI_LOGICAL_MINIMUM(8, 0x00),
|
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
|
||||||
HID_RI_REPORT_SIZE(8, 0x01),
|
|
||||||
HID_RI_REPORT_COUNT(8, 0x08),
|
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
|
||||||
HID_RI_REPORT_COUNT(8, 0x01),
|
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
|
||||||
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
|
||||||
HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
|
|
||||||
HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
|
|
||||||
HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
|
|
||||||
HID_RI_REPORT_COUNT(8, 0x05),
|
|
||||||
HID_RI_REPORT_SIZE(8, 0x01),
|
|
||||||
HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
|
||||||
HID_RI_REPORT_COUNT(8, 0x01),
|
|
||||||
HID_RI_REPORT_SIZE(8, 0x03),
|
|
||||||
HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
|
|
||||||
HID_RI_LOGICAL_MINIMUM(8, 0x00),
|
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0x65),
|
|
||||||
HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */
|
|
||||||
HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */
|
|
||||||
HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
|
|
||||||
HID_RI_REPORT_COUNT(8, 0x06),
|
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
|
|
||||||
HID_RI_END_COLLECTION(0),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
||||||
|
|
|
@ -219,6 +219,6 @@ void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDI
|
||||||
const void* ReportData,
|
const void* ReportData,
|
||||||
const uint16_t ReportSize)
|
const uint16_t ReportSize)
|
||||||
{
|
{
|
||||||
// Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports
|
// Ignore keyboard LED reports from the host, but still need to declare the callback routine
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,22 +57,14 @@
|
||||||
*/
|
*/
|
||||||
USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] =
|
USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] =
|
||||||
{
|
{
|
||||||
HID_RI_USAGE_PAGE(16, 0x00FF), /* Vendor Page 1 */
|
/* Use the HID class driver's standard Joystick report.
|
||||||
HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */
|
* Vendor Usage Page: 1
|
||||||
HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */
|
* Vendor Collection Usage: 1
|
||||||
HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
|
* Vendor Report IN Usage: 2
|
||||||
HID_RI_LOGICAL_MINIMUM(8, 0x00),
|
* Vendor Report OUT Usage: 3
|
||||||
HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
|
* Vendor Report Size: GENERIC_REPORT_SIZE
|
||||||
HID_RI_REPORT_SIZE(8, 0x08),
|
*/
|
||||||
HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE),
|
HID_DESCRIPTOR_VENDOR(0x00, 0x01, 0x02, 0x03, GENERIC_REPORT_SIZE)
|
||||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
|
|
||||||
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_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE),
|
|
||||||
HID_RI_END_COLLECTION(0),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
||||||
|
|
|
@ -46,7 +46,7 @@ uint8_t USBtoUSART_Buffer_Data[128];
|
||||||
RingBuffer_t USARTtoUSB_Buffer;
|
RingBuffer_t USARTtoUSB_Buffer;
|
||||||
|
|
||||||
/** Underlying data buffer for \ref USARTtoUSB_Buffer, where the stored bytes are located. */
|
/** Underlying data buffer for \ref USARTtoUSB_Buffer, where the stored bytes are located. */
|
||||||
uint8_t USARTtoUSB_Buffer_Data[128];
|
uint8_t USARTtoUSB_Buffer_Data[128];
|
||||||
|
|
||||||
|
|
||||||
/** LUFA CDC Class driver interface configuration and state information. This structure is
|
/** LUFA CDC Class driver interface configuration and state information. This structure is
|
||||||
|
|
Loading…
Reference in New Issue