积分规则 网站地图 帮助中心    
嵌入式软件 单 片 机 DSP 存储器 传感控制 光电显示
嵌入式硬件 CPLD/FPGA SOPC AD/DA 接口电路 模拟设计
I C设计 通信产品 汽车电子 电源产品 消费电子 数控系统
工业控制 军工/航天 安防产品 医疗电子 计算机外设 测试测量
供应 I C
求购 公司库

  IC 求购 销售 公司 论文 DATASHEET 参考设计 论坛
当前位置: 电子技术 >> 嵌入式软件 >> Bootloader
  相关分类: LINUX | WINCE | UC/OS | Bootloader | 下载 | VXWORKS | 网络协议 | JAVA | 汇编 | 驱动设计 | Symbian | Palm OS | XP Embedded | Nucleus | DeltaOS/SMARTOS/Hope | 新产品 | 相关文章 |
基于PowerPC的微型BootLoader在Linux中的应用
 
作者:未知   来源:电子产品世界    点击数:281   更新时间:2007-12-21
您可以添加到网摘 让更多人关注此文章:

     本文介绍一款结构简单、功能完善的微型BootLoader在Linux系统中的应用。它主要适用于PowerPC e300系列处理器,也能很容易地进行修改,以适应其他嵌入式处理器。

  引言

  引导装载程序(BootLoader)通常是在硬件上执行的第一段代码。虽然目前在Linux开源社区里有大量的引导装载程序,但是对于很多嵌入式设备上的应用来说,这些引导装载程序都显得过于复杂和冗长。为此,本文专门针对PowerPC E300系列处理芯片,设计了一款小型BootLoader程序,并命名为Genesis。该程序结构简单、功能完善,能很好地引导Linux内核以及文件系统。

  环境要求及系统映像

  硬件环境

  本文中开发的硬件环境如下:处理器采用MPC83xx系列;内存采用512M的DDR2内存;闪存采用8MB的闪存;串口采用uart16550;波特率采用115200。

  编译环境

  程序在mvl-linux、linux-kernal-2.6.10和gcc编译器环境下编译。

  系统文件存放映像

  Genesis程序存放在一块闪存里面。对于小型的Linux系统,包括内核和文件系统都和装载引导程序BootLoader一起编译产生二进制文件,最后存放在闪存中,在上电之后搬移到内存执行。图1就是编译产生的系统文件代码在闪存中以及搬移到内存以后的示意图。

  

  图1 系统文件映像

  Genesis的实现

  Genesis的主体结构

  功能完善的引导装载程序BootLoader必须经过以下几个步骤,即:初始化CPU;初始化内存,包括启用内存库、初始化内存配置寄存器等;初始化串行端口(如果在目标板上有的话);启用指令/数据高速缓存;设置堆栈指针;设置参数区域并构造参数结构和标记(这是重要的一步,因为内核在标识根设备、页面大小、内存大小以及更多内容时要使用引导参数);打开/关闭看门狗;调用主体入口函数;跳转到内核的开始。
程序模型的建立

  根据Genesis的主体架构,本文在程序体内分别建立了几个最为重要的code程序:entry.S;board.c;cpu.c;console.c;main.c。这些程序的执行顺序如图2所示。

  

  图2 程序执行顺序示意图

  程序设计

  这里,entry.S是程序的入口。entry.S中的代码全部是汇编指令。整个程序都围绕这些汇编代码展开。

  cpu.c的功能是初始化CPU内核,CPU主要控制器以及系统时钟控制器;board.c主要是初始化跟目标板密切相关的外围设备,包括闪存、CPLD以及系统内存等;console.c是目标板的串口初始化程序,它对CPU的串口进行初始化,并配置串口的速率;main.c的功能就是引导Linux内核以及文件系统。

  当CPU上电或者施加复位信号时,CPU通过读取数据总线D[0:3l]上的值或根据内部的缺省常数D[0:31]=0x00000000,来确定它的状态。如果CPU在读取总线值时,信号引脚RSTCONF#为低电平,则硬件复位配置字(HRCW)从总线上读取;若RSTCONF#为高电平,则HRCW选用内部的默认值。上电后,启动存储控制器CSO#(对应于闪存的片选信号)有效,选中闪存,CPU地址线上输出硬件复位中断向量对应的地址0x00000100,开始读第1条指令。在Genesis中,这条指令对应于entry.S中_start:标号处。代码段如下。

  _start:

  b boot_cold

  boot_cold:

  lis r4, DEFAULT_IMMR_ BASE@h

  nop

  boot_warm:

  mfmsr r5

  lis r3, IMMR_BASE@h

  ori r3, r3, IMMR_BASE@l

  stw r3, IMMR(r4)

  接下来对CPU CORE进行初始化配置。首先是关闭CPU的看门狗。代码如下:

  xor r4, r4, r4

  stw r4, SWCRR(r3)
