基于PowerPC处理器MPC8541E的嵌入式Linux系统开发.pdf
http:/ -1-基于基于 PowerPC 处理器处理器 MPC8541E 的嵌入式的嵌入式 Linux 系统开发系统开发 方先康 北京邮电大学计算机科学与技术学院,北京(100876)E-mail: 摘摘 要:要:介绍了嵌入式 PowerPC 处理器芯片 MPC8541E 的主要特征。着重阐述了如何在PowerPC 处理器(以 MPC8541E 为例)上开发嵌入式 Linux 系统,主要包括编译环境开发、目标系统配置、调试环境建立、系统引导模块 U-BOOT 修改、内核裁减与移植以及文件系统分类等。Linux 系统对于 PowerPC 处理器具有良好的支持性能。基于 PowerPC 处理器的嵌入式 Linux 系统提供了一个小体积、低功耗、具有丰富接口的开发平台,为软件的应用开发打下了坚实基础。关键词:关键词:PowerPC 处理器;MPC8541E;嵌入式系统;linux;U-Boot 中图分类号:中图分类号:TP393.01 1.引言引言 在网络和服务器方面,对于I/O的处理能力有很高的要求,如高端安全gateway/VPN/IPSec等,然而随着业务的增多,使得处理量超过服务器所能承受的范围,因此需要性能高,功耗低的产品来更新换代。因此我们为一款网络安全产品开发了系统平台,其核心采用 Freescale 公司的嵌入式 PowerPC 处理器 MPC8541E,软件方面采用嵌入式 linux 作为操作系统,实现了快速通信与高吞吐率的数据处理。这个系统平台具有体积小、功耗低、性能高等特点。本文内容是主要基于 U-boot 引导装载程序和 Linux 操作系统,针对编译环境开发、目标系统配置、调试环境建立、系统引导模块 U-BOOT 修改、内核裁减与移植以及文件系统建立等问题提出解决办法。2.MPC8541E 构架与系统硬件平台简介构架与系统硬件平台简介 MPC8541E 处理器是飞思卡尔半导体(Freescale semiconductor)推出了一款以其高效能e500 PowerPC 系统化芯片(SoC)平台为基础且具有整合式安全引擎与双 on-chip PCI 接口的PowerQUICC III通讯处理器。MPC8541E拥有一个64-bit 333MHz DDR SDRAM内存控制器、双 Gigabit Ethernet 控制器、双 10/100 Fast Ethernet 控制器、一个四信道 DMA 控制器、双异步收发器(DUART)、一个逻辑总线控制器、两个 I2C 控制器及一个 SPI。MPC8541E 也包含了可设为一个 64 位 PCI 或两个 32 位 PCI 的控制器。系统硬件平台选用了主频为 833M 的MPC8541E,提供了 32M 的 data flash 用于存放内核镜像文件、文件系统、应用程序和备份数据,256M DDR333 SDRAM 用作内存,512 KB 的 bootrom flash 用于存放启动代码,此外还有 JTAG 支持等。因为实际需要,我们的系统利用 Intel 82546 网络芯片扩展出两个千兆网口,并提供了另外一个 32 位 PCI 插槽。此解决方案的指导思想就是既做到高性能,又做到经济有效,同时具备良好的扩展性。3.基于基于 MPC8541E 的嵌入式的嵌入式 linux 系统开发系统开发 3.1 编译环境的建立编译环境的建立 通常主机与目标板的 CPU 都不相同,需要进行交叉编译。在本项目中使用了 GNU GCC 工具链。GNU GCC 的 PowerPC 版本需要交叉编译,所有源代码可以从 FSF 的 FTP 站点http:/ -2-ftp:/ftp.gun.org/gnu/或它的镜像去下载。整个建立过程如下:1.下载源文件、补丁和建立编译的目录 2.建立内核头文件 3.建立二进制工具(binutils)4.建立初始编译器(bootstrap gcc)5.建立 c 库(glibc)6.建立全套编译器(full gcc)完成之后,为便于管理,我放置于/opt/powerpc-linux-gnu 目录下,如果存在多种的交叉编译环境,为避免频繁切换交叉编译变量,建议建立 powerpc 的专用开发用户,我使用 ppc作为用户名,并且建立修改开发用户主目录下的.bashrc vim home/ppc/.bashrc 添加如下内容:export ARCH=ppc export PATH=/opt/powerpc-linux-gnu/bin:$PATH export CROSS_COMPILE=powerpc-linux-gnu-3.2 调试环境的建立调试环境的建立 在嵌入式系统中,一般没有显示器等输出设备,而且由于目标板资源有限,不容易在目标系统上进行直接调试,所以一般都需要采用交叉编译远程调试的方法,保证调试顺利进行。在最初的调试阶段(调试 cache,MMU,TLB,DRAM 等),可以使用 USB TAP 仿真器进行调试,直至串口调通,能打印出信息。此时依靠串口打印信息可以代替仿真器的大部分工作。在调试完 U-boot 的网口驱动之后,可以进行 kernel 与 ramdisk 文件的下载,对 linux 系统进行调试。调试环境基本结构框图如下:图 1 调试环境基本结构框图 http:/ -3-3.3 目标系统资源分配目标系统资源分配 对于系统平台来说,建立良好的内存映射表是系统成功运行的基本保证。具体内存资源映射情况见下表:表 1 内存空间映射表 片选 存储控制器 内存范围 LCS0 GPCM 0 xFFF80000-0 xFFFFFFFF LCS1 GPCM 0 xFC000000-0 xFDFFFFFF 内部 PCI1 memory space 0 x80000000-0 x9FFFFFFF 内部 PCI2 memory space 0 xC0000000-0 xDFFFFFFF 内部 CCSBR 0 xE0000000-0 xE00FFFFF 内部 PCI I/O space 0 xE2000000-0 xE2FFFFFF 3.4 引导引导 Linux 系统的系统的 bootloader(U-Boot)3.4.1 U-boot U-BOOT 是 DENX 软件中心依照 GPL(General Public License)发布的系统引导模块,支持多种处理器,如 ARM 系列、PowerPC 系列、MIPS 系列、X86 系列等。根据自己的目标系统修改编辑 U-BOOT 包下的源文件,进行移植,最后编译 U-BOOT 后生成二进制文件,用于引导系统。U-boot 的源文件可从 u-boot 官方网站http:/ 获得。由于 U-boot 提供了很好的结构框架,故我们选择了 CPU 和板上资源与我们最为相似的 MPC8555CDS 板的支持包,在此基础上进行开发。3.4.2 新建项目文件新建项目文件 新建我们的项目文件,步骤如下:1.选择 CPU 和板上资源与我们最为相似的 MPC8555CDS 板,复制 MPC8555CDS 的源文件夹,重命名为 Sec8541;2.编辑 Makefile,添加 Sec8541_config:unconfig ./mkconfig$(:_config=)ppc mpc85xx Sec8541 3.#cd u-boot#make Sec8541_config#make 如能正确编译生成 U-boot,则准备下一步开发 3.4.3 移植移植 U-boot 这里是最重要的步骤,就是根据硬件的情况来修改相关的参数。如果对主板的硬件情况不是很了解,则需要耐心地看硬件资料和原理图,主要修改的地方有:include/configs/sec8541.h http:/ -4-由于处于开发调试阶段,我们需要使用 tsec 通过网络下载镜像文件,根据布线情况,需要修改:#define TSEC1_PHY_ADDR 8#define TSEC2_PHY_ADDR 9 配置 Flash 基址信息:#define CFG_FLASH_BASE 0 xfff80000 /*Bootrom 512 KB*/#define CFG_FLASH2_BASE 0 xfc000000 配置 DDR 控制器信息:#define CFG_BR0_PRELIM 0 xfff80801#define CFG_BR1_PRELIM 0 xfc001001#define CFG_OR0_PRELIM 0 xfff86ec1#define CFG_OR1_PRELIM 0 xfe006e61 还有其它配置:#define CONFIG_BOOTCOMMAND CONFIG_RAMBOOTCOMMAND#define CONFIG_BAUDRATE 115200#define CONFIG_IPADDR 10.50.10.90#define CONFIG_HOSTNAME unknown#define CONFIG_ROOTPATH /nfsroot#define CONFIG_BOOTFILE uImage#define CONFIG_SERVERIP 10.50.10.91#define CONFIG_GATEWAYIP 10.50.10.91#define CONFIG_NETMASK 255.255.255.0#define CONFIG_RAMBOOTCOMMAND setenv bootargs root=/dev/ram rw console=$consoledev,$baudrate$othbootargs;tftp$ramdiskaddr$ramdiskfile;tftp$loadaddr$bootfile;bootm$loadaddr$ramdiskaddr Board/sec8541/flash.c flash 驱动程序的编写完全依赖于 Spansion S29GL256N 的数据手册,数据手册重要部分如下所示:http:/ -5-图 2 flash 命令字操作流程图 因此实现代码如下:flash_print_info 函数(打印 Device ID、Vendor ID):193 case 0 x00010000:printf(Spansion);break;213 case 0 x0000227e:printf(Spansion S29GL256Nn);最重要的 write_word 函数实现:base=(volatile unsigned short*)(info-start0);/*Disable interrupts which might cause a timeout here*/flag=disable_interrupts();base0 x0555=(unsigned short)0 x00AA00AA;/*unlock*/asm(sync);base0 x02AA=(unsigned short)0 x00550055;/*unlock*/asm(sync);base0 x0555=(unsigned short)0 x00A000A0;/*selects program mode*/asm(sync);*dest=data;添加更新命令,方便软件开发人员更新维护:修改 common/cmd_flash.c http:/ -6-添加 int do_update(cmd_tbl_t*cmdtp,int flag,int argc,char*argv)if(argc!=2)printf(Usage:update kernel or update ramdiskn);return 1;if(*argv1=k)run_command(tftp 1000000 uImage,0);run_command(erase fc200000 fc3fffff,0);run_command(cp.b 1000000 fc200000 200000,0);else if(*argv1=r)run_command(tftp 1200000 ramdisk,0);run_command(erase fc400000 fd7fffff,0);run_command(cp.b 1200000 fc400000 1400000,0);else printf(input error!n);return 0;U_BOOT_CMD(update,CFG_MAXARGS,1,do_update,update -update kernel or ramdisk to flashn,args.n -update kernel or update ramdisk n );至此,编译 U-boot,使用 u-boot.bin 文件烧写 bootrom,上电后应能正常启动,使用网络命令与 Flash 相关命令应能正确执行。3.5 操作系统操作系统(Linux 2.6.11)的移植的移植 Embedded Linux 来自http:/,解压源代码,可以发现其内核版本为2.6.11。3.5.1 准备编译准备编译 cd linux-2.6.11 make mrproper 3.5.2 配置内核文件配置内核文件 由于是在命令行方式下进行编译,故使用#make menuconfig 来配置.config 文件。http:/ -7-3.5.3 编译内核部分编译内核部分 我们在 Freescale 提供的 MPC8555CDS Linux 上进行了移植,主要还是根据自己板子的实际情况进行修改,在支持包能够正确工作之后,再根据上层软件的需要,对内核进行裁减。嵌入式 Linux 的内核编译方法与通用 linux 基本无异,只是在 make menuconfig 时会根据我们的 CPU 架构,显示出多种 ppc 开发版的平台供选择,我们选择了 MPC8555CDS,由于 MPC8555 与 MPC8541E 芯片的区别仅在于 CPM,所以根据我们的 MPC8541E 的接口情况对 CPM 的外围接口做调整即可。在裁剪完内核之后,可以开始编译。由于这个版本的 linux 内核已提供对 U-boot 的支持,故可直接编译出供 U-boot 使用的 uImage:#make uImage 在 linux-2.6.11/arch/ppc/boot/image/目录下生成 uImage 文件,即为 U-boot 所需内核文件。如果不能顺利生成 uImage,则可能由于缺少 mkimage 可执行文件的缘故,其源文件在 U-boot/tools 下。编译生成之后可放于/bin 目录下。mkimage 用法如下1:mkimage:作用:创建能被 uboot 加载的 linux 内核或 ramdisk 用法:mkimage-A arch-O os-T type-C comp-a addr-e ep-n name-d data_filename imagename 参数说明:-A:指定处理器类型-O:指定操作系统类型-T:指定映象文件类型-C:指定数据文件的压缩格式-a:指定解压后文件存放位置-e:指定执行代码的入口地址-n:给映像文件取名-d:指定数据文件-x:指定 XIP 代码 3.5.4 编译驱动部分编译驱动部分 在 Linux 中,有两种方式使用设备驱动程序:直接编译到内核中;在运行时加载(也就是内核模块)。我们采用了将网卡驱动直接编译进内核的方式,所以需要在编译内核时添加 FCC,TSEC,PCI 网卡的驱动。调试网卡驱动首先还是要熟悉芯片的接口,以 FCC 为例,需要根据硬件 CPM 接口的定义,修改 arch/ppc/cpm2_io/fcc_enet.c 各端口的配置。同时根据 MPC8541E 内部双端口 RAM 的地址范围,需要修改对应的源文件。http:/ -8-在这里需要提醒一点,由于 2.6.11 内核自带的 gianfar 驱动程序编写较早,经过 Freescale 开发人员的不断努力,目前效率已经有了很大提高,所以最好打上最新的驱动补丁。3.6 文件系统设计文件系统设计 内核仅仅提供了操作系统的各种资源的分配,各种设备的支持,文件系统则包含各类应用程序,提供各项丰富的功能。使用 RAMDISK 可以使 root filesystem 在没有其他设备的情况下启动。一般有两种加载方式,我们的做法是把 compressed ramdisk image 放到指定地址,然后由 bootloader 把这个地址通过启动参数的方式 ATAG_INITRD2 传递给 kernel。通常情况下,把 powerpc 版本目录下的命令文件直接拷贝过来,使用上没有问题,但是如果需要的命令太多,文件系统就会越来越庞大,而对于一个嵌入式系统,存储空间相对是比较小的。这里,就需要 busybox 来解决这一问题。Busybox 是 Debian GNU/Linux 的大名鼎鼎的 Bruce Perens 首先开发,使用在 Debian 的安装程序中。后来又有许多 Debian developers 贡献力量。Busybox 编译出一个单个的 独立执行程序,就叫做 busybox,它集成了非常多的命令工具,如果我们要使用某一命令,只需要做一个软链接就可以了2。在这个项目中,采用 busybox 来配置所需各类文件,具体方法参见 busybox 的手册。4.结论结论 基于 PowerPC 处理器 MPC8541E 嵌入式 Linux 系统充分发挥了 Linux 对网络和MPC8541E 等芯片的强大支持功能。经 SmartBits 测试,与 PowerQUICC II 系列及 x86 架构的同类产品相比,该系统可提供更高的转发速率,更大的吞吐率和更好的包处理能力,充分体现了其优异的性能。http:/ -9-参考文献参考文献 1 Wolfgang Denk.The Universal Boot LoaderEB/OL.http:/www.denx.de/wiki/publish/UBootdoc/UBootdoc.pdf,2004.6 2 Karim Yaghmour.Building Embedded Linux SystemsM.USA:OReilly,2003 Development of Embedded Linux System based on MPC8541E Processor of PowerPC Fang Xiankang School of computer science and technology,Beijing University of Posts and Telecommunications,Beijing(100876)Abstract Due to its potential to accelerate a wide variety of applications,embedded linux system has become a subject of a great deal of research.An application of embedded linux system in aviation was discussed based on PowerPC processorMPC8541E.The main features of MPC8541E were introduced at first,and the pivotal technologies were described in detail in design and implementation of embedded linux based on MPC8541E,including cross development,configuration of target,modifying of U-boot,especially how to port the linux kernel to the MPC8541E.This embedded system which is small,low-power,and also has many interfaces for development,and is benefit to the whole development of hardware firewall.Keywords:PowerPC processor;MPC8541E;Embedded system;Linux;U-boot