summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Purchase <shotofadds@rockbox.org>2008-04-12 16:18:28 +0000
committerRob Purchase <shotofadds@rockbox.org>2008-04-12 16:18:28 +0000
commitddfd787c54d78104dac4ed144ff6cb6df8617a0e (patch)
tree4669b7d036b469bfb53b107adc6ae96bc53b0130
parent84dc8d2c7ea58e15b624a7fbc26d5c48ab6c9c0c (diff)
downloadrockbox-ddfd787c54d78104dac4ed144ff6cb6df8617a0e.tar.gz
rockbox-ddfd787c54d78104dac4ed144ff6cb6df8617a0e.zip
D2: Implement battery voltage readout from PCF50606 (levels not yet calibrated). Adjust I2C delay to ensure this also works when boosted.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17085 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/export/config-cowond2.h4
-rw-r--r--firmware/target/arm/i2c-telechips.c2
-rw-r--r--firmware/target/arm/tcc780x/cowond2/powermgmt-cowond2.c45
3 files changed, 35 insertions, 16 deletions
diff --git a/firmware/export/config-cowond2.h b/firmware/export/config-cowond2.h
index 74cf90eac4..3938bd0739 100644
--- a/firmware/export/config-cowond2.h
+++ b/firmware/export/config-cowond2.h
@@ -105,10 +105,6 @@
105#define BATTERY_CAPACITY_INC 50 /* capacity increment */ 105#define BATTERY_CAPACITY_INC 50 /* capacity increment */
106#define BATTERY_TYPES_COUNT 1 /* only one type */ 106#define BATTERY_TYPES_COUNT 1 /* only one type */
107 107
108/* define this if the unit should not shut down on low battery. */
109/* TODO: this is temporary until battery monitoring implemented */
110#define NO_LOW_BATTERY_SHUTDOWN
111
112#ifndef SIMULATOR 108#ifndef SIMULATOR
113 109
114/* Define this if you have a TCC7801 */ 110/* Define this if you have a TCC7801 */
diff --git a/firmware/target/arm/i2c-telechips.c b/firmware/target/arm/i2c-telechips.c
index e3e8fd3d33..8e5db2f26f 100644
--- a/firmware/target/arm/i2c-telechips.c
+++ b/firmware/target/arm/i2c-telechips.c
@@ -23,7 +23,7 @@
23#include "i2c-target.h" 23#include "i2c-target.h"
24 24
25/* arbitrary delay loop */ 25/* arbitrary delay loop */
26#define DELAY do { int _x; for(_x=0;_x<20;_x++);} while (0) 26#define DELAY do { int _x; for(_x=0;_x<40;_x++);} while (0)
27 27
28static struct mutex i2c_mtx; 28static struct mutex i2c_mtx;
29 29
diff --git a/firmware/target/arm/tcc780x/cowond2/powermgmt-cowond2.c b/firmware/target/arm/tcc780x/cowond2/powermgmt-cowond2.c
index b3572307e9..71e4e325e8 100644
--- a/firmware/target/arm/tcc780x/cowond2/powermgmt-cowond2.c
+++ b/firmware/target/arm/tcc780x/cowond2/powermgmt-cowond2.c
@@ -21,39 +21,62 @@
21#include "adc.h" 21#include "adc.h"
22#include "powermgmt.h" 22#include "powermgmt.h"
23#include "kernel.h" 23#include "kernel.h"
24#include "pcf50606.h"
24 25
25unsigned short current_voltage = 3910; 26unsigned short current_voltage = 3910;
27
26const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = 28const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
27{ 29{
28 0 30 /* FIXME: calibrate value */
31 3380
29}; 32};
30 33
31const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = 34const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] =
32{ 35{
33 0 36 /* FIXME: calibrate value */
37 3300
34}; 38};
35 39
36/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ 40/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */
37const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = 41const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] =
38{ 42{
39 { 100, 300, 400, 500, 600, 700, 800, 900, 1000, 1200, 1320 }, 43 /* FIXME: calibrate values. Table is "inherited" from iPod-PCF / H100 */
44 { 3370, 3650, 3700, 3740, 3780, 3820, 3870, 3930, 4000, 4080, 4160 }
40}; 45};
41 46
47#if CONFIG_CHARGING
42/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ 48/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */
43const unsigned short percent_to_volt_charge[11] = 49const unsigned short percent_to_volt_charge[11] =
44{ 50{
45 100, 300, 400, 500, 600, 700, 800, 900, 1000, 1200, 1320, 51 /* FIXME: calibrate values. Table is "inherited" from iPod-PCF / H100 */
52 { 3370, 3650, 3700, 3740, 3780, 3820, 3870, 3930, 4000, 4080, 4160 }
46}; 53};
54#endif /* CONFIG_CHARGING */
55
56#define BATTERY_SCALE_FACTOR 6000
57/* full-scale ADC readout (2^10) in millivolt */
47 58
48void read_battery_inputs(void)
49{
50 #warning function not implemented
51}
52
53/* Returns battery voltage from ADC [millivolts] */ 59/* Returns battery voltage from ADC [millivolts] */
54unsigned int battery_adc_voltage(void) 60unsigned int battery_adc_voltage(void)
55{ 61{
56 #warning function not implemented 62 static unsigned last_tick = 0;
57 return 0; 63
64 if (TIME_BEFORE(last_tick+HZ, current_tick))
65 {
66 int adc_val, irq_status;
67 unsigned char buf[2];
68
69 irq_status = disable_interrupt_save(IRQ_FIQ_DISABLED);
70 pcf50606_write(PCF5060X_ADCC2, 0x1);
71 pcf50606_read_multiple(PCF5060X_ADCS1, buf, 2);
72 restore_interrupt(irq_status);
73
74 adc_val = (buf[0]<<2) | (buf[1] & 3); //ADCDAT1H+ADCDAT1L
75 current_voltage = (adc_val * BATTERY_SCALE_FACTOR) >> 10;
76
77 last_tick = current_tick;
78 }
79
80 return current_voltage;
58} 81}
59 82