RK3399充电管理

您所在的位置:网站首页 电池电量分析 RK3399充电管理

RK3399充电管理

2023-08-21 04:28| 来源: 网络整理| 查看: 265

platform:RK3399 OS:Android 7.1 1. 概述

本文档简要介绍基于RK3399实现充电管理相关部分,主要包括Typec充电和uboot关机充电两大部分。主要实现普通充电、PD充电、关机充电、电量上报、过放及低电保护等功能。

2. Typec正常充电

typec充电需要fusb302+bq25700+cw2015配合使用才可以正常使用各项功能.驱动已经调试和验证过,所以调试难度不大,只要保证硬件正常,供电和通信正常,一般都能跑起来。这一部分所要做的是按照需求或问题进行适当的调整驱动即可。

2.1 fusb302 驱动移植

Fusb302是可编程的USB Type-C控制器,支持识别各种USB 设备和对应的状态;且支持最高100W的PD协议。

驱动目录:kernel/drivers/mfd/fusb302.c

驱动不需要修改,主要是 配置dts。

fusb0: fusb30x@22 { compatible = "fairchild,fusb302"; reg = ; pinctrl-names = "default"; pinctrl-0 = ; int-n-gpios = ; //中断引脚 vbus-5v-gpios = ; //vbus引脚 charge-dev = ; //使用的充电IC //discharge-gpios = ; support-uboot-charge = ; //支持uboot关机充电 port-num = ; //使用的usb控制器,关机充电时需要 status = "okay"; };

添加dts之后一般驱动就可以正常工作了。如果驱动无法正常工作,主要从硬件方面来分析:

在这里插入图片描述

参考原理图和数据手册,检查fusb302各个电源是否供电正常。

重点检查中断引脚INT_N和两个CC脚插入和拔出Tpyec时电压状态是否正常

a) 插入Type-C 两个CC脚电压分别为0.4V/0V,哪个CC脚电压为0.4V和插入方向有关。

b) 插入充电器 两个CC脚电压分别为1.6V/0V,哪个CC脚电压为1.6V和插入方向有关。

c) 未插入Typec时 CC脚在0.8V~1.1V之间跳变

主板到充电板的连接线问题,导致信号质量差

Fusb302物料问题

2.2 bq25700 驱动移植

Bq25700是升降压充电管理IC,支持3.5V~24V的输入电压,4.48V~20.8V的输出电压。还支持PD充电和OTG功能。

驱动目录:kernel/drivers/power/bq25700_charger.c

Bq25700的驱动也几乎不用修改,主要配置DTS

bq25700: bq25700@09 { compatible = "ti,bq25700"; reg = ; extcon = ; //外部连接器 interrupt-parent = ; interrupts = ; pinctrl-names = "default"; pinctrl-0 = ; ti,charge-current = ; //充电电流2.5A,单位uA,下同 ti,max-input-voltage = ; //最大输入电压20V,单位uV,下同 ti,max-input-current = ; ti,max-charge-voltage = ; //电池满电电压 ti,input-current = ; ti,input-current-sdp = ; //sdp模式输入电流500mA ti,input-current-dcp = ; //dcp模式输入电流3A ti,input-current-cdp = ; //cdp模式输入电流1.5A ti,minimum-sys-voltage = ; //最小系统电压 ti,otg-voltage = ; //OTG电压电流5V,0.5A ti,otg-current = ; otg-mode-en-gpios = ; pd-charge-only = ; //是否只支持PD充电 typec0-discharge-gpios = ; //typec0-enable-gpios = ; };

一般根据实际需求配置好dts之后,驱动就可以正常工作了。特别注意的是bq25700的驱动寄存器映射存在一些问题,已经发现的问题有两处:

电池电压寄存器映射 @@ -263,7 +267,7 @@ static const struct reg_field bq25700_reg_fields[] = { [OUTPUT_CMPIN_VOL] = REG_FIELD(0x25, 0, 7), /*REG26H*/ [OUTPUT_SYS_VOL] = REG_FIELD(0x26, 8, 15), - [OUTPUT_BAT_VOL] = REG_FIELD(0x26, 0, 6), + [OUTPUT_BAT_VOL] = REG_FIELD(0x26, 0, 7),//modified by letcos@20190726 /*REG30*/ [EN_IBAT] = REG_FIELD(0x30, 15, 15), 充电电流和放电电流寄存器映射 @@ -258,8 +258,8 @@ static const struct reg_field bq25700_reg_fields[] = { [OUTPUT_INPUT_VOL] = REG_FIELD(0x23, 8, 15), [OUTPUT_SYS_POWER] = REG_FIELD(0x23, 0, 7), /*REG24H*/ - [OUTPUT_DSG_CUR] = REG_FIELD(0x24, 8, 14), - [OUTPUT_CHG_CUR] = REG_FIELD(0x24, 0, 6), + [OUTPUT_CHG_CUR] = REG_FIELD(0x24, 8, 14), + [OUTPUT_DSG_CUR] = REG_FIELD(0x24, 0, 6), /*REG25H*/ [OUTPUT_INPUT_CUR] = REG_FIELD(0x25, 8, 15), [OUTPUT_CMPIN_VOL] = REG_FIELD(0x25, 0, 7),

在调试过程中除了分析硬件之外,可以重点核对一下异常数值的寄存器映射是否正常。

2.3 cw2015驱动移植

CW2015是低功耗电量计IC,具有电量统计,充放电时间估计,低电预警等功能。

驱动目录:kernel/drivers/power/cw2015_battery.c

驱动不用修改,直接配置dts即可。

cw2015@62 { status = "okay"; compatible = "cw201x"; reg = ; bat_config_info = ; monitor_sec = ; //电量查询时间间隔,3S virtual_power = ; //是否有电池 divider_res1 = ; //分压电阻大小 divider_res2 = ; };

需要注意以下几点:

Bat_config_info 是电池的特性信息。需要向电量计厂商CellWise提测试申请,将电池寄过去给他们,他们会给出bat_config_info。时间大概10个工作日。不同厂家的不同型号的电池bat_config_info不同,更换电池 型号需要重新申请测试。

由于电量计的cell引脚只能测量一串锂电池的电压,所有如果使用多串锂电池需要使用分压电阻,分压电阻信息需要在dts中配置(divider_res)

2.4 充电相关配置

1.支持普通充电

修改bq25700 dts

pd-charge-only = ; //将值设置为0即支持普通充电

2.修改普通充电电流

修改 bq25700dts

- ti,input-current-dcp = ; - ti,input-current-cdp = ; + ti,input-current-dcp = ; //dcp由0.5A改为3A + ti,input-current-cdp = ; //cdp由0.5A改为1.5A

3.更改锂电池(串数和并数) 在这里插入图片描述

a) 按实际情况修改bq25700 CELL_BATPERSZ引脚上的电阻,具体参考原理图上给出的表格

在这里插入图片描述

b) 修改cw2015 CELL引脚上的分压电阻,使得CELL引脚测量的电压范围始终是一串电池的电压范围。

c) 修改cw2015和bq25700的dts

