Rt3070 AP驱动编译过程及排错总结

一、 Rt3070 AP驱动编译过程及排错总结1、 将ap 的tar 包解压到某目录下2、 按照ap 驱动解压目录下的INSTALL 和README 里的步骤,修改makefile 中的

一、 Rt3070 AP驱动编译过程及排错总结

1、 将ap 的tar 包解压到某目录下

2、 按照ap 驱动解压目录下的INSTALL 和README 里的步骤,修改makefile 中的kernel source 目录路径及编译工具。一般在X86架构的系统上,不需要修改编译工具,默认为gcc 。

3、 如果系统上没有kernel source,需要下载和系统内核版本一致的内核源代码,解压,然后确定kernel source目录,否则编译会报错

4、 Make

5、 Make完毕后驱动源码下的三个目录下会有三个ko 结尾的驱动,拷贝出来按照load.6脚本里顺序insmod 即可成功。

6、 网卡配置, 修改/etc/Wireless/RT2870AP/下面的RT2870AP.dat 文件(这个文件及目录原本是不存在的,需要自己创建目录,从驱动源码目录下将文件拷贝过去),里面的各个项可以通过看名称确定意义。或者查看驱动源码目录下的说明。

7、 网卡驱动编译排错:

问题1、刚装完系统,检查完驱动的makefile 基本配置之后,确认内核目录、编译工具正确,进行make 。

报错:rtmp_main.c : error : code model "kernel" not supported in the 32 bit mode rtmp_main.c :sorry.unimplemented : 64-bit mode not compiled in

,

是因为刚装完fedora15,内核目录/lib/modules/$(shell uname -r)/build下的.config 文件中的选项没有载入到make menuconfig中,或者说是make menuconfig之后,exit 前,没有save 。到/lib/modules/$(shell uname -r)/build下make menuconfig一下,exit 之后选择save 。问题即可排除。

问题2、报错implicit declaration of function 'XXX'

某函数的隐式声明。其实就是没有找到这个函数的声明、定义。这种报错一般出现在内核版本比较新,驱动版本比较旧,一些老的函数在新内核头文件中,已经改用别的名字。比如init_MUTEX()改名为sema_init(sem,1) init_MUTEX_LOCKED改名为sema_init(sem,0),还有比较常见的是usb_buffer_free和usb_buffer_alloc它们分别被更名为

usb_free_coherent和usb_alloc_coherent,参数没有变。可以通过报错的文件、行数找到这些函数,改成现在的名字,错误即可排除。

问题3、驱动编译完成,加载时,提示invalid module,用dmesg|tail命令查看后,发现是version magic报错。这个问题的原因一般是使用的内核版本与目前计算机上跑的内核版本不一致,在移植到嵌入式系统上的时候常出现。查证AP 驱动的makefile 里内核目录变量指向的是当前PC 机所用内核目录。/lib/modules/`uname -r`/build

这一步没有错。那么说明驱动的makefile 是正确的

切换到/lib/modules/`uname -r`/目录下,查看build (build 在此处是一个符号链接),ls -al 发现build 指向的目录是/usr/src/kernels/2.6.35.14-96.fc14.i686,问题在这里,虽然我用的目

,

录是/lib/modules/`uname -r`/build 这个目录貌似与我当前内核版本(uname -r 即

2.6.35.6-45.fc14.i686)一致,但是build 这个符号链接指向的内核源码却是

2.6.35.14-96.fc14.i686的,这样造成了编译出来的模块所带的version magic是

2.6.35.14-96.fc14.i686这一版本,加载时与uname -r不符。

那么要解决这一问题,就需要修改一下内核源码里的version magic 。

驱动模块的version magic信息是怎么生成的:

2.6 内核下,在linux/vermagic.h中定义有VERMAGIC_STRING,VERMAGIC_STRING不仅包含内核版本号,还包含有内核使用的gcc 版本,SMP 与PREEMPT 等配置信息。模块在编译时,我们可以看到屏幕上会显示"MODPOST" 。在此阶段, VERMAGIC_STRING会添加到模块的modinfo 段。在内核源码目录下scriptsmodmodpost.c文件中可以看到模块后续处理部分的代码。模块编译生成后,通过`modinfomymodule.ko`命令可以查看此模块的vermagic 等信息。2.6 内核下的模块装载器里保存有内核的版本信息,在装载模块时,装载器会比较所保存的内核vermagic 与此模块的modinfo 段里保存的vermagic 信息是否一致,两者一致时,模块才能被装载。譬如Fedora core 4 与core 2 使用的都是2.6 版本内核,在Fedore Core 2下去加载Fedora Core4下编译生成的hello.ko ,会出现"invalid module format" 错误。

只需要把/usr/src/kernels/2.6.35.14-96.fc14.i686/目录下源码中的include/linux/vermagic.h中的VERMAGIC_STRING修改成与当前PC 内核uname -r一致即可。

修改如下:

#define VERMAGIC_STRING

"2.6.35.6-45.fc14.i686" ""

MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT

MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS MODULE_ARCH_VERMAGIC

,

具体的格式可以在modinfoyourmodule.ko 查看之后再修改,修改完后重新make 即可加载后没有version magic报错提示。,重新make ,就可以骗过version magic的检查。 问题4:驱动编译完成,加载后报错:invalid module,用dmesg|tail命令查看后,发现错误为:

module license unspecified tains kernel

接下来就是一个什么功能被disable 了,然后一系列的 unknown symbol xxx()。

原因是驱动没有声明MODULE_LICENSE("GPL"); 可能因为没有这个声明,内核关闭了一些功能,导致一系列函数无法识别。找到usb_main_dev.c文件,加上GPL 的声明即可。重新make ,加载,可以驱动网卡。

