【Linux驱动】充电芯片bq24735调试笔记

一口Linux 2022-04-11 11:50

击上方“一口Linux”,选择“置顶/星标公众号


干货福利,第一时间送达!

一、bq24735简介

bq24735 是一款高效率同步电池充电器。

当系统供电需求暂时高于适配器最大供电水平的时候, bq24735 使用智能加速技术来允许电池向系统中释放能量,这样的话将保护适配器不被损坏。

bq24735 为满足自动系统电源选择的需要,使用 2 个充电泵来分别驱动 n-通道 MOSFET (ACFET, RBFET 和 BATFET) 。

SMBus(I2C总线) 控制的输入电流, 充电电流, 和充电电压DAC允许非常高的调节精度,此调节精度可通过系统功率管理微控制器很容易地进行编程。

bq24735 使用内部输入电流寄存器或者外部ILIM引脚来减缓PWM调制速度以减小充电电流。

二、Linux内核充电架构

要想理解bq24735驱动,必须首先理解Android供电系统框架,最重要的知识点是power supply。

1. Android供电系统框架

power supply(以下简称psy)是Linux中从供电驱动抽象出来的子系统,是Linux电源管理的重要组成部分。

psy是一个中间层,在kernel中是属于设备驱动的一部分,psy的作用主要是向用户空间汇总各类供电的状态信息。

抽象出来的各类信息称为property,比如供电设备是否连接就对应着POWER_SUPPLY_PROP_ONLINE

2. power supply功能

power_supply的软件架构:

power supply framework功能包括:

  1. 抽象PSY设备的共性,向用户空间提供统一的API;
  2. 为底层PSY驱动的编写,提供简单、统一的方式,同时封装并实现公共逻辑。

power supply class位于drivers/power/目录中,主要由3部分组成(可参考下图的软件架构):

  • 1)power_supply_core,用于抽象核心数据结构、实现公共逻辑。位于drivers/power/power_supply_core.c中。
  • 2)power_supply_sysfs,实现sysfs以及uevent功能。位于drivers/power/power_supply_sysfs.c中。
  • 3)power_supply_leds,基于Linux led class,提供PSY设备状态指示的通用实现。位于drivers/power/power_suppply_leds.c中。

最后,驱动工程师可以基于power supply class,实现具体的PSY drivers,主要处理平台相关、硬件相关的逻辑。这些drivers都位于drivers/power/power_supply目录下。

3. 驱动层功能

在驱动层,主要是两大模块,与电池监控(fuelgauge)和与充放电管理(charger)相关的驱动(对应图中的battery.c和charger.c),这两大模块主要处理硬件相关的逻辑,在硬件状态发生变化时,会触发相关的中断,驱动层会调用相应的中断函数,并更新修改相应的psy节点值。

fuelgauge驱动主要是负责向上层android系统提供当前电池的电量以及健康状态信息等等,另外除了这个以外,它也向charger驱动提供电池的相关信息;charger驱动主要负责电源线的插拔检测,以及充放电的过程管理。

对于battery管理,硬件上有电量计IC和充放电IC,当然有些厂家为了成本的考虑,也会把电量计和充放电功能集成到一个IC上,更有甚者,可能会把PMU功能也集成在一块硅面上。

4. 其他问题

问:android怎么知道当前是什么供电,充电中与否?

答:uevent机制(实质是net_link方式的socket)(广泛应用于hotplug),充电插入与断开时,内核通过发送uevent信息,告诉android。

问:android如何知道各种参数并更新的?

答:通过kobject_uevent发送通知给上层,上层读取sys相关文件属性

以下是某平台sysfs文件目录

root@********_arm64:/sys/class # pwd
sys/class/power_supply
root@********_arm64:/sys/class/power_supply # ls
ac
battery
bq24735@5-0009
usb
root@********_arm64:/sys/class/power_supply # cd bq24735@5-0009
cd bq24735@5-0009
root@*********_arm64:/sys/class/power_supply/bq24735@5-0009 # ls
device
online
power
status
subsystem
type
uevent                                                                              

