Rockchip · AI & Linux Hub

Linux und Boot

Rockchip RK801 PMIC: Versorgung, DTS und Register-Debugging

Rockchip RK801 PMIC: Versorgung, DTS und Register-Debugging — V1.1.0

· ArmSoM Editorial · Rockchip source documentation · 12 Min. Lesezeit

Plattformreferenz: RK-KF-YF-C57 V1.1.0, RK801 / Linux 6.1. Behandelt Module, Begriffe, Funktionen, DTS und Fehlerdiagnose. PMIC, SoC, SDK/BSP, Kernel, Versorgung und Verdrahtung der konkreten ArmSoM-Platine prüfen; keine allgemeine Kompatibilitätszusage. Keine ArmSoM-Hardwarevalidierung. Chinesisch nutzt chinesische Bilder, EN/RU/DE englische. Hardwarebefehle sind dokumentiert, nicht ausgeführt.

ArmSoM Docs · Rockchip Linux

1. Grundlagen

1.1 Überblick

RK801 ist eine leistungsfähige PMIC mit 4 Hochstrom-DCDC, 2 LDO, 1 SWITCH, 1 PWRON und einstellbarer Einschaltreihenfolge. Systemversorgungen werden allgemein in DCDC und LDO unterteilt. Ihre allgemeinen Eigenschaften folgen; Einzelheiten sind separat nachzuschlagen.

  1. DCDC: hoher Wirkungsgrad bei großer Ein-/Ausgangsspannungsdifferenz, jedoch größere Welligkeit und höhere Kosten; für große Spannungsdifferenzen und Lastströme. Üblich sind PWM (gutes dynamisches Welligkeitsverhalten, niedriger Wirkungsgrad) und PFM (hoher Wirkungsgrad, aber geringe Belastbarkeit).
  1. LDO: bei großer Spannungsdifferenz niedriger Wirkungsgrad und geringe Kosten. Schaltungsoptimierungen erhöhen den Wirkungsgrad: Bei 1.1V LDO-Ausgang kann der Eingang beispielsweise vom DCDC VCCIO_3.3V gespeist werden. Soweit schaltungstechnisch möglich, den LDO am DCDC-Ausgang betreiben und die Einschaltreihenfolge beachten.

1.2 Chipfunktionen

Aus Anwendersicht hat RK801 zwei Funktionsgruppen:

  1. Regulator: Versorgungszustand jedes DCDC und LDO steuern.
  1. Pwrkey: Drücken/Loslassen der Einschalttaste erkennen und damit einen GPIO des AP einsparen.

1.3 Chipanschlüsse

Englische Originalabbildung — p.6

Englische Originalabbildung — p.6

In der folgenden Beschreibung besonders auf PWRCTRL und INT achten.

Englische Originalabbildung — p.7

Englische Originalabbildung — p.7

Englische Originalabbildung — p.7

Englische Originalabbildung — p.7

Pindefinitionen (zeilenweise aus den obigen Abbildungen übertragen; Quellnamen und I/O beibehalten)

Pin-Nr. Pinname Beschreibung
1 VCC4 Versorgung von BUCK4
2 SCL I2C-Takteingang (Open-Drain-Ausgang)
3 SDA I2C-Datenein-/ausgang (Open Drain)
4 RESETB Reset-Pin nach dem Einschalten, aktiv Low
5 VCCA Versorgung von inner circuit
6 BST2 Bootstrap-Kondensator des Hochvolt-BUCK2
7 INT Interrupt-Anforderung (Open Drain)
8 SW2 Schaltknoten von high voltage BUCK2
9 VCCH2 Versorgung von high voltage BUCK2
10 VOUT2 Ausgangsrückkopplungsspannung von high voltage BUCK2
11 PWRCTLR PWRCTLR-Steuereingang
12 VOUT1 Ausgangsrückkopplungsspannung von high voltage BUCK1
13 VCCH1 Versorgung von high voltage BUCK1
14 SW1 Schaltknoten von high voltage BUCK1
15 BST1 Bootstrap-Kondensator des Hochvolt-BUCK1
16 LDO2 LDO2-Ausgang
17 VCC6 Versorgung von LDO2
18 VCC5 Versorgung von LDO1
19 LDO1 LDO1-Ausgang
20 VDC VDC-Eingang
21 VCC3 Versorgung von BUCK3
22 SW3 Schaltknoten von BUCK3
23 VFB3 Ausgangsrückkopplungsspannung von BUCK3
24 VSW SWITCH-Ausgang
25 PWRON Einschalttasteneingang, aktiv Low, interner 22k-Pull-up nach VCCA
26 VCC7 Versorgung von SWITCH
27 VOUT4 Ausgangsrückkopplungsspannung von BUCK4
28 SW4 Schaltknoten von BUCK4
Exposed pad Exposed ground Masse

1.4 Wichtige Begriffe

I2C-Adresse: 7-Bit-Slave-Adresse 0x27. Die PMIC hat 3 Betriebsarten.

  1. PMIC-Normalbetrieb. Im normalen Systembetrieb arbeitet die PMIC im Normalmodus; pmic_pwrctrl liegt auf Low.
  1. PMIC-Schlafmodus. Im Schlaf soll der Standby-Verbrauch möglichst gering sein; die PMIC wechselt zur Senkung ihres Eigenverbrauchs in den Schlafmodus. Üblicherweise werden Ausgangsspannungen einzelner Versorgungen reduziert oder Ausgänge abgeschaltet, entsprechend den Produktanforderungen. Beim Standby des Systems

konfiguriert der AP pmic_pwrctrl über I2C für den Schlafmodus und setzt den Anschluss anschließend auf High. Beim Aufwachen des SoC wird pmic_pwrctrl wieder Low und die PMIC verlässt den Schlafmodus.

  1. PMIC-Abschaltmodus. Beim Herunterfahren muss die PMIC die Versorgung des gesamten Systems abschalten. Der AP weist pmic_pwrctrl per I2C den Abschaltmodus zu und setzt den Anschluss auf High. Der Treiber wechselt diese Betriebsarten automatisch gemäß DTS und Szenario; keine zusätzliche Anwendersteuerung ist nötig.
  • pmic_pwrctrl: normalerweise Low für Normalbetrieb; High aktiviert Schlaf- oder Abschaltmodus.
  • pmic_int: normalerweise High; bei einem Interrupt Low, bis dieser bearbeitet ist.
  • pmic_pwron: Einschalttaste hardwareseitig anschließen; der Treiber erkennt Drücken/Loslassen.
  • DCDC-Betriebsarten: PWM (force PWM) und PFM. AUTO schaltet dynamisch zwischen PWM/PFM um. Unterstützt werden PWM und AUTO PWM/PFM. AUTO bietet hohen Wirkungsgrad, aber schlechteres dynamisches Welligkeitsverhalten. Für Stabilität wird im Betrieb PWM und im Schlaf AUTO PWM/PFM verwendet.
  • DCDC3 lässt sich nicht über Register einstellen, sondern nur über externe Spannungsteilerwiderstände. Eine Änderung erfordert Hardwareanpassung. Bei Rockchip wird dieser Ausgang üblicherweise als VCC_DDR genutzt.
  • Laufzeit-Spannungsbereiche von DCDC und LDO: Der DCDC-Bereich ist nicht kontinuierlich; siehe Kommentare oder Datenblatt.
// BUCK1
static const struct linear_range rk801_buck1_voltage_ranges[] = {
   REGULATOR_LINEAR_RANGE(500000,   0, 80, 12500), /* 0.5V - 1.5V, step 12.5mV */
   REGULATOR_LINEAR_RANGE(1800000, 81, 82, 400000),/* 1.8V - 2.2V */
   REGULATOR_LINEAR_RANGE(3300000, 83, 83, 0), /* 3.3V */
   REGULATOR_LINEAR_RANGE(5000000, 84, 84, 0), /* 5.0V */
   REGULATOR_LINEAR_RANGE(5250000, 85, 85, 0), /* 5.25V */
};

// BUCK2
static const struct linear_range rk801_buck2_voltage_ranges[] = {
   REGULATOR_LINEAR_RANGE(800000,  0, 2, 50000),   /* 0.8V - 0.9V */
   REGULATOR_LINEAR_RANGE(1800000, 3, 4, 400000),  /* 1.8V - 2.2V */
   REGULATOR_LINEAR_RANGE(3300000, 5, 5, 0),   /* 3.3V */
   REGULATOR_LINEAR_RANGE(5000000, 6, 6, 0),   /* 5.0V */
   REGULATOR_LINEAR_RANGE(5250000, 7, 7, 0),   /* 5.25V */
};

