summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
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