一、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会触发中断:



然后再断开电源停止充电

【Linux驱动】充电芯片bq24735调试详解的更多相关文章

  1. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

  2. Linux Bash命令关于程序调试详解

    转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...

  3. linux PHP 编译安装参数详解

    linux PHP 编译安装参数详解 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...

  4. Linux文件系统的目录结构详解

    Linux文件系统的目录结构详解   一.前 言 文章对Linux下所有目录一一说明,对比较重要的目录加以重点解说,以帮助初学者熟练掌握Linux的目录结构. 二.目 录 1.什么是文件系统 2.文件 ...

  5. Linux内存管理之mmap详解

    转发之:http://blog.chinaunix.net/uid-26669729-id-3077015.html Linux内存管理之mmap详解 一. mmap系统调用 1. mmap系统调用  ...

  6. (转)Linux命令之Ethtool用法详解

    Linux命令之Ethtool用法详解 原文:http://www.linuxidc.com/Linux/2012-01/52669.htm Linux/Unix命令之Ethtool描述:Ethtoo ...

  7. ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route

    前几篇文章我们从dapm的数据结构入手,了解了代表音频控件的widget,代表连接路径的route以及用于连接两个widget的path.之前都是一些概念的讲解以及对数据结构中各个字段的说明,从本章开 ...

  8. ALSA声卡驱动中的DAPM详解之三:如何定义各种widget

    上一节中,介绍了DAPM框架中几个重要的数据结构:snd_soc_dapm_widget,snd_soc_dapm_path,snd_soc_dapm_route.其中snd_soc_dapm_pat ...

  9. Linux 命令之 scp 命令详解

    Linux 命令之 scp 命令详解 一.scp 简介 scp 命令用于不同主机之间复制文件和目录. scp 是 secure copy 的缩写,是 基于 ssh 协议进行安全的远程文件拷贝命令. s ...

  10. Intellij IDEA中使用Debug调试详解

    转载:https://www.linuxidc.com/Linux/2017-09/146772.htm   Intellij IDEA中使用Debug调试详解 Debug用来追踪代码的运行流程,通常 ...

随机推荐

  1. Codeforces Round #243 (Div. 2) Problem B - Sereja and Mirroring 题解

    http://codeforces.com/contest/426/problem/B 题意大概就是对称有关,要注意的是,当行数为奇数的时候,答案就是行数本身 #include<iostream ...

  2. 【译】VisualStudio.Extensibility 17.10:用 Diagnostics Explorer 调试您的扩展

    想象一下,创建的扩展比以往任何时候都运行得更快.更流畅!如果您最近还没有跟上,我们一直在努力改进 VisualStudio. Extensibility SDK.VisualStudio. Exten ...

  3. Linux OpenGrok搭建

    目录 一.目的 二.环境 三.相关概念 3.1 OpenGrok 3.2 CTags 3.3 Tomcat 四.OpenGrok搭建 4.1 安装jdk 4.2 安装ctags依赖 4.3 安装uni ...

  4. Linux 中内核与应用程序的交互方式:netlink

    netlink介绍 一般来说用户空间和内核空间的通信方式有很多种,而Netlink可以实现双工通信. Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应 ...

  5. 基于SQLite3的C学习总结

    背景 针对 SQLite3 的学习总结 arm linux 移植 SQLite 3 如何在 Linux 上移植使用 SQLite3,标题虽然是在讲 arm linux,但实际上是跨平台的. 基于 SQ ...

  6. C# Newtonsoft增删改查(本地存储)(简单便捷)(拿来即用)

    调用方法: LocalSetupHelper.SetData(Sss.维护, "密码", "123456"); //保存 var c=LocalSetupHel ...

  7. Elastic-Search 整理(二):高级篇

    ES高级篇 集群部署 集群的意思:就是将多个节点归为一体罢了,这个整体就有一个指定的名字了 window中部署集群 - 了解 把下载好的window版的ES中的data文件夹.logs文件夹下的所有的 ...

  8. HOOK别人的dylib(HOOK cydia里面的插件)

    以下仅做我在hook 中的记录, 环境 VM PRO 15 MAC OS 15 Xcode 11.2 工具 monkeydev install_name_tool otool 思路:将要hook 的d ...

  9. javaweb上传图片存到本地,并存储地址到数据库

    前端使用layui的图片上传,将文件base64编码,然后在后端使用转码类来操作base64编码,并保存图片到本地,继而获取文件地址,将文件地址保存到数据库中 1.使用layui的图片上传 infos ...

  10. 实用!一键生成数据库文档的神器,支持MySQL/SqlServer/Oracle多种数据库

    Screw(螺丝钉)是一款简洁好用的数据库表结构文档生成工具,它的特点是:简洁.轻量.设计良好.多数据库支持.多种格式文档.灵活扩展以及支持自定义模板,对于有经常要进行数据库设计.评审.文档整理等需求 ...