日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高通qca-wifi移植

發布時間:2023/12/9 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高通qca-wifi移植 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SPF6.1_QCA-WIFI移植

  • 概述
  • qca-wifi 移植
    • 代碼合入
    • 編譯
    • insmod qca-wifi
    • 初始化調試
    • luci聯調
  • 總結

概述

移植的方案是高通的SPF6.1版本,移植到開源OpenWrt18.06.1版本上。SPF6.1采用的內核是3.3.8,OpenWrt18采用的是4.14.90.內核差異只是其中一個難點,主要還是兩者之間的框架差異,雖然都是基于OpenWrt開源框架,但是對于OpenWrt18.06.1來講,更新的很多新的功能,在老的版本上有些組件要么丟棄要么更新。
主要工作我這邊劃分了這么幾個階段。代碼合入、編譯、insmod qca-wifi、初始化調試、luci聯調。以下就是根據這幾個階段進行詳細講解,不僅僅是移植步驟,其中也包括移植過程中遇到的一些典型問題。

qca-wifi 移植

先簡單看下qca-wifi的代碼框架

代碼合入

高通私有代碼目錄比較清晰,在根目錄下的qca文件夾下,直接把這個文件夾移植過去放在OpenWrt的根目錄下或者其他目錄下,但是在添加feeds配置時要指定路徑。

