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 5111eba..3b0f87a 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
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_DEVICE)
 
 #define  __INCLUDE_FROM_HID_DRIVER
 #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;
 #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;
 
        if (USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber)
          return;
 
@@ -56,17 +58,20 @@ void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInter
                                memset(ReportData, 0, sizeof(ReportData));
 
                                CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, ReportType, ReportData, &ReportSize);
                                memset(ReportData, 0, sizeof(ReportData));
 
                                CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, ReportType, ReportData, &ReportSize);
-                               
-                               if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)
-                                 memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportData, HIDInterfaceInfo->Config.PrevReportINBufferSize);
 
 
+                               if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)
+                               {
+                                       memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportData,
+                                              HIDInterfaceInfo->Config.PrevReportINBufferSize);
+                               }
+                               
                                Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
 
                                Endpoint_ClearSETUP();
                                Endpoint_Write_Control_Stream_LE(ReportData, ReportSize);
                                Endpoint_ClearOUT();
                        }
                                Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
 
                                Endpoint_ClearSETUP();
                                Endpoint_Write_Control_Stream_LE(ReportData, ReportSize);
                                Endpoint_ClearOUT();
                        }
-               
+
                        break;
                case HID_REQ_SetReport:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        break;
                case HID_REQ_SetReport:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
@@ -79,20 +84,21 @@ void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInter
                                Endpoint_ClearSETUP();
                                Endpoint_Read_Control_Stream_LE(ReportData, ReportSize);
                                Endpoint_ClearIN();
                                Endpoint_ClearSETUP();
                                Endpoint_Read_Control_Stream_LE(ReportData, ReportSize);
                                Endpoint_ClearIN();
-
-                               CALLBACK_HID_Device_ProcessHIDReport(HIDInterfaceInfo, ReportID, ReportType, ReportData, ReportSize);
+                               
+                               CALLBACK_HID_Device_ProcessHIDReport(HIDInterfaceInfo, ReportID, ReportType,
+                                                                    &ReportData[ReportID ? 1 : 0], ReportSize - (ReportID ? 1 : 0));
                        }
                        }
-                       
+
                        break;
                case HID_REQ_GetProtocol:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
                        break;
                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();
                        }
                                Endpoint_ClearIN();
                                Endpoint_ClearStatusStage();
                        }
-                       
+
                        break;
                case HID_REQ_SetProtocol:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        break;
                case HID_REQ_SetProtocol:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
@@ -100,9 +106,9 @@ void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInter
                                Endpoint_ClearSETUP();
                                Endpoint_ClearStatusStage();
 
                                Endpoint_ClearSETUP();
                                Endpoint_ClearStatusStage();
 
-                               HIDInterfaceInfo->State.UsingReportProtocol = ((USB_ControlRequest.wValue & 0xFF) != 0x00);                             
+                               HIDInterfaceInfo->State.UsingReportProtocol = ((USB_ControlRequest.wValue & 0xFF) != 0x00);
                        }
                        }
-                       
+
                        break;
                case HID_REQ_SetIdle:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        break;
                case HID_REQ_SetIdle:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
@@ -112,13 +118,13 @@ void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInter
 
                                HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
                        }
 
                                HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
                        }
-                       
+
                        break;
                case HID_REQ_GetIdle:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
                        break;
                case HID_REQ_GetIdle:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
-                       {               
+                       {
                                Endpoint_ClearSETUP();
                                Endpoint_ClearSETUP();
-                               Endpoint_Write_Byte(HIDInterfaceInfo->State.IdleCount >> 2);
+                               Endpoint_Write_8(HIDInterfaceInfo->State.IdleCount >> 2);
                                Endpoint_ClearIN();
                                Endpoint_ClearStatusStage();
                        }
                                Endpoint_ClearIN();
                                Endpoint_ClearStatusStage();
                        }
@@ -131,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;
 {
        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,
 
        if (!(Endpoint_ConfigureEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber, EP_TYPE_INTERRUPT,
                                                                         ENDPOINT_DIR_IN, HIDInterfaceInfo->Config.ReportINEndpointSize,
@@ -139,17 +145,17 @@ bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* const HIDInterfac
        {
                return false;
        }
        {
                return false;
        }
-       
+
        return true;
 }
        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);
 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];
        if (Endpoint_IsReadWriteAllowed())
        {
                uint8_t  ReportINData[HIDInterfaceInfo->Config.PrevReportINBufferSize];
@@ -162,7 +168,7 @@ void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
                                                                             ReportINData, &ReportINSize);
                bool StatesChanged     = false;
                bool IdlePeriodElapsed = (HIDInterfaceInfo->State.IdleCount && !(HIDInterfaceInfo->State.IdleMSRemaining));
                                                                             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);
                if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)
                {
                        StatesChanged = (memcmp(ReportINData, HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize) != 0);
@@ -176,13 +182,14 @@ void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
                        Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber);
 
                        if (ReportID)
                        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
                        Endpoint_ClearIN();
                }
        }
 }
 
 #endif
+