blob: 751e45eb6a54a03dc58481e3900ca6c1cb81275d [file] [log] [blame]
Rob Purchase47ea0302008-01-14 22:04:48 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2007 by Karl Kurbjun
11 *
Daniel Stenberg2acc0ac2008-06-28 18:10:04 +000012 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
Rob Purchase47ea0302008-01-14 22:04:48 +000016 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#include "config.h"
23#include "adc.h"
24#include "powermgmt.h"
25#include "kernel.h"
Rob Purchaseddfd7872008-04-12 16:18:28 +000026#include "pcf50606.h"
Rob Purchase47ea0302008-01-14 22:04:48 +000027
28unsigned short current_voltage = 3910;
Rob Purchaseddfd7872008-04-12 16:18:28 +000029
Rob Purchase47ea0302008-01-14 22:04:48 +000030const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
31{
Rob Purchaseddfd7872008-04-12 16:18:28 +000032 /* FIXME: calibrate value */
33 3380
Rob Purchase47ea0302008-01-14 22:04:48 +000034};
35
36const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] =
37{
Rob Purchaseddfd7872008-04-12 16:18:28 +000038 /* FIXME: calibrate value */
39 3300
Rob Purchase47ea0302008-01-14 22:04:48 +000040};
41
42/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */
43const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] =
44{
Rob Purchaseddfd7872008-04-12 16:18:28 +000045 /* FIXME: calibrate values. Table is "inherited" from iPod-PCF / H100 */
46 { 3370, 3650, 3700, 3740, 3780, 3820, 3870, 3930, 4000, 4080, 4160 }
Rob Purchase47ea0302008-01-14 22:04:48 +000047};
48
Rob Purchaseddfd7872008-04-12 16:18:28 +000049#if CONFIG_CHARGING
Rob Purchase47ea0302008-01-14 22:04:48 +000050/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */
51const unsigned short percent_to_volt_charge[11] =
52{
Rob Purchaseddfd7872008-04-12 16:18:28 +000053 /* FIXME: calibrate values. Table is "inherited" from iPod-PCF / H100 */
Rob Purchase8f464062008-04-12 18:34:35 +000054 3370, 3650, 3700, 3740, 3780, 3820, 3870, 3930, 4000, 4080, 4160
Rob Purchase47ea0302008-01-14 22:04:48 +000055};
Rob Purchaseddfd7872008-04-12 16:18:28 +000056#endif /* CONFIG_CHARGING */
Rob Purchase47ea0302008-01-14 22:04:48 +000057
Rob Purchaseddfd7872008-04-12 16:18:28 +000058#define BATTERY_SCALE_FACTOR 6000
59/* full-scale ADC readout (2^10) in millivolt */
60
Rob Purchase47ea0302008-01-14 22:04:48 +000061/* Returns battery voltage from ADC [millivolts] */
62unsigned int battery_adc_voltage(void)
63{
Rob Purchaseddfd7872008-04-12 16:18:28 +000064 static unsigned last_tick = 0;
65
66 if (TIME_BEFORE(last_tick+HZ, current_tick))
67 {
68 int adc_val, irq_status;
69 unsigned char buf[2];
70
Rob Purchase9aa7ceb2008-06-23 18:23:56 +000071 irq_status = disable_irq_save();
Rob Purchaseddfd7872008-04-12 16:18:28 +000072 pcf50606_write(PCF5060X_ADCC2, 0x1);
73 pcf50606_read_multiple(PCF5060X_ADCS1, buf, 2);
74 restore_interrupt(irq_status);
75
76 adc_val = (buf[0]<<2) | (buf[1] & 3); //ADCDAT1H+ADCDAT1L
77 current_voltage = (adc_val * BATTERY_SCALE_FACTOR) >> 10;
78
79 last_tick = current_tick;
80 }
81
82 return current_voltage;
Rob Purchase47ea0302008-01-14 22:04:48 +000083}
84