1. 原理图:

VBUS:USB正极

VCDT:充电电压检测脚

ISENSE:充电电流检测电阻的正极

BATSNS:充电电流检测电阻的负极

BAT:电池正极引脚

BAT_ON:电池NTC(热敏电阻)引脚

2.软件架构

3.充电电流、电压的计算

通过读取PMIC的寄存器直接可读到VBAT、VISENSE、VCharger、Vbat_temp

充电电流 = 电流检测电阻两端的电压/电流检测电阻

……

充电电压:MTK的ADC量程为2.8V,充电电压一般为5V左右,不能直接接ADC,所以采用分压电路量取分得的电压,算出充电电压。

4.电池容量算法

1.      线性插值法:

取电池容量0%, 10%, 20%, ……, 100% 11个点对应的电池电压,各个容量区间的具体电压通过线性得到。

……

2.      平均值法:

因为电池电压不稳定,存在跳变,所以对数据的变化需要做平均处理。

在没有插拔USB的情况下,电池信息数组每十秒抛出一个旧的值,填进一个最新的值,取得平均值供上报。

5.电池温度计算

通过ADC读到的Vntc电压可得到热敏电阻的实时阻值Rntc;再通过电池厂商提供的温度-阻值表和线性法得到电池实时温度。

……

二、充电流程

1.流程图:

2.状态机

3.      代码

注册platform设备、驱动,通过name匹配。

probe中创建class_dev

1.初始化hrtimer,设定每10sbattery kernel进程被唤醒一次;

2.创建并启动一个内核线程bat_thread_kthread;

3.检测到USB插拔事件batterykernel进程被唤醒。

bat_thread_kthread();中一个while(1)的循环中包了一个BAT_thread();函数,充电的核心函数。

3.1 BAT_thread();函数的前段:

BAT_CheckBatteryStatus();函数主要完成更新电池数据(电压、电量、电流和温度)、检查电池状态(若温度超过限定范围,置BMA_status.bat_charging_state为CHR_ERROR)

3.2 BAT_thread();函数的中段:电池数据更新、上报

3.3 BAT_thread();函数的最后

BAT_PreChargeModeAction();

增加PRE_charging_time、total_charging_time

使能充电

当电池电压到达V_PRE2CC_THRES(3.4V)进入恒压(CC)充电

BAT_ConstantCurrentModeAction();

增加CC_charging_time、total_charging_time

使能充电

当电池电压到达V_CC2TOPOFF_THRES(4.05V)进入恒压(CV)充电

BAT_TopOffModeAction();

增加TOPOFF_charging_time、total_charging_time

继续使能充电

在thread中会有判断,进入CHR_BATFULL的条件

BAT_BatteryFullAction();清零计时器,停止充电

BAT_BatteryStatusFailAction();

清零计时器,停止充电

三、电池数据上报

1.大体流程

当驱动挂载到内核上的时候,内核提供给驱动的接口就是一个结构体power_supply,主要是利用了 uevent 的通讯机制实现用户态和内核态的交互,另外还涉及了sys 文件系统里的文件创建 。

mt6320_battery_main中的结构体成员psy就是power_supply类型

2.注册节点

mt6320_battery_probe()里调用power_supply_core.c中power_supply_register();函数来注册class_dev

power_supply_core.c中会创建class下的power_supply节点, 注册后生成ac, usb,battery节点

power_supply_register();函数中还会完成工作队列初始化

其中power_supply_changed_work();函数:

加自旋锁、uevent事件上报(判断changed为true,则上报)、解自旋锁

3.uevent何时上报

在BAT_Thread();函数里

mt6320_battery_update();函数中会根据不同状态对mt6320_battery_data结构体赋值,最后调用power_supply_changed();函数触发uevent事件上报。

……

power_supply_changed();函数中置changed为true

