在未贴brcm4330芯片的情况下,invensense的sensor失效问题分析
来源:互联网 发布:计算机考研学校知乎 编辑:程序博客网 时间:2024/05/02 00:55
在未贴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加载动作和其对应的属性修改工作之间不要加入其他可能产生过大延时的操作即可。
另外一個修改方案是將bcmdhd.ko移动到inv-mpu-iio.ko之前,为了确认延时会导致问题,在bcmdhd.ko中增加延时到40秒,本以为这种情况下上层肯定会在打开sensor的节点时出错,但是却发现上层没有出错,因为这40秒的延时阻塞了上层应用的打开,直到这40秒延时结束,上层才开始执行。这说明init.rc中的内容必须全部执行完毕了,上层才会开始。
这样的话,上面的那个12s的分析也说不过去啊。。。。。
结论:
启动顺序问题。
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加载动作和其对应的属性修改工作之间不要加入其他可能产生过大延时的操作即可。
另外一個修改方案是將bcmdhd.ko移动到inv-mpu-iio.ko之前,为了确认延时会导致问题,在bcmdhd.ko中增加延时到40秒,本以为这种情况下上层肯定会在打开sensor的节点时出错,但是却发现上层没有出错,因为这40秒的延时阻塞了上层应用的打开,直到这40秒延时结束,上层才开始执行。这说明init.rc中的内容必须全部执行完毕了,上层才会开始。
这样的话,上面的那个12s的分析也说不过去啊。。。。。
- 在未贴brcm4330芯片的情况下,invensense的sensor失效问题分析
- $.getJSON在ie下失效的情况
- 解决Dropshadow滤镜在父容器有背景图片的情况下失效的问题
- Android应用在未启动的情况下无法收到指定广播的问题总结
- Android应用在未启动的情况下无法收到指定广播的问题总结
- Android应用在未启动的情况下无法收到指定广播的问题总结
- Android应用在未启动的情况下无法收到指定广播的问题总结
- CSS3 在使用Modernizr的情况下导致animation失效
- easyui datagrid在fitColumns="true"的情况下失效
- iscroll使用情况下click事件失效的问题
- 使用mongoVUE删除大量数据的情况下失效问题
- Notes邮件未读标记在用户未打开过邮件的情况下被修改为已读问题
- oracle 索引失效的情况分析
- 索引失效的情况
- 索引失效的情况
- 索引失效的情况
- 在windows 2008下QQ语音失效的问题
- 解决eWebEditor在ie8下上传失效的问题
- Android复选框(CheckBox)的现实
- Gtk+3.0 实现简单的俄罗斯方块
- Linux的IO性能监控工具iostat详解
- XML中何时使用元素何时使用属性
- 为现实高歌
- 在未贴brcm4330芯片的情况下,invensense的sensor失效问题分析
- 函数的参数中用二级指针
- 软件设计中什么是最重要的
- hdu 4639 2013多校第四场 hehe Fibonacci 数列,组合计数,字符串处理
- 程序员求职之道(《程序员面试笔试宝典》)之程序员的健康谁来保证?
- java基础对集合的理解
- C++实现矩阵类,实现了大部分矩阵运算功能,大家可以类比matlab
- 绝对定位布局管理器(AbsoluteLayout)此布局管理器已被废除
- 问题2:如何用一个for循环打印出一个二维数组?