在arm Cortex-A9開發板移植rtl8821au無線網絡卡並實現與外網通訊
開發板:Xilinx ZC702
嵌入式系統:linux4.4
交叉編譯器:arm-xilinx-linux-gnueabi-gcc
WIFi工具:wireless_tools.30.rtl
驅動版本:rtl8821AU_WiFi_linux_v5.2.6.2_23547.20170814_COEX20170206-6760
本文中所用的rtl8821au無線網絡卡實為藍芽無線網絡卡二合一裝置,此處只當做無線網絡卡使用。移植所使用的工具為iwlist、iwconfig等,這是以前WiFi模組中使用的舊工具,現在已經推出了新的基於nl80211的用於無線裝置的CLI配置實用程式iw,建議以後的WiFi移植使用iw和nl80211以替換iwlist和iwconfig。
rtl8821au無線網絡卡的移植包括驅動移植和工具移植兩部分,下面分別介紹
(一)驅動移植
1、修改原始碼根目錄下的Makefile:
CONFIG_PLATFORM_I386_PC = n
CONFIG_PLATFORM_ANDROID_X86 = n
CONFIG_PLATFORM_ARM_S3C2K4 = n
CONFIG_PLATFORM_ARM_PXA2XX = n
CONFIG_PLATFORM_ARM_S3C6K4 = y
將CONFIG_PLATFORM_I386_PC改為n, 將CONFIG_PLATFORM_ARM_S3C6K4改為y。
2、之後找到ifeq ($(CONFIG_PLATFORM_ARM_S
ifeq ($(CONFIG_PLATFORM_ARM_S3C6K4), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
ARCH := arm
CROSS_COMPILE := arm-xilinx-linux-gnueabi-
KVER := 4.4.0
KSRC ?= /xilinx/wifi/linux-xcomm_zynq
endif
此處的KSRC是你嵌入式平臺所用Linux系統的原始碼路徑。KVER為嵌入式Linux版本。CROSS_COMPILE為交叉編譯鏈。
3、這些工作完成之後直接在當前目錄make,沒有錯誤的話會得的8821au.ko檔案。將檔案拷貝到開發板,啟動後,insmod 8821au.ko命令載入。
此時可以cat /proc/net/wireless檔案檢視是否有wlan0資訊,如下所示,如果能看到wlan0則說明驅動安裝成功。
Inter-| sta-| Quality | Discarded packets | Missed | WE
face | tus | link level noise | nwid crypt frag retry misc | beacon | 22
wlan0: 0000 0. 0. 0. 0 0 0 0 0 0
(二)工具移植
1、進入wireless_tools.30.rtl,修改Makefile,如下所示:
2、make,之後將生成iwlist、iwconfig、iwpriv等工具以及iwlib.so,將iwlist、iwconfig等工具拷貝到目標板/usr/bin目錄,將iwlib.so庫拷貝到目標板/lib或/usr/lib庫。
(三)工具使用方法
1、分配IP: ifconfig wlan0 192.168.43.19
2、啟動無線網絡卡: ifconfig wlan0 up
3、掃描附近WiFi熱點: iwlist wlan0 scan
4、連線WiFi: iwconfig wlan0 essid "zj"
這是無密碼WiFi的連線命令,這裡連線了一個熱點名為zj的WiFi,如果前面步驟沒有問題到這一步應該就可以連線成功。
但如果只做到這一步的話,在使用時就會發現板子WiFi只可以連線外部熱點,卻無法ping通百度,無論怎麼設定閘道器和IP都無濟於事。這時需要移植udhcpc工具以實現動態分配IP(參考http://www.yixiangzhan.com/detail/zJBnkAEJ.html)。
(四)移植udhcpc
(1)將busybox目錄下的examples/udhcp/下的simple.script檔案重新命名為default.script,並將檔案拷貝到開發板/usr/share/udhcpc下,修改許可權。
(2)執行動態分配IP地址: udhcpc -i wlan0
執行這步之後系統會自動分配IP地址,這時再ping百度即可ping通: