Linux驱动--充放电芯片sc8886
SC8886
SC8886S 可以管理1至4节电池充电,SC8886S的输入范围从3.5V到24V,它支持预充电、恒流充电、恒压充电。可以通过SMBus端口轻松设置充电/放电模式.
设备树配置
1 | sc888x-charger@6b { |
设备树解读:
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引脚,重新置位。