mpc8xx_lcd.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. /*
  2. * (C) Copyright 2001-2002
  3. * Wolfgang Denk, DENX Software Engineering -- wd@denx.de
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. /************************************************************************/
  8. /* ** HEADER FILES */
  9. /************************************************************************/
  10. /* #define DEBUG */
  11. #include <config.h>
  12. #include <common.h>
  13. #include <command.h>
  14. #include <watchdog.h>
  15. #include <version.h>
  16. #include <stdarg.h>
  17. #include <lcdvideo.h>
  18. #include <linux/types.h>
  19. #include <stdio_dev.h>
  20. #if defined(CONFIG_POST)
  21. #include <post.h>
  22. #endif
  23. #include <lcd.h>
  24. #ifdef CONFIG_LCD
  25. /************************************************************************/
  26. /* ** CONFIG STUFF -- should be moved to board config file */
  27. /************************************************************************/
  28. #ifndef CONFIG_LCD_INFO
  29. #define CONFIG_LCD_INFO /* Display Logo, (C) and system info */
  30. #endif
  31. #if defined(CONFIG_EDT32F10)
  32. #undef CONFIG_LCD_LOGO
  33. #undef CONFIG_LCD_INFO
  34. #endif
  35. /*----------------------------------------------------------------------*/
  36. #ifdef CONFIG_KYOCERA_KCS057QV1AJ
  37. /*
  38. * Kyocera KCS057QV1AJ-G23. Passive, color, single scan.
  39. */
  40. #define LCD_BPP LCD_COLOR4
  41. vidinfo_t panel_info = {
  42. 640, 480, 132, 99, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH,
  43. LCD_BPP, 1, 0, 1, 0, 5, 0, 0, 0
  44. /* wbl, vpw, lcdac, wbf */
  45. };
  46. #endif /* CONFIG_KYOCERA_KCS057QV1AJ */
  47. /*----------------------------------------------------------------------*/
  48. /*----------------------------------------------------------------------*/
  49. #ifdef CONFIG_HITACHI_SP19X001_Z1A
  50. /*
  51. * Hitachi SP19X001-. Active, color, single scan.
  52. */
  53. vidinfo_t panel_info = {
  54. 640, 480, 154, 116, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH,
  55. LCD_COLOR8, 1, 0, 1, 0, 0, 0, 0, 0
  56. /* wbl, vpw, lcdac, wbf */
  57. };
  58. #endif /* CONFIG_HITACHI_SP19X001_Z1A */
  59. /*----------------------------------------------------------------------*/
  60. /*----------------------------------------------------------------------*/
  61. #ifdef CONFIG_NEC_NL6448AC33
  62. /*
  63. * NEC NL6448AC33-18. Active, color, single scan.
  64. */
  65. vidinfo_t panel_info = {
  66. 640, 480, 132, 99, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_LOW, CONFIG_SYS_LOW, CONFIG_SYS_HIGH,
  67. 3, 0, 0, 1, 1, 144, 2, 0, 33
  68. /* wbl, vpw, lcdac, wbf */
  69. };
  70. #endif /* CONFIG_NEC_NL6448AC33 */
  71. /*----------------------------------------------------------------------*/
  72. #ifdef CONFIG_NEC_NL6448BC20
  73. /*
  74. * NEC NL6448BC20-08. 6.5", 640x480. Active, color, single scan.
  75. */
  76. vidinfo_t panel_info = {
  77. 640, 480, 132, 99, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_LOW, CONFIG_SYS_LOW, CONFIG_SYS_HIGH,
  78. 3, 0, 0, 1, 1, 144, 2, 0, 33
  79. /* wbl, vpw, lcdac, wbf */
  80. };
  81. #endif /* CONFIG_NEC_NL6448BC20 */
  82. /*----------------------------------------------------------------------*/
  83. #ifdef CONFIG_NEC_NL6448BC33_54
  84. /*
  85. * NEC NL6448BC33-54. 10.4", 640x480. Active, color, single scan.
  86. */
  87. vidinfo_t panel_info = {
  88. 640, 480, 212, 158, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_LOW, CONFIG_SYS_LOW, CONFIG_SYS_HIGH,
  89. 3, 0, 0, 1, 1, 144, 2, 0, 33
  90. /* wbl, vpw, lcdac, wbf */
  91. };
  92. #endif /* CONFIG_NEC_NL6448BC33_54 */
  93. /*----------------------------------------------------------------------*/
  94. #ifdef CONFIG_SHARP_LQ104V7DS01
  95. /*
  96. * SHARP LQ104V7DS01. 6.5", 640x480. Active, color, single scan.
  97. */
  98. vidinfo_t panel_info = {
  99. 640, 480, 132, 99, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_LOW, CONFIG_SYS_LOW, CONFIG_SYS_LOW,
  100. 3, 0, 0, 1, 1, 25, 1, 0, 33
  101. /* wbl, vpw, lcdac, wbf */
  102. };
  103. #endif /* CONFIG_SHARP_LQ104V7DS01 */
  104. /*----------------------------------------------------------------------*/
  105. #ifdef CONFIG_SHARP_16x9
  106. /*
  107. * Sharp 320x240. Active, color, single scan. It isn't 16x9, and I am
  108. * not sure what it is.......
  109. */
  110. vidinfo_t panel_info = {
  111. 320, 240, 0, 0, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH,
  112. 3, 0, 0, 1, 1, 15, 4, 0, 3
  113. };
  114. #endif /* CONFIG_SHARP_16x9 */
  115. /*----------------------------------------------------------------------*/
  116. #ifdef CONFIG_SHARP_LQ057Q3DC02
  117. /*
  118. * Sharp LQ057Q3DC02 display. Active, color, single scan.
  119. */
  120. #undef LCD_DF
  121. #define LCD_DF 12
  122. vidinfo_t panel_info = {
  123. 320, 240, 0, 0, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_LOW, CONFIG_SYS_LOW, CONFIG_SYS_HIGH,
  124. 3, 0, 0, 1, 1, 15, 4, 0, 3
  125. /* wbl, vpw, lcdac, wbf */
  126. };
  127. #define CONFIG_LCD_INFO_BELOW_LOGO
  128. #endif /* CONFIG_SHARP_LQ057Q3DC02 */
  129. /*----------------------------------------------------------------------*/
  130. #ifdef CONFIG_SHARP_LQ64D341
  131. /*
  132. * Sharp LQ64D341 display, 640x480. Active, color, single scan.
  133. */
  134. vidinfo_t panel_info = {
  135. 640, 480, 0, 0, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_LOW, CONFIG_SYS_LOW, CONFIG_SYS_HIGH,
  136. 3, 0, 0, 1, 1, 128, 16, 0, 32
  137. /* wbl, vpw, lcdac, wbf */
  138. };
  139. #endif /* CONFIG_SHARP_LQ64D341 */
  140. #ifdef CONFIG_SHARP_LQ065T9DR51U
  141. /*
  142. * Sharp LQ065T9DR51U display, 400x240. Active, color, single scan.
  143. */
  144. vidinfo_t panel_info = {
  145. 400, 240, 143, 79, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH,
  146. 3, 0, 0, 1, 1, 248, 4, 0, 35
  147. /* wbl, vpw, lcdac, wbf */
  148. };
  149. #define CONFIG_LCD_INFO_BELOW_LOGO
  150. #endif /* CONFIG_SHARP_LQ065T9DR51U */
  151. #ifdef CONFIG_SHARP_LQ084V1DG21
  152. /*
  153. * Sharp LQ084V1DG21 display, 640x480. Active, color, single scan.
  154. */
  155. vidinfo_t panel_info = {
  156. 640, 480, 171, 129, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_LOW, CONFIG_SYS_LOW, CONFIG_SYS_LOW,
  157. 3, 0, 0, 1, 1, 160, 3, 0, 48
  158. /* wbl, vpw, lcdac, wbf */
  159. };
  160. #endif /* CONFIG_SHARP_LQ084V1DG21 */
  161. /*----------------------------------------------------------------------*/
  162. #ifdef CONFIG_HLD1045
  163. /*
  164. * HLD1045 display, 640x480. Active, color, single scan.
  165. */
  166. vidinfo_t panel_info = {
  167. 640, 480, 0, 0, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_LOW, CONFIG_SYS_LOW, CONFIG_SYS_HIGH,
  168. 3, 0, 0, 1, 1, 160, 3, 0, 48
  169. /* wbl, vpw, lcdac, wbf */
  170. };
  171. #endif /* CONFIG_HLD1045 */
  172. /*----------------------------------------------------------------------*/
  173. #ifdef CONFIG_PRIMEVIEW_V16C6448AC
  174. /*
  175. * Prime View V16C6448AC
  176. */
  177. vidinfo_t panel_info = {
  178. 640, 480, 130, 98, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_LOW, CONFIG_SYS_LOW, CONFIG_SYS_HIGH,
  179. 3, 0, 0, 1, 1, 144, 2, 0, 35
  180. /* wbl, vpw, lcdac, wbf */
  181. };
  182. #endif /* CONFIG_PRIMEVIEW_V16C6448AC */
  183. /*----------------------------------------------------------------------*/
  184. #ifdef CONFIG_OPTREX_BW
  185. /*
  186. * Optrex CBL50840-2 NF-FW 99 22 M5
  187. * or
  188. * Hitachi LMG6912RPFC-00T
  189. * or
  190. * Hitachi SP14Q002
  191. *
  192. * 320x240. Black & white.
  193. */
  194. #define OPTREX_BPP 0 /* 0 - monochrome, 1 bpp */
  195. /* 1 - 4 grey levels, 2 bpp */
  196. /* 2 - 16 grey levels, 4 bpp */
  197. vidinfo_t panel_info = {
  198. 320, 240, 0, 0, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_LOW,
  199. OPTREX_BPP, 0, 0, 0, 0, 0, 0, 0, 0, 4
  200. };
  201. #endif /* CONFIG_OPTREX_BW */
  202. /*-----------------------------------------------------------------*/
  203. #ifdef CONFIG_EDT32F10
  204. /*
  205. * Emerging Display Technologies 320x240. Passive, monochrome, single scan.
  206. */
  207. #define LCD_BPP LCD_MONOCHROME
  208. #define LCD_DF 10
  209. vidinfo_t panel_info = {
  210. 320, 240, 0, 0, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_HIGH, CONFIG_SYS_LOW,
  211. LCD_BPP, 0, 0, 0, 0, 33, 0, 0, 0
  212. };
  213. #endif
  214. /************************************************************************/
  215. /* ----------------- chipset specific functions ----------------------- */
  216. /************************************************************************/
  217. /*
  218. * Calculate fb size for VIDEOLFB_ATAG.
  219. */
  220. ulong calc_fbsize (void)
  221. {
  222. ulong size;
  223. int line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) / 8;
  224. size = line_length * panel_info.vl_row;
  225. return size;
  226. }
  227. void lcd_ctrl_init (void *lcdbase)
  228. {
  229. volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
  230. volatile lcd823_t *lcdp = &immr->im_lcd;
  231. uint lccrtmp;
  232. uint lchcr_hpc_tmp;
  233. /* Initialize the LCD control register according to the LCD
  234. * parameters defined. We do everything here but enable
  235. * the controller.
  236. */
  237. lccrtmp = LCDBIT (LCCR_BNUM_BIT,
  238. (((panel_info.vl_row * panel_info.vl_col) * (1 << LCD_BPP)) / 128));
  239. lccrtmp |= LCDBIT (LCCR_CLKP_BIT, panel_info.vl_clkp) |
  240. LCDBIT (LCCR_OEP_BIT, panel_info.vl_oep) |
  241. LCDBIT (LCCR_HSP_BIT, panel_info.vl_hsp) |
  242. LCDBIT (LCCR_VSP_BIT, panel_info.vl_vsp) |
  243. LCDBIT (LCCR_DP_BIT, panel_info.vl_dp) |
  244. LCDBIT (LCCR_BPIX_BIT, panel_info.vl_bpix) |
  245. LCDBIT (LCCR_LBW_BIT, panel_info.vl_lbw) |
  246. LCDBIT (LCCR_SPLT_BIT, panel_info.vl_splt) |
  247. LCDBIT (LCCR_CLOR_BIT, panel_info.vl_clor) |
  248. LCDBIT (LCCR_TFT_BIT, panel_info.vl_tft);
  249. #if 0
  250. lccrtmp |= ((SIU_LEVEL5 / 2) << 12);
  251. lccrtmp |= LCCR_EIEN;
  252. #endif
  253. lcdp->lcd_lccr = lccrtmp;
  254. lcdp->lcd_lcsr = 0xFF; /* Clear pending interrupts */
  255. /* Initialize LCD controller bus priorities.
  256. */
  257. immr->im_siu_conf.sc_sdcr &= ~0x0f; /* RAID = LAID = 0 */
  258. /* set SHFT/CLOCK division factor 4
  259. * This needs to be set based upon display type and processor
  260. * speed. The TFT displays run about 20 to 30 MHz.
  261. * I was running 64 MHz processor speed.
  262. * The value for this divider must be chosen so the result is
  263. * an integer of the processor speed (i.e., divide by 3 with
  264. * 64 MHz would be bad).
  265. */
  266. immr->im_clkrst.car_sccr &= ~0x1F;
  267. immr->im_clkrst.car_sccr |= LCD_DF; /* was 8 */
  268. #if !defined(CONFIG_EDT32F10)
  269. /* Enable LCD on port D.
  270. */
  271. immr->im_ioport.iop_pdpar |= 0x1FFF;
  272. immr->im_ioport.iop_pddir |= 0x1FFF;
  273. /* Enable LCD_A/B/C on port B.
  274. */
  275. immr->im_cpm.cp_pbpar |= 0x00005001;
  276. immr->im_cpm.cp_pbdir |= 0x00005001;
  277. #else
  278. /* Enable LCD on port D.
  279. */
  280. immr->im_ioport.iop_pdpar |= 0x1DFF;
  281. immr->im_ioport.iop_pdpar &= ~0x0200;
  282. immr->im_ioport.iop_pddir |= 0x1FFF;
  283. immr->im_ioport.iop_pddat |= 0x0200;
  284. #endif
  285. /* Load the physical address of the linear frame buffer
  286. * into the LCD controller.
  287. * BIG NOTE: This has to be modified to load A and B depending
  288. * upon the split mode of the LCD.
  289. */
  290. lcdp->lcd_lcfaa = (ulong)lcdbase;
  291. lcdp->lcd_lcfba = (ulong)lcdbase;
  292. /* MORE HACKS...This must be updated according to 823 manual
  293. * for different panels.
  294. * Udi Finkelstein - done - see below:
  295. * Note: You better not try unsupported combinations such as
  296. * 4-bit wide passive dual scan LCD at 4/8 Bit color.
  297. */
  298. lchcr_hpc_tmp =
  299. (panel_info.vl_col *
  300. (panel_info.vl_tft ? 8 :
  301. (((2 - panel_info.vl_lbw) << /* 4 bit=2, 8-bit = 1 */
  302. /* use << to mult by: single scan = 1, dual scan = 2 */
  303. panel_info.vl_splt) *
  304. (panel_info.vl_bpix | 1)))) >> 3; /* 2/4 BPP = 1, 8/16 BPP = 3 */
  305. lcdp->lcd_lchcr = LCHCR_BO |
  306. LCDBIT (LCHCR_AT_BIT, 4) |
  307. LCDBIT (LCHCR_HPC_BIT, lchcr_hpc_tmp) |
  308. panel_info.vl_wbl;
  309. lcdp->lcd_lcvcr = LCDBIT (LCVCR_VPW_BIT, panel_info.vl_vpw) |
  310. LCDBIT (LCVCR_LCD_AC_BIT, panel_info.vl_lcdac) |
  311. LCDBIT (LCVCR_VPC_BIT, panel_info.vl_row) |
  312. panel_info.vl_wbf;
  313. }
  314. /*----------------------------------------------------------------------*/
  315. #if LCD_BPP == LCD_COLOR8
  316. void
  317. lcd_setcolreg (ushort regno, ushort red, ushort green, ushort blue)
  318. {
  319. volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
  320. volatile cpm8xx_t *cp = &(immr->im_cpm);
  321. unsigned short colreg, *cmap_ptr;
  322. cmap_ptr = (unsigned short *)&cp->lcd_cmap[regno * 2];
  323. colreg = ((red & 0x0F) << 8) |
  324. ((green & 0x0F) << 4) |
  325. (blue & 0x0F) ;
  326. #ifdef CONFIG_SYS_INVERT_COLORS
  327. colreg ^= 0x0FFF;
  328. #endif
  329. *cmap_ptr = colreg;
  330. debug ("setcolreg: reg %2d @ %p: R=%02X G=%02X B=%02X => %02X%02X\n",
  331. regno, &(cp->lcd_cmap[regno * 2]),
  332. red, green, blue,
  333. cp->lcd_cmap[ regno * 2 ], cp->lcd_cmap[(regno * 2) + 1]);
  334. }
  335. #endif /* LCD_COLOR8 */
  336. /*----------------------------------------------------------------------*/
  337. #if LCD_BPP == LCD_MONOCHROME
  338. static
  339. void lcd_initcolregs (void)
  340. {
  341. volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
  342. volatile cpm8xx_t *cp = &(immr->im_cpm);
  343. ushort regno;
  344. for (regno = 0; regno < 16; regno++) {
  345. cp->lcd_cmap[regno * 2] = 0;
  346. cp->lcd_cmap[(regno * 2) + 1] = regno & 0x0f;
  347. }
  348. }
  349. #endif
  350. /*----------------------------------------------------------------------*/
  351. void lcd_enable (void)
  352. {
  353. volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
  354. volatile lcd823_t *lcdp = &immr->im_lcd;
  355. /* Enable the LCD panel */
  356. immr->im_siu_conf.sc_sdcr |= (1 << (31 - 25)); /* LAM = 1 */
  357. lcdp->lcd_lccr |= LCCR_PON;
  358. #if defined(CONFIG_LWMON)
  359. { uchar c = pic_read (0x60);
  360. #if defined(CONFIG_LCD) && defined(CONFIG_LWMON) && (CONFIG_POST & CONFIG_SYS_POST_SYSMON)
  361. /* Enable LCD later in sysmon test, only if temperature is OK */
  362. #else
  363. c |= 0x07; /* Power on CCFL, Enable CCFL, Chip Enable LCD */
  364. #endif
  365. pic_write (0x60, c);
  366. }
  367. #endif /* CONFIG_LWMON */
  368. #if defined(CONFIG_R360MPI)
  369. {
  370. extern void r360_i2c_lcd_write (uchar data0, uchar data1);
  371. unsigned long bgi, ctr;
  372. char *p;
  373. if ((p = getenv("lcdbgi")) != NULL) {
  374. bgi = simple_strtoul (p, 0, 10) & 0xFFF;
  375. } else {
  376. bgi = 0xFFF;
  377. }
  378. if ((p = getenv("lcdctr")) != NULL) {
  379. ctr = simple_strtoul (p, 0, 10) & 0xFFF;
  380. } else {
  381. ctr=0x7FF;
  382. }
  383. r360_i2c_lcd_write(0x10, 0x01);
  384. r360_i2c_lcd_write(0x20, 0x01);
  385. r360_i2c_lcd_write(0x30 | ((bgi>>8) & 0xF), bgi & 0xFF);
  386. r360_i2c_lcd_write(0x40 | ((ctr>>8) & 0xF), ctr & 0xFF);
  387. }
  388. #endif /* CONFIG_R360MPI */
  389. #ifdef CONFIG_RRVISION
  390. debug ("PC4->Output(1): enable LVDS\n");
  391. debug ("PC5->Output(0): disable PAL clock\n");
  392. immr->im_ioport.iop_pddir |= 0x1000;
  393. immr->im_ioport.iop_pcpar &= ~(0x0C00);
  394. immr->im_ioport.iop_pcdir |= 0x0C00 ;
  395. immr->im_ioport.iop_pcdat |= 0x0800 ;
  396. immr->im_ioport.iop_pcdat &= ~(0x0400);
  397. debug ("PDPAR=0x%04X PDDIR=0x%04X PDDAT=0x%04X\n",
  398. immr->im_ioport.iop_pdpar,
  399. immr->im_ioport.iop_pddir,
  400. immr->im_ioport.iop_pddat);
  401. debug ("PCPAR=0x%04X PCDIR=0x%04X PCDAT=0x%04X\n",
  402. immr->im_ioport.iop_pcpar,
  403. immr->im_ioport.iop_pcdir,
  404. immr->im_ioport.iop_pcdat);
  405. #endif
  406. }
  407. /************************************************************************/
  408. #endif /* CONFIG_LCD */