다음을 통해 공유


센서 HID 클래스 드라이버

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

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

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

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

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

사용자 지정 센서 지원

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

아키텍처 및 개요

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

  • 센서는 기능 보고서 또는 입력 보고서를 HID 클래스 드라이버에 보냅니다. 드라이버의 요청에 대한 응답으로 기능 보고서가 전송됩니다. 이 보고서에는 센서의 변경 민감도 설정, 보고서 간격 및 보고 상태를 포함한 속성 데이터가 포함됩니다. 입력 보고서는 요청에 따라 전송되거나 이벤트에 대한 응답으로 비동기적으로 전송됩니다. 이 보고서에는 실제 센서 데이터가 포함되어 있습니다. 예를 들어 가속도계의 경우 보고서에는 x-, y-및 z축을 따라 G-forces가 포함됩니다.
  • 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),