1. 程式人生 > >嵌入式linux系統支援usb wifi RTL8723BU

嵌入式linux系統支援usb wifi RTL8723BU

目前,在消費電子或商業電子領域,許多產品跑的是Android系統;而在工控等行業,應用linux,Ubuntu系統,也是十分普遍;當前很多主流的開發平臺,如全志,瑞星微,三星,官方提供的多是Android系統;若產品需要跑linux或Ubuntu,則需要使用者在官方提供的已有的支援之上,進行相應的移植支援;

比如linux,使用者使用具體平臺提供的uboot和kernel,然後把linux檔案系統(一般是通過移植buildroot)移植到所需平臺中;

下面的書寫,作為工作的一個記錄,與各位分享;

以下主要描述的是如何在linux中支援usb wifi RTL8723,即支援RTL8723BU的移植過程,而對於buildroot的移植過程,這裡暫不表;

平臺: 三星 S5P4418  (4核 A9)

開發板:G4418 (有興趣的可檢視這網站: http://www.graperain.cn/s5p4418/s5p4418-Development/)

核心: 3.4.39

(uboot,kernel,buildroot,RTL8723BU驅動原始碼,及交叉編譯工具,開發板供應商都有提供)

以下為移植過程:

1、編譯RTL8723BU原始碼,生成驅動檔案

這裡主要改動原始碼Makefile,指定用到的交叉編譯工具和核心原始碼(這兩者都是開發板供應商提供);

生成wlan.ko檔案;

2、重新配置核心,讓其支援80211 wext

核心的配置項為:CONFIG_CFG80211_WEXT

若此項不做配置,會出現類似的錯誤:用wireless工具列舉時,報錯

iwlist wlan0 scanning
wlan0     Interface doesn't support scanning.

3、buildroot中,配置支援wpa,wireless tools;重新生成linux的映像;

這樣後,檔案系統中就有wireless tools,wpa_supplicant等工具,無需另外新增;

4、經過1,2,3步驟後,重新更新kernel和linux檔案系統,然後把生成的wlan.ko也放到開發板中;(可通過u盤,tf卡方式)

接著進行測試:

首先,手動載入wlan驅動: insmod wlan.ko

/lib/modules]# insmod wlan.ko 
[  121.643000] RTL871X: module init start
[  121.647000] RTL871X: rtl8723bu v4.3.6.11_12942.20141204_BTCOEX20140507-4E40
[  121.654000] RTL871X: build time: May 13 2015 17:19:00
[  121.659000] RTL871X: rtl8723bu BT-Coex version = BTCOEX20140507-4E40
[  121.815000] 
[  121.817000] 29 81 03 7C 01 08 21 00 40 07 05 35 10 00 00 00 
[  121.823000] 26 26 26 26 26 26 28 28 28 28 28 02 FF FF FF FF 
[  121.830000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.837000] FF FF FF FF FF FF FF FF FF FF 2F 2F 2F 2E 2E 2E 
[  121.843000] 31 31 31 30 30 02 FF FF FF FF FF FF FF FF FF FF 
[  121.850000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.856000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.863000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.870000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.876000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.883000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.889000] FF FF FF FF FF FF FF FF 20 14 1F 00 00 00 FF FF 
[  121.896000] FF 28 20 11 00 00 00 FF 00 FF FF FF FF FF FF FF 
[  121.903000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.909000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.916000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.922000] DA 0B 20 B7 E7 47 03 34 C3 D2 BE C2 18 09 03 52 
[  121.929000] 65 61 6C 74 65 6B 16 03 38 30 32 2E 31 31 6E 20 
[  121.936000] 57 4C 41 4E 20 41 64 61 70 74 65 72 00 FF FF FF 
[  121.942000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.949000] FF FF FF FF FF FF FF 0F FF FF FF FF FF FF FF FF 
[  121.955000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.962000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.969000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.975000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.982000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.989000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  121.995000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  122.002000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  122.008000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  122.015000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  122.022000] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
[  122.031000] RTL871X: rtw_ndev_init(wlan0)
[  122.035000] RTL871X: rtw_ndev_init(wlan1)
[  122.040000] usbcore: registered new interface driver rtl8723bu
[  122.047000] RTL871X: module init ret=0

檢視網路情況:

/lib/modules]# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 72:F4:6C:A0:00:16  
          inet6 addr: fe80::70f4:6cff:fea0:16/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:580 (580.0 B)
          Interrupt:48 


ip6tnl0   Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          NOARP  MTU:1452  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:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  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:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


sit0      Link encap:IPv6-in-IPv4  
          NOARP  MTU:1480  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:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


wlan0     Link encap:Ethernet  HWaddr 34:C3:D2:BE:C2:18  
          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)


wlan1     Link encap:Ethernet  HWaddr 36:C3:D2:BE:C2:18  
          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)

上電wlan0,ifconfig wlan0 up 

wlan0     Link encap:Ethernet  HWaddr 34:C3:D2:BE:C2:18  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:76 errors:0 dropped:16 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源:

 iwlist wlan0 scanning

