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

news2024/12/23 0:42:06

本文基于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插入状态。

电池校准

长时间关机后,读取到的电量会和电池的实际电量有差异,这时候需要对电池进行校准,校准方法如下:
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。

本文调试的主板没有配置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 后显示如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Allegro软件中快速复制走线和过孔?

在PCB设计过程中&#xff0c;快速而准确复制走线和过孔是提高设计效率和减少重复工作的关键所在&#xff0c;因此很多工程师会选择使用Allegro来复制走线和过孔&#xff0c;因为Allegro是一款功能强大且灵活的PCB设计软件&#xff0c;提供了多种工具和功能&#xff0c;自然包括…

springboot+java汽车配件销售业绩管理系统 J2EE平台技术

汽车配件销售类企业近年来得到长足发展,在市场份额不断扩大同时,如何更好地管理企业现有销售项目资源成为摆在该类企业面前的重要课题之一。本次打算开发的springboot汽车配件销售业绩管理系统的开发过程引用 J2EE平台技术,该平台中所包含的JDBC、JNDI等组件,规定访问数据库的形…

swagger页面 doc.html出不来,swagger-ui/index.html能出来

swagger页面 doc.html出不来&#xff0c;swagger-ui/index.html能出来。前前后后折腾了很久&#xff0c;jar包冲突&#xff0c;jar包版本&#xff0c;添加路径啥的都弄了&#xff0c;就是出不来。 后来全局搜索“doc.html”页面发现能出来的项目能搜到这个页面&#xff1a; 定…

大数据测试基础概念和工具

下方查看历史精选文章 重磅发布 - 自动化框架基础指南pdfv1.1大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 大数据已经成为当今的热门话题&#xff0c…

提高客户转介绍率的7个方法,让你的客户成为你的推广大使!

都知道“客户转介绍”&#xff0c;是一种非常有效的商业推广方式。通过客户的口碑传播&#xff0c;我们能够吸引更多潜在客户&#xff0c;并建立起长久稳固的合作关系。 可以说&#xff0c;这种开拓客户的方法&#xff1a;耗时少、成功率高、成本低、客户较优质&#xff0c;称…

掌握Lazada、Shopee店铺运营的黄金法则:测评自养号技巧

在Lazada、Shopee这个东南亚最大的电商平台上&#xff0c;要想成功运营你的店铺并不容易。然而&#xff0c;如果你掌握了以下这些黄金法则&#xff0c;并有效地运用测评自养号的策略&#xff0c;你的店铺就有可能大幅提升销售并在竞争中脱颖而出。 1. 理解你的市场 首先&…

九耶丨阁瑞钛伦特-springmvc(三)

SpringMVC作为一种流行的Java Web框架&#xff0c;是基于Spring之上的。它提供了强大的MVC&#xff08;Model-View-Controller&#xff09;架构&#xff0c;能够快速地实现Java Web开发&#xff0c;高效地与数据交互。如何使用SpringMVC成为开发人员的首要问题。要了解SpringMV…

边缘计算盒子都有哪些规格?一文带你了解边缘计算云服务器 ECS

上一次我们详细讲述了&#xff0c;在日常生活中我们能够随时随地看到的“白色盒子”是边缘服务器 ECS&#xff0c;包括边缘服务器 ECS 具体的用途是什么&#xff0c;也为大家逐一进行了科普。 感兴趣的小伙伴欢迎阅读以往文章&#xff1a; 什么是边缘计算盒子&#xff1f;边缘计…

用代码拔高你对整型提升与unsigned,signed的理解

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;希望可以…

Linux下通过 rm -f 删除大量文件时报错:Argument list too long

Linux下通过 rm -f 删除大量的小文件时出现类似如下错误信息&#xff1a; -bash: /bin/rm: Argument list too long 如下图所示&#xff1a; 问题原因 如果待删除文件中包含的小文件数量过多&#xff0c;通常是由于受到 shell 参数个数限制所致。 这个是Linux系统存在的限制&…

若依源码解析:代码生成ruoyi-generator

文章目录 摘要代码生成器的使用数据库连接配置数据库表设计代码生成器配置修改mybatis别名配置&#xff0c;增加对com.cyl包名的识别修改mybatis的mapper扫描包路径 代码生成代码输出模板配置 代码生成器原理模板引擎&#xff1a;Velocity使用Velocity模板引擎的一般流程模板语…

前端技术搭建贪吃蛇小游戏(内含源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了井字游戏&#xff0c;今天还是继续按照我们原定的节奏来带领大家完成一个贪吃蛇游戏&#xff0c;功能也比较简单简单&#xff0c;也…

第四章 Text

目录 TextFontsGlyphsFont TypesThe Font DictionaryEncodings Text StateFont and SizeRendering Mode Drawing TextPositioning TextWhat’s Next Text 在本章中&#xff0c;您将学习如何在页面上绘制文本。 绘图文本是 PDF 图形中最复杂的部分&#xff0c;但它也是帮助 PDF…

【Netty】Netty中的超时处理与心跳机制(十九)

文章目录 前言一、超时监测二、IdleStateHandler类三、ReadTimeoutHandler类四、WriteTimeoutHandler类五、实现心跳机制5.1. 定义心跳处理器5.2. 定义 ChannelInitializer5.3. 编写服务器5.4. 测试 结语 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#…

太坑了,盘点BeanUtils.copyProperties的11个小坑

我们日常开发中&#xff0c;经常涉及到DO、DTO、VO对象属性拷贝赋值&#xff0c;很容易想到org.springframework.beans.BeanUtils的copyProperties 。它会自动通过反射机制获取源对象和目标对象的属性&#xff0c;并将对应的属性值进行复制。可以减少手动编写属性复制代码的工作…

“游蛇”大规模邮件攻击针对中国用户

近半年黑客团伙频频对我国实施攻击活动。研究人员发现&#xff0c;“游蛇”黑产团伙自2022年下半年开始至今&#xff0c;针对中国用户发起了大规模电子邮件攻击活动。 黑客使用电子邮件在内的多种传播方式。 该团伙利用钓鱼邮件、伪造的电子票据下载站、虚假应用程序下载站、…

eclipse固件库生成的操作流程

一.方法介绍 有时候我们需要将某个功能模块封装成一个库&#xff0c;只留出接口供别人使用&#xff0c;那么就需要打包处理&#xff0c;eclipse是如何操作的呢&#xff1f;本文仅仅讨论我所知道的两种方式&#xff0c;倘若还有更简便的方法也非常欢迎网友补充。 1.在已有的工…

【PyQt5】使用QtDesigner创建Splitter

目录 Splitter效果演示 目前在Qt Designer无法检索到QSplitter。 实现方式&#xff1a; 1.同时选中两个需要实现splitter样式的控件&#xff0c;以QTreeWidget和QTableWidget为例&#xff1b; 2.右击–>布局–>使用分裂器&#xff08;根据需求选择水平或垂直布局&#x…

Groovy系列二 Groovy GDK

目录 Groovy中自带集合方法 sort方法对集合排序 findAll 查询所有符合条件的元素 collect 返回 一个新的list inject 强大的累计功能 each、eachWithIndex find、findIndexOf 查询符合条件的数据 any判断符合条件的数据 every查询所有条件都满足的数据 reverse将集合…

linux下安装EclipseCDT:离线安装与在线安装

文章目录 前言&#xff1a;1. 离线下载1.1 下载EclipseCDT1.2 下载jdk1.3 安装jdk1.4 安装eclipse 2. 在线安装&#xff1a;2.1 安装jdk2.2 安装EclipseCDT2.2.1 简单安装2.2.2 ubuntu官方推荐安装方式2.2.3 apt安装(报错logo) 总结&#xff1a; 前言&#xff1a; Eclipse使用…