searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Linux platform设备驱动

2024-05-21 03:15:02
6
0

SOC上某些设备不依赖于具体的总线(如I2C,PCI,USB,SPI等),但是需要将它们纳入linux的设备模型,因此引入了platform 总线。

在linux内核中,platform 总线是一种虚拟的总线,用于将没有专用总线的设备连接到内核中。对应会有 platform_driver 和 platform_device

一、platform总线

结构体bus_type 表示总线,platform 总线是 bus_type 的一个具体实例:

struct bus_type platform_bus_type = {

.name = "platform",
.dev_groups = platform_dev_groups,
.match = platform_match,
.uevent = platform_uevent,
.pm = &platform_dev_pm_ops,
};
platform_match 用于匹配设备与驱动

驱动和设备的匹配有四种方法:
1、 OF 类型的匹配,也就是设备树采用的匹配方式,
of_driver_match_device 函数定义在文件 include/linux/of_device.h 中。
device_driver 结构体 ( 表示 设备驱动 ) 中有个名为 of_match_table 的成员变量,此成员变量保存着驱动的 compatible 匹配表, 设备树中的每个设备节点的 compatible 属性会和 of_match_table 表中的所有成员比较,查看是 否有相同的条目,如果有的话,就表示设备和此驱动匹配,设备和驱动匹配成功以后 probe 函数 就会执行。
2、ACPI 匹配方式。
3、id_table 匹配,每个 platform_driver 结构体有一个 id_table成员变量,顾名思义,保存了很多 id 信息。这些 id 信息存放着这个 platform 驱动所支持的驱 动类型。
4、如果第三种匹配方式的 id_table 不存在的话,就直接比较驱动和 设备的 name 字段,看看是不是相等,如果相等的话就匹配成功。
对于支持设备树的 Linux 版本号,一般设备驱动为了兼容性,都支持设备树和无设备树两种匹配方式。
也就是第一种匹配方式一般都会存在,第三种和第四种只要存在一种就可以,一般用的最多的还是第四种,也就是直接比较驱动和设备的 name 字段,毕竟这种方式最简单了。

 

二、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; 
};

定义好具体的驱动后,调用注册接口,向linux内核注册驱动

int platform_driver_register (struct platform_driver *driver) 

 

三、platform device

描述platform的设备信息

1、有设备树时

在设备树中创建设备节点来描述设备信息,重点是要设置好 compatible属性的值,因为 platform 总线需要通过设备节点的 compatible 属性值来匹配驱动。

2、无设备树时

在源码中定义设备,并调用int platform_device_register(struct platform_device *)向内核注册设备

0条评论
0 / 1000
c****j
1文章数
0粉丝数
c****j
1 文章 | 0 粉丝