3. U-boot关机充电

关机充电是关机情况下,仅仅启动uboot实现充电及充电动画显示,而不启动内核,进入系统的功能。

3.1 关机充电流程

在这里插入图片描述

在board_late_init()中,会注册并初始化fusb302,bq25700以及cw2015的驱动。初始化完成之后,机器人就已经开始正常充电了。

紧接着会在board_fbt_preboot()函数中对电量、是否充电、是否启用关机充电功能进行检测,满足一定条件就会进入关机充电do_charge()函数。

do_charge()是一个while循环,会一直检测是否满足充电条件,是否有按键事件并显示充电动画。

当满足退出条件时,do_charge()会退出循环,根据状态直接关机或者启动内核(cmd_bootrk)。

3.2 主要代码目录

在这里插入图片描述

3.3 功能配置 3.3.1 DTS配置

uboot-charge功能支持

uboot-charge { compatible = "rockchip,uboot-charge"; rockchip,uboot-charge-on = ; //支持uboot充电 rockchip,android-charge-on = ; max-input-voltage = ; //最大输入电压12V,单位mV max-input-current = ; //最大输入电流3A,单位mA rockchip,uboot-low-power-level = ; //低电电量,低于该电量无法开机 rockchip,uboot-exit-charge-level = ; //退出关机充电的电量,这里100表示不自动退出关机充电 rockchip,uboot-exit-charge-voltage= ; //退出关机充电时的电压 rockchip,uboot-charge-brightness = ; //是否启用关机充电动画 status = "okay"; };

驱动对uboot-charge支持(主要是fusb302)

fusb0: fusb30x@22 { ... support-uboot-charge = ; //支持关机充电 port-num = ; //usb控制器编号 }; 3.3.2 功能及阈值配置

主要文件:include/configs/rk33plat.h

#define CONFIG_UBOOT_CHARGE //打开uboot-charge 功能 //亮屏电压,高于这个电压才会亮屏并显示动画。 //单位mV,多串电池需要换算成一串电池的电压 #define CONFIG_SCREEN_ON_VOL_THRESD 3000 //系统启动电压。低于该电压,就不会从uboot进入kernel,系统不会启动。 //单位mV,多串电池需要换算成一串电池的电压 #define CONFIG_SYSTEM_ON_VOL_THRESD 3447 3.3.3 充电动画资源

目录结构:

. ├── charge_anim_desc.txt //充电动画配置文件 └── images ├── battery_0.bmp //0~100对应的图标 ├── battery_1.bmp ├── battery_2.bmp ├── battery_3.bmp ├── battery_4.bmp ├── battery_5.bmp └── battery_fail.bmp //低电图标

如果需要更换不同的图标,只需要将UI制作的图标替换images目录下图标即可。

下面是对图片的一些建议要求:

1.必须是bmp图片 2.图片分辨率必须为偶数 3.位深8bit 4.图片大小尽量小,


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3