8X25Q充电部分软件梳理(CP侧)

分享链接:http://note.youdao.com/share/?id=4f6665eee6bad5ea27eee47f74bcfa4b&type=note

8X25Q充电部分软件梳理(CP侧)

作者:韦启发

目录

1、过放电池的充电阶段介绍... 2

2Autonomous充电介绍... 5

3USB充电器检测... 6

4、在AMSS中的Autonomous充电... 7

5、修改充电时上报的电池电压电池温度的时间频率... 10

6、不插入电池连接USB线手机循环开关机,类似小米一样... 11

 

 

 

 

 

 

 

 

 

 

 

 

 

1、过放电池的充电阶段介绍

 

If the battery voltage (VBAT) is:

VBAT < 3.2 V→Dead battery

3.2 V < VBAT < 3.4 V→Weak battery

VBAT > 3.4 V→Good battery

All the thresholds above are configurable

涓流充电:

    涓流充电在电池电压低于3.2V时就会使能。

快速充电:

      当电池电压在VWEAK 3.2VVDD_MAX4.2V之间时就会启动快速充电。

       首先电池先充电到3.4V达到开机状态后然后手机会开机。

在涓流充电阶段和快速充电阶段都有一个定时器来管理,这样避免如果有坏电池的时候会恋永远充电下去造成错误。

代码位置:\modem_proc\core\wiredconnectivity\hsusb\ driver\src\chg\

使能过放电池充电:一定要打开这两个宏FEATURE_OEMSBL_USB_ BATT_CHG  FEATURE_HS_USB_FAST_CHARGE_VIA_HID

 

过放电池充电:这个充电阶段存在是因为电池电压低于3.4V的时候,并且USB线提供的电池不足以让手机开机,就会启动过放电池充电。

过放电池充电截止点:当电池电压达到3.4V就会停止过放电池充电阶段,让手机开机。

软件配置注意:

1.如果你想使能电池过放充电,那么请打开宏:FEATURE_HS_USB_CHG_BOOT_DCP_ CHARGING

2.为了支持无效的充电器(D+D-悬空的充电器),你可以打开宏:

FEATURE_HS_USB_CHG_BOOT_ SUPPORT_INVALCHGR

3.电池电压门限值设置,

CHG_BOOT_UCHG_VBATT_THRESH_TRICKLE 3.2V

FEATURE_HS_USB_CHG_BOOT_ SUPPORT_INVALCHGR 3.4V

4.补尝值 这个值根据需要设置,我理解是一个区间范围值:

HSU_CHG_BOOT_VBATT_WEAK_FAST_CHG_BOOST_OFFSET

软件代码流程:

 

Oemsbl_usb_chg_init()函数作用介绍:

  1. 设置弱电池电压门限:BOOT_WEAK_BATTERY_THRESHOLD
  2. 设置手机电流消耗限制:BOOT_I_DEVICE_POWER_ CONSUMPTION

Hsu_chg_boot()函数作用介绍:

  1. chg_boot_uchg_pm_setup()设置电压门限,弱电池电压的两个门限
  2. chg_boot_pm_get_batt_level()来检测电池的状态。
  3. 如果电池是过放电池,就会启动过放电池充电,使用函数 hsu_chg_boot_loop()

Hsu_chg_boot_loop()函数作用介绍:

  1. 不断的检测USB连接状态和电池电压是否超过门限值
  2. 如果断开USB线或者su_chg_boot_poll_usb_hid()函数检测到墙充,就会跳出这个循环。
  3. 如果电池电压大于设置门限值3.5V(用函数hsu_chg_boot_poll_batt_lvl()获取&&看具体设置)就会跳出循环。

 

 

 

 

 

 

 

 

 

2Autonomous充电介绍

从上面的图中可以看出来,启动充电的前2个阶段(涓流充电和恒流充电)是一样的,之后会做一次选择,选择恒压充电还是脉冲充电,现在我们的项目最后那个阶段是脉冲充电。

可里也可以从我们的代码上可以看出来:

chg_autocharging_pulse_topoff.cpp 编译这个文件走的是脉冲充电分支。

chg_autocharging_cv_topoff.cpp 编译这个文件走的是恒压充电分支。

很明显我们走的是脉冲充电,恒流阶段进入脉冲充电也是由我们决定了,这里有一个设置的门限值,我们后面会再讲。

 

 

 

3USB充电器检测

