一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

[Android6.0][RK3399] SDIO 接口 Wifi 驅(qū)動(dòng)流程分析 (AP6354)...

 區(qū)區(qū)收藏 2020-10-12

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)載請(qǐng)注明作者 Younix~ 謝謝~

基本概念

Wifi

wifi 英文全稱是 WIreless-FIdelity,翻譯成中文就是無線保真,英文簡稱WiFi。

WLAN

wlan 英文全名:Wireless Local Area Networks, 無線局域網(wǎng)絡(luò)。

關(guān)系

wifi 是實(shí)現(xiàn) wlan 的一種技術(shù)。

STA 模式 和 AP 模式

AP模式: Access Point,提供無線接入服務(wù),允許其它無線設(shè)備接入,提供數(shù)據(jù)訪問,一般的無線路由/網(wǎng)橋工作在該模式下。AP和AP之間允許相互連接。
Sta模式: Station, 類似于無線終端,sta本身并不接受無線的接入,它可以連接到AP,一般無線網(wǎng)卡即工作在該模式。

無線接入過程的三個(gè)階段

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 和 MMC

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(Secure Digital I/O)

SDIO 就是 SD 的 I/O 接口的意思。
更具體的說,SD 本來是記憶卡的標(biāo)準(zhǔn),但是現(xiàn)在也可以把 SD 拿來插上一些外圍接口使用,這樣的技術(shù)便是 SDIO。

SDIO 通過 SD 的 I/O 管腳來連接外部的外圍 device 并傳輸數(shù)據(jù)。這些外圍設(shè)備,我們稱為 SDIO 卡,常見的有:

  • Wi-Fi card(無線網(wǎng)絡(luò)卡)
  • CMOS sensor card(照相模塊)
  • GPS card
  • GSM/GPRS modem card
  • Bluetooth card
  • Radio/TV card

SDIO 卡 和 SD 卡 的區(qū)別

SD卡使用的是SD卡協(xié)議,而SDIO卡使用的是SDIO協(xié)議!
協(xié)議不一樣,初始化/讀寫方式也不一樣!

SDIO-Wifi 模塊

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)。

對(duì)于SDIO接口的wifi,首先,它是一個(gè)sdio的卡的設(shè)備,然后具備了wifi的功能。
所以,注冊(cè)的時(shí)候還是先以sdio的卡的設(shè)備去注冊(cè)的。然后檢測到卡之后就要驅(qū)動(dòng)他的wifi功能

SDIO 總線

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 命令

SDIO總線上都是HOST端發(fā)起請(qǐng)求,然后DEVICE端回應(yīng)請(qǐ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ù)是雙向的傳送的。可以設(shè)置為1線模式,也可以設(shè)置為4線模式。數(shù)據(jù)是通過DAT0-DAT3信號(hào)線傳輸?shù)摹?/p>

SDIO的每次操作都是由HOST在CMD線上發(fā)起一個(gè)CMD,對(duì)于有的CMD,DEVICE需要返回Response,有的則不需要。
對(duì)于讀命令,首先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)。
對(duì)于寫命令,首先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 模塊解析和啟動(dòng)流程

