summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/crt0.S2
-rw-r--r--firmware/drivers/lcd-16bit.c2
-rw-r--r--firmware/drivers/lcd-h300.c21
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 ***/
39fb_data lcd_framebuffer[LCD_HEIGHT][LCD_WIDTH] __attribute__ ((aligned (4))); 39fb_data lcd_framebuffer[LCD_HEIGHT][LCD_WIDTH] __attribute__ ((aligned (16)));
40 40
41static unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG; 41static unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG;
42static unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG; 42static 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! */ 92void lcd_write_data(const unsigned short* p_bytes, int count) ICODE_ATTR;
93inline void lcd_write_data(const unsigned short* p_bytes, int count) ICODE_ATTR; 93void lcd_write_data(const unsigned short* p_bytes, int count)
94inline 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 */
132void lcd_init_device(void) 140void 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);