今天記錄我在I.MX6Q平台移植RT5370無線網卡驅動程式的過程,加qq1126137994 微信:liu1126137994 共同學習更多技術!!!
兩種移植方法:1、移植官方下載下傳的RT5370驅動程式源碼 2、在Linux核心配置自帶的RT5370驅動程式
今天先記錄移植官方下載下傳的RT5370驅動程式源碼。核心自帶的驅動的配置方法放到以後的文章中!
一、移植官方下載下傳的驅動程式源碼
***軟體環境:***虛拟機ubuntu12.04
硬體環境: IMX6Q單闆 RT5370wifi晶片
RT5370驅動程式源碼下載下傳點選下載下傳:
先說一下思路:當我們需要移植一個驅動程式的時候,大概有兩種移植的情況:移植核心自帶的驅動程式,移植非核心自帶的驅動程式
這裡先說移植非核心自帶的驅動程式的思路:首先要看源程式的README檔案,看别人說的是如何修改與配置。然後一定會修改的檔案是Makefile檔案(主要是指定編譯工具,核心樹,單闆資訊等),然後有可能還會需要修改其他配置檔案(這與具體的驅動程式有關)。
1. 首先下載下傳驅動程
下載下傳好的驅動程式放到Linux系統,解壓,打開README_STA_usb檔案:
=======================================================================
Build Instructions:
====================
1> $tar -xvzf DPB_RT2870_Linux_STA_x.x.x.x.tgz
go to "./DPB_RT2870_Linux_STA_x.x.x.x" directory.
2> In Makefile
set the "MODE = STA" in Makefile and chose the TARGET to Linux by set "TARGET = LINUX"
define the linux kernel source include file path LINUX_SRC
modify to meet your need.
3> In os/linux/config.mk
define the GCC and LD of the target machine
define the compiler flags CFLAGS
modify to meet your need.
** Build for being controlled by NetworkManager or wpa_supplicant wext functions
Please set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y'.
=> #>cd wpa_supplicant-x.x
=> #>./wpa_supplicant -Dwext -ira0 -c wpa_supplicant.conf -d
** Build for being controlled by WpaSupplicant with Ralink Driver
Please set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n'.
=> #>cd wpa_supplicant-0.5.7
=> #>./wpa_supplicant -Dralink -ira0 -c wpa_supplicant.conf -d
4> $make
# compile driver source code
# To fix "error: too few arguments to function ˉiwe_stream_add_event"
=> $patch -i os/linux/sta_ioctl.c.patch os/linux/sta_ioctl.c
5> $cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
6> load driver, go to "os/linux/" directory.
#[kernel 2.4]
# $/sbin/insmod rt2870sta.o
# $/sbin/ifconfig ra0 inet YOUR_IP up
#[kernel 2.6]
# $/sbin/insmod rt2870sta.ko
# $/sbin/ifconfig ra0 inet YOUR_IP up
7> unload driver
$/sbin/ifconfig ra0 down
$/sbin/rmmod rt2870sta
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
在README_STA_usb檔案中找到上述内容,上述内容就是告訴你如何修改編譯驅動程式的。
那麼我們就根據上述7條内容來執行:
(1)解壓
(2)修改Makefile:
打開源代碼程式Makefile,發現MODE = STA TARGET = LINUX 已經是與要求的一樣了,那麼這兩個地方就不用修改!!!
然後找到PLATFORM = SMDK 将它的注釋去掉,用的平台是SMDK,同時注釋掉本身設定的PLATFORM = PC 這句話。
找到:
ifeq ($(PLATFORM),SMDK)
LINUX_SRC = /home/bhushan/itcenter/may28/linux-2.6-samsung
CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
endif
1
2
3
4
修改為:
ifeq ($(PLATFORM),SMDK)
LINUX_SRC = /home/zsl/work/system/linux-3.0.35
CROSS_COMPILE = /home/zsl/work/system/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-
endif
#其中LINUX_SRC代表我們開發闆使用的Linux作業系統的核心目錄 #
#CROSS_COMPILE代表我們編譯核心用的編譯工具的目錄#
1
2
3
4
5
6
(3)修改os/linux/config.mk
根據文檔:
define the GCC and LD of the target machine
define the compiler flags CFLAGS
檢視config.mk發現如下:
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
1
2
$(CROSS_COMPILE)這個是變量引用,在Makefile中這個變量就代表:/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
是以在這裡就不需要修改!!!
然後找到:
# Support AP-Client function
HAS_APCLI=n
# Support Wpa_Supplicant
HAS_WPA_SUPPLICANT=n
# Support Native WpaSupplicant for Network Maganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n
1
2
3
4
5
6
7
8
9
10
把這幾個值的n全部變成y:
# Support AP-Client function
HAS_APCLI=y
# Support Wpa_Supplicant
HAS_WPA_SUPPLICANT=y
# Support Native WpaSupplicant for Network Maganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
1
2
3
4
5
6
7
8
9
10
然後文檔中還有說關于wpa_supplicant的操作與使用放到下一篇文章講解!
(4)make
編譯源碼程式,會在os/linux/目錄下生成rt5370sta.ko驅動子產品程式!!!
(5)load driver
裝載驅動程式。裝載驅動程式之前需要
将/os/linux/目錄下的rt5370sta.ko拷貝到開發闆上,并将驅動根目錄下的RT2870STA.dat拷貝到開發闆的/etc/Wireless/RT2870STA/目錄下,前提是需要自己手動建立/etc/Wireless/RT2870STA/目錄
然後裝載驅動程式
insmod rt5370sta.ko
我的出現如下錯誤:
rt5370sta: Unknown symbol usb_alloc_urb (err 0)
rt5370sta: Unknown symbol usb_free_urb (err 0)
rt5370sta: Unknown symbol usb_alloc_coherent (err 0)
rt5370sta: Unknown symbol usb_register_driver (err 0)
rt5370sta: Unknown symbol usb_put_dev (err 0)
rt5370sta: Unknown symbol usb_get_dev (err 0)
rt5370sta: Unknown symbol usb_submit_urb (err 0)
rt5370sta: Unknown symbol usb_free_coherent (err 0)
rt5370sta: Unknown symbol usb_control_msg (err 0)
rt5370sta: Unknown symbol usb_deregister (err 0)
rt5370sta: Unknown symbol usb_kill_urb (err 0)
insmod: error inserting 'rt5370sta.ko': -1 Unknown symbol in module
1
2
3
4
5
6
7
8
9
10
11
12
這些錯誤都是那些函數無符号,至于為什麼無符号,我查了一下,有可能是沒有聲明GPL協定,需要更改os/linux下的usb_main_dev.c檔案,在開頭的地方寫上:
MODULE_LICENSE("GPL");
1
然後make 重新編譯源碼程式!!!編譯成功
重新加載驅動程式:
insmod rt5370sta.ko
顯示裝載成功!!!
然後我們ifconfig ra0 up
打開ra0後,再ifconfig檢視一下:
這說明我們的驅動程式已經可以正常使用了!!!
再解除安裝試一下:
首先:ifconfig ra0 down
然後: rmmod rt5370sta.ko
可以看出,我們的WIFI驅動程式可以正常使用與解除安裝!!!
那麼接下來的README_STA_usb 文檔中的内容是介紹如何操作使用wpa_supplicant。
這裡說一下wpa_supplicant
wpa_supplicant主要是用來支援WEP,WPA/WPA2和WAPI無線協定和加密認證的,由于linux本身并不支援WPA的加密,是以需要移植wpa_supplicant來使wifi能夠連接配接WPA加密的無線路由上,簡單的說,wpa_supplicant就是WiFi驅動和使用者的中轉站外加對協定和加密認證的支援。
wpa_supplicant的移植就放到下一篇文章中了~
想一起探讨以及獲得各種學習資源加我:
qq:1126137994
微信:liu1126137994
可以共同交流關于嵌入式,作業系統,C++語言,C語言,資料結構等技術問題。
---------------------
作者:楊柳_
來源:CSDN
原文:https://blog.csdn.net/qq_37375427/article/details/79492044
版權聲明:本文為部落客原創文章,轉載請附上博文連結!
1.下載下傳最新的rtl8188cu的linux驅動:
下載下傳頁面:http://www.realtek.com/downloads/downloadsView.aspx?Langid=1&PNid=48&PFid=48&Level=5&Conn=4&DownTypeID=3&GetDown=false&Downloads=true#RTL8188CUS或在本附件内直接下載下傳即可.
2.解壓縮下載下傳的檔案,把驅動檔案rtl8192_8188CU_linux_xxx.tar.gz(xxx是版本号)添加到要編譯的核心樹裡面去
(1)假定你的核心位置為/root/linux-kernel,解壓縮驅動檔案,并且把解壓縮後的驅動檔案夾名改為rtl8192cu。
(2)把改好名字的驅動檔案夾rtl8192cu複制到/root/linux-kernel/drivers/net/wireless/下。
隻需将解壓後的目錄中的driver目錄複制到linux-kernel/drivers/net/wireless/即可
然後makefile需要增加以下内容
CONFIG_PLATFORM_ARM_AT91 = y
ifeq ($(CONFIG_PLATFORM_ARM_AT91), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
ARCH := arm
CROSS_COMPILE := /usr/local/arm-2012.09/bin/arm-none-linux-gnueabi-
KVER := 2.6.30_$(ARCH)
KSRC := /work/zhangyongzhong/sam9g20/linux-2.6.30
endif
進入rtl8192cu make 即可生成8192.ko了
(3)在進行make編譯
(4)修改/root/linux-kernel/drivers/net/wireless/下的Makefile和Kconfig檔案,在Makefile添加obj -$(CONFIG_RTL8192CU) += rtl8192cu/,在Kconfig下添加source "drivers/net/wireless/rtl8192cu/Kconfig"。
(5)在進行安裝make install
(6)make menuconfig 配置核心,在Device Drivers/Network device support/Wireless LAN下選中8192cu,編譯核心。
(7)如果遇見error: 'struct net_device' has no member named 'wireless_handlers'錯誤時,請看這一步的操作。
查閱資料後發現是核心在編譯的時候CONFIG_WIRELESS_EXT這個選項沒有選擇,選擇該選項後重新編譯核心鏡像或者子產品即可修正該錯誤。
3.在指令行下配置無線網卡:
(1)iwconfig 檢視目前的無線網卡裝置,假設你的無線網卡裝置為wlan1
(2)設定無線網卡的AP資訊
添加AP賬号名,AP登陸密碼 iwconfig essid "AP-Name" key 1234-5678-90ab(密碼每四個一組,中間用破折号隔開)
(3)啟動無線網卡
ifconfig wlan1 up
(4)設定無線網卡的IP位址
如果你的無線網卡的IP位址是靜态設定的 ifconfig wlan1 192.168.1.2 netmask 255.255.255.0
如果你的無線網卡的IP位址是動态擷取的 dhclient wlan1 或者 dhcpcd wlan1 動态擷取無線網卡的IP
至此,USB無線網卡應該可以正常工作了。
目前測試已認證linux,android系統下都成功了
1.解壓linux-2.6.38-20140106.tgz(在友善之臂CD光牒A,linux檔案夾下,類似是這種格式就行,不需要完全相同檔案名,新版的最好),
# tar zxvf linux-2.6.38-20140106.tgz
編譯核心,不需要燒寫
# cd linux-2.6.38/
# cp config_linux_mini6410 .config
# make
config_linux_mini6410不一定是這個名稱,舊版的可能是config_mini6410_n43,按具體情況而定,新版的是可以自動識别不同螢幕,舊版的這要選擇
2.下載下傳網卡驅動
2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.bz2
下載下傳位址:點選打開連結
這個驅動可以提供給RT3070,RT3370,RT5370,RT5372晶片方案的各種網卡,1代360随身WIFI就是使用了RT5370晶片
3.解壓驅動
# tar –jxf 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.bz2
檔案名太長,為了使用友善改短點
# mv 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO rt5370
4.更改配置
# cd rt5370
# gedit os/linux/config.mk
找到下面兩項,更改為 line55
# Support Wpa_Supplicant
HAS_WPA_SUPPLICANT=y
# Support Native WpaSupplicant for Network Maganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
打開makefile檔案,修改為提供給6410版本使用的配置
# gedit Makefile
注釋PLATFORM = PC line26
#PLATFORM = PC
删掉PLATFORM = SMDK前的# line45
PLATFORM = SMDK
找到 line243
ifeq ($(PLATFORM),SMDK)
LINUX_SRC = /tmps/linux-2.6.38
CROSS_COMPILE = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-
endif
LINUX_SRC=為剛才編譯核心的檔案路徑
CROSS_COMPILE=為交叉編譯鍊路徑
打開include/rtmp_def.h
# gedit include/rtmp_def.h
找到line1476,1477修改ra為wlan,這是為了友善顯示網卡名稱為wlan0,而不是ra0
#define INF_MAIN_DEV_NAME "wlan"
#define INF_MBSSID_DEV_NAME "wlan"
5.編譯
# make
6.直接生成的驅動很大,有十多M,可以經過精簡後可以有幾百K
#arm-linux-strip -S os/linux/rt5370sta.ko
-S 很重要,必須正确,不然核心無法發現
7.複制到闆上,驅動在os/linux/rt5370sta.ko,還有複制引導檔案RT2870STA.dat
8.複制到ARM闆相應位置
[[email protected] /]# cp /sdcard/RT5370/rt5370sta.ko /lib/modules/2.6.38-FriendlyARM/
[[email protected] /]# mkdir –p /etc/Wireless/RT2870STA/
[[email protected] /]# cp /sdcard/RT5370/RT2870STA.dat /etc/Wireless/RT2870STA/
9.載入驅動
[[email protected] /]# depmod
[[email protected] /]# modprobe rt5370sta
rtusb init rt2870 --->
=== pAd = d0b79000, size = 513648 ===
<-- RTMPAllocTxRxRingMemory, Status=0
<-- RTMPAllocAdapterBlock, Status=0
usbcore: registered new interface driver rt2870
10.檢視網卡是否存在了
[[email protected] /]# ifconfig -a
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
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)
wlan0 Link encap:Ethernet HWaddr 00:00:00:00:00:00
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)
11.已經有了,需要啟動
[[email protected] /]# ifconfig wlan0 up
(Efuse for 3062/3562/3572) Size=0x2d [2d0-2fc]
RTMP_TimerListAdd: add timer obj d0bc0c98!
RTMP_TimerListAdd: add timer obj d0bc0cc8!
RTMP_TimerListAdd: add timer obj d0bc0cf8!
RTMP_TimerListAdd: add timer obj d0bc0c68!
RTMP_TimerListAdd: add timer obj d0bc0bd8!
RTMP_TimerListAdd: add timer obj d0bc0c08!
RTMP_TimerListAdd: add timer obj d0b8b80c!
RTMP_TimerListAdd: add timer obj d0b7afd0!
one_wire_status: 2
RTMP_TimerListAdd: add timer obj d0b7b008!
RTMP_TimerListAdd: add timer obj d0b8b8b0!
RTMP_TimerListAdd: add timer obj d0b8b7ac!
RTMP_TimerListAdd: add timer obj d0b8b87c!
one_wire_status: 2
-->RTUSBVenderReset
<--RTUSBVenderReset
Key1Str is Invalid key length(0) or Type(0)
Key2Str is Invalid key length(0) or Type(0)
Key3Str is Invalid key length(0) or Type(0)
Key4Str is Invalid key length(0) or Type(0)
1. Phy Mode = 5
2. Phy Mode = 5
NVM is Efuse and its size =2d[2d0-2fc]
phy mode> Error! The chip does not support 5G band 15!
RTMPSetPhyMode: channel is out of range, use first channel=1
(Efuse for 3062/3562/3572) Size=0x2d [2d0-2fc]
3. Phy Mode = 9
AntCfgInit: primary/secondary ant 0/1
AsicSetRxAnt, switch to main antenna
MCS Set = ff 00 00 00 01
<==== rt28xx_init, Status=0
0x1300 = 00064300
12.嘗試聯網,可以使用qtopia無線網絡設定聯網,但會一直在連,連不上,隻需要在終端自動擷取IP即可,無需靜态IP
[[email protected] /]# udhcpc -i wlan0
udhcpc (v1.17.2) started
Sending discover...
Sending select for 192.168.2.103...
Lease of 192.168.2.103 obtained, lease time 7200
deleting routers
route: SIOCDELRT: No such process
adding dns 192.168.2.1
[[email protected] /]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
Rcv Wcid(1) AddBAReq
Start Seq = 00000000
RTMP_TimerListAdd: add timer obj d0bf16d4!
64 bytes from 8.8.8.8: seq=0 ttl=43 time=1040.990 ms
64 bytes from 8.8.8.8: seq=1 ttl=43 time=32.318 ms
64 bytes from 8.8.8.8: seq=4 ttl=43 time=36.431 ms
64 bytes from 8.8.8.8: seq=7 ttl=43 time=45.386 ms
^C
--- 8.8.8.8 ping statistics ---
13 packets transmitted, 4 packets received, 69% packet loss
round-trip min/avg/max = 32.318/288.781/1040.990 ms
近期8.8.8.8也太慢了~還是連通了
---------------------
作者:lclitlife
來源:CSDN
原文:https://blog.csdn.net/ofaith12345/article/details/24138399
版權聲明:本文為部落客原創文章,轉載請附上博文連結!
轉載于:https://www.cnblogs.com/eastgeneral/p/10813615.html