platform device

platform deviceplatformdevice================= 头文件:linux/platform_device.h  为什么使用platformdevice?————————–    从硬件的角度来说,集成在嵌入式芯片内部的外设离CPU最近,它们不依附于GPIO或者PCI,I2C此类的 总线,它们挂接在soc内存空

大家好,又见面了,我是你们的朋友全栈君。platform device

=================

  头文件:linux/platform_device.h

  

为什么使用 platform device?

————————–

    

  从硬件的角度来说,集成在嵌入式芯片内部的外设离CPU最近,它们不依附于GPIO或者PCI,I2C此类的

  总线,它们挂接在soc内存空间,cpu靠操作这些soc内存空间来控制这些片内的外设。

  从驱动的角度,为了获取这些挂接在soc内存空间的外设的资源,linux系统专门定义了一类总线来

  挂接它们。这就是platform总线,挂接在此总线上的设备称为platform device,操作设备的驱动

  叫做platform driver。

  platform device的作用就是描述片内外设的资源,结构体的定义如下

  struct platform_device{


    const char *name;
// 设备号

    struct device *dev;



    u32 num_resources;
// 设备使用的资源的数量


    struct resource *resource;
// 资源数组

  };

  而platform driver的作用就是获得platform device描述的这些资源,并加以利用。结构体的定义

  如下

  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;//描述支持的设备的名单

  };  

  其中probe函数–平台探测函数,就是平台设备驱动存在的首要目的,它的作用就是获取平台设备的资源

  然后用这些资源坐其他的工作。比如,LCD platform driver的probe函数就是要获得LCD控制器的

  资源,还有其他的诸如分配显示内存等准备工作,然后再注册framebuffer设备。I2C也是一样,在平台

  探测函数中初始化I2C设备的资源,然后注册i2c_adapter。

如何使用platform device

———————–

  首先,platform device描述的是cpu的片内外设的资源,,属于板级配置,所以习惯上需要在系统初

  始化阶段(一般在arch init阶段)被注册。有两种方式

  –>int platform_add_devices(struct platform_device device_array[], int 

     array_size);

     定义一个platform_device数组,然后一举进行注册,一块板子可以定义多个数组在不同的初始化

     阶段注册

  –>int platform_device_register(struct platform_device *);

     单独对某个platform device进行注册

  

  platform data: platform_device结构体中的dev成员,它的类型为struct device,在这个结

  构体中定义了一个void* platform_data,它被用来指向平台的设备需要的数据。比如LCD控制器需要

  驱动具体的LCD显示屏,这个显示屏有诸多参数如同步信号引脚的信号极性,显示屏的分辨率即像素位等

  等。驱动程序不知道当前的系统用的是什么显示设备(可能还不是LCD)以及这些LCD屏的参数都是些什么

  ,所以这些参数在板级数据里面定义起来,并且被被platform_data指向以便于驱动程序读取。

  其次,如何进行匹配,基一个platform device怎样对应一个platform driver去驱动它。稍微细心

  一点就会想到platform_device中的name该不会真的就只是个name而已吧。形象地说它是一个type!

  当有一个platform driver被注册的时候,platform总线首先会遍历总线上的设备并对其name进行

  匹配,如果匹配成功,那么就会传入这个设备的指针并调用设备驱动的probe函数进行…这里是遍历,

  遍历的意思就是可能全部找完,隐含意思就是可能这个name会匹配多次-那么就进行多次的probe调用!

  在设计probe函数的时候应注意此项特性,一般会在platform_device成员dev(struct device)

  的子成员id中进行区别,当系统有多个同类设备时(比如多个LCD控制器)dev.id会被设置成不同的值

  以区别不同的设备。从而也看出,platform_driver中id_table(struct platform_device_id)

  成员存在的意义了,表明它可以支持的设备嘛。

probe函数

———

  probe函数即平台探测函数,作用就是获取平台设备的资源,然后干一些其他的事情,总之就是为某一项

  功能模块做好准备工作。常见的步骤如下(对于软硬件资源的获取,都会有错误检测,一般有错误就返回

  一个错误码表示失败了)

  

  –>首先获取platform data(如果需要)

  –>获得需要的平台设备的IO资源且ioremap

  –>获得中断号(如果需要)并申请中断(在恰当时)

  –>获得设备时钟,并使能时钟(如果需要对寄存器进行设置)

  –>设置其他资源,参数(需要分配内存,初始化锁…)以及自己的结构体

  –>初始化平台设备

  –>向系统注册某项功能(如framebuffer设备,i2c adapter)

  

platform_driver其他成员  

———————-

  suspend:用于挂起设备(sleep模式),即系统sleep的时候会调用此函数。对于一般的设备,所做的

          工作就是停止设备的时钟,或者是让设备的时钟率降到很低的值,然后保存一定的参数(有时

          时钟停止时,有些寄存器的值需要重新设定,软件定义的状态…)

  shutdown:用于关闭设备,系统处于shut-down time的时候会调用此函数

  resume:用于从sleep模式将设备唤醒,执行与sleep相反的动作,恢复设备sleep前的状态

  remove:设备被移除的时候调用(严格来说是变成一个未绑定驱动的设备),然后会涉及到与probe函数

          大致相反的动作,一般来说就是probe函数所有错误处理时释放资源的处理的集合,不过要注

          意顺序。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163789.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月24日 下午3:46
下一篇 2022年7月24日 下午3:46


相关推荐

  • mybatis插件原理_idea插件库

    mybatis插件原理_idea插件库Mybatis插件插件简介一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展。这样的好处是显而易见的,一是增加了框架的灵活性。二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作。以MyBatis为例,我们可基于MyBatis插件机制实现分页、分表,监控等功能。由于插件和业务无关,业务也无法感知插件的存在。因此可以无感植入插件,在无形中增强功能Mybatis插件介绍Mybatis作为一个应用广泛的优秀的ORM开源框架,这个框架具有强大的灵活性,在四大组件(Executo

    2022年10月7日
    4
  • 图书销售管理系统需求分析,各种功能图部分

    图书销售管理系统需求分析,各种功能图部分负责人:大佬(20160402122)DEDRAGON(20160401094)完成部分:3.2有关功能图3.2.1层次图:3.2.2ipo图3.2.3e-r图3.2.4主数据流图3.2.5子功能图进货管理图库存管理图:销售管…

    2022年5月23日
    40
  • dell T420热插拔安装过程

    dell T420热插拔安装过程

    2022年3月6日
    54
  • latex在大括号里换行_大括号的解决问题

    latex在大括号里换行_大括号的解决问题存在问题:在编译LaTex的时候,会出现存在大括号\left(\right),但是一旦公式过长需要换行时,例如这个时候会用到\\与&来做换行,但如果直接编译的话,会报错,例如解决办法:在换行符前面加入变成\right.\\与&\left.这样就可以解决大括号换行的问题了,一个小点千万别漏写了…

    2022年10月11日
    8
  • vue全局变量、全局方法

    vue全局变量、全局方法1 全局变量 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp main js 中设置如下内容页面中使用如下 2 全局方法 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp

    2026年3月18日
    2
  • vim查看空格回车符号_linux vi 替换字符串

    vim查看空格回车符号_linux vi 替换字符串参考链接https://blog.csdn.net/qq_30038111/article/details/83447045答案就是需要转义

    2025年12月3日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号