应用需求:开机启动时,通过三路GPIO引脚来判断启动模式,由于其中一路GPIO引脚存在多路复用,所以只能在uboot下读取到正确的启动模式,在uboot阶段将读取到的启动模式保存,通过参数传递的方式上传给kernel和应用层。
1、首先现在版本的uboot使用的是以设备数的方式进行参数传递的。查找以下函数
static void setup_start_tag (bd_t *bd)
{
params = (struct tag *)bd->bi_boot_params;
params->hdr.tag = ATAG_CORE;
params->hdr.size = tag_size (tag_core);
params->u.core.flags = 0;
params->u.core.pagesize = 0;
params->u.core.rootdev = 0;
params = tag_next (params);
}
setup_start_tag函数是传参初始化的第一个函数,params是一个全局静态变量用来存储要传给kernel的参数,这里bd->bi_boot_params的值赋给params,因此bi_boot_params需要进行初始化,从而将params放在一个合理的内存区域。params为struct tag的结构,如下:
struct tag {
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
struct tag_videotext videotext;
struct tag_ramdisk ramdisk;
struct tag_initrd initrd;
struct tag_serialnr serialnr;
struct tag_revision revision;
struct tag_videolfb videolfb;
struct tag_cmdline cmdline;
struct tag_wakeup wakeup;/*该成员为添加的启动模式*/
} u;
};
启动模式结构体定义在arch/arm/include/asm/setup.h文件,如下:
#