diff options
Diffstat (limited to 'firmware/target/arm/as3525/sansa-fuze')
-rw-r--r-- | firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c | 59 |
1 files changed, 10 insertions, 49 deletions
diff --git a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c index 3332e0c78c..bdf1c704e0 100644 --- a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c +++ b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c | |||
@@ -124,66 +124,23 @@ static void as3525_dbop_init(void) | |||
124 | /* TODO: The OF calls some other functions here, but maybe not important */ | 124 | /* TODO: The OF calls some other functions here, but maybe not important */ |
125 | } | 125 | } |
126 | 126 | ||
127 | static void lcd_write_value16(unsigned short value) | 127 | static void lcd_write_cmd(short cmd) |
128 | { | ||
129 | DBOP_CTRL &= ~(1<<14|1<<13); | ||
130 | lcd_delay(10); | ||
131 | DBOP_DOUT16 = value; | ||
132 | while ((DBOP_STAT & (1<<10)) == 0); | ||
133 | } | ||
134 | |||
135 | static void lcd_write_cmd(int cmd) | ||
136 | { | 128 | { |
137 | /* Write register */ | 129 | /* Write register */ |
138 | DBOP_TIMPOL_23 = 0xa167006e; | 130 | DBOP_TIMPOL_23 = 0xa167006e; |
139 | lcd_write_value16(cmd); | 131 | dbop_write_data(&cmd, 1); |
140 | |||
141 | /* Wait for fifo to empty */ | ||
142 | while ((DBOP_STAT & (1<<10)) == 0); | ||
143 | 132 | ||
144 | lcd_delay(4); | 133 | lcd_delay(4); |
145 | 134 | ||
146 | DBOP_TIMPOL_23 = 0xa167e06f; | 135 | DBOP_TIMPOL_23 = 0xa167e06f; |
147 | } | 136 | } |
148 | 137 | ||
149 | void lcd_write_data(const fb_data* p_bytes, int count) | ||
150 | { | ||
151 | const long *data; | ||
152 | if ((int)p_bytes & 0x3) | ||
153 | { /* need to do a single 16bit write beforehand if the address is | ||
154 | * not word aligned */ | ||
155 | lcd_write_value16(*p_bytes); | ||
156 | count--;p_bytes++; | ||
157 | } | ||
158 | /* from here, 32bit transfers are save | ||
159 | * set it to transfer 4*(outputwidth) units at a time, | ||
160 | * if bit 12 is set it only does 2 halfwords though */ | ||
161 | DBOP_CTRL |= (1<<13|1<<14); | ||
162 | lcd_delay(10); | ||
163 | data = (long*)p_bytes; | ||
164 | while (count > 1) | ||
165 | { | ||
166 | DBOP_DOUT32 = *data++; | ||
167 | count -= 2; | ||
168 | |||
169 | /* Wait if push fifo is full */ | ||
170 | while ((DBOP_STAT & (1<<6)) != 0); | ||
171 | } | ||
172 | /* While push fifo is not empty */ | ||
173 | while ((DBOP_STAT & (1<<10)) == 0); | ||
174 | |||
175 | /* due to the 32bit alignment requirement or uneven count, | ||
176 | * we possibly need to do a 16bit transfer at the end also */ | ||
177 | if (count > 0) | ||
178 | lcd_write_value16(*(fb_data*)data); | ||
179 | } | ||
180 | |||
181 | static void lcd_write_reg(int reg, int value) | 138 | static void lcd_write_reg(int reg, int value) |
182 | { | 139 | { |
183 | fb_data data = value; | 140 | int16_t data = value; |
184 | 141 | ||
185 | lcd_write_cmd(reg); | 142 | lcd_write_cmd(reg); |
186 | lcd_write_value16(data); | 143 | dbop_write_data(&data, 1); |
187 | } | 144 | } |
188 | 145 | ||
189 | /*** hardware configuration ***/ | 146 | /*** hardware configuration ***/ |
@@ -437,7 +394,7 @@ void lcd_update(void) | |||
437 | 394 | ||
438 | lcd_write_cmd(R_WRITE_DATA_2_GRAM); | 395 | lcd_write_cmd(R_WRITE_DATA_2_GRAM); |
439 | 396 | ||
440 | lcd_write_data((fb_data*)lcd_framebuffer, LCD_WIDTH*LCD_HEIGHT); | 397 | dbop_write_data((fb_data*)lcd_framebuffer, LCD_WIDTH*LCD_HEIGHT); |
441 | } | 398 | } |
442 | 399 | ||
443 | /* Update a fraction of the display. */ | 400 | /* Update a fraction of the display. */ |
@@ -470,6 +427,10 @@ void lcd_update_rect(int x, int y, int width, int height) | |||
470 | 427 | ||
471 | lcd_write_reg(R_ENTRY_MODE, r_entry_mode); | 428 | lcd_write_reg(R_ENTRY_MODE, r_entry_mode); |
472 | 429 | ||
430 | /* we need to make x and width even to enable 32bit transfers */ | ||
431 | width = (width + (x & 1) + 1) & ~1; | ||
432 | x &= ~1; | ||
433 | |||
473 | lcd_window_x(x, x + width - 1); | 434 | lcd_window_x(x, x + width - 1); |
474 | lcd_window_y(y, y + height -1); | 435 | lcd_window_y(y, y + height -1); |
475 | 436 | ||
@@ -479,7 +440,7 @@ void lcd_update_rect(int x, int y, int width, int height) | |||
479 | 440 | ||
480 | do | 441 | do |
481 | { | 442 | { |
482 | lcd_write_data(ptr, width); | 443 | dbop_write_data(ptr, width); |
483 | ptr += LCD_WIDTH; | 444 | ptr += LCD_WIDTH; |
484 | } | 445 | } |
485 | while (--height > 0); | 446 | while (--height > 0); |