diff options
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.c | 45 |
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 | ||
32 | unsigned int LCDBANK(unsigned int address) | ||
33 | { | ||
34 | return ((address >> 22) & 0xff); | ||
35 | } | ||
36 | |||
37 | unsigned int LCDBASEU(unsigned int address) | ||
38 | { | ||
39 | return (address & ((1 << 22)-1)) >> 1; | ||
40 | } | ||
41 | |||
42 | unsigned 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 */ |
33 | void lcd_init_device(void) | 50 | void 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 | ||
188 | void lcd_clear_display(void) | 203 | void lcd_clear_display(void) |