高通qca-wifi移植
SPF6.1_QCA-WIFI移植
- 概述
- qca-wifi 移植
- 代碼合入
- 編譯
- insmod qca-wifi
- 初始化調(diào)試
- luci聯(lián)調(diào)
- 總結(jié)
概述
移植的方案是高通的SPF6.1版本,移植到開源OpenWrt18.06.1版本上。SPF6.1采用的內(nèi)核是3.3.8,OpenWrt18采用的是4.14.90.內(nèi)核差異只是其中一個難點,主要還是兩者之間的框架差異,雖然都是基于OpenWrt開源框架,但是對于OpenWrt18.06.1來講,更新的很多新的功能,在老的版本上有些組件要么丟棄要么更新。
主要工作我這邊劃分了這么幾個階段。代碼合入、編譯、insmod qca-wifi、初始化調(diào)試、luci聯(lián)調(diào)。以下就是根據(jù)這幾個階段進行詳細講解,不僅僅是移植步驟,其中也包括移植過程中遇到的一些典型問題。
qca-wifi 移植
先簡單看下qca-wifi的代碼框架
代碼合入
高通私有代碼目錄比較清晰,在根目錄下的qca文件夾下,直接把這個文件夾移植過去放在OpenWrt的根目錄下或者其他目錄下,但是在添加feeds配置時要指定路徑。
OpenWrt#cat feeds.conf src-link qca ../qca/feeds/qca # 這個文件創(chuàng)建好之后,在執(zhí)行./scripts/feeds install -a時會自動創(chuàng)建相關軟鏈接。 # 預期目標 [zhangyugang@mos openwrt]$ cd package/feeds/qca/ [zhangyugang@mos qca]$ ll total 0 lrwxrwxrwx 1 zhangyugang zhangyugang 31 Sep 16 14:16 btdiag -> ../../../feeds/qca/utils/btdiag lrwxrwxrwx 1 zhangyugang zhangyugang 31 Sep 16 14:16 qca-acfg -> ../../../feeds/qca/net/qca-acfg lrwxrwxrwx 1 zhangyugang zhangyugang 33 Sep 16 14:16 qca-hostap -> ../../../feeds/qca/net/qca-hostap lrwxrwxrwx 1 zhangyugang zhangyugang 41 Sep 16 14:16 qca-iface-mgr-10.4 -> ../../../feeds/qca/net/qca-iface-mgr-10.4 lrwxrwxrwx 1 zhangyugang zhangyugang 31 Sep 16 14:16 qca-lowi -> ../../../feeds/qca/net/qca-lowi lrwxrwxrwx 1 zhangyugang zhangyugang 37 Sep 16 14:16 qca-spectral -> ../../../feeds/qca/utils/qca-spectral lrwxrwxrwx 1 zhangyugang zhangyugang 42 Sep 16 14:16 qca-thermald-10.4 -> ../../../feeds/qca/utils/qca-thermald-10.4 lrwxrwxrwx 1 zhangyugang zhangyugang 31 Sep 16 14:16 qca-wifi -> ../../../feeds/qca/net/qca-wifi lrwxrwxrwx 1 zhangyugang zhangyugang 43 Sep 16 14:16 qca-wifi-fulloffload -> ../../../feeds/qca/net/qca-wifi-fulloffload lrwxrwxrwx 1 zhangyugang zhangyugang 41 Sep 16 14:16 qca-wifi-fw-10.2.4 -> ../../../feeds/qca/net/qca-wifi-fw-10.2.4 lrwxrwxrwx 1 zhangyugang zhangyugang 39 Sep 16 14:16 qca-wifi-fw-10.4 -> ../../../feeds/qca/net/qca-wifi-fw-10.4 lrwxrwxrwx 1 zhangyugang zhangyugang 46 Sep 16 14:16 qca-wifi-fw-10.4-ar71xx -> ../../../feeds/qca/net/qca-wifi-fw-10.4-ar71xx lrwxrwxrwx 1 zhangyugang zhangyugang 30 Sep 16 14:16 qca-wpc -> ../../../feeds/qca/net/qca-wpc lrwxrwxrwx 1 zhangyugang zhangyugang 32 Sep 16 14:16 qca-wrapd -> ../../../feeds/qca/net/qca-wrapd lrwxrwxrwx 1 zhangyugang zhangyugang 35 Sep 16 14:16 qcmbr-10.4 -> ../../../feeds/qca/utils/qcmbr-10.4安裝過程中可能會遇到一些問題,諸如depend或者一些未定義的東西。未定義基本都是一些Makefile的函數(shù)或者變量,只需要找到openwrt/logs/package/feeds/qca/qca-wifi 這個目錄下的log信息,打開看下就知道少些什么文件了,把相應的移植過來就可以了。
對于一些依賴問題,目前最快的解決方法是對報錯的依賴Makefile文件,進行拆分編譯,先編譯依賴模塊,然后再編譯報錯模塊(前提是需要把依賴配置刪除掉,類似# PKG_BUILD_DEPENDS+=$(FW_10_4))。
編譯
由于移植的大部分都是驅(qū)動程序,所以編譯報錯基本都涉及到內(nèi)核的報錯。修改思路是盡量不要動內(nèi)核源碼,以免污染內(nèi)核。修改起來比較繁瑣,而且基本上都是新舊接口替換,頭文件替換等等。沒什么比較難的東西,這部分主要還是耐心修改就可以了。
編譯模塊選擇:
insmod qca-wifi
在編譯完各個模塊驅(qū)動的時候,就可以根據(jù)以下順序進行插入調(diào)試。
#openwrt/qca/feeds/qca/net/qca-wifi/files $ cat qca-wifi-modules mem_manager asf qdf ath_dfs ath_spectral umac ath_hal ath_rate_atheros hst_tx99 ath_dev qca_da qca_ol ath_pktlog smart_antenna插入的時候也遇到了幾個問題,根據(jù)提示進行解決
1.vfs_read/vfs_write 接口替換,新的內(nèi)核已經(jīng)不導出了,為了不污染內(nèi)核,使用新的kernel_read/kernel_write接口。2.ath79_get_wlan_fw_dump_buffer 函數(shù)未定義,在dev-wmac.c中重新移植。 // 3.qca_da.ko驅(qū)動探測qca956x_wmac 失敗,在target/linux/ar71xx/config-4.14放開CONFIG_OF定義.并注掉相關編譯不過問題:setup.c中關于device tree的初始化注掉。放開該配置導致內(nèi)核編譯異常。著手修改9563探測部分。保證可以分配到中斷號以及所需內(nèi)存。4.修改qca/src/qca-wifi/Makefile 添加ifeq ($(QCA_PLATFORM),ar71xx) 的宏定義到QCAWLAN_MAKEOPTS里面去。5.插入qca_da出現(xiàn)kernel panic,走讀代碼,修改if_ath_ahb.c探測部分代碼,需要重新分配中斷號和匹配dev_id。初始化調(diào)試
這部分調(diào)試比較繁瑣,首先抓住一個核心腳本,即/sbin/wifi。從這個腳本出發(fā),調(diào)試各個功能。這個前提是要把wireless配置文件以及校準數(shù)據(jù)準備好。
1.內(nèi)核自動插入,修改Makefile 添加AUTOLOAD:=$(call AutoLoad,80,$(notdir $(QCAWLAN_MODULE_LIST)))。-----------后期發(fā)現(xiàn)無需添加,qcawifi.sh會自動檢測。2.加載校驗數(shù)據(jù),移植81_load_wifi_board_bin文件,用于啟動時調(diào)用。target/linux/ar71xx/base-files/lib/preinit/移植ar71xx_read_caldata_to_fs.sh文件,用于校準時調(diào)用。target/linux/ar71xx/base-files/lib/這兩個文件移植過去,需修改內(nèi)部的ar71xx_board_name 替換成board_name變量。調(diào)用順序為 單板啟動-----》etc/preinit------>/lib/preinit/各個文件,即會執(zhí)行/lib/preinit/81_load_wifi_board_bin**最后為了不污染openwrt框架,把這兩個文件放在qca/feeds/qca/net/qca-wifi/files目錄下,在Makefile安裝。3.適配qcawifi.sh文件,啟動默認插入相關驅(qū)動。順便把/lib/functions.sh腳本也移植過來。qca/feeds/qca/net/qca-wifi/files/4.把內(nèi)核中wireless驅(qū)動mac80211部分勾選去掉,只需要加載qca-wifi即可。(ath驅(qū)動很多配置文件都來自于mac80211). 5.package/base-files/sbin/wifi 暫時先刪除掉,后期再放在mac80211文件下(package/kernel )*****6.修改wireless配置創(chuàng)建的地方/package/base-files/files/etc/init.d/boot 在boot階段,添加wireless的創(chuàng)建。7.wifi啟動調(diào)試,一般直接執(zhí)行/sbin/wifi down/up即可下發(fā)配置。使用此命令進行wifi調(diào)試。8.無線暫時出來了,注掉/lib/wifi/qcawifi.sh 中調(diào)用wlanconfig命令,根據(jù)返回值設置ifname。---------目前這個地方還有點問題,老版本正常執(zhí)行,在新版本中會把ifname清空,導致后面iwpriv命令下發(fā)失敗。10.高通針對每個WLAN接口會創(chuàng)建一個VAP(虛擬ap)接口,當前系統(tǒng)下發(fā)wifi1時錯誤(系統(tǒng)對應創(chuàng)建ath0,ath11,1)可能是/sbin/wifi 在做scan_wifi時,CONFIG_SECTION變量保存錯誤,在config_set時,該值在老版本和新版本中不同-----------------老版本中保存的是上一次的值,而新版本是當前設置的值。先替換掉functions.sh(config_set)***替換掉會出現(xiàn)./usr/lib/opkg/info/base-files.postinst: line 5: default_postinst: command not found解決方法:暫時先把新版本的functions.sh中default_postinst 函數(shù)移植到老版本中去。11.解決iwpriv命令問題,這個命令在wireless_tools下,打補丁修改。在/lib/wifi/qcawifi.sh 下添加DEBUG='OPEN' 會有調(diào)試信息輸出,發(fā)現(xiàn)iwpriv 命令下發(fā)失敗(主要是ioctl找不到相關的私有命令no private ioctls)。***下發(fā)iwpriv ath0 提示沒有相關的ioctls,是因為wireless_tools工具源碼中,iwlib.c中獲取信息給的空間太小導致。已打補丁參考筆記:http://blog.chinaunix.net/uid-25564582-id-5751599.html 研究私有ioctl交互流程。12.待上面問題都解決完之后,log輸出信息基本和SPF6.1保持一致,但是終端還是無法連接到AP。定位流程:1》無法連接-------查看連接階段,用筆記本抓包,發(fā)現(xiàn)無dhcp回應。2》wifi驅(qū)動,研究無線收發(fā)流程,添加調(diào)試信息,發(fā)現(xiàn)DHCP報文已上送內(nèi)核osif_umac.c->osif_deliver_data()參考筆記:https://blog.csdn.net/zimiao815/article/details/555109393》由于內(nèi)核過于復雜,先跳過內(nèi)核協(xié)議棧,直接排查dhcp應用程序,是否接受和發(fā)送dhcp報文。在package/network/services/dnsmasq/files/dnsmasq.init 啟動dnsmasq時添加參數(shù)--log-facility /tmp/dnsmasq.log --log-queries由打印信息并且對比SPF6.1可以知,dhcp報文在內(nèi)核丟失了。參考筆記:http://blog.chinaunix.net/uid-563939-id-4768621.html4》排查內(nèi)核UDP報文處理流程,發(fā)現(xiàn)在ip處理過程中已經(jīng)丟棄了。if (skb->pkt_type == PACKET_OTHERHOST)goto drop;------>在dev.c ---__netif_receive_skb_core()處理vlantag時加的。暫時解決方案:qca-wifi/os/linux/BuildCaps.inc 中先去掉vlan的支持13.2.4G和5.8G均可連接。簡單測試情況:1》2.4G可連接并下載上傳均可。2》5.8G: 有時會出現(xiàn)終端連接時彈出無法加入網(wǎng)絡可能無法上傳,采用測試工具hfc測試,上傳失敗。最后排查發(fā)現(xiàn)是信道干擾,因為對比調(diào)試,所以啟了一塊SPF6.1板本的單板,關掉就好了。luci聯(lián)調(diào)
1.經(jīng)研究發(fā)現(xiàn),前后端經(jīng)過libiwinfo.so庫提供的接口,進行數(shù)據(jù)交互。暫時嘗試把SPF6.1的iwinfo 目錄移植到package/network/utils/iwinfo 下,主要是替換iwinfo庫。2.rpcd下iwinfo.c中需要適配692行的添加qcawifi名稱。3.針對網(wǎng)頁配置主要修改思路是上下傳參不一致。1》獲取狀態(tài)信息,突破口主要在wifi.lua中(按編輯按鈕跳轉(zhuǎn)到wifi配置頁面),對比SPF6.1Wireless Network: Master "Mexon_qca2.4G" (ath0),看下ath0怎么顯示出來的。2》主要修改model/network.lua 中wifinet.__init__初始化部分,會對iwinfo進行初始化,但是這個需要傳參athx設備故修改_wifi_netid_by_sid_private 重新對/etc/config/wireless 接口添加ifname選項。3》前段在顯示時是調(diào)用wifinet.ifname(self),所以看下self.iwinfo.ifname 怎么獲取。這段賦值就是前面_wifi_iwinfo_by_ifname(radioname) 而這個函數(shù)的參數(shù)有時_wifi_netid_by_sid_private在/etc/config/wireless中讀取的。4》上面是獲取狀態(tài)信息,初始化已有的ath設備,下面講下怎么添加虛擬設備。*:onclick="cbi_submit(this, 'device', '<%=dev:name()%>', '<%=url('admin/wireless/wireless_add')%>')"*:推斷出要加載wireless_add頁面,該頁面在controller/admin/wireless.lua中添加,即直接調(diào)用該文件下的wifi_add()。*:在network.lua中wifidev.add_wifinet(self, options) 改造該函數(shù),對wireless配置文件添加ifname選項。*:寫了一個新函數(shù),即遍歷所有相同device下的接口,得出索引,得到athxx設備名。(_wifi_ifname_by_dev(dev))5》在重新適配下radio.lua/radio_5G.lua ,讓其支持qcawifi驅(qū)動總結(jié)
至此所有的功能模塊都已經(jīng)調(diào)試完成,遇到每一個問題都需要找到相應的突破口,要不然面對這么個大的框架,會讓人無從下手。通過這個qca-wifi的移植可以說把OpenWRt的基本知識大概研究了一遍,從代碼移植、編譯、install、insmod、芯片探測、系統(tǒng)初始化、wifi初始化、校準數(shù)據(jù)初始化、wifi基本配置工具(wlanconfig、iwconfig、iwpriv等)、luci調(diào)試等等。以及在解決問題過程中研究了下netifd的網(wǎng)絡配置管理,dnsmasq的dhcp管理等等。模塊雖然很獨立,但是和系統(tǒng)其它基本組件需要很多配合。
總結(jié)
以上是生活随笔為你收集整理的高通qca-wifi移植的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最长上升子序列——动态规划
- 下一篇: 多表查询的一些技巧