u-boot学习笔记四(C语言部分)
来源:互联网 发布:淘宝详情页统一添加 编辑:程序博客网 时间:2024/05/16 04:22
清明节放假休息两天~_~!继续对u-boot源代码做个简要的分析,这次主要针对C语言部分,欢迎批评指正!看好C部分代码我觉得要把握三个主线。1.初始化包括板子,环境等初始化。2.u-boot命令是如何如何运作的.3.如何调用linux内核的!
先从第一条主线说起:打开u-boot-1.1.4/lib_arm/board.c
从汇编跳入start_armboot这个函数执行!在介绍这个初始化前首先要了解两个全局结构体
(1)、gd_t该数据结构保存了u-boot需要的配置信息,注释简单明了
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? */
#ifdef CONFIG_VFD //我们一般没有配置这个,这个是frame buffer的首地址
unsigned long fb_base; /* base address of frame buffer */
#endif
} gd_t;
(2)、bd_t 保存与板子相关的配置参数
typedef struct bd_info {
int bi_baudrate; /* serial console baudrate */
unsigned long bi_ip_addr; /* IP Address */
unsigned char bi_enetaddr[6]; /* Ethernet adress */
struct environment_s *bi_env;
ulong bi_arch_number; /* unique id for this board */
ulong bi_boot_params; /* where this board expects params */
struct /* RAM configuration */
{
ulong start;
ulong size;
} bi_dram[CONFIG_NR_DRAM_BANKS];//在我的板子上是1个
} bd_t;
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? */
#ifdef CONFIG_VFD //我们一般没有配置这个,这个是frame buffer的首地址
unsigned long fb_base; /* base address of frame buffer */
#endif
} gd_t;
(2)、bd_t 保存与板子相关的配置参数
typedef struct bd_info {
int bi_baudrate; /* serial console baudrate */
unsigned long bi_ip_addr; /* IP Address */
unsigned char bi_enetaddr[6]; /* Ethernet adress */
struct environment_s *bi_env;
ulong bi_arch_number; /* unique id for this board */
ulong bi_boot_params; /* where this board expects params */
struct /* RAM configuration */
{
ulong start;
ulong size;
} bi_dram[CONFIG_NR_DRAM_BANKS];//在我的板子上是1个
} bd_t;
首先在SDRAM中分配一块空间放置这个全局数据结构,并对这块空间做必要的初始化,源代码如下:
接着利用指针数组的形式,依次调用数组中的初始化函数,并执行!数组任何一个函数出错着挂起reset即进入hang函数!
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
这是这个指针数组,当然你需要额外的初始化时可在这里添加
然后就是对Flash LCD NAND ENV MAC的初始化,比较简单!值得提出的一个函数env_relocate ();分配环境变量空间并初始化,初始化default_envirnoment!在ENV_common.c中有定义!紧接着进入main_loop循环!里面有延时函数要么等待命令要么启动内核!好,下面就到了第二条主线,命令的执行!
2.命令的执行,先说一下从输入命令到命令执行所调用的函数:
Mainloop->for(;;)->console_buffer接收命令->run_command()->find_cmd()->exec_cmd调用命令宏所定义的函数执行!
打开cmd_configdef.h文件,里面定义了所有的命令!你需要在板子配置文件中定义这么一个宏#define CONFIG_COMMANDS 用于选出自己想要的命令!当选中一条命令的时候就要为这个命令定义#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) 这么一个宏,其中cmd即为执行函数!所有的命令是否编译全是通过宏定义来进行控制的!
3.调用linux内核
调用do_bootm命令然后再调用lib_arm.c文件中的do_bootm_linux函数
启动内核使用了一个指针函数
void
(*
theKernel
)(
int
zero
,
int
arch
,
uint params
);
根据ACPS函数过程调用标准,这个指针函数的参数将通过r0,r1,r2来进行传递!其中第一个个参数默认为0,第二个参数为体系结构匹配值arm为193,在match_type.h中有定义!
theKernel
=
(
void
(*)(
int
,
int
,
uint
))
ntohl
(
hdr
->
ih_ep
);
theKernel被赋值为hdr->ih_ep,这个hdr是指使用tools/mkimage工具程序制作uImage时加在linux.bin.gz前面的一个头部,而ih_ep结构体成员保存的就是使用mkimage时指定的-e参数的值,即内核的入口点。 知道了hdr->ih_ep的意义之后,给theKernel赋这个值也就是理所当然的了。
在board_init中有如下定义
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
/* adress of boot parameters */
gd->bd->bi_boot_params = 0x30000100;
最后theKernel (0, bd->bi_arch_number, bd->bi_boot_params);启动内核!
两个面对电脑了,思绪比较乱!以后再慢慢整理!谢谢
- u-boot学习笔记四(C语言部分)
- (四)u-boot启动流程分析(C语言部分board_r.c)
- u-boot 网络部分学习
- U-Boot学习笔记(四):TEXT_BASE的理解
- c语言学习笔记四
- (三)u-boot启动流程分析(C语言部分board_f.c)
- U-boot初级学习笔记
- U-boot初级学习笔记
- U-boot学习笔记(一)
- U-boot学习笔记(二)
- U-boot学习笔记(三)
- u-boot 第一阶段学习笔记
- C语言部分学习笔记整理
- 【学习笔记四】C语言基础知识复习
- C语言学习笔记(四)数组
- C语言程序学习(四)笔记
- C语言学习笔记(四)
- C语言学习笔记--基础语法四
- Multiple Startup Projects in VS2008
- [C/C++]两个值得研究的程序(指针与内存分配)
- 互联网最赚钱还是广告 现在退居二线还太早
- [C++]动态给传递指针分配空间
- 完美的开发语言--现在只是梦想
- u-boot学习笔记四(C语言部分)
- Hands on microsoft lab manual (for 2008)
- 彻底弄懂CSS盒子模式之三
- 在泡沫里赚大钱
- Tapestry属性生命周期(关于persist)
- HP (China) 孙正耀致年轻人的一封信
- 跪谢请教:session设置与用户管理,php
- makefile的基本语法
- 如可去掉 ^M