diff options
author | Rob Purchase <shotofadds@rockbox.org> | 2008-04-12 16:18:28 +0000 |
---|---|---|
committer | Rob Purchase <shotofadds@rockbox.org> | 2008-04-12 16:18:28 +0000 |
commit | ddfd787c54d78104dac4ed144ff6cb6df8617a0e (patch) | |
tree | 4669b7d036b469bfb53b107adc6ae96bc53b0130 /firmware/target/arm | |
parent | 84dc8d2c7ea58e15b624a7fbc26d5c48ab6c9c0c (diff) | |
download | rockbox-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
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/i2c-telechips.c | 2 | ||||
-rw-r--r-- | firmware/target/arm/tcc780x/cowond2/powermgmt-cowond2.c | 45 |
2 files changed, 35 insertions, 12 deletions
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 | ||
28 | static struct mutex i2c_mtx; | 28 | static 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 | ||
25 | unsigned short current_voltage = 3910; | 26 | unsigned short current_voltage = 3910; |
27 | |||
26 | const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = | 28 | const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = |
27 | { | 29 | { |
28 | 0 | 30 | /* FIXME: calibrate value */ |
31 | 3380 | ||
29 | }; | 32 | }; |
30 | 33 | ||
31 | const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = | 34 | const 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 */ |
37 | const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = | 41 | const 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 */ |
43 | const unsigned short percent_to_volt_charge[11] = | 49 | const 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 | ||
48 | void 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] */ |
54 | unsigned int battery_adc_voltage(void) | 60 | unsigned 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 | ||