Linux设备管理(三)_总线设备的挂接
扒完了字符设备,我们来看看平台总线设备,平台总线是Linux中的一种虚拟总线,我们知道,总线+设备+驱动是Linux驱动模型的三大组件,设计这样的模型就是将驱动代码和设备信息相分离,对于稍微复杂一点的驱动,都要使用这种结构,我在"Linux设备管理(一)_kobject, kset,kobj_type分析"一文中提到过将一个设备或驱动挂载到总线就是将这个设备或驱动的kobject挂接到相应的总线kset下的设备kset或驱动kset中,本文就扒一扒内核中注册一个平台设备的源码,验证一下这个说法。整体的调用关系是:platform_device_register()->platform_device_add()->device_add()->kobject_add()
platform_device_register()
在平台设备编程模型中,我们将我们数据封装到一个platform_device结构中后,就可以将设备对象注册到平台总线上
platform_device_register()
--461--> device_initialize()初始化平台设备的父类device结构
--463--> platform_device_add(pdev)将设备挂接到总线设备链表,即注册
//drivers/base/platform.c
37 struct device platform_bus = {
38 .init_name = "platform",
39 };
459 int platform_device_register(struct platform_device *pdev)
460 {
461 device_initialize(&pdev->dev);
462 arch_setup_pdev_archdata(pdev);
463 return platform_device_add(pdev);
464 }
device_initialize()主要是对平台设备的父类device结构进行一些初始化工作
device_initialize()
--702-->dev->kobj.kset = devices_kset;使用全局的devices_kset对象初始化设备的kset中
--703-->kobject_init(&dev->kobj, &device_ktype);使用全局的device_ktype对象初始化设备的kobj对应的kobj_type
--704-->INIT_LIST_HEAD(&dev->dma_pools);初始化设备list_head结构,用于后序的链接
//drivers/base/core.c
700 void device_initialize(struct device *dev)
701 {
702 dev->kobj.kset = devices_kset;
703 kobject_init(&dev->kobj, &device_ktype);
704 INIT_LIST_HEAD(&dev->dma_pools);
...
714 }
platform_device_add()
这个函数才开始真正把平台设备对象挂接到平台总线上
platform_device_add()
--353-->使新的设备的kobject->parent指向全局的平台设备kobject对象
--355-->使设备的总线类型指针指向平台总线对象
--403-->将设备挂接到相应的总线
//drivers/base/platform.c
345 int platform_device_add(struct platform_device *pdev)
346 {
347 int i, ret;
...
352 if (!pdev->dev.parent)
353 pdev->dev.parent = &platform_bus; //挂到平台总线
354
355 pdev->dev.bus = &platform_bus_type;
...
403 ret = device_add(&pdev->dev);
404 if (ret == 0)
405 return ret;
...
421 }
device_add()
之前的工作已经准备好了一个平台设备对象,接下来的工作就是将这个设备挂接到总线上,注册任务就算完成了。
device_add()
--1074-->将设备的kobj挂接到之前填充好的parent的链表中,即平台总线的链表。
//drivers/base/platform.c
1025 int device_add(struct device *dev)
1026 {
1027 struct device *parent = NULL;
1028 struct kobject *kobj;
1029 struct class_interface *class_intf;
1030 int error = -EINVAL;
1031
1032 dev = get_device(dev);
...
1071
1072 /* first, register with generic layer. */
1073 /* we require the name to be set before, and pass NULL */
1074 error = kobject_add(&dev->kobj, dev->kobj.parent, NULL);
...
1138 done:
1139 put_device(dev);
1140 return error;
Linux设备管理(三)_总线设备的挂接的更多相关文章
- Linux设备管理(五)_写自己的sysfs接口
我们在Linux设备管理(一)_kobject, kset,ktype分析一文中介绍了kobject的相关知识,在Linux设备管理(二)_从cdev_add说起和Linux设备管理(三)_总线设备的 ...
- Linux驱动之I2C总线设备以及驱动
[ 导读] 本文通过阅读内核代码,来梳理一下I2C子系统的整体视图.在开发I2C设备驱动程序时,往往缺乏对于系统整体的认识,导致没有一个清晰的思路.所以从高层级来分析一下I2C系统的设计思路,将有助于 ...
- Linux操作系统(三)_部署JDK
一.通过tar.gz压缩包安装 1.在usr目录下创建java目录 cd usr mkdir java 2.用rz命令上传tar.gz安装包到java目录 3.解压tar.gz安装包到当前目录 tar ...
- Linux设备管理(四)_从sysfs回到ktype
sysfs是一个基于ramfs的文件系统,在2.6内核开始引入,用来导出内核对象(kernel object)的数据.属性到用户空间.与同样用于查看内核数据的proc不同,sysfs只关心具有层次结构 ...
- Linux设备管理(四)_从sysfs回到ktype【转】
转自:https://www.cnblogs.com/xiaojiang1025/archive/2016/12/21/6202298.html sysfs是一个基于ramfs的文件系统,在2.6内核 ...
- Linux设备管理(二)_从cdev_add说起
我在Linux字符设备驱动框架一文中已经简单的介绍了字符设备驱动的基本的编程框架,这里我们来探讨一下Linux内核(以4.8.5内核为例)是怎么管理字符设备的,即当我们获得了设备号,分配了cdev结构 ...
- Linux I2C核心、总线和设备驱动
目录 更新记录 一.Linux I2C 体系结构 1.1 Linux I2C 体系结构的组成部分 1.2 内核源码文件 1.3 重要的数据结构 二.Linux I2C 核心 2.1 流程 2.2 主要 ...
- 嵌入式Linux学习笔记(三) 字符型设备驱动--LED的驱动开发
在成功构建了一个能够运行在开发板平台的系统后,下一步就要正式开始应用的开发(这里前提是有一定的C语言基础,对ARM体系的软/硬件,这部分有疑问可能要参考其它教程),根据需求仔细分解任务,可以发现包含的 ...
- Linux的总线设备驱动模型
裸机编写驱动比较自由,按照手册实现其功能即可,每个人写出来都有很大不同: 而Linux中还需要按照Linux的驱动模型来编写,也就是需要按照"模板"来写,写出来的驱动就比较统一. ...
随机推荐
- Apache Ignite高性能分布式网格框架-初探
Apache Ignite初步认识 今年4月开始倒腾openfire,过程中经历了许多,更学到了许多.特别是在集群方面有了很多的认识,真正开始认识到集群的概念及应用方法. 在openfire中使用的集 ...
- 冒泡,setinterval,背景图的div绑定事件,匿名函数问题
1.会冒泡到兄弟元素么? $(function(){ $("#a").click(function(){alert("a")}) $("#b" ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- javascript匹配各种括号书写是否正确
今天在codewars上做了一道题,如下 看上去就是验证三种括号各种嵌套是否正确书写,本来一头雾水,一种括号很容易判断, 但是三种怎么判断! 本人只是个前端菜鸟,,不会什么高深的正则之类的. 于是,在 ...
- 套用JQuery EasyUI列表显示数据、分页、查询
声明,本博客从csdn搬到cnblogs博客园了,以前的csdn不再更新,朋友们可以到这儿来找我的文章,更多的文章会发表,谢谢关注! 有时候闲的无聊,看到extjs那么肥大,真想把自己的项目改了,最近 ...
- 深入理解 Java G1 垃圾收集器--转
原文地址:http://blog.jobbole.com/109170/?utm_source=hao.jobbole.com&utm_medium=relatedArticle 本文首先简单 ...
- Java 时间类-Calendar、Date、LocalDate/LocalTime
1.Date 类 java.util.Date是一个"万能接口",它包含日期.时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪 ...
- 脑洞大开之采用HTML5+SignalR2.0(.Net)实现原生Web视频
目录 对SignalR不了解的人可以直接移步下面的目录 SignalR系列目录 前言 - -,我又来了,今天废话不多说,我们直接来实现Web视频聊天. 采用的技术如下: HTML5 WebRTC Si ...
- Kafka副本管理—— 为何去掉replica.lag.max.messages参数
今天查看Kafka 0.10.0的官方文档,发现了这样一句话:Configuration parameter replica.lag.max.messages was removed. Partiti ...
- 中文 iOS/Mac 开发博客列表
中文 iOS/Mac 开发博客列表 博客地址 RSS地址 OneV's Den http://onevcat.com/atom.xml 一只魔法师的工坊 http://blog.ibireme.com ...