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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 刀塔2显示连接服务器调解中,大师调解正在连接至dota2网络 【操作方案】 的具体步骤_…

    刀塔2显示连接服务器调解中,大师调解正在连接至dota2网络 【操作方案】 的具体步骤_…近日有小伙伴发现电脑出现问题了,在突然遇到正在连接至dota2网络时不知所措了,对于正在连接至dota2网络带来的问题,其实很好解决正在连接至dota2网络带来的问题,下面小编跟大家介绍正在连接至dota2网络解决方法:一直卡在正在连接至dota2网络什么情况答:您好,若您运行DOTA2时遇到无法连接到DOTA2网络或一直显示正在连接到DOTA2网络,请您完全关闭DOTA2国服客户端,再重新启…

    2022年5月17日
    58
  • 3万计算机配置清单,电脑组装知识网预算2万至3万元电脑主机推荐九代酷睿i9-9900K搭RTX2080Ti全能型高配电脑主机配置清单…

    3万计算机配置清单,电脑组装知识网预算2万至3万元电脑主机推荐九代酷睿i9-9900K搭RTX2080Ti全能型高配电脑主机配置清单…本文转自:http://www.dn010.com/peizhi/710.html近日,一位网友联系了小编,说他要配一套高配置的电脑主机,主机预算约为2万至3万元,针对该网友的预算要求,小编提供一套九代酷睿i9-9900K搭RTX2080Ti全能型高配电脑主机配置清单,用户还可根据自己的喜好调整电脑配置。电脑配置清单:注意:由于更新电脑硬件的速度更快,如果产品停产,请使用新产品。另外,硬件价格会随…

    2022年7月16日
    17
  • RPN网络代码解读

    RPN网络代码解读1.说在前面的话在目标检测领域FasterRCNN可以说是无人不知无人不晓,它里面有一个网络结构RPN(RegionProposalNetwork)用于在特征图上产生候选预测区域。但是呢,这个网络结构具体是怎么工作的呢?网上有很多种解释,但是都是云里雾里的,还是直接撸代码来得直接,这里就直接从代码入手直接撸吧-_-||。首先,来看一下FasterRCNN中RPN的结构是什么样子的吧。…

    2022年6月23日
    26
  • 自己的中文名用英文_如何根据姓名首字母排序

    自己的中文名用英文_如何根据姓名首字母排序一个功能需求,做一个类似联系人列表的功能,点击名称获取对应的id,样式简陋,只是一个模板,原来是uniapp项目,根据需要改成了vue,需要的自行设计css流程获取数据提取首个字的拼音的首个字母排序并分组直接上代码吧<template> <div> <divv-for=”(item,index)inindexList”> <div><b>{{item.title}}</b></div> .

    2022年10月10日
    3
  • pycharm入门教程(非常详细)_pipe使用教程

    pycharm入门教程(非常详细)_pipe使用教程1、汉化:把resources_zh.jar(自行下载)拷贝到PyCharm的安装目录下的lib目录,重启Pycharm即可。2、整体结构:3、常用功能介绍:(1)如何更换Python解释器:在文件->设置->项目:xxx下找到ProjectInterpreter。然后修改为你需要的Python解释器。注意这个地方一定要注意的是:在选择Python解释器的…

    2022年8月25日
    7
  • 记录 vue-cli3 配置uat环境 遇到的打包问题[通俗易懂]

    记录 vue-cli3 配置uat环境 遇到的打包问题[通俗易懂]今天给前端页面配置一个新的可供切换的环境UAT:修改package.json的scripts:”scripts”:{“serve”:”vue-cli-serviceserve”,”build”:”vue-cli-servicebuild”,”build:uat”:”vue-cli-servicebuild–modeuat”,…

    2022年9月28日
    5

发表回复

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

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