對(duì)于 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 接口驅(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 總線注冊(cè)
4. 對(duì)應(yīng) ops 操作
5. 以及支持 mmc 的代碼

host 目錄(HOST 層)是根據(jù)不通平臺(tái)而編寫的 host 驅(qū)動(dòng)。

WIFI 驅(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è)備,注冊(cè) wifi 驅(qū)動(dòng),注冊(cè)成功調(diào)用后面的 bcmdhd_wifi_plat_dev_drv_probe
————wifi_ctrlfunc_register_drv
————|—bus_find_device //查找 wifi 設(shè)備
————|—platform_driver_register(&wifi_platform_dev_driver) //注冊(cè) 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 // 注冊(cè)成功就調(diào)用 dhd_sdio.dhdsdio_probe
————————bcmsdh_register(&dhd_sdio)
————————|—bcmsdh_register_client_driver
————————|——sdio_register_driver(&bcmsdh_sdmmc_driver) //注冊(cè)成功調(diào)用 bcmsdh_sdmmc_probe
————————|———bcmsdh_sdmmc_probe //->
————————|———sdioh_probe
————————dhdsdio_probe

參考文章
在全志平臺(tái)調(diào)試博通的wifi驅(qū)動(dòng)(類似ap6212)
wifi 詳解(三)

調(diào)試問題

調(diào)試步驟

1.確保配置無誤

dts文件的配置wifi部分是在net/rfkill-wlan.c中進(jìn)行配置;先通過內(nèi)核啟動(dòng)日志確認(rèn)相關(guān)配置是否有正常解析,如果解析過程出現(xiàn)異常,確認(rèn)是所配置的gpio是否存在沖突;

2.檢查供電是否正常

確認(rèn)wifi的供電控制是否受控
Echo 0 > /sys/class/rkwifi/power //對(duì)wifi模塊掉電
Echo 1 > /sys/class/rkwifi/power//對(duì)wifi模塊上電
如果執(zhí)行上面命令對(duì)模塊進(jìn)行上下電,而 實(shí)際測量對(duì)應(yīng)管腳不受控,可以通過io 命令讀取對(duì)應(yīng)的寄存器,確認(rèn)是否寫入,如果正確寫入但是實(shí)際測量不受控請(qǐng)檢查硬件部分;

3. 掃描模塊初始化模塊

檢查內(nèi)核中是否配置
CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y;
調(diào)測wifi時(shí)請(qǐng)把該宏配置為 n;
執(zhí)行 echo 1 > /sys/class/rkwifi/driver 命令會(huì)調(diào)用模塊的驅(qū)動(dòng)的初始化操作,初始化成功后看到wlan0 節(jié)點(diǎn);

如何判斷是否識(shí)別到模塊
* Usb接口的模塊:出現(xiàn)如下 log

* SDIO 接口的模塊
對(duì)于sdio接口的模塊,執(zhí)行” echo 1 > /sys/class/rkwifi/driver”命令 ,正常情況下 sdio_clk 和sdio_cmd 能夠測量到相關(guān)波形,內(nèi)核打印上能夠看到如下打印,如果沒有測量到波形也沒有看到如下打印,根據(jù)配置文檔檢查是否正確配置sdio;


Wifi驅(qū)動(dòng)會(huì)根據(jù)掃描到的sdio模塊的vid pid 進(jìn)行驅(qū)動(dòng)匹配,rtl的驅(qū)動(dòng)會(huì)根據(jù)讀取到的vid,pid進(jìn)行驅(qū)動(dòng)匹配;其中正基系列的模塊會(huì)根據(jù)后面從data數(shù)據(jù)線上讀取到F1 function 讀取的數(shù)值進(jìn)行 驅(qū)動(dòng)與固件匹配(正基目前的驅(qū)動(dòng)兼容所有sdio接口正基模塊,根據(jù)F1 function 讀取的值 匹配固件);
如果能夠掃描模塊但是初始化過程看到data fifo error,檢查下 sdio接口電平是否一致;方法如下:
echo 1 > /sys/class/rkwifi/power
測量 VDDIO sdio_clk sdio_cmd sdio_data0~sdio_data3 的電壓;正常情況下 sdio_clk 為 0V,sdio其他五根線與vddio電壓一致;
如果電壓不一致:312x平臺(tái)確認(rèn)下 sdio接口的內(nèi)部上下拉是否禁掉,參看文檔RK Kernel 3.10平臺(tái)WiFi BT不工作異常排查.pdf Part C;其他平臺(tái)考慮加外部上拉(注clk絕對(duì)不要加外部上拉);
同時(shí)測量執(zhí)行echo 1 > /sys/class/rkwifi/driver 時(shí) 外部晶體是否有起振,如果掃描時(shí)沒有起振檢查下硬件;同時(shí)建議測量外部晶體頻偏,頻偏比較大情況下,會(huì)出現(xiàn)能掃描到模塊但是初始化失?。怀龣z查晶振外,正基系列還需要外部32k,測量32k的峰峰值(峰峰值>=0.7*VDDIO && 峰峰值 <= 1*VDDIO);【注:頻偏和峰峰值一定要測量檢查,頻偏過大峰峰值不對(duì)會(huì)影響wifi(掃描連接熱點(diǎn))和藍(lán)牙(掃描連接設(shè)備))】
電壓一致情況下,晶振頻偏和32k的峰峰值沒有問題(正基系列的要考慮晶振頻偏與32k峰峰值,具體結(jié)合自己電路實(shí)際情況)但是初始化依然出問題;
考慮降低sdio_clk ,重新測試;如果降低clk可以,考慮硬件上走線;
如果降低clk依然不行,考慮使用sdio單線模式方法如下

