Update UC3 platform driver support to use the bitmasks defined in the header files...
[pub/USBasp.git] / Demos / Host / LowLevel / GenericHIDHost / GenericHIDHost.c
index 66a5b8e..720ad03 100644 (file)
@@ -1,21 +1,21 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
-              
+     Copyright (C) Dean Camera, 2011.
+
   dean [at] fourwalledcubicle [dot] com
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
 
-  Permission to use, copy, modify, distribute, and sell this 
+  Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
   software and its documentation for any purpose is hereby granted
-  without fee, provided that the above copyright notice appear in 
+  without fee, provided that the above copyright notice appear in
   all copies and that both that the copyright notice and this
   all copies and that both that the copyright notice and this
-  permission notice and warranty disclaimer appear in supporting 
-  documentation, and that the name of the author not be used in 
-  advertising or publicity pertaining to distribution of the 
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
   software without specific, written prior permission.
 
   The author disclaim all warranties with regard to this
   software without specific, written prior permission.
 
   The author disclaim all warranties with regard to this
@@ -33,7 +33,7 @@
  *  Main source file for the GenericHIDHost demo. This file contains the main tasks of
  *  the demo and is responsible for the initial application hardware configuration.
  */
  *  Main source file for the GenericHIDHost demo. This file contains the main tasks of
  *  the demo and is responsible for the initial application hardware configuration.
  */
+
 #include "GenericHIDHost.h"
 
 /** Main program entry point. This routine configures the hardware required by the application, then
 #include "GenericHIDHost.h"
 
 /** Main program entry point. This routine configures the hardware required by the application, then
@@ -50,7 +50,8 @@ int main(void)
 
        for (;;)
        {
 
        for (;;)
        {
-               HID_Host_Task();
+               ReadNextReport();
+               
                USB_USBTask();
        }
 }
                USB_USBTask();
        }
 }
@@ -66,9 +67,12 @@ void SetupHardware(void)
        clock_prescale_set(clock_div_1);
 
        /* Hardware Initialization */
        clock_prescale_set(clock_div_1);
 
        /* Hardware Initialization */
-       SerialStream_Init(9600, false);
+       Serial_Init(9600, false);
        LEDs_Init();
        USB_Init();
        LEDs_Init();
        USB_Init();
+
+       /* Create a stdio stream for the serial port for stdin and stdout */
+       Serial_CreateStream(NULL);
 }
 
 /** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
 }
 
 /** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
@@ -94,13 +98,42 @@ void EVENT_USB_Host_DeviceUnattached(void)
  */
 void EVENT_USB_Host_DeviceEnumerationComplete(void)
 {
  */
 void EVENT_USB_Host_DeviceEnumerationComplete(void)
 {
+       puts_P(PSTR("Getting Config Data.\r\n"));
+
+       uint8_t ErrorCode;
+
+       /* Get and process the configuration descriptor data */
+       if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
+       {
+               if (ErrorCode == ControlError)
+                 puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
+               else
+                 puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
+
+               printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
+
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+               return;
+       }
+
+       /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
+       if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
+       {
+               printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"
+                                        " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
+
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+               return;
+       }
+
+       puts_P(PSTR("HID Device Enumerated.\r\n"));
        LEDs_SetAllLEDs(LEDMASK_USB_READY);
 }
 
 /** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
 void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
 {
        LEDs_SetAllLEDs(LEDMASK_USB_READY);
 }
 
 /** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
 void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
 {
-       USB_ShutDown();
+       USB_Disable();
 
        printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
                                 " -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
 
        printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
                                 " -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
@@ -128,6 +161,9 @@ void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
  */
 void ReadNextReport(void)
 {
  */
 void ReadNextReport(void)
 {
+       if (USB_HostState != HOST_STATE_Configured)
+         return;
+
        /* Select and unfreeze HID data IN pipe */
        Pipe_SelectPipe(HID_DATA_IN_PIPE);
        Pipe_Unfreeze();
        /* Select and unfreeze HID data IN pipe */
        Pipe_SelectPipe(HID_DATA_IN_PIPE);
        Pipe_Unfreeze();
@@ -137,28 +173,28 @@ void ReadNextReport(void)
        {
                /* Refreeze HID data IN pipe */
                Pipe_Freeze();
        {
                /* Refreeze HID data IN pipe */
                Pipe_Freeze();
-                       
+
                return;
        }
                return;
        }
-       
+
        /* Ensure pipe contains data before trying to read from it */
        if (Pipe_IsReadWriteAllowed())
        {
                uint8_t ReportINData[Pipe_BytesInPipe()];
 
                /* Read in HID report data */
        /* Ensure pipe contains data before trying to read from it */
        if (Pipe_IsReadWriteAllowed())
        {
                uint8_t ReportINData[Pipe_BytesInPipe()];
 
                /* Read in HID report data */
-               Pipe_Read_Stream_LE(&ReportINData, sizeof(ReportINData));
-       
+               Pipe_Read_Stream_LE(&ReportINData, sizeof(ReportINData), NULL);
+
                /* Print report data through the serial port */
                for (uint16_t CurrByte = 0; CurrByte < sizeof(ReportINData); CurrByte++)
                  printf_P(PSTR("0x%02X "), ReportINData[CurrByte]);
                /* Print report data through the serial port */
                for (uint16_t CurrByte = 0; CurrByte < sizeof(ReportINData); CurrByte++)
                  printf_P(PSTR("0x%02X "), ReportINData[CurrByte]);
-               
+
                puts_P(PSTR("\r\n"));
        }
                puts_P(PSTR("\r\n"));
        }
-               
+
        /* Clear the IN endpoint, ready for next data packet */
        Pipe_ClearIN();
        /* Clear the IN endpoint, ready for next data packet */
        Pipe_ClearIN();
-       
+
        /* Refreeze HID data IN pipe */
        Pipe_Freeze();
 }
        /* Refreeze HID data IN pipe */
        Pipe_Freeze();
 }
@@ -175,9 +211,12 @@ void WriteNextReport(uint8_t* ReportOUTData,
                      const uint8_t ReportType,
                      uint16_t ReportLength)
 {
                      const uint8_t ReportType,
                      uint16_t ReportLength)
 {
+       if (USB_HostState != HOST_STATE_Configured)
+         return;
+
        /* Select the HID data OUT pipe */
        Pipe_SelectPipe(HID_DATA_OUT_PIPE);
        /* Select the HID data OUT pipe */
        Pipe_SelectPipe(HID_DATA_OUT_PIPE);
-       
+
        /* Not all HID devices have an OUT endpoint (some require OUT reports to be sent over the
         * control endpoint instead) - check to see if the OUT endpoint has been initialized */
        if (Pipe_IsConfigured() && (ReportType == REPORT_TYPE_OUT))
        /* Not all HID devices have an OUT endpoint (some require OUT reports to be sent over the
         * control endpoint instead) - check to see if the OUT endpoint has been initialized */
        if (Pipe_IsConfigured() && (ReportType == REPORT_TYPE_OUT))
@@ -189,17 +228,17 @@ void WriteNextReport(uint8_t* ReportOUTData,
                {
                        /* Refreeze the data OUT pipe */
                        Pipe_Freeze();
                {
                        /* Refreeze the data OUT pipe */
                        Pipe_Freeze();
-                       
+
                        return;
                }
                        return;
                }
-               
+
                /* If the report index is used, send it before the report data */
                if (ReportIndex)
                /* If the report index is used, send it before the report data */
                if (ReportIndex)
-                 Pipe_Write_Byte(ReportIndex);
+                 Pipe_Write_8(ReportIndex);
 
                /* Write out HID report data */
 
                /* Write out HID report data */
-               Pipe_Write_Stream_LE(ReportOUTData, ReportLength);                              
-                       
+               Pipe_Write_Stream_LE(ReportOUTData, ReportLength, NULL);
+
                /* Clear the OUT endpoint, send last data packet */
                Pipe_ClearOUT();
 
                /* Clear the OUT endpoint, send last data packet */
                Pipe_ClearOUT();
 
@@ -212,7 +251,7 @@ void WriteNextReport(uint8_t* ReportOUTData,
                USB_ControlRequest = (USB_Request_Header_t)
                        {
                                .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
                USB_ControlRequest = (USB_Request_Header_t)
                        {
                                .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
-                               .bRequest      = REQ_SetReport,
+                               .bRequest      = HID_REQ_SetReport,
                                .wValue        = ((ReportType << 8) | ReportIndex),
                                .wIndex        = 0,
                                .wLength       = ReportLength,
                                .wValue        = ((ReportType << 8) | ReportIndex),
                                .wIndex        = 0,
                                .wLength       = ReportLength,
@@ -226,58 +265,3 @@ void WriteNextReport(uint8_t* ReportOUTData,
        }
 }
 
        }
 }
 
-/** Task to set the configuration of the attached device after it has been enumerated, and to read and process
- *  HID reports from the device and to send reports if desired.
- */
-void HID_Host_Task(void)
-{
-       uint8_t ErrorCode;
-
-       /* Switch to determine what user-application handled host state the host state machine is in */
-       switch (USB_HostState)
-       {
-               case HOST_STATE_Addressed:
-                       puts_P(PSTR("Getting Config Data.\r\n"));
-               
-                       /* Get and process the configuration descriptor data */
-                       if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
-                       {
-                               if (ErrorCode == ControlError)
-                                 puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
-                               else
-                                 puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
-
-                               printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
-                               
-                               /* Indicate error status */
-                               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-
-                               /* Wait until USB device disconnected */
-                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;
-                               break;
-                       }
-
-                       /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
-                       if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
-                       {
-                               printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"
-                                                        " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
-
-                               /* Indicate error status */
-                               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-                               
-                               /* Wait until USB device disconnected */
-                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;
-                               break;
-                       }
-                       
-                       puts_P(PSTR("HID Device Enumerated.\r\n"));
-
-                       USB_HostState = HOST_STATE_Configured;
-                       break;
-               case HOST_STATE_Configured:
-                       ReadNextReport();
-
-                       break;
-       }
-}