Linux总结之Ralink雷凌rt3070驱动的ARM平台移植问题

时间:2021-12-06 20:38:36

最近在做wifi数据采集的东西,需要做rt3070的驱动移植,目标板是AM3517的ARM板(cortex-A8的核心)。

中间遇到很多问题。需要准备的东西。rt3070的驱动,linux内核源码,还有固件。

arm-none-linux-gnueabi-后空格,识别错误,command no  found

驱动直接在官网下的最新的,是tar.bzip2格式的。以前碰到的都是tar格式的,直接最常用的tar -zxvf  ***.tar就可以解压。这个格式的解压搜了好一会也没解压了。直接用常用的tar -zxvf 解压不了。网上有说是先用bzip2 -d 解压,再用tar解压。但是第一步就不对,说是非bzip格式。最后直接用的旧版本的。后来偶然发现有人建议用 tar  -xvf 解压。OK解决了。查了一下书,发现z代表的是使用gzip来压缩/解压缩文件。


操作过程如下(开发包readme详细看):

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
设置 "MODE = STA" "TARGET = LINUX"

并设置linux源码路径和交叉编译链的路径
ifeq ($(PLATFORM),AM3517)
# Linux 2.6
LINUX_SRC = /opt/3517project/DIM3517_kernel_2.6.32
CROSS_COMPILE = /opt/tools/arm-2009q1/bin/arm-none-linux-gnueabi-
endif


3> In os/linux/config.mk 
设置 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y'.

或者 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n'.
两种方式关于网络安全的模块编译时的区别。如果不用可以任意选一个。

4> $make
编译源码

5>安装前需要拷贝RT2870STA.dat,在目标板的系统中(安装在主机上,就拷贝到主机的这个目录下)

$cp RT2870STA.dat  /etc/Wireless/RT2870STA/RT2870STA.dat


6>之后的操作就是加在模块,运行了。


编译时出现以下错误一:

/opt/3517project/RT3070_Linux_STA_V2.5.0.3_DPO/os/linux/../../chips/rtmp_chip.c: In function 'RtmpChipOpsHook':
/opt/3517project/RT3070_Linux_STA_V2.5.0.3_DPO/os/linux/../../chips/rtmp_chip.c:470: error: implicit declaration of function 'RT33xx_Init'
make[2]: *** [/opt/3517project/RT3070_Linux_STA_V2.5.0.3_DPO/os/linux/../../chips/rtmp_chip.o] Error 1
make[1]: *** [_module_/opt/3517project/RT3070_Linux_STA_V2.5.0.3_DPO/os/linux] Error 2
make[1]: Leaving directory `/opt/3517project/DIM3517_kernel_2.6.32'
make: *** [LINUX] Error 2

报错说是在rtmp_chip.c:470行有没有声明的函数。英文编译的rt3070的驱动,他会编译到这段代码。

if (IS_RT30xx(pAd))
        {
                if (IS_RT3390(pAd))
                        RT33xx_Init(pAd);// 
                else
                        RT30xx_Init(pAd);
}

修改后如下:
if (IS_RT30xx(pAd))
        {
                if (IS_RT3390(pAd))
                        ; // RT33xx_Init(pAd);
                else
                        RT30xx_Init(pAd);
}


编译时出现以下错误二:

Building modules, stage 2.
MODPOST 1 modules
/bin/sh: scripts/mod/modpost: not found
make[2]: *** [__modpost] Error 127
make[1]: *** [modules] Error 2
make scripts 否则提示:MODPOST 1 modules/bin/sh: scripts/mod/modpost: not found


出现这个错误你只需要在内核目录下 make scripts 一下在编译驱动就行了。

今天终于编译的差不多了,现在就是加载是固件有问题。先总结一下前面遇到的问题吧,前面遇到的很多编译错误,比如缺少文件,没有定义的变量,没有相关的头文件等等,基本都是内核配置不对产生的问题。

配置无线usb网卡时,你先要配置网络参数,之后需要配置设备驱动中的无线设备,即使他里面没有包含你需要的驱动你至少也要加载一个上去,不然他不会编译需要的文件,你在编译驱动是当然也报错。最后你还需要配置你用的接口,现在用的是usb的,如果你用的pci的,你还需要配置pci的编译选项。

下面是今天遇到的问题,之前配置已经通过了,但是这次却不行。重新配置了几次还是不行,后来看论坛有人说这是没有用make clean的问题。因为之前编译通过的文件不会再编译了,所以可能里面当时是错误的,虽然后面改过编译选项了,但是这些文件仍然保留,所以还是会报错。

所以你在改过编译选项后,记住最好是make clean 一下。

错误信息:

error: unknown field ‘private’ specified in initializer
/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2225:2: warning: initialization from incompatible pointer type
/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2226:2: error: unknown field ‘num_private’ specified in initializer
/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2226:2: warning: excess elements in struct initializer
/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2226:2: warning: (near initialization for ‘rt28xx_iw_handler_def’)
/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2227:2: error: unknown field ‘private_args’ specified in initializer
/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2227:26: warning: excess elements in struct initializer
/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2227:26: warning: (near initialization for ‘rt28xx_iw_handler_def’)
/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2228:2: error: unknown field ‘num_private_args’ specified in initializer
/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2228:2: warning: excess elements in struct initializer
/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.c:2228:2: warning: (near initialization for ‘rt28xx_iw_handler_def’)
make[2]: *** [/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux/../../os/linux/sta_ioctl.o] Error 1
make[1]: *** [_module_/usr/src/2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO/os/linux] Error 2
make[1]: Leaving directory `/usr/src/linux-3.0.6-gentoo'
make: *** [LINUX] Error 2


