你好!
我用的u-boot,是ti网上下载的”u-boot-2013.01.01-psp06.00.00.00“的版本。我用的是从SD卡启动,对于AM335X,知道MLO是在内部RAM运行,而u-boot.img是在外部SDRAM运行, 那么MLO里面应该有拷贝u-boot.img到SDRAM的代码,我查阅了一下:
在MLO的代码里,如果我用sd启动,那么在"/driver/mmc/spl_mmc.c"里面,函数spl_mmc_load_image(void)是不是实现了代码从SD卡拷贝到SDRAM动作(因为在spl_mmc_load_image(void)里面,调用了file_fat_read(CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME,(u8 *)spl_image.load_addr,0),其中 CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME = "u-boot.img", spl_image.load_addr = 0x80800000),接着MLO里调用 jump_to_image_no_args(spl_image_info *spl_image) (路径:/common/spl/spl.c), 在这个函数里面,调用了 image_entry((u32 *)boot_params_ptr_addr) ( (其中:image_entry = 0x80800000).),跳转到外部SDRAM运行,不知我的理解是不对的?
倘若前面的理解是正确的,那么,在u-boot.img的board_init_f ( 路径:arch/arm/lib/board.c) 里面,调用relocate_code ,做代码重新定位,把代码定位到0x8fb4c000,这又有什么作用。
我在u-boot下,分别用go 命令执行对应地址的程序,得出如下结果:
1. 从0x80800000开始执行:
go 0x80800000
## Starting application at 0x80800000 ...
U-Boot 2013.01.01 (Feb 11 2014 - 10:21:13)
U-Boot code: 80800000 -> 80851A94 BSS: -> 80CA3DF0
I2C: ready
monitor len: 004A3DF0
ramsize: 10000000
TLB table from 8fff0000 to 8fff4000
Top of RAM usable for U-Boot at: 8fff0000
Reserving 4751k for U-Boot at: 8fb4c000
Reserving 1152k for malloc() at: 8fa2c000
Reserving 32 Bytes for Board Info at: 8fa2bfe0
Reserving 128 Bytes for Global Data at: 8fa2bf60
New Stack Pointer is: 8fa2bf50
RAM Configuration:
Bank #0: 80000000 256 MiB
relocation Offset is: 0f34c000
gd->relocaddr = 8fb4c000
gd->start_addr_sp = 8fa2bf50
the code in board_init_f() is end, will return to crto.s
(接下去打印的信息,同启动u-boot.img一样,在此处省略)。
2. 从 0x8fb4c000 处开始执行:
go 0x8fb4c000
## Starting application at 0x8FB4C000 ...
U-Boot 2013.01.01 (Feb 11 2014 - 10:21:13)
U-Boot code: 80800000 -> 80851A94 BSS: -> 80CA3DF0
I2C: ready
monitor len: 004A3DF0
ramsize: 10000000
TLB table from 8fff0000 to 8fff4000
Top of RAM usable for U-Boot at: 8fff0000
Reserving 4751k for U-Boot at: 8fb4c000
Reserving 1152k for malloc() at: 8fa2c000
Reserving 32 Bytes for Board Info at: 8fa2bfe0
Reserving 128 Bytes for Global Data at: 8fa2bf60
New Stack Pointer is: 8fa2bf50
RAM Configuration:
Bank #0: 80000000 256 MiB
relocation Offset is: 0f34c000
gd->relocaddr = 8fb4c000
gd->start_addr_sp = 8fa2bf50
the code in board_init_f() is end, will return to crto.s
undefined instruction
pc : [<9ee99a74>] lr : [<9ee99808>]
sp : 8fa2bf50 ip : 8fa2bfe0 fp : 8fa2c668
r10: 00000002 r9 : 00000000 r8 : 8fa2bf60
r7 : 8fb9e490 r6 : 8fb4c000 r5 : 8fa2bf60 r4 : 8fa2bf50
r3 : 8fb72d2c r2 : 8fb4c000 r1 : 8fa2bf60 r0 : 8fb4c000
Flags: Nzcv IRQs off FIQs on Mode SVC_32
Resetting CPU ...
resetting ...
U-Boot SPL 2013.01.01 (Feb 11 2014 - 10:21:13)
(接下去打印的内容,同系统复位以后,从MLO开始执行,在执行u-boot.img的内容一样,在此处省略)。
从上面两个打印内容,是不是可以看出,其实在0x8fb4c000其实也是有应用代码的,而且从打印的内容可以判断,在0x8fb4c000处的代码也是u-boot.img,只是在执行完board_init_f ( 路径:arch/arm/lib/board.c),返回_main(路径:arch/arm/lib/crto.s) ,在里面,出现了问题,致使系统复位,从MLO开始执行。
OK,那么,想问下:
1. 上面理解的MLO拷贝代码u-boot.img到外部SDRAM的流程,是否正确?(上文黄色背景的内容)。
2. 为什么需要执行代码重新定位,把代码重新拷贝到0x8fb4c000,在MLO里面不是已经把u-boot.img解压到0x80800000地址了吗,为什么在u-boot.img里面,还需要调用relocate_code把代码重新定位到0x8fb4c000上呢?
3. ti有没有详细介绍这个的文档?对于像我这种新手,要搞懂对应IC的u-boot,难度还挺大的,如果有,能否给个链接?
不好意思,接触这个不太久,比较菜,有什么地方错了,还请谅解。。。