学习韦东山uboot之Uboot代码流程分析

从连接文件可以得到,第一个文件是start.o,然后是boot_init.o
{
    第一个文件是start.o,然后是100ask24x0/boot_init.o
  cpu/arm920t/start.o    (.text)
      board/100ask24x0/boot_init.o (.text)
  *(.text)
}
所以分析源码先从这两个文件开始分析起来
start首先跳到reset,然后做以下操作
设置cpu为SVC32模式
关闭看门狗
关闭所有中断
设置时钟
读取_start跟_TEXT_BASE对比
这里的作用大概是比较是不是从SDRAM启动,如果是SDRAM启动则_start会等于TEXT_BASE
第一阶段会从nandflash复制4K代码运行,所以不相等
所以跳转到cpu_init_crit做初始化
cpu_init_crit的操作大概是:
清caches
关闭MMU
跳转到lowlevel_init
lowlevel_init的作用是初始化SDRAM等
然后返回
继续看reset的下面
开始设置栈,这里我们可以看出u-boot里面的排布
首先是_TEXT_BASE为33F80000
由于SDRAM的总线开始地址为30000000
然后SDRAM为64M,所以SDRAM的最后地址是34000000
34000000 - 33F80000 = 80000h = 512K
所以最后的SDRAM512K区域用于放置UBOOT代码
然后下来是MALLOC_LEN,用于实现malloc free等需要用到的堆
然后下来是GBL_DATA_SIZE,用于保存环境变量信息
如果始用IRQ,下来的区域就是保存中断的向量CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ
最后在下来3个words给abort-stack
最后是sp的位置,也就是栈顶
所以,这SDRAM的排布应该如下所示:

+-----------------------+
|     UBOOT CODE        |   512K
+-----------------------+
|       MALLOC_LEN      |
+-----------------------+
|       GBL_DATA_SIZE   |
+-----------------------+
|      (IRQ)            |
+-----------------------+
|        SP             |
+-----------------------+

设置好栈后,调用clock_init初始化时钟
然后开始重定位操作:
然后判断是SDRAM启动还是Flash启动,
如果是SDRAM启动还需要清bss
然后执行CopyCode2Ram,复制代码到SDRAM
最后跳到_start_armboot,运行start_armboot函数
start_armboot函数主要做以下东西
1、初始化gd指针
2、初始化init_sequence表格里的函数
    cpu_init,        /* basic cpu dependent setup */
    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
    dram_init,        /* configure available RAM banks */
    display_dram_config,
    NULL,
如果有flash,初始化flash
初始化堆用于malloc、free等内存操作始用
然后环境变量重定位
初始化环境变量里的IP地址、MAC等
然后运行devices_init,这里面做外设的初始化,例如i2c,lcd等
初始化跳转表 jumptable_init(gd结构体相关)
然后运行console_init_r,主要是控制台初始化相关,运行这个之后就可以始用串口等控制台了
初始化GPIO
判定PreLoadedONRAM
如果这个标志为假还需要运行使能中断、usb中断
获取loadaddr环境变量
最后跳转到main_loop主循环
主循环主要做的事情就是读取命令,然后运行命令
如果如果超时不进入ubootmenu,就会运行bootm命令来启动内核

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值