summaryrefslogtreecommitdiff
path: root/firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c
diff options
context:
space:
mode:
authorGreg White <gwhite@rockbox.org>2007-01-13 02:24:15 +0000
committerGreg White <gwhite@rockbox.org>2007-01-13 02:24:15 +0000
commit355be5010af1e33c0f3b36af85033bd31f996491 (patch)
tree1e83cefbe3d313179bda383a5ad508adaff8ffac /firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c
parent35b0c3f24f279eb8056e54094cb12310802f6709 (diff)
downloadrockbox-355be5010af1e33c0f3b36af85033bd31f996491.tar.gz
rockbox-355be5010af1e33c0f3b36af85033bd31f996491.zip
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
Diffstat (limited to 'firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c')
-rw-r--r--firmware/target/arm/gigabeat/meg-fx/lcd-meg-fx.c45
1 files changed, 30 insertions, 15 deletions
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()
29 return lcd_on; 29 return lcd_on;
30} 30}
31 31
32unsigned int LCDBANK(unsigned int address)
33{
34 return ((address >> 22) & 0xff);
35}
36
37unsigned int LCDBASEU(unsigned int address)
38{
39 return (address & ((1 << 22)-1)) >> 1;
40}
41
42unsigned int LCDBASEL(unsigned int address)
43{
44 address += 320*240*2;
45 return (address & ((1 << 22)-1)) >> 1;
46}
47
48
32/* LCD init */ 49/* LCD init */
33void lcd_init_device(void) 50void lcd_init_device(void)
34{ 51{
35 memset16(fg_pattern_blit, fg_pattern, sizeof(fg_pattern_blit)/2); 52 LCDSADDR1 = (LCDBANK((unsigned)FRAME) << 21) | (LCDBASEU((unsigned)FRAME));
36 memset16(bg_pattern_blit, bg_pattern, sizeof(bg_pattern_blit)/2); 53 LCDSADDR2 = LCDBASEL((unsigned)FRAME);
37 clean_dcache_range((void *)fg_pattern_blit, sizeof(fg_pattern_blit)); 54 LCDSADDR3 = 0x000000F0;
38 clean_dcache_range((void *)bg_pattern_blit, sizeof(bg_pattern_blit));
39
40 LCDSADDR1 = 0x18F00000; /* These values are pulled from an F40 */
41 LCDSADDR2 = 0x00112C00; /* They should move FRAME to the correct location */
42 LCDSADDR3 = 0x000000F0; /* TODO: Move FRAME to where we want it */
43 55
44 LCDCON5 |= 1 << 11; /* Switch from 555I mode to 565 mode */ 56 LCDCON5 |= 1 << 11; /* Switch from 555I mode to 565 mode */
45 57
46#if !defined(BOOTLOADER) 58#if !defined(BOOTLOADER)
59 memset16(fg_pattern_blit, fg_pattern, sizeof(fg_pattern_blit)/2);
60 memset16(bg_pattern_blit, bg_pattern, sizeof(bg_pattern_blit)/2);
61 clean_dcache_range((void *)fg_pattern_blit, sizeof(fg_pattern_blit));
62 clean_dcache_range((void *)bg_pattern_blit, sizeof(bg_pattern_blit));
47 use_dma_blit = true; 63 use_dma_blit = true;
48 lcd_poweroff = true; 64 lcd_poweroff = true;
49#endif 65#endif
@@ -66,7 +82,7 @@ void lcd_update_rect(int x, int y, int width, int height)
66 { 82 {
67 /* Wait for this controller to stop pending transfer */ 83 /* Wait for this controller to stop pending transfer */
68 while((DSTAT1 & 0x000fffff)) 84 while((DSTAT1 & 0x000fffff))
69 CLKCON |= (1 << 2); /* set IDLE bit */ 85 yield();
70 86
71 /* Flush DCache */ 87 /* Flush DCache */
72 invalidate_dcache_range((void *)(((int) &lcd_framebuffer)+(y * sizeof(fb_data) * LCD_WIDTH)), (height * sizeof(fb_data) * LCD_WIDTH)); 88 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)
92 108
93 /* Wait for transfer to complete */ 109 /* Wait for transfer to complete */
94 while((DSTAT1 & 0x000fffff)) 110 while((DSTAT1 & 0x000fffff))
95 CLKCON |= (1 << 2); /* set IDLE bit */ 111 yield();
96 } 112 }
97 else 113 else
98 memcpy(((char*)FRAME) + (y * sizeof(fb_data) * LCD_WIDTH), ((char *)&lcd_framebuffer) + (y * sizeof(fb_data) * LCD_WIDTH), ((height * sizeof(fb_data) * LCD_WIDTH))); 114 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)
143 void *src; 159 void *src;
144 bool inc = false; 160 bool inc = false;
145 161
146 if(!lcd_on) { 162 if(!lcd_on)
147 sleep(200); 163 yield();
148 }
149 if (lcd_get_drawmode() & DRMODE_INVERSEVID) 164 if (lcd_get_drawmode() & DRMODE_INVERSEVID)
150 src = fg_pattern_blit; 165 src = fg_pattern_blit;
151 else 166 else
@@ -162,7 +177,7 @@ void lcd_clear_display_dma(void)
162 } 177 }
163 /* Wait for any pending transfer to complete */ 178 /* Wait for any pending transfer to complete */
164 while((DSTAT3 & 0x000fffff)) 179 while((DSTAT3 & 0x000fffff))
165 CLKCON |= (1 << 2); /* set IDLE bit */ 180 yield();
166 DMASKTRIG3 |= 0x4; /* Stop controller */ 181 DMASKTRIG3 |= 0x4; /* Stop controller */
167 DIDST3 = ((int) lcd_framebuffer) + 0x30000000; /* set DMA dest, physical address */ 182 DIDST3 = ((int) lcd_framebuffer) + 0x30000000; /* set DMA dest, physical address */
168 DIDSTC3 = 0; /* Dest on AHB, increment */ 183 DIDSTC3 = 0; /* Dest on AHB, increment */
@@ -182,7 +197,7 @@ void lcd_clear_display_dma(void)
182 197
183 /* Wait for transfer to complete */ 198 /* Wait for transfer to complete */
184 while((DSTAT3 & 0x000fffff)) 199 while((DSTAT3 & 0x000fffff))
185 CLKCON |= (1 << 2); /* set IDLE bit */ 200 yield();
186} 201}
187 202
188void lcd_clear_display(void) 203void lcd_clear_display(void)