다음을 통해 공유


센서 HID 클래스 드라이버

Windows 8부터 Windows 운영 체제에는 HID 전송을 사용하여 통신하는 11가지 유형의 센서를 지원하는 기본 제공 센서 HID 클래스 드라이버(SensorsHIDClassDriver.dll)가 포함되어 있습니다.

지원되는 센서 목록은 다음과 같습니다.

  • 가속도계 3D
  • 주변 광원
  • 주변 온도
  • 대기압
  • 나침반 3D
  • 디바이스 방향
  • 자이로스코프 3D
  • 습도
  • 경사계 3D
  • 현재 상태
  • 근접

다음 그림에서는 두 센서 애플리케이션에서 드라이버 스택을 거쳐 하드웨어 자체로의 데이터 흐름을 보여 줍니다.

클라이언트 센서 아키텍처입니다.

사용자 지정 센서 지원

이전 목록에서 다루는 11개의 센서 외에도 클래스 드라이버는 Custom 클래스를 지원합니다. 이 클래스를 사용하면 센서 제조업체가 이전 목록에 없는 디바이스(예: 일산화탄소 센서)를 통합할 수 있습니다. 사용자 지정 센서는 고유한 속성을 가진 사용자 지정 디바이스로 센서 API에 자신을 제공합니다.

아키텍처 및 개요

호환되는 센서용 펌웨어를 만드는 경우 클래스 드라이버에서 지원하는 I/O 모델에 대한 기본적인 이해가 필요합니다.

  • 센서는 기능 보고서 또는 입력 보고서를 HID 클래스 드라이버에 보냅니다. 드라이버의 요청에 대한 응답으로 기능 보고서가 전송됩니다. 이 보고서에는 센서의 변경 민감도 설정, 보고서 간격 및 보고 상태를 포함한 속성 데이터가 포함됩니다. 입력 보고서는 요청 시 또는 이벤트에 대한 응답으로 비동기적으로 전송됩니다. 이 보고서에는 실제 센서 데이터가 포함되어 있습니다. 예를 들어 가속도계의 경우, 보고서에는 x축, y축 및 z축을 따라 G-포스가 포함됩니다.
  • HID 클래스 드라이버는 센서에 기능 보고서를 보냅니다. 예를 들어 애플리케이션이 새 변경 민감도 또는 보고서 간격을 요청하는 경우 드라이버는 이러한 값을 기능 보고서에 패키지하고 이 보고서를 사용하여 센서의 펌웨어에 요청을 보냅니다.

다음 다이어그램에서는 I/O 모델을 보여 줍니다.

i/o 모델입니다.

샘플 보고서 디스크립터

센서가 클래스 드라이버에 기본으로 적용되는 7가지 범주 중 하나를 지원하는 경우 해당 펌웨어는 특정 기능 및 입력 보고서를 지원해야 합니다. 기능 보고서에는 센서의 현재 보고 상태, 상태, 변경 민감도 및 보고 간격(기타 가능한 속성 외에)이 포함됩니다. 입력 보고서에는 스위치의 경우 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),