b159 发表于 2011-11-1 15:55:11

求救:S3C2440从NANDFLASH启动

若代码小于4K,则代码直接就可以在S3C2440内部的RAM运行.
若代码大于4K,则需 从nandflash中copy代码至外扩的SDRAM中,再在SDRAM中运行.

这copy代码是怎样个过程啊?

是不是将保存在nandflash中4K以后的代码复制至SDRAM中,前4K由硬件拷贝至SRAM里?

那复制完之后,跳到SDRAM的0x30000000处开始运行,此地址(0x30000000)的内容是不是 为main()的入口地址?

springhsq 发表于 2011-11-2 22:33:57

当配置为nandflash启动,则硬件负责nandflash里的前4K代码拷贝到内部RAM里(此内部RAM映射为从地址0开始),拷贝完成后跳到地址0开始运行程序。此程序怎么运行取决与程序员编写的代码。是否跳到其他地址运行取决于程序员怎么编写程序。

abcrazy 发表于 2011-11-4 10:17:35

0x3000_0000这个地址是Bank6的起始地址,你如果把SDRAM放在这,那么就可以访问这个地址.
为了方便描述,假定你NAND的前4K程序为程序1, 被引导的程序为程序2.
main的入口地址是取决于程序员的,假如你的程序1代码负责把NAND中的其他代码拷贝到0x3000_0000处, 那你就可以直接跳转到0x3000_0000处开始运行.
但是你要注意,你编写的程序2的代码里配置的绝对地址(ROM和RAM的地址)要与这个运行的地址匹配, 否则运行会不正确.

tcc89xxevb 发表于 2011-11-4 13:05:47

前4K是直接MAP到内存只的,这时这4K代码就能直接执行,大于4K由于没有MAP到内存中,是在NAND中的,在NAND中不能执行代码,必需由前4K代码中有一个函数把后4K拷到内存中,然后跳到这个入口来执行.

b159 发表于 2011-11-15 10:12:35

回复【1楼】springhsq
-----------------------------------------------------------------------
来自韦东山的启动代码

        ldr r0,=0x53000000 ;watchdog地址
        mov r1,#0x0
        str r1,

        ldr sp,=1024*4                        ;须先设置堆栈,才可以调C函数
       

        blclk_init
        bl         GPIO_Init
        bl        lcd_init       
        blmemsetup
        blcopy_steppingstone_to_sdram   ; 从steppingstone的地址为0处开始复制的.

    ldr pc,=on_sdram

on_sdram
       
        msr cpsr_c,#0xdf                        ;系统模式
    ldr   sp, =0x34000000      ; @设置栈
    ldr   lr, =halt_loop         ; @设置返回地址
    ldr   pc, =main            ; @b指令和bl指令只能前后跳转32M的范围,所以这里使用向pc赋值的方法进行跳转
halt_loop
        b       halt_loop
        end


执行的结果就是一直重复拷贝过程,没有跳至main中执行;(使用keil 环境编译的)

guoyuan 发表于 2011-11-15 22:10:13

这个要想深入理解啊
只有一个硬道理:看源码
会遇到很多问题,不过大多网上都有答案,这个过程完后会有收获的!

b159 发表于 2011-11-16 09:59:56

回复【3楼】tcc89xxevb
-----------------------------------------------------------------------

把后4K拷到内存SDRAM中,是怎样跳到这个入口来执行?????

ldr pc,=on_sdram   ///执行这个,是不是就是跳到SDRAM了
   
on_sdram   

msr cpsr_c,#0xdf   
    ldr   sp, =0x34000000      
    ldr   lr, =halt_loop         
    ldr   pc, =main            ;这个是不是就会跳到SDRAM中的MIAN函数
halt_loop
b       halt_loop


实际运行的结果:没有跳至MAIN函数而是停止:

怎么进不了MAIN函数啊????

BloathX 发表于 2011-11-16 10:11:59

是的,用ldr跳到绝对地址
如果是裸机我记得是靠着ADS的R0,RW设置来确定复制位置
uboot的话靠着text_base确定复制位置

w32067989 发表于 2011-11-17 11:24:33

你是在MDK还是ADS下的

lydiaben 发表于 2011-11-17 14:50:24

回复【4楼】b159
回复【1楼】springhsq
-----------------------------------------------------------------------
来自韦东山的启动代码
        ldr r0,=0x53000000 ;watchdog地址
        mov r1,#0x0
        str r1,
        ldr sp,=1024*4                        ;须先设置堆栈,才可以调c函数
       
        blclk_init
        bl         gpio_init
        bl        lcd_init       
        blmemsetup
        blcopy_steppingstone_to_sdram   ; 从steppingstone的地址为0处开始复制的.
    ldr pc,=on_sdram

on_sdram
       
        msr cpsr_c,#0xdf                        ;系统模式
    ldr   sp, =0......
-----------------------------------------------------------------------

scatter文件有没有检查一下,里面的ro和rw段的地址有没有设置正确

b159 发表于 2011-11-18 19:50:44

回复【8楼】w32067989
----------------------------------------------------------------------


不是ADS,是keil uVision 4

谢谢!!!

b159 发表于 2011-11-19 17:46:57

在linux下,使用交叉编译工具,代码已能够正常运行!!!!

谢谢各位!!
页: [1]
查看完整版本: 求救:S3C2440从NANDFLASH启动