电源与充电管理
本文档介绍 AC630N(BD29 平台)的电源与充电管理子系统,覆盖内置充电控制器的驱动实现(charge.c)、应用层充电事件处理(app_charge.c)、平台充电参数配置(charge_platform_data)以及充电器插入/拔出/充满/异常的事件流转机制。
Purpose and Scope
本页面聚焦"电源与充电管理"这一芯片平台能力,说明其端到端工作机制:
- 驱动层:
cpu/bd29/charge.c中 5V/充电在线检测、去抖采样、充电启停、唤醒源配置与事件上报; - 平台配置:
struct charge_platform_data及各充电参数档位(充满电压、充满电流、恒流电流)的定义; - 应用层:
apps/spp_and_le/app_charge.c与apps/common/power_manage/app_charge.h中的充电事件分发与处理; - 电源联动:充电状态变化时如何通过
power_set_mode()切换电源工作模式。
以下相关主题属于兄弟页面,不在本页展开:充电仓(TWS 充电盒)管理由 cpu/bd29/chargestore.c / chargestore.h 负责;通用电源状态机与低功耗策略请参见"电源管理(power_manage)"页面;板级充电参数的实际数值由配置工具生成的 charge_v1.lua 提供。
Overview
AC630N(BD29)芯片内置线性充电控制器,支持**恒流(CC)/恒压(CV)**充电流程:充电器插入后,系统通过 LDO5V_DET 与 LVCMP_DET 两个硬件检测信号判断 5V 是否在线;驱动层 charge.c 对检测信号做多次采样去抖后置位充电在线标志,并通过系统事件总线(sys_event_notify)把充电事件上报给应用层;应用层 app_charge.c 根据事件类型调用对应的 charge_*_deal() 处理函数,最终完成充电启动、充满关闭、拔出后切换低功耗模式等动作。
该设计的关键意图:
- 硬件与业务解耦:驱动层只负责检测与上报事件,业务行为(是否启动充电、充满后如何处理、拔出后进入何种电源模式)全部由应用层决定,便于不同产品复用同一驱动;
- 软件去抖:充电器插入瞬间信号不稳定,驱动层通过连续 20 次采样、超过 5 次命中才判定在线,避免误触发;
- 可配置充电参数:充满电压、充电电流等参数全部收敛到
charge_platform_data,由配置工具(Lua 脚本)生成,无需改动驱动代码即可适配不同电池。
Architecture
下图展示充电管理子系统的分层结构与数据流:
flowchart TD
subgraph sg_HW["硬件层 (BD29/AC630N)"]
LDO5V["LDO5V_DET 检测信号"]
LVCMP["LVCMP_DET 检测信号"]
CHG["内置充电控制器"]
end
subgraph sg_DRV["驱动层 (cpu/bd29/charge.c)"]
CHARGE_VAR["CHARGE_VAR 全局状态"]
CHECK["check_charge_state() 去抖采样"]
START["charge_start()"]
CLOSE["charge_close()"]
EVENT["charge_event_to_user()"]
end
subgraph sg_APP["应用层 (app_charge.c)"]
HANDLER["app_charge_event_handler()"]
DEAL["charge_*_deal() 系列"]
POWER["power_set_mode()"]
end
subgraph sg_CFG["配置层"]
CFG["charge_platform_data 平台数据"]
end
LDO5V --> CHECK
LVCMP --> CHECK
CHECK --> CHARGE_VAR
CHARGE_VAR --> EVENT
EVENT -->|"sys_event_notify(SYS_DEVICE_EVENT)"| HANDLER
HANDLER --> DEAL
DEAL --> START
DEAL --> CLOSE
START --> CHG
CLOSE --> CHG
DEAL --> POWER
CFG --> CHARGE_VAR
各层职责说明:
- 硬件层:提供两个充电在线检测信号。
LDO5V_DET_GET()判断 LDO5V 是否在线,LVCMP_DET_GET()判断低电压比较器输出;内置充电控制器负责实际恒流/恒压充电; - 驱动层:
CHARGE_VAR保存充电在线标志、初始化状态与两个软件定时器(ldo5v_timer、charge_timer);check_charge_state()负责采样去抖;charge_start()/charge_close()控制充电启停;charge_event_to_user()把事件封装为SYS_DEVICE_EVENT(DEVICE_EVENT_FROM_CHARGE)投递到系统事件总线; - 应用层:
app_charge_event_handler()作为设备事件回调完成事件分发,charge_*_deal()实现各事件的业务动作(如充电启动时切到PWR_LDO15模式、充满时调用charge_close()、拔出时切回TCFG_LOWPOWER_POWER_SEL低功耗模式); - 配置层:
struct charge_platform_data通过CHARGE_PLATFORM_DATA_BEGIN/END宏实例化,字段包括充电使能、开机充电使能、充满电压/电流、充电电流、LDO5V 下拉电阻与拔出过滤值,最终由板级配置(charge_v1.lua)决定。
驱动层实现(cpu/bd29/charge.c)
驱动层是充电管理的核心,采用单例全局变量 + 定时器轮询的结构。模块状态集中保存在 CHARGE_VAR 中:
typedef struct _CHARGE_VAR {
struct charge_platform_data *data;
volatile u8 charge_online_flag;
volatile u8 init_ok;
volatile int ldo5v_timer;
volatile int charge_timer;
} CHARGE_VAR;
#define __this (&charge_var)
static CHARGE_VAR charge_var;
Source: cpu/bd29/charge.c
charge_online_flag 是模块的核心状态位,data 指针指向平台充电参数;ldo5v_timer 与 charge_timer 是软件定时器句柄,分别用于 5V 拔出过滤与充电过程定时。将状态收敛到单例结构并用 volatile 修饰,是为了保证在中断/定时器回调与应用上下文中都能读到一致的状态。
充电在线检测与去抖
充电器插入时 5V 信号可能存在抖动,驱动层采用多次采样投票算法:
static u8 check_charge_state(void)
{
u8 online_cnt = 0;
u8 i = 0;
__this->charge_online_flag = 0;
for (i = 0; i < 20; i++) {
if (LVCMP_DET_GET() || LDO5V_DET_GET()) {
online_cnt++;
}
udelay(1000);
}
log_info("online_cnt = %d\n", online_cnt);
if (online_cnt > 5) {
__this->charge_online_flag = 1;
}
return __this->charge_online_flag;
}
Source: cpu/bd29/charge.c
算法要点:在约 20ms 窗口内以 1ms 间隔采样 20 次,只要 LVCMP_DET_GET() 或 LDO5V_DET_GET() 任一命中,计数加一;命中次数超过 5 次才判定"充电在线"。这一"或"逻辑说明 5V 检测与低电压比较器互为冗余,而多数投票机制则过滤了接触不良导致的瞬时抖动。udelay() 由 JL_TIMER0 硬件定时器实现微秒级精确延时:
static void udelay(u32 usec)
{
JL_TIMER0->CON = BIT(14);
JL_TIMER0->CNT = 0;
JL_TIMER0->PRD = clk_get("timer") / 1000000L * usec; //1us
JL_TIMER0->CON = BIT(0) | BIT(3); //sys clk
while ((JL_TIMER0->CON & BIT(15)) == 0);
JL_TIMER0->CON = BIT(14);
}
Source: cpu/bd29/charge.c
事件上报机制
驱动层不直接调用应用代码,而是把充电事件封装成系统设备事件投递到事件总线,实现与应用的解耦:
void charge_event_to_user(u8 event)
{
struct sys_event e;
e.type = SYS_DEVICE_EVENT;
e.arg = (void *)DEVICE_EVENT_FROM_CHARGE;
e.u.dev.event = event;
e.u.dev.value = 0;
sys_event_notify(&e);
}
Source: cpu/bd29/charge.c
事件通过 sys_event_notify() 广播,arg 标记来源为 DEVICE_EVENT_FROM_CHARGE,event 字段携带具体充电事件(见事件枚举)。应用层只需注册对应来源的设备事件回调即可收到通知,驱动层完全不知道上层是谁、如何响应——这是典型的"事件驱动 + 回调解耦"设计。
充电唤醒源配置
充电器插入需要能把系统从低功耗/关机状态唤醒,驱动层通过寄存器配置唤醒源:
static void set_charge_wkup_source(u8 source)
{
CHARGE_WKUP_EDGE_SEL(0); //0:上升沿,高电平 1:下降沿,低电平
CHARGE_WKUP_SOURCE_SEL(source);
CHARGE_EDGE_DETECT_EN(1);
CHARGE_LEVEL_DETECT_EN(1);
CHARGE_WKUP_EN(1);
CHARGE_WKUP_PND_CLR();
}
Source: cpu/bd29/charge.c
该函数同时使能边沿检测与电平检测并清 pending 标志,保证充电器插入产生的**上升沿(高电平)**能够触发唤醒;charge_set_callback() 向电源模块注册唤醒回调,charge_check_and_set_pinr() 则用于根据当前充电状态决定唤醒引脚配置(pinr)。
充电启停
charge_start() 在启动充电前会先删除残留的 charge_timer,避免重复启动造成定时器泄漏;charge_close() 与之对应地停止充电并清理相关定时器。两者都通过 usr_timer 软件定时器机制驱动后续的周期检测(如充满判定、拔出过滤)。
平台数据结构与充电参数配置
charge_platform_data
所有充电行为参数收敛在 struct charge_platform_data 中,由板级配置提供:
struct charge_platform_data {
u8 charge_en; //内置充电使能
u8 charge_poweron_en; //开机充电使能
u8 charge_full_V; //充满电电压大小
u8 charge_full_mA; //充满电电流大小
u8 charge_mA; //充电电流大小
u8 ldo5v_pulldown_en; //ldo5v的100K下拉电阻使能,若充电舱需要更大的负载才能检测到插入时,请将该变量置1
u16 ldo5v_off_filter; //ldo5v拔出过滤值,过滤时间 = (filter*2 + 20)ms,ldoin<0.6V且时间大于过滤时间才认为拔出
};
#define CHARGE_PLATFORM_DATA_BEGIN(data) \
struct charge_platform_data data = {
#define CHARGE_PLATFORM_DATA_END() \
};
Source: include_lib/driver/cpu/bd29/asm/charge.h
字段设计意图:
charge_en/charge_poweron_en:区分"是否允许充电"与"是否允许开机充电"两个独立策略;charge_full_V、charge_full_mA、charge_mA:分别配置恒压截止电压、充满判定电流、恒流充电电流,均以枚举档位给出(见下表);ldo5v_pulldown_en:使能 LDO5V 的 100K 下拉电阻,针对充电舱(充电盒)需要更大负载才能被系统检测到插入的场景;ldo5v_off_filter:拔出过滤值,过滤时间 = (filter × 2 + 20)ms。对充满后直接从 5V 掉到 0V 的充电仓必须置 0;对充满后先掉到 0V 再升压到 xV 的充电仓,需按实际情况设置,避免误判拔出。
充电参数档位
| 参数类别 | 档位宏 | 取值范围 | 说明 |
|---|---|---|---|
| 充满电压 | CHARGE_FULL_V_3869 … CHARGE_FULL_V_4567 | 3.869V – 4.567V,共 16 档 | 恒压充电截止电压,由 charge_full_V 选择 |
| 充满电流 | CHARGE_FULL_mA_2 … CHARGE_FULL_mA_30 | 2mA – 30mA,共 8 档 | 判定充满的电流门限,由 charge_full_mA 选择 |
| 充电电流 | CHARGE_mA_20 … CHARGE_mA_220 | 20mA – 220mA,共 16 档 | 恒流充电电流,由 charge_mA 选择 |
| 电流档切换点 | CHARGE_CCVOL_V | 300 | 最低充电电流档转向用户设置电流档的电压转换点 |
Source: include_lib/driver/cpu/bd29/asm/charge.h
CHARGE_CCVOL_V = 300 的语义值得注意:AC693X/AC630N 系列没有涓流充电,当电池电压过低时驱动层自动采用最低电流档充电,待电池电压升到该转换点后才切换到用户设置的 charge_mA 档位,从而等效实现"预充电 → 恒流"的安全充电曲线,避免低压大电流损坏电池。
板级配置的实际数值由配置工具生成,来源文件为 cpu/bd29/tools/AC630N_config_tool/conf/source/board/charge_v1.lua(以及 board_common 下的同名模板),运行时填充进 charge_platform_data 并通过 charge_api_init() 初始化驱动。
应用层事件处理(app_charge)
应用层代码整体受编译开关 TCFG_CHARGE_ENABLE 控制,未使能充电时整段逻辑不编译。其入口是设备事件回调 app_charge_event_handler():
int app_charge_event_handler(struct device_event *dev)
{
switch (dev->event) {
case CHARGE_EVENT_CHARGE_START:
charge_start_deal();
break;
case CHARGE_EVENT_CHARGE_CLOSE:
charge_close_deal();
break;
case CHARGE_EVENT_CHARGE_ERR:
charge_err_deal();
break;
case CHARGE_EVENT_CHARGE_FULL:
charge_full_deal();
break;
case CHARGE_EVENT_LDO5V_IN:
charge_ldo5v_in_deal();
break;
case CHARGE_EVENT_LDO5V_OFF:
charge_ldo5v_off_deal();
break;
default:
break;
}
return 0;
}
Source: apps/spp_and_le/app_charge.c
各 charge_*_deal() 处理函数体现了应用层的业务决策(均可被产品层覆写):
void charge_start_deal(void)
{
log_info("%s\n", __func__);
power_set_mode(PWR_LDO15);
}
void charge_full_deal(void)
{
log_info("%s\n", __func__);
charge_close();
}
void charge_ldo5v_in_deal(void)
{
log_info("%s\n", __func__);
charge_start();
}
void charge_ldo5v_off_deal(void)
{
log_info("%s\n", __func__);
charge_close();
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
}
Source: apps/spp_and_le/app_charge.c
关键业务动作与设计意图:
- 5V 插入 →
charge_ldo5v_in_deal():调用charge_start()开始充电,但不主动切换电源模式——此时系统仍可能处于低功耗,插入事件本身已通过唤醒源把系统拉起; - 充电开始 →
charge_start_deal():显式调用power_set_mode(PWR_LDO15)切换到 LDO15 供电模式,保证充电过程有稳定供电拓扑; - 充满 →
charge_full_deal():直接charge_close()停止充电,防止过充; - 5V 拔出 →
charge_ldo5v_off_deal():先charge_close()停止充电,再power_set_mode(TCFG_LOWPOWER_POWER_SEL)回到低功耗模式,实现拔电即休眠的低功耗目标; - 充电异常 →
charge_err_deal():默认仅记录日志,具体异常处理策略(如指示灯提示、复位等)由产品层扩展。
app_charge.h 同时暴露了 get_charge_full_flag() 供其他模块查询"是否已充满",以及上述六个处理函数,构成应用层充电业务的对外契约。
核心流程(Core Flow)
以下时序图展示充电器插入、充满、拔出的完整事件流转:
sequenceDiagram
participant HW as 硬件检测(LDO5V/LVCMP)
participant DRV as 驱动层 charge.c
participant SYS as 系统事件总线
participant APP as app_charge.c
participant PWR as 电源模块 power
HW->>DRV: 检测到5V插入 (LDO5V_DET_GET)
DRV->>DRV: check_charge_state() 20次采样去抖
DRV->>SYS: CHARGE_EVENT_LDO5V_IN
SYS->>APP: app_charge_event_handler(dev)
APP->>APP: charge_ldo5v_in_deal()
APP->>DRV: charge_start()
DRV->>HW: 配置电流/电压档位并启动充电
HW->>DRV: 充满标志 (CHARGE_FULL_33V)
DRV->>SYS: CHARGE_EVENT_CHARGE_FULL
SYS->>APP: app_charge_event_handler(dev)
APP->>DRV: charge_close()
HW->>DRV: 5V拔出 (超过 ldo5v_off_filter 过滤时间)
DRV->>SYS: CHARGE_EVENT_LDO5V_OFF
SYS->>APP: app_charge_event_handler(dev)
APP->>APP: charge_ldo5v_off_deal()
APP->>PWR: power_set_mode(TCFG_LOWPOWER_POWER_SEL)
完整闭环总结:硬件检测 → 驱动去抖 → 事件总线广播 → 应用分发 → 业务处理 → 电源模式切换。整个链路中驱动层不感知业务,应用层不直接操作寄存器,层间只通过事件与 power_set_mode() 交互,便于替换应用策略或复用驱动。
充电状态机
充电子系统的运行状态可归纳为以下状态机:
stateDiagram-v2
[*] --> Idle: 无5V在线
Idle --> Charging: CHARGE_EVENT_LDO5V_IN
Charging --> Full: CHARGE_EVENT_CHARGE_FULL
Charging --> Error: CHARGE_EVENT_CHARGE_ERR
Charging --> Idle: CHARGE_EVENT_LDO5V_OFF
Full --> Idle: CHARGE_EVENT_LDO5V_OFF
Error --> Idle: CHARGE_EVENT_LDO5V_OFF
Idle --> Idle: CHARGE_EVENT_LDO5V_IN 去抖失败
说明:
- Idle(空闲):无 5V 在线,系统处于低功耗模式(
TCFG_LOWPOWER_POWER_SEL)。此状态下即使收到插入信号,若check_charge_state()去抖未通过(命中 ≤ 5 次),仍停留在 Idle,避免误触发; - Charging(充电中):
charge_start()已启动,供电模式切到PWR_LDO15。内部还包含"低压最低电流档 → 用户电流档"的电流档切换(由CHARGE_CCVOL_V触发),属于充电中状态的子过程; - Full(充满):收到
CHARGE_EVENT_CHARGE_FULL后应用层立即charge_close(),进入不充电但 5V 仍在线的状态;可查询get_charge_full_flag(); - Error(异常):收到
CHARGE_EVENT_CHARGE_ERR,默认仅记录日志,等待 5V 拔出后回到 Idle 复位。
API Reference
驱动层(asm/charge.h 声明,cpu/bd29/charge.c 实现)
void charge_start(void)
启动充电:删除残留 charge_timer、配置充电参数并使能充电控制器。适用于"5V 插入/重新充电"场景。
void charge_close(void)
停止充电并清理充电相关定时器。充满、拔出、异常关闭时都会调用。
u8 get_charge_online_flag(void) / void set_charge_online_flag(u8 flag)
读取/设置充电在线标志。set_charge_online_flag 供外部(如低功耗恢复流程)强制校正在线状态。
u8 get_charge_poweron_en(void)
返回平台数据中的"开机充电使能"位。
u8 get_charge_mA_config(void) / void set_charge_mA(u8 charge_mA)
读取/动态设置当前充电电流档位(CHARGE_mA_* 枚举)。动态调流可用于温度降额等场景。
u8 get_ldo5v_online_hw(void) / u8 get_lvcmp_det(void) / u8 get_ldo5v_pulldown_en(void)
分别读取 LDO5V 在线硬件信号、低电压比较器输出、LDO5V 下拉电阻使能位。
void charge_check_and_set_pinr(u8 mode)
根据充电状态设置唤醒引脚(pinr)配置,保证充电器插入能在低功耗下唤醒系统。
int charge_api_init(void *arg)
驱动初始化入口,接收 charge_platform_data 并初始化全局状态、注册事件来源与唤醒回调。
const struct device_operations charge_dev_ops
将充电器抽象为设备(device)操作集,可通过设备框架统一访问。
应用层(app_charge.h / app_charge.c)
int app_charge_event_handler(struct device_event *dev)
- 参数:
dev— 设备事件,dev->event为充电事件枚举(CHARGE_EVENT_CHARGE_START/CHARGE_EVENT_CHARGE_CLOSE/CHARGE_EVENT_CHARGE_FULL/CHARGE_EVENT_CHARGE_ERR/CHARGE_EVENT_LDO5V_IN/CHARGE_EVENT_LDO5V_OFF/CHARGE_EVENT_USB_CHARGE_IN/CHARGE_EVENT_USB_CHARGE_OFF); - 返回:固定 0,事件分发不产生错误传播;
- 行为:按事件类型分发到对应
charge_*_deal()处理函数。
charge_start_deal() / charge_close_deal() / charge_err_deal() / charge_full_deal() / charge_ldo5v_in_deal() / charge_ldo5v_off_deal()
六个可覆写的业务处理钩子,构成应用层充电策略的扩展点(详见"扩展点"一节)。
u8 get_charge_full_flag(void)
返回充满标志,供 UI(指示灯)、状态上报等模块查询。
事件枚举(asm/charge.h)
| 事件 | 含义 | 触发条件 |
|---|---|---|
CHARGE_EVENT_CHARGE_START | 充电开始 | charge_start() 成功启动充电 |
CHARGE_EVENT_CHARGE_CLOSE | 充电关闭 | charge_close() 执行 |
CHARGE_EVENT_CHARGE_FULL | 已充满 | 充满标志 CHARGE_FULL_33V 置位 |
CHARGE_EVENT_CHARGE_ERR | 充电异常 | 充电控制器报错 |
CHARGE_EVENT_LDO5V_IN | 5V 插入 | check_charge_state() 去抖通过 |
CHARGE_EVENT_LDO5V_OFF | 5V 拔出 | 超过 ldo5v_off_filter 过滤时间仍无 5V |
CHARGE_EVENT_USB_CHARGE_IN / CHARGE_EVENT_USB_CHARGE_OFF | USB 充电插入/断开 | USB 枚举状态变化 |
状态标志枚举(asm/charge.h)
CHARGE_FULL_33V(充满标记位)、TERMA_33V、VBGOK_33V(模拟测试信号)、CICHARGE_33V(涓流转恒流信号)——后三者主要用于产线/芯片测试,驱动正常运行时关注 CHARGE_FULL_33V 即可。
Failure Modes、边界情况与并发
充电器误插入(抖动)
插入瞬间 5V 信号不稳定,check_charge_state() 用 20 次采样 + 命中 > 5 次的多数投票过滤,未通过则 charge_online_flag 保持 0,不产生 CHARGE_EVENT_LDO5V_IN,系统继续停留在低功耗状态。这是对"误唤醒"的第一道防线。
5V 拔出误判与充电仓特性
拔出检测依赖 ldo5v_off_filter,过滤时间 = (filter × 2 + 20)ms,且要求 ldoin < 0.6V 持续超过该时间才判定拔出。不同充电仓拓扑需要不同的过滤值:
- 充满后直接从 5V 掉到 0V 的充电仓:
ldo5v_off_filter必须置 0,否则拔出判定被延迟; - 充满后先掉到 0V 再升压回 xV 的充电仓:需按实际时序设置过滤值,防止掉电瞬间被误判为拔出而关闭充电。
若充电仓负载过轻导致系统检测不到插入,需使能 ldo5v_pulldown_en(100K 下拉电阻)以增大检测负载。
低电压电池的充电安全
AC630N 无涓流充电。当电池电压低于 CHARGE_CCVOL_V(300,即最低档切换电压点)时,驱动自动采用最低充电电流档(CHARGE_mA_20)充电,电压升高后才切换到用户配置的 charge_mA 档位。这等效实现了"预充电 → 恒流"流程,避免对深度放电电池直接大电流充电。
充满后过充防护
charge_full_deal() 在收到充满事件后立即调用 charge_close();同时 charge_full_V/charge_full_mA 提供 16 档截止电压与 8 档截止电流,硬件恒压(CV)阶段按电压收敛、软件按电流门限判定充满,形成双重防护。
并发与状态一致性
CHARGE_VAR 中的状态字段均声明为 volatile,充电在线标志可被中断上下文(唤醒回调、定时器回调)与应用上下文同时访问,volatile 保证读取不被编译器优化缓存。charge_start() 先删除旧 charge_timer 再启动,避免重复进入导致的定时器句柄泄漏;set_charge_online_flag() 提供外部校正入口,用于低功耗恢复等场景下强制同步在线状态。
异常处理缺口
charge_err_deal() 默认仅打印日志,无自动恢复动作。产品若需在充电异常时复位充电控制器或提示用户,必须覆写该钩子——这是当前实现的已知边界。
Performance 与运维注意
- 轮询开销:
check_charge_state()单次执行约 20ms(20 × 1ms 延时),仅在充电器插入事件触发时执行,不常驻轮询,对系统负载影响可忽略; - 软件定时器:
ldo5v_timer、charge_timer基于usr_timer,充电期间需要保持定时器服务(tick)运行,低功耗模式下依赖插入唤醒源(set_charge_wkup_source配置的边沿+电平检测)把系统拉起; - 电源模式切换:充电开始切
PWR_LDO15、拔出切回TCFG_LOWPOWER_POWER_SEL的策略直接影响待机电流;定制产品时应确保TCFG_LOWPOWER_POWER_SEL与硬件供电拓扑匹配; - 日志:驱动与应用层均开启
LOG_INFO_ENABLE/LOG_DEBUG_ENABLE(LOG_TAG "[CHARGE]"/"[APP_CHARGE]"),可通过日志关键字online_cnt、charge_快速定位充电链路问题; - 配置工具:
charge_v1.lua位于配置工具目录(board与board_common两份,分别对应具体板级与公共模板),改参数后需重新生成并烧录配置,驱动代码无需改动。
Extension Points
- 应用层处理钩子覆写:
app_charge.h导出的charge_start_deal/charge_close_deal/charge_err_deal/charge_full_deal/charge_ldo5v_in_deal/charge_ldo5v_off_deal均可由产品代码重新实现,实现差异化业务(如充电指示灯 PWM 闪烁、充满自动关机、低电量强制充电等); - 事件订阅:任何模块可监听
DEVICE_EVENT_FROM_CHARGE来源的设备事件,独立响应充电状态(如电量上报、UI 刷新),无需修改驱动; - 动态调流:通过
set_charge_mA()可在运行期调整充电电流档位,适合温控降额等热管理策略; - 唤醒回调:
charge_set_callback()(驱动内部使用)允许电源模块注册唤醒回调,实现"插入即唤醒"的定制; - 设备抽象:
charge_dev_ops将充电器抽象为标准设备,可通过设备框架统一管理(open/close/ioctl 等); - 充电仓联动:TWS 充电仓场景由
chargestore.c/chargestore.h(cpu/bd29/目录)在充电管理之上实现仓体状态机,本页不展开,详见充电仓管理相关文档。
Related Links
- charge.c 驱动实现(充电检测/去抖/启停/唤醒/事件上报)
- charge.h 驱动头文件(参数档位、平台数据结构、事件/API 声明)
- app_charge.c 应用层实现(充电事件分发与业务处理)
- app_charge.h 应用层接口(应用层处理钩子声明)
- chargestore.c 充电仓驱动(TWS 充电仓管理,兄弟主题)
- charge_v1.lua 板级充电配置(充电参数实际取值来源)
- 相关兄弟页面:电源管理(power_manage)、充电仓管理(chargestore)