summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c')
-rw-r--r--firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c350
1 files changed, 189 insertions, 161 deletions
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
index f2fbf706d7..bc8a20d2ff 100644
--- a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
+++ b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
@@ -62,7 +62,6 @@ static void setup_lcd_pins(bool use_lcdif)
62 } 62 }
63 else 63 else
64 { 64 {
65
66 __REG_SET(HW_PINCTRL_MUXSEL(2)) = 0xffffffff; /* lcd_d{0-15} */ 65 __REG_SET(HW_PINCTRL_MUXSEL(2)) = 0xffffffff; /* lcd_d{0-15} */
67 imx233_enable_gpio_output_mask(1, 0x3ffffff, false); /* lcd_{d{0-17},reset,rs,wr,cs,dotclk,enable,hsync,vsync} */ 66 imx233_enable_gpio_output_mask(1, 0x3ffffff, false); /* lcd_{d{0-17},reset,rs,wr,cs,dotclk,enable,hsync,vsync} */
68 imx233_set_pin_function(1, 16, PINCTRL_FUNCTION_GPIO); /* lcd_d16 */ 67 imx233_set_pin_function(1, 16, PINCTRL_FUNCTION_GPIO); /* lcd_d16 */
@@ -212,6 +211,28 @@ static uint32_t lcd_read_reg(uint32_t reg)
212 return decode_18_to_16(data_in); 211 return decode_18_to_16(data_in);
213} 212}
214 213
214#define REG_MDELAY 0xffffffff
215struct lcd_sequence_entry_t
216{
217 uint32_t reg, data;
218};
219
220static void lcd_send_sequence(struct lcd_sequence_entry_t *seq, unsigned count)
221{
222 for(;count-- > 0; seq++)
223 {
224 if(seq->reg == REG_MDELAY)
225 mdelay(seq->data);
226 else
227 lcd_write_reg(seq->reg, seq->data);
228 }
229}
230
231#define _begin_seq() static struct lcd_sequence_entry_t __seq[] = {
232#define _mdelay(a) {REG_MDELAY, a},
233#define _lcd_write_reg(a, b) {a, b},
234#define _end_seq() }; lcd_send_sequence(__seq, sizeof(__seq) / sizeof(__seq[0]));
235
215static void lcd_init_seq_7783(void) 236static void lcd_init_seq_7783(void)
216{ 237{
217 __REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET; 238 __REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET;
@@ -219,131 +240,129 @@ static void lcd_init_seq_7783(void)
219 __REG_CLR(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET; 240 __REG_CLR(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET;
220 mdelay(10); 241 mdelay(10);
221 __REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET; 242 __REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET;
222 mdelay(200); 243
223 lcd_write_reg(1, 0x100); 244 _begin_seq()
224 lcd_write_reg(2, 0x700); 245 _mdelay(200)
225 lcd_write_reg(3, 0x1030); 246 _lcd_write_reg(1, 0x100)
226 lcd_write_reg(7, 0x121); 247 _lcd_write_reg(2, 0x700)
227 lcd_write_reg(8, 0x302); 248 _lcd_write_reg(3, 0x1030)
228 lcd_write_reg(9, 0x200); 249 _lcd_write_reg(7, 0x121)
229 lcd_write_reg(0xa, 0); 250 _lcd_write_reg(8, 0x302)
230 lcd_write_reg(0x10, 0x790); 251 _lcd_write_reg(9, 0x200)
231 lcd_write_reg(0x11, 5); 252 _lcd_write_reg(0xa, 0)
232 lcd_write_reg(0x12, 0); 253 _lcd_write_reg(0x10, 0x790)
233 lcd_write_reg(0x13, 0); 254 _lcd_write_reg(0x11, 5)
234 mdelay(100); 255 _lcd_write_reg(0x12, 0)
235 lcd_write_reg(0x10, 0x12b0); 256 _lcd_write_reg(0x13, 0)
236 mdelay(100); 257 _mdelay(100)
237 lcd_write_reg(0x11, 7); 258 _lcd_write_reg(0x10, 0x12b0)
238 mdelay(100); 259 _mdelay(100)
239 lcd_write_reg(0x12, 0x89); 260 _lcd_write_reg(0x11, 7)
240 lcd_write_reg(0x13, 0x1d00); 261 _mdelay(100)
241 lcd_write_reg(0x29, 0x2f); 262 _lcd_write_reg(0x12, 0x89)
242 mdelay(50); 263 _lcd_write_reg(0x13, 0x1d00)
243 lcd_write_reg(0x30, 0); 264 _lcd_write_reg(0x29, 0x2f)
244 lcd_write_reg(0x31, 0x505); 265 _mdelay(50)
245 lcd_write_reg(0x32, 0x205); 266 _lcd_write_reg(0x30, 0)
246 lcd_write_reg(0x35, 0x206); 267 _lcd_write_reg(0x31, 0x505)
247 lcd_write_reg(0x36, 0x408); 268 _lcd_write_reg(0x32, 0x205)
248 lcd_write_reg(0x37, 0); 269 _lcd_write_reg(0x35, 0x206)
249 lcd_write_reg(0x38, 0x504); 270 _lcd_write_reg(0x36, 0x408)
250 lcd_write_reg(0x39, 0x206); 271 _lcd_write_reg(0x37, 0)
251 lcd_write_reg(0x3c, 0x206); 272 _lcd_write_reg(0x38, 0x504)
252 lcd_write_reg(0x3d, 0x408); 273 _lcd_write_reg(0x39, 0x206)
253 lcd_write_reg(0x50, 0); /* left X ? */ 274 _lcd_write_reg(0x3c, 0x206)
254 lcd_write_reg(0x51, 0xef); /* right X ? */ 275 _lcd_write_reg(0x3d, 0x408)
255 lcd_write_reg(0x52, 0); /* top Y ? */ 276 _lcd_write_reg(0x50, 0) /* left X ? */
256 lcd_write_reg(0x53, 0x13f); /* bottom Y ? */ 277 _lcd_write_reg(0x51, 0xef) /* right X ? */
257 lcd_write_reg(0x20, 0); /* left X ? */ 278 _lcd_write_reg(0x52, 0) /* top Y ? */
258 lcd_write_reg(0x21, 0); /* top Y ? */ 279 _lcd_write_reg(0x53, 0x13f) /* bottom Y ? */
259 lcd_write_reg(0x60, 0xa700); 280 _lcd_write_reg(0x20, 0) /* left X ? */
260 lcd_write_reg(0x61, 1); 281 _lcd_write_reg(0x21, 0) /* top Y ? */
261 lcd_write_reg(0x90, 0x33); 282 _lcd_write_reg(0x60, 0xa700)
262 lcd_write_reg(0x2b, 0xa); 283 _lcd_write_reg(0x61, 1)
263 lcd_write_reg(9, 0); 284 _lcd_write_reg(0x90, 0x33)
264 lcd_write_reg(7, 0x133); 285 _lcd_write_reg(0x2b, 0xa)
265 mdelay(50); 286 _lcd_write_reg(9, 0)
266 lcd_write_reg(0x22, 0); 287 _lcd_write_reg(7, 0x133)
288 _mdelay(50)
289 _lcd_write_reg(0x22, 0)
290 _end_seq()
267} 291}
268 292
269static void lcd_init_seq_9325(void) 293static void lcd_init_seq_9325(void)
270{ 294{
271 lcd_write_reg(0xe5, 0x78f0); 295 _begin_seq()
272 lcd_write_reg(0xe3, 0x3008); 296 _lcd_write_reg(0xe5, 0x78f0)
273 lcd_write_reg(0xe7, 0x12); 297 _lcd_write_reg(0xe3, 0x3008)
274 lcd_write_reg(0xef, 0x1231); 298 _lcd_write_reg(0xe7, 0x12)
275 lcd_write_reg(0, 1); 299 _lcd_write_reg(0xef, 0x1231)
276 lcd_write_reg(1, 0x100); 300 _lcd_write_reg(0, 1)
277 lcd_write_reg(2, 0x700); 301 _lcd_write_reg(1, 0x100)
278 lcd_write_reg(3, 0x1030); 302 _lcd_write_reg(2, 0x700)
279 lcd_write_reg(4, 0); 303 _lcd_write_reg(3, 0x1030)
280 lcd_write_reg(8, 0x207); 304 _lcd_write_reg(4, 0)
281 lcd_write_reg(9, 0); 305 _lcd_write_reg(8, 0x207)
282 lcd_write_reg(0xa, 0); 306 _lcd_write_reg(9, 0)
283 lcd_write_reg(0xc, 0); 307 _lcd_write_reg(0xa, 0)
284 lcd_write_reg(0xd, 0); 308 _lcd_write_reg(0xc, 0)
285 lcd_write_reg(0xf, 0); 309 _lcd_write_reg(0xd, 0)
286 lcd_write_reg(0x10, 0); 310 _lcd_write_reg(0xf, 0)
287 lcd_write_reg(0x11, 7); 311 _lcd_write_reg(0x10, 0)
288 lcd_write_reg(0x12, 0); 312 _lcd_write_reg(0x11, 7)
289 lcd_write_reg(0x13, 0); 313 _lcd_write_reg(0x12, 0)
290 mdelay(20); 314 _lcd_write_reg(0x13, 0)
291 lcd_write_reg(0x10, 0x1290); 315 _mdelay(20)
292 lcd_write_reg(0x11, 7); 316 _lcd_write_reg(0x10, 0x1290)
293 mdelay(50); 317 _lcd_write_reg(0x11, 7)
294 lcd_write_reg(0x12, 0x19); 318 _mdelay(50)
295 mdelay(50); 319 _lcd_write_reg(0x12, 0x19)
296 lcd_write_reg(0x13, 0x1700); 320 _mdelay(50)
297 lcd_write_reg(0x29, 0x14); 321 _lcd_write_reg(0x13, 0x1700)
298 mdelay(50); 322 _lcd_write_reg(0x29, 0x14)
299 lcd_write_reg(0x20, 0); 323 _mdelay(50)
300 lcd_write_reg(0x21, 0); 324 _lcd_write_reg(0x20, 0)
301 lcd_write_reg(0x30, 0x504); 325 _lcd_write_reg(0x21, 0)
302 lcd_write_reg(0x31, 7); 326 _lcd_write_reg(0x30, 0x504)
303 lcd_write_reg(0x32, 6); 327 _lcd_write_reg(0x31, 7)
304 lcd_write_reg(0x35, 0x106); 328 _lcd_write_reg(0x32, 6)
305 lcd_write_reg(0x36, 0x202); 329 _lcd_write_reg(0x35, 0x106)
306 lcd_write_reg(0x37, 0x504); 330 _lcd_write_reg(0x36, 0x202)
307 lcd_write_reg(0x38, 0x500); 331 _lcd_write_reg(0x37, 0x504)
308 lcd_write_reg(0x39, 0x706); 332 _lcd_write_reg(0x38, 0x500)
309 lcd_write_reg(0x3c, 0x204); 333 _lcd_write_reg(0x39, 0x706)
310 lcd_write_reg(0x3d, 0x202); 334 _lcd_write_reg(0x3c, 0x204)
311 lcd_write_reg(0x50, 0); 335 _lcd_write_reg(0x3d, 0x202)
312 lcd_write_reg(0x51, 0xef); 336 _lcd_write_reg(0x50, 0)
313 lcd_write_reg(0x52, 0); 337 _lcd_write_reg(0x51, 0xef)
314 lcd_write_reg(0x53, 0x13f); 338 _lcd_write_reg(0x52, 0)
315 lcd_write_reg(0x60, 0xa700); 339 _lcd_write_reg(0x53, 0x13f)
316 lcd_write_reg(0x61, 1); 340 _lcd_write_reg(0x60, 0xa700)
317 lcd_write_reg(0x6a, 1); 341 _lcd_write_reg(0x61, 1)
318 lcd_write_reg(0x2b, 0xd); 342 _lcd_write_reg(0x6a, 1)
319 mdelay(50); 343 _lcd_write_reg(0x2b, 0xd)
320 lcd_write_reg(0x90, 0x11); 344 _mdelay(50)
321 lcd_write_reg(0x92, 0x600); 345 _lcd_write_reg(0x90, 0x11)
322 lcd_write_reg(0x93, 3); 346 _lcd_write_reg(0x92, 0x600)
323 lcd_write_reg(0x95, 0x110); 347 _lcd_write_reg(0x93, 3)
324 lcd_write_reg(0x97, 0); 348 _lcd_write_reg(0x95, 0x110)
325 lcd_write_reg(0x98, 0); 349 _lcd_write_reg(0x97, 0)
326 lcd_write_reg(7, 0x173); 350 _lcd_write_reg(0x98, 0)
327 lcd_write_reg(0x22, 0); 351 _lcd_write_reg(7, 0x173)
352 _lcd_write_reg(0x22, 0)
353 _end_seq()
328} 354}
329 355
330void lcd_init_device(void) 356void lcd_init_device(void)
331{ 357{
332 setup_lcdif(); 358 setup_lcdif();
333 setup_lcdif_clock(); 359 setup_lcdif_clock();
334 360
335 for(int i = 0; i < 10; i++) 361 for(int i = 0; i < 10; i++)
336 { 362 {
337 uint32_t kind = lcd_read_reg(0); 363 lcd_kind = lcd_read_reg(0);
338 if(kind == LCD_KIND_7783 || kind == LCD_KIND_9325) 364 if(lcd_kind == LCD_KIND_7783 || lcd_kind == LCD_KIND_9325)
339 {
340 lcd_kind = kind;
341 break; 365 break;
342 }
343 else
344 {
345 lcd_kind = LCD_KIND_OTHER;
346 }
347 } 366 }
348 mdelay(5); 367 mdelay(5);
349 switch(lcd_kind) 368 switch(lcd_kind)
@@ -351,6 +370,7 @@ void lcd_init_device(void)
351 case LCD_KIND_7783: lcd_init_seq_7783(); break; 370 case LCD_KIND_7783: lcd_init_seq_7783(); break;
352 case LCD_KIND_9325: lcd_init_seq_9325(); break; 371 case LCD_KIND_9325: lcd_init_seq_9325(); break;
353 default: 372 default:
373 lcd_kind = LCD_KIND_9325;
354 lcd_init_seq_7783(); break; 374 lcd_init_seq_7783(); break;
355 } 375 }
356} 376}
@@ -360,30 +380,34 @@ static void lcd_enable_7783(bool enable)
360{ 380{
361 if(!enable) 381 if(!enable)
362 { 382 {
363 lcd_write_reg(7, 0x131); 383 _begin_seq()
364 mdelay(50); 384 _lcd_write_reg(7, 0x131)
365 lcd_write_reg(7, 0x20); 385 _mdelay(50)
366 mdelay(50); 386 _lcd_write_reg(7, 0x20)
367 lcd_write_reg(0x10, 0x82); 387 _mdelay(50)
368 mdelay(50); 388 _lcd_write_reg(0x10, 0x82)
389 _mdelay(50)
390 _end_seq()
369 } 391 }
370 else 392 else
371 { 393 {
372 lcd_write_reg(0x11, 5); 394 _begin_seq()
373 lcd_write_reg(0x10, 0x12b0); 395 _lcd_write_reg(0x11, 5)
374 mdelay(50); 396 _lcd_write_reg(0x10, 0x12b0)
375 lcd_write_reg(7, 0x11); 397 _mdelay(50)
376 mdelay(50); 398 _lcd_write_reg(7, 0x11)
377 lcd_write_reg(0x12, 0x89); 399 _mdelay(50)
378 mdelay(50); 400 _lcd_write_reg(0x12, 0x89)
379 lcd_write_reg(0x13, 0x1d00); 401 _mdelay(50)
380 mdelay(50); 402 _lcd_write_reg(0x13, 0x1d00)
381 lcd_write_reg(0x29, 0x2f); 403 _mdelay(50)
382 mdelay(50); 404 _lcd_write_reg(0x29, 0x2f)
383 lcd_write_reg(0x2b, 0xa); 405 _mdelay(50)
384 lcd_write_reg(7, 0x133); 406 _lcd_write_reg(0x2b, 0xa)
385 mdelay(50); 407 _lcd_write_reg(7, 0x133)
386 lcd_write_reg(0x22, 0); 408 _mdelay(50)
409 _lcd_write_reg(0x22, 0)
410 _end_seq()
387 } 411 }
388} 412}
389 413
@@ -391,36 +415,40 @@ static void lcd_enable_9325(bool enable)
391{ 415{
392 if(!enable) 416 if(!enable)
393 { 417 {
394 lcd_write_reg(7, 0x131); 418 _begin_seq()
395 mdelay(10); 419 _lcd_write_reg(7, 0x131)
396 lcd_write_reg(7, 0x130); 420 _mdelay(10)
397 mdelay(10); 421 _lcd_write_reg(7, 0x130)
398 lcd_write_reg(7, 0); 422 _mdelay(10)
399 lcd_write_reg(0x10, 0x80); 423 _lcd_write_reg(7, 0)
400 lcd_write_reg(0x11, 0); 424 _lcd_write_reg(0x10, 0x80)
401 lcd_write_reg(0x12, 0); 425 _lcd_write_reg(0x11, 0)
402 lcd_write_reg(0x13, 0); 426 _lcd_write_reg(0x12, 0)
403 mdelay(200); 427 _lcd_write_reg(0x13, 0)
404 lcd_write_reg(0x10, 0x82); 428 _mdelay(200)
429 _lcd_write_reg(0x10, 0x82)
430 _end_seq()
405 } 431 }
406 else 432 else
407 { 433 {
408 lcd_write_reg(0x10, 0x80); 434 _begin_seq()
409 lcd_write_reg(0x11, 0); 435 _lcd_write_reg(0x10, 0x80)
410 lcd_write_reg(0x12, 0); 436 _lcd_write_reg(0x11, 0)
411 lcd_write_reg(0x13, 0); 437 _lcd_write_reg(0x12, 0)
412 lcd_write_reg(7, 1); 438 _lcd_write_reg(0x13, 0)
413 mdelay(200); 439 _lcd_write_reg(7, 1)
414 lcd_write_reg(0x10, 0x1290); 440 _mdelay(200)
415 lcd_write_reg(0x11, 7); 441 _lcd_write_reg(0x10, 0x1290)
416 mdelay(50); 442 _lcd_write_reg(0x11, 7)
417 lcd_write_reg(0x12, 0x19); 443 _mdelay(50)
418 mdelay(50); 444 _lcd_write_reg(0x12, 0x19)
419 lcd_write_reg(0x13, 0x1700); 445 _mdelay(50)
420 lcd_write_reg(0x29, 0x10); 446 _lcd_write_reg(0x13, 0x1700)
421 mdelay(50); 447 _lcd_write_reg(0x29, 0x10)
422 lcd_write_reg(7, 0x133); 448 _mdelay(50)
423 lcd_write_reg(0x22, 0); 449 _lcd_write_reg(7, 0x133)
450 _lcd_write_reg(0x22, 0)
451 _end_seq()
424 } 452 }
425} 453}
426 454