全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 接口/总线/驱动 >

基于IDO-SBC3568主板说明PMIC RK809电量计的调试方法

时间:2023-05-24 09:39

人气:

作者:admin

标签: RK3568  PMIC技术  LPDDR4  lvds 

导读:IDO-SBC3568-V1是一款基于RK3568的工控主板,采用22nm先进工艺制程,四核A55 CPU,主频高达2.0GHz,支持高达8GB高速LPDDR4,1T算力NPU ,4K H.265/H264硬解码;...

本文基于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、工业网关、智慧医疗、自助终端、智能零售、能源电力等行业。

425a8088-f976-11ed-90ce-dac502259ad0.png

IDO-SBC3568-V1正面接口指示图

42a51512-f976-11ed-90ce-dac502259ad0.png

IDO-SBC3568-V1背面接口指示图

硬件分析

43045838-f976-11ed-90ce-dac502259ad0.png

432496a2-f976-11ed-90ce-dac502259ad0.png

435aa062-f976-11ed-90ce-dac502259ad0.png

硬件使用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 节点获取电池状态信息。

43770d6a-f976-11ed-90ce-dac502259ad0.png

支持应用层配置驱动调试信息的输出,配置方法如下:

#开启打印信息
echo1 > /sys/module/rk817_battery/parameters/dbg_level
#关闭打印信息
echo0 > /sys/module/rk817_battery/parameters/dbg_level

开启后详细的电池数据将会输出至调试串口,内容如下:

43959582-f976-11ed-90ce-dac502259ad0.png

使用gpio-charger配置GPIO1_D1为充电检测,同样会创建一个charger的上报事件,可从

/sys/class/power_supply/charger/uevent 节点中获取到当前DC插入状态。

43ad479a-f976-11ed-90ce-dac502259ad0.png

电池校准

长时间关机后,读取到的电量会和电池的实际电量有差异,这时候需要对电池进行校准,校准方法如下:

1. 移除DC,拔掉电池10秒以上再插入,电量计将会重新校准电量数据。

电池做一次完整的充放电。

修改充电状态上报

以上的方案和电路,当12V供电拔出时rk817_battery驱动中上报的充电状态依旧是Charging。

分析充电状态上报代码如下:

43bf1204-f976-11ed-90ce-dac502259ad0.png

充电状态是由plugin_trigger决定,驱动中分别注册了plugin和plugout中断,用于检测USB充电拔插事件。驱动代码如下:

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有关,当VDC电压大于0.55V时,会将寄存器设置为1,否则设置为0。

43d7e3e2-f976-11ed-90ce-dac502259ad0.png

本文调试的主板没有配置DC拔插来修改VDC状态,VDC在系统上电后VDC始终保持上拉至1.2V,PLUG_IN_STS寄存器值始终保持为1。VDC部分电路如下:

43f97b1a-f976-11ed-90ce-dac502259ad0.png

此处可修改驱动,通过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@@ 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;
电池状态显示

未接入电源时显示如下

4424714e-f976-11ed-90ce-dac502259ad0.png

插入DC 12V 后显示如下

4440a882-f976-11ed-90ce-dac502259ad0.png






审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信