uboot的配置

uboot源码的顶层目录下:

#make smdkv210single_config

Configuring for smdkv210single board...

 

 

Makefile文件中的配置入口:

 

smdkv210single_config : unconfig

@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110

@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/smdkc110/config.mk

 

二、配置过程完成三个工作

1、unconfig

   将上一次的配置全部删除

 

   @rm -f $(obj)include/config.h $(obj)include/config.mk \

$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \

$(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep \

$(obj)board/$(VENDOR)/$(BOARD)/config.mk

   问题1:

   @ --->在Makefile中,引用shell命令时,shell命令前面加一个@,--->取消回显

 

2、@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110

  调用一个shell脚本文件,并向该脚本文件传递参数,这些参数是用来描述一个硬件平台的具体信息(cpu架构、cpu型号、板子名称、厂家...)。

  根据这些参数信息,对源码进行配置,使源码应用于某一个具体平台。

 

$(MKCONFIG) ----> MKCONFIG := $(SRCTREE)/mkconfig  <---shell脚本

 

mkconfig脚本中:

  $0 = mkconfig

  $1 = smdkv210single

  $2 = arm

  $3 = s5pc11x

  $4 = smdkc110

  $5 = samsung

  $6 = s5pc110

 

  mkconfig文件中,所做的工作:

  1)输出一个提示信息:

    echo "Configuring for ${BOARD_NAME} board..."

 

  2)做一个连接asm->asm-arm   //指向cpu架构

cd ./include

rm -f asm

ln -s asm-$2 asm

 

  3)做一个连接asm-arm/arch->arch-s5pc110   //没有作用

        rm -f asm-$2/arch

        ln -s ${LNPREFIX}arch-$6 asm-$2/arch

 

  4) 创建连接文件:regs.h->s5pc110.h  //指向cpu

                   asm-arm/arch->arch-s5pc11x

 

if [ "$3" = "s5pc11x" ] ; then

         rm -f regs.h

         ln -s $6.h regs.h

         rm -f asm-$2/arch

         ln -s arch-$3 asm-$2/arch

fi

  

  5)创建连接asm-arm/proc->proc-armv

if [ "$2" = "arm" ] ; then

rm -f asm-$2/proc

ln -s ${LNPREFIX}proc-armv asm-$2/proc

fi

 

   6)config.mk文件中写入硬件平台的信息

echo "ARCH   = $2" >  config.mk

echo "CPU    = $3" >> config.mk

echo "BOARD  = $4" >> config.mk

