整理以前的一些bug,发现自己曾经碰到的一个问题,有必要分享到博客。
[1.Root Cause ]:在未贴brcm4330芯片的情况下,invensense的sensor失效问题分析
结论:
启动顺序问题。
sensor的上层应用会在启动过程中试图打开invensense的sys文件接口。
invensense驱动目前以ko方式通过init.rc进行加载,并在加载完成后在init.rc文件中通过chmod和chown设置其对应的文件节点属性。
如果上层在尝试打开invensense的sys文件接口时,上述的这些invensense驱动创建的sys文件节点的属性还没有设置成功,则会导致上层调用出错,表现为:
E/Sensors ( 341): HAL:Open of /sys/bus/iio/devices/iio:device0/power_state failed with 'Permission denied' (13)
E/Sensors ( 341): HAL:enable_sysfs_sensor - write 1 returned -1 (Invalid argument / 22)
E/Sensors ( 341): HAL:Open of /sys/bus/iio/devices/iio:device0/power_state failed with 'Permission denied' (13)
E/Sensors ( 341): HAL:enable_sysfs_sensor - write 1 returned -1 (Invalid argument / 22)
这些权限错误会导致上层应用无法使用。但是,这并不会影响invensense驱动。invensense的驱动依然是正常工作的。只是上层曾经打开对应接口失败了,便不能再使用驱动的功能了。
根本原因:
在init.rc中对应的ko的加载和对应的文件节点的属性修改动作并没有放在一起:
==================== cut here =============================
on boot
insmod /system/lib/modules/inv-mpu-iio.ko
insmod /system/lib/modules/bcmdhd.ko
chown system system /dev/iio:device0inv-mpu-iio.ko
chown system system /sys/bus/iio/devices/trigger0/name
chown system system /sys/bus/iio/devices/iio:device0/accl_bias
chown system system /sys/bus/iio/devices/iio:device0/accl_enable
chown system system /sys/bus/iio/devices/iio:device0/accl_matrix
chown system system /sys/bus/iio/devices/iio:device0/buffer/length
==================== cut here =============================
注意到在inv-mpu-iio.ko加载动作和invensense的对应文件节点属性设置动作之间插入了一个bcmdhd.ko,这是brcm4330的驱动,这个驱动在加载失败的情况下会触发一个12s的等待。
而init.rc文件的执行是顺序的。因此,在未贴brcm芯片的情况,bcmdhd.ko会加载失败,并导致12s延时。
即:在inv-mpu-iio.ko加载后12s,其对应的iio目录下的sys文件节点属性才会被更改。而在这12s期间,上层应用可能已经试图打开这些节点,但因为属性未符合要求,会打开失败。表现为上层sensor对应的功能失效,但是驱动却是OK的。
修改方案:
确保inv-mpu-iio.ko加载动作和其对应的属性修改工作之间不要加入其他可能产生过大延时的操作即可。
[2.Resolution ]:见上
[3.Testing Suggestion]:none
[4.Regression Failed Reason](Optional):
[5.Process Analysis Review](Optional):
[6.SideEffect](Optional):