杰理 SDK 文档中心
首页
首页
  • 项目概览

    • 项目概述与能力地图
    • 构建系统与编译流程
    • 芯片系列与规格
  • 应用示例

    • SPP 与 BLE 双模透传
    • AT 指令串口协议
    • HID 设备应用
    • 蓝牙 Mesh 应用
    • 公共组件与第三方协议
  • 芯片平台支持

    • 外设驱动
    • 电源与充电管理
    • 启动与链接脚本
    • 配置工具与 OTA 资源
  • 协议栈与系统库

    • 蓝牙控制器
    • BTStack 协议栈接口
    • 系统内核与服务
    • OTA 升级机制
  • 文档与参考

    • 蓝牙 AT 协议参考
    • 开发文档与认证信息

电源与充电管理

本文档介绍 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_45673.869V – 4.567V,共 16 档恒压充电截止电压,由 charge_full_V 选择
充满电流CHARGE_FULL_mA_2 … CHARGE_FULL_mA_302mA – 30mA,共 8 档判定充满的电流门限,由 charge_full_mA 选择
充电电流CHARGE_mA_20 … CHARGE_mA_22020mA – 220mA,共 16 档恒流充电电流,由 charge_mA 选择
电流档切换点CHARGE_CCVOL_V300最低充电电流档转向用户设置电流档的电压转换点

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_IN5V 插入check_charge_state() 去抖通过
CHARGE_EVENT_LDO5V_OFF5V 拔出超过 ldo5v_off_filter 过滤时间仍无 5V
CHARGE_EVENT_USB_CHARGE_IN / CHARGE_EVENT_USB_CHARGE_OFFUSB 充电插入/断开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

  1. 应用层处理钩子覆写:app_charge.h 导出的 charge_start_deal/charge_close_deal/charge_err_deal/charge_full_deal/charge_ldo5v_in_deal/charge_ldo5v_off_deal 均可由产品代码重新实现,实现差异化业务(如充电指示灯 PWM 闪烁、充满自动关机、低电量强制充电等);
  2. 事件订阅:任何模块可监听 DEVICE_EVENT_FROM_CHARGE 来源的设备事件,独立响应充电状态(如电量上报、UI 刷新),无需修改驱动;
  3. 动态调流:通过 set_charge_mA() 可在运行期调整充电电流档位,适合温控降额等热管理策略;
  4. 唤醒回调:charge_set_callback()(驱动内部使用)允许电源模块注册唤醒回调,实现"插入即唤醒"的定制;
  5. 设备抽象:charge_dev_ops 将充电器抽象为标准设备,可通过设备框架统一管理(open/close/ioctl 等);
  6. 充电仓联动: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)
Prev
外设驱动
Next
启动与链接脚本