Chinaunix首页 | 论坛 | 博客
  • 博客访问: 271865
  • 博文数量: 95
  • 博客积分: 2047
  • 博客等级: 大尉
  • 技术积分: 1022
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 16:18
文章分类

全部博文(95)

文章存档

2013年(1)

2011年(94)

我的朋友

分类: 嵌入式

2011-08-30 22:55:49

Patch]M8 Android电池电量检测驱动v0.1
从 阿虚的电子小屋(Rockie Cheng's Electronic House) 作者:aokikyon
今天仔细读了M8使用的ltc3555电源芯片数据手册,发现芯片并没有提供检测电量的功能。

于是又仔细查看了M8 FE的原理图,原来M8真是用内置的ADC来检测电量的!

内置ADC很好使用,在电源驱动中初始化ADC,并从ADC读取数据即可。

取得电池电量数据后,又发现一个新问题,系统只在第一次启动时更新了电池数据。

原来这个驱动没有做定时器更新电池数据,写了个workqueue,搞定~

目前还存在如下问题:

1)测试时间有限,我手中的电池电量数据不够多,因此目前仅做了简单的线性映射,估计电量检测不会很准。

2)目前仅在FE上测试通过,SE应该也没有问题





Patch 在这,有需要的同学自取

==========================================================================

34,46d33
< //head and defines add by rockie
< #include
< #include
< #include
< #include
< static struct clk   *adc_clock;
< static u32 adc_base;
< static u32 data0;
< struct delayed_work monitor_work;
< struct workqueue_struct *monitor_wqueue;
< //////////////////////////////////////////////
105d91
107,108d92
113,124c97
<    writel(readl(adc_base+S3C_ADCCON)| (1), adc_base+S3C_ADCCON);
<    data0 = readl(adc_base+S3C_ADCDAT0);
<    //printk("Battery ADC data is %d\n",data0 & 0xFFF);
<    data0 = ((data0 & 0xFFF) -2400) >> 2;
<    if (data0 > 100)
<     data0 = 100;
<    if (data0 <= 0 && data0>150)
<     data0 = 1;
<    //printk(" Battery Power data is %d \n",data0 );
<    return data0;//FAKE_BAT_LEVEL;
---
> return FAKE_BAT_LEVEL;
197d169
< s3c_bat_info.bat_info.level = s3c_get_bat_level(bat_ps); //add by rockie
475,482d446
< //queue work add by rockie
< static void s3c6410_battery_work(struct work_struct *work)
< {
< const int interval = HZ * 60;
<    s3c_bat_status_update(&s3c_power_supplies[CHARGER_BATTERY]);
< queue_delayed_work(monitor_wqueue, &monitor_work, interval);
< }
< /////////////////////////////
521,550d484
< /////////////////////////////////////////////////
< //ADC by rockie
< /////////////////////////////////////////////////
< //ioremap
< adc_base = (u32)ioremap((unsigned long) S3C_PA_ADC, SZ_4K-1);
< //prescale
<    writel(S3C_ADCCON_PRSCEN | S3C_ADCCON_PRSCVL(49),\
<      adc_base+S3C_ADCCON);
< //adc delay
<    writel(10000 & 0xffff, adc_base+S3C_ADCDLY);
< //adc type 12bit
<    writel(readl(adc_base+S3C_ADCCON)|S3C_ADCCON_RESSEL_12BIT, adc_base+S3C_ADCCON);
< //adc type normal mode
<    writel(readl(adc_base+S3C_ADCCON) & ~(1<<2), adc_base+S3C_ADCCON);
< //start the adc
<    writel(readl(adc_base+S3C_ADCCON)| (1), adc_base+S3C_ADCCON);
<    data0 = readl(adc_base+S3C_ADCDAT0);
< printk("Battery ADC data is %d",data0 & 0xFFF);
< /////////////////////////////////////////////////
589,594d522
< //workqueue add by rockie 
< INIT_DELAYED_WORK(&monitor_work, s3c6410_battery_work);
< monitor_wqueue = create_singlethread_workqueue(dev_name(&pdev->dev));
< queue_delayed_work(monitor_wqueue, &monitor_work, HZ * 1);
< ///////////////////////////
==========================================================================

下面是我测试得到的电池电量数据表

电量 电压 ADC数据 
45% 3.75 2572 
70% 3.88 2687 
75% 4.03 2710 
80% 4.06 2724 
85% 4.09  
90% 4.12  
95% 4.14  
100% 4.15 2795 
   


希望有人能够补充。

PS.下周放假回家,博客暂停更新。

阅读(1046) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~