Skip to main content

moregeek program

​你确定是你的驱动出问题了吗?-多极客编程

​你确定是你的驱动出问题了吗?_代码调试

在安卓驱动开发中,不少开发同事反馈的问题在定位后,我发现这些问题大多不是驱动本身的问题,而是开发者对驱动框架理解的不够透彻。比如有些开发者烧录到硬件板子中的镜像本身就不包含驱动的任何信息,有些开发者本地的代码中没有对应器件的驱动。

在这两种情况下,有些刚开始接触驱动的开发者已经开始进行基于硬件环境的调试,此时他们的硬件环境中是不存在对应的器件驱动的,该器件百分百是无法工作的。但经验不足的开发者甚至可能会消耗数天时间来排查器件不工作的原因,为了防止这种低端问题的再次出现,我整理了一份驱动检查表,其主要内容如下:


  • 你当前的软件代码中是否存在器件对应的驱动和设备树信息
  • 如不存在驱动和设备树,该如何处理
  • 如何确保你的驱动和设备树已正常编译
  • 如何确保你的镜像中包含正确使用的驱动和设备树
  • 如何确保烧录镜像后的硬件环境中,存在对应的驱动和设备树信息

以上这五项是环环相扣的,只有在上一步正确的前提条件下,才能进行下一步。

对于初级开发人员来说,强烈建议按照上面的步骤进行开发调试,因为许多初级人员无法像高级开发人员那样,可以从机器的状态和节点信息,快速推断出可能出问题的模块或者环节。接下来,我将详细的描述如何确认每一个环节。

PART 01

驱动和设备树信息确认及获取

对于安卓模式来说,项目中所用的大部分器件的驱动和设备树均需要从器件厂的FAE处获取,比如指纹,LCD,sensor,NFC。当我们拿到这类器件的设备树和驱动后,结合硬件原理图进行设备树的适配,把驱动和设备树放在本地代码相应位置处,然后进行编译配置进行编译即可。

除了上述类型的器件外,还有一类器件,比如SD卡驱动,按键驱动,指示灯驱动等会随着平台方(高通,展锐,MTK等)的基线进行释放,但也有例外,我最近从事的MTK平台的项目,其释放的基线中就不包含某一功能的驱动,最后我是从MTK平台索要的驱动代码,然后进行的功能调试。

对于一些特殊的定制化功能,可能就没有供应商,且平台默认也不支持这种功能,这种时候就需要自己编写驱动和设备树。

综上所述,假如当前代码中缺少对应平台的驱动和设备树,需要通过平台提供的渠道索要获取,其他驱动可以从器件供应商处获取。那么问题来了,我们如何判断当前代码是否已包含我们需要的驱动和设备树呢?

实际上,对于有经验的工程师来说,通常只看代码就能很快判断出是否缺少驱动或者设备树配置,毕竟他们对代码实现等已经很熟悉了。但对于新手来说,通常要先了解对应平台下某一模块代码架构和实现等,才能做出判断,下面是我入门时所采用的方式,供新手作为参考:

  • 从平台方MTK,高通或者展锐等提供的渠道中获取对应的文档,如下图所示,是我获取的MTK文档,这种方式获取的文档是比较权威的。

​你确定是你的驱动出问题了吗?_代码调试_02


  • 通过网络搜索相关系列教程,网上的内容比较繁多,而且系列教程的比例是比较少的。对于需要入门的开发者来说,尽量查找系列类教程。
  • 向别人请教,有些公司会有自己的代码架构,这种只能通过公司内部途径,或者自己看代码,文档来做进一步了解。

PART 02

驱动和设备树编译

实际上,编译是个庞大的系统,但在本文不打算说明编译相关内容,仅仅用来说明我们的驱动和设备树是否被编译到。

对于驱动来说,当进行编译后,会在特定路径下生成对应的中间文件,我们可以通过查看是否有中间文件,或者中间文件的时间戳是否更新,从而确认驱动是否已经编译。

下图中显示了中间文件的路径为:out/target/product/(项目对应路径)/obj/KERNEL_OBJ/drivers (图中省略了个人或者项目信息)。

​你确定是你的驱动出问题了吗?_设备树_03

对于设备树来说,当进行编译后,同样也可以在out路径中找到,如下图是采用在设备树编译的中间文件中查找关键字的方式,采用的命令是grep "cd-gpios" . –rn,此处查找的cd-gpios是SD卡相关功能中设备树中的配置项,从下图中可以看出当前我的SD卡对应的设备树确实已经编译,且采用的cd检测引脚是GPIO4。假如在设备树中修改了cd检测引脚,那么可以在编译后重新采用下图中的方式来确认修改是否生效。

