/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
 *  enumerated by the host and is now ready to be used by the application.
 */
void EVENT_USB_Host_DeviceEnumerationComplete(void) {

	uint16_t ConfigDescriptorSize;
	uint8_t  ConfigDescriptorData[512];
    
	if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData, sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful) {
        KeyHost.status(STAT_ERROR);
        KeyHost.error(ERROR_CFGDESC);
		return;
	}
    
	if (HID_Host_ConfigurePipes(&Keyboard_HID_Interface, ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError) {
        KeyHost.status(STAT_ERROR);
        KeyHost.error(ERROR_DEV);
		return;
	}
    
	if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful) {
        KeyHost.status(STAT_ERROR);
        KeyHost.error(ERROR_SETCFG);
		return;
	}
    
	if (HID_Host_SetBootProtocol(&Keyboard_HID_Interface) != 0) {
        KeyHost.status(STAT_ERROR);
        KeyHost.error(ERROR_SETPROTO);
		USB_Host_SetDeviceConfiguration(0);
		return;
	}

    // KeyHost.status(STAT_CONNECTED);
}
/* This indicates that a device has been successfully
   enumerated by the host and is now ready to be used by the
   application. */
void EVENT_USB_Host_DeviceEnumerationComplete(const uint8_t corenum)
{
	uint16_t ConfigDescriptorSize;
	uint8_t  ConfigDescriptorData[512];

	if (USB_Host_GetDeviceConfigDescriptor(corenum, 1, &ConfigDescriptorSize, ConfigDescriptorData,
										   sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful) {
		DEBUGOUT("Error Retrieving Configuration Descriptor.\r\n");

		return;
	}

	Keyboard_HID_Interface.Config.PortNumber = corenum;
	if (HID_Host_ConfigurePipes(&Keyboard_HID_Interface,
								ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError) {
		DEBUGOUT("Attached Device Not a Valid Keyboard.\r\n");

		return;
	}

	if (USB_Host_SetDeviceConfiguration(Keyboard_HID_Interface.Config.PortNumber, 1) != HOST_SENDCONTROL_Successful) {
		DEBUGOUT("Error Setting Device Configuration.\r\n");

		return;
	}

	if (HID_Host_SetBootProtocol(&Keyboard_HID_Interface) != 0) {
		DEBUGOUT("Could not Set Boot Protocol Mode.\r\n");

		USB_Host_SetDeviceConfiguration(Keyboard_HID_Interface.Config.PortNumber, 0);
		return;
	}

	DEBUGOUT("Keyboard Enumerated.\r\n");
}
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
 *  enumerated by the host and is now ready to be used by the application.
 */
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);
        USB_Host_SetDeviceConfiguration(0);
        return;
    }

    puts_P(PSTR("Keyboard Enumerated.\r\n"));
    LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
Exemple #4
0
/** Main program entry point. This routine configures the hardware required by the application, then
 *  enters a loop to run the application tasks in sequence.
 */
int main(void)
{
	SetupHardware();

	puts_P(PSTR(ESC_FG_CYAN "Keyboard Host Demo running.\r\n" ESC_FG_WHITE));

	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
	sei();

	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) + '0';
						}
						else if (KeyCode == HID_KEYBOARD_SC_SPACE)
						{
							PressedKey = ' ';
						}
						else if (KeyCode == HID_KEYBOARD_SC_ENTER)
						{
							PressedKey = '\n';
						}
						
						if (PressedKey)
						  putchar(PressedKey);
					}
				}

				break;
		}

		HID_Host_USBTask(&Keyboard_HID_Interface);
		USB_USBTask();
	}
}
/** Host state machine task. This task handles the enumeration and control of USB Mice while in USB Host mode,
 *  setting up the appropriate data pipes and processing reports from the attached device.
 */
void MouseHostTask(void)
{
	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)
			{
				printf("Error Retrieving Configuration Descriptor.\r\n");
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
				break;
			}

			if (HID_Host_ConfigurePipes(&Mouse_HID_Host_Interface,
			                            ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
			{
				printf("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)
			{
				printf("Error Setting Device Configuration.\r\n");
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
				break;
			}

			if (HID_Host_SetBootProtocol(&Mouse_HID_Host_Interface) != 0)
			{
				printf("Could not Set Boot Protocol Mode.\r\n");
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
				break;
			}
				
			printf("Mouse Enumerated.\r\n");
			USB_HostState = HOST_STATE_Configured;
			break;
		case HOST_STATE_Configured:
			if (HID_Host_IsReportReceived(&Mouse_HID_Host_Interface))
			{	
				uint8_t LEDMask  = LEDS_NO_LEDS;
					
				USB_MouseReport_Data_t MouseReport;
				HID_Host_ReceiveReport(&Mouse_HID_Host_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;
	}
}