Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情

代码工程的GITHUB连接:点进进入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 对接芯片上行下行接口介绍


Linux Wi-Fi插入SD卡槽内发生的事情章节内容介绍如下,同时会引出Linux的bus/device/driver架构说明,接入内容如下
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
1)Linux bus/device/driver架构说明,主要是对Linux驱动框架做极少
2)基于NXP imx.6q板子强化bus/device/driver的架构
3)Linux MMC子系统说明
4)Linux插入卡槽前的代码流程
5)插入卡槽的代码流程

1. Linux bus/device/driver架构说明

在说明把Wi-Fi插入SD卡槽内之前,我们要先说明一个Linux的驱动架构,这对于我们分析SDIO驱动至关重要,我们要说的Linux驱动架构就是 bus/device/driver架构,如下图

下面我们就来分别研究下 bus, device ,driver

1.1 bus

Bus总线不是真正的硬件总线bus,只是一条虚拟总线,是纯软件层面的设计,bus总线的定义代码如下:
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
整个bus_type定义如下:
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
其中结构体函数指针match是一个关键函数,这个函数的作用是,不管是device还是driver加入到这个软件总线中,都会调用match函数来匹配名字,如果匹配到那么就调用driver中的probe函数。我们来看下match的实现(我的Linux Kernel版本是3.0.101)
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情

1.2 Device

Device是将一些硬件的信息放到一个结构体中,注册到bus总线上,方面match起来的时候driver使用,下面是device的结构体
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
其中resource可以存放一些硬件相关的信息,定义如下,另外,相关实例分析请看2.2小节
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
其中flag有这几种类型
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
介绍完这些,我们来看下,device是怎样添加到bus总线中
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
添加到bus中线后,匹配是否有driver,如果有就调用probe,没有就等待driver的添加,不做任何处理。

1.3 Driver

直接看下bus架构下的driver结构体,如下:
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
Driver添加到总线的代码如下
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
添加到bus中线后,匹配是否有device,如果有就调用probe,没有就等待device的添加,不做任何处理。

OK,用一张图总结一下bus/device/driver的架构如下:
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情

2. 基于bus/device/driver模型实例分析–Freescale(现nxp) i.mx6

因为手边的Linux板子是Freescale的imx.6,所以就拿i.mx6来说把,bus不在说,只是说下device和driver

2.1 Device

在board init的时候有以下两句代码
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
先看下其中的第二个参数是什么mx6q_qy_imx6s_sdx_data,我们SD card是用了SD3,所以只是看mx6q_qy_imx6s_sd3_data就行,看名字,我们大概明白了里面的配置:
1)配置card detect的GPIO
2)配置write protect的GPIO
3)不支持8 bus width
4)Card detect由host controller来做,不是额外的GPIO来做
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
那回过头来,看下imx6q_add_sdhci_usdhc_imx这个API
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
先看下参数imx6q_sdhci_usdhc_imx_data
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
其实这个东西不难,我们仔细来分析下,遇到imx6q_sdhci_usdhc_imx_data_entry我们就替换成imx_sdhci_usdhc_imx_data_entry
所以该结构体被第一步替换成这个模样
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情

在替换成这个模样
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
在被替换成这个模样
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
终于替换出来,再来看下里面的iobase定义定义
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情

不就是正好和imx6的编程手册里面的地址吻合吗?
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
在来看下中断的配置
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
完全吻合,也就是把一些硬件的信息放了进来
然后再看下函数imx_add_sdhci_esdhc_imx,我们还是只看sd card的,也就是sd3
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
其中imx_add_platform_device_dmamask就实现了我们上面的截图的大概,在贴一次
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
整个就把device添加成功了

2.2 Driver

Driver结构体为
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
也许你会很纳闷,不是说名字要相同吗,别急,还记得是判断两个地方吗,driver.name不同,去看看id_table呢?
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
懂了吧?一目了然!

3. MMC子系统

在介绍插入卡槽前发生的事情和插入卡槽后发生的事情之前,我觉得有必要说下MMC子系统,能更好的理解代码做的原因
你可能会纳闷为什么会linux driver下MMC,SD,SDIO为啥就统称为MMC,这是历史原因,因为当初有这个driver之前,只有MMC card,还没有SD和SDIO,我就一说,你就一听这个事情行了
继续回归主题MMC子系统
MMC子系统介绍
MMC代码分布
MMC子系统代码主要在drivers/mmc目录下,共有三个目录:
Card:存放闪存卡(块设备)的相关驱动,如MMC/SD卡设备驱动,SDIOUART,card在这里你可以把他看作我们的Marvell wifi chip
Host:针对不同主机端的SDHC、MMC控制器的驱动,这部分需要由驱动工程师来完成,host在这里你可以理解为imx.6
Core:整个MMC的核心层,这部分完成不同协议和规范的实现,为host层和设备驱动层提供接口函数。这个是伟大的程序员摘出来跟硬件无关的,是整个驱动的核心层,基本不用动
MMC子系统框架
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
Linux MMC子系统主要分成三个部分:
  MMC核心层:完成不同协议和规范的实现,为host层和设备驱动层提供接口函数。MMC核心层由三个部分组成:MMC,SD和SDIO,分别为三类设备驱动提供接口函数;
  Host 驱动层:针对不同主机端的SDHC、MMC控制器的驱动;
  Client 驱动层:针对不同客户端的设备驱动程序。如SD卡、T-flash卡、SDIO接口的GPS和wi-fi等设备驱动。

4. 插入卡槽前发生的事情code分析

Device和driver一旦匹配,就会调用driver的probe成员函数,下面我们来分析下
我们直接以截图来说明下调用关系
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情

5 插入卡槽后发生的事情code分析

同样以截图来说明下函数调用关系
Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情

Code是拿来看的,不是别人讲的,我列出调用关系是正确的引导你们一下,不至于走很多弯路