RK3399充电管理

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 = <0x22>;
pinctrl-names = "default";
pinctrl-0 = <&fusb0_int>;
int-n-gpios = <&gpio3 16 GPIO_ACTIVE_HIGH>;                  //中断引脚
vbus-5v-gpios = <&gpio4 26 GPIO_ACTIVE_HIGH>;              //vbus引脚
charge-dev = <&bq25700>;                                 //使用的充电IC
//discharge-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;
support-uboot-charge = <1>;                         //支持uboot关机充电
port-num = <0>;                        //使用的usb控制器,关机充电时需要
status = "okay";
        };

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

RK3399充电管理_第1张图片

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

  2. 重点检查中断引脚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之间跳变

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

  4. 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 = <0x09>;
    extcon = <&fusb0>;                               //外部连接器
    interrupt-parent = <&gpio1>;
    interrupts = <22 IRQ_TYPE_LEVEL_LOW>;
    pinctrl-names = "default";
    pinctrl-0 = <&charger_ok>;
    ti,charge-current = <2500000>;             //充电电流2.5A,单位uA,下同
    ti,max-input-voltage = <20000000>;      //最大输入电压20V,单位uV,下同
    ti,max-input-current = <3000000>;
    ti,max-charge-voltage = <8400000>;      //电池满电电压
    ti,input-current = <500000>;
    ti,input-current-sdp = <500000>;           //sdp模式输入电流500mA
    ti,input-current-dcp = <3000000>;          //dcp模式输入电流3A
    ti,input-current-cdp = <1500000>;          //cdp模式输入电流1.5A
    ti,minimum-sys-voltage = <6500000>;      //最小系统电压
    ti,otg-voltage = <5000000>;                //OTG电压电流5V,0.5A
    ti,otg-current = <500000>;
    otg-mode-en-gpios = <&gpio4 RK_PC7 GPIO_ACTIVE_HIGH>;
    pd-charge-only = <0>;                       //是否只支持PD充电
    typec0-discharge-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;
    //typec0-enable-gpios = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
};

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

  1. 电池电压寄存器映射
@@ -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),
  1. 充电电流和放电电流寄存器映射
@@ -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 = <0x62>;
                bat_config_info = <0x15 0x7E 0x75 0x68 0x66 0x62 0x61 0x5F
                                   0x60 0x60 0x60 0x5B 0x55 0x54 0x47 0x37
                                   0x2B 0x28 0x25 0x2A 0x2E 0x42 0x4E 0x57
                                   0x50 0x4B 0x0A 0xE1 0x45 0x6A 0x71 0x84
                                   0x88 0x86 0x87 0x87 0x3B 0x18 0x6C 0x21
                                   0x09 0x4C 0x2E 0x6A 0x8A 0x91 0x91 0x38
                                   0x58 0x82 0x99 0xA4 0x80 0x9C 0xA8 0xCB
                                   0x2F 0x00 0x64 0xA5 0xB5 0x18 0x20 0x09>;
                monitor_sec = <3>;             //电量查询时间间隔,3S
                virtual_power = <0>;           //是否有电池
                divider_res1 = <200>;         //分压电阻大小
                divider_res2 = <200>;
        };

需要注意以下几点:

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

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

2.4 充电相关配置

1.支持普通充电

修改bq25700 dts

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

2.修改普通充电电流

修改 bq25700dts

-          ti,input-current-dcp = <500000>;
-          ti,input-current-cdp = <500000>;
+         ti,input-current-dcp = <3000000>;      //dcp由0.5A改为3A
+         ti,input-current-cdp = <1500000>;      //cdp由0.5A改为1.5A

3.更改锂电池(串数和并数)
RK3399充电管理_第2张图片

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

RK3399充电管理_第3张图片

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

c) 修改cw2015和bq25700的dts

3. U-boot关机充电

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

3.1 关机充电流程

RK3399充电管理_第4张图片

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

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

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

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

3.2 主要代码目录

RK3399充电管理_第5张图片

3.3 功能配置

3.3.1 DTS配置

  1. uboot-charge功能支持

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

  fusb0: fusb30x@22 {
...
support-uboot-charge = <1>;  //支持关机充电
                port-num = <0>;           //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.图片大小尽量小,<20K为宜,不要超过100K
5.正常图片6张,分别对应电量0%,20%,40%,60%,80%,100%
电量百分比	对应图片名称
min_level=0	battery_0
min_level=20	battery_1
min_level=40	battery_2
min_level=60	battery_3
min_level=80	battery_4
min_level=100	battery_5
6.失败图标一张,表示没有接电池,或电池不可用。名称为: battery_fail.bmp
7.不要采用整屏的表情图,尽量使用电池图标。

你可能感兴趣的:(实战调试记录)