Compartilhar via


Driver de classe HID do sensor

Começando com Windows 8, o sistema operacional Windows inclui um driver de classe HID (SensorsHIDClassDriver.dll) do sensor in-box, que dá suporte a onze tipos de sensores que se comunicam usando o transporte HID.

Aqui está uma lista dos sensores com suporte:

  • Acelerômetro 3D
  • Luz ambiente
  • Temperatura ambiente
  • Pressão atmosférica
  • Compass 3D
  • Orientação do dispositivo
  • Giroscópio 3D
  • Umidade
  • Inclinômetro 3D
  • Presença
  • Proximidade

A ilustração a seguir ilustra o fluxo de dados entre dois aplicativos de sensor na pilha do driver e, por fim, para o próprio hardware.

arquitetura do sensor do cliente.

Suporte para sensores personalizados

Além dos onze sensores abordados nas listas anteriores, o driver de classe também dá suporte a uma classe Custom. Essa classe permite que um fabricante de sensor integre um dispositivo não encontrado na lista anterior: por exemplo, um sensor de monóxido de carbono. O sensor personalizado se apresenta à API do sensor como um dispositivo personalizado com propriedades exclusivas.

Arquitetura e visão geral

Se você estiver criando o firmware para um sensor compatível, precisará de uma compreensão básica do modelo de E/S compatível com o driver de classe.

  • O sensor envia um relatório de recurso ou um relatório de entrada para o driver de classe HID. Um relatório de recursos é enviado em resposta a uma solicitação do driver. Este relatório contém dados de propriedade, incluindo a configuração de confidencialidade de alteração do sensor, seu intervalo de relatório e seu estado de relatório. Um relatório de entrada é enviado mediante solicitação ou de forma assíncrona em resposta a um evento. Este relatório contém os dados reais do sensor. Por exemplo, para um acelerômetro, o relatório contém as forças G ao longo dos eixos x, y e z).
  • O driver de classe HID envia relatórios de recursos para o sensor. Por exemplo, quando o aplicativo solicita uma nova confidencialidade de alteração ou intervalo de relatório, o driver empacota esses valores em um relatório de recursos e usa esse relatório para enviar a solicitação para o firmware do sensor.

O diagrama a seguir ilustra o modelo de E/S:

Modelo de e/s.

Descritor de relatório de exemplo

Se o sensor der suporte a uma das sete categorias nativas do driver de classe, seu firmware precisará dar suporte a relatórios de entrada e recursos específicos. Os relatórios de recursos incluem o estado de relatório atual de um sensor, sua status, sensibilidade de alteração e intervalo de relatório (além de outras propriedades possíveis). Os relatórios de entrada contêm leituras de sensor: True ou False para um comutador, valores de força G para um acelerômetro ou LUX para um sensor de luz ambiente.

Relatório de recursos do acelerômetro de exemplo

O exemplo de código a seguir mostra o relatório de recursos HID para o acelerômetro. Observe a natureza auto-descritiva deste relatório. Ele inclui valores mínimos e máximos e a contagem e o tamanho de campos individuais.

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

Exemplo de relatório de entrada do acelerômetro

O exemplo de código a seguir mostra o relatório de entrada HID para o mesmo dispositivo. Novamente, observe a natureza auto-descritiva dos campos neste relatório.

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