Mark build test makefiles as being incompatible with parallel make builds, as they...
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Common / HIDParser.c
index 20fceab..4447e8a 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2011.
+     Copyright (C) Dean Camera, 2012.
 
   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
@@ -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:
-                               ReportItemData  = le32_to_cpu(*((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:
-                               ReportItemData  = le16_to_cpu(*((uint16_t*)ReportData));
+                               ReportItemData  = (((uint16_t)ReportData[1] << 8) | (ReportData[0]));
                                ReportSize     -= 2;
                                ReportData     += 2;
                                break;
                        case HID_RI_DATA_BITS_8:
-                               ReportItemData  = *((uint8_t*)ReportData);
+                               ReportItemData  = ReportData[0];
                                ReportSize     -= 1;
                                ReportData     += 1;
                                break;
@@ -98,7 +99,7 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
                        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):
@@ -189,7 +190,7 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
                                        CurrCollectionPath->Parent = ParentCollectionPath;
                                }
 
-                               CurrCollectionPath->Type = ReportItemData;
+                               CurrCollectionPath->Type       = ReportItemData;
                                CurrCollectionPath->Usage.Page = CurrStateTable->Attributes.Usage.Page;
 
                                if (UsageListSize)
@@ -255,19 +256,16 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
 
                                        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;
@@ -290,6 +288,9 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
 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);
@@ -320,6 +321,9 @@ bool USB_GetHIDReportItemInfo(const uint8_t* ReportData,
 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);
@@ -351,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)
-                 return ((ReportSizeBits >> 3) + ((ReportSizeBits & 0x07) ? 1 : 0));
+                 return (ReportSizeBits / 8) + ((ReportSizeBits % 8) ? 1 : 0);
        }
 
        return 0;
 }
+