0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【深圳触觉智能技术分享】RK3568 RK809电量计电池调试

深圳触觉智能 来源:深圳触觉智能 作者:深圳触觉智能 2023-05-29 10:11 次阅读

前言

本文基于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 = <&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 节点获取电池状态信息

图片

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

#开启打印信息
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插入状态。

wKgZomR0CcSAdsqhAAAVa2tLQy816.webp

电池校准

长时间关机后,读取到的电量会和电池的实际电量有差异,这时候需要对电池进行校准,校准方法如下:
1. 移除DC,拔掉电池10秒以上再插入,电量计将会重新校准电量数据。

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

修改充电状态上报

以上的方案和电路,当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 < 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

本文调试的主板没有配置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 < 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;

电池状态显示

未接入电源时显示如下

图片

插入DC 12V 后显示如下

图片


审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 串口
    +关注

    关注

    14

    文章

    1483

    浏览量

    74511
  • 电量计
    +关注

    关注

    2

    文章

    94

    浏览量

    31635
  • 开发板
    +关注

    关注

    25

    文章

    4429

    浏览量

    93992
  • 电池
    +关注

    关注

    82

    文章

    9811

    浏览量

    123524
  • 边缘计算
    +关注

    关注

    22

    文章

    2802

    浏览量

    46013
  • RK3568
    +关注

    关注

    4

    文章

    433

    浏览量

    4126
收藏 人收藏

    评论

    相关推荐

    RK3568-GDB程序调试方法说明

    RK3568-GDB程序调试方法说明
    的头像 发表于 01-19 16:16 909次阅读
    <b class='flag-5'>RK3568</b>-GDB程序<b class='flag-5'>调试</b>方法说明

    RK3568 EDP接口调试

    RK3568支持多种接口,本文主要介绍通过edp显示接口驱动edp显示屏的具体操作方法以及调试记录。
    的头像 发表于 09-20 09:57 1572次阅读
    <b class='flag-5'>RK3568</b> EDP接口<b class='flag-5'>调试</b>

    RK3568 基于TI BQ40电量计调试

    本文基于IDO-SBC3568-V1BTIBQ40电量计调试。IDO-SBC3568主板采用RK3568四核A55处理器2GHz主频,1TN
    的头像 发表于 08-26 08:35 527次阅读
    <b class='flag-5'>RK3568</b> 基于TI BQ40<b class='flag-5'>电量计</b><b class='flag-5'>调试</b>

    rk3566与rk3568的区别

    rk3566与rk3568的区别 随着科技的不断推进和更新换代,人们所接触到的电子产品也随之呈现不断变化的趋势。而在这些产品中,处理器就显得尤为重要。目前市场上较为常见的主流处理器均有自己的特点
    的头像 发表于 08-15 17:44 5098次阅读

    rk3568是什么架构的?

    RK3568是什么架构的? 中国领先的无晶圆厂半导体公司Rockchip Electronics推出了一款专门为人工智能应用设计的新型片上系统(SoC)。这种新型SoC被称为RK3568,构建
    的头像 发表于 08-15 17:25 1622次阅读

    rk3568有多少引脚?

    rk3568有多少引脚? 首先,让我们来了解一下什么是rk3568rk3568是由瑞芯微推出的一款高性能、低功耗的嵌入式处理器,它是rk3566的升级版本,采用了更加先进的
    的头像 发表于 08-15 17:25 1006次阅读

    RK35683568J的区别

    RK35683568J的区别 在当前处理器市场中,以小而美形象闻名的瑞克微电子旗下产品RK3568/J也引起了广泛关注,其中RK35683568
    的头像 发表于 08-15 17:25 5073次阅读

    RK3568RK3588的区别

    RK3568RK3588的区别 RK3568RK3588是瑞芯微推出的两款高性能芯片,两款芯片具有不同的特点,本文将从不同的角度比较两款芯片的异同,以便读者了解两款芯片的优缺点。
    的头像 发表于 08-15 17:25 6639次阅读

    RK3568RK3566的区别

    RK3568RK3566的区别 RK3568RK3566是两种不同的芯片,都是由Rockchip公司推出的。它们都是面向高性能应用市场的芯片,具有相似的性能规格和功能特点。但是在某
    的头像 发表于 08-15 17:25 1.1w次阅读

    rk3568rk3399的区别

    rk3568rk3399的区别 随着人工智能、物联网和5G等技术的不断发展,CPU芯片的需求越来越高。而在所有的CPU芯片中,Rockchip的产品备受瞩目。作为一家集成电路设计厂商
    的头像 发表于 08-15 17:04 2307次阅读

    瑞芯微RK3568核心板PET_RK3568_CORE简述

    瑞芯微RK3568核心板PET_RK3568_CORE简述
    的头像 发表于 08-08 11:44 2103次阅读
    瑞芯微<b class='flag-5'>RK3568</b>核心板PET_<b class='flag-5'>RK3568</b>_CORE简述

    瑞芯微RK3568主板开发板PET_RK3568_P01简述

    瑞芯微RK3568主板开发板PET_RK3568_P01简述
    的头像 发表于 08-08 11:41 1764次阅读
    瑞芯微<b class='flag-5'>RK3568</b>主板开发板PET_<b class='flag-5'>RK3568</b>_P01简述

    触觉智能RK3568_OpenHarmony开发板适配

    触觉智能RK3568_OpenHarmony开发板适配 2023-5-24 master openharmony 4.0.7.3 openharmony版本更新代码会变化,请看当前文件夹其他md
    的头像 发表于 06-07 16:18 713次阅读
    <b class='flag-5'>触觉</b><b class='flag-5'>智能</b><b class='flag-5'>RK3568</b>_OpenHarmony开发板适配

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

    IDO-SBC3568-V1是一款基于RK3568的工控主板,采用22nm先进工艺制程,四核A55 CPU,主频高达2.0GHz,支持高达8GB高速LPDDR4,1T算力NPU ,4K H.265/H264硬解码;
    的头像 发表于 05-24 09:39 1862次阅读
    基于IDO-SBC<b class='flag-5'>3568</b>主板说明PMIC <b class='flag-5'>RK809</b><b class='flag-5'>电量计</b>的<b class='flag-5'>调试</b>方法

    一文读懂!RK3668和RK3568有什么区别?

    从上图可以看出,RK3568RK3566 CPU均为四核Cortex-A55架构,GPU为Mali-G522EE,内置NPU,可提供1T算力,支持DDR及CPU Cache全链路ECC等,RK366与
    的头像 发表于 05-18 11:15 1278次阅读
    一文读懂!<b class='flag-5'>RK</b>3668和<b class='flag-5'>RK3568</b>有什么区别?