一般 IO
电源的电压有 1.8v,3.3v,2.5v,5.0v 等,有些 IO 同时支持多种电压,io-domain 就是配置 IO 电源域的寄存器,依据真实的硬件电压范围来配置对应的电压寄存器,否则无法正常工作;下面有罗列出哪些 RK
芯片都需要配置 io- domain。
产品版本
驱动文件与 DTS 节点:
驱动文件
驱动文件所在位置:
drivers/
power/avs/rockchip-io-domain.c
DTS 节点
内核 3.10 版本的 DTS 节点合并:
io-domains {
compatible = "rockchip,rk3368-io-voltage- domain";
rockchip,grf = <&grf>;
rockchip,pmugrf = <&pmugrf>;
/*GRF_IO_VSEL*/
dvp-supply = <&
LDO7_reg>; /* DVPIO_
VDD */
wifi-supply = <&ldo7_reg>; /* APIO2_VDD */
Audio-supply = <&dcdc2_reg>; /* APIO3_VDD */
sdcard-supply = <&ldo1_reg>; /* SDMMC0_VDD */
GPIO30-supply = <&dcdc2_reg>; /* APIO1_VDD */
gpio1830-supply = <&dcdc2_reg>;/*
ADIO4_VDD */
/*PMU_GRF_IO_VSEL*/
......
TRM 中的描述
很多工程师反映在 TRM 中找不到 io-domain 相关的寄存器,可以通过 TRM 来搜索需要配置的 io-domain 寄存器描述,在 GRF/PMUGRF 章节搜索 ’vsel‘ , ‘VSEL’ 或者 ‘volsel’ 索引,PMUGRF 中的 io-domain 是用来控制 PMU IO。
支持配置的两种电压1.8v / 3.3v:
寄存器配置成1,一般对应的电压范围是 1.62v ~ 1.98v,typical 电压1.8v;
寄存器配置成0,一般对应的电压范围是 3.00v ~ 3.60v,typical 电压3.3v。
具体电压范围要以实际芯片的
datasheet 为准。
驱动软件流程
下面是 rockchip-io-domain.c 驱动的软件流程图,主要分为两个方面:
1. 初始化配置
在驱动的 probe 函数中的 supply name,获取 dts 中对应 supply name 定义的regulator,再根据 regulator 的电压配置 io-domain 寄存器,如果是 1.8v 那一档,该 bit 配置为 1;如果是 3.3v 那一档,该 bit 配置为 0。
2. 动态配置
在初始化的过程中,会绑定 regulator,通过注册 notify 的方式,一旦这个regulator 的电压发生变化,就会通知 io-domain 驱动更新成对应的寄存器,做到动态更新寄存器的效果。
如何配置 io-domain
不是每个 IO 电源域都需要配置,有些 IO 的电源域是固定的,不需要配置。下面3个步骤描述如何通过软件配置 io-domian:
1. 通过 rockchip-io-domain.txt 文档寻找名称
需要在软件上通过 dts 配置的 IO 电源域在
linux kernel 的目录下的文件都有描述:Documentation/
devicetree/bindings/power/rockchip-io-domain.txt;由于TRM 文档和硬件
原理图上对同一个 io-domain 名称描述可能有差异,在rockchip-io-domain.txt 文档上统一描述了 TRM 与 硬件原理图上 io-domain 名称的对应关系。
例如 RK3399
SOC,通过查看 rockchip-io-domain.txt 文档, 我们知道了RK3399 的电源域需要配置包含 bt565,audio,sdmmc,gpio1830,以及PMUGRF 下面的 pmu1830 这几个 supply,后面的 The supply connected to “***_VDD” 表示在硬件原理图上对应的名称。
2. 通过硬件原理图寻找 io-domain 配置的真实电压
仍以 RK3399-
EVB 原理图 和 bt656 IO 电源域为例,我们在 rockchip-io- domain.txt 中找到了 bt656 对应的硬件原理图上表示为 APIO2_VDD。所以通过逆向搜索 ‘APIO2_VDD’ 得到 RK3399-EVB 硬件原理图上的 APIO2_VDD 电源是由
RK808 下的 VCC1V8_DVP 供给。
3. 通过 DTS 配置
以上两步做完后,得到了配置的名称和供电源头,在 DTS 里面找到对应的regulator: vcc1v8_dvp,就可以在 rk3399-evb.dtsi 配置上 “bt656-supply = <&vcc1v8_dvp>;”,其他的电源域配置类似。
通过硬件 Pin 脚控制的电源域一般不做配置
在 RK Soc 中的一些 IO 电源域在硬件上已经通过某个 Pin 脚来控制的,这种情况下我们 kernel 的 DTS 一般不去配置,不破坏当前的硬件状态,像 ç ash 和
EMMC 这些
模块的 IO 电源域一般都是 Pin 脚来控制的。
在 TRM 的 io-domain 寄存器描述中,我们可以看到哪些电源域是可以通过 Pin脚来控制的,以及通过硬件上这个 Pin 脚的输入电压状态来确认当前这个电压域的配置;也可以通过 GRF 寄存器来配置,两种选择。
例如,RK3368 Soc 的 TRM 和 RK3368-evb 的硬件原理图上有下面寄存器的描述和硬件上 Pin 脚的配置。
更多详细内容请下载附件查看