• uboot initf_dm函数分析


    initf_dm,

    static int initf_dm(void)
    {
    #if defined(CONFIG_DM) && CONFIG_VAL(SYS_MALLOC_F_LEN)   

    //CONFIG_DM和CONFIG_SYS_MALLOC_F_LEN都有定义
        int ret;

        bootstage_start(BOOTSTATE_ID_ACCUM_DM_F, "dm_f");

        uint32_t bootstage_start(enum bootstage_id id, const char *name)
        {
            struct bootstage_data *data = gd->bootstage;                 //data指向gd->bootstage
            struct bootstage_record *rec = ensure_id(data, id);

             struct bootstage_record *ensure_id(struct bootstage_data *data,enum bootstage_id id)
             {
                 struct bootstage_record *rec;

                 rec = find_id(data, id);                 

                 //去gd->bootstage->record的查找有没有匹配BOOTSTATE_ID_ACCUM_DM_F的记录

                 //有上篇博客可知目前record中只有BOOTSTAGE_ID_AWAKE和BOOTSTAGE_ID_START_UBOOT_F两个记录
                 if (!rec && data->rec_count < RECORD_COUNT) {
                     rec = &data->record[data->rec_count++];                    //rec指向gd->bootstage->record[2]
                     rec->id = id;                                                                  //rec->id初始化为BOOTSTATE_ID_ACCUM_DM_F
                     return rec;
                 }

                 return rec;
             }


            ulong start_us = timer_get_boot_us();                                 //获取当前的boot时间

            if (rec) {
                rec->start_us = start_us;
                rec->name = name;
            }

            return start_us;
        }

        //bootstage_start的主要功能是向gd->bootstage->record[2]中增加名字为dm_f的记录

        ret = dm_init_and_scan(true);

         这里参考函数说明:该函数初始化驱动树和uclass树,然后从平台数据和FDT中扫描和绑定可用的设备。当输入参数为true时,仅绑定含有DM_FLAG_PRE_RELOC标志位和特殊设备树特性的节点。

        bootstage_accum(BOOTSTATE_ID_ACCUM_DM_F);

         在先前的bootstage_start标记一项活动为开始状态后,调用bootstage_accum标记该任务为结束状态
        if (ret)
            return ret;
    #endif
    #ifdef CONFIG_TIMER_EARLY                 //未定义,不执行
        ret = dm_timer_init();
        if (ret)
            return ret;
    #endif

        return 0;
    }

    本文主要分析了initf_dm的功能,主要是初始化驱动树和uclass树,并绑定含有DM_FLAG_PRE_RELOC标志位和特殊设备树特性的节点。下篇博客将继续分析init_sequence_f 中的函数。
    ————————————————
    版权声明:本文为CSDN博主「yanggx0929」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/yanggx0929/article/details/88860236

  • 相关阅读:
    就为了一个原子操作,其他CPU核心罢工了
    浅谈JVM和垃圾回收
    简单了解一下K8S,并搭建自己的集群
    WebAssembly完全入门——了解wasm的前世今身
    【简单了解系列】从基础的使用来深挖HashMap
    【俗话说】换个角度理解TCP的三次握手和四次挥手
    两分钟让你明白Go中如何继承
    游戏服务器和Web服务器的区别
    Go中使用seed得到相同随机数的问题
    从web到游戏,走出舒适区
  • 原文地址:https://www.cnblogs.com/idyllcheung/p/11851681.html
Copyright © 2020-2023  润新知