​你确定是你的驱动出问题了吗?_代码调试_04

当发现驱动或者设备树没有编译,那就需要查看配置是否正确,此处要注意有些公司会对代码进行局部重构,重构后的代码对应的中间文件可能会因为编译脚本的原因而存在于其他路径,本文中仅仅说明上图中的两个标准路径,供大家学习了解。

PART 03

镜像中是否包含修改

镜像本质上是打包压缩,因其进行了压缩,所以无法使用grep等类似方式来查询镜像中是否进行了修改,要想确认是否包含了修改,可以采用反编译的方式,且大多数平台代码编译路径out/host/下是有对应的反编译工具,比如反编译dtbo.img(设备树相关镜像),就需要用到out/host下的反编译工具mkdtimg 和dtc,但是该方法不常见,通常我就是采用时间戳来进行简单判断,刷机时采用最近的镜像即可。

PART 04

判断硬件环境中是否

有对应驱动和设备树信息

我们得感谢内核的sys架构,我们的驱动和设备树均会在/sys/bus下的对应路径创建对应的节点信息,只有在该路径下对应的总线下能找到驱动和设备树信息(比如在/sys/bus/platform/device和/sys/bus/platform/driver),我们才可以开始调试驱动,否则你所做的驱动调试工作将是徒劳的。

如下图所示是在SPI总线(/sys/bus/spi)的drivers路径下查找到对应的驱动信息和在devices下找到的设备树信息。

​你确定是你的驱动出问题了吗?_开发者_05

在进行查找的时候,首先我们需要知道驱动和设备树对应的总线信息。上图中对应的驱动代码在加载的时候采用spi_register_driver函数来把对应驱动注册到spi总线,所以是在spi总线下查找对应的信息的。倘若您的代码中采用的是platform_driver_register函数,那么就应该在/sys/bus/platform总线下查找。若采用i2c_register_driver注册驱动,那么就应该在/sys/bus/i2c总线下查找。总之,您代码中使用的驱动注册函数就决定了您的驱动对应的总线信息,在对应总线下查找信息即可。

假如您的设备树是在spi节点下,那就需要在/sys/bus/spi/device下查找对应的设备树信息。假如您的设备是在I2C节点下,那就需要在/sys/bus/i2c/device下查找对应的设备树信息。总之,设备树中添加节点的位置就决定了您设备树对应的总线信息,需要在对应的总线下查找对应的设备信息。

PART 05

总结    

本文没有谈及设计驱动和设备树的任何编写注意事项或者技巧,也并非代码调试技巧,而是说明了在代码调试过程中的几个关键注意点,只有在这些关键点全部没问题的情况下,才能开始代码调试。

©著作权归作者所有:来自51CTO博客作者WOT技术大会的原创作品,请联系作者获取转载授权,否则将追究法律责任
​你确定是你的驱动出问题了吗?
https://blog.51cto.com/u_7390037/5363364

浅析 2D 组态与 2.5D 组态的区别 | 空调装配生产线与化工安全流程-多极客编程

为了更有效辨别 2D 与 2.5D 之间的区别,图扑软件选用 2D 空调装配生产线与 2.5D 化工厂安全流程作比较。通过自主研发的 HT 产品,采用 B/S 架构快速搭建零代码拖拽式 Web 组态可视化场景,以真实的场景化、图形化、动态化的效果,反映二者运行状态、工艺流程、动态效果之间的不同。2D 空调装配生产线空调装备整个装配过程包括机械的组装和小规模电气组装,需要经过多道工序,生产工程相较复

【服务器raid数据恢复】RAID5两块盘离线的数据恢复案例-多极客编程

服务器数据恢复环境: raid5磁盘阵列; 10块磁盘,单盘容量1TB; 6号盘是热备盘。服务器故障: 阵列中2块磁盘离线,黄色警报灯亮起。管理员对服务器初步检测,发现阵列磁盘序列号不能读取/无法通过扩展卡识别,初步推断磁盘物理故障。管理员联系我们数据恢复中心进行数据恢复。 ​服务器raid数据恢复过程: 1、服务器数据恢复工程师对故障服务器进行初检,发现该磁盘阵列故障情况比较复杂。正常硬盘和掉线

技术分享| 浅谈调度平台设计-多极客编程

前言 关于综合指挥调度系统的设计,其实和一般的管理信息软件开发有些区别,调度系统是一个软硬件一体化的定制化平台,数据来源于GPS设备发送。依赖的技术要包括IM、通信协议解析、地图定位开发、以及常规的前后端web技术等。本文着重聊一下web的调度台设计。 正文 1.首先要做的是界面设计,如何设计界面,本质上是信息数据的组合和搭配。因为平台要展示的数据信息不只是一个地图和一个坐标,而是将所与之相关的信

