SC8886

SC8886S 可以管理1至4节电池充电,SC8886S的输入范围从3.5V到24V,它支持预充电、恒流充电、恒压充电。可以通过SMBus端口轻松设置充电/放电模式.

设备树配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sc888x-charger@6b {
compatible = "sc,sc8886";
reg = <0x6b>;
sc,sc888x-intr-gpio = <&gpio1 23 IRQ_TYPE_EDGE_FALLING>;
sc,charge-current = <4000000>;
sc,max-input-voltage = <20000000>;
sc,min-input-voltage = <4200000>;/* VINDPM*/
sc,max-input-current = <6000000>;
sc,max-charge-voltage = <12600000>;
sc,input-current = <40000000>;
sc,input-current-sdp = <5000000>;
sc,input-current-dcp = <5000000>;
sc,input-current-cdp = <5000000>;
sc,minimum-sys-voltage = <11100000>;
sc,otg-voltage = <9000000>;
sc,otg-current = <500000>;
};

设备树解读:
compatible = “sc,sc8886”: 匹配设备树节点
reg = <0x6b>:I2C地址
max-input-voltage : 最大输入电压范围
min-input-voltage : 最小输入电压范围
max-charge-voltage : 最大充电电压范围
input-current : 输入电流范围
otg-voltage : otg电压范围
input-current-sdp : SDP输入电流范围

驱动代码逻辑流程:
官方提供名为 “sc888x_charger.c”驱动文件,阅读后大致可以看出流程:

检测是否支持smbus -> 获取设备节点 -> 初始化regmap -> 写入充放电芯片寄存器 -> 创建文件系统节点 -> 注册电源供应 -> 使能中断
重点关注寄存器值初始化和写入逻辑,修改设置值判断和现象是否一致。

  • sc8885_probe
    • i2c_check_functionality 检查是否支持smbus
    • devm_kzalloc 申请内存
    • of_find_compatible_node 获取设备树节点
    • devm_regmap_init_i2c 初始化regmap
    • devm_regmap_field_alloc 初始化regmap_field
    • i2c_set_clientdata 设置clientdata
    • sc8885_field_read 获取chip_id
    • sc8885_fw_probe
      • sc8885_fw_read_u32_props 读取fw_props 设备树中的属性 如充电电流等相关属性
      • device_property_read_u32 遍历属性,之后做一些校验
      • sc8885_find_idx 给定范围表
    • sc8885_hw_init 初始化硬件
      • sc8885_field_write 写入初始化的值,后续打印
      • sc8885_get_chip_state 读取芯片的状态信息,并存储
    • sc8885_init_sysfs 创建文件系统节点
      • device_create_file 创建文件
    • sc8885_power_supply_init 初始化电源供应
      • power_supply_register 注册电源
    • sc8885_field_read(charger, AC_STAT) 读取AC_STAT状态
    • device_init_wakeup 设置唤醒功能
    • devm_request_threaded_irq 开启中断
    • enable_irq_wake 使能中断函数

以上是linux驱动设置。

如果需要其他平台开发,需要查看官方提供的文档,了解芯片的功能和寄存器的使用。通过了解手册,可以自己编写驱动。

手册解读

以下是我根据手册,总结常用的寄存器功能和作用。

Charge Current (0x02H, 0x03H)
功能:设置充电器的充电电流。
作用:这两个连续的寄存器共同定义了7位的充电电流设置,用于调节充电器的充电速率。

Charge Voltage (0x04H, 0x05H)
功能:设置充电器的充电电压。
作用:这两个字节的寄存器定义了12位的充电电压设置,决定了电池充电时的目标电压。

Charge Option0 (0x00H)
功能:包含多种充电选项和控制位。
作用:其中包括充电抑制位(CHRG_INHIBIT),当设置为1时,将禁用充电。

Charge Option1 (0x30H)
功能:提供额外的充电选项。
作用:包含自动唤醒模式(EN_AUTO_WAKEUP),启用时,如果电池电压低于VSYSMIN,充电器将以128mA的电流充电30分钟。

Charge Option2 (0x32H)
功能:提供更多充电选项和阈值设置。
作用:包含输入电流限制位(EN_EXTLIM),用于启用或禁用ILIM_HIZ引脚的输入电流限制功能。

Charge Option3 (0x34H)
功能:提供对OTG和VAP模式的控制。
作用:包含OTG模式启用位(EN_OTG),用于控制是否启用OTG功能。

Charge Status (0x20H)
功能:提供充电器状态信息。
作用:包含多种充电状态指示,例如ACOV故障、BATOC故障、ACOC故障等。

Prochot Status (0x22H)
功能:提供PROCHOT(处理器热指示)状态信息。
作用:指示是否因为过热或其他原因触发了PROCHOT信号。

IIN_DPM (0x25H)
功能:显示当前使用的输入电流限制。
作用:在动态电源管理(DPM)中,显示当前应用的输入电流限制值。

注意事项

1、充电控制:
SC8886S具有看门狗定时器功能,如果在一定时间内没有收到写入ChargeVoltage()或ChargeCurrent()命令,将终止充电。

2、STM32 I2C 读取超时
需要在读取、写入寄存器是重新初始化I2C引脚,重新置位。