系统会判断两个充电的流程,一个是usb wall charger  usb host charger,看下面的图片。墙充电后的中断是CHG_CMD__IRQ_TRIGGERED,另一个是CHG_CMD__SYSTEM_STATUS_CHANGED

墙充检测(实际上这个流程我们代码中并没有做判断这个分支):

USB HOST检测:

4、在AMSS中的Autonomous充电

下面讲的都是在中断CHG_CMD__SYSTEM_STATUS_CHANGED进行解析的事件,在chg_config.h头文件中集合了一些参数的设置。

CHG_BATTERY_V_MAX:看名字说的是电池电压的最大值,通过这个值来判断电池是否已经满电,在开始充电的时候用pm_chg_vmaxsel_set(CHG_BATTERY_V_MAX);函数去设置他的值(以最后一次调用这个函数为有效值)。

CHG_VBATDET_V:电池检测的电压值,这个电压值的设置会产生一个中断,用这个中断来再设置进入脉冲充电方式,pm_chg_vbatdet_set(),这个函数去设置他的值(以最后一次调用这个函数为最终有效值),如果达到这个设置值之后,就会产生PM_VBAT_DET_IRQ_HDL中断,在这个中断里面再去startPulseCharging(pulseConfig);启动脉冲充电,在startPulseCharging(pulseConfig);函数里设置脉冲充电的停止电压值,

CHG_PULSE_V_MAX:脉冲充电的最大电压值,startPulseCharging(pulseConfig)里面会设置这个值(以最后一次调用这个函数为有效值)。

CHG_PULSE_VBATDET_V:停止脉冲充电电压值,startPulseCharging(pulseConfig)里面会设置这个值(以最后一次调用这个函数为有效值)。

CHG_CHARGER_I_MAX:墙充充电电流值.

CHG_UNKNOWN_I_MAX:未知充电方式的充电电流大小,一般设置为450MA,后面在软件上做了DPM(检测充电端的电压大小,动大的调整充电电流大小)检测,充电电流最大可以达到1000MA

CHG_HOST_I_MAX:电脑充电的时候的充电电流大小,这个充电电流大小不要修改。

 

err |= pm_chg_vbatdet_set(CHG_VBATDET_V); 这个设置的CHG_VBATDET_V电压值,当电池电压大于CHG_VBATDET_V电压时,会一直产生PM_VBAT_DET_IRQ_HDL中断,当电池电压小于CHG_VBATDET_V时,会产生PM_VBATT_DET_LOW_IRQ_HDL中断。当脉冲充电结束时,会产生的是PM_PULSE_CHG_DONE_IRQ_HDL中断。 

PM_VBATT_DET_LOW_IRQ_HDL这个中断在我们的代码中是没有的,需要自己去先监听这个中断,在Chg_isr.cpp文件中加上的代码如下:

//owen.wei add start 
pm_err_flag_type IrqEventGenerator::AddListenerForVbatdetLowIrq(ChargingEventListener *listener) 

/* Listen to VBATDET IRQ */ 
addListener(listener, PM_VBATT_DET_LOW_IRQ_HDL); 

pm_err_flag_type err = PM_ERR_FLAG__SUCCESS; 

INTLOCK(); 

/* Disable the IRQ */ 
err = pm_clear_irq_multi_handle(PM_VBATT_DET_LOW_IRQ_HDL, isr); 

/* Clear the IRQ. */ 
err = pm_clear_irq(PM_VBATT_DET_LOW_IRQ_HDL); 

/* Enable the IRQ, pass the IRQ ID as data */ 
err = pm_set_irq_multi_handle(PM_VBATT_DET_LOW_IRQ_HDL, 
isr, 
(void*)PM_VBATT_DET_LOW_IRQ_HDL); 

/* Find out if there was an PMIC API error */ 
if (err != PM_ERR_FLAG__SUCCESS) 

MSG_ERROR("PMIC API ERROR(0x%x) DETECTED",err,0,0); 


INTFREE(); 

return err; 

void IrqEventGenerator::RemoveListenerForVbatdetLowIrq(ChargingEventListener *listener) 

/* Remove listener */ 
removeListener(listener, PM_VBAT_DET_IRQ_HDL); 

//owen.wei add end 

解决问题:

我们的代码中有一个定时器函数ListenerForBatteryAlarm(),这个函数用来监听电池电压的变化,一般情况下我们电池只能在脉冲充电结束后才会是满电状态,才会达到100%,通过这个函数监听,可以让用户感觉充电时间会有缩短的假象。这个函数是国速那边增加的。

二次充电时修改的文件:


 

 

 

 

 

 

 

 

 

 

5、修改充电时上报的电池电压电池温度的时间频率

vbatt_update_adc_battery_params函数里,有一个计数的变量pollimg_timer

在这个位置会有返回的结果,所以如果想让上报的频率增大一些,可以在这里把这段代码注解掉。

如果不修改这个位置的话,就会1分钟进行上报一次电池电压和电池温度,这样的话会比较慢。兴飞测试那边实现温度是45度了,但是我们的手机显示还只是43度,最好能够做成时实上报温度。

6、不插入电池连接USB线手机循环开关机,类似小米一样

#define FEATURE_SUPPORT_ONLY_USB_POWER_ON  //Owen.wei modify

#define FEATURE_HS_USB_BASIC //Owen.wei modify

打开这两个宏就可以了。

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

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

相关文章

【Pytorch神经网络基础理论篇】 08 Softmax 回归 + 损失函数 + 图片分类数据集

同学你好&#xff01;本文章于2021年末编写&#xff0c;已与实际存在较大的偏差&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)…

CI Weekly #11 | 微服务场景下的自动化测试与持续部署

又一周过去了&#xff0c;最近我们的工程师正在搞一个“大事情” ——「flow.ci 配置文件」&#xff0c;稍微剧透一下&#xff0c;这个功能预计会在春节前上线。详情请大家关注 flow.ci Changelog 或其他官方通知:) 本期 CI Weekly 收录了的CI/CD实践、微服务自动化测试与持续部…

数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6

括号匹配问题和逆波兰表达式求值问题 基于上一节已经使用python代码对栈进行了简单的实现&#xff0c;这一节我们在其基础上解决两个常见的问题 案例 括号匹配问题(点我直接到代码实现)逆波兰表达式求值问题(点我直接到代码实现) 括号匹配问题 在给定的字符串中&#xff0…

ubuntu server 12.04中文显示不完整

发现有台服务器ubuntu server 12.04在远程过去时文件名的中文现实没有问题&#xff0c;但ls的时候时间居然乱码。 搜索了一下&#xff0c;应该是locale的问题&#xff0c;可以这样处理&#xff1a; 1. 编辑/var/lib/locales/supported.d/local文件&#xff0c;内容改成如下&am…

Java_基础阶段笔记总结汇总

一、Java简介 1、Java语言平台性介绍 2、JDK_JRE_JVM的组成和作用 JVM: Java虚拟机&#xff0c;是专门用来运行Java程序的,但是不能单独安装 JRE: Java运行环境&#xff0c;包含JVM(Java虚拟机,是专门用来运行Java程序的)和核心类库 JDK: Java开发工具包&#xff0c;包含JRE和…

数据结构链表之队列,Python3实现——7

数据结构链表之队列 队列概述 定义&#xff1a;队列是一种基于先进先出(FIFO)的数据结构&#xff0c;队列只能在一段进行插入和删除操作的结构&#xff0c;第一个进入队列的元素在读取时会第一个被读取 队列可以使用顺序表(Python中列表)实现&#xff0c;也可以用链表实现&am…

IDEA上Debug调试全流程

一、什么是Debug模式 是供程序员使用的程序调试工具&#xff0c;它可以用于查看程序的执行流程&#xff0c;也可以用于追踪程序执行过程来调试程序。使用IDEA的断点调试功能&#xff0c;查看程序的运行过程 Debug调试窗口介绍。 二、Debug模式操作流程【应用】 能够使用断点调…

数据结构链表之符号表,Python3实现——8

数据结构链表之符号表 符号表的介绍 之前章节介绍的顺序表和链表都是一个节点储存一个元素的表&#xff0c;但在日常生活中我们还有很多一次需要储存成对或多个值的情况&#xff0c;例如&#xff1a; 符号表最主要的目的将一对元素&#xff0c;用一个键和一个值将其联系起来&…

OpenCV_01 简介+无版权安装+模块分析

OpenCV是应用广泛的开源图像处理库&#xff0c;我们以其为基础&#xff0c;介绍相关的图像处理方法&#xff1a;包括基本的图像处理方法&#xff1a;几何变换&#xff0c;形态学变换&#xff0c;图像平滑&#xff0c;直方图操作&#xff0c;模板匹配&#xff0c;霍夫变换等&…

KMP 算法 学习 整理

我自己整理的KMP算法的PDF文件&#xff1a;http://pan.baidu.com/s/1o8yKIi2提取密码&#xff1a;8291 别的就不多说啥了&#xff0c;感谢来自海子 博客园的 资料-- 转载于:https://www.cnblogs.com/suishiguang/p/6285979.html

OpenCV_02 图像的基本操作:图像IO+绘制图形+像素点+属性+图像通道+色彩空间的改变

1 图像的IO操作 这里我们会给大家介绍如何读取图像&#xff0c;如何显示图像和如何保存图像。 1.1 读取图像 API cv.imread()参数&#xff1a; 要读取的图像 读取方式的标志 cv.IMREAD*COLOR&#xff1a;以彩色模式加载图像&#xff0c;任何图像的透明度都将被忽略。这是默…

数据结构之树:树的介绍——9

数据结构之树&#xff0c;介绍篇 树的基本定义 介绍&#xff1a;树&#xff08;tree&#xff09;是计算机中非常重要的数据结构&#xff0c;它的外形看起来像一颗倒挂着的的树&#xff0c;使用树这种结构可以描述生活中很多的事物&#xff0c;如族谱&#xff0c;单位的组织架…

页面的宽度

页面的宽度等于内容 paddingmargin100%转载于:https://www.cnblogs.com/Zhaoyanguang/p/6292783.html

数据结构之二叉树:二叉查找树基本功能,Python代码实现——10

数据结构之二叉查找树的代码实现 定义 二叉查找树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;&#xff0c;是一种内存中特殊的树类型的存储结构&#xff0c;它允许对存储在其结点的数据进行增删改查&#xff0c;或者用作动态的数据集合&#xff0c;或是通过k…

OpenCV_03 图像的算数操作:图像的加法+图像的混合

1.图像的加法 你可以使用OpenCV的cv.add()函数把两幅图像相加&#xff0c;或者可以简单地通过numpy操作添加两个图像&#xff0c;如res img1 img2。两个图像应该具有相同的大小和类型&#xff0c;或者第二个图像可以是标量值。 注意&#xff1a;OpenCV加法和Numpy加法之间存…

【bzoj2806】 Ctsc2012—Cheat

http://www.lydsy.com/JudgeOnline/problem.php?id2806 (题目链接) 题意 给出M个字符串组成“标准库”。定义L表示将一个字符串分成若干段&#xff0c;每一段的长度不小于L&#xff0c;其中是在标准库中任一字符串的子串的字符“段”的长度之和不小于原字符串长度之和的90%。N…

怎样在Linux驱动中创建proc节点(示例)

一、定义proc节点的读、写函数 static int tp_switch_writeproc(struct file *file,const char *buffer, unsigned long count,void *data) { sscanf(buffer,"%d", &tp_dbg); printk("tpd: proc-->tp_dbg %d\n", tp_dbg); return count; } static …

数据结构之二叉树:二叉查找树的先序、中序、后序、层序遍历,Python代码实现——10(续)

数据结构之二叉查找树的代码实现 本节继续对上一节BST的功能实现 在实现之前&#xff0c;先对要实现的功能进行一下简单的介绍 BST的几种常见遍历方式 以一个简化的树为例&#xff0c;一棵树包含根(父)结点和其左子树及右子树&#xff1a; 遍历顺序的先后是指根(父)结点被遍…

OpenCV_04 几何变换:图像缩放+图像平移+图像旋转+仿射变换+透射变换+图像金字塔

1 图像缩放 缩放是对图像的大小进行调整&#xff0c;即使图像放大或缩小。 API cv2.resize(src,dsize,fx0,fy0,interpolationcv2.INTER_LINEAR)参数&#xff1a; src : 输入图像 dsize: 绝对尺寸&#xff0c;直接指定调整后图像的大小 fx,fy: 相对尺寸&#xff0c;将dsize设…

Direct2D教程(九)渲染位图

概述 这篇的标题更确切的说应该叫位图画刷&#xff0c;这样才好和前几篇对应起来。在Direct2D中&#xff0c;位图的渲染也是通过画刷来实现的。 Direct2D中并没有直接操作位图的接口&#xff0c;而是借助WIC&#xff08;Windows Image Component&#xff09;来完成的。今天我们…