摘要:本文探讨了基于ST2410开发板的嵌入式网络开发平台的构建方法,详细的研究了u_boot 的移植、TFTP和NFS服务器的配置和在嵌入式开发中的应用。 关键词:Linux;ST2410;NFS;TFTP;u_boot
1. ST2410 开发板介绍
ST2410是深圳优龙公司开发的基于S3C2410的arm9开发板。而S3C2410 是三星公司生产的基于ARM920T内核的RISC 微处理器。主频可达203MHz ,S3C2410 的主要特性包括:
16K字节指令Caches 和16K数据Caches ; 8 个10 位ADC; 外部存储器控制器(SDRAM 控制和片选逻辑) ; LCD 控制器(支持64K color TFT 和4Kcolor STN) , Touch panel 控制器; 4 个DMA 通道; 3个UART ; 2 个串行外围电路接口SPI ; IIC - Bus接口; SD 卡接口; 2 个USB 接口; 4 个PWM 定时器&1 个内部定时器; 看门狗; 多达55 个中断源的中断控制器; 4 种电源控制模式: 正常、缓慢、空闲和关闭模式; 8 个10 - bit ADC 通道和触摸屏接口; 具有日历功能的RTC; 片内PLL 倍频时钟产生器。
由上述可知S3C2410内部结构复杂、功能强大,因此能很方便地在片外添加外部设备来实现这些功能。ST2410就是实现s3c2410强大功能地平台,在ST2410上我们可以对S3C2410进行系统级地硬件、软件设计,并且能够很方便地在该平台上进行相关的功能扩展,进行所需的产品设计。ST2410的具体结构如图1所示。

图1 ST2410开发结构图
2. ST2410网络开发系统的结构
2.1 网络开发平台的目标
本系统我们选择u_boot作为bootloader。在系统的开发阶段,利用u_boot的网络接口tftp,bootp,bootm下载启动在宿主机上的linux内核并挂载nfs根文件系统。这样就不需把每次修改后的内核和文件系统烧到flash中,方便了系统的调试。
2.2 硬件平台的构成
基于ARM9内核S3C2410的开发板ST2410外扩CS8900A网络芯片完成网络底层的数据传输。
CS8900A的主要性能:符合ETHERNET II与IEEE802.3标准;集成有MAC和PHY两部分,全双工,10M/100M自适应;内置4KB的SRAM用于收发缓冲,降低对主处理器的速度要求。总体结构框图如图2所示。

2.3 软件平台的构成
为实现ST2410网络开发平台,软件开发可分为3部分:u_boot的移植,tftp服务器的设置,nfs服务器的设置。软件总体结构如图3所示。

