summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2009-01-11 10:07:22 +0000
committerMichael Sevakis <jethead71@rockbox.org>2009-01-11 10:07:22 +0000
commit7d7969114da36a99afc4d80576ff9b089cb09e50 (patch)
tree48c3c574e382d80454c28a6b77de64a64f3cedcd
parentb84fe020a5bc497cee9b88eb782c2d4a9b7be711 (diff)
downloadrockbox-7d7969114da36a99afc4d80576ff9b089cb09e50.tar.gz
rockbox-7d7969114da36a99afc4d80576ff9b089cb09e50.zip
c200v1/e200v1: Add battery charging. This should be usable on v2 players but those should be evaluated for current, endpoint voltage and whether or not accurate battery readings may always be obtained (which determines algorithm setup and behavior).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19748 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/debug_menu.c32
-rw-r--r--firmware/SOURCES26
-rw-r--r--firmware/export/as3514.h33
-rw-r--r--firmware/export/config-c200.h5
-rw-r--r--firmware/export/config-e200.h5
-rw-r--r--firmware/export/powermgmt.h7
-rw-r--r--firmware/powermgmt.c2
-rw-r--r--firmware/target/arm/powermgmt-ascodec.c231
-rw-r--r--firmware/target/arm/sandisk/powermgmt-target.h59
-rw-r--r--firmware/target/arm/sandisk/sansa-c200/powermgmt-c200.c13
-rw-r--r--firmware/target/arm/sandisk/sansa-e200/powermgmt-e200.c11
11 files changed, 375 insertions, 49 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index 10d69b018c..7477bb001c 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -106,7 +106,7 @@
106#include "debug-target.h" 106#include "debug-target.h"
107#endif 107#endif
108 108
109#if defined(SANSA_E200) || defined(PHILIPS_SA9200) 109#if defined(SANSA_E200) || defined(SANSA_C200) || defined(PHILIPS_SA9200)
110#include "ascodec.h" 110#include "ascodec.h"
111#include "as3514.h" 111#include "as3514.h"
112#endif 112#endif
@@ -1251,10 +1251,6 @@ extern unsigned char serbuf[];
1251 lcd_puts(0, line++, buf); 1251 lcd_puts(0, line++, buf);
1252 snprintf(buf, sizeof(buf), "ADC_VBAT: %4d", adc_read(ADC_VBAT)); 1252 snprintf(buf, sizeof(buf), "ADC_VBAT: %4d", adc_read(ADC_VBAT));
1253 lcd_puts(0, line++, buf); 1253 lcd_puts(0, line++, buf);
1254 snprintf(buf, sizeof(buf), "CHARGER: %02X/%02X",
1255 ascodec_read(AS3514_CHARGER),
1256 ascodec_read(AS3514_IRQ_ENRD0));
1257 lcd_puts(0, line++, buf);
1258#endif 1254#endif
1259#endif 1255#endif
1260 lcd_update(); 1256 lcd_update();
@@ -1757,6 +1753,32 @@ static bool view_battery(void)
1757 } 1753 }
1758 1754
1759 lcd_puts(0, line++, buf); 1755 lcd_puts(0, line++, buf);
1756#elif defined(SANSA_E200) || defined(SANSA_C200)
1757 const int first = CHARGE_STATE_DISABLED;
1758 static const char * const chrgstate_strings[] =
1759 {
1760 [CHARGE_STATE_DISABLED-first] = "Disabled",
1761 [CHARGE_STATE_ERROR-first] = "Error",
1762 [DISCHARGING-first] = "Discharging",
1763 [CHARGING-first] = "Charging",
1764 };
1765 const char *str = NULL;
1766
1767 snprintf(buf, 30, "Charger: %s",
1768 charger_inserted() ? "present" : "absent");
1769 lcd_puts(0, 3, buf);
1770
1771 y = charge_state - first;
1772 if ((unsigned)y < ARRAYLEN(chrgstate_strings))
1773 str = chrgstate_strings[y];
1774
1775 snprintf(buf, sizeof(buf), "State: %s",
1776 str ? str : "<unknown>");
1777 lcd_puts(0, 4, buf);
1778
1779 snprintf(buf, sizeof(buf), "CHARGER: %02X",
1780 ascodec_read(AS3514_CHARGER));
1781 lcd_puts(0, 5, buf);
1760#else 1782#else
1761 snprintf(buf, 30, "Charger: %s", 1783 snprintf(buf, 30, "Charger: %s",
1762 charger_inserted() ? "present" : "absent"); 1784 charger_inserted() ? "present" : "absent");
diff --git a/firmware/SOURCES b/firmware/SOURCES
index f4d86bc2cd..3f558566f8 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -485,17 +485,18 @@ target/sh/archos/ondio/fmradio_i2c-ondio.c
485 485
486#ifdef SANSA_E200 486#ifdef SANSA_E200
487#ifndef SIMULATOR 487#ifndef SIMULATOR
488target/arm/lcd-as-memframe.S
489target/arm/ata-sd-pp.c
490target/arm/sandisk/sansa-e200/lcd-e200.c
491target/arm/adc-as3514.c 488target/arm/adc-as3514.c
492target/arm/ascodec-pp.c 489target/arm/ascodec-pp.c
493target/arm/sandisk/backlight-c200_e200.c 490target/arm/ata-sd-pp.c
491target/arm/lcd-as-memframe.S
492target/arm/powermgmt-ascodec.c
493target/arm/i2s-pp.c
494target/arm/usb-fw-pp502x.c 494target/arm/usb-fw-pp502x.c
495target/arm/sandisk/sansa-e200/button-e200.c 495target/arm/sandisk/backlight-c200_e200.c
496target/arm/sandisk/power-c200_e200.c 496target/arm/sandisk/power-c200_e200.c
497target/arm/sandisk/sansa-e200/lcd-e200.c
498target/arm/sandisk/sansa-e200/button-e200.c
497target/arm/sandisk/sansa-e200/powermgmt-e200.c 499target/arm/sandisk/sansa-e200/powermgmt-e200.c
498target/arm/i2s-pp.c
499#ifndef BOOTLOADER 500#ifndef BOOTLOADER
500target/arm/sandisk/audio-c200_e200.c 501target/arm/sandisk/audio-c200_e200.c
501#endif /* BOOTLOADER */ 502#endif /* BOOTLOADER */
@@ -504,17 +505,18 @@ target/arm/sandisk/audio-c200_e200.c
504 505
505#ifdef SANSA_C200 506#ifdef SANSA_C200
506#ifndef SIMULATOR 507#ifndef SIMULATOR
507target/arm/ata-sd-pp.c
508target/arm/sandisk/sansa-c200/lcd-c200.c
509target/arm/sandisk/sansa-c200/lcd-as-c200.S
510target/arm/adc-as3514.c 508target/arm/adc-as3514.c
511target/arm/ascodec-pp.c 509target/arm/ascodec-pp.c
512target/arm/sandisk/backlight-c200_e200.c 510target/arm/ata-sd-pp.c
511target/arm/i2s-pp.c
512target/arm/powermgmt-ascodec.c
513target/arm/usb-fw-pp502x.c 513target/arm/usb-fw-pp502x.c
514target/arm/sandisk/sansa-c200/button-c200.c 514target/arm/sandisk/backlight-c200_e200.c
515target/arm/sandisk/power-c200_e200.c 515target/arm/sandisk/power-c200_e200.c
516target/arm/sandisk/sansa-c200/lcd-c200.c
517target/arm/sandisk/sansa-c200/lcd-as-c200.S
518target/arm/sandisk/sansa-c200/button-c200.c
516target/arm/sandisk/sansa-c200/powermgmt-c200.c 519target/arm/sandisk/sansa-c200/powermgmt-c200.c
517target/arm/i2s-pp.c
518#ifndef BOOTLOADER 520#ifndef BOOTLOADER
519target/arm/sandisk/audio-c200_e200.c 521target/arm/sandisk/audio-c200_e200.c
520#endif /* BOOTLOADER */ 522#endif /* BOOTLOADER */
diff --git a/firmware/export/as3514.h b/firmware/export/as3514.h
index 07aa0ebfe2..9489d1ae0d 100644
--- a/firmware/export/as3514.h
+++ b/firmware/export/as3514.h
@@ -249,8 +249,37 @@ extern void audiohw_set_frequency(int fsel);
249#define ADC_I_MICSUP2 11 /* Current of MicSup2 for remote control detection */ 249#define ADC_I_MICSUP2 11 /* Current of MicSup2 for remote control detection */
250#define ADC_VBAT 12 /* Single cell battery voltage */ 250#define ADC_VBAT 12 /* Single cell battery voltage */
251 251
252#define ADC_UNREG_POWER ADC_BVDD /* For compatibility */ 252/* AS3514_CHARGER */
253 253#define TMPSUP_OFF (0x1 << 7)
254#define CHG_I (0x7 << 4)
255#define CHG_I_400MA (0x7 << 4)
256#define CHG_I_350MA (0x6 << 4)
257#define CHG_I_300MA (0x5 << 4)
258#define CHG_I_250MA (0x4 << 4)
259#define CHG_I_200MA (0x3 << 4)
260#define CHG_I_150MA (0x2 << 4)
261#define CHG_I_100MA (0x1 << 4)
262#define CHG_I_50MA (0x0 << 4)
263#define CHG_V (0x7 << 1)
264#define CHG_V_4_25V (0x7 << 1)
265#define CHG_V_4_20V (0x6 << 1)
266#define CHG_V_4_15V (0x5 << 1)
267#define CHG_V_4_10V (0x4 << 1)
268#define CHG_V_4_05V (0x3 << 1)
269#define CHG_V_4_00V (0x2 << 1)
270#define CHG_V_3_95V (0x1 << 1)
271#define CHG_V_3_90V (0x0 << 1)
272#define CHG_OFF (0x1 << 0)
273
274/* AS3514_IRQ_ENRD0 */
275#define CHG_TMPHIGH (0x1 << 7)
276#define CHG_ENDOFCH (0x1 << 6)
277#define CHG_STATUS (0x1 << 5)
278#define CHG_CHANGED (0x1 << 4)
279#define USB_STATUS (0x1 << 3)
280#define USB_CHANGED (0x1 << 2)
281#define RVDD_WASLOW (0x1 << 1)
282#define BVDD_ISLOW (0x1 << 0)
254 283
255#define AS3514_I2C_ADDR 0x46 284#define AS3514_I2C_ADDR 0x46
256 285
diff --git a/firmware/export/config-c200.h b/firmware/export/config-c200.h
index f4ab33fb56..d68d21455f 100644
--- a/firmware/export/config-c200.h
+++ b/firmware/export/config-c200.h
@@ -123,8 +123,9 @@
123#define BATTERY_CAPACITY_INC 0 /* capacity increment */ 123#define BATTERY_CAPACITY_INC 0 /* capacity increment */
124#define BATTERY_TYPES_COUNT 1 /* only one type */ 124#define BATTERY_TYPES_COUNT 1 /* only one type */
125 125
126/* Hardware controlled charging? FIXME */ 126/* Charging implemented in a target-specific algorithm */
127#define CONFIG_CHARGING CHARGING_SIMPLE 127#define CONFIG_CHARGING CHARGING_TARGET
128#define HAVE_POWEROFF_WHILE_CHARGING
128 129
129/* define this if the unit can be powered or charged via USB */ 130/* define this if the unit can be powered or charged via USB */
130#define HAVE_USB_POWER 131#define HAVE_USB_POWER
diff --git a/firmware/export/config-e200.h b/firmware/export/config-e200.h
index 602a84707c..2be64d95cc 100644
--- a/firmware/export/config-e200.h
+++ b/firmware/export/config-e200.h
@@ -120,8 +120,9 @@
120#define BATTERY_CAPACITY_INC 0 /* capacity increment */ 120#define BATTERY_CAPACITY_INC 0 /* capacity increment */
121#define BATTERY_TYPES_COUNT 1 /* only one type */ 121#define BATTERY_TYPES_COUNT 1 /* only one type */
122 122
123/* Hardware controlled charging? FIXME */ 123/* Charging implemented in a target-specific algorithm */
124#define CONFIG_CHARGING CHARGING_SIMPLE 124#define CONFIG_CHARGING CHARGING_TARGET
125#define HAVE_POWEROFF_WHILE_CHARGING
125 126
126/* define current usage levels */ 127/* define current usage levels */
127#define CURRENT_NORMAL 30 /* Toni's measurements in Nov 2008 */ 128#define CURRENT_NORMAL 30 /* Toni's measurements in Nov 2008 */
diff --git a/firmware/export/powermgmt.h b/firmware/export/powermgmt.h
index 5be3a39c1d..39e2e6eab9 100644
--- a/firmware/export/powermgmt.h
+++ b/firmware/export/powermgmt.h
@@ -27,7 +27,7 @@
27 27
28enum charge_state_type 28enum charge_state_type
29{ 29{
30 /* sorted by increasing charging current */ 30 /* sorted by increasing charging current (do not change!) */
31#if CONFIG_CHARGING >= CHARGING_MONITOR 31#if CONFIG_CHARGING >= CHARGING_MONITOR
32 CHARGE_STATE_DISABLED = -2, /* Disable charger use (safety measure) */ 32 CHARGE_STATE_DISABLED = -2, /* Disable charger use (safety measure) */
33 CHARGE_STATE_ERROR = -1, /* Some error occurred that should not allow 33 CHARGE_STATE_ERROR = -1, /* Some error occurred that should not allow
@@ -143,13 +143,16 @@ unsigned int battery_voltage(void); /* filtered batt. voltage in millivolts */
143 143
144#ifdef HAVE_BATTERY_SWITCH 144#ifdef HAVE_BATTERY_SWITCH
145unsigned int input_millivolts(void); /* voltage that device is running from */ 145unsigned int input_millivolts(void); /* voltage that device is running from */
146#endif /* HAVE_BATTERY_SWITCH */
146 147
148#if defined(HAVE_BATTERY_SWITCH) || defined(HAVE_RESET_BATTERY_FILTER)
147/* Set the filtered battery voltage (to adjust it before beginning a charge 149/* Set the filtered battery voltage (to adjust it before beginning a charge
148 * cycle for instance where old, loaded readings will likely be invalid). 150 * cycle for instance where old, loaded readings will likely be invalid).
149 * Also readjust when battery switch is opened or closed. 151 * Also readjust when battery switch is opened or closed.
150 */ 152 */
151void reset_battery_filter(int millivolts); 153void reset_battery_filter(int millivolts);
152#endif /* HAVE_BATTERY_SWITCH */ 154#endif /* HAVE_BATTERY_SWITCH || HAVE_RESET_BATTERY_FILTER */
155
153 156
154/* read unfiltered battery info */ 157/* read unfiltered battery info */
155void battery_read_info(int *voltage, int *level); 158void battery_read_info(int *voltage, int *level);
diff --git a/firmware/powermgmt.c b/firmware/powermgmt.c
index f71eb45430..3fc216080b 100644
--- a/firmware/powermgmt.c
+++ b/firmware/powermgmt.c
@@ -435,7 +435,7 @@ bool query_force_shutdown(void)
435#endif 435#endif
436} 436}
437 437
438#ifdef HAVE_BATTERY_SWITCH 438#if defined(HAVE_BATTERY_SWITCH) || defined(HAVE_RESET_BATTERY_FILTER)
439/* 439/*
440 * Reset the battery voltage filter to a new value and update the 440 * Reset the battery voltage filter to a new value and update the
441 * status. 441 * status.
diff --git a/firmware/target/arm/powermgmt-ascodec.c b/firmware/target/arm/powermgmt-ascodec.c
new file mode 100644
index 0000000000..ab9fd7b490
--- /dev/null
+++ b/firmware/target/arm/powermgmt-ascodec.c
@@ -0,0 +1,231 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2009 by Michael Sevakis
11 * Copyright (C) 2008 by Bertrik Sikken
12 *
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation; either version 2
16 * of the License, or (at your option) any later version.
17 *
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
20 *
21 ****************************************************************************/
22#include "config.h"
23#include "system.h"
24#include "thread.h"
25#include "as3514.h"
26#include "ascodec.h"
27#include "adc.h"
28#include "powermgmt.h"
29#include "power.h"
30
31/*===========================================================================
32 * These parameters may be defined per target:
33 *
34 * BATT_FULL_VOLTAGE - Upon connect a charge cycle begins if the reading is
35 * lower than this value (millivolts).
36 *
37 * BATT_VAUTO_RECHARGE - While left plugged after cycle completion, the
38 * charger restarts automatically if the reading drops
39 * below this value (millivolts). Must be less than
40 * BATT_FULL_VOLTAGE.
41 *
42 * ADC_BATTERY - ADC channel from which to read the battery voltage
43 *
44 * BATT_CHG_V - Charger voltage regulation setting (as3514 regval)
45 *
46 * BATT_CHG_I - Charger current regulation setting (as3514 regval)
47 *
48 * CHARGER_TOTAL_TIMER - Maximum allowed charging time (1/2-second steps)
49 *===========================================================================
50 */
51
52/* This code assumes USB power input is not distinguishable from main
53 * power and charger connect cannot wait for USB configuration before
54 * considering USB charging available. Where they are distinguishable,
55 * things get more complicated. */
56static bool charger_close = false; /* Shutting down? */
57static int charger_total_timer = 0; /* Timeout in algorithm steps */
58
59/* Current battery threshold for (re)charge:
60 * First plugged = BATT_FULL_VOLTAGE
61 * After charge cycle or non-start = BATT_VAUTO_RECHARGE
62 */
63static unsigned int batt_threshold = 0;
64
65/* ADC should read 0x3ff=5.12V */
66/* full-scale ADC readout (2^10) in millivolt */
67
68/* Returns battery voltage from ADC [millivolts] */
69unsigned int battery_adc_voltage(void)
70{
71 return (adc_read(ADC_BATTERY) * 5125 + 512) >> 10;
72}
73
74/* Returns true if the unit is charging the batteries. */
75bool charging_state(void)
76{
77 return charge_state == CHARGING;
78}
79
80/* Reset the battery filter to a new voltage */
81static void battery_voltage_sync(void)
82{
83 int i;
84 unsigned int mv;
85
86 for (i = 0, mv = 0; i < 5; i++)
87 mv += battery_adc_voltage();
88
89 reset_battery_filter(mv / 5);
90}
91
92/* Disable charger and minimize all settings. Reset timers, etc. */
93static void disable_charger(void)
94{
95 ascodec_write(AS3514_IRQ_ENRD0, 0);
96 ascodec_write(AS3514_CHARGER,
97 TMPSUP_OFF | CHG_I_50MA | CHG_V_3_90V | CHG_OFF);
98
99 if (charge_state > DISCHARGING)
100 charge_state = DISCHARGING; /* Not an error state already */
101
102 charger_total_timer = 0;
103 battery_voltage_sync();
104}
105
106/* Enable charger with specified settings. Start timers, etc. */
107static void enable_charger(void)
108{
109 ascodec_write(AS3514_CHARGER, BATT_CHG_I | BATT_CHG_V);
110 /* Watch for end of charge. Temperature supervision is handled in
111 * hardware. Charger status can be read and has no interrupt enable. */
112 ascodec_write(AS3514_IRQ_ENRD0, CHG_ENDOFCH);
113
114 sleep(HZ/10); /* Allow charger turn-on time (it could be gradual). */
115
116 ascodec_read(AS3514_IRQ_ENRD0); /* Clear out interrupts (important!) */
117
118 charge_state = CHARGING;
119 charger_total_timer = CHARGER_TOTAL_TIMER;
120 battery_voltage_sync();
121}
122
123void powermgmt_init_target(void)
124{
125 /* Everything CHARGER, OFF! */
126 ascodec_write(AS3514_IRQ_ENRD0, 0);
127 ascodec_write(AS3514_CHARGER,
128 TMPSUP_OFF | CHG_I_50MA | CHG_V_3_90V | CHG_OFF);
129}
130
131static inline void charger_plugged(void)
132{
133 batt_threshold = BATT_FULL_VOLTAGE; /* Start with topped value. */
134 battery_voltage_sync();
135}
136
137static inline void charger_control(void)
138{
139 switch (charge_state)
140 {
141 case DISCHARGING:
142 {
143 unsigned int millivolts;
144 unsigned int thresh = batt_threshold;
145
146 if (BATT_FULL_VOLTAGE == thresh)
147 {
148 /* Wait for CHG_status to be indicated. */
149 if ((ascodec_read(AS3514_IRQ_ENRD0) & CHG_STATUS) == 0)
150 break;
151
152 batt_threshold = BATT_VAUTO_RECHARGE;
153 }
154
155 millivolts = battery_voltage();
156
157 if (millivolts <= thresh)
158 enable_charger();
159 break;
160 } /* DISCHARGING: */
161
162 case CHARGING:
163 {
164 if ((ascodec_read(AS3514_IRQ_ENRD0) & CHG_ENDOFCH) == 0)
165 {
166 if (--charger_total_timer > 0)
167 break;
168
169 /* Timer ran out - require replug. */
170 charge_state = CHARGE_STATE_ERROR;
171 }
172 /* else end of charge */
173
174 disable_charger();
175 break;
176 } /* CHARGING: */
177
178 default:
179 /* DISABLED, ERROR */
180 break;
181 }
182}
183
184static inline void charger_unplugged(void)
185{
186 disable_charger();
187 if (charge_state >= CHARGE_STATE_ERROR)
188 charge_state = DISCHARGING; /* Reset error */
189}
190
191/* Main charging algorithm - called from powermgmt.c */
192void charging_algorithm_step(void)
193{
194 switch (charger_input_state)
195 {
196 case NO_CHARGER:
197 /* Nothing to do */
198 break;
199
200 case CHARGER_PLUGGED:
201 charger_plugged();
202 break;
203
204 case CHARGER:
205 charger_control();
206 break;
207
208 case CHARGER_UNPLUGGED:
209 charger_unplugged();
210 break;
211 }
212
213 if (charger_close)
214 {
215 /* Disable further charging and ack. */
216 charge_state = CHARGE_STATE_DISABLED;
217 disable_charger();
218 charger_close = false;
219 }
220}
221
222/* Disable the charger and prepare for poweroff - called off-thread so we
223 * signal the charging thread to prepare to quit. */
224void charging_algorithm_close(void)
225{
226 charger_close = true;
227
228 /* Power management thread will set it false again. */
229 while (charger_close)
230 sleep(HZ/10);
231}
diff --git a/firmware/target/arm/sandisk/powermgmt-target.h b/firmware/target/arm/sandisk/powermgmt-target.h
new file mode 100644
index 0000000000..aa6a0e0e3d
--- /dev/null
+++ b/firmware/target/arm/sandisk/powermgmt-target.h
@@ -0,0 +1,59 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2009 by Michael Sevakis
11 * Copyright (C) 2008 by Bertrik Sikken
12 *
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation; either version 2
16 * of the License, or (at your option) any later version.
17 *
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
20 *
21 ****************************************************************************/
22#ifndef POWERMGMT_TARGET_H
23#define POWERMGMT_TARGET_H
24
25#if defined(SANSA_C200)
26/* This configuration triggers a single charge cycle upon plugging and stops.
27 * The true voltage cannot be read accurately and so monitoring isn't really
28 * possible. The battery filter is still synced to have a proper reading
29 * when disconnecting. */
30#define BATT_FULL_VOLTAGE 5121 /* Won't read this high - force start */
31#define BATT_VAUTO_RECHARGE 0 /* Won't read this low - force one cycle */
32#define BATT_CHG_V CHG_V_4_20V
33#define BATT_CHG_I CHG_I_300MA
34#define CHARGER_TOTAL_TIMER (4*3600*2) /* 4 hours enough? */
35#define ADC_BATTERY ADC_BVDD
36#elif defined(SANSA_E200)
37/* PREFERRED - Check if topped-off and monitor voltage while plugged. */
38#define BATT_FULL_VOLTAGE 4160
39#define BATT_VAUTO_RECHARGE 4100
40#define BATT_CHG_V CHG_V_4_20V
41#define BATT_CHG_I CHG_I_300MA
42#define CHARGER_TOTAL_TIMER (4*3600*2) /* 4 hours enough? */
43/* On e200 ADC_RTCSUP seems to represent battery voltage better than
44 * ADC_BVDD during charging (ADC_BVDD is way too high) and appears the
45 * same in normal use.
46 */
47#define ADC_BATTERY ADC_RTCSUP
48#endif
49
50void powermgmt_init_target(void);
51void charging_algorithm_step(void);
52void charging_algorithm_close(void);
53
54/* We want to be able to reset the averaging filter */
55#define HAVE_RESET_BATTERY_FILTER
56
57#define BATT_AVE_SAMPLES 32
58
59#endif /* POWERMGMT_TARGET_H */
diff --git a/firmware/target/arm/sandisk/sansa-c200/powermgmt-c200.c b/firmware/target/arm/sandisk/sansa-c200/powermgmt-c200.c
index 963e7218de..9d7a0e2965 100644
--- a/firmware/target/arm/sandisk/sansa-c200/powermgmt-c200.c
+++ b/firmware/target/arm/sandisk/sansa-c200/powermgmt-c200.c
@@ -38,8 +38,8 @@ const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] =
38const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = 38const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] =
39{ 39{
40 40
41 /* NOTE: why is the top voltage 4237? That's just too high. */
41 { 3286, 3679, 3734, 3764, 3788, 3824, 3886, 3950, 4014, 4098, 4237 }, 42 { 3286, 3679, 3734, 3764, 3788, 3824, 3886, 3950, 4014, 4098, 4237 },
42
43}; 43};
44 44
45/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ 45/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */
@@ -48,14 +48,3 @@ const unsigned short percent_to_volt_charge[11] =
48 /* Sansa c200 has a 530 mAh LiPo battery */ 48 /* Sansa c200 has a 530 mAh LiPo battery */
49 3300, 3390, 3480, 3570, 3660, 3750, 3840, 3930, 4020, 4110, 4200 49 3300, 3390, 3480, 3570, 3660, 3750, 3840, 3930, 4020, 4110, 4200
50}; 50};
51
52/* ADC should read 0x3ff=5.12V */
53#define BATTERY_SCALE_FACTOR 5125
54/* full-scale ADC readout (2^10) in millivolt */
55
56/* Returns battery voltage from ADC [millivolts] */
57unsigned int battery_adc_voltage(void)
58{
59 return (adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR) >> 10;
60}
61
diff --git a/firmware/target/arm/sandisk/sansa-e200/powermgmt-e200.c b/firmware/target/arm/sandisk/sansa-e200/powermgmt-e200.c
index 43f37463f8..144ca37ebf 100644
--- a/firmware/target/arm/sandisk/sansa-e200/powermgmt-e200.c
+++ b/firmware/target/arm/sandisk/sansa-e200/powermgmt-e200.c
@@ -47,14 +47,3 @@ const unsigned short percent_to_volt_charge[11] =
47 /* Sansa Li Ion 750mAH FIXME */ 47 /* Sansa Li Ion 750mAH FIXME */
48 3300, 3680, 3740, 3760, 3780, 3810, 3870, 3930, 3970, 4070, 4160 48 3300, 3680, 3740, 3760, 3780, 3810, 3870, 3930, 3970, 4070, 4160
49}; 49};
50
51/* ADC should read 0x3ff=5.12V */
52#define BATTERY_SCALE_FACTOR 5125
53/* full-scale ADC readout (2^10) in millivolt */
54
55/* Returns battery voltage from ADC [millivolts] */
56unsigned int battery_adc_voltage(void)
57{
58 return (adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR) >> 10;
59}
60