zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    面向对象编程总结Python
    垃圾收集器与内存分配策略
    自定义异常、异常处理注意点
    关于线程【一】——线程创建、停止、interrupted()和isInterrupted()区别
    Java内存区域
    HotSpot虚拟机对象
    异常——try、catch、finally、throw、throws
    关于线程【二】——线程同步和异步
    fillder代理调试
    新鲜出炉的Asp.Net MVC电子书
  • 原文地址:https://www.cnblogs.com/idyllcheung/p/11851681.html
Copyright © 2011-2022 走看看