今天我把我开发的内核传感器驱动用模块模式进行了编译,但是当我在使用测试APL时却无法启动传感器来获取数据。当时还没有认识到问题出在哪里,所以进行了很多无谓调查。
我先是想到了,在Android启动过程中要给内核驱动加载生成的设备属性文件设置权限,但是设备属性文件是在内核驱动结果体的probe函数中进行生成的,所以在驱动模块没有加载是给内核驱动加载生成的设备属性文件设置权限是无效的。
于是我又在手动加载驱动后,手动进行设备属性文件设置权限,然而Android HAL层还是无法获得底层驱动的数据,这时才意识到问题的严重性。
我通过 “cat /proc/kmsg” 命令发现底层驱动是能够取到传感器数据,至于传感器的Android HAL代码是在libsensor目录下,之前曾大概阅读过这段代码,那么问题肯定是出在这里了,并且肯定是出在Input子系统中。在Android传感器驱动的整个架构中,底层Linux驱动与Android HAL层是通过Input子系统进行数据传递的。
重新察看Android HAL层代码,发现我的Sensor实现的类XXXXXSensor的构造函数里进行了对Input子系统的设备名进行了赋值。XXXXXSensor 类是继承于 SensorBase 类,SensorBase 类的构造函数里根据Input子系统的设备名打开相应的Input子系统的设备文件,生成文件标示符。在sensors.cpp 里, 在构造sensor列表时会生成各种sensor的对象,此时就会生成文件标示符。但kernel的驱动以模块的模式编译并没有及时加载时,生成的Input子系统的文件标示符就是空的,从而导致了Android HAL层还是无法获得底层驱动的数据。
根据以上情况,我认为Android HAL层的代码有多可以改进的空间,设计上可以更精妙一些,相信不久之后Android会变得更好用。希望这篇博文能给大家一点帮助。