[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk

[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk

   

   7)创建一个头文件 config.h

      在该头文件中加入:

#include <configs/smdkv210single.h>

echo >> config.h

echo "/* Automatically generated - do not edit */" >>config.h

echo "#include <configs/$1.h>" >>config.h

 

 

3.@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/smdkc110/config.mk

 

TEXT_BASE:代码段的基地址,0xc3e00000 --->虚拟地址,实际使用过程中,MMU将0xc3e00000转换成物理地址0x33e00000

 

uboot在链接的时候,就代码链接到TEXT_BASE地址上。

 

 

/*****************************************************************************/

一、如何找到uboot的入口点

分析连接文件:u-boot-samsung-dev/board/samsung/smdkc110/u-boot.lds

 

OUTPUT_ARCH(arm)

ENTRY(_start) //入口程序

SECTIONS

{

. = 0x00000000;

 

. = ALIGN(4); //4字节对齐

.text      : //代码段

{

  cpu/s5pc11x/start.o (.text) //第一个执行的源文件:start.S

  cpu/s5pc11x/s5pc110/cpu_init.o (.text)

  board/samsung/gec210/lowlevel_init.o (.text)

          cpu/s5pc11x/onenand_cp.o      (.text)                 

          cpu/s5pc11x/nand_cp.o (.text)                     

          cpu/s5pc11x/movi.o (.text)

          common/secure_boot.o (.text)

  common/ace_sha1.o (.text)

  cpu/s5pc11x/pmic.o (.text)

  *(.text)

}

 

. = ALIGN(4);

.rodata : { *(.rodata) }

 

. = ALIGN(4);

.data : { *(.data) }

 

. = ALIGN(4);

.got : { *(.got) }

 

__u_boot_cmd_start = .;

.u_boot_cmd : { *(.u_boot_cmd) }

__u_boot_cmd_end = .;

 

. = ALIGN(4);

.mmudata : { *(.mmudata) }

 

. = ALIGN(4);

__bss_start = .;

.bss : { *(.bss) }

_end = .;

}

 

 

找到uboot的入口:

cpu/s5pc11x/start.S中的一个_start的子程序

二、uboot的启动流程:

1、入口(start.S --> _start)

_start: b reset

 

2、跳转到reset

reset:

/*

 * set the cpu to SVC32 mode and IRQ & FIQ disable

 */

msr cpsr_c, #0xd3 @ I & F disable, Mode: 0x13 - SVC

3、cache初始化

bl disable_l2cache

bl set_l2cache_auxctrl_cycle

bl enable_l2cache

 

4、通过读取寄存器,得到210的启动方式

  /* Read booting information */

    ldr r0, =PRO_ID_BASE

    ldr r1, [r0,#OMR_OFFSET]

    bic r2, r1, #0xffffffc1  //r2=OM[5:1]

cmp r2, #0x2 @ 2KB 5-cycle

moveq r3, #BOOT_NAND  //r3=启动方式的值

ldr r0, =INF_REG_BASE

str r3, [r0, #INF_REG3_OFFSET]

ldr r0, =INF_REG_BASE

str r3, [r0, #INF_REG3_OFFSET] //将r3的值保存到一个寄存器中

 

5、bllowlevel_init 底层的硬件初始化(lowlevel_init.S)

   关闭看门狗

   bl system_clock_init  //时钟

   bl mem_ctrl_asm_init //DDR2内存

   bl uart_asm_init //串口  输出'O'

   bl tzpc_init

   bl nand_asm_init

   //输出‘K’

   

6、 进入nand_boot(start.S)  

   ldr r0, =INF_REG_BASE

ldr r1, [r0, #INF_REG3_OFFSET]

cmp r1, #BOOT_NAND /* 0x0 => boot device is nand */

beq nand_boot

   

nand_boot:

mov r0, #0x1000

bl copy_from_nand  //将BL2 copy到内存的0x33e00000

b after_copy

7、bafter_copy

   MMU初始化(memory management unit)

   初始化stack

   BSS段清0

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

 

8、跳转到start_armboot

ldr pc, _start_armboot

 

_start_armboot:

.word start_armboot

 

----------------------------------前面是BL1(stage1),后面是BL2(stage2)--------------------------------------------

9、板子信息的初始化

void start_armboot (void)  //公共的代码

{

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {

if ((*init_fnc_ptr)() != 0) {

hang ();

}

}

init_fnc_t *init_sequence[] = {

cpu_init, /* basic cpu dependent setup */

#if defined(CONFIG_SKIP_RELOCATE_UBOOT)

reloc_init, /* Set the relocation done flag, must

   do this AFTER cpu_init(), but as soon

   as possible */

#endif

board_init, /* basic board dependent setup */

interrupt_init, /* set up exceptions */

env_init, /* initialize environment */

init_baudrate, /* initialze baudrate settings */

serial_init, /* serial communications setup */

console_init_f, /* stage 1 init of console */

display_banner, /* say that we are here */

#if defined(CONFIG_DISPLAY_CPUINFO)

print_cpuinfo, /* display cpu info (and speed) */

#endif

#if defined(CONFIG_DISPLAY_BOARDINFO)

checkboard, /* display board info */

#endif

#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)

init_func_i2c,

#endif

dram_init, /* configure available RAM banks */

display_dram_config,

NULL,

};

 

10、进入主循环

for (;;) {

main_loop ();

}

 

main_loop 函数中,等待bootdelay(3S),在3S中内输入按键,就进入uboot的命令行,执行uboot命令 ;如果3S中内,没有按键按下,就启动操作系统(执行bootcmd)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值