前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >platform device

platform device

作者头像
全栈程序员站长
发布2022-09-15 11:40:09
5780
发布2022-09-15 11:40:09
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。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.cn/163789.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档