diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2009-09-09 08:34:24 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2009-09-09 08:34:24 +0000 |
commit | 524decdeb3a0a4c7adbeb4af906556e7bc6dd77c (patch) | |
tree | 3d3e83df9e11a61b2710d334c82609b0f3c89b4d /LUFA/Drivers/USB/Class/Host/HIDParser.c | |
parent | 331929833da3e48ac9c43dce90487490d7a77af1 (diff) | |
download | lufa-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.c | 55 |
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;
}
|