| Line 87... |
Line 87... |
| 87 |
LCDWDATA = (data & 0xff) | ((data & 0x7f00) << 1);
|
87 |
LCDWDATA = (data & 0xff) | ((data & 0x7f00) << 1);
|
| 88 |
}
|
88 |
}
|
| 89 |
|
89 |
|
| 90 |
void lcd_shutdown()
|
90 |
void lcd_shutdown()
|
| 91 |
{
|
91 |
{
|
| - |
|
92 |
mutex_lock(&lcd_mutex, TIMEOUT_BLOCK);
|
| - |
|
93 |
displaylcd_sync();
|
| - |
|
94 |
while (!(LCDSTATUS & 0x2));
|
| - |
|
95 |
LCDCON = 0x41100db8;
|
| 92 |
}
|
96 |
}
|
| 93 |
|
97 |
|
| 94 |
bool displaylcd_busy() ICODE_ATTR;
|
98 |
bool displaylcd_busy() ICODE_ATTR;
|
| 95 |
bool displaylcd_busy()
|
99 |
bool displaylcd_busy()
|
| 96 |
{
|
100 |
{
|
| Line 114... |
Line 118... |
| 114 |
{
|
118 |
{
|
| 115 |
mutex_lock(&lcd_mutex, TIMEOUT_BLOCK);
|
119 |
mutex_lock(&lcd_mutex, TIMEOUT_BLOCK);
|
| 116 |
displaylcd_sync();
|
120 |
displaylcd_sync();
|
| 117 |
}
|
121 |
}
|
| 118 |
else while (DMAC0C4CONFIG & 1);
|
122 |
else while (DMAC0C4CONFIG & 1);
|
| - |
|
123 |
while (!(LCDSTATUS & 0x2));
|
| - |
|
124 |
LCDCON = 0x41100db8;
|
| 119 |
lcd_send_cmd(0x2a);
|
125 |
lcd_send_cmd(0x2a);
|
| 120 |
lcd_send_data(startx);
|
126 |
lcd_send_data(startx);
|
| 121 |
lcd_send_data(endx);
|
127 |
lcd_send_data(endx);
|
| 122 |
lcd_send_cmd(0x2b);
|
128 |
lcd_send_cmd(0x2b);
|
| 123 |
lcd_send_data(starty);
|
129 |
lcd_send_data(starty);
|
| Line 138... |
Line 144... |
| 138 |
lli->srcaddr = data;
|
144 |
lli->srcaddr = data;
|
| 139 |
lli->dstaddr = (void*)((int)&LCDWDATA);
|
145 |
lli->dstaddr = (void*)((int)&LCDWDATA);
|
| 140 |
lli->nextlli = last ? NULL : &lcd_lli[i + 1];
|
146 |
lli->nextlli = last ? NULL : &lcd_lli[i + 1];
|
| 141 |
lli->control = 0x70240000 | (last ? pixels : 0xfff)
|
147 |
lli->control = 0x70240000 | (last ? pixels : 0xfff)
|
| 142 |
| (last ? 0x80000000 : 0) | (solid ? 0 : 0x4000000);
|
148 |
| (last ? 0x80000000 : 0) | (solid ? 0 : 0x4000000);
|
| 143 |
if (!solid) data = (void*)(((uint32_t)data) + 0x1ffe);
|
149 |
if (!solid) data += 0x1ffe;
|
| 144 |
}
|
150 |
}
|
| 145 |
clean_dcache();
|
151 |
clean_dcache();
|
| 146 |
DMAC0C4CONFIG = 0x88c1;
|
152 |
DMAC0C4CONFIG = 0x88c1;
|
| 147 |
}
|
153 |
}
|
| 148 |
|
154 |
|
| Line 155... |
Line 161... |
| 155 |
displaylcd_dma(data, pixels, false);
|
161 |
displaylcd_dma(data, pixels, false);
|
| 156 |
mutex_unlock(&lcd_mutex);
|
162 |
mutex_unlock(&lcd_mutex);
|
| 157 |
}
|
163 |
}
|
| 158 |
|
164 |
|
| 159 |
void displaylcd_safe_native(unsigned int startx, unsigned int endx,
|
165 |
void displaylcd_safe_native(unsigned int startx, unsigned int endx,
|
| 160 |
unsigned int starty, unsigned int endy, void* data)
|
166 |
unsigned int starty, unsigned int endy, void* data)
|
| 161 |
{
|
167 |
{
|
| 162 |
int pixels = (endx - startx + 1) * (endy - starty + 1);
|
168 |
int pixels = (endx - startx + 1) * (endy - starty + 1);
|
| 163 |
if (pixels <= 0) return;
|
169 |
if (pixels <= 0) return;
|
| 164 |
displaylcd_setup(startx, endx, starty, endy, true);
|
170 |
displaylcd_setup(startx, endx, starty, endy, true);
|
| 165 |
displaylcd_dma(data, pixels, false);
|
171 |
displaylcd_dma(data, pixels, false);
|
| Line 221... |
Line 227... |
| 221 |
__asm__ volatile(" subeq r11, r11, r1 \n");
|
227 |
__asm__ volatile(" subeq r11, r11, r1 \n");
|
| 222 |
__asm__ volatile(" add r11, r11, r11,lsl#1 \n");
|
228 |
__asm__ volatile(" add r11, r11, r11,lsl#1 \n");
|
| 223 |
__asm__ volatile(" movne r10, #3 \n");
|
229 |
__asm__ volatile(" movne r10, #3 \n");
|
| 224 |
__asm__ volatile(" moveq r10, #0 \n");
|
230 |
__asm__ volatile(" moveq r10, #0 \n");
|
| 225 |
__asm__ volatile(" ldr r9, =0x38300040 \n");
|
231 |
__asm__ volatile(" ldr r9, =0x38300040 \n");
|
| - |
|
232 |
__asm__ volatile("displaylcd_dither_wait : \n");
|
| - |
|
233 |
__asm__ volatile(" ldr r4, [r9,#-0x24] \n");
|
| - |
|
234 |
__asm__ volatile(" tst r4, #2 \n");
|
| - |
|
235 |
__asm__ volatile(" beq displaylcd_dither_wait \n");
|
| - |
|
236 |
__asm__ volatile(" ldr r4, =0x41104eb8 \n");
|
| - |
|
237 |
__asm__ volatile(" str r4, [r9,#-0x40] \n");
|
| 226 |
__asm__ volatile("displaylcd_dither_y: \n");
|
238 |
__asm__ volatile("displaylcd_dither_y: \n");
|
| 227 |
__asm__ volatile(" ldr lr, [sp] \n");
|
239 |
__asm__ volatile(" ldr lr, [sp] \n");
|
| 228 |
__asm__ volatile(" mov r4, #0 \n");
|
240 |
__asm__ volatile(" mov r4, #0 \n");
|
| 229 |
__asm__ volatile(" mov r5, #0 \n");
|
241 |
__asm__ volatile(" mov r5, #0 \n");
|
| 230 |
__asm__ volatile(" mov r6, #0 \n");
|
242 |
__asm__ volatile(" mov r6, #0 \n");
|
| 231 |
__asm__ volatile(" mov r7, r8 \n");
|
243 |
__asm__ volatile(" mov r7, r8 \n");
|
| 232 |
__asm__ volatile("displaylcd_dither_x: \n");
|
244 |
__asm__ volatile("displaylcd_dither_x: \n");
|
| 233 |
__asm__ volatile(" mov r2, #0 \n");
|
- |
|
| 234 |
__asm__ volatile(" ldrb r1, [r3], #1 \n");
|
245 |
__asm__ volatile(" ldrb r1, [r3], #1 \n");
|
| 235 |
__asm__ volatile(" ldrsb r0, [r7] \n");
|
246 |
__asm__ volatile(" ldrsb r0, [r7] \n");
|
| 236 |
__asm__ volatile(" add r1, r1, r4 \n");
|
247 |
__asm__ volatile(" add r1, r1, r4 \n");
|
| 237 |
__asm__ volatile(" add r1, r1, r0 \n");
|
248 |
__asm__ volatile(" add r1, r1, r0 \n");
|
| 238 |
__asm__ volatile(" cmp r1, #0xff \n");
|
249 |
__asm__ volatile(" cmp r1, #0xff \n");
|
| 239 |
__asm__ volatile(" mvnhi r1, r1,asr#31 \n");
|
250 |
__asm__ volatile(" mvnhi r1, r1,asr#31 \n");
|
| 240 |
__asm__ volatile(" andhi r1, r1, #0xff \n");
|
251 |
__asm__ volatile(" andhi r1, r1, #0xff \n");
|
| 241 |
__asm__ volatile(" mov r0, r1,lsr#3 \n");
|
252 |
__asm__ volatile(" mov r0, r1,lsr#2 \n");
|
| 242 |
__asm__ volatile(" orr r2, r0,lsl#11 \n");
|
253 |
__asm__ volatile(" mov r2, r0,lsl#18 \n");
|
| 243 |
__asm__ volatile(" sub r1, r1, r0,lsl#3 \n");
|
254 |
__asm__ volatile(" sub r1, r1, r0,lsl#2 \n");
|
| 244 |
__asm__ volatile(" sub r1, r1, r0,lsr#2 \n");
|
255 |
__asm__ volatile(" sub r1, r1, r0,lsr#4 \n");
|
| 245 |
__asm__ volatile(" mov r4, r4,lsr#1 \n");
|
256 |
__asm__ volatile(" mov r4, r4,lsr#1 \n");
|
| 246 |
__asm__ volatile(" add r4, r4, r1,lsr#2 \n");
|
257 |
__asm__ volatile(" add r4, r4, r1,lsr#2 \n");
|
| 247 |
__asm__ volatile(" strb r4, [r7], #1 \n");
|
258 |
__asm__ volatile(" strb r4, [r7], #1 \n");
|
| 248 |
__asm__ volatile(" mov r4, r1,asr#1 \n");
|
259 |
__asm__ volatile(" mov r4, r1,asr#1 \n");
|
| 249 |
__asm__ volatile(" ldrb r1, [r3], #1 \n");
|
260 |
__asm__ volatile(" ldrb r1, [r3], #1 \n");
|
| Line 252... |
Line 263... |
| 252 |
__asm__ volatile(" add r1, r1, r0 \n");
|
263 |
__asm__ volatile(" add r1, r1, r0 \n");
|
| 253 |
__asm__ volatile(" cmp r1, #0xff \n");
|
264 |
__asm__ volatile(" cmp r1, #0xff \n");
|
| 254 |
__asm__ volatile(" mvnhi r1, r1,asr#31 \n");
|
265 |
__asm__ volatile(" mvnhi r1, r1,asr#31 \n");
|
| 255 |
__asm__ volatile(" andhi r1, r1, #0xff \n");
|
266 |
__asm__ volatile(" andhi r1, r1, #0xff \n");
|
| 256 |
__asm__ volatile(" mov r0, r1,lsr#2 \n");
|
267 |
__asm__ volatile(" mov r0, r1,lsr#2 \n");
|
| 257 |
__asm__ volatile(" orr r2, r0,lsl#5 \n");
|
268 |
__asm__ volatile(" orr r2, r2, r0,lsl#10 \n");
|
| 258 |
__asm__ volatile(" sub r1, r1, r0,lsl#2 \n");
|
269 |
__asm__ volatile(" sub r1, r1, r0,lsl#2 \n");
|
| 259 |
__asm__ volatile(" sub r1, r1, r0,lsr#4 \n");
|
270 |
__asm__ volatile(" sub r1, r1, r0,lsr#4 \n");
|
| 260 |
__asm__ volatile(" mov r5, r5,lsr#1 \n");
|
271 |
__asm__ volatile(" mov r5, r5,lsr#1 \n");
|
| 261 |
__asm__ volatile(" add r5, r5, r1,lsr#2 \n");
|
272 |
__asm__ volatile(" add r5, r5, r1,lsr#2 \n");
|
| 262 |
__asm__ volatile(" strb r5, [r7], #1 \n");
|
273 |
__asm__ volatile(" strb r5, [r7], #1 \n");
|
| Line 266... |
Line 277... |
| 266 |
__asm__ volatile(" add r1, r1, r6 \n");
|
277 |
__asm__ volatile(" add r1, r1, r6 \n");
|
| 267 |
__asm__ volatile(" add r1, r1, r0 \n");
|
278 |
__asm__ volatile(" add r1, r1, r0 \n");
|
| 268 |
__asm__ volatile(" cmp r1, #0xff \n");
|
279 |
__asm__ volatile(" cmp r1, #0xff \n");
|
| 269 |
__asm__ volatile(" mvnhi r1, r1,asr#31 \n");
|
280 |
__asm__ volatile(" mvnhi r1, r1,asr#31 \n");
|
| 270 |
__asm__ volatile(" andhi r1, r1, #0xff \n");
|
281 |
__asm__ volatile(" andhi r1, r1, #0xff \n");
|
| 271 |
__asm__ volatile(" mov r0, r1,lsr#3 \n");
|
282 |
__asm__ volatile(" mov r0, r1,lsr#2 \n");
|
| 272 |
__asm__ volatile(" orr r2, r0 \n");
|
283 |
__asm__ volatile(" orr r2, r2, r0,lsl#2 \n");
|
| 273 |
__asm__ volatile(" sub r1, r1, r0,lsl#3 \n");
|
284 |
__asm__ volatile(" sub r1, r1, r0,lsl#2 \n");
|
| 274 |
__asm__ volatile(" sub r1, r1, r0,lsr#2 \n");
|
285 |
__asm__ volatile(" sub r1, r1, r0,lsr#4 \n");
|
| 275 |
__asm__ volatile(" mov r6, r6,lsr#1 \n");
|
286 |
__asm__ volatile(" mov r6, r6,lsr#1 \n");
|
| 276 |
__asm__ volatile(" add r6, r6, r1,lsr#2 \n");
|
287 |
__asm__ volatile(" add r6, r6, r1,lsr#2 \n");
|
| 277 |
__asm__ volatile(" strb r6, [r7], #1 \n");
|
288 |
__asm__ volatile(" strb r6, [r7], #1 \n");
|
| 278 |
__asm__ volatile("displaylcd_dither_waitlcd: \n");
|
289 |
__asm__ volatile("displaylcd_dither_wait2: \n");
|
| 279 |
__asm__ volatile(" ldr r0, [r9,#-0x24] \n");
|
290 |
__asm__ volatile(" ldr r0, [r9,#-0x24] \n");
|
| 280 |
__asm__ volatile(" mov r6, r1,asr#1 \n");
|
291 |
__asm__ volatile(" mov r6, r1,asr#1 \n");
|
| 281 |
__asm__ volatile(" tst r0, #0x10 \n");
|
292 |
__asm__ volatile(" tst r0, #0x10 \n");
|
| 282 |
__asm__ volatile(" bne displaylcd_dither_waitlcd\n");
|
293 |
__asm__ volatile(" bne displaylcd_dither_wait2 \n");
|
| 283 |
__asm__ volatile(" str r2, [r9] \n");
|
294 |
__asm__ volatile(" str r2, [r9] \n");
|
| 284 |
__asm__ volatile(" sub r3, r3, r10 \n");
|
295 |
__asm__ volatile(" sub r3, r3, r10 \n");
|
| 285 |
__asm__ volatile(" subs lr, lr, #1 \n");
|
296 |
__asm__ volatile(" subs lr, lr, #1 \n");
|
| 286 |
__asm__ volatile(" bne displaylcd_dither_x \n");
|
297 |
__asm__ volatile(" bne displaylcd_dither_x \n");
|
| 287 |
__asm__ volatile(" add r3, r3, r11 \n");
|
298 |
__asm__ volatile(" add r3, r3, r11 \n");
|