diff options
-rw-r--r-- | firmware/crt0.S | 2 | ||||
-rw-r--r-- | firmware/drivers/lcd-16bit.c | 2 | ||||
-rw-r--r-- | firmware/drivers/lcd-h300.c | 21 |
3 files changed, 18 insertions, 7 deletions
diff --git a/firmware/crt0.S b/firmware/crt0.S index 7ab7e2cbd8..df2ff5884d 100644 --- a/firmware/crt0.S +++ b/firmware/crt0.S | |||
@@ -434,7 +434,7 @@ irq_handler: | |||
434 | /* Chip select 1 - LCD controller */ | 434 | /* Chip select 1 - LCD controller */ |
435 | move.l #0xf0000000,%d0 /* CSAR1 - Base = 0xf0000000 */ | 435 | move.l #0xf0000000,%d0 /* CSAR1 - Base = 0xf0000000 */ |
436 | move.l %d0,(0x08c,%a0) | 436 | move.l %d0,(0x08c,%a0) |
437 | moveq.l #0x75,%d0 /* CSMR1 - 64K, Only data access */ | 437 | moveq.l #0x1,%d0 /* CSMR1 - 64K */ |
438 | move.l %d0,(0x090,%a0) | 438 | move.l %d0,(0x090,%a0) |
439 | move.l #0x00000180,%d0 /* CSCR1 - no wait states, 16 bits, no bursts */ | 439 | move.l #0x00000180,%d0 /* CSCR1 - no wait states, 16 bits, no bursts */ |
440 | move.l %d0,(0x094,%a0) | 440 | move.l %d0,(0x094,%a0) |
diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c index 582050c878..6337fa1ea7 100644 --- a/firmware/drivers/lcd-16bit.c +++ b/firmware/drivers/lcd-16bit.c | |||
@@ -36,7 +36,7 @@ | |||
36 | #define SCROLLABLE_LINES 26 | 36 | #define SCROLLABLE_LINES 26 |
37 | 37 | ||
38 | /*** globals ***/ | 38 | /*** globals ***/ |
39 | fb_data lcd_framebuffer[LCD_HEIGHT][LCD_WIDTH] __attribute__ ((aligned (4))); | 39 | fb_data lcd_framebuffer[LCD_HEIGHT][LCD_WIDTH] __attribute__ ((aligned (16))); |
40 | 40 | ||
41 | static unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG; | 41 | static unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG; |
42 | static unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG; | 42 | static unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG; |
diff --git a/firmware/drivers/lcd-h300.c b/firmware/drivers/lcd-h300.c index bb2f9ec777..149062be96 100644 --- a/firmware/drivers/lcd-h300.c +++ b/firmware/drivers/lcd-h300.c | |||
@@ -89,12 +89,20 @@ inline void lcd_begin_write_gram(void) | |||
89 | *(volatile unsigned short *)0xf0000000 = R_WRITE_DATA_2_GRAM; | 89 | *(volatile unsigned short *)0xf0000000 = R_WRITE_DATA_2_GRAM; |
90 | } | 90 | } |
91 | 91 | ||
92 | /* called very frequently - inline! */ | 92 | void lcd_write_data(const unsigned short* p_bytes, int count) ICODE_ATTR; |
93 | inline void lcd_write_data(const unsigned short* p_bytes, int count) ICODE_ATTR; | 93 | void lcd_write_data(const unsigned short* p_bytes, int count) |
94 | inline void lcd_write_data(const unsigned short* p_bytes, int count) | ||
95 | { | 94 | { |
96 | while(count--) | 95 | SAR1 = (unsigned long)p_bytes; /* Destination address */ |
97 | *(volatile unsigned short *)0xf0000002 = *p_bytes++; | 96 | while(count) |
97 | { | ||
98 | int cnt = MIN(count, 256); | ||
99 | DAR1 = (unsigned long)0xf0000002; /* Destination address */ | ||
100 | BCR1 = cnt*2; /* Bytes to transfer */ | ||
101 | DCR1 = 0x02000000 | DMA_SINC | (2 << 20) | (2 << 17) | DMA_START; | ||
102 | while(!(DSR1 & 1)) {}; | ||
103 | DSR1 = 1; | ||
104 | count -= cnt; | ||
105 | } | ||
98 | } | 106 | } |
99 | 107 | ||
100 | /*** hardware configuration ***/ | 108 | /*** hardware configuration ***/ |
@@ -131,6 +139,9 @@ void lcd_roll(int lines) | |||
131 | /* LCD init */ | 139 | /* LCD init */ |
132 | void lcd_init_device(void) | 140 | void lcd_init_device(void) |
133 | { | 141 | { |
142 | MPARK = 0x81; /* PARK[1,0]=10 + BCR24BIT */ | ||
143 | DSR1 = 1; | ||
144 | |||
134 | /* GPO46 is LCD RESET */ | 145 | /* GPO46 is LCD RESET */ |
135 | or_l(0x00004000, &GPIO1_OUT); | 146 | or_l(0x00004000, &GPIO1_OUT); |
136 | or_l(0x00004000, &GPIO1_ENABLE); | 147 | or_l(0x00004000, &GPIO1_ENABLE); |