Android Wifi驱动移植

来源:互联网 发布:苹果6移动数据怎么设置 编辑:程序博客网 时间:2024/05/16 11:21

全志A20 Android Wifi驱动移植流程分析

在整理文档记录时发现去年干了这活,可惜当时没能好好的记录下来。现在回忆一下,应该也算是一点经验积累过程,顺便记录下来,以备查询。

其实安卓驱动和Linux驱动个人感觉也没那么神秘,说说这Andriod也是基于Linux内核开发的,那么Linux驱动能不能在Andriod上跑呢?答案是肯定的。只要在编译驱动的时候,将编译文件 Makefile 将源码路径指定为Android源码路径,其他和Linux驱动开发是一样的。只不过Android驱动多了一层 HAL(硬件抽象层),其实也没什么关系,其目的个人认为就是让Android上层应用开发人员不用关心底层C/C++实现过程,直接用Java搞定。这样多了一层肯定不好的一点就是响应速度。每个东西都有利弊,关键看要怎么用吧。

移植该驱动的原因是全志的A20开发板在前后不同时间更换了不同的wifi/蓝牙模组,这坑够深。就说为何在前些日子系统各方面调试正常后,过几天拿到新板子系统wifi不行了呢?并且官网也没有相应的更新说明,源码还是那个源码…

分析过程:
系统硬件配置:全志A20-ArmPCv30
更改后板载usb_wifi:rtl8723bu

有了以上两个点后,感觉最快找到相关驱动的不是官网,而是“淘宝”,只要找到相应型号,那么淘一下,顺便让淘宝店家给你驱动代码。快准稳。当时我就是这么干的。
拿到驱动代码后开始干。先看看驱动源码里面文档介绍

第一步:修改配置文件Makeile:在其中指定一些配置,之后make一下就OK
迫不及待想加载一下:

insmod 8723bu.ko

没反应?当然会是这样的结果,原因是之前的系统驱动默认编译成8723au型号的驱动,肯定没有生效嘛!这个问题来了,A20提供的可定制的源码要根据它的一个配置文件“sysconfig_fex”来进行编译并且里面指定了 wifi 硬件型号的选项。这问题清楚了,直接改配置文件就好嘛。呵呵,配置文件没有对应 8723bu型号的选项!老实点,打开source Insight 分析整个调用流程吧!

第二步:分析上层应用到下层应用的过程(这里没有指出wifi驱动的架构图)

图1

也就是说,我们顺着思路向下找,应该能从wifi.c文件中找到相关的突破口才对。可是茫茫人海,如何找到知己啊?直接从一个文件中找相关配置不靠谱。换个角度想一下,能不能利用内核上电时候打印的信息来查找一下呢?因为系统上电后对于平台设备来说有一个捕获的过程,那么我怀着侥幸的心里试一下看看wifi设备被加载后有没有打印处相关的消息来。果真有!这下简单了,把打印出来的消息在 source insight 源码工程里查找!这下找对人了,找到的是 usb_intf.c!看来这才是我们需要入手的货。

第二步:分析usb_intf.c文件

驱动分析流程

注意到这个是一个usb总线,在平台设备捕获时用到了 “wifi_pm_power()函数”,之后跳转到了 wifi_pm.c中;感觉离成功只差那么一丢丢了。

第三步:分析wifi_pm.c文件

根据上面的分析图可以容易追溯到在wifi上电函数中读取了配置文件中的选项,并挂载相应的平台设备:这里是平台总线设备与驱动的匹配过程。所以说我们一开始加载的驱动一点反应都没有,原因就是没有注册相应的平台设备。

思路理清楚,接下来就是修改配置选项和驱动源码了。如何修改?接下来还要顺一下每个文件的意思。修改也不能随便改对吧!在这里得总结一下驱动加载流程,这对我们修改来说是比较重要的!
驱动加载流程

第四步:理顺相关文件
理顺文件
为什么要看文件的功能说明呢?其实这是必须做的,源码有那么多个文件,哪个文件才是我们想要的,哪些不用的。一开始筛选,针对几个必要的文件进行分析,这才是重点,拒绝狐疑猜测!

第五步:修改文件

文件修改

对于 Boardconfig.mk文件,可以直接查看驱动代码中的文档说明,对着操作就行,该文件也是Android源码底层文件版级配置。好了,修改代码后从新编译系统文件。接着测试,当系统上电后(我这里没有直接编入内核中),敲如熟悉的指令

insmod 8723bu.ko

等待一下,查看网络情况:

ifconfig

wln0出现,证明移植成功啦!

总结: 这篇博文没有贴出相关源码,不过分析问题的思路和步骤才是重点,毕竟在不同平台上的代码是不一样的,但思想肯定是在的!对于驱动开发,感觉上很少有个人把整一个驱动代码完成吧,毕竟大家都在准守一个标准的模板架构,修改了也就是那么一点点硬件配置。驱动开发更多的还是移植,而不是推倒成熟稳定的架构重来。分析系统源码时,一定要清楚每个文件代表的模块,不要瞎搞,这是浩瀚的海洋!还有一点就是对于分析代码这回事,不能有马虎和不乐意的情绪,在看系统源码级的代码,其实对自身的代码风格影响也是潜移默化的。思维导图是帮助我们分析流程的一大利器,代码阅读器也是神器,得好好使。每次移植驱动,对与每个不同的驱动架构都是加深理解的过程。修改少部分代码就能完成不同硬件的驱动,这才是硬件抽象的本质。

0 0
原创粉丝点击