MT6589充电模块浅析相关推荐

  1. 浅析 JavaScript 中的 函数 uncurrying 反柯里化

    柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...

  2. 浅析Python中bytes和str区别

    本博转载自:Chown-Jane-Y的浅析Python3中的bytes和str类型 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示, ...

  3. 学习《Linux设备模型浅析之设备篇》笔记(深挖一)

    这篇文章既然说了是浅析,那就是跳过了一些东西,我们把这些跳过的东西给它尽可能的补回来 今天登陆 lxr.free-electrons.com 发现内核版本已经升级到3.15了,那以后都使用3.15的源 ...

  4. 学习《Linux设备模型浅析之设备篇》笔记(一)

    最近在学习Linux设备模型,前面几篇文章也是读这篇的时候遇到问题,然后为了搞清楚先转去摸索才写出来的. 当然了,刚开始是先读到<Linux那些事儿之我是Sysfs>,搞不清楚才去读的&l ...

  5. 架构周报| 浅析MySQL JDBC连接配置上的两个误区

    经典案例 \\ 浅析MySQL JDBC连接配置上的两个误区:相信使用MySQL的同学都配置过它的JDBC驱动,多数人会直接从哪里贴一段URL过来,然后稍作修改就上去了,对应的连接池配置也是一样的,很 ...

  6. 超级账本(Hyperledger Fabric)之权限管理浅析

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 超级账本(Hyperledger Fabric)之权限管理浅析 超级账本是联盟链的代表,而其相对于共链(例如比特币,以太 ...

  7. linux内核SMP负载均衡浅析

    需求       在<linux进程调度浅析>一文中提到,在SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列).如果一个进程处于TASK_RUNNING状态( ...

  8. CAS、原子操作类的应用与浅析及Java8对其的优化

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:CoderBear juejin.im/post/5c7a8 ...

  9. Python标准库queue模块原理浅析

    Python标准库queue模块原理浅析 本文环境python3.5.2 queue模块的实现思路 作为一个线程安全的队列模块,该模块提供了线程安全的一个队列,该队列底层的实现基于Python线程th ...

最新文章

  1. c#:未将对象引用设置到对象的实例--可能出现的问题总结(转)
  2. 关于微软研究院(谢幸、郑宇研究员主导的)“智能城市”“智能生活”研究的一个归纳...
  3. 2.5 隐藏委托关系
  4. 根据 HTML 规范,以下代码中,外层容器 .outer 的宽高分别是:
  5. POJ 1458 Common Subsequence DP LCS 最长公共子序列
  6. For ourselves
  7. ArcGIS栅格数据批量转换格式
  8. kubernetes 集群管理平台
  9. 手把手教你彻底卸载MySQL
  10. c#随机产生常用汉字
  11. 类别不平衡问题之SMOTE算法(Python imblearn极简实现)
  12. 制作逼真立体玻璃奶瓶图片的PS教程
  13. ArcGIS Pro功能模块简介
  14. 使用C语言编写一个Jacobi迭代程序
  15. 怎么打开本地计算机策略编辑器,打开本地组策略编辑器; 2.在弹出的本地组策略编辑器窗口...
  16. Java面试题3(jsp)
  17. 强大好用的python绘图
  18. 多媒体会议室设备配置单
  19. Apache Linkis 中间件架构及快速安装
  20. Mac 上解压缩 RAR 文件

热门文章

  1. ETSI NFV 结构
  2. 日语中か行、た行的清辅音不在单词句首时发音的音便现象/浊音化现象
  3. FlowLayout流式布局管理器与网格布局GridLayout
  4. 带你快速了解PROFIBUS总线接口技术
  5. sath89/oracle-xe-11g
  6. [2022软工第二次作业]软件评测——CSDN技能树
  7. Android怎么集成支付宝支付和微信支付功能(上)
  8. java html docx_java-将HTML转换为DOCX
  9. adb shell 修改文件名_教你三招快速文件批量重命名方法-linux修改文件名
  10. 支付沙箱环境异步回调问题