专栏首页嵌入式知识platform平台总线驱动

platform平台总线驱动

我们知道linux内核中常见的的总线有I2C总线,PCI总线,串口总线,SPI总线,PCI总线,CAN总线,单总线等,所以有些设备和驱动就可以挂在这些总线上,然后通过总线上的match进行设备和驱动的匹配。但是有的设备并不属于这些常见总线,所以我们引入了一种虚拟总线,也就是platform总线的概念,对应的设备叫做platform设备,对应的驱动叫做platform驱动。当然引入platform的概念,可以做的与板子相关的代码和驱动的代码分离,使得驱动有更好的可扩展性和跨平台性。

从Linux2.6内核起,引入一套新的驱动管理和注册机制:platform_device 和 platform_driver 。Linux 中大部分的设备驱动,都可以使用这套机制,设备用 platform_device 表示;驱动用platform_driver 进行注册。

系统启动时自动在bus系统中注册platform,内核移植的人负责提供platform_device,写驱动的人负责提供platform_driver,platform的match函数发现driver和device匹配后(一般是通过名字进行匹配),调用driver的probe函数来完成驱动的初始化和安装,然后设备就工作起来了

1、相关的结构体

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

platform_device结构(设备驱动):

struct platform_device {
       const char      * name;  //名
       int           id;  
       struct device   dev;      //内嵌设备,这个结构体中有一个platform_data的结构体,注意使用
       u32         num_resources;   //资源个数
       struct resource       * resource;   //资源结构体
       struct platform_device_id      *id_entry;
       struct pdev_archdata     archdata;
};
struct resource {
    resource_size_t start;  //起始地址
    resource_size_t end;  //结束地址
    const char *name;   //名
    unsigned long flags;  //标号
    struct resource *parent, *sibling, *child; 
};

2、相关注册函数

platform_driver_register向总线中注册driver,在model_init()中调用

int platform_driver_register(struct platform_driver *drv)
{
    drv->driver.bus = &platform_bus_type;
    if (drv->probe)
        drv->driver.probe = platform_drv_probe;
    if (drv->remove)
        drv->driver.remove = platform_drv_remove;
    if (drv->shutdown)
        drv->driver.shutdown = platform_drv_shutdown;

    return driver_register(&drv->driver);
}

platform_driver_unregister向总线中注销driver,在model_exit()中调用

void platform_driver_unregister(struct platform_driver *drv)
{
    driver_unregister(&drv->driver);
}

platform_device_register:向总线中注册device

/**
 * platform_device_register - add a platform-level device
 * @pdev: platform device we're adding
 */
int platform_device_register(struct platform_device *pdev)
{
    device_initialize(&pdev->dev);
    return platform_device_add(pdev);
}

platform_device_unregister:向总线中注销device

void platform_device_unregister(struct platform_device *pdev)
{
    platform_device_del(pdev);
    platform_device_put(pdev);
}

platdata怎么玩

platdata其实就是设备注册时提供的设备有关的一些数据(譬如设备对应的gpio、使用到的中断号、设备名称····)这些数据在设备和驱动match之后,会由设备方转给驱动方。驱动拿到这些数据后通过这些数据得知设备的具体信息,然后来操作设备。这样做的好处是:驱动源码中不携带数据,只负责算法(对硬件的操作方法)。现代驱动设计理念就是算法和数据分离,这样最大程度保持驱动的独立性和适应性。

3、注册驱动时要做的事

在我们编程的时候,只需要提供platform_device和platform_driver这两个结构体,然后再调用platform_driver_registerplatform_device_register这两个注册函数,当两个结构体中的name一样的时候,自动就会去执行probe函数。最后调用注销函数。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++11—More Effective

    assert又叫断言,C语言中就有。想必也是听说过。在C++11中,使用assert要包含头文件#include <assert.h>,assert主要用来调试...

    用户5426759
  • STL入门

    STL = Standard Template Library,是一个函数库。STL 是由 C++模板编写的一套己纳入 c++标准的类库, 该库解决了通用数据结...

    用户5426759
  • C++之模板、IO流、异常

    泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意。泛型编程的代表作品 STL 是一种高效、泛型、可交互操作的软件组件。泛...

    用户5426759
  • 宋宝华:Linux设备与驱动的手动解绑与手动绑定

    众所周知,Linux靠设备与驱动之间的match,来完成设备与驱动的bind,从而触发驱动的probe()成员函数被执行。每个bus都有相应的match方法,完...

    Linux阅码场
  • 【陆勤践行】DataSchool 推荐的数据科学资源

    Blogs Simply Statistics1: Written by the Biostatistics professors at Johns Hopki...

    陆勤_数据人网
  • Python @property 详解

    Python 有一个概念叫做 property,它能让你在 Python 的面向对象编程中轻松不少。在了解它之前,我们先看一下为什么 property 会被提出...

    py3study
  • java之不同数据流应用举例

    按操作单位的不同分为:字节流(8bit)(InputStream、OuputStream)、字符流(16bit)(Reader、Writer)

    绝命生
  • Java selenium使用ChromeDriver截图 解决get超时后续任务报错问题

    使用selenuium chrome批量截图时,当某一个网页加载很慢时,get方法会阻塞到超时报错,一个报错后 标签页会停滞,url不再变化,而且之后的get也...

    heasy3
  • Eclipse 在 2019 年的最后一次更新,有哪些新亮点?

    如期而至,这是 Eclipse IDE 又一个重要版本。此次更新包含 Java 13 新的 switch 表达式和文本块(text block)。不仅如此,在性...

    Java_老男孩
  • outlook关闭时最小化工具

    outlook本身不能支持设置点击关闭按钮时最小化,而是直接退出。 需要借助一个加载项实现: Keep Outlook Running。

    2Simple

扫码关注云+社区

领取腾讯云代金券