分类: LINUX
2015-01-24 12:47:30
一、交叉编译rt3070驱动
1.下载rt3070驱动
2.解压:
tar xvf /share/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.tar
3.修改makefile
第12行,修改为CHIPSET = 3070
修改 PLATFORM = DM6446,并注释掉#PLATFORM = PC
修改内核所在目录:
258 ifeq ($(PLATFORM),DM6446)
259 LINUX_SRC = /workdir/kernel.2.6.34
260 endif
4.修改os/linux/config.mk
764 ifeq ($(PLATFORM),DM6446)
765 EXTRA_CFLAGS := -nostdinc -iwithprefix include -D__KERNEL__ -I$(RT28xx_DIR)/include -I$(LINUX_SRC)/include -Wall -Wstrict-protot ypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Os -fno-omit-frame-pointer -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mlittl e-endian -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wdeclaration-after-statement -c -o $(WFLAGS)
766 export EXTRA_CFLAGS
767 endif
修改了两个地方:
修改一:将CFLAGS修改为EXTRA_CFLAGS,否则报如下错误
make[1]: 正在进入目录 `/opt/workdir/kernel.2.6.34'
scripts/Makefile.build:49: *** CFLAGS was changed in "/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/Makefile". Fix it to use EXTRA_CFLAGS。 停止。
make[1]: *** [_module_/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux] 错误 2
make[1]:正在离开目录 `/opt/workdir/kernel.2.6.34'
make: *** [LINUX] 错误2
修改原因,按照编译出错提示Fix it to use EXTRA_CFLAGS,原因还不清楚。
修改二:
去掉编译选项中的mabi=apcs-gnu参数
原因:apcs-gnu是OABI的参数,因此将OABI的参数传给符合 EABI标准的编译,编译阶段没有报错,但在板上运行时,程序中涉及到浮点数的部分出现了许多莫名的问题。
在我们的板子上出现如下错误:
# insmod rt3070sta.ko
rtusb init rt2870 --->
Unable to handle kernel NULL pointer dereference at virtual address 00000028
pgd = c47c4000
[00000028] *pgd=84779031, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1] PREEMPT
last sysfs file: /sys/devices/platform/musb_hdrc/usb1/1-1/1-1:1.0/uevent
Modules linked in: rt3070sta(+) edmak irqk cmemk
CPU: 0 Not tainted (2.6.34_ldrsc-svn1086 #53)
PC is at kref_get+0x10/0x50
LR is at kobject_get+0x20/0x28
pc : [
sp : c4147d10 ip : c4147d28 fp : c4147d24
r10: c0037be0 r9 : 00000000 r8 : bf0ab82c
r7 : bf0abe38 r6 : bf0a9558 r5 : c0037be0 r4 : 0000000c
r3 : 00000001 r2 : 00003070 r1 : bf0ab82c r0 : 00000028
Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 0005317f Table: 847c4000 DAC: 00000015
Process insmod (pid: 536, stack limit = 0xc4146270)
Stack: (0xc4147d10 to 0xc4148000)
7d00: 00000017 0000000c c4147d3c c4147d28
7d20: c0197148 c0197f2c c4146000 ffffff9c c4147d4c c4147d40 c01e3e00 c0197138
7d40: c4147d64 c4147d50 c0221918 c01e3df4 c4147d7c c0037c00 c4147e14 c4147d68
7d60: bf081a44 c0221908 c4147d94 c4147d78 c035e234 c0078578 c00fa838 00000000
7d80: c466ff08 c4147de0 c4147da4 c4147d98 c035e2a0 c035e184 c4147ddc c4147da8
7da0: c00fb354 c035e2a0 c466ff08 c4147de0 c4147ddc c4147dc0 c00fab84 00000000
7dc0: c466ff08 c4147de0 c46f2728 00000001 c4147dfc c4147de0 c022acb4 c022abb8
7de0: c4147dfc bf0ab82c c0037be0 c0037c00 c0037be0 c415a000 bf0abe38 bf0ab82c
7e00: 00000000 00000000 c4147e3c c4147e18 c022b804 bf081a30 c0037c00 c0037c34
7e20: bf0abe38 bf0abe38 c04953a8 00000000 c4147e5c c4147e40 c01e73a4 c022b73c
7e40: c0037c00 c0037c34 bf0abe38 bf0abe38 c4147e7c c4147e60 c01e7650 c01e7304
7e60: c4147e7c 00000000 c4147e80 c01e75e4 c4147ea4 c4147e80 c01e6660 c01e75f4
7e80: c4097d58 c4160210 bf0abe08 bf0abe38 c4160360 bf0a49e4 c4147eb4 c4147ea8
7ea0: c01e7200 c01e6618 c4147ee4 c4147eb8 c01e6d9c c01e71f0 bf0a49dc bf0abe08
7ec0: bf0abe08 bf0abe38 bf0abe38 bf0a49e4 c04a9380 bf0c2000 c4147f0c c4147ee8
7ee0: c01e78ec c01e6d04 bf0abe08 bf0abfc4 bf0abe38 bf0a49e4 c04a9380 bf0c2000
7f00: c4147f2c c4147f10 c022b2a4 c01e784c 00000000 bf0abfc4 00000000 401f6008
7f20: c4147f3c c4147f30 bf0c2028 c022b248 c4147f7c c4147f40 c003f3d4 bf0c2010
7f40: c4147f6c 000c5387 bf0abfc4 00000000 401f6008 00000000 bf0abfc4 00000000
7f60: 401f6008 c0040064 c4146000 00000000 c4147fa4 c4147f80 c0081414 c003f388
7f80: ffffffff 401f6008 00000000 becadc98 00000000 00000080 00000000 c4147fa8
7fa0: c003fee0 c008135c 00000000 becadc98 401f6008 000c5387 000c3764 00000000
7fc0: 00000000 becadc98 00000000 00000080 becadc98 000c3764 00000000 00000002
7fe0: 00000069 becad7bc 00020268 40192c24 60000010 401f6008 ebfffc7b e1a04000
Backtrace:
[
r4:0000000c
[
r4:ffffff9c
[
[
r4:c0037c00
[
[
[
r7:bf0abe38 r6:bf0abe38 r5:c0037c34 r4:c0037c00
[
r6:c01e75e4 r5:c4147e80 r4:00000000
[
r7:bf0a49e4 r6:c4160360 r5:bf0abe38 r4:bf0abe08
[
[
[
[
r7:401f6008 r6:00000000 r5:bf0abfc4 r4:00000000
[
[
[
r7:00000080 r6:00000000 r5:becadc98 r4:00000000
Code: e1a0c00d e92dd810 e24cb004 e24dd004 (e5903000)
---[ end trace fb9efbb0b83ac13c ]---
Segmentation fault
这个错误很难发现
5.修改os/linux/usb_main_dev.c
加入: MODULE_LICENSE("GPL");
否则在加载驱动时出现如下错误:
# insmod rt3070sta.ko
rt3070sta: module license 'unspecified' taints kernel.
Disabling lock debugging due to kernel taint
rt3070sta: Unknown symbol usb_alloc_urb
rt3070sta: Unknown symbol usb_free_urb
rt3070sta: Unknown symbol usb_alloc_coherent
rt3070sta: Unknown symbol usb_register_driver
rt3070sta: Unknown symbol usb_put_dev
rt3070sta: Unknown symbol usb_get_dev
rt3070sta: Unknown symbol usb_submit_urb
rt3070sta: Unknown symbol usb_free_coherent
rt3070sta: Unknown symbol usb_control_msg
rt3070sta: Unknown symbol usb_deregister
rt3070sta: Unknown symbol usb_kill_urb
insmod: can't insert 'rt3070sta.ko': unknown symbol in module or invalid parameter
6.修改chips/rtmp_chip.c
464 #ifdef RT30xx
465
466
467 if (IS_RT30xx(pAd))
468 {
469 if (IS_RT3390(pAd))
470 // RT33xx_Init(pAd);
471 ;
472 else
473 RT30xx_Init(pAd);
474 }
475 #endif /* RT30xx */
否则编译汇编RT33xx_Init未定义的错误
7.修改os/linux/sta_ioctl.c
2227 #ifdef CONFIG_WEXT_PRIV
2228 .private = (iw_handler *) rt_priv_handlers,
2229 .num_private = N(rt_priv_handlers),
2230 .private_args = (struct iw_priv_args *) privtab,
2231 .num_private_args = N(privtab),
2232 #endif
否则会报如下错误
/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2227: 错误:初始值设定项里有未知的字段‘private’
/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2227: 警告:从不兼容的指针类型初始化
/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2228: 错误:初始值设定项里有未知的字段‘num_private’
/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2228: 警告:结构初始值设定项中有多余元素
/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2228: 警告:(在‘rt28xx_iw_handler_def’的初始化附近)
/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2229: 错误:初始值设定项里有未知的字段‘private_args’
/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2229: 警告:结构初始值设定项中有多余元素
/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2229: 警告:(在‘rt28xx_iw_handler_def’的初始化附近)
/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2230: 错误:初始值设定项里有未知的字段‘num_private_args’
/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2230: 警告:结构初始值设定项中有多余元素
/opt/workdir/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2230: 警告:(在‘rt28x
8、拷贝RT2870STA.dat到/etc/Wireless/RT2870STA/
二、交叉编译wireless_tools
1下载wireless_tools.29.tar.bz2
2 解压
#tar xvfj wireless_tools.29.tar.bz2
#cd wireless_tools.29
3 Makefile修改
CC= arm_v5t_le-gcc1.4 复制文件到产品板
4.拷贝libiw.so.29文件到目标系统/usr/lib/
拷贝用到的几个程序到产品板就可以了
iwpriv、iwconfig、iwlist, iwevent, iwspy
三、开发板中
1.插入rt3070
2.加载驱动驱动模块:insmod rt3070sta.ko
3.ifconfig ra0 192.168.3.252 netmask 255.255.0.0
# iwlist scanning
lo Interfnet eth0: DaVinci EMAC: ioctl not supported
ace doesn't support scanning.
eth0 Interface doesn't support scanning.
===>rt_ioctl_giwscan. 10(10) BSS returned, data->length = 1209
ra0 Scan completed :
Cell 01 - Address: 00:14:78:BA:86:04
Protocol:802.11b/g
ESSID:"123"
Mode:Managed
Frequency:2.437 GHz (Channel 6)
Quality=100/100 Signal level=-35 dBm Noise level=-92 dBm
Encryption key:off
Bit Rates:54 Mb/s
Cell 02 - Address: 00:22:6B:3F:AC:E1
Protocol:802.11b/g
ESSID:"yanfa"
Mode:Managed
Frequency:2.437 GHz (Channel 6)
Quality=37/100 Signal level=-75 dBm Noise level=-70 dBm
Encryption key:off
Bit Rates:54 Mb/s
Cell 03 - Address: E2:F8:DA:3C:BF:FA
Protocol:802.11b/g/n
ESSID:"frank's"
Mode:Managed
Frequency:2.462 GHz (Channel 11)
Quality=100/100 Signal level=-39 dBm Noise level=-92 dBm
Encryption key:on
Bit Rates:54 Mb/s
IE: IEEE 802.11i/WPA2 Version 1
Group Cipher : CCMP
Pairwise Ciphers (1) : CCMP
Authentication Suites (1) : PSK
# iwconfig ra0 essid "123"
# iwconfig
lo no wirnet eth0: DaVinci EMAC: ioctl not supported
eless extensions.
eth0 no wireless extensions.
ra0 Ralink STA ESSID:"123" Nickname:"RT2870STA"
Mode:Managed Frequency=2.437 GHz Access Point: 00:14:78:BA:86:04
Bit Rate=54 Mb/s
RTS thr:off Fragment thr:off
Encryption key:off
Link Quality=100/100 Signal level:-34 dBm Noise level:-66 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
# ifconfig eth0 down
# ping 192.168.4.222 注:192.168.4.222为无线路由ip
PING 192.168.4.222 (192.168.4.222): 56 data bytes
64 bytes from 192.168.4.222: seq=0 ttl=64 time=8.548 ms
64 bytes from 192.168.4.222: seq=1 ttl=64 time=1.978 ms
64 bytes from 192.168.4.222: seq=2 ttl=64 time=1.993 ms