版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 计算机应用基础
- 2026泉州小学民乐班面试题及答案
- 2026审计外勤面试题及答案
- 客户交接协议书
- 设备材料赔偿协议书
- 鱼塘归属纠纷解协议书
- 2026水利系统面试题目及答案
- 2026文案岗面试题模板及答案
- 2026年浙教版适配高一物理暑假衔接卷声光热综合应用标准试卷第022套(含答案解析与可打印作答区)
- 农村合同口头协议
- 2026年农业经理人考试题库试题及答案
- 2026年福建厦门市杏林医院第二季度辅助岗招聘22人笔试备考题库及答案详解
- (2025版)《儿童急性淋巴细胞白血病诊疗指南》解读课件
- 2025年深圳市龙岗区城市建设投资集团有限公司招聘笔试真题(完整版+答案+阅卷解析)
- 排水箱涵工程安全文明施工方案
- 雨课堂学堂在线学堂云《政治学基础(暨南)》单元测试考核答案
- 脑卒中风险因素评估与干预护理
- 老年人抑酸剂合理应用中国专家共识(2026版)
- 项目管理文档归档标准化操作指导书
- 2026年国开电大物业管理财税基础形考模拟题及答案详解(新)
- 2026农商银行面试现场还原真题及标准答题答案
评论
0/150
提交评论