// BUCK4
static const struct linear_range rk801_buck4_voltage_ranges[] = {
   REGULATOR_LINEAR_RANGE(500000,   0, 80, 12500), /* 0.5V - 1.5V */
   REGULATOR_LINEAR_RANGE(1800000, 81, 82, 400000),/* 1.8V - 2.2V */
   REGULATOR_LINEAR_RANGE(2500000, 83, 83, 0), /* 2.5V */
   REGULATOR_LINEAR_RANGE(2800000, 84, 84, 0), /* 2.8V */
   REGULATOR_LINEAR_RANGE(3000000, 85, 85, 0), /* 3.0V */
   REGULATOR_LINEAR_RANGE(3300000, 86, 86, 0), /* 3.3V */
};

Die LDO-Spannung ist kontinuierlich einstellbar:

Spannungsbereich(V) Schritt(mV)
0.5 ~ 3.4 50

1.5 Einschaltbedingungen und -reihenfolge

  1. Einschaltbedingungen: Eine Bedingung genügt — VDC auf High oder Betätigung von PWRON im ausgeschalteten Zustand.
  1. Einschaltreihenfolge: Verschiedene SoC-Plattformen können unterschiedliche Reihenfolgen der Versorgungen verlangen. Einzelheiten zu verfügbaren Reihenfolgen stehen im aktuellen Datenblatt.

2. Konfiguration

2.1 Treiber und menuconfig

Treiberdateien:

drivers/mfd/rk808.c
drivers/regulator/rk801-regulator.c
drivers/input/misc/rk805-pwrkey.c

menuconfig-Einstellungen:

CONFIG_MFD_RK808
CONFIG_REGULATOR_RK801
CONFIG_INPUT_RK805_PWRKEY

2.2 Treiberversion

Für vollständige und stabile Funktionen mindestens auf die folgende Treiberversion aktualisieren. drivers/mfd/rk808.c:

commit 0439f30ead1393813d69a01587530652908c9171
Author: Joseph Chen <chenjh@rock-chips.com>
Date:   Fri Jun 13 17:19:25 2025 +0800

    mfd: rk808: Print full chip id of rk801

    Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
    Change-Id: I195858d23c862d0f961acb4c04bb1102ab9954c9

drivers/regulator/rk801-regulator.c:

commit 1a81f4f6344f7cd4203be508150daeedc00fbedb
Author: Joseph Chen <chenjh@rock-chips.com>
Date:   Thu May 29 11:39:58 2025 +0800

    mfd: rk801: Add support for pwrctrl active pol set and reboot rst

    - Don't require pwrctrl dvs if hw compatible version >= 3.
    - Auto parse pwrctrl active pol from GPIO_ACTIVE_{HIGH,LOW} flag.
    - Reset pmic and soc when system reboot if required.

    Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
    Change-Id: I29e60c2a717cee5c9d1e3c6e46ee687352d4a1be

2.3 DTS-Konfiguration

Die DTS umfasst I2C-Anbindung, Hauptknoten, regulator und weitere Teile. Beispiel: arch/arm/boot/dts/rk3506-rk801.dts. Hardwareschaltung:

Englische Originalabbildung — p.11

Englische Originalabbildung — p.11

DTS-Konfiguration:

