summaryrefslogtreecommitdiff
path: root/firmware/drivers/lcd-h300.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/lcd-h300.c')
-rw-r--r--firmware/drivers/lcd-h300.c47
1 files changed, 5 insertions, 42 deletions
diff --git a/firmware/drivers/lcd-h300.c b/firmware/drivers/lcd-h300.c
index d84edd6b2e..8ee6b1c47e 100644
--- a/firmware/drivers/lcd-h300.c
+++ b/firmware/drivers/lcd-h300.c
@@ -77,55 +77,18 @@ static bool display_on=false; /* is the display turned on? */
77 77
78 78
79/* called very frequently - inline! */ 79/* called very frequently - inline! */
80inline void lcd_write_reg(int reg, int val) 80static inline void lcd_write_reg(int reg, int val)
81{ 81{
82 *(volatile unsigned short *)0xf0000000 = reg; 82 *(volatile unsigned short *)0xf0000000 = reg;
83 *(volatile unsigned short *)0xf0000002 = val; 83 *(volatile unsigned short *)0xf0000002 = val;
84} 84}
85 85
86/* called very frequently - inline! */ 86/* called very frequently - inline! */
87inline void lcd_begin_write_gram(void) 87static inline void lcd_begin_write_gram(void)
88{ 88{
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! */
93inline void lcd_write_data(const unsigned short* p_bytes, int count) ICODE_ATTR;
94inline void lcd_write_data(const unsigned short* p_bytes, int count)
95{
96 int precount = ((-(size_t)p_bytes) & 0xf) / 2;
97 count -= precount;
98 while(precount--)
99 *(volatile unsigned short *)0xf0000002 = *p_bytes++;
100 while((count -= 8) >= 0) asm (
101 "\n\tmovem.l (%[p_bytes]),%%d1-%%d4\
102 \n\tswap %%d1\
103 \n\tmove.w %%d1,(%[dest])\
104 \n\tswap %%d1\
105 \n\tmove.w %%d1,(%[dest])\
106 \n\tswap %%d2\
107 \n\tmove.w %%d2,(%[dest])\
108 \n\tswap %%d2\
109 \n\tmove.w %%d2,(%[dest])\
110 \n\tswap %%d3\
111 \n\tmove.w %%d3,(%[dest])\
112 \n\tswap %%d3\
113 \n\tmove.w %%d3,(%[dest])\
114 \n\tswap %%d4\
115 \n\tmove.w %%d4,(%[dest])\
116 \n\tswap %%d4\
117 \n\tmove.w %%d4,(%[dest])\
118 \n\tlea.l (16,%[p_bytes]),%[p_bytes]"
119 : [p_bytes] "+a" (p_bytes)
120 : [dest] "a" ((volatile unsigned short *)0xf0000002)
121 : "d1", "d2", "d3", "d4", "memory");
122 if (count != 0) {
123 count += 8;
124 while(count--)
125 *(volatile unsigned short *)0xf0000002 = *p_bytes++;
126 }
127}
128
129/*** hardware configuration ***/ 92/*** hardware configuration ***/
130 93
131void lcd_set_contrast(int val) 94void lcd_set_contrast(int val)
@@ -406,8 +369,8 @@ void lcd_update_rect(int x, int y, int width, int height)
406 lcd_write_reg(R_HORIZ_RAM_ADDR_POS, (ymax<<8) | y); 369 lcd_write_reg(R_HORIZ_RAM_ADDR_POS, (ymax<<8) | y);
407 370
408 /* vert ram addr */ 371 /* vert ram addr */
409 lcd_write_reg(R_VERT_RAM_ADDR_POS,((x+width-1)<<8) | x); 372 lcd_write_reg(R_VERT_RAM_ADDR_POS,((x+width-1)<<8) | x);
410 lcd_write_reg(R_RAM_ADDR_SET, (x<<8) | y); 373 lcd_write_reg(R_RAM_ADDR_SET, (x<<8) | y);
411 lcd_begin_write_gram(); 374 lcd_begin_write_gram();
412 375
413 /* Copy specified rectangle bitmap to hardware */ 376 /* Copy specified rectangle bitmap to hardware */
@@ -421,6 +384,6 @@ void lcd_update_rect(int x, int y, int width, int height)
421 lcd_write_reg(R_HORIZ_RAM_ADDR_POS, 0xaf00); 384 lcd_write_reg(R_HORIZ_RAM_ADDR_POS, 0xaf00);
422 385
423 /* vert ram addr: 0 - 219 */ 386 /* vert ram addr: 0 - 219 */
424 lcd_write_reg(R_VERT_RAM_ADDR_POS, 0xdb00); 387 lcd_write_reg(R_VERT_RAM_ADDR_POS, 0xdb00);
425 } 388 }
426} 389}