U—Boot启动第二阶段代码分析.docVIP

  • 7
  • 0
  • 约8.01万字
  • 约 59页
  • 2017-04-12 发布于四川
  • 举报
U—Boot启动第二阶段代码分析

U-Boot启动第二阶段代码分析 (2012-03-23 15:10)一键转载 标签: 二 分类: uboot U-Boot第一阶段的启动流程。(nandflash启动,把nand的4k代码考到sram中,因为nand没址线,不能映射到内存,所以通过sram进行过度,sram中4k代码把整个uboot拷贝到sdram上,初始化好堆栈,为c语言提供条件,进入uboot的第二阶段! )这个阶段主要是初始化硬件设备,为加载U-Boot的第二阶段代码准备RAM空间最后跳转到lib_arm/board.c中start_armboot函数,这是第二阶段的入口点。 在上一篇文章中,我们介绍了u-boot启动的时候汇编语言的部分,当时我们进行了一些简单的初始化,并且为C语言的执行建立的环境(堆栈),现在我们看看当从汇编语言转到C语言的时候执行的第一个函数( start_armboot (),在lib_arm\board.c中),该函数进行了一系列的外设初始化,然后调用main_loop (),根据配置来选择是直接加载Linux内核还是进入等待命令模式。 1、在介绍该函数之前,我们需要看一看几个数据结构,这些是u-boot中几个重要的数据结构: (1)gd_t结构体 U-Boot使用了一个结构体gd_t来存储全局数据区的数据,这个结构体在include/asm-arm/global_data.h中定义如下: typedef struct global_data { bd_t *bd; //与板子相关的结构,见下面 unsigned long flags; unsigned long baudrate; unsigned long have_console; /* serial_init() was called */ unsigned long reloc_off; /* Relocation Offset */ unsigned long env_addr; /* Address of Environment struct */ unsigned long env_valid; /* Checksum of Environment valid? */ unsigned long fb_base; /* base address of frame buffer */ #ifdef CONFIG_VFD //我们一般没有配置这个,这个是frame buffer的首地址 unsigned char vfd_type; /* display type */ #endif #if 0 unsigned long cpu_clk; /* CPU clock in Hz! */ unsigned long bus_clk; unsigned long ram_size; /* RAM size */ unsigned long reset_status; /* reset status register at boot */ #endif void **jt; /* jump table */ } gd_t; /* * Global Data Flags */ #define GD_FLG_RELOC 0x00001 /* Code was relocated to RAM */ #define GD_FLG_DEVINIT 0x00002 /* Devices have been initialized */ #define GD_FLG_SILENT 0x00004 /* Silent mode */ #define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm (r8) 在global_data.h中U-Boot使用了一个存储在寄存器中的指针gd来记录全局数据区的地址: #define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm (r8) DECLARE_GLOBAL_DATA_PTR定

文档评论(0)

1亿VIP精品文档

相关文档