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

  • 相关阅读:
    博客背景美化——动态雪花飘落
    尼姆博弈+SG函数
    2016 CCPC-Final-Wash(优先队列+贪心)
    【php】---mysql语法增、删、改、查---【巷子】
    【php】---mysql---基本操作及使用---【巷子】
    【Object.prototype.toString.call()】---判断某个对象属于哪种内置类型------【巷子】
    【webpack】---模块打包机webpack基础使用---【巷子】
    设计模式---003代理模式---【巷子】
    设计模式---002适配模式---【巷子】
    设计模式---001单例模式---【巷子】
  • 原文地址:https://www.cnblogs.com/idyllcheung/p/11851681.html
Copyright © 2011-2022 走看看