1.调试QMI8658

参考demo,添加QMI8610相关内容

展讯-QMI8658和气压传感器驱动调试_数据

当前驱动路径位于:bsp/modules/input/misc/qmi8610/qmi8610.c

编译使用make sockoimage

用fastboot烧录

1.确定驱动被正常加载

代码添加之后,首先确定有没有进入当前驱动文件

dmesg |grep QmiImu_i2c_probe

展讯-QMI8658和气压传感器驱动调试_数据_02

因为传感器型号不一样,需要参考demo代码,移植相关代码过去,这个过程不描述了,先保证编译不报错。

2.寄存器地址修改

主要是能正常读取设备的ID,以及确定传感器获取的值在哪个位置

代码里面有相关的测试节点

展讯-QMI8658和气压传感器驱动调试_bc_03

对应:/sys/devices/virtual/input/input6

通过测试接口,读取设备ID以及传感器的值,确定i2c底层接口正常

展讯-QMI8658和气压传感器驱动调试_权限问题_04

3.看传感器状态

进测试模式,或者使用传感器APP

展讯-QMI8658和气压传感器驱动调试_android_05

看数据是不是正常变化的

调试遇到两个问题

1.数值在乱飘,特别是Y轴数据在乱跑

这个查明,返回的数据,需要状态寄存器是可读的时候,不能随便上传

2.X和Y轴不对应

这个需要在驱动层做一下转换

2.气压传感器

1.判断驱动被正常加载

展讯-QMI8658和气压传感器驱动调试_android_06

2.查看内核数据是否正常

展讯-QMI8658和气压传感器驱动调试_数据_07

3.移植的时候,遇到无法开机的问题

查看日志文件

11-03 13:37:57.879  1688  1688 D pressure-qmp6988: input path : /sys/class/input/input7/name
11-03 13:37:57.879  1688  1688 D pressure-qmp6988: name: gyroscope
11-03 13:37:57.879  1688  1688 D pressure-qmp6988: input path : /sys/class/input/input5/name
11-03 13:37:57.880  1688  1688 D pressure-qmp6988: name: compass
11-03 13:37:57.880  1688  1688 D pressure-qmp6988: input path : /sys/class/input/input3/name
11-03 13:37:57.880  1688  1688 D pressure-qmp6988: name: sprdphone Headset Ja
11-03 13:37:57.880  1688  1688 F libc    : FORTIFY: strlen: detected read past end of buffer
11-03 13:37:57.880  1688  1688 F libc    : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 1688 (android.hardwar), pid 1688 (android.hardwar)

从logcat来看,这里出现了问题

通过shell读取input3的name

发现少了2个字符,初步判断是数组越界了

找到对应代码

vendor/sprd/modules/sensors/libsensorclassic/press/Press_qmp6988.cpp

展讯-QMI8658和气压传感器驱动调试_权限问题_08

4.权限问题

遇到内核层有数据,但是应用层没拿到数据的问题

展讯-QMI8658和气压传感器驱动调试_权限问题_09

判断是权限问题,找到对应位置

展讯-QMI8658和气压传感器驱动调试_数据_10

目前应用层的权限是只读

给权限chmod 777 *

数据能正常上传

展讯-QMI8658和气压传感器驱动调试_bc_11

去代码里面修改设备权限问题

bsp/modules/input/misc/qmp6988/qmp6988.c

static DEVICE_ATTR(init, 0666, show_init_value, NULL);
static DEVICE_ATTR(chipinfo, 0666, show_chipinfo_value, NULL);
static DEVICE_ATTR(sensordata, 0666, show_sensordata_value, NULL);
static DEVICE_ATTR(press, 0666, show_press_value, NULL);
static DEVICE_ATTR(trace, 0666, show_trace_value, store_trace_value);
static DEVICE_ATTR(selftest, 0666, show_selftest_value, NULL);
static DEVICE_ATTR(dumpinfo, 0666, show_dumpinfo_value, NULL);
static DEVICE_ATTR(calidata, 0666, show_calidata_value, NULL);
static DEVICE_ATTR(enable, 0666, show_enable_value, store_enable_value);
static DEVICE_ATTR(delay, 0666, show_delay_value, store_delay_value);

static DEVICE_ATTR(install, 0666, qmp6988_status_show, NULL);
static DEVICE_ATTR(value, 0666, show_press_value, NULL);
static DEVICE_ATTR(control, 0666, qmp6988_control_show, qmp6988_control_store);

上面的内容,直接编译会报错,需要修改内核文件

bsp/kernel/kernel4.14/include/linux/kernel.h

展讯-QMI8658和气压传感器驱动调试_android_12

还要修改

bsp/kernel/kernel4.14/fs/sysfs/group.c

展讯-QMI8658和气压传感器驱动调试_bc_13

烧录之后正常

展讯-QMI8658和气压传感器驱动调试_数据_14