aboutsummaryrefslogtreecommitdiff
path: root/LUFA/Drivers/USB/Class/Common
diff options
context:
space:
mode:
Diffstat (limited to 'LUFA/Drivers/USB/Class/Common')
-rw-r--r--LUFA/Drivers/USB/Class/Common/HID.h42
-rw-r--r--LUFA/Drivers/USB/Class/Common/HIDParser.c21
-rw-r--r--LUFA/Drivers/USB/Class/Common/HIDParser.h8
3 files changed, 37 insertions, 34 deletions
diff --git a/LUFA/Drivers/USB/Class/Common/HID.h b/LUFA/Drivers/USB/Class/Common/HID.h
index 4e3c701c..74012b67 100644
--- a/LUFA/Drivers/USB/Class/Common/HID.h
+++ b/LUFA/Drivers/USB/Class/Common/HID.h
@@ -328,43 +328,46 @@
#define HID_KEYBOARD_SC_RIGHT_GUI 0xE7
//@}
- /** \name Standard HID Device Report Descriptors */
+ /** \name Common HID Device Report Descriptors */
//@{
/** \hideinitializer
- * A list of HID report item array elements that describe a typical HID USB Joystick. The resulting report descriptor
- * is structured according to the following layout:
+ * A list of HID report item array elements that describe a typical HID USB Joystick. The resulting report
+ * descriptor is structured according to the following layout:
*
* \code
* struct
* {
- * uintA_t Buttons; // Pressed buttons bitmask
* intB_t X; // Signed X axis value
* intB_t Y; // Signed Y axis value
+ * int8_t Z; // Signed Z axis value
+ * // Additional axis elements here
+ * uintA_t Buttons; // Pressed buttons bitmask
* } Joystick_Report;
* \endcode
*
* Where \c uintA_t is a type large enough to hold one bit per button, and \c intB_t is a type large enough to hold the
* ranges of the signed \c MinAxisVal and \c MaxAxisVal values.
*
- * \param[in] MinAxisVal Minimum X/Y logical axis value.
- * \param[in] MaxAxisVal Maximum X/Y logical axis value.
- * \param[in] MinPhysicalVal Minimum X/Y physical axis value, for movement resolution calculations.
- * \param[in] MaxPhysicalVal Maximum X/Y physical axis value, for movement resolution calculations.
- * \param[in] Buttons Total number of buttons in the device.
+ * \param[in] NumAxis Number of axis in the joystick (8-bit)
+ * \param[in] MinAxisVal Minimum logical axis value (16-bit).
+ * \param[in] MaxAxisVal Maximum logical axis value (16-bit).
+ * \param[in] MinPhysicalVal Minimum physical axis value, for movement resolution calculations (16-bit).
+ * \param[in] MaxPhysicalVal Maximum physical axis value, for movement resolution calculations (16-bit).
+ * \param[in] Buttons Total number of buttons in the device (8-bit).
*/
- #define HID_DESCRIPTOR_JOYSTICK(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons) \
+ #define HID_DESCRIPTOR_JOYSTICK(NumAxis, MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons) \
HID_RI_USAGE_PAGE(8, 0x01), \
HID_RI_USAGE(8, 0x04), \
HID_RI_COLLECTION(8, 0x01), \
HID_RI_USAGE(8, 0x01), \
HID_RI_COLLECTION(8, 0x00), \
- HID_RI_USAGE(8, 0x30), \
- HID_RI_USAGE(8, 0x31), \
+ HID_RI_USAGE_MINIMUM(8, 0x30), \
+ HID_RI_USAGE_MAXIMUM(8, (0x30 + (NumAxis - 1))), \
HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \
HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \
HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \
HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \
- HID_RI_REPORT_COUNT(8, 0x02), \
+ HID_RI_REPORT_COUNT(8, NumAxis), \
HID_RI_REPORT_SIZE(8, ((((MinAxisVal >= -0xFF) && (MaxAxisVal <= 0xFF)) ? 8 : 16))), \
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
HID_RI_END_COLLECTION(0), \
@@ -395,8 +398,7 @@
* } Keyboard_Report;
* \endcode
*
- * \param[in] MaxKeys Number of simultaneous keys that can be reported at the one time (a value between 1 and
- * (ENDPOINT_SIZE - 2) ).
+ * \param[in] MaxKeys Number of simultaneous keys that can be reported at the one time (8-bit).
*/
#define HID_DESCRIPTOR_KEYBOARD(MaxKeys) \
HID_RI_USAGE_PAGE(8, 0x01), \
@@ -449,11 +451,11 @@
* Where \c intA_t is a type large enough to hold one bit per button, and \c intB_t is a type large enough to hold the
* ranges of the signed \c MinAxisVal and \c MaxAxisVal values.
*
- * \param[in] MinAxisVal Minimum X/Y logical axis value.
- * \param[in] MaxAxisVal Maximum X/Y logical axis value.
- * \param[in] MinPhysicalVal Minimum X/Y physical axis value, for movement resolution calculations.
- * \param[in] MaxPhysicalVal Maximum X/Y physical axis value, for movement resolution calculations.
- * \param[in] Buttons Total number of buttons in the device.
+ * \param[in] MinAxisVal Minimum X/Y logical axis value (16-bit).
+ * \param[in] MaxAxisVal Maximum X/Y logical axis value (16-bit).
+ * \param[in] MinPhysicalVal Minimum X/Y physical axis value, for movement resolution calculations (16-bit).
+ * \param[in] MaxPhysicalVal Maximum X/Y physical axis value, for movement resolution calculations (16-bit).
+ * \param[in] Buttons Total number of buttons in the device (8-bit).
* \param[in] AbsoluteCoords Boolean true to use absolute X/Y coordinates (e.g. touchscreen).
*/
#define HID_DESCRIPTOR_MOUSE(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, AbsoluteCoords) \
diff --git a/LUFA/Drivers/USB/Class/Common/HIDParser.c b/LUFA/Drivers/USB/Class/Common/HIDParser.c
index bd0937ba..903b039d 100644
--- a/LUFA/Drivers/USB/Class/Common/HIDParser.c
+++ b/LUFA/Drivers/USB/Class/Common/HIDParser.c
@@ -255,19 +255,16 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType] += CurrStateTable->Attributes.BitSize;
- if (ParserData->LargestReportSizeBits < NewReportItem.BitOffset)
- ParserData->LargestReportSizeBits = NewReportItem.BitOffset;
+ ParserData->LargestReportSizeBits = MAX(ParserData->LargestReportSizeBits, CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType]);
- 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],
- &NewReportItem, sizeof(HID_ReportItem_t));
+ memcpy(&ParserData->ReportItems[ParserData->TotalReportItems],
+ &NewReportItem, sizeof(HID_ReportItem_t));
- ParserData->TotalReportItems++;
- }
+ if (!(ReportItemData & HID_IOF_CONSTANT) && CALLBACK_HIDParser_FilterHIDReportItem(&NewReportItem))
+ ParserData->TotalReportItems++;
}
break;
@@ -291,7 +288,7 @@ bool USB_GetHIDReportItemInfo(const uint8_t* ReportData,
HID_ReportItem_t* const ReportItem)
{
if (ReportItem == NULL)
- return false;
+ return false;
uint16_t DataBitsRem = ReportItem->Attributes.BitSize;
uint16_t CurrentBit = ReportItem->BitOffset;
@@ -324,7 +321,7 @@ void USB_SetHIDReportItemInfo(uint8_t* ReportData,
HID_ReportItem_t* const ReportItem)
{
if (ReportItem == NULL)
- return;
+ return;
uint16_t DataBitsRem = ReportItem->Attributes.BitSize;
uint16_t CurrentBit = ReportItem->BitOffset;
diff --git a/LUFA/Drivers/USB/Class/Common/HIDParser.h b/LUFA/Drivers/USB/Class/Common/HIDParser.h
index 7b9dd9db..e4912133 100644
--- a/LUFA/Drivers/USB/Class/Common/HIDParser.h
+++ b/LUFA/Drivers/USB/Class/Common/HIDParser.h
@@ -295,7 +295,7 @@
* \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,
- 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
* \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.
*/
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.
*
@@ -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
* 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.
*
* \return Boolean \c true if the item should be stored into the \ref HID_ReportInfo_t structure, \c false if