s5pv210 uboot 源码分析 笔记版 转载请注明出处---crosskernel@gmail.com

本文详细解析了U-Boot在S5PV210平台上的启动过程,包括BL1阶段如何从SD卡读取U-Boot镜像,并将其复制到内存中;介绍了MMU的启用及内存布局设置,以及如何跳转到U-Boot主程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Uboot二进制镜像分析:


在文件board/samsung/smdkc110/config.mk里面定义了uboot的基地址:
TEXT_BASE = 0xc3e00000


在文件board/samsung/smdkc110/u-boot.lds里面定义了uboot链接格式:


OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;


. = ALIGN(4);
.text      :
{
 cpu/s5pc11x/start.o(.text)
 cpu/s5pc11x/s5pc110/cpu_init.o(.text)
 board/samsung/smdkc110/lowlevel_init.o(.text)
          cpu/s5pc11x/onenand_cp.o      (.text)                 
          cpu/s5pc11x/nand_cp.o (.text)                     
          cpu/s5pc11x/movi.o (.text) 
          board/samsung/smdkc110/flash.o (.text) 
          common/secure.o (.text) 
 common/ace_sha1.o (.text)
 cpu/s5pc11x/pmic.o (.text)
 *(.text)
}

}








S5pv210如果设置从SD卡启动,则IROM先探测channel 0和后探测channel 2,从中读取有效BL1(uboot的BL1跟Uboot是在一个文件里,对于wince eboot和bl1是分开的两个文件)。


BL1的分析


typedef u32(*copy_sd_mmc_to_mem)
void movi_bl2_copy(void)
{
ulong ch;
#if defined(CONFIG_EVT1)


//0xD0037488是位于IRAM的地址,尽管没有文档说明,但是,显然IROM把从channel 0还是channel 2启动的信息放在了0xD0037488
ch = *(volatile u32 *)(0xD0037488);
//BL1这么小显然没有实现SD驱动,但是IROM实现了SD驱动,而且把使用SD驱动拷贝的函数放在了地址(0xD0037F98),将函数指针copy_sd_mmc_to_mem copy_bl2指向这里。
copy_sd_mmc_to_mem copy_bl2 =
   (copy_sd_mmc_to_mem) (*(u32 *) (0xD0037F98));

#else

#endif
u32 ret;
// channel 0是启动盘
if (ch == 0xEB000000) {
//把uboot拷进DDR2内存
ret = copy_bl2(0, MOVI_BL2_POS, MOVI_BL2_BLKCNT,
CFG_PHY_UBOOT_BASE, 0);

}
// channel 2是启动盘
else if (ch == 0xEB200000) {
//把uboot拷进DDR2内存
ret = copy_bl2(2, MOVI_BL2_POS, MOVI_BL2_BLKCNT,
CFG_PHY_UBOOT_BASE, 0);

}
else
return;



}








跳入uboot的准备
Uboot代码使用的是虚拟地址,首先要把mmu打开,mmu_table在uboot_smdkv210/board/samsung/smdkc110/lowlevel_init.S里面,以静态数组的形式定义,其中虚拟地址:0xC000_0000 -- 0xC7FF_FFFF 映射到DDR2的起始地址,其中注释里面指出映射到0x30000000并不全对,如果是DDR2物理地址在0x30000000的board,的确是这样。但是DDR2物理地址在0x20000000的board被映射到0x20000000,注释有误。




after_copy:


#if defined(CONFIG_ENABLE_MMU)
enable_mmu:
/* enable domain access */
ldr r5, =0x0000ffff
mcr p15, 0, r5, c3, c0, 0@load domain access register


/* Set the TTB register */
ldr r0, _mmu_table_base
ldr r1, =CFG_PHY_UBOOT_BASE
ldr r2, =0xfff00000
bic r0, r0, r2
orr r1, r0, r1
mcr p15, 0, r1, c2, c0, 0


/* Enable the MMU */
mmu_on:
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #1
mcr p15, 0, r0, c1, c0, 0
nop
nop
nop
nop
#endif


skip_hw_init:
/* Set up the stack   */
stack_setup:
#if defined(CONFIG_MEMORY_UPPER_CODE)
ldr sp, =(CFG_UBOOT_BASE + CFG_UBOOT_SIZE - 0x1000)
#else
ldr r0, _TEXT_BASE/* upper 128 KiB: relocated uboot   */
sub r0, r0, #CFG_MALLOC_LEN/* malloc area                      */
sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */
#if defined(CONFIG_USE_IRQ)
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12/* leave 3 words for abort-stack    */


#endif


clear_bss:
ldr r0, _bss_start/* find start of bss segment        */
ldr r1, _bss_end/* stop here                        */
mov r2, #0x00000000/* clear                            */


clbss_l:
str r2, [r0]/* clear loop...                    */
add r0, r0, #4
cmp r0, r1
ble clbss_l
//从这里跳入uboot
ldr pc, _start_armboot
//这里放着uboot的入口地址
_start_armboot:
.word start_armboot



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值