From df29aa37c05ff0251bd17f54c750bac56d7279b7 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 11 Aug 2009 11:19:22 +0000 Subject: 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. --- LUFA/Drivers/USB/Class/Device/HID.c | 17 +++++------------ LUFA/Drivers/USB/Class/Host/HIDParser.c | 13 +++++++++---- LUFA/Drivers/USB/Class/Host/HIDParser.h | 18 +++++++++++------- LUFA/ManPages/ChangeLog.txt | 4 ++++ LUFA/ManPages/FutureChanges.txt | 3 ++- 5 files changed, 31 insertions(+), 24 deletions(-) (limited to 'LUFA') 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 @@ * * New: * - 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 * * Changed: + * - 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. * * Fixed: * - 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 * * Targeted for Future Releases: * - 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 -- cgit v1.2.3