今天记录我在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(在友善之臂光盘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