summaryrefslogtreecommitdiff
path: root/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c')
-rw-r--r--firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
index b8feeb103e..f9de3c3117 100644
--- a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
+++ b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
@@ -42,6 +42,8 @@ static bool display_on = false; /* is the display turned on? */
42static bool display_flipped = false; 42static bool display_flipped = false;
43static int xoffset = 20; /* needed for flip */ 43static int xoffset = 20; /* needed for flip */
44 44
45static volatile int _ystart, _ymax, _xstart, _xmax;
46
45static void as3525_dbop_init(void) 47static void as3525_dbop_init(void)
46{ 48{
47 CGU_DBOP = (1<<3) | CLK_DIV(AS3525_PCLK_FREQ, AS3525_DBOP_FREQ); 49 CGU_DBOP = (1<<3) | CLK_DIV(AS3525_PCLK_FREQ, AS3525_DBOP_FREQ);
@@ -258,22 +260,20 @@ void lcd_init_device()
258} 260}
259 261
260/* Set horizontal window addresses */ 262/* Set horizontal window addresses */
261static void lcd_window_x(int xmin, int xmax) 263void lcd_window_x(int xmin, int xmax)
262{ 264{
263 xmin += xoffset; 265 xmin += xoffset;
264 xmax += xoffset; 266 xmax += xoffset;
265
266 lcd_write_reg(0x46, (xmax << 8) | xmin); 267 lcd_write_reg(0x46, (xmax << 8) | xmin);
267 lcd_write_reg(0x20, xmin); 268 lcd_write_reg(0x20, xmin);
268} 269}
269 270
270/* Set vertical window addresses */ 271/* Set vertical window addresses */
271static void lcd_window_y(int ymin, int ymax) 272void lcd_window_y(int ymin, int ymax)
272{ 273{
273 lcd_write_reg(0x47, ymax); 274 lcd_write_reg(0x47, ymax);
274 lcd_write_reg(0x48, ymin); 275 lcd_write_reg(0x48, ymin);
275 lcd_write_reg(0x21, ymin); 276 lcd_write_reg(0x21, ymin);
276 lcd_write_cmd(0x22);
277} 277}
278 278
279/* Update the display. 279/* Update the display.
@@ -285,6 +285,8 @@ void lcd_update(void)
285 285
286 lcd_write_reg(R_ENTRY_MODE, R_ENTRY_MODE_HORZ); 286 lcd_write_reg(R_ENTRY_MODE, R_ENTRY_MODE_HORZ);
287 287
288 /* we must disable interrupts because buttondriver also writes to lcd */
289 disable_irq();
288 lcd_window_x(0, LCD_WIDTH - 1); 290 lcd_window_x(0, LCD_WIDTH - 1);
289 lcd_window_y(0, LCD_HEIGHT - 1); 291 lcd_window_y(0, LCD_HEIGHT - 1);
290 292
@@ -293,6 +295,7 @@ void lcd_update(void)
293 295
294 /* Write data */ 296 /* Write data */
295 lcd_write_data((unsigned short *)lcd_framebuffer, LCD_WIDTH*LCD_HEIGHT); 297 lcd_write_data((unsigned short *)lcd_framebuffer, LCD_WIDTH*LCD_HEIGHT);
298 enable_irq();
296} 299}
297 300
298/* Update a fraction of the display. */ 301/* Update a fraction of the display. */
@@ -324,6 +327,8 @@ void lcd_update_rect(int x, int y, int width, int height)
324 327
325 lcd_write_reg(R_ENTRY_MODE, R_ENTRY_MODE_HORZ); 328 lcd_write_reg(R_ENTRY_MODE, R_ENTRY_MODE_HORZ);
326 329
330 /* we must disable interrupts because buttondriver also writes to lcd */
331 disable_irq();
327 lcd_window_x(x, xmax); 332 lcd_window_x(x, xmax);
328 lcd_window_y(y, ymax); 333 lcd_window_y(y, ymax);
329 334
@@ -338,4 +343,18 @@ void lcd_update_rect(int x, int y, int width, int height)
338 ptr += LCD_WIDTH; 343 ptr += LCD_WIDTH;
339 } 344 }
340 while (++y <= ymax); 345 while (++y <= ymax);
346 enable_irq();
347}
348
349/* writes one read pixel outside the visible area, needed for correct dbop reads */
350void lcd_button_support(void)
351{
352 fb_data data = 0xf<<12;
353 lcd_write_reg(R_ENTRY_MODE, R_ENTRY_MODE_HORZ);
354 /* Set start position and window */
355
356 lcd_window_x(-1, 1);
357 lcd_write_cmd(R_WRITE_DATA_2_GRAM);
358
359 lcd_write_data(&data, 1);
341} 360}