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
<
< 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.下周放假回家,博客暂停更新。
阅读(1083) | 评论(0) | 转发(0) |