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

原文地址:https://www.cnblogs.com/idyllcheung/p/11851681.html