zoukankan      html  css  js  c++  java
  • 【Android】Sensor框架HAL层解读

    Android sensor构建

      Android4.1 系统内置对传感器的支持达13种,他们分别是:加速度传感器(accelerometer)、磁力传感器(magnetic field)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、温度传感器(temperature)和距离传感器(proximity)等。

      Android实现传感器系统包括以下几个部分:

    1. java
    2. JNI 
    3. HAL层
    4. 驱动层

      各部分之间架构图如下:

      


    Sensor HAL层接口

      GoogleSensor提供了统一的HAL接口,不同的硬件厂商需要根据该接口来实现并完成具体的硬件抽象层。

      AndroidSensorHAL接口定义在:hardware/libhardware/include/hardware/sensors.h

      对传感器类型的定义:

    #define SENSOR_TYPE_ACCELEROMETER       1  //加速度传感器
    #define SENSOR_TYPE_MAGNETIC_FIELD       2  //磁力传感器
    #define SENSOR_TYPE_ORIENTATION           3  //方向
    #define SENSOR_TYPE_GYROSCOPE            4  //陀螺仪
    #define SENSOR_TYPE_LIGHT                  5  //环境光照传感器
    #define SENSOR_TYPE_PRESSURE              6  //压力传感器
    #define SENSOR_TYPE_TEMPERATURE          7  //温度传感器
    #define SENSOR_TYPE_PROXIMITY             8   //距离传感器
    #define SENSOR_TYPE_GRAVITY             9
    #define SENSOR_TYPE_LINEAR_ACCELERATION 10   //线性加速度
    #define SENSOR_TYPE_ROTATION_VECTOR     11
    #define SENSOR_TYPE_RELATIVE_HUMIDITY   12    //湿度传感器
    #define SENSOR_TYPE_AMBIENT_TEMPERATURE 13
    View Code

      传感器模块的定义结构体如下:

    struct sensors_module_t {
        struct hw_module_t common;
        int (*get_sensors_list)(struct sensors_module_t* module,
                struct sensor_t const** list);
    };
    View Code

      该接口的定义实际上是对标准的硬件模块hw_module_t的一个扩展,增加了一个get_sensors_list函数,用于获取传感器的列表。

      对任意一个sensor设备都会有一个sensor_t结构体,其定义如下:

    struct sensor_t {
        const char*     name;       //传感器名字
        const char*     vendor;
        int             version;     //版本
        int             handle;     //传感器的handle句柄
        int             type;       //传感器类型
        float           maxRange;   //最大范围
        float           resolution;    //解析度
        float           power;       //消耗能源
        int32_t         minDelay;    //事件间隔最小时间
        void*           reserved[8];   //保留字段,必须为0
    };
    View Code

      每个传感器的数据由sensors_event_t结构体表示,定义如下:

    typedef struct sensors_event_t {
        int32_t version;
        int32_t sensor;            //标识符
        int32_t type;             //传感器类型
        int32_t reserved0;
        int64_t timestamp;        //时间戳
        union {
            float           data[16];
            sensors_vec_t   acceleration;   //加速度
            sensors_vec_t   magnetic;      //磁矢量
            sensors_vec_t   orientation;     //方向
            sensors_vec_t   gyro;          //陀螺仪
            float           temperature;     //温度
            float           distance;        //距离
            float           light;           //光照
            float           pressure;         //压力
            float           relative_humidity;  //相对湿度
        };
        uint32_t        reserved1[4];
    } sensors_event_t;
    View Code

      其中,sensor为传感器的标志符,而不同的传感器则采用union方式来表示。

      sensors_vec_t结构体用来表示不同传感器的数据:

    typedef struct {
        union {
            float v[3];
            struct {
                float x;
                float y;
                float z;
            };
            struct {
                float azimuth;
                float pitch;
                float roll;
            };
        };
        int8_t status;
        uint8_t reserved[3];
    } sensors_vec_t;
    View Code

      Sensor设备结构体sensors_poll_device_t,对标准硬件设备hw_device_t结构体的扩展,主要完成读取底层数据,并将数据存储在struct sensors_poll_device_t结构体中;

      poll函数用来获取底层数据,调用时将被阻塞定义如下:

    struct sensors_poll_device_t {
    struct hw_device_t common;
    //Activate/deactivate one sensor
        int (*activate)(struct sensors_poll_device_t *dev,
                int handle, int enabled);
        //Set the delay between sensor events in nanoseconds for a given sensor.
        int (*setDelay)(struct sensors_poll_device_t *dev,
                int handle, int64_t ns);
        //获取数据
        int (*poll)(struct sensors_poll_device_t *dev,
                sensors_event_t* data, int count);
    };
    View Code

      控制设备打开/关闭结构体定义如下:

    static inline int sensors_open(const struct hw_module_t* module,
            struct sensors_poll_device_t** device) {
        return module->methods->open(module,
                SENSORS_HARDWARE_POLL, (struct hw_device_t**)device);
    }
     
    static inline int sensors_close(struct sensors_poll_device_t* device) {
        return device->common.close(&device->common);
    }
    View Code

    Sensor HAL实现

    打开设备时序图

      

      SensorDevice属于JNI层,与HAL进行通信的接口;

      JNI层调用了HAL层的open_sensors()方法打开设备模块,再调用poll__activate()对设备使能,然后调用poll__poll读取数据。

  • 相关阅读:
    POJ 1251 Jungle Roads
    1111 Online Map (30 分)
    1122 Hamiltonian Cycle (25 分)
    POJ 2560 Freckles
    1087 All Roads Lead to Rome (30 分)
    1072 Gas Station (30 分)
    1018 Public Bike Management (30 分)
    1030 Travel Plan (30 分)
    22. bootstrap组件#巨幕和旋转图标
    3. Spring配置文件
  • 原文地址:https://www.cnblogs.com/lcw/p/3402816.html
Copyright © 2011-2022 走看看