基于PowerPC处理器MPC8541E的嵌入式Linux系
统开发
方先康
北京邮电大学计算机科学与技术学院,北京(100876)
E-mail:chinadak@tom
摘要:介绍了嵌入式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站点
ftp:///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 调试环境基本结构框图
3.3 目标系统资源分配
对于系统平台来说,建立良好的内存映射表是系统成功运行的基本保证。具体内存资源
映射情况见下表:
表1 内存空间映射表
片选存储控制器内存范围
LCS0 GPCM 0xFFF80000-0xFFFFFFFF LCS1 GPCM 0xFC000000-0xFDFFFFFF 内部PCI1 memory space 0x80000000-0x9FFFFFFF
内部PCI2 memory space 0xC0000000-0xDFFFFFFF
内部CCSBR 0xE0000000-0xE00FFFFF
内部PCI I/O space 0xE2000000-0xE2FFFFFF
3.4 引导Linux 系统的bootloader (U-Boot)
3.4.1 U-boot
U-BOOT是DENX软件中心依照GPL (General Public License)发布的系统引导模块,支
持多种处理器,如ARM系列、PowerPC 系列、MIPS 系列、X86 系列等。根据自己的目
linux系统免费下载标系统修改编辑U-BOOT包下的源文件,进行移植,最后编译U-BOOT 后生成二进制文件,
用于引导系统。U-boot 的源文件可从u-bootsourceforge/projects/u-boot获
得。
由于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
由于处于开发调试阶段,我们需要使用tsec 通过网络下载镜像文件,根据布线情况,需要修改:
#define TSEC1_PHY_ADDR 8
#define TSEC2_PHY_ADDR  9
配置Flash 基址信息:
#define CFG_FLASH_BASE  0xfff80000 /*Bootrom 512 KB */
CFG_FLASH2_BASE 0xfc000000
#define
配置DDR控制器信息:
CFG_BR0_PRELIM
0xfff80801
#define
#define CFG_BR1_PRELIM 0xfc001001
#define CFG_OR0_PRELIM 0xfff86ec1
#define CFG_OR1_PRELIM 0xfe006e61
还有其它配置:
#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 的数据手册,数据手册重要部分如下所示:
图2 flash命令字操作流程图
因此实现代码如下:
flash_print_info函数(打印Device ID、 Vendor ID):
193 case 0x00010000: printf ("Spansion "); break;
213 case 0x0000227e: printf ("Spansion S29GL256N\n");
最重要的write_word函数实现:
base = (volatile unsigned short *)(info->start[0]);
/* Disable interrupts which might cause a timeout here */
flag =disable_interrupts();
base[0x0555] =(unsigned short)0x00AA00AA; /* unlock */ asm("sync");
base[0x02AA] =(unsigned short)0x00550055; /* unlock */ asm("sync");
base[0x0555] = (unsigned short)0x00A000A0; /* selects program mode */ asm("sync");
*dest = data;
添加更新命令,方便软件开发人员更新维护:
修改common/cmd_flash.c
添加
int
do_update (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
if(argc!=2){
printf("Usage:update kernel or update ramdisk\n");
return 1;
}
if(*argv[1]=='k'){
run_command("tftp 1000000 uImage",0);
run_command("erase fc200000 fc3fffff",0);
run_command("cp.b 1000000 fc200000 200000",0);
}else if(*argv[1]=='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 flash\n",
"[args..]\n"
"    - update kernel or update ramdisk \n"
);
至此,编译U-boot,使用u-boot.bin文件烧写 bootrom,上电后应能正常启动,使用网络命令与Flash相关命令应能正确执行。
3.5操作系统 (Linux 2.6.11) 的移植
Embedded Linux 来自www.freescale,解压源代码,可以发现其内核版本为2.6.11。
3.5.1 准备编译
#cd linux-2.6.11
#make mrproper
3.5.2 配置内核文件
由于是在命令行方式下进行编译,故使用
#make menuconfig
来配置 .config 文件。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。