OpenWrt#cat feeds.conf src-link qca ../qca/feeds/qca # 這個文件創建好之后,在執行./scripts/feeds install -a時會自動創建相關軟鏈接。 # 預期目標 [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的函數或者變量,只需要找到openwrt/logs/package/feeds/qca/qca-wifi 這個目錄下的log信息,打開看下就知道少些什么文件了,把相應的移植過來就可以了。
對于一些依賴問題,目前最快的解決方法是對報錯的依賴Makefile文件,進行拆分編譯,先編譯依賴模塊,然后再編譯報錯模塊(前提是需要把依賴配置刪除掉,類似# PKG_BUILD_DEPENDS+=$(FW_10_4))。

編譯

由于移植的大部分都是驅動程序,所以編譯報錯基本都涉及到內核的報錯。修改思路是盡量不要動內核源碼,以免污染內核。修改起來比較繁瑣,而且基本上都是新舊接口替換,頭文件替換等等。沒什么比較難的東西,這部分主要還是耐心修改就可以了。
編譯模塊選擇:

make package/feeds/qca/qca-wifi/compile V=s1.qca-wifi-ga54129d-dirty/hal/ar5416/ar5416_xmit_ds.c2.hal/ar9300/ar9300_txbf.c3.cmn_dev/qdf/linux/src/i_qdf_nbuf.h 替換新接口atomic_set()---->refcount_set()4.cmn_dev/qdf/inc/qdf_nbuf.h 替換新接口atomic_set()---->refcount_set()5.cmn_dev/qdf/linux/src/qdf_perf.c 暫時先把頭文件uaccess.h注釋掉6.cmn_dev/qdf/linux/src/qdf_threads.c signal_pending()函數未聲明,新版內核放在linux/sched/signal.h中,把頭文件換下。7.lmac/ath_dev/ath_main.c 中包含的頭文件,osdep_adf_internal.h(os/linux/include)random_input_words()函數未定義,換成get_random_bytes(b,2*s),這個不確定**************8.lmac/ath_dev/ath_xmit.c 3154if報錯,this 'if' clause does not guard,在if語句下加"{}"即可.9.os/linux/src/ath_osdep.c 在#if !ATH_RXBUF_RECYCLE 下面緊挨著加#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0),后期可能需要重新調試。10.lmac/ath_pktlog/pktlog.c line:789 在報錯的地方加上雙括號。11.lmac/ath_pktlog/linux.c 兩處錯誤。vmf->virtual_address;----》vmf->address;把地址換成新的。針對linux.c文件,找到linux-4.14.90/include/linux/mm.h新版本內核就一個參數。刪掉一個參數。12.lmac/dfs/dfs_process_phyerr.c line:148 代碼bug,if語句沒有加括號。13.ieee80211_aponly.c line:4567 ath_can_wbuf_recycle出現未定義,因為上面在,ath_osdep.c中加了限制。#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0)才會走這個流程。14.os/linux/src/ath_linux.c 一個netdevice.h中的一個結構體針對3.3.84.1490有了變化,*****************************************************************內核變動內核代碼在linux-4.14.90/include/linux/netdevice.hstruct rtnl_link_stats64* (*ndo_get_stats64)(struct net_device *dev,struct rtnl_link_stats64 *storage); 按照3.6的修改,加個返回值類型。--------------------此處修改導致內核其他驅動編譯失敗drivers/net/ifb.c 15.umac/if_lmac/if_ath.c if語句沒有加括號導致報錯。16.umac/if_lmac/if_ath_mat.c if語句沒有加括號。17.qca_da/if_ath_ahb.c 編譯器檢測到可能使用一個為初始化的指針,加個判空操作。18.offload/wlan/lmac_offload_if/ol_if_ath.c 頭文件關聯找不到linux/ath79_wlan.h文件,從3.3.8移植過去,**********************修改內核對應修改dev-wmac.c文件。19.offload/wlan/lmac_offload_if/ol_if_vap.c if else未加括號20.offload/os/linux/ol_ath_linux.c 由于內核改動,添加頭文件<linux/sched/signal.h>21.qca_ol/osif_ol.c line:805 ********************************************************************************************修改內核內核頭文件include/linux/netdevice.h 4.14.90中添加3.3.8中的last_rx成員變量,由于qca-wifi驅動中使用的過多,所以適配內核。hello world welcome to China22.qca_ol/osif_ol.c 內核ktime_t定義有變化,根據最新內核來,直接刪除掉tv64,qca-wifi驅動關于該變量的都要刪除。23.cmn_dev/hif/src/pcie/if_pci.c line:2325 內核pci 接口pci_enable_msi_range----》pci_enable_msi MSI全稱Message Signaled Interrupt當設備向一個特殊地址寫入時,會向CPU產生一個中斷,即也MSI中斷24.offload/os/linux/ath_pci.c 添加內核頭文件<linux/sched/signal.h>,并刪除掉兩個內核沒有的頭文件,led的25.offload/os/linux/ol_tx.c 添加內核<linux/sched/signal.h>頭文件26.offload/wlan/ath_pktlog/linux_remote_pktlog.c line:229 socket->ops->accept()內核接口多了一個參數,最后一個補true27.umac/mlme/ieee80211_mgmt.c line:2823 vap->iv_des_ssid[0].ssid --> vap->iv_des_ssid[0].ssid[0]28.os/linux/src/osif_umac.c osif_net.c內核更新,struct net_device dev->destructor -----> dev->priv_destructor29.os/linux/src/ath_papi.c 更換接口,對結構體進行整合static struct genl_family papi_genl_family30.os/linux/src/if_bus.c 1.包含的頭文件if_ath_ahb.h中的頭文件<asm/uaccess.h>替換成<linux/uaccess.h>2.替換兩個接口dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)31.os/linux/tools/80211stats.c 替換頭文件 <sys/types.h> --> <linux/types.h>修改Makefile -I$(KERNELPATH)/arch/$(KERNELARCH)/include/ 解決找不到asm/linkage.h

insmod qca-wifi

在編譯完各個模塊驅動的時候,就可以根據以下順序進行插入調試。

#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

插入的時候也遇到了幾個問題,根據提示進行解決

1.vfs_read/vfs_write 接口替換,新的內核已經不導出了,為了不污染內核,使用新的kernel_read/kernel_write接口。2.ath79_get_wlan_fw_dump_buffer 函數未定義,在dev-wmac.c中重新移植。 // 3.qca_da.ko驅動探測qca956x_wmac 失敗,在target/linux/ar71xx/config-4.14放開CONFIG_OF定義.并注掉相關編譯不過問題:setup.c中關于device tree的初始化注掉。放開該配置導致內核編譯異常。著手修改9563探測部分。保證可以分配到中斷號以及所需內存。4.修改qca/src/qca-wifi/Makefile 添加ifeq ($(QCA_PLATFORM),ar71xx) 的宏定義到QCAWLAN_MAKEOPTS里面去。5.插入qca_da出現kernel panic,走讀代碼,修改if_ath_ahb.c探測部分代碼,需要重新分配中斷號和匹配dev_id。

初始化調試

這部分調試比較繁瑣,首先抓住一個核心腳本,即/sbin/wifi。從這個腳本出發,調試各個功能。這個前提是要把wireless配置文件以及校準數據準備好。

1.內核自動插入,修改Makefile 添加AUTOLOAD:=$(call AutoLoad,80,$(notdir $(QCAWLAN_MODULE_LIST)))。-----------后期發現無需添加,qcawifi.sh會自動檢測。2.加載校驗數據,移植81_load_wifi_board_bin文件,用于啟動時調用。target/linux/ar71xx/base-files/lib/preinit/移植ar71xx_read_caldata_to_fs.sh文件,用于校準時調用。target/linux/ar71xx/base-files/lib/這兩個文件移植過去,需修改內部的ar71xx_board_name 替換成board_name變量。調用順序為 單板啟動-----》etc/preinit------>/lib/preinit/各個文件,即會執行/lib/preinit/81_load_wifi_board_bin**最后為了不污染openwrt框架,把這兩個文件放在qca/feeds/qca/net/qca-wifi/files目錄下,在Makefile安裝。3.適配qcawifi.sh文件,啟動默認插入相關驅動。順便把/lib/functions.sh腳本也移植過來。qca/feeds/qca/net/qca-wifi/files/4.把內核中wireless驅動mac80211部分勾選去掉,只需要加載qca-wifi即可。(ath驅動很多配置文件都來自于mac80211). 5.package/base-files/sbin/wifi 暫時先刪除掉,后期再放在mac80211文件下(package/kernel )*****6.修改wireless配置創建的地方/package/base-files/files/etc/init.d/boot 在boot階段,添加wireless的創建。7.wifi啟動調試,一般直接執行/sbin/wifi down/up即可下發配置。使用此命令進行wifi調試。8.無線暫時出來了,注掉/lib/wifi/qcawifi.sh 中調用wlanconfig命令,根據返回值設置ifname。---------目前這個地方還有點問題,老版本正常執行,在新版本中會把ifname清空,導致后面iwpriv命令下發失敗。10.高通針對每個WLAN接口會創建一個VAP(虛擬ap)接口,當前系統下發wifi1時錯誤(系統對應創建ath0,ath11,1)可能是/sbin/wifi 在做scan_wifi時,CONFIG_SECTION變量保存錯誤,在config_set時,該值在老版本和新版本中不同-----------------老版本中保存的是上一次的值,而新版本是當前設置的值。先替換掉functions.sh(config_set)***替換掉會出現./usr/lib/opkg/info/base-files.postinst: line 5: default_postinst: command not found解決方法:暫時先把新版本的functions.sh中default_postinst 函數移植到老版本中去。11.解決iwpriv命令問題,這個命令在wireless_tools下,打補丁修改。在/lib/wifi/qcawifi.sh 下添加DEBUG='OPEN' 會有調試信息輸出,發現iwpriv 命令下發失敗(主要是ioctl找不到相關的私有命令no private ioctls)。***下發iwpriv ath0 提示沒有相關的ioctls,是因為wireless_tools工具源碼中,iwlib.c中獲取信息給的空間太小導致。已打補丁參考筆記:http://blog.chinaunix.net/uid-25564582-id-5751599.html 研究私有ioctl交互流程。12.待上面問題都解決完之后,log輸出信息基本和SPF6.1保持一致,但是終端還是無法連接到AP。定位流程:1》無法連接-------查看連接階段,用筆記本抓包,發現無dhcp回應。2》wifi驅動,研究無線收發流程,添加調試信息,發現DHCP報文已上送內核osif_umac.c->osif_deliver_data()參考筆記:https://blog.csdn.net/zimiao815/article/details/555109393》由于內核過于復雜,先跳過內核協議棧,直接排查dhcp應用程序,是否接受和發送dhcp報文。在package/network/services/dnsmasq/files/dnsmasq.init 啟動dnsmasq時添加參數--log-facility /tmp/dnsmasq.log --log-queries由打印信息并且對比SPF6.1可以知,dhcp報文在內核丟失了。參考筆記:http://blog.chinaunix.net/uid-563939-id-4768621.html4》排查內核UDP報文處理流程,發現在ip處理過程中已經丟棄了。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: 有時會出現終端連接時彈出無法加入網絡可能無法上傳,采用測試工具hfc測試,上傳失敗。最后排查發現是信道干擾,因為對比調試,所以啟了一塊SPF6.1板本的單板,關掉就好了。

luci聯調

1.經研究發現,前后端經過libiwinfo.so庫提供的接口,進行數據交互。暫時嘗試把SPF6.1的iwinfo 目錄移植到package/network/utils/iwinfo 下,主要是替換iwinfo庫。2.rpcd下iwinfo.c中需要適配692行的添加qcawifi名稱。3.針對網頁配置主要修改思路是上下傳參不一致。1》獲取狀態信息,突破口主要在wifi.lua中(按編輯按鈕跳轉到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》前段在顯示時是調用wifinet.ifname(self),所以看下self.iwinfo.ifname 怎么獲取。這段賦值就是前面_wifi_iwinfo_by_ifname(radioname) 而這個函數的參數有時_wifi_netid_by_sid_private在/etc/config/wireless中讀取的。4》上面是獲取狀態信息,初始化已有的ath設備,下面講下怎么添加虛擬設備。*:onclick="cbi_submit(this, 'device', '<%=dev:name()%>', '<%=url('admin/wireless/wireless_add')%>')"*:推斷出要加載wireless_add頁面,該頁面在controller/admin/wireless.lua中添加,即直接調用該文件下的wifi_add()。*:在network.lua中wifidev.add_wifinet(self, options) 改造該函數,對wireless配置文件添加ifname選項。*:寫了一個新函數,即遍歷所有相同device下的接口,得出索引,得到athxx設備名。(_wifi_ifname_by_dev(dev))5》在重新適配下radio.lua/radio_5G.lua ,讓其支持qcawifi驅動

總結

至此所有的功能模塊都已經調試完成,遇到每一個問題都需要找到相應的突破口,要不然面對這么個大的框架,會讓人無從下手。通過這個qca-wifi的移植可以說把OpenWRt的基本知識大概研究了一遍,從代碼移植、編譯、install、insmod、芯片探測、系統初始化、wifi初始化、校準數據初始化、wifi基本配置工具(wlanconfig、iwconfig、iwpriv等)、luci調試等等。以及在解決問題過程中研究了下netifd的網絡配置管理,dnsmasq的dhcp管理等等。模塊雖然很獨立,但是和系統其它基本組件需要很多配合。

總結

以上是生活随笔為你收集整理的高通qca-wifi移植的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。