Updates to ported drivers to support new optimisation method.

Includes Bug fixes.
ugfx_release_2.6
inmarket 2013-10-02 16:30:06 +10:00
parent 884db04e8c
commit d7d02395d0
6 changed files with 91 additions and 36 deletions

View File

@ -57,31 +57,43 @@ uint32_t DISPLAY_CODE;
#define dummy_read() { volatile uint16_t dummy; dummy = read_data(); (void) dummy; } #define dummy_read() { volatile uint16_t dummy; dummy = read_data(); (void) dummy; }
#define write_reg(reg, data) { write_index(reg); write_data(data); } #define write_reg(reg, data) { write_index(reg); write_data(data); }
static void set_viewport(uint16_t x, uint16_t y, uint16_t cx, uint16_t cy) { static void set_cursor(GDISPDriver *g) {
switch(g->g.Orientation) { switch(g->g.Orientation) {
case GDISP_ROTATE_0: case GDISP_ROTATE_0:
case GDISP_ROTATE_180: case GDISP_ROTATE_180:
write_reg(0x0050, x); write_reg(0x0020, g->p.x);
write_reg(0x0051, x + cx - 1); write_reg(0x0021, g->p.y);
write_reg(0x0052, y);
write_reg(0x0053, y + cy - 1);
write_reg(0x0020, x);
write_reg(0x0021, y);
break; break;
case GDISP_ROTATE_90: case GDISP_ROTATE_90:
case GDISP_ROTATE_270: case GDISP_ROTATE_270:
write_reg(0x0050, y); write_reg(0x0020, g->p.y);
write_reg(0x0051, y + cy - 1); write_reg(0x0021, g->p.x);
write_reg(0x0052, x);
write_reg(0x0053, x + cx - 1);
write_reg(0x0020, y);
write_reg(0x0021, x);
break; break;
} }
write_index(0x0022); write_index(0x0022);
} }
static void set_viewport(GDISPDriver *g) {
switch(g->g.Orientation) {
case GDISP_ROTATE_0:
case GDISP_ROTATE_180:
write_reg(0x0050, g->p.x);
write_reg(0x0051, g->p.x + g->p.cx - 1);
write_reg(0x0052, g->p.y);
write_reg(0x0053, g->p.y + g->p.cy - 1);
break;
case GDISP_ROTATE_90:
case GDISP_ROTATE_270:
write_reg(0x0050, g->p.y);
write_reg(0x0051, g->p.y + g->p.cy - 1);
write_reg(0x0052, g->p.x);
write_reg(0x0053, g->p.x + g->p.cx - 1);
break;
}
}
LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) { LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) {
/* Initialise your display */ /* Initialise your display */
init_board(); init_board();
@ -181,12 +193,17 @@ LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) {
LLDSPEC void gdisp_lld_write_stop(GDISPDriver *g) { LLDSPEC void gdisp_lld_write_stop(GDISPDriver *g) {
release_bus(); release_bus();
} }
LLDSPEC void gdisp_lld_write_pos(GDISPDriver *g) {
set_cursor(g);
}
#endif
#endif #endif
#if GDISP_HARDWARE_STREAM_READ #if GDISP_HARDWARE_STREAM_READ
LLDSPEC void gdisp_lld_read_start(GDISPDriver *g) { LLDSPEC void gdisp_lld_read_start(GDISPDriver *g) {
acquire_bus(); acquire_bus();
set_viewport(g); set_viewport(g);
set_cursor(g);
setreadmode(); setreadmode();
dummy_read(); dummy_read();
} }

View File

@ -27,6 +27,7 @@
#define GDISP_HARDWARE_STREAM_WRITE TRUE #define GDISP_HARDWARE_STREAM_WRITE TRUE
#define GDISP_HARDWARE_STREAM_READ TRUE #define GDISP_HARDWARE_STREAM_READ TRUE
#define GDISP_HARDWARE_STREAM_POS TRUE
#define GDISP_HARDWARE_CONTROL TRUE #define GDISP_HARDWARE_CONTROL TRUE
#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565 #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565

View File

@ -61,29 +61,41 @@ uint32_t DISPLAY_CODE;
#define dummy_read() { volatile uint16_t dummy; dummy = read_data(); (void) dummy; } #define dummy_read() { volatile uint16_t dummy; dummy = read_data(); (void) dummy; }
#define write_reg(reg, data) { write_index(reg); write_data(data); } #define write_reg(reg, data) { write_index(reg); write_data(data); }
static void set_viewport(GDISPDriver* g) { static void set_cursor(GDISPDriver *g) {
switch(g->g.Orientation) { switch(g->g.Orientation) {
case GDISP_ROTATE_0: case GDISP_ROTATE_0:
case GDISP_ROTATE_180: case GDISP_ROTATE_180:
write_reg(0x0050, x); write_reg(0x0020, g->p.x);
write_reg(0x0051, x + cx - 1); write_reg(0x0021, g->p.y);
write_reg(0x0052, y);
write_reg(0x0053, y + cy - 1);
write_reg(0x0020, x);
write_reg(0x0021, y);
break; break;
case GDISP_ROTATE_90: case GDISP_ROTATE_90:
case GDISP_ROTATE_270: case GDISP_ROTATE_270:
write_reg(0x0050, y); write_reg(0x0020, g->p.y);
write_reg(0x0051, y + cy - 1); write_reg(0x0021, g->p.x);
write_reg(0x0052, x); break;
write_reg(0x0053, x + cx - 1); }
write_reg(0x0020, y); write_index(0x0022);
write_reg(0x0021, x); }
static void set_viewport(GDISPDriver* g) {
switch(g->g.Orientation) {
case GDISP_ROTATE_0:
case GDISP_ROTATE_180:
write_reg(0x0050, g->p.x);
write_reg(0x0051, g->p.x + g->p.cx - 1);
write_reg(0x0052, g->p.y);
write_reg(0x0053, g->p.y + g->p.cy - 1);
break;
case GDISP_ROTATE_90:
case GDISP_ROTATE_270:
write_reg(0x0050, g->p.y);
write_reg(0x0051, g->p.y + g->p.cy - 1);
write_reg(0x0052, g->p.x);
write_reg(0x0053, g->p.x + g->p.cx - 1);
break; break;
} }
write_reg(0x0022, color);
} }
LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) { LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) {
@ -182,12 +194,16 @@ LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) {
LLDSPEC void gdisp_lld_write_stop(GDISPDriver *g) { LLDSPEC void gdisp_lld_write_stop(GDISPDriver *g) {
release_bus(); release_bus();
} }
LLDSPEC void gdisp_lld_write_pos(GDISPDriver *g) {
set_cursor(g);
}
#endif #endif
#if GDISP_HARDWARE_STREAM_READ #if GDISP_HARDWARE_STREAM_READ
LLDSPEC void gdisp_lld_read_start(GDISPDriver *g) { LLDSPEC void gdisp_lld_read_start(GDISPDriver *g) {
acquire_bus(); acquire_bus();
set_viewport(g); set_viewport(g);
set_cursor(g);
setreadmode(); setreadmode();
dummy_read(); dummy_read();
} }

View File

@ -27,6 +27,7 @@
#define GDISP_HARDWARE_STREAM_WRITE TRUE #define GDISP_HARDWARE_STREAM_WRITE TRUE
#define GDISP_HARDWARE_STREAM_READ TRUE #define GDISP_HARDWARE_STREAM_READ TRUE
#define GDISP_HARDWARE_STREAM_POS TRUE
#define GDISP_HARDWARE_CONTROL TRUE #define GDISP_HARDWARE_CONTROL TRUE
#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565 #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565

View File

@ -43,6 +43,28 @@
#define dummy_read() { volatile uint16_t dummy; dummy = read_data(); (void) dummy; } #define dummy_read() { volatile uint16_t dummy; dummy = read_data(); (void) dummy; }
#define write_reg(reg, data) { write_index(reg); write_data(data); } #define write_reg(reg, data) { write_index(reg); write_data(data); }
static void set_cursor(GDISPDriver *g) {
switch(g->g.Orientation) {
case GDISP_ROTATE_0:
write_reg(0x004e, g->p.x & 0x00FF);
write_reg(0x004f, g->p.y & 0x01FF);
break;
case GDISP_ROTATE_90:
write_reg(0x004e, g->p.y & 0x00FF);
write_reg(0x004f, (GDISP_SCREEN_HEIGHT-1-g->p.x) & 0x01FF);
break;
case GDISP_ROTATE_180:
write_reg(0x004e, (GDISP_SCREEN_WIDTH-1-g->p.x) & 0x00FF);
write_reg(0x004f, (GDISP_SCREEN_HEIGHT-1-g->p.y) & 0x01FF);
break;
case GDISP_ROTATE_270:
write_reg(0x004e, (GDISP_SCREEN_WIDTH-1-g->p.y) & 0x00FF);
write_reg(0x004f, g->p.x & 0x01FF);
break;
}
write_index(0x0022);
}
static void set_viewport(GDISPDriver* g) { static void set_viewport(GDISPDriver* g) {
/* Reg 0x44 - Horizontal RAM address position /* Reg 0x44 - Horizontal RAM address position
* Upper Byte - HEA * Upper Byte - HEA
@ -60,33 +82,24 @@ static void set_viewport(GDISPDriver* g) {
write_reg(0x44, (((g->p.x+g->p.cx-1) << 8) & 0xFF00 ) | (g->p.x & 0x00FF)); write_reg(0x44, (((g->p.x+g->p.cx-1) << 8) & 0xFF00 ) | (g->p.x & 0x00FF));
write_reg(0x45, g->p.y & 0x01FF); write_reg(0x45, g->p.y & 0x01FF);
write_reg(0x46, (g->p.y+g->p.cy-1) & 0x01FF); write_reg(0x46, (g->p.y+g->p.cy-1) & 0x01FF);
write_reg(0x004e, g->p.x & 0x00FF);
write_reg(0x004f, g->p.y & 0x01FF);
break; break;
case GDISP_ROTATE_90: case GDISP_ROTATE_90:
write_reg(0x44, (((g->p.y+g->p.cy-1) << 8) & 0xFF00 ) | (g->p.y & 0x00FF)); write_reg(0x44, (((g->p.y+g->p.cy-1) << 8) & 0xFF00 ) | (g->p.y & 0x00FF));
write_reg(0x45, (GDISP_SCREEN_HEIGHT-(g->p.x+g->p.cx)) & 0x01FF); write_reg(0x45, (GDISP_SCREEN_HEIGHT-(g->p.x+g->p.cx)) & 0x01FF);
write_reg(0x46, (GDISP_SCREEN_HEIGHT-1-g->p.x) & 0x01FF); write_reg(0x46, (GDISP_SCREEN_HEIGHT-1-g->p.x) & 0x01FF);
write_reg(0x004e, g->p.y & 0x00FF);
write_reg(0x004f, (GDISP_SCREEN_HEIGHT-1-g->p.x) & 0x01FF);
break; break;
case GDISP_ROTATE_180: case GDISP_ROTATE_180:
write_reg(0x44, (((GDISP_SCREEN_WIDTH-1-g->p.x) & 0x00FF) << 8) | ((GDISP_SCREEN_WIDTH - (g->p.x+g->p.cx)) & 0x00FF)); write_reg(0x44, (((GDISP_SCREEN_WIDTH-1-g->p.x) & 0x00FF) << 8) | ((GDISP_SCREEN_WIDTH - (g->p.x+g->p.cx)) & 0x00FF));
write_reg(0x45, (GDISP_SCREEN_HEIGHT-(g->p.y+g->p.cy)) & 0x01FF); write_reg(0x45, (GDISP_SCREEN_HEIGHT-(g->p.y+g->p.cy)) & 0x01FF);
write_reg(0x46, (GDISP_SCREEN_HEIGHT-1-g->p.y) & 0x01FF); write_reg(0x46, (GDISP_SCREEN_HEIGHT-1-g->p.y) & 0x01FF);
write_reg(0x004e, (GDISP_SCREEN_WIDTH-1-g->p.x) & 0x00FF);
write_reg(0x004f, (GDISP_SCREEN_HEIGHT-1-g->p.y) & 0x01FF);
break; break;
case GDISP_ROTATE_270: case GDISP_ROTATE_270:
write_cmd2(PASET, GDISP_RAM_Y_OFFSET+g->p.x, GDISP_RAM_Y_OFFSET+g->p.x+g->p.cx-1); write_cmd2(PASET, GDISP_RAM_Y_OFFSET+g->p.x, GDISP_RAM_Y_OFFSET+g->p.x+g->p.cx-1);
write_reg(0x44, (((GDISP_SCREEN_WIDTH-1-g->p.y) & 0x00FF) << 8) | ((GDISP_SCREEN_WIDTH-(g->p.y+g->p.cy)) & 0x00FF)); write_reg(0x44, (((GDISP_SCREEN_WIDTH-1-g->p.y) & 0x00FF) << 8) | ((GDISP_SCREEN_WIDTH-(g->p.y+g->p.cy)) & 0x00FF));
write_reg(0x45, g->p.x & 0x01FF); write_reg(0x45, g->p.x & 0x01FF);
write_reg(0x46, (g->p.x+g->p.cx-1) & 0x01FF); write_reg(0x46, (g->p.x+g->p.cx-1) & 0x01FF);
write_reg(0x004e, (GDISP_SCREEN_WIDTH-1-g->p.y) & 0x00FF);
write_reg(0x004f, g->p.x & 0x01FF);
break; break;
} }
write_index(0x0022);
} }
/*===========================================================================*/ /*===========================================================================*/
@ -179,12 +192,16 @@ LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) {
LLDSPEC void gdisp_lld_write_stop(GDISPDriver *g) { LLDSPEC void gdisp_lld_write_stop(GDISPDriver *g) {
release_bus(); release_bus();
} }
LLDSPEC void gdisp_lld_stream_pos(GDISPDriver *g) {
set_cursor(g);
}
#endif #endif
#if GDISP_HARDWARE_STREAM_READ #if GDISP_HARDWARE_STREAM_READ
LLDSPEC void gdisp_lld_read_start(GDISPDriver *g) { LLDSPEC void gdisp_lld_read_start(GDISPDriver *g) {
acquire_bus(); acquire_bus();
set_viewport(g); set_viewport(g);
set_cursor(g);
setreadmode(); setreadmode();
dummy_read(); dummy_read();
} }
@ -201,6 +218,7 @@ LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) {
LLDSPEC void gdisp_lld_fill_area(GDISPDriver *g) { LLDSPEC void gdisp_lld_fill_area(GDISPDriver *g) {
acquire_bus(); acquire_bus();
set_viewport(g); set_viewport(g);
set_cursor(g);
dma_with_noinc(&color, g->p.cx*g->p.cy) dma_with_noinc(&color, g->p.cx*g->p.cy)
release_bus(); release_bus();
} }
@ -215,6 +233,7 @@ LLDSPEC bool_t gdisp_lld_init(GDISPDriver *g) {
acquire_bus(); acquire_bus();
set_viewport(g); set_viewport(g);
set_cursor(g);
if (g->p.x2 == g->p.cx) { if (g->p.x2 == g->p.cx) {
dma_with_inc(buffer, g->p.cx*g->p.cy); dma_with_inc(buffer, g->p.cx*g->p.cy);
} else { } else {

View File

@ -27,6 +27,7 @@
#define GDISP_HARDWARE_STREAM_WRITE TRUE #define GDISP_HARDWARE_STREAM_WRITE TRUE
#define GDISP_HARDWARE_STREAM_READ TRUE #define GDISP_HARDWARE_STREAM_READ TRUE
#define GDISP_HARDWARE_STREAM_POS TRUE
#define GDISP_HARDWARE_CONTROL TRUE #define GDISP_HARDWARE_CONTROL TRUE
#if defined(GDISP_USE_DMA) #if defined(GDISP_USE_DMA)