今天我把我开发的内核传感器驱动用模块模式进行了编译,但是当我在使用测试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会变得更好用。希望这篇博文能给大家一点帮助。


更多相关文章

  1. Android(安卓)如何将layout和drawable文件分文件夹存放(查看
  2. Android(安卓)mp3音乐播放器实例-----概述
  3. Android(安卓)Library 工程实现模块复用 (代码及资源文件)
  4. 魅族J.Wong愿意提供M8 Android驱动,期待民间开发
  5. Android(安卓)10适配要点,作用域存储
  6. 为Android的apk应用程序文件加壳以防止反编译的教程
  7. android动态加载class文件(DexClassLoader可从SD卡加载)(android插
  8. [置顶] 写了个Android聊天客户端框架,基本聊天功能、数据库、服务
  9. 深入探索 Android(安卓)包体积优化(匠心制作)

随机推荐

  1. SQL字符串处理函数大全
  2. SQL Server数据库重命名、数据导出的方法
  3. SQLSERVER ISNULL 函数与判断值是否为空
  4. C#连接Excel2003和Excel2007以上版本做数
  5. 关于sql和mysql对于别名不能调用的一些理
  6. MS SQL Server数据库清理错误日志的方法
  7. SQL查询某列指定长度的字符串多余的用省
  8. mssqlserver恢复ldf文件数据的方法
  9. sql server获得新记录标识列值的二种方法
  10. Microsoft SQL Server 2012 数据库安装图