aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA/Drivers/USB/Class/Host/HIDParser.c
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2009-09-09 08:34:24 +0000
committerDean Camera <dean@fourwalledcubicle.com>2009-09-09 08:34:24 +0000
commit524decdeb3a0a4c7adbeb4af906556e7bc6dd77c (patch)
tree3d3e83df9e11a61b2710d334c82609b0f3c89b4d /LUFA/Drivers/USB/Class/Host/HIDParser.c
parent331929833da3e48ac9c43dce90487490d7a77af1 (diff)
downloadlufa-524decdeb3a0a4c7adbeb4af906556e7bc6dd77c.tar.gz
lufa-524decdeb3a0a4c7adbeb4af906556e7bc6dd77c.tar.bz2
lufa-524decdeb3a0a4c7adbeb4af906556e7bc6dd77c.zip
Change HID report parser so that it can calculate and record the sizes (IN, OUT and FEATURE) of each report within the device, by report ID. This will be required in host mode, so that the host can determine how many bytes of data must be read in for each report.
Add to MouseHostWithParser and KeyboardHostWithParser demos to print out the report sizes when a valid device is connected.
Diffstat (limited to 'LUFA/Drivers/USB/Class/Host/HIDParser.c')
-rw-r--r--LUFA/Drivers/USB/Class/Host/HIDParser.c55
1 files changed, 39 insertions, 16 deletions
diff --git a/LUFA/Drivers/USB/Class/Host/HIDParser.c b/LUFA/Drivers/USB/Class/Host/HIDParser.c
index 5174b59f9..4293a3d98 100644
--- a/LUFA/Drivers/USB/Class/Host/HIDParser.c
+++ b/LUFA/Drivers/USB/Class/Host/HIDParser.c
@@ -38,19 +38,19 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
HID_StateTable_t StateTable[HID_STATETABLE_STACK_DEPTH];
HID_StateTable_t* CurrStateTable = &StateTable[0];
HID_CollectionPath_t* CurrCollectionPath = NULL;
+ HID_ReportSizeInfo_t* CurrReportIDInfo = &ParserData->ReportIDSizes[0];
uint16_t UsageStack[HID_USAGE_STACK_DEPTH];
uint8_t UsageStackSize = 0;
- uint16_t BitOffsetIn = 0;
- uint16_t BitOffsetOut = 0;
- uint16_t BitOffsetFeature = 0;
- ParserData->TotalReportItems = 0;
- ParserData->UsingMultipleReports = false;
+ ParserData->TotalReportItems = 0;
+ ParserData->TotalDeviceReports = 1;
+ ParserData->UsingReportIDs = false;
for (uint8_t CurrCollection = 0; CurrCollection < HID_MAX_COLLECTIONS; CurrCollection++)
ParserData->CollectionPaths[CurrCollection].Parent = NULL;
- memset(&StateTable[0], 0x00, sizeof(HID_StateTable_t));
+ memset(CurrStateTable, 0x00, sizeof(HID_StateTable_t));
+ memset(CurrReportIDInfo, 0x00, sizeof(HID_ReportSizeInfo_t));
while (ReportSize)
{
@@ -126,10 +126,33 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
break;
case (TYPE_GLOBAL | TAG_GLOBAL_REPORTID):
CurrStateTable->ReportID = ReportItemData;
- ParserData->UsingMultipleReports = true;
- BitOffsetIn = 0;
- BitOffsetOut = 0;
- BitOffsetFeature = 0;
+
+ if (ParserData->UsingReportIDs)
+ {
+ CurrReportIDInfo = NULL;
+
+ for (uint8_t i = 0; i < ParserData->TotalDeviceReports; i++)
+ {
+ if (ParserData->ReportIDSizes[i].ReportID == CurrStateTable->ReportID)
+ {
+ CurrReportIDInfo = &ParserData->ReportIDSizes[i];
+ break;
+ }
+ }
+
+ if (CurrReportIDInfo == NULL)
+ {
+ if (ParserData->TotalDeviceReports++ > HID_MAX_REPORT_IDS)
+ return HID_PARSE_InsufficientReportIDItems;
+
+ CurrReportIDInfo = &ParserData->ReportIDSizes[ParserData->TotalDeviceReports - 1];
+ memset(CurrReportIDInfo, 0x00, sizeof(HID_ReportSizeInfo_t));
+ }
+ }
+
+ ParserData->UsingReportIDs = true;
+
+ CurrReportIDInfo->ReportID = CurrStateTable->ReportID;
break;
case (TYPE_LOCAL | TAG_LOCAL_USAGE):
if (UsageStackSize == HID_USAGE_STACK_DEPTH)
@@ -223,21 +246,21 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
{
case TAG_MAIN_INPUT:
NewReportItem.ItemType = REPORT_ITEM_TYPE_In;
- NewReportItem.BitOffset = BitOffsetIn;
+ NewReportItem.BitOffset = CurrReportIDInfo->BitsIn;
- BitOffsetIn += CurrStateTable->Attributes.BitSize;
+ CurrReportIDInfo->BitsIn += CurrStateTable->Attributes.BitSize;
break;
case TAG_MAIN_OUTPUT:
NewReportItem.ItemType = REPORT_ITEM_TYPE_Out;
- NewReportItem.BitOffset = BitOffsetOut;
+ NewReportItem.BitOffset = CurrReportIDInfo->BitsOut;
- BitOffsetOut += CurrStateTable->Attributes.BitSize;
+ CurrReportIDInfo->BitsOut += CurrStateTable->Attributes.BitSize;
break;
case TAG_MAIN_FEATURE:
NewReportItem.ItemType = REPORT_ITEM_TYPE_Feature;
- NewReportItem.BitOffset = BitOffsetFeature;
+ NewReportItem.BitOffset = CurrReportIDInfo->BitsFeature;
- BitOffsetFeature += CurrStateTable->Attributes.BitSize;
+ CurrReportIDInfo->BitsFeature += CurrStateTable->Attributes.BitSize;
break;
}