aboutsummaryrefslogtreecommitdiffstats
path: root/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2011-07-08 07:25:56 +0000
committerDean Camera <dean@fourwalledcubicle.com>2011-07-08 07:25:56 +0000
commit137ce280c1e9c33e9393f1dfd6bb160c131bd1a4 (patch)
tree9db0900f06376a93ef2b6d9e9ef1edbfdc2a1f79 /Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c
parentbcb627e1a1bb9f013670d981ead2db97d7c70608 (diff)
downloadlufa-137ce280c1e9c33e9393f1dfd6bb160c131bd1a4.tar.gz
lufa-137ce280c1e9c33e9393f1dfd6bb160c131bd1a4.tar.bz2
lufa-137ce280c1e9c33e9393f1dfd6bb160c131bd1a4.zip
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.
Diffstat (limited to 'Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c')
-rw-r--r--Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c94
1 files changed, 37 insertions, 57 deletions
diff --git a/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c b/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c
index 671fa4833..720ad03e7 100644
--- a/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c
+++ b/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c
@@ -50,7 +50,8 @@ int main(void)
for (;;)
{
- HID_Host_Task();
+ ReadNextReport();
+
USB_USBTask();
}
}
@@ -97,6 +98,35 @@ void EVENT_USB_Host_DeviceUnattached(void)
*/
void EVENT_USB_Host_DeviceEnumerationComplete(void)
{
+ puts_P(PSTR("Getting Config Data.\r\n"));
+
+ uint8_t ErrorCode;
+
+ /* Get and process the configuration descriptor data */
+ if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
+ {
+ if (ErrorCode == ControlError)
+ puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
+ else
+ puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
+
+ printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
+
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ return;
+ }
+
+ /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
+ if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
+ {
+ printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"
+ " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
+
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ return;
+ }
+
+ puts_P(PSTR("HID Device Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
@@ -131,6 +161,9 @@ void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
*/
void ReadNextReport(void)
{
+ if (USB_HostState != HOST_STATE_Configured)
+ return;
+
/* Select and unfreeze HID data IN pipe */
Pipe_SelectPipe(HID_DATA_IN_PIPE);
Pipe_Unfreeze();
@@ -178,6 +211,9 @@ void WriteNextReport(uint8_t* ReportOUTData,
const uint8_t ReportType,
uint16_t ReportLength)
{
+ if (USB_HostState != HOST_STATE_Configured)
+ return;
+
/* Select the HID data OUT pipe */
Pipe_SelectPipe(HID_DATA_OUT_PIPE);
@@ -229,59 +265,3 @@ void WriteNextReport(uint8_t* ReportOUTData,
}
}
-/** Task to set the configuration of the attached device after it has been enumerated, and to read and process
- * HID reports from the device and to send reports if desired.
- */
-void HID_Host_Task(void)
-{
- uint8_t ErrorCode;
-
- /* Switch to determine what user-application handled host state the host state machine is in */
- switch (USB_HostState)
- {
- case HOST_STATE_Addressed:
- puts_P(PSTR("Getting Config Data.\r\n"));
-
- /* Get and process the configuration descriptor data */
- if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
- {
- if (ErrorCode == ControlError)
- puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
- else
- puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
-
- printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
-
- /* Indicate error status */
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-
- /* Wait until USB device disconnected */
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
- if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
- {
- printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"
- " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
-
- /* Indicate error status */
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-
- /* Wait until USB device disconnected */
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("HID Device Enumerated.\r\n"));
-
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- ReadNextReport();
-
- break;
- }
-}
-