u-boot整体结构、移植步骤以及启动代码分析 下载本文

内容发布更新时间 : 2024/5/2 15:12:52星期一 下面是文章的全部内容请认真阅读。

一、整体结构

首先下载u-boot的源代码(www.denx.de),解压缩,你可以看到下面的目录: - board 目标板相关文件,主要包含SDRAM、FLASH驱动;

- common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;

- cpu 与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;

- driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好) - doc U-Boot的说明文档;

- examples可在U-Boot下运行的示例程序;如hello_world.c,timer.c;

- include U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;

- lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相关的文件;

- net 与网络功能相关的文件目录,如bootp,nfs,tftp; - post 上电自检文件目录。尚有待于进一步完善; - rtc RTC驱动程序;

- tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具;

二、移植步骤

为了使U-Boot支持新的开发板,一种简便的做法是在U-Boot已经支持的开发板中选择一种和目标板接近的,并在其基础上进行修改。代码修改的步骤如下:

1)在board目录下创建smdk2410目录,添加smdk2410.c、flash.c、memsetup.s、u-boot.lds和config.mk等;

2)在cpu目录下创建arm920t目录,主要包含start.s、interrupts.c、cpu.c、serial.c和speed.c等文件;

3)在include/configs目录下添加smdk2410.h,它定义了全局的宏定义等; 4)修改u-boot根目录下的Makefile文件:

smdk2410_config : unconfig@./mkconfig $(@:_config=) arm arm920t smdk2410

5)运行make smdk2410_config,如果没有错误,就可以开始进行与硬件相关的代码移植工作。由于这部分代码与硬件紧密相关,所以要熟悉开发板的硬件配置,可参考各芯片的用户手册。

当然,这个是一般步骤,后面我们做的可能具体文件名还和这个不一样,等到那时候在交待,这里先介绍的目的是在开始的时候给个大概的思路,要不直接分析源代码,有点在原始森林的感觉,耐心的看吧:)

三、start.S分析

首先介绍start.S中的代码的具体作用,由于该代码是系统最开始执行的,这时,u-boot对系统一无所知,必须要初始化一些东西,比如设置异常的入口地址和异常处理函数;配置PLLCON寄存器,确定系统的主频;屏蔽看门狗和中断;初始化I/O寄存器;关闭MMU功能;调用 /board/smdk2410中的memsetup.s,初始化存储器空间,设置刷新频率;将U-Boot的内容复制到SDRAM中;设置堆栈的大小, 然后ldr pc, _start_armboot,跳到

C函数

代码来自华恒的板子上面的资料

/* CPU clcok */ /* 50.00 MHz */

#define MDIV_50 0x5c #define PDIV_50 0x4 #define SDIV_50 0x2

/* 100.00 MHz */

#define MDIV_100 0xa1 #define PDIV_100 0x3 #define SDIV_100 0x1

/* 200.00 MHz */

/*CPU clock = 202.800000 Mhz, HCLK = 101.400000 Mhz, PCLK = 50.700000 Mhz*/

/*0xa1 3 1*/

/*180Mhz 90Mhz 45Mhz 0x52 1 1*/ /*152MHZ 0x44 1 1*/ #define MDIV_200 0xa1 #define PDIV_200 0x3 #define SDIV_200 0x1

#define vMPLLCON_50 ((MDIV_50 << 12) | (PDIV_50 << 4) | (SDIV_50))

#define vMPLLCON_100 ((MDIV_100 << 12) | (PDIV_100 << 4) | (SDIV_100))

#define vMPLLCON_200 ((MDIV_200 << 12) | (PDIV_200 << 4) | (SDIV_200))

/*

************************************************************************* *

* Jump vector table as in table 3.1 in [1] *

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

.globl _start

_start: b reset======================================〉程序从这里开始

ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq

_undefined_instruction: .word undefined_instruction _software_interrupt: .word software_interrupt _prefetch_abort: .word prefetch_abort _data_abort: .word data_abort _not_used: .word not_used _irq: .word irq _fiq: .word fiq

.balignl 16,0xdeadbeef

/*

************************************************************************* *

* Startup Code (reset vector) *

* do important init only if we don't start from memory! * relocate armboot to ram * setup stack

* jump to second stage *

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

/* * CFG_MEM_END is (configs/config_BOARD.h) */

_TEXT_BASE:

.word TEXT_BASE

in the board dependent config-file