uboot驱动模型(DM)分析(二) (转)
上篇分析了两个关键宏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)分析(二) (转)的更多相关文章
- [uboot] (番外篇)uboot 驱动模型(转)重要
[uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到D ...
- 领域驱动模型DDD(二)——领域事件的订阅/发布实践
前言 凭良心来说,<微服务架构设计模式>此书什么都好,就是选用的业务过于庞大而导致代码连贯性太差,我作为读者来说对于其中采用的自研框架看起来味同嚼蜡,需要花费的学习成本实在是过于庞大,不仅 ...
- LINUX设备驱动模型之class
转自 https://blog.csdn.net/qq_20678703/article/details/52754661 1.LINUX设备驱动模型中的bus.device.driver,.其中bu ...
- linux设备驱动模型之Kobject、kobj_type、kset【转】
本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74838165 版权声明:本文为博主原创文章,转载请注明http://blog.c ...
- u-boot下的DM驱动模型 阶梯状 (转)
U-boot 下DM驱动模型的相关笔记要注意的关键两点: DM驱动模型的一般流程bind->ofdata_to_platdata(可选)->probe 启动,bind操作时单独完成的 ...
- uboot的驱动模型理解
uboot的驱动模型,简称dm, 具体细节建议参考./doc/driver-model/README.txt 关于dm的三个概念: uclass:一组同类型的devices,uclass为同一个gro ...
- 【tornado】系列项目(二)基于领域驱动模型的区域后台管理+前端easyui实现
本项目是一个系列项目,最终的目的是开发出一个类似京东商城的网站.本文主要介绍后台管理中的区域管理,以及前端基于easyui插件的使用.本次增删改查因数据量少,因此采用模态对话框方式进行,关于数据量大采 ...
- linux RTC 驱动模型分析【转】
转自:http://blog.csdn.net/yaozhenguo2006/article/details/6824970 RTC(real time clock)实时时钟,主要作用是给Linux系 ...
- Linux Platform驱动模型(二) _驱动方法
在Linux设备树语法详解和Linux Platform驱动模型(一) _设备信息中我们讨论了设备信息的写法,本文主要讨论平台总线中另外一部分-驱动方法,将试图回答下面几个问题: 如何填充platfo ...
随机推荐
- d3实现折线图
如果觉得作者写的对你有用,可以打赏作者哦!owo 多少不限,支持而已. 实现折线图不得不说的是d3的线段生成器: 假设data=[1,2,5,7,5,8,2,6]var line = d3.svg. ...
- chgrp 命令
NAME chgrp - change group ownership SYNOPSIS chgrp [OPTION]... GROUP FILE... chgrp [OPTION]... --ref ...
- VUE 1.0
现代开发模式:vue/react. 20%的时间花在了表现层 传统开发模式:jquery. 80%的时间花在了表现层 MVC——数据.表现.行为分离 视图层(表现层)<----->数据层 ...
- [转帖]图解SSL/TLS协议
图解SSL/TLS协议 作者: 阮一峰 日期: 2014年9月20日 感谢 腾讯课堂NEXT学院 赞助本站,腾讯官方的前端课程 免费试学. http://www.ruanyifeng.com/bl ...
- SpringBoot起飞系列-国际化(六)
一.前言 国际化这个功能可能我们不常用,但是在有需要的地方还是必须要上的,今天我们就来看一下怎么在我们的web开发中配置国际化,让我们的网站可以根据语言来展示不同的形式.本文接续上一篇SpringBo ...
- PAT B1027 打印沙漏(20)
思路: 使用数组保存每一行沙漏的最大符号数 输入一个正整数和一个符号 遍历数组,找到大于正整数的数组下标 j. 三角形底边的字符数为 (j - 1) * 2 - 1 打印沙漏 打印剩余字符:x - n ...
- 16-Perl 文件操作
1.Perl 文件操作Perl 使用一种叫做文件句柄类型的变量来操作文件.从文件读取或者写入数据到文件需要使用文件句柄.文件句柄(file handle)是一个I/O连接的名称.Perl提供了三种文件 ...
- 实现Banner广告图片轮换
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- MySQL解惑——GROUP BY隐式排序
原文:MySQL解惑--GROUP BY隐式排序 MySQL中GROUP BY隐式排序是什么概念呢? 主要是其它RDBMS没有这样的概念,如果没有认真了解过概念,对这个概念会感觉有点困惑,我们先来看看 ...
- C#发送Outlook邮件(仅SMTP版本)
先表明Outlook的参数:网址:https://support.office.com/zh-cn/article/Outlook-com-%E7%9A%84-POP%E3%80%81IMAP-%E5 ...