summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
authorMark Arigo <markarigo@gmail.com>2007-09-06 03:28:58 +0000
committerMark Arigo <markarigo@gmail.com>2007-09-06 03:28:58 +0000
commitdbc6b4e39a8f68708bc20a7b3295662c7871856a (patch)
tree725674ac56a56c80246181f1e42342ada60b7199 /firmware/target/arm
parent4f3bcbbb11905c95337fcbe670a1b7da477fbf13 (diff)
downloadrockbox-dbc6b4e39a8f68708bc20a7b3295662c7871856a.tar.gz
rockbox-dbc6b4e39a8f68708bc20a7b3295662c7871856a.zip
Sansa c200 port. Rockbox works with sound. Several features are disabled including some lcd options, FM radio, recording, and all plugins. Loading the OF from the Rockbox bootloader does not work.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14625 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm')
-rw-r--r--firmware/target/arm/crt0-pp.S2
-rw-r--r--firmware/target/arm/i2c-pp.c17
-rw-r--r--firmware/target/arm/i2s-pp.c2
-rw-r--r--firmware/target/arm/sandisk/ata-c200_e200.c27
-rw-r--r--firmware/target/arm/sandisk/backlight-c200_e200.c7
-rw-r--r--firmware/target/arm/sandisk/backlight-target.h2
-rw-r--r--firmware/target/arm/sandisk/power-c200_e200.c7
-rw-r--r--firmware/target/arm/sandisk/sansa-c200/button-c200.c62
-rw-r--r--firmware/target/arm/sandisk/sansa-c200/button-target.h53
-rw-r--r--firmware/target/arm/sandisk/sansa-c200/lcd-c200.c249
-rw-r--r--firmware/target/arm/sandisk/sansa-c200/powermgmt-c200.c58
-rw-r--r--firmware/target/arm/system-pp502x.c6
12 files changed, 486 insertions, 6 deletions
diff --git a/firmware/target/arm/crt0-pp.S b/firmware/target/arm/crt0-pp.S
index 85dd7f8b24..c1ced11cec 100644
--- a/firmware/target/arm/crt0-pp.S
+++ b/firmware/target/arm/crt0-pp.S
@@ -60,7 +60,7 @@ start:
60.space 60*4 /* (more than enough) space for exception vectors and mi4 magic */ 60.space 60*4 /* (more than enough) space for exception vectors and mi4 magic */
61 61
62pad_skip: 62pad_skip:
63#ifdef SANSA_E200 63#if defined(SANSA_E200) || defined(SANSA_C200)
64 /* On the Sansa, copying the vectors fails if the cache is initialised */ 64 /* On the Sansa, copying the vectors fails if the cache is initialised */
65 ldr r1, =CACHE_CTRL 65 ldr r1, =CACHE_CTRL
66 mov r2, #0x0 66 mov r2, #0x0
diff --git a/firmware/target/arm/i2c-pp.c b/firmware/target/arm/i2c-pp.c
index 07fa822ab3..1cc25a1a10 100644
--- a/firmware/target/arm/i2c-pp.c
+++ b/firmware/target/arm/i2c-pp.c
@@ -198,10 +198,27 @@ void i2c_init(void)
198 outl(0x0, 0x600060a4); 198 outl(0x0, 0x600060a4);
199 outl(0x80 | (0 << 8), 0x600060a4); 199 outl(0x80 | (0 << 8), 0x600060a4);
200#elif CONFIG_I2C == I2C_PP5024 200#elif CONFIG_I2C == I2C_PP5024
201#ifdef SANSA_E200
201 /* Sansa OF sets this to 0x20 first, communicates with the AS3514 202 /* Sansa OF sets this to 0x20 first, communicates with the AS3514
202 then sets it to 0x23 - this still works fine though */ 203 then sets it to 0x23 - this still works fine though */
203 outl(0x0, 0x600060a4); 204 outl(0x0, 0x600060a4);
204 outl(0x23, 0x600060a4); 205 outl(0x23, 0x600060a4);
206#elif defined(SANSA_C200)
207 /* This is the init sequence from the Sansa c200 bootloader.
208 I'm not sure what's really necessary. */
209 pp_i2c_wait_not_busy();
210
211 outl(0, 0x600060a4);
212 outl(0x64, 0x600060a4);
213
214 outl(0x55, 0x7000c02c);
215 outl(0x54, 0x7000c030);
216
217 outl(0, 0x600060a4);
218 outl(0x1e, 0x600060a4);
219
220 pp_i2c_send(0x46, 0x24, 5);
221#endif
205#endif 222#endif
206 223
207 spinlock_init(&i2c_mutex); 224 spinlock_init(&i2c_mutex);
diff --git a/firmware/target/arm/i2s-pp.c b/firmware/target/arm/i2s-pp.c
index b9e32b8789..fc01e38e91 100644
--- a/firmware/target/arm/i2s-pp.c
+++ b/firmware/target/arm/i2s-pp.c
@@ -142,7 +142,7 @@ void i2s_reset(void)
142 IISFIFO_CFG |= 0x1100; 142 IISFIFO_CFG |= 0x1100;
143} 143}
144 144
145#ifdef SANSA_E200 145#if defined(SANSA_E200) || defined(SANSA_C200)
146void i2s_scale_attn_level(long frequency) 146void i2s_scale_attn_level(long frequency)
147{ 147{
148 unsigned int iisfifo_cfg = IISFIFO_CFG & ~0xff; 148 unsigned int iisfifo_cfg = IISFIFO_CFG & ~0xff;
diff --git a/firmware/target/arm/sandisk/ata-c200_e200.c b/firmware/target/arm/sandisk/ata-c200_e200.c
index a61e2ab610..addc490417 100644
--- a/firmware/target/arm/sandisk/ata-c200_e200.c
+++ b/firmware/target/arm/sandisk/ata-c200_e200.c
@@ -519,6 +519,7 @@ static int sd_select_bank(unsigned char bank)
519static void sd_card_mux(int card_no) 519static void sd_card_mux(int card_no)
520{ 520{
521/* Set the current card mux */ 521/* Set the current card mux */
522#ifdef SANSA_E200
522 if (card_no == 0) 523 if (card_no == 0)
523 { 524 {
524 outl(inl(0x70000080) | 0x4, 0x70000080); 525 outl(inl(0x70000080) | 0x4, 0x70000080);
@@ -543,6 +544,32 @@ static void sd_card_mux(int card_no)
543 544
544 outl(inl(0x70000014) & ~(0x3ffff), 0x70000014); 545 outl(inl(0x70000014) & ~(0x3ffff), 0x70000014);
545 } 546 }
547#else /* SANSA_C200 */
548 if (card_no == 0)
549 {
550 outl(inl(0x70000080) | 0x4, 0x70000080);
551
552 GPIOD_ENABLE &= ~0x1f;
553 GPIOD_OUTPUT_EN &= ~0x1f;
554 GPIOA_ENABLE |= 0x7a;
555 GPIOA_OUTPUT_VAL |= 0x7a;
556 GPIOA_OUTPUT_EN |= 0x7a;
557
558 outl(inl(0x70000014) & ~(0x3ffff), 0x70000014);
559 }
560 else
561 {
562 outl(inl(0x70000080) & ~0x4, 0x70000080);
563
564 GPIOA_ENABLE &= ~0x7a;
565 GPIOA_OUTPUT_EN &= ~0x7a;
566 GPIOD_ENABLE |= 0x1f;
567 GPIOD_OUTPUT_VAL |= 0x1f;
568 GPIOD_OUTPUT_EN |= 0x1f;
569
570 outl((inl(0x70000014) & ~(0x3ffff)) | 0x255aa, 0x70000014);
571 }
572#endif
546} 573}
547 574
548static void sd_init_device(int card_no) 575static void sd_init_device(int card_no)
diff --git a/firmware/target/arm/sandisk/backlight-c200_e200.c b/firmware/target/arm/sandisk/backlight-c200_e200.c
index 29c6ab4b45..411c19f7ad 100644
--- a/firmware/target/arm/sandisk/backlight-c200_e200.c
+++ b/firmware/target/arm/sandisk/backlight-c200_e200.c
@@ -36,17 +36,21 @@ void __backlight_set_brightness(int brightness)
36 36
37void __backlight_on(void) 37void __backlight_on(void)
38{ 38{
39#ifdef HAVE_LCD_ENABLE
39 lcd_enable(true); /* power on lcd */ 40 lcd_enable(true); /* power on lcd */
41#endif
40 pp_i2c_send( 0x46, 0x23, backlight_brightness); 42 pp_i2c_send( 0x46, 0x23, backlight_brightness);
41} 43}
42 44
43void __backlight_off(void) 45void __backlight_off(void)
44{ 46{
45 pp_i2c_send( 0x46, 0x23, 0x0); 47 pp_i2c_send( 0x46, 0x23, 0x0);
48#ifdef HAVE_LCD_ENABLE
46 lcd_enable(false); /* power off lcd */ 49 lcd_enable(false); /* power off lcd */
50#endif
47} 51}
48 52
49 53#ifdef HAVE_BUTTON_LIGHT
50void __button_backlight_on(void) 54void __button_backlight_on(void)
51{ 55{
52 GPIOG_OUTPUT_VAL |=0x80; 56 GPIOG_OUTPUT_VAL |=0x80;
@@ -56,3 +60,4 @@ void __button_backlight_off(void)
56{ 60{
57 GPIOG_OUTPUT_VAL &=~ 0x80; 61 GPIOG_OUTPUT_VAL &=~ 0x80;
58} 62}
63#endif
diff --git a/firmware/target/arm/sandisk/backlight-target.h b/firmware/target/arm/sandisk/backlight-target.h
index ac256036b9..1b1a6ad4e1 100644
--- a/firmware/target/arm/sandisk/backlight-target.h
+++ b/firmware/target/arm/sandisk/backlight-target.h
@@ -25,6 +25,8 @@ void __backlight_off(void);
25void __backlight_set_brightness(int brightness); 25void __backlight_set_brightness(int brightness);
26int __backlight_is_on(void); 26int __backlight_is_on(void);
27 27
28#ifdef HAVE_BUTTON_LIGHT
28void __button_backlight_on(void); 29void __button_backlight_on(void);
29void __button_backlight_off(void); 30void __button_backlight_off(void);
30#endif 31#endif
32#endif
diff --git a/firmware/target/arm/sandisk/power-c200_e200.c b/firmware/target/arm/sandisk/power-c200_e200.c
index b9a77cb9e0..cb85b117c4 100644
--- a/firmware/target/arm/sandisk/power-c200_e200.c
+++ b/firmware/target/arm/sandisk/power-c200_e200.c
@@ -53,7 +53,11 @@ void power_off(void)
53 53
54bool charger_inserted(void) 54bool charger_inserted(void)
55{ 55{
56#ifdef SANSA_E200
56 if(GPIOB_INPUT_VAL & 0x10) 57 if(GPIOB_INPUT_VAL & 0x10)
58#else /* SANSA_C200 */
59 if(GPIOH_INPUT_VAL & 0x2)
60#endif
57 return true; 61 return true;
58 return false; 62 return false;
59} 63}
@@ -63,6 +67,7 @@ void ide_power_enable(bool on)
63 (void)on; 67 (void)on;
64} 68}
65 69
70#if CONFIG_TUNER
66/** Tuner **/ 71/** Tuner **/
67static bool powered = false; 72static bool powered = false;
68 73
@@ -125,3 +130,5 @@ bool tuner_power(bool status)
125 lv24020lp_unlock(); 130 lv24020lp_unlock();
126 return old_status; 131 return old_status;
127} 132}
133
134#endif
diff --git a/firmware/target/arm/sandisk/sansa-c200/button-c200.c b/firmware/target/arm/sandisk/sansa-c200/button-c200.c
new file mode 100644
index 0000000000..eedd937699
--- /dev/null
+++ b/firmware/target/arm/sandisk/sansa-c200/button-c200.c
@@ -0,0 +1,62 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id:$
9 *
10 * Copyright (C) 2007 by Mark Arigo
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20#include "system.h"
21#include "button.h"
22#include "backlight.h"
23
24void button_init_device(void)
25{
26 /* TODO...for now, hardware initialisation is done by the c200 bootloader */
27}
28
29bool button_hold(void)
30{
31 return !(GPIOI_INPUT_VAL & 0x80);
32}
33
34/*
35 * Get button pressed from hardware
36 */
37int button_read_device(void)
38{
39 int btn = BUTTON_NONE;
40 static bool hold_button = false;
41 bool hold_button_old;
42
43 /* Hold */
44 hold_button_old = hold_button;
45 hold_button = button_hold();
46
47 /* device buttons */
48 if (!hold_button)
49 {
50 if ( (GPIOB_INPUT_VAL & 0x20)) btn |= BUTTON_POWER;
51 if (!(GPIOG_INPUT_VAL & 0x10)) btn |= BUTTON_UP;
52 if (!(GPIOH_INPUT_VAL & 0x01)) btn |= BUTTON_DOWN;
53 if (!(GPIOI_INPUT_VAL & 0x04)) btn |= BUTTON_LEFT;
54 if (!(GPIOG_INPUT_VAL & 0x02)) btn |= BUTTON_RIGHT;
55 if (!(GPIOL_INPUT_VAL & 0x04)) btn |= BUTTON_SELECT;
56 if (!(GPIOG_INPUT_VAL & 0x01)) btn |= BUTTON_REC;
57 if (!(GPIOL_INPUT_VAL & 0x10)) btn |= BUTTON_VOL_UP;
58 if (!(GPIOL_INPUT_VAL & 0x20)) btn |= BUTTON_VOL_DOWN;
59 }
60
61 return btn;
62}
diff --git a/firmware/target/arm/sandisk/sansa-c200/button-target.h b/firmware/target/arm/sandisk/sansa-c200/button-target.h
new file mode 100644
index 0000000000..6f42822f7f
--- /dev/null
+++ b/firmware/target/arm/sandisk/sansa-c200/button-target.h
@@ -0,0 +1,53 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id:$
9 *
10 * Copyright (C) 2007 by Mark Arigo
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20#ifndef _BUTTON_TARGET_H_
21#define _BUTTON_TARGET_H_
22
23#include <stdbool.h>
24#include "config.h"
25
26#define HAS_BUTTON_HOLD
27
28bool button_hold(void);
29void button_init_device(void);
30int button_read_device(void);
31
32/* Sandisk Sansa c200 button codes */
33
34/* Main unit's buttons */
35#define BUTTON_REC 0x00000001
36#define BUTTON_DOWN 0x00000002
37#define BUTTON_RIGHT 0x00000004
38#define BUTTON_LEFT 0x00000008
39#define BUTTON_SELECT 0x00000010
40#define BUTTON_UP 0x00000020
41#define BUTTON_POWER 0x00000040
42#define BUTTON_VOL_UP 0x00000080
43#define BUTTON_VOL_DOWN 0x00000100
44
45#define BUTTON_MAIN 0x00000fff
46
47/* No Remote control */
48#define BUTTON_REMOTE 0
49
50#define POWEROFF_BUTTON BUTTON_POWER
51#define POWEROFF_COUNT 10
52
53#endif /* _BUTTON_TARGET_H_ */
diff --git a/firmware/target/arm/sandisk/sansa-c200/lcd-c200.c b/firmware/target/arm/sandisk/sansa-c200/lcd-c200.c
new file mode 100644
index 0000000000..6626ea4e6d
--- /dev/null
+++ b/firmware/target/arm/sandisk/sansa-c200/lcd-c200.c
@@ -0,0 +1,249 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id:$
9 *
10 * Copyright (C) 2007 by Mark Arigo
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19#include "config.h"
20#include "cpu.h"
21#include "lcd.h"
22#include "kernel.h"
23#include "system.h"
24
25#define LCD_BASE (*(volatile unsigned long *)(0x70003000))
26#define LCD_CMD (*(volatile unsigned long *)(0x70003008))
27#define LCD_DATA (*(volatile unsigned long *)(0x70003010))
28
29#define LCD_BUSY 0x8000
30
31/* check if number of useconds has past */
32static inline bool timer_check(int clock_start, int usecs)
33{
34 return ((int)(USEC_TIMER - clock_start)) >= usecs;
35}
36
37/* wait for LCD with timeout */
38static inline void lcd_wait_write(void)
39{
40 int start = USEC_TIMER;
41
42 do {
43 if ((LCD_BASE & LCD_BUSY) == 0)
44 break;
45 } while (timer_check(start, 1000) == 0);
46}
47
48/* send LCD data */
49static void lcd_send_data(unsigned data)
50{
51 lcd_wait_write();
52 LCD_DATA = (data >> 8) & 0xff;
53
54 lcd_wait_write();
55 LCD_DATA = data & 0xff;
56}
57
58/* send LCD command */
59static void lcd_send_command(unsigned cmd)
60{
61 lcd_wait_write();
62 LCD_CMD = cmd;
63}
64
65/* LCD init */
66void lcd_init_device(void)
67{
68 /* This is from the c200 of bootloader beginning at offset 0xbbf4 */
69 outl(inl(0x70000010) & ~0xfc000000, 0x70000010);
70 outl(inl(0x70000010), 0x70000010);
71
72 DEV_INIT &= ~0x400;
73 udelay(10000);
74
75 LCD_BASE &= ~0x4;
76 udelay(15);
77
78 LCD_BASE |= 0x4;
79 udelay(10);
80
81 LCD_BASE = 0x4687;
82 udelay(10000);
83
84 lcd_send_command(0x2c);
85 udelay(20000);
86
87 lcd_send_command(0x02);
88 lcd_send_command(0x01);
89 udelay(20000);
90
91 lcd_send_command(0x26);
92 lcd_send_command(0x01);
93 udelay(20000);
94
95 lcd_send_command(0x26);
96 lcd_send_command(0x09);
97 udelay(20000);
98
99 lcd_send_command(0x26);
100 lcd_send_command(0x0b);
101 udelay(20000);
102
103 lcd_send_command(0x26);
104 lcd_send_command(0x0f);
105 udelay(20000);
106
107 lcd_send_command(0x10);
108 lcd_send_command(0x07);
109
110 lcd_send_command(0x20);
111 lcd_send_command(0x03);
112
113 lcd_send_command(0x24);
114 lcd_send_command(0x03);
115
116 lcd_send_command(0x28);
117 lcd_send_command(0x01);
118
119 lcd_send_command(0x2a);
120 lcd_send_command(0x55);
121
122 lcd_send_command(0x30);
123 lcd_send_command(0x10);
124
125 lcd_send_command(0x32);
126 lcd_send_command(0x0e);
127
128 lcd_send_command(0x34);
129 lcd_send_command(0x0d);
130
131 lcd_send_command(0x36);
132 lcd_send_command(0);
133
134 lcd_send_command(0x40);
135 lcd_send_command(0x82);
136
137 lcd_send_command(0x43); /* vertical dimensions */
138 lcd_send_command(0x1a); /* y1 + 0x1a */
139 lcd_send_command(LCD_HEIGHT - 1 + 0x1a); /* y2 + 0x1a */
140
141 lcd_send_command(0x42); /* horizontal dimensions */
142 lcd_send_command(0); /* x1 */
143 lcd_send_command(LCD_WIDTH - 1); /* x2 */
144 udelay(100000);
145
146 lcd_send_command(0x51);
147}
148
149/*** hardware configuration ***/
150int lcd_default_contrast(void)
151{
152 return DEFAULT_CONTRAST_SETTING;
153}
154
155void lcd_set_contrast(int val)
156{
157 /* TODO: Implement lcd_set_contrast() */
158 (void)val;
159}
160
161void lcd_set_invert_display(bool yesno)
162{
163 /* TODO: Implement lcd_set_invert_display() */
164 (void)yesno;
165}
166
167/* turn the display upside down (call lcd_update() afterwards) */
168void lcd_set_flip(bool yesno)
169{
170 /* TODO: Implement lcd_set_flip() */
171 (void)yesno;
172}
173
174/*** update functions ***/
175
176/* Performance function that works with an external buffer
177 note that by and bheight are in 4-pixel units! */
178void lcd_blit(const fb_data* data, int x, int by, int width,
179 int bheight, int stride)
180{
181 /* TODO: Implement lcd_blit() */
182 (void)data;
183 (void)x;
184 (void)by;
185 (void)width;
186 (void)bheight;
187 (void)stride;
188}
189
190/* Performance function to blit a YUV bitmap directly to the LCD */
191void lcd_yuv_blit(unsigned char * const src[3],
192 int src_x, int src_y, int stride,
193 int x, int y, int width, int height)
194{
195 (void)src;
196 (void)src_x;
197 (void)src_y;
198 (void)stride;
199 (void)x;
200 (void)y;
201 (void)width;
202 (void)height;
203}
204
205/* Update the display.
206 This must be called after all other LCD functions that change the display. */
207void lcd_update(void)
208{
209 lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT);
210}
211
212/* Update a fraction of the display. */
213void lcd_update_rect(int x0, int y0, int width, int height)
214{
215 unsigned short *addr;
216 int c, r;
217 int x1 = (x0 + width) - 1;
218 int y1 = (y0 + height) - 1;
219
220 if ((x1 <= 0) || (y1 <= 0))
221 return;
222
223 if(y1 >= LCD_HEIGHT)
224 y1 = LCD_HEIGHT - 1;
225
226 lcd_send_command(0x43);
227 lcd_send_command(y0 + 0x1a);
228 lcd_send_command(y1 + 0x1a);
229
230 if(x1 >= LCD_WIDTH)
231 x1 = LCD_WIDTH - 1;
232
233 lcd_send_command(0x42);
234 lcd_send_command(x0);
235 lcd_send_command(x1);
236
237 addr = (unsigned short*)&lcd_framebuffer[y0][x0];
238
239 /* for each row */
240 for (r = 0; r < height; r++) {
241 /* for each column */
242 for (c = 0; c < width; c++) {
243 /* output 1 pixel */
244 lcd_send_data(*(addr++));
245 }
246
247 addr += LCD_WIDTH - width;
248 }
249}
diff --git a/firmware/target/arm/sandisk/sansa-c200/powermgmt-c200.c b/firmware/target/arm/sandisk/sansa-c200/powermgmt-c200.c
new file mode 100644
index 0000000000..1de57cb184
--- /dev/null
+++ b/firmware/target/arm/sandisk/sansa-c200/powermgmt-c200.c
@@ -0,0 +1,58 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id: powermgmt-e200.c 14375 2007-08-17 06:45:18Z amiconn $
9 *
10 * Copyright (C) 2002 by Heikki Hannikainen, Uwe Freese
11 * Revisions copyright (C) 2005 by Gerald Van Baren
12 *
13 * All files in this archive are subject to the GNU General Public License.
14 * See the file COPYING in the source tree root for full license agreement.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20
21#include "config.h"
22#include "adc.h"
23#include "powermgmt.h"
24
25const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
26{
27 3400
28};
29
30const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] =
31{
32 3300
33};
34
35/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */
36const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] =
37{
38 /* Sansa Li Ion 750mAH FIXME this is a first linear approach */
39 { 3300, 3390, 3480, 3570, 3660, 3750, 3840, 3930, 4020, 4110, 4200 },
40};
41
42/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */
43const unsigned short percent_to_volt_charge[11] =
44{
45 /* Sansa Li Ion 750mAH FIXME*/
46 3300, 3390, 3480, 3570, 3660, 3750, 3840, 3930, 4020, 4110, 4200
47};
48
49/* ADC should read 0x3ff=5.12V */
50#define BATTERY_SCALE_FACTOR 5125
51/* full-scale ADC readout (2^10) in millivolt */
52
53/* Returns battery voltage from ADC [millivolts] */
54unsigned int battery_adc_voltage(void)
55{
56 return (adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR) >> 10;
57}
58
diff --git a/firmware/target/arm/system-pp502x.c b/firmware/target/arm/system-pp502x.c
index a282564d19..465457d0e1 100644
--- a/firmware/target/arm/system-pp502x.c
+++ b/firmware/target/arm/system-pp502x.c
@@ -120,7 +120,7 @@ static void pp_set_cpu_frequency(long frequency)
120 while (test_and_set(&boostctrl_mtx.locked, 1)) ; 120 while (test_and_set(&boostctrl_mtx.locked, 1)) ;
121#endif 121#endif
122 122
123#ifdef SANSA_E200 123#if defined(SANSA_E200) || defined(SANSA_C200)
124 i2s_scale_attn_level(CPUFREQ_DEFAULT); 124 i2s_scale_attn_level(CPUFREQ_DEFAULT);
125#endif 125#endif
126 126
@@ -183,7 +183,7 @@ static void pp_set_cpu_frequency(long frequency)
183 CLCD_CLOCK_SRC; /* dummy read (to sync the write pipeline??) */ 183 CLCD_CLOCK_SRC; /* dummy read (to sync the write pipeline??) */
184 CLCD_CLOCK_SRC = clcd_clock_src; /* restore saved value */ 184 CLCD_CLOCK_SRC = clcd_clock_src; /* restore saved value */
185 185
186#ifdef SANSA_E200 186#if defined(SANSA_E200) || defined(SANSA_C200)
187 i2s_scale_attn_level(frequency); 187 i2s_scale_attn_level(frequency);
188#endif 188#endif
189 189
@@ -231,7 +231,7 @@ void system_init(void)
231 GPIOK_INT_EN = 0; 231 GPIOK_INT_EN = 0;
232 GPIOL_INT_EN = 0; 232 GPIOL_INT_EN = 0;
233 233
234#ifdef SANSA_E200 234#if defined(SANSA_E200) || defined(SANSA_C200)
235 /* outl(0x00000000, 0x6000b000); */ 235 /* outl(0x00000000, 0x6000b000); */
236 outl(inl(0x6000a000) | 0x80000000, 0x6000a000); /* Init DMA controller? */ 236 outl(inl(0x6000a000) | 0x80000000, 0x6000a000); /* Init DMA controller? */
237#endif 237#endif