【文章福利】小编自己整理了一些个人觉得比较好的学习书籍资料有需要的可以私信回复【内核】自行免费领取哦!!

三、bq24735驱动实现

下面基于某款soc来讲解如何让我们的产品支持bq24735。

1. 硬件连接图图

下面是一个典型的bq24735电路连接图:当没有电源供电的时候,bq24735会直接将电池传递给降压电路,给系统供电 当有电源供电的时候,bq24735会给电池充电。

2. 引脚说明

在此我们只介绍与驱动相关的引脚

3. 寄存器

bq24735用到的寄存器如下:

  1. 充电选项寄存器Charge Options Register [reset = 0x12H]

其中最重要的两个位bit[4]/bit[0] bit:[4]

0: AC adapter不在 (ACDET < 2.4 V)  
1: AC adapter存在(ACDET > 2.4 V)

bit:[0]

0: 使能充电
1: 抑制充电

该寄存器为可读写, 如果要判断当前是否在充电,则可以读取该寄存器,通过判断bit[0]是否为0来确认 如果要判断当前是否存在,则可以读取该寄存器,通过判断bit[4]是否为1来确认

  1. 充电电流寄存器Charge Current Register (0x14H)

通过该寄存器可以设置充电电流。

比如我们要设置充电电流为3072mA,
该值为2048+1024,将对应的bite[10]/[11]为1,其他位为0

1100 0000 0000

即设置该寄存器值为:0xC00

  1. 充电电压寄存器Charge Voltage Register (0x15H)该寄存器设置方法类似于充电电流寄存器

  2. 输入电流Input Current Register (0x3FH)该寄存器设置方法类似于充电电流寄存器

  3. 0xfe,0xff 这两个寄存器分别读取MANUFACTURER_ID和DEVICE_ID

这两个值分别为:0x0040、0x000B

驱动初始化时可以通过读取这两个寄存器的值来判断,驱动是否和硬件匹配。

注意: 通常寄存器0x14、0x15、0x3F值需要询问硬件工程师

4. 设备树

bq24735@9 {
 compatible = "ti,bq24735";
 reg = <0x9>;
 ti,ac-detect-gpios = <&gpio 72 0x1>;
 ti,charge-current =<0x600>;
 ti,charge-voltage=<0x41a0>;
 ti,input-current =<0x800>;
}

参数说明

compatible :用于和驱动的结构体i2c_driver的driver.of_match_table->compatible属性进行匹配
reg:bq24735从设备地址(I2C)
ti,ac-detect-gpios:中断使用的gpio,第三个参数是该pin默认电平
ti,charge-current :充电电流
ti,charge-voltage :充电电压
ti,input-current  :输入电流

5. 驱动讲解

  1. 驱动文件 内核代码中已经有该驱动
drivers\power\bq24735-charger.c

但是该驱动往往需要修改以适配实际的方案。

该驱动是基于I2C总线,对应结构体变量定义如下:

static struct i2c_driver bq24735_charger_driver = {
 .driver = {
  .name = "bq24735-charger",
  .owner = THIS_MODULE,
  .of_match_table = bq24735_match_ids,
 },
 .probe = bq24735_charger_probe,
 .remove = bq24735_charger_remove,
 .id_table = bq24735_charger_id,
};
  1. 主要函数
static bool bq24735_charger_is_present(struct bq24735 *charger)
判断bq24735 是否存在
其实就是读取寄存器0x12的值,判断bit[4]值是否为1
static int bq24735_charger_is_charging(struct bq24735 *charger)
判断bq24735 是否在充电
其实就是读取寄存器0x12的值,判断bit[0]值是否为0
static inline int bq24735_enable_charging(struct bq24735 *charger)
使能充电
将寄存器寄存器0x12的bit[0]置0
static inline int bq24735_disable_charging(struct bq24735 *charger)
禁止充电
将寄存器寄存器0x12的bit[0]置1
static int bq24735_config_charger(struct bq24735 *charger)
配置充电电压(寄存器0x15)、充电电流(寄存器0x14)、输入电流(寄存器0x3f)
static irqreturn_t bq24735_charger_isr(int irq, void *devid)
中断处理函数,
当bq24735充电状态发生变化的时候,会发送中断给cpu
此时可以通过I2C来读取寄存器0x12的内容来获取bq24735当前状态
static int bq24735_charger_get_property(struct power_supply *psy,
     enum power_supply_property psp,
     union power_supply_propval *val)