HBase Shell操作、HBase创建表、添加数据、查看表数据、操作列簇、删除表-多极客编程

1. HBase Shell操作连接集群hbase shell2. 创建表create 'user','base_info'3. 向表中添加数据put 'user', 'rowkey_10', 'base_info:username', '张三'put 'user', 'rowkey_10', 'base_info:birthday', '2014-07-10'put 'user','rowkey

平面设计有哪几种设计风格,分享平面设计的12种风格-多极客编程

平面设计有哪几种设计风格,分享平面设计的12种风格,在日常平面设计中,每个人都喜欢一些有创意设计的风格,这不仅会增加设计的吸引力,还可以增加设计的特色。不同的创意设计会给整个平面设计带来完全不一样的效果,本篇文章将举例平面设计的12种风格,最常见的可以增加创意设计的风格手法。平面设计的12种风格感觉收藏起来吧。 1、赛博朋克风格 经典的赛博朋克角色是边缘且性格疏远的独行者。他们生活在社会群体的边缘

apktool 反编译 apk 修改后打包-多极客编程

使用到的工具apktool_2.6.1autosignjdk 1.8第一步、解包(针对没有加壳的apk,加壳了的话需要脱壳)java -jar .\apktool_2.6.1.jar d .\apk名称.apk -o 解压出来路径第二步、修改然后根据需要修改xml文件和图片以及amali文件(这个文件修改有点难,网上有教程说先生产Java 源码再重新生成比较麻烦,只是解授权的话找到判断权限的if改

浅析 2D 组态与 2.5D 组态的区别 | 空调装配生产线与化工安全流程-多极客编程

为了更有效辨别 2D 与 2.5D 之间的区别,图扑软件选用 2D 空调装配生产线与 2.5D 化工厂安全流程作比较。通过自主研发的 HT 产品,采用 B/S 架构快速搭建零代码拖拽式 Web 组态可视化场景,以真实的场景化、图形化、动态化的效果,反映二者运行状态、工艺流程、动态效果之间的不同。2D 空调装配生产线空调装备整个装配过程包括机械的组装和小规模电气组装,需要经过多道工序,生产工程相较复

Install Nexus on centos7-多极客编程

​​https://blog.yasithab.com/centos/install-nexus-repository-oss-on-centos-7/ ​​Setting up Nexus RepositoryInstall prerequisitesyum install -y epel-release unzip wget rsync vimInstall openjdkyum instal

MDT8456部署Windows系列 (五): 技巧篇—自定义配置屏幕分辨率-多极客编程

前言 MDT以及SCCM中默认的屏幕分辨率为1024 x 768, 会导显示界面过大不美观或功能键显示不完整。 解决方法 以下方法均可以完成对 MDT 或 SCCM 的部署系统分辨率进行自定义配置 1.通过MDT Rule中的CustomSettings.ini定义指定分辨率 ;指定分辨率为 1280*1024 BitsPerPel=32 VRefresh=60 XResolution=128

apktool 反编译 apk 修改后打包-多极客编程

使用到的工具apktool_2.6.1autosignjdk 1.8第一步、解包(针对没有加壳的apk,加壳了的话需要脱壳)java -jar .\apktool_2.6.1.jar d .\apk名称.apk -o 解压出来路径第二步、修改然后根据需要修改xml文件和图片以及amali文件(这个文件修改有点难,网上有教程说先生产Java 源码再重新生成比较麻烦,只是解授权的话找到判断权限的if改

【LINUX】centos系统配置-sudoers用户权限管理-多极客编程

1、概述      由云数据库引发的一个思考,公司加强配置管理,则想通过apollo搭建一个配置中心;那么配置中心既可以方便配置,也可以方便查看配置。相关开发也有查询配置的权限,这里就会存在一个安全隐患。生产环境数据库的用户密码存在一定的风险,首先在设置生产环境项目访问数据库时,用户设置内网访问。但是测试环境开发环境与生产环境数据库都是同一个内网中,那么存在的安全隐患(开发通过配置中心看到的数据库

AIX主机系列:主机警告灯黄灯消除-多极客编程

近期遇见一个客户的IBM S系列小机亮黄灯警示灯,本以为两三条命令就可以消除,所以通过远程的方式进行操作,结果让客户确认发现命令执行完成后警示灯依旧存在。进一步排查,将警示灯消除,接下来将处理过程进行记录。小机黄灯警示灯如下图:图-1如图-1所示,四个灯从上到下代表系统上下电按建、设备定位指示灯、系统报警指示灯、小机硬件告警指示灯。收到图片后马上远程登录到小机系统进行查看,具体处理过程如下:1、查