上篇分析了两个关键宏U_BOOT_DRIVER及U_BOOT_DEVICES的作用,有了上篇的基础,本文将分析:

1.上篇中的uboot_list段中的信息如何被用起来?

2.uclass,uclass_driver,udevice,driver之间的关系?

从board_r.c中的initr_dm函数开始分析:

1 static const struct driver_info root_info = {
2 .name = "root_driver",
3 };
 1 /* This is the root driver - all drivers are children of this */
2 U_BOOT_DRIVER(root_driver) = {
3 .name = "root_driver",
4 .id = UCLASS_ROOT,
5 .priv_auto_alloc_size = sizeof(struct root_priv),
6 };
7
8 /* This is the root uclass */
9 UCLASS_DRIVER(root) = {
10 .name = "root",
11 .id = UCLASS_ROOT,
12 };

initr_dm

  ret = dm_init_and_scan(false);

    dm_init

      INIT_LIST_HEAD(&DM_UCLASS_ROOT_NON_CONST);  //#define DM_UCLASS_ROOT_NON_CONST (((gd_t *)gd)->uclass_root) 创建头结点gd->uclass_root

      ret = device_bind_by_name(NULL, false, &root_info, &DM_ROOT_NON_CONST);

        drv = lists_driver_lookup_name(info->name);  //lists_driver_lookup_name("root_driver")  

             struct driver *drv =ll_entry_start(struct driver, driver);  //通过上篇分析,此处得到的是uboot_list_2_driver_1的地址

              const int n_ents = ll_entry_count(struct driver, driver);  //uboot_list_2_driver_3-uboot_list_2_driver_1即得到长度

              for (entry = drv; entry != drv + n_ents; entry++) {    //遍历,通过name字段匹配,匹配成功得到driver结构体地址

                if (!strcmp(name, entry->name))
                   return entry;
              }

           device_bind_common(parent, drv, info->name, (void *)info->platdata, 0, ofnode_null(), platdata_size, devp);

            ret = uclass_get(drv->id, &uc);            

              struct uclass *uc;

              uc = uclass_find(id);              

              if (!uc)

                return uclass_add(id, ucp); //通过上面得到的drv中的id字段(UCLASS_ROOT)进行匹配,匹配成功得到对应的uclass_driver结构体地址

              uc->uc_drv = uc_drv;  //uclass root的uclass_driver指向uclass_driver root   

              INIT_LIST_HEAD(&uc->sibling_node);
              INIT_LIST_HEAD(&uc->dev_head);
              list_add(&uc->sibling_node, &DM_UCLASS_ROOT_NON_CONST);

            .......

            //关键代码如下

            INIT_LIST_HEAD(&dev->sibling_node);
            INIT_LIST_HEAD(&dev->child_head);
            INIT_LIST_HEAD(&dev->uclass_node);

            dev->name = name;

            dev->node = node;

            dev->parent = parent;

            dev->driver = drv;

            dev->uclass = uc;

            ......

            ret = uclass_bind_device(dev);

              uc = dev->uclass;

              list_add_tail(&dev->uclass_node, &uc->dev_head);

---------------------------------------------------------------------------------------------------------------------------------------------

经过上述源码阅读,下面将上述关系用图的形式更直观的表现出来:

转自https://www.cnblogs.com/gs1008612/p/8253213.html

