初始化OK,一插上usb就报如下错误:
/ # usb 1-1: new full speed USB device using s3c2410-ohci and address 2
usb 1-1: device descriptor read/64, error -62
usb 1-1: device descriptor read/64, error -62
usb 1-1: new full speed USB device using s3c2410-ohci and address 3
usb 1-1: device descriptor read/64, error -62
usb 1-1: device descriptor read/64, error -62
usb 1-1: new full speed USB device using s3c2410-ohci and address 4
usb 1-1: device not accepting address 4, error -62
usb 1-1: new full speed USB device using s3c2410-ohci and address 5
usb 1-1: device not accepting address 5, error -62
hub 1-0:1.0: unable to enumerate USB device on port 1
解决方法:
根据终端打印的错误
cd include/asm-generic/errno.h
u-boot/include/asm-arm/errno.H
找到:
#define ETIME 62 /*timer expired*/
再由:
error-codes.txt 去找usb error code
http://ftp.gnu.org/tmp/linux-libre-fsf2_2.6.28/linux-2.6.28/Documentation/usb/error-codes.txt
-ETIME (**) No response packet received within the prescribed
bus turn-around time. This error may instead be
reported as -EPROTO or -EILSEQ.
由此可以判断,这个错误与USB设备超时有关。报告这个错误的地方在drivers/usb/core/hub.c中的hub_port_init部分,由于usb_get_device_descriptor获取usb设备资讯的时候产生了超时,这样基本可以确定三种情况,1.USB设备及介面有问题,2、usbcore有问题3、usb driver有问题。
我们可以很容易的派出1.2的可能性,问题应该在usb driverimplement部分造成。2.6的内核usb driver把usb规范中对usb的操作集中到了core里面,针对不同设备的implement 分别归为host、gadget、storage等。基本确定问题就在ohci-s3c2410.c中。
原来是USB Host的48MHz时钟没有起来。
s3c6410支持三个PLL分别是APLL,MPLL和EPLL。APLL为ARM提供时钟,产生ARMCLK,MPLL为所有和AXI/AHB/APB相连的模块提供时钟,产生HCLK和PCLK,EPLL为特殊的外设提供时钟,产生SCLK。
![USB-HOST调试纪实_第1张图片](http://img.e-com-net.com/image/info8/913b9f09b4c542449d47f485950b83c6.jpg)
如图所示为EPLL_CON的 M、 P 和 S的取值。
根据s3c6410的数据手册:
![USB-HOST调试纪实_第2张图片](http://img.e-com-net.com/image/info8/fb0d9f83a7b3403695e1b93953740612.jpg)
如图所示,描述的是用于IrDA和USB host 的时钟发生器,通常USB借口需要48M的操作时钟。
从图中可也以说明,HCLK_GATE,PCLK_GATE和SCL_GATE控制时钟操作。如果一个位设置,则通过每个时钟分频器相应的时钟将会被提供,否则,将被屏蔽。
HCLK_GATE控制HCLK,用于每个Ips。每个IP的AHB接口逻辑被独立地屏蔽,以减少动态电力消耗。PCLK_GATE控制PCLK。通过SCLK_GATE时钟被控制。
根据上图EPLL通道写出一下程序。
58 #define EPLL_CON01 0
359
360 #define UPLL_SRC_MASK ((1<<2)|(3<<5))
361 #define UPLL_SRC ((1<<2)|(1<<5))
362 #define UPLL_DIV1_MASK (0xf<<20)
363 #define UPLL_DIV1 (0<<20)
364 #define UPLL_GATE_MASK (1<<30)
365 #define UPLL_GATE (1<<30)
void set_upll(void)
368 {
369 unsigned int tmp;
370
371 while(__raw_readl(S3C_EPLL_CON0)!=EPLL_CON00)
372 __raw_writel(EPLL_CON00,S3C_EPLL_CON0);
373
374 while(__raw_readl(S3C_EPLL_CON1)!=EPLL_CON01)
375 __raw_writel(EPLL_CON01,S3C_EPLL_CON1);
376
377 while(((tmp= __raw_readl(S3C_CLK_SRC))&UPLL_SRC_MASK)!=UPLL_SRC)
378 __raw_writel((tmp&UPLL_SRC_MASK)|UPLL_SRC,S3C_CLK_SRC);
379 while(((tmp=__raw_readl(S3C_CLK_DIV1))&UPLL_DIV1_MASK)!=UPLL_DIV1)
380 __raw_writel((tmp&UPLL_DIV1_MASK)|UPLL_DIV1,S3C_CLK_DIV1);
381 while(((tmp=__raw_readl(S3C_SCLK_GATE))&UPLL_GATE_MASK)!=UPLL_GATE)
382 __raw_writel((tmp&UPLL_GATE_MASK)|UPLL_GATE,S3C_SCLK_GATE);
383 }
在probe中加入上面的函数修改USB host的时钟:
386 static int usb_hcd_s3c2410_probe (const struct hc_driver *driver,
387 struct platform_device *dev)
388 {
389 struct usb_hcd *hcd = NULL;
390 int retval;
391
392 #if !defined(CONFIG_ARCH_2410)
393 usb_host_clk_en();
394 #endif
395
396 set_upll();
然后编译内核。
USB的不能识别的错误就解决了
如何在Ubuntu上驱动腾达W541U V2.0 (RT2070)无线网卡【使用2011新驱动】
这个破网卡,实在无语,网上已经有够多的帖子谈它的驱动问题了。经过一翻折腾,今天把过程记录下来,为自己留着,也为给大家参考。
网上的帖子多使用的是官方2009年的旧驱动来编译。这个旧版本有在2.6.31以上内核需要打补丁的问题,麻烦。因此去官网上下载了2011年最新的驱动来编译,可以省很多事。
官网上最新驱动下载链接在此,我用goo.gl缩短了地址:http://goo.gl/2ILQZ
打开的页面会要求你填姓名和邮箱才能下载。其实是可以随便填的,乱填也无所谓。
下载回来的源码包: 2011_0107_RT3070_RT3370_Linux_STA_v2.5.0.1_DPO .tar.gz
以下是步骤(主机为Ubuntu 10.04.2 LTS):
1、解压源码;
2、在common/rtusb_dev_id.c中找到#ifdef RT3070,在这个宏定义所在的struct里加入:
{USB_DEVICE(0x148F,0x2070)}, /* Ralink 2070 */
保存;
3、在os/linux/config.mk中找到并修改:
HAS_WPA_SUPPLICANT=y
以及
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
保存;
4、在os/linux/usb_main_dev.c中加入:
MODULE_LICENSE("GPL");
保存;
5、 在源码根目录下make install
6、Ubuntu 自带有一些RT芯片的驱动,但这些驱动模块并不能使RT2070正常工作,反而会影响我们编译出的模块,使之不能Scan。因此做blacklist屏蔽这些驱动模块:
编辑 /etc/modprobe.d/blacklist.conf
加入下面3行:
blacklist rt2x00usb
blacklist rt2x00lib
blacklist rt2800usb
保存。
7、使得每次开机时自动加载驱动模块。编辑/etc/modules文件,加入:
rt3070sta
保存。
重启你的Ubuntu,一切搞定。
RT3070_STA_驱动移植文档
移植环境:
主机操作系统:Ubantu10.10
目标系统:at91sam9m10内核linux-2.6.30
交叉编译器:arm-none-linux-gnueabi-
驱动版本:2011_0107_RT3070_RT3370_Linux_STA_v2.5.0.1_DPO
Networkingsupport
Wireless
-*-Wirelessextensions
[*]Wirelessextensions sysfs files
DeviceDrivers
Networkdevice support
WierlessLAN
[*]WirelessLAN(IEEE 802.11)
Ralinkdriver support
1.下载RT3070驱动源码
版本:2011_0107_RT3070_RT3370_Linux_STA_v2.5.0.1_DPO
download: 下载页面
选到 T8070/RT3070/RT3370/RT5370/RT5372USB 这个然后随便输入名字和邮箱即可下载。
2.RT3070驱动修改
解压 tar-zxvf 2011_0107_RT3070_RT3370_Linux_STA_v2.5.0.1_DPO.tar.gz
进入RT3070_Linux_STA目录,看到有一个README_STA_usb文件,里面介绍了如何加载该驱动,先浏览一下
2.1 先设好环境变量
exportPATH=/usr/local/arm/arm-2007q1/bin:$PATH
2.2 makefile修改 (-为去掉设置,+为新加的设置)
#vimakefile
-#PLATFORM = PC
+ PLATFORM = IXP
#(选用的是IXP)
ifeq($(PLATFORM),IXP)
-LINUX_SRC = /project/stable/Gmtek/snapgear-uclibc/linux-2.6.x
-CROSS_COMPILE = arm-linux-
+ LINUX_SRC = /home/rpf413/at91/linux/linux-2.6.30
+ CROSS_COMPILE = /usr/local/arm/arm-2007q1/bin/arm-none-linux-gnueabi-
endif
2.3 /os/linux/config.mk修改
#cd/os/linux/
#vi config.mk
#Support Wpa_Supplicant
- HAS_WPA_SUPPLICANT=n
+HAS_WPA_SUPPLICANT=y
#Support Native WpaSupplicant for Network Maganger
-HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n
+HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
ifeq($(PLATFORM),IXP)
- WFLAGS +=-DRT_BIG_ENDIAN
#加这个选项,模块运行时显示出错,CPU不能工作
endif
ifeq($(PLATFORM),IXP)
-CFLAGS := -v -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include-I$(RT28xx_DIR)/include -mbig-endian -Wall -Wstrict-prototypes-Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common-pipe -mapcs-32 -D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale-malignment-traps -msoft-float $(WFLAGS)
-EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/include -mbig-endian
+EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/include
exportCFLAGS
endif
3、 编译源码
make通过,在2011_0107_RT3070_RT3370_Linux_STA_v2.5.0.1_DPO/os/linux目录下生成了rt3070sta.ko,也就是RT3070的驱动了
makeKBUILD_NOPEDANTIC=1
4. 拷贝驱动到目标系统
把RT2870STA.dat拷贝到/etc/Wireless/RT2870STA目录下
把rt3070sta.ko拷贝到/xxx/目录下xxx自定
5.加载驱动模块
insmod/xxx/rt3070sta.ko
出现以下错误
insmod:error inserting 'rt3070sta.ko': -1 Unknown symbol inmodule
rt3070sta: Unknown symbol usb_alloc_urb
rt3070sta:Unknown symbol usb_free_urb
rt3070sta: Unknown symbolusb_register
rt3070sta: Unknown symbol usb_put_dev
rt3070sta:Unknown symbol usb_get_dev
rt3070sta: Unknown symbolusb_submit_urb
rt3070sta: Unknown symbolusb_control_msg
rt3070sta: Unknown symbolusb_deregister
rt3070sta: Unknown symbol usb_kill_urb
rt3070sta:Unknown symbol usb_buffer_free
rt3070sta: Unknown symbolusb_buffer_alloc
insmod: cannot insert `rt3070sta.ko': Unknownsymbol in module (-1): No such file or directory
原因未加载USB驱动
请修改UTIL/os/linux/usb_main_dev.c文件,在文件的开头加上如下一行程序:
MODULE_LICENSE(“GPL”)
重新编译:
MakeARCH=armCROSS_COMPILE=/usr/local/arm/arm-2007q1/bin/arm-none-linux-gnueabi-
5.3 然后再加载rt3070sta.ko
手动添加:/etc/Wireless/RT2870STA/RT2870STA.dat
insmod/xxx/rt3070sta.ko
显示
rtusbinit rt2870 --->
===pAd = d1af4000, size = 514424 ===
<--RTMPAllocTxRxRingMemory, Status=0
<-- RTMPAllocAdapterBlock,Status=0
usbcore: registered new driver rt2870
加载成功
#ifconfig-a 可以查看到ra0设备的存在
若无密码或密码为WEP加密,则此时可以启动无线,若密码为WPA加密,则需移植wpa_supplicant,往后再说移植
6.无密码或密码为WEP加密:
6.1 启动无线
#ifconfigra0 up
(Efusefor 3062/3562/3572) Size=0x2d [2d0-2fc]
RTMP_TimerListAdd: addtimer obj d1b3c620!
RTMP_TimerListAdd: add timer objd1b3c650!
RTMP_TimerListAdd: add timer objd1b3c680!
RTMP_TimerListAdd: add timer objd1b3c5f0!
RTMP_TimerListAdd: add timer objd1b3c560!
RTMP_TimerListAdd: add timer objd1b3c590!
RTMP_TimerListAdd: add timer objd1b06b94!
RTMP_TimerListAdd: add timer objd1af5f54!
RTMP_TimerListAdd: add timer objd1af5f8c!
RTMP_TimerListAdd: add timer objd1b06c38!
RTMP_TimerListAdd: add timer objd1b06b34!
RTMP_TimerListAdd: add timer objd1b06c04!
-->RTUSBVenderReset
<--RTUSBVenderReset
Key1Stris Invalid key length(0) or Type(0)
Key2Str is Invalid keylength(0) or Type(0)
Key3Str is Invalid key length(0) orType(0)
Key4Str is Invalid key length(0) or Type(0)
1. Phy Mode= 5
2. Phy Mode = 5
phy mode> Error! The chip does notsupport 5G band 5!
RTMPSetPhyMode: channel is out of range, usefirst channel=1
(Efuse for 3062/3562/3572) Size=0x2d [2d0-2fc]
3.Phy Mode = 9
MCS Set = ff 00 00 00 01
<==== rt28xx_init,Status=0
0x1300 = 00064300
启动成功
6.2 设置ip
#ifconfigra0 192.168.50.166 netmask 255.255.255.0
6.3 扫描无线网络
#iwlistra0 scan
===>rt_ioctl_giwscan.9(9) BSS returned, data->length = 1476
ra0 Scancompleted :
Cell01 - Address:F0:7D:68:96:A6:C2
Protocol:802.11b/g/n
ESSID:"dlinktf"
Mode:Managed
Frequency:2.412GHz (Channel 1)
Quality=18/100 Signallevel=-83 dBm Noise level=-92dBm
Encryptionkey:on
BitRates:54 Mb/s
Cell02 - Address:F4:EC:38:55:AF:BC
Protocol:802.11b/g/n
ESSID:"visview"
Mode:Managed
Frequency:2.427GHz (Channel 4)
Quality=18/100 Signallevel=-83 dBm Noise level=-91dBm
Encryptionkey:off
BitRates:54 Mb/s
显示以上信息说明模块已经正常工作
6.4 设置SSID和WEP加密算法
可以参考里面的iwpriv_usage.txt进行配置,
6.4.1 无密码
ConfigSTA to link with AP which is OPEN/NONE(Authentication/Encryption)
1.iwpriv ra0 set NetworkType=Infra
2. iwpriv ra0 setAuthMode=OPEN
3. iwpriv ra0 set EncrypType=NONE
4. iwpriv ra0set SSID="AP's SSID"
6.4.2 WEP加密算法
iwprivra0 set NetworkType=Infra
iwpriv ra0 set AuthMode=SHARED
iwprivra0 set EncrypType=WEP
iwpriv ra0 set DefaultKeyID=1
iwpriv ra0set Key1="AP's wep key"
iwpriv ra0 set SSID="AP'sSSID"
设置完一会,等网络连接好就可以了。
WPA加密详见openssl驱动移植,wpa_supplicant驱动移植。
RT3070wifi驱动的相关文章
-
bridge-utils驱动移植(2011-06-0314:54:38)
-
wpa_supplicant驱动移植(2011-06-0314:24:17)
-
Openss驱动移植(2011-06-0314:14:02)
-
wireless_tools移植(2011-06-0313:40:09)
-
[首篇]Linux无线WIFI模块驱动移植(基于RT3070)(2011-06-0312:00:29)
-
RT3070wifi驱动的全部文章
http://blog168.chinaunix.net/space.php?uid=7406469&do=blog&id=353430
嵌入式linux下usb驱动开发方法--看完少走弯路
嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至少需要个把月的时间,不信?那是你没做过。
本人做过2年的嵌入式驱动开发,usb占了一大半的时间。期间走了不少弯路,下面将我的血的经验教训总结下,为要从事和正在从事的战友们做一点点贡献吧:)
首先,扫盲;
要做的是阅读usb Spec(英文的哦,其实很多文章、书籍和资料真有水平的还是原创的好,就像食品往往经过加工就变了味,之前如果没有接触过的话可以先看看中文的,大概先有个印象),这个工作其实是很复杂很枯燥的一部分。看Spec的同时可以到网上大概浏览下usb开发的相关知识,这个阶段就是扫盲,不求精进。至少你得知道usb的四种传输类型吧,你得知道usb从上电开始的几个状态吧,你得知道usb设备都有哪些吧,等等。
第二步,窥全貌;
usb设备是如何工作起来的?其实usb子系统是分层次工作的,他们配合默契,做好自己的份内之事,一切以大局为重。usb驱动可以分为usb设备驱动,usb控制器驱动,hub驱动,总线驱动等等。我建议你还是顺着设备驱动的这根主线往下走吧。
在真正开始分析usb驱动代码这之前,你需要了解linux模块机制,linux驱动的platform总线构架,之类。一个模块被加载后,从driver的角度来说,真正将设备驱动起来是从probe开始的。这个你该知道。你得知道为什么usb可以即插即用,做软件的朋友该知道线程这个东西吧,和她有关系的。usb系统里面一个最重要的角色该出场了,urb。一切的一切都要围绕她进行。pipe为她铺路,数据由她承载。usb设备驱动的工作就是准备好这个urb后她的使命就基本完成了,那她把urb给了谁?这就是之前提到的usb控制器驱动,host。
至于host,现在市场上有很多款,如果你老板给你用的是市面上用的最成熟的像EHCI,那么你太幸运了。这个基本不用你写,只要稍加修改,把她注册到总线上即可。如果你很不幸,使用了像musb这样的host,你惨了,有你苦头吃了。
第三步,精益求精;
这个时候驱动你也调过了,也许这时候已经跑起来了,也许还没跑起来。可能你开始浮躁了,到这个时候咋的也过去个把月了,如果还没出成果难免心急。好,这时候如果是这样,你该做什么呢? 重新看Spec,重新看整个驱动过程,重复之前做过的事情。这次你再看绝对和之前不一样了。这时候你要学会的是,坚持,耐力.................
最后,给大家介绍一下我自认为不错的资料,你可以参考。像复旦一哥们写的linux那点事儿(大家嫌麻烦可以到我这里下载Linux那些事儿之我是U盘.pdf),ldd3,最好的资料是源代码。
嵌入式Linux USB WIFI驱动的移植
硬件平台:飞思卡尔 MX258 开发板
操作系统: Linux2.6.31
WIFI : RT2860 USB WIFI 模组
交叉编译环境: gcc version 4.1.2
调试步骤:
第一步:测试 USB HOST 接口
在 menuconfig 中将 USB HOST 设置为内核模式:
![USB-HOST调试纪实_第3张图片](http://img.e-com-net.com/image/info8/7c913f9297bf4ee197888ff90f5b5bfe.jpg)
重新编译内核后启动开发板,插入 U 盘并挂载:
mount /dev/sda1 /tmp
ls /tmp
可以看到 U 盘已经正常挂载,测试 USB HOST OK!
第二步:网上下载雷凌最新的 USB 驱动,
2011_0107_RT3070_RT3370_Linux_STA_v2[1].5.0.1_DPO.tar.bz2
拷备到 Linux 目录并解压:
tar jxf 2011_0107_RT3070_RT3370_Linux_STA_v2[1].5.0.1_DPO.tar.bz2
由于上面名字很长,可以修改为简短的名字:
mv 2011_0107_RT3070_RT3370_Linux_STA_v2[1].5.0.1_DPO RT3070_Linux_STA
第三步:进入 RT3070_Linux_STA 目录,看到有一个 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
这里 go to "./DPB_RT2870_Linux_STA_x.x.x.x" directory. 即我们刚解压的 RT3070_Linux_STA目录。修改该目录下的 makefile 文件,以下只给出修改部分:
#PLATFORM = PC
PLATFORM = RALINK_2880
ifeq ($(PLATFORM), RALINK_2880)
LINUX_SRC = /home/lqm/share/G360/kernel_kfb
CROSS_COMPILE = /opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-
endif
ifeq ($(RT28xx_MODE),APSTA)
cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)apsta.ko /tftpboot
ifeq ($(OSABL),YES)
cp -f $(RT28xx_DIR)/os/linux/rtutil$(CHIPSET)apsta.ko /tftpboot
cp -f $(RT28xx_DIR)/os/linux/rtnet$(CHIPSET)apsta.ko /tftpboot
endif
else
cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)sta.ko /home/lqm/share/NFS/tmp
注意,虽然我们使用的是 2860 模组,我们这里仍然可以定义 PLATFORM 为 RALINK_2880,只要后面对应的编译环境正确就可以了。 LINUX_SRC 表示内核的目录, CORSS_COMPILE 为交叉编译环境,最末一行为编译完后将生成的 KO 文件复制到 NFS 文件系统的 tmp 目录。
第四步:按照第三步 README_STA_usb 给出的提示,修改 config.mk 文件,这里也只给出修改部分:
# Support Wpa_Supplicant
HAS_WPA_SUPPLICANT=y
# Support Native WpaSupplicant for Network Maganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n
CC := /opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc
LD := /opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-ld
ifeq ($(PLATFORM), RALINK_2880)
EXTRA_CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -D__LINUX_ARM_ARCH__=5 -march=armv5te -msoft-float -Uarm -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/config/modversions.h $(WFLAGS)
export EXTRA_CFLAGS
endif
注意,这里 CC 为交叉编译环境, LD 为交叉编译的链接。默认 EXTRA_CFLAGS 为 CFLAGS ,这里需要修改为 EXTRA_CFLAGS ,否则编译时会提示如下错误:
scripts/Makefile.build:49: *** CFLAGS was changed in "/home/lqm/share/RT3070_Linux_STA/os/linux/Makefile". Fix it to use EXTRA_CFLAGS 。 停止。
LINUX_ARM_ARCH 一定要设置为 5 , -march 一定要设置得和 CPU 匹配,由于这里为 MX258,因此设置为 armv5te ,不可设置为 armv5t 或 armv5 ,否则出现如下错误:
CC [M] /home/lqm/share/RT3070_Linux_STA/os/linux/../../os/linux/rt_main_dev.o
{standard input}: Assembler messages:
{standard input}:340: Error: selected processor does not support `pld [r5,#0]'
{standard input}:349: Error: selected processor does not support `pld [r5,#0]'
make[2]: *** [/home/lqm/share/RT3070_Linux_STA/os/linux/../../os/linux/rt_main_dev.o] 错误 1
make[1]: *** [_module_/home/lqm/share/RT3070_Linux_STA/os/linux] 错误 2
make[1]: Leaving directory `/home/lqm/share/G360/kernel_kfb'
make: *** [LINUX] 错误 2
[root@lqm RT3070_Linux_STA]#
第五步: make
如果编译一切正常,将会在 \RT3070_Linux_STA\os\linux 目录下生成 rt3070sta.ko 文件。
第六步:将 USB WIFI 模组插到开发板的 USB HOST 端口,将 rt3070sta.ko 文件复制到文件系统的 /tmp目录,重启开发板,进入文件系统后加载驱动:
cd /tmp
insmod rt3070sta.ko
这时会提示如下信息:
root@freescale ~$ cd /tmp
root@freescale /tmp$ insmod rt3070sta.ko
rtusb init rt2870 --->
=== pAd = c49eb000, size = 509592 ===
<-- RTMPAllocTxRxRingMemory, Status=0
<-- RTMPAllocAdapterBlock, Status=0
usbcore: registered new interface driver rt2870
root@freescale /tmp$
第七步:配置无线网卡
首先检测开发板的网络设备:
ifconfig
可以看到这时只有 eth0 和 lo 两个网络信号,使用如下命令设置无线网卡的网络地址:
ifconfig ra0 192.168.1.5
打印信息如下:
root@freescale /tmp$ ifconfig ra0 192.168.1.5
(Efuse for 3062/3562/3572) Size=0x2d [2d0-2fc]
RTMP_TimerListAdd: add timer obj c4a32d88!
RTMP_TimerListAdd: add timer obj c4a32db4!
RTMP_TimerListAdd: add timer obj c4a32de0!
RTMP_TimerListAdd: add timer obj c4a32d5c!
RTMP_TimerListAdd: add timer obj c4a32cd8!
RTMP_TimerListAdd: add timer obj c4a32d04!
RTMP_TimerListAdd: add timer obj c49fd91c!
RTMP_TimerListAdd: add timer obj c49ece5c!
RTMP_TimerListAdd: add timer obj c49ece90!
RTMP_TimerListAdd: add timer obj c49fd9b4!
RTMP_TimerListAdd: add timer obj c49fd8c4!
RTMP_TimerListAdd: add timer obj c49fd984!
-->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 5!
RTMPSetPhyMode: channel is out of range, use first channel=1
(Efuse for 3062/3562/3572) Size=0x2d [2d0-2fc]
3. Phy Mode = 9
MCS Set = ff 00 00 00 01
<==== rt28xx_init, Status=0
0x1300 = 00064300
root@freescale /tmp$
再使用 ifconfig 查看网络设备:
root@freescale /tmp$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:04:9F:00:EB:33
inet addr:172.18.2.133 Bcast:172.18.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3182 errors:0 dropped:0 overruns:0 frame:0
TX packets:1380 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3079209 (2.9 MiB) TX bytes:227540 (222.2 KiB)
Base address:0xa000
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)
ra0 Link encap:Ethernet HWaddr 00:E0:61:37:D0:10
inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:631 errors:0 dropped:0 overruns:0 frame:0
TX packets:83 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:92470 (90.3 KiB) TX bytes:8736 (8.5 KiB)
root@freescale /tmp$
可以看到这时多了一组 ra0 设备,它就是无线网卡的相关信息。
第八步:下载并编译无线网络工具 wireless_tools.29.tar.gz
tar zxf wireless_tools.29.tar.gz
cd wireless_tools.29
修改 makefile ,修改部分如下:
## Compiler to use (modify this for cross compile).
CC = arm-none-linux-gnueabi-gcc
## Other tools you need to modify for cross compile (static lib only).
AR = arm-none-linux-gnueabi-ar
RANLIB = arm-none-linux-gnueabi-ranlib
修改后 make ,成功后会在当前目录生成 iwspy , iwpriv , iwlist 以及 iwconfig 等文件。我们只需将这四个文件拷备到 NFS 文件系统的 sbin 目录,然后将当前目录的 libiw.so.29 库文件拷到 NFS 文件系统的lib 目录,无线网络工具即安装完成。
第九步:查看无线网络:
iwlist ra0 scanning
这时如果设备周边有无线信号,将会搜索出这些信号并打印出来,例如:
dBm
Encryption key:on
Bit Rates:54 Mb/s
IE: WPA Version 1
Group Cipher : TKIP
Pairwise Ciphers (2) : CCMP TKIP
Authentication Suites (1) : PSK
IE: IEEE 802.11i/WPA2 Version 1
Group Cipher : TKIP
Pairwise Ciphers (2) : CCMP TKIP
Authentication Suites (1) : PSK
Cell 23 - Address: 00:25:5E:1E:38:5A
Protocol:802.11b/g
ESSID:"ChinaNet-UWfq"
Mode:Managed
Frequency:2.412 GHz (Channel 1)
Quality=26/100 Signal level=-79 dBm Noise level=-74 dBm
Encryption key:on
Bit Rates:54 Mb/s
IE: WPA Version 1
Group Cipher : TKIP
Pairwise Ciphers (1) : TKIP
Authentication Suites (1) : PSK
IE: Unknown: DD0E0050F204104A0001101044000102
Cell 24 - Address: 00:25:5E:1D:2F:FF
Protocol:802.11b/g
ESSID:"ChinaNet-eSpK"
Mode:Managed
Frequency:2.437 GHz (Channel 6)
Quality=42/100