当前位置: 首页 > news >正文

Day04_总线驱动

1.Platform虚拟总线驱动

核心价值

作用实现机制优势
统一管理片上资源虚拟总线抽象,无需物理连接简化SoC设备管理
设备与驱动解耦platform_device描述资源,platform_driver实现逻辑提高代码复用性和可移植性
自动匹配总线通过名称或ID表匹配设备与驱动减少手动绑定代码
安全资源访问内核统一分配资源(内存、中断)避免硬件冲突

扩展思考:在分布式系统(如OpenHarmony)中,虚拟总线概念进一步演化为“软总线”,实现跨设备的服务发现与通信

相关结构体

struct platform_driver{} -结构体

#include <linux/platform_device.h>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;bool prevent_deferred_probe;
};

platform_driver是 Linux 内核中用于管理片上资源(如 SoC 外设控制器)的核心结构体,属于 Platform 总线驱动模型的一部分。Platform 总线是一种虚拟总线,用于连接 CPU 直接寻址的设备(如 GPIO、定时器等),实现驱动与设备的分离与动态匹配

关键成员功能说明:
成员功能说明是否必需
probe驱动与设备匹配成功后调用,负责初始化硬件、注册字符设备/中断/DMA 等资源。必需
remove驱动卸载或设备移除时调用,用于释放资源(如内存、中断)。必需
driver内嵌的 device_driver 结构体,包含驱动名称(.name)、模块所有者(.owner)等基础信息。必需
id_table支持多设备匹配的标识表,用于非设备树场景。当设备名与表中某项匹配时,触发 probe可选
of_match_table设备树匹配表(位于 driver.of_match_table),通过设备节点的 compatible 属性匹配驱动(如 { .compatible = "xxx-gpio" })。设备树场景必需
shutdown/suspend/resume设备关机、休眠和唤醒的回调函数,用于电源管理。可选

注:

  • driver.owner 通常设为 THIS_MODULE,但现代内核(5.x+)已自动填充,无需显式赋值。
  • driver.name 是传统匹配方式的关键,需与 platform_device.name 一致。
platform_driver 的注册与注销

驱动需通过以下接口注册到 Platform 总线:

// 注册驱动
int platform_driver_register(struct platform_driver *drv);// 注销驱动
void platform_driver_unregister(struct platform_driver *drv);
典型驱动框架示例:
#include <linux/platform_device.h>
#include <linux/module.h>static int my_probe(struct platform_device *pdev) {printk("Device matched! Resource: MEM 0x%x, IRQ %d\n",pdev->resource[0].start, pdev->resource[1].start);// 初始化硬件、注册字符设备等return 0;
}static int my_remove(struct platform_device *pdev) {// 释放资源return 0;
}static const struct of_device_id my_of_match[] = {{ .compatible = "my-device" },  // 设备树匹配标识{ }
};
MODULE_DEVICE_TABLE(of, my_of_match);static struct platform_driver my_driver = {.driver = {.name = "my_driver",.of_match_table = my_of_match,},.probe = my_probe,.remove = my_remove,
};module_platform_driver(my_driver);  // 自动生成 init/exit 函数
MODULE_LICENSE("GPL");
设备匹配机制

Platform 总线通过以下方式匹配设备与驱动:

  1. 设备树(DT)优先 设备节点的 compatible 属性与 driver.of_match_table 匹配(如 "my-device")。
  2. 传统名称匹配 若未使用设备树,则比较 platform_device.namedriver.name(如 "my_driver")。
  3. ID 表扩展匹配 通过 id_table 支持多设备名匹配(如 {"deviceA"}, {"deviceB"})。
资源获取与操作
  • 硬件资源访问: 在 probe 函数中,通过 platform_device 获取内存、中断等资源:
struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
int irq = platform_get_irq(pdev, 0);
  • 设备树参数解析: 使用of_property_read_u32() 等接口读取设备树中的自定义属性(如寄存器地址)。
应用场景与优势
  1. 统一管理片上外设 用于 GPIO、ADC、PWM 等非标准总线设备,避免为每个外设实现独立总线驱动。
  2. 驱动与硬件解耦 设备资源(地址、中断)通过设备树或 platform_device 描述,驱动无需硬编码,提升可移植性。
  3. 支持热插拔与电源管理 通过 suspend/resume 实现低功耗模式,shutdown 确保安全断电。

总结

platform_driver 是 Linux 驱动开发的核心抽象层,通过分离设备描述与驱动逻辑,显著提升代码复用性和可维护性。开发者需重点关注:

  1. 匹配机制:设备树兼容性 > 名称匹配 > ID 表。
  2. 生命周期管理:资源初始化在 probe 中完成,清理在 remove 中实现。
  3. 资源获取:利用 platform_get_resource() 等接口安全访问硬件资源。

结构体关系


struct platform_driver{}  //device的platform包装struct platform_device_id{}  //非设备树设备,id信息匹配结构体struct device_drive{}  //设备驱动核心结构体struct of_device_id{}  //设备树设备,compatible匹配结构体struct bus_type{}  //设备驱动归属总线类型结构体struct platform_device{}  //device_drive的platform包装struct device{}  //设备核心结构体struct device_node{}  //设备树节点信息结构体struct device_type{}  //...struct bus_type{}struct device_drive{}struct of_device_id{}struct bus_type{}

http://www.dtcms.com/a/428199.html

相关文章:

  • 成都市成华区建设局官方网站wordpress啦去
  • 901-008_高级系统架构设计师-考试范围-系统质量属性与架构评估
  • 重庆做网站seo优化选哪家好php数据库的网站模板
  • RMBG2.0 vs. BiRefNet_HR:从「人像抠图」到「万物分割」
  • 怎么做外卖网站网站怎么被搜到首页
  • 无锡做公司网站西固网页设计
  • 【K8s】升级节点
  • Spring Boot自定义全局异常处理:从痛点到优雅实现
  • 网站正在建设中的素材动图网站设计制作程序
  • 企业网站的搭建流程河南论坛网站建设
  • wap网站建设策划方案做艺术字的网站
  • 电脑实用工具,资源下载
  • 曲阳有没有做网站里2345网站登录
  • PostgreSQL 向量操作符的计算和使用方式
  • 动态代理在提升网络安全中的作用及应用
  • 宁夏微信服务网站百度网盘资源搜索
  • 手机做网站用什么软件微信下载官方正版
  • Redis缓存异常
  • 建设网站iss局机关门户网站建设情况汇报
  • 做网站需要哪些东西163免费注册入口
  • 【Rust GUI开发入门】编写一个本地音乐播放器(9. 制作设置面板)
  • 概率统计中的数学语言与术语2
  • 美国2025年网络演习全景与趋势洞察
  • 公司做网站有什么用编程和做网站那个号
  • 做公司网站都需要什么免费广告设计网站
  • IO-link 协议高频工业 RFID 读写器
  • NeurIPS 2025 | 北大等提出C²Prompt:解耦类内与类间知识,攻克FCL遗忘难题!
  • 网站推广有哪些举措全屋定制品牌推荐
  • 1元建站wordpress短代码返回html
  • 极简学习工具产品蓝图、路线图、甘特图、交付清单