新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于Mpc823e的bootloader分析和实现

基于Mpc823e的bootloader分析和实现

作者:时间:2012-06-01来源:网络收藏

0 引言

在嵌入式系统中,当cpu启动起来后,首先会在预先设置的地址上执行,用来加载和启动系统。通过,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。与硬件紧密结合,不同处理芯片体系,不同主板设计,对应不同的引导程序。本系统采用ppcboot作为引导程序。ppcboot的功能强大,而且代码公开。一般来说,它可以分为两部分:与硬件相关的代码,与硬件无关的代码。在设计时,可以先从其官方网站下载完整的代码,然后根据自己系统的特点,对与硬件相关代码部分进行修改,最后进行编译,烧入 Flash。接下来,将对ppcboot的工作流程和具体的修改过程进行讨论

1 ppcboot工作流程

作为ppc体系的引导程序ppcboot上电后,将完成初始化硬件设备,建立内存映射, 启动系统内核三个任务。

初始化硬件设备:

系统上电复位后,CPU首先从Flash 的0x100处执行第一条指令。该指令跳转到具体地址后,开始执行部分初始化和真正初始化前的准备工作:屏蔽所有的中断,设置CPU的速度和时钟频率,禁止cache、禁止地址转换等等。

在这个阶段中,执行空间始终在Flash,功能通常都用汇编语言来实现。之后,系统开始建立内存映射。

建立内存映射

(1)设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等,使CPU能够正常运行起来并执行C语言程序,并且为下一步加载引导程序,准备RAM空间。

(2)引导程序重新定位执行空间,ppcboot代码从flash拷贝到内存,开始在内存中执行。

(3)再次初始化部分硬件设备,并检测系统内存映射,知道 CPU 预留的全部 RAM 地址空间中的哪些被真正映射到 RAM 地址单元,哪些是处于无状态的。经过这个阶段后,系统建立了内存映射图(见图1),并开始在内存里执行程序,能够执行C语言程序。之后,系统进入启动操作系统内核阶段。

启动操作系统内核

(1)把内核映像和根文件系统映像从Flash上读到RAM中。

(2) 为内核设置启动参数。以标记列表的形式来传递。

(3)解压内核,初始化串口,使解压后内核获得CPU的控制权,结束ppcboot的任务。

2 基于MPC823e的ppcboot的具体编写

在上面提过,由于ppcboot的代码硬件无关部分是通用的,不需要修改。而硬件相关的代码部分,与硬件紧密相关,所以需要针对自己具体的硬件进行修改,主要是cpu部分与主板部分的代码。

2.1 ppcboot中cpu部分的开发

ppcboot的一个任务是初始化CPU内部寄存器,包括:定义中断向量表、数据和指令cache的设置、内存管理单元MMU的设置、系统接口单元SIU设置、内存控制器和UPM表的设置、时钟和复位寄存器设置、外部总线接口设置、与编译器相关的堆栈设置等。

步骤1: 禁止 中断 -> 禁止cache -> 禁止MMU

启动过程中无法处理中断,所以必须关闭中断;另外,因内存管理、cache尚未设置,所以应先全部禁止,待设置完毕再打开。

步骤2: 初始化内存 init_memc

MPC823e提供了强大的内存接口控制单元,包括一个通用内存接口单元GPCM和两个用户可编程内存接口单元UPMA/UPMB。还提供了8个片选信号线与8片独立的内存接口。

编写ppcboot时,需要研究SDRAM芯片的时序图,构造出MPC823e特有的64个时序字,填入MPC823e内部相应的寄存器中。以后,每当发出内存访问的指令时,硬件就能够根据设置好的64个时序字,产生正确的读写时序。而且要针对具体的设计,编写片选内存的寄存器BRx和ORx来设置其属性,包括定义内存片基地址、地址掩码、读写属性、总线宽度(8位、16位、32位)、控制单元(使用GPCM或UPM)等。如本系统中,使用了CS0 控制16位的Flash存储器、CS1控制32位的sdram,对CS1进行设置时应设为基地址0x00000000,32位可读写,使用UPMA。

步骤3:初始化系统接口单元init_SIU -> 初始化调试寄存器der -> 初始化时钟 init_clk

系统接口单元主要包含对MPC823e复用引脚的设置寄存器、调试寄存器(该寄存器可用来设置CPU在各种不同的意外情况下是否进入调试状态)。

初始化时钟主要是对CPU主频的设置。MPC823e有一个倍频率达数千倍的内部倍频器,本系统中,采用了5MHz的晶振,经过10倍频后稳定运行在50MHz频率上。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