uboot驱动模型(DM)分析(二) (转)的更多相关文章

  1. [uboot] (番外篇)uboot 驱动模型(转)重要

    [uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到D ...

  2. 领域驱动模型DDD(二)——领域事件的订阅/发布实践

    前言 凭良心来说,<微服务架构设计模式>此书什么都好,就是选用的业务过于庞大而导致代码连贯性太差,我作为读者来说对于其中采用的自研框架看起来味同嚼蜡,需要花费的学习成本实在是过于庞大,不仅 ...

  3. LINUX设备驱动模型之class

    转自 https://blog.csdn.net/qq_20678703/article/details/52754661 1.LINUX设备驱动模型中的bus.device.driver,.其中bu ...

  4. linux设备驱动模型之Kobject、kobj_type、kset【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74838165 版权声明:本文为博主原创文章,转载请注明http://blog.c ...

  5. u-boot下的DM驱动模型 阶梯状 (转)

    U-boot 下DM驱动模型的相关笔记要注意的关键两点: DM驱动模型的一般流程bind->ofdata_to_platdata(可选)->probe    启动,bind操作时单独完成的 ...

  6. uboot的驱动模型理解

    uboot的驱动模型,简称dm, 具体细节建议参考./doc/driver-model/README.txt 关于dm的三个概念: uclass:一组同类型的devices,uclass为同一个gro ...

  7. 【tornado】系列项目(二)基于领域驱动模型的区域后台管理+前端easyui实现

    本项目是一个系列项目,最终的目的是开发出一个类似京东商城的网站.本文主要介绍后台管理中的区域管理,以及前端基于easyui插件的使用.本次增删改查因数据量少,因此采用模态对话框方式进行,关于数据量大采 ...

  8. linux RTC 驱动模型分析【转】

    转自:http://blog.csdn.net/yaozhenguo2006/article/details/6824970 RTC(real time clock)实时时钟,主要作用是给Linux系 ...

  9. Linux Platform驱动模型(二) _驱动方法

    在Linux设备树语法详解和Linux Platform驱动模型(一) _设备信息中我们讨论了设备信息的写法,本文主要讨论平台总线中另外一部分-驱动方法,将试图回答下面几个问题: 如何填充platfo ...

随机推荐

  1. CRLF注入漏洞

    CRLF是“回车+换行”(\r\n,%0d%0a)的简称. HTTP协议中,HTTP Header之间以一个CRLF分隔,Header与Body以两个CRLF分隔.URL重定向通常通过响应头中的Loc ...

  2. 在windows系统电脑上同时安装python2.x和python3.x版本

    在同一个电脑机子(windows系统)上安装同时安装python2.x和python3.x版本. 一.python2.x和python3.x安装 步骤1:在python官网(https://www.p ...

  3. zping ping包工具20180605.exe测试版

    链接: https://pan.baidu.com/s/1WB3BZn0r9n4DRU_8bNC65g 提取码: mybi zping的第一个exe版本由于未对兼容性进行测试,使用python3.6编 ...

  4. 使用echo $? 查看命令成功执行的原理

    转载于:http://blog.csdn.net/cmzsteven/article/details/49049387 在进行源代码编译,或者执行命令无法确认所执行的命令是否成功执行的情况下,我们都会 ...

  5. 栈与队列基本操作 Java实现

    一.顺序栈 //数组实现顺序栈 public class OrderStack { private String[] elem; private int top; OrderStack(int k) ...

  6. ByteArrayInputStream类

    一.说明 哈哈,这是学习Java之路的第一篇博文.虽然说接触学习Java有一段时间了,但是对流的概念一直并不是很清楚.也看了很多资料,但是感觉还是非常的抽象很难去理解.但是流又是Java中很重要的一部 ...

  7. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  8. mysql-tpcc测试

    os: centos 7.4 db: mysql 5.7 software: tpcc-mysql TPC-C是专门针对联机交易处理系统(OLTP系统)的规范. tpcc-mysql是percona基 ...

  9. List与Set区别

    List: 元素有序放入,元素可重复 Set: 元素无序保存,元素不可重复(通过==判断,非基本类型判断的是引用地址),因为set是无序的,故只能通过迭代器循环.ps:说是无序,但是其实set中的元素 ...

  10. 修改NPM默认全局安装路径

    场景: 最近在新电脑上鼓捣完环境后,打算切换下源,结果使用全局安装的nrm时提示找不到命令,之前都是这么用现在怎么不行了呢? 排查过程: 于是各种折腾,发现- g安装的插件目录在C盘中的某个路径中,后 ...