diff options
Diffstat (limited to 'Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c')
-rw-r--r-- | Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c | 171 |
1 files changed, 78 insertions, 93 deletions
diff --git a/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c b/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c index 8987747bf..d98a73327 100644 --- a/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c +++ b/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c @@ -50,7 +50,8 @@ int main(void) for (;;) { - CDC_Host_Task(); + CDCHost_Task(); + 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("CDC Device Enumerated.\r\n")); LEDs_SetAllLEDs(LEDMASK_USB_READY); } @@ -126,102 +156,57 @@ void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, LEDs_SetAllLEDs(LEDMASK_USB_ERROR); } -/** Task to set the configuration of the attached device after it has been enumerated, and to read in - * data received from the attached CDC device and print it to the serial port. +/** Task to read in data received from the attached CDC device and print it to the serial port. */ -void CDC_Host_Task(void) +void CDCHost_Task(void) { - uint8_t ErrorCode; + if (USB_HostState != HOST_STATE_Configured) + return; + + /* Select the data IN pipe */ + Pipe_SelectPipe(CDC_DATA_IN_PIPE); + Pipe_Unfreeze(); + + /* Check to see if a packet has been received */ + if (Pipe_IsINReceived()) + { + /* Re-freeze IN pipe after the packet has been received */ + Pipe_Freeze(); + + /* Check if data is in the pipe */ + if (Pipe_IsReadWriteAllowed()) + { + /* Get the length of the pipe data, and create a new buffer to hold it */ + uint16_t BufferLength = Pipe_BytesInPipe(); + uint8_t Buffer[BufferLength]; + + /* Read in the pipe data to the temporary buffer */ + Pipe_Read_Stream_LE(Buffer, BufferLength, NULL); + + /* Print out the buffer contents to the USART */ + for (uint16_t BufferByte = 0; BufferByte < BufferLength; BufferByte++) + putchar(Buffer[BufferByte]); + } + + /* Clear the pipe after it is read, ready for the next packet */ + Pipe_ClearIN(); + } + + /* Re-freeze IN pipe after use */ + Pipe_Freeze(); - switch (USB_HostState) + /* Select and unfreeze the notification pipe */ + Pipe_SelectPipe(CDC_NOTIFICATION_PIPE); + Pipe_Unfreeze(); + + /* Check if a packet has been received */ + if (Pipe_IsINReceived()) { - 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 via status LEDs */ - 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 via status LEDs */ - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - - /* Wait until USB device disconnected */ - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - puts_P(PSTR("CDC Device Enumerated.\r\n")); - - USB_HostState = HOST_STATE_Configured; - break; - case HOST_STATE_Configured: - /* Select the data IN pipe */ - Pipe_SelectPipe(CDC_DATA_IN_PIPE); - Pipe_Unfreeze(); - - /* Check to see if a packet has been received */ - if (Pipe_IsINReceived()) - { - /* Re-freeze IN pipe after the packet has been received */ - Pipe_Freeze(); - - /* Check if data is in the pipe */ - if (Pipe_IsReadWriteAllowed()) - { - /* Get the length of the pipe data, and create a new buffer to hold it */ - uint16_t BufferLength = Pipe_BytesInPipe(); - uint8_t Buffer[BufferLength]; - - /* Read in the pipe data to the temporary buffer */ - Pipe_Read_Stream_LE(Buffer, BufferLength, NULL); - - /* Print out the buffer contents to the USART */ - for (uint16_t BufferByte = 0; BufferByte < BufferLength; BufferByte++) - putchar(Buffer[BufferByte]); - } - - /* Clear the pipe after it is read, ready for the next packet */ - Pipe_ClearIN(); - } - - /* Re-freeze IN pipe after use */ - Pipe_Freeze(); - - /* Select and unfreeze the notification pipe */ - Pipe_SelectPipe(CDC_NOTIFICATION_PIPE); - Pipe_Unfreeze(); - - /* Check if a packet has been received */ - if (Pipe_IsINReceived()) - { - /* Discard the unused event notification */ - Pipe_ClearIN(); - } - - /* Freeze notification IN pipe after use */ - Pipe_Freeze(); - - break; + /* Discard the unused event notification */ + Pipe_ClearIN(); } + + /* Freeze notification IN pipe after use */ + Pipe_Freeze(); } |