如何在dts文件中正确配置GPIO以在Suspend-to-RAM模式下断电
问题根因
TI tca6424属于pca953x系列GPIO扩展器,内核原生的gpio-pca953x驱动仅实现了GPIO控制器功能,不支持直接在设备子节点解析regulator配置,你直接在tca6424节点下新增regulator子节点不会被内核识别处理。
现成实现方案(无需自定义驱动)
用内核自带的regulator-gpio通用驱动实现GPIO控制的电源开关,操作步骤如下:
- 第一步:确认内核配置开启
CONFIG_REGULATOR_GPIO=y(编译进内核)或CONFIG_REGULATOR_GPIO=m(编译为模块) - 第二步:修正设备树配置,首先保留原有tca6424节点的GPIO控制器配置,单独新增GPIO regulator节点:
保留的tca6424节点示例:
hu_u1740: tca6424_hu_u1740@22 { compatible = "ti,tca6424"; reg = <0x22>; gpio-controller; #gpio-cells = <2>; };
新增的regulator节点示例:
pw_bt_reg: regulator-pw-bt { compatible = "regulator-gpio"; regulator-name = "pw_bt"; /* 修正原配置的电压错误:33000000为33V,3.3V正确值为3300000 */ regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; enable-active-high; /* 引用tca6424的17号引脚,极性为高有效 */ gpios = <&hu_u1740 17 GPIO_ACTIVE_HIGH>; regulator-state-mem { regulator-off-in-suspend; }; };
- 第三步(可选):如果下游蓝牙芯片在设备树中有对应节点,在该节点下添加
vcc-supply = <&pw_bt_reg>;绑定供电关系,符合设备树规范。
注意事项
- 如果你使用的内核版本未定义
GPIO_ACTIVE_HIGH宏,直接替换为数值0即可,对应tca6424节点#gpio-cells = <2>的第二个参数极性定义 - 需确认tca6424挂载的I2C控制器在suspend阶段未被断电,否则regulator无法通过I2C写入寄存器修改引脚电平,这种情况需要额外配置I2C控制器的suspend唤醒属性。
内容的提问来源于stack exchange,提问作者Ziegfried
相关产品推荐
相关产品推荐

