UBOOT源码分析、在线看_第1页
UBOOT源码分析、在线看_第2页
UBOOT源码分析、在线看_第3页
UBOOT源码分析、在线看_第4页
UBOOT源码分析、在线看_第5页
已阅读5页,还剩27页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

UBOOT的源码分析在u-boot-1.3.3/lib.arm/board.c中

说明:这一文件对所有的ARM处理器都是通用的因此在移植的时候不用修改。#include

<common.h>#include<command.h>#include<malloc.h>#include<devices.h>#include<version.h>#include<net.h>#include<serial.h>

这些是包含的几个头文件网卡这些是关于网络的定义#ifdef

CONFIG_DRIVER_SMC91111#include

“…/drivers/net/smc91111.h”#endif#ifdef

CONFIG_DRIVER_LAN91C96#include

“../drivers/net/lan91c96.h”#endif以太网芯片DECLARE_GLOBAL_DATA_PTR;声明全局数据指针在include/asm-arm/global.data.h中定义的一个全局寄存器变量的声明:#define

DECLARE_GLOBAL_DATA_PTR

registervalatile

gd_t

*gd

asm(“r8”)用于存放全局数据结构体gd_t的地址。#if

(CONFIG_COMMANDS&CFG_CMD_NAND)#ifdef

ENV_IS_VARIABLEextern

u8

is_nand;#endifvoid

nand_init

(void);#endif#if

(CONFIG_COMMANDS

&

CFG_CMD_FLASH)#ifdef

ENV_IS_VARIABLEextern

u8

is_flash;#endif#endif这些是关于NANDFIASH的初始化定义#if

(CONFIG_COMMANDS

&

CFG_CMD_ONENAND)#ifdef

ENV_IS_VARIABLEextern

u8

is_onenand;#endifvoid

onenand_init(void);#endif这些是关于ONENAND

FLASH的初始化定义

说明:前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等。ulong

monitor_flash_len;#ifdef

CONFIG_HAS_DATAFLASHextern

int

AT91F_DataflashInit(void);extern

void

dataflash_print_info(void);#endif处理器处理器数据存储器初始化#ifndef

CONFIG_IDENT_STRING#define

CONFIG_IDENT_STRING

""#endifconst

char

version_string[]

=U

BOOT

VERSION"

