max17040C语言,电池 电量计(MAX17040)驱动分析篇

本文详细介绍了MAX17040电池电量计的工作原理、驱动流程以及在Linux系统中的应用。通过IIC进行通信,驱动程序使用定时器读取电池状态信息,当检测到变化时,通过power_supply_changed函数更新系统状态。内容涵盖了IIC驱动注册、定时器使用、任务初始化宏等关键知识点。
摘要由CSDN通过智能技术生成

关键词:android 电池  电量计  MAX17040 任务初始化宏power_supply

平台信息:

内核:linux2.6/linux3.0

系统:android/android4.0

平台:samsung exynos 4210、exynos 4412 、exynos 5250

作者:xubin341719(欢迎转载,请注明作者)

电池电量计,库仑计,用max17040这颗电量IC去计量电池电量,这种方法比较合理。想起比较遥远的年代,做samsung s5pc110/sp5v210的时候,计量电量用一个AD口加两个分压电阻就做了,低电量的时候系统一直判断不准确,“低电关机”提示一会有,一会没有,客户那个郁闷呀,“到底是有电还是没电?”。

如下图,通过两个分压电阻,和一个AD脚去侦测VCC(电池)电压。

0818b9ca8b590ca3270a3433284dd417.png

一、MAX17040的工作原理

电量计MAX17040,他通过芯片去测量电池电量,芯片本身集成的电路比较复杂,同时可以通过软件上的一些算法去实现一些处理,是测量出的电量更加准确。还有一个好处,就是他之接输出数字量,通过IIC直接读取,我们在电路设计、程序处理上更加的统一化。

如下图所示,MAX17040和电池盒主控的关系,一个AD脚接到电池VBAT+,检测到的电量信息,通过IIC传到主控。

0818b9ca8b590ca3270a3433284dd417.png

下面是电路图,电路接口比较简单,VBAT+,接到max17040的CELL,IIC接到主控的IIC2接口,这个我们在程序中要配置。看这个器件比较简单吧。

0818b9ca8b590ca3270a3433284dd417.png

看下max17040的内部结构,其实这也是一个AD转换的过程,单独一颗芯片去实现,这样看起来比较专业些。CELL接口,其实就是一个ADC转换的引脚,我们可以看到芯片内部有自己的时钟(time base),IIC控制器之类的,通过CELL采集到的模拟量,转换成数字量,传输给主控。

0818b9ca8b590ca3270a3433284dd417.png

通过上面的介绍Max17040的硬件、原理我们基本上都了解了,比较简单,下面我们就重点去分析下驱动程序。

二、MAX17040 总体流程

电量计的工作流程比较简单,max17040通过CELL ADC转换引脚,把电池的相关信息,实时读取,存入max17040相应的寄存器,驱动申请一个定时器,记时结束,通过IIC去读取电池状态信息,和老的电池信息对比,如果用变化上报,然后重新计时;这样循环操作,流程如下所示:

0818b9ca8b590ca3270a3433284dd417.png

三、MAX17040这个电量计驱动,我们主要用到以下知识点

1、IIC的注册(这个在TP、CAMERA中都有分析);

2、linux 中定时器的使用;

3、任务初始化宏;

4、linux定时器调度队列;

5、max17040测到电量后如何上传到系统(这个电池系统中有简要的分析);

6、AC、USB充电状态的上报,这个和电池电量是一种方法。

7、电池曲线的测量与加入;

1、IIC的注册

IIC这个总线,在工作中用的比较多,TP、CAMERA、电量计、充电IC、音频芯片、电源管理芯片、基本所有的传感器,所以这大家要仔细看下,后面有时间的话单独列一片介绍下IIC,从单片机时代都用的比较多,看来条总线的生命力很强,像C语言一样,很难被同类的东西替代到,至少现在应该是这样的。

看下他结构体的初始化与驱动的申请,这个比较统一,这里就不想想解释了。

(1)、IIC驱动的注册:

staticconststructi2c_device_id max17040_id[] = {

{ "max17040", 0 },

{ }

};

MODULE_DEVICE_TABLE(i2c, max17040_id);

staticstructi2c_driver max17040_i2c_driver = {

.driver = {

.name   = "max17040",

},

.probe      = max17040_probe,

.remove     = __devexit_p(max17040_remove),

.suspend    = max17040_suspend,

.resume     = max17040_resume,

.id_table   = max17040_id,

};

staticint__init max17040_init(void)

{

printk("MAX17040 max17040_init !!\n");

wake_lock_init(&vbus_wake_lock, WAKE_LOCK_SUSPEND, "vbus_present");

returni2c_add_driver(&max17040_i2c_driver);

}

module_init(max17040_init);

(2)在arch/arm/mach-exynos/mach-smdk4x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值