感測器 HID 類別驅動程式
從 Windows 8 開始,Windows 作業系統包含內建感測器 HID 類別驅動程式 (SensorsHIDClassDriver.dll) ,可支援使用 HID 傳輸進行通訊的十一種感測器類型。
以下是支援的感測器清單:
- 加速計 3D
- 環境光線
- 環境溫度
- 氣壓
- Compass 3D
- 裝置方向
- 陀螺儀 3D
- 溼度
- 傾角計 3D
- 目前狀態
- 遠近
下圖說明從兩個感測器應用程式向下到驅動程式堆疊來回流動數據,最後是硬體本身。
支援自定義感測器
除了前一個清單中涵蓋的十一個感測器之外,類別驅動程式也支援自定義類別。 此類別可讓感測器製造商整合上一個清單中找不到的裝置:例如,碳整合感測器。 自定義感測器會以具有唯一屬性的自定義裝置的形式呈現給感測器 API。
架構和概觀
如果您要建立相容感測器的韌體,您需要對類別驅動程式所支援的 I/O 模型有基本瞭解。
- 感測器會將功能報告或輸入報告傳送至 HID 類別驅動程式。 功能報告會傳送以響應驅動程式的要求。 此報表包含屬性數據,包括感測器的變更敏感度設定、其報告間隔,以及其報告狀態。 輸入報告會在要求時傳送,或以異步方式回應事件。 此報表包含實際的感測器數據。 例如,針對加速計,報表會沿著 x 軸、y 軸和 z 軸包含 G-forces) 。
- HID 類別驅動程式會將功能報告傳送至感測器。 例如,當應用程式要求新的變更敏感度或報告間隔時,驅動程式會將這些值封裝成功能報告,並使用此報告將要求傳送至感測器的韌體。
下圖說明 I/O 模型:
範例報表描述項
如果您的感測器支援類別驅動程式原生的七個類別之一,其韌體將需要支援特定功能和輸入報告。 除了) 的其他可能屬性之外,功能報告包括感測器目前的報告狀態、其狀態、變更敏感度和報告間隔 (。 輸入報告包含感測器讀數:開關的 True 或 False,對於環境光線感測器則為加速計或 LUX 的 G-force 值。
範例加速計功能報告
下列程式代碼範例顯示加速計的 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),