提供给power supply子系统的回调函数
该函数用于获取bq24735当前状态

状态包括
enum 
{
 POWER_SUPPLY_STATUS_UNKNOWN = 0,
 POWER_SUPPLY_STATUS_CHARGING,  //正在充电
 POWER_SUPPLY_STATUS_DISCHARGING, 
 POWER_SUPPLY_STATUS_NOT_CHARGING,//没有充电
 POWER_SUPPLY_STATUS_FULL,//充满
};
  1. probe流程

此处检测MANUFACTURER_ID和DEVICE_ID流程稍做了修改,只有bq24735 present的时候才会check并配置

此外还有个最重要的机构体

 supply_desc->name = name;
 supply_desc->type = POWER_SUPPLY_TYPE_MAINS;
 supply_desc->properties = bq24735_charger_properties;
 supply_desc->num_properties = ARRAY_SIZE(bq24735_charger_properties);
 supply_desc->get_property = bq24735_charger_get_property;
supply_desc->properties
 提供给power supply架构可以访问的命令的集合,
 这些命令需要在函数supply_desc->get_property增加对应的命令代码
supply_desc->get_property
 power supply会定时通过该回调函数获取充电芯片是否在线、是否在充电等状态
  1. 代码架构这个架构是一口君根据项目中平台所画的架构,其他平台架构可能会有所不同, 需要具体问题具体分析。

四、 log

下面log是开机启动流程log, 第一步 用电池供电启动

启动后再插入电源充电, 插入电源后,bq24735会触发中断:然后再断开电源停止充电

end



一口Linux 


关注,回复【1024】海量Linux资料赠送

精彩文章合集

文章推荐

【专辑】ARM
【专辑】粉丝问答
【专辑】所有原创
专辑linux入门
专辑计算机网络
专辑Linux驱动
【干货】嵌入式驱动工程师学习路线
【干货】Linux嵌入式所有知识点-思维导图


点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看

一口Linux 写点代码,写点人生!
评论
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-12 10:13 46浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 87浏览
  • 全球智能电视时代来临这年头若是消费者想随意地从各个通路中选购电视时,不难发现目前市场上的产品都已是具有智能联网功能的智能电视了,可以宣告智能电视的普及时代已到临!Google从2021年开始大力推广Google TV(即原Android TV的升级版),其他各大品牌商也都跟进推出搭载Google TV操作系统的机种,除了Google TV外,LG、Samsung、Panasonic等大厂牌也开发出自家的智能电视平台,可以看出各家业者都一致地看好这块大饼。智能电视的Wi-Fi连线怎么消失了?智能电
    百佳泰测试实验室 2024-12-12 17:33 66浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 78浏览
  • 应用环境与极具挑战性的测试需求在服务器制造领域里,系统整合测试(System Integration Test;SIT)是确保产品质量和性能的关键步骤。随着服务器系统的复杂性不断提升,包括:多种硬件组件、操作系统、虚拟化平台以及各种应用程序和服务的整合,服务器制造商面临着更有挑战性的测试需求。这些挑战主要体现在以下五个方面:1. 硬件和软件的高度整合:现代服务器通常包括多个处理器、内存模块、储存设备和网络接口。这些硬件组件必须与操作系统及应用软件无缝整合。SIT测试可以帮助制造商确保这些不同组件
    百佳泰测试实验室 2024-12-12 17:45 74浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 115浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 81浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 114浏览
  • 本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-ImportKeyPair工具在源码:build/target/product/security/系统初始签名文件目录中,将以下三个文件拷贝出来:platform.pem;platform.
    Industio_触觉智能 2024-12-12 10:27 81浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 88浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