三、uboot分析

来源:互联网 发布:svd降维算法步骤 编辑:程序博客网 时间:2024/06/06 04:11

一、U-Boot源码目录结构

uboot目录下可以分为3类。
    第1类目录与处理器体系结构或者开发板硬件直接相关;
    第2类目录是一些通用的函数或者驱动程序;
    第3类目录是u-boot的应用程序、工具或者文档。

u-boot-2010.03及以前版本

从u-boot-2010.06版本开始把体系结构相关的内容合并,原先的cpu与lib_arch内容全部纳入arch中,并且其中增加inlcude文件夹;分离出通用库文件lib。

移植工作最主要的是看对应的处理器和开发板代码,2010.06版本以后处理器相关的代码集中在arch、board目录。(以前版本主要在cpu和board目录)

先看一下arch目录:
arch
├── arm
├── avr32
├── blackfin
├── i386
├── m68k
├── microblaze
├── mips
├── nios2
├── powerpc
├── sh
└── sparc

arch目录内容比以前的版本干净,每个子目录代表一个处理器类型,子目录名称就是处理器的类型名称。参考一下arch/mips目录:

arch/mips
├── cpu
├── include
└── lib

arch/mips目录下有三个目录,其他的处理器目录下也是这个结构:
cpu子目录对应一种处理器的不同产品型号或者系列;
include子目录是处理器用到的头文件;
lib目录对应用到处理器公用的代码;

下面看看cpu下的内容,arch/mips/cpu目录下的内容:

arch/mips/cpu
├── asc_serial.c
├── asc_serial.h
├── au1x00_eth.c
├── au1x00_serial.c
├── au1x00_usb_ohci.c
├── au1x00_usb_ohci.h
├── cache.S
├── config.mk
├── cpu.c
├── incaip_clock.c
├── incaip_wdt.S
├── interrupts.c
├── Makefile
└── start.S          整个uboot代码入口点

目前2011.6版本开始中cpu目录中建立mips32目录,把incaip和au1x00也分类放在不同的目录中。

u-boot.lds是ld程序也就是连接器的脚本文件,这个文件描述了如何连接目标文件,ld程序会根据这个文件的指示按照需求把不同的目标文件连接在一起生成供烧写到开发板的程序。该文件放在board对应的目录中。


二、启动工程


1、stage1:cpu/arm920t/start.s 完成硬件初始化

设置CPU工作模式
  关看门狗
  设置系统时钟
  关MMU,CACHE
  为第二阶段准备RAM空间(调用board/smdk2410/lowlevel_init.s)
  设置堆栈
  跳转到第二阶段代码的C入口点 (lib_arm/board.c  start_armboot( ) )


2、stage2:lib_arm/board.c中的start_armboot函数

  init_sequence:初始化CPU,设置系统时钟,初始化定时器,初始化环境参数,初始化串口控制台,检测内存映射
  flash_init: 初始化NORFLASH
  env_relocate: 初始化环境变量
  初始化系统外围设备
  最后调用main_loop (common/main.c)