diff options
Diffstat (limited to 'Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.c')
-rw-r--r-- | Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.c | 181 |
1 files changed, 89 insertions, 92 deletions
diff --git a/Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.c b/Demos/Host/ClassDriver/KeyboardHost/KeyboardHost.c index 38af3a7c5..abc038e22 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); } |