天天看點

[RK3288]PMU配置(RK808)【轉】

  • ​​硬體原理​​
  • ​​pmic 電路原理​​
  • ​​平台概述​​
  • ​​RK808​​
  • ​​PWM 介紹​​
  • ​​驅動分析​​
  • ​​dts​​
  • ​​驅動流程​​
  • ​​PMIC​​
  • ​​PWM​​
  • ​​配置相關​​
  • ​​menuconfig​​
  • ​​修改各路 DCDC 和 LDO​​
  • ​​方法一修改dts​​
  • ​​方法二運作中動态設定​​
  • ​​設定 DCDC 工作模式接口​​
  • ​​方法一初始化設定​​
  • ​​方法二運作下切換​​
  • ​​調試流程與碰到的問題​​

調試環境 

RK3288 

Android5.1

硬體原理

pmic 電路原理

電源分為兩種: 

DCDC:輸入輸出壓差大時,效率高,但是有紋波問題,成本高,是以大壓差,大電流時使用。 

LDO:輸入輸出壓差大時,效率低,成本低。 

為了提高 LDO 的轉換效率,系統上會進行相關優化如: 

LDO 輸出電壓為 1.1V,為了提高效率,其輸入電壓可以從 VCCIO_3.3V 的 DCDC 給出。 

是以電路上如果允許盡量将 LDO 接到 DCDC 輸出回路,但是要注意上電時序。 

DCDC 一般有兩種工作模式: 

PWM–紋波瞬态響應好,效率低; 

PFM:效率高,但是負載能力差。

平台概述

RICO619(5路DCDC) 

RK808 

ACT8846 

各子產品需要供電: 

ARM 1.0V 

GPU 1.0V 

DDR 1.2V 

VCCIO 3.3V 

LOGIC 1.0V(分立 PWM) 

Logic 需要動态調壓,如果采用分立DCDC(PWM),調節精度、輸出電壓一緻性不能保證。

雙電池 ACT8846 + SYR82X 

單電池 RK808 或者 RICOH619 + SYR82X

RK808

(本方案采用的 RK808)

Resource VCC1 VCC2 VCC3 VCC4 LDO1 LDO2 LDO3
VOL 1.0V 1.0V 1.2V 3.3V 3.3V 3.3V 1.0V
TimeSlot 2 2 4 2 1 OFF 2
Resource LDO4 LDO5 LDO6 LDO7 LDO8 VSWOUT1 VSWOUT2
VOL 1.8V 3.3V 1.2V 1.8V 3.3V 3.0V 3.0V
TimeSlot OFF 5 OFF 3 OFF OFF OFF

開機流程: 

當有接擴充卡時。 

VDC 電壓 升高; VSYS 上電; PMIC 上電并輸出。 

當隻接電池時,按開機鍵。 

PWRON 拉高; PMIC 上電并輸出。PMIC 啟動,實作 EPROM 中的預設設定,各路上電完成後,發送 reset 信号,晶片上電,系統啟動,PMIC 裝置挂載,通過I2C 重新配置 PMIC。

PWM 介紹

PWM 即通過占空比設定電壓。 

計算占空比: 

利用 pwm_regulator_set_voltage 将設定的電壓轉換成占空比 

pwm_value = (max - vol)/coefficient/10 //計算占空比,max 及 coefficient 由闆級傳參 

設定占空比: 

在rockchip-pwm-regulator.c中pwm_set_rate() 

RATE為0時設定PWM為GPIO口輸出低,控制LOGIC電壓最高(1.4V)。 

RATE為100時設定PWM為GPIO口輸出高,控制LOGIC電壓最低(0.9V)。 

RATE在0~100之間: 

根據目前PWM的CLK計算高電平和低電平的值,然後寫到PWM控制寄存器中即可 

其驅動方面需要按特定流程,先将 PWM 控制器 disable 并且 RESET,然後設定,最後 enable。

驅動分析

dts

先看 rk808.dtsi

rk808_dcdc1_reg: regulator@0 {
            reg = <0>;
            regulator-compatible = "rk_dcdc1";      
            regulator-min-microvolt = <700000>;                 //min 和 max 相同時,初始化會設定電壓。不一樣則表示範圍。
            regulator-max-microvolt = <1500000>;
            regulator-initial-mode = <0x2>;                         //工作模式,類别參考手冊
            regulator-initial-state = <3>;                              //suspend 模式下的設定
            regulator-state-mem {                                       //休眠模式下的工作模式
                regulator-state-mode = <0x2>;
                regulator-state-disabled;//disabled //休眠下的使能狀态
                regulator-state-uv = <900000>;                  //休眠下的電壓
            };      
        };      

再看 rk3288-tb_8846.dts

