嵌入式培训-课件及_第1页
嵌入式培训-课件及_第2页
嵌入式培训-课件及_第3页
嵌入式培训-课件及_第4页
嵌入式培训-课件及_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

U-BOOT简介FrancHE课程内容介绍1.u-boot代码结构分析2.代码的编译与链接3.SMDK2410的代码执行流4.UBOOT的基本命令1.u-boot代码结构分析U-boot代码用了一种高度模块化的编程方式,主要包含下面几个目录:board:此目录包括了所有u-boot支持的目标板的子目录,像board/smdk2410/*就是我们所关心的,建立JTAG调试环境必须注意其中的config.mk,u-boot.lds。cpu:此目录包括了u-boot支持的CPU类型,我们只关心cpu/920t,CPU相关的文件主要是初始化一个执行环境,包括象中断的初始化;其中的start.S是整个u-boot.bin目标可执行代码的第一段代码,它们是从Flash开始运行的,它的主要工作就是对整个U-boot目标代码的重定位:即将U-boot和盘端到内存中去运行,这个文件对于如何在RAM里调试意义重大。common:其中包括了u-boot公共的一些命令的实现,像那些以cmd_*.c为名字的文件就是对应U-boot的每个命令的实现代码,我们通常关心cmd_boot.c和cmd_bootm.c(它们和内核的引导相关)。drivers:其中包括了各种外设接口的驱动程序,像smdk2410上的10M以太网卡的驱动程序cs8900.c就在其中。lib_arm:是一些ARM平台公共的接口代码,像board.c中的start_armboot()就是ARM引导的一个主要步骤。include:头文件的公共目录,其中的include/configs/smdk2410.h定义了所有和smdk2410相关的资源的配置参数,我们往往只需修改这个文件就可以配置目标板的参数像波特率、引导参数、物理内存映射等等。

2.代码的编译与链接

U-boot的编译相当简单,只需以下几条命令即可:#cd*/u-boot-1.1.3./#makesmdk2410_config #建立针对smdk2410的编译环境;#make最终可以生成一个u-boot.bin的文件,通过sjf2410可以将其烧录到目标板的NANDFLASH的0地址开始的一段空间。而在目标文件链接的过程中,目标代码的链接则是由对应板目录下的u-boot.lds和config.mk文件来控制的,其中的config.mk指定代码段的第一条指令的地址,对于smdk2410板子u-boot的代码段从TEXT_BASE=0x33F80000开始。smdk2410的内存地址从3000‘0000到3400’0000共64M,0x33f80000正好是整个内存的高512K。针对不同的物理内存分布和大小,我们可以修改这个地址来与之配合。_TEXT_BASE

赋值为TEXT_BASE,来自于文件board/smdk2410/config.mk,其中是这么指定的

TEXT_BASE=0x33f80000_armboot_start

赋值为_start,即代码段的起始,实际上也等于TEXT_BASE;_armboot_end_data:赋值为armboot_end_data,由链接程序ld根据链接脚本确定,可参考board/smdk2410/u-boot.lds,其中是这么指定的ENTRY(_start)SECTIONS{.=0x00000000;.=ALIGN(4); .text: { cpu/pxa/start.o (.text) *(.text) }

…… armboot_end_data=.;.=ALIGN(4); bss_start=.;.bss:{*(.bss)} bss_end=.; armboot_end=.;} _bss_start:赋值为bss_start,由链接程序ld根据链接脚本确定;_bss_end:赋值为bss_end,由链接程序ld根据链接脚本确定;_armboot_end:赋值为armboot_end,由链接程序ld根据链接脚本确定。现在我们就可以来画一张u-boot的目标代码内存地址映射图了

3.smdk2410的代码执行流

U-boot代码执行stage1:U-boot的第一段代码位于cpu/smdk2410/start.S中,它主要完成CPU状态的正确设置、中断和内存时序等的初始化,然后确定是否需要对整个u-boot代码重定位,最终从Flash中跳转到定位好的内存位置执行第一个函数_start_armboot

