位置:51电子网 » 技术资料 » 其它综合

PPCBoot在MPC8250上的移植方法

发布时间:2007/8/29 0:00:00 访问次数:772

作者:西安电子科技大学ISN国家重点实验室 冯俊平,黄建忠,王新梅


摘要:The Bootloader(引导加载程序)是嵌入式系统CPU加电后即开始运行的第一段代码,它把Linux内核与硬件平台衔接在一起,对于嵌入式系统的后续软件开发十分重要。PPCBoot是功能十分强大的Bootloader。深入研究了PPCBOOt的工作机理,详细分析了PPCBoot在基于MPC8250型处理器的嵌入式系统板上的移植方法、过程与移植要点。


关键词:Bootloader;PPCBoot;MPC8250;嵌入式系统


1 引言


Boodoader(引导加载程序)是CPU复位后和进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统等。Bootloader代码与CPU的内核结构、具体型号等因素有关,其功能类似于通用PC的BOIS程序。除了依赖CPU的体系结构外,Bootloader实际上还依赖于具体的嵌入式板级设备的配置。也就是说,对于二块不同的嵌入式板,即使它们使用相同的CPU构建,要想让运行在其中一块板上的Bootloader程序也能运行在另一块板上,通常也都需要修改Boofloader的源程序。因此,在嵌入式系统的开发中不可能有通用的Bootloader,开发时用户要根据具体的系统设计要求进行移植。


从嵌入式系统的实际开发角度讲,嵌入式操作系统的引导、配置甚至应用程序的运行状况都与Bootloader有一定的关联,可以说,掌握Bootloader移植是顺利进行嵌入式系统开发的重要利器。在嵌入式Linux系统中,PPCBoot是功能强大的Boot-loader,它支持多种CPU体系结构,但相对也比较复杂。


本文以MPC8250微处理器和嵌入式Linux为背景,针对性的提供了PPCBOOt在开发板上的移植方法,可以应用在基于MPC82xx系列处理器的嵌入式Linux系统应用开发中。


2 PPCBoot简介


PPCBoot是德国DENX小组开发的用于多种嵌入式CPU的Bootloader引导程序,主要由德国的工程师Wolfgang Denk和Intemet上的一群自由开发人员对其进行维护和开发。支持PowerPC、ARM、MIPS、m68K等多种处理器平台,易于裁剪和调试。


PPCBoot遵循GPL(通用公共许可)公约,完全开放源代码。PPCBoot源代码可以在sourceforge网站的社区服务器中获得,它的项目主页是http://sourceforge. net/projects/ppcboot,也可以从DENX的网站htrp://www.denx.de下载。笔者使用的版本是PPCBoot-2.0.0。


PPCBoot的主要特点如表1所列。



3 PPCBoot的运行流程


当MPC8250上电或者施加复位信号时,CPU通过读取数据总线D[0:3l]上的值或根据内部的缺省常数D[0:31]=0x00000000,确定它的状态。如果CPU在读取总线值时,RSTCONF#滞表示低电平有效,以下类同)为低电平,则硬复位配置字(HRCW)从总线上读取,若RSTCONF#为高电平,则HRCW选用内部的默认值。


上电后,启动存储控制器CSO#(对应于Flash的片选信号)有效,选中Flash,CPU地址线上输出硬件复位中断向量对应的地址0x00000100,开始读第1条指令,在PPCBoot中,这条指令对应于/ppcboot/cpu/mpc8260/start.S中的_start:标号处。下面介绍具体的启动过程。


(1)运行start.S(/ppcboot/cpu/mpc8260/start.S)从一start:标号处执行。在完成CPU本身基本的初始化后,主要是初始化CPU内部寄存器的一些状态,主要设置IMMR、ICTRL、D-cache、I-cache等。从in_flash:处执行,设置C语言工作环境,再调转到代码bl cpu_init_f(第2步)和bl board_init_f(第3步)。


(2)CPU的底层初始化(/ppcboot/cpu/mpc8260/epu_init.C)从start.S中跳转到函数cpu_init_f(volatileimmap_t*immr)处,进行CPU的底层初始化,主要设置了watchdog、SIUMCR寄存器、时基(timebase)寄存器、PIT(周期中断寄存器)、锁相环、系统定时器、存储控制器和CPM等。


(3)板上的第1次初始化(/ppcboot/lib_ppc/board.c)完成第2步后,返回地址放人LR寄存器中,再从start.S中跳转到函数board_init_f(ulong bootflag)处,该函数实现板上的第1次初始化,完成SMC初始化和一些硬件测试。尤其是RAM初始化,并分配内存空间,保存板子的信息,准备好在RAM中重定向代码。然后调用relocate_code函数,将PPCBoot移到RAM中运行。


(4)搬运代码到内存中(/ppeboot/cpu/mpc8260/8tart.s)
从函数board_init_f跳到/ppcboot/cpu/mpc8260/start.S中的relocate_code()函数处,然后将代码搬至SDRAM工作,调整GOT表,做一些重定位后开始在RAM中运行代码。


(5)板上的第2次初始化(/ppcboot/lib_ppc/board.C)在relocate_code()函数后将跳转到board_init_r()函数处执行第2次初始化,主要完成一些数据结构、高端模块及系统设备的相关初始化。


(6)命令的解析与执行(/ppcboot/commom/main.C)在进行初始化后

作者:西安电子科技大学ISN国家重点实验室 冯俊平,黄建忠,王新梅


摘要:The Bootloader(引导加载程序)是嵌入式系统CPU加电后即开始运行的第一段代码,它把Linux内核与硬件平台衔接在一起,对于嵌入式系统的后续软件开发十分重要。PPCBoot是功能十分强大的Bootloader。深入研究了PPCBOOt的工作机理,详细分析了PPCBoot在基于MPC8250型处理器的嵌入式系统板上的移植方法、过程与移植要点。


关键词:Bootloader;PPCBoot;MPC8250;嵌入式系统


1 引言


Boodoader(引导加载程序)是CPU复位后和进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统等。Bootloader代码与CPU的内核结构、具体型号等因素有关,其功能类似于通用PC的BOIS程序。除了依赖CPU的体系结构外,Bootloader实际上还依赖于具体的嵌入式板级设备的配置。也就是说,对于二块不同的嵌入式板,即使它们使用相同的CPU构建,要想让运行在其中一块板上的Bootloader程序也能运行在另一块板上,通常也都需要修改Boofloader的源程序。因此,在嵌入式系统的开发中不可能有通用的Bootloader,开发时用户要根据具体的系统设计要求进行移植。


从嵌入式系统的实际开发角度讲,嵌入式操作系统的引导、配置甚至应用程序的运行状况都与Bootloader有一定的关联,可以说,掌握Bootloader移植是顺利进行嵌入式系统开发的重要利器。在嵌入式Linux系统中,PPCBoot是功能强大的Boot-loader,它支持多种CPU体系结构,但相对也比较复杂。


本文以MPC8250微处理器和嵌入式Linux为背景,针对性的提供了PPCBOOt在开发板上的移植方法,可以应用在基于MPC82xx系列处理器的嵌入式Linux系统应用开发中。


2 PPCBoot简介


PPCBoot是德国DENX小组开发的用于多种嵌入式CPU的Bootloader引导程序,主要由德国的工程师Wolfgang Denk和Intemet上的一群自由开发人员对其进行维护和开发。支持PowerPC、ARM、MIPS、m68K等多种处理器平台,易于裁剪和调试。


PPCBoot遵循GPL(通用公共许可)公约,完全开放源代码。PPCBoot源代码可以在sourceforge网站的社区服务器中获得,它的项目主页是http://sourceforge. net/projects/ppcboot,也可以从DENX的网站htrp://www.denx.de下载。笔者使用的版本是PPCBoot-2.0.0。


PPCBoot的主要特点如表1所列。



3 PPCBoot的运行流程


当MPC8250上电或者施加复位信号时,CPU通过读取数据总线D[0:3l]上的值或根据内部的缺省常数D[0:31]=0x00000000,确定它的状态。如果CPU在读取总线值时,RSTCONF#滞表示低电平有效,以下类同)为低电平,则硬复位配置字(HRCW)从总线上读取,若RSTCONF#为高电平,则HRCW选用内部的默认值。


上电后,启动存储控制器CSO#(对应于Flash的片选信号)有效,选中Flash,CPU地址线上输出硬件复位中断向量对应的地址0x00000100,开始读第1条指令,在PPCBoot中,这条指令对应于/ppcboot/cpu/mpc8260/start.S中的_start:标号处。下面介绍具体的启动过程。


(1)运行start.S(/ppcboot/cpu/mpc8260/start.S)从一start:标号处执行。在完成CPU本身基本的初始化后,主要是初始化CPU内部寄存器的一些状态,主要设置IMMR、ICTRL、D-cache、I-cache等。从in_flash:处执行,设置C语言工作环境,再调转到代码bl cpu_init_f(第2步)和bl board_init_f(第3步)。


(2)CPU的底层初始化(/ppcboot/cpu/mpc8260/epu_init.C)从start.S中跳转到函数cpu_init_f(volatileimmap_t*immr)处,进行CPU的底层初始化,主要设置了watchdog、SIUMCR寄存器、时基(timebase)寄存器、PIT(周期中断寄存器)、锁相环、系统定时器、存储控制器和CPM等。


(3)板上的第1次初始化(/ppcboot/lib_ppc/board.c)完成第2步后,返回地址放人LR寄存器中,再从start.S中跳转到函数board_init_f(ulong bootflag)处,该函数实现板上的第1次初始化,完成SMC初始化和一些硬件测试。尤其是RAM初始化,并分配内存空间,保存板子的信息,准备好在RAM中重定向代码。然后调用relocate_code函数,将PPCBoot移到RAM中运行。


(4)搬运代码到内存中(/ppeboot/cpu/mpc8260/8tart.s)
从函数board_init_f跳到/ppcboot/cpu/mpc8260/start.S中的relocate_code()函数处,然后将代码搬至SDRAM工作,调整GOT表,做一些重定位后开始在RAM中运行代码。


(5)板上的第2次初始化(/ppcboot/lib_ppc/board.C)在relocate_code()函数后将跳转到board_init_r()函数处执行第2次初始化,主要完成一些数据结构、高端模块及系统设备的相关初始化。


(6)命令的解析与执行(/ppcboot/commom/main.C)在进行初始化后

相关IC型号

Warning: Undefined variable $stockkeys in G:\website_51dzw\www.51dzw.com\code\tech\view.php on line 152

热门点击

 

推荐技术资料

罗盘误差及补偿
    造成罗盘误差的主要因素有传感器误差、其他磁材料干扰等。... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式