- 硬體原理
- 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
調試流程與碰到的問題
-
開機列印 PMU 注冊失敗,提示 i2c 通信失敗,或者直接跑飛
1)測試 i2c 的 CLK 和 data 資料線是否被拉低;
2)核對 i2c 有沒有注冊錯,使用的 i2c 是否跟平台
上一緻;
3)i2c 上是否還有其他裝置;
4)測試 PMIC 的各路預設的上電電壓是否正确;
5)測試Power_hold 是否為高;
6)測試 PMIC 預設上電完成後 reset 信号是否發送;
7)PMIC 外圍部件是
否焊接錯誤,例如晶振有沒有焊反,電感、電容等有沒有焊錯。
-
系統運作中當機
1)測試當機時各路的電壓,是否有電壓異常;
2)測試 DVFS 調整是否正常;
3)測試 arm、logic、DDR、VCCIO 的電壓的紋波等,看下在系統異常時是否有明顯的電壓塌陷。
3 、待機喚醒當機
1)測試 PMU_sleep 腳已經恢複成低;
2)測試各路電壓已經從待機電壓恢複回來;
3)用示波器測試喚醒時各路電壓的的變化波形,有無異常;4)sleep 狀态不去關閉電源。不降低電壓;
Reset 後無法開機或者某些裝置異常
-
Reset
如果出現此問題,請參考本文第三章 pmic 的關機及複位。
Reset 按下時,晶片複位,各個 io 口恢複成預設值,如果 PMU 沒有複位功能或者沒有完成硬複位,
則 PMU 不會被複位,則無法完成 PMU 的斷電并重新上電,這樣可能會導緻部分裝置重新開機後工作
不正常。(部分項目上發現有些裝置在複位時必須要掉電,否則會工作異常)
RTC 無法正常寫入
-
RTC
1)如果 PMU 是 act8846(不帶 RTC)此時要看下 RTC 裝置是否挂載正常;2)PMU 裝置的 i2c
通信是否正常
-
運作時部分 LDO 沒有輸出
1)确認此 LDO 在其他地方沒有被關閉,通過搜尋此 LDO 的 name (使用此接口 regulator_disable());
2)測試 PMIC_SLEEP 腳是不是為高,如果為高,PMU 已經進入休眠模式,部分 LDO 會被關閉。
PMIC_SLEEP 腳的配置應該是不對的,需要配置此 io 口:見本文檔 1.2 章(注意:硬體上此 io 口,
最好沒有複用功能,而且是應該是預設内部下拉口)
-
關機後随機性的自動開機或者關機失敗
關機失敗:device_shutdown()中會通過 i2c 寫關機指令,i2c 通信失敗,無法寫關機指令。如果遇到此問題。加一些保護鎖,如果一直寫失敗,直接重新開機。
關機後自動開機:因為 RTC 鬧鈴具有開機的功能,在關機後如果 RTC 鬧鈴産生,即會觸發開機條
件而開機。目前已經解決過了,在關機函數中先關閉 RTC 鬧鈴的中斷,在開機時再打開中斷。
-
待機時随機性被喚醒
如果喚醒中斷是 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
-
RICOH619
RICOH619無法開機或者開機後電量顯示異常
确認電池包上 TS 端是否有10K 電阻,如果沒有,請确認闆子上 TS 端對地有10K 電阻。如果沒有10K
電阻,PMIC 預設電池是不存在的。
-
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 是否取到的直接時 電阻兩端的電壓。
-
1.5A 設定 輸入限流, 實際輸出限制 大約 1.3A 以上。
( 可通過 檢測 ILM /
ILP 間 電阻壓降 )
- 由于是 DCDC 工作的方式, IUSB= VSYS * I_SYS V_USB * I_USB * 效率 = VSYS * I_SYS / (V_USB * 效率 ) = 4.0 * 1.3 / ( 5 * 0.9 ) = 1.1A ( 約 ) 充電充不滿: 充電有充電時間的限制,一般是充電 5 小時就會關閉充電,是以存在一邊使用一邊充電時電池充 不滿,這個問題我們後期會使用軟體解決。