diff options
Diffstat (limited to 'firmware/drivers/lcd-h300.c')
-rw-r--r-- | firmware/drivers/lcd-h300.c | 47 |
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! */ |
80 | inline void lcd_write_reg(int reg, int val) | 80 | static 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! */ |
87 | inline void lcd_begin_write_gram(void) | 87 | static 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! */ | ||
93 | inline void lcd_write_data(const unsigned short* p_bytes, int count) ICODE_ATTR; | ||
94 | inline 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 | ||
131 | void lcd_set_contrast(int val) | 94 | void 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 | } |