RK3588共有5个PCIe控制器:
控制器在DTS对应节点名称
RK3588
控制器 | DTS节点名称 | 配对的PHY |
---|---|---|
PCIe Gen3 x 4Lane | pcie3x4:pcie@fe150000 | pcie30phy |
PCIe Gen3 x 2Lane | pcie3x2:pcie@fe160000 | pcie30phy |
PCIe Gen3 x 1Lane | pcie2x1l0:pcie@fe170000 | pcie30phy combphy1_ps |
PCIe Gen3 x 1Lane | pcie2x1l1:pcie@fe180000 | pcie30phy combphy2_psu |
PCIe Gen3 x 1Lane | pcie2x1l2:pcie@fe190000 | combphy0_ps |
RK3588S
控制器 | DTS节点名称 | 配对的PHY |
---|---|---|
PCIe Gen3 x 1Lane | pcie2x1l1:pcie@fe180000 | pcie30phy combphy2_psu |
PCIe Gen3 x 1Lane | pcie2x1l2:pcie@fe190000 | combphy0_ps |
RK3588有两种PCIe PHY:
PHY在DTS中对应的节点名称
RK3588
PHY名称 | DTS节点名称 | 是否复用 |
---|---|---|
pcie30phy | phy@fee80000 | pcie专用 |
combphy0_ps | phy@fee00000 | 与SATA复用 |
combphy1_ps | phy@fee10000 | 与SATA复用 |
combphy2_psu | phy@fee20000 | 与SATA/USB3复用 |
RK3588S
PHY名称 | DTS节点名称 | 是否复用 |
---|---|---|
combphy0_ps | phy@fee00000 | 与SATA复用 |
combphy2_psu | phy@fee20000 | 与SATA/USB3复用 |
pcie的配置大部分是固定的,需要在板级dts配置的变量并不多参考以下要点进行配置即可:
参考设计硬件RK3588-EVB1 对应DTS:rk3588-evb1-lp4-v10.dts
pcie3.0 4Lane RC + 2个pcie 2.0(复用的PHY分别对应 MUX1:combphy1_ps 和MUX2:combphy2_psu )
PCIe的具体DTS配置在arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4.dtsi
电源部分的配置:
pcie20_avdd0v85: pcie20-avdd0v85 {
compatible = "regulator-fixed";
regulator-name = "pcie20_avdd0v85";
regulator-boot-on;
regulator-always-on;
regulator-min-microvolt = <850000>;
regulator-max-microvolt = <850000>;
vin-supply = <&avdd_0v85_s0>;
};
pcie20_avdd1v8: pcie20-avdd1v8 {
compatible = "regulator-fixed";
regulator-name = "pcie20_avdd1v8";
regulator-boot-on;
regulator-always-on;
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
vin-supply = <&avcc_1v8_s0>;
};
pcie30_avdd0v75: pcie30-avdd0v75 {
compatible = "regulator-fixed";
regulator-name = "pcie30_avdd0v75";
regulator-boot-on;
regulator-always-on;
regulator-min-microvolt = <750000>;
regulator-max-microvolt = <750000>;
vin-supply = <&avdd_0v75_s0>;
};
pcie30_avdd1v8: pcie30-avdd1v8 {
compatible = "regulator-fixed";
regulator-name = "pcie30_avdd1v8";
regulator-boot-on;
regulator-always-on;
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
vin-supply = <&avcc_1v8_s0>;
};
# PCIe3.0的GPIO控制电源的配置
vcc3v3_pcie30: vcc3v3-pcie30 {
compatible = "regulator-fixed";
regulator-name = "vcc3v3_pcie30";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
enable-active-high;
gpios = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>;
startup-delay-us = <5000>;
vin-supply = <&vcc12v_dcin>;
};
PCIE控制器的配置
控制的详细配置在rk3588.dtsi中 ,对应的phy的指定也已经默认配置好,如需要重新配置phy可以修改
phys = <&pcie30phy>;
phys = <&combphy1_ps PHY_TYPE_PCIE>;
RK3588的pcie2x1l0和pcie2x1l1控制器可以路由到多个phy,需要注意的是不同的phy引用方式可能有差异,comboPHY需要同时指定phy的工作模式
用于WIFI模块
&pcie2x1l0 {
reset-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;
rockchip,skip-scan-in-resume;
status = "okay";
};
用于以太网模块
&pcie2x1l1 {
reset-gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&rtl8111_isolate>;
status = "okay";
};
&pcie30phy {
rockchip,pcie30-phymode = ;
status = "okay";
};
&pcie3x4 {
reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>; //配置PCIE3.0的reset脚
vpcie3v3-supply = <&vcc3v3_pcie30>; //配置对应的电源
status = "okay";
};
PHY的配置
硬件原图上面对应的是MUX1
&combphy1_ps {
status = "okay";
};
硬件原图上面对应的是MUX2
&combphy2_psu {
status = "okay";
};
注意:如果pcie3.0phy拆分2个2Lane,但是只用一组的话,需要把另一组disabled,但是关掉的那组的pcie的电源还是要供着,否则会导致pcie异常无法使用。
/ {
vcc3v3_pcie30: vcc3v3-pcie30 {
compatible = "regulator-fixed";
regulator-name = "vcc3v3_pcie30";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
enable-active-high;
gpios = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>;
startup-delay-us = <5000>;
vin-supply = <&vcc12v_dcin>;
};
};
&combphy0_ps {
status = "okay";
};
&combphy1_ps {
status = "okay";
};
&combphy2_psu {
status = "okay";
};
&pcie2x1l0 {
phys = <&combphy1_ps PHY_TYPE_PCIE>;
reset-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie2x1l1 {
phys = <&combphy2_psu PHY_TYPE_PCIE>;
reset-gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie2x1l2 {
reset-gpios = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie30phy {
rockchip,pcie30-phymode = ;
status = "okay";
};
//表示lane2/3
&pcie3x2 {
reset-gpios = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
//表示lane0/1
&pcie3x4 {
num-lanes = <2>;
reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
/ {
vcc3v3_pcie30: vcc3v3-pcie30 {
compatible = "regulator-fixed";
regulator-name = "vcc3v3_pcie30";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
enable-active-high;
gpios = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>;
startup-delay-us = <5000>;
vin-supply = <&vcc12v_dcin>;
};
};
&combphy0_ps {
status = "okay";
};
&pcie2x1l0 {
phys = <&pcie30phy>;
reset-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie2x1l1 {
phys = <&pcie30phy>;
reset-gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie2x1l2 {
reset-gpios = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie30phy {
rockchip,pcie30-phymode = <PHY_MODE_PCIE_NABIBI>;
status = "okay";
};
&pcie3x2 {
num-lanes = <1>;
reset-gpios = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
&pcie3x4 {
num-lanes = <1>;
reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
status = "okay";
};
PCIE的详细说明文档可以参考Rockchip RK3588 Android SDK的如下文档
RKDocs/common/PCie/Rockchip_Developer_Guide_PCIe_CN.pdf
返回 RK3588 Kernel DTS解析 专栏