projects
/
pub
/
USBasp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Added V2Protocol handlers to the AVRISP project to enter/exit programming mode, and...
[pub/USBasp.git]
/
LUFA
/
Drivers
/
USB
/
Class
/
Host
/
HIDParser.c
diff --git
a/LUFA/Drivers/USB/Class/Host/HIDParser.c
b/LUFA/Drivers/USB/Class/Host/HIDParser.c
index
cee602a
..
fdce8e5
100644
(file)
--- a/
LUFA/Drivers/USB/Class/Host/HIDParser.c
+++ b/
LUFA/Drivers/USB/Class/Host/HIDParser.c
@@
-36,43
+36,52
@@
uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID_ReportInfo_t* const ParserData)
\r
{
\r
HID_StateTable_t StateTable[HID_STATETABLE_STACK_DEPTH];
\r
uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID_ReportInfo_t* const ParserData)
\r
{
\r
HID_StateTable_t StateTable[HID_STATETABLE_STACK_DEPTH];
\r
- HID_StateTable_t* CurrStateTable
= &StateTable[0];
\r
+ HID_StateTable_t* CurrStateTable = &StateTable[0];
\r
uint16_t UsageStack[HID_USAGE_STACK_DEPTH];
\r
uint16_t UsageStack[HID_USAGE_STACK_DEPTH];
\r
- uint8_t UsageStackSize
= 0;
\r
- uint16_t BitOffsetIn
= 0;
\r
- uint16_t BitOffsetOut
= 0;
\r
+ uint8_t UsageStackSize = 0;
\r
+ uint16_t BitOffsetIn = 0;
\r
+ uint16_t BitOffsetOut = 0;
\r
#if defined(HID_ENABLE_FEATURE_PROCESSING)
\r
#if defined(HID_ENABLE_FEATURE_PROCESSING)
\r
- uint16_t BitOffsetFeature
= 0;
\r
+ uint16_t BitOffsetFeature = 0;
\r
#endif
\r
#endif
\r
- HID_CollectionPath_t* CurrCollectionPath
= NULL;
\r
+ HID_CollectionPath_t* CurrCollectionPath = NULL;
\r
\r
\r
- memset(
(void*)
ParserData, 0x00, sizeof(HID_ReportInfo_t));
\r
- memset(
(void*)
StateTable, 0x00, sizeof(StateTable));
\r
+ memset(ParserData, 0x00, sizeof(HID_ReportInfo_t));
\r
+ memset(StateTable, 0x00, sizeof(StateTable));
\r
\r
while (ReportSize)
\r
{
\r
\r
while (ReportSize)
\r
{
\r
+ uint8_t HIDReportItem = *(ReportData++);
\r
uint32_t ReportItemData = 0;
\r
\r
uint32_t ReportItemData = 0;
\r
\r
- switch (*ReportData & DATA_SIZE_MASK)
\r
+ ReportSize--;
\r
+
\r
+ switch (HIDReportItem & DATA_SIZE_MASK)
\r
{
\r
case DATA_SIZE_4:
\r
{
\r
case DATA_SIZE_4:
\r
- ReportItemData = *((uint32_t*)(ReportData + 1));
\r
+ ReportItemData = *((uint32_t*)ReportData);
\r
+ ReportSize -= 4;
\r
+ ReportData += 4;
\r
break;
\r
case DATA_SIZE_2:
\r
break;
\r
case DATA_SIZE_2:
\r
- ReportItemData = *((uint16_t*)(ReportData + 1));
\r
+ ReportItemData = *((uint16_t*)ReportData);
\r
+ ReportSize -= 2;
\r
+ ReportData += 2;
\r
break;
\r
case DATA_SIZE_1:
\r
break;
\r
case DATA_SIZE_1:
\r
- ReportItemData = *((uint8_t*)(ReportData + 1));
\r
+ ReportItemData = *((uint8_t*)ReportData);
\r
+ ReportSize -= 1;
\r
+ ReportData += 1;
\r
break;
\r
}
\r
\r
break;
\r
}
\r
\r
- switch (
*ReportData
& (TYPE_MASK | TAG_MASK))
\r
+ switch (
HIDReportItem
& (TYPE_MASK | TAG_MASK))
\r
{
\r
case (TYPE_GLOBAL | TAG_GLOBAL_PUSH):
\r
{
\r
case (TYPE_GLOBAL | TAG_GLOBAL_PUSH):
\r
- if (CurrStateTable == &StateTable[HID_STATETABLE_STACK_DEPTH])
\r
+ if (CurrStateTable == &StateTable[HID_STATETABLE_STACK_DEPTH
- 1
])
\r
return HID_PARSE_HIDStackOverflow;
\r
\r
return HID_PARSE_HIDStackOverflow;
\r
\r
- memcpy((CurrStateTable
-
1),
\r
+ memcpy((CurrStateTable
+
1),
\r
CurrStateTable,
\r
sizeof(HID_ReportItem_t));
\r
\r
CurrStateTable,
\r
sizeof(HID_ReportItem_t));
\r
\r
@@
-113,8
+122,13
@@
uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
break;
\r
case (TYPE_GLOBAL | TAG_GLOBAL_REPORTID):
\r
CurrStateTable->ReportID = ReportItemData;
\r
break;
\r
case (TYPE_GLOBAL | TAG_GLOBAL_REPORTID):
\r
CurrStateTable->ReportID = ReportItemData;
\r
- BitOffsetIn = 0;
\r
- BitOffsetOut = 0;
\r
+ ParserData->UsingMultipleReports = true;
\r
+ BitOffsetIn = 0;
\r
+ BitOffsetOut = 0;
\r
+
\r
+ #if defined(HID_ENABLE_FEATURE_PROCESSING)
\r
+ BitOffsetFeature = 0;
\r
+ #endif
\r
break;
\r
case (TYPE_LOCAL | TAG_LOCAL_USAGE):
\r
if (UsageStackSize == HID_USAGE_STACK_DEPTH)
\r
break;
\r
case (TYPE_LOCAL | TAG_LOCAL_USAGE):
\r
if (UsageStackSize == HID_USAGE_STACK_DEPTH)
\r
@@
-141,7
+155,7
@@
uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
\r
while (CurrCollectionPath->Parent != NULL);
\r
{
\r
\r
while (CurrCollectionPath->Parent != NULL);
\r
{
\r
- if (CurrCollectionPath == &ParserData->CollectionPaths[HID_MAX_COLLECTIONS])
\r
+ if (CurrCollectionPath == &ParserData->CollectionPaths[HID_MAX_COLLECTIONS
- 1
])
\r
return HID_PARSE_InsufficientCollectionPaths;
\r
\r
CurrCollectionPath++;
\r
return HID_PARSE_InsufficientCollectionPaths;
\r
\r
CurrCollectionPath++;
\r
@@
-209,7
+223,7
@@
uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
CurrReportItem->Attributes.Usage.Usage = 0;
\r
}
\r
\r
CurrReportItem->Attributes.Usage.Usage = 0;
\r
}
\r
\r
- switch (
*ReportData
& TAG_MASK)
\r
+ switch (
HIDReportItem
& TAG_MASK)
\r
{
\r
case TAG_MAIN_INPUT:
\r
CurrReportItem->ItemType = REPORT_ITEM_TYPE_In;
\r
{
\r
case TAG_MAIN_INPUT:
\r
CurrReportItem->ItemType = REPORT_ITEM_TYPE_In;
\r
@@
-236,11
+250,11
@@
uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
#endif
\r
}
\r
\r
#endif
\r
}
\r
\r
-#if !defined(HID_INCLUDE_CONSTANT_DATA_ITEMS)
\r
+#if defined(HID_INCLUDE_CONSTANT_DATA_ITEMS)
\r
+ ParserData->TotalReportItems++;
\r
+#else
\r
if (!(ReportItemData & IOF_CONSTANT))
\r
ParserData->TotalReportItems++;
\r
if (!(ReportItemData & IOF_CONSTANT))
\r
ParserData->TotalReportItems++;
\r
-#else
\r
- ParserData->TotalReportItems++;
\r
#endif
\r
}
\r
\r
#endif
\r
}
\r
\r
@@
-249,32
+263,12
@@
uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
break;
\r
}
\r
\r
break;
\r
}
\r
\r
- if ((
*ReportData
& TYPE_MASK) == TYPE_MAIN)
\r
+ if ((
HIDReportItem
& TYPE_MASK) == TYPE_MAIN)
\r
{
\r
CurrStateTable->Attributes.Usage.MinMax.Minimum = 0;
\r
CurrStateTable->Attributes.Usage.MinMax.Maximum = 0;
\r
UsageStackSize = 0;
\r
}
\r
{
\r
CurrStateTable->Attributes.Usage.MinMax.Minimum = 0;
\r
CurrStateTable->Attributes.Usage.MinMax.Maximum = 0;
\r
UsageStackSize = 0;
\r
}
\r
-
\r
- switch (*ReportData & DATA_SIZE_MASK)
\r
- {
\r
- case DATA_SIZE_4:
\r
- ReportSize -= 5;
\r
- ReportData += 5;
\r
- break;
\r
- case DATA_SIZE_2:
\r
- ReportSize -= 3;
\r
- ReportData += 3;
\r
- break;
\r
- case DATA_SIZE_1:
\r
- ReportSize -= 2;
\r
- ReportData += 2;
\r
- break;
\r
- case DATA_SIZE_0:
\r
- ReportSize -= 1;
\r
- ReportData += 1;
\r
- break;
\r
- }
\r
}
\r
\r
return HID_PARSE_Successful;
\r
}
\r
\r
return HID_PARSE_Successful;
\r