diff options
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c | 117 |
1 files changed, 61 insertions, 56 deletions
diff --git a/firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c b/firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c index 673f76d616..f78b642644 100644 --- a/firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c +++ b/firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c | |||
@@ -136,6 +136,15 @@ void LCD_SPI_send(const unsigned char *array, int count) | |||
136 | } | 136 | } |
137 | } | 137 | } |
138 | 138 | ||
139 | void LCD_SPI_setreg(unsigned char reg, unsigned char value) | ||
140 | { | ||
141 | unsigned char regval[] = | ||
142 | { | ||
143 | 0x00,reg,0x01,value | ||
144 | }; | ||
145 | LCD_SPI_send(regval, sizeof(regval)); | ||
146 | } | ||
147 | |||
139 | void LCD_SPI_SS(bool select) | 148 | void LCD_SPI_SS(bool select) |
140 | { | 149 | { |
141 | delay_cycles(0x4FFF); | 150 | delay_cycles(0x4FFF); |
@@ -170,17 +179,10 @@ void LCD_SPI_stop(void) | |||
170 | 179 | ||
171 | void LCD_SPI_powerdown(void) | 180 | void LCD_SPI_powerdown(void) |
172 | { | 181 | { |
173 | const unsigned char powerdncmd[] = | ||
174 | { | ||
175 | 0,0x04,1,0x00 | ||
176 | }; | ||
177 | |||
178 | lcd_powered = false; | 182 | lcd_powered = false; |
179 | 183 | ||
180 | LCD_SPI_start(); | 184 | LCD_SPI_start(); |
181 | 185 | LCD_SPI_setreg(0x04, 0x00); | |
182 | LCD_SPI_send(powerdncmd, sizeof(powerdncmd)); | ||
183 | |||
184 | LCD_SPI_stop(); | 186 | LCD_SPI_stop(); |
185 | 187 | ||
186 | reset_LCD(false); /* This makes a big difference on power */ | 188 | reset_LCD(false); /* This makes a big difference on power */ |
@@ -189,17 +191,10 @@ void LCD_SPI_powerdown(void) | |||
189 | 191 | ||
190 | void LCD_SPI_powerup(void) | 192 | void LCD_SPI_powerup(void) |
191 | { | 193 | { |
192 | const unsigned char powerupcmd[] = | ||
193 | { | ||
194 | 0,0x04,1,0x01 | ||
195 | }; | ||
196 | |||
197 | LCD_CTRL_clock(true); | 194 | LCD_CTRL_clock(true); |
198 | 195 | ||
199 | LCD_SPI_start(); | 196 | LCD_SPI_start(); |
200 | 197 | LCD_SPI_setreg(0x04, 0x01); | |
201 | LCD_SPI_send(powerupcmd, sizeof(powerupcmd)); | ||
202 | |||
203 | LCD_SPI_stop(); | 198 | LCD_SPI_stop(); |
204 | 199 | ||
205 | lcd_powered = true; | 200 | lcd_powered = true; |
@@ -211,45 +206,37 @@ void LCD_SPI_init(void) | |||
211 | * actually telling the lcd. Many thanks to Alex Gerchanovsky for | 206 | * actually telling the lcd. Many thanks to Alex Gerchanovsky for |
212 | * discovering them. | 207 | * discovering them. |
213 | * | 208 | * |
214 | * This looks like a register, data combination, 0 denoting a register | 209 | * Addr 0x04 is used more than once is an enable. |
215 | * address, 1 denoting data. Addr 0x04 is used more than once is | ||
216 | * an enable. | ||
217 | */ | 210 | */ |
218 | const unsigned char initbuf[] = | ||
219 | { | ||
220 | 0,0x0F,1,0x01, | ||
221 | 0,0x09,1,0x06, | ||
222 | 0,0x16,1,0xA6, | ||
223 | 0,0x1E,1,0x49, | ||
224 | 0,0x1F,1,0x26, | ||
225 | 0,0x0B,1,0x2F, | ||
226 | 0,0x0C,1,0x2B, | ||
227 | 0,0x19,1,0x5E, | ||
228 | 0,0x1A,1,0x15, | ||
229 | 0,0x1B,1,0x15, | ||
230 | 0,0x1D,1,0x01, | ||
231 | 0,0x00,1,0x03, | ||
232 | 0,0x01,1,0x10, | ||
233 | 0,0x02,1,0x0A, | ||
234 | 0,0x06,1,0x04, | ||
235 | 0,0x08,1,0x2E, | ||
236 | 0,0x24,1,0x12, | ||
237 | 0,0x25,1,0x3F, | ||
238 | 0,0x26,1,0x0B, | ||
239 | 0,0x27,1,0x00, | ||
240 | 0,0x28,1,0x00, | ||
241 | 0,0x29,1,0xF6, | ||
242 | 0,0x2A,1,0x03, | ||
243 | 0,0x2B,1,0x0A, | ||
244 | 0,0x04,1,0x01, | ||
245 | }; | ||
246 | 211 | ||
247 | LCD_CTRL_clock(true); | 212 | LCD_CTRL_clock(true); |
248 | 213 | ||
249 | LCD_SPI_start(); | 214 | LCD_SPI_start(); |
250 | 215 | LCD_SPI_setreg(0x0F, 0x01); | |
251 | LCD_SPI_send(initbuf, sizeof(initbuf)); | 216 | LCD_SPI_setreg(0x09, 0x06); |
252 | 217 | LCD_SPI_setreg(0x16, 0xA6); | |
218 | LCD_SPI_setreg(0x1E, 0x49); | ||
219 | LCD_SPI_setreg(0x1F, 0x26); | ||
220 | LCD_SPI_setreg(0x0B, 0x2F); | ||
221 | LCD_SPI_setreg(0x0C, 0x2B); | ||
222 | LCD_SPI_setreg(0x19, 0x5E); | ||
223 | LCD_SPI_setreg(0x1A, 0x15); | ||
224 | LCD_SPI_setreg(0x1B, 0x15); | ||
225 | LCD_SPI_setreg(0x1D, 0x01); | ||
226 | LCD_SPI_setreg(0x00, 0x03); | ||
227 | LCD_SPI_setreg(0x01, 0x10); | ||
228 | LCD_SPI_setreg(0x02, 0x0A); | ||
229 | LCD_SPI_setreg(0x06, 0x04); /* Set the orientation */ | ||
230 | LCD_SPI_setreg(0x08, 0x2E); | ||
231 | LCD_SPI_setreg(0x24, 0x12); | ||
232 | LCD_SPI_setreg(0x25, 0x3F); | ||
233 | LCD_SPI_setreg(0x26, 0x0B); | ||
234 | LCD_SPI_setreg(0x27, 0x00); | ||
235 | LCD_SPI_setreg(0x28, 0x00); | ||
236 | LCD_SPI_setreg(0x29, 0xF6); | ||
237 | LCD_SPI_setreg(0x2A, 0x03); | ||
238 | LCD_SPI_setreg(0x2B, 0x0A); | ||
239 | LCD_SPI_setreg(0x04, 0x01); /* Turn the display on */ | ||
253 | LCD_SPI_stop(); | 240 | LCD_SPI_stop(); |
254 | } | 241 | } |
255 | 242 | ||
@@ -265,7 +252,7 @@ void lcd_init_device(void) | |||
265 | 252 | ||
266 | GPBUP |= 0x181; | 253 | GPBUP |= 0x181; |
267 | 254 | ||
268 | s3c_regset(&CLKCON, 0x20); /* enable LCD clock */ | 255 | s3c_regset(&CLKCON, 0x20); /* enable LCD clock */ |
269 | 256 | ||
270 | LCD_CTRL_setup(); | 257 | LCD_CTRL_setup(); |
271 | LCD_SPI_init(); | 258 | LCD_SPI_init(); |
@@ -308,6 +295,29 @@ void lcd_enable(bool state) | |||
308 | } | 295 | } |
309 | } | 296 | } |
310 | 297 | ||
298 | void lcd_set_flip(bool yesno) { | ||
299 | if (!lcd_on) | ||
300 | return; | ||
301 | |||
302 | /* Register 0x06 sets the screen orientation: | ||
303 | * | ||
304 | * Known Values: | ||
305 | * 0x04: Right side up portrait | ||
306 | * 0x02: Upside down protrait | ||
307 | */ | ||
308 | |||
309 | LCD_SPI_start(); | ||
310 | if(yesno) | ||
311 | { | ||
312 | LCD_SPI_setreg(0x06, 0x02); | ||
313 | } | ||
314 | else | ||
315 | { | ||
316 | LCD_SPI_setreg(0x06, 0x04); | ||
317 | } | ||
318 | LCD_SPI_stop(); | ||
319 | } | ||
320 | |||
311 | /* Update a fraction of the display. */ | 321 | /* Update a fraction of the display. */ |
312 | void lcd_update_rect(int x, int y, int width, int height) | 322 | void lcd_update_rect(int x, int y, int width, int height) |
313 | { | 323 | { |
@@ -490,8 +500,3 @@ void lcd_set_invert_display(bool yesno) { | |||
490 | // TODO: | 500 | // TODO: |
491 | } | 501 | } |
492 | 502 | ||
493 | void lcd_set_flip(bool yesno) { | ||
494 | (void) yesno; | ||
495 | // TODO: | ||
496 | } | ||
497 | |||