From 137ce280c1e9c33e9393f1dfd6bb160c131bd1a4 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Fri, 8 Jul 2011 07:25:56 +0000 Subject: Updated all host mode demos and projects to use the EVENT_USB_Host_DeviceEnumerationComplete() event callback for device configuration instead of manual host state machine manipulations in the main application task. Added new USB_Host_ConfigurationNumber global variable to indicate the selected configuration in an attached device. Renamed global state variables that are specific to a certain USB mode to clearly indicate which mode the variable relates to, by changing the USB_* prefix to USB_Device_* or USB_Host_*. Removed the HOST_STATE_WaitForDeviceRemoval and HOST_STATE_Suspended host state machine states, as these are no longer required. Altered the USB_Host_SetDeviceConfiguration() function to update the new USB_Host_ConfigurationNumber global as required. Moved out the Host mode standard request convenience/helper functions from the architecture specific Host driver files to the architecture agnostic HostStandardReq.c driver file. --- .../MouseHostWithParser/MouseHostWithParser.c | 197 ++++++++++----------- .../MouseHostWithParser/MouseHostWithParser.h | 1 + 2 files changed, 98 insertions(+), 100 deletions(-) (limited to 'Demos/Host/ClassDriver/MouseHostWithParser') diff --git a/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c b/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c index 8fd49f2a7..b71554f48 100644 --- a/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c +++ b/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c @@ -74,106 +74,7 @@ int main(void) for (;;) { - switch (USB_HostState) - { - case HOST_STATE_Addressed: - LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); - - uint16_t ConfigDescriptorSize; - uint8_t ConfigDescriptorData[512]; - - if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData, - sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful) - { - puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - if (HID_Host_ConfigurePipes(&Mouse_HID_Interface, - ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError) - { - puts_P(PSTR("Attached Device Not a Valid Mouse.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful) - { - puts_P(PSTR("Error Setting Device Configuration.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - if (HID_Host_SetReportProtocol(&Mouse_HID_Interface) != 0) - { - puts_P(PSTR("Error Setting Report Protocol Mode or Not a Valid Mouse.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - puts_P(PSTR("Mouse Enumerated.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_READY); - USB_HostState = HOST_STATE_Configured; - break; - case HOST_STATE_Configured: - if (HID_Host_IsReportReceived(&Mouse_HID_Interface)) - { - uint8_t MouseReport[Mouse_HID_Interface.State.LargestReportSize]; - HID_Host_ReceiveReport(&Mouse_HID_Interface, &MouseReport); - - uint8_t LEDMask = LEDS_NO_LEDS; - - for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++) - { - HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber]; - - /* Update the report item value if it is contained within the current report */ - if (!(USB_GetHIDReportItemInfo(MouseReport, ReportItem))) - continue; - - /* Determine what report item is being tested, process updated value as needed */ - if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_BUTTON) && - (ReportItem->ItemType == HID_REPORT_ITEM_In)) - { - if (ReportItem->Value) - LEDMask = LEDS_ALL_LEDS; - } - else if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_GENERIC_DCTRL) && - (ReportItem->Attributes.Usage.Usage == USAGE_SCROLL_WHEEL) && - (ReportItem->ItemType == HID_REPORT_ITEM_In)) - { - int16_t WheelDelta = HID_ALIGN_DATA(ReportItem, int16_t); - - if (WheelDelta) - LEDMask = (LEDS_LED1 | LEDS_LED2 | ((WheelDelta > 0) ? LEDS_LED3 : LEDS_LED4)); - } - else if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_GENERIC_DCTRL) && - ((ReportItem->Attributes.Usage.Usage == USAGE_X) || - (ReportItem->Attributes.Usage.Usage == USAGE_Y)) && - (ReportItem->ItemType == HID_REPORT_ITEM_In)) - { - int16_t DeltaMovement = HID_ALIGN_DATA(ReportItem, int16_t); - - if (DeltaMovement) - { - if (ReportItem->Attributes.Usage.Usage == USAGE_X) - LEDMask |= ((DeltaMovement > 0) ? LEDS_LED1 : LEDS_LED2); - else - LEDMask |= ((DeltaMovement > 0) ? LEDS_LED3 : LEDS_LED4); - } - } - } - - LEDs_SetAllLEDs(LEDMask); - } - - break; - } + MouseHost_Task(); HID_Host_USBTask(&Mouse_HID_Interface); USB_USBTask(); @@ -199,6 +100,66 @@ void SetupHardware(void) Serial_CreateStream(NULL); } +/** Task to manage an enumerated USB mouse once connected, to display movement + * data as it is received. + */ +void MouseHost_Task(void) +{ + if (USB_HostState != HOST_STATE_Configured) + return; + + if (HID_Host_IsReportReceived(&Mouse_HID_Interface)) + { + uint8_t MouseReport[Mouse_HID_Interface.State.LargestReportSize]; + HID_Host_ReceiveReport(&Mouse_HID_Interface, &MouseReport); + + uint8_t LEDMask = LEDS_NO_LEDS; + + for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++) + { + HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber]; + + /* Update the report item value if it is contained within the current report */ + if (!(USB_GetHIDReportItemInfo(MouseReport, ReportItem))) + continue; + + /* Determine what report item is being tested, process updated value as needed */ + if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_BUTTON) && + (ReportItem->ItemType == HID_REPORT_ITEM_In)) + { + if (ReportItem->Value) + LEDMask = LEDS_ALL_LEDS; + } + else if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_GENERIC_DCTRL) && + (ReportItem->Attributes.Usage.Usage == USAGE_SCROLL_WHEEL) && + (ReportItem->ItemType == HID_REPORT_ITEM_In)) + { + int16_t WheelDelta = HID_ALIGN_DATA(ReportItem, int16_t); + + if (WheelDelta) + LEDMask = (LEDS_LED1 | LEDS_LED2 | ((WheelDelta > 0) ? LEDS_LED3 : LEDS_LED4)); + } + else if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_GENERIC_DCTRL) && + ((ReportItem->Attributes.Usage.Usage == USAGE_X) || + (ReportItem->Attributes.Usage.Usage == USAGE_Y)) && + (ReportItem->ItemType == HID_REPORT_ITEM_In)) + { + int16_t DeltaMovement = HID_ALIGN_DATA(ReportItem, int16_t); + + if (DeltaMovement) + { + if (ReportItem->Attributes.Usage.Usage == USAGE_X) + LEDMask |= ((DeltaMovement > 0) ? LEDS_LED1 : LEDS_LED2); + else + LEDMask |= ((DeltaMovement > 0) ? LEDS_LED3 : LEDS_LED4); + } + } + } + + LEDs_SetAllLEDs(LEDMask); + } +} + /** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and * starts the library USB task to begin the enumeration and USB management process. */ @@ -222,6 +183,42 @@ void EVENT_USB_Host_DeviceUnattached(void) */ void EVENT_USB_Host_DeviceEnumerationComplete(void) { + LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); + + uint16_t ConfigDescriptorSize; + uint8_t ConfigDescriptorData[512]; + + if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData, + sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful) + { + puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n")); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + return; + } + + if (HID_Host_ConfigurePipes(&Mouse_HID_Interface, + ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError) + { + puts_P(PSTR("Attached Device Not a Valid Mouse.\r\n")); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + return; + } + + if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful) + { + puts_P(PSTR("Error Setting Device Configuration.\r\n")); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + return; + } + + if (HID_Host_SetReportProtocol(&Mouse_HID_Interface) != 0) + { + puts_P(PSTR("Error Setting Report Protocol Mode or Not a Valid Mouse.\r\n")); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + return; + } + + puts_P(PSTR("Mouse Enumerated.\r\n")); LEDs_SetAllLEDs(LEDMASK_USB_READY); } diff --git a/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.h b/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.h index 8d90d5cf4..4e9587bd3 100644 --- a/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.h +++ b/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.h @@ -83,6 +83,7 @@ /* Function Prototypes: */ void SetupHardware(void); + void MouseHost_Task(void); void EVENT_USB_Host_HostError(const uint8_t ErrorCode); void EVENT_USB_Host_DeviceAttached(void); -- cgit v1.2.3