扒完了字符设备,我们来看看平台总线设备,平台总线是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.c37 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.c700 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.c345 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;

转载于:https://www.cnblogs.com/xiaojiang1025/p/6201290.html

Linux设备管理(三)_总线设备的挂接相关推荐

  1. linux驱动开发篇(三)—— 总线设备驱动模型

    linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...

  2. linux下看pcie的设备id,linux lspci查看pci总线设备信息

    linux lspci查看pci总线设备信息 linux中lspci是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具,比如查看网卡.存储等信息. 参数 -v 使得 lspci 以 ...

  3. linux配置usb主从_基于Linux的USB主/从设备之间的三种通信方式

    随着简单易用的USB接口日益流行,在嵌入式系统中添加对USB接口的支持已成为大势所趋.本文通过介绍Linux中支持USB的各种模块和库,分析了在Linux上利用USB实现高速串口和以太网连接等通信方式 ...

  4. linux配置usb主从_基于Linux的USB 主/从设备之间通讯的三种方式

    转载:http://archive.eet-china.com/www.eet-china.com/ART_8800323770_617693_TA_eda530e7.HTM 随着简单易用的USB接口 ...

  5. Linux源码阅读——PCI总线驱动代码(三)PCI设备枚举过程

    目录 前言 1.枚举过程 1.1 acpi_pci_root_add 1.2 pci_acpi_scan_root(枚举开始) 1.3 acpi_pci_root_create 1.4 pci_sca ...

  6. linux一个spi总线挂多个设备,Linux SPI总线设备驱动模型详解

    随着技术不断进步,系统的拓扑结构越来越复杂,对热插拔.跨平台移植性的要求越来越高,早期的内核难以满足这些要求,从linux2.6内核开始,引入了总线设备驱动模型.其实在linux2.4总线的概念就已经 ...

  7. linux设备管理之设备号与次设备号

    linux设备管理之主设备号与次设备号 - jinzi - 博客园+ 剽窃 过来的.  记录下,以备查. 主设备号和次设备号 一个字符设备或者块设备都有一个主设备号和次设备号.主设备号和次设备号统称为 ...

  8. Linux驱动开发_设备文件系统详解

    目录 何为设备管理器? Linux下dev的作用 Devfs sysfs kobject udev proc 何为设备管理器? 设备管理器就是负责管理这台电脑上的外设,当我们通过电脑提供的USB口插入 ...

  9. 基于Linux的USB 主/从设备之间通讯的三种方式

    转载:http://archive.eet-china.com/www.eet-china.com/ART_8800323770_617693_TA_eda530e7.HTM 随着简单易用的USB接口 ...

最新文章

  1. ROS、realsense开发常用命令汇总
  2. 牛批了,1行python代码就可实现炫酷可视化
  3. 互联网老师论坛高调炫耀收入:硕士毕业三年,月入九万多!
  4. Mysql:查询当天、今天、本周、上周、本月、上月、本季度、本年的数据
  5. [android] 异步http框架与实现原理
  6. 采用 facebook 的prophet 预测科大讯飞的股票开盘价
  7. Python3安装Scrapy爬虫框架
  8. git提交时报错:Updates were rejected because the tip of your current branch is behind
  9. 【CodeForces - 760B 】Frodo and pillows (二分题意,注意细节)
  10. python memoryview_memoryview的用法
  11. php 合并 js css,PHP实现合并多个JS和CSS文件示例
  12. python35安装教程_python详细安装教程,非常值得看的一篇文章
  13. html5 drawimage 不显示,javascript – 来自视频的HTML5 Canvas drawImage在第一次绘制时不显示...
  14. UUID生成唯一激活码
  15. TinyWeb--C++构建高性能Web服务器
  16. 火绒阻止腾讯过度侵权行为,马化腾自查承认是团队违规,腾讯电脑管家道歉
  17. 腾科张老师教你如何在cisco路由器上部署和使用FTP/TFTP
  18. 论文笔记 EMNLP 2020|Graph Transformer Networks with Syntactic and Semantic Structures for Event Argument
  19. 线程死锁 导致 服务器cpu负载过高
  20. 微信小程序云开发——图片展示,视频播放案例

热门文章

  1. c#制作发行版 vs_vs2019制作多项目工程模板 - Jackie Hao
  2. python正则表达式案例_Python正则表达式使用经典实例
  3. android串口service,Android串口操作库:EZ-SerialPort
  4. c语言考试常考大题,C语言题库经典题 考试常考题.doc
  5. Linux下的JAVA命令参数_以java命令为例解析linux命令行调用语句
  6. Auto.js 全命令整理(二) 对应用命令专题
  7. Android自定义Button样式(水平滑动多个Button)
  8. Matt Speake
  9. 字节数与字符数mysql_mysql 数值与字符类型 长度梳理
  10. 20200208(补):翻转游戏Ⅰ Ⅱ(leetcode)