diff options
Diffstat (limited to 'firmware/target')
-rw-r--r-- | firmware/target/arm/crt0-pp.S | 2 | ||||
-rw-r--r-- | firmware/target/arm/i2c-pp.c | 17 | ||||
-rw-r--r-- | firmware/target/arm/i2s-pp.c | 2 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/ata-c200_e200.c | 27 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/backlight-c200_e200.c | 7 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/backlight-target.h | 2 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/power-c200_e200.c | 7 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/sansa-c200/button-c200.c | 62 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/sansa-c200/button-target.h | 53 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/sansa-c200/lcd-c200.c | 249 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/sansa-c200/powermgmt-c200.c | 58 | ||||
-rw-r--r-- | firmware/target/arm/system-pp502x.c | 6 |
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 | ||
62 | pad_skip: | 62 | pad_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) |
146 | void i2s_scale_attn_level(long frequency) | 146 | void 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) | |||
519 | static void sd_card_mux(int card_no) | 519 | static 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 | ||
548 | static void sd_init_device(int card_no) | 575 | static 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 | ||
37 | void __backlight_on(void) | 37 | void __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 | ||
43 | void __backlight_off(void) | 45 | void __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 | |
50 | void __button_backlight_on(void) | 54 | void __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); | |||
25 | void __backlight_set_brightness(int brightness); | 25 | void __backlight_set_brightness(int brightness); |
26 | int __backlight_is_on(void); | 26 | int __backlight_is_on(void); |
27 | 27 | ||
28 | #ifdef HAVE_BUTTON_LIGHT | ||
28 | void __button_backlight_on(void); | 29 | void __button_backlight_on(void); |
29 | void __button_backlight_off(void); | 30 | void __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 | ||
54 | bool charger_inserted(void) | 54 | bool 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 **/ |
67 | static bool powered = false; | 72 | static 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 | |||
24 | void button_init_device(void) | ||
25 | { | ||
26 | /* TODO...for now, hardware initialisation is done by the c200 bootloader */ | ||
27 | } | ||
28 | |||
29 | bool button_hold(void) | ||
30 | { | ||
31 | return !(GPIOI_INPUT_VAL & 0x80); | ||
32 | } | ||
33 | |||
34 | /* | ||
35 | * Get button pressed from hardware | ||
36 | */ | ||
37 | int 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 | |||
28 | bool button_hold(void); | ||
29 | void button_init_device(void); | ||
30 | int 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 */ | ||
32 | static 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 */ | ||
38 | static 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 */ | ||
49 | static 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 */ | ||
59 | static void lcd_send_command(unsigned cmd) | ||
60 | { | ||
61 | lcd_wait_write(); | ||
62 | LCD_CMD = cmd; | ||
63 | } | ||
64 | |||
65 | /* LCD init */ | ||
66 | void 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 ***/ | ||
150 | int lcd_default_contrast(void) | ||
151 | { | ||
152 | return DEFAULT_CONTRAST_SETTING; | ||
153 | } | ||
154 | |||
155 | void lcd_set_contrast(int val) | ||
156 | { | ||
157 | /* TODO: Implement lcd_set_contrast() */ | ||
158 | (void)val; | ||
159 | } | ||
160 | |||
161 | void 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) */ | ||
168 | void 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! */ | ||
178 | void 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 */ | ||
191 | void 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. */ | ||
207 | void lcd_update(void) | ||
208 | { | ||
209 | lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT); | ||
210 | } | ||
211 | |||
212 | /* Update a fraction of the display. */ | ||
213 | void 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 | |||
25 | const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = | ||
26 | { | ||
27 | 3400 | ||
28 | }; | ||
29 | |||
30 | const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = | ||
31 | { | ||
32 | 3300 | ||
33 | }; | ||
34 | |||
35 | /* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ | ||
36 | const 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 */ | ||
43 | const 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] */ | ||
54 | unsigned 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 |