屏蔽所有的中断寄存器,并初始化高速缓存D-CACHE和I-CACHE:

  .globl icache_enable

  .globl icache_disable

  .globl icache_status

  .globl dcache_enable

  .globl dcache_disable

  .globl dcache_status

  然后使用如下代码重新映射闪存的绝对地址:

  map_flash_by_law1:

  remap_flash_by_law0:

  在CPU内部开放的高速缓存区设置堆栈。未初始化设备外部DRAM之前,只能利用CPU内部的cache作为内存。下一步就可以进入第二阶段的CPU初始化,即C语言环境:

  setup_stack_in_data_cache_on_r1:

  堆栈建立好以后,马上进入步骤S1,它跳转到cpu.c里面的cpu_init()函数。在这段代码里面,配置所有的CPU控制寄存器。在汇编里面调用C函数语句是bl cpu_init。

  当配置结束以后,进入步骤S2,指针返回到entry.S。紧接着执行调用board_init函数,进入步骤S3,跳转到board.c里面,执行board_init()函数。在这个函数里面包括了几个重要部分。

  1)get_clocks()函数

  初始化CPU的PLL和系统时钟寄存器。

  2 ) init_timebase()初始化计数器

  3)初始化串口:serial_init (port,baudrate)

  越早开通串口,对后面的工作越有好处。serial_init()调用的是console.c。对于E300内核的MPC83xx系列处理器,一般都提供两组UART接口,支持RS232、UART16550、HDLC等应用。本文将UART1用作串行输出接口,使用PC16550协议。由于后面很多调试都要依赖调试接口,因此,对串口的配置和初始化是比较重要的。这里主要是注意UART1和UART2的偏移地址分别是0x4500和 0x4600,它们的波特率都是从CSB_CLK时钟分频得到的。

  4) DDR RAM初始化:long int initdram (int board_type)

  这是很重要的一个步骤。如果DDR RAM配置不对,那么后面的工作将无法进行。在目标板上用到了DDR2类型的内存条。这样的设计可以动态调整使用内存的大小,也大大减少对DDR内存的配置工作。一般来说DDR内存条上都有一块eeprom,是存储基本DDR信息的。它提供了标准的I2C接口,供CPU来访问。所以在本系统里,就是通过I2C来读取DDR内存条上的基本信息,然后根据这些信息正确配置CPU的DDR控制器。I2C的驱动很容易在开源代码里面找到,然后根据所使用的CPU稍微修改就可以。

       DDR内存初始化完成以后,进入步骤S4,返回entry.S。然后执行步骤S5,调用main.c里面的函数run_into_ram(),目的是实现代码的搬移。调用entry.S里面的relocate_code()函数,执行步骤S6,将代码从闪存拷贝到DDR RAM里面:global relocate_code。

  拷贝结束以后直接跳转到main()函数:bl main。到这里,CPU和外部基本设备的初始化都完成了。接下来就可以正确引导Linux内核了。利用代码拷贝,将存放于闪存的Linux内核拷贝到DDR RAM里面,然后直接跳转到该地址,开始执行步骤S7。

  copy_code((void *)dest_addr,(void *)img_begin, img_end - img_begin);

  jImage=(void (*)(void))dest_addr;

  (*jImage)();

  在程序流程图里面还有步骤S8、S9。它们分别表示在Genesis和Linux下面执行复位命令时候的指针跳转方向。在复位时,程序都是返回entry.S,然后重新执行。

  结语

  将按照流程设计并编译好的bin文件下载到目标板,经过测试,它能够正确引导Linux内核和文件系统,实现了BootLoader的功能。为了使Genesis的功能更加丰富,还可进行一些补充性的开发,比如增加Genesis命令行编辑;添加设备地址空间的读写命令等。

  参考文献

  1.Programming Environments Manual for 32-Bit Implementations of the PowerPC Architecture, Rev. 3, Copyright 9/2005 by Freescale Semiconductor Corporation

  2.e300 PowerPC Core Reference Manual, Rev. 1, Copyright 8/2005 by Freescale Semiconductor Corporation

  3.MPC8360E PowerQUICC II Pro Integrated Host Processor Family Reference Manual, Rev. 1, Copyright 2006 by Freescale Semiconductor Corporation



相关文章
· 基于ARM920T和嵌入式linux的bootloader设计[41]
· 基于ARM920T和嵌入式linux的bootloader设计[44]
· 基于ARM920T和嵌入式linux的bootloader设计[36]
· 基于ARM的嵌入式Bootloader实现自动升级[32]
· 基于嵌入式Linux的多磁控管电源控制系统设计[63]
热门评论排行
·江苏嵌入式Linux教育培训
·锐极LINUX驱动培训班定于
·VHDL设计中电路简化问题的
·基于实时操作系统μC/OS-
·ARM处理器应用开发4步骤

文章评论
    没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。更多评论
发表评论
  * 请先[登陆]再进行评论,谢谢。
评分: 1分 2分 3分 4分 5分
内容: *
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。
 
热点新闻 [更多]
 
HA11529
“科技奥运与计算机技术的应用”研讨会
性能差异化功率器件制造面临多重挑战
探索中国特色IC业发展新模式
研祥专家做客嵌入式技术网,谈科技奥运
搭建多方交流平台 中国嵌入
Compuware Cha
中华嵌入式人才库正式运营新闻发布会
“科技奥运与计算机技术的应用”研讨会
意法半导体(ST)2007年企业责任
 
热门下载 [更多]
 
[ ] 手把手学单片机20个例
[ ] 单片机做的智能台灯
[ ] 单片机入门书
[ ] linux系统移植开发文档
[ ] IC卡的读写程序
[ ] 8051单片机C语言彻底应用
[ 常用软件] 555定时器电路设计软件V1.2
[ 常用软件] 51定时器计算软件
[ ] ARM处理器应用开发4步骤
[ ] 实用电源电路集锦
 
论坛新帖 [更多]
 
高性能ATMEL 9260核心...
超低价ARM9开发板 475元...
哪里可以买到和LAUTERBA...
一款高端网络芯片介绍...
经典嵌入式培训视频...
[原创]NRF2401 NRF...
需要LM324中文资料...
[求助]大家用过lm331的可...
单片机培训班于7月12日在华北...
重磅资料-------65K色...

 
赞助商 [更多]
 


 

ICP许可证号:[粤 05056597]
联系电话:010-82517432 82517615 传真: 010-82517615

版权所有 Copyright © 2006 嵌入式技术网