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探测函数,获取设备信息。

相关文章
|
19天前
|
监控 Oracle 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第8天】在 Linux 平台设置 Oracle 开机自启动有多种方法,本文以 CentOS 为例,介绍了两种常见方法:使用 `rc.local` 文件(较简单但不推荐用于生产环境)和使用 `systemd` 服务(推荐)。具体步骤包括编写启动脚本、赋予执行权限、配置 `rc.local` 或创建 `systemd` 服务单元文件,并设置开机自启动。通过 `systemd` 方式可以更好地与系统启动过程集成,更规范和可靠。
|
20天前
|
Oracle Ubuntu 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第7天】本文介绍了 Linux 系统中服务管理机制,并详细说明了如何在使用 systemd 和 System V 的系统上设置 Oracle 数据库的开机自启动。包括创建服务单元文件、编辑启动脚本、设置开机自启动和启动服务的具体步骤。最后建议重启系统验证设置是否成功。
|
2月前
|
NoSQL Ubuntu Linux
Linux平台安装MongoDB
10月更文挑战第11天
45 5
|
4月前
|
NoSQL Unix Linux
Linux 设备驱动程序(一)(上)
Linux 设备驱动程序(一)
165 62
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
98 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
4月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
49 6
|
3月前
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。
|
4月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
53 5
|
4月前
|
存储 缓存 Unix
Linux 设备驱动程序(三)(上)
Linux 设备驱动程序(三)
43 3
|
4月前
|
缓存 安全 Linux
Linux 设备驱动程序(一)((下)
Linux 设备驱动程序(一)
36 3