X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/afe6ae14023c7040befe73e49d00077d3425c564..c5eeedd522c12c8b4996594f3c4167393d0af7ff:/Demos/Host/ClassDriver/CDCHost/CDCHost.c?ds=sidebyside diff --git a/Demos/Host/ClassDriver/CDCHost/CDCHost.c b/Demos/Host/ClassDriver/CDCHost/CDCHost.c index 9a9d8a71f..0cbb77122 100644 --- a/Demos/Host/ClassDriver/CDCHost/CDCHost.c +++ b/Demos/Host/ClassDriver/CDCHost/CDCHost.c @@ -36,6 +36,21 @@ #include "CDCHost.h" +/** LUFA CDC Class driver interface configuration and state information. This structure is + * passed to all CDC Class driver functions, so that multiple instances of the same class + * within a device can be differentiated from one another. + */ +USB_ClassInfo_CDC_Host_t VirtualSerial_CDC_Interface = + { + .Config = + { + .DataINPipeNumber = 1, + .DataOUTPipeNumber = 2, + .NotificationPipeNumber = 3, + }, + }; + + /** Main program entry point. This routine configures the hardware required by the application, then * starts the scheduler to run the application tasks. */ @@ -43,13 +58,56 @@ int main(void) { SetupHardware(); - puts_P(PSTR(ESC_RESET ESC_BG_WHITE ESC_INVERSE_ON ESC_ERASE_DISPLAY - "CDC Host Demo running.\r\n" ESC_INVERSE_OFF)); + puts_P(PSTR(ESC_FG_CYAN "CDC Host Demo running.\r\n" ESC_FG_WHITE)); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); for (;;) { + switch (USB_HostState) + { + case HOST_STATE_Addressed: + LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); + + uint16_t ConfigDescriptorSize; + uint8_t ConfigDescriptorData[512]; + + if ((USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful) || + (ConfigDescriptorSize > sizeof(ConfigDescriptorData))) + { + printf("Error Retrieving Configuration Descriptor.\r\n"); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; + } + + USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData); + + if (CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface, + ConfigDescriptorSize, ConfigDescriptorData) != CDC_ENUMERROR_NoError) + { + printf("Attached Device Not a Valid CDC Class Device.\r\n"); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; + } + + if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful) + { + printf("Error Setting Device Configuration.\r\n"); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; + } + + printf("CDC Device Enumerated.\r\n"); + USB_HostState = HOST_STATE_Configured; + break; + case HOST_STATE_Configured: + break; + } + + CDC_Host_USBTask(&VirtualSerial_CDC_Interface); USB_USBTask(); } } @@ -101,8 +159,8 @@ void EVENT_USB_HostError(const uint8_t ErrorCode) { USB_ShutDown(); - puts_P(PSTR(ESC_BG_RED "Host Mode Error\r\n")); - printf_P(PSTR(" -- Error Code %d\r\n"), ErrorCode); + puts_P(PSTR(ESC_FG_RED "Host Mode Error\r\n")); + printf_P(PSTR(" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode); LEDs_SetAllLEDs(LEDMASK_USB_ERROR); for(;;); @@ -113,10 +171,10 @@ void EVENT_USB_HostError(const uint8_t ErrorCode) */ void EVENT_USB_DeviceEnumerationFailed(const uint8_t ErrorCode, const uint8_t SubErrorCode) { - puts_P(PSTR(ESC_BG_RED "Dev Enum Error\r\n")); + puts_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n")); printf_P(PSTR(" -- Error Code %d\r\n"), ErrorCode); printf_P(PSTR(" -- Sub Error Code %d\r\n"), SubErrorCode); - printf_P(PSTR(" -- In State %d\r\n"), USB_HostState); + printf_P(PSTR(" -- In State %d\r\n" ESC_FG_WHITE), USB_HostState); LEDs_SetAllLEDs(LEDMASK_USB_ERROR); }