sensor中间层 --- NativeSensorManager

本文详细分析了Android NativeSensorManager的实现,包括getNode、addDependency、initVirtualSensor、getEventPath等关键方法,阐述了如何通过sysfs节点获取sensor信息,以及虚拟sensor的初始化和事件处理流程,揭示了HAL如何与底层驱动交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NativeSensorManager

NativeSensorManager定义如下,

class NativeSensorManager : public Singleton<NativeSensorManager> {
friend class Singleton<NativeSensorManager>;
NativeSensorManager();
~NativeSensorManager();
struct sensor_t sensor_list[MAX_SENSORS];
struct SensorContext context[MAX_SENSORS];
struct SensorEventMap event_list[MAX_SENSORS];
•••

sensor_list表示每个sensor属性的数组;context表示每个sensor完整信息的信息,里面的每个SensorContext 类型的元素都完整的描述了

一个sensor 的所有信息,包括sensor设备节点路径和对应的event设备节点的路径等;event_list则为所有实际sensor的事件信息列表;

其它变量在分析具体代码的时候再讲述。

NativeSensorManager的getNode方法如下,

int NativeSensorManager:: getNode(char *buf, char *path, const struct SysfsMap *map) {
char * fret;
ssize_t len = 0;
int fd;
char tmp[SYSFS_MAXLEN];
•••

这个函数根据输入参数path(表示设备的节点路径)和map(描述节点下各个属性节点的信息)获取某个设备节点下的属性节点信息,path一般为/sys/class/sensors/xxxx(deivce)/xxx(node)的形式,如light sensor 的name节点,则为/sys/class/sensors/ltr559-light/name,读取该节点则会

调用到底层驱动的sensors_name_show函数,这里该函数会返回ltr559-light。

const struct SysfsMap NativeSensorManager::node_map[] = {
{offsetof(struct sensor_t, name), SYSFS_NAME, TYPE_STRING, 1}, 
{offsetof(struct sensor_t, vendor), SYSFS_VENDOR, TYPE_STRING,1},
{offsetof(struct sensor_t, version), SYSFS_VERSION, TYPE_INTEGER,1},
{offsetof(struct sensor_t, type), SYSFS_TYPE, TYPE_INTEGER, 1},
{offsetof(struct sensor_t, maxRange), SYSFS_MAXRANGE, TYPE_FLOAT,1},
•••

上面描述每个sensor驱动设备节点中的属性节点信息,所有sensor驱动设备都会包含上面的节点,HAL正是通过这些节点

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值