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的数据。
您还没有登录,请您登录后发表评论。