基于MPC8548E的固件设计

2012-09-19 10:29崔迎炜
电子设计工程 2012年21期
关键词:源码板卡文件夹

贾 亮, 岳 潇, 崔迎炜

(1.沈阳航空航天大学 电子信息工程学院,辽宁 沈阳 110136;2.北京方天长久科技有限公司 北京 100084)

U-Boot(Universal Boot Loader)是德国 DENX 小组开发的开放源码项目,它支持多种CPU体系结构的开发板,并且支持多种嵌入式操作系统内核,U-Boot已经成为功能最多、灵活性最强的开放源码BootLoader。作为一种通用的Boot Loader,U-Boot可以非常方便地移植到其他硬件平台上[1-2]。文中是基于MPC8548E的嵌入式目标板(即FTC7110)和UBoot源码资源来进行设计的,分析了U-Boot的目录结构和启动流程,同时对U-Boot源码设计以及设备自检程序的设计也做了相关的介绍,最后讲解如何通过设置环境变量来引导内核的启动。

1 开发板的硬件配置

FTC7110板卡基于mpc8548e作为处理器,板上资源有2个 网 口 、Nor Flash、Nand Flash、FPGA、CPLD、PHY 芯 片BCM5482s、DDR2、SRIO 交换机、PCI桥片等。 图 1是本次设计的嵌入式目标板卡FTC7110的主要硬件资源结构框图。

图1 FTC7110硬件结构框图Fig.1 Structure diagram of the hardware of FTC7110

2 U-Boot目录结构

U-Boot源程序包在顶层目录下一共有17个子目录,它们分别用于存放和管理不同的源程序。目录结构如下[3]:

3 U-Boot启动流程分析

U-Boot的启动大致可以分为两个阶段。第1个阶段在Nor Flash中执行,主要由汇编语言编写。第2阶段主要用C语言编写的,用于实现较复杂的硬件设备的初始化,同时也增加了代码的可移植性。

U-Boot运行启动流程如图2所示,U-Boot在复位启动后执行的第1个文件是 start.s,它位于arch/powerpc/cpu/mpc85xx中,接下来进行U-Boot启动的第1个阶段,完成一些针对MPC8548E的硬件初始化,主要包括初始化内核e500、清楚指令cache和数据 cache、设置中断向量、清除和建立一些寄存器、设置HID寄存器、配置MMU、初始化堆栈等,为系统创建一个有序可靠的初始环境,然后就进入到U-Boot启动的第2个阶段,首先进入第1个C语言函数cpu_init_early_f中,在这里主要是来初始化TLB和LAW,为系统中的硬件设备来映射对应的地址空间。接着进入到第2个C语言函数cpu_init_f中,这里主要是对TLB和LAW进行详细的配置以实现相应的功能。之后进入比较重要的C语言函数board_init_f中,这里是对板上的硬件进行第1阶段初始化,主要由数组init_sequence[]完成,该数组中的相关硬件初始化可以依据不同的目标板通过定义相关的宏定义来进行增加和删减。数组中的主要硬件初始化函数及函数功能如下:

在完成上述初始化后开始执行relocate_code函数,将代码从Flash中拷贝到RAM中,并记下当前执行代码的偏移,最后跳转到RAM中相应的位置继续执行板上硬件的第二阶段初始化,第二阶段是在board_init_r函数中执行,主要初始化包括有 PCI,PCIe,网口,Nor Flash,Nand Flash 等。在一切设备初始化完成之后,就进入函数main_loop中,等待U-Boot下命令的输入。

图2 U-Boot启动运行流程Fig.2 Booting mechanism of U-Boot

4 U-Boot源码的设计及编译

U-Boot中由于没有针对本目标板的源码,所以本次移植依据该源码的目录层次结构需要在U-Boot的board目录下为FTC7110嵌入式目标板新建FTC文件夹,添加FTC文件夹的目的是在该文件夹下可以建立基于CPU和硬件资源比较接近的FTC系列的其他板卡文件夹目录,所以这里需要在FTC文件夹下添加针对本次所采用的嵌入式板卡FTC7110文件夹,具体主要步骤如下:

