3874|10

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

2440 stepldr 加载EBOOT,地址问题 [复制链接]

原来的BSP中  stepldr中:
#define LOAD_ADDRESS_PHYSICAL   0x30038000  
main()
{
        ......

  ((PFN_IMAGE_LAUNCH)(LOAD_ADDRESS_PHYSICAL))();
}

这里面的0x30038000 地址,到底是什么地址,按照大小 256,k应该是在读eboot。
#define LOAD_ADDRESS_PHYSICAL   0x30038000
#define LOAD_SIZE_BYTES         0x00040000  //256k
#define LOAD_SIZE_PAGES         (LOAD_SIZE_BYTES / NAND_PAGE_SIZE_BYTES)


那么问题是
从0x0开始,存放的是STEPLDR,只有4K, 那么在0x30001000 ~0x30038000 之间存放的是什么?
如果我把:
#define NAND_BLOCK_SIZE_BYTES   0x00004000
#define NAND_PAGE_SIZE_BYTES    0x00000200  
#define NAND_PAGES_PER_BLOCK    (NAND_BLOCK_SIZE_BYTES / NAND_PAGE_SIZE_BYTES)
中的NAND_BLOCK_SIZE_BYTES  从原来的0x00020000改为0x00004000   (128K到16K)之后
        #define LOAD_ADDRESS_PHYSICAL   0x30038000   
这个地址还对吗?

————————————————————————————————————

stepldr中的startup.s中有:------------------------------------------------------------------------------
; Sleep state constants
;
; Location of sleep data

; BUGBUG - this needs to be declared as a local var.

SLEEPDATA_BASE_PHYSICAL         EQU     0x30028000
WORD_SIZE                                                EQU                0x4
; Sleep State memory locations

SleepState_Data_Start           EQU     (0)
SleepState_WakeAddr             EQU     (SleepState_Data_Start  + 0)
SleepState_MMUCTL               EQU     (SleepState_WakeAddr    + WORD_SIZE)
SleepState_MMUTTB               EQU     (SleepState_MMUCTL      + WORD_SIZE)
SleepState_MMUDOMAIN            EQU     (SleepState_MMUTTB      + WORD_SIZE)
SleepState_SVC_SP               EQU     (SleepState_MMUDOMAIN   + WORD_SIZE)
SleepState_SVC_SPSR             EQU     (SleepState_SVC_SP      + WORD_SIZE)
SleepState_FIQ_SPSR             EQU     (SleepState_SVC_SPSR    + WORD_SIZE)
SleepState_FIQ_R8               EQU     (SleepState_FIQ_SPSR    + WORD_SIZE)
SleepState_FIQ_R9               EQU     (SleepState_FIQ_R8      + WORD_SIZE)
SleepState_FIQ_R10              EQU     (SleepState_FIQ_R9      + WORD_SIZE)
SleepState_FIQ_R11              EQU     (SleepState_FIQ_R10     + WORD_SIZE)
SleepState_FIQ_R12              EQU     (SleepState_FIQ_R11     + WORD_SIZE)
SleepState_FIQ_SP               EQU     (SleepState_FIQ_R12     + WORD_SIZE)
SleepState_FIQ_LR               EQU     (SleepState_FIQ_SP      + WORD_SIZE)
SleepState_ABT_SPSR             EQU     (SleepState_FIQ_LR      + WORD_SIZE)
SleepState_ABT_SP               EQU     (SleepState_ABT_SPSR    + WORD_SIZE)
SleepState_ABT_LR               EQU     (SleepState_ABT_SP      + WORD_SIZE)
SleepState_IRQ_SPSR             EQU     (SleepState_ABT_LR      + WORD_SIZE)
SleepState_IRQ_SP               EQU     (SleepState_IRQ_SPSR    + WORD_SIZE)
SleepState_IRQ_LR               EQU     (SleepState_IRQ_SP      + WORD_SIZE)
SleepState_UND_SPSR             EQU     (SleepState_IRQ_LR      + WORD_SIZE)
SleepState_UND_SP               EQU     (SleepState_UND_SPSR    + WORD_SIZE)
SleepState_UND_LR               EQU     (SleepState_UND_SP      + WORD_SIZE)
SleepState_SYS_SP               EQU     (SleepState_UND_LR      + WORD_SIZE)
SleepState_SYS_LR               EQU     (SleepState_SYS_SP      + WORD_SIZE)
SleepState_Data_End             EQU     (SleepState_SYS_LR      + WORD_SIZE)

SLEEPDATA_SIZE                  EQU     (SleepState_Data_End - SleepState_Data_Start) / 4

最新回复

偶,也来瞧瞧  详情 回复 发表于 2009-10-15 21:12
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
找到这个:; Stack locations.
;
_STACK_BASEADDRESS        EQU 0x30030000 ; (0x3002c000 + 0x00004000)
SVCStack        EQU        (_STACK_BASEADDRESS-0x2800)         ; 0x30030000 - 0x2800 ~
UserStack        EQU        (_STACK_BASEADDRESS-0x3800)        ; 0x30030000 - 0x3800 ~
UndefStack        EQU        (_STACK_BASEADDRESS-0x2400)         ; 0x30030000 - 0x2400 ~
AbortStack        EQU        (_STACK_BASEADDRESS-0x2000)         ; 0x30030000 - 0x2000 ~
IRQStack        EQU        (_STACK_BASEADDRESS-0x1000)        ; 0x30030000 - 0x1000 ~
FIQStack        EQU        (_STACK_BASEADDRESS-0x0)        ; 0x30030000 - 0x0 ~
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
0x30038000 就是内存的物理地址

