传感器 HID 类驱动程序
从 Windows 8 开始,Windows 操作系统包括一个内置传感器 HID 类驱动程序 (SensorsHIDClassDriver.dll) ,它支持使用 HID 传输进行通信的 11 种传感器类型。
下面是支持的传感器列表:
- 加速计 3D
- 环境光
- 环境温度
- 气压
- 指南针 3D
- 设备方向
- 陀螺仪 3D
- 湿度
- 测斜仪 3D
- 状态
- 邻近帮助
下图描绘了从两个传感器应用程序到驱动程序堆栈,最后到硬件本身的来回数据流。
支持自定义传感器
除了前面列表中介绍的 11 个传感器外,类驱动程序还支持 Custom 类。 此类允许传感器制造商集成上一个列表中未找到的设备:例如,一氧化碳传感器。 自定义传感器将自身作为具有唯一属性的自定义设备呈现给传感器 API。
体系结构和概述
如果要为兼容传感器创建固件,则需要基本了解类驱动程序支持的 I/O 模型。
- 传感器将功能报告或输入报告发送到 HID 类驱动程序。 将发送功能报告以响应来自驱动程序的请求。 此报表包含属性数据,包括传感器的更改敏感度设置、报告间隔和报告状态。 输入报告是按请求发送的,也可以异步发送以响应事件。 此报表包含实际的传感器数据。 例如,对于加速计,报表包含沿 x 轴、y 轴和 z 轴) 的 G 力。
- HID 类驱动程序将功能报告发送到传感器。 例如,当应用程序请求新的更改敏感度或报告间隔时,驱动程序会将这些值打包到功能报表中,并使用此报告将请求发送到传感器的固件。
下图演示了 I/O 模型:
示例报告描述符
如果传感器支持类驱动程序原生的七个类别之一,则其固件需要支持特定功能和输入报告。 功能报告包括传感器的当前报告状态、状态、更改敏感度和报告间隔 (,以及) 的其他可能属性。 输入报告包含传感器读数:对于开关为 True 或 False,对于加速计为 G 力值,对于环境光传感器为 LUX。
示例加速计功能报告
下面的代码示例显示了加速计的 HID 功能报告。 请注意此报表的自我描述性。 它包括最小值和最大值以及单个字段的计数和大小。
//feature reports (xmit/receive)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_8(0xFF), //LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_SENSOR_STATUS,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_8(0xFF), //LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_ABS,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_16(0xFF,0xFF), //LOGICAL_MAXIMUM (65535)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(0xE),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_32(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 输入报告。 同样,请注意此报表中字段的自我描述性。
//input reports (transmit)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_STATE,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_8(0xFF), //LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_EVENT,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_8(0xFF), //LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_X_AXIS,
HID_LOGICAL_MIN_16(0x01,0x80), // LOGICAL_MINIMUM (-32767)
HID_LOGICAL_MAX_16(0xFF,0x7F), // LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(0xE),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Y_AXIS,
HID_LOGICAL_MIN_16(0x01,0x80), // LOGICAL_MINIMUM (-32767)
HID_LOGICAL_MAX_16(0xFF,0x7F), // LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(0xE),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Z_AXIS,
HID_LOGICAL_MIN_16(0x01,0x80), // LOGICAL_MINIMUM (-32767)
HID_LOGICAL_MAX_16(0xFF,0x7F), // LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(3),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(0xE),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_INTENSITY,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_8(0xFF), //LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),