diff --git a/ubb-vga/regs4740.h b/ubb-vga/regs4740.h index 215f9b9..b3c7385 100644 --- a/ubb-vga/regs4740.h +++ b/ubb-vga/regs4740.h @@ -30,6 +30,7 @@ #define _GPIO(n) REG(0x0010000+(n)) #define _MSC(n) REG(0x0021000+(n)) #define _DMAC(n) REG(0x3020000+(n)) +#define _LCD(n) REG(0x3050000+(n)) #define CLKGR _CGU(0x0020) /* Clock Gate */ #define MSCCDR _CGU(0x0068) /* MSC device clock divider */ @@ -80,4 +81,6 @@ #define DMAC _DMAC(0x300) /* DMA control */ #define DDR _DMAC(0x308) /* DMA doorbell */ +#define LCDCTRL _LCD(0x30) /* LCD control */ + #endif /* !REGS4740_H */ diff --git a/ubb-vga/ubb-vga.c b/ubb-vga/ubb-vga.c index dea0248..a0a38a4 100644 --- a/ubb-vga/ubb-vga.c +++ b/ubb-vga/ubb-vga.c @@ -43,6 +43,7 @@ static volatile void *base; static int bad; +static int keep_lcd = 0; #define US(us) ((uint16_t) ((us)*112)) @@ -141,6 +142,7 @@ static uint32_t clkrt = 0; static uint32_t old_icmr; static uint32_t old_clkgr; +static uint32_t old_lcdctrl; static void disable_interrupts(void) @@ -181,6 +183,20 @@ static void enable_lcd(void) } +static void tame_lcd(void) +{ + old_lcdctrl = LCDCTRL; + /* LCDCTRL.BST = 0, for 4 word burst, the shortest available */ + LCDCTRL = old_lcdctrl & 0xfffffff; +} + + +static void restore_lcd(void) +{ + LCDCTRL = old_lcdctrl; +} + + static void get_timer(void) { TSCR = 1 << TIMER; /* enable clock */ @@ -269,7 +285,10 @@ static void setup(void) static void setup_noirq(void) { - disable_lcd(); + if (keep_lcd) + tame_lcd(); + else + disable_lcd(); get_timer(); DMAC = 1; @@ -290,7 +309,10 @@ static void cleanup_noirq(void) DCS(DMA) = 0; release_timer(); - enable_lcd(); + if (keep_lcd) + restore_lcd(); + else + enable_lcd(); } @@ -448,10 +470,11 @@ static void list_modes(void) static void usage(const char *name) { fprintf(stderr, -"usage: %s [-t] [-r resolution] [frames [file]]\n" +"usage: %s [-2] [-t] [-r resolution] [frames [file]]\n" " %s -l\n\n" " frames number of frames to display\n" " file PPM file\n\n" +" -2 keep on refreshing the LCD display (experimental)\n" " -l list available modes\n" " -m mode select the display mode, default \"%s\"\n" " -t generate a test image\n" @@ -466,8 +489,11 @@ int main(int argc, char *const *argv) int frames = 0; int c; - while ((c = getopt(argc, argv, "lm:t")) != EOF) + while ((c = getopt(argc, argv, "2lm:t")) != EOF) switch (c) { + case '2': + keep_lcd = 1; + break; case 'l': list_modes(); exit(0);