前情提要
这次是要换一个 wifi 芯片,就把这个换的过程记录下来,因为自己也是新手,很多东西都是自己一点点摸出来的,就希望一些东西能对跟我一样,新入门的人有些帮助,能快速入门。
基本设施
- 基于 君正 x1000e, halley2
- wifi 由原君正的换到 rtl8189es
- 切换前是用的 原厂 demo 板,切换后用的是新画的板子,上面是新的wifi 芯片
一步步的经历
首先可以确定的,在原来的 demo 板上,一切OK。wifi 都是正常的。开始换新的芯片,并且移植代码
代码移植
替换的新 rtl 芯片是供应商提供源码的,所以第一步是将源码放到内核中去编译。当然,编译一般会挺顺利,修改了源码中的配置,设置对应的编译器之类的。(源码是供应商的,所以只能说明思路,代码不能展示)
首次运行
当然,很明显,运行起来没有效果,wlan0 设备没有生成。接着就开始想是哪里的问题。这个 wifi 芯片是 sdio 接口的,看原理图,sdio 部分基本不管,那么可操作的就只有 PWR_EN 和 WAKEUP,看起来,WAKEUP 像是休眠之类的功能,问的供应商可以不管,那么就只有 PWR_EN 了,但是这个不管怎么设置都还是没有效果。
下面肯定就没有什么办法了,也不知道怎么弄了,那么就只有源码对比,我开始对比原来的实现,和现在的实现有什么区别,这么大的代码量,对比起来还是很难下手的。但是大家的接口都是一样的 sdio,所以其实想一想,肯定就是一些配置的问题,于是就从配置部分去考虑,其它的不用去处理。
代码分析
首先开始了解一下代码。之前一直看驱动,但是没有实践,所以有些东西,理解不了它在代码上是个什么展示方式,所以有时候别人给你提示你也不知道怎么弄,想问别人也不知道怎么问。
这里首先有个所谓的 platform 模型,这是说内核已经做好的 驱动和设备的对应框架结构,使用者只需要设计好驱动,配置一下设备就可以用了。而一般驱动都是由芯片厂商提供好。那么终端用户就只要去配置设备部分就可以了。
platform
device <----> driver
name ----- name
arch/xxx/xx driver/net/wireless/xxx