/include/ "rk808.dtsi"
&rk808 {
    gpios =<&gpio0 GPIO_A4 GPIO_ACTIVE_HIGH>,<&gpio0 GPIO_B3 GPIO_ACTIVE_LOW>;
    rk808,system-power-controller;
    regulators {        
        rk808_dcdc1_reg: regulator@0{
            regulator-name= "vdd_arm";          //驅動根據這個name 設定 PMU 電壓、工作模式、使能。不可重名。
            regulator-always-on;                      //表示常開
            regulator-boot-on;
        };
        ...
};      

驅動流程

PMIC

regulator_ops 注冊,完成 PMU 驅動與 regulator 之間連結: 

kernel/drivers/regulator/ 

完成 regulator_ops 的注冊後,可以使用 regulator 的接口了。(regulator_set_voltage)

PWM

用 PWM 調整外挂 DCDC 電壓,注冊 PWM 驅動

pwm_regulator {
        compatible = "rockchip_pwm_regulator";
        pwms = <&pwm1 02000>;
        rockchip,pwm_id= <1>;
        rockchip,pwm_voltage_map= <92500095000097500010000001025000105000010750001100000112500011500001175000120000012250001250000127500013000001325000135000013750001400000>;
        rockchip,pwm_voltage= <1000000>;
        rockchip,pwm_min_voltage= <925000>;
        rockchip,pwm_max_voltage= <1400000>;
        rockchip,pwm_suspend_voltage= <950000>;
        rockchip,pwm_coefficient= <475>;
        regulators {
            #address-cells = <1>;
            #size-cells = <0>;
            pwm_reg0: regulator@0 {
                regulator-compatible = "pwm_dcdc1";
                regulator-name= "vdd_logic";
                regulator-min-microvolt = <925000>;
                regulator-max-microvolt = <1400000>;
                regulator-always-on;
                regulator-boot-on;
            };
        };
    };      

并且打開 PWM 口

&pwm1 {
    status = "okay";
};      

配置相關

menuconfig

/rk808 

相關的兩個宏打開

修改各路 DCDC 和 LDO

方法一,修改dts

通過設定 dts 裡面的

regulator-min-microvolt=<3300000>;
regulator-max-microvolt=<3300000>;      
pwm_regulator { rockchip,pwm_voltage=<1000000>; };      

來設定預設電壓。

方法二,運作中動态設定
Struct regulator *dcdc;
    dcdc =regulator_get(NULL, "name");
    regulator_set_voltage(dcdc, min_uv, max_uv);
    regulator_enable(dcdc);
    regulator_put(dcdc);      

設定 DCDC 工作模式接口

DCDC 有兩種模式(PWM、PFM)。 

有一種 Auto 模式會自動調整 PWM、PFM。 

是以我們常說的兩種模式是 PWM 和 AUTO(PWM+PFM)。 

AUTO 模式 效率高、紋波瞬态響應差。 

現在一般都 PWM 模式。

方法一,初始化設定
方法二,運作下切換
dcdc = regulator_get(NULL, "name");
regulator_set_mode(dcdc, REGULATOR_MODE_STANDBY);
//pwm:REGULATOR_MODE_NORMAL pfm: REGULATOR_MODE_STANDBY      
ldo =regulator_get(NULL, "act_ldo1");
regulator_enable(ldo);      //開啟 ldo1
//regulator_disable(ldo); //關閉 ldo1      

調試流程與碰到的問題

  1. 開機列印 PMU 注冊失敗,提示 i2c 通信失敗,或者直接跑飛

    1)測試 i2c 的 CLK 和 data 資料線是否被拉低;

    2)核對 i2c 有沒有注冊錯,使用的 i2c 是否跟平台

    上一緻;

    3)i2c 上是否還有其他裝置;

    4)測試 PMIC 的各路預設的上電電壓是否正确;

    5)測試Power_hold 是否為高;

    6)測試 PMIC 預設上電完成後 reset 信号是否發送;

    7)PMIC 外圍部件是

    否焊接錯誤,例如晶振有沒有焊反,電感、電容等有沒有焊錯。

  2. 系統運作中當機

    1)測試當機時各路的電壓,是否有電壓異常;

    2)測試 DVFS 調整是否正常;

    3)測試 arm、logic、DDR、VCCIO 的電壓的紋波等,看下在系統異常時是否有明顯的電壓塌陷。

    3 、待機喚醒當機

    1)測試 PMU_sleep 腳已經恢複成低;

    2)測試各路電壓已經從待機電壓恢複回來;

    3)用示波器測試喚醒時各路電壓的的變化波形,有無異常;4)sleep 狀态不去關閉電源。不降低電壓;

    Reset 後無法開機或者某些裝置異常

  3. Reset

    如果出現此問題,請參考本文第三章 pmic 的關機及複位。

    Reset 按下時,晶片複位,各個 io 口恢複成預設值,如果 PMU 沒有複位功能或者沒有完成硬複位,

    則 PMU 不會被複位,則無法完成 PMU 的斷電并重新上電,這樣可能會導緻部分裝置重新開機後工作

    不正常。(部分項目上發現有些裝置在複位時必須要掉電,否則會工作異常)

    RTC 無法正常寫入

  4. RTC

    1)如果 PMU 是 act8846(不帶 RTC)此時要看下 RTC 裝置是否挂載正常;2)PMU 裝置的 i2c

    通信是否正常

  5. 運作時部分 LDO 沒有輸出

    1)确認此 LDO 在其他地方沒有被關閉,通過搜尋此 LDO 的 name (使用此接口 regulator_disable());

    2)測試 PMIC_SLEEP 腳是不是為高,如果為高,PMU 已經進入休眠模式,部分 LDO 會被關閉。

    PMIC_SLEEP 腳的配置應該是不對的,需要配置此 io 口:見本文檔 1.2 章(注意:硬體上此 io 口,

    最好沒有複用功能,而且是應該是預設内部下拉口)

  6. 關機後随機性的自動開機或者關機失敗

    關機失敗:device_shutdown()中會通過 i2c 寫關機指令,i2c 通信失敗,無法寫關機指令。如果遇到此問題。加一些保護鎖,如果一直寫失敗,直接重新開機。

    關機後自動開機:因為 RTC 鬧鈴具有開機的功能,在關機後如果 RTC 鬧鈴産生,即會觸發開機條

    件而開機。目前已經解決過了,在關機函數中先關閉 RTC 鬧鈴的中斷,在開機時再打開中斷。

  7. 待機時随機性被喚醒

    如果喚醒中斷是 PMIC_INT,那麼應該是 PMU 的 RTC 鬧鈴在喚醒系統。除了使用者設定的鬧鈴外,

    還有一些谷歌的應用會産生 RTC 鬧鈴,需要移除相應的應用。檢視方法如下:

    請客戶在指令行中敲入 dumpsys alarm 來檢視目前系統的 alarm 申請情況。

    android 總共有4種類型 alarm,其中隻有2種 alarm 會在休眠喚醒系統,請在相關資訊中查找對應的

    第三方軟體。

    這兩種分别是 ELAPSED_WAKEUP 和 RTC_WAKEUP。

    我們觀察到,凡是帶了谷歌相關的 apk 就會申請相關 alarm,如下:

    RTC_WAKEUP #5: Alarm{413418b8 type 0 com.google.android.gsf}

    type=0 when=+5d17h1m54s609ms repeatInterval=566316000 count=0

    operation=PendingIntent{41294818: PendingIntentRecord{413ce158

    com.google.android.gsf broadcastIntent}}

    注意:此喚醒動作隻在二級待機,不會到一級待機喚醒,點亮屏,如果點亮了屏,應該是屏那邊沒有進

    休眠。

    RICOH619

  8. RICOH619

    RICOH619無法開機或者開機後電量顯示異常

    确認電池包上 TS 端是否有10K 電阻,如果沒有,請确認闆子上 TS 端對地有10K 電阻。如果沒有10K

    電阻,PMIC 預設電池是不存在的。

  9. RICOH619

    RICOH619充電異常,充電電流多小,或者充電充不滿

    充電電流過小:

    我們上電有預設的充電電流,USB:500MA , ADP :1A,開機後 USB 根據枚舉結果通過 I2C

    重新設定充電電流,最大可設定 3A(一般推薦到 2A),ADP 電流開機後就會修改,最大 3A。

    實際往電池充的電流跟設定電流會有一些不一樣,有充電效率的關系。詳細見下:

    ILIM_USB/ILIM_ADP 的設定值 限制 USB/ADP 輸入時 VSYS 系統輸出的電流極限最大

    限流。 ( 實際限制的輸出值 大約在 設定值 的 90% 左右 )

    因為 工作方式是 DCDC 的關系, 實際的輸入電流會小于輸出電流。

    ( 功率轉換:理想情況下 輸入 5V x 1A

    5V = VADP, 1A = I_ADP,

    4V = VSYS,

    =4V * 1.25A )

    Ex.

    ILIM_ADP = 1.25A.

    另外,限制電流的偵測方式是 由 ILM, ILP 間的 Sense 電阻 壓降而得到。

    ( ILM , ILP 端口需要直接采集 電阻( 20mohm ) 上的 壓降,需要注意版圖畫法)

    關于流入電池的電流 可以 檢視一下 ICM , ICP 之間的 Sense 電阻的壓降來判斷。

    當然,也需要小心制版時, PMU 的 ICM, ICP 是否取到的直接時 電阻兩端的電壓。

  10. 1.5A 設定 輸入限流, 實際輸出限制 大約 1.3A 以上。

    ( 可通過 檢測 ILM /

    ILP 間 電阻壓降 )

  11. 由于是 DCDC 工作的方式, IUSB= VSYS * I_SYS V_USB * I_USB * 效率 = VSYS * I_SYS / (V_USB * 效率 ) = 4.0 * 1.3 / ( 5 * 0.9 ) = 1.1A ( 約 ) 充電充不滿: 充電有充電時間的限制,一般是充電 5 小時就會關閉充電,是以存在一邊使用一邊充電時電池充 不滿,這個問題我們後期會使用軟體解決。