summaryrefslogtreecommitdiff
path: root/firmware/target/arm/s3c2440/gigabeat-fx
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/s3c2440/gigabeat-fx')
-rw-r--r--firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c117
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
139void 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
139void LCD_SPI_SS(bool select) 148void 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
171void LCD_SPI_powerdown(void) 180void 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
190void LCD_SPI_powerup(void) 192void 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
298void 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. */
312void lcd_update_rect(int x, int y, int width, int height) 322void 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
493void lcd_set_flip(bool yesno) {
494 (void) yesno;
495 // TODO:
496}
497