第一部分 基于PC机的实现 操作系统:ubuntu 7.04 & ubuntu 7.10 安装编译工具: sudo apt-get install build-essential 一、安装USB无线网卡驱动 型号:D-Link DWL-G122 1. 下载、编译安装必须的软件包 用firefox打开网页http://rt2x00.serialmonkey.com 进入download,找到rt73 (USB),点击rt73-CVS,下载rt73-cvs-daily.tar.gz tar -xvzf rt73-cvs-daily.tar.gz cd rt73-cvs-yyyymmddhh/Module make 这时出现以下警告 !!! WARNING: Module file much too big (>1MB) !!! Check your kernel settings or use 'strip' ls -lah rt73.ko 可见此文件为2.7M > 1M,可采取以下操作: strip -S rt73.ko 再ls -lah rt73.ko,此时大小以缩减为243K sudo make install 2. 修复module冲突 sudo modprobe -r rt73usb sudo modprobe -r rt2570 sudo modprobe -r rt2500usb sudo modprobe -r rt2x00lib 3. 编辑blacklist文件 sudo gedit /etc/modprobe.d/blacklist 添加以下内容: # Blacklist rt73usb, as it is a non-functional beta module which conflicts with the working rt73 module. blacklist rt73usb # Blacklist rt2570, as it causes conflicts with rt73 blacklist rt2570 # Other modules that break rt73 blacklist rt2500usb blacklist rt2x00lib 4. 安装模块 sudo modprobe -v rt73 5. 进行网络设置(在307无线AP环境下进行,事先需要网管添加无线网卡MAC地址) 插入TP-LINK TL-WN321G,iwconfig,可查到wlan0这一项,以下操作启用根用户进行 # ifconfig wlan0 up # iwconfig wlan0 mode Managed essid "ha2ap" key 0123456789 # dhclient wlan0 若一切正常,则无线网卡已经开始正常工作。 二、安装摄像头驱动 型号:奥尼(ANC)领航者 S888 奥尼S888采用的芯片是ZC0301H,lsusb显示: Bus 002 Device 002: ID 0ac8:303b Z-Star Microelectronics Corp. ZC0303 WebCam ubuntu 7.04(7.10)已支持中芯微301系列的USB摄像头,直接插上摄像头即可识别、使用。 查看摄像头视频可使用camorama(显示效果有色偏) sudo apt-get install camorama 或使用系统自带的Ekiga软电话的视频功能。 当然也可使用后来安装的VLC。 若发现使用不了,用lsmod查看是否已经加载了zc0301模块,若是只需将其清除即可 方法是设置zc0301这个模块在启动时不自动加载: 在/etc/modprobe.d/blacklist文件最后添加一项: blacklist zc0301,保存,退出,重启就OK了。 三、安装VLC 1. 直接源安装 sudo apt-get install vlc 用VLC获取摄像头采集的视频图像 打开VLC media player,文件--打开获取设备--将视频装备名称改为/dev/video0 (即在默认名称后加个0)--确定 便可得到摄像头采集的图像 发送视频: 文件: vlc -vvv videoname.xyz --sout udp:x.x.x.x --ttl 12 摄像头: vlc -vvv --color v4l:/dev/video0:norm=secam:frequency=543250:size=320x240:channel=0:adev=/dev/dsp:audio=0 --sout '#transcode{vcodec=mp4v,acodec=mpga,vb=3000,ab=256,venc=ffmpeg{keyint=80,hurry-up,vt=800000},deinterlace}:std{access=udp,mux=ts,dst=x.x.x.x}' --ttl 12 接收视频: vlc udp:x.x.x.x 2. 编译源码安装 !注:若之前源安装过vlc,需先进行卸载,否则可能会发生冲突。 sudo apt-get remove vlc sudo apt-get autoremove http://www.videolan.org/vlc/download-sources.html下载vlc源代码vlc-0.8.6d.tar.gz 编译vlc (1) ./configure 出现问题: configure: error: Could not find libmad on your system: you may get it from http://www.underbit.com/products/mad/. Alternatively you can use --disable-mad to disable the mad plugin. 解决办法: http://sourceforge.net/project/showfiles.php?group_id=12349下载libmad-0.15.1b.tar.gz 解压,./configure,make,sudo make install (2) ./configure 出现问题: configure: error: Missing header file ffmpeg/avcodec.h. 解决办法: sudo apt-get install libavcodec-dev (3) ./configure 出现问题: configure: error: Missing header file postproc/postprocess.h. 解决办法: sudo apt-get install libpostproc-dev (4) ./configure 出现问题: configure: error: Could not find libmpeg2 on your system: you may get it from http://libmpeg2.sf.net/ (you need the cvs version). Alternatively you can use --disable-libmpeg2 to disable the libmpeg2 plugin. 解决办法: http://libmpeg2.sourceforge.net/downloads.html下载mpeg2dec-0.4.1.tar.gz 解压,./configure,make,sudo make install (5) ./configure 出现问题: configure: error: The skins2 module depends on the wxWidgets development package. Without it you won't be able to open any dialog box from the interface, which makes the skins2 interface rather useless. Install the wxWidgets development package or alternatively you can also configure with: --disable-wxwidgets --disable-skins2. 解决办法: sudo apt-get install libwxgtk2.6-dev (6) ./configure 产生了Makefile (7) make 出现问题: demux.c:38:25: 错误: avformat.h:No such file or directory In file included from demux.c:41: ffmpeg.h:44: 错误: expected declaration specifiers or ‘...’ before ‘AVCodecContext’ ffmpeg.h:44: 错误: expected declaration specifiers or ‘...’ before ‘AVCodec’ ffmpeg.h:50: 错误: expected declaration specifiers or ‘...’ before ‘AVCodecContext’ ffmpeg.h:50: 错误: expected declaration specifiers or ‘...’ before ‘AVCodec’ ffmpeg.h:85: 错误: expected declaration specifiers or ‘...’ before ‘AVFrame’ make[6]: *** [libffmpeg_plugin_a-demux.o] 错误 1 make[6]: Leaving directory `/home/infonet/桌面/vlc-0.8.6d/modules/codec/ffmpeg' make[5]: *** [all-modules] 错误 1 make[5]: Leaving directory `/home/infonet/桌面/vlc-0.8.6d/modules/codec/ffmpeg' make[4]: *** [all-recursive] 错误 1 make[4]: Leaving directory `/home/infonet/桌面/vlc-0.8.6d/modules/codec' make[3]: *** [all] 错误 2 make[3]: Leaving directory `/home/infonet/桌面/vlc-0.8.6d/modules/codec' make[2]: *** [all-recursive] 错误 1 make[2]: Leaving directory `/home/infonet/桌面/vlc-0.8.6d/modules' make[1]: *** [all-recursive] 错误 1 make[1]: Leaving directory `/home/infonet/桌面/vlc-0.8.6d' make: *** [all] 错误 2 解决办法: sudo apt-get install libavformat-dev (8) make clean,make 出现问题: 编译生成可执行文件vlc,运行(./vlc),在本地播放视频文件没问题,不过[File]->[Open Capture Device]异常,无法找到摄像头设备 解决办法: 查阅vlc官方文件(http://www.videolan.org/doc/vlc-user-guide/en/ch02.html),发现v4l模块默认情况下是disabled,需要在./configure加上选项 --enable-v4l make distclean(或者直接删除vlc-0.8.6d整个文件夹,重新解压) ./configure --enable-v4l (9) make 出现问题: 编译生成可执行文件vlc,运行(./vlc),在本地播放视频文件与显示摄像头视频均正常 不过在向另一台电脑传输视频文件时出现以下错误与警告: main private warning: missing value for option mux main private error: no sout mux module matched "ts" stream_out_standard private error: no suitable sout mux module for `udp/ts://192.168.6.226' main private warning: no sout stream module matching "std" could be loaded main stream output error: stream chain failed for `std{mux="",access="udp",dst="192.168.6.226"}' 传输摄像头视频时出现以下错误与警告: main private error: no sout mux module matched "ts" stream_out_standard private error: no suitable sout mux module for `udp/ts://192.168.6.226' main private warning: no sout stream module matching "std" could be loaded stream_out_transcode private error: cannot create chain main private warning: no sout stream module matching "transcode" could be loaded main stream output error: stream chain failed for `transcode{vcodec=mp4v,acodec=mpga,vb=3000,ab=256,samplerate=44100,venc=ffmpeg{keyint=80,hurry-up,vt=800000},deinterlace}:std{access=udp,mux=ts,dst=192.168.6.226}' main input error: cannot start stream output instance, aborting 解决办法: http://downloads.videolan.org/pub/videolan/libdvbpsi/0.1.6/下载libdvbpsi5-0.1.6.tar.gz 解压,./configure,make,sudo make install (9) make distclean (或者直接删除vlc-0.8.6d整个文件夹,重新解压),./configure --enable-v4l,make 编译生成可执行文件vlc,运行(./vlc),在本地播放视频与传输视频均正常 sudo make install 将vlc安装到系统中。之后运行vlc就不必到vlc文件夹下或加上完整路径,只需直接输入vlc即可,与直接由软件源安装的vlc使用方法一样 !注:安装后可能出现如下问题:系统环境变量中已有vlc,不过运行vlc提示无此文件,且[应用程序]->[影音]中无VLC media player 解决办法:sudo make uninstall,登出系统重新登录,sudo make install,OK! *********************************************************** 总结编译源码安装vlc的步骤如下: !注:若之前已通过软件源安装了vlc需先进行卸载 sudo apt-get remove vlc sudo apt-get autoremove (1) http://sourceforge.net/project/showfiles.php?group_id=12349下载libmad-0.15.1b.tar.gz 解压,./configure,make,sudo make install (2) http://libmpeg2.sourceforge.net/downloads.html下载mpeg2dec-0.4.1.tar.gz 解压,./configure,make,sudo make install (3) sudo apt-get install libavcodec-dev libpostproc-dev libwxgtk2.6-dev libavformat-dev (4) http://downloads.videolan.org/pub/videolan/libdvbpsi/0.1.6/下载libdvbpsi5-0.1.6.tar.gz 解压,./configure,make,sudo make install (5) http://www.videolan.org/vlc/download-sources.html下载vlc源代码:vlc-0.8.6d.tar.gz tar zxvf vlc-0.8.6d.tar.gz, cd vlc-0.8.6d ./configure --enable-v4l,make,sudo make install *********************************************************** 四、安装ad hoc路由协议 aodvd-uu http://sourceforge.net/project/showfiles.php?group_id=212045 下载aodv-uu-0.9.5.tar.gz tar zxvf aodv-uu-0.9.5.tar.gz cd aodv-uu-0.9.5 make sudo make install 五、多跳视频传输实现 网络拓扑结构:(主机 1 与主机 3 不在对方的无线覆盖范围内,需经主机 2 中转) 1――――――2―――――――3 1. 配置无线网卡 主机 1: # ifconfig wlan0 10.0.0.1 up # iwconfig wlan0 mode ad-hoc freq 2.457G # iwconfig wlan0 essid INFONET 主机 2: # ifconfig wlan0 10.0.0.2 up # iwconfig wlan0 mode ad-hoc freq 2.457G # iwconfig wlan0 essid INFONET 主机 3: # ifconfig wlan0 10.0.0.3 up # iwconfig wlan0 mode ad-hoc freq 2.457G # iwconfig wlan0 essid INFONET 2. 运行aodvd-uu # aodvd -l -r 3 注:-l 表示aodv-uu将在/var/log建立aodvd.log、aodvd.rtlog两个文件,前者记录测试过程中的所有日志,后者记录路由表; -r 3 表示每3秒中记录一次路由表。 若一切正常,三台主机之间可以相互ping通,且主机 1 运行ping -R 10.0.0.3,可显示路由途径 10.0.0.2。 3. 传输视频文件与摄像头视频 利用VLC,所用命令与有线环境下相同 在一跳范围内,结点静止的情况下质量良好;若结点发生移动,画面会出现马赛克,并伴随停顿,这在结点间距离较大时犹为明显。 六、安装与配置NFS 1. 安装nfs服务器端和客户端 sudo apt-get install portmap nfs-kernel-server nfs-common 2. 配置共享文件 服务器端的设定都是在/etc/exports这个文件中进行设定的,设定格式如下: 欲分享出去的目录 主机名称 1 或者IP1(参数1,参数2) 主机名称 2 或者IP2(参数3,参数4) 上面这个格式表示,同一个目录分享给两个不同的主机,但提供给这两台主机的权限和参数是不同的,所以分别设定两个主机得到的权限。 可以设定的参数主要有以下这些: (1)rw:可读写的权限; (2)ro:只读的权限; (3)no_root_squash:登入到NFS主机的用户如果是ROOT用户,他就拥有ROOT的权限,此参数很不安全,建议不要使用。 (4)root_squash:在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成nobody 那个身份; (5)all_squash: 不管登陆NFS主机的用户是什么都会被重新设定为nobody。 (6)anonuid:将登入NFS主机的用户都设定成指定的user id,此ID必须存在于/etc/passwd中。 (7)anongid:同 anonuid,但是变成 group ID 就是了. (8)sync:资料同步写入存储器中。 (9)async:资料会先暂时存放在内存中,不会直接写入硬盘。 (10)insecure:允许从这台机器过来的非授权访问。 例如: sudo gedit /etc/exports 在其中增加要共享的目录 /home/infonet/project 192.168.6.0/24(ro,sync) 使共享生效: sudo exportfs -ra 3. 重启服务 sudo /etc/init.d/portmap restart sudo /etc/init.d/nfs-kernel-server restart !注:如果我们在启动了NFS之后又修改了/etc/exports,可以用exportfs命令来使改动立刻生效,该命令格式如下: exportfs [-aruv] -a :全部mount或者unmount /etc/exports中的内容 。 -r :重新mount /etc/exports中分享出来的目录 。 -u :umount 目录 。 -v :在 export 的时候,将详细的信息输出到屏幕上。 4. 客户端的操作 (1)在客户端可以用showmount命令查看服务器共享的文件夹: showmout -a :这个参数是一般在NFS SERVER上使用,是用来显示已经mount上本机nfs目录的cline机器。 -e :显示指定的NFS SERVER上export出来的目录。 例如: showmount -e 192.168.6.229 Export list for 192.168.6.229: /home/infonet/project 192.168.6.0/24 (2)mount nfs目录: sudo mount -t nfs hostname(orIP):/directory /mount/point 例如: sudo mount -t nfs 192.168.6.229:/home/infonet/project /home/tmp 对应卸载为: sudo umount -t nfs 192.168.6.229:/home/infonet/project /home/tmp 第二部分 嵌入式NFS系统的搭建 嵌入式开发平台:广嵌 GEC 2410开发板 一、安装交叉编译器 (CD1/使用工具/Linux工具/toolchain/cross-3.3.2.tar.bz2) 注:以下操作启用根用户进行 1. 在 usr/local 目录下建一个 arm 目录 mkdir /usr/local/arm 2. 将 cross-3.3.2.tar.bz2 拷贝到上面建立的目录下 cp cross-3.3.2.tar.bz2 /usr/local/arm 3. 解压 cross-3.3.2.tar.bz2 tar zxvf cross-3.3.2.tar.bz2 这样会生成一个 3.3.2 目录。 rm cross-3.3.2.tar.bz2(此操作非必要) 4. 添加环境变量 gedit ~/.bashrc 在文件最后添加以下内容: export PATH=$PATH:/usr/local/arm/3.3.2/bin 然后终端输入以下命令使设置生效: source ~/.bashrc 到此,交叉编译器已安装完毕 二、配置内核实现NFS功能 (CD1/目标代码及支持包/linux源码包/gec2410-linux-2.6.8.tar.bz2) 1. 解压内核源码包 tar jxvf gec2410-linux-2.6.8.tar.bz2 2. 配置内核,开启NFS文件系统功能 (1)运行make menuconfig进入配置菜单,装载配置文件 gec2410.cfg 选中 Networking support ---> Networking options ---> IP: kernel level auloconfiguralion 项 选中 File systems ---> Network File Systems 下的 NFS file system support 和 Root file system on NFS (3)编译内核:make 编译结束后,可在 arch/arm/boot 目录下得到 linux 内核压缩映像 zImage 三、制做根文件系统 (CD1/目标代码及支持包/sharp/目标代码/gec2410_demo.cramfs) 光盘提供的是根文件系统的cramfs根文件,使用NFS,需先将此文件进行解压。 1. 从http://sourceforge.net/project/showfiles.php?group_id=18351&package_id=39699&release_id=76692 下载cramfs-1.1.tar.gz 解压,make,生成mkcramfs和 cramfsck两个工具,其中mkcramfs是用来创建 cramfs文件系统的,而cramfsck则用来进行 cramfs文件系统的释放以及检查。 2. 解压gec2410_demo.cramfs到gec2410文件夹 ./cramfsck -x gec2410 gec2410_demo.cramfs 3. 生成新的根文件系统镜像文件(最终需直接从板载NAND启动) ./mkcramfs gec2410 gec2410.cramfs 四、NFS设置 1. PC机 (1)sudo gedit /etc/exports 在其中增加要共享的目录 /home/infonet/gec2410 192.168.6.0/24(rw,sync,no_root_squash) (2)使共享生效: sudo exportfs -ra (3)重启服务 sudo /etc/init.d/portmap restart sudo /etc/init.d/nfs-kernel-server restart 2. 开发板根文件系统 修改 gec2410/usr/etc/rc.local 文件,设置开发板 IP 地址为 192.168.6.229 五、烧写内核 参照GEC2410用户手册在windows利用串口工具DNW将生成的内核压缩映像 zImage烧写到开发板中。 选择6 : Set boot params 输入root=/dev/nfs nfsroot=192.168.6.226:/home/infonet/gec2410 noinitrd init=/linuxrc console=ttyS0 ip=192.168.6.229 注意:nfsroot的目录名要与之前主机上的共享目录名一致 然后选择 3: Load Program from Nand flash and run 显示以下信息: Read chip id = ec76 Nand flash status = c0 Set boot params = root=/dev/mtdblock2 load_ramdisk=0 init=/linuxrc console=ttyS0,115200 devfs=mount display=shp240 Linux version 2.6.8.1-ptx1 (infonet@infonet) (gcc version 3.3.2) #1 Mon Jan 14 17:55:32 CST 2008 CPU: ARM920Tid(wb) [41129200] revision 0 (ARMv4T) …… …… …… Kernel panic: VFS: Unable to mount root fs on unknown-block(31,2) 由“Kernel command line: root=/dev/mtdblock2 load_ramdisk=0 init=/linuxrc console=ttyS0,115200 devfs=mount display=shp240”可见之前设置的从NFS启动并没有生效。 查看bios源代码(CD1\目标代码及支持包\sharp\GEC2410_bios_240320) 在nand.c文件的421行发现以上启动参数: char *linux_params = "root=/dev/mtdblock2 load_ramdisk=0 init=/linuxrc console=ttyS0,115200 devfs=mount display=shp240"; 可见输入参数功能未被实现。 联系客服,获得一份支持设置启动参数的 GEC2410_bios_800480,将里面的的GEC2410_BOIS_bin 烧写到0分区(之前先擦除0分区)。 重新启动,按下数字6键之后,输入以下参数: root=/dev/nfs devfs=mount console=ttyS0,115200 init=/linuxrc nfsroot=192.168.6.226:/home/infonet/gec2410 ip=192.168.6.229:192.168.6.226:192.168.6.226:255.255.255.0:gec2410:eth0:off display=shp240 然后按数字键3,之后过程中显示出若干行“eth0: Transmit buffer not free!”,不过系统还是顺利地启动了。 在linux下,用minicom虚拟终端,可同样进入板上的系统。 (sudo apt-get install minicom) 进入minicom需进行端口的设置 ctrl+a o 设置 serial port setup 更改如下选项 A - Serial Device : /dev/ttyS0 F - Hardware Flow Control : No 然后Esc退出上一菜单,选择Save setup as dfl 。保存为默认设置即可。 ***************************************************** 客服记录 ***************************************************** [技术支持] symbol 14:06:24 你好,我买了贵公司的一块GEC2410,在设置NFS启动时出了点问题 symbol 14:07:00 请问在吗? symbol 14:12:27 ?? 广嵌中心suha 14:17:46 你好,是LINUX问题吗 symbol 14:17:54 是的 symbol 14:18:07 我发现BIOS的第六项不起作用 symbol 14:18:22 6 : Set boot params symbol 14:18:50 在nand.c文件第426、427行发现以下注释: //if(boot_params[0]) // linux_params = boot_params; 是不是输入参数功能被屏蔽 广嵌中心suha 14:19:12 你打电话020-32068395-805白工,他负责LINUX symbol 14:19:39 他有在线联系方式吗?我指QQ或MSN? 广嵌中心suha 14:20:10 技术部一般不能聊天的,只能电话或邮件 symbol 14:20:19 哦,谢谢 symbol 14:21:12 再问一个问题,那个GEC2410_BOIS_bin是用什么制作出来的? 广嵌中心suha 14:21:25 ADS symbol 14:21:31 谢谢了 广嵌中心suha 14:21:40 编译出来的二进制文件 广嵌中心suha 14:21:56 有源码的 symbol 14:21:58 是用光盘上的BIOS的源代码是吧? 广嵌中心suha 14:22:07 恩 symbol 14:22:11 发现光盘里没有ads了 symbol 14:22:19 V1.0的倒是有 广嵌中心suha 14:22:20 == 广嵌中心suha 14:22:45 http://www.soft555.com/ads99.zip (ARM ADS 1.2) http://download.chinaunix.net/download/0013000/12362.shtml (LINUX开发工具) http://www.china-pub.com/computers/common/info.asp?id=31204 (LINUX学习书) BXR69-X8BCR-CXWGD-2FDTF-P3RT8 PB注册码 图形转换工具 bmp2h.exe 广嵌中心suha 14:22:58 你保存下,第一个是ADS下载 symbol 14:23:05 嗯 ***************************************************** [白工] 极波 15:53:25 你好。 symbol 15:54:00 我这需要NFS启动,原来的BIOS不行啊 极波 15:54:17 知道,你先等一下,我好打包。 symbol 15:54:23 嗯 极波要给您发送文件“GEC2410_bios_800480.rar(409.1KB)”,接收,另存为 还是 谢绝该文件 您同意了接收文件“GEC2410_bios_800480.rar”,正在建立连接,如果要中止接收文件,请按取消 极波 15:56:27 就是这个包。里面有设置启动参数的说明。 symbol 15:56:48 网络不行,你发我邮箱里吧 symbol 15:56:57 symbol@mail.ustc.edu.cn 极波 15:57:10 好的。 symbol 15:57:33 多谢了,有问题再麻烦你啦 极波 15:57:43 不客气。 symbol 15:59:09 你发的800400是不是为8寸屏做的? symbol 15:59:23 我的是3.5寸的sharp屏 极波 16:00:34 我说过了,在bios里面不能驱动3.5寸的屏。设置启动参数后,操作系统可以支持3.5寸屏。 symbol 16:00:46 哦 symbol 16:00:54 烧写这个的时候不用拔掉核心板上短路帽吧? 极波 16:02:13 直接用USB下载到SDRAM里面,然后,烧写到0分区就可以了。 symbol 16:02:46 这样的啊,我看用户手册里讲是要用并口,JTAG板 symbol 16:03:29 那个是烧NOR才必须是吧? 极波 16:04:46 不用的。BIOS烧过的话,就可以用USB下载了。 文件已经保存到目录:“C:\Documents and Settings\Administrator\桌面”,转存至QQ网络硬盘 symbol 16:05:17 哦,知道了,那就是第一次烧才得那样做 极波 16:05:48 对了。如果,不小心,把BIOS破坏了,也要通过JTAG烧写的。 symbol 16:06:02 多谢指教了,我先试一下 极波 16:06:12 那我就不用发邮件了。 symbol 16:07:33 好 ***************************************************** 第三部分 USB无线网卡驱动的移植 一、交叉编译生成arm版的rt73.ko 1. 下载最新版的RT73无线网卡驱动(在第一部分已完成) 2. 解压内核压缩文件(编译之前的),在内核中创建新文件夹drivers/usb/net/rt73, 将解压出来的文件夹Module下的文件拷贝到刚才新建的rt73文件夹中。 3. 修改内核源代码,加入RT73驱动的配置信息,以使在make menuconfig中能添加RT73驱动的选项 (1)修改drivers/usb/net/Kconfig文件,加入RT73的驱动模块的配置项: gedit drivers/usb/net/Kconfig 添加以下内容: config RT73 tristate "support for rt73 wireless usb device" depends on USB && NET && USB_USBNET (2)修改drivers/usb/net/Makefile, 加入rt73的编译项: gedit drivers/usb/net/Makefile 添加以下内容: obj-$(CONFIG_RT73) += rt73/ 4. 修改RT73的Makefile,设置内核位置和编译选项: 删除以前的module选项,并将arm编译项改成module,这样编译的时候才是for ARM版本的驱动模块; 5. 用make menuconfig界面配置编译选项,装载配置文件 gec2410.cfg,再选上RT73无线网卡编译选项: sudo apt-get install ncurses-dev make menuconfig USB support ---> USB Network adaptors ---> Multi-purpose USB Networking Framework 按“m”显示下拉菜单,在support for rt73 wireless usb device这一项前按“m”选中。 6. 编译内核: make 成功编译后,会在 arch/arm/boot 目录下得到 linux 内核压缩映像 zImage,在drivers/usb/net/rt73目录下生成rt73.ko驱动文件。 7. 将rt73.ko放到文件目录里(例如/usr文件夹里),并重新烧写内核。 二、文件系统中添加无线配置工具 1. 从http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html 下载wireless_tools.28.tar.gz 2. 解压,把Makefile中的CC改成CC=arm-linux-gcc 编译make 3. 把生成的iwconfig iwevent iwgetid iwlist iwspy iwpriv权限设置为777,拷贝到文件系统gec2410/sbin目录下,把libiw.so.28拷贝到文件系统gec2410/lib目录下 三、加载驱动模块 系统启动后,在rt73.ko所在的目录下输入命令: insmod rt73.ko 出现以下错误信息: Using rt73.ko rt73: Unknown symbol release_firmware rt73: Unknown symbol request_firmware rt73: Unknown symbol wireless_send_event insmod: cannot insert `rt73.ko': Unknown symbol in module (-1): No such file or directory 解决办法: 打开配置文件gec2410.cfg,找到“# CONFIG_FW_LOADER is not set” 将其改为:CONFIG_FW_LOADER=y make menuconfig 选中 Networking support ---> Wireless LAN (non-hamradio) ---> Wireless LAN drivers (non-hamradio) & Wireless Extensions 重新编译内核,烧写。。。 启动后加载rt73.ko,显示以下信息: Using rt73.ko rtusb init ====> usbcore: registered new driver rt73 插入USB无线网卡,出现以下信息: usb 1-1: new full speed USB device using address 2 idVendor = 0x7d1, idProduct = 0x3c03 rt73: Failed to request_firmware. Check your firmware file location rt73: probe of 1-1:1.0 failed with error -2 /dev/scsi/host-1/bus0/target0/lun0 同时发现另一个USB口没有支持HOST功能。 为了使开发板支持2个USB HOST,需要对内核进行配置: make menuconfig 选中USB support ---> 2 USB Host Controller On S3C2410 怀疑是无线网卡驱动的问题。 上雷凌官网下载了RT73_Linux_STA_Drv1.0.4.0.tar.gz(下载地址:http://www.ralink.com.tw/data/RT73_Linux_STA_Drv1.0.4.0.tar.gz) tar zxvf RT73_Linux_STA_Drv1.0.4.0.tar.gz cd RT73_Linux_STA_Drv1.0.4.0/Module cp Makefile.6 Makefile gedit Makefile 在“all:”之前加一行:KDIR := /home/infonet/Desktop/gec2410-linux-2.6.8.1 并将 all: make -C /lib/modules/$(shell uname -r)/build SUBDIRS=$(shell pwd) modules 改为: all: # make -C /lib/modules/$(shell uname -r)/build SUBDIRS=$(shell pwd) modules make -C $(KDIR) 'EXTRA_CFLAGS=-DRTMP_EMBEDDED -I.' SUBDIRS=$(shell pwd) modules 保存 然后仿照之前编译rt73驱动的步骤,将整个Module文件夹下的文件复制到gec2410-linux-2.6.8.1/drivers/usb/net/rt73下,然后修改gec2410-linux-2.6.8.1/drivers/usb/net/下的Kconfig与Makefile文件。 ************************************************************************* 总结目前为止需要对内核做的一系列配置如下: (1)修改内核目录下的配置文件gec2410.cfg 将“# CONFIG_FW_LOADER is not set”改为:CONFIG_FW_LOADER=y (2)make menuconfig Load an Alternate Configuration File,装载gec2410.cfg 选中 Networking support ---> Networking options ---> IP: kernel level auloconfiguralion 选中 Networking support ---> Wireless LAN (non-hamradio) ---> Wireless LAN drivers (non-hamradio) & Wireless Extensions 选中 File systems ---> Network File Systems 下的 NFS file system support 和 Root file system on NFS 选中 USB support ---> 2 USB Host Controller On S3C2410 选中 USB support ---> USB Network adaptors ---> Multi-purpose USB Networking Framework 按“m”显示下拉菜单,在 support for rt73 wireless usb device 这一项前按“m”选中。 ************************************************************************* 按照以上所列对内核进行配置后,make,在arch/arm/boot 目录下得到 linux 内核压缩映像 zImage,在drivers/usb/net/rt73目录下生成rt73.ko. 重新烧写内核,并将rt73.ko放到开发板文件目录里。 系统启动后,两个USB都具有HOST功能(注意J9、J10短路帽要插在靠下的两个脚上)。 insmod rt73.ko 显示信息: Using rt73.ko rtusb init ====> usbcore: registered new driver rt73 插入USB无线网卡,显示以下信息: usb 1-1: new full speed USB device using address 2 idVendor = 0x7d1, idProduct = 0x3c03 /dev/scsi/host-1/bus0/target0/lun0 iwconfig显示如下: [root@gec2410 usr]# iwconfig lo no wireless extensions. eth0 no wireless extensions. rausb0 RT73 WLAN ESSID:"" Mode:Auto Frequency=2.412 GHz Bit Rate=54 Mb/s RTS thr:off Fragment thr:off Encryption key:off Link Quality=0/100 Signal level:-121 dBm Noise level:-115 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 四、测试 依次输入以下命令: ifconfig rausb0 10.0.0.1 up iwconfig rausb0 mode ad-hoc freq 2.457G iwconfig rausb0 essid INFONET 注意:不知何故无法设置mode为managed,一输入设置mode为managed的命令,则mode变为Auto,且 ESSID变为""。 鉴于无线网卡在本项目中就要工作在ad-hoc模式下,这个问题就暂不追究了。 在另一台PC机上插上相同型号的无线网卡,设置相同的mode(ad-hoc),essid(INFONET)与freq(2.457G),地址为10.0.0.2 两网卡间可以相互ping通,暂时宣告USB无线网卡驱动移植成功! 第四部分 USB摄像头驱动的移植 一、下载嵌入式驱动补丁 从http://mxhaard.free.fr/spca5le.html下载摄像头驱动针对 embeded环境的 patch:usb-2.6.8.1LE06.patch.tar.gz 将解压后的文件usb-2.6.8.1-2.patch放到gec2410-linux-2.6.8.1/drivers/usb目录下,在终端进入此目录输入以下命令: patch -p1 < usb-2.6.8.1-2.patch 二、配置内核编译驱动模块 make menuconfig 选中 USB support ---> USB SPCA5XX Sunplus/Vimicro/Sonix jpeg Webcamera (“M”) make 就在文件夹drivers/usb/media/spca5xx下生成了spca5xx.ko, 这就是我们要的驱动。 三、加载驱动模块 将生成的spca5xx.ko放到开发板文件系统中(例如/usr文件夹里) 系统启动后,在spca5xx.ko所在的目录下输入命令: insmod spca5xx.ko 显示信息: Using spca5xx.ko usbcore: registered new driver spca5xx drivers/usb/media/spca5xx/spca_core.c: spca5xx driver 00.57.05 registered 插入USB摄像头,显示以下信息: usb 1-2: new full speed USB device using address 2 drivers/usb/media/spca5xx/spca_core.c: USB SPCA5XX camera found. Type Vimicro Zc301P 0x303b /dev/scsi/host-1/bus0/target0/lun0 四、测试 1. 开发板端采集传输程序 http://mxhaard.free.fr/spca50x/embedded/Servfox/ 下载servfox-R1_0_0.tar.gz 解压,修改servfox里的 Makefile文件, 将 SERVFLAGS= -O2 -DLINUX $(WARNINGS) 改为 SERVFLAGS= -O2 -DLINUX $(WARNINGS) -I /home/Desktop/gec2410-linux-2.6.8.1/include (即在原来的基础上加上“-I /home/Desktop/gec2410-linux-2.6.8.1/include”) Make,生成可执行文件servfox,将其拷贝到开发板文件系统的sbin目录下。 2. PC端接收显示程序 http://mxhaard.free.fr/spca50x/Download/ 下载spcaview-20071224.tar.gz 解压,make,即生成可执行文件spcaview。 3. 开发板系统启动后加载摄像头驱动模块spca5xx.ko,插入摄像头,运行以下命令: servfox -d /dev/video0 -s 320x240 -w 192.168.6.226 PC终端进入spcaview所在目录,运行以下命令: ./spcaview -w 192.168.6.229 就可以看到摄像头采集的视频了。 至此可判断摄像头驱动已成功地移植了。 4. 无线网卡、摄像头联合测试 开发板系统启动后加载无线网卡驱动模块rt73.ko,摄像头驱动模块spca5xx.ko,插入无线网卡与摄像头。 配置无线网卡: ifconfig rausb0 10.0.0.1 up iwconfig rausb0 mode ad-hoc freq 2.457G iwconfig rausb0 essid INFONET 在PC机上配置无线网卡: ifconfig wlan0 10.0.0.2 up iwconfig wlan0 mode ad-hoc freq 2.457G iwconfig wlan0 essid INFONET 开发板终端输入以下命令: servfox -d /dev/video0 -s 320x240 -w 10.0.0.2 PC终端输入以下命令: ./spcaview -w 10.0.0.1 就可以看到摄像头采集的视频了。 从而进一步验证USB无线网卡与摄像头驱动均已已成功地向S3C2410平台进行了移植。 !!注意:同时使用两个USB HOST要将J9、J10短路帽插到下两个引脚,不过烧写内核时必须将这两个短路帽插回上两个引脚,否则将无法用USB向开发板传输文件。(因为这个USB DEVICE与USB HOST0 是复用的) 第五部分 AODV-UU 的移植 一、配置内核 make menuconfig 选中 Networking support ---> Networking options ---> Network packet filtering (replaces ipchains) 二、交叉编译 1. make KERNEL_DIR=/home/infonet/Desktop/gec2410-linux-2.6.8.1 arm 报错: /usr/local/arm/3.3.2/lib/libc.so.6: could not read symbols: 无效的操作 collect2: ld returned 1 exit status make: *** [aodvd-arm] 错误 1 解决办法: 修改Makefile,将ARM_CCFLAGS=-mbig-endian这一行注释掉 2. make clean make KERNEL_DIR=/home/infonet/Desktop/gec2410-linux-2.6.8.1 arm 报错: kaodv-mod.c: In function `kaodv_init': kaodv-mod.c:355: error: `EXPORT_NO_SYMBOLS' undeclared (first use in this function) kaodv-mod.c:355: error: (Each undeclared identifier is reported only once kaodv-mod.c:355: error: for each function it appears in.) make[1]: *** [kaodv-mod-arm.o] 错误 1 make[1]: Leaving directory `/home/infonet/Desktop/aodv-uu-0.9.5/lnx' make: *** [kaodv-arm] 错误 2 解决办法: 修改lnx/kaodv-mod.c,找到EXPORT_NO_SYMBOLS这一行注释掉 3. make clean make KERNEL_DIR=/home/infonet/Desktop/gec2410-linux-2.6.8.1 arm 报错: /home/infonet/Desktop/gec2410-linux-2.6.8.1/include/linux/netlink.h:139: error: conflicting types for `netlink_attachskb' /home/infonet/Desktop/gec2410-linux-2.6.8.1/include/linux/netlink.h:132: error: previous declaration of `netlink_attachskb' /home/infonet/Desktop/gec2410-linux-2.6.8.1/include/linux/netlink.h:140: error: conflicting types for `netlink_detachskb' /home/infonet/Desktop/gec2410-linux-2.6.8.1/include/linux/netlink.h:133: error: previous declaration of `netlink_detachskb' /home/infonet/Desktop/gec2410-linux-2.6.8.1/include/linux/netlink.h:141: error: conflicting types for `netlink_sendskb' /home/infonet/Desktop/gec2410-linux-2.6.8.1/include/linux/netlink.h:134: error: previous declaration of `netlink_sendskb' /home/infonet/Desktop/gec2410-linux-2.6.8.1/include/linux/rtnetlink.h:716: error: `NPROTO' undeclared here (not in a function) make[1]: *** [kaodv-debug-arm.o] 错误 1 make[1]: Leaving directory `/home/infonet/Desktop/aodv-uu-0.9.5/lnx' make: *** [kaodv-arm] 错误 2 解决办法: 将gec2410-linux-2.6.8.1/include/linux/netlink.h中重复定义的5个函数删除。 注:这5个函数如下 struct sock *netlink_getsockbypid(struct sock *ssk, u32 pid); struct sock *netlink_getsockbyfilp(struct file *filp); int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, long timeo); void netlink_detachskb(struct sock *sk, struct sk_buff *skb); int netlink_sendskb(struct sock *sk, struct sk_buff *skb, int protocol); 在gec2410-linux-2.6.8.1/include/linux/rtnetlink.h的宏定义处加一行:#define NPROTO 32 4. make clean make KERNEL_DIR=/home/infonet/Desktop/gec2410-linux-2.6.8.1 arm 报错: kaodv-netlink.c: In function `kaodv_netlink_rcv_sk': kaodv-netlink.c:324: error: structure has no member named `receive_queue' kaodv-netlink.c:331: error: structure has no member named `receive_queue' kaodv-netlink.c: In function `kaodv_netlink_fini': kaodv-netlink.c:356: error: structure has no member named `socket' make[1]: *** [kaodv-netlink-arm.o] 错误 1 make[1]: Leaving directory `/home/infonet/Desktop/aodv-uu-0.9.5/lnx' make: *** [kaodv-arm] 错误 2 解决办法: 将lnx/kaodv-netlink.c中的一下内容注释掉: #ifndef KERNEL26 #define sk_receive_queue receive_queue #define sk_socket socket #endif 5. make clean make KERNEL_DIR=/home/infonet/Desktop/gec2410-linux-2.6.8.1 arm 报错: kaodv-arm.o: could not read symbols: File in wrong format collect2: ld 返回 1 make[1]: *** [kaodv-arm] 错误 1 make[1]: Leaving directory `/home/infonet/Desktop/aodv-uu-0.9.5/lnx' make: *** [kaodv-arm] 错误 2 解决办法: 修改Makefile, 将“$(MAKE) -C $(AODVDIR)/lnx KERNEL_DIR=$(KERNEL_DIR) KCC=$(ARM_CC) LD=$(ARM_LD) XDEFS=$(XDEFS) kaodv-arm” 改为: $(MAKE) -C $(AODVDIR)/lnx KERNEL_DIR=$(KERNEL_DIR) KCC=$(ARM_CC) LD=$(ARM_LD) XDEFS=$(XDEFS) 6. make clean make KERNEL_DIR=/home/infonet/Desktop/gec2410-linux-2.6.8.1 arm 生成所需的arm版的aodvd和kaodv.ko 三、加载模块 开发板系统启动后,insmod kaodv.ko,没问题。 加载无线网卡驱动rt73.ko,配置无线网卡,然后运行aodvd -l -r 3,显式以下信息: [root@(none) usr]# aodvd -l -r 3 19:07:04.345 host_init: Attaching to rausb0, override with -i . Using kaodv.ko 19:07:04.556 aodv_socket_init: RAW send socket buffer size set to 215040 19:07:04.559 aodv_socket_init: Receive buffer size set to 215040 19:07:04.561 main: In wait on reboot for 15000 milliseconds. Disable with "-D". 19:07:04.563 hello_start: Starting to send HELLOs! 19:07:19.570 wait_on_reboot_timeout: Wait on reboot over!! 19:07:20.652 rt_table_insert: Inserting 10.0.0.2 (bucket 10) next hop 10.0.0.2 19:07:20.653 nl_send_add_route_msg: ADD/UPDATE: 10.0.0.2:10.0.0.2 ifindex=3 19:07:20.655 rt_table_insert: New timer for 10.0.0.2, life=2100 19:07:20.655 hello_process: 10.0.0.2 new NEIGHBOR! 19:07:41.660 cleanup: CLEANING UP! 19:07:41.661 nl_send_del_route_msg: Send DEL_ROUTE to kernel: 10.0.0.2 发现同时也在运行aodvd的另一台PC机上的无线网卡(10.0.0.2),初步判定移植成功。 不过这时系统出现一个奇怪的问题,按ctrl+c无响应,出现死机症状。 再次实验之前所进行的摄像头视频传输,当开发板这端按ctrl+c时,PC接收端仍有视频,可见程序还在运行,也就是说ctrl+c这个命令没有被开发板的系统所接受。 解决办法: 系统启动后先按ctrl+c退出控制台,显示: Please press Enter to activate this console. 然后按回车重新进入,就一切正常了。 调查原因是由于QT和内核的冲突造成的,进系统时没有激活控制台。 四、测试 1. 开发板作为中间结点 网络拓扑结构:(主机 1 与主机 3 不在对方的无线覆盖范围内,需经主机 2 中转) 2(笔记本)――――――1(开发板)―――――――3(笔记本) (1)配置无线网卡 主机 1(开发板): # insmod rt73.ko # ifconfig wlan0 10.0.0.1 up # iwconfig wlan0 mode ad-hoc freq 2.457G # iwconfig wlan0 essid INFONET 主机 2(笔记本): # ifconfig rausb0 10.0.0.2 up # iwconfig rausb0 mode ad-hoc freq 2.457G # iwconfig rausb0 essid INFONET 主机 3(笔记本): # ifconfig wlan0 10.0.0.3 up # iwconfig wlan0 mode ad-hoc freq 2.457G # iwconfig wlan0 essid INFONET (2) 运行aodvd-uu 三台主机都运行aodvd: # aodvd -l -r 3 在主机1处: # ping -R 10.0.0.3 显式如下: (3)多跳传输摄像头视频 主机 2(笔记本): # vlc -vvv --color v4l:/dev/video0:norm=secam:frequency=543250:size=320x240:channel=0:adev=/dev/dsp:audio=0 --sout '#transcode{vcodec=mp4v,acodec=mpga,vb=3000,ab=256,venc=ffmpeg{keyint=80,hurry-up,vt=800000},deinterlace}:std{access=udp,mux=ts,dst=10.0.0.3}' --ttl 12 主机 3(笔记本): # vlc udp:10.0.0.1 2. 开发板作为视频采集结点 网络拓扑结构:(主机 1 与主机 3 不在对方的无线覆盖范围内,需经主机 2 中转) 1(开发板)――――――2(笔记本)―――――――3(笔记本) (1)配置无线网卡与静态路由 同上 (2)运行aodvd-uu 开发板由于只有一个终端,不能像PC机那样另开一个终端,所以在通信时要使aodvd在后台执行,命令如下: aodvd -l -r 3 >/tmp/record 2>&1 & (3)多跳传输摄像头视频 主机 1(开发板): # servfox -d /dev/video0 -s 320x240 -w 10.0.0.3 主机 3(笔记本): # ./spcaview -w 10.0.0.1 五、开机自动装载模块,运行程序 修改开发板文件系统中的linuxrc文件,添加以下内容: /bin/insmod /usr/spca5xx.ko /bin/insmod /usr/rt73.ko /bin/insmod /usr/kaodv.ko 修改usr/etc/rc.local文件,添加以下内容: /bin/ifconfig rausb0 10.0.0.3 up /sbin/iwconfig rausb0 mode ad-hoc freq 2.457G /sbin/iwconfig rausb0 essid INFONET /sbin/aodvd -l -r 3 --daemon /sbin/servfox -d /dev/video0 -s 320x240 -w 10.0.0.10 并将source /.bashrc后的内容都注释掉