本文基于IDO-SBC3568主板介紹說(shuō)明PMIC RK809電量計(jì)的調(diào)試方法。
IDO-SBC3568-V1是一款基于RK3568的工控主板,采用22nm先進(jìn)工藝制程,四核A55 CPU,主頻高達(dá)2.0GHz,支持高達(dá)8GB高速LPDDR4,1T算力NPU ,4K H.265/H264硬解碼;具有豐富的視頻輸出接口(HDMI2.0/eDP1.3/MIPI/LVDS) ,高速通信接口(千兆網(wǎng)/PCIE/USB3.0),工業(yè)互聯(lián)接口(CAN/串口)。
IDO-SBC3568-V1 可作為RK3568開(kāi)發(fā)評(píng)估板,也普遍適用于各種智慧顯示終端產(chǎn)品、視頻類(lèi)終端產(chǎn)品、工業(yè)自動(dòng)化終端產(chǎn)品和邊緣計(jì)算網(wǎng)關(guān)類(lèi)產(chǎn)品。應(yīng)用可覆蓋邊緣計(jì)算、人工智能、工業(yè)HMI、工業(yè)網(wǎng)關(guān)、智慧醫(yī)療、自助終端、智能零售、能源電力等行業(yè)。
IDO-SBC3568-V1正面接口指示圖
IDO-SBC3568-V1背面接口指示圖
硬件分析
硬件使用PMIC RK809電量計(jì)加BQ24610的充電方案,同時(shí)將GPIO1_D1作為12V DC 狀態(tài)檢測(cè)功能,當(dāng)插入電源時(shí)GPIO1_D1將會(huì)被拉低,拔插電源時(shí)GPIO1_D1將上拉至1.8V。
內(nèi)核修改
配置內(nèi)核開(kāi)啟以下驅(qū)動(dòng)
RTC_DRV_RK808 [=y]
BATTERY_RK817 [=y]
設(shè)備樹(shù)修改如下:
RK809 沒(méi)有充電功能,只需要配置 battery 節(jié)點(diǎn)。電源檢測(cè)IO使用gpio-charger驅(qū)動(dòng),并配置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>;/*開(kāi)路電壓,是第一次接電池開(kāi)機(jī)、長(zhǎng)時(shí)間關(guān)機(jī)后再開(kāi)機(jī)、長(zhǎng)時(shí)間休眠后校正庫(kù)侖計(jì)的依據(jù), 0%~100%的電量細(xì)分成 21 個(gè)點(diǎn),步進(jìn) 5%電量*/ design_capacity = <1500>; //實(shí)際電池容量,單位:mah design_qmax = <1500>; //最大容量值 design_max_voltage = <8400>; //最大電壓 bat_res = <180>; //電池內(nèi)阻 sleep_enter_current = <300>; //進(jìn)入松弛模式的條件之一 sleep_exit_current = <300>; //退出松弛模式的條件之一 sleep_filter_current = <100>; //過(guò)濾無(wú)效的松弛電流。 power_off_thresd = <7000>; //期待的系統(tǒng)關(guān)機(jī)電壓,單位:mV zero_algorithm_vol = <7700>; //進(jìn)入電壓+庫(kù)侖計(jì)放電模式的電壓值 max_soc_offset = <60>; //開(kāi)機(jī)校正時(shí)允許的最大電量誤差。 monitor_sec = <5>; //輪詢(xún)時(shí)間 單位秒 sample_res = <10>; //電池端附近的采樣電阻大小 energy_mode = <1>; //該值為 1 時(shí)表示盡可能采取將電池電量放完的方式,為 0 時(shí)表示盡量考慮曲線平滑的合理性 fb_temperature = <105>; //芯片熱保護(hù)溫度閾值 virtual_power = <0>; //假電池模式(測(cè)試模式) bat_res_up = <140>; //BATDIV上拉分壓電阻 bat_res_down = <20>; //BATDIV下拉分壓電阻 register_chg_psy = <0>; //是否通過(guò)RK809上報(bào)充電狀態(tài) external_chg_psy = <1>; //配置外部DC檢測(cè)上報(bào)充電狀態(tài) }; };電池調(diào)試
驅(qū)動(dòng)文件路徑為:kernel/drivers/power/supply/rk817_battery.c
系統(tǒng)啟動(dòng)后可從 /sys/class/power_supply/battery/uevent 節(jié)點(diǎn)獲取電池狀態(tài)信息。
支持應(yīng)用層配置驅(qū)動(dòng)調(diào)試信息的輸出,配置方法如下:
#開(kāi)啟打印信息 echo1 > /sys/module/rk817_battery/parameters/dbg_level #關(guān)閉打印信息 echo0 > /sys/module/rk817_battery/parameters/dbg_level
開(kāi)啟后詳細(xì)的電池?cái)?shù)據(jù)將會(huì)輸出至調(diào)試串口,內(nèi)容如下:
使用gpio-charger配置GPIO1_D1為充電檢測(cè),同樣會(huì)創(chuàng)建一個(gè)charger的上報(bào)事件,可從
/sys/class/power_supply/charger/uevent 節(jié)點(diǎn)中獲取到當(dāng)前DC插入狀態(tài)。
電池校準(zhǔn)
長(zhǎng)時(shí)間關(guān)機(jī)后,讀取到的電量會(huì)和電池的實(shí)際電量有差異,這時(shí)候需要對(duì)電池進(jìn)行校準(zhǔn),校準(zhǔn)方法如下:
1. 移除DC,拔掉電池10秒以上再插入,電量計(jì)將會(huì)重新校準(zhǔn)電量數(shù)據(jù)。
電池做一次完整的充放電。
修改充電狀態(tài)上報(bào)
以上的方案和電路,當(dāng)12V供電拔出時(shí)rk817_battery驅(qū)動(dòng)中上報(bào)的充電狀態(tài)依舊是Charging。
分析充電狀態(tài)上報(bào)代碼如下:
充電狀態(tài)是由plugin_trigger決定,驅(qū)動(dòng)中分別注冊(cè)了plugin和plugout中斷,用于檢測(cè)USB充電拔插事件。驅(qū)動(dòng)代碼如下:
staticint 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! "); returnplug_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! "); returnplug_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! "); returnret; } 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! "); returnret; } if(rk817_bat_field_read(battery, PLUG_IN_STS)) { battery->plugin_trigger = 1; battery->plugout_trigger = 0; } return0; }
查看寄存器可知,PLUG_IN_STS寄存器的值與VDC有關(guān),當(dāng)VDC電壓大于0.55V時(shí),會(huì)將寄存器設(shè)置為1,否則設(shè)置為0。
本文調(diào)試的主板沒(méi)有配置DC拔插來(lái)修改VDC狀態(tài),VDC在系統(tǒng)上電后VDC始終保持上拉至1.2V,PLUG_IN_STS寄存器值始終保持為1。VDC部分電路如下:
此處可修改驅(qū)動(dòng),通過(guò)GPIO1_D1檢測(cè)外部DC的插入來(lái)上報(bào)充電狀態(tài)。在dts battery節(jié)點(diǎn)中增加自定義參數(shù)external_chg_psy用于配置外部充電檢測(cè)上報(bào)。
同時(shí)內(nèi)核修改充電狀態(tài)上報(bào)的邏輯,修改內(nèi)容如下:
--- 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@@ staticint 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! "); + + 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! "); } DBG("the battery dts info dump: " @@ -2119,10+2125,18@@ staticint 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; - elseif(battery->chip_id == RK809_ID && - battery->plugin_trigger) - val->intval = POWER_SUPPLY_STATUS_CHARGING; - else + elseif(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; + } elseif(battery->plugin_trigger){ + val->intval = POWER_SUPPLY_STATUS_CHARGING; + } else{ + val->intval = POWER_SUPPLY_STATUS_DISCHARGING; + } + }else val->intval = POWER_SUPPLY_STATUS_DISCHARGING; } break;電池狀態(tài)顯示
未接入電源時(shí)顯示如下
插入DC 12V 后顯示如下
審核編輯:劉清
-
lvds
+關(guān)注
關(guān)注
2文章
1030瀏覽量
65627 -
LPDDR4
+關(guān)注
關(guān)注
1文章
37瀏覽量
23375 -
PMIC技術(shù)
+關(guān)注
關(guān)注
1文章
6瀏覽量
2166 -
RK3568
+關(guān)注
關(guān)注
4文章
489瀏覽量
4889
原文標(biāo)題:【技術(shù)分享】RK3568 RK809電量計(jì)電池調(diào)試
文章出處:【微信號(hào):industio,微信公眾號(hào):深圳觸覺(jué)智能】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論