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

驱动开发硬核特训 · 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”

http://www.xdnf.cn/news/1970.html

相关文章:

  • WordPress AI插件能自动写高质量文章吗,如何用AI提升网站流量
  • django.db.utils.OperationalError: (1050, “Table ‘你的表名‘ already exists“)
  • 第十四届蓝桥杯刷题——day20
  • 【大语言模型】大语言模型(LLMs)在工业缺陷检测领域的应用
  • NAT穿透
  • 59、微服务保姆教程(二)Nacos--- 微服务 注册中心 + 配置中心
  • Java知识日常巩固(三)
  • tkinter的窗口构建、原生组件放置和监测事件
  • 互联网实验室的质量管控痛点 质检LIMS系统在互联网企业的应用
  • [FPGA基础] DMA
  • java多线程(6.0)
  • Linux套接字+Sqlite实例:客户端-服务器应用程序教程
  • 科技赋能建筑新未来:中建海龙模块化建筑产品入选中国建筑首批产业化推广产品
  • URP-利用矩阵在Shader中实现物体的平移和缩放
  • 【Google上包前APK自检】
  • Mac中 “XX”文件已损坏,无法打开 解决方案
  • shell命令一
  • uniapp中检查版本,提示升级app,安卓下载apk,ios跳转应用商店
  • ubiquant比赛系列——用docker准备ubipoker开发环境
  • volatile缓存可见性实现原理
  • 支付场景下,乐观锁的实现(简洁版)
  • AiFlutter 低代码平台介绍
  • hadoop-3.3.5.tar.gz 镜像
  • Hi3516CV608 超高清智慧视觉 SoC 芯片 可提供开发资料
  • Python 快速获取Excel工作表名称
  • Easysearch 基础运维扫盲指南:从 HTTP 到 HTTPS、认证与安全访问全解析
  • 侧扫声呐概述
  • Ollama 常见命令速览:本地大模型管理指南
  • arcpy列表函数的应用(2)
  • 数据作为新生产要素,如何实现价值变现?