Android8.1上Sensor传感器驱动--HAL层

1.简述

  基于展锐W377平台上进行,HAL层主要作用是将Linux内核层的数据,翻译成可供Framwork层识别的数据。 比如:将Gsensor传感器的三轴加速度,翻译成sensors_event_t结构体。 核心总结:

  • 1.1 内核驱动做input上报
  • 1.2 vendor HAL读input节点,翻译成sensors_event_t
  • 1.3 SensorService 只接收 sensors_event_t
  • 1.4 APP层只能拿到SensorService分发的数据

理解:   vendor里面,将Linux驱动里面的input device翻译成sensors_event_t, 这个结构体是传感器数据的“标准包裹”。

2.具体构造展示

  从代码结构角度进行,首先理解清楚sensors_event_t 结构体(Framework层需要的数据)

2.1 sensors_event_t 结构体

代码路径:hardware/libhardware/include/hardware/sensors.h (在hardware层h文件里面定义)

typedef struct sensors_event {
    // 版本号(必须 = sizeof(sensors_event_t))
    uint32_t version;

    // 传感器识别号(对应哪个传感器)//传感器handle,0代表第一个传感器
    int32_t sensor;

    // 传感器类型:加速度、陀螺仪、地磁等
    int32_t type;

    // 时间戳(非常重要)
    int64_t timestamp;

    // 数据:最多 16 个 float
    union {
    float           data[16];
    // ... 其他
    };
} sensors_event_t;

2.2 Vendor里面的SensorBase

这个定义传感器可以继承这个基础,我们这里使用的是厂商的HAL层,在vendor里面(和厂商有关)

struct sensors_event_t;

    class SensorBase {
    ....
     public:
            SensorBase(const shub_drv_cfg_t &drvCfg, int defer);
            virtual ~SensorBase();

            virtual int readEvents(sensors_event_t* data, int count) = 0;
            virtual bool hasPendingEvents() const;
            virtual int getFd() const;
            virtual int setDelay(int32_t handle, int64_t ns);
            virtual int setEnable(int32_t handle, int enabled) = 0;
            virtual int getEnable(int32_t handle) = 0;
            virtual int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
            virtual int flush(int32_t handle);
    };

重要纯虚函数说明,各类纯虚函数的调用时机。

2.2.1) readEvents
virtual int readEvents(sensors_event_t* data, int count) = 0;

调用时机:   这个在SensorService内部持续循环调用,传感器打开后,系统10ms~100ms 自动轮询,主要APP注册了传感器,就会一直调用。 这个函数主要要实现的内容,APP里面得到的数据都是来自这里。 主要内容:

  • 读取/dev/input/eventX
  • 填充sensors_event_t
  • 返回数据给上层
2.2.2)setEnable
virtual int setEnable(int32_t handle, int enabled) = 0;

调用时机:

  • APP调用registerListener()---->触发enable=1
  • APP调用unregisterListerner()---->触发enable=0 作用: 打开、关闭传感器的接口 开、关时钟、供电、启动采集,对应驱动里面的enable
2.2.3)getEnable
virtual int getEnable(int32_t handle) = 0;

SensorService调用,查询传感器是否开启

2.2.4)flush
virtual int flush(int32_t handle);

立即将缓存的数据全部上报。

2.2.5)hasPendingEvents
virtual bool hasPendingEvents() const;

判断是否有未读数据。

3. SensorBase的区别

  vendor里面的SensorBase和hardware里面的SensorBase,功能完全一样 本质:都是将Linux input数据,翻译成sensors_event_t 区别:只有位置不同,归属不同

3.1 hardware里面数据定义

代码路径:hardware/libhardware/include/hardware/sensors.h google原生提供 定义的标准接口: struct sensors_poll_device_t 定义的标准数据结构:sensors_event

3.2 vendor层数据定义

代码路径:vendor/xxx/sensors/SensorBase.cpp/h 厂商自己复制过去 google标准接口的封装类 方便厂商快速实现传感器,不用重复写代码

4.总结

  这个HAL层主要就是将Linux内核数据,翻译层Framework的数据。