用户中心

资讯 > 自动化软件

基于PowerPC的微型BootLoader在Linux中的应用

作者:陈士斌2008.01.07阅读 2731

  引言

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

  环境要求及系统映像

  硬件环境

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

  编译环境

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

  系统文件存放映像

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

示意图。

基于PowerPC的微型BootLoader在Linux中的应用如图

图1 系统文件映像

  Genesis的实现

  Genesis的主体结构

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

  程序模型的建立

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

基于PowerPC的微型BootLoader在Linux中的应用如图

图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_ca

版权声明:版权归控制工程网所有,转载请注明出处!
继续阅读

频道推荐

关于我们

控制工程网 & CONTROL ENGINEERING China 全球工业控制、自动化和仪器仪表领域的先锋媒体

CE全球

联系我们

商务及广告合作
任小姐(北京)                 夏小姐(上海)
电话:010-82053688      电话:18616877918
rendongxue@cechina.cn      xiashuxian@cechina.cn
新闻投稿:王小姐

关注我们的微信

关于我们 | 网站地图 | 联系我们
© 2003-2020    经营许可编号:京ICP证120335号
公安机关备案号:110102002318  服务热线:010-82053688