共1条
1/1 1 跳转至页
MPC860上电初始化流程分析(老站转)
嵌入开发网
工程师
来自:
发表总数:41
查看 短消息 电子邮件 引用 回复
--------------------------------------------------------------------------------
MPC860上电初始化流程分析
【复位向量】
860复位后,执行的第一条指令位于4GB地址空间的什么地方?
对于PowerPC,复位也是一种异常(你可以理解为CPU自己产生的中断),向量号为0x100。异常向量表的基地址加上复位向量号即为复位向量,也就是CPU开始执行指令的地方。异常向量表在内存空间的可能位置有2个:0x00000000和0xFFF00000。具体是哪一个由MSR寄存器的IP位指定:若IP位为0,则异常向量表在0x0处,否则在0xFFF00000处。860有多种复位方式,对于hard reset,MSR的IP位由硬件配置字的IIP(Initial Interrupt Prefix)位决定。
所以PowerPC的复位向量为0x100或者0xFFF00100。以下我们假定0xFFF00100。
【硬件配置字】
TBD
【Flash Memory】
假设有128K字节的Flash,并打算把它映射到CPU内存空间的0xFE000000开始的地方。但由于复位向量为0xFFF00100,那么怎么才能让CPU从Flash中偏移0x100的地方开始执行指令呢?
860内嵌的memory controller有个引脚,#CS0,称为global boot chip select,一般把它连接到Flash或EPROM的片选上。假定这128K Flash是8位数据宽度,地址线A16..0分别连接到860的A15..A31(注意A31为860地址线的最低位),数据线D0..7分别和860的D0..7相连。再看控制#CS0的BR0和OR0寄存器,CPU复位后,BR0.V=1(Valid)且BR0.BA[0..16]=0,OR0.AM[0..16]=0。由于地址掩码AM位全为0,意味内存控制器会忽略所有参与片选逻辑的地址线A0..A16,所以产生的#CS0总是有效的。这样,上电后Flash总会被选中。CPU从Flash偏移0x100的地方取指令。这个结果和复位向量表基地址,以及以后Flash映射到CPU内存空间的什么位置都是无关的。
以上结果还有一个现象,就是复位后,CPU的4GB内存空间内都是Flash。4GB空间的每个128K的块都被映射到Flash。原因用一句话概括:Flash只使用了32位地址线的低17根,且缺省地被选中。
【VxWorks初始化】
/* romInit.s - Motorola 860mbx ROM initialization module */
/* Copyright 1984-1998 Wind River Systems, Inc. */
/* Copyright 1997,1998 Motorola, Inc. All Rights Reserved */
.data
■ 定义数据段。
.globl copyright_wind_river
.long copyright_wind_river
■ 申明(declare)全局变量_copyright_wind_river并使用它定义一个新变量。
■ 注意”.globl”是申明而非定义。”_copyright_wind_river”变量在Tornado的库(对于MPC860,为[Tornado]/target/lib/libPPC860gnuvx.a)中的一个模块copyright.o中定义。
■ ”.long”定义一个32-bit的全局变量(没有变量名),变量的初始值为_copyright_wind_river的值(还是地址?)。由于在Makefile中规定了romInit.o为第一个链接的模块,所以这个无名变量将出现在数据段的最开始。
■ 不清楚_copyright_wind_river的用途,以及这个无名变量的用途。
#define _ASMLANGUAGE
■ 定义_ASMLANGUAGE。GNU汇编器GAS看到这个定义后,会按照C的语法进行预处理,所以GAS预处理器能够认识C头文件中定义的类型和宏(?)。如果不定义_ASMLANGUAGE,以下的#include语句将无法编译。
#include "vxWorks.h"
#include "asm.h"
#include "cacheLib.h"
#include "config.h"
#include "regs.h"
#include "sysLib.h"
#include "drv/multi/ppc860Siu.h"
.globl _romInit
.globl romInit
.extern romStart
.extern mbxI2cConfigParamsGet
.extern mbxI2cMemcConfig
.text
.align 2
/******************************************************************************
* romInit - entry point for VxWorks in ROM
*/
_romInit:
romInit:
■ 同时定义_romInit和romInit的原因是,有些编译器产生的对外部符号的调用不加下划线(?),而有些加。
bl cold
bl start
■ 若是热启动,则跳转到start。激活热启动的代码将跳转到romInit+4处。注意PowerPC的所有指令都占4字节(32位)。
/* copyright notice appears at beginning of ROM (in TEXT segment) */
.ascii "Copyright 1984-1997 Wind River Systems, Inc."
.align 2
■ 以上定义的版权申明字符串将出现在代码段中。
■ 不清楚这个字符串的作用。
cold:
li r3, BOOT_COLD /* r3 = BOOT_COLD */
lis r4, HIADJ(start)
addi r4, r4, LO(start) /* r4 = @start */
lis r5, HIADJ(romInit)
addi r5, r5, LO(romInit) /* r5 = @romInit */
lis r6, HIADJ(ROM_TEXT_ADRS)
addi r6, r6, LO(ROM_TEXT_ADRS) /* r6 = ROM_TEXT_ADRS */
sub r4, r4, r5 /* r4 = r4 – r5 */
add r4, r4, r6 /* r4 = r4 + r6 */
■ 计算start在Flash中的位置,为:start-romInit+ROM_TEXT_ADRS。并跳转到这个位置(下面)。为什么要这样?
■ 由前面的分析可知,CPU从0xFFF00100启动;由于在CPU看来,全部的4GB空间中的每个128K的块都被映射到了Flash,所以0xFFF00100这个地址仍在Flash的偏移0x100处。这是起始状态,但不可能真的就把全部4GB空间都给Flash,在以后的初始化中,必定要把RAM,IMMR和外设等也要映射进来。做这些之前,需要把Flash的位置固定一下,比如映射到0xFE000000;方法是写OR0和BR0寄存器。但在写OR0时,CPU还在从0xFFF00000的那一块取指令,而Flash就要被映射到0xFE000000块,所以程序必定跑飞掉。所以,要对程序计数器(PC)进行调整。然而PC指针对程序员是不可见的,我们打算用跳转指令修改它。
■ 不能直接跳转到start处,必须自己计算地址。为何?在链接时,我们曾指示ld将代码段定位于RAM_HIGH_ADRS(bootrom;对vxWorks_rom是RAM_LOW_ADRS;参考相关的Makefile)。在我们的例子里RAM_HIGH_ADRS=0x00200000,即2M的地方。毕竟大部分代码还要在RAM中执行,是吧!现在的问题在于romInit也在代码段中,但它是从ROM中执行的(0xFE000100),而不是在连接器假定的位置执行的。对连接器而言,符号romInit和start的值都是假定了程序在RAM中。可以想象,对链接器而言,romInit=0x00200100,指向RAM区。同样start也指向RAM区。欲得到start在ROM中的位置,计算方法就是start-romInit+ROM_TEXT_ADRS,其中ROM_TEXT_ADRS=0xFE000100。
■ 以上代码叫PIC(Position Independent Code)。在程序将自身拷贝到RAM之前,需要注意。
■ 另外一个结论是,ROM映射到CPU地址空间何处都可以,只要不和其它东西冲突。
mtspr LR, r4
blr /* jump to flash mem adress */
■ 把r4值放入LR寄存器,利用blr跳转到LR指定的地址。
start:
(略)
■ 以下进行系统初始化工作,包括:
初始化CPU核心寄存器;
禁止cache;
初始化IMMR;
初始化SIU;
初始化时钟和中断控制寄存器;
初始化CPM;
初始化UPM。等等。
仅供参考。
vxfree@sina.com
※ 作 者: vxfree 02-3-2 下午 10:04:14 ※
sunlong
工程师
来自:
发表总数:12
查看 短消息 电子邮件 引用 回复
--------------------------------------------------------------------------------
谢谢你的分析,能不能再提供一些启动的分析资料,如解压缩的过程,另外能不能详细讲讲MPC860与外部存储器的映射关系、UPM表等?
先谢谢大侠了。
关键词: MPC860 上电 初始化 流程 分析 老站转 复
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |