-                               HID_RI_USAGE_PAGE(8, 0x01),              \
-                               HID_RI_USAGE(8, 0x02),                   \
-                               HID_RI_COLLECTION(8, 0x01),              \
-                                       HID_RI_USAGE(8, 0x01),               \
-                                       HID_RI_COLLECTION(8, 0x00),          \
-                                               HID_RI_USAGE_PAGE(8, 0x09),      \
-                                               HID_RI_USAGE_MINIMUM(8, 0x01),   \
-                                               HID_RI_USAGE_MAXIMUM(8, Buttons), \
-                                               HID_RI_LOGICAL_MINIMUM(8, 0x00), \
-                                               HID_RI_LOGICAL_MAXIMUM(8, 0x01), \
-                                               HID_RI_REPORT_COUNT(8, Buttons), \
-                                               HID_RI_REPORT_SIZE(8, 0x01),     \
-                                               HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_VOLATILE), \
-                                               HID_RI_REPORT_COUNT(8, 0x01),    \
-                                               HID_RI_REPORT_SIZE(8, (8 - (Buttons % 8))), \
-                                               HID_RI_INPUT(8, HID_IOF_CONSTANT), \
-                                               HID_RI_USAGE_PAGE(8, 0x01),      \
-                                               HID_RI_USAGE(8, 0x30),           \
-                                               HID_RI_USAGE(8, 0x31),           \
-                                               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_SIZE(8, (((((uint16_t)MinAxisVal > 0xFF) && ((uint16_t)MaxAxisVal < 0xFF)) ? 8 : 16))), \
-                                               HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | (AbsoluteCoords ? HID_IOF_ABSOLUTE : HID_IOF_RELATIVE) | HID_IOF_NON_VOLATILE), \
-                                       HID_RI_END_COLLECTION(0),            \
-                               HID_RI_END_COLLECTION(0)
+                       HID_RI_USAGE_PAGE(8, 0x01),                     \
+                       HID_RI_USAGE(8, 0x02),                          \
+                       HID_RI_COLLECTION(8, 0x01),                     \
+                               HID_RI_USAGE(8, 0x01),                      \
+                               HID_RI_COLLECTION(8, 0x00),                 \
+                                       HID_RI_USAGE_PAGE(8, 0x09),             \
+                                       HID_RI_USAGE_MINIMUM(8, 0x01),          \
+                                       HID_RI_USAGE_MAXIMUM(8, Buttons),       \
+                                       HID_RI_LOGICAL_MINIMUM(8, 0x00),        \
+                                       HID_RI_LOGICAL_MAXIMUM(8, 0x01),        \
+                                       HID_RI_REPORT_COUNT(8, Buttons),        \
+                                       HID_RI_REPORT_SIZE(8, 0x01),            \
+                                       HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
+                                       HID_RI_REPORT_COUNT(8, 0x01),           \
+                                       HID_RI_REPORT_SIZE(8, (8 - (Buttons % 8))), \
+                                       HID_RI_INPUT(8, HID_IOF_CONSTANT),      \
+                                       HID_RI_USAGE_PAGE(8, 0x01),             \
+                                       HID_RI_USAGE(8, 0x30),                  \
+                                       HID_RI_USAGE(8, 0x31),                  \
+                                       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_SIZE(8, (((((uint16_t)MinAxisVal > 0xFF) && ((uint16_t)MaxAxisVal < 0xFF)) ? 8 : 16))), \
+                                       HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | (AbsoluteCoords ? HID_IOF_ABSOLUTE : HID_IOF_RELATIVE)), \
+                               HID_RI_END_COLLECTION(0),                   \
+                       HID_RI_END_COLLECTION(0)
+
+               /** \hideinitializer
+                *  A list of HID report item array elements that describe a typical Vendor Defined byte array HID report descriptor,
+                *  used for transporting abitrary data between the USB host and device via HID reports. The resulting report should be
+                *  a uint8_t byte array of the specified length in both Device to Host (IN) and Host to Device (OUT) directions.
+                *
+                *  \param[in] VendorPageNum    Vendor Defined HID Usage Page index, ranging from 0x00 to 0xFF
+                *  \param[in] CollectionUsage  Vendor Usage for the encompasing report IN and OUT collection, ranging from 0x00 to 0xFF
+                *  \param[in] DataINUsage      Vendor Usage for the IN report data, ranging from 0x00 to 0xFF
+                *  \param[in] DataOUTUsage     Vendor Usage for the OUT report data, ranging from 0x00 to 0xFF   
+                *  \param[in] NumBytes         Length of the data IN and OUT reports
+                */
+               #define HID_DESCRIPTOR_VENDOR(VendorPageNum, CollectionUsage, DataINUsage, DataOUTUsage, NumBytes) \
+                       HID_RI_USAGE_PAGE(16, (0xFF00 | VendorPageNum)), \
+                       HID_RI_USAGE(8, CollectionUsage),           \
+                       HID_RI_COLLECTION(8, 0x01),                 \
+                               HID_RI_USAGE(8, DataINUsage),           \
+                               HID_RI_LOGICAL_MINIMUM(8, 0x00),        \
+                               HID_RI_LOGICAL_MAXIMUM(8, 0xFF),        \
+                               HID_RI_REPORT_SIZE(8, 0x08),            \
+                               HID_RI_REPORT_COUNT(8, NumBytes),       \
+                               HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
+                               HID_RI_USAGE(8, DataOUTUsage),          \
+                               HID_RI_LOGICAL_MINIMUM(8, 0x00),        \
+                               HID_RI_LOGICAL_MAXIMUM(8, 0xFF),        \
+                               HID_RI_REPORT_SIZE(8, 0x08),            \
+                               HID_RI_REPORT_COUNT(8, NumBytes),       \
+                               HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
+                       HID_RI_END_COLLECTION(0)