這兩周在tq imx6ul下調一個邁威88w8801sdio wifi模組,最后尷尬的發現tq imx6ul並不支持sdio wifi。至於不支持的原因會在后面簡單說一下,小弟才疏學淺如果有大佬在tqimx6ul上成功移植過sdio wifi,也請多多指教,好了現在進入正題吧。
首先我們要搞清楚SDIO WIFI是什么,SDIO WIFI首先是一個網絡設備,然后才是一個塊設備。一個網絡設備驅動程序,必須要具有的是收包發包函數、網絡設備注冊函數。接下來參照宋寶華《Linux設備驅動開發詳解-基於最新的Linux4.0內核》簡單介紹一下網絡設備驅動程序。
Linux對網絡設備驅動定義了4個層次,這4個層次為網絡協議接口層、網絡設備接口層、提供實際功能的設備驅動功能層和網絡設備與媒介層。
(1)網絡設備協議接口層向網絡層協議提供統一的數據包發送接口,不論上層協議是ARP還是IP,都通過dev_queue_xmit()函數發送數據,並通過netif_rx函數接收數據。這一層的存在使得上層協議獨立於具體的設備.
(2)網絡設備接口層向協議層提供統一的用於描述具體網絡設備屬性和操作的結構體net_deive,該結構體是設備驅動功能層中各函數的容器。實際上,網絡設備接口層從宏觀上規划了具體操作硬件的設備驅動功能層的結構。
(3)設備驅動功能層的各函數是網絡設備接口層net_device數據結構的具體成員,是驅使網絡設備硬件完成相應動作的程序,它通過hard_start_xmit()函數啟動發送操作,並通過網絡設備上的中斷觸發接收操作。
(4)網絡設備與媒介層是完成數據包發送和接收的物理實體,包括網絡適配器和具體的傳輸媒介、網絡適配器被設備驅動功能層中的函數在物理上驅動。對於Linux而言,網絡設備和媒介可以是虛擬的。
在sdio wifi涉及到網絡設備部分的代碼,基本上也是按照Linux網絡設備驅動框架。對Linux網絡設備驅動的介紹就到這,如果后面還涉及到的話再深入。接下來介紹sdio協議。
sdio卡(Secure Digital Input and Output)安全數字輸入輸出卡,是基於並且兼容sdio內存卡的。它的兼容性包括機械、電氣、電源、信號傳遞和軟件。sdio卡專注於提供高速數據i/o口應用在低功耗的消費類移動電子產品中。
sdio卡分為兩種,全速SDIO卡和低速SDIO卡。全速SDIO卡支持SPI、1位和4位SD傳輸模式,時鍾頻率在0~25MHZ之間。全速SDIO卡傳輸速率最快能達到10M/秒。低速SDIO卡僅需支持SPI和1位SD傳輸模式,4位SD傳輸模式是可選的,時鍾頻率僅在0~400KHZ之間。低速卡的目標應用是以最小的硬件開支支持低速I/ O能力。低速卡支持類似調制解調器、條碼掃描儀和GPS接受器等應用。對“組合”卡(存儲器+ SDIO)而言,全速和4位操作對卡內存儲器和SDIO部分都是強制要求的。在博文中我只對這兩周調試sdio wifi時所涉及到的知識做一次總結,希望能再加深一下自己對sdio wifi的理解,估計在以后很長一段時間自己也不會再搞sdio wifi了,寫個博文用作備忘也是極好的。首先要配置Linux內核支持SDIO WIFI:
make menuconfig
Networking support->
Wireless->
配置如圖所示:
Device driver->
MMC/SD/SDIO card support ->
配置如圖所示
比較關鍵的選項是Networking support->Wireless下的 cfg80211 wireless extensions compatibility
和Device driver->MMC/SD/SDIO card support 下的SDIO UART/GPS class support 。
如果不按照上面的配置的話,裝載sdio wifi的驅動時將會報有關80211的錯誤和sdio_claim_host()函數找不到的錯誤。
因為剛才說了,sdiowifi首先是一個網絡設備,其次是一個塊設備, 所以在Linux下需要mmc子系統的支持。
原文:https://blog.csdn.net/qq_23235811/article/details/80554239