1)添加include/configs/FTC7110.h。这个文件是开发板的配置文件。它主要是添加定义开发板硬件资源的映射地址和大小以及添加针对目标板的资源信息的来进行增加,比如实现MPC8548e对Nand Flash的访问,这里需要添加对MPC8548e的BR和OR寄存器的配置[4]。

2)添加位于board/FTC/FTC7110/下的 tlb.c和 law.c。第1个tlb.c文件是设置开发板硬件资源对应的映射地址和映射大小。第2个law.c文件是控制是否使能访问这些映射的地址空间。

3)添加board/FTC/FTC7110/FTC7110.c。该文件主要是完成对FTC7110目标板上相关硬件的初始化工作。

4)在FTC目录下添加common文件夹,该文件夹用于存放一些FTC系列板卡都支持的硬件配置代码或者是相关的硬件初始化代码,其主要目的是增加U-Boot源码的可扩展性。这里根据具体的实际需求,需要添加针对MPC8548E支持的PCI、Nand Flash和时钟等的相关配置代码。

5)U-Boot源码不支持对本目标板Nor Flash的支持,需要自己添加编写针对该Nor Flash的驱动程序。

6)根据对板卡其他功能的设置和需求来对U-Boot源代码进行进一步的增加删除。

在进行完前五步后就已经可以进行编译,实现对U-Boot的启动。其中第6步主要是完善优化U-Boot的启动界面和根据实际的需求增加相应的功能和命令。截止到这里就已经实现了针对目标板资源的配置。这里编译的操作系统是RHEL5.0,交叉编译环境是 ppc_85xx-gcc。 编译 U-Boot分为两步,第1步是配置编译的板卡,由于这里的FTC7110板卡目录是新增加的,所以需要在U-Boot根目录下的boards.cfg中添加相关配置文件以及在FTC7110和common文件夹下添加相应的Makefile文件,配置完成后在U-Boot源码根目录下输入make FTC7110_config命令。第2步编译,直接输入make命令即可。编译完成后在U-Boot顶层目录下会生成几个映像文件,这里通常采用将u-boot.bin二进制文件烧入到Bootrom中。目标板重新上电启动后,在超级终端下显示如下信息表示启动成功:

5 设备自检程序的设计

针对本目标板的实际设计需求,对Nor Flash、SRIO总线等进行了自检程序的设计,确保各个设备和相关总线在UBoot在启动后可以正常工作。

5.1 Nor Flash自检程序设计

本目标板采用Nor Flash自检的原理是首先将NorFlash中的内容暂存到内存中去,接着依次对Nor Flash中的每个扇区采用flash_write接口函数向Nor Flash地址中写入固定值,然后再从该地址中读取,将读取的值与写入的固定值作比较,两值相等表示Nor Flash设备工作正常,否则表示异常,当然在向Nor Flash中写入数据之前须对Nor Flash进行擦除操作。最后将Nor Flash中原有内容再从内存中存入到Nor Flash中去。

如果该Nor Flash具有写保护功能时,在擦除Flash时,先检测写保护是否关闭。本目标板设计检测Flash写保护是通过读取FPGA的某一寄存器的值是否为0来进行判断,具体如下:

如果Nor Flash中已经存在内容,则需先将内容暂存到内存中,然后在一块内存区域中写入一个Nor Flash扇区大小的固定值来作为写入Nor Flash的值,采用memset函数实现,具体设计如下:

上述完成之后采用flash_erase函数、flash_write函数等来进行擦除写入验证该Nor Flash是否正常,具体设计如下:

最后验证确定无误后,再将之前暂存到内存的内容存回到Nor Flash中去。

5.2 SRIO自检程序设计

本目标板采用的SRIO交换机芯片是IDT公司的TSI578。对于SRIO自检的设计,本设计采用的原理是通过配置SRIO总线来读取TSI578的ID号,以此来验证SRIO总线工作是否正常。

首先需要对SRIO总线进行必要的配置,通常分为3步:第1步配置TLB;第2步配置LAW;第3步配置Maintenance Window[5-6]。由于前两步在U-Boot固件的时候已经做了相关的配置,所以这里只需对Maintenance Window进行相关的配置,具体设计如下:

