This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

求助:关于AM335X的U-BOOT代码拷贝到SDRAM的问题。



你好!

        我用的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,难度还挺大的,如果有,能否给个链接?

不好意思,接触这个不太久,比较菜,有什么地方错了,还请谅解。。。