Cell 02 - Address: A0:63:91:DB:B6:AB                         
                    Channel:1                                          
                    Frequency:2.412 GHz (Channel 1)                                      
                    Quality=65/70  Signal level=-45 dBm                                  
                    Encryption key:on                                                                    
                    ESSID:"abc"                                                                  
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s                         
                              24 Mb/s; 36 Mb/s; 54 Mb/s                                  
                    Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s
                    Mode:Master                    
                    Extra:tsf=000000000ffa9085     
                    Extra: Last beacon: 34ms ago                                         
                    IE: Unknown: 0003747978                                                              
                    IE: Unknown: 010882848B962430486C                                                    
                    IE: Unknown: 030101                                                          
                    IE: Unknown: 2A0104                                                          
                    IE: Unknown: 2F0104                                                          
                    IE: IEEE 802.11i/WPA2 Version 1                                      
                        Group Cipher : CCMP            
                        Pairwise Ciphers (1) : CCMP                     
                        Authentication Suites (1) : PSK                 
                    IE: Unknown: 32040C121860                                                            
                    IE: Unknown: 0B050B00560000                                                          
                    IE: Unknown: 2D1AAD1917FFFFFF0000000000000000000000000000000000000000                
                    IE: Unknown: 3D1601001700000000000000000000000000000000000000
                    IE: Unknown: 4A0E14000A002C01C800140005001900
                    IE: Unknown: 7F080100080000000040  
                    IE: Unknown: DD810050F204104A0001101044000102103B00010310470010C1ADAADF8324644B14524BA52E1A59731021000D4E4554474541522C20496E632E10230007523633303076321024000752363330307632104200033637
                    IE: Unknown: DD09001018020B001C0000                                  
                    IE: Unknown: DD180050F2020101880003A4000027A400004243BC0062326600

至此,可以看到wifi模組已經是工作起來,可以搜到周圍的wifif源;

5、接下來,進行wifi的連線操作

首先,在開發板檔案系統的/etc下,建立配置檔案:

/etc]# cat wpa_supplicant.conf 
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1


network={
  ssid="abc" (備註,此處的abc,即為需要連線的wifi的名稱)
  scan_ssid=1
  key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE
  pairwise=TKIP CCMP
  group=CCMP TKIP WEP104 WEP40
  psk="[email protected]@" (備註,此處的字元,即可要連線的wifi的密碼)
}

然後在/run下,建立資料夾:

/run]# mkdir -p /var/run/wpa_supplicant

接著用以下命令,進行wifi的連線:

wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf &

/]# Successfully initialized wpa_supplicant
rfkill: Cannot open RFKILL control device
[  758.237000] RTL871X: RTW_ADAPTIVITY_EN_AUTO, chplan:0x20, Regulation:3,3
[  758.244000] RTL871X: RTW_ADAPTIVITY_MODE_NORMAL
[  758.770000] RTL871X: nolinked power save leave
wlan0: Trying to associate with a0:63:91:db:b6:ab (SSID='tyx' freq=2412 [  760.899000] RTL871X: rtw_set_802_11_connect(wlan0)  fw_state=0x00000008
MHz)
[  761.005000] RTL871X: start auth
[  761.010000] RTL871X: auth success, start assoc
[  761.018000] RTL871X: assoc success
[  761.022000] ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
wlan0: Associated with a0:63:91:db:b6:ab[  761.030000] RTL871X: send eapol packet


[  761.124000] RTL871X: send eapol packet
wlan0: WPA: Key negotiation completed with a0:63:91:db:b6:ab [PTK=CCMP GTK=CCMP]
wlan0: CTRL-EVENT-CONNECTED - Connection to a0:63:91:db:b6:ab completed [id=0 id_str=]
[  761.162000] RTL871X: set pairwise key camid:4, addr:a0:63:91:db:b6:ab, kid:0, type:AES
[  761.173000] RTL871X: set group key camid:5, addr:a0:63:91:db:b6:ab, kid:1, type:AES

從列印看到,連線成功;

6、獲取ip,讓開發板能夠通過wifi上網;

方法1:手動設定

 ifconfig wlan0 192.168.1.30

 route  add  default   gw  192.168.1.1(新增閘道器)

echo "nameserver 192.168.1.1" >>/etc/resolv.conf  (改動resolv.conf檔案)

以上操作後,嘗試ping 閘道器和外網(www.baidu.com),都能成功;

方法2:自動獲取ip

udhcpc -i wlan0  (這樣操作後,開發板獲取都ip,可以連線外網)

至此,wifi的移植和測試已經完成;

而為了方便,我們可以把以上的連線wifi的那部分操作,做成一個指令碼,省去一些麻煩;如下:

在開發板檔案系統中,建立指令碼檔案wapstart,內容如下:

#!/bin/sh
wldevname=$1
wlessidname=$2
wlkeyvar=$3


insmod /lib/modules/wlan.ko
mkdir -p /var/run/wpa_supplicant
echo "ctrl_interface=/var/run/wpa_supplicant" >/tmp/wpa_supplicant.conf
echo "network={" >>/tmp/wpa_supplicant.conf
echo "ssid=\"$wlessidname\"" >>/tmp/wpa_supplicant.conf
echo "key_mgmt=WPA-EAP WPA-PSK  IEEE8021X NONE" >>/tmp/wpa_supplicant.conf
echo "pairwise=CCMP TKIP" >>/tmp/wpa_supplicant.conf
echo "group=CCMP TKIP WEP104 WEP40" >>/tmp/wpa_supplicant.conf
echo "psk=\"$wlkeyvar\"" >>/tmp/wpa_supplicant.conf
echo "}" >>/tmp/wpa_supplicant.conf
wpa_supplicant -Dwext -i$wldevname -c/tmp/wpa_supplicant.conf &

執行此指令碼的命令為:

wpastart wlan0 abc [email protected]@  (備註,abc為wifi名稱,[email protected]@為wifi密碼)

這樣即可完成wifi的連線操作;

以上所用的wifi模組為usb介面,所用開發板的平臺為G4418; 若需要在其它平臺支援,如全志,瑞星微等,移植的過程也是類似的;有需要的可以自行嘗試;

互相交流,互相學習,共同進步!

技術交流:3249188421 (qq)