学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

今天记录我在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

在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

修改为:

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代表我们编译内核用的编译工具的目录#

(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   

$(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

把这几个值的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

然后文档中还有说关于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

这些错误都是那些函数无符号,至于为什么无符号,我查了一下,有可能是没有声明GPL协议,需要更改os/linux下的usb_main_dev.c文件,在开头的地方写上:

MODULE_LICENSE("GPL"); 

然后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语言,数据结构等技术问题。