MTK Linux Charger驱动分析(十一)- mtk_charger.c

一、代码分析

两个文档(mtk_charger.h 和 mtk_charger.c)的分析。这些文件是MediaTek(MTK)充电器驱动的头文件和源代码实现,基于Linux内核的电源管理系统(power_supply框架)。代码主要处理电池充电逻辑,包括充电算法、温度保护、JEITA标准、电源路径管理、PD适配器通知等。代码遵循GPL-2.0许可,版权属于MediaTek Inc.(2019年)。

1. 代码整体分析

mtk_charger.h(头文件)
  • 主要内容
    • 定义了常量、宏和枚举:如充电电流阈值(e.g., USB_CHARGER_CURRENT = 500000 uA)、温度阈值(e.g., MAX_CHARGE_TEMP = 50°C)、充电状态(e.g., CHG_VBUS_OV_STATUS)、JEITA状态(e.g., TEMP_BELOW_T0)。
    • 定义了结构体:
      • charger_data:存储充电限制(如输入/充电电流限制、温度范围)。
      • mtk_charger_algorithm:充电算法接口(包括do_algorithm、enable_charging等回调)。
      • charger_custom_data:自定义充电参数(如电池CV电压、JEITA阈值)。
      • mtk_charger:核心结构体,包含设备指针、电源供应描述、充电数据、算法、锁等。
      • 其他如sw_jeita_data(软件JEITA数据)、battery_thermal_protection_data(热保护数据)。
    • 声明了函数:
      • 框架相关:mtk_basic_charger_init, mtk_pulse_charger_init 等初始化算法。
      • 获取电池信息:get_uisoc, get_battery_voltage, get_battery_temperature 等。
      • 充电控制:disable_hw_ovp, get_charger_type, _wake_up_charger 等。
      • 其他:mtk_chg_enable_vbus_ovp(VBUS过压保护)。
  • 作用:提供充电器驱动的接口和数据结构定义,支持多种充电算法(Basic、Pulse)和保护机制(如过压、过温、JEITA)。它不包含实现,仅声明。
mtk_charger.c(源文件)
  • 主要内容
    • 实现了充电器驱动的核心逻辑,包括DT解析、电源供应注册、线程管理、事件处理。
    • 处理充电线程(charger_routine_thread):定期检查电池存在、动态MIVR、JEITA状态、算法执行、安全定时器等。
    • 支持电源供应属性(get/set property):如在线状态、电压、电流、温度。
    • 事件通知:PD适配器事件、充电算法事件、电源变化。
    • 电源路径管理:启用/禁用电源路径,强制禁用用于测试。
    • 探针函数(mtk_charger_probe):初始化驱动、注册电源供应、启动线程。
    • 其他:ATM模式检测、JEITA状态机、VBUS OVP等。
  • 作用:实现充电器驱动的运行时逻辑,与内核集成(使用kthread、alarmtimer、power_supply)。支持单/双充电器配置、HV充电、快充指示等。代码处理异常(如无电池关机)、热保护和算法仲裁。
  • 注意:文件被截断(e.g., "sw_jeita->sm == TEMP_BELOW...(truncated 59250 characters)"),但基于提供的部分,我分析了可见的函数。完整代码可能包含更多实现如charger_dev_event等。

总体上,这是一个模块化的充电器驱动,支持MediaTek平台的电池管理,集成PD、JEITA和自定义算法。

2. 函数的主要作用

以下列出主要函数(从.h和.c中提取),按类别分组。仅列出关键函数,忽略次要或内联函数。作用基于代码逻辑描述。

初始化和配置函数(从mtk_charger_probe调用)
  • mtk_charger_probe:驱动探针函数。解析DT节点,初始化锁、定时器、电源供应(psy1/psy2/psy_dvchg等),注册通知器,启动充电线程。返回0表示成功。
  • mtk_charger_parse_dt:从设备树(DT)解析充电参数(如电流、温度阈值、算法名称)。设置默认值,支持Basic/Pulse算法。
  • mtk_charger_init_timer:初始化alarm定时器,用于充电轮询(默认间隔10s)。
  • mtk_charger_get_atm_mode:从命令行解析ATM(Automated Test Mode)模式,启用/禁用测试功能。
  • mtk_basic_charger_init:初始化基本充电算法(设置回调如do_algorithm、enable_charging)。
  • mtk_pulse_charger_init:初始化脉冲充电算法(类似基本算法,但支持脉冲模式)。
充电控制和状态函数
  • _wake_up_charger:唤醒充电线程(使用wakeup_source防止休眠)。
  • _mtk_enable_charging:启用/禁用充电(调用算法的enable_charging回调)。
  • mtk_charger_start_timer:启动alarm定时器,计算结束时间并设置alarm。
  • check_battery_exist:检查电池是否存在(多次采样,如果不存在则关机,除META/ATE模式)。
  • check_dynamic_mivr:动态调整MIVR(Minimum Input Voltage Regulation)基于VBAT和快充状态。
  • do_sw_jeita_state_machine:软件JEITA状态机,根据电池温度更新状态(e.g., TEMP_ABOVE_T4禁用充电)和CV电压。
  • sw_jeita_cv_update:更新JEITA下的CV电压(基于当前状态)。
  • mtk_chgstat_notify:通知充电异常状态(如VBUS OV、温度异常)。
  • mtk_chg_enable_vbus_ovp:启用/禁用VBUS过压保护(在.h声明,可能在.c实现)。
  • disable_hw_ovp:禁用硬件OVP(Over Voltage Protection)。
  • mtk_charger_enable_power_path:启用/禁用电源路径(Power Path),使用charger_dev_enable_powerpath。
  • mtk_charger_force_disable_power_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值