本文基于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、工业网关、智慧医疗、自助终端、智能零售、能源电力等行业。
ido-sbc3568-v1正面接口指示图
ido-sbc3568-v1背面接口指示图
硬件分析
硬件使用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 = ; status = okay; }; test-power { status = disabled; };};&rk809 { battery { status = okay; compatible = rk817,battery; ocv_table = ;/*开路电压,是第一次接电池开机、长时间关机后再开机、长时间休眠后校正库仑计的依据, 0%~100%的电量细分成 21 个点,步进 5%电量*/ design_capacity = ; //实际电池容量,单位:mah design_qmax = ; //最大容量值 design_max_voltage = ; //最大电压 bat_res = ; //电池内阻 sleep_enter_current = ; //进入松弛模式的条件之一 sleep_exit_current = ; //退出松弛模式的条件之一 sleep_filter_current = ; //过滤无效的松弛电流。 power_off_thresd = ; //期待的系统关机电压,单位:mv zero_algorithm_vol = ; //进入电压+库仑计放电模式的电压值 max_soc_offset = ; //开机校正时允许的最大电量误差。 monitor_sec = ; //轮询时间 单位秒 sample_res = ; //电池端附近的采样电阻大小 energy_mode = ; //该值为 1 时表示尽可能采取将电池电量放完的方式,为 0 时表示尽量考虑曲线平滑的合理性 fb_temperature = ; //芯片热保护温度阈值 virtual_power = ; //假电池模式(测试模式) bat_res_up = ; //batdiv上拉分压电阻 bat_res_down = ; //batdiv下拉分压电阻 register_chg_psy = ; //是否通过rk809上报充电状态 external_chg_psy = ; //配置外部dc检测上报充电状态 };};电池调试
驱动文件路径为:kernel/drivers/power/supply/rk817_battery.c
系统启动后可从 /sys/class/power_supply/battery/uevent 节点获取电池状态信息。
支持应用层配置驱动调试信息的输出,配置方法如下:
#开启打印信息echo 1 > /sys/module/rk817_battery/parameters/dbg_level#关闭打印信息echo 0 > /sys/module/rk817_battery/parameters/dbg_level
开启后详细的电池数据将会输出至调试串口,内容如下:
使用gpio-charger配置gpio1_d1为充电检测,同样会创建一个charger的上报事件,可从
/sys/class/power_supply/charger/uevent 节点中获取到当前dc插入状态。
电池校准
长时间关机后,读取到的电量会和电池的实际电量有差异,这时候需要对电池进行校准,校准方法如下:
1. 移除dc,拔掉电池10秒以上再插入,电量计将会重新校准电量数据。
电池做一次完整的充放电。
修改充电状态上报
以上的方案和电路,当12v供电拔出时rk817_battery驱动中上报的充电状态依旧是charging。
分析充电状态上报代码如下:
充电状态是由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 dev, plug_in_irq request failed!); return plug_in_irq; } plug_out_irq = regmap_irq_get_virq(rk817->irq_data, rk817_irq_plug_out); if (plug_out_irq dev, plug_out_irq request failed!); 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!); 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!); 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。
本文调试的主板没有配置dc拔插来修改vdc状态,vdc在系统上电后vdc始终保持上拉至1.2v,plug_in_sts寄存器值始终保持为1。vdc部分电路如下:
此处可修改驱动,通过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 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 is_external_chg_psy)+ dev_err(dev, not have to register external chg psy!); } dbg(the battery dts info dump:@@ -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;电池状态显示
未接入电源时显示如下
插入dc 12v 后显示如下
RSAC2023解读第7期 | 企业僵尸网络大机密
新唐科技N539T340主板简介
nfc的架构是怎样的
VR或抑制视觉记忆的有效形成
浅谈三星全新折叠屏技术ECO²OLED
基于IDO-SBC3568主板说明PMIC RK809电量计的调试方法
机器人焊接出现的缺陷及应对措施
三星GalaxyS5拆解 做工及用料如何
基于CAN总线技术实现汽车检测线测控系统的设计
英伟达放大招发布专业级显卡Quadro系列:人工智能,VR,深度学习都能干
荣耀Magic2超广角镜头体验 更具实用性与趣味性
发展进度迅速,中国燃料电池汽车发展目标有望上调
复位电路的电阻电容分别有什么作用?
维纳和图灵:AI研究之路的关键节点和分歧之处
香港财政司司长陈茂波到访上海商汤AIDC,共话香港和内地科创协同发展
实际工作中的晶体管适用性确认-确认在SOA(安全工作区)范围内
什么是超微印刷锡膏?
前三季净赚200亿元!京东方将为苹果供应9000万部高端显示屏
奥拓电子设立全资子公司 推进“智能+”战略
英飞凌与Fingerprint Cards携手推动生物识别卡的大规模部署