U-BOOT的移植与分析(第一阶段硬件初始化)

Posted imunrobot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了U-BOOT的移植与分析(第一阶段硬件初始化)相关的知识,希望对你有一定的参考价值。

1.UBOOT 运行的第一个文件是:cpu/arm920t/start.S(从程序的链接脚本中知道)

 1 .globl _start                         // .globl定义一个全局符号"_start"
 2 _start:    b       reset                    // 系统复位设置
 3     ldr    pc, _undefined_instruction          //未定义异常
 4     ldr    pc, _software_interrupt            //软件中断异常
 5     ldr    pc, _prefetch_abort           //内存操作异常
 6     ldr    pc, _data_abort                     //数据异常
 7     ldr    pc, _not_used              //未使用
 8     ldr    pc, _irq                 //中断异常(中断属于异常的一种)
 9     ldr    pc, _fiq                //快速中断异常
10 
11 _undefined_instruction:    .word undefined_instruction   //异常处理函数
12 _software_interrupt:    .word software_interrupt
13 _prefetch_abort:    .word prefetch_abort
14 _data_abort:        .word data_abort
15 _not_used:        .word not_used
16 _irq:            .word irq
17 _fiq:            .word fiq
1 reset:
2     /*
3      * set the cpu to SVC32 mode 将 CPU 设置为 SVC32 管理模式
1 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
2     adr    r0, _start        /* r0 <- current position of code   */
3     ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
4     cmp     r0, r1                  /* dont reloc during debug         */
5     blne    cpu_init_crit
6 #endif
 1 /* turn off the watchdog 关闭 看门狗*/
 2 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)   
 3     ldr     r0, =pWTCON
 4     mov     r1, #0x0
 5     str     r1, [r0]
 1     /*
 2      * mask all IRQs by setting all bits in the INTMR - default  屏蔽所有中断
 3      */
 4     mov    r1, #0xffffffff
 5     ldr    r0, =INTMSK
 6     str    r1, [r0]
 7 # if defined(CONFIG_S3C2410)
 8     ldr    r1, =0x3ff
 9     ldr    r0, =INTSUBMSK
10     str    r1, [r0]
11 # endif
/*
判断系统是从nand启动的还是直接将程序下载到SDRAM中运行,
若系统从nand启动,这里得到r0和r1值是不一样的,r1=0x33f80000,
而r0=0x00000000。说明没初始化SDRAM,ne(no equal)标识符为真,所以bl cpu_init_crit执行跳转.
*/
1
#ifndef CONFIG_SKIP_LOWLEVEL_INIT 2 adr r0, _start /* r0 <- current position of code adr 是读地址指令,当前 _start 这段代码位于哪里 */ 3 ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ 4 cmp r0, r1 /* dont reloc during debug */ 5 blne cpu_init_crit 6 #endif
 1 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
 2 cpu_init_crit:
 3     /*
 4      * flush v4 I/D caches 先关 flush 清 caches
 5      */
 6     mov    r0, #0
 7     mcr    p15, 0, r0, c7, c7, 0    /* flush v3/v4 cache */
 8     mcr    p15, 0, r0, c8, c7, 0    /* flush v4 TLB */
 9 
10     /*
11      * disable MMU stuff and caches  关闭MMU
12      */
13     mrc    p15, 0, r0, c1, c0, 0
14     bic    r0, r0, #0x00002300    @ clear bits 13, 9:8 (--V- --RS)
15     bic    r0, r0, #0x00000087    @ clear bits 7, 2:0 (B--- -CAM)
16     orr    r0, r0, #0x00000002    @ set bit 2 (A) Align
17     orr    r0, r0, #0x00001000    @ set bit 12 (I) I-Cache
18     mcr    p15, 0, r0, c1, c0, 0
19 
20     /*
21      * before relocating, we have to setup RAM timing
22      * because memory timing is board-dependend, you will
23      * find a lowlevel_init.S in your board directory.
24      */
25     mov    ip, lr
26     bl    lowlevel_init     //进入lowlevel_init初始化13个BANK寄存器来初始化SDRAM
27     mov    lr, ip
28     mov    pc, lr
29 #endif /* CONFIG_SKIP_LOWLEVEL_INIT */
 1     /* Set up the stack          栈的设置                  */
 2 stack_setup:
 3     ldr    r0, _TEXT_BASE        /* upper 128 KiB: relocated uboot   */
 4     sub    r0, r0, #CFG_MALLOC_LEN    /* malloc area                      */
 5     sub    r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */
 6 
 7 #ifdef CONFIG_USE_IRQ
 8     sub    r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
 9 #endif
10     sub    sp, r0, #12        /* leave 3 words for abort-stack    */
11 
12 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
13     bl clock_init                               //进入 clock_init 函数
14 #endif    
1 relocate:                /* relocate U-Boot to RAM  重定位代码 拷贝u-boot到SDRAM      */
2     adr    r0, _start        /* r0 <- current position of code   */
3     ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
4     cmp     r0, r1                  /* dont reloc during debug         */
5     beq     clear_bss
6     
7     ldr    r2, _armboot_start
8     ldr    r3, _bss_start
9     sub    r2, r3, r2        /* r2 <- size of armboot            */
1 clear_bss:     /*清除BSS段*/
2     ldr    r0, _bss_start        /* find start of bss segment        */
3     ldr    r1, _bss_end        /* stop here                        */
4     mov     r2, #0x00000000        /* clear                            */
clbss_l:str    r2, [r0]        /* clear loop...                    */
    add    r0, r0, #4
    cmp    r0, r1
    ble    clbss_l
1     ldr    pc, _start_armboot
2 
3 _start_armboot:    .word start_armboot   /*最后调用 C 函数 start_armboo 用来实现第2阶段硬件相关的初始化*/

 

以上是关于U-BOOT的移植与分析(第一阶段硬件初始化)的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习 :Uboot 移植

图解U-Boot:第一阶段源码分析

Linux嵌入式驱动学习之路⑤u-boot启动流程分析

u-boot.2012.10——mini2440(启动流程分析)

uboot分析:uboot的启动过程分析

移植最新u-boot之裁剪和修改默认参数