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;
 
首先在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);启动内核!
两个面对电脑了,思绪比较乱!以后再慢慢整理!谢谢
 
 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 感觉自己心理有问题 怎么办 刺激战场手机配置低怎么办 国土防线2没反应怎么办 镜之边缘迷路了怎么办? 陌陌直播不清晰怎么办 夏利n5 1.0费油怎么办 gg修改器是病毒怎么办 传送门骑士联机读条慢怎么办 被打成轻伤派出所不抓人怎么办 有人上门找事怎么办算正当防卫吗 win10 电脑账户被停用怎么办 电脑一键还原后黑屏怎么办 win一键还原后黑屏怎么办 打架对方群殴我我怎么办 杀了人没钱赔怎么办 团伙打架被对方所刀捅伤怎么办 过失致人重伤赔偿不起怎么办 被别人打了派出所不管怎么办 先动手的被打伤怎么办 自为伤了人怎么办? 孩子被打不敢还手怎么办 小孩给电打了怎么办 电打了手都黑了怎么办 手指被电打伤了怎么办 电打了手有点麻怎么办 没打人对方确弄个轻伤证明怎么办 对人造成轻伤害怎么办 如果有人要砍我怎么办 美版手机坏了怎么办 战地4ping太高怎么办 喝了红牛睡不着怎么办 球球大作战总是闪退怎么办解决方法 球球大作战手机号己绑定怎么办 弄的底窝中药味太大怎么办 锤子手机上不了网怎么办 ppt没保存就卡了怎么办 ppt卡了没保存怎么办 匡威鞋舌头跑偏怎么办 霍尼韦尔dcs cb锁死怎么办 谷歌身份验证器丢失 怎么办 叛乱2手雷没了怎么办