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

驱动开发硬核特训 · Day 21(下篇): 深入剖析 PCA9450 驱动如何接入 regulator 子系统

📘


在这里插入图片描述

一、设备树视角:PCA9450 是如何声明的?

设备树中定义了 PCA9450 芯片通过 I2C 总线挂载,并描述了多个 regulator 通道:

&i2c1 {pmic@25 {compatible = "nxp,pca9450c";reg = <0x25>;regulators {buck1: BUCK1 {regulator-name = "buck1";regulator-min-microvolt = <600000>;regulator-max-microvolt = <2187500>;regulator-boot-on;regulator-always-on;};ldo3: LDO3 {regulator-name = "ldo3";...};};};
};

每一个节点都会被解析为一个 regulator_desc,并注册为一个独立的电源控制器。


二、驱动入口与注册流程分析

PCA9450 驱动本质上是一个 I2C Client 驱动 + regulator 注册器,核心结构如下:

static struct i2c_driver pca9450_i2c_driver = {.driver = {.name = "nxp-pca9450",.of_match_table = pca9450_of_match,},.probe = pca9450_i2c_probe,
};

pca9450_i2c_probe() 中:

  • 初始化 regmap 与 IRQ
  • 解析 chip variant(A/B/C)
  • 遍历每个 regulator_desc 调用 devm_regulator_register() 注册通道

三、regulator 子系统对接流程

每个 BUCK/LDO 都有一个对应的 regulator_desc,结构体中包括:

struct regulator_desc {const char *name;const struct regulator_ops *ops;unsigned int n_voltages;const struct linear_range *linear_ranges;unsigned int vsel_reg;unsigned int enable_reg;...
};

这些字段在注册时告诉 regulator 核心层:

  • 如何读写电压
  • 如何使能/禁用
  • 有哪些支持的电压值
  • 电压步进表

每个通道注册后,在 /sys/class/regulator/ 下自动生成对应节点,供用户空间访问与调试。


四、regulator_ops 实现解读

PCA9450 中的 buck 与 ldo 由不同 regulator_ops 控制:

static const struct regulator_ops pca9450_buck_regulator_ops = {.enable = regulator_enable_regmap,.disable = regulator_disable_regmap,.set_voltage_sel = regulator_set_voltage_sel_regmap,.get_voltage_sel = regulator_get_voltage_sel_regmap,
};

这些 ops 是标准封装 API,实际通过 regmap 映射访问硬件寄存器,实现驱动逻辑的模块化与通用性。


五、regmap 的作用

PCA9450 使用 regmap 框架读写 I2C 寄存器:

pca9450->regmap = devm_regmap_init_i2c(i2c, &pca9450_regmap_config);

regmap 帮我们做了:

  • 地址映射与访问封装
  • 缓存与同步机制
  • 错误处理与调试辅助

简化了裸 I2C 通信过程,增强了可维护性。


六、小结:驱动与子系统的耦合点

元素说明
i2c_client 驱动提供 probe/init 接口,获取设备资源
regulator_desc抽象每个电源输出的结构体
regulator_ops标准化的接口函数集
regmap注册表读写封装框架
regulator_register()向子系统注册一个电压输出通道

最终,PCA9450 将多个电源输出口封装为独立 regulator 通道,通过 regulator 子系统管理,并由设备树和用户空间灵活配置与控制。


七、工程启示与拓展思考

  • 任何可调电源输出器件(如 TPS65090、AXP803)都可以通过 regulator 子系统驱动接入
  • regulator 框架支持嵌套、动态电压控制、Suspend 设置等高级特性
  • 对比其他子系统(如 input/net/sound),可以发现 Linux 内核在架构层面非常强调“接口抽象 + 解耦复用”

📌 如果你能透彻理解 PCA9450 驱动如何接入子系统,你也就掌握了开发高质量 Linux 驱动的核心精髓之一。


📺 视频教程请关注 B 站:“嵌入式 Jerry”

相关文章:

  • Serverless 在云原生后端的实践与演化:从函数到平台的革新
  • classfinal 修改过源码,支持jdk17 + spring boot 3.2.8
  • 【k8s】sidecar边车容器
  • 项目maven版本不一致 导致无法下载
  • 【遥感图像分类】【综述】遥感影像分类:全面综述与应用
  • python实现简单的UI交互
  • redis客户端库redis++在嵌入式Linux下的交叉编译及使用
  • 多物理场耦合低温等离子体装置求解器PASSKEy2
  • ROS 快速入门教程04
  • 【Vue】静态站点生成(VitePress)
  • 星火燎原:大数据时代的Spark技术革命在数字化浪潮席卷全球的今天,海量数据如同奔涌不息的洪流,传统的数据处理方式已难以满足实时、高效的需求。
  • 【Python数据库编程实战】从SQL到ORM的完整指南
  • 大数据分析04 数据查询分析
  • SAP接口超时:对 FOR ALL ENTRIES IN 的优化
  • 数字化转型的“暗礁“与突围:失败案例深度复盘
  • 常用浪涌保护器件的原理、特性与应用对比
  • 巧记英语四级单词 Unit5-上【晓艳老师版】
  • onloyoffice 服务器保存文件的时间 和 当前时间 相差八小时 如何改
  • 如何将 Apache Hudi 接入 Ambari?完整部署与验证指南
  • linux 部署express项目,并使用pm2守护进程
  • 一年吸引30多万人次打卡,江苏这个渔村是怎么做到的?
  • 今年地质灾害防治形势严峻,哪些风险区被自然资源部点名?
  • 魔都眼·上海车展⑤|被主播包围的新车
  • 谭秀洪任广西梧州市人大常委会党组书记,此前任北海市委常委
  • 研究|和去年相比,人们使用AI的需求发生了哪些变化?
  • 特朗普支持率降至新低:宣布关税后骤降,选民最不满经济表现