android电池(五):电池 充电IC(PM2301)驱动分析篇【转】

本文转载自:http://blog.csdn.net/xubin341719/article/details/8970363

android充电这块,有的电源管理芯片内部包含充电管理,如s5pv210上常用的AT8937。我们这次用的max77686没有充电控制这块,所以我们加入一个充电IC来控制,选用PM2301.

一、PM2301和主控、电池的逻辑

如下图所示:

1、蓝色部分:IIC控制接口,这个说得太多了,好多外围器件都是通过IIC控制的,这个一定要熟悉、熟悉、熟烂了,然后可以完成比较多的工作。

2、黄色部分:中断、使能控制脚,CHG_STATUS(IRQ)、 DC_IN_INT(WAKE_UP) 、 PM2301_LP(LPN)、CHARGER_EN(ENN)控制引脚;

IRQ:充电IC的状态,如果有动作通知主控;

WAKE_UP:如果有DC插入,产生中断通知主控;

LPN:

ENN:充电IC使能;

3、PM2301 、电池、系统电压的大致逻辑

标号1:系统电压有PM2301提供;

标号2:PM2301给电池充电;

标号3:系统电压有电池提供;

标号:1和标号:3不同时提供电压给系统,中间有一个MOS管切换;分两种情况:

(1)、不插充电器时,有电池提供电压给系统,走通道标号:3给系统供电;

(2)、插入DC后,系统侦测到DC插入,把3的通道关闭,打开1给系统供电,同时有2给电池充电;

二、PM2301硬件电路

如下所示:

Q5这个MOS管,就是控制系统供电的,没有充电时,VBATT有VBAT+提供,充电时,VBATT有SENSE_COMM提供。

控制脚对应主控的引脚:

IIC 

IIC ID 为2

CHG_STATUS(IRQ)

 EXYNOS4_GPX1(3)

DC_IN_INT(WAKE_UP)

EXYNOS4_GPX0(7)

PM2301_LP(LPN)

EXYNOS4_GPX1(7)

CHARGER_EN(ENN)

EXYNOS4_GPL2(0)

下图为PM2301的参考电路解法,同样看到P1控制VSYSTEM电源部分的切换控制。

下图为整个电池充电的过程控制:

Trickle mode、Constant current mode (CC mode or fast charge mode)、Constant voltage mode (CV mode) 、End of charge feature

三、PL2301驱动部分

PL2301的硬件、工作原理做简单的解释,接下来我们分析驱动程序:

驱动用到知识点:

IIC的注册;

      任务初始化宏(在上一篇我们简单提过);

中断线程化;

1、IIC的注册

这个和上一篇所说的电量计相似;

(1)、pm2301驱动部分

[cpp]  view plain   copy
  1. static const struct i2c_device_id pm2301_id[] = {  
  2.     { "pm2301", 0 },  
  3.     { }  
  4. };  
  5. MODULE_DEVICE_TABLE(i2c, pm2301_id);  
  6.   
  7. static struct i2c_driver pm2301_i2c_driver = {  
  8.     .driver = {  
  9.         .name   = "pm2301",  
  10.     },  
  11.     .probe      = pm2301_probe,  
  12.     .remove     = __devexit_p(pm2301_remove),  
  13.     .suspend    = pm2301_suspend,  
  14.     .resume     = pm2301_resume,  
  15.     .id_table   = pm2301_id,  
  16. };  
  17.   
  18. static int __init pm2301_init(void)  
  19. {  
  20.     printk(KERN_INFO "pm2301_init !!\n");  
  21.     return i2c_add_driver(&pm2301_i2c_driver);  
  22. }  
  23. module_init(pm2301_init);  

(2)、平台驱动部分

arch/arm/mach-exynos/mach-smdk4x12.c

[cpp]  view plain   copy
  1. static struct i2c_board_info i2c_devs1[] __initdata = {  
  2.   
  3. …………  
  4. #ifdef CONFIG_CHARGER_PM2301  
  5.     {  
  6.         I2C_BOARD_INFO("pm2301", 0x2c),  
  7.         .platform_data  = &pm2301_platform_data,  
  8.     },  
  9. #endif  
  10. …………  
  11. };  

下图就是我们IIC驱动注册生成的文件;

/sys/bus/i2c/drivers/pm2301

2、关于:pm2301_platform_data这个结构体

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小庄老师

要是觉得不错,就给我点支持吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值