PPCBoot在MPC8250上的移植方法

发布者:心连心意最新更新时间:2006-09-13 来源: 国外电子元器件关键字:寄存器  嵌入式  函数 手机看文章 扫描二维码
随时随地手机看文章

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

关键字:寄存器  嵌入式  函数 引用地址:PPCBoot在MPC8250上的移植方法

上一篇:基于FPGA和SRAM的数控振荡器的设计与实现
下一篇:一种简便易行的空间域图像信息隐藏技术

推荐阅读最新更新时间:2024-05-02 20:25

通过SerDes远端I2C接口访问16位I2C外设寄存器地址
  引言   Maxim吉比特多媒体串行链路(GMSL)串行器/解串器(SerDes)系列包括MAX9249、MAX9259、MAX9260、MAX9263和MAX9264,具有UART/I2C转换器,用于远端控制I2C接口外设。这些外设包括相机传感器、I/O端口扩展器、音频模/数转换器(ADC)和数/模转换器(DAC),以及LED照明。   在GMSL数据资料和相关技术文件中,通过UART端口直接连接至电子控制单元(ECU)的一端被称为"本地端",另一端被称为"远端".   I2C外设接口是控制通道基本模式中的默认设置。GMSL系列SerDes只转换器件地址不同于GMSL串行器或解串器地址的UART数据包。UART/
[嵌入式]
ARM工作模式和寄存器
1. ARM工作模式 ARM有7种工作模式,分别是用户模式(User)、系统模式(System)、管理模式(Supervisor)、中止模式(Abort)、未定义模式(Undefined)、中断模式(Interrupt)和快速中断模式(Fastinterrupt),其中后面6中模式称为特权模式,后面5中模式称为异常模式。 2. ARM寄存器 ARM共有37个寄存器,其中有31个通用寄存器,但是在一种工作模式下只能使用16个通用寄存器,有6个程序状态寄存器,在一中工作模式下也只能使用1到2个程序状态寄存器。 r13通常作为栈指针(SP)寄存器 r14(LR)用于子函数调用时保存子函数的返回地址 r15(PC)为
[单片机]
ARM工作模式和<font color='red'>寄存器</font>
STM32编译器keil中printf函数的应用
首先要,请在MDK(keil)工程属性的“Target“-》”Code Generation“中勾选”UseMicroLIB 在程序中添加Printf 1,#include 2,添加 #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { USART_SendData(USART1, (uint8_t) ch); while (USART_GetFl
[单片机]
科胜讯推出新系列解决方案用于嵌入式音频应用
为影像、音频、嵌入式调制解调器和视频应用提供创新半导体解决方案的领先供应商科胜讯系统公司(纳斯达克代码:CNXT)推出用于嵌入式音频和语音应用的新系列音频 SoC 解决方案。CX2070X SoC 针对多媒体 IP 电话、个人导航设备、便携式媒体播放器和移动互联网设备等不断增长的音频应用。其他应用包括 MP3 播放底座系统、PC 扬声器系统、音频耳机和统一通信系统,支持如 VoIP 电话、电话扬声器和音频会议功能等服务。高度集成的 SoC 还能用来实现对讲机和对讲门铃应用等。新的音频解决方案现已向预生产客户大批量供货。 科胜讯系统公司市场副总裁 René Hartner 表示:“我们已利用语音和音频增强算法方面的广泛
[嵌入式]
printf()是如何与UART外设驱动函数“勾搭”起来的?
这绝对是一篇好文章,打印这个函数有时候比什么调试工具都有用,内核的prink更加是神器中的神器,但是printf这个函数是怎么和uart驱动联系在一起的,这篇文章会给你解答,点赞,转发,收藏起来需要的时候看看吧。 今天给大家分享的是IAR下调试信息输出机制之硬件UART外设。 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地定位和分析程序问题。在嵌入式应用设计里实现打印信息输出的方式有很多,本系列将以 IAR 环境为例逐一介绍 ARM Cortex-M 内核 MCU 下打印信息输出方法。 本篇是第一篇,我们先介绍最常见的输出打印信息方式,即利用 MCU 芯片内的硬件 UART
[单片机]
锐成芯微携手SMIC推基于55nm嵌入式闪存平台IoT模拟IP方案
电子网消息,中芯国际集成电路制造有限公司(“中芯国际”,纽交所代号:SMI,港交所股份代号:981),世界领先的集成电路晶圆代工企业之一,中国内地规模最大、技术最先进的集成电路晶圆制造企业,同与国内领先的超低功耗模拟IP供应商成都锐成芯微科技股份有限公司(以下简称“ACTT”)联合宣布推出基于中芯国际55纳米嵌入式闪存技术平台的模拟IP解决方案。成都锐成芯微模拟IP以及中芯国际55纳米工艺技术均针对低功耗应用而开发,能够充分满足物联网产品对低成本和超长电池寿命的需求。 近年来,全球物联网市场持续快速增长,并将很快成为半导体产业的主要推动力。同时亚太区拥有潜力占据更多的市场份额,并成为全球最重要的物联网市场之一。基于中芯国际55
[半导体设计/制造]
基于WinCE5.0的嵌入式设备休眠唤醒技术研究
嵌入式系统应用中降低设备功耗以提高续航能力是其设计的热点。在休眠状态,系统处于最低 电流 消耗状态,同时仍维持存储区中的内容,为了减少能量消耗和延长电池寿命,需要让处理器定期进入或退出休眠模式。Windows CE 作为一个广泛应用于嵌入式设备上的操作系统,提供了完善的 电源管理 功能。其中,休眠唤醒便是一个重要的功能。本文在结合S3C2440硬件基础上分析休眠唤醒过程,分别采用外部中断唤醒和RTC中断唤醒两种方法实现了休眠唤醒,并给出了具体实现代码。根据相应唤醒需求,将这两种方法应用于北京化工大学诊断与自愈工程研究中心的一款基于S3C2440和WindowsCE 5.0的嵌入式智能巡检分析诊断仪,结果表明能准确达到实际的设置要求
[电源管理]
基于WinCE5.0的<font color='red'>嵌入式</font>设备休眠唤醒技术研究
MSP432P401R TI Drivers 库函数学习笔记(二)认识TI-RTOS (TI-POSIX)
平台:Code Composer Studio 10.4.0 MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件 (MSP-EXP432P401R) 简介 SimpleLinkTM 微控制器(MCU)平台的软件开发工具包(sdk)具有通用组件和特定于设备的中间件,加快了上市时间,并提供了有线和无线设备的 SimpleLink 整个 MCU 组合的统一开发经验。关于 SimpleLink SDK 的框图,请参阅下图。在本文中,我将更深入地探讨 SimpleLink SDK 中包含的组件如何使您能够使用实时操作系统(RTOS)创建确定的、高效的、可伸缩的应用程序。 TI-RTOS
[单片机]
MSP432P401R TI Drivers 库<font color='red'>函数</font>学习笔记(二)认识TI-RTOS (TI-POSIX)
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

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

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