代码工程的GITHUB连接:
https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi
1.Linux SDIO WIFI Marvell8801/Marvell88w8801(一) — 代码及文档介绍
2. Linux SDIO WIFI Marvell8801/Marvell88w8801(二) — Marvell88w8801驱动编译
3. Linux SDIO WIFI Marvell8801/Marvell88w8801(三) — Linux驱动以及组件的使用
4. Linux SDIO WIFI Marvell8801/Marvell88w8801(四) — Linux Wi-Fi架构
5. Linux SDIO WIFI Marvell8801/Marvell88w8801(五) — Linux SDIO API介绍
6. Linux SDIO WIFI Marvell8801/Marvell88w8801(六) — Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
7. Linux SDIO WIFI Marvell8801/Marvell88w8801(七) — Marvell Linux Wi-Fi driver初始化
8. Linux SDIO WIFI Marvell8801/Marvell88w8801(八) — Marvell Linux Wi-Fi driver 对接芯片上行下行接口介绍
关于本章主要介绍内容如下:
1)软件初始化流程
2)Init流程,主要是对firmware download做说明以及code flow画出一个图
首先这里我们不过多的解释Linux驱动模块的原理,你只要记住insmod sd8xxx.ko是运行了woal_init_module这个函数,module_init(woal_init_module);他是通过这里注册的
如果你想深入研究,那么就去看下Linux driver的开发甚至可以看下Linux kernel查看那下insmod的原理,我们的重点是研究Marvell Linux wifi driver,所以你只需要从woal_init_module这个分析开始
另外,补充一个知识点
sdio_register_driver(&wlan_sdio),其中wlan_sdio是这样的,内部是匹配vendor id,一旦匹配会调用wlan_sdio中的probe函数,这里我们先不关注这个API的内部怎么实现(事实上他是在kernel中实现),我们就假定认为他是匹配的,我们我们可以从woal_sdio_probe看起来,下面,我们贴出整个init的流程,我们只是分析重要部分,至于code逻辑部分大家可以自行查看代码,最后贴出大致流程供大家参考使用
整个init过程,我们已经在上图贴出,其中在step 1,2,3,4,5我们不在说明,自己看code,没有什么难度,第6点就是proc file的处理,proc相信稍微懂点Linux的都应该知道,每一个process(我们俗称进程)都在/proc下建立一个相应的目录,里面有一些process相关的信息,那么step 6就是处理这个的,CONFIG_PROC_FS这个宏相关的就是处理这个的,大家有兴趣可以看下,step 7主要就是download fw,我们一会开出一个小节重点介绍,step 8,9,10我们不做介绍,其中8,10就是我们之前介绍Linux wireless架构的IOCTL,WEXT,CFG80211(通过Libnl)的注册。
Fw status是0xfedc代表fw是runing状态,在上面的流程图中先检验的目的是:如果fw已经是runing状态,那么就没有必要再重新download一次
对应的code为:
如果runing状态就是直接不需要dowload fw了
我们着重看下没有在runing的处理流程,毕竟已经在runing的状态我们一般遇到的情况是MCU reset,但是chip没有掉电,这种情况还是比较少,我们通常是直接整个掉电
对于单一功能,我们不需要此步骤,此步骤是为了有几个功能的芯片(比如蓝牙,Wi-Fi二合一的芯片)
下面就到了正式download fw的代码了,主要在wlan_prog_fw_w_helper这个函数中,整个流程如下
对应的code如下
对应的代码是:
然后把获取到的fw len写到芯片中,对应的code为
最后在进行一次FW runing的检测,依然就是调用wlan_check_fw_status,只不过polling的次数有差异,整个fw download就完毕了,接下来我们看下init fw的command
在fw download完毕后,有一些命令需要下到芯片中去来控制芯片的一些行为,我们来看下都有哪些动作
这个小节我们只是需要知道都给芯片发送什么命令即可,至于发送给芯片或者从芯片接收的流程,我通常叫做上行(host<-card)下行(host->card)数据,我们在下一篇文章介绍,好了,开始介绍命令吧
在download fw完毕后,有一个很隐蔽的动作,如果不仔细看代码,可能我们都注意不到,那么就是
ret = priv->ops.init_cmd(priv, MTRUE);
其中里面的动作就是调用wlan_ops_sta_init_cmd和wlan_ops_uap_init_cmd
暂时先知道有这么一块东西就好,等到我们后面自己写驱动的时候都会涉及,如果想提前看,那么请参照firmware V14去看相关的命令格式,怎么发送下去的,我们在下篇文章说明
最后,我们贴出来整个代码流程,供代价参考
大致说明一下,缩进就是代表调用关系