PPCBoot在MPC8250上的移植方法

发布者:Serendipitous55最新更新时间:2012-06-02 来源: 国外电子元器件 关键字: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等。[page]

    (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。[page]

    在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和开发板,其基本方法和步骤是相同的,笔者希望自己的经验能对有关嵌入式设计人员提供帮助。

关键字:Bootloader  PPCBoot  MPC8250 引用地址:PPCBoot在MPC8250上的移植方法

上一篇:跨越数据类型的重重陷阱
下一篇:双向可控硅触发电路的设计方案

推荐阅读最新更新时间:2024-03-16 13:00

采用UDP协议的PIC32MZ ethernet bootloader
经过千辛万苦,今天终于完工PIC32MZ EC Starter Kit的ethernet bootloader项目。我将整个项目, 命名为PhnBootloader。它分为两个部分。第一个部分是PC 端的host程序PhnLoader_v3.0。另一部分是单片机端boot程序PhnBoot_v3.0,是从Microchip AN1388 ethernet bootloader移植过来的。整个移植过程碰到很多困难,主要是由于ethernet bootloader使用到Microchip 的TCP/IP Stack,但是TCP/IP Stack不支持PIC32MZ。 这里我列出移植需要注意的地方: 1. PIC32MZ默认enable
[单片机]
采用UDP协议的PIC32MZ ethernet <font color='red'>bootloader</font>
ARM工作模式和BOOTLOADER -2410
简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。 基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。在系统加
[单片机]
什么是Bootloader 浅谈STM32中bootloader的内存分配
1. 什么是Bootlo ad er Bootloader是 硬件 启动的引导程序,是运行 操作系统 的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。 2. Bootloader的特点 Bootloader不属于操作系统,一般采用 汇编 语言和 C语言 开发。需要针对特定的硬件平台编写。在移植过程时,首先为开发板移植Bootloader。Bootloader不但依赖于 CPU 的体系架构,而且依赖于 嵌入式系统 板级设备的配置。 3. STM32 中bootloader的内存分配 stm32默认的是从0x08000000开始启动程序,所以bootloader
[单片机]
什么是<font color='red'>Bootloader</font> 浅谈STM32中<font color='red'>bootloader</font>的内存分配
如何使用STM32通用Bootloader让OTA更加Easy
随着物联网时代到来,越来越多的智能设备拥有了在线升级的能力,无论是系统更新,产品功能迭代还是漏洞修复都能在第一时间抵达用户手中的智能设备。 在线升级功能需要使用 OTA (Over-the-Air) 技术 ,OTA 技术简单地说就是通过网络来升级手中的智能设备,进而使用设备最新版本的功能。而 OTA 技术中必不可少的一环就是通过 Bootloader 来管理、升级设备固件。 由于 OTA 功能由多种复杂技术组成,因此添加 OTA 功能有一定的技术门槛。很多开发者遇到莫名其妙的问题,进而导致 OTA 升级失败,常见问题如下: 升级过程缺少专业的安全机制 APP 无法正常启动 程序莫名跑飞,出现 hardfault 固件搬运失
[单片机]
如何使用STM32通用<font color='red'>Bootloader</font>让OTA更加Easy
stm32系统存储器中自举程序和flash中bootloader的区别
stm32的系统存储器中烧写了ST的自举程序并被锁死,防止用户擦写。此自举程序用于在应用编程,例如正点原子的usb转串口硬件和flymcu软件,通过它们就可以将程序烧写至flash。 而大多数人说的bootloader是指自己编写的bootloader程序并被烧写至flash的起始位置(stm32为0x8000000),通过此程序更新app程序。
[单片机]
ARM Linux启动过程分析
1. 引 言 Linux 最初是由瑞典赫尔辛基大学的学生 Linus Torvalds在1991 年开发出来的,之后在 GNU的支持下,Linux 获得了巨大的发展。虽然 Linux 在桌面 PC 机上的普及程度远不及微软的 Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些年来 Linux 在嵌入式领域的迅猛发展,更是给 Linux 注入了新的活力。 一个嵌入式 Linux 系统从软件角度看可以分为四个部分 :引导加载程序(bootloader), Linux 内核,文件系统,应用程序。 其中 bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外
[单片机]
嵌入式系统结构与协同性探讨
引言 嵌入式技术被广泛应用于信息家器、消费电子、交换机以及机器人等产品中,与通用计算机技术不同,嵌入式系统中计算机被置于应用环境内部特征不明显。系统对性能、体积、以及时间等有较高的要求。复杂的嵌入式系统面向特定应用环境,必须支持硬、软件裁减,适应系统对功能、成本以及功耗等要求。 0.1 嵌入式系统与协同性 从信息传递的电特性过程分析,嵌入式系统特征表现为,计算机技术与电子技术紧密结合,难以分清特定的物理外观和功能,处理器与外设、存储器等之间的信息交换主要以电平信号的形式在IC 间直接进行。 从嵌入深度ED来看,信息交换在IC 间越直接、越多,嵌入深度就越大。 在设计实验系统模型(图1)时,充分考虑到软硬协同性,使其成为一个实
[单片机]
嵌入式系统结构与协同性探讨
自己用C语言写dsPIC / PIC24 serial bootloader
  HyperBootloader_dsPIC   HyperBootloader_dsPIC是我用C语言实现的UART bootloader, 采用串口通信,适用于Microchip的dsPIC30, dsPIC33,同样适用于PIC24。单片机端bootloader是用XC16编译的,电脑端的通信软件是用超级终端--HyperTerminal。   dsPIC30 和 dsPIC33 程序存储器   dsPIC30,dsPIC33, PIC24的程序存储器架构都一样,只是大小,和vector位置有所不同。下图所示的是dsPIC30和dsPIC33程序存储器的示意图,以及HyperBootloader的放置位置。HyperBoo
[单片机]
自己用C语言写dsPIC / PIC24 serial <font color='red'>bootloader</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved