MT6589充电模块浅析
2014-01-07 16:09
225 查看
http://blog.csdn.net/wn360459196/article/details/11031073
VBUS:USB正极
VCDT:充电电压检测脚
ISENSE:充电电流检测电阻的正极
BATSNS:充电电流检测电阻的负极
BAT:电池正极引脚
BAT_ON:电池NTC(热敏电阻)引脚
通过读取PMIC的寄存器直接可读到VBAT、VISENSE、VCharger、Vbat_temp
充电电流 = 电流检测电阻两端的电压/电流检测电阻
……
充电电压:MTK的ADC量程为2.8V,充电电压一般为5V左右,不能直接接ADC,所以采用分压电路量取分得的电压,算出充电电压。
1. 线性插值法:
取电池容量0%, 10%, 20%, ……, 100% 11个点对应的电池电压,各个容量区间的具体电压通过线性得到。
……
2. 平均值法:
因为电池电压不稳定,存在跳变,所以对数据的变化需要做平均处理。
在没有插拔USB的情况下,电池信息数组每十秒抛出一个旧的值,填进一个最新的值,取得平均值供上报。
通过ADC读到的Vntc电压可得到热敏电阻的实时阻值Rntc;再通过电池厂商提供的温度-阻值表和线性法得到电池实时温度。
……
注册platform设备、驱动,通过name匹配。
probe中创建class_dev
1.初始化hrtimer,设定每10sbattery kernel进程被唤醒一次;
2.创建并启动一个内核线程bat_thread_kthread;
3.检测到USB插拔事件batterykernel进程被唤醒。
bat_thread_kthread();中一个while(1)的循环中包了一个BAT_thread();函数,充电的核心函数。
BAT_CheckBatteryStatus();函数主要完成更新电池数据(电压、电量、电流和温度)、检查电池状态(若温度超过限定范围,置BMA_status.bat_charging_state为CHR_ERROR)
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();
清零计时器,停止充电
当驱动挂载到内核上的时候,内核提供给驱动的接口就是一个结构体power_supply,主要是利用了 uevent 的通讯机制实现用户态和内核态的交互,另外还涉及了sys 文件系统里的文件创建 。
mt6320_battery_main中的结构体成员psy就是power_supply类型
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,则上报)、解自旋锁
在BAT_Thread();函数里
mt6320_battery_update();函数中会根据不同状态对mt6320_battery_data结构体赋值,最后调用power_supply_changed();函数触发uevent事件上报。
……
power_supply_changed();函数中置changed为true
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_devpower_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充电模块浅析
- MT6589充电模块浅析
- MT6589充电模块浅析
- 展讯充电管理模块浅析(一)
- 浅析 C++ 调用 Python 模块
- 天嵌科技——充电桩模块介绍
- Android蓝牙开发浅析 及 Android蓝牙通讯模块源码(Android蓝牙开发浅析 续)
- 浅析Microsoft .net PetShop程序中的购物车和订单处理模块
- Python 模块浅析
- 浅析Python中的struct模块
- 模块模式浅析
- BCache源码浅析之一基本使用与代码模块
- 浅析JS模块规范:AMD,CMD,CommonJS
- 《Python基础教程》要点(十):充电时刻:探究模块
- Makefile 理解(4) 【Android.mk 浅析 模块编译Makefile编写】
- 网络游戏中网络模块浅析
- seaJs的模块定义和模块加载浅析
- 浅析Python中的struct模块
- MySQL体系结构:八大功能模块浅析
- Android蓝牙通讯模块源码(Android蓝牙开发浅析 续)