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读取数据。

  • 相关阅读:
    vue2.0 微信分享
    小程序开发:canvas在画布上滑动,页面跟着滑动问题
    前端AES解密
    vue2上传图片到OSS
    vue给不同环境配置不同打包命令
    vue页面绑定数据,渲染页面时会出现页面闪烁
    解决微信浏览器无法使用window.location.reload刷新页面
    vue列表拖拽组件 vue-dragging
    千万别在Java类的static块里写会抛异常的代码!
    linux shell的一些配置
  • 原文地址:https://www.cnblogs.com/lcw/p/3402816.html
Copyright © 2011-2022 走看看