这里把通过SRIO总线对TSI578芯片的读操作叫做维护读。然后需要编写维护读的接口函数,这里采用宏定义的方法,函数名称为MAINT_READ,具体设计如下:

最后调用MAINT_READ函数通过SRIO总线来读取TSI578设备的ID号,以此做出相应的判断,这里假定TSI578的ID号是0x0578000d,具体如下:

6 操作系统的引导设计

U-Boot修改配置的最终目的是引导VxWorks操作系统内核,由于该VxWorks操作系统内核文件是ELF格式,而对于 ELF文件格式主要由 ELF Header、Program Header Table、Section Header Table组成,所以本设计在 U-Boot下采用bootelf命令来引导。

bootelf命令首先检测该ELF文件是否有效,具体参考代码如下:

对于上述valid_elf_image接口函数中的参数 addr就是VxWorks系统内核所存放的具体地址。接着bootelf命令开始解析该 ELF格式内核文件的 ELF Header、Section Header Table和Program Header Table部分,这一部分主要通过load_elf_image_phdr和load_elf_image_shdr这两个接口函数来实现的。最后通过设置环境变量来引导启动该操作系统内核,假设这里通过网络下载到Nor Flash中然后来引导启动vxworks.st内核。具体输入以下命令:

0xf0000000是本目标板的操作系统镜像文件的起始地址。

7 结束语

文中研究分析了将U-Boot成功移植到目标板FTC7110上,在U-Boot源码中添加FTC7110板卡的相关文件,同时该设计支持在线更新固件等功能,并在此基础上成功的引导了VxWorks操作系统,为后面的应用程序的开发奠定基础。对于不同的CPU和开发板,本U-Boot的启动原理分析和移植有一定的借鉴意义。

[1]周庆松,史小军.U-Boot在AT91RM9200上的移植及启动分析[J].东南大学:电子科学与工程学院,2008:1-3.

ZHOU Qing-song,SHI Xiao-jun.Porting and start analysis of U-Boot based on AT91RM9200 board[J].Southeast University:Department of Electronic Science and Engineering,2008:1-3.

[2]冯忠岭,童英华.ARM平台下U-Boot的移植[J].青海师范大学,2008:1-2.

FENG Zhong-ling,TONG Ying-hua.Transplanting of U-Boot under the ARM Platform[J].Qinghai Normal University,2008:1-2.

[3]段薇.U-Boot在MPC8265平台上的移植与分析 [J].武汉船舶通信研究所,2010:2-3.

DUAN Wei.Transplanting and analysis of U-Boot on the MPC8265 platform[J].Wuhan Maritime Communication Reseach Institute,2010:2-3.

[4]Freescale Semiconductor Inc.PowerPC MPC8548e reference manual[EB/OL].(2007-02-02).http://cache.freescale.com/files/32bit/doc/ref_manual/MPC8548ERM.pdf fsrch=1&sr=35.pdf.

[5]Freescale Semiconductor Inc.MPC8548E PowerQUICC III Integrated Processor Hardware Specifications[EB/OL].(2012-09-02).http://cache.freescale.com/files/32bit/doc/data_sheet/MPC8548EEC.pdf pspll=1.pdf.

[6]Freescale Semiconductor Inc.RapidIO Bring-Up Procedure on PowerQUICC III reference manual[EB/OL].(2004-01-11).http://cache.freescale.com/files/32bit/doc/app_note/AN2753.pdf fsrch=1&sr=2.pdf.

猜你喜欢
源码板卡文件夹
面向数据可靠传输的高译码率带反馈的LT码
国内一站式工程设备租赁平台众能联合完成C2、C3两轮融资
浅谈开源操作系统的历史
企业如何保护源码
基于PCI9054的多总线通信板卡的研制
基于FPGA的多通道模拟量采集/输出PCI板卡的研制
摸清超标源头 大文件夹这样处理
调动右键 解决文件夹管理三大难题
挂在墙上的文件夹
一种基于光纤数据传输的多板卡软件程序烧写技术