HAL代码:
https://github.com/STMicroelectronics/STMems_Android_Sensor_HAL_IIO
https://www.st.com/content/st_com/zh/products/embedded-software/mems-and-sensors-software/drivers-for-mems/androidhal-iio.html
内核驱动代码:
https://github.com/STMicroelectronics/STMems_Linux_IIO_drivers/tree/linux-4.14.y-gh
增加uevent节点如下:
/sys/bus/iio/devices/iio:device0
/sys/bus/iio/devices/iio:device1
HAL层参考文档:
STMicroelectronics\SensorHAL_IIO\Documentation
编译指令:
mm sensors-defconfig
“make sensors-defconfig” Set to default configuration “make sensors-menuconfig” Text based color menus, radiolists & dialogs. “make sensors-cleanconf” Delete hal_config, hal_config.old and configuration.h files.
如何进入menuconfig:
source env.sh
export PLATFORM_VERSION=9
make sensors-menuconfig
生成路径:
out/target/product/mek_8q/obj_arm/SHARED_LIBRARIES/sensors.imx8_intermediates/sensors.imx8.so.toc
out\target\product\mek_8q\vendor\lib64\hw\sensors.imx8.so
过滤打印信息:
logcat -s SensorHAL
/dev下文件打不开
打印如下,怀疑是selinux权限问题:
01-01 00:00:13.326 2349 2349 D SensorHAL: 3 IIO devices available into /sys/bus/iio/devices/ folder.
01-01 00:00:13.326 2349 2349 D SensorHAL: "lsm9ds1_gyro": IIO device found and supported. Wake-up sensor: no
01-01 00:00:13.328 2349 2349 D SensorHAL: "lsm9ds1_magn": IIO device found and supported. Wake-up sensor: no
01-01 00:00:13.330 2349 2349 D SensorHAL: "lsm9ds1_accel": IIO device found and supported. Wake-up sensor: no
01-01 00:00:13.341 2349 2349 E SensorHAL: LSM9DS1 Gyroscope Sensor: Failed to open iio char device (/dev/iio:device1).
01-01 00:00:13.341 2349 2349 E SensorHAL: "lsm9ds1_gyro": failed to create HW sensor class.
01-01 00:00:13.341 2349 2349 E SensorHAL: LSM9DS1 Magnetometer Sensor: Failed to open iio char device (/dev/iio:device2).
01-01 00:00:13.341 2349 2349 E SensorHAL: "lsm9ds1_magn": failed to create HW sensor class.
01-01 00:00:13.341 2349 2349 E SensorHAL: LSM9DS1 Accelerometer Sensor: Failed to open iio char device (/dev/iio:device0).
01-01 00:00:13.341 2349 2349 E SensorHAL: "lsm9ds1_accel": failed to create HW sensor class.
01-01 00:00:13.341 2349 2349 D SensorHAL: 0 sensors available and ready.
selinux报错:
[ 530.748281] init: Service 'vendor.sensors-hal-1-0' (pid 3731) received signal 15
[ 530.755847] init: Sending signal 9 to service 'vendor.sensors-hal-1-0' (pid 3731) process group...
[ 530.765260] libprocessgroup: Successfully killed process cgroup uid 1000 pid 3731 in 0ms
[ 530.774552] init: starting service 'vendor.sensors-hal-1-0'...
[ 530.820472] type=1400 audit(156635
1060.028:2718): avc: denied { call } for pid=2253 comm="surfaceflinger" scontext=u:r:surfaceflinger:s0 tcontext=u:r:mediacodec:s0 tclass=binder permissive=1 b/77924251
[ 530.838455] type=1400 audit(1566351086.288:2719): avc: denied { read } for pid=4549 comm="android.hardwar" name="iio:device1" dev="tmpfs" ino=16734 scontext=u:r:hal_sensors_default:s0 tcontext=u:object_r:iio_device:s0 tclass=chr_file permissive=1
[ 530.860517] type=1400 audit(1566351086.288:2719): avc: denied { read } for pid=4549 comm="android.hardwar" name="iio:device1" dev="tmpfs" ino=16734 scontext=u:r:hal_sensors_default:s0 tcontext=u:object_r:iio_device:s0 tclass=chr_file permissive=1
[ 530.882399] type=1400 audit(1566351086.288:2720): avc: denied { open } for pid=4549 comm="android.hardwar" path="/dev/iio:device1" dev="tmpfs" ino=16734 scontext=u:r:hal_sensors_default:s0 tcontext=u:object_r:iio_device:s0 tclass=chr_file permissive=1
[ 530.904925] type=1400 audit(1566351086.288:2720): avc: denied { open } for pid=4549 comm="android.hardwar" path="/dev/iio:device1" dev="tmpfs" ino=16734 scontext=u:r:hal_sensors_default:s0 tcontext=u:object_r:iio_device:s0 tclass=chr_file permissive=1
[ 530.927244] type=1400 audit(1566351086.288:2721): avc: denied { ioctl } for pid=4549 comm="android.hardwar" path="/dev/iio:device1" dev="tmpfs" ino=16734 ioctlcmd=0x6990 scontext=u:r:hal_sensors_default:s0 tcontext=u:object_r:iio_device:s0 tclass=chr_file permissive=1
增加权限如下:
+++ b/android9.0.0/device/fsl/imx8q/sepolicy/hal_sensors_default.te
+allow hal_sensors_default iio_device:chr_file { ioctl read open };
设备加载了,但是app还是读不到数据:
01-01 00:00:12.893 2380 2380 D SensorHAL: "lsm9ds1_magn": IIO device found and supported. Wake-up sensor: no
01-01 00:00:12.894 2380 2380 D SensorHAL: "lsm9ds1_accel": IIO device found and supported. Wake-up sensor: no
01-01 00:00:12.895 2377 2377 I android.hardware.light@2.0-service: Registration complete for android.hardware.light@2.0::ILight/default.
01-01 00:00:12.895 2380 2380 D SensorHAL: "LSM9DS1 Gyroscope Sensor": injection mode not available.
01-01 00:00:12.896 2380 2380 D SensorHAL: "LSM9DS1 Gyroscope Sensor": created HW class instance, handle: 1 (sensor type: 4).
01-01 00:00:12.896 2380 2380 D SensorHAL: "LSM9DS1 Magnetometer Sensor": injection mode not available.
01-01 00:00:12.896 2380 2380 D SensorHAL: "LSM9DS1 Magnetometer Sensor": created HW class instance, handle: 2 (sensor type: 2).
01-01 00:00:12.896 2379 2379 I android.hardware.power@1.0-service: Registration complete for android.hardware.power@1.0::IPower/default.
01-01 00:00:12.896 2380 2380 D SensorHAL: "LSM9DS1 Accelerometer Sensor": injection mode not available.
01-01 00:00:12.896 2380 2380 D SensorHAL: "LSM9DS1 Accelerometer Sensor": created HW class instance, handle: 3 (sensor type: 1).
01-01 00:00:12.896 2380 2380 D SensorHAL: 3 sensors available and ready.
增加calibration权限错误:
must be associated with the "coredomain" attribute because they are executed
解决方案:
typeattribute STSensors coredomain;
磁力计读取数据异常,导致整机断电:
08-21 09:39:08.682 2379 2379 E SensorHAL: LSM9DS1 Magnetometer Sensor: Failed to write hw fifo watermark.
原因:中断被拉高后,一直无法拉低,将该输入引脚SPDIF0_RX改为pull-down,改成DRDY_M引脚后正常。
引脚配置:
pinctrl_hog: hoggrp {
fsl,pins = <
SC_P_SPDIF0_RX_LSIO_GPIO2_IO14 0x18000040 //magn irq pull-down
>;
};
读取状态寄存器:
加速度计:i2cget -f -y 2 0x6a 0x17
磁力计:i2cget -f -y 2 0x1c 0x27