。Start.S大致的执行流: _start: breset->reset:->relocate:->copy_loop:->_start_armboot: .wordstart_armboot这里我们解释一下重定位的概念:我们在调试u-boot时,开始一般是让它在RAM中运行,当RAM运行通过后才将其固化到FLASH中;这样如果我们当前的代码是通过BDI2000等Load到内存直接运行的话,u-boot就不需要去将自己从Flash搬移到内存了;而如果u-boot是固化在Flash中在CPU复位后由第一个片选信号指向开始执行的话,则有一个从Flash搬移到内存的过程。由于这段代码是一个重要的转折点,我们要对它进行一下分析其中最关键的一步就是通过ARM的伪指令adr得到当前代码的地址信息:如果u-boot是从内存开始运行的,则从adrr0,_start得到的地址信息为r0=_start=_TEXT_BASE=TEXT_BASE=0x33f80000;如果u-boot从Flash开始运行,即从smdk2410对应的0x0000地址运行,则r0=0x0000,这时将会执行copy_loop标识的那段代码了。U-boot代码执行流stage2:最终执行流将通过下面的语句跳转到C代码执行了:

ldr pc,_start_armboot _start_armboot:.wordstart_armbootstart_armboot()定义在lib_arm/board.c中,它很类似于Linux内核的start_kernel(),它们都是一种系统初始化的接口函数:在内核的start_kernel中集中完成了内核几乎所有资源的初始化,包括CPU相关的资源和外设接口等;而在start_armboot中则要集中完成以下几件事情(这些事情主要在init_sequence中定义)3.0定义全局结构GD

DECLARE_GLOBAL_DATA_PTR; #defineDECLARE_GLOBAL_DATA_PTRregistervolatilegd_t*gdasm("r8")

