為OK3576-C開發(fā)板適配AX210NGW Wi-Fi 6E模塊,讓無線網(wǎng)絡(luò)快人一步
在這個萬物互聯(lián)的時代,無線通信技術(shù)已經(jīng)成為嵌入式系統(tǒng)中不可或缺的一部分。其中,Wi-Fi模塊作為連接設(shè)備與網(wǎng)絡(luò)的重要橋梁,其性能與兼容性顯得尤為關(guān)鍵。Intel的AX210NGW Wi-Fi 6E模塊作為一款高性能的無線網(wǎng)絡(luò)適配器,不僅支持最新的Wi-Fi 6E標準和藍牙5.3,還具備出色的傳輸速度和兼容性,為嵌入式系統(tǒng)的無線連接提供了強有力的支持。
為了更好地滿足客戶對高性能嵌入式主控的應(yīng)用需求,本文將詳細介紹在飛凌嵌入式OK3576-C開發(fā)板上適配AX210NGW Wi-Fi 6E模塊(以下簡稱模塊)的方法,幫助開發(fā)者快速上手并充分發(fā)揮性能優(yōu)勢。
注:目前暫未對Wi-Fi模塊的藍牙功能進行適配,本文只講解Wi-Fi功能的適配方式。
首先,需要將Wi-Fi模塊連接到飛凌嵌入式RK3576開發(fā)板上(Wi-Fi模塊使用的是M.2 key A+E接口,但通過接口圖看到OK3576-C開發(fā)板沒有此接口,這時使用M.2轉(zhuǎn)PCIe雙頻無線網(wǎng)卡轉(zhuǎn)接卡進行轉(zhuǎn)接就可以)。
進入內(nèi)核目錄開始配置:
forlinx@ubuntu20:~/3576$ cd kernel-6.1/
forlinx@ubuntu20:~/3576/kernel-6.1$ make menuconfig ARCH=arm64
按如下順序進行選擇:
Location:
-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> Wireless LAN (WLAN [=y])
-> Intel devices (WLAN_VENDOR_INTEL [=y])
-> Intel Wireless WiFi Next Gen AGN - Wireless-N/Advanced-N/Ultimate-N (iwlwifi) (IWLWIFI [=m])
-> Intel Wireless WiFi MVM Firmware support (IWLMVM [=m])
進行編譯:
forlinx@ubuntu20:~/3576/kernel-6.1$ export CROSS_COMPILE=/home/forlinx/3576/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
forlinx@ubuntu20:~/3576/kernel-6.1$ export PATH=$PATH:/home/forlinx/3576/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/
forlinx@ubuntu20:~/3576/kernel-6.1$ make ARCH=arm64 rk3576-evb1-v10-linux.img
最后將編譯好的模塊自行拷貝到RK3576開發(fā)板中,我們這里是將模塊拷貝到 /root目錄中了。模塊在內(nèi)核源碼中的路徑:
(1) drivers/net/wireless/intel/iwlwifi/iwlwifi.ko
(2) drivers/net/wireless/intel/iwlwifi/mvm/iwlmvm.ko
除此之外,還需要將Wi-Fi固件和STA腳本拷貝到/root目錄中備用。
root@rk3576-buildroot:/root# ls
firmware.zip fltest_wifi.sh iwlmvm.ko iwlwifi.ko
STA腳本可以參考以下內(nèi)容,如自行創(chuàng)建腳本,記得要添加可執(zhí)行權(quán)限。
#!/bin/sh
cnt1=`ps aux | grep hostapd | grep -v grep | wc -l`
if [ "$cnt1" != "0" ];then
killall hostapd > /dev/null
fi
ifconfig uap0 down
function usage()
{
echo "Usage: -i <wifi> -s <ssid> -p <password>"
echo "eg: ./wifi.sh -i mlan0 -s bjforlinx -p 12345678 "
echo "eg: ./wifi.sh -i mlan0 -s bjforlinx -p NONE "
echo " -i : mlan0 or mlan1"
echo " -s : wifi ssid"
echo " -p : wifi password or NONE"
}
function parse_args()
{
while true; do
case "$1" in
-i ) wifi=$2;echo wifi $wifi;shift 2 ;;
-s ) ssid=$2;echo ssid $ssid;shift 2 ;;
-p ) pasw=$2;echo pasw $pasw;shift 2 ;;
-h ) usage; exit 1 ;;
* ) break ;;
esac
done
}
if [ $# != 6 ]
then
usage;
exit 1;
fi
parse_args $@
if [ -e /etc/wpa_supplicant.conf ]
then
rm /etc/wpa_supplicant.conf
fi
echo \#PSK/TKIP >> /etc/wpa_supplicant.conf
echo ctrl_interface=/var/run/wpa_supplicant >>/etc/wpa_supplicant.conf
echo ctrl_interface_group=0 >>/etc/wpa_supplicant.conf
echo update_config=1 >>/etc/wpa_supplicant.conf
echo network={ >>/etc/wpa_supplicant.conf
echo ssid=\"$ssid\" >>/etc/wpa_supplicant.conf
echo scan_ssid=1 >>/etc/wpa_supplicant.conf
if [ $pasw == NONE ]
then
echo key_mgmt=NONE >>/etc/wpa_supplicant.conf
else
echo psk=\"$pasw\" >>/etc/wpa_supplicant.conf
echo key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE >>/etc/wpa_supplicant.conf
# echo group=CCMP TKIP WEP104 WEP40 >>/etc/wpa_supplicant.conf
fi
echo } >>/etc/wpa_supplicant.conf
ifconfig -a|grep mlan0 |grep -v grep > /dev/null
if [ $? -eq 0 ]
then
ifconfig mlan0 down > /dev/null
fi
ifconfig -a|grep mlan1 |grep -v grep > /dev/null
if [ $? -eq 0 ]
then
ifconfig mlan1 down > /dev/null
fi
ifconfig -a|grep eth0 |grep -v grep > /dev/null
if [ $? -eq 0 ]
then
ifconfig eth0 down > /dev/null
fi
ifconfig -a|grep eth1 |grep -v grep > /dev/null
if [ $? -eq 0 ]
then
ifconfig eth1 down > /dev/null
fi
ifconfig -a|grep usb0 |grep -v grep > /dev/null
if [ $? -eq 0 ]
then
ifconfig usb0 down > /dev/null
fi
ps -fe|grep wpa_supplicant |grep -v grep > /dev/null
if [ $? -eq 0 ]
then
kill -9 $(pidof wpa_supplicant)
fi
sleep 1
ifconfig $wifi up > /dev/null
sleep 1
(wpa_supplicant -Dnl80211,wext -i$wifi -c/etc/wpa_supplicant.conf >/dev/null) &
echo "
waiting...
"
sleep 3
wpa_cli -i$wifi status |grep COMPLETED |grep -v grep >/dev/null
if [ $? -eq 0 ]
then
dhcpcd -i $wifi
echo "
Finshed!
"
else
echo "
try to connect again...
"
sleep 3
wpa_cli -i$wifi status |grep COMPLETED |grep -v grep >/dev/null
if [ $? -eq 0 ]
then
dhcpcd -i $wifi
echo "
nameserver 114.114.114.114
" > /etc/resolv.conf
echo "
Finshed!
"
else
echo "
************************************************
"
echo "
connect faild,please check the passward and ssid
"
kill -9 $(pidof wpa_supplicant)
exit 1
fi
fi
接下來就需要將固件部署到板卡的/lib/firmware路徑下:
root@rk3576-buildroot:/root# unzip firmware.zip -d /lib/
root@rk3576-buildroot:/root# ls /lib/firmware/iwlwifi-ty-a0-gf-a0*
/lib/firmware/iwlwifi-ty-a0-gf-a0-59.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-66.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-71.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-72.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-73.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-74.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-77.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-78.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-79.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-81.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-83.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-84.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-86.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0-89.ucode
/lib/firmware/iwlwifi-ty-a0-gf-a0.pnvm
接下來就可以加載模塊了:
root@rk3576-buildroot:/root# insmod iwlwifi.ko
[ 1996.796387] Intel(R) Wireless WiFi driver for Linux
[ 1996.803930] iwlwifi 0000:01:00.0: api flags index 2 larger than supported by driver
[ 1996.804075] iwlwifi 0000:01:00.0: TLV_FW_FSEQ_VERSION: FSEQ Version: 0.0.2.36
[ 1996.806470] iwlwifi 0000:01:00.0: loaded firmware version 72.a764baac.0 ty-a0-gf-a0-72.ucode op_mode iwlmvm
root@rk3576-buildroot:/root# insmod iwlmvm.ko
[ 2005.034727] iwlwifi 0000:01:00.0: Detected Intel(R) Wi-Fi 6 AX210 160MHz, REV=0x420
[ 2005.036391] thermal thermal_zone6: power_allocator: sustainable_power will be estimated
[ 2005.036966] thermal thermal_zone6: failed to read out thermal zone (-61)
[ 2005.212436] iwlwifi 0000:01:00.0: loaded PNVM version 35148b80
[ 2005.228063] iwlwifi 0000:01:00.0: Detected RF GF, rfid=0x10d000
[ 2005.299203] iwlwifi 0000:01:00.0: base HW address: 4c:49:6c:f0:99:7a
[ 2005.323434] iwlwifi 0000:01:00.0 wlp1s0: renamed from wlan0
如有上述信息,說明模塊已經(jīng)加載成功,即可看到網(wǎng)卡節(jié)點信息:
root@rk3576-buildroot:/root# ifconfig wlp1s0
wlp1s0 Link encap:Ethernet HWaddr 4C:49:6C:F0:99:7A
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
下面開始測試STA模式:
root@rk3576-buildroot:/root# ./fltest_wifi.sh -i wlp1s0 -s forlinx-wlan -p fl03123102650
ifconfig: SIOCGIFFLAGS: No such device
wifi wlp1s0
ssid forlinx-wlan
pasw fl03123102650
[ 2242.183049] rk_gmac-dwmac 2a220000.ethernet eth0: FPE workqueue stop
waiting...
try to connect again...
[ 2247.876030] wlp1s0: authenticate with ee:b9:70:81:7d:88
[ 2247.883905] wlp1s0: send auth to ee:b9:70:81:7d:88 (try 1/3)
[ 2248.015556] wlp1s0: send auth to ee:b9:70:81:7d:88 (try 2/3)
[ 2248.119667] wlp1s0: send auth to ee:b9:70:81:7d:88 (try 3/3)
[ 2248.172500] wlp1s0: authenticated
[ 2248.175429] wlp1s0: associate with ee:b9:70:81:7d:88 (try 1/3)
[ 2248.183347] wlp1s0: RX AssocResp from ee:b9:70:81:7d:88 (capab=0x1931 status=0 aid=42)
[ 2248.192191] wlp1s0: associated
[ 2248.218419] IPv6: ADDRCONF(NETDEV_CHANGE): wlp1s0: link becomes ready
main: control_open: Connection refused
dhcpcd-10.0.4 starting
dev: loaded udev
DUID 00:01:00:01:c7:92:c8:aa:4c:49:6c:f0:99:7a
wlp1s0: connected to Access Point: forlinx-wlan
wlp1s0: IAID 6c:f0:99:7a
wlp1s0: soliciting an IPv6 router
wlp1s0: rebinding lease of 192.168.81.206
wlp1s0: NAK: from 192.168.80.1
wlp1s0: soliciting a DHCP lease
wlp1s0: offered 192.168.81.206 from 192.168.80.1
wlp1s0: probing address 192.168.81.206/23
wlp1s0: leased 192.168.81.206 for 28800 seconds
wlp1s0: adding route to 192.168.80.0/23
wlp1s0: adding default route via 192.168.80.1
forked to background, child pid 1185
dhcpcd_fork_cb: truncated read 0 (expected 4)
Finshed!
測試ping到飛凌嵌入式官網(wǎng),查看是否可以正常上網(wǎng):
root@rk3576-buildroot:/root# ifconfig wlp1s0
wlp1s0 Link encap:Ethernet HWaddr 4C:49:6C:F0:99:7A
inet addr:192.168.81.206 Bcast:192.168.81.255 Mask:255.255.254.0
inet6 addr: fe80::4e49:6cff:fef0:997a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1547 errors:0 dropped:93 overruns:0 frame:0
TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:150462 (146.9 KiB) TX bytes:3123 (3.0 KiB)
root@rk3576-buildroot:/root# ping www.huaxiongtaifeng.com
PING s-526319.gotocdn.com (211.149.226.120) 56(84) bytes of data.
64 bytes from 211.149.226.120 (211.149.226.120): icmp_seq=1 ttl=54 time=45.9 ms
64 bytes from 211.149.226.120 (211.149.226.120): icmp_seq=2 ttl=54 time=40.1 ms
64 bytes from 211.149.226.120 (211.149.226.120): icmp_seq=3 ttl=54 time=39.8 ms
64 bytes from 211.149.226.120 (211.149.226.120): icmp_seq=4 ttl=54 time=40.8 ms
64 bytes from 211.149.226.120 (211.149.226.120): icmp_seq=5 ttl=54 time=40.5 ms
^C
--- s-526319.gotocdn.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 39.813/41.401/45.867/2.257 m
可以看到ping飛凌嵌入式官網(wǎng)是正常的,這樣小編就把STA模式配置好了。
那么,AP模式如何開啟?接下來,我們就介紹一下如何配置AP模式。
第一步還是需要編寫AP模式腳本。小編 將腳本放在了/usr/bin/目錄中,文件名稱為fltest_hostapd.sh ,同樣的也需要配置可執(zhí)行權(quán)限。
#!/bin/sh
cnt=`ps aux | grep wpa_supplicant | grep -v grep | wc -l`
if [ "${cnt}" != "0" ];then
killall wpa_supplicant > /dev/null
fi
cnt1=`ps aux | grep hostapd | grep -v grep | wc -l`
if [ "${cnt1}" != "0" ];then
killall hostapd > /dev/null
fi
/etc/init.d/S80dnsmasq stop
echo 1 > /proc/sys/net/ipv4/ip_forward
#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sleep 1
ifconfig wlp1s0 192.168.2.1
hostapd /etc/hostapd-2.4g.conf &
#hostapd /etc/hostapd-5g.conf &
/etc/init.d/S80dnsmasq start
以上就是fltest_hostapd.sh腳本的全部內(nèi)容。在fltest_hostapd.sh腳本中,還用到了/etc/hostapd-2.4g.conf配置文件,以下是文件的配置內(nèi)容:
interface=wlp1s0
driver=nl80211
channel=9
hw_mode=g
auth_algs=1
ieee80211n=1
wpa=1
ssid=OK3576_WIFI_2.4G_AP //AP模式wifi名稱
wpa_passphrase=12345678 //AP模式WiFi密碼
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
下面還需要配置下dnsmasq.conf服務(wù):
root@rk3576-buildroot:/root# vi /etc/dnsmasq.conf
interface=wlp1s0
bind-interfaces
except-interface=lo
dhcp-range=192.168.2.100,192.168.2.254,12h
dhcp-option=3,192.168.2.1
dhcp-option=6,192.168.2.1
有的朋友可能就要問了,在其他系統(tǒng)上使用的是udhcpd服務(wù),為什么在這里使用的DNSmasq服務(wù)?下面就簡單介紹一下這兩個服務(wù)的區(qū)別:
(1)udhcpd 是來自 BusyBox 工具集的 DHCP 服務(wù)器程序。主要的功能是為本地網(wǎng)絡(luò)設(shè)備分配動態(tài)IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)等信息。DHCP服務(wù)本身是不包含DNS轉(zhuǎn)發(fā)或其他的網(wǎng)絡(luò)服務(wù)。
(2)DNSmasq 是一個輕量級的 DNS 轉(zhuǎn)發(fā)器和 DHCP 服務(wù)器軟件。
① 可以將DNS查詢的請求轉(zhuǎn)發(fā)到上游DNS服務(wù)器,并緩存這些查詢結(jié)果,目的是為了提高網(wǎng)絡(luò)應(yīng)用的響應(yīng)速度。
② 做DHCP服務(wù)器時與第一條udhcpd服務(wù)功能相同,這里就不做重復(fù)介紹了。
此外,應(yīng)用場景也不同,DNSmasq主要用戶小型網(wǎng)絡(luò)環(huán)境。易于配置和管理,如家庭網(wǎng)絡(luò)、小型辦公室和路由器中;而udhpcd服務(wù)適合用于嵌入式系統(tǒng)或者資源有限的環(huán)境中。
擴展知識介紹完畢,下面就開啟AP模式:
root@rk3576-buildroot:/root# fltest_hostapd.sh
[ 6470.256308] wlp1s0: deauthenticating from ee:b9:70:81:7d:88 by local choice (Reason: 3=DEAUTH_LEAVING)
killall: hostapd: no process killed
Stopping dnsmasq: FAIL
Starting dnsmasq: OK
[ 6471.641533] IPv6: ADDRCONF(NETDEV_CHANGE): wlp1s0: link becomes ready
wlp1s0: interface state UNINITIALIZED->ENABLED
wlp1s0: AP-ENABLED
root@rk3576-buildroot:/root# ifconfig wlp1s0
wlp1s0 Link encap:Ethernet HWaddr 4C:49:6C:F0:99:7A
inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:50382 errors:0 dropped:2982 overruns:0 frame:0
TX packets:261 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4291281 (4.0 MiB) TX bytes:27170 (26.5 KiB)
下面就是要使用手機連接飛凌嵌入式RK3576開發(fā)板的熱點了。
root@rk3576-buildroot:/root# ping 192.168.2.225
PING 192.168.2.225 (192.168.2.225) 56(84) bytes of data.
64 bytes from 192.168.2.225: icmp_seq=1 ttl=64 time=142 ms
64 bytes from 192.168.2.225: icmp_seq=2 ttl=64 time=60.1 ms
64 bytes from 192.168.2.225: icmp_seq=3 ttl=64 time=88.2 ms
64 bytes from 192.168.2.225: icmp_seq=4 ttl=64 time=110 ms
64 bytes from 192.168.2.225: icmp_seq=5 ttl=64 time=69.9 ms
^C
--- 192.168.2.225 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
到此,一個新的AX210NGW Wi-Fi模塊就已經(jīng)適配完成了。小編在這里想告訴大家的是,PCIe Wi-Fi模塊的適配思路都是一樣的,如果有其他Wi-Fi模塊,大家也可以參考此方法動手嘗試。
相關(guān)產(chǎn)品 >
-
FET3576-C核心板
飛凌嵌入式RK3576核心板集成了強大的處理器和豐富的接口,提供出色的計算能力和擴展性。RK3576核心板以其卓越的性能、低功耗和穩(wěn)定性,成為工業(yè)、AIoT、邊緣計算、智能移動終端等領(lǐng)域的理想選擇。無論是數(shù)據(jù)處理還是邊緣計算,RK3576都能為項目提供強大的硬件支持。核心板推薦選擇飛凌嵌入式瑞芯微系列RK3576J業(yè)級核心板、RK3576高性能核心板。 了解詳情 -
OK3576-C開發(fā)板
RK3576開發(fā)板CPU選用瑞芯微RK3576,采用核心板+底板分體式設(shè)計,采用4個100Pin板對板連接器的方式將處理器的功能引腳以最便利的方式全部引出,并針對不同的功能做了深度優(yōu)化,方便用戶二次開發(fā)的同時簡化用戶設(shè)計,為您的項目提供良好的評估及設(shè)計依據(jù)。RK3576是瑞芯微專為AIoT市場打造的一款高算力、高性能、低功耗的國產(chǎn)化應(yīng)用處理器,集成了4個ARM Cortex-A72和4個 ARM Cortex-A53高性能核;內(nèi)置6TOPS超強算力NPU;嵌入式3D GPU加之帶有MMU的專用2D硬件引擎,最大限度提升顯示性能;H.265超清硬解碼,最高支持8K分辨率。 了解詳情