switch (USB_HostState)\r
{\r
case HOST_STATE_Addressed:\r
- /* Standard request to set the device configuration to configuration 1 */\r
- USB_ControlRequest = (USB_Request_Header_t)\r
- {\r
- .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),\r
- .bRequest = REQ_SetConfiguration,\r
- .wValue = 1,\r
- .wIndex = 0,\r
- .wLength = 0,\r
- };\r
-\r
- /* Select the control pipe for the request transfer */\r
- Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
-\r
- /* Send the request, display error and wait for device detach if request fails */\r
- if (USB_Host_SendControlRequest(NULL) != HOST_SENDCONTROL_Successful)\r
- {\r
- puts_P(PSTR("Control error.\r\n"));\r
-\r
- /* Indicate error via status LEDs */\r
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-\r
- /* Wait until USB device disconnected */\r
- while (USB_IsConnected);\r
- break;\r
- }\r
- \r
- USB_HostState = HOST_STATE_Configured;\r
- break;\r
- case HOST_STATE_Configured:\r
puts_P(PSTR("Getting Config Data.\r\n"));\r
\r
/* Get and process the configuration descriptor data */\r
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
\r
/* Wait until USB device disconnected */\r
- while (USB_IsConnected);\r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
}\r
\r
+ /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */\r
+ if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)\r
+ {\r
+ puts_P(PSTR("Control error.\r\n"));\r
+\r
+ /* Indicate error via status LEDs */\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+\r
+ /* Wait until USB device disconnected */\r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
+ break;\r
+ }\r
+ \r
+ USB_HostState = HOST_STATE_Configured;\r
+ break;\r
+ case HOST_STATE_Configured:\r
puts_P(PSTR("Still Image Device Enumerated.\r\n"));\r
\r
USB_HostState = HOST_STATE_Ready;\r
if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError)\r
{\r
ShowCommandError(ErrorCode, false);\r
+ \r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
}\r
\r
if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError)\r
{\r
ShowCommandError(ErrorCode, false);\r
+ \r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
}\r
\r
if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))\r
{\r
ShowCommandError(PIMA_ReceivedBlock.Code, true);\r
+ \r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
}\r
\r
if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError)\r
{\r
ShowCommandError(ErrorCode, false);\r
+ \r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
}\r
\r
if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))\r
{\r
ShowCommandError(PIMA_ReceivedBlock.Code, true);\r
+ \r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
}\r
\r
if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError)\r
{\r
ShowCommandError(ErrorCode, false);\r
+ \r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
}\r
\r
if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))\r
{\r
ShowCommandError(PIMA_ReceivedBlock.Code, true);\r
+ \r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
}\r
\r
/** Function to convert a given Unicode encoded string to ASCII. This function will only work correctly on Unicode\r
* strings which contain ASCII printable characters only.\r
*\r
- * \param UnicodeString Pointer to a Unicode encoded input string\r
- * \param Buffer Pointer to a buffer where the converted ASCII string should be stored\r
+ * \param[in] UnicodeString Pointer to a Unicode encoded input string\r
+ * \param[out] Buffer Pointer to a buffer where the converted ASCII string should be stored\r
*/\r
void UnicodeToASCII(uint8_t* UnicodeString, char* Buffer)\r
{\r
\r
/** Displays a PIMA command error via the device's serial port.\r
*\r
- * \param ErrorCode Error code of the function which failed to complete successfully\r
- * \param ResponseCodeError Indicates if the error is due to a command failed indication from the device, or a communication failure\r
+ * \param[in] ErrorCode Error code of the function which failed to complete successfully\r
+ * \param[in] ResponseCodeError Indicates if the error is due to a command failed indication from the device, or a communication failure\r
*/\r
void ShowCommandError(uint8_t ErrorCode, bool ResponseCodeError)\r
{\r
\r
/* Indicate error via status LEDs */\r
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
- \r
- /* Wait until USB device disconnected */\r
- while (USB_IsConnected);\r
}\r