Fixed optimization error in the HID Parser item value USB_SetHIDReportItemInfo() and USB_GetHIDReportItemInfo() routines if the report item was NULL (which should be allowable according to the API).

Fixed HID Parser CALLBACK_HIDParser_FilterHIDReportItem() callback function not being passed a cacheable report item pointer.
pull/1469/head
Dean Camera 13 years ago
parent 94e0a0058a
commit 4b229cb5ef

@ -258,16 +258,14 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
if (ParserData->LargestReportSizeBits < NewReportItem.BitOffset) if (ParserData->LargestReportSizeBits < NewReportItem.BitOffset)
ParserData->LargestReportSizeBits = NewReportItem.BitOffset; ParserData->LargestReportSizeBits = NewReportItem.BitOffset;
if (!(ReportItemData & HID_IOF_CONSTANT) && CALLBACK_HIDParser_FilterHIDReportItem(&NewReportItem)) if (ParserData->TotalReportItems == HID_MAX_REPORTITEMS)
{ return HID_PARSE_InsufficientReportItems;
if (ParserData->TotalReportItems == HID_MAX_REPORTITEMS)
return HID_PARSE_InsufficientReportItems;
memcpy(&ParserData->ReportItems[ParserData->TotalReportItems], memcpy(&ParserData->ReportItems[ParserData->TotalReportItems],
&NewReportItem, sizeof(HID_ReportItem_t)); &NewReportItem, sizeof(HID_ReportItem_t));
ParserData->TotalReportItems++; if (!(ReportItemData & HID_IOF_CONSTANT) && CALLBACK_HIDParser_FilterHIDReportItem(&NewReportItem))
} ParserData->TotalReportItems++;
} }
break; break;
@ -291,7 +289,7 @@ bool USB_GetHIDReportItemInfo(const uint8_t* ReportData,
HID_ReportItem_t* const ReportItem) HID_ReportItem_t* const ReportItem)
{ {
if (ReportItem == NULL) if (ReportItem == NULL)
return false; return false;
uint16_t DataBitsRem = ReportItem->Attributes.BitSize; uint16_t DataBitsRem = ReportItem->Attributes.BitSize;
uint16_t CurrentBit = ReportItem->BitOffset; uint16_t CurrentBit = ReportItem->BitOffset;
@ -324,7 +322,7 @@ void USB_SetHIDReportItemInfo(uint8_t* ReportData,
HID_ReportItem_t* const ReportItem) HID_ReportItem_t* const ReportItem)
{ {
if (ReportItem == NULL) if (ReportItem == NULL)
return; return;
uint16_t DataBitsRem = ReportItem->Attributes.BitSize; uint16_t DataBitsRem = ReportItem->Attributes.BitSize;
uint16_t CurrentBit = ReportItem->BitOffset; uint16_t CurrentBit = ReportItem->BitOffset;

@ -295,7 +295,7 @@
* \returns Boolean \c true if the item to retrieve was located in the given report, \c false otherwise. * \returns Boolean \c true if the item to retrieve was located in the given report, \c false otherwise.
*/ */
bool USB_GetHIDReportItemInfo(const uint8_t* ReportData, bool USB_GetHIDReportItemInfo(const uint8_t* ReportData,
HID_ReportItem_t* const ReportItem) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); HID_ReportItem_t* const ReportItem) ATTR_NON_NULL_PTR_ARG(1);
/** Retrieves the given report item's value out of the \c Value member of the report item's /** Retrieves the given report item's value out of the \c Value member of the report item's
* \ref HID_ReportItem_t structure and places it into the correct position in the HID report * \ref HID_ReportItem_t structure and places it into the correct position in the HID report
@ -311,7 +311,7 @@
* \param[in] ReportItem Pointer to the report item of interest in a \ref HID_ReportInfo_t ReportItem array. * \param[in] ReportItem Pointer to the report item of interest in a \ref HID_ReportInfo_t ReportItem array.
*/ */
void USB_SetHIDReportItemInfo(uint8_t* ReportData, void USB_SetHIDReportItemInfo(uint8_t* ReportData,
HID_ReportItem_t* const ReportItem) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); HID_ReportItem_t* const ReportItem) ATTR_NON_NULL_PTR_ARG(1);
/** Retrieves the size of a given HID report in bytes from its Report ID. /** Retrieves the size of a given HID report in bytes from its Report ID.
* *
@ -331,6 +331,10 @@
* \ref HID_ReportInfo_t structure. This can be used to filter only those items the application will be using, so that * \ref HID_ReportInfo_t structure. This can be used to filter only those items the application will be using, so that
* no RAM is wasted storing the attributes for report items which will never be referenced by the application. * no RAM is wasted storing the attributes for report items which will never be referenced by the application.
* *
* Report item pointers passed to this callback function may be cached by the user application for later use
* when processing report items. This provides faster report processing in the user application than would
* a search of the entire parsed report item table for each received or sent report.
*
* \param[in] CurrentItem Pointer to the current report item for user checking. * \param[in] CurrentItem Pointer to the current report item for user checking.
* *
* \return Boolean \c true if the item should be stored into the \ref HID_ReportInfo_t structure, \c false if * \return Boolean \c true if the item should be stored into the \ref HID_ReportInfo_t structure, \c false if

@ -80,6 +80,9 @@
* - Fixed USB_USBTask not being called internally in stream transfers between packets when Partial Stream Transfers are used * - Fixed USB_USBTask not being called internally in stream transfers between packets when Partial Stream Transfers are used
* - Fixed swapped TWI_ADDRESS_READ and TWI_ADDRESS_WRITE values * - Fixed swapped TWI_ADDRESS_READ and TWI_ADDRESS_WRITE values
* - Fixed TWI_ReadPacket() not releasing the TWI bus on read completion * - Fixed TWI_ReadPacket() not releasing the TWI bus on read completion
* - Fixed optimization error in the HID Parser item value USB_SetHIDReportItemInfo() and USB_GetHIDReportItemInfo() routines if the report item was
* \c NULL (which should be allowable according to the API)
* - Fixed HID Parser CALLBACK_HIDParser_FilterHIDReportItem() callback function not being passed a cacheable report item pointer
* - Library Applications: * - Library Applications:
* - Fixed incorrect signature in the CDC and DFU class bootloaders for the ATMEGA8U2 * - Fixed incorrect signature in the CDC and DFU class bootloaders for the ATMEGA8U2
* - Fixed KeyboardHost and KeyboardHostWithParser demos displaying incorrect values when numerical keys were pressed * - Fixed KeyboardHost and KeyboardHostWithParser demos displaying incorrect values when numerical keys were pressed

@ -27,6 +27,8 @@
* -# Add additional standard request helper functions to host mode * -# Add additional standard request helper functions to host mode
* -# Add Dataflash_SendCommand() * -# Add Dataflash_SendCommand()
* -# Make HOST_DEVICE_SETTLE_DELAY_MS a global variable that can be changed * -# Make HOST_DEVICE_SETTLE_DELAY_MS a global variable that can be changed
* -# Add MANDATORY_EVENT_FUNCTIONS compile time option
* -# Add watchdog support to the library and apps/bootloaders
* - Documentation/Support * - Documentation/Support
* -# Add detailed overviews of how each demo works * -# Add detailed overviews of how each demo works
* -# Add board overviews * -# Add board overviews

Loading…
Cancel
Save