aboutsummaryrefslogtreecommitdiff
path: root/Demos/Host/ClassDriver
diff options
context:
space:
mode:
Diffstat (limited to 'Demos/Host/ClassDriver')
-rw-r--r--Demos/Host/ClassDriver/AudioInputHost/AudioInputHost.c134
-rw-r--r--Demos/Host/ClassDriver/AudioOutputHost/AudioOutputHost.c120
-rw-r--r--Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.c179
-rw-r--r--Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.h1
-rw-r--r--Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.c181
-rw-r--r--Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.h1
-rw-r--r--Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.c223
-rw-r--r--Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.h1
-rw-r--r--Demos/Host/ClassDriver/MIDIHost/MIDIHost.c128
-rw-r--r--Demos/Host/ClassDriver/MIDIHost/MIDIHost.h1
-rw-r--r--Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.c319
-rw-r--r--Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.h3
-rw-r--r--Demos/Host/ClassDriver/MouseHost/MouseHost.c147
-rw-r--r--Demos/Host/ClassDriver/MouseHost/MouseHost.h1
-rw-r--r--Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c197
-rw-r--r--Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.h1
-rw-r--r--Demos/Host/ClassDriver/PrinterHost/PrinterHost.c163
-rw-r--r--Demos/Host/ClassDriver/PrinterHost/PrinterHost.h1
-rw-r--r--Demos/Host/ClassDriver/RNDISEthernetHost/RNDISEthernetHost.c152
-rw-r--r--Demos/Host/ClassDriver/RNDISEthernetHost/RNDISEthernetHost.h2
-rw-r--r--Demos/Host/ClassDriver/StillImageHost/StillImageHost.c147
-rw-r--r--Demos/Host/ClassDriver/StillImageHost/StillImageHost.h1
-rw-r--r--Demos/Host/ClassDriver/VirtualSerialHost/VirtualSerialHost.c96
-rw-r--r--Demos/Host/ClassDriver/VirtualSerialHost/VirtualSerialHost.h1
24 files changed, 1074 insertions, 1126 deletions
diff --git a/Demos/Host/ClassDriver/AudioInputHost/AudioInputHost.c b/Demos/Host/ClassDriver/AudioInputHost/AudioInputHost.c
index 21bb9e16d7..ab93721ae5 100644
--- a/Demos/Host/ClassDriver/AudioInputHost/AudioInputHost.c
+++ b/Demos/Host/ClassDriver/AudioInputHost/AudioInputHost.c
@@ -63,81 +63,6 @@ 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 (Audio_Host_ConfigurePipes(&Microphone_Audio_Interface,
- ConfigDescriptorSize, ConfigDescriptorData) != AUDIO_ENUMERROR_NoError)
- {
- puts_P(PSTR("Attached Device Not a Valid Audio Input Device.\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 (Audio_Host_StartStopStreaming(&Microphone_Audio_Interface, true) != HOST_SENDCONTROL_Successful)
- {
- puts_P(PSTR("Error Enabling Audio Stream.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
- if (Audio_Host_GetSetEndpointProperty(&Microphone_Audio_Interface, Microphone_Audio_Interface.Config.DataINPipeNumber,
- AUDIO_REQ_SetCurrent, AUDIO_EPCONTROL_SamplingFreq,
- sizeof(SampleRate), &SampleRate) != HOST_SENDCONTROL_Successful)
- {
- puts_P(PSTR("Error Setting Audio Sampling Frequency.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- /* Sample reload timer initialization */
- TIMSK0 = (1 << OCIE0A);
- OCR0A = ((F_CPU / 8 / 48000) - 1);
- TCCR0A = (1 << WGM01); // CTC mode
- TCCR0B = (1 << CS01); // Fcpu/8 speed
-
- /* Set speaker as output */
- DDRC |= (1 << 6);
-
- /* PWM speaker timer initialization */
- TCCR3A = ((1 << WGM30) | (1 << COM3A1) | (1 << COM3A0)); // Set on match, clear on TOP
- TCCR3B = ((1 << WGM32) | (1 << CS30)); // Fast 8-Bit PWM, F_CPU speed
-
- puts_P(PSTR("Audio Device Enumerated.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- /* Do nothing - audio stream is handled by the timer interrupt routine */
- break;
- }
-
Audio_Host_USBTask(&Microphone_Audio_Interface);
USB_USBTask();
}
@@ -217,6 +142,65 @@ 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 (Audio_Host_ConfigurePipes(&Microphone_Audio_Interface,
+ ConfigDescriptorSize, ConfigDescriptorData) != AUDIO_ENUMERROR_NoError)
+ {
+ puts_P(PSTR("Attached Device Not a Valid Audio Input Device.\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 (Audio_Host_StartStopStreaming(&Microphone_Audio_Interface, true) != HOST_SENDCONTROL_Successful)
+ {
+ puts_P(PSTR("Error Enabling Audio Stream.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ return;
+ }
+
+ USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
+ if (Audio_Host_GetSetEndpointProperty(&Microphone_Audio_Interface, Microphone_Audio_Interface.Config.DataINPipeNumber,
+ AUDIO_REQ_SetCurrent, AUDIO_EPCONTROL_SamplingFreq,
+ sizeof(SampleRate), &SampleRate) != HOST_SENDCONTROL_Successful)
+ {
+ puts_P(PSTR("Error Setting Audio Sampling Frequency.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ return;
+ }
+
+ /* Sample reload timer initialization */
+ TIMSK0 = (1 << OCIE0A);
+ OCR0A = ((F_CPU / 8 / 48000) - 1);
+ TCCR0A = (1 << WGM01); // CTC mode
+ TCCR0B = (1 << CS01); // Fcpu/8 speed
+
+ /* Set speaker as output */
+ DDRC |= (1 << 6);
+
+ /* PWM speaker timer initialization */
+ TCCR3A = ((1 << WGM30) | (1 << COM3A1) | (1 << COM3A0)); // Set on match, clear on TOP
+ TCCR3B = ((1 << WGM32) | (1 << CS30)); // Fast 8-Bit PWM, F_CPU speed
+
+ puts_P(PSTR("Audio Device Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
diff --git a/Demos/Host/ClassDriver/AudioOutputHost/AudioOutputHost.c b/Demos/Host/ClassDriver/AudioOutputHost/AudioOutputHost.c
index b4a7a3b2bb..c43b3ab3a3 100644
--- a/Demos/Host/ClassDriver/AudioOutputHost/AudioOutputHost.c
+++ b/Demos/Host/ClassDriver/AudioOutputHost/AudioOutputHost.c
@@ -63,74 +63,6 @@ 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 (Audio_Host_ConfigurePipes(&Speaker_Audio_Interface,
- ConfigDescriptorSize, ConfigDescriptorData) != AUDIO_ENUMERROR_NoError)
- {
- puts_P(PSTR("Attached Device Not a Valid Audio Output Device.\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 (Audio_Host_StartStopStreaming(&Speaker_Audio_Interface, true) != HOST_SENDCONTROL_Successful)
- {
- puts_P(PSTR("Error Enabling Audio Stream.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
- if (Audio_Host_GetSetEndpointProperty(&Speaker_Audio_Interface, Speaker_Audio_Interface.Config.DataOUTPipeNumber,
- AUDIO_REQ_SetCurrent, AUDIO_EPCONTROL_SamplingFreq,
- sizeof(SampleRate), &SampleRate) != HOST_SENDCONTROL_Successful)
- {
- puts_P(PSTR("Error Setting Audio Sampling Frequency.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- /* Sample reload timer initialization */
- TIMSK0 = (1 << OCIE0A);
- OCR0A = ((F_CPU / 8 / 48000) - 1);
- TCCR0A = (1 << WGM01); // CTC mode
- TCCR0B = (1 << CS01); // Fcpu/8 speed
-
- puts_P(PSTR("Audio Device Enumerated.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- /* Do nothing - audio stream is handled by the timer interrupt routine */
- break;
- }
-
Audio_Host_USBTask(&Speaker_Audio_Interface);
USB_USBTask();
}
@@ -218,6 +150,58 @@ 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 (Audio_Host_ConfigurePipes(&Speaker_Audio_Interface,
+ ConfigDescriptorSize, ConfigDescriptorData) != AUDIO_ENUMERROR_NoError)
+ {
+ puts_P(PSTR("Attached Device Not a Valid Audio Output Device.\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 (Audio_Host_StartStopStreaming(&Speaker_Audio_Interface, true) != HOST_SENDCONTROL_Successful)
+ {
+ puts_P(PSTR("Error Enabling Audio Stream.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ return;
+ }
+
+ USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
+ if (Audio_Host_GetSetEndpointProperty(&Speaker_Audio_Interface, Speaker_Audio_Interface.Config.DataOUTPipeNumber,
+ AUDIO_REQ_SetCurrent, AUDIO_EPCONTROL_SamplingFreq,
+ sizeof(SampleRate), &SampleRate) != HOST_SENDCONTROL_Successful)
+ {
+ puts_P(PSTR("Error Setting Audio Sampling Frequency.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ return;
+ }
+
+ /* Sample reload timer initialization */
+ TIMSK0 = (1 << OCIE0A);
+ OCR0A = ((F_CPU / 8 / 48000) - 1);
+ TCCR0A = (1 << WGM01); // CTC mode
+ TCCR0B = (1 << CS01); // Fcpu/8 speed
+
+ puts_P(PSTR("Audio Device Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
diff --git a/Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.c b/Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.c
index 4ed0bfb8b8..e74dfe06fd 100644
--- a/Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.c
+++ b/Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.c
@@ -74,97 +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(&Joystick_HID_Interface,
- ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
- {
- puts_P(PSTR("Attached Device Not a Valid Joystick.\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(&Joystick_HID_Interface) != 0)
- {
- puts_P(PSTR("Error Setting Report Protocol Mode or Not a Valid Joystick.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("Joystick Enumerated.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- if (HID_Host_IsReportReceived(&Joystick_HID_Interface))
- {
- uint8_t JoystickReport[Joystick_HID_Interface.State.LargestReportSize];
- HID_Host_ReceiveReport(&Joystick_HID_Interface, &JoystickReport);
-
- 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(JoystickReport, 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_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;
- }
+ JoystickHost_Task();
HID_Host_USBTask(&Joystick_HID_Interface);
USB_USBTask();
@@ -190,6 +100,57 @@ void SetupHardware(void)
Serial_CreateStream(NULL);
}
+/** Task to manage an enumerated USB joystick once connected, to display movement
+ * data as it is received.
+ */
+void JoystickHost_Task(void)
+{
+ if (USB_HostState != HOST_STATE_Configured)
+ return;
+
+ if (HID_Host_IsReportReceived(&Joystick_HID_Interface))
+ {
+ uint8_t JoystickReport[Joystick_HID_Interface.State.LargestReportSize];
+ HID_Host_ReceiveReport(&Joystick_HID_Interface, &JoystickReport);
+
+ 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(JoystickReport, 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_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.
*/
@@ -213,6 +174,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(&Joystick_HID_Interface,
+ ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
+ {
+ puts_P(PSTR("Attached Device Not a Valid Joystick.\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(&Joystick_HID_Interface) != 0)
+ {
+ puts_P(PSTR("Error Setting Report Protocol Mode or Not a Valid Joystick.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ return;
+ }
+
+ puts_P(PSTR("Joystick Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
diff --git a/Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.h b/Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.h
index fe6fae7d15..b68c372944 100644
--- a/Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.h
+++ b/Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.h
@@ -80,6 +80,7 @@
/* Function Prototypes: */
void SetupHardware(void);
+ void JoystickHost_Task(void);
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
void EVENT_USB_Host_DeviceAttached(void);
diff --git a/Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.c b/Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.c
index 38af3a7c53..abc038e221 100644
--- a/Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.c
+++ b/Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.c
@@ -69,98 +69,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(&Keyboard_HID_Interface,
- ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
- {
- puts_P(PSTR("Attached Device Not a Valid Keyboard.\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_SetBootProtocol(&Keyboard_HID_Interface) != 0)
- {
- puts_P(PSTR("Could not Set Boot Protocol Mode.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("Keyboard Enumerated.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))
- {
- USB_KeyboardReport_Data_t KeyboardReport;
- HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);
-
- LEDs_ChangeLEDs(LEDS_LED1, (KeyboardReport.Modifier) ? LEDS_LED1 : 0);
-
- uint8_t KeyCode = KeyboardReport.KeyCode[0];
-
- if (KeyCode)
- {
- char PressedKey = 0;
-
- LEDs_ToggleLEDs(LEDS_LED2);
-
- /* Retrieve pressed key character if alphanumeric */
- if ((KeyCode >= HID_KEYBOARD_SC_A) && (KeyCode <= HID_KEYBOARD_SC_Z))
- {
- PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';
- }
- else if ((KeyCode >= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &
- (KeyCode < HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))
- {
- PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';
- }
- else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)
- {
- PressedKey = '0';
- }
- else if (KeyCode == HID_KEYBOARD_SC_SPACE)
- {
- PressedKey = ' ';
- }
- else if (KeyCode == HID_KEYBOARD_SC_ENTER)
- {
- PressedKey = '\n';
- }
-
- if (PressedKey)
- putchar(PressedKey);
- }
- }
-
- break;
- }
+ KeyboardHost_Task();
HID_Host_USBTask(&Keyboard_HID_Interface);
USB_USBTask();
@@ -186,6 +95,58 @@ void SetupHardware(void)
Serial_CreateStream(NULL);
}
+/** Task to manage an enumerated USB keyboard once connected, to display key state
+ * data as it is received.
+ */
+void KeyboardHost_Task(void)
+{
+ if (USB_HostState != HOST_STATE_Configured)
+ return;
+
+ if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))
+ {
+ USB_KeyboardReport_Data_t KeyboardReport;
+ HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);
+
+ LEDs_ChangeLEDs(LEDS_LED1, (KeyboardReport.Modifier) ? LEDS_LED1 : 0);
+
+ uint8_t KeyCode = KeyboardReport.KeyCode[0];
+
+ if (KeyCode)
+ {
+ char PressedKey = 0;
+
+ LEDs_ToggleLEDs(LEDS_LED2);
+
+ /* Retrieve pressed key character if alphanumeric */
+ if ((KeyCode >= HID_KEYBOARD_SC_A) && (KeyCode <= HID_KEYBOARD_SC_Z))
+ {
+ PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';
+ }
+ else if ((KeyCode >= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &
+ (KeyCode < HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))
+ {
+ PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';
+ }
+ else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)
+ {
+ PressedKey = '0';
+ }
+ else if (KeyCode == HID_KEYBOARD_SC_SPACE)
+ {
+ PressedKey = ' ';
+ }
+ else if (KeyCode == HID_KEYBOARD_SC_ENTER)
+ {
+ PressedKey = '\n';
+ }
+
+ if (PressedKey)
+ putchar(PressedKey);
+ }
+ }
+}
+
/** 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.
*/
@@ -209,6 +170,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(&Keyboard_HID_Interface,
+ ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
+ {
+ puts_P(PSTR("Attached Device Not a Valid Keyboard.\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_SetBootProtocol(&Keyboard_HID_Interface) != 0)
+ {
+ puts_P(PSTR("Could not Set Boot Protocol Mode.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ return;
+ }
+
+ puts_P(PSTR("Keyboard Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
diff --git a/Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.h b/Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.h
index 52c63709ab..878e31b6a8 100644
--- a/Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.h
+++ b/Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.h
@@ -65,6 +65,7 @@
/* Function Prototypes: */
void SetupHardware(void);
+ void KeyboardHost_Task(void);
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
void EVENT_USB_Host_DeviceAttached(void);
diff --git a/Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.c b/Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.c
index d7df58f07f..273cdde676 100644
--- a/Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.c
+++ b/Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.c
@@ -74,119 +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(&Keyboard_HID_Interface,
- ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
- {
- puts_P(PSTR("Attached Device Not a Valid Keyboard.\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(&Keyboard_HID_Interface) != 0)
- {
- puts_P(PSTR("Error Setting Report Protocol Mode or Not a Valid Keyboard.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("Keyboard Enumerated.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))
- {
- uint8_t KeyboardReport[Keyboard_HID_Interface.State.LargestReportSize];
- HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);
-
- 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(KeyboardReport, ReportItem)))
- continue;
-
- /* Determine what report item is being tested, process updated value as needed */
- if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_KEYBOARD) &&
- (ReportItem->Attributes.BitSize == 8) &&
- (ReportItem->Attributes.Logical.Maximum > 1) &&
- (ReportItem->ItemType == HID_REPORT_ITEM_In))
- {
- /* Key code is an unsigned char in length, cast to the appropriate type */
- uint8_t KeyCode = (uint8_t)ReportItem->Value;
-
- /* If scan-code is non-zero, a key is being pressed */
- if (KeyCode)
- {
- /* Toggle status LED to indicate keypress */
- LEDs_ToggleLEDs(LEDS_LED2);
-
- char PressedKey = 0;
-
- /* Convert scan-code to printable character if alphanumeric */
- if ((KeyCode >= HID_KEYBOARD_SC_A) && (KeyCode <= HID_KEYBOARD_SC_Z))
- {
- PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';
- }
- else if ((KeyCode >= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &
- (KeyCode < HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))
- {
- PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';
- }
- else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)
- {
- PressedKey = '0';
- }
- else if (KeyCode == HID_KEYBOARD_SC_SPACE)
- {
- PressedKey = ' ';
- }
- else if (KeyCode == HID_KEYBOARD_SC_ENTER)
- {
- PressedKey = '\n';
- }
-
- /* Print the pressed key character out through the serial port if valid */
- if (PressedKey)
- putchar(PressedKey);
- }
-
- /* Once a scan-code is found, stop scanning through the report items */
- break;
- }
- }
- }
-
- break;
- }
+ KeyboardHost_Task();
HID_Host_USBTask(&Keyboard_HID_Interface);
USB_USBTask();
@@ -212,6 +100,79 @@ void SetupHardware(void)
Serial_CreateStream(NULL);
}
+/** Task to manage an enumerated USB keyboard once connected, to display key state
+ * data as it is received.
+ */
+void KeyboardHost_Task(void)
+{
+ if (USB_HostState != HOST_STATE_Configured)
+ return;
+
+ if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))
+ {
+ uint8_t KeyboardReport[Keyboard_HID_Interface.State.LargestReportSize];
+ HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);
+
+ 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(KeyboardReport, ReportItem)))
+ continue;
+
+ /* Determine what report item is being tested, process updated value as needed */
+ if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_KEYBOARD) &&
+ (ReportItem->Attributes.BitSize == 8) &&
+ (ReportItem->Attributes.Logical.Maximum > 1) &&
+ (ReportItem->ItemType == HID_REPORT_ITEM_In))
+ {
+ /* Key code is an unsigned char in length, cast to the appropriate type */
+ uint8_t KeyCode = (uint8_t)ReportItem->Value;
+
+ /* If scan-code is non-zero, a key is being pressed */
+ if (KeyCode)
+ {
+ /* Toggle status LED to indicate keypress */
+ LEDs_ToggleLEDs(LEDS_LED2);
+
+ char PressedKey = 0;
+
+ /* Convert scan-code to printable character if alphanumeric */
+ if ((KeyCode >= HID_KEYBOARD_SC_A) && (KeyCode <= HID_KEYBOARD_SC_Z))
+ {
+ PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';
+ }
+ else if ((KeyCode >= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &
+ (KeyCode < HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))
+ {
+ PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';
+ }
+ else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)
+ {
+ PressedKey = '0';
+ }
+ else if (KeyCode == HID_KEYBOARD_SC_SPACE)
+ {
+ PressedKey = ' ';
+ }
+ else if (KeyCode == HID_KEYBOARD_SC_ENTER)
+ {
+ PressedKey = '\n';
+ }
+
+ /* Print the pressed key character out through the serial port if valid */
+ if (PressedKey)
+ putchar(PressedKey);
+ }
+
+ /* Once a scan-code is found, stop scanning through the report items */
+ break;
+ }
+ }
+ }
+}
+
/** 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.
*/
@@ -235,6 +196,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(&Keyboard_HID_Interface,
+ ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
+ {
+ puts_P(PSTR("Attached Device Not a Valid Keyboard.\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(&Keyboard_HID_Interface) != 0)
+ {
+ puts_P(PSTR("Error Setting Report Protocol Mode or Not a Valid Keyboard.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ return;
+ }
+
+ puts_P(PSTR("Keyboard Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
diff --git a/Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.h b/Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.h
index 94e653a5ff..2eb974b08b 100644
--- a/Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.h
+++ b/Demos/Host/ClassDriver/KeyboardHostWithParser/KeyboardHostWithParser.h
@@ -68,6 +68,7 @@
/* Function Prototypes: */
void SetupHardware(void);
+ void KeyboardHost_Task(void);
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
void EVENT_USB_Host_DeviceAttached(void);
diff --git a/Demos/Host/ClassDriver/MIDIHost/MIDIHost.c b/Demos/Host/ClassDriver/MIDIHost/MIDIHost.c
index b451362a19..068730c8d0 100644
--- a/Demos/Host/ClassDriver/MIDIHost/MIDIHost.c
+++ b/Demos/Host/ClassDriver/MIDIHost/MIDIHost.c
@@ -67,63 +67,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 (MIDI_Host_ConfigurePipes(&Keyboard_MIDI_Interface,
- ConfigDescriptorSize, ConfigDescriptorData) != MIDI_ENUMERROR_NoError)
- {
- puts_P(PSTR("Attached Device Not a Valid MIDI Class Device.\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;
- }
-
- puts_P(PSTR("MIDI Device Enumerated.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- CheckJoystickMovement();
-
- MIDI_EventPacket_t MIDIEvent;
- while (MIDI_Host_ReceiveEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent))
- {
- bool NoteOnEvent = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_ON >> 4));
- bool NoteOffEvent = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_OFF >> 4));
-
- if (NoteOnEvent || NoteOffEvent)
- {
- printf_P(PSTR("MIDI Note %s - Channel %d, Pitch %d, Velocity %d\r\n"), NoteOnEvent ? "On" : "Off",
- ((MIDIEvent.Data1 & 0x0F) + 1),
- MIDIEvent.Data2, MIDIEvent.Data3);
- }
- }
-
- break;
- }
+ JoystickHost_Task();
MIDI_Host_USBTask(&Keyboard_MIDI_Interface);
USB_USBTask();
@@ -151,6 +95,35 @@ void SetupHardware(void)
Serial_CreateStream(NULL);
}
+/** Task to manage an enumerated USB MIDI device once connected, to display received
+ * note events from the host and send note changes in response to tbe board's joystick.
+ */
+void JoystickHost_Task(void)
+{
+ if (USB_HostState != HOST_STATE_Configured)
+ return;
+
+ MIDI_EventPacket_t MIDIEvent;
+ while (MIDI_Host_ReceiveEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent))
+ {
+ bool NoteOnEvent = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_ON >> 4));
+ bool NoteOffEvent = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_OFF >> 4));
+
+ /* Display note events from the host */
+ if (NoteOnEvent || NoteOffEvent)
+ {
+ printf_P(PSTR("MIDI Note %s - Channel %d, Pitch %d, Velocity %d\r\n"), NoteOnEvent ? "On" : "Off",
+ ((MIDIEvent.Data1 & 0x0F) + 1),
+ MIDIEvent.Data2, MIDIEvent.Data3);
+ }
+ }
+
+ CheckJoystickMovement();
+}
+
+/** Checks for movement of the board's joystick, and sends corresponding MIDI note on/off
+ * messages to the host.
+ */
void CheckJoystickMovement(void)
{
static uint8_t PrevJoystickStatus;
@@ -170,26 +143,22 @@ void CheckJoystickMovement(void)
MIDICommand = ((JoystickStatus & JOY_LEFT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
MIDIPitch = 0x3C;
}
-
- if (JoystickChanges & JOY_UP)
+ else if (JoystickChanges & JOY_UP)
{
MIDICommand = ((JoystickStatus & JOY_UP)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
MIDIPitch = 0x3D;
}
-
- if (JoystickChanges & JOY_RIGHT)
+ else if (JoystickChanges & JOY_RIGHT)
{
MIDICommand = ((JoystickStatus & JOY_RIGHT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
MIDIPitch = 0x3E;
}
-
- if (JoystickChanges & JOY_DOWN)
+ else if (JoystickChanges & JOY_DOWN)
{
MIDICommand = ((JoystickStatus & JOY_DOWN)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
MIDIPitch = 0x3F;
}
-
- if (JoystickChanges & JOY_PRESS)
+ else if (JoystickChanges & JOY_PRESS)
{
MIDICommand = ((JoystickStatus & JOY_PRESS)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
MIDIPitch = 0x3B;
@@ -237,6 +206,35 @@ 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 (MIDI_Host_ConfigurePipes(&Keyboard_MIDI_Interface,
+ ConfigDescriptorSize, ConfigDescriptorData) != MIDI_ENUMERROR_NoError)
+ {
+ puts_P(PSTR("Attached Device Not a Valid MIDI Class Device.\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;
+ }
+
+ puts_P(PSTR("MIDI Device Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
diff --git a/Demos/Host/ClassDriver/MIDIHost/MIDIHost.h b/Demos/Host/ClassDriver/MIDIHost/MIDIHost.h
index 2688500bcf..8711025946 100644
--- a/Demos/Host/ClassDriver/MIDIHost/MIDIHost.h
+++ b/Demos/Host/ClassDriver/MIDIHost/MIDIHost.h
@@ -68,6 +68,7 @@
/* Function Prototypes: */
void SetupHardware(void);
void CheckJoystickMovement(void);
+ void JoystickHost_Task(void);
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
void EVENT_USB_Host_DeviceAttached(void);
diff --git a/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.c b/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.c
index dcbebcc444..5fc3fdfdbb 100644
--- a/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.c
+++ b/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.c
@@ -67,166 +67,8 @@ 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 (MS_Host_ConfigurePipes(&FlashDisk_MS_Interface,
- ConfigDescriptorSize, ConfigDescriptorData) != MS_ENUMERROR_NoError)
- {
- puts_P(PSTR("Attached Device Not a Valid Mass Storage Device.\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;
- }
-
- puts_P(PSTR("Mass Storage Device Enumerated.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
-
- uint8_t MaxLUNIndex;
- if (MS_Host_GetMaxLUN(&FlashDisk_MS_Interface, &MaxLUNIndex))
- {
- puts_P(PSTR("Error retrieving max LUN index.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- printf_P(PSTR("Total LUNs: %d - Using first LUN in device.\r\n"), (MaxLUNIndex + 1));
-
- if (MS_Host_ResetMSInterface(&FlashDisk_MS_Interface))
- {
- puts_P(PSTR("Error resetting Mass Storage interface.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- SCSI_Request_Sense_Response_t SenseData;
- if (MS_Host_RequestSense(&FlashDisk_MS_Interface, 0, &SenseData) != 0)
- {
- puts_P(PSTR("Error retrieving device sense.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- if (MS_Host_PreventAllowMediumRemoval(&FlashDisk_MS_Interface, 0, true))
- {
- puts_P(PSTR("Error setting Prevent Device Removal bit.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- SCSI_Inquiry_Response_t InquiryData;
- if (MS_Host_GetInquiryData(&FlashDisk_MS_Interface, 0, &InquiryData))
- {
- puts_P(PSTR("Error retrieving device Inquiry data.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- printf_P(PSTR("Vendor \"%.8s\", Product \"%.16s\"\r\n"), InquiryData.VendorID, InquiryData.ProductID);
-
- puts_P(PSTR("Waiting until ready...\r\n"));
-
- for (;;)
- {
- uint8_t ErrorCode = MS_Host_TestUnitReady(&FlashDisk_MS_Interface, 0);
-
- if (!(ErrorCode))
- break;
-
- /* Check if an error other than a logical command error (device busy) received */
- if (ErrorCode != MS_ERROR_LOGICAL_CMD_FAILED)
- {
- puts_P(PSTR("Error waiting for device to be ready.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
- }
-
- puts_P(PSTR("Retrieving Capacity...\r\n"));
-
- SCSI_Capacity_t DiskCapacity;
- if (MS_Host_ReadDeviceCapacity(&FlashDisk_MS_Interface, 0, &DiskCapacity))
- {
- puts_P(PSTR("Error retrieving device capacity.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- printf_P(PSTR("%lu blocks of %lu bytes.\r\n"), DiskCapacity.Blocks, DiskCapacity.BlockSize);
-
- uint8_t BlockBuffer[DiskCapacity.BlockSize];
-
- if (MS_Host_ReadDeviceBlocks(&FlashDisk_MS_Interface, 0, 0x00000000, 1, DiskCapacity.BlockSize, BlockBuffer))
- {
- puts_P(PSTR("Error reading device block.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("\r\nContents of first block:\r\n"));
-
- for (uint16_t Chunk = 0; Chunk < (DiskCapacity.BlockSize >> 4); Chunk++)
- {
- uint8_t* ChunkPtr = &BlockBuffer[Chunk << 4];
-
- /* Print out the 16 bytes of the chunk in HEX format */
- for (uint8_t ByteOffset = 0; ByteOffset < (1 << 4); ByteOffset++)
- {
- char CurrByte = *(ChunkPtr + ByteOffset);
- printf_P(PSTR("%.2X "), CurrByte);
- }
-
- printf_P(PSTR(" "));
-
- /* Print out the 16 bytes of the chunk in ASCII format */
- for (uint8_t ByteOffset = 0; ByteOffset < (1 << 4); ByteOffset++)
- {
- char CurrByte = *(ChunkPtr + ByteOffset);
- putchar(isprint(CurrByte) ? CurrByte : '.');
- }
-
- printf_P(PSTR("\r\n"));
- }
-
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
+ MassStorageHost_Task();
+
MS_Host_USBTask(&FlashDisk_MS_Interface);
USB_USBTask();
}
@@ -251,6 +93,87 @@ void SetupHardware(void)
Serial_CreateStream(NULL);
}
+/** Task to manage an enumerated USB Mass Storage device once connected, to print out
+ * data from the device.
+ */
+void MassStorageHost_Task(void)
+{
+ if (USB_HostState != HOST_STATE_Configured)
+ return;
+
+ LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
+
+ puts_P(PSTR("Waiting until ready...\r\n"));
+
+ for (;;)
+ {
+ uint8_t ErrorCode = MS_Host_TestUnitReady(&FlashDisk_MS_Interface, 0);
+
+ if (!(ErrorCode))
+ break;
+
+ /* Check if an error other than a logical command error (device busy) received */
+ if (ErrorCode != MS_ERROR_LOGICAL_CMD_FAILED)
+ {
+ puts_P(PSTR("Error waiting for device to be ready.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+ }
+
+ puts_P(PSTR("Retrieving Capacity...\r\n"));
+
+ SCSI_Capacity_t DiskCapacity;
+ if (MS_Host_ReadDeviceCapacity(&FlashDisk_MS_Interface, 0, &DiskCapacity))
+ {
+ puts_P(PSTR("Error retrieving device capacity.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ printf_P(PSTR("%lu blocks of %lu bytes.\r\n"), DiskCapacity.Blocks, DiskCapacity.BlockSize);
+
+ uint8_t BlockBuffer[DiskCapacity.BlockSize];
+
+ if (MS_Host_ReadDeviceBlocks(&FlashDisk_MS_Interface, 0, 0x00000000, 1, DiskCapacity.BlockSize, BlockBuffer))
+ {
+ puts_P(PSTR("Error reading device block.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ puts_P(PSTR("\r\nContents of first block:\r\n"));
+
+ for (uint16_t Chunk = 0; Chunk < (DiskCapacity.BlockSize >> 4); Chunk++)
+ {
+ uint8_t* ChunkPtr = &BlockBuffer[Chunk << 4];
+
+ /* Print out the 16 bytes of the chunk in HEX format */
+ for (uint8_t ByteOffset = 0; ByteOffset < (1 << 4); ByteOffset++)
+ {
+ char CurrByte = *(ChunkPtr + ByteOffset);
+ printf_P(PSTR("%.2X "), CurrByte);
+ }
+
+ printf_P(PSTR(" "));
+
+ /* Print out the 16 bytes of the chunk in ASCII format */
+ for (uint8_t ByteOffset = 0; ByteOffset < (1 << 4); ByteOffset++)
+ {
+ char CurrByte = *(ChunkPtr + ByteOffset);
+ putchar(isprint(CurrByte) ? CurrByte : '.');
+ }
+
+ printf_P(PSTR("\r\n"));
+ }
+
+ LEDs_SetAllLEDs(LEDMASK_USB_READY);
+ USB_Host_SetDeviceConfiguration(0);
+}
+
/** 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.
*/
@@ -274,6 +197,82 @@ 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 (MS_Host_ConfigurePipes(&FlashDisk_MS_Interface,
+ ConfigDescriptorSize, ConfigDescriptorData) != MS_ENUMERROR_NoError)
+ {
+ puts_P(PSTR("Attached Device Not a Valid Mass Storage Device.\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;
+ }
+
+ uint8_t MaxLUNIndex;
+ if (MS_Host_GetMaxLUN(&FlashDisk_MS_Interface, &MaxLUNIndex))
+ {
+ puts_P(PSTR("Error retrieving max LUN index.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ printf_P(PSTR("Total LUNs: %d - Using first LUN in device.\r\n"), (MaxLUNIndex + 1));
+
+ if (MS_Host_ResetMSInterface(&FlashDisk_MS_Interface))
+ {
+ puts_P(PSTR("Error resetting Mass Storage interface.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ SCSI_Request_Sense_Response_t SenseData;
+ if (MS_Host_RequestSense(&FlashDisk_MS_Interface, 0, &SenseData) != 0)
+ {
+ puts_P(PSTR("Error retrieving device sense.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ if (MS_Host_PreventAllowMediumRemoval(&FlashDisk_MS_Interface, 0, true))
+ {
+ puts_P(PSTR("Error setting Prevent Device Removal bit.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ SCSI_Inquiry_Response_t InquiryData;
+ if (MS_Host_GetInquiryData(&FlashDisk_MS_Interface, 0, &InquiryData))
+ {
+ puts_P(PSTR("Error retrieving device Inquiry data.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ printf_P(PSTR("Vendor \"%.8s\", Product \"%.16s\"\r\n"), InquiryData.VendorID, InquiryData.ProductID);
+
+ puts_P(PSTR("Mass Storage Device Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
diff --git a/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.h b/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.h
index dfc6a8f947..b4aa02ac9d 100644
--- a/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.h
+++ b/Demos/Host/ClassDriver/MassStorageHost/MassStorageHost.h
@@ -69,7 +69,8 @@
/* Function Prototypes: */
void SetupHardware(void);
-
+ void MassStorageHost_Task(void);
+
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
void EVENT_USB_Host_DeviceAttached(void);
void EVENT_USB_Host_DeviceUnattached(void);
diff --git a/Demos/Host/ClassDriver/MouseHost/MouseHost.c b/Demos/Host/ClassDriver/MouseHost/MouseHost.c
index e7c03ab487..5c94ecda18 100644
--- a/Demos/Host/ClassDriver/MouseHost/MouseHost.c
+++ b/Demos/Host/ClassDriver/MouseHost/MouseHost.c
@@ -69,81 +69,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_SetBootProtocol(&Mouse_HID_Interface) != 0)
- {
- puts_P(PSTR("Could not Set Boot Protocol Mode.\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 LEDMask = LEDS_NO_LEDS;
-
- USB_MouseReport_Data_t MouseReport;
- HID_Host_ReceiveReport(&Mouse_HID_Interface, &MouseReport);
-
- printf_P(PSTR("dX:%2d dY:%2d Button:%d\r\n"), MouseReport.X,
- MouseReport.Y,
- MouseReport.Button);
- if (MouseReport.X > 0)
- LEDMask |= LEDS_LED1;
- else if (MouseReport.X < 0)
- LEDMask |= LEDS_LED2;
-
- if (MouseReport.Y > 0)
- LEDMask |= LEDS_LED3;
- else if (MouseReport.Y < 0)
- LEDMask |= LEDS_LED4;
-
- if (MouseReport.Button)
- LEDMask = LEDS_ALL_LEDS;
-
- LEDs_SetAllLEDs(LEDMask);
- }
-
- break;
- }
+ MouseHost_Task();
HID_Host_USBTask(&Mouse_HID_Interface);
USB_USBTask();
@@ -169,6 +95,41 @@ 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 LEDMask = LEDS_NO_LEDS;
+
+ USB_MouseReport_Data_t MouseReport;
+ HID_Host_ReceiveReport(&Mouse_HID_Interface, &MouseReport);
+
+ printf_P(PSTR("dX:%2d dY:%2d Button:%d\r\n"), MouseReport.X,
+ MouseReport.Y,
+ MouseReport.Button);
+ if (MouseReport.X > 0)
+ LEDMask |= LEDS_LED1;
+ else if (MouseReport.X < 0)
+ LEDMask |= LEDS_LED2;
+
+ if (MouseReport.Y > 0)
+ LEDMask |= LEDS_LED3;
+ else if (MouseReport.Y < 0)
+ LEDMask |= LEDS_LED4;
+
+ if (MouseReport.Button)
+ LEDMask = LEDS_ALL_LEDS;
+
+ 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.
*/
@@ -192,6 +153,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_SetBootProtocol(&Mouse_HID_Interface) != 0)
+ {
+ puts_P(PSTR("Could not Set Boot Protocol Mode.\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/MouseHost/MouseHost.h b/Demos/Host/ClassDriver/MouseHost/MouseHost.h
index 6dee569a08..e0f9a13ab2 100644
--- a/Demos/Host/ClassDriver/MouseHost/MouseHost.h
+++ b/Demos/Host/ClassDriver/MouseHost/MouseHost.h
@@ -65,6 +65,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);
diff --git a/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c b/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c
index 8fd49f2a7d..b71554f48d 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 8d90d5cf4e..4e9587bd32 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);
diff --git a/Demos/Host/ClassDriver/PrinterHost/PrinterHost.c b/Demos/Host/ClassDriver/PrinterHost/PrinterHost.c
index 8d51165e66..1233446aa8 100644
--- a/Demos/Host/ClassDriver/PrinterHost/PrinterHost.c
+++ b/Demos/Host/ClassDriver/PrinterHost/PrinterHost.c
@@ -67,88 +67,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 (PRNT_Host_ConfigurePipes(&Printer_PRNT_Interface,
- ConfigDescriptorSize, ConfigDescriptorData) != PRNT_ENUMERROR_NoError)
- {
- puts_P(PSTR("Attached Device Not a Valid Printer Class Device.\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 (PRNT_Host_SetBidirectionalMode(&Printer_PRNT_Interface) != HOST_SENDCONTROL_Successful)
- {
- puts_P(PSTR("Error Setting Bidirectional Mode.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("Printer Device Enumerated.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
-
- puts_P(PSTR("Retrieving Device ID...\r\n"));
-
- char DeviceIDString[300];
- if (PRNT_Host_GetDeviceID(&Printer_PRNT_Interface, DeviceIDString,
- sizeof(DeviceIDString)) != HOST_SENDCONTROL_Successful)
- {
- puts_P(PSTR("Error Getting Device ID.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- printf_P(PSTR("Device ID: %s.\r\n"), DeviceIDString);
-
- char TestPageData[] = "\033%-12345X\033E" "LUFA PCL Test Page" "\033E\033%-12345X";
- uint16_t TestPageLength = strlen(TestPageData);
-
- printf_P(PSTR("Sending Test Page (%d bytes)...\r\n"), TestPageLength);
-
- if (PRNT_Host_SendData(&Printer_PRNT_Interface, &TestPageData, TestPageLength) != PIPE_RWSTREAM_NoError)
- {
- puts_P(PSTR("Error Sending Page Data.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("Test Page Sent.\r\n"));
-
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
+ PrinterHost_Task();
PRNT_Host_USBTask(&Printer_PRNT_Interface);
USB_USBTask();
@@ -174,6 +93,49 @@ void SetupHardware(void)
Serial_CreateStream(NULL);
}
+/** Task to manage an enumerated USB printer once connected, to display device
+ * information and print a test PCL page.
+ */
+void PrinterHost_Task(void)
+{
+ if (USB_HostState != HOST_STATE_Configured)
+ return;
+
+ LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
+
+ puts_P(PSTR("Retrieving Device ID...\r\n"));
+
+ char DeviceIDString[300];
+ if (PRNT_Host_GetDeviceID(&Printer_PRNT_Interface, DeviceIDString,
+ sizeof(DeviceIDString)) != HOST_SENDCONTROL_Successful)
+ {
+ puts_P(PSTR("Error Getting Device ID.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ printf_P(PSTR("Device ID: %s.\r\n"), DeviceIDString);
+
+ char TestPageData[] = "\033%-12345X\033E" "LUFA PCL Test Page" "\033E\033%-12345X";
+ uint16_t TestPageLength = strlen(TestPageData);
+
+ printf_P(PSTR("Sending Test Page (%d bytes)...\r\n"), TestPageLength);
+
+ if (PRNT_Host_SendData(&Printer_PRNT_Interface, &TestPageData, TestPageLength) != PIPE_RWSTREAM_NoError)
+ {
+ puts_P(PSTR("Error Sending Page Data.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ puts_P(PSTR("Test Page Sent.\r\n"));
+
+ LEDs_SetAllLEDs(LEDMASK_USB_READY);
+ USB_Host_SetDeviceConfiguration(0);
+}
+
/** 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.
*/
@@ -197,6 +159,43 @@ 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 (PRNT_Host_ConfigurePipes(&Printer_PRNT_Interface,
+ ConfigDescriptorSize, ConfigDescriptorData) != PRNT_ENUMERROR_NoError)
+ {
+ puts_P(PSTR("Attached Device Not a Valid Printer Class Device.\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 (PRNT_Host_SetBidirectionalMode(&Printer_PRNT_Interface) != HOST_SENDCONTROL_Successful)
+ {
+ puts_P(PSTR("Error Setting Bidirectional Mode.\r\n"));
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ puts_P(PSTR("Printer Device Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
diff --git a/Demos/Host/ClassDriver/PrinterHost/PrinterHost.h b/Demos/Host/ClassDriver/PrinterHost/PrinterHost.h
index 0c0a8277a9..ef78dbba88 100644
--- a/Demos/Host/ClassDriver/PrinterHost/PrinterHost.h
+++ b/Demos/Host/ClassDriver/PrinterHost/PrinterHost.h
@@ -68,6 +68,7 @@
/* Function Prototypes: */
void SetupHardware(void);
+ void PrinterHost_Task(void);
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
void EVENT_USB_Host_DeviceAttached(void);
diff --git a/Demos/Host/ClassDriver/RNDISEthernetHost/RNDISEthernetHost.c b/Demos/Host/ClassDriver/RNDISEthernetHost/RNDISEthernetHost.c
index d19e5a4f05..6e942964aa 100644
--- a/Demos/Host/ClassDriver/RNDISEthernetHost/RNDISEthernetHost.c
+++ b/Demos/Host/ClassDriver/RNDISEthernetHost/RNDISEthernetHost.c
@@ -75,93 +75,21 @@ 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 (RNDIS_Host_ConfigurePipes(&Ethernet_RNDIS_Interface,
- ConfigDescriptorSize, ConfigDescriptorData) != RNDIS_ENUMERROR_NoError)
- {
- puts_P(PSTR("Attached Device Not a Valid RNDIS Class Device.\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 (RNDIS_Host_InitializeDevice(&Ethernet_RNDIS_Interface) != HOST_SENDCONTROL_Successful)
- {
- puts_P(PSTR("Error Initializing Device.\r\n"));
-
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- printf_P(PSTR("Device Max Transfer Size: %lu bytes.\r\n"), Ethernet_RNDIS_Interface.State.DeviceMaxPacketSize);
-
- uint32_t PacketFilter = (REMOTE_NDIS_PACKET_DIRECTED | REMOTE_NDIS_PACKET_BROADCAST | REMOTE_NDIS_PACKET_ALL_MULTICAST);
- if (RNDIS_Host_SetRNDISProperty(&Ethernet_RNDIS_Interface, OID_GEN_CURRENT_PACKET_FILTER,
- &PacketFilter, sizeof(PacketFilter)) != HOST_SENDCONTROL_Successful)
- {
- puts_P(PSTR("Error Setting Device Packet Filter.\r\n"));
-
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- uint32_t VendorID;
- if (RNDIS_Host_QueryRNDISProperty(&Ethernet_RNDIS_Interface, OID_GEN_VENDOR_ID,
- &VendorID, sizeof(VendorID)) != HOST_SENDCONTROL_Successful)
- {
- puts_P(PSTR("Error Getting Vendor ID.\r\n"));
-
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- printf_P(PSTR("Device Vendor ID: 0x%08lX\r\n"), VendorID);
-
- puts_P(PSTR("RNDIS Device Enumerated.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- PrintIncomingPackets();
-
- break;
- }
+ RNDISHost_Task();
RNDIS_Host_USBTask(&Ethernet_RNDIS_Interface);
USB_USBTask();
}
}
-/** Prints incoming packets from the attached RNDIS device to the serial port. */
-void PrintIncomingPackets(void)
+/** Task to manage an enumerated USB RNDIS device once connected, to display device
+ * received data packets.
+ */
+void RNDISHost_Task(void)
{
+ if (USB_HostState != HOST_STATE_Configured)
+ return;
+
if (RNDIS_Host_IsPacketReceived(&Ethernet_RNDIS_Interface))
{
LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
@@ -222,6 +150,70 @@ 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 (RNDIS_Host_ConfigurePipes(&Ethernet_RNDIS_Interface,
+ ConfigDescriptorSize, ConfigDescriptorData) != RNDIS_ENUMERROR_NoError)
+ {
+ puts_P(PSTR("Attached Device Not a Valid RNDIS Class Device.\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 (RNDIS_Host_InitializeDevice(&Ethernet_RNDIS_Interface) != HOST_SENDCONTROL_Successful)
+ {
+ puts_P(PSTR("Error Initializing Device.\r\n"));
+
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ printf_P(PSTR("Device Max Transfer Size: %lu bytes.\r\n"), Ethernet_RNDIS_Interface.State.DeviceMaxPacketSize);
+
+ uint32_t PacketFilter = (REMOTE_NDIS_PACKET_DIRECTED | REMOTE_NDIS_PACKET_BROADCAST | REMOTE_NDIS_PACKET_ALL_MULTICAST);
+ if (RNDIS_Host_SetRNDISProperty(&Ethernet_RNDIS_Interface, OID_GEN_CURRENT_PACKET_FILTER,
+ &PacketFilter, sizeof(PacketFilter)) != HOST_SENDCONTROL_Successful)
+ {
+ puts_P(PSTR("Error Setting Device Packet Filter.\r\n"));
+
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ uint32_t VendorID;
+ if (RNDIS_Host_QueryRNDISProperty(&Ethernet_RNDIS_Interface, OID_GEN_VENDOR_ID,
+ &VendorID, sizeof(VendorID)) != HOST_SENDCONTROL_Successful)
+ {
+ puts_P(PSTR("Error Getting Vendor ID.\r\n"));
+
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ printf_P(PSTR("Device Vendor ID: 0x%08lX\r\n"), VendorID);
+
+ puts_P(PSTR("RNDIS Device Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
diff --git a/Demos/Host/ClassDriver/RNDISEthernetHost/RNDISEthernetHost.h b/Demos/Host/ClassDriver/RNDISEthernetHost/RNDISEthernetHost.h
index f0ee56398c..f4aaa294ad 100644
--- a/Demos/Host/ClassDriver/RNDISEthernetHost/RNDISEthernetHost.h
+++ b/Demos/Host/ClassDriver/RNDISEthernetHost/RNDISEthernetHost.h
@@ -68,7 +68,7 @@
/* Function Prototypes: */
void SetupHardware(void);
- void PrintIncomingPackets(void);
+ void RNDISHost_Task(void);
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
void EVENT_USB_Host_DeviceAttached(void);
diff --git a/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c b/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c
index 91c482af86..6dd7344018 100644
--- a/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c
+++ b/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c
@@ -70,80 +70,8 @@ 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 (SI_Host_ConfigurePipes(&DigitalCamera_SI_Interface,
- ConfigDescriptorSize, ConfigDescriptorData) != SI_ENUMERROR_NoError)
- {
- puts_P(PSTR("Attached Device Not a Valid Still Image Class Device.\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;
- }
-
- puts_P(PSTR("Still Image Device Enumerated.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- puts_P(PSTR("Opening Session...\r\n"));
-
- if (SI_Host_OpenSession(&DigitalCamera_SI_Interface) != PIPE_RWSTREAM_NoError)
- {
- puts_P(PSTR("Could not open PIMA session.\r\n"));
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("Turning off Device...\r\n"));
-
- SI_Host_SendCommand(&DigitalCamera_SI_Interface, 0x1013, 0, NULL);
- if (SI_Host_ReceiveResponse(&DigitalCamera_SI_Interface))
- {
- puts_P(PSTR("Could not turn off device.\r\n"));
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("Device Off.\r\n"));
-
- puts_P(PSTR("Closing Session...\r\n"));
-
- if (SI_Host_CloseSession(&DigitalCamera_SI_Interface) != PIPE_RWSTREAM_NoError)
- {
- puts_P(PSTR("Could not close PIMA session.\r\n"));
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
+ StillImageHost_Task();
+
SI_Host_USBTask(&DigitalCamera_SI_Interface);
USB_USBTask();
}
@@ -168,6 +96,48 @@ void SetupHardware(void)
Serial_CreateStream(NULL);
}
+/** Task to manage an enumerated USB Still Image device once connected, to manage a
+ * new PIMA session in order to send commands to the attached device.
+ */
+void StillImageHost_Task(void)
+{
+ if (USB_HostState != HOST_STATE_Configured)
+ return;
+
+ puts_P(PSTR("Opening Session...\r\n"));
+
+ if (SI_Host_OpenSession(&DigitalCamera_SI_Interface) != PIPE_RWSTREAM_NoError)
+ {
+ puts_P(PSTR("Could not open PIMA session.\r\n"));
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ puts_P(PSTR("Turning off Device...\r\n"));
+
+ SI_Host_SendCommand(&DigitalCamera_SI_Interface, 0x1013, 0, NULL);
+ if (SI_Host_ReceiveResponse(&DigitalCamera_SI_Interface))
+ {
+ puts_P(PSTR("Could not turn off device.\r\n"));
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ puts_P(PSTR("Device Off.\r\n"));
+
+ puts_P(PSTR("Closing Session...\r\n"));
+
+ if (SI_Host_CloseSession(&DigitalCamera_SI_Interface) != PIPE_RWSTREAM_NoError)
+ {
+ puts_P(PSTR("Could not close PIMA session.\r\n"));
+ USB_Host_SetDeviceConfiguration(0);
+ return;
+ }
+
+ LEDs_SetAllLEDs(LEDMASK_USB_READY);
+ USB_Host_SetDeviceConfiguration(0);
+}
+
/** 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.
*/
@@ -191,6 +161,35 @@ 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 (SI_Host_ConfigurePipes(&DigitalCamera_SI_Interface,
+ ConfigDescriptorSize, ConfigDescriptorData) != SI_ENUMERROR_NoError)
+ {
+ puts_P(PSTR("Attached Device Not a Valid Still Image Class Device.\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;
+ }
+
+ puts_P(PSTR("Still Image Device Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
diff --git a/Demos/Host/ClassDriver/StillImageHost/StillImageHost.h b/Demos/Host/ClassDriver/StillImageHost/StillImageHost.h
index 82bef4f40e..a3c85ebe32 100644
--- a/Demos/Host/ClassDriver/StillImageHost/StillImageHost.h
+++ b/Demos/Host/ClassDriver/StillImageHost/StillImageHost.h
@@ -65,6 +65,7 @@
/* Function Prototypes: */
void SetupHardware(void);
+ void StillImageHost_Task(void);
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
void EVENT_USB_Host_DeviceAttached(void);
diff --git a/Demos/Host/ClassDriver/VirtualSerialHost/VirtualSerialHost.c b/Demos/Host/ClassDriver/VirtualSerialHost/VirtualSerialHost.c
index 4668908521..72d7e58347 100644
--- a/Demos/Host/ClassDriver/VirtualSerialHost/VirtualSerialHost.c
+++ b/Demos/Host/ClassDriver/VirtualSerialHost/VirtualSerialHost.c
@@ -70,55 +70,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 (CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface,
- ConfigDescriptorSize, ConfigDescriptorData) != CDC_ENUMERROR_NoError)
- {
- puts_P(PSTR("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)
- {
- puts_P(PSTR("Error Setting Device Configuration.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;
- break;
- }
-
- puts_P(PSTR("CDC Device Enumerated.\r\n"));
- LEDs_SetAllLEDs(LEDMASK_USB_READY);
- USB_HostState = HOST_STATE_Configured;
- break;
- case HOST_STATE_Configured:
- if (CDC_Host_BytesReceived(&VirtualSerial_CDC_Interface))
- {
- /* Echo received bytes from the attached device through the USART */
- int16_t ReceivedByte = CDC_Host_ReceiveByte(&VirtualSerial_CDC_Interface);
- if (!(ReceivedByte < 0))
- putchar(ReceivedByte);
- }
-
- break;
- }
+ CDCHost_Task();
CDC_Host_USBTask(&VirtualSerial_CDC_Interface);
USB_USBTask();
@@ -144,6 +96,23 @@ void SetupHardware(void)
Serial_CreateStream(NULL);
}
+/** Task to manage an enumerated USB CDC device once connected, to print received data
+ * from the device to the serial port.
+ */
+void CDCHost_Task(void)
+{
+ if (USB_HostState != HOST_STATE_Configured)
+ return;
+
+ if (CDC_Host_BytesReceived(&VirtualSerial_CDC_Interface))
+ {
+ /* Echo received bytes from the attached device through the USART */
+ int16_t ReceivedByte = CDC_Host_ReceiveByte(&VirtualSerial_CDC_Interface);
+ if (!(ReceivedByte < 0))
+ putchar(ReceivedByte);
+ }
+}
+
/** 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.
*/
@@ -167,6 +136,35 @@ 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 (CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface,
+ ConfigDescriptorSize, ConfigDescriptorData) != CDC_ENUMERROR_NoError)
+ {
+ puts_P(PSTR("Attached Device Not a Valid CDC Class Device.\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;
+ }
+
+ puts_P(PSTR("CDC Device Enumerated.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
diff --git a/Demos/Host/ClassDriver/VirtualSerialHost/VirtualSerialHost.h b/Demos/Host/ClassDriver/VirtualSerialHost/VirtualSerialHost.h
index ee625d79c5..6a68a32c5f 100644
--- a/Demos/Host/ClassDriver/VirtualSerialHost/VirtualSerialHost.h
+++ b/Demos/Host/ClassDriver/VirtualSerialHost/VirtualSerialHost.h
@@ -65,6 +65,7 @@
/* Function Prototypes: */
void SetupHardware(void);
+ void CDCHost_Task(void);
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
void EVENT_USB_Host_DeviceAttached(void);