((PFN_IMAGE_LAUNCH)(LOAD_ADDRESS_PHYSICAL))(); 巧妙使用直接就回跳转到0x30038000 运行了。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
按地址来说应该是bank6:
start address:0x3000_0000
end  address:0x33ff ffff
共64MB?
那内存的物理起始地址应该是 0x3000_0000?

如果我现在的nandflash的block是16K的,  那么原来的那个
#define LOAD_ADDRESS_PHYSICAL  0x30038000
会受的影响吗
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
那内存的物理起始地址应该是 0x3000_0000?
——当然了,

和nand flash有什么关系?
我觉得楼主还是多和硬件工程师沟通讨论。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
((PFN_IMAGE_LAUNCH)(LOAD_ADDRESS_PHYSICAL))
0x30038000 这个地址是怎么确定的
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 trueman_onlyme 的回复:
((PFN_IMAGE_LAUNCH)(LOAD_ADDRESS_PHYSICAL))
0x30038000 这个地址是怎么确定的


自己定的,只要不要和你的bib的一些东西相冲突,重叠就可以了。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
按照stepldr的读操作
我把EBOOT烧写在nandflash的第2块应该就可以了吧!

那个0x30038000 地址是ram的地址,跟nand没关系!
应该是这样:
}
   
    nBadBlocks = 0;
    for (nPage = NAND_COPY_PAGE_OFFSET ; nPage < (LOAD_SIZE_PAGES + NAND_COPY_PAGE_OFFSET) ; nPage++)
    {
        nBlock = ((nPage / NAND_PAGES_PER_BLOCK) + nBadBlocks);//从第二块开始,遇到坏块就跳过

        if (!NF_ReadPage(nBlock, (nPage % NAND_PAGES_PER_BLOCK), pCopyPtr))
        {
            if ((nPage % NAND_PAGES_PER_BLOCK) != 0)
            {
                Led_Display(0x9);    // real ECC Error.

                // Spin forever...
                while(1)
                {
                }
            }

这个读操作就是把第2块开始的,大小为#define LOAD_SIZE_BYTES        0x00040000  //256k  的东西,也就是EBOOT,copy到ram中地址为0x30038000的地方,  copy操作完成之后,就用
((PFN_IMAGE_LAUNCH)(LOAD_ADDRESS_PHYSICAL))();
   从RAM的0x30038000出开始执行!
至于这个地址,应该是在一些配置文件中如  BIB   中设置的吧!

 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
按照stepldr的读操作
我把EBOOT烧写在nandflash的第2块应该就可以了吧!

那个0x30038000 地址是ram的地址,跟nand没关系!
应该是这样:
}
   
    nBadBlocks = 0;
    for (nPage = NAND_COPY_PAGE_OFFSET ; nPage < (LOAD_SIZE_PAGES + NAND_COPY_PAGE_OFFSET) ; nPage++)
    {
        nBlock = ((nPage / NAND_PAGES_PER_BLOCK) + nBadBlocks);//从第二块开始,遇到坏块就跳过

        if (!NF_ReadPage(nBlock, (nPage % NAND_PAGES_PER_BLOCK), pCopyPtr))
        {
            if ((nPage % NAND_PAGES_PER_BLOCK) != 0)
            {
                Led_Display(0x9);    // real ECC Error.

                // Spin forever...
                while(1)
                {
                }
            }

这个读操作就是把第2块开始的,大小为#define LOAD_SIZE_BYTES        0x00040000  //256k  的东西,也就是EBOOT,copy到ram中地址为0x30038000的地方,  copy操作完成之后,就用
((PFN_IMAGE_LAUNCH)(LOAD_ADDRESS_PHYSICAL))();
   从RAM的0x30038000出开始执行!
至于这个地址,应该是在一些配置文件中如  BIB   中设置的吧!

 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

10
 
改了之后EBOOT起不来?
PLLVAL      EQU     (((0x5c << 12) + (0x1 << 4) + 0x1))        ; 2440A  399MHz
------
  ldr     r0, = MPLLCON                   ; Configure MPLL
                                                ; Fin=16MHz, Fout=399.65MHz
        ldr     r1, = PLLVAL
        str     r1, [r0]

        ldr     r0, = UPLLCON                   ; Fin=16MHz, Fout=48MHz
        ldr     r1, = ((0x3c << 12) + (0x4 << 4) + 0x2)                ; 16Mhz
;                ldr     r1, = ((0x38 << 12) + (0x2 << 4) + 0x2)          ; 12Mhz
        str     r1, [r0]

我的晶振是12MHZ的
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

11
 
偶,也来瞧瞧
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表