OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 急!PowerPC从flash高地址更改至低地址启动问题

共12条 1/2 1 2 跳转至

急!PowerPC从flash高地址更改至低地址启动问题

菜鸟
2007-09-26 09:47:10    评分

我的系统是PowerPC 866, 16M Flash, 32M SDRAM.复位时硬件从数据总线上获取hard reset configurationword,我只需要将bootrom.bin烧写在0xFFF00100的地址上便可以启动.
config.h中的配置如下:
#define LOCAL_MEM_LOCAL_ADRS 0x00000000 /* Base of RAM */
#define LOCAL_MEM_SIZE  0x02000000  /* 32 Mbyte memory available */
#define ROM_BASE_ADRS 0xFF000000  /* base address of ROM */
#define ROM_TEXT_ADRS 0xFFF00100  /* ROM_BASE_ADRS + 0x100 */
#define ROM_SIZE  0x01000000 /* ROM space */

上述配置是将程序烧在FLASH高地址上启动.我现在想把程序放在低地址上启动,也就是0xFF000100.于是我首先想到了更改HRCW.

HRCW中有两个字和启动地址有关:HRCW[IIP]控制异常向量表的初始位置,两种情况0xFFF00100或0x00000100.HRCW[ISB]指示IMMR寄存器的初始值,四种情况0x00000000. 0x00F00000. 0xFF000000. 0xFFF00000.高地址启动时HRCW[IIP]=0xFFF00100, HRCW[ISB]=0xFF000000. 为了能在低地址启动我修改了HRCW[IIP]=0x00000100,并将config.h中的ROM_TEXT_ADRS改为0xFF000100,烧入到0xFF000100无法启动.

请教一下各位PowerPC的更改启动地址是不是更改HRCW[IIP]位?HRCW[ISB]位对它有影响吗?那我要如何配置我的config.h文件.望达人解答啊!




关键词: PowerPC     flash     高地址     地址     更改         

菜鸟
2007-09-30 14:09:12    评分
2楼
把config.h中的ROM_TEXT_ADRS改为0x00000100试试
程序也烧入到0x00000100


HRCW[IIP]确定的地址是启动后第1条指令的地址,此处为0x00000100
HRCW[ISB]确定的IMMR寄存器的初始值可以在rominit.s中更改
(一般BSP里面有个宏定义IMMR修改后的值,如ads860里面就该为0x02200000)
相应的BR,OR也要改


当然,你的Flash, SDRAM,内部双口ram等空间的地址分配不能有重叠!!!!
例如:
#define LOCAL_MEM_LOCAL_ADRS 0xFC000000 /* Base of RAM */
#define LOCAL_MEM_SIZE  0x02000000  /* 32 Mbyte memory available */


#define ROM_BASE_ADRS 0x00000000  /* base address of ROM */
#define ROM_TEXT_ADRS 0x00000100  /* ROM_BASE_ADRS + 0x100 */
#define ROM_SIZE  0x01000000 /* 16M  ROM space */

#define IMMR_BASE_ADRS  0X02200000   //这个宏名字不一定准确

菜鸟
2007-10-08 18:11:53    评分
3楼

我照着做了一下,还不行,感觉程序没起来!CPU不停的在复位


菜鸟
2007-10-10 11:30:15    评分
4楼

修改ROM和RAM基地址后,需要修改BR中的相应位


菜鸟
2007-10-10 13:33:28    评分
5楼
BR相应的值应该改掉了,程序里用的是宏定义

菜鸟
2007-10-19 09:51:12    评分
6楼
可以在CPU的冷复位异常地址(冷启动地址:0xfff00100或者0xff000100)处写一个跳转指令,跳转至你所需要的启动地址,在把异常向量基址(高或者低)设置好。
做完之后,用调试器看一下内容是否与期望的一致。运行的时候,用调试器跟踪调试,看到底哪里出了问题。

菜鸟
2007-10-27 15:51:02    评分
7楼

还要注意
HRCW[ISB]确定的IMMR寄存器的初始值不能为0x0
也就是上电时D7、D8两个脚至少需要拉高一个
我已经做过试验了,和你同样的866小系统,
可以从低位(0x100)正常启动!!(点灯可知)


但是我在启动过程中到了中断初始化的时候出错,正在出差,没有继续查了


菜鸟
2007-10-31 10:23:42    评分
8楼

marker兄你说的方式应该是对,我的程序似乎能启动,只是中间一些初始化出错了。我现在也正在出差,不好调试。等回去好好试试。


菜鸟
2008-04-02 17:20:53    评分
9楼
遇到过这个问题,跟片选有关,BR0上电后缺省值与设置的起动地址有关,起动地址为低(0x00000000)时,CS0就配置到0x0的地址上了,这时候PC指针就也是从0x00000100开始的,到了romInit.s里一旦重新配置了BR0,flash就被配置到高地址了,而PC指针还指向低地址,就出exception了。
解决办法挺巧妙的,
1. 在配置BR0之前,先把OR0配置成覆盖4G空间(前面掩地址的位全是0)
2. 用下面的代码把PC指针跳到flash真实地址
bl      sysSetPCtoFlash

sysSetPCtoFlash的实现:
FUNC_BEGIN(sysSetPCtoFlash)
    mfspr r5, lr
    lis   r6, HIADJ (0xfc000000)
    addi  r6, r6, LO (0xfc000000)  
    or    r5,r5,r6
    mtspr lr, r5
    blr                /* return to caller */
FUNC_END(sysSetPCtoFlash)

3.重新配置OR0到正常值。

当然了,flash的片选应该在配其它片选之前配置。

菜鸟
2008-06-30 18:15:56    评分
10楼
deepinbsp,按照我1楼发的配置方式,我将程序烧到0xff000100, bdi2000 用go 0xff000100指令无法启动,PC停在0xff0001e4。通过调试我确定程序出错的地址在OR0配置的地方。我按照你的方法,加入代码,go 0xff000100真的可以启动。
但是我拔掉BDI2000, 复位,程序又无法启动了,一直在复位,这是什么原因?
硬件复位控制字HRCW[IIP]=0x00000100    HRCW[ISB]=10(D7,D8)

共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]