Mark build test makefiles as being incompatible with parallel make builds, as they...
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Common / HIDParser.c
index 7b13f1a..4447e8a 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2011.
+     Copyright (C) Dean Camera, 2012.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -61,17 +61,18 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
                switch (HIDReportItem & HID_RI_DATA_SIZE_MASK)
                {
                        case HID_RI_DATA_BITS_32:
                switch (HIDReportItem & HID_RI_DATA_SIZE_MASK)
                {
                        case HID_RI_DATA_BITS_32:
-                               ReportItemData  = *((uint32_t*)ReportData);
+                               ReportItemData  = (((uint32_t)ReportData[3] << 24) | ((uint32_t)ReportData[2] << 16) |
+                                              ((uint16_t)ReportData[1] << 8)  | ReportData[0]);
                                ReportSize     -= 4;
                                ReportData     += 4;
                                break;
                        case HID_RI_DATA_BITS_16:
                                ReportSize     -= 4;
                                ReportData     += 4;
                                break;
                        case HID_RI_DATA_BITS_16:
-                               ReportItemData  = *((uint16_t*)ReportData);
+                               ReportItemData  = (((uint16_t)ReportData[1] << 8) | (ReportData[0]));
                                ReportSize     -= 2;
                                ReportData     += 2;
                                break;
                        case HID_RI_DATA_BITS_8:
                                ReportSize     -= 2;
                                ReportData     += 2;
                                break;
                        case HID_RI_DATA_BITS_8:
-                               ReportItemData  = *((uint8_t*)ReportData);
+                               ReportItemData  = ReportData[0];
                                ReportSize     -= 1;
                                ReportData     += 1;
                                break;
                                ReportSize     -= 1;
                                ReportData     += 1;
                                break;
@@ -96,6 +97,9 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
                                CurrStateTable--;
                                break;
                        case HID_RI_USAGE_PAGE(0):
                                CurrStateTable--;
                                break;
                        case HID_RI_USAGE_PAGE(0):
+                               if ((HIDReportItem & HID_RI_DATA_SIZE_MASK) == HID_RI_DATA_BITS_32)
+                                 CurrStateTable->Attributes.Usage.Page = (ReportItemData >> 16);
+
                                CurrStateTable->Attributes.Usage.Page       = ReportItemData;
                                break;
                        case HID_RI_LOGICAL_MINIMUM(0):
                                CurrStateTable->Attributes.Usage.Page       = ReportItemData;
                                break;
                        case HID_RI_LOGICAL_MINIMUM(0):
@@ -186,7 +190,7 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
                                        CurrCollectionPath->Parent = ParentCollectionPath;
                                }
 
                                        CurrCollectionPath->Parent = ParentCollectionPath;
                                }
 
-                               CurrCollectionPath->Type = ReportItemData;
+                               CurrCollectionPath->Type       = ReportItemData;
                                CurrCollectionPath->Usage.Page = CurrStateTable->Attributes.Usage.Page;
 
                                if (UsageListSize)
                                CurrCollectionPath->Usage.Page = CurrStateTable->Attributes.Usage.Page;
 
                                if (UsageListSize)
@@ -252,19 +256,16 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
 
                                        CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType] += CurrStateTable->Attributes.BitSize;
 
 
                                        CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType] += CurrStateTable->Attributes.BitSize;
 
-                                       if (ParserData->LargestReportSizeBits < NewReportItem.BitOffset)
-                                         ParserData->LargestReportSizeBits = NewReportItem.BitOffset;
+                                       ParserData->LargestReportSizeBits = MAX(ParserData->LargestReportSizeBits, CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType]);
 
 
-                                       if (!(ReportItemData & HID_IOF_CONSTANT) && CALLBACK_HIDParser_FilterHIDReportItem(&NewReportItem))
-                                       {
-                                               if (ParserData->TotalReportItems == HID_MAX_REPORTITEMS)
-                                                 return HID_PARSE_InsufficientReportItems;
+                                       if (ParserData->TotalReportItems == HID_MAX_REPORTITEMS)
+                                         return HID_PARSE_InsufficientReportItems;
 
 
-                                               memcpy(&ParserData->ReportItems[ParserData->TotalReportItems],
-                                                      &NewReportItem, sizeof(HID_ReportItem_t));
+                                       memcpy(&ParserData->ReportItems[ParserData->TotalReportItems],
+                                              &NewReportItem, sizeof(HID_ReportItem_t));
 
 
-                                               ParserData->TotalReportItems++;
-                                       }
+                                       if (!(ReportItemData & HID_IOF_CONSTANT) && CALLBACK_HIDParser_FilterHIDReportItem(&NewReportItem))
+                                         ParserData->TotalReportItems++;
                                }
 
                                break;
                                }
 
                                break;
@@ -287,6 +288,9 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
 bool USB_GetHIDReportItemInfo(const uint8_t* ReportData,
                               HID_ReportItem_t* const ReportItem)
 {
 bool USB_GetHIDReportItemInfo(const uint8_t* ReportData,
                               HID_ReportItem_t* const ReportItem)
 {
+       if (ReportItem == NULL)
+         return false;
+
        uint16_t DataBitsRem  = ReportItem->Attributes.BitSize;
        uint16_t CurrentBit   = ReportItem->BitOffset;
        uint32_t BitMask      = (1 << 0);
        uint16_t DataBitsRem  = ReportItem->Attributes.BitSize;
        uint16_t CurrentBit   = ReportItem->BitOffset;
        uint32_t BitMask      = (1 << 0);
@@ -317,6 +321,9 @@ bool USB_GetHIDReportItemInfo(const uint8_t* ReportData,
 void USB_SetHIDReportItemInfo(uint8_t* ReportData,
                               HID_ReportItem_t* const ReportItem)
 {
 void USB_SetHIDReportItemInfo(uint8_t* ReportData,
                               HID_ReportItem_t* const ReportItem)
 {
+       if (ReportItem == NULL)
+         return;
+
        uint16_t DataBitsRem  = ReportItem->Attributes.BitSize;
        uint16_t CurrentBit   = ReportItem->BitOffset;
        uint32_t BitMask      = (1 << 0);
        uint16_t DataBitsRem  = ReportItem->Attributes.BitSize;
        uint16_t CurrentBit   = ReportItem->BitOffset;
        uint32_t BitMask      = (1 << 0);
@@ -348,8 +355,9 @@ uint16_t USB_GetHIDReportSize(HID_ReportInfo_t* const ParserData,
                uint16_t ReportSizeBits = ParserData->ReportIDSizes[i].ReportSizeBits[ReportType];
 
                if (ParserData->ReportIDSizes[i].ReportID == ReportID)
                uint16_t ReportSizeBits = ParserData->ReportIDSizes[i].ReportSizeBits[ReportType];
 
                if (ParserData->ReportIDSizes[i].ReportID == ReportID)
-                 return ((ReportSizeBits >> 3) + ((ReportSizeBits & 0x07) ? 1 : 0));
+                 return (ReportSizeBits / 8) + ((ReportSizeBits % 8) ? 1 : 0);
        }
 
        return 0;
 }
        }
 
        return 0;
 }
+