共用方式為


感測器 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 模型:

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),