&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ò)器件;

4.檢查模塊能否處于工作狀態(tài)

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 命令有問題,忽略此步驟)

5. 確認(rèn)Android層是否能夠打開

述檢查各個(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. pcb檢查,一定要讓模塊原廠檢查確認(rèn) pcb是否存在問題
  2. RF指標(biāo)確認(rèn)是否ok
  3. 天線是否做過匹配
  4. Sdio 接口的可以考慮 提到sdio的clk 啟用sdio3.0【前提 平臺(tái)支持 sdio3.0 ,模塊支持sdio3.0】

其他問題

無法連接熱點(diǎn)

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) 測試能否連接成功,并記錄對(duì)應(yīng)的logcat 日志與內(nèi)核日志(開機(jī)到打開wifi以及連接熱點(diǎn)的整個(gè)過程)

softap 無法打開(正基系列的)

1.查看打開熱點(diǎn)時(shí)的內(nèi)核日志,確認(rèn)下 下載固件是否正確 ,正基系列的模塊 softap 下載的固件一般是帶ap后綴結(jié)尾的;
2.固件下載沒有問題 ,考慮使用原始的sdk代碼做測試

P2P 問題

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í)對(duì)chipen腳下電;可以通過如下方法實(shí)現(xiàn)net/rfkill-wlan.c中的rfkill_wlan_driver 中增加shutdown函數(shù) 在該函數(shù)中對(duì)chip_en 下電;
休眠喚醒出現(xiàn)wifi無法打開
1 對(duì)比檢查休眠喚醒前后 sdio 的iomux 是否發(fā)生變更
2 對(duì)比 休眠前后以及休眠中 wifi的外圍供電是否發(fā)生變更

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    不卡中文字幕在线视频| 国产不卡的视频在线观看| 91精品日本在线视频| 午夜精品在线观看视频午夜| 又色又爽又无遮挡的视频| 亚洲伊人久久精品国产| 69精品一区二区蜜桃视频| 精品香蕉国产一区二区三区| 日韩一区二区三区嘿嘿| 午夜福利黄片免费观看| 国产内射一级二级三级| 欧美日韩高清不卡在线播放| 日韩欧美在线看一卡一卡| 欧美亚洲三级视频在线观看| 美国黑人一级黄色大片| 欧美做爰猛烈叫床大尺度| 亚洲国产91精品视频| 欧美精品二区中文乱码字幕高清| 日韩精品一区二区毛片| 丝袜美女诱惑在线观看| 欧美熟妇一区二区在线| 一区二区福利在线视频| 日韩一区二区三区18| 亚洲高清中文字幕一区二三区| 国产白丝粉嫩av在线免费观看| 91偷拍与自偷拍精品| 国产户外勾引精品露出一区| 国产精品欧美一级免费| 亚洲一区在线观看蜜桃| 欧美日韩中黄片免费看| 日韩精品小视频在线观看| 精品亚洲香蕉久久综合网| 高清一区二区三区四区五区 | 在线免费不卡亚洲国产| 人妻一区二区三区多毛女| 国产精品制服丝袜美腿丝袜| 日本一区二区三区久久娇喘| 成人日韩视频中文字幕| 亚洲男人的天堂就去爱| 欧美一区二区三区99| 高清一区二区三区不卡免费|