Platform: RockChip
OS: Android 6.0
Kernel: 4.4
WiFi/BT/FM 模組: AP6354
前面的基本概念搜羅于網(wǎng)絡(luò);
后面的驅(qū)動(dòng)流程分析是根據(jù) RockChip 3399 的 Kernel 部分來進(jìn)行分析的。
本博客唯一地址:http://blog.csdn.net/dearsq/article/details/53318887
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者 Younix~ 謝謝~
wifi 英文全稱是 WIreless-FIdelity,翻譯成中文就是無線保真,英文簡稱WiFi。
wlan 英文全名:Wireless Local Area Networks, 無線局域網(wǎng)絡(luò)。
wifi 是實(shí)現(xiàn) wlan 的一種技術(shù)。
AP模式: Access Point,提供無線接入服務(wù),允許其它無線設(shè)備接入,提供數(shù)據(jù)訪問,一般的無線路由/網(wǎng)橋工作在該模式下。AP和AP之間允許相互連接。
Sta模式: Station, 類似于無線終端,sta本身并不接受無線的接入,它可以連接到AP,一般無線網(wǎng)卡即工作在該模式。
STA(工作站)啟動(dòng)初始化、開始正式使用AP傳送數(shù)據(jù)幀前,要經(jīng)過三個(gè)階段才能夠接入(802.11MAC層負(fù)責(zé)客戶端與AP之間的通訊,功能包括掃描、接入、認(rèn)證、加密、漫游和同步等功能):
1)掃描階段(SCAN)
2)認(rèn)證階段 (Authentication)
3)關(guān)聯(lián)(Association)
更詳細(xì)的 wifi 相關(guān)介紹可以參考這篇文章 WiFi基礎(chǔ)知識(shí)解析
后面介紹 Wifi 的接口 SDIO 的基本概念。
SD (Secure Digital) 與 MMC (Multimedia Card)
MMC 是較早的一種記憶卡標(biāo)準(zhǔn),目前已經(jīng)被 SD 標(biāo)準(zhǔn)取代。
SD 是一種 flash memory card 的標(biāo)準(zhǔn),也就是一般常見的 SD 記憶卡。
SDIO 就是 SD 的 I/O 接口的意思。
更具體的說,SD 本來是記憶卡的標(biāo)準(zhǔn),但是現(xiàn)在也可以把 SD 拿來插上一些外圍接口使用,這樣的技術(shù)便是 SDIO。
SDIO 通過 SD 的 I/O 管腳來連接外部的外圍 device 并傳輸數(shù)據(jù)。這些外圍設(shè)備,我們稱為 SDIO 卡,常見的有:
SD卡使用的是SD卡協(xié)議,而SDIO卡使用的是SDIO協(xié)議!
協(xié)議不一樣,初始化/讀寫方式也不一樣!
SDIO-Wifi 模塊是基于 SDIO 接口的符合 wifi 無線網(wǎng)絡(luò)標(biāo)準(zhǔn)的嵌入式模塊,內(nèi)置無線網(wǎng)絡(luò)協(xié)議IEEE802.11協(xié)議棧以及TCP/IP協(xié)議棧,能夠?qū)崿F(xiàn)用戶主平臺(tái)數(shù)據(jù)通過SDIO口到無線網(wǎng)絡(luò)之間的轉(zhuǎn)換。
SDIO 具有傳輸數(shù)據(jù)快,兼容SD、MMC接口等特點(diǎn)。
對于SDIO接口的wifi,首先,它是一個(gè)sdio的卡的設(shè)備,然后具備了wifi的功能。
所以,注冊的時(shí)候還是先以sdio的卡的設(shè)備去注冊的。然后檢測到卡之后就要驅(qū)動(dòng)他的wifi功能。
SDIO總線 和 USB總線 類似,SDIO也有兩端,其中一端是HOST端,另一端是device端。所有的通信都是由HOST端 發(fā)送 命令 開始的,Device端只要能解析命令,就可以相互通信。
CLK信號(hào):HOST給DEVICE的 時(shí)鐘信號(hào),每個(gè)時(shí)鐘周期傳輸一個(gè)命令。
CMD信號(hào):雙向 的信號(hào),用于傳送 命令 和 反應(yīng)。
DAT0-DAT3 信號(hào):四條用于傳送的數(shù)據(jù)線。
VDD信號(hào):電源信號(hào)。
VSS1,VSS2:電源地信號(hào)。
SDIO總線上都是HOST端發(fā)起請求,然后DEVICE端回應(yīng)請求。
SDIO 命令由6個(gè)字節(jié)組成。
a – Command:用于開始傳輸?shù)拿?,是由HOST端發(fā)往DEVICE端的。其中命令是通過CMD信號(hào)線傳送的。
b – Response:回應(yīng)是DEVICE返回的HOST的命令,作為Command的回應(yīng)。也是通過CMD線傳送的。
c – Data:數(shù)據(jù)是雙向的傳送的??梢栽O(shè)置為1線模式,也可以設(shè)置為4線模式。數(shù)據(jù)是通過DAT0-DAT3信號(hào)線傳輸?shù)摹?/p>
SDIO的每次操作都是由HOST在CMD線上發(fā)起一個(gè)CMD,對于有的CMD,DEVICE需要返回Response,有的則不需要。
對于讀命令,首先HOST會(huì)向DEVICE發(fā)送命令,緊接著DEVICE會(huì)返回一個(gè)握手信號(hào),此時(shí),當(dāng)HOST收到回應(yīng)的握手信號(hào)后,會(huì)將數(shù)據(jù)放在4位的數(shù)據(jù)線上,在傳送數(shù)據(jù)的同時(shí)會(huì)跟隨著CRC校驗(yàn)碼。當(dāng)整個(gè)讀傳送完畢后,HOST會(huì)再次發(fā)送一個(gè)命令,通知DEVICE操作完畢,DEVICE同時(shí)會(huì)返回一個(gè)響應(yīng)。
對于寫命令,首先HOST會(huì)向DEVICE發(fā)送命令,緊接著DEVICE會(huì)返回一個(gè)握手信號(hào),此時(shí),當(dāng)HOST收到回應(yīng)的握手信號(hào)后,會(huì)將數(shù)據(jù)放在4位的數(shù)據(jù)線上,在傳送數(shù)據(jù)的同時(shí)會(huì)跟隨著CRC校驗(yàn)碼。當(dāng)整個(gè)寫傳送完畢后,HOST會(huì)再次發(fā)送一個(gè)命令,通知DEVICE操作完畢,DEVICE同時(shí)會(huì)返回一個(gè)響應(yīng)。
對于 Wifi 模組的 Android 上層的分析,這篇文章講的非常不錯(cuò):
http://blog.csdn.net/ylyuanlu/article/details/7711433
這篇文章將下圖藍(lán)色的和綠色的部分講的非常詳細(xì)。
我這個(gè)板子上所采用的 WiFi 模組是 AP6354, 它是一個(gè) Wifi / BT4.0 / FM 三合一模組。接口是 SDIO。
本文主要分析 Kernel Driver 部分。所以先從 SDIO 接口的驅(qū)動(dòng)來切入。
SDIO 接口的 wifi,首先,它是一個(gè) sdio 卡 設(shè)備,然后具備了 wifi 的功能,所以 SDIO 接口的 WiFi 驅(qū)動(dòng)就是在 wifi 驅(qū)動(dòng) 外面套上了一個(gè) SDIO 驅(qū)動(dòng) 的外殼。
SDIO 驅(qū)動(dòng)部分代碼結(jié)構(gòu)如下
drivers/mmc 下有 mmc卡、sd卡、sdio 卡驅(qū)動(dòng)。
SDIO驅(qū)動(dòng)仍然符合設(shè)備驅(qū)動(dòng)的分層與分離思想。
設(shè)備驅(qū)動(dòng)層(wifi 設(shè)備):
|
核心層(向上向下提供接口)
|
主機(jī)驅(qū)動(dòng)層(實(shí)現(xiàn) SDIO 驅(qū)動(dòng))
我們主要關(guān)心 core 目錄(CORE 層),其中是媒體卡的通用代碼。包括 core.c host.c stdio.c。
CORE 層完成了
1. 不同協(xié)議和規(guī)范的實(shí)現(xiàn)
2. 為 HOST 層的驅(qū)動(dòng)提供了接口函數(shù)
3. 完成了 SDIO 總線注冊
4. 對應(yīng) ops 操作
5. 以及支持 mmc 的代碼
host 目錄(HOST 層)是根據(jù)不通平臺(tái)而編寫的 host 驅(qū)動(dòng)。
rockchip_wifi_init_module_rkwifi //創(chuàng)建了一個(gè)內(nèi)核線程 wifi_init_thread
—wifi_init_thread //->
——dhd_module_init
———dhd_wifi_platform_register_drv // 查找設(shè)備,注冊 wifi 驅(qū)動(dòng),注冊成功調(diào)用后面的 bcmdhd_wifi_plat_dev_drv_probe
————wifi_ctrlfunc_register_drv
————|—bus_find_device //查找 wifi 設(shè)備
————|—platform_driver_register(&wifi_platform_dev_driver) //注冊 wifi 驅(qū)動(dòng)
————bcmdhd_wifi_plat_dev_drv_probe //->
—————dhd_wifi_platform_load //兩個(gè)操作
——————wl_android_init //1. wlan 初始化
——————dhd_wifi_platform_load_sdio //2. 根據(jù) 接口類型 usb、sdio、pcie 選擇不同的操作
———————dhd_bus_register // 注冊成功就調(diào)用 dhd_sdio.dhdsdio_probe
————————bcmsdh_register(&dhd_sdio)
————————|—bcmsdh_register_client_driver
————————|——sdio_register_driver(&bcmsdh_sdmmc_driver) //注冊成功調(diào)用 bcmsdh_sdmmc_probe
————————|———bcmsdh_sdmmc_probe //->
————————|———sdioh_probe
————————dhdsdio_probe
參考文章
在全志平臺(tái)調(diào)試博通的wifi驅(qū)動(dòng)(類似ap6212)
wifi 詳解(三)
dts文件的配置wifi部分是在net/rfkill-wlan.c中進(jìn)行配置;先通過內(nèi)核啟動(dòng)日志確認(rèn)相關(guān)配置是否有正常解析,如果解析過程出現(xiàn)異常,確認(rèn)是所配置的gpio是否存在沖突;
確認(rèn)wifi的供電控制是否受控
Echo 0 > /sys/class/rkwifi/power //對wifi模塊掉電
Echo 1 > /sys/class/rkwifi/power//對wifi模塊上電
如果執(zhí)行上面命令對模塊進(jìn)行上下電,而 實(shí)際測量對應(yīng)管腳不受控,可以通過io 命令讀取對應(yīng)的寄存器,確認(rèn)是否寫入,如果正確寫入但是實(shí)際測量不受控請檢查硬件部分;
檢查內(nèi)核中是否配置
CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y;
調(diào)測wifi時(shí)請把該宏配置為 n;
執(zhí)行 echo 1 > /sys/class/rkwifi/driver 命令會(huì)調(diào)用模塊的驅(qū)動(dòng)的初始化操作,初始化成功后看到wlan0 節(jié)點(diǎn);
如何判斷是否識(shí)別到模塊
* Usb接口的模塊:出現(xiàn)如下 log
&sdio { ... bus-width = <1>; ...};
使用 sdio 單線模式。如果單線模式可以而使用4線模式不行,檢查硬件上sdio_data0~sdio_data3 四根線的線序是否弄錯(cuò);
如果降低clk,使用單線模式均不可以檢查下是否是使用最新的sdk代碼和最新的wifi驅(qū)動(dòng)(ftp服務(wù)器上有相關(guān)patch);
上述檢查均無結(jié)果,check 圖紙 是否周圍器件有貼錯(cuò)器件;
netcfg wlan0 up 或busybox ifconfig wlan0 up //執(zhí)行完成后檢查 wlan0 是否處于up狀態(tài);如果沒有處于up狀態(tài);做如下檢查確認(rèn)
1 確認(rèn)相關(guān)固件是否存在(正基系列,通過看內(nèi)核日志可以看到),固件不存在考慮到ftp下載固件;此時(shí)如果還報(bào)其他錯(cuò)誤從兩個(gè)方面排查1 上電時(shí)序,2檢查sdio部分走線;
2 嘗試使用原始最新的sdk代碼做測試;(有客戶出現(xiàn)過,上層做了相關(guān)修改導(dǎo)致wifi初始化成功,但是執(zhí)行netcfg wlan0 up 報(bào)告無法識(shí)別 ioctl 命令等奇怪錯(cuò)誤,原生sdk生成的sysytem.img 沒有問題)
執(zhí)行iwlist wlan0 scanning ,測試掃描熱點(diǎn)是否正常(3368平臺(tái)下執(zhí)行iwlist 命令有問題,忽略此步驟)
述檢查各個(gè)步驟可以工作,而通過上層settings界面打開失敗;以下幾個(gè)方面排查
1 dts中的wifi_type配置是否正確;cat /sys/class/rkwifi/chip 確認(rèn) 下 打印的結(jié)果和你的模塊是否匹配
2 確認(rèn) wpa_supplicant 相關(guān)服務(wù)是否生成,libhardware_leacy 啟動(dòng)的wpa服務(wù)是否正確;
3 抓取logcat 日志上傳readmine
1.無法連接熱點(diǎn),正基系列模塊檢查確認(rèn)晶振頻偏和32k峰峰值;
rtl模塊考慮驅(qū)動(dòng)配置是否正確,是否匹配;
2.檢查確認(rèn)p2p wlan0 的mac地址是否一致如果檢查是否有調(diào)用rockchip_wifi_mac_addr讀取mac地址,如果有考慮直接在該函數(shù)中return -1;
3.檢查確認(rèn)是否有做RF指標(biāo)測試以及天線匹配測試
4.上述檢查沒有問題,做如下測試 (首先用給手機(jī)連接所測試的熱點(diǎn)做確認(rèn))
1 連接無加密熱點(diǎn) 2 連接加密熱點(diǎn) 測試能否連接成功,并記錄對應(yīng)的logcat 日志與內(nèi)核日志(開機(jī)到打開wifi以及連接熱點(diǎn)的整個(gè)過程)
1.查看打開熱點(diǎn)時(shí)的內(nèi)核日志,確認(rèn)下 下載固件是否正確 ,正基系列的模塊 softap 下載的固件一般是帶ap后綴結(jié)尾的;
2.固件下載沒有問題 ,考慮使用原始的sdk代碼做測試
P2p 無法打開:確認(rèn)是否有p2p節(jié)點(diǎn),有p2p節(jié)點(diǎn)的檢查確認(rèn)mac地址是否與wlan0 一樣,如果一樣按照熱點(diǎn)問題中的step 2 處理;
第一次開機(jī)能夠打開,重啟后無法打開:考慮檢查上電時(shí)序,目前遇到都是rtl的模塊出現(xiàn)過,問題在于chipen 腳不受控,建議做成受控,在重啟時(shí)對chipen腳下電;可以通過如下方法實(shí)現(xiàn)net/rfkill-wlan.c中的rfkill_wlan_driver 中增加shutdown函數(shù) 在該函數(shù)中對chip_en 下電;
休眠喚醒出現(xiàn)wifi無法打開:
1 對比檢查休眠喚醒前后 sdio 的iomux 是否發(fā)生變更
2 對比 休眠前后以及休眠中 wifi的外圍供電是否發(fā)生變更
聯(lián)系客服