uboot向内核和应用层传递参数

本文详细介绍了如何在UBoot中通过GPIO读取启动模式,并以tag数组形式传递给内核。从uboot的setup_start_tag函数开始,分析了启动模式参数的初始化和添加过程,接着探讨了内核如何在entry_point、__vet_atags、setup_arch等函数中解析这些参数,最终确保启动模式值成功传递给应用层。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用需求:开机启动时,通过三路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文件,如下:

#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值