rt3070驱动的ARM平台移植问题


最近在做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来压缩/解压缩文件。

 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

另外,在编译驱动前,先要把内核编译好,不然驱动会没有版本信息。www.bkjia.com有以下错误 "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”。

  • 1
  • 2
  • 下一页

相关内容