Android8.1 MSM8909平台增加温度传感器

Android8.1 MSM8909平台增加温度传感器
物联网模块为了提高性价比,一般使用高通低端的MSM8909平台。最近在该平台的Android 8.1版本上调试了温度传感器,包括driver代码和HAL层,作个记录。
客户使用的是Microchip的AT30TS74(Atmel被Microchip收购),本来是很简单的I2c芯片,但是厂家没有提供驱动参考代码,适配android的驱动代码得自己写,有点坑。好吧,找个类似的传感器修改,先配置设备树:
Atmel@48 { //temperature sensor
compatible = “Atmel,AT30TS74”;
reg = <0x48>;
};
i2c地址和硬件原理图上的A2、A1、A0脚接法有关。
在驱动里注册i2c,注册input设备,再注册一个sensors_classdev设备:
data->cdev = sensors_cdev;
data->cdev.sensors_enable = at30ts74_enable_set;
data->cdev.sensors_poll_delay = at30ts74_poll_delay_set;
err = sensors_classdev_register(&data->input->dev, &data->cdev);
if (err) {
pr_err(“class device create failed: %d\n”, err);
goto error_class_sysfs;
}
这些是标准的套路不用多说。到了HAL层,由于MSM8909还是用的sensor老的HAL架构(新的平台架构已经走的是adsp模式),高通HAL层的温度传感器代码还得自己适配。还是坑啊。最接近的就是气压传感器了,对应的代码为hardware\qcom\sensors\Bmp180.cpp
可以自己参考这个修改一个温度传感器的,注意点:

  1. 使用标准的传感器app软件检测到的是SENSOR_TYPE_AMBIENT_TEMPERATURE
    该宏在kernel\include\linux\sensors.h中定义。
  2. 驱动注册中input设备的event类型需要设为ABS_MISC,这样和HAL中的类型匹配。
  3. sensors_classdev设备的名字最好和input设备的名字一致,因为在HAL层代码中会去比较这两个值:
    hardware\qcom\sensors\NativeSensorManager.cpp:
    if (strcmp(list->sensor->name, event_list[j].data_name) == 0) {
    list->data_path = strdup(event_list[j].data_path);
    break;
    }
    if (strcmp(event_list[j].data_name, type_to_name(list->sensor->type)) == 0) {
    list->data_path = strdup(event_list[j].data_path);
    }
    如果不一致,获取不到event事件的。

继续坑。android8.1上增加了SElinux子系统,调试过程中会出现HAL层去读取节点权限错误。可以在init.cpp中把SElinux改为permissive模式:
static bool selinux_is_enforcing(void)
{
if (ALLOW_PERMISSIVE_SELINUX) {
//return selinux_status_from_cmdline() == SELINUX_ENFORCING;
return SELINUX_PERMISSIVE;
}
//return true;
return false;
}
改完后,安装安卓手机传感器app,就可以读取到温度传感器了。
在这里插入图片描述
温度传感器显示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cornerstone1/article/details/93391169