From 355be5010af1e33c0f3b36af85033bd31f996491 Mon Sep 17 00:00:00 2001 From: Greg White Date: Sat, 13 Jan 2007 02:24:15 +0000 Subject: Setup LCD ourselves; move LCD buffer and TTB to free up 1.7MB of memory git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11994 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/arm/gigabeat/meg-fx/ata-meg-fx.c | 11 ++++-- .../target/arm/gigabeat/meg-fx/backlight-meg-fx.c | 12 +++--- firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c | 45 ++++++++++++++-------- firmware/target/arm/gigabeat/meg-fx/mmu-meg-fx.c | 9 +++-- .../target/arm/gigabeat/meg-fx/system-meg-fx.c | 1 + 5 files changed, 49 insertions(+), 29 deletions(-) (limited to 'firmware/target/arm') diff --git a/firmware/target/arm/gigabeat/meg-fx/ata-meg-fx.c b/firmware/target/arm/gigabeat/meg-fx/ata-meg-fx.c index 8e246045e6..00b5e09ed3 100644 --- a/firmware/target/arm/gigabeat/meg-fx/ata-meg-fx.c +++ b/firmware/target/arm/gigabeat/meg-fx/ata-meg-fx.c @@ -53,10 +53,11 @@ void ata_device_init(void) { } +#if !defined(BOOTLOADER) void copy_read_sectors(unsigned char* buf, int wordcount) { __buttonlight_trigger(); - + /* Unaligned transfer - slow copy */ if ( (unsigned long)buf & 1) { /* not 16-bit aligned, copy byte by byte */ @@ -94,7 +95,9 @@ void copy_read_sectors(unsigned char* buf, int wordcount) DISRC0 = (int) 0x18000000; DISRCC0 = 0x1; /* Dest mapped to physical address, on AHB bus, increment */ - DIDST0 = (int) (buf + 0x30000000); + DIDST0 = (int) buf; + if(DIDST0 < 0x30000000) + DIDST0 += 0x30000000; DIDSTC0 = 0; /* DACK/DREQ Sync to AHB, Int on Transfer complete, Whole service, No reload, 16-bit transfers */ @@ -112,10 +115,10 @@ void copy_read_sectors(unsigned char* buf, int wordcount) /* Wait for transfer to complete */ while((DSTAT0 & 0x000fffff)) - CLKCON |= (1 << 2); /* set IDLE bit */ + yield(); /* Dump cache for the buffer */ } - +#endif void dma0(void) { } diff --git a/firmware/target/arm/gigabeat/meg-fx/backlight-meg-fx.c b/firmware/target/arm/gigabeat/meg-fx/backlight-meg-fx.c index f6a8d31c7b..2f96584515 100644 --- a/firmware/target/arm/gigabeat/meg-fx/backlight-meg-fx.c +++ b/firmware/target/arm/gigabeat/meg-fx/backlight-meg-fx.c @@ -123,8 +123,8 @@ bool __backlight_init(void) buttonlight_selected = 0x04; - /* delay 2 seconds before any fading */ - initial_tick_delay = 2000; + /* delay 4 seconds before any fading */ + initial_tick_delay = 400; /* put the led control on the tick list */ tick_add_task(led_control_service); @@ -272,10 +272,10 @@ void __buttonlight_mode(enum buttonlight_mode mode, */ static void led_control_service(void) { - if(initial_tick_delay) { - initial_tick_delay--; - return; - } + if(initial_tick_delay) { + initial_tick_delay--; + return; + } switch (backlight_control) { case BACKLIGHT_CONTROL_IDLE: diff --git a/firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c b/firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c index 778e049dd5..c3a17e16cb 100644 --- a/firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c +++ b/firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c @@ -29,21 +29,37 @@ bool lcd_enabled() return lcd_on; } +unsigned int LCDBANK(unsigned int address) +{ + return ((address >> 22) & 0xff); +} + +unsigned int LCDBASEU(unsigned int address) +{ + return (address & ((1 << 22)-1)) >> 1; +} + +unsigned int LCDBASEL(unsigned int address) +{ + address += 320*240*2; + return (address & ((1 << 22)-1)) >> 1; +} + + /* LCD init */ void lcd_init_device(void) { - memset16(fg_pattern_blit, fg_pattern, sizeof(fg_pattern_blit)/2); - memset16(bg_pattern_blit, bg_pattern, sizeof(bg_pattern_blit)/2); - clean_dcache_range((void *)fg_pattern_blit, sizeof(fg_pattern_blit)); - clean_dcache_range((void *)bg_pattern_blit, sizeof(bg_pattern_blit)); - - LCDSADDR1 = 0x18F00000; /* These values are pulled from an F40 */ - LCDSADDR2 = 0x00112C00; /* They should move FRAME to the correct location */ - LCDSADDR3 = 0x000000F0; /* TODO: Move FRAME to where we want it */ + LCDSADDR1 = (LCDBANK((unsigned)FRAME) << 21) | (LCDBASEU((unsigned)FRAME)); + LCDSADDR2 = LCDBASEL((unsigned)FRAME); + LCDSADDR3 = 0x000000F0; LCDCON5 |= 1 << 11; /* Switch from 555I mode to 565 mode */ #if !defined(BOOTLOADER) + memset16(fg_pattern_blit, fg_pattern, sizeof(fg_pattern_blit)/2); + memset16(bg_pattern_blit, bg_pattern, sizeof(bg_pattern_blit)/2); + clean_dcache_range((void *)fg_pattern_blit, sizeof(fg_pattern_blit)); + clean_dcache_range((void *)bg_pattern_blit, sizeof(bg_pattern_blit)); use_dma_blit = true; lcd_poweroff = true; #endif @@ -66,7 +82,7 @@ void lcd_update_rect(int x, int y, int width, int height) { /* Wait for this controller to stop pending transfer */ while((DSTAT1 & 0x000fffff)) - CLKCON |= (1 << 2); /* set IDLE bit */ + yield(); /* Flush DCache */ invalidate_dcache_range((void *)(((int) &lcd_framebuffer)+(y * sizeof(fb_data) * LCD_WIDTH)), (height * sizeof(fb_data) * LCD_WIDTH)); @@ -92,7 +108,7 @@ void lcd_update_rect(int x, int y, int width, int height) /* Wait for transfer to complete */ while((DSTAT1 & 0x000fffff)) - CLKCON |= (1 << 2); /* set IDLE bit */ + yield(); } else memcpy(((char*)FRAME) + (y * sizeof(fb_data) * LCD_WIDTH), ((char *)&lcd_framebuffer) + (y * sizeof(fb_data) * LCD_WIDTH), ((height * sizeof(fb_data) * LCD_WIDTH))); @@ -143,9 +159,8 @@ void lcd_clear_display_dma(void) void *src; bool inc = false; - if(!lcd_on) { - sleep(200); - } + if(!lcd_on) + yield(); if (lcd_get_drawmode() & DRMODE_INVERSEVID) src = fg_pattern_blit; else @@ -162,7 +177,7 @@ void lcd_clear_display_dma(void) } /* Wait for any pending transfer to complete */ while((DSTAT3 & 0x000fffff)) - CLKCON |= (1 << 2); /* set IDLE bit */ + yield(); DMASKTRIG3 |= 0x4; /* Stop controller */ DIDST3 = ((int) lcd_framebuffer) + 0x30000000; /* set DMA dest, physical address */ DIDSTC3 = 0; /* Dest on AHB, increment */ @@ -182,7 +197,7 @@ void lcd_clear_display_dma(void) /* Wait for transfer to complete */ while((DSTAT3 & 0x000fffff)) - CLKCON |= (1 << 2); /* set IDLE bit */ + yield(); } void lcd_clear_display(void) diff --git a/firmware/target/arm/gigabeat/meg-fx/mmu-meg-fx.c b/firmware/target/arm/gigabeat/meg-fx/mmu-meg-fx.c index 47abb9d46a..8094ff828f 100644 --- a/firmware/target/arm/gigabeat/meg-fx/mmu-meg-fx.c +++ b/firmware/target/arm/gigabeat/meg-fx/mmu-meg-fx.c @@ -1,6 +1,7 @@ #include #include "s3c2440.h" #include "mmu-meg-fx.h" +#include "panic.h" void map_memory(void); static void enable_mmu(void); @@ -20,7 +21,7 @@ void map_memory(void) { enable_mmu(); } -unsigned int* ttb_base; +unsigned int* ttb_base = (unsigned int *) TTB_BASE; const int ttb_size = 4096; void set_ttb() { @@ -29,7 +30,7 @@ void set_ttb() { int domain_access; /* must be 16Kb (0x4000) aligned */ - ttb_base = (int*)0x31F00000; + ttb_base = (int*) TTB_BASE; for (i=0; i