("

DATE

"

-

"

TIME

")"CONFIG

IDENT

STRING;产品型号版本字符串#ifdef

CONFIG_DRIVER_CS8900extern

void

cs8900_get_enetaddr

(uchar

*addr);

//获取网卡地址#endif#ifdef

CONFIG_DRIVER_RTL8019网卡以太网控制芯片extern

void

rtl8019_get_enetaddr(uchar

*addr);//获取以太网控制芯片地址#endif#ifdef

CONFIG_DRIVER_SMSC9118extern

void

lan9118_open(bd_t*);#endif网卡驱动器

设置变量,用于用户程序进行分配内存static

ulong

mem_malloc_start

=

0;static

ulong

mem_malloc_end

=

0;static

ulong

mem_malloc_brk

=

0;

内存空间初始化函数,真正实现内存分配的函数,分配一个CFG_MALLOC_LEN大小的内存空间staticCFG_MALLOC_LEN

void

mem_malloc_init(ulong

dest_addr){mem_malloc_start

=

dest_addr;mem_malloc_end

=

dest_addr

+CFG_MALLOC_LEN;mem_malloc_brk

=

mem_malloc_start;memset

((void

*)

mem_malloc_start,

0,mem_malloc_end

-mem_malloc_start);}所分配内存区的brk指针调整void

*sbrk

(ptrdiff_t

increment){ulong

old

=

mem_malloc_brk;ulong

new

=

old

+

increment;if

((new

<

mem_malloc_start)

||

(new

>mem_malloc_end))

{return

(NULL);}mem_malloc_brk

=

new;return

((void

*)

old);}初始化波特率static

int

init_baudrate

(void){char

tmp[64];

/*

long

enough

for

environmentvariables

*/int

i

=

getenv_r("baudrate",

tmp,

sizeof(tmp)gd->bd->bi_baudrate

=

gd->baudrate

=

(i

>

0)?

(int)

simple_strtoul

(tmp,

NULL,10):

CONFIG_BAUDRATE;return

(0);}一些显示函数,显示IRQ_STACK_START等的地址static

int

display_banner

(void){printf

("\n\n%s\n\n",

version_string);debug("U-Boot

code:

%08lX

->

%08lX BSS:

->

%08lX\n",_armboot_start,

_bss_start,

_bss_end);#ifdef

CONFIG_MODEM_SUPPORTdebug

("Modem

Support

enabled\n");#endif#ifdef

CONFIG_USE_IRQdebug

("IRQ

Stack:

%08lx\n",IRQ_STACK_START);debug

("FIQ

Stack:

%08lx\n",FIQ_STACK_START);#endifreturn

(0);显示内存的配置,打印出DRAM的大小static

int

display_dram_config

(void){int

i;#ifdefDEBUGputs

("RAM

Configuration:\n");for(i=0;

i<CONFIG_NR_DRAM_BANKS;

i++)

{printf

("Bank

#%d:

%08lx

",

i,

gd->bd->bi_dram[i].startprint_size

(gd->bd->bi_dram[i].size,

"\n");}#elseulong

size

=

0;for

(i=0;

i<CONFIG_NR_DRAM_BANKS;

i++)

{size

+=

gd->bd->bi_dram[i].size;}puts("DRAM:

");print_size(size,"\n");#endifreturn

(0);}

说明:前缀是CFG_,用来定义总线频率、串口波特率、Flash地址等参数。显示Flash的配置#ifndef

CFG_NO_FLASHstatic

void

display_flash_config

(ulong

si{puts

("Flash:

");print_size

(size,

"\n");}#endif

说明:初始化一个串口作为控制台,同时进行一些硬件测试,不存在一个common即通用的初始化序列来为所有的开发板及结构进行初始化,困为不同的体系结构差别比较大的。typedef

int

(init_fnc_t)

(void);通过接受一个指向全局数据的指针作为唯一参数int

print_cpuinfo

(void);init_fnc_t

*init_sequence[]

=

{cpu_init,

board_init,interrupt_init,env_init,init_baudrat,console_init_f,display_banner,#if

defined(CONFIG_DISPLAY_CPUINFO)print_cpuinfo,#endif#if

defined(CONFIG_DISPLAY_BOARDINFO)checkboard,#endifdram_init,display_dram_config,NULL,};void

start_armboot

(void){init_fnc_t

**init_fnc_ptr;char

*s;#ifndef

CFG_NO_FLASHulong

size

=

0;#endif

说明:进入主循环,处理用户输入的命令。即进入

uboot的stage2执行,此阶段完成初始化FLASH设备,初始化系统内存,初始化NAND、显示、网络等设备,将操作系统内核和根文件系统映射从FLASH读到ARM中,设定内核启动参数和调用内核。初始化FLASH设备#endif初始化显示设备#if

defined(CONFIG_VFD)

||defined(CONFIG_LCD)unsigned

long

addr;给全局数据变量gd安排空间gd

=

(gd_t*)(_armboot_start-CFG_MALLOC_LEN

-

sizeof(gd_t));是堆的大小

asm

volatile

("":

:

:"memory");memset

((void*)gd,

0,

sizeof

(gd_t));gd->bd

=

(bd_t*)((char*)gd

-

sizeof(bd_t));memset

(gd->bd,

0,

sizeof

(bd_t));monitor_flash_len

=

_bss_start

-

_armboot_start;给板子数据变量gd->bd安排空间获得一个gd指针,给全局数据变量分for

(init_fnc_ptr=init_sequence;*init_fnc_ptr;+配+i空n空it间_fnc_ptr){if

((*init_fnc_ptr)()

!=

0)

{hang

();}}顺序执行init_sequence数组中的初始化函数

说明:如果系统支持NOR

FLASH,调用flash_init()和display_flash_config(size)初始化并显示检测到的器件信息#ifndef

CFG_NO_FLASH#ifdef

ENV_IS_VARIABLEif

(is_flash)#endifsize

=

flash_init

();display_flash_config

(size);#endif说明:如果系统支持VFD,调用vfd_setmem(addr)计算帧缓冲大小,然后在BSS数据段之后为帧缓冲区分配空间,初始化gd->fb_base为帧缓冲区的起始地址.#ifdef

CONFIG_VFD# ifndef

PAGE_SIZE# define

PAGE_SIZE

4096#

endifaddr

=

(_bss_end

+(PAGE_SIZE

-

1))

&

~(PAGE_SIZE-

1);size

=

vfd_setmem

(addr);gd->fb_base

=

addr;#endif说明:如果系统支持LCD,调用vfd_setmem(addr)计算帧缓冲大小,然后在BSS数据段之后为帧缓冲区分配空间,初始化gd->fb_base为帧缓冲区的起始地址.#ifdef

CONFIG_LCD# ifndef

PAGE_SIZE# define

PAGE_SIZE

4096#

endifaddr

=

(_bss_end

+(PAGE_SIZE

-

1))

&

~(PAGE_SIZE-

1);size

=

lcd_setmem

(addr);gd->fb_base

=

addr;#endifmem_malloc_init

(_armboot_start

-CFG_MALLOC_LEN);

说明:调用此函数进行存储分配系统(类似于C语言中的堆的初始化和空间分配),即初始化堆空间。#if

(CONFIG_COMMANDS

&CFG_CMD_NAND)#ifdef

ENV_IS_VARIABLEif

(is_nand)#endif{puts

("NAND:");nand_init();#endif}

说明:如果系统支持nand,调用

nand_init()进行初始化,并打印相应的显示信息

说明:如果系统支持onenand,调用onenand_init()进行初始化,并打印相应的显示信息#if

(CONFIG_COMMANDS

&CFG_CMD_ONENAND)#ifdef

ENV_IS_VARIABLEif

(is_onenand)#endifonenand_init();#endif

说明:如果系统支持Dataflash,调用

AT91F_DataflashInit()进行初始化,调用dataflash_print_info()打印相应的显示信息#ifdef

CONFIG_HAS_DATAFLASHAT91F_DataflashInit();dataflash_print_info();#endifenv_relocate

();初始化环境参数(重定位),即从FALSH中搬到RA

说明:如果系统支持VFD,调用drv_vfd_init();进行VFD设备初始化,设置帧缓冲区大小#ifdef

CONFIG_VFDdrv_vfd_init();#endifgd->bd->bi_ip_addr

=

getenv_IPaddr

("ipaddr");{int

i;

ulong

reg;char

*s,

*e;char

tmp[64];从环境变量中读取IP地址和MAC地址初始化gdbd->bi_enetaddr[reg]和gd->bd->i

=

getenv_r

("ethaddr",

tmp,

sizeof

(tmpb)i)_;enet1addr[reg]

s

=

(i

>

0)

?

tmp

:

NULL;for

(reg

=

0;

reg

<

6;

++reg)

{gd->bd->bi_enetaddr[reg]

=

s

?

simple_strtoul

(s,

&e,

16if

(s)s

=

(*e)

?

e

+

1

:

e;}#ifdef

CONFIG_HAS_ETH1i

=

getenv_r

("eth1addr",

tmp,

sizeof

(tmp)

温馨提示

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

评论

0/150

提交评论