问题5:fedora15上自带了对ralink rt2573和rt3070一系列网卡芯片的驱动模块,在插入网卡的时候,会自动加载,但是如果你要加载你自己的驱动,那么就跟系统自动加载的驱动冲突了,可能会死机

解决办法就是插入网卡的时候,不让系统自动加载自带的驱动。

先到/lib/modules下面找到module.dep 文件,看rt2573相关驱动的依赖关系,也就是网卡插入时,到底哪些有关驱动被一起加载了,比如rt2573的,有rt73usb rt2x00usb rt2x00lib cfg80211等等。把这些名字添加到系统文件/etc/modprobe.d/blacklist.conf中,如blacklist rt73usb 这个语句就可以阻止系统在网卡插入usb 时,自动加载rt73usb 这个模块。记得要把所有有依赖关系的模块列全。

,

8、 当所有工作都做完,即驱动编译完成,Wireless 目录下文件齐全并配置完毕后,按如下命令启动网卡:

insmod rtutil3070ap.ko

insmod rt3070ap.ko

insmod rtnet3070ap.ko

插上网卡后 iwconfig 会看到ra0出现

ifconfig ra0 up 192.168.1.1

启动网卡并设置IP 为192.168.1.1

blacklist.conf ,用于阻止内核自动加载自身所带的ralink 驱动,影响我们自己编译的驱动,内核自带的驱动不太好用。RT2870AP.dat 文件需要拷贝到/etc目录下面的,这样网卡起来的时候会去读这个目录下的配置,比如密码、wifi 网络名称等。

二、 DHCP配置

1、 安装ubuntu 的dhcp server软件

sudo apt-get install –y isc-dhcp-server

2)修改/etc/dhcp/dhcpd.conf

1)取消authoritative; 的注释

2)subnet 192.168.1.0 netmask 255.255.255.0 {

,

range 192.168.1.60 192.168.1.254;

option routers 192.168.1.1;

option domain-name-servers 192.168.1.1;

}

设定DHCP server分配IP 的范围、并设定接入设备的默认网关和dns server为本ADFI 设备

三、 DNS配置

1、 安装ubuntu 的dns server软件

sudo apt-get install –y bind9

2、 修改/etc/bind/下面的dns 配置文件

目前我们设备上的dns 策略有两种

1)、ADFI 设备无需上网,本地解析所有终端设备的dns 请求,并将所有结果解析成192.168.1.1,即本机IP 。

修改的配置文件:

Name.conf.local

zone "." {

type master;

file "/etc/bind/db.adfi";

};

,

修改根域名服务器为本地,这样就修改了所有的dns 解析的解析途径,不去访问公网的根域名服务器,而是直接查询本地的/etc/bind/db.adfi文件

Name.conf.default.zones

//zone "." {

// type hint;

// file "/etc/bind/db.root";

//}

注释掉根域名服务器的默认查询文件

db.adfi

$TTL 120;2min

@ IN SOA team. root.team. (

2 ; Serial

604800 ; Refresh 7days

86400 ; Retry 1days

2419200 ; Expire 4*7days

604800 ) ; Negative Cache TTL

;

@ IN NS team.

* IN A 192.168.1.1

www IN A 192.168.1.1

ftp IN A 192.168.1.1

@ IN AAAA :: 1days

,

这里定义了所有域名都解析为192.168.1.1的规则

Named.conf.options

options {

directory "/var/cache/bind";

// If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113

// If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders.

// Uncomment the following block, and insert the addresses replacing // the all-0's placeholder.

forwarders {

192.168.1.1;

};

allow-query{any;};

auth-nxdomain no; # conform to RFC1035

listen-on-v6 { any; };

};

Forwarders 定义为192.168.1.1

,

2)、ADFI 设备需要上网,作为本地的dns server,代理终端去解析它们请求的域名,然后解析完毕后返回给局域网内终端相应的结果。具体过程可以参照dns 解析的一般流程。 修改的配置文件和上面所述相同,但是因为域名不是本地改写了,所以根域名等服务器要恢复正常配置。

四、 3g网卡配置

1、 安装ubuntu 常用的3g 配置、拨号工具wvdial 以及ubuntu 系统自带的3g 模块识别数据库

sudo apt-get install -y usb-modeswitchusb-modeswitch-data wvdial

2、 在系统断电的情况下插上3g 网卡和sim 卡,lsusb 可以看到网卡信息

3、 如果是M306网卡,需要再执行sudousb_modeswitch -v 230d -p 0111 -u 2 其他网卡不需要

4、 Sudowvdialconf进行网卡拨号配置的设置

5、 尝试拨号 sudowvdial

6、 如果显示 ttyUSBx resource busy之类的提示,应该是已经有wvdial 进程在运行,kill 掉即可。

7、 如果显示 init failed 之类的提示,检查是否插上sim 卡

8、 其他拨号提示 一般都是信号不好 检查馈线是否插好

,

五、 Squid配置

1、 安装squid

sudo apt-get install –y squid

2、 修改配置文件/etc/squid/squid.conf文件

#####add

acladfi_networksrc 192.168.1.0/24

#####end of add

acllocal_pagedst 192.168.1.1

acl deny_rep_mime_flashvideo1 rep_mime_type video/x-flv

acl deny_rep_mime_flashvideo4 rep_mime_type application/octet-stream http_reply_access deny deny_rep_mime_flashvideo4 !local_page acl deny_rep_mime_flashvideo5 rep_mime_type video/x-mp4

标签: