需求:
需要在一块基于arm内核的处理器的Linux系统移植WiFi驱动。
先手上有一块开发板,一个360的无线USB 接口的WiFi。
1.到这个WiFi的生产厂家的官网或者设备的供应商获取Linux的WiFi驱动源码。
2.将驱动复制到Linux系统中解压
[root@localhost 360_wifi2]# ls
DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2
[root@localhost 360_wifi2]# tar -xf DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2
[root@localhost 360_wifi2]# ls
DPO_MT7601U_LinuxSTA_3.0.0.4_20130913 DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2
[root@localhost 360_wifi2]# cd DPO_MT7601U_LinuxSTA_3.0.0.4_20130913
[root@localhost DPO_MT7601U_LinuxSTA_3.0.0.4_20130913]#
3.添加ID支持
修改 common/rtusb_dev_id.c 文件,
[root@localhost DPO_MT7601U_LinuxSTA_3.0.0.4_20130913]#vim common/rtusb_dev_id.c +/7601//这里不一定是7601,根据具体的代码而定。
找到以下数组定义
36 /* module table */
37 USB_DEVICE_ID rtusb_dev_id[] = {
38 #ifdef RT6570
39 {USB_DEVICE(0x148f,0x6570)}, /* Ralink 6570 */
40 #endif /* RT6570 */
41 {USB_DEVICE(0x148f, 0x7650)}, /* MT7650 */
42 #ifdef MT7601U
43 {USB_DEVICE(0x148f,0x6370)}, /* Ralink 6370 */
44 {USB_DEVICE(0x148f,0x7601)}, /* MT 6370 */
45 #endif /* MT7601U */
46 { }/* Terminating entry */
47 };
在上面的数据中添加一项:
{USB_DEVICE(0x148f,0x760b)}, /* 360 Wifi */
添加后如下:
36 /* module table */
37 USB_DEVICE_ID rtusb_dev_id[] = {
38 #ifdef RT6570
39 {USB_DEVICE(0x148f,0x6570)}, /* Ralink 6570 */
40 #endif /* RT6570 */
41 {USB_DEVICE(0x148f, 0x7650)}, /* MT7650 */
42 #ifdef MT7601U
43 {USB_DEVICE(0x148f,0x6370)}, /* Ralink 6370 */
44 {USB_DEVICE(0x148f,0x7601)}, /* MT 6370 */
45 {USB_DEVICE(0x148f,0x760b)}, /*我们需要移植的的WiFi*/
46 #endif /* MT7601U */
47 { }/* Terminating entry */
48 };
参考:http://www.freemindworld.com/blog/2013/131010_360_wifi_in_linux.shtml
(1)找到并注释PLATFORM = PC
(2)找到并开启#PLATFORM = SMDK
(3)修改内核源码路径及交叉编译器。
找到以下:
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
修 改 为 自 己 的 内 核 源 码 路 径 以 及 编 译 器 路 径 , 我 的 源 码 路 径 是 :
root/workspace/source/linux-2.6.32.2 ,编译器是 arm-linux-gcc, 所以修改成以下:
ifeq ($(PLATFORM),SMDK)
LINUX_SRC = /root/workspace/source/linux-2.6.32.2
CROSS_COMPILE = arm-linux-
endif
5.按照 README_STA_usb 中的说明 make 和 make install。把 os/linux/mt7601Usta.ko 复制到开发板根文件系统中
修改 WIFI 配置,打开 os/linux/config.mk,
[root@localhost DPO_MT7601U_LinuxSTA_3.0.0.4_20130913]# vim os/linux/config.mk
HAS_WPA_SUPPLICANT=y
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
编译 :
直接输入 make 命令即可。
6.复制得到的驱动文件到开发板根文件系统中
先创建目录
# mkdir /opt/s3c2440/root_nfs/etc/Wireless/RT2870STA -p
复制 RT2870STA 到刚刚创建的目录中
#cp RT2870STA.dat /opt/s3c2440/root_nfs/etc/Wireless/RT2870STA/
说明: 如果没有制作这个文件, 这一步是在后面做, 不是现在, 放在这里只是为了说明问题。 后面启动
网卡时候会出现错误, 错误如下:
[root@ /home]# mkdir /var/run/wap_supplicant -p
[root@/home]# wpa_supplicant -Dwext -ira0 -c /etc/wpa_supplicant.conf -B
[ 72.120000] ERROR!!! RTMPReadParametersHook failed, Status[=0x00000001]
[ 72.185000] --->RTUSBCancelPendingBulkInIRP
[ 72.185000] Bulk In Failed. Status=-2, BIIdx=0x0, BIRIdx=0x0, actual_length= 0x0
[ 72.185000] CmdThread : CMDTHREAD_RESET_BULK_IN === >
[ 72.190000] unlink cmd rsp urb
[ 72.190000] CmdThread : CMDTHREAD_RESET_BULK_IN <===
[ 72.190000] <---RTUSBCancelPendingBulkInIRP
Could not set interface ra0 flags: Operation not permitted
Failed to initialize driver interface
[root@/home]#
现在开始安装模块
[root@/]# insmod /home/mt7601Usta.ko
成功后有以下信息提示:
rtusb init rt2870 --->
usbcore: registered new interface driver rt2870
插上 USB WIFI,如果成功,会出现以下提示:
usb 1-1: new full speed USB device using s3c2410-ohci and address 2
usb 1-1: configuration #1 chosen from 1 choice
<-- RTMPAllocTxRxRingMemory, Status=0
<-- RTMPAllocAdapterBlock, Status=0
BULK IN MaxPacketSize = 64
EP address = 0x84
BULK IN MaxPacketSize = 64
EP address = 0x85
BULK OUT MaxPacketSize = 64
EP address = 0x 8
BULK OUT MaxPacketSize = 64
EP address = 0x 4
BULK OUT MaxPacketSize = 64
EP address = 0x 5
BULK OUT MaxPacketSize = 64
EP address = 0x 6
BULK OUT MaxPacketSize = 64
EP address = 0x 7
BULK OUT MaxPacketSize = 64
EP address = 0x 9
说明:
1. 开发板中要想 ping 通外网 IP,需要设置默认网关,这个网关必须要和所连接的路由器设置的网关相同。
2.开发板要想 ping 通外网域名,则要设置 DNS 服务器,在 etc 目录下创建 resolv.conf 文件,其中写上 DNS
服务器 IP,一般直接写上所使用的网关即可,由路由器来解析,比如,开发板所连接的路由器设置的网关
是 192.168.1.1,则 resolv.conf 文件中写入 nameserver 192.168.1.1 即可以。也可以写公网的 DNS 服务器,比
如写深圳电信 DNS,其中有一个是 202.96.134.33,则 resolv.conf 内容是 nameserver 202.96.134.33 。谷歌的
DNS 是 8.8.8.8。 也可以同时写多个,则系统会逐个尝试,直到连接成功。