summaryrefslogtreecommitdiff
path: root/firmware/target/arm/rk27xx/rk27generic/lcd-rk27generic.c
diff options
context:
space:
mode:
authorMarcin Bukat <marcin.bukat@gmail.com>2011-10-17 10:32:19 +0000
committerMarcin Bukat <marcin.bukat@gmail.com>2011-10-17 10:32:19 +0000
commit32f763c39a797221a6e850704feb3743bc104d8c (patch)
treec509c38423f2efb76a13119f92c21e5e82476a42 /firmware/target/arm/rk27xx/rk27generic/lcd-rk27generic.c
parentf0311d3310e84906a6c1afaf941f2f58e2063c30 (diff)
downloadrockbox-32f763c39a797221a6e850704feb3743bc104d8c.tar.gz
rockbox-32f763c39a797221a6e850704feb3743bc104d8c.zip
Add HiFiMAN HM-60x target(s). FS#12319 by Andrew Ryabinin with some (small) modification by me. This also splits rk27xx lcd driver into lcdif-rk27xx and lcd controller specific part. Some modifications to the pcm driver have been made to allow using codecs in slave mode (as TDA1543 used in hifiman is slave only i2s codec).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30765 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/rk27xx/rk27generic/lcd-rk27generic.c')
-rw-r--r--firmware/target/arm/rk27xx/rk27generic/lcd-rk27generic.c211
1 files changed, 211 insertions, 0 deletions
diff --git a/firmware/target/arm/rk27xx/rk27generic/lcd-rk27generic.c b/firmware/target/arm/rk27xx/rk27generic/lcd-rk27generic.c
new file mode 100644
index 0000000000..b184630ebe
--- /dev/null
+++ b/firmware/target/arm/rk27xx/rk27generic/lcd-rk27generic.c
@@ -0,0 +1,211 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2011 Marcin Bukat
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#include "config.h"
23#include "kernel.h"
24#include "lcd.h"
25#include "system.h"
26#include "cpu.h"
27#include "spfd5420a.h"
28#include "lcdif-rk27xx.h"
29
30/* TODO: convert to udelay() */
31static inline void delay_nop(int cycles)
32{
33 asm volatile ("1: subs %[n], %[n], #1 \n\t"
34 " bne 1b"
35 :
36 : [n] "r" (cycles));
37}
38
39
40/* converts RGB565 pixel into internal lcd bus format */
41static unsigned int lcd_pixel_transform(unsigned short rgb565)
42{
43 unsigned int r, g, b;
44 b = rgb565 & 0x1f;
45 g = (rgb565 >> 5) & 0x3f;
46 r = (rgb565 >> 11) & 0x1f;
47
48 return r<<19 | g<<10 | b<<3;
49}
50
51/* not tested */
52static void lcd_sleep(bool sleep)
53{
54 if (sleep)
55 {
56 /* enter sleep mode */
57 lcd_write_reg(DISPLAY_CTRL1, 0x0170);
58 delay_nop(50);
59 lcd_write_reg(DISPLAY_CTRL1, 0x0000);
60 delay_nop(50);
61 lcd_write_reg(PWR_CTRL1, 0x14B4);
62 }
63 else
64 {
65 /* return to normal operation */
66 lcd_write_reg(PWR_CTRL1, 0x14B0);
67 delay_nop(50);
68 lcd_write_reg(DISPLAY_CTRL1, 0x0173);
69 }
70
71 lcd_cmd(GRAM_WRITE);
72}
73
74void lcd_display_init()
75{
76 unsigned int x, y;
77
78 lcd_write_reg(RESET, 0x0001);
79 delay_nop(10000);
80 lcd_write_reg(RESET, 0x0000);
81 delay_nop(10000);
82 lcd_write_reg(IF_ENDIAN, 0x0000); /* order of receiving data */
83 lcd_write_reg(DRIVER_OUT_CTRL, 0x0000);
84 lcd_write_reg(ENTRY_MODE, 0x1038);
85 lcd_write_reg(WAVEFORM_CTRL, 0x0100);
86 lcd_write_reg(SHAPENING_CTRL, 0x0000);
87 lcd_write_reg(DISPLAY_CTRL2, 0x0808);
88 lcd_write_reg(LOW_PWR_CTRL1, 0x0001);
89 lcd_write_reg(LOW_PWR_CTRL2, 0x0010);
90 lcd_write_reg(EXT_DISP_CTRL1, 0x0000);
91 lcd_write_reg(EXT_DISP_CTRL2, 0x0000);
92 lcd_write_reg(BASE_IMG_SIZE, 0x3100);
93 lcd_write_reg(BASE_IMG_CTRL, 0x0001);
94 lcd_write_reg(VSCROLL_CTRL, 0x0000);
95 lcd_write_reg(PART1_POS, 0x0000);
96 lcd_write_reg(PART1_START, 0x0000);
97 lcd_write_reg(PART1_END, 0x018F);
98 lcd_write_reg(PART2_POS, 0x0000);
99 lcd_write_reg(PART2_START, 0x0000);
100 lcd_write_reg(PART2_END, 0x0000);
101
102 lcd_write_reg(PANEL_IF_CTRL1, 0x0011);
103 delay_nop(10000);
104 lcd_write_reg(PANEL_IF_CTRL2, 0x0202);
105 lcd_write_reg(PANEL_IF_CTRL3, 0x0300);
106 delay_nop(10000);
107 lcd_write_reg(PANEL_IF_CTRL4, 0x021E);
108 lcd_write_reg(PANEL_IF_CTRL5, 0x0202);
109 lcd_write_reg(PANEL_IF_CTRL6, 0x0100);
110 lcd_write_reg(FRAME_MKR_CTRL, 0x0000);
111 lcd_write_reg(MDDI_CTRL, 0x0000);
112
113 lcd_write_reg(GAMMA_CTRL1, 0x0101);
114 lcd_write_reg(GAMMA_CTRL2, 0x0000);
115 lcd_write_reg(GAMMA_CTRL3, 0x0016);
116 lcd_write_reg(GAMMA_CTRL4, 0x2913);
117 lcd_write_reg(GAMMA_CTRL5, 0x260B);
118 lcd_write_reg(GAMMA_CTRL6, 0x0101);
119 lcd_write_reg(GAMMA_CTRL7, 0x1204);
120 lcd_write_reg(GAMMA_CTRL8, 0x0415);
121 lcd_write_reg(GAMMA_CTRL9, 0x0205);
122 lcd_write_reg(GAMMA_CTRL10, 0x0303);
123 lcd_write_reg(GAMMA_CTRL11, 0x0E05);
124 lcd_write_reg(GAMMA_CTRL12, 0x0D01);
125 lcd_write_reg(GAMMA_CTRL13, 0x010D);
126 lcd_write_reg(GAMMA_CTRL14, 0x050E);
127 lcd_write_reg(GAMMA_CTRL15, 0x0303);
128 lcd_write_reg(GAMMA_CTRL16, 0x0502);
129
130 /* power on */
131 lcd_write_reg(DISPLAY_CTRL1, 0x0001);
132 lcd_write_reg(PWR_CTRL6, 0x0001);
133 lcd_write_reg(PWR_CTRL7, 0x0060);
134 delay_nop(50000);
135 lcd_write_reg(PWR_CTRL1, 0x16B0);
136 delay_nop(10000);
137 lcd_write_reg(PWR_CTRL2, 0x0147);
138 delay_nop(10000);
139 lcd_write_reg(PWR_CTRL3, 0x0117);
140 delay_nop(10000);
141 lcd_write_reg(PWR_CTRL4, 0x2F00);
142 delay_nop(50000);
143 lcd_write_reg(VCOM_HV2, 0x0000); /* src 0x0090 */
144 delay_nop(10000);
145 lcd_write_reg(VCOM_HV1, 0x0008); /* src 0x000A */
146 lcd_write_reg(PWR_CTRL3, 0x01BE);
147 delay_nop(10000);
148
149 /* addresses setup */
150 lcd_write_reg(WINDOW_H_START, 0x0000);
151 lcd_write_reg(WINDOW_H_END, 0x00EF); /* 239 */
152 lcd_write_reg(WINDOW_V_START, 0x0000);
153 lcd_write_reg(WINDOW_V_END, 0x018F); /* 399 */
154 lcd_write_reg(GRAM_H_ADDR, 0x0000);
155 lcd_write_reg(GRAM_V_ADDR, 0x0000);
156
157 /* display on */
158 lcd_write_reg(DISPLAY_CTRL1, 0x0021);
159 delay_nop(40000);
160 lcd_write_reg(DISPLAY_CTRL1, 0x0061);
161 delay_nop(100000);
162 lcd_write_reg(DISPLAY_CTRL1, 0x0173);
163 delay_nop(300000);
164
165
166 /* clear screen */
167 lcd_cmd(GRAM_WRITE);
168
169 for (x=0; x<LCD_WIDTH; x++)
170 for(y=0; y<LCD_HEIGHT; y++)
171 lcd_data(0x000000);
172
173 lcd_sleep(false);
174}
175
176void lcd_update_rect(int x, int y, int width, int height)
177{
178 int px = x, py = y;
179 int pxmax = x + width, pymax = y + height;
180
181 /* addresses setup */
182 lcd_write_reg(WINDOW_H_START, y);
183 lcd_write_reg(WINDOW_H_END, pymax-1);
184 lcd_write_reg(WINDOW_V_START, x);
185 lcd_write_reg(WINDOW_V_END, pxmax-1);
186 lcd_write_reg(GRAM_H_ADDR, y);
187 lcd_write_reg(GRAM_V_ADDR, x);
188
189 lcd_cmd(GRAM_WRITE);
190
191 for (py=y; py<pymax; py++)
192 {
193 for (px=x; px<pxmax; px++)
194 LCD_DATA = lcd_pixel_transform(lcd_framebuffer[py][px]);
195 }
196}
197
198/* Blit a YUV bitmap directly to the LCD */
199void lcd_blit_yuv(unsigned char * const src[3],
200 int src_x, int src_y, int stride,
201 int x, int y, int width, int height)
202{
203 (void)src;
204 (void)src_x;
205 (void)src_y;
206 (void)stride;
207 (void)x;
208 (void)y;
209 (void)width;
210 (void)height;
211}