欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux设备驱动-platform虚拟总线dya03

程序员文章站 2022-06-05 17:23:15
...

转载:https://www.cnblogs.com/deng-tao/p/6026373.html

摘要: 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总线管理下的2员大将

(1)两个结构体platform_device和platform_driver

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

在platform总线下就是platform_device和platform_driver,本篇文章先介绍platform_device()设备相关结构体.

3.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;   // 资源指针,可以构成链表
 };
相关标签: 驱动