共用方式為


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

i/o 模型。

範例報表描述元

如果您的感測器支援類別驅動程式原生的七個類別之一,其韌體將需要支援特定功能和輸入報告。 功能報告包括感測器的目前報告狀態、其狀態、變更敏感度和報告間隔(除了其他可能的屬性)。 輸入報告包含感測器讀數:開關的 True 或 False、加速計的 G-force 值或環境光線感測器的 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),