编译时出现以下错误三:

另外,在编译驱动前,先要把内核编译好,不然驱动会没有版本信息。有以下错误 "no symbol version for module_layout"


编译时出现以下错误四:
固件加载不了的问题。

错误信息:

rt2870usb 1-1:1.0: firmware: requesting rt2870.bin
phy0 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.

或者

[root@utu-Linux]\$ ifconfig wlan0 up
rt73usb 1-1:1.0: firmware: requesting rt73.bin
phy0 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.
ifconfig: SIOCSIFFLAGS: No such file or directory


通常情况下,load firmware的动作是通过用户空间的hotplug handler,也就是/proc/sys/kernel/hotplug里设定的执行档,来完成。root_qtopia默认会在/etc/init.d/rcS里将/proc/sys/kernel/hotplug设定为/sbin/mdev,即busybox的mdev模块。它在收到来自内核的请求加载rt73.bin这个firmware消息后,会从/lib/firmware目录下去找rt73.bin,如果能找到就加载。

解决方法:

文件系统的/etc/init.d/rcS加:

echo /sbin/mdev > /proc/sys/kernel/hotplug
这样一句。

mdev的hotplug模式

1, busybox 添加mdev支持

2, 在/etc/rc.d/rcS中添加

#mount filesystem
/bin/mount -a
#start mdev
echo /sbin/mdev > /proc/sys/kernel/hotplug    #设置系统的hotplug程序为mdev mdev –s

/etc/fstab的内容如下:

proc    /proc   proc    defaults        0       0
none    /tmp    ramfs   defaults        0       0
mdev    /dev    ramfs   defaults        0       0
sysfs   /sys    sysfs   defaults        0       0

执行mdev -s :以‘-s’为参数调用位于 /sbin目录写的mdev(其实是个链接,作用是传递参数给/bin目录下的busybox程序并调用它),mdev扫描 /sys/class 和 /sys/block 中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev 下创建设备节点文件。一般只在启动时才执行一次 “mdev -s”。

热插拔事件:由于启动时运行了命令:echo /sbin/mdev > /proc/sys/kernel/hotplug ,那么当有热插拔事件产生时,内核就会调用位于 /sbin目录的mdev。这时mdev通过环境变量中的 ACTION 和 DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。

解决使用mdev时“cannot create /proc/sys/kernel/hotplug:nonexistent directory”错误

确保编译内核时编译如下选项:

CONFIG_PROC_FS=y

CONFIG_PROC_SYSCTL=y

CONFIG_HOTPLUG=y

CONFIG_NET=y

如果CONFIG_HOTPLUG和CONFIG_NET不选或没全选上的话,/proc/sys/kernel下将不会创建hotplug文件.(参见kernel/sysctl.c)


编译时出现以下错误五:

ifconfig/proc/net/dev: No such file or directory


在rcS文件中添加如下内容:
 
#!/bin/sh 
PATH=/sbin:/bin:/usr/sbin:/usr/bin 
runlevel=S 
prevlevel=N 
umask 022 
/bin/mount –a 
export PATH runlevel prevlevel 

其中倒数第二句中的 “-” 字符错误,导致启动时,加载失败。所以出现上面的错误警告。


编译时出现以下错误六:

ERROR: the symlink include/asm points to asm-x86 but asm-arm was expected
set ARCH or save .config and run 'make mrproper' to fix it
make: *** [include/asm] 错误 1


最后发现,将linux/include/asm 目录删除以后,该问题得以解决

原因:linux/include/asm 文件夹是内核编译过程中创建的,创建结果就是一个指向文件夹asm-arm 的链接,表明该系统的平台是arm 架构的,而编译系统内核之前,是没有asm 这个链接的,所以,在编译过程中,创建该链接时文件名字与asm 文件夹的名字发生冲突,报错了


驱动编译,憋了好久终于没问题了。中间也学会了很多东西。现在整个平台才搭建了一点。问题很多。继续努力吧。。。fighting。。。


百度文库有我整理的文档免费下载:

http://wenku.baidu.com/view/3288204ecf84b9d528ea7a93.html

CSDN下载地址:

http://download.csdn.net/detail/xqmoo8/4158854


关键字搜索:rt30*驱动编译问题总结

ralink驱动arm平台移植问题总结