U-boot分析与移植(2)----U-boot stage1分析

原创 2012年03月27日 19:28:04
我们要生成u-boot.bin文件,它首先依赖于很多.o文件和.lds链接脚本文件

我们只要找到对应的.lds链接脚本文件就可以分析u-boot的启动流程。

1、打开u-boot-1.1.6\u-boot-1.1.6\board\smdk2410\

打开链接脚本boot.lds 看看:

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

 . = ALIGN(4);
 .text      :
 {
   cpu/arm920t/start.o (.text)
   *(.text)
 }

1)可以看见入口函数是_start

2)这个start代码放在cpu/arm920t/,就是start.S生成的start.o 

 

 2、打开u-boot-1.1.6\cpu\arm920t\start.S

.globl _start
_start: b       reset
 ldr pc, _undefined_instruction

......

 一开始跳到 reset

reset:

设置CPU SVC32模式:


 /*
  * set the cpu to SVC32 mode
  */
mrs r0,cpsr
 bic r0,r0,#0x1f   /*clear 0 at low 5 bit */
 orr r0,r0,#0xd3  /*set 110 10011*/
                             /*close irq,fiq,at arm state ,at supervisor mode */
 msr cpsr,r0      /*write cpsr*/

I F 为1,关闭FIQ,IRQ

T为0,ARM模式

M[4:0]=10011,管理模式

 

关闭看门狗:

 

向pWTCON全写0

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
 ldr     r0, =pWTCON
 mov     r1, #0x0 
 str     r1, [r0]

 

关闭所有中断:

但默认已经是关闭的

INTMSK写1,屏蔽对应的中断(默认1)

INTSUBMSK写1,屏蔽对应的二级中断(默认1)

 /*
  * mask all IRQs by setting all bits in the INTMR - default
  */
 mov r1, #0xffffffff
 ldr r0, =INTMSK
 str r1, [r0]
# if defined(CONFIG_S3C2410)
 ldr r1, =0x3ff
 ldr r0, =INTSUBMSK
 str r1, [r0]
# endif

 设置时钟分频比:

/* FCLK:HCLK:PCLK = 1:2:4 */
 /* default FCLK is 120 MHz ! */
 ldr r0, =CLKDIVN
 mov r1, #3
 str r1, [r0]

接着跳入cpu系统初始化:

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
 bl cpu_init_crit
#endif

在里面再跳入sdram初始化:

bl lowlevel_init

拷贝代码到SDRAM:

十分遗憾,这是给NOR FLASH用的

首先判断_start当前第一条代码位置,如果是在内存中,就不用代码重定位了

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:    /* relocate U-Boot to RAM     */
 adr r0, _start  /* r0 <- current position of code   */
 ldr r1, _TEXT_BASE  /* test if we run from flash or RAM */
 cmp     r0, r1                  /* don't reloc during debug         */
 beq     stack_setup

 ldr r2, _armboot_start
 ldr r3, _bss_start
 sub r2, r3, r2  /* r2 <- size of armboot            */
 add r2, r0, r2  /* r2 <- source end address         */

copy_loop:
 ldmia r0!, {r3-r10}  /* copy from source address [r0]    */
 stmia r1!, {r3-r10}  /* copy to   target address [r1]    */
 cmp r0, r2   /* until source end addreee [r2]    */
 ble copy_loop
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */

设置堆栈:

stack_setup:
 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                        */

还有设置中断stack

......

清bss段:

Bss段用来存放未初始化的全局变量和静态变量,在有操作系统的c编译器里默认为0.
但移植u-boot时,所有堆栈,清bss段都是人手设置,我们定义了一个bss段,把这个区域写0,
以后我们c函数运行时,就默认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

 

跳到c函数入口:

 ldr pc, _start_armboot

_start_armboot: .word start_armboot

第一阶段基本完成

ldr绝对跳转到_start_armboot函数入口


Nandflash启动,norflash启动,SDRAM总结

nand flash:适合大容量数据存储,类似硬盘; nor flash:适合小容量的程序或数据存储,类似小硬盘; sdram:主要用于程序执行时的程序存储、执行或计算,类似内存。S3C24...

AMBA、AHB、APB、ASB总线简介

AMBA简介 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用。在基于IP复用的SoC设计...

U-boot分析与移植(2)_U-boot stage1分析

本文来自:http://blog.csdn.net/jianchi88/article/details/7062902  写的很清楚很好,在此对作者表示感谢!! 我们要生成u-boot.bin文件,...

U-boot分析与移植(3)----U-boot stage2分析 .

. 一来到void start_armboot (void)函数,马上出现两个很重要的数据结构gd_t和bd_t 1、gd_t : global data数据结构定义,位于文件 i...

U-boot分析与移植(3)-U-boot stage2分析 .

本文来自:http://blog.csdn.net/jianchi88/article/details/7067260 一来到void start_armboot (void)函数,马上出现两个...

U-boot分析与移植(3)----U-boot stage2分析 .

. 一来到void start_armboot (void)函数,马上出现两个很重要的数据结构gd_t和bd_t 1、gd_t : global data数据结构定义,位于文件 include/a...

U-boot分析与移植(3)----U-boot stage2分析

一来到void start_armboot (void)函数,马上出现两个很重要的数据结构gd_t和bd_t 1、gd_t : global data数据结构定义,位于文件 include/asm-...
  • asmxpl
  • asmxpl
  • 2014年03月11日 17:00
  • 306

U-boot分析与移植(1)----bootloader分析

一、Boot Loader 概念 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调...

移植u-boot学习笔记1-----实验及分析启动过程之概述

1、编译 解压 tar xjf u-boot-2012.04.01.tar.bz2 切换到u-boot目录 cd u-boot-2012.04.01 配置 make smdk2410_config 编...

U-boot分析与移植(1)----bootloader分析

一、Boot Loader 概念 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:U-boot分析与移植(2)----U-boot stage1分析
举报原因:
原因补充:

(最多只允许输入30个字)