尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
MTK GM3.0充电算法中关于JEITA_SW的一些代码分析
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录一、什么是JEITA二、设备树属性与代码分析2.1 设备树属性2.2 设备树属性初始化2.3 电池温度与jeita充电电压的关系代码分析2.4 电池电压的设置与写入一、什么是JEITAJEITAJapan Electronics and Information Technology Industries Association日本电子信息技术产业协会为了提高锂离子电池充电的安全性JEITA和日本电池协会于2007年4月20日发布了新的安全指南。他们的指导方针着重强调了在某些低温和高温范围内避免高充电电流和高充电电压的重要性。这个是百度的一些关于jeita的说明从图中来看总的来说jeita就是对电池温度做一个多段的细分在不同的温度段中设置不同的充电电压和充电电流。具体分析见下面关于jeita的代码分析。二、设备树属性与代码分析2.1 设备树属性先从设备树中查看jeita相关的属性设置charger: charger {…/* sw jeita */jeita_temp_above_t4_cv 4240000;jeita_temp_t3_to_t4_cv 4240000;jeita_temp_t2_to_t3_cv 4340000;jeita_temp_t1_to_t2_cv 4240000;jeita_temp_t0_to_t1_cv 4040000;jeita_temp_below_t0_cv 4040000;temp_t4_thres 50;temp_t4_thres_minus_x_degree 47;temp_t3_thres 45;temp_t3_thres_minus_x_degree 39;temp_t2_thres 10;temp_t2_thres_plus_x_degree 16;temp_t1_thres 0;temp_t1_thres_plus_x_degree 6;temp_t0_thres 0;temp_t0_thres_plus_x_degree 0;temp_neg_10_thres 0;…}从这里来看jeita的电压分为了4个其中从设备树中这个属性的设置可以看出还有一些温度属性相关的设置2.2 设备树属性初始化static int mtk_charger_parse_dt(struct charger_manager *info,struct devicedev){…/enable_sw_jeita;/ //如果要使用jeita相关的功能需要把这个注释打开/sw jeita *///jeita充电电压的属性初始化赋值if (of_property_read_u32(np, “jeita_temp_above_t4_cv”, val) 0)info-data.jeita_temp_above_t4_cv val;else {chr_err(“use default JEITA_TEMP_ABOVE_T4_CV:%d\n”,JEITA_TEMP_ABOVE_T4_CV);info-data.jeita_temp_above_t4_cv JEITA_TEMP_ABOVE_T4_CV;}if (of_property_read_u32(np, jeita_temp_t3_to_t4_cv, val) 0) info-data.jeita_temp_t3_to_t4_cv val; else { chr_err(use default JEITA_TEMP_T3_TO_T4_CV:%d\n, JEITA_TEMP_T3_TO_T4_CV); info-data.jeita_temp_t3_to_t4_cv JEITA_TEMP_T3_TO_T4_CV; } ... //充电温度段的属性初始化赋值 if (of_property_read_u32(np, temp_t4_thres, val) 0) info-data.temp_t4_thres val; else { chr_err(use default TEMP_T4_THRES:%d\n, TEMP_T4_THRES); info-data.temp_t4_thres TEMP_T4_THRES; } if (of_property_read_u32(np, temp_t4_thres_minus_x_degree, val) 0) info-data.temp_t4_thres_minus_x_degree val; else { chr_err(use default TEMP_T4_THRES_MINUS_X_DEGREE:%d\n, TEMP_T4_THRES_MINUS_X_DEGREE); info-data.temp_t4_thres_minus_x_degree TEMP_T4_THRES_MINUS_X_DEGREE; } ...…}经过上述初始化设置就可以从设备树中获取jeita相关的参数了2.3 电池温度与jeita充电电压的关系代码分析1.会先对jeita.sm进行一个初始化根据电池温度对jeita.sm进行温度段的赋值即当前电池温度属于jeita中哪一个温度段具体见如下代码//根据当前电池温度对jeita.sm进行初始化void sw_jeita_state_machine_init(struct charger_manager *info){struct sw_jeita_data *sw_jeita;if (info-enable_sw_jeita true) { sw_jeita info-sw_jeita; //获取当前电池温度 info-battery_temp battery_get_bat_temperature(); //根据电池温度对jeita.sm的温度段进行赋值 if (info-battery_temp info-data.temp_t4_thres) sw_jeita-sm TEMP_ABOVE_T4; else if (info-battery_temp info-data.temp_t3_thres) sw_jeita-sm TEMP_T3_TO_T4; else if (info-battery_temp info-data.temp_t2_thres) sw_jeita-sm TEMP_T2_TO_T3; else if (info-battery_temp info-data.temp_t1_thres) sw_jeita-sm TEMP_T1_TO_T2; else if (info-battery_temp info-data.temp_t0_thres) sw_jeita-sm TEMP_T0_TO_T1; else sw_jeita-sm TEMP_BELOW_T0; chr_err([SW_JEITA] tmp:%d sm:%d\n, info-battery_temp, sw_jeita-sm); }}2.在充电器的线程中如果插入充电器且info-enable_sw_jeita true即打开了jeita的使能设置那么会有如下static int charger_routine_thread(void *arg){…charger_check_status(info);…}static void charger_check_status(struct charger_manager *info){…//这里会对jeita是否使能进行判断if (info-enable_sw_jeita true) {//这里就是jeita的核心do_sw_jeita_state_machine(info);if (info-sw_jeita.charging false) {charging false;goto stop_charging;}} else {…}…}3.这里会对核心函数do_sw_jeita_state_machine进行分析void do_sw_jeita_state_machine(struct charger_manager *info){struct sw_jeita_data *sw_jeita;sw_jeita info-sw_jeita; sw_jeita-pre_sm sw_jeita-sm; sw_jeita-charging true; /* JEITA battery temp Standard */ // 下面是关于jeita.sm的一些设置jeita.sm会影响jeita.cv的设置下面会有如下几种设置 // 这里会对这片代码进行分析 if (info-battery_temp info-data.temp_t4_thres) { chr_err([SW_JEITA] Battery Over high Temperature(%d) !!\n, info-data.temp_t4_thres); //jeita.sm被设置为TEMP_ABOVE_T4 sw_jeita-sm TEMP_ABOVE_T4; //设置停止充电标志false不充 sw_jeita-charging false; } else if (info-battery_temp info-data.temp_t3_thres) { /* control 45 degree to normal behavior */ //电池温度处于45℃~50℃之间执行下列代码if else if ((sw_jeita-sm TEMP_ABOVE_T4) (info-battery_temp info-data.temp_t4_thres_minus_x_degree)) { chr_err([SW_JEITA] Battery Temperature between %d and %d,not allow charging yet!!\n, info-data.temp_t4_thres_minus_x_degree, info-data.temp_t4_thres); //如果刚从50℃降温下来且温度高于47℃充电标志设置为false即不充 sw_jeita-charging false; } else { chr_err([SW_JEITA] Battery Temperature between %d and %d !!\n, info-data.temp_t3_thres, info-data.temp_t4_thres); //如果温度不是从50℃降下来是从其他温度升上去超过了45℃使用TEMP_T3_TO_T4的sm sw_jeita-sm TEMP_T3_TO_T4; } } else if (info-battery_temp info-data.temp_t2_thres) { //电池温度处于10℃~45℃之间执行下列代码if else if (((sw_jeita-sm TEMP_T3_TO_T4) (info-battery_temp info-data.temp_t3_thres_minus_x_degree)) || ((sw_jeita-sm TEMP_T1_TO_T2) (info-battery_temp info-data.temp_t2_thres_plus_x_degree))) { //如果刚从从45℃降下来且温度高于39℃还是使用TEMP_T3_TO_T4的sm //或者温度是刚从0℃升上来且温度小于16℃还是使用TEMP_T1_TO_T2的sm //从这个判断可以看出当电池温度变化范围没有超过阈值还是使用上一个电压进行充电 chr_err([SW_JEITA] Battery Temperature not recovery to normal temperature charging mode yet!!\n); } else { chr_err([SW_JEITA] Battery Normal Temperature between %d and %d !!\n, info-data.temp_t2_thres, info-data.temp_t3_thres); //排除上述两类情况后处于10℃~45℃之间的电池温度都是使用TEMP_T2_TO_T3的sm sw_jeita-sm TEMP_T2_TO_T3; } } else if (info-battery_temp info-data.temp_t1_thres) { //电池处于0℃~10℃之间执行下列if else if ((sw_jeita-sm TEMP_T0_TO_T1 || sw_jeita-sm TEMP_BELOW_T0) (info-battery_temp info-data.temp_t1_thres_plus_x_degree)) { //电池温度刚从0℃以下升上来且小于6℃ if (sw_jeita-sm TEMP_T0_TO_T1) { //如果已经设置了TEMP_T0_TO_T1的sm这里就不做改动 chr_err([SW_JEITA] Battery Temperature between %d and %d !!\n, info-data.temp_t1_thres_plus_x_degree, info-data.temp_t2_thres); } if (sw_jeita-sm TEMP_BELOW_T0) { //如果是刚从-x℃直接升上来不充电 chr_err([SW_JEITA] Battery Temperature between %d and %d,not allow charging yet!!\n, info-data.temp_t1_thres, info-data.temp_t1_thres_plus_x_degree); sw_jeita-charging false; } } else { //电池温度处于6℃~10摄氏度之间sm使用TEMP_T1_TO_T2 chr_err([SW_JEITA] Battery Temperature between %d and %d !!\n, info-data.temp_t1_thres, info-data.temp_t2_thres); sw_jeita-sm TEMP_T1_TO_T2; } } else if (info-battery_temp info-data.temp_t0_thres) { //电池处于0℃~10℃之间执行下列if else if ((sw_jeita-sm TEMP_BELOW_T0) (info-battery_temp info-data.temp_t0_thres_plus_x_degree)) { //这个判断里面就是温度临界值0℃的处理就是从-x℃上升到0摄氏度还是不充电 chr_err([SW_JEITA] Battery Temperature between %d and %d,not allow charging yet!!\n, info-data.temp_t0_thres, info-data.temp_t0_thres_plus_x_degree); sw_jeita-charging false; } else { chr_err([SW_JEITA] Battery Temperature between %d and %d !!\n, info-data.temp_t0_thres, info-data.temp_t1_thres); //这个判断摄氏度大于0摄氏度那么设置TEMP_T0_TO_T1的sm sw_jeita-sm TEMP_T0_TO_T1; } //这部分判断就是要求电池温度稳定在0℃以上才会进行TEMP_T0_TO_T1的sm设置 } else { //电池温度低于0℃停止充电 chr_err([SW_JEITA] Battery below low Temperature(%d) !!\n, info-data.temp_t0_thres); sw_jeita-sm TEMP_BELOW_T0; sw_jeita-charging false; } /** 上述判断的总结 0℃以下不充电 0~6℃ 使用TEMP_T0_TO_T1充电 6~10℃使用TEMP_T1_TO_T2充电 10~45℃ 情况1 刚从10℃上升且温度低于16℃使用TEMP_T1_TO_T2充电 情况1 刚从45℃下降且温度高于39℃使用TEMP_T3_TO_T4充电 其他情况 处于10~45℃使用TEMP_T2_TO_T3充电 45℃~50℃ 情况1 刚从50℃下降且温度高于47℃不充电 其他情况 处于45℃~50℃使用TEMP_T3_TO_T4充电 高于50℃ 停止充电 */ /* set CV after temperature changed */ /* In normal range, we adjust CV dynamically */ //根据sm设置对应充电电压 if (sw_jeita-sm ! TEMP_T2_TO_T3) { if (sw_jeita-sm TEMP_ABOVE_T4) sw_jeita-cv info-data.jeita_temp_above_t4_cv; else if (sw_jeita-sm TEMP_T3_TO_T4) sw_jeita-cv info-data.jeita_temp_t3_to_t4_cv; else if (sw_jeita-sm TEMP_T2_TO_T3) sw_jeita-cv 0; else if (sw_jeita-sm TEMP_T1_TO_T2) sw_jeita-cv info-data.jeita_temp_t1_to_t2_cv; else if (sw_jeita-sm TEMP_T0_TO_T1) sw_jeita-cv info-data.jeita_temp_t0_to_t1_cv; else if (sw_jeita-sm TEMP_BELOW_T0) sw_jeita-cv info-data.jeita_temp_below_t0_cv; else sw_jeita-cv info-data.battery_cv; } else { sw_jeita-cv 0; } chr_err([SW_JEITA]preState:%d newState:%d tmp:%d cv:%d\n, sw_jeita-pre_sm, sw_jeita-sm, info-battery_temp, sw_jeita-cv);}分析总结根据上述代码的分析设置了多段的温度范围最终可以做到低温上升与高温下降电池电压不会立刻修改充电电压会给电池一个适应期等满足适应期跳出条件才会设置在该区间相对应的电池电压。2.4 电池电压的设置与写入//CC充电状态CC充电状态可见之前的充电状态机分析static int mtk_switch_chr_cc(struct charger_manager *info){…swchg_turn_on_charging(info);…}static void swchg_turn_on_charging(struct charger_manager *info){…swchg_select_cv(info);…}static void swchg_select_cv(struct charger_manager *info){…//注意jeita.cv的变量就在这里被传入这个在2.3小节的最后那里会根据sm对cv进行赋值charger_dev_set_constant_voltage(info-chg1_dev, info-sw_jeita.cv);…}
RELATED

相关推荐

容度原理解读:月球矿藏——被“潮汐锁定”封印的46亿年容度记录

容度原理解读:月球矿藏——被“潮汐锁定”封印的46亿年容度记录

容度原理解读:月球矿藏——被“潮汐锁定”封印的46亿年容度记录 一、月球的容度场结构:一个被锁定的自指系统 在容度原理框架下,月球不是一个“岩石球”,而是一个自指闭环被潮汐锁定封印了46亿年的容度场记录器。 月球的容度场…

📅 2026/9/8 7:20:44
如何用Malinois快速预测CRE活性?3分钟上手教程

如何用Malinois快速预测CRE活性?3分钟上手教程

Vert.x安全与认证指南:JWT、OAuth2和SQL认证的完整实现 【免费下载链接】vertx-examples Vert.x examples 项目地址: https://gitcode.com/gh_mirrors/ve/vertx-examples Vert.x作为现代化的响应式应用框架,提供了强大而灵活的安全与认证机制。无…

📅 2026/9/18 10:41:24
3个颠覆性技巧:用QtScrcpy将手机游戏变成PC级体验

3个颠覆性技巧:用QtScrcpy将手机游戏变成PC级体验

3个颠覆性技巧:用QtScrcpy将手机游戏变成PC级体验 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy …

📅 2026/9/14 21:48:43
MORE NEWS

更多资讯

📰

Redis分页查询方案详解:从LRANGE到ZSet游标与SCAN的选型指南

1. Redis分页查询的需求长什么样:先把三种场景分清楚先说个结论:Redis里没有一个类似SELECT ... LIMIT x, y的命令体系,所有分页能力都要靠数据结构的特点自己拼出来。很多同学第一次接到“Redis分页查询”需求时,第一反应是搜命令…

📰

Model-Optimizer:大模型推理落地的工程能力体系

1. “Model-Optimizer”不是工具名,而是工程共识的隐性代号很多人第一次在GitHub issue、内部技术文档或GPU运维群聊里看到“Model-Optimizer”这个词,下意识以为是个开源项目、CLI工具或者某个厂商推出的GUI软件——就像TensorRT、vLLM、ONNX Runtime那…

📰

Univer 表格 SDK 实战:Canvas 渲染与 Facade API 协同开发指南

1. Univer 项目整体设计与思路拆解第一次接触 Univer 是在一个协同表格的需求里。当时团队评估了市面上几个方案,要么是纯前端的表格组件、协同能力得自己从头搭,要么是重型在线文档系统、二次开发成本高得离谱。Univer 出现在视野里的时候,它…

📰

opd02

第二章 RLinf + OpenVLA-OFT 中 OPD 的完整源码机制:Action Token、Teacher Rescoring 与三个 LogProb 1. RLinf 当前 OPD Recipe 的基本结构 1.1 官方示例 RLinf 当前 OPD 文档提供的是: Environment:LIBERO-Spatial; Student:OpenVLA-OFT; Teacher:OpenVLA-OFT; H…

📰

Modbus RTU调试总失败?用串口工具抓包,五分钟定位问题

在CSDN上搜“Modbus调试”,能看到大量求助帖。通信不通、数据不对、时好时坏——问题描述五花八门,但真正有效的排查手段只有一个:抓包看数据。不看数据包就猜问题,等于闭着眼睛修车。这篇文章以Modbus RTU为例,说清楚…

📰

Redis缓存穿透与击穿实战:从CacheClient工具类设计到面试应答

做后端项目,尤其是把黑马点评这种完整商城项目放进简历的同学,大概率都在 Redis 缓存上栽过跟头。缓存穿透、缓存击穿这两个词,面试官几乎必问,理论背得再熟,落到代码层面很多人是懵的。真正把这两个问题落地解决的&am…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