3. ST2410网络开发平台的实现
3.1 U_boot介绍和移植
U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
U_boot可支持的主要特点为:
从tftp或者FLASH中引导压缩或非压缩系统内核;支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤对Linux支持最为强劲;支持目标板环境参数多种存储方式,如FLASH、SDRAM、EEPROM;CRC32校验,可校验FLASH中内核、RAMDISK镜像文件是否完好; 串口、SDRAM、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持; SDRAM、FLASH大小自动检测;SDRAM故障检测;CPU型号; 将u_boot移植到优龙公司的ST2410只需按照README参考SMDK2410,做下面三步就行:
1) 在/include/configs中加入st2410.h,这里定义了一些ST2410开发板的配置信息。
2) 在/board里加入ST2410文件夹,里面包括config、flash.c、Makefile、memsetup.S、ST2410.C、u-boot五个文件。
3) 修改Makefile和MAKEALL文件,加入st2410编译项。
然后make st2410_config;make 就行,将产生的u_boot.bin烧入SST39VF160,重启arm就可在终端看到u_boot启动输出信息。
3.2 服务器的设置
在嵌入式系统的开发过程中,通常要建立交叉编译环境。基于网络的调试一般应将宿主机和用户板接入到网络中,下面以Linux+ST2410的开发环境为例进行说明。通常的做法是在宿主机上安装RedHat Linux操作系统,并同时安装u_boot开发的工具链eldk。这样,在宿主机上编辑和编译好的内核、根文件系统和用户程序,就可以通过网络下载到SDRAM中执行。下载方式有两种:
TFTP方式
宿主机上TFTP的安装和配置:先用如下命令查看tftp软件包是否安装:rpm –qa|grep tftp,若装有则可看到tftp-server-0.17-9这是服务器端的TFTP软件,若还看到tftp-0.17-9则用rpm –e tftp-0.17-9删除,因为这是TFTP客户端软件。然后修改TFTP的配置文件/etc/xinet.d/tftp,只需将“disable=no”注释掉即可。
接下来将u-boot自带的演示程序hello_world.bin考到tftp的下载目录/tftpboot下,启动ST2410在控制终端输入tftp 31000000 hello_world.bin
下载完后再输入go 31000000 This is a test 这时在linux的kermit里可看到:
## Starting application at 0x00040004 ...
Hello World
argc = 5
argv[0] = "31000000"
argv[1] = "This"
argv[2] = "is"
argv[3] = "a"
argv[4] = "test."
argv[5] = ""
Hit any key to exit ...
## Application terminated, rc = 0x0
这说明tftp方式下载成功,程序正常执行!
NFS方式
使用NFS(NetWork File System)方式可以使嵌入式系统的开发和调试更为方便,并可在不同的操作系统间共享文件,因此NFS在嵌入式开发中得到了广泛的应用。这时必须配置nfs服务器和重新编译内核。
1)宿主机服务器端(server)的设置
a) 到保存网络脚本的目录。RedHat系统中,这个目录是/etc/rc.d/init.d。
b) 输入./portmap status 并按回车键。随后会看到一条消息,指出portmap正在运行。否则,输入./portmap start 并按下回车键。
c) 现在输入./nfs status 并按下回车键。随后会看到一条消息,指出rpc.mounted和nfsd正在运行。否则,输入./nfs start 并按下回车键。
d) 设置导出。用编辑器打开/etc/exports。在一个空白行上输入导出的目录名称,后面加一个空格和要使用这个目录的客户机的IP地址。在IP地址后面括号中,输入要设置的导出选项。针对本系统,输入 /home/rootfile 192.168.2.223(rw)。
e) 为使/etc/exports 和导出目录数据库/var/lib/nfs/xtab同时工作,输入
exportfs –rv,并按回车键。
经过这些步骤后,宿主机就可让网络上的目标机使用/home/rootfile目录。
2)编译linux内核
为使内核支持nfs作根文件系统启动,必须重新编译内核,加入一些选项。
a) make mrproper 删除上次编译内核产生的目标文件
b) make menuconfig
把下列选项编译进内核
Networking options ->
[*] IP:kernel level autoconfiguration
[*] IP:DHCP support
[*] IP:BOOTP support
[*] IP:RARP support
File systems ->
Network File systems ->
<*> NFS file system support
[*] provide NFSV3 client support
[*] root file system on NFS
c) make zImage
然后就产生了zImage和vmlinux的内核镜像文件。
3)将vmlinux转换为uImage
u_boot启动内核支持uImage格式而不支持zIamge格式,因此必须准备uImage文件。uImage的头部定义了一些内核镜像的特性:目标操作系统类型,目标CPU体系结构,内核的压缩格式,下载地址,入口地址,镜像名称。利用u_boot提供的工具mkimage按如下步骤生成uImage。
a) 将elf格式的vmlinux转换成纯二进制镜像文件。
arm-linux-objcopy –O binary –R.note –R.comment –S vmlinux linux.bin
b) 压缩linux.bin
gzip –9 linux.bin
c) 转换linux.bin.gz为uImage:
mkImage –A arm –O linux –T kernel –C gzip –a 31000000 –e 30008000\
-n “linux Kernel Image” –d linux.bin.gz uImage
将uImage拷贝到/tftpboot目录下,这时可以重新启动ST2410,从tftp下载内核uImage到SDRAM,启动中通过NFS挂载根文件系统。在kermit里依次输入下列命令:
1) 设置引导参数
set bootarg root=/dev/nfs rw nfsroot=192.168.2.30:/home/rootfile\
ip=192.168.2.223:192.168.2.30::255.255.255.0 console=ttyS0
这里192.198.2.30是nfs服务器的ip地址,/home/rootfile是arm要挂载的根文件系统,192.168.2.223是arm的ip地址。
2) 下载内核
tftp 31000000 uImage
3) 启动内核
bootm 31000000
这时可看到内核启动的信息,并正确挂载了根文件系统。
4. 结语
采用tftp+NFS开发方式,可以提高开发效率。毕竟,用户开发的程序往往不能一次就调试成功,采用这次方法可以满足系统不断的升级和修改而不需一次一次的烧写flash,而只需通过tftp下载内核和nfs挂载根文件系统。
按上述方案搭建的网络平台目前应用于我们的项目,为后续开发,特别是驱动程序的开发奠定了良好的基础。
参考文献
1、 杨军. Linux无盘工作战与终端网络标准教程.人民邮电出版社.2002.9无忧电子开发网
2、 邹思铁.嵌入式Linux设计与应用.技术文章 清华大学出版社.2002.4
3、 The DENX U−Boot and Linux Guide (DULG) for PM520.2005.3
|