Professional Documents
Culture Documents
Abstract
This paper provides information about a sample HID class-driver for sensors. It provides
guidelines for IHVs who are creating sensors, or OEMs who are integrating sensors into their
equipment.
It assumes that the reader is familiar with the Sensor platform for Windows and the User
Mode Driver Framework (UMDF). And, it assumes that the reader is familiar with the Sensor
Driver Skeleton Sample that ships in the Windows Driver Kit (WDK).
This information applies to the following operating systems:
Windows 8
References and resources discussed here are listed at the end of this paper.
The current version of this paper is maintained on the web at:
The HID Class Driver for Sensors
Disclaimer
Disclaimer: This document is provided as-is. Information and views expressed in this document, including
URL and other Internet Web site references, may change without notice. You bear the risk of using it.
This document does not provide you with any legal rights to any intellectual property in any Microsoft
product. You may copy and use this document for your internal, reference purposes. This document is
confidential and proprietary to Microsoft. It is disclosed and can be used only pursuant to a non-disclosure
agreement.
2011 Microsoft. All rights reserved.
Contents
Introduction.................................................................................................................... 3
The HID Protocol for Sensors.......................................................................................... 3
Supporting I/O.................................................................................................................5
Defining the Sensor Objects............................................................................................9
Initializing the Sensor Object...................................................................................... 9
Setting and Retrieving the Sensor Properties.............................................................9
Reading HID Feature Reports..................................................................................... 9
Reading HID Input Reports....................................................................................... 10
Writing HID Feature Reports.................................................................................... 10
Supporting the Sensor Properties.................................................................................10
Using the Sensor Class Extension to Raise Events........................................................ 12
Supporting a Custom Sensor.........................................................................................13
Driver Installation..........................................................................................................15
Debugging a Sensor Driver with Visual Studio 2010..................................................... 15
General Visual Studio 10 Debugging Tips................................................................. 16
Tips for Debugging Sensor Driver Initialization Code............................................... 16
The Driver File List.........................................................................................................17
Resources...................................................................................................................... 23
Appendix....................................................................................................................... 23
HID Sensor Report Descriptor...................................................................................23
Consolidated Report Descriptor............................................................................... 23
Introduction
The sample HID Class driver for sensors was written to demonstrate how an OEM or IHV could
write a UMDF driver to support sensors. This driver is also helpful for IHVs who must design
and test firmware for a HID-based sensor. Note that this sample driver is identical to the HID
class driver that will ship in-box for Windows 8.
The sample driver is based on the HID protocol. It supports the Freescale Badge Board thats
produced by Freescale Semiconductor Corporation, which is headquartered in Austin, Texas.
You need Rev D of the board because the earlier versions do not contain the ambient light
sensor; this version is also referred to as the Sensor Development Kit board. (In addition to the
three sensors on the badge board, the sample driver supports fifteen other sensors. For a
complete list of supported sensors, see the list of sensor files at the end of this paper.)
The badge board is built around a ColdFire USB Microcontroller and includes a 3-axis
accelerometer, an array of capacitive touch switches, and an ambient light sensor. In addition,
the badge board includes an array of LEDs as well as a 60-pin expansion slot. The board can be
purchased directly from Freescale Corporation. Note that youll also need to update the
firmware on the board with new firmware that is compatible with the HID class driver.
After the sample driver is installed on your Windows 8 machine, and the Freescale badge
board is connected to an available USB port, you can begin to familiarize yourself with the
hardware, the driver, and the Sensor platform for Windows. The following screenshot shows
accelerometer output for a very simple application that is receiving event notifications from
the sensor on the badge board. (These event notifications were issued by the firmware and
passed by the sample driver to the Sensor API where they were consumed by the application.)
limited in their reporting capabilities. This particular feature of the protocol works well with
sensors because the simplest sensors may report a single Boolean value to indicate current
state while more complex sensors may report a series of complex floating point numbers. A
human-presence sensor is an example of a simple sensor, and an accelerometer is a more
complex example. By supporting the self describing feature, the HID protocol enables an
unlimited universe of sensors.
The file internal.h, in the sample driver project, contains a HID report descriptor for the
collection of sensors supported by the sample HID class driver. This report descriptor is found
in comments at the end of the file. The sensors supported in this descriptor correspond to the
sensors found on the Freescale badge board. The sensors are:
3-axis accelerometer
Capacitive switch
When the badge board is attached to a personal computer, the board sends a complete report
descriptor to its host. This descriptor defines the format of the data that the sensors will send
to the host (or computer) and expect to receive from the computer. (If the report descriptor
contains a sensor that is not found in the drivers INF file, the driver will be loaded only if that
sensor is part of a collection. If this is the case, the driver is loaded; but the sensor is marked
as unsupported.)
The report descriptor is divided into two parts: feature reports and input reports. The feature
reports include a sensors current reporting state, its status, change sensitivity, and reporting
interval. The input reports contain sensor readings: True or False for a switch, G-force values
for an accelerometer or LUX for an ambient light sensor.
The following code snippet shows the HID feature report for the accelerometer. Note the selfdescriptive nature of this report; it includes minimum and maximum values as well as the
count and size of individual fields. (The self-describing report is made human-readable by
using a set of definitions found in the file internal.h)
//feature reports (xmit/receive)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_SENSOR_STATUS,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_ABS,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0x00, 0x00, //LOGICAL_MAXIMUM (65535)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD,
HID_UNIT_EXPONENT(2),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
September 13, 2011
2011 Microsoft. All rights reserved.
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0xFF, 0xFF, //LOGICAL_MAXIMUM (4294967295)
HID_REPORT_SIZE(32),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_MILLISECOND,
HID_UNIT_EXPONENT(0),
HID_FEATURE(Data_Var_Abs),
The following code snippet shows the HID input report for the same device. Again, note the
self-descriptive nature of the fields in this report.
//input reports (transmit)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_STATE,
0x15, 0x00,
0x26, 0xFF, 0x00,
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_EVENT,
0x15, 0x00,
0x26, 0xFF, 0x00,
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
//LOGICAL_MINIMUM (0)
//LOGICAL_MAXIMUM (255)
//LOGICAL_MINIMUM (0)
//LOGICAL_MAXIMUM (255)
HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_X_AXIS,
0x16, 0x01, 0x80,
//
LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//
LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Y_AXIS,
0x16, 0x01, 0x80,
//
LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//
LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Z_AXIS,
0x16, 0x01, 0x80,
//
LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//
LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
Supporting I/O
The sample driver communicates with the Freescale badge board over a USB connection. The
sensors firmware is programmed to send periodic readings and receive requests from the
driver to update its report interval or its change sensitivity.
The following diagram shows the data flow between the sample driver and the sensor. The
sensor firmware uses the HID protocol to transmit the sensor data:
The sensor sends either a feature report or an input report to the HID class driver. A
feature report is sent in response to a request from the driver. This report contains
data including the sensors change-sensitivity setting, its report interval, and its
reporting state. An input report is sent either upon request, or asynchronously in
response to an event. This report contains the actual sensor data (for example, in the
case of an accelerometer, the G-forces along the x-, y-, and z-axes).
The HID class driver sends feature reports to the sensor. For example, when the
application requests a new change sensitivity or report interval, the driver packages
these values into a feature report and uses this report to send the request to the
sensors firmware.
The sample driver is hosted in the User Mode Driver Framework (UMDF) host process (WUDF
Host Process in the diagram) and receives requests from a sensor application. The driver
exchanges data with the kernel-mode HID driver by way of a UMDF I/O target object.
The I/O target management and completion callback methods are implemented in the
CReadWriteRequest object found in the ReadWriteRequest.cpp module.
After the I/O target is created, the sample driver can begin processing asynchronous
read and write operations. Read operations are used to receive HID feature and input
reports from the sensor. Write operations are used to send requests to the sensor to
update the change sensitivity or read interval settings. These requests are sent as HID
feature reports. (The file internal.h contains the HID feature and input reports for
each sensor.)
The definitions of the corresponding methods are found in a source file with a similar name.
For example, the file Accelerometer.cpp contains the definition of the methods declared in
Accelerometer.h.
type, the minimum report interval, and the sensors friendly name. The driver, in turn,
captures this data and stores it in its list of properties. In the case of the accelerometer, the
method that processes the HID feature report is
CAccelerometer::UpdateAccelerometerPropertyValues
CAccelerometer::UpdateAccelerometerPropertyValues. (A method with a similar name in the
other object files performs similar work for each sensor.)
The maximum size of a HID Feature report is 64 bytes: 63 bytes for the actual report and 1
byte for the report identifier. The report identifier, the first byte in the report, will contain the
value 0 if there is only one sensor. However, if there is a sensor collection, the identifier
specifies the position of a given sensor in that collection. (If a collection exists, the identifier
value for the first sensor is always 1.)
BOOL
fAccelerometerZAxisSupported;
fAccelerometerMaximumSupported;
fltAccelerometerMaximum;
fAccelerometerXMaximumSupported;
fltAccelerometerXMaximum;
fAccelerometerYMaximumSupported;
fltAccelerometerYMaximum;
fAccelerometerZMaximumSupported;
fltAccelerometerZMaximum;
BOOL
FLOAT
BOOL
FLOAT
BOOL
FLOAT
BOOL
FLOAT
fAccelerometerMinimumSupported;
fltAccelerometerMinimum;
fAccelerometerXMinimumSupported;
fltAccelerometerXMinimum;
fAccelerometerYMinimumSupported;
fltAccelerometerYMinimum;
fAccelerometerZMinimumSupported;
fltAccelerometerZMinimum;
BOOL
FLOAT
BOOL
FLOAT
BOOL
FLOAT
BOOL
FLOAT
fAccelerometerAccuracySupported;
fltAccelerometerAccuracy;
fAccelerometerXAccuracySupported;
fltAccelerometerXAccuracy;
fAccelerometerYAccuracySupported;
fltAccelerometerYAccuracy;
fAccelerometerZAccuracySupported;
fltAccelerometerZAccuracy;
BOOL
FLOAT
BOOL
FLOAT
BOOL
FLOAT
BOOL
FLOAT
fAccelerometerResolutionSupported;
fltAccelerometerResolution;
fAccelerometerXResolutionSupported;
fltAccelerometerXResolution;
fAccelerometerYResolutionSupported;
fltAccelerometerYResolution;
fAccelerometerZResolutionSupported;
fltAccelerometerZResolution;
//Extended properties
BOOL
fConnectionTypeSupported;
ULONG ulConnectionType;
BOOL
fMinimumReportIntervalSupported;
ULONG ulMinimumReportInterval;
BOOL
fFriendlyNameSupported;
WCHAR
BOOL
WCHAR
BOOL
WCHAR
BOOL
WCHAR
BOOL
WCHAR
BOOL
WCHAR
wszFriendlyName[HID_FEATURE_REPORT_STRING_MAX_LENGTH];
fPersistentUniqueIDSupported;
wszPersistentUniqueID[HID_FEATURE_REPORT_STRING_MAX_LENGTH];
fManufacturerSupported;
wszManufacturer[HID_FEATURE_REPORT_STRING_MAX_LENGTH];
fModelSupported;
wszModel[HID_FEATURE_REPORT_STRING_MAX_LENGTH];
fSerialNumberSupported;
wszSerialNumber[HID_FEATURE_REPORT_STRING_MAX_LENGTH];
fDescriptionSupported;
wszDescription[HID_FEATURE_REPORT_STRING_MAX_LENGTH];
} ACCELEROMETER_DEVICE_PROPERTIES, *PACCELEROMETER_DEVICE_PROPERTIES;
The remaining properties (those not highlighted) are unique to the specific sensor. In the case
of the accelerometer, these include the supported data fields and the corresponding
properties for each data field.
Event-State Constant
SENSOR_STATE_NO_DATA
SENSOR_STATE_READY
Significance
Indicates that the sensor is not available.
Indicates that the sensor is connected
and ready to send data.
The sensor class extension handles the event-linkage between a sensor driver and the Sensor
API. When the driver invokes the ISensorClassExtension::PostStateChange method, the class
extension forwards the notification to the API. The sample driver invokes this method within
CSensorManager::SetState
CSensorManager::SetState. When the driver invokes the ISensorClassExtension::PostEvent
method and supplies the property key for the data-updated event, the class extension
forwards the notification to the Sensor API. The sample driver invokes this method within
CSensorManager::PostDataEvent
CSensorManager::PostDataEvent.
The two sensor manager methods ::SetState and ::PostDataEvent are invoked within the
sample drivers thread procedure for events CSensorManager::_SensorEventThreadProc
CSensorManager::_SensorEventThreadProc. The
event handlers are maintained within a separate thread procedure to prevent the event
activity from blocking synchronous procedures in the driver (such as callback functions).
HID_USAGE_SENSOR_UNITS_NOT_SPECIFIED,
HID_UNIT_EXPONENT(2),
HID_FEATURE(Data_Var_Abs),
The Custom input report supports an array of 16 Boolean values as well as six distinct sensor
values (these values can be any type from an integer to a float). This allows you to support a
wide range of sensor readings.
//input reports (transmit)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_STATE,
0x15, 0x00,
0x26, 0xFF, 0x00,
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_EVENT,
0x15, 0x00,
0x26, 0xFF, 0x00,
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
//LOGICAL_MINIMUM (0)
//LOGICAL_MAXIMUM (255)
//LOGICAL_MINIMUM (0)
//LOGICAL_MAXIMUM (255)
HID_USAGE_SENSOR_DATA_CUSTOM_USAGE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0x00, 0x00, //LOGICAL_MAXIMUM (65535)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_CUSTOM_BOOLEAN_ARRAY,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0x00, 0x00, //LOGICAL_MAXIMUM (65535)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_NOT_SPECIFIED,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_2,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_NOT_SPECIFIED,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_3,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
September 13, 2011
2011 Microsoft. All rights reserved.
HID_USAGE_SENSOR_UNITS_NOT_SPECIFIED,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_4,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_NOT_SPECIFIED,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_5,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_NOT_SPECIFIED,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_6,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_NOT_SPECIFIED,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
Driver Installation
For Windows 8, to install the driver to test the Freescale board or a sensor application, just
plug the board into your Windows 8 computer. (This installs an inbox version of the HID class
driver.)
However, if you want to install the sample driver, you must override the default installation.
To do this, follow these steps:
1.
Install the Windows Driver Kit (WDK) for Windows 8 and follow the instructions to
build the sample driver (SensorsHIDClassDriver).
2.
Open the Windows Device Manager in Control Panel and disable the inbox sensor
driver.
3.
Copy the DLL for the sample driver over the existing version of the inbox driver
located in <root>\Windows\System32\Drivers\UMDF.
4.
Open Visual Studio and select File > New > Project from Existing Code
Code.
2.
Follow the steps in the Welcome to the Create Project from Existing Code Files Wizard
(specifying the language, the location of your driver source files, a project name, and so on).
3.
4.
Select Debug/Attach to Process
Process.In the list of available processes that appears in the
Attach to Process dialog box, select WudfHost.exe
WudfHost.exe.
After you complete these steps, you can set breakpoints in your drivers source code and
debug your driver.
Create a debugging project in Visual Studio (as described in the previous section).
2.
Open an instance of regedit.exe and specify a delay period (in seconds) for the
WudfHost.exe process using the following key:
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
NT\CurrentVersion\WUDF\Services\{193a}\HostProcessDbgBreakOnStart
3.
Force the WUDFHost.exe process to reload. This can be done in a couple of ways,
depending on your device configuration:
a) From Device Manager, disable and then enable your device's devnode.
b) If your device has a physical connection to the computer, unplug and then reconnect your
device.
4.
Upon driver reload, start Visual Studio, open your debug project, and attach to the
WudfHost.exe process. As a side effect, you may see Device Manager hanging when you
reload the driver while WudfHost.exe is waiting for a debugger to connect.
The delay that you set for the HostProcessDbgBreakOnStart value provides the necessary
time to start the debugger before the installation of your driver. (For example, a value of
0x00000040 would delay the installation for 64 seconds.) This delay allows you time to attach
to the process, set a breakpoint in your initialization code, and begin debugging.
For more information about the HostProcessDbgBreakOnStart value, refer to this MSDN topic.
The following table describes the general files that are common to a UMDF sensor driver.
Filename
Contents
Device.cpp
Device.h
Dllsup.cpp
Driver.cpp
Driver.h
Internal.h
Makefile.inc
Queue.cpp
Queue.h
Resource.h
Sensor.cpp
Sensor.h
SensorDDI.cpp
SensorDdi.h
SensorManager.cpp
SensorManager.h
SensorsSimpleHIDClassDriver.def
SensorsSimpleHIDClassDriver.htm
SensorsSimpleHIDClassDriver.idl
SensorsSimpleHIDClassDriver.inf
SensorsSimpleHIDClassDriver.rc
SensorsSimpleHIDClassDriverWin8x86Manual.inf
Sources
The following table lists the files that support the 18 categories of sensors enabled by the
sample driver. Note that all of these categories return a timestamp data field. The table lists
any additional data field associated with a particular class.
Filename
Contents
Accelerometer.cpp
AmbientLight.cpp
AtmosPressure.cpp
Compass.cpp
Current.cpp
Custom.cpp
Distance.cpp
Frequency.cpp
Gyrometer.cpp
Humidity.cpp
Inclinometer.cpp
Potentiometer.cpp
Power.cpp
Presence.cpp
Switches.cpp
Thermometer.cpp
Unsupported.cpp
Voltage.cpp
measurement.
Voltage.h
Resources
MSDN Documentation for the Windows Driver Foundation
MSDN Documentation for Sensor Drivers
MSDN Documentation for Sensor Applications
Sample RS232 Sensor Driver and Documentation for Windows 7
For a great book about UMDF, see Developing Drivers with the Windows Driver
Foundation
Foundation by Orwick and Smith and published by Microsoft Press.
Appendix
HID Sensor Report Descriptor
The following table provides additional detail for the accelerometer, gyrometer, compass, and
ambient light sensor (ALS) reports. Note that output reports are not supported by the HID
sensor class driver. Also note that feature reports are generated: on initialization, client
connect, client disconnect, and when properties are set.
TOP LEVEL
COLLECTION
Accelerometer
Gyro
Compass
ALS
Input Report
Size (bytes)
9
9
17
13
Feature Report
Size (bytes)
14
14
14
14
Approximate rate at
which INPUT reports are
generated
60Hz
100Hz
~5Hz
~1Hz or slower
HID_USAGE_SENSOR_TYPE_MOTION_ACCELEROMETER_3D,
HID_COLLECTION(Physical),
//feature reports (xmit/receive)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_SENSOR_STATUS,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_ABS,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0x00, 0x00, //LOGICAL_MAXIMUM (65535)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(2),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0xFF, 0xFF, //LOGICAL_MAXIMUM (4294967295)
HID_REPORT_SIZE(32),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_MILLISECOND,
HID_UNIT_EXPONENT(0),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION,HID_USAGE_SEN
SOR_DATA_MOD_MAX),
0x16, 0x01, 0x80,
//
LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//
LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(2),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION,HID_USAGE_SEN
SOR_DATA_MOD_MIN),
0x16, 0x01, 0x80,
//
LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//
LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(2),
HID_FEATURE(Data_Var_Abs),
//input reports (transmit)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_STATE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_EVENT,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_X_AXIS,
0x16, 0x01, 0x80,
//
LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//
LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Y_AXIS,
0x16, 0x01, 0x80,
//
LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//
LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Z_AXIS,
0x16, 0x01, 0x80,
//
LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//
LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_END_COLLECTION,
HID_REPORT_ID(2),
HID_USAGE_PAGE_SENSOR,
// USAGE_PAGE (Sensor)
HID_USAGE_SENSOR_TYPE_LIGHT_AMBIENTLIGHT, // USAGE (AmbientLight)
HID_COLLECTION(Physical),
//feature reports (xmit/receive)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_SENSOR_STATUS,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_REL_PCT,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0x00, 0x00, //LOGICAL_MAXIMUM (65535)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_PERCENT,
HID_UNIT_EXPONENT(2),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0xFF, 0xFF, //LOGICAL_MAXIMUM (4294967295)
HID_REPORT_SIZE(32),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_MILLISECOND,
HID_UNIT_EXPONENT(0),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_LIGHT_ILLUMINANCE,HID_USAGE_SENSO
R_DATA_MOD_MAX),
0x15, 0x00,
//
LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0x00, 0x00, //
LOGICAL_MAXIMUM (65535)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_LUX,
HID_UNIT_EXPONENT(0xF),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_LIGHT_ILLUMINANCE,HID_USAGE_SENSO
R_DATA_MOD_MIN),
0x15, 0x00,
//
LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0x00, 0x00, //
LOGICAL_MAXIMUM (65535)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_LUX,
HID_UNIT_EXPONENT(0xF),
HID_FEATURE(Data_Var_Abs),
//input reports (transmit)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_STATE,
0x15, 0x00,
//LOGICAL_MINIMUM
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_EVENT,
0x15, 0x00,
//LOGICAL_MINIMUM
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_LIGHT_ILLUMINANCE,
0x15, 0x00,
//LOGICAL_MINIMUM
0x27, 0xFF, 0xFF, 0x00, 0x00, //LOGICAL_MAXIMUM
HID_USAGE_SENSOR_UNITS_LUX,
HID_UNIT_EXPONENT(0xF),
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_LIGHT_COLOR_TEMPERATURE,
0x15, 0x00,
//LOGICAL_MINIMUM
(0)
(255)
(0)
(255)
(0)
(65535)
(0)
(65535)
(0)
(65535)
(0)
(65535)
HID_REPORT_ID(3),
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_TYPE_ORIENTATION_COMPASS_3D,
HID_COLLECTION(Physical),
//feature reports (xmit/receive)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_SENSOR_STATUS,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_ABS,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0x00, 0x00, //LOGICAL_MAXIMUM (65535)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES,
HID_UNIT_EXPONENT(2),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0xFF, 0xFF, //LOGICAL_MAXIMUM (4294967295)
HID_REPORT_SIZE(32),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_MILLISECOND,
HID_UNIT_EXPONENT(0),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_HEADING,HID_USAGE_SEN
SOR_DATA_MOD_MAX),
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES,
HID_UNIT_EXPONENT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_HEADING,HID_USAGE_SEN
SOR_DATA_MOD_MIN),
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES,
HID_UNIT_EXPONENT(1),
HID_FEATURE(Data_Var_Abs),
//input reports (transmit)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_STATE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_EVENT,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_ORIENTATION_HEADING_MAGNETIC_X,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES,
HID_UNIT_EXPONENT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_ORIENTATION_HEADING_MAGNETIC_Y,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES,
HID_UNIT_EXPONENT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_ORIENTATION_HEADING_MAGNETIC_Z,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES,
HID_UNIT_EXPONENT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_ORIENTATION_HEADING_COMPENSATED_MAGNETIC_NORTH,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES,
HID_UNIT_EXPONENT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_ORIENTATION_HEADING_COMPENSATED_TRUE_NORTH,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES,
HID_UNIT_EXPONENT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_ORIENTATION_HEADING_MAGNETIC_NORTH,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES,
HID_UNIT_EXPONENT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_ORIENTATION_HEADING_TRUE_NORTH,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES,
HID_UNIT_EXPONENT(1),
HID_INPUT(Data_Var_Abs),
HID_END_COLLECTION,
HID_REPORT_ID(4),
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_TYPE_MOTION_GYROMETER_3D,
HID_COLLECTION(Physical),
//feature reports (xmit/receive)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_SENSOR_STATUS,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_ABS,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0x00, 0x00, //LOGICAL_MAXIMUM (65535)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND,
HID_UNIT_EXPONENT(2),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x27, 0xFF, 0xFF, 0xFF, 0xFF, //LOGICAL_MAXIMUM (4294967295)
HID_REPORT_SIZE(32),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_MILLISECOND,
HID_UNIT_EXPONENT(0),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY,HID_USAGE
_SENSOR_DATA_MOD_MAX),
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND,
HID_UNIT_EXPONENT(2),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY,HID_USAGE
_SENSOR_DATA_MOD_MIN),
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND,
HID_UNIT_EXPONENT(2),
HID_FEATURE(Data_Var_Abs),
//input reports (transmit)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_STATE,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_EVENT,
0x15, 0x00,
//LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00,
//LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY_ROLL_AXIS,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY_PITCH_AXIS,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY_YAW_AXIS,
0x16, 0x01, 0x80,
//LOGICAL_MINIMUM (-32767)
0x26, 0xFF, 0x7F,
//LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND,
HID_UNIT_EXPONENT(2),
HID_INPUT(Data_Var_Abs),
HID_END_COLLECTION,
HID_END_COLLECTION
};