Add new HID_DESCRIPTOR_VENDOR() macro, change over all projects and Device ClassDrive...
[pub/lufa.git] / LUFA / Drivers / USB / Class / Common / HID.h
index 8cb5f6d..9f12118 100644 (file)
                 *  \param[in] Buttons     Total number of buttons in the device
                 */
                #define HID_DESCRIPTOR_JOYSTICK(MinAxisVal, MaxAxisVal, 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_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_REPORT_SIZE(8, (((((uint16_t)MinAxisVal > 0xFF) && ((uint16_t)MaxAxisVal < 0xFF)) ? 8 : 16))), \
-                                       HID_RI_REPORT_COUNT(8, 0x02),  \
-                                       HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
-                               HID_RI_END_COLLECTION(0),          \
-                               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_SIZE(8, 0x01),       \
-                               HID_RI_REPORT_COUNT(8, Buttons),   \
-                               HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
+                                       HID_RI_REPORT_COUNT(8, 0x02),           \
+                                       HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
+                               HID_RI_END_COLLECTION(0),                   \
+                               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_SIZE(8, 0x01),                \
+                               HID_RI_REPORT_COUNT(8, Buttons),            \
+                               HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
                                HID_RI_REPORT_SIZE(8, (8 - (Buttons % 8))), \
-                               HID_RI_REPORT_COUNT(8, 0x01),      \
-                               HID_RI_INPUT(8, HID_IOF_CONSTANT), \
+                               HID_RI_REPORT_COUNT(8, 0x01),               \
+                               HID_RI_INPUT(8, HID_IOF_CONSTANT),          \
                        HID_RI_END_COLLECTION(0)
 
                /** \hideinitializer
                 *  \param[in] MaxKeys  Number of simultaneous keys that can be reported at the one time (a value between 1 and
                 *                      (ENDPOINT_SIZE - 2) )
                 */
-               #define HID_DESCRIPTOR_KEYBOARD(MaxKeys)   \
-                       HID_RI_USAGE_PAGE(8, 0x01),            \
-                       HID_RI_USAGE(8, 0x06),                 \
-                       HID_RI_COLLECTION(8, 0x01),            \
-                               HID_RI_USAGE_PAGE(8, 0x07),        \
-                               HID_RI_USAGE_MINIMUM(8, 0xE0),     \
-                               HID_RI_USAGE_MAXIMUM(8, 0xE7),     \
-                               HID_RI_LOGICAL_MINIMUM(8, 0x00),   \
-                               HID_RI_LOGICAL_MAXIMUM(8, 0x01),   \
-                               HID_RI_REPORT_SIZE(8, 0x01),       \
-                               HID_RI_REPORT_COUNT(8, 0x08),      \
-                               HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
-                               HID_RI_REPORT_COUNT(8, 0x01),      \
-                               HID_RI_REPORT_SIZE(8, 0x08),       \
-                               HID_RI_INPUT(8, HID_IOF_CONSTANT), \
-                               HID_RI_USAGE_PAGE(8, 0x08),        \
-                               HID_RI_USAGE_MINIMUM(8, 0x01),     \
-                               HID_RI_USAGE_MAXIMUM(8, 0x05),     \
-                               HID_RI_REPORT_COUNT(8, 0x05),      \
-                               HID_RI_REPORT_SIZE(8, 0x01),       \
+               #define HID_DESCRIPTOR_KEYBOARD(MaxKeys)            \
+                       HID_RI_USAGE_PAGE(8, 0x01),                     \
+                       HID_RI_USAGE(8, 0x06),                          \
+                       HID_RI_COLLECTION(8, 0x01),                     \
+                               HID_RI_USAGE_PAGE(8, 0x07),                 \
+                               HID_RI_USAGE_MINIMUM(8, 0xE0),              \
+                               HID_RI_USAGE_MAXIMUM(8, 0xE7),              \
+                               HID_RI_LOGICAL_MINIMUM(8, 0x00),            \
+                               HID_RI_LOGICAL_MAXIMUM(8, 0x01),            \
+                               HID_RI_REPORT_SIZE(8, 0x01),                \
+                               HID_RI_REPORT_COUNT(8, 0x08),               \
+                               HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
+                               HID_RI_REPORT_COUNT(8, 0x01),               \
+                               HID_RI_REPORT_SIZE(8, 0x08),                \
+                               HID_RI_INPUT(8, HID_IOF_CONSTANT),          \
+                               HID_RI_USAGE_PAGE(8, 0x08),                 \
+                               HID_RI_USAGE_MINIMUM(8, 0x01),              \
+                               HID_RI_USAGE_MAXIMUM(8, 0x05),              \
+                               HID_RI_REPORT_COUNT(8, 0x05),               \
+                               HID_RI_REPORT_SIZE(8, 0x01),                \
                                HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
-                               HID_RI_REPORT_COUNT(8, 0x01),      \
-                               HID_RI_REPORT_SIZE(8, 0x03),       \
-                               HID_RI_OUTPUT(8, HID_IOF_CONSTANT), \
-                               HID_RI_LOGICAL_MINIMUM(8, 0x00),   \
-                               HID_RI_LOGICAL_MAXIMUM(8, 0x65),   \
-                               HID_RI_USAGE_PAGE(8, 0x07),        \
-                               HID_RI_USAGE_MINIMUM(8, 0x00),     \
-                               HID_RI_USAGE_MAXIMUM(8, 0x65),     \
-                               HID_RI_REPORT_COUNT(8, MaxKeys),   \
-                               HID_RI_REPORT_SIZE(8, 0x08),       \
-                               HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
+                               HID_RI_REPORT_COUNT(8, 0x01),               \
+                               HID_RI_REPORT_SIZE(8, 0x03),                \
+                               HID_RI_OUTPUT(8, HID_IOF_CONSTANT),         \
+                               HID_RI_LOGICAL_MINIMUM(8, 0x00),            \
+                               HID_RI_LOGICAL_MAXIMUM(8, 0x65),            \
+                               HID_RI_USAGE_PAGE(8, 0x07),                 \
+                               HID_RI_USAGE_MINIMUM(8, 0x00),              \
+                               HID_RI_USAGE_MAXIMUM(8, 0x65),              \
+                               HID_RI_REPORT_COUNT(8, MaxKeys),            \
+                               HID_RI_REPORT_SIZE(8, 0x08),                \
+                               HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), \
                        HID_RI_END_COLLECTION(0)
 
                /** \hideinitializer
                 *  \param[in] AbsoluteCoords  Boolean true to use absolute X/Y coordinates (e.g. touchscreen)
                 */
                #define HID_DESCRIPTOR_MOUSE(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, AbsoluteCoords) \
-                               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)
                //@}
                
        /* Type Defines: */