前言
本文基于IDO-SBC3568主板介紹說明PMIC RK809電量計的調試方法。
IDO-SBC3568-V1是一款基于RK3568的工控主板,采用22nm先進工藝制程,四核A55 CPU,主頻高達2.0GHz,支持高達8GB高速LPDDR4,1T算力NPU ,4K H.265/H264硬解碼;具有豐富的視頻輸出接口(HDMI2.0/eDP1.3/MIPI/LVDS) ,高速通信接口(千兆網/PCIE/USB3.0),工業互聯接口(CAN/串口)。
IDO-SBC3568-V1 可作為RK3568開發評估板,也普遍適用于各種智慧顯示終端產品、視頻類終端產品、工業自動化終端產品和邊緣計算網關類產品。應用可覆蓋邊緣計算、人工智能、工業HMI、工業網關、智慧醫療、自助終端、智能零售、能源電力等行業。
![圖片](https://file1.elecfans.com/web2/M00/88/CB/wKgaomR0EweAao6qAAso84SJg2I405.jpg)
IDO-SBC3568-V1正面接口指示圖
![圖片](https://file1.elecfans.com/web2/M00/88/CB/wKgaomR0EweAdCldAAqWjyOIYHs299.jpg)
IDO-SBC3568-V1背面接口指示圖
硬件分析
![圖片](https://file1.elecfans.com/web2/M00/88/CB/wKgaomR0EweAcAQSAAEUxekWX1I495.jpg)
![圖片](https://file1.elecfans.com/web2/M00/88/CB/wKgZomR0EweAUZBaAANrvkADqYs138.jpg)
![圖片](https://file1.elecfans.com/web2/M00/88/CB/wKgaomR0EweALIIcAAFdzQ6gnHA526.jpg)
硬件使用PMIC RK809電量計加BQ24610的充電方案,同時將GPIO1_D1作為12V DC 狀態檢測功能,當插入電源時GPIO1_D1將會被拉低,拔插電源時GPIO1_D1將上拉至1.8V。
內核修改
配置內核開啟以下驅動
RTC_DRV_RK808 [=y]
BATTERY_RK817 [=y]
設備樹修改如下:
RK809 沒有充電功能,只需要配置 battery 節點。電源檢測IO使用gpio-charger驅動,并配置charger-type為mains。
/{
charger_det: charger {
compatible = "gpio-charger";
charger-type = "mains";
gpios = <&gpio1 RK_PD1 GPIO_ACTIVE_LOW>;
status = "okay";
};
test-power {
status = "disabled";
};
};
&rk809 {
battery {
status = "okay";
compatible = "rk817,battery";
ocv_table = <7000 7250 7370 7384 7436 7470 7496
7520 7548 7576 7604 7632 7668 7706
7754 7816 7892 7950 8036 8142 8212>;/*開路電壓,是第一次接電池開機、長時間關機后再開機、長時間休眠后校正庫侖計的依據,
0%~100%的電量細分成 21 個點,步進 5%電量*/
design_capacity = <1500>; //實際電池容量,單位:mah
design_qmax = <1500>; //最大容量值
design_max_voltage = <8400>; //最大電壓
bat_res = <180>; //電池內阻
sleep_enter_current = <300>; //進入松弛模式的條件之一
sleep_exit_current = <300>; //退出松弛模式的條件之一
sleep_filter_current = <100>; //過濾無效的松弛電流。
power_off_thresd = <7000>; //期待的系統關機電壓,單位:mV
zero_algorithm_vol = <7700>; //進入電壓+庫侖計放電模式的電壓值
max_soc_offset = <60>; //開機校正時允許的最大電量誤差。
monitor_sec = <5>; //輪詢時間 單位秒
sample_res = <10>; //電池端附近的采樣電阻大小
energy_mode = <1>; //該值為 1 時表示盡可能采取將電池電量放完的方式,為 0 時表示盡量考慮曲線平滑的合理性
fb_temperature = <105>; //芯片熱保護溫度閾值
virtual_power = <0>; //假電池模式(測試模式)
bat_res_up = <140>; //BATDIV上拉分壓電阻
bat_res_down = <20>; //BATDIV下拉分壓電阻
register_chg_psy = <0>; //是否通過RK809上報充電狀態
external_chg_psy = <1>; //配置外部DC檢測上報充電狀態
};
};
電池調試
驅動文件路徑為:kernel/drivers/power/supply/rk817_battery.c
系統啟動后可從 /sys/class/power_supply/battery/uevent 節點獲取電池狀態信息。
![圖片](https://file1.elecfans.com/web2/M00/88/CB/wKgZomR0EweABG4tAAAgL8NNdgg381.jpg)
支持應用層配置驅動調試信息的輸出,配置方法如下:
#開啟打印信息
echo 1 > /sys/module/rk817_battery/parameters/dbg_level
#關閉打印信息
echo 0 > /sys/module/rk817_battery/parameters/dbg_level
開啟后詳細的電池數據將會輸出至調試串口,內容如下:
![圖片](https://file1.elecfans.com/web2/M00/88/CB/wKgZomR0EweAFofKAABkXkfPnUU953.jpg)
使用gpio-charger配置GPIO1_D1為充電檢測,同樣會創建一個charger的上報事件,可從
/sys/class/power_supply/charger/uevent 節點中獲取到當前DC插入狀態。
![wKgZomR0CcSAdsqhAAAVa2tLQy816.webp](https://file1.elecfans.com//web2/M00/88/C9/wKgZomR0CcSAdsqhAAAVa2tLQy816.webp)
電池校準
長時間關機后,讀取到的電量會和電池的實際電量有差異,這時候需要對電池進行校準,校準方法如下:
1. 移除DC,拔掉電池10秒以上再插入,電量計將會重新校準電量數據。
- 電池做一次完整的充放電。
修改充電狀態上報
以上的方案和電路,當12V供電拔出時rk817_battery驅動中上報的充電狀態依舊是Charging。
分析充電狀態上報代碼如下:
![圖片](https://file1.elecfans.com/web2/M00/88/CB/wKgaomR0EweAQcuqAACBH3fS1lc641.jpg)
充電狀態是由plugin_trigger決定,驅動中分別注冊了plugin和plugout中斷,用于檢測USB充電拔插事件。驅動代碼如下:
static int rk809_charge_init_irqs(struct rk817_battery_device *battery)
{
struct rk808 *rk817 = battery->rk817;
struct platform_device *pdev = battery->pdev;
int ret, plug_in_irq, plug_out_irq;
battery->plugin_trigger = 0;
battery->plugout_trigger = 0;
plug_in_irq = regmap_irq_get_virq(rk817->irq_data, RK817_IRQ_PLUG_IN);
if (plug_in_irq < 0) {
dev_err(battery->dev, "plug_in_irq request failed!n");
return plug_in_irq;
}
plug_out_irq = regmap_irq_get_virq(rk817->irq_data, RK817_IRQ_PLUG_OUT);
if (plug_out_irq < 0) {
dev_err(battery->dev, "plug_out_irq request failed!n");
return plug_out_irq;
}
ret = devm_request_threaded_irq(battery->dev, plug_in_irq, NULL,
rk809_plug_in_isr,
IRQF_TRIGGER_RISING | IRQF_ONESHOT,
"rk817_plug_in", battery);
if (ret) {
dev_err(&pdev->dev, "plug_in_irq request failed!n");
return ret;
}
ret = devm_request_threaded_irq(battery->dev, plug_out_irq, NULL,
rk809_plug_out_isr,
IRQF_TRIGGER_RISING | IRQF_ONESHOT,
"rk817_plug_out", battery);
if (ret) {
dev_err(&pdev->dev, "plug_out_irq request failed!n");
return ret;
}
if (rk817_bat_field_read(battery, PLUG_IN_STS)) {
battery->plugin_trigger = 1;
battery->plugout_trigger = 0;
}
return 0;
}
查看寄存器可知,PLUG_IN_STS寄存器的值與VDC有關,當VDC電壓大于0.55V時,會將寄存器設置為1,否則設置為0。
![wKgaomR0CcWAF85zAABYpDYkW4A91.webp](https://file1.elecfans.com//web2/M00/88/C9/wKgaomR0CcWAF85zAABYpDYkW4A91.webp)
本文調試的主板沒有配置DC拔插來修改VDC狀態,VDC在系統上電后VDC始終保持上拉至1.2V,PLUG_IN_STS寄存器值始終保持為1。VDC部分電路如下:
![圖片](https://file1.elecfans.com/web2/M00/88/CB/wKgZomR0EweAESRnAAEThNBpkQs769.jpg)
此處可修改驅動,通過GPIO1_D1檢測外部DC的插入來上報充電狀態。在dts battery節點中增加自定義參數external_chg_psy用于配置外部充電檢測上報。
同時內核修改充電狀態上報的邏輯,修改內容如下:
--- a/kernel/drivers/power/supply/rk817_battery.c
+++ b/kernel/drivers/power/supply/rk817_battery.c
@@ -624,6 +624,7 @@ struct rk817_battery_device {
int plugout_irq;
int chip_id;
int is_register_chg_psy;
+ int is_external_chg_psy;
bool change; /* Battery status change, report information */
};
@@ -1924,6 +1925,11 @@ static int rk817_bat_parse_dt(struct rk817_battery_device *battery)
&battery->is_register_chg_psy);
if (ret < 0 || !battery->is_register_chg_psy)
dev_err(dev, "not have to register chg psy!n");
+
+ ret = of_property_read_u32(np, "external_chg_psy",
+ &battery->is_external_chg_psy);
+ if (ret < 0 || !battery->is_external_chg_psy)
+ dev_err(dev, "not have to register external chg psy!n");
}
DBG("the battery dts info dump:n"
@@ -2119,10 +2125,18 @@ static int rk817_battery_get_property(struct power_supply *psy,
if ((battery->chip_id != RK809_ID) &&
rk817_bat_get_charge_state(battery))
val->intval = POWER_SUPPLY_STATUS_CHARGING;
- else if (battery->chip_id == RK809_ID &&
- battery->plugin_trigger)
- val->intval = POWER_SUPPLY_STATUS_CHARGING;
- else
+ else if (battery->chip_id == RK809_ID){
+ if(battery->is_external_chg_psy){
+ if(battery->ac_in)
+ val->intval = POWER_SUPPLY_STATUS_CHARGING;
+ else
+ val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
+ } else if (battery->plugin_trigger){
+ val->intval = POWER_SUPPLY_STATUS_CHARGING;
+ } else {
+ val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
+ }
+ }else
val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
}
break;
電池狀態顯示
未接入電源時顯示如下
![圖片](https://file1.elecfans.com/web2/M00/88/CB/wKgZomR0EweACTsmAAAjJH2JEQc127.jpg)
插入DC 12V 后顯示如下
![圖片](https://file1.elecfans.com/web2/M00/88/CB/wKgaomR0EweAHFdaAAAteiAN8fY728.jpg)
審核編輯:湯梓紅
-
串口
+關注
關注
14文章
1559瀏覽量
77137 -
電量計
+關注
關注
2文章
127瀏覽量
31990 -
開發板
+關注
關注
25文章
5126瀏覽量
98320 -
電池
+關注
關注
84文章
10689瀏覽量
131488 -
邊緣計算
+關注
關注
22文章
3124瀏覽量
49563 -
RK3568
+關注
關注
4文章
526瀏覽量
5256
發布評論請先 登錄
相關推薦
RK3568內置MCU開發介紹之一
![<b class='flag-5'>RK3568</b>內置MCU開發介紹之一](https://file1.elecfans.com/web3/M00/00/A2/wKgZPGdLMg-AFkS0AAA5BGKqG3E264.png)
OpenHarmony4.1藍牙芯片如何適配?觸覺智能RK3568主板SBC3568演示
![OpenHarmony4.1藍牙芯片如何適配?<b class='flag-5'>觸覺</b><b class='flag-5'>智能</b><b class='flag-5'>RK3568</b>主板SBC<b class='flag-5'>3568</b>演示](https://file1.elecfans.com/web1/M00/F4/8E/wKgaoWctc0CAAISTAAB39Mce1Ok997.png)
瑞芯微RK3568開發板Linux編譯報錯404怎么辦?觸覺智能教你輕松解決
![瑞芯微<b class='flag-5'>RK3568</b>開發板Linux編譯報錯404怎么辦?<b class='flag-5'>觸覺</b><b class='flag-5'>智能</b>教你輕松解決](https://file1.elecfans.com/web2/M00/0A/D9/wKgZomcpisuAZYJiAAB5u-RqpRA452.png)
瑞芯微RK3566/RK3568 Android11使用OTA升級固件方法,深圳觸覺智能鴻蒙開發板演示,備戰第九屆華為ICT大賽
![瑞芯微<b class='flag-5'>RK</b>3566/<b class='flag-5'>RK3568</b> Android11使用OTA升級固件方法,<b class='flag-5'>深圳</b><b class='flag-5'>觸覺</b><b class='flag-5'>智能</b>鴻蒙開發板演示,備戰第九屆華為ICT大賽](https://file1.elecfans.com/web1/M00/F2/C0/wKgaoWcJ872AA8BOAAB8ojv6gwo511.png)
深度對比!瑞芯微RK3562J比RK3568J好在哪里?
![深度對比!瑞芯微<b class='flag-5'>RK</b>3562J比<b class='flag-5'>RK3568</b>J好在哪里?](https://file.elecfans.com/web2/M00/7E/BA/poYBAGOHAv6AbvjgAAA8o4Btlss933.png)
基于HD-RK3568-CORE設計的HD-RK3568-OPS主板上新!
![基于HD-<b class='flag-5'>RK3568</b>-CORE設計的HD-<b class='flag-5'>RK3568</b>-OPS主板上新!](https://file1.elecfans.com/web2/M00/D0/F0/wKgaomYiQwSAOur3AAAcESs8JdU178.jpg)
評論