aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2009-08-11 11:19:22 +0000
committerDean Camera <dean@fourwalledcubicle.com>2009-08-11 11:19:22 +0000
commitdf29aa37c05ff0251bd17f54c750bac56d7279b7 (patch)
tree257159f76c4d94e65771bb86abcbde6538e3c03c /LUFA
parenta7ade9f28dac6b42e2a85823ec80d5539c176667 (diff)
downloadlufa-df29aa37c05ff0251bd17f54c750bac56d7279b7.tar.gz
lufa-df29aa37c05ff0251bd17f54c750bac56d7279b7.tar.bz2
lufa-df29aa37c05ff0251bd17f54c750bac56d7279b7.zip
Added flag to the HID report parser to indicate if a device has multiple reports.
SetIdle requests to the HID device driver with a 0 idle period (send changes only) now only affect the requested HID interface within the device, not all HID interfaces. Apply correct fix to the HID report parser for PUSH items - current HID item attribute stack was being copied in the wrong direction. Fixed HID report parser not resetting the FEATURE item count when a REPORT ID item is encountered.
Diffstat (limited to 'LUFA')
-rw-r--r--LUFA/Drivers/USB/Class/Device/HID.c17
-rw-r--r--LUFA/Drivers/USB/Class/Host/HIDParser.c13
-rw-r--r--LUFA/Drivers/USB/Class/Host/HIDParser.h18
-rw-r--r--LUFA/ManPages/ChangeLog.txt4
-rw-r--r--LUFA/ManPages/FutureChanges.txt3
5 files changed, 31 insertions, 24 deletions
diff --git a/LUFA/Drivers/USB/Class/Device/HID.c b/LUFA/Drivers/USB/Class/Device/HID.c
index 937214b94..0cbd50afc 100644
--- a/LUFA/Drivers/USB/Class/Device/HID.c
+++ b/LUFA/Drivers/USB/Class/Device/HID.c
@@ -38,11 +38,8 @@ void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInter
if (!(Endpoint_IsSETUPReceived()))
return;
- if ((USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber) &&
- (USB_ControlRequest.bRequest != REQ_SetIdle))
- {
- return;
- }
+ if (USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber)
+ return;
switch (USB_ControlRequest.bRequest)
{
@@ -106,15 +103,11 @@ void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInter
case REQ_SetIdle:
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
{
- if ((USB_ControlRequest.wIndex == HIDInterfaceInfo->Config.InterfaceNumber) ||
- (USB_ControlRequest.wValue & 0xFF) == 0)
- {
- Endpoint_ClearSETUP();
+ Endpoint_ClearSETUP();
- HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
+ HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
- Endpoint_ClearStatusStage();
- }
+ Endpoint_ClearStatusStage();
}
break;
diff --git a/LUFA/Drivers/USB/Class/Host/HIDParser.c b/LUFA/Drivers/USB/Class/Host/HIDParser.c
index 7ec003f27..fdce8e577 100644
--- a/LUFA/Drivers/USB/Class/Host/HIDParser.c
+++ b/LUFA/Drivers/USB/Class/Host/HIDParser.c
@@ -81,8 +81,8 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
if (CurrStateTable == &StateTable[HID_STATETABLE_STACK_DEPTH - 1])
return HID_PARSE_HIDStackOverflow;
- memcpy(CurrStateTable,
- (CurrStateTable + 1),
+ memcpy((CurrStateTable + 1),
+ CurrStateTable,
sizeof(HID_ReportItem_t));
CurrStateTable++;
@@ -122,8 +122,13 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
break;
case (TYPE_GLOBAL | TAG_GLOBAL_REPORTID):
CurrStateTable->ReportID = ReportItemData;
- BitOffsetIn = 0;
- BitOffsetOut = 0;
+ ParserData->UsingMultipleReports = true;
+ BitOffsetIn = 0;
+ BitOffsetOut = 0;
+
+ #if defined(HID_ENABLE_FEATURE_PROCESSING)
+ BitOffsetFeature = 0;
+ #endif
break;
case (TYPE_LOCAL | TAG_LOCAL_USAGE):
if (UsageStackSize == HID_USAGE_STACK_DEPTH)
diff --git a/LUFA/Drivers/USB/Class/Host/HIDParser.h b/LUFA/Drivers/USB/Class/Host/HIDParser.h
index a9fff3ea2..942fe1177 100644
--- a/LUFA/Drivers/USB/Class/Host/HIDParser.h
+++ b/LUFA/Drivers/USB/Class/Host/HIDParser.h
@@ -201,13 +201,17 @@
typedef struct
{
uint8_t TotalReportItems; /**< Total number of report items stored in the
- * ReportItems array. */
-
+ * ReportItems array.
+ */
HID_ReportItem_t ReportItems[HID_MAX_REPORTITEMS]; /**< Report items array, including
- * all IN, OUT and FEATURE items. */
-
+ * all IN, OUT and FEATURE items.
+ */
HID_CollectionPath_t CollectionPaths[HID_MAX_COLLECTIONS]; /**< All collection items, referenced
- * by the report items. */
+ * by the report items.
+ */
+ bool UsingMultipleReports; /**< Indicates if the device has at least one REPORT ID
+ * element in its HID report descriptor.
+ */
} HID_ReportInfo_t;
/* Function Prototypes: */
@@ -239,9 +243,9 @@
* buffer. The report buffer is assumed to have the appropriate bits cleared before calling
* this function (i.e., the buffer should be explicitly cleared before report values are added).
*
- * If the device has multiple HID reports, the report ID is set to the report ID of the given item.
+ * If the device has multiple HID reports, the first byte in the report is set to the report ID of the given item.
*
- * \param[out] ReportData Buffer holding the current OUT report data
+ * \param[out] ReportData Buffer holding the current OUT or FEATURE report data
* \param[in] ReportItem Pointer to the report item of interest in a \ref HID_ReportInfo_t ReportItem array
*/
void USB_SetHIDReportItemInfo(uint8_t* ReportData, const HID_ReportItem_t* ReportItem)
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index a6ed06c89..059734f2f 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -10,14 +10,18 @@
*
* <b>New:</b>
* - Added new host class drivers and matching demos to the library for rapid application development
+ * - Added flag to the HID report parser to indicate if a device has multiple reports
*
* <b>Changed:</b>
+ * - SetIdle requests to the HID device driver with a 0 idle period (send changes only) now only affect the requested
+ * HID interface within the device, not all HID interfaces.
*
* <b>Fixed:</b>
* - Fixed possible lockup in the CDC device class driver, when the host sends data that is a multiple of the
* endpoint's bank
* - Fixed swapped paremeters in the HID state memory copy call while processing a HID PUSH item in the HID report parser
* - Fixed memory corruption HID report parser when too many COLLECTION or PUSH items were processed
+ * - Fixed HID report parser not resetting the FEATURE item count when a REPORT ID item is encountered
*
*
* \section Sec_ChangeLog090810 Version 090810
diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt
index e69103e8e..319e95de5 100644
--- a/LUFA/ManPages/FutureChanges.txt
+++ b/LUFA/ManPages/FutureChanges.txt
@@ -18,6 +18,8 @@
* -# Convert Host mode demos to class drivers
* -# Re-enable Host mode Class driver builds after completion
* -# Update Host mode Class Driver demo .txt files
+ * - Add overviews of each of the officially supported boards to the manual
+ * - Add hub support to match Atmel's stack
*
* <b>Targeted for Future Releases:</b>
* - Add standardized descriptor names to device and host class driver structures
@@ -26,7 +28,6 @@
* - Master LUFA include file rather than per-module includes
* - Add multiple-report HID demo to the library
* - Add dual role Mouse Host/Keyboard Device demo to the library
- * - Add hub support to match Atmel's stack
* - Change makefiles to allow for absolute LUFA location to be used
* - Port LUFA to other architectures
* -# AVR32 UC3B series microcontrollers