\r
for (;;)\r
{\r
- switch (USB_HostState)\r
- {\r
- case HOST_STATE_Addressed:\r
- LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
-\r
- uint16_t ConfigDescriptorSize;\r
- uint8_t ConfigDescriptorData[512];\r
-\r
- if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,\r
- sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)\r
- {\r
- puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));\r
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
- break;\r
- }\r
-\r
- if (HID_Host_ConfigurePipes(&Device_HID_Interface,\r
- ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)\r
- {\r
- puts_P(PSTR("Attached Device Not a Valid HID Device.\r\n"));\r
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
- break;\r
- }\r
-\r
- if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)\r
- {\r
- puts_P(PSTR("Error Setting Device Configuration.\r\n"));\r
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
- break;\r
- }\r
-\r
- if (HID_Host_SetReportProtocol(&Device_HID_Interface) != 0)\r
- {\r
- puts_P(PSTR("Error Setting Report Protocol Mode.\r\n"));\r
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
- break;\r
- }\r
-\r
- puts_P(PSTR("HID Device Enumerated.\r\n"));\r
- LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
- USB_HostState = HOST_STATE_Configured;\r
- break;\r
- case HOST_STATE_Configured:\r
- LEDs_SetAllLEDs(LEDMASK_USB_BUSY);\r
- \r
- printf_P(PSTR("\r\n\r\nTotal Reports: %" PRId8 "\r\n"), HIDReportInfo.TotalDeviceReports);\r
- for (uint8_t ReportIndex = 0; ReportIndex < HIDReportInfo.TotalDeviceReports; ReportIndex++)\r
- {\r
- HID_ReportSizeInfo_t* CurrReportIDInfo = &HIDReportInfo.ReportIDSizes[ReportIndex];\r
-\r
- uint8_t ReportSizeInBits = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_In];\r
- uint8_t ReportSizeOutBits = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_Out];\r
- uint8_t ReportSizeFeatureBits = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_Feature];\r
-\r
- /* Print out the byte sizes of each report within the device */\r
- printf_P(PSTR(" + Report ID 0x%02" PRIX8 "\r\n"\r
- " - Input Data: %" PRId8 " bits (%" PRId8 " bytes)\r\n"\r
- " - Output Data: %" PRId8 " bits (%" PRId8 " bytes)\r\n"\r
- " - Feature Data: %" PRId8 " bits (%" PRId8 " bytes)\r\n"),\r
- CurrReportIDInfo->ReportID,\r
- ReportSizeInBits,\r
- ((ReportSizeInBits >> 3) + ((ReportSizeInBits & 0x07) != 0)),\r
- ReportSizeOutBits,\r
- ((ReportSizeOutBits >> 3) + ((ReportSizeOutBits & 0x07) != 0)),\r
- ReportSizeFeatureBits,\r
- ((ReportSizeFeatureBits >> 3) + ((ReportSizeFeatureBits & 0x07) != 0)));\r
- }\r
- \r
- puts_P(PSTR("\r\nReport Items:\r\n"));\r
- for (uint8_t ItemIndex = 0; ItemIndex < HIDReportInfo.TotalReportItems; ItemIndex++)\r
- {\r
- const HID_ReportItem_t* RItem = &HIDReportInfo.ReportItems[ItemIndex];\r
-\r
- printf_P(PSTR(" + Item %" PRId8 ":\r\n"\r
- " - Report ID: 0x%02" PRIX8 "\r\n"\r
- " - Data Direction: %s\r\n"\r
- " - Item Flags: 0x%02" PRIX8 "\r\n"\r
- " - Item Offset (Bits): 0x%02" PRIX8 "\r\n"\r
- " - Item Size (Bits): 0x%02" PRIX8 "\r\n"\r
- " - Usage Page: 0x%04" PRIX16 "\r\n"\r
- " - Usage: 0x%04" PRIX16 "\r\n"\r
- " - Unit Type: 0x%08" PRIX32 "\r\n"\r
- " - Unit Exponent: 0x%02" PRIX8 "\r\n"\r
- " - Logical Minimum: 0x%08" PRIX32 "\r\n"\r
- " - Logical Maximum: 0x%08" PRIX32 "\r\n"\r
- " - Physical Minimum: 0x%08" PRIX32 "\r\n"\r
- " - Physical Maximum: 0x%08" PRIX32 "\r\n"\r
- " - Collection Path:\r\n"),\r
- ItemIndex,\r
- RItem->ReportID,\r
- ((RItem->ItemType == HID_REPORT_ITEM_In) ? "IN" : ((RItem->ItemType == HID_REPORT_ITEM_Out) ? "OUT" : "FEATURE")),\r
- RItem->ItemFlags,\r
- RItem->BitOffset,\r
- RItem->Attributes.BitSize,\r
- RItem->Attributes.Usage.Page,\r
- RItem->Attributes.Usage.Usage,\r
- RItem->Attributes.Unit.Type,\r
- RItem->Attributes.Unit.Exponent,\r
- RItem->Attributes.Logical.Minimum,\r
- RItem->Attributes.Logical.Maximum,\r
- RItem->Attributes.Physical.Minimum,\r
- RItem->Attributes.Physical.Maximum);\r
- \r
- const HID_CollectionPath_t* CollectionPath = RItem->CollectionPath;\r
- uint8_t CollectionDepth = 6;\r
- \r
- while (CollectionPath != NULL)\r
- {\r
- for (uint8_t i = 0; i < CollectionDepth; i++)\r
- putchar(' ');\r
-\r
- printf_P(PSTR("- Type: 0x%02" PRIX8 "\r\n"), CollectionPath->Type);\r
- \r
- for (uint8_t i = 0; i < CollectionDepth; i++)\r
- putchar(' ');\r
-\r
- printf_P(PSTR("- Usage: 0x%02" PRIX8 "\r\n"), CollectionPath->Usage);\r
-\r
- CollectionDepth += 3;\r
- CollectionPath = CollectionPath->Parent;\r
- }\r
- }\r
- \r
- LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
- break;\r
- }\r
-\r
+ RetrieveDeviceData();\r
+ \r
HID_Host_USBTask(&Device_HID_Interface);\r
USB_USBTask();\r
}\r
}\r
\r
+/** Task to retrieve the HID device information from an attached device, and output\r
+ * the relevant data to the serial port for analysis.\r
+ */\r
+void RetrieveDeviceData(void)\r
+{\r
+ if (USB_CurrentMode != USB_MODE_Host)\r
+ return;\r
+ \r
+ LEDs_SetAllLEDs(LEDMASK_USB_BUSY);\r
+ \r
+ OutputReportSizes();\r
+ OutputParsedReportItems();\r
+ \r
+ LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
+ USB_Host_SetDeviceConfiguration(0);\r
+}\r
+\r
+/** Prints a summary of the device's HID report sizes from the HID parser output to the serial port\r
+ * for display to the user.\r
+ */\r
+void OutputReportSizes(void)\r
+{\r
+ printf_P(PSTR("\r\n\r\nTotal Device Reports: %" PRId8 "\r\n"), HIDReportInfo.TotalDeviceReports);\r
+\r
+ for (uint8_t ReportIndex = 0; ReportIndex < HIDReportInfo.TotalDeviceReports; ReportIndex++)\r
+ {\r
+ const HID_ReportSizeInfo_t* CurrReportIDInfo = &HIDReportInfo.ReportIDSizes[ReportIndex];\r
+\r
+ uint8_t ReportSizeInBits = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_In];\r
+ uint8_t ReportSizeOutBits = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_Out];\r
+ uint8_t ReportSizeFeatureBits = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_Feature];\r
+\r
+ /* Print out the byte sizes of each report within the device */\r
+ printf_P(PSTR(" + Report ID 0x%02" PRIX8 "\r\n"\r
+ " - Input Data: %" PRId8 " bits (%" PRId8 " bytes)\r\n"\r
+ " - Output Data: %" PRId8 " bits (%" PRId8 " bytes)\r\n"\r
+ " - Feature Data: %" PRId8 " bits (%" PRId8 " bytes)\r\n"),\r
+ CurrReportIDInfo->ReportID,\r
+ ReportSizeInBits,\r
+ ((ReportSizeInBits >> 3) + ((ReportSizeInBits & 0x07) != 0)),\r
+ ReportSizeOutBits,\r
+ ((ReportSizeOutBits >> 3) + ((ReportSizeOutBits & 0x07) != 0)),\r
+ ReportSizeFeatureBits,\r
+ ((ReportSizeFeatureBits >> 3) + ((ReportSizeFeatureBits & 0x07) != 0)));\r
+ }\r
+}\r
+\r
+/** Prints a summary of the device's parsed and stored report items along with their attributes\r
+ * to the serial port for display to the user.\r
+ */\r
+void OutputParsedReportItems(void)\r
+{\r
+ printf_P(PSTR("\r\nReport Items (%" PRId8 " in Table):\r\n"), HIDReportInfo.TotalReportItems);\r
+\r
+ for (uint8_t ItemIndex = 0; ItemIndex < HIDReportInfo.TotalReportItems; ItemIndex++)\r
+ {\r
+ const HID_ReportItem_t* RItem = &HIDReportInfo.ReportItems[ItemIndex];\r
+\r
+ printf_P(PSTR(" + Item %" PRId8 ":\r\n"\r
+ " - Report ID: 0x%02" PRIX8 "\r\n"\r
+ " - Data Direction: %s\r\n"\r
+ " - Item Flags: 0x%02" PRIX8 "\r\n"\r
+ " - Item Offset (Bits): 0x%02" PRIX8 "\r\n"\r
+ " - Item Size (Bits): 0x%02" PRIX8 "\r\n"\r
+ " - Usage Page: 0x%04" PRIX16 "\r\n"\r
+ " - Usage: 0x%04" PRIX16 "\r\n"\r
+ " - Unit Type: 0x%08" PRIX32 "\r\n"\r
+ " - Unit Exponent: 0x%02" PRIX8 "\r\n"\r
+ " - Logical Minimum: 0x%08" PRIX32 "\r\n"\r
+ " - Logical Maximum: 0x%08" PRIX32 "\r\n"\r
+ " - Physical Minimum: 0x%08" PRIX32 "\r\n"\r
+ " - Physical Maximum: 0x%08" PRIX32 "\r\n"\r
+ " - Collection Path:\r\n"),\r
+ ItemIndex,\r
+ RItem->ReportID,\r
+ ((RItem->ItemType == HID_REPORT_ITEM_In) ? "IN" : ((RItem->ItemType == HID_REPORT_ITEM_Out) ? "OUT" : "FEATURE")),\r
+ RItem->ItemFlags,\r
+ RItem->BitOffset,\r
+ RItem->Attributes.BitSize,\r
+ RItem->Attributes.Usage.Page,\r
+ RItem->Attributes.Usage.Usage,\r
+ RItem->Attributes.Unit.Type,\r
+ RItem->Attributes.Unit.Exponent,\r
+ RItem->Attributes.Logical.Minimum,\r
+ RItem->Attributes.Logical.Maximum,\r
+ RItem->Attributes.Physical.Minimum,\r
+ RItem->Attributes.Physical.Maximum);\r
+ \r
+ OutputCollectionPath(RItem->CollectionPath);\r
+ }\r
+}\r
+\r
+/** Prints the HID Collection path (along with each node's attributes) to the serial port\r
+ * for display to the user, from the given starting node to the root node.\r
+ *\r
+ * \param[in] CollectionPath Starting HID Collection node to print\r
+ */\r
+void OutputCollectionPath(const HID_CollectionPath_t* const CollectionPath)\r
+{\r
+ const HID_CollectionPath_t* CurrentNode = CollectionPath;\r
+\r
+ while (CurrentNode != NULL)\r
+ {\r
+ printf_P(PSTR(" |\r\n"\r
+ " - Type: 0x%02" PRIX8 "\r\n"\r
+ " - Usage: 0x%02" PRIX8 "\r\n"),\r
+ CurrentNode->Type, CurrentNode->Usage);\r
+ \r
+ CurrentNode = CurrentNode->Parent;\r
+ }\r
+ \r
+ printf_P(PSTR(" |\r\n"\r
+ " END\r\n"));\r
+}\r
+\r
/** Configures the board hardware and chip peripherals for the demo's functionality. */\r
void SetupHardware(void)\r
{\r
*/\r
void EVENT_USB_Host_DeviceEnumerationComplete(void)\r
{\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
+\r
+ uint16_t ConfigDescriptorSize;\r
+ uint8_t ConfigDescriptorData[512];\r
+\r
+ if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,\r
+ sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)\r
+ {\r
+ puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+ return;\r
+ }\r
+\r
+ if (HID_Host_ConfigurePipes(&Device_HID_Interface,\r
+ ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)\r
+ {\r
+ puts_P(PSTR("Attached Device Not a Valid HID Device.\r\n"));\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+ return;\r
+ }\r
+\r
+ if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)\r
+ {\r
+ puts_P(PSTR("Error Setting Device Configuration.\r\n"));\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+ return;\r
+ }\r
+\r
+ if (HID_Host_SetReportProtocol(&Device_HID_Interface) != 0)\r
+ {\r
+ puts_P(PSTR("Error Setting Report Protocol Mode.\r\n"));\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+ USB_Host_SetDeviceConfiguration(0);\r
+ return;\r
+ }\r
+\r
+ puts_P(PSTR("HID Device Enumerated.\r\n"));\r
LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
}\r
\r