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架構說明,接入內容如下
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總線的定義代碼如下:
整個bus_type定義如下:
其中結構體函數指針match是一個關鍵函數,這個函數的作用是,不管是device還是driver加入到這個軟件總線中,都會調用match函數來匹配名字,如果匹配到那么就調用driver中的probe函數。我們來看下match的實現(我的Linux Kernel版本是3.0.101)
1.2 Device
Device是將一些硬件的信息放到一個結構體中,注冊到bus總線上,方面match起來的時候driver使用,下面是device的結構體
其中resource可以存放一些硬件相關的信息,定義如下,另外,相關實例分析請看2.2小節
其中flag有這幾種類型
介紹完這些,我們來看下,device是怎樣添加到bus總線中
添加到bus中線后,匹配是否有driver,如果有就調用probe,沒有就等待driver的添加,不做任何處理。
1.3 Driver
直接看下bus架構下的driver結構體,如下:
Driver添加到總線的代碼如下
添加到bus中線后,匹配是否有device,如果有就調用probe,沒有就等待device的添加,不做任何處理。
OK,用一張圖總結一下bus/device/driver的架構如下:
2. 基于bus/device/driver模型實例分析–Freescale(現nxp) i.mx6
因為手邊的Linux板子是Freescale的imx.6,所以就拿i.mx6來說把,bus不在說,只是說下device和driver
2.1 Device
在board init的時候有以下兩句代碼
先看下其中的第二個參數是什么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來做
那回過頭來,看下imx6q_add_sdhci_usdhc_imx這個API
先看下參數imx6q_sdhci_usdhc_imx_data
其實這個東西不難,我們仔細來分析下,遇到imx6q_sdhci_usdhc_imx_data_entry我們就替換成imx_sdhci_usdhc_imx_data_entry
所以該結構體被第一步替換成這個模樣
在替換成這個模樣
在被替換成這個模樣
終于替換出來,再來看下里面的iobase定義定義
不就是正好和imx6的編程手冊里面的地址吻合嗎?
在來看下中斷的配置
完全吻合,也就是把一些硬件的信息放了進來
然后再看下函數imx_add_sdhci_esdhc_imx,我們還是只看sd card的,也就是sd3
其中imx_add_platform_device_dmamask就實現了我們上面的截圖的大概,在貼一次
整個就把device添加成功了
2.2 Driver
Driver結構體為
也許你會很納悶,不是說名字要相同嗎,別急,還記得是判斷兩個地方嗎,driver.name不同,去看看id_table呢?
懂了吧?一目了然!
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 MMC子系統主要分成三個部分:
MMC核心層:完成不同協議和規范的實現,為host層和設備驅動層提供接口函數。MMC核心層由三個部分組成:MMC,SD和SDIO,分別為三類設備驅動提供接口函數;
Host 驅動層:針對不同主機端的SDHC、MMC控制器的驅動;
Client 驅動層:針對不同客戶端的設備驅動程序。如SD卡、T-flash卡、SDIO接口的GPS和wi-fi等設備驅動。
4. 插入卡槽前發生的事情code分析
Device和driver一旦匹配,就會調用driver的probe成員函數,下面我們來分析下
我們直接以截圖來說明下調用關系
5 插入卡槽后發生的事情code分析
同樣以截圖來說明下函數調用關系
Code是拿來看的,不是別人講的,我列出調用關系是正確的引導你們一下,不至于走很多彎路
總結
以上是生活随笔為你收集整理的Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 公历 农历_Java给定公历日
- 下一篇: 字典的操作方法