Raspberry PI 2上的802.11ac網卡驅動編譯html
最近在樹莓派2上折騰視頻,用來作FPV,可是發現2.4G的控會嚴重干擾2.4G WIFI,在開控的時候個人臺式機+外置USB網卡都頻頻掉線。考慮了一下,5.8G的頻段雖然相對2.4G穿透能力更低,可是現階段5.8G更乾淨,而且5.8G與2.4G沒有倍頻關係,不容易互相干擾(1.2G的圖傳就會干擾2.4G的控)。linux
因而去買了個支持雙頻11AC的網卡,拿到以後直接插上Pi2,果真——不認,lsusb查了下這個網卡還比較新,用的是RTL8811芯片,官網上提供了Linux下的驅動,和GitHub上的比較了一下還算比較新。仔細看了下驅動包發現裏面沒有RTL8811的驅動,對比Github上的源碼Makefile,認定應該是用RTL8821A的驅動就能夠。git
首先在PC上實驗一下,解壓驅動包,安裝腳本加上執行權限chmod +x install.sh,而後./install.sh(須要配好內核代碼和編譯環境),就能夠了,至少這個驅動是能夠用的。github
進一步在樹莓派上編譯內核驅動,首先是要獲取樹莓派Linux內核源碼。樹莓派的Linux內核是定製的,源碼發佈在https://github.com/raspberrypi/linux 。從GitHub上不必定能夠找到原裝鏡像的源碼版本,若是源碼版本和運行的鏡像內核版本不對應,編譯出來的內核模塊就沒法插入。爲了減小沒必要要的麻煩,最好直接編譯一份最新的內核來使用,我是直接在樹莓派上作的內核編譯,至少須要4個小時。爲了節約時間,常常編譯的話能夠在PC上搭建交叉編譯環境,這裏就不展開說了。shell
準備內核編譯環境和源碼,當前的鏡像(官方鏡像:2015-09-24-raspbian-jessie.zip)中已經包含了大部分編譯環境:vim
sudo apt-get bc #內核編譯環境需求:高精度計算語言 git clone https://github.com/raspberrypi/linux.git #假設源碼在/home/pi/linux cd /lib/modules mkdir 4.1.y #先隨便創建一個目錄,有可能須要sudo,酌情添加,如下再也不提示
cd 4.1.y
ln -s /home/pi/linux build
ln -s /home/pi/linux source
接下來要獲取如今運行內核的內核配置,make的時候就能夠根據這個現成配置自動編譯(不須要手工去指定各項配置,解除了一件很繁重的工做)。因爲最新樹莓派內核已經把configs做爲一個模塊編譯,因此須要先加載:網絡
sudo modprobe configs
cd /home/pi/linux
zcat /proc/config.gz > .config #獲得內核配置文件
make #開始編譯內核
執行make以後,須要回答幾個問題(由於老版本內核配置沒有包含新版本的某些設置),這裏我所有按m編譯爲模塊,以便之後須要的時候能夠modprobe加載。less
編譯開始以後就須要好幾個小時等待內核編譯完成,若是用SSH等網絡方式登錄到樹莓派上,很容易掉線致使編譯中止,最好直接用串口或者screen等方式啓動make。函數
在Pi2上若是想快一點能夠用make -j4,使用4覈編譯。測試
內核編譯完成後須要繼續編譯module,這一步比較快:
make modules sudo make modules_install sudo cp arch/arm/boot/Image /boot/kernel-4.1.y.img #將新編譯的內核拷貝到/boot
接下來須要配置樹莓派使用新內核啓動,編輯/boot/config.txt,追加一行:
kernel=/boot/kernel-4.1.y.img
保存退出以後,用sudo reboot重啓便可,啓動完成以後/lib/modules下面會多一個以當前內核版本命名的目錄,這個目錄名字和uname -r獲取的結果是一致的。cd進去看看,若是沒有build和source就像前面同樣,把Linux內核源碼連接過來。
終於能夠開始編譯內核驅動了。因爲驅動沒有提供樹莓派的編譯選項,須要手工修改Makefile,就再也不執行./install.sh腳本,而是手工調用make:
sudo apt-get install unrar cd /home/pi #假設驅動包在/home/pi
unrar x 8811linux.rar
cd 8811linux/driver/rtl8821AU_linux_v4.3.14_13455.20150212_BTCOEX20150128-51 #具體路徑根據版本調整
vim Makefile
在Makefile中確認CONFIG_RTL8821A = y存在,而後搜索CONFIG_PLATFORM_I386_PC將其設爲n,並添加一行CONFIG_PLATFORM_ARM_RPI = y。
繼續搜索CONFIG_PLATFORM_I386_PC的處理代碼塊,在其後面添加如下處理腳本:
ifeq ($(CONFIG_PLATFORM_ARM_RPI), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN ARCH := arm CROSS_COMPILE := KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/ endif
保存退出,到如今準備活動終於完成,能夠開始編譯驅動:
make sudo make install sudo insmod 8821au.ko
以上是正常編譯Linux內核模塊的步驟,一樣make的時候能夠加上-j4參數。
實際上在樹莓派上編譯的時候有兩個坑。首先是編譯的時候會報錯:
-Werror=date-time/macro 「__DATE__」 might prevent reproducible builds
解決這個錯誤只須要在Makefile中查找EXTRA_CFLAGS,並添加一行EXTRA_CFLAGS += -Wno-error=date-time便可。
其次,我這個版本的驅動引用了strnicmp函數,可是目前的樹莓派Linux內核源碼(4.1.17)並無定義這個函數,不過定義了strncasecmp,功能是相同的。grep驅動代碼找到全部的strnicmp替換爲strncasecmp便可。
順利的話insmod以後網卡會亮起來,能夠用dmesg和iwconfig進行確認。
最後修改/etc/network/interfaces添加WIFI配置就能夠上網了:
allow-hotplug wlan0 iface wlan0 inet dhcp wpa-ssid <YOUR-ACCESS-POINT-SSID> wpa-psk <YOUR-ACCESS-POINT-PASSKEY>
測試了一下5.8G的網絡確實干擾少不少,但穿牆效果不行。因爲FPV是在空中,較少有阻隔,問題也不大就是了。
另外研究了一下這個網卡是50mW發射功率的,比起正常圖傳來講小了不少,用來前期作實驗折騰是不錯的,後期須要增程的話能夠換大功率網卡或者加裝雙向WIFI功放。