您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

PPCBoot在MPC8250上的移植要领

发布日期:2011-04-17

   择要: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)在举行初始化后,PPCBoot会实行函数board_init_r()中的main_loop()函数循环,即监控步调。PPCBoot的监控步调会根据用户从控制表面的输入完成预先设置的变乱。该函数在/ppebooffeommom/main.c中。在函数main_loop()会调用/ppeboot/com-mom/main.C中的run_command()函数完成下令的阐发,并转去实行相应的处理惩罚处罚函数。

4 PPCBoot源代码的修改和编译
   
要将PPCBoot移植到新的开辟板上,应该根据细致的体系筹划恳求,根据体系硬件配置修改PPC-Boot的源代码。

    移植紧张包括2个层面的移植,第1层是针对CPU的移植,PPCBoot支持的CPU典范在目次/cpu中,MPC8250映射在/cpu/mpe8260目次;第2层是针对细致board的移植,这紧张根据开辟者本身的细致筹划修改代码。为了淘汰变乱量,可以从PPC-Boot支持的demo板选择1个和本身的开辟板硬件相似的板子作为模板,这里,笔者选择MPC8260ADS板作为参考板,直接修改与该板上干系的源代码文件。

4.1 开辟板硬件
   
在修改PPCBoot源代码之前,要相识开辟板的硬件配置环境,根据硬件配置对源代码中的配置值做相应的修改,表2摆列出板子的硬件底子信息。别的,MPC8250开辟板的外围配置接口紧张有10/100M自适应网卡接口、RS232串口、PCI接口和全结果JTAG调试接口等。

4.2 修改PPCBoot源代码
   
从移植PPCBoot的最小恳求和PPCBOOt能正常启动的角度出发,并比较MPC8260ADS板和开辟目标板异同之后,紧张思量修改以下文件。

    (1)修改头文件mpc8260ads.h。mpe8260ads.h是板子的配置文件,它配置了板子的CPU、体系时钟、SDRAM、Flash体系及其他全部开辟板的信息,是须要修改的最告急的文件。

    在该文件中设置IMMR CPU寄存器基地点,过细该值必须与利用体系的设置一样。
    #define CFG—IMMR 0xF0000000
    设置CPU时钟
    #define CONFIG_8260_CLKIN 33333333 /*in Hz */
    设置:Flash、SDRAM,包括基址、大小、环境参数的偏移和大小,另有内存改造周期,都要根据目标板的细致环境设置;设置环境参数,用于网络下载、启动;别的,BR0、OR0、BR1、OR1等内存控制值,Watch.dog及一些目标板特定的参数也要根据实际环境设置。

    (2)Linux启动时,要从PPCBoot得到内存基地点和大小、时钟频率、波特率、IP地点等参数,以是ppcbooth文件中定义的布局体bd-info的成员序次必须与Linux利用体系的定义保持划一,实现参数的正确转达。

    (3)修改mpc8260ads.c。mpe8260ads.c中配置了I/O端口表,初始化SDRAM,完成板子的校验变乱。此中,I/O端口表配置了网络端口和板上其他一些通用I/O端口,函数initdram根据SDRAM寄存器的配置完成SDRAM的初始化。

    (4)修改config.mk。修改ppcboot/board/mpc826Oads/config.mk,设置TEXT_BASE=0xEF000000,使得TEXT_BASE的值和头文件中CFG_FLASH_BASE的值一样,这个值定义启动地点。

4.3 编译PPCBoot
    在代码修改完成后,就要举行重新编译,对PPC-Boot的编译须要在Linux主机上创建PowerPC的交错编译环境器。本身动手一步一步创建交错编译环境通常比较巨大,最大抵的要领是利用别人编译好的交错编译东西。笔者利用的是MontaVista提供的完备的开辟东西集CDK。

    在RedHat Linux9.O主机上创建好交错编译东西后,要修改PPCboot目次下的Makefile文件,指定交错编译器的完备路径名,然后用下面的下令举行配置和编译:
    #make MPC8260ADS_ config
    #make
    编译完成后,得到3个文件:
    * ppcboot:这是ELF(Executable and Link Format)格局的文件,可以被大多数Debug步调辨认。
    *ppcboot.bin:这是二进制bin文件,纯粹的ppeboot的二进制实行代码,不包括ELF格局和调试信息。这个文件一样通常用于摆设烧录ppcboot到用户的开辟板。
    *ppcboot.srec:Motorola的S-Record格局.是可以通过串口下载到开辟板中的文件。

5 移植PPCBoot
    编译好的ppcboot.bin文件通过JTAG接口下载到Flash的肇始地点处,再次上电后,就可以看到PPCBoot的启动信息:
    PPCBoot 2.0.O(Jul 12 2005—18:21:391
    RewinTeeh:Fengjunping&&Huangjianzhong MPC8260
    Reset Status:External Soft.Extemal Hard MPC8260
    Clock Configuration
    —Bus—to—C0re Mull 5x.VCO Div 2,60x Bus Freq 20—60,Core Freq 100-300一dtbrg 0,coreenf Oxob,busdf 5,cpmdf 1,plldf 0,pnmf 2
    一vco__out 199999998,scc_elk 49999999,brg_elk49999999
    一cpu_clk 166666665,epm_clk 99999999,bus_clk33333333
    CPU: MPC8260(Rev 14,Mask unknown[immr=0x0064,k=0x002d])at 166.666 MHz
    Board:Motorola MPC8260ADS
    I2C:ready
    DRAM:16MB
    F1ash:16 MB
    ***Warning—bad CRC.using default environment
    In: serial
    Out:serial
    Err:serial
    stan linux now(y/n):=>

    输入help得到全部属令列表,help command列出该下令的结果。紧接着测试Flash和网卡,要是都正常变乱,表明移植PPCBoot的变乱底子完成,可以接着调试内核和文件体系。

    实际进程中大概由于思量不周而须要多次修改。移植告成后,也可以添加一些其他结果(如LED的驱动等),在此底子上添加结果相相比较容易。

6 结束语
    Bootloader在嵌入式开辟中是利用体系和硬件的关键,它为利用体系内核的启动提供了须要的条件和参数。在移植进程中,开辟职员除了要掌握Bootloader的结讨论变乱流程外,还要对干系硬件有肯定的相识。如今,笔者移植的PPCBoot已经可以大概稳固地运行在开辟板上,并且可以通过FIash和网络加载内核和文件体系,为后续开辟分外是驱动步调的开辟奠定了精良的底子。敷衍差别的CPU和开辟板,其底子要领和步调是雷同的,笔者渴望本身的经历能对有关嵌入式筹划职员提供资助。