高通学习3-SPMI/PMIC

📅 2026/7/11 11:26:11
高通学习3-SPMI/PMIC
1 简介SPMI 全称 System Power Management Interface系统电源管理接口是 MIPI 联盟制定、高通 QRB5165/RB5/RB6 等平台标配的双线高速串行电源总线仅靠 SCLK 时钟、SDATA 双向数据两根信号线实现 SoC 内部电源控制器主机 Master与多颗 PMIC 电源管理芯片从机 Slave实时通信支持最多 4 个主机、16 个从机挂载最高 26MHz 通信速率相比传统 I2C 拥有更低延迟、更强多主仲裁能力在高通嵌入式设备中承担核心电源管控工作通过读写 PMIC 寄存器动态调节各路 LDO/SMPS 输出电压、监控电池充放电、处理过热 / 过流中断、控制 RTC、GPIO、复位等电源相关外设设备树中依靠 USID 区分多路 PMIC是整套平台供电系统的底层通信根基替代了早年高通私有 SSBI 总线统一全系列骁龙 / QCS 电源交互标准。PMIC Power Management IC高通专用电源管理芯片通过SPMI总线与SoC通信区别通用 I2C/SPI一套SoC标配主PMIC 可选辅PMIC如PM8350主 PM8150辅、PMI8998系列。软件分层架构从上到下用户态ADB、Android 上层应用通过 sysfs/debugfs 读写内核电源接口。内核标准子系统框架qpnp-regulator、qpnp-smb5、qcom-fg、regulator子系统、sysfs/debugfs调试节点。底层驱动RPMh 稳压驱动、RPMh 时钟驱动、SPMI 总线仲裁驱动、ADC/VDAC、PON 复位、BCL 电池限流、GPIO 驱动硬件层SPMI 总线对接11808010走独立 I2C。整个启动链路是PBL → XBL-SC → XBL Core (UEFI) → AOP/CPUCP/LPASS/VPU/TME 固件 → TEE 安全环境 → HLOS 主系统。对于ODM来说能做的适配点基本上是三个。XBLUEFIAOP。2 XBL配置PMIC寄存器/PBS RAM配置、亏电恢复、SPMI总线权限配置、AOP上电复位。这里主要是修改通过 DeviceTreeDT框架编译进XBL_CONFIG镜像修改access.dtsi、pm.dtsi。在UEFI阶段主要是屏幕这里暂时不多写了。2 配置配置分为XBL固件、UEFI协议、Linux DTSpinctrl驱动三层。这里暂时只写设备树这一块。驱动是pinctrl-spmi-gpio.c绑定qcom,spmi-gpio完全遵循Linux pinctrl子系统规范分为DTS 基础节点定义 客户设备引用 驱动 API 控制三部分。2.1 LDOpm8350_l14 { regulator-name vdd_cam_1v8; regulator-min-microvolt 1800000; regulator-max-microvolt 1800000; qcom,init-voltage 1800000; // 上电默认电压 regulator-boot-on; // XBL开机自动打开 regulator-always-on; // 系统运行常供电 regulator-max-load 100000; // 最大负载uA status okay; };2.2 PMIC GPIOPMIC GPIO根节点pm8998_gpios: pinctrlc000 { compatible qcom,spmi-gpio; // 驱动匹配关键字 reg 0xc000 0x1000; // GPIO寄存器基地址长度 interrupts ...; // 所有GPIO中断 gpio-controller; #gpio-cells 2; // cell1GPIO编号cell2flag qcom,gpios-disallowed 3 15; // 禁止AP操作的GPIOPBS/Modem占用 };具体配置假设主 PMIC 为 pm8998节点pm8998_gpios如果是 pm8150/pm8350 替换对应名称即可。pm8998_gpios { dev_en_pin: dev_en_default { pins gpio9; function normal; // 普通数字输出文档3.3.4 power-source 0; // 使用VIN0 1.8V LDO供电 drive-push-pull; // CMOS推挽输出 qcom,drive-strength 2; // 中等驱动电流可选0无/1高/2中/3低 output-low; // DTS默认电平驱动probe再拉高 input-disable; // 关闭输入缓冲纯输出 bias-disable; // 无上下拉外设自带上下拉则保留 }; };设备DTS节点my_device100000 { compatible vendor,my-device; reg 0x100000 0x1000; status okay; // pinctrl绑定GPIO9配置内核probe前自动配置引脚模式 pinctrl-names default; pinctrl-0 dev_en_default; // 声明使能GPIOpm8998_gpios 9 GPIO_ACTIVE_HIGH dev-en-gpios pm8998_gpios 9 GPIO_ACTIVE_HIGH;//这个引脚传入驱动中进行控制 // 【必加】GPIO供电LDO确保1.8V上电常开 // vddio-supply pm8998_l14; };3 代码操作头文件#include linux/module.h #include linux/platform_device.h #include linux/gpio.h #include linux/gpio/consumer.h #include linux/pinctrl/consumer.h设备私有结构体struct my_dev_data { struct device *dev; struct gpio_desc *dev_en_gpio; // GPIO9描述符推荐gpiod API更安全 };probe 函数核心逻辑static int my_dev_probe(struct platform_device *pdev) { struct device *dev pdev-dev; struct my_dev_data *priv; int ret; priv devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; priv-dev dev; platform_set_drvdata(pdev, priv); // 1. 获取dev-en-gpiosDTS中定义的PMIC GPIO9 priv-dev_en_gpio devm_gpiod_get(dev, dev-en, GPIOD_OUT_LOW); if (IS_ERR(priv-dev_en_gpio)) { ret PTR_ERR(priv-dev_en_gpio); dev_err(dev, get dev en gpio9 failed: %d\n, ret); return ret; } // 2. 驱动启动拉高GPIO9供电使能核心需求 gpiod_set_value(priv-dev_en_gpio, 1); dev_info(dev, PMIC GPIO9 set HIGH, power enable success\n); // 后续设备初始化... return 0; }4 调试4.1 XBL全部为 Trace32 调试脚本存放路径\Common\Core\tools\tools\systemdrivers\pmic\aliso支持寄存器读写、电源日志、状态查看、投票抓取PMICDump.cmm全 PMIC 寄存器导出支持日志保存、分区抓取PMICPeek.cmm单寄存器读写peek 读 /poke 写支持指定 PMIC 索引、休眠模式访问权限PBUSLogger.cmm抓取 SPMI 总线交互日志可过滤 LDO / 时钟外设、仅捕获写操作支持复位后日志留存PMICDashBoard.cmmPMIC 总览面板查看上电 / 下电故障原因、稳压轨 / 时钟 / GPIO 实时状态vrm.cmm抓取各路 LDO/SMPS/ 时钟多客户端投票值、硬件运行状态vrm_dump.cmm导出 RPMh VRM 完整寄存器支持按稳压轨过滤。4.1 查看pinctrl引脚# 替换pm8998_gpios为你平台对应的gpiochip节点 cd /d/pinctrl/c440000.qcom,spmi:qcom,pm89980:pinctrlc000 cat pinconf-pins | grep gpio9能看到输出模式、VIN0 供电、推挽驱动即为 DTS 配置正常。4.2 查看GPIO电平# 查看gpiochip映射关系 cat /sys/class/gpio/gpiochip*/label # 导出控制调试内核需CONFIG_GPIO_SYSFSy echo xxx /sys/class/gpio/export cat /sys/class/gpio/xxx/value4.3 寄存器dump直接查看PMIC GPIO9状态cd /sys/kernel/debug/regmap/spmi0-00 echo 0xC040 address # GPIO9 MODE_CTL寄存器偏移 echo 0x10 count cat data4.1 sysfs 临时调压调试这下面的都是LDO# 查看当前电压 cat /sys/class/regulator/regulator.0/microvolts # 临时设置1.8V echo 1800000 /sys/class/regulator/regulator.0/microvolts # 查看使能状态 cat /sys/class/regulator/regulator.0/enable查看所有电源轨ls -l /sys/class/regulator/输出如下RB5rootqrb5165-rb5:/sys/class/regulator# ls -l /sys/class/regulator/ total 0 lrwxrwxrwx 1 root root 0 Mar 27 2023 regulator.0 - ../../devices/platform/reg-dummy/regulator/regulator.0 lrwxrwxrwx 1 root root 0 Mar 27 2023 regulator.1 - ../../devices/platform/soc/18200000.rsc/18200000.rsc:rpmh-regulator-mxlvl/regulator/regulator.1 lrwxrwxrwx 1 root root 0 Mar 27 2023 regulator.10 - ../../devices/platform/soc/18200000.rsc/18200000.rsc:rpmh-regulator-ldoa2/regulator/regulator.10 ...随便进入一个rootqrb5165-rb5:/sys/class/regulator# cd /sys/class/regulator/regulator.40 rootqrb5165-rb5:/sys/class/regulator/regulator.40# ls -l total 0 lrwxrwxrwx 1 root root 0 Jun 17 01:30 device - ../../../18200000.rsc:rpmh-regulator-ldoc1 -r--r--r-- 1 root root 4096 Jun 17 01:30 max_microvolts -r--r--r-- 1 root root 4096 Jun 17 00:46 microvolts -r--r--r-- 1 root root 4096 Jun 17 01:30 min_microvolts -r--r--r-- 1 root root 4096 Jun 17 00:46 name -r--r--r-- 1 root root 4096 Jun 17 01:30 num_users lrwxrwxrwx 1 root root 0 Jun 17 01:30 of_node - ../../../../../../../firmware/devicetree/base/soc/rsc18200000/rpmh-regulator-ldoc1/regulator-pm8150a-l1 drwxr-xr-x 2 root root 0 Jun 17 01:30 power -r--r--r-- 1 root root 4096 Jun 17 01:30 requested_microamps -r--r--r-- 1 root root 4096 Jun 17 00:46 state lrwxrwxrwx 1 root root 0 Mar 27 2023 subsystem - ../../../../../../../class/regulator -r--r--r-- 1 root root 4096 Jun 17 01:30 suspend_disk_state -r--r--r-- 1 root root 4096 Jun 17 01:30 suspend_mem_state -r--r--r-- 1 root root 4096 Jun 17 01:30 suspend_standby_state -r--r--r-- 1 root root 4096 Jun 17 01:30 type -rw-r--r-- 1 root root 4096 Mar 27 2023 uevent -r--r--r-- 1 root root 4096 Jun 17 01:30 waiting_for_supplier一些相关属性rootqrb5165-rb5:/sys/class/regulator/regulator.40# cat name #确认名字 pm8150a_l1 rootqrb5165-rb5:/sys/class/regulator/regulator.40# cat microvolts #看当前电压 (微伏) 1800000 rootqrb5165-rb5:/sys/class/regulator/regulator.40# cat min_microvolts #看允许的最小电压 1800000 rootqrb5165-rb5:/sys/class/regulator/regulator.40# cat max_microvolts #看允许的最大电压 1800000 rootqrb5165-rb5:/sys/class/regulator/regulator.40# cat num_users #看看有几个驱动在用它 04.2 debugfs 寄存器级调试# 查看所有PMIC regulator cat /sys/kernel/debug/regulator/regulator_summary # 直接读写SPMI寄存器root echo 0x1234 /d/spmi/0/0x00000000/write cat /d/spmi/0/0x00000000/read5 其它高通官方工具 QDTEQualcomm Device Tree Editor打开xbl_config.elf提取内置 DTB可视化修改 PMIC 所有电压、使能、时序属性保存重签elf直接fastboot刷入调试无需重编全固件参考高通--PMIC修改三_高通pmic-CSDN博客Android实现在用户空间拉高拉低PMIC GPIO_android pmic-CSDN博客【高通平台电源管理汇总】PMIC基础知识简介_高通pmic-CSDN博客