基于ARM的某智能弹药无线通信模块的设计
2012-06-23罗金选
罗金选 袁 著 张 益
(电子科技大学 成都 611731)
1 引言
嵌入式系统的构架从下到上,一般分为硬件、bootloader程序,嵌入式linux设备驱动程序、嵌入式linux内核、linux系统调用接口、根文件系统、应用程序,其本质上依然是计算机系统,但相对于传统通用的PC机来说,是软硬件可以自由裁剪,在功能、可靠性、成本、体积、能耗方面有更加严格要求的专用计算机系统。为了适应某弹药项目中各个节点在高速飞行的情况下,硬件上必须轻捷稳定,软件上必须完全支持该模块利用某复杂协议进行可靠通信和无线音视频数据传输的要求,自主设计了以S3C2440 ARM为主控制器,以linux2.6为操作系统的嵌入式无线通信模块,以下是该模块从下到上设计过程中每个步骤的调试情况和最终测试结果。
2 硬件设计
该无线通信模块的硬件框架主要包括一个S3C2440 ARM主控制器、两片32M的SDRAM组成的64M内存、一片2M的 NorFlash,一片512M的NandFlash,以及一个晶振、一个电源模块、一个HJtag调试接口及一个用于选择启动方式的开关,也即一个ARM嵌入式系统可以运行的最基本条件。另外还包括一些外围电路,主要有:4个USB接口,其中一个充当从设备的接口,用于在bootloader的引导下从宿主机下载内核和文件系统,另外三个充当主设备接口,用于连接USB外部设备;3个TTL电平的9孔串口通过电平转换之后分别连接着一个无线数据传输模块和一个GPS模块,还有一个用于在调试的时候和宿主机通信;一个以太网接口用于在调式阶段从宿主机上通过NFS协议挂载文件系统,和在研发阶段利用TFTP或者NFS协议从宿主机上下载内核和文件系统;一个图像采集模块用于采集实时图像,一个带触摸屏的LCD用于显示采集过来的图像和操作界面,一个VGA转接板接口可以用于接PC机显示屏,一个音频接口用于声音采集,一个蜂鸣器用于调试发声。无线通信模块的总体框架如图1所示,实物如图2所示。
3 bootloader移植
嵌入式产品在研发阶段,bootloader除 了要引导操作系统之外,还有一个重要的原因就是必须在bootloader的引导下才能将linux内核和文件系统从宿主机下载到目标机的内存,然后再由bootloader将linux内核和文件系统从内存复制到Flash(相当于PC机的硬盘)中永久保存,在下一次系统启动的时候又要由它将Flash中的linux内核读到RAM中去执行,因此没有bootloader的存在,就无法进行后面的工作,linux内核也就永远没办法启动起来,它的作用就像PC机中的BIOS,简单的说,bootloader就是系统复位之后在操作系统内核运行之前运行的一小段程序,通过这一小段程序,初始化硬件设备,建立内存空间的映射图,将系统的软硬件环境带到一个合适的状态,最终引导操作系统。目前比较流行的bootloader主要有德国DENX软件工程中心开发的U-boot和韩国三星公司开发的VIVI。而U-boot是一个比较统通用的bootloader,支持很多不同体系架构的处理器,如:ARM,POWERPC,X86,MIPS,XSale等,它的启动过程通常分两个阶段,总体启动流程图如图3所示。
图3 U-boot启动流程图
移植第一阶段代码的主要根据是ARM的最小系统即根据CPU的体系结构和SDRAM,FLASH芯片的型号不同来设置,属于芯片级移植,主要是修cpu/arm920t/start.S文件,用汇编语言编写,具体所做的事情主要有:设置CPU进入svc模式,关闭看门狗,屏蔽所有中断,设置CPU的速度,时钟频率,关闭MMU和cache,初始化SDRAM控制器,设置堆栈,清空bss数据段,至此:整个系统SDRAM存储空间映射情况如图4所示,已经为第二阶段准备好一些基本的硬件环境,然后初始化Flash控制器,再从Flash中拷贝第二阶段代码到RAM空间。
图4 U-boot内存空间映射图
第二阶段属于板级移植,电路板不同,代码就不同,当U-boot的 start.S运行到"-start-armboot:.word start-armboot"时,就会调用 lib-arm/board.c中的start-armboot函数,至此U-boot进入第二阶段,这一阶段的代码主要是建立起和宿主机的通信,并从宿主机上将linux内核和文件系统下载到目标机上,具体要做的事情主要有开发板的相关配置:时钟初始化,环境变量初始化,串口控制台初始化,配置可用的RAM,NorFlash初始化,NandFlash再次初始化,网卡初始化等,usb等功能的实现。初始化完成后就可以建立起和宿主机之间的通信,然后将linux内核文件系统下载到目标机上,并写入Flash中永久保存。从宿主机下载内核和文件系统可以采用tftp或者nfs协议下载,也可以通过USB接口下载。以下是实现tftp和nfs协议的U-boot成功运行之后的的启动界面,如图5所示。
图5 U-boot的启动界面
4 linux内核移植和根文件系统制作
linux2.6操作系统几乎支持市面上所有的嵌入式处理器,具有很好的可移植性,但是从官方网站下载的linux内核是不能在即定的硬件平台上运行的,必须根据CPU的体系结构,和电路板的设计对linux内核内与硬件相关的一部分代码做相应的修改,然后利用已经搭建好的交叉编译环境编译新的Linux内核,再下载到板子上运行。Linux内核移植步骤如下:
第一步:进入内核根目录修改Makefile文件为
第四步:修改NandFlash分区,这里只创建四个分区,四个分区空间分配结构如图6所示。
图6 NandFlash空间分配结果图
第五步:执行make menuconfig命令配置内核,linux的配置界面如图7所示,配置完成之后,执行make zImage命令编译内核得到内核镜像文件。要配置的选项主要有Sysytem Type--->
接下来需要制作根文件系统,yaffs2文件系统是根据NandFlash的存取特点,将文件组织成固定大小的数据段,对文件系统上所有的内容都统一当作文件来处理,每个文件都有一个页面专门存放文件头,所以yaffs2文件系统是专门为嵌入式Nand-Flash而设计的一种日志型文件系统,适用于大容量的存储设备,因不支持数据压缩功能,所以速度快,挂载时间短,对内存占用少,同时yaffs2自带NAND芯片驱动,提供嵌入式系统直接访问文件系统的API,这样用户既可以使用linux中的MTD与VFS访问文件系统,也可以直接对文件系统操作,yaffs2文件系统的制作过程如下:
第一步:先使用命令#./patch-ker.sh c/home/my2440/linux2.6/为内核打上yaffs2补丁。
第二步:配置内核,使其支持yaffs2文件系统,配置完成之后重新编译内核,配置界面如图7所示。
图7 linux支持yaffs2的配置界面
第三步:首先在busybox根目录下修改Makefile文件如下:
CROSS-COMPILE=arm-linux
ARCH=arm,然后配置编译busybox生成文件系统所需要的应用程序。
第四步:新建一个 root-2.6目录,把编译busybox生成的应用程序的可执行文件复制到该目录下,然后用mkdir命令创建文件系统所需要的目录:mkdir dev etc home lib mnt opt proc tmp var www,并制作好相关的配置文件。
第五步:用mkyaffs2image-128工具制作好根文件系统的镜像得到 root-2.6.img文件:makyaffs2image root-2.6/root-2.6.img。图8是下载文件系统和内核镜像到板子上linux成功挂载文件系统成功启动之后的界面。
图8 linux内核成功启动之后的界面
5 嵌入式linux设备驱动移植和开发
到此为止,硬件平台可以运行起来了,但是各种外设因为还没有驱动的支持还不能使用。接下来就是为各个外部设备的制做好驱动程序(见图7),屏蔽底层硬件细节,为上层应程序提供所有操作底层硬件设备的接口函数,使得原来在通用PC机上开发的应用程序不需要做实质性的修改就可以移植该平台上来,在通信模块的开发过程中涉及了嵌入式linux仅有的三大设备驱动,但从linux2.6开始引入了platform虚拟总线机制,使得这三大完全不同类型的设备驱动都可以使用platform进行统一管理和注册,platform机制和传统设备驱动开发机制相比,一个明显的优势在于将设备和驱动分开管理,提高了驱动和资源的独立性,因而增强了设备驱动程序的可移植性和安全性。Platfrom机制本身并不复杂,由两部分组成:platform-device和platform-driver。用platform开发底层驱动的大致流程为:定义platform-device->注册platform-device->定义platform-driver- > 注册platform-driver。
下面以platform按键驱动为例说明平台上设备驱动开发的整个过程:
第一步:定义和注册按键设备,在 arch/arm/plat-s3c24xx/devs.c中添加按键驱动平台设备的定义:
};中所有接口函数,然后在static int my-keysprobe(struct platform-device*dev)函数中用register-chrdev()函数注册keys-ops结构体;编写platform驱动struct platform-driver my-buttons-drv={
第三步:在下面注册或者下载 platform设备驱动
图9 驱动编译进内核界面
6 结束语
当硬件平台,bootloader,linux内核和驱动都做好之后,那么一个集软硬件于一身的完整的嵌入式系统平台就基本搭建起来了,使用arm-linux-gcc重新编译某协议程序,并下载到该模块中,运行结果见图10。
图10 某通信协议运行结果
项目验收的结果表明利用该通信模块进行无线通信,相对先前以通用CPU为主控制器和商用linux为操作系统的软硬件平台来说,功能一摸一样,但硬件集成化程度有了很大的提高,体积和重量大大减小,成本大幅度降低,开发周期缩短,调试时间充足,出错机会减少,因而更安全可靠,更符合安装在飞行器上的要求。
[1]周立功等.ARM嵌入式系统基础教程(二)[M].北京.北京航空航天大学出版社,2005.
[2]周立功.ARM嵌入式系统实验教程(二)[M].北京:北京航空航天大学出版社,2005.
[3] 陈莉君,冯锐,牛欣源译.孙玉芳审.BOVET D P.,MARCOCESAT.深入理解linux内核(第二版)[M].北京:中国电力出版社,2004.
[4]俞永昌.linux设备驱动开发技术及应用[M].北京:人民邮电出版社,2008.