diff options
Diffstat (limited to 'firmware/target/sh/archos/player/lcd-player.c')
-rw-r--r-- | firmware/target/sh/archos/player/lcd-player.c | 142 |
1 files changed, 74 insertions, 68 deletions
diff --git a/firmware/target/sh/archos/player/lcd-player.c b/firmware/target/sh/archos/player/lcd-player.c index 8f59901116..e8a124f469 100644 --- a/firmware/target/sh/archos/player/lcd-player.c +++ b/firmware/target/sh/archos/player/lcd-player.c | |||
@@ -25,29 +25,33 @@ | |||
25 | #include "lcd.h" | 25 | #include "lcd.h" |
26 | #include "lcd-charcell.h" | 26 | #include "lcd-charcell.h" |
27 | 27 | ||
28 | #define OLD_LCD_CRAM ((char)0xB0) /* Characters */ | 28 | #define OLD_LCD_DDRAM ((char)0xB0) /* Display data (characters) */ |
29 | #define OLD_LCD_PRAM ((char)0x80) /* Patterns */ | 29 | #define OLD_LCD_CGRAM ((char)0x80) /* Character generator (patterns) */ |
30 | #define OLD_LCD_IRAM ((char)0xE0) /* Icons */ | 30 | #define OLD_LCD_ICONRAM ((char)0xE0) |
31 | #define OLD_LCD_CONTRAST_SET ((char)0xA8) | 31 | #define OLD_LCD_CONTRAST_SET ((char)0xA8) |
32 | 32 | #define OLD_LCD_SYSTEM_SET ((char)0x60) | |
33 | #define NEW_LCD_CRAM ((char)0x80) /* Characters */ | 33 | #define OLD_LCD_SET_POWER_SAVE_OSC_CONTROL ((char)0x40) |
34 | #define NEW_LCD_PRAM ((char)0xC0) /* Patterns */ | 34 | #define OLD_LCD_SET_POWER_CONTROL ((char)0x50) |
35 | #define NEW_LCD_IRAM ((char)0x40) /* Icons */ | 35 | #define OLD_LCD_SET_DISPLAY_CONTROL ((char)0x30) |
36 | |||
37 | #define NEW_LCD_DDRAM ((char)0x80) /* Display data (characters) */ | ||
38 | #define NEW_LCD_CGRAM ((char)0xC0) /* Character generator (patterns) */ | ||
39 | #define NEW_LCD_ICONRAM ((char)0x40) | ||
36 | #define NEW_LCD_CONTRAST_SET ((char)0x50) | 40 | #define NEW_LCD_CONTRAST_SET ((char)0x50) |
37 | #define NEW_LCD_FUNCTION_SET ((char)0x10) | 41 | #define NEW_LCD_FUNCTION_SET ((char)0x10) |
38 | #define NEW_LCD_POWER_SAVE_MODE_OSC_CONTROL_SET ((char)0x0c) | 42 | #define NEW_LCD_SET_POWER_SAVE_OSC_CONTROL ((char)0x0c) |
39 | #define NEW_LCD_POWER_CONTROL_REGISTER_SET ((char)0x20) | 43 | #define NEW_LCD_SET_POWER_CONTROL_REG ((char)0x20) |
40 | #define NEW_LCD_DISPLAY_CONTROL_SET ((char)0x28) | 44 | #define NEW_LCD_SET_DISPLAY_CONTROL ((char)0x28) |
41 | #define NEW_LCD_SET_DOUBLE_HEIGHT ((char)0x08) | 45 | #define NEW_LCD_SET_DOUBLE_HEIGHT ((char)0x08) |
42 | 46 | ||
43 | #define LCD_CURSOR(x,y) ((char)(lcd_cram+((y)*16+(x)))) | 47 | #define LCD_CURSOR(x,y) ((char)(lcd_ddram+((y)*16+(x)))) |
44 | #define LCD_ICON(i) ((char)(lcd_iram+i)) | 48 | #define LCD_ICON(i) ((char)(lcd_iconram+i)) |
45 | 49 | ||
46 | static bool new_lcd; | 50 | static bool new_lcd; |
47 | static char lcd_contrast_set; | 51 | static char lcd_contrast_set; |
48 | static char lcd_cram; | 52 | static char lcd_ddram; |
49 | static char lcd_pram; | 53 | static char lcd_cgram; |
50 | static char lcd_iram; | 54 | static char lcd_iconram; |
51 | 55 | ||
52 | /* hardware configuration */ | 56 | /* hardware configuration */ |
53 | 57 | ||
@@ -113,68 +117,70 @@ void lcd_init_device(void) | |||
113 | if (new_lcd) | 117 | if (new_lcd) |
114 | { | 118 | { |
115 | lcd_contrast_set = NEW_LCD_CONTRAST_SET; | 119 | lcd_contrast_set = NEW_LCD_CONTRAST_SET; |
116 | lcd_cram = NEW_LCD_CRAM; | 120 | lcd_ddram = NEW_LCD_DDRAM; |
117 | lcd_pram = NEW_LCD_PRAM; | 121 | lcd_cgram = NEW_LCD_CGRAM; |
118 | lcd_iram = NEW_LCD_IRAM; | 122 | lcd_iconram = NEW_LCD_ICONRAM; |
119 | 123 | ||
120 | /* LCD init for cold start */ | 124 | /* LCD init for cold start */ |
121 | PBCR2 &= 0xff00; /* Set PB0..PB3 to GPIO */ | 125 | PBCR2 &= 0xff00; /* Set PB0..PB3 to GPIO */ |
122 | or_b(0x0f, &PBDRL); /* ... high */ | 126 | or_b(0x0f, &PBDRL); /* ... high */ |
123 | or_b(0x0f, &PBIORL); /* ... and output */ | 127 | or_b(0x0f, &PBIORL); /* ... and output */ |
124 | 128 | ||
125 | lcd_write_command(NEW_LCD_FUNCTION_SET + 1); /* CGRAM selected */ | 129 | lcd_write_command(NEW_LCD_FUNCTION_SET|1); /* CGRAM selected */ |
126 | lcd_write_command_e(NEW_LCD_CONTRAST_SET, 0x08); | 130 | lcd_write_command_e(NEW_LCD_CONTRAST_SET, 0x08); |
127 | lcd_write_command(NEW_LCD_POWER_SAVE_MODE_OSC_CONTROL_SET + 2); | 131 | lcd_write_command(NEW_LCD_SET_POWER_SAVE_OSC_CONTROL|2); |
128 | /* oscillator on */ | 132 | /* oscillator on */ |
129 | lcd_write_command(NEW_LCD_POWER_CONTROL_REGISTER_SET + 7); | 133 | lcd_write_command(NEW_LCD_SET_POWER_CONTROL_REG|7); |
130 | /* opamp buffer + voltage booster on*/ | 134 | /* opamp buffer + voltage booster on */ |
131 | 135 | ||
132 | memset(data_vector, 0x20, 64); | 136 | memset(data_vector, 0x20, 64); |
133 | lcd_write_command(NEW_LCD_CRAM); /* Set DDRAM address */ | 137 | lcd_write_command(NEW_LCD_DDRAM); /* Set DDRAM address */ |
134 | lcd_write_data(data_vector, 64); /* all spaces */ | 138 | lcd_write_data(data_vector, 64); /* all spaces */ |
135 | 139 | ||
136 | memset(data_vector, 0, 64); | 140 | memset(data_vector, 0, 64); |
137 | lcd_write_command(NEW_LCD_PRAM); /* Set CGRAM address */ | 141 | lcd_write_command(NEW_LCD_CGRAM); /* Set CGRAM address */ |
138 | lcd_write_data(data_vector, 64); /* zero out */ | 142 | lcd_write_data(data_vector, 64); /* zero out */ |
139 | lcd_write_command(NEW_LCD_IRAM); /* Set ICONRAM address */ | 143 | lcd_write_command(NEW_LCD_ICONRAM); /* Set ICONRAM address */ |
140 | lcd_write_data(data_vector, 16); /* zero out */ | 144 | lcd_write_data(data_vector, 16); /* zero out */ |
141 | 145 | ||
142 | lcd_write_command(NEW_LCD_DISPLAY_CONTROL_SET + 1); /* display on */ | 146 | lcd_write_command(NEW_LCD_SET_DISPLAY_CONTROL|1); /* display on */ |
143 | } | 147 | } |
144 | else | 148 | else |
145 | { | 149 | { |
146 | lcd_contrast_set = OLD_LCD_CONTRAST_SET; | 150 | lcd_contrast_set = OLD_LCD_CONTRAST_SET; |
147 | lcd_cram = OLD_LCD_CRAM; | 151 | lcd_ddram = OLD_LCD_DDRAM; |
148 | lcd_pram = OLD_LCD_PRAM; | 152 | lcd_cgram = OLD_LCD_CGRAM; |
149 | lcd_iram = OLD_LCD_IRAM; | 153 | lcd_iconram = OLD_LCD_ICONRAM; |
150 | 154 | ||
151 | #if 1 | 155 | #if 1 |
152 | /* LCD init for cold start */ | 156 | /* LCD init for cold start */ |
153 | PBCR2 &= 0xff00; /* Set PB0..PB3 to GPIO */ | 157 | PBCR2 &= 0xff00; /* Set PB0..PB3 to GPIO */ |
154 | or_b(0x0f, &PBDRL); /* ... high */ | 158 | or_b(0x0f, &PBDRL); /* ... high */ |
155 | or_b(0x0f, &PBIORL); /* ... and output */ | 159 | or_b(0x0f, &PBIORL); /* ... and output */ |
156 | 160 | ||
157 | lcd_write_command(0x61); | 161 | lcd_write_command(OLD_LCD_SYSTEM_SET|1); /* CGRAM selected */ |
158 | lcd_write_command(0x42); | 162 | lcd_write_command(OLD_LCD_SET_POWER_SAVE_OSC_CONTROL|2); |
159 | lcd_write_command(0x57); | 163 | /* oscillator on */ |
164 | lcd_write_command(OLD_LCD_SET_POWER_CONTROL|7); | ||
165 | /* voltage regulator, voltage follower and booster on */ | ||
160 | 166 | ||
161 | memset(data_vector, 0x24, 13); | 167 | memset(data_vector, 0x24, 13); |
162 | lcd_write_command(OLD_LCD_CRAM); /* Set DDRAM address */ | 168 | lcd_write_command(OLD_LCD_DDRAM); /* Set DDRAM address */ |
163 | lcd_write_data(data_vector, 13); /* all spaces */ | 169 | lcd_write_data(data_vector, 13); /* all spaces */ |
164 | lcd_write_command(OLD_LCD_CRAM + 0x10); | 170 | lcd_write_command(OLD_LCD_DDRAM + 0x10); |
165 | lcd_write_data(data_vector, 13); | 171 | lcd_write_data(data_vector, 13); |
166 | lcd_write_command(OLD_LCD_CRAM + 0x20); | 172 | lcd_write_command(OLD_LCD_DDRAM + 0x20); |
167 | lcd_write_data(data_vector, 13); | 173 | lcd_write_data(data_vector, 13); |
168 | 174 | ||
169 | memset(data_vector, 0, 32); | 175 | memset(data_vector, 0, 32); |
170 | lcd_write_command(OLD_LCD_PRAM); /* Set CGRAM address */ | 176 | lcd_write_command(OLD_LCD_CGRAM); /* Set CGRAM address */ |
171 | lcd_write_data(data_vector, 32); /* zero out */ | 177 | lcd_write_data(data_vector, 32); /* zero out */ |
172 | lcd_write_command(OLD_LCD_IRAM); /* Set ICONRAM address */ | 178 | lcd_write_command(OLD_LCD_ICONRAM); /* Set ICONRAM address */ |
173 | lcd_write_data(data_vector, 13); /* zero out */ | 179 | lcd_write_data(data_vector, 13); /* zero out */ |
174 | lcd_write_command(OLD_LCD_IRAM + 0x10); | 180 | lcd_write_command(OLD_LCD_ICONRAM + 0x10); |
175 | lcd_write_data(data_vector, 13); | 181 | lcd_write_data(data_vector, 13); |
176 | 182 | ||
177 | lcd_write_command(0x31); | 183 | lcd_write_command(OLD_LCD_SET_DISPLAY_CONTROL|1); /* display on */ |
178 | #else | 184 | #else |
179 | /* archos look-alike code, left here for reference. As soon as the | 185 | /* archos look-alike code, left here for reference. As soon as the |
180 | * rockbox version is confirmed working, this will go away */ | 186 | * rockbox version is confirmed working, this will go away */ |
@@ -194,30 +200,30 @@ void lcd_init_device(void) | |||
194 | 200 | ||
195 | for (i=0; i<100; i++) asm volatile ("nop"); /* wait 50 us */ | 201 | for (i=0; i<100; i++) asm volatile ("nop"); /* wait 50 us */ |
196 | 202 | ||
197 | lcd_write_command(0x61); | 203 | lcd_write_command(OLD_LCD_SYSTEM_SET|1); |
198 | lcd_write_command(0x42); | 204 | lcd_write_command(OLD_LCD_SET_POWER_SAVE_OSC_CONTROL|2); |
199 | lcd_write_command(0x57); | 205 | lcd_write_command(OLD_LCD_SET_POWER_CONTROL|7); |
200 | 206 | ||
201 | memset(data_vector, 0x24, 13); | 207 | memset(data_vector, 0x24, 13); |
202 | lcd_write_command(0xb0); /* Set DDRAM address */ | 208 | lcd_write_command(OLD_LCD_DDRAM); /* Set DDRAM address */ |
203 | lcd_write_data(data_vector, 13); /* all spaces */ | 209 | lcd_write_data(data_vector, 13); /* all spaces */ |
204 | lcd_write_command(0xc0); | 210 | lcd_write_command(OLD_LCD_DDRAM + 0x10); |
205 | lcd_write_data(data_vector, 13); | 211 | lcd_write_data(data_vector, 13); |
206 | lcd_write_command(0xd0); | 212 | lcd_write_command(OLD_LCD_DDRAM + 0x20); |
207 | lcd_write_data(data_vector, 13); | 213 | lcd_write_data(data_vector, 13); |
208 | 214 | ||
209 | memset(data_vector, 0, 32); | 215 | memset(data_vector, 0, 32); |
210 | lcd_write_command(0x80); /* Set CGRAM address */ | 216 | lcd_write_command(OLD_LCD_CGRAM); /* Set CGRAM address */ |
211 | lcd_write_data(data_vector, 32); /* zero out */ | 217 | lcd_write_data(data_vector, 32); /* zero out */ |
212 | lcd_write_command(0xe0); /* Set ICONRAM address */ | 218 | lcd_write_command(OLD_LCD_ICONRAM); /* Set ICONRAM address */ |
213 | lcd_write_data(data_vector, 13); /* zero out */ | 219 | lcd_write_data(data_vector, 13); /* zero out */ |
214 | lcd_write_command(0xf0); | 220 | lcd_write_command(OLD_LCD_ICONRAM + 0x10); |
215 | lcd_write_data(data_vector, 13); | 221 | lcd_write_data(data_vector, 13); |
216 | 222 | ||
217 | for (i=0; i<300000; i++) asm volatile ("nop"); /* wait 150 ms */ | 223 | for (i=0; i<300000; i++) asm volatile ("nop"); /* wait 150 ms */ |
218 | 224 | ||
219 | lcd_write_command(0x31); | 225 | lcd_write_command(OLD_LCD_SET_DISPLAY_CONTROL|1); |
220 | lcd_write_command_e(0xa8, 0); /* Set contrast control */ | 226 | lcd_write_command_e(OLD_LCD_CONTRAST_SET, 0); /* Set contrast */ |
221 | } | 227 | } |
222 | #endif | 228 | #endif |
223 | } | 229 | } |
@@ -234,7 +240,7 @@ void lcd_update(void) | |||
234 | { | 240 | { |
235 | if (lcd_patterns[y].count > 0) | 241 | if (lcd_patterns[y].count > 0) |
236 | { | 242 | { |
237 | lcd_write_command(lcd_pram | (y << 3)); | 243 | lcd_write_command(lcd_cgram | (y << 3)); |
238 | lcd_write_data(lcd_patterns[y].pattern, 7); | 244 | lcd_write_data(lcd_patterns[y].pattern, 7); |
239 | } | 245 | } |
240 | } | 246 | } |