也就是说使用r8存储这个结构的地址信息3.1.CPU的初始化:cpu_init它定义在cpu/smdk2410/cpu.c中,由于在U-boot中我们没有使用smdk2410CPU的慢速中断IRQ和快速中断FIQ机制,不存在一个所谓的中断栈的初始化,因而这个函数实际上是空的。3.2.目标板的初始化:board_init它定义在board/smdk2410/smdk2410.c中,其主要工作就是对一个目标板参数结构gd_t{}的初始化,该结构定义在include/asm-arm/global_data.h中:typedef struct global_data{ bd_t *bd; unsignedlong flags; unsignedlong baudrate; unsignedlong have_console; /*serial_init()wascalled*/ unsignedlong reloc_off; /*RelocationOffset*/ unsignedlong env_addr; /*AddressofEnvironmentstruct*/ unsignedlong env_valid; /*ChecksumofEnvironmentvalid?*/ unsignedlong fb_base; /*baseaddressofframebuffer*/#ifdefCONFIG_VFD unsignedchar vfd_type; /*displaytype*/#endif}gd_t;该数据结构用来传递一些引导的核心参数,从其定义我们就可以看出其中每个参数的意义,我们最关心其第一个参数即目标板配置参数结构bd_t{},它由include/asm-arm/u-boot.h定义:

typedefstructbd_info{int bi_baudrate; /*serialconsolebaudrate*/unsignedlong bi_ip_addr; /*IPAddress*/unsignedchar bi_enetaddr[6]; /*Ethernetadress*/structenvironment_s *bi_env;ulong bi_arch_number; /*uniqueidforthisboard*/ulong bi_boot_params; /*wherethisboardexpectsparams*/struct /*RAMconfiguration*/{ ulongstart; ulongsize;}bi_dram[CONFIG_NR_DRAM_BANKS];}bd_t;那么在board_init对gd中的bi_arch_number域和bi_boot_params域做了设置:

gd->bd->bi_arch_number=MACH_TYPE_SMDK2410;

/*adressofbootparameters*/ gd->bd->bi_boot_params=0x30000100;3.3.中断初始化:interrupt_init定义在cpu/arm920t/s3c24x0/interrupts.c中,U-boot引导S3C2410过程中没有使用中断,函数为空。

3.4.环境变量初始化:env_initU-boot可以支持以下几种环境变量的存放方式:如EEPROM,NVRAM,FLASH等。smdk2410板子使用FLASH来存放环境变量参数,因而会定义CFG_ENV_IS_IN_FLASH;并且它没有实现在Flash中对参数的冗余备份,因而CFG_ENV_ADDR_REDUND是没有定义的,所以我们关心的代码实际位于common/env_flash.c的261行开始在其中要根据一个环境变量的描述结构的全局变量进行操作,该结构简单地就是:

typedef structenvironment_s{ unsignedlongcrc; /*CRC32overdatabytes*/ unsignedchar data[ENV_SIZE]; /*Environmentdata*/

}env_t;实质上就是初始化全局数据区结构gd_t的env_addr指针:env_t*env_ptr=(env_t*)CFG_ENV_ADDR;//L68

gd->env_addr=(ulong)&(env_ptr->data);

这样下面的代码就可以根据这个指针来访问各个环境参数了。

3.5.环境变量之波特率:init_baudrate该函数就定义在lib_arm/board.c中,目的就是对全局参数区结构的gd_t和目标板参数结构bd_t的对应域赋值,该值要从环境参数区中读取出来,如果没有定义该环境参数则用缺省值,缺省值定义在smdk2410.h中:#defineCONFIG_BAUDRATE 115200,对应的参数赋值语句为

gd->bd->bi_baudrate=gd->baudrate=…;3.6.串口初始化:serial_init对于smdk2410来说,串口的初始化定义在cpu/920t/s3c24x0/serial.c中 ,非常简单,它就是根据属性和波特率对与UART相关的配置寄存器UFCON,UMCON,ULCON,UCON,UBRDIV进行设置。3.7.控制台初始化:console_init_f定义在common/console.c中,简单地赋值gd->have_console=1。定义了有串口。3.8.U-boot第一段输出:display_banner该函数也定义在lib_arm/board.c中,它输出一些U-boot的版本信息,如:U-Boot1.1.3(Aug292005-17:35:13)U-Bootcode:A1FE0000->A1FF76DCBSS:->A1FFB0C43.9.SDRAM配置信息:dram_init,display_dram_config定义在board/smdk2410/smdk2410.c中,配置物理内存的起始位置和大小,像smdk2410板其SDRAM从PHYS_SDRAM_1(0x30000000)开始,大小为PHYS_SDRAM_1_SIZE(0x4000000)

gd->bd->bi_dram[0].start=PHYS_SDRAM_1; gd->bd->bi_dram[0].size=PHYS_SDRAM_1_SIZE;最后配置信息通过display_dram_config显示出来,如:DRAMConfiguration:Bank#0:0x3000000064MB3.10.Flash配置信息:flash_init,display_flash_config定义在board/smdk2410/flash.c中,它要完成对flash_info_t{}(/include/flash.h)数据结构的初始化:

typedefstruct{ ulong size; /*totalbanksizeinbytes*/ ushort sector_count; /*numberoferaseunits*/ ulong flash_id; /*combineddevice&manufacturercode*/ ulong start[CFG_MAX_FLASH_SECT];/*physicalsectorstartaddresses*/ uchar protect[CFG_MAX_FLASH_SECT];/*sectorprotectionstatus */}flash_info_t;对于smdk2410来说,才用一片AMD的29LV400芯片,其总共的容量为FLASH_BANK_SIZE(定义为0x100000即1M),总共的块数为CFG_MAX_FLASH_SECT(19块),sector大小有16K,有8K,还有32K,当完成了flash_info的配置后,我们也要通过flash_protect()将Flash的Monitor段和参数段加以写保护。最后Flash的配置信息通过display_flash_config显示出来,如:Flash:1MB3.11.动态内存分配初始化:mem_malloc_init这个函数是整个u-boot代码的另

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论