参考连接:https://www.cnblogs.com/deng-tao/p/6026373.html
参考书:<Linux设备驱动开发详解>宋宝华
根据参考资料和同事讨论总结.

摘要: platform的原理及相关结构体

1、什么是platform(平台)总线?

相对于USB、PCI、I2C、SPI等物理总线来说,platform总线是一种虚拟、抽象出来的总线,实际中并不存在这样的总线。

那为什么需要platform总线呢?
其实是Linux设备驱动模型为了保持设备驱动的统一性而虚拟出来的总线。因为对于usb设备、i2c设备、pci设备、spi设备等等,他们与cpu的通信都是直接挂在相应的总线下面与我们的cpu进行数据交互的,但是在我们的嵌入式系统当中,并不是所有的设备都能够归属于这些常见的总线,在嵌入式系统里面,SoC系统中集成的独立的外设控制器、挂接在SoC内存空间的外设却不依附与此类总线。所以Linux驱动模型为了保持完整性,将这些设备挂在一条虚拟的总线上(platform总线),而不至于使得有些设备挂在总线上,另一些设备没有挂在总线上。

platform总线相关代码:driver\base\platform.c 文件

相关结构体定义:include\linux\platform_device.h 文件中

2.通俗理解

Platform虚拟总线
总线两边分别挂接设备和驱动,设备和驱动互相探测,一旦探测成功(基于设备树风格的匹配,基于ID表,基于设备名和驱动名)就可以对设备进行操作了.

设备驱动的开发,我们可以总结为以下顺序:
定义platform_device
注册platform_device
定义platform_driver
注册platform_driver

单片机是直接拿寄存器控制硬件.
而嵌入式设备因为有操作系统,必须通过驱动来控制硬件设备.

3.platform平台总线工作原理
平台总线体系的工作流程
(1)第一步:系统启动时在bus系统中注册platform
(2)第二步:内核移植的人负责提供platform_device
(3)第三步:写驱动的人负责提供platform_driver
(4)第四步:platform的match函数发现driver和device匹配后,调用driver的probe函数来完成驱动的初始化和安装,然后设备就工作起来了

4.platform总线管理下的2员大将

两个结构体platform_device和platform_driver

对于任何一种Linux设备驱动模型下的总线都由两个部分组成:
描述设备相关的结构体和描述驱动相关的结构体

在platform总线下就是platform_device和platform_driver

(1)platform_device结构体:(include\linux\platform_device.h)

 struct platform_device {           //  platform总线设备const char    * name;          //  平台设备的名字int id;                 //   ID 是用来区分如果设备名字相同的时候(通过在后面添加一个数字来代表不同的设备,因为有时候有这种需求)struct device dev;          //   内置的device结构体u32 num_resources;      //   资源结构体数量struct resource * resource; //   指向一个资源结构体数组const struct platform_device_id *id_entry; //  用来进行与设备驱动匹配用的id_table表/* arch specific additions */struct pdev_archdata archdata;        //  自留地    添加自己的东西};

platform_device结构体中的struct resource结构体分析:

 struct resource {      // 资源结构体resource_size_t start;      // 资源的起始值,如果是地址,那么是物理地址,不是虚拟地址resource_size_t end;        // 资源的结束值,如果是地址,那么是物理地址,不是虚拟地址const char *name;           // 资源名unsigned long flags;        // 资源的标示,用来识别不同的资源struct resource *parent, *sibling, *child;   // 资源指针,可以构成链表};

(2)platform_driver结构体

struct platform_driver(){
int (*probe) (struct platform_device *);
int (*remove) (struct platform_device *);
void (*shutdown) (struct platform_device *);
int (*suspend) (struct platform_device *,pm_message_t state);
int (*resume) (struct platform_device *);
struct device_driver driver;
const struct platform_device_id *id_table;
bool prevent_deferred_probe;
};

其中,device_driver结构体定义如下:

struct device_driver {const char *name;struct bus_type *bus;struct module *owner;const char *mod_name;   /*used for built-in modules*/bool suppress_bind_attrs;  /*disables bind/unbind via sysfs*/const struct of_device_id *of_match_table;const struct acpi_device_id *acpi_match_table;int (*probe) (struct device *dev);int (*remove) (struct device *dev);void (*shutdown) (struct device *dev);int (*suspend) (struct device *dev,pm_message_t state);int (*resume) (struct device *dev);const struct attribute_group **groups;const struct dev_pm_ops *pm;struct driver_private *p;
};

与platform_driver地位对等的i2c_driver,spi_driver,usb_driver等都包含device_driver结构体实例成员,他其实描述了xxx_driver(xxx是总线名)在驱动意义上的一些共性.

在Linux4.0以后,内核直接使用设备树来管理设备信息.设备树中包含寄存器地址,中断号等信息,直接写成一个文本文档,bootloader会将"这棵树"传给内核,内核解析其中的内容,进而展开内核中的platform_device,i2c_client,spi_device等设备. 驱动程序直接从设备树的name进行匹配, 匹配到就可以通过platform_get_resource函数得到设备信息和寄存器信息等,进而控制硬件设备.

Linux设备驱动-platform虚拟总线dya01相关推荐

  1. Linux设备驱动-platform虚拟总线dya02

    参考书:<linux设备驱动开发详解>宋宝华 上一篇介绍了platform的基本构成与源码,本篇用实例来说明platform的实现. 参考书中介绍了一个名为globalfifo的驱动,以他 ...

  2. Linux设备驱动之——I2C总线

    2  I2C子系统 2.1 LinuxI2C子系统架构 在内核中已经提供I2C子系统,所以在做I2C驱动之前,就必须要熟悉该子系统. 2.2 三大组成部分 1.I2C核心(i2c-core) I2C核 ...

  3. Linux设备驱动模型2——总线式设备驱动组织方式

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 更深入理解资料:http://blog.csdn.net/oqqhutu12345678/article/details/78933386 ...

  4. Linux设备驱动——接口与总线

    文章目录 串口 IIC SPI USB 以太网接口 串口 RS-232.RS-422.RS-485都是串行数据接口标准,最初是由电子工业协会(EIA)制定并发布的. 如今,RS-232的修改版RS-2 ...

  5. linux设备驱动之PCI总线概述

    文章目录 总线概念 PCI总线 PCI总线体系结构 PCI设备寻址 PCI寻址 配置寄存器 总线概念 总线是一种传输信号的信道:总线是连接一个或多个半导体的电气连线.总线由电气接口和编程接口组成,对于 ...

  6. linux平台设备驱动模型是什么意思,Linux设备驱动模型之我理解

    点击(此处)折叠或打开 /* my_bus.c   */ #include #include #include #include #include #include "my_bus.h&qu ...

  7. 【Linux开发】linux设备驱动归纳总结(九):1.platform总线的设备和驱动

    linux设备驱动归纳总结(九):1.platform总线的设备和驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  8. Linux设备驱动模型之platform(平台)总线详解

    /********************************************************/ 内核版本:2.6.35.7 运行平台:三星s5pv210 /*********** ...

  9. linux设备驱动之总线、设备、驱动

    文章转载至多个地方,网上拼凑的一篇文章,说的好听一些的话那就叫自己总结的文章,只 是多次引用啊,哈哈,哎,不管了,反正这个有利用学习进步就好,这是重要的,文章转载过来要经过一篇大脑才能成为自己的,以后 ...

最新文章

  1. Oracle查询性能优化
  2. 【codevs2011】【LNOI2013】最小距离之和
  3. MIT 6.828 JOS学习笔记17. Lab 3.1 Part A User Environments
  4. 使用alipaySDK编译时找不到openssl/asn1.h文件的解决办法(初探)
  5. 获取URL中 后面的参数值
  6. c#中高效的excel导入oracle的方法(转)
  7. java管理系统代码bs_基于BS的人力资源管理系统 - WEB源码|JSP源码/Java|源代码 - 源码中国...
  8. Downloading SRA data using command line utilities
  9. 深度学习中拟合是什么意思?
  10. 关于监听套接字的形象解释
  11. mybatis自动生成service、dao、mapper
  12. sap期初导资产代码_SAP S/4固定资产导入期初科目设置
  13. 学员故事|老男孩网络安全学习感悟,结果让我意外!
  14. php单击回复出现回复框,javascript - 评论回复框的显示与隐藏问题
  15. css筋斗云,JavaScript实现精美个性导航栏筋斗云效果
  16. C++静态库和动态库的导入导出
  17. 论文阅读:《POI: Multiple Object Tracking with High Performance Detection and Appearance Feature 》
  18. FSSC22000认证咨询,本程序适用与食品安全体系中的产品危害信息收集、分析和评估等所有活动
  19. 数据库面试题(选择题)
  20. 手动清除网卡IP的Linux命令

热门文章

  1. 我的世界java版如何装mod_我的世界MOD怎么安装 我的世界mod安装教程
  2. 元祖字典 java_元祖和字典
  3. Rails db rake命令
  4. rails连接Mysql的数据库
  5. Coremail论客全球安全生态合作伙伴召集令正式启动
  6. @EnableConfigurationProperties 注解
  7. MacBook 通过Boot Camp安装win7双系统时提示缺少所需的CD/DVD驱动器设备驱动程序。
  8. Remove specific element by editing the array
  9. 魔力宝贝 mysql,[转载]教学【如何架设魔力宝贝私人服务器】
  10. python编译器包括的简单过程_python基础第二课