目錄結構說明
一、環境說明
1、環境介紹
2、確認usbwifi網卡信息
3、相關驅動
二、配置編譯驅動
0、編譯前檢查host配置
1、通過menuconfig配置7601驅動
2、執行make編譯
三、測試驅動
1、掛載mt7601u驅動
2、 出現問題排查
四、安裝wifi配置工具
1、wifi配置工具介紹
2、通過buildroot配置wpa_supplicant工具
五、wpa_supplicant工具使用
一、環境說明
1、環境介紹
?? 首先這里我們需要安裝一些基礎的編譯環境,安裝tftp服務器,安裝nfs服務器等,這里我們可以參考文章《orangpione利用usb共享網絡(RNDIS)實現tftp加載內核掛載到NFS根文件系統》中的環境準備章節,自行安裝相關服務,在這里不展開。后續的開發是基于tftp和nfs傳輸的條件下進行,如果沒有實現相關傳輸,也可以通過燒錄sd卡的形式進行。
2、確認usbwifi模塊信息
??1. 確認usbwifi網卡的相關產品信息,我們可以通過把網卡插入windowns,且驅動后查詢相關驅動信息。這里我們主要是為了獲取usb設備的VID和PID,如下圖,可知USBWiFi的VID是0x148f,而PID是0x7601
?? PID/VID唯一標識一個設備,HardwareID是為了給系統識別的 ,他是根據PID/VID而生成的。這個與序列號沒什么關系,序列號一般都是廠家固化到芯片中的信息而已。GUID只是為了標志你安裝的設備是屬于一個什么類當中,這個類可以顯示再設備管理器中。比如:你可以定義一個類,當然這個類有與系統中任何類都不同的GUID,然后選擇一個圖標和類名,就可以同網卡等其他設備一起顯示在設備管理器下的根目錄中了
??根據USB規范的規定,所有的USB設備都有供應商ID(VID)和產品識別碼(PID),主機通過不同的VID和PID來區別不同的設備,VID和PID都是兩個字節長,其中,供應商ID(VID)由供應商向USB執行論壇申請,每個供應商的VID是唯一的,PID由供應商自行決定,理論上來說,不同的產品、相同產品的不同型號、相同型號的不同設計的產品最好采用不同的PID,以便區別相同廠家的不同設備。
??VID和PID通常情況下有兩種存儲方式,第一種是主控生產商的VID和PID,存儲在主控的bootcode中;第二種是設備生產商的VID和PID,該VID和PID存儲在主控外部的非易失性存儲設備中(EEPROM或Flash)的設備固件中,當USB設備連接主機時,如果固件中有設備生產商的VID和PID,會將該VID和PID報告給主機,而忽略主控生產商的VID和PID。所以理論上一個USB存儲設備的VID應該是設備生產商的VID,而不是主控生產商的VID,這兩個VID應該是不同的(主控生產商自己生產的設備除外)。
??由于VID和PID重復并不會對產品的使用帶來嚴重影響,很多USB設備生產商(山寨廠居多)為了方便,并不會向USB執行論壇申請自己的VID,而是依然沿用主控生產商的VID或隨便向產品寫入VID和PID;同時,正規廠家只需要申請VID,PID由廠家自行確定,所以存在相同型號的產品,可能采用了不同的主控(商業需要,很正常),而他們的PID是一樣的,基于上述原因通過VID和PID就不能準確識別USB設備的主控型號,這個問題大家在使用USB設備的過程中需要注意。
3、相關驅動
- 確定我們的設備是mt7601u后,我們先到官網了解相關信息,官網地址https://www.mediatek.com/products/broadbandWifi/mt7601u,其中可以看到里面有linux下的驅動,官方給出的驅動源碼連接為https://d86o2zu8ugzlg.cloudfront.net/mediatek-craft/drivers/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2,官方的驅動源碼看起來有點老了,是2013年9月13日的包,我們需要再確認下有沒有新的驅動更新,畢竟現在內核都5.7了。
- 在github倉庫中找到https://github.com/kuba-moo/mt7601u
有新的mt7601驅動,而且按照其描述信息,已經支持到內核4.2了,但是還不是最新的驅動,找了好多資料但是后面沒有找到更新的相關信息了。 - 很偶然的情況下,在kernel的源碼
make menuconfig
搜索7601的時候發現,內核本身竟然已經支持有mt7601u的驅動了,直接配置好,后續開始編譯
二、配置編譯驅動
0、編譯前檢查host配置
如果沒有host驅動部分,很多usb外設都不能工作,lsusb沒有任何反應
Support for Host-side USB--->CONFIG_USB=y
Inventra Highspeed Dual Role Controller--->CONFIG_USB_MUSB_HDRC
--->MUSB Mode Selection (Dual Role mode)
--->Dual Role mode--->CONFIG_USB_MUSB_DUAL_ROLE
1、通過menuconfig配置7601驅動
- 在內核源碼目錄執行
make menuconfig
(前提已經配置了相關的arch和gcc),進入搜索界面搜索7601,發現7601的相關相關配置路徑為Device Drivers--->Network device support--->Wireless LAN--->MediaTek devices--->MediaTek MT7601U (USB) support
搜索7601
7601u - 在配置7601模塊時發現,還需要配置mac80211和cfg80211驅動模塊,其配置路徑為
Networking support--->Wireless
下的cfg80211 - wireless configuration API 和Generic IEEE 802.11 Networking Stack (mac80211)
80211
2、執行make編譯
- 執行
make modules -j4
編譯,或者通過make M=drivers modules -j4
編譯net目錄下的modules,編譯完成后,會在源碼的下面位置出現ko文件
net/wireless/cfg80211.ko
net/mac80211/mac80211.ko
drivers/net/wireless/mediatek/mt7601u/mt7601u.ko
- 通過執行
make modules_install INSTALL_MOD_PATH=rootfs
,把模塊安裝到指定的目錄中去,賺了我們安裝到我們的nfs根文件系統中,INSTALL_MOD_PATH指定安裝目錄。安裝后可以到我們指定的安裝目錄下查看是否有上面的ko文件,具體目錄如下
lib/modules/5.7.7/kernel/net/wireless/cfg80211.ko
lib/modules/5.7.7/kernel/net/mac80211/mac80211.ko
lib/modules/5.7.7/kernel/drivers/net/wireless/mediatek/mt7601u/mt7601u.ko
- 由于我這里是直接安裝到,nfs根文件系統中,這里我們只需要更新zImage和dtb文件到tftp服務目錄下,然后重啟開發板,就可以直接進入系統,進行模塊的加載測試了。(用nfs開發比較方便可以省去燒錄的步驟,哈哈哈)
三、測試驅動
1、掛載mt7601u驅動
- 在開發板登錄系統,通過命令
modprobe -l | grep mt7601
查看是否存在mt7601的內核依賴關系 - 通過命令
modprobe mt7601u
加載7601的usbwifi驅動 - 插入usbwifi模塊,會顯示如下信息,顯然這里出錯了,但是為什么呢
[ 92.490546] usb 3-1: reset high-speed USB device number 2 using ehci-platform
[ 92.693611] mt7601u 3-1:1.0: ASIC revision: 76010001 MAC revision: 76010500
[ 92.702041] mt7601u 3-1:1.0: Direct firmware load for mt7601u.bin failed with error -2
[ 92.710670] mt7601u: probe of 3-1:1.0 failed with error -2
2、 出現問題排查
- 出現問題后,谷歌一番后,發現這個問題其實是由于,開發板的文件系統缺少mt7606u.bin文件導致的,這里參考https://github.com/kuba-moo/mt7601u,我們從官方的源碼的
src/mcu/bin
把其MT7601.bin文件拷貝到我們開發板的nfs系統的/lib/firmware
目錄下,并重命名問mt7601u.bin文件
“Download the vendor driver (see section below) and copy file MT7601U.bin to /lib/firmware”
cp src/mcu/bin/MT7601.bin /lib/firmware/mt7601u.bin
- 在虛擬機拷貝完后,因為nfs系統,我們可以直接到開發板先通過命令,
modprobe -r mt7601u
移除之前的mt7601u模塊 - 我們再次重新加載
modprobe mt7601u
模塊,如無意外可以輸出下面的信息,這里提示failed to load regulatory.db這個數據庫,但是發現對于驅動沒有影響,我就忽略了
[ 5998.967033] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[ 5998.976850] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[ 5998.985609] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[ 5998.994261] cfg80211: failed to load regulatory.db
[ 5999.007632] usbcore: registered new interface driver mt7601u
- 通過ifconfig -a查看網卡接口,這里可以看到wlan0,有的可能是ra0,則表示驅動成功
wlan0 Link encap:Ethernet HWaddr 20:0D:B0:1D:56:D0
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
四、安裝wifi配置工具
1、wifi配置工具介紹
??wpa_supplicant本是開源項目源碼,被谷歌修改后加入Android移動平臺,它主要是用來支持WEP,WPA/WPA2和WAPI無線協議和加密認證的,而實際上的工作內容是通過socket(不管是wpa_supplicant與上層還是wpa_supplicant與驅動都采用socket通訊)與驅動交互上報數據給用戶,而用戶可以通過socket發送命令給wpa_supplicant調動驅動來對WiFi芯片操作。 簡單的說,wpa_supplicant就是WiFi驅動和用戶的中轉站外加對協議和加密認證的支持。
??目前可以使用wireless-tools 或wpa_supplicant工具來配置無線網絡。請記住重要的一點是,對無線網絡的配置是全局性的,而非針對具體的接口。
??wpa_supplicant是一個較好的選擇,但缺點是它不支持所有的驅動。請瀏覽wpa_supplicant網站獲得它所支持的驅動列表。另外,wpa_supplicant目前只能連接到那些你已經配置好ESSID的無線網絡。wireless-tools支持幾乎所有的無線網卡和驅動,但它不能連接到那些只支持WPA的AP。
??經過編譯后的wpa_supplicant源程序可以看到兩個主要的可執行工具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的關系就是服務和客戶端的關系:后臺運行wpa_supplicant,使用wpa_cli來搜索、設置、和連接網絡。
2、通過buildroot配置wpa_supplicant工具
- 通過build配置wpa_supplicant,比較簡單,因為所有的依賴以及要處理的都由buildroot幫忙處理了,我們只需要配置好wpa_supplicant功能即可。
- 執行命令
./build.sh menuconfig
(這里的腳本是之前章節定義好的),配置wpa_supplicant功能開啟
路徑為:```Target packages--->Networking applications--->wpa_supplicant,配置如圖(同時配置了wpa_cli)
wpa_supplicant - 執行命令
./build.sh -j4
,編譯wpa_supplicant,由于buildroot會直接編譯出wpa_supplicant的可這行文件,并拷貝到根文件目錄(也是我的nfs根目錄),其文件具體路徑為build/wpa_supplicant-2.9/wpa_supplicant/wpa_supplicant
,在跟文件系統的目錄在/usr/sbin/wpa_supplicant
- 由于開發板掛載的nfs根文件系統就是buildroot編譯的根文件系統,所以可以直接在開發板上輸入wpa用tap補全出wpa_supplicant,則說明wpa_supplicant安裝完成。
- 如果喜歡編譯源碼的朋友可以參考https://www.cnblogs.com/y4247464/p/13373143.html進行wpa_supplicant的編譯,可以通過http://w1.fi/releases/wpa_supplicant-2.9.tar.gz下載2.9版本或者其他版本的wpa_supplicant
五、wpa_supplicant工具使用
-
vi /etc/wpa_supplicant.conf
,修改wpa_supplicant配置文件,主要配置賬號密碼和加密方式
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
ssid="ssid"
psk="passwd"
proto=WPA
key_mgmt=WPA-PSK
}
- 通過命令
ifconfig wlan0 up
啟動wifi網口 - 通過命令
wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlan0
啟動wpa_supplicant 工具,出現類似授權信息
[ 45.102774] wlan0: authenticate with 60:3a:7c:56:92:d3
[ 45.175326] wlan0: send auth to 60:3a:7c:56:92:d3 (try 1/3)
[ 45.182540] wlan0: authenticated
[ 45.190692] wlan0: associate with 60:3a:7c:56:92:d3 (try 1/3)
[ 45.202769] wlan0: RX AssocResp from 60:3a:7c:56:92:d3 (capab=0x1411 status=0 aid=4)
[ 45.243124] wlan0: associated
- 通過命令
wpa_cli -iwlan0 status
,查看wlan相關的信息
bssid=60:3a:7c:56:92:d3
freq=2462
ssid=TP-LINK_104
id=0
mode=station
wifi_generation=4
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA-PSK
wpa_state=COMPLETED
address=20:0d:b0:1d:56:d0
uuid=5ed4ac07-94e1-5153-8b79-5fd575d8c183