Update UC3 platform driver support to use the bitmasks defined in the header files...
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Device / HID.c
index 88bb609..3b0f87a 100644 (file)
@@ -1,21 +1,21 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
-              
+     Copyright (C) Dean Camera, 2011.
+
   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
-  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
-  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
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_DEVICE)
 
 #define  __INCLUDE_FROM_HID_DRIVER
+#define  __INCLUDE_FROM_HID_DEVICE_C
 #include "HID.h"
 
 void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
 {
        if (!(Endpoint_IsSETUPReceived()))
          return;
-         
+
        if (USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber)
          return;
 
        switch (USB_ControlRequest.bRequest)
        {
-               case REQ_GetReport:
+               case HID_REQ_GetReport:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
-                               Endpoint_ClearSETUP();  
+                               uint16_t ReportSize = 0;
+                               uint8_t  ReportID   = (USB_ControlRequest.wValue & 0xFF);
+                               uint8_t  ReportType = (USB_ControlRequest.wValue >> 8) - 1;
+                               uint8_t  ReportData[HIDInterfaceInfo->Config.PrevReportINBufferSize];
 
-                               uint16_t ReportINSize = 0;
-                               uint8_t  ReportID     = (USB_ControlRequest.wValue & 0xFF);
-                               uint8_t  ReportType   = (USB_ControlRequest.wValue >> 8) - 1;
-                               uint8_t  ReportINData[HIDInterfaceInfo->Config.PrevReportINBufferSize];
+                               memset(ReportData, 0, sizeof(ReportData));
 
-                               memset(ReportINData, 0, sizeof(ReportINData));
+                               CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, ReportType, ReportData, &ReportSize);
 
-                               CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, ReportType,
-                                                                   HIDInterfaceInfo->Config.PrevReportINBuffer, &ReportINSize);
-                               
                                if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)
-                                 memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, HIDInterfaceInfo->Config.PrevReportINBufferSize);
-
+                               {
+                                       memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportData,
+                                              HIDInterfaceInfo->Config.PrevReportINBufferSize);
+                               }
+                               
                                Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
-                               Endpoint_Write_Control_Stream_LE(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize);
+
+                               Endpoint_ClearSETUP();
+                               Endpoint_Write_Control_Stream_LE(ReportData, ReportSize);
                                Endpoint_ClearOUT();
                        }
-               
+
                        break;
-               case REQ_SetReport:
+               case HID_REQ_SetReport:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
+                               uint16_t ReportSize = USB_ControlRequest.wLength;
+                               uint8_t  ReportID   = (USB_ControlRequest.wValue & 0xFF);
+                               uint8_t  ReportType = (USB_ControlRequest.wValue >> 8) - 1;
+                               uint8_t  ReportData[ReportSize];
+
                                Endpoint_ClearSETUP();
+                               Endpoint_Read_Control_Stream_LE(ReportData, ReportSize);
+                               Endpoint_ClearIN();
                                
-                               uint16_t ReportOUTSize = USB_ControlRequest.wLength;
-                               uint8_t  ReportOUTData[ReportOUTSize];
-                               uint8_t  ReportID = (USB_ControlRequest.wValue & 0xFF);
-
-                               Endpoint_Read_Control_Stream_LE(ReportOUTData, ReportOUTSize);
-                               CALLBACK_HID_Device_ProcessHIDReport(HIDInterfaceInfo, ReportID, ReportOUTData, ReportOUTSize);
-                               Endpoint_ClearIN();                             
+                               CALLBACK_HID_Device_ProcessHIDReport(HIDInterfaceInfo, ReportID, ReportType,
+                                                                    &ReportData[ReportID ? 1 : 0], ReportSize - (ReportID ? 1 : 0));
                        }
-                       
+
                        break;
-               case REQ_GetProtocol:
+               case HID_REQ_GetProtocol:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
-
-                               Endpoint_Write_Byte(HIDInterfaceInfo->State.UsingReportProtocol);
+                               Endpoint_Write_8(HIDInterfaceInfo->State.UsingReportProtocol);
                                Endpoint_ClearIN();
-
                                Endpoint_ClearStatusStage();
                        }
-                       
+
                        break;
-               case REQ_SetProtocol:
+               case HID_REQ_SetProtocol:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
+                               Endpoint_ClearStatusStage();
 
                                HIDInterfaceInfo->State.UsingReportProtocol = ((USB_ControlRequest.wValue & 0xFF) != 0x00);
-                               
-                               Endpoint_ClearStatusStage();
                        }
-                       
+
                        break;
-               case REQ_SetIdle:
+               case HID_REQ_SetIdle:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
-                                       
-                               HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
-                                       
                                Endpoint_ClearStatusStage();
+
+                               HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
                        }
-                       
+
                        break;
-               case REQ_GetIdle:
+               case HID_REQ_GetIdle:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
-                       {               
+                       {
                                Endpoint_ClearSETUP();
-                               
-                               Endpoint_Write_Byte(HIDInterfaceInfo->State.IdleCount >> 2);
+                               Endpoint_Write_8(HIDInterfaceInfo->State.IdleCount >> 2);
                                Endpoint_ClearIN();
-
                                Endpoint_ClearStatusStage();
                        }
 
@@ -137,7 +137,7 @@ bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* const HIDInterfac
 {
        memset(&HIDInterfaceInfo->State, 0x00, sizeof(HIDInterfaceInfo->State));
        HIDInterfaceInfo->State.UsingReportProtocol = true;
-       HIDInterfaceInfo->State.IdleCount = 500;
+       HIDInterfaceInfo->State.IdleCount           = 500;
 
        if (!(Endpoint_ConfigureEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber, EP_TYPE_INTERRUPT,
                                                                         ENDPOINT_DIR_IN, HIDInterfaceInfo->Config.ReportINEndpointSize,
@@ -145,17 +145,17 @@ bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* const HIDInterfac
        {
                return false;
        }
-       
+
        return true;
 }
-               
+
 void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
 {
        if (USB_DeviceState != DEVICE_STATE_Configured)
          return;
 
        Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber);
-       
+
        if (Endpoint_IsReadWriteAllowed())
        {
                uint8_t  ReportINData[HIDInterfaceInfo->Config.PrevReportINBufferSize];
@@ -164,11 +164,11 @@ void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
 
                memset(ReportINData, 0, sizeof(ReportINData));
 
-               bool ForceSend         = CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, REPORT_ITEM_TYPE_In,
+               bool ForceSend         = CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, HID_REPORT_ITEM_In,
                                                                             ReportINData, &ReportINSize);
                bool StatesChanged     = false;
                bool IdlePeriodElapsed = (HIDInterfaceInfo->State.IdleCount && !(HIDInterfaceInfo->State.IdleMSRemaining));
-               
+
                if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)
                {
                        StatesChanged = (memcmp(ReportINData, HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize) != 0);
@@ -182,13 +182,14 @@ void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
                        Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber);
 
                        if (ReportID)
-                         Endpoint_Write_Byte(ReportID);
+                         Endpoint_Write_8(ReportID);
+
+                       Endpoint_Write_Stream_LE(ReportINData, ReportINSize, NULL);
 
-                       Endpoint_Write_Stream_LE(ReportINData, ReportINSize, NO_STREAM_CALLBACK);
-                       
                        Endpoint_ClearIN();
                }
        }
 }
 
 #endif
+