&i2c0 {
    status = "okay";
    ......

    rk801: rk801@27 {
        // Cannot be modified.
        compatible = "rockchip,rk801";
        status = "okay";
        reg = <0x27>;

        // PMIC_INT pin configuration. Here is GPIO0_C2, active low.
        interrupt-parent = <&gpio0>;
        interrupts = <RK_PC2 IRQ_TYPE_LEVEL_LOW>;

        // PWRCTRL pin configuration. Here is GPIO0_C1, active high.
        pwrctrl-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;

        // Pinctrl configuration.
        pinctrl-names = "default", "pmic-reset";
        // Initialize pmic_int pin state.
        pinctrl-0 = <&pmic_int>;
        // Set the state of pwrctrl when rebooting. After this configuration, PMIC will reset its various voltages together with the SoC.
        pinctrl-1 = <&soc_pwrctrl_reset>;

        // Cannot be modified. Declare that RK801 has the function of managing system power-down.
        rockchip,system-power-controller;

        // Cannot be modified. Declare PMIC_INT as a wake-up source.
        wakeup-source;

        // Input sources for each regulator.
        // vcc1~7 correspond to: BUCK1/2/3/4, LDO1/2, SWITCH.
        vcc1-supply = <&vcc12v_dc>;
        vcc2-supply = <&vcc12v_dc>;
        vcc3-supply = <&vcc5v0_sys>;
        vcc4-supply = <&vcc5v0_sys>;
        vcc5-supply = <&vcc3v3_sys>;
        vcc6-supply = <&vcc3v3_sys>;
        vcc7-supply = <&vcc3v3_sys>;
        regulators {
            vcc3v3_sys: DCDC_REG1 {
                regulator-name = "vcc3v3_sys";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
                regulator-initial-mode = <0x1>;
                regulator-boot-on;
                regulator-always-on;
                regulator-state-mem {
                    regulator-mode = <0x2>;
                    regulator-on-in-suspend;
                    regulator-suspend-microvolt = <3300000>;
                };
            };

            vcc5v0_sys: DCDC_REG2 {
                regulator-name = "vcc5v0_sys";
                regulator-min-microvolt = <5000000>;
                regulator-max-microvolt = <5000000>;
                regulator-initial-mode = <0x1>;
                regulator-boot-on;
                regulator-always-on;
                regulator-state-mem {
                    regulator-mode = <0x2>;
                    regulator-on-in-suspend;
                    regulator-suspend-microvolt = <5000000>;
                };
            };

            vcc_ddr: DCDC_REG3 {
                regulator-name = "vcc_ddr";
                regulator-boot-on;
                regulator-always-on;
                regulator-state-mem {
                    regulator-mode = <0x2>;
                    regulator-on-in-suspend;
                };
            };

            vdd_cpu: DCDC_REG4 {
                regulator-name = "vdd_cpu";
                regulator-min-microvolt = <500000>;
                regulator-max-microvolt = <1500000>;
                regulator-initial-mode = <0x1>;
                regulator-boot-on;
                regulator-always-on;
                regulator-state-mem {
                    regulator-mode = <0x2>;
                    regulator-off-in-suspend;
                };
            };
            vdd0v9_sys: LDO_REG1 {
                regulator-name = "vdd0v9_sys";
                regulator-min-microvolt = <900000>;
                regulator-max-microvolt = <900000>;
                regulator-boot-on;
                regulator-always-on;
                regulator-state-mem {
                    regulator-on-in-suspend;
                    regulator-suspend-microvolt = <900000>;
                };
            };

            vcc_1v8: LDO_REG2 {
                regulator-name = "vcc_1v8";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <1800000>;
                regulator-boot-on;
                regulator-always-on;
                regulator-state-mem {
                    regulator-on-in-suspend;
                    regulator-suspend-microvolt = <1800000>;
                };
            };

            vcc_3v3: SWITCH_REG {
                regulator-name = "vcc_3v3";
                regulator-boot-on;
                regulator-always-on;
                regulator-state-mem {
                    regulator-on-in-suspend;
                };
            };
        };
    };
};

&pinctrl {
    ......

    pmic {
        // pmic_int is set to normally high level, that is, active low.
        pmic_int: pmic-int {
            rockchip,pins = <0 RK_PC2 RK_FUNC_GPIO &pcfg_pull_up>;
        };

        // The level state that the pwrctrl pin should maintain during system reset, must be opposite to the SoC's default power-on state.
        // For example: if the default power-on is down, configure as output high; otherwise, configure as output low.
        soc_pwrctrl_reset: soc-pwrctrl-reset {
            rockchip,pins = <0 RK_PC1 RK_FUNC_GPIO &pcfg_output_high>;
        };
    };
};

regulator-Eigenschaften:

  • regulator-compatible: Name für den Abgleich bei der Treiberregistrierung; nicht ändern, sonst schlägt das Laden fehl.
  • regulator-name: Versorgungsname, möglichst gemäß Schaltplan; für regulator_get abzugleichen.
  • regulator-init-microvolt: Initialspannung in u-boot, im Kernel unwirksam.
  • regulator-min-microvolt / regulator-max-microvolt: minimale/maximale im Betrieb einstellbare Spannung.
  • regulator-initial-mode: DCDC-Laufzeitmodus, üblicherweise 1; 1 = force pwm, 2 = auto pwm/pfm.
  • regulator-mode: DCDC-Schlafmodus, üblicherweise 2; dieselben Werte 1/2.
  • regulator-boot-on: schaltet die Versorgung bei der regulator-Registrierung ein.
  • regulator-always-on: verbietet das Abschalten im Betrieb und schaltet bei der Registrierung ein.
  • regulator-on-in-suspend: Versorgung im Schlaf eingeschaltet halten; zum Abschalten durch regulator-off-in-suspend ersetzen.
  • regulator-suspend-microvolt: Standby-Spannung bei nicht abgeschalteter Versorgung.

Sind regulator-min-microvolt und regulator-max-microvolt gleich, setzt das Framework bei der Registrierung automatisch diese Spannung und aktiviert die Versorgung. Mit regulator-boot-on oder regulator-always-on wird ebenfalls automatisch eingeschaltet. Bei gleichen Grenzwerten wird diese Spannung gesetzt; bei unterschiedlichen bleibt die hardwareseitige PMIC-Einschaltspannung bestehen.

pwrkey-Konfiguration: Ein fehlender pwrkey-Knoten unter rk801 entspricht aktiviertem pwrkey. Zum Abschalten den Knoten ausdrücklich ergänzen und disabled setzen.

rk801: rk801@27 {

    ......

    pwrkey {
        status = "disabled";
    };
};

2.4 Funktionsschnittstellen

Die folgenden Schnittstellen decken den üblichen Bedarf ab: regulator ein-/ausschalten sowie Spannung setzen und auslesen.

  1. Regulator beziehen: struct regulator *regulator_get(struct device *dev, const char *id). dev darf NULL sein; id entspricht regulator-name in der DTS.
  1. Regulator freigeben: void regulator_put(struct regulator *regulator)
  1. Regulator einschalten: int regulator_enable(struct regulator *regulator)
  1. Regulator ausschalten: int regulator_disable(struct regulator *regulator)
  1. Spannung lesen: int regulator_get_voltage(struct regulator *regulator)
  1. Spannung setzen: int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV). Der Aufrufer muss min_uV = max_uV gewährleisten.
  1. Beispiel
struct regulator *rdev_logic;

rdev_logic = regulator_get(NULL, "vdd_logic");          // Get vdd_logic
regulator_enable(rdev_logic);                           // Enable vdd_logic
regulator_set_voltage(rdev_logic, 1100000, 1100000);    // Set voltage 1.1v
regulator_disable(rdev_logic);                          // Disable vdd_logic
regulator_put(rdev_logic);                              // Release vdd_logic

Kernel ab 4.4 bieten außerdem regulator-Schnittstellen mit Präfix devm_ zur Verwaltung angeforderter Ressourcen.

3. Debugging

Die PMIC-Treiberlogik ist relativ einfach; entscheidend sind die endgültigen Registereinstellungen. Nutzbar sind das eingebaute i2cdump oder folgendes Verfahren. Knoten: /sys/rk8xx/rk8xx_dbg

# Read register
echo r [addr]  > /sys/rk8xx/rk8xx_dbg
# Write register
echo w [addr] [value] > /sys/rk8xx/rk8xx_dbg

Anwendungsbeispiel:

echo r 0x2f > /sys/rk8xx/rk8xx_dbg          # Read the value of register 0x2f
echo w 0x2f 0x9c > /sys/rk8xx/rk8xx_dbg     # Set the value of register 0x2f to 0x9c

Nach dem Schreiben erneut lesen, um den Erfolg zu überprüfen.

Redaktionshinweis: Pintabelle PWRCTLR, Fließtext PWRCTRL. Quellschreibweisen bleiben erhalten; vor Anpassung Hardwareunterlagen prüfen.

Dieses Thema entdecken → · Lernpfade →