Linux 平台设备platform

简介: Linux 平台设备platform
今天学习了platform平台总线,用来对驱动进行管理和注册,平台设备是指处理器上集成的额外功能的附加设备,如Watch Dog,IIC,IIS,RTC,ADC等设备。这些额外功能设备是为了节约硬件成本、减少产品功耗、缩小产品形状而集成到处理器内部的。需要注意的是,平台设备并不是与字符设备、块设备和网络设备并列的概念,而是一种平行的概念,其从另一个角度对设备进行了概括。如果从内核开发者的角度来看,平台设备的引入,是为了更容易开发字符设备、块设备和网络设备驱动。
当一个驱动注册[platform_driver_register()]的时候,他会遍历所有总线上的设备来寻找匹配,在启动的过程驱动的注册一般比较晚,或者在模块载入的时候  当一个驱动注册[platform_driver_probe()]的时候, 功能上和使用platform_driver_register()是一样的,唯一的区别是它不能被以后其他的device probe了,也就是说这个driver只能和一个device绑定。
分离思想:设备信息和驱动进行分离。
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200306203515343.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqMTk5OTA4MjQ=,size_16,color_FFFFFF,t_70)
**驱动端:**
struct platform_driver {  
int (*probe)(struct platform_device *);    //获取设备信息,在匹配成功调用 
int (*remove)(struct platform_device *);   //在移除的时候调用 
struct device_driver driver;  
const struct platform_device_id *id_table; //id_table表};
struct device_driver {  
const char    *name;    //名字  匹配  
struct bus_type   *bus;     //总线信息结构体 
struct module   *owner;   //
THIS_MODULE const struct of_device_id *of_match_table;    //设备树的相关信息};
struct platform_device_id { 
char name[PLATFORM_NAME_SIZE];   //名字 
kernel_ulong_t driver_dat;
};
int platform_driver_register(struct platform_driver *pdrv);
功能:platform平台总线驱动端注册函数
参数:    
@pdrv   platform平台总线驱动端结构体指针
返回值:成功返回0,失败返回负数错误码    
void platform_driver_unregister(struct platform_driver *);


platform驱动注册过程:platform_driver_register —>>>driver_register(&drv->driver); —>>>bus_add_driver(drv); —>>>driver_attach(drv); //驱动绑定设备 /遍历设备端的链表,完成匹配/ —>>>bus_for_each_dev(drv->bus, NULL, drv, __driver_attach); —>>>__driver_attach —>>>driver_match_device(drv, dev)static int platform_match(struct device *dev, struct device_driver *drv){ struct platform_device pdev = to_platform_device(dev); struct platform_driver pdrv = to_platform_driver(drv); /和设备树进行匹配/ if (of_driver_match_device(dev, drv)) return 1;
/ 和id_table表进行匹配 / if (pdrv->id_table) return platform_match_id(pdrv->id_table, pdev) != NULL;
/ 和名字进行匹配/ return (strcmp(pdev->name, drv->name) == 0);}
设备树 > id_table >name


如果匹配成功,调用driver_probe_device函数,进行获取设备信息


设备端


struct platform_device {  
const char  * name;           //名字  
int   id;               //-1  
struct device dev;              //通用设备信息结构体 
u32   num_resources;    //资源个数  
struct resource * resource;       //资源结构体指针};
struct device {    
struct device_driver *driver;    
struct device_node  *of_node;    
u32     id;     
void  (*release)(struct device *dev);  //设备端卸载的时候,须调用的函数
}
struct resource { 
resource_size_t start;      //起始地址  
resource_size_t end;        //结束地址  
const char *name;           //资源名字  
unsigned long flags;        //标志 
IORESOURCE_IO IORESOURCE_MEM                                //
IORESOURCE_IRQ};
int platform_device_register(struct platform_device *pdev);
功能:platfrom平台总线设备注册
参数:    @pdev    
platform平台总线设备端结构体指针返回值:成功返回0,失败返回负数错误码
void platform_device_unregister(struct platform_device *);


platform设备端注册:platform_device_register —>>>platform_device_add(pdev); —>>>device_add(&pdev->dev); —>>>bus_probe_device(dev); —>>>device_attach(dev); —>>>bus_for_each_drv(dev->bus, NULL, dev, __device_attach);总结:platform平台总线,设备和驱动在注册的过程中,都会遍历对方的链表,来查找是否有匹配的,如果有匹配的,就会调用驱动中的probe探测函数,获取设备信息。

相关文章
|
3月前
|
安全 Linux 网络虚拟化
Linux网络名称空间和Veth虚拟设备的关系
在讨论Linux网络名称空间和veth(虚拟以太网对)之间的关系时,我们必须从Linux网络虚拟化的核心概念开始。Linux网络名称空间和veth是Linux网络虚拟化和容器化技术的重要组成部分,它们之间的关系密不可分,对于构建隔离、高效的网络环境至关重要。😊
|
3月前
|
SQL 关系型数据库 MySQL
Linux系统部署Yearning SQL审核平台结合内网穿透实现公网访问
Linux系统部署Yearning SQL审核平台结合内网穿透实现公网访问
|
3月前
|
Cloud Native Linux 网络虚拟化
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
在Linux网络虚拟化领域,虚拟以太网设备(veth)扮演着至关重要的角色🌐。veth是一种特殊类型的网络设备,它在Linux内核中以成对的形式存在,允许两个网络命名空间之间的通信🔗。这篇文章将从多个维度深入分析veth的概念、作用、重要性,以及在容器和云原生环境中的应用📚。
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
|
6天前
|
安全 Linux 图形学
Linux平台Unity下RTMP|RTSP低延迟播放器技术实现
本文介绍了在国产操作系统及Linux平台上,利用Unity实现RTMP/RTSP直播播放的方法。通过设置原生播放模块的回调函数,可将解码后的YUV数据传递给Unity进行渲染,实现低延迟播放。此外,还提供了播放器启动、参数配置及停止的相关代码示例,并概述了如何在Unity中更新纹理以显示视频帧。随着国产操作系统的发展,此类跨平台直播解决方案的需求日益增长,为开发者提供了灵活高效的开发方式。
|
6天前
|
编解码 算法 Linux
Linux平台下RTSP|RTMP播放器如何跟python交互投递RGB数据供视觉算法分析
在对接Linux平台的RTSP播放模块时,需将播放数据同时提供给Python进行视觉算法分析。技术实现上,可在播放时通过回调函数获取视频帧数据,并以RGB32格式输出。利用`SetVideoFrameCallBackV2`接口设定缩放后的视频帧回调,以满足算法所需的分辨率。回调函数中,每收到一帧数据即保存为bitmap文件。Python端只需读取指定文件夹中的bitmap文件,即可进行视频数据的分析处理。此方案简单有效,但应注意控制输出的bitmap文件数量以避免内存占用过高。
|
6天前
|
编解码 Linux 数据安全/隐私保护
Linux平台x86_64|aarch64架构如何实现轻量级RTSP服务
为满足在Linux平台(x86_64与aarch64架构)上实现轻量级RTSP服务的需求,我们开发了一套解决方案。该方案通过调用`start_rtsp_server()`函数启动RTSP服务,并设置端口号及认证信息。支持AAC音频和H.264视频编码,可推送纯音频、纯视频或音视频流。此外,还支持X11屏幕采集、部分V4L2摄像头采集、帧率/GOP/码率调整、摄像头设备选择与预览等功能。对于音频采集,支持alsa-lib和libpulse接口。整体设计旨在提供150-400ms的低延迟体验,适用于多种应用场景。
|
5天前
|
编解码 Linux 开发工具
Linux平台x86_64(麒麟|统信UOS)|aarch64(飞腾)如何实现摄像头|屏幕和麦克风|扬声器采集推送RTMP服务或轻量级RTSP服务
国产化操作系统的发展,减少了外部依赖,更符合国家安全标准,并可提升自主研发能力,促进产业链发展,满足定制开发能力,减少了外部技术封锁的风险,提高了国际竞争力,推动了产业升级。目前大牛直播SDK针对Linux平台x86_64架构和aarch64架构的RTMP推送模块和轻量级RTSP服务模块
|
1月前
|
弹性计算 运维 自然语言处理
属于Basis运维的、在Linux平台上运行的大模型测评 OS Copilot智能助手测评
OS Copilot是阿里云为Linux打造的智能操作系统助手,基于大模型,助用户进行自然语言问答、命令执行和系统运维。它简化了Linux操作,适合新手和运维人员。测评者作为IT架构师,发现OS Copilot使非技术背景人员也能操作Linux,接入命令可在官方文档找到。测试显示,通过"co"命令可与OS Copilot交互,实现生产任务融合。该工具提高了工作效率,尤其是对于遗忘具体命令时,非常有帮助。文档清晰,适合生产环境使用,值得进一步探索。
54 0
|
2月前
|
Linux 开发工具
Linux技术资源分享:探索Linux软件包的宝藏:沙皇下载平台体验
Linux技术资源分享:探索Linux软件包的宝藏:沙皇下载平台体验
23 3
|
2月前
|
Linux 程序员 芯片
【Linux驱动】普通字符设备驱动程序框架
【Linux驱动】普通字符设备驱动程序框架