diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/target/arm/as3525/lcd-as-e200v2-fuze.S | 103 |
1 files changed, 51 insertions, 52 deletions
diff --git a/firmware/target/arm/as3525/lcd-as-e200v2-fuze.S b/firmware/target/arm/as3525/lcd-as-e200v2-fuze.S index 71d997d044..2725c926a8 100644 --- a/firmware/target/arm/as3525/lcd-as-e200v2-fuze.S +++ b/firmware/target/arm/as3525/lcd-as-e200v2-fuze.S | |||
@@ -51,14 +51,19 @@ lcd_write_yuv420_lines: | |||
51 | @ r0 = yuv_src | 51 | @ r0 = yuv_src |
52 | @ r1 = width | 52 | @ r1 = width |
53 | @ r2 = stride | 53 | @ r2 = stride |
54 | stmfd sp!, { r4-r10, lr } @ save non-scratch | 54 | stmfd sp!, { r4-r11, lr } @ save non-scratch |
55 | |||
56 | mov r3, #0xC8000000 @ | ||
57 | orr r3, r3, #0x120000 @ r3 = DBOP_BASE | ||
58 | |||
55 | ldmia r0, { r4, r5, r6 } @ r4 = yuv_src[0] = Y'_p | 59 | ldmia r0, { r4, r5, r6 } @ r4 = yuv_src[0] = Y'_p |
56 | @ r5 = yuv_src[1] = Cb_p | 60 | @ r5 = yuv_src[1] = Cb_p |
57 | @ r6 = yuv_src[2] = Cr_p | 61 | @ r6 = yuv_src[2] = Cr_p |
58 | @ r0 = scratch | 62 | @ r0 = scratch |
59 | sub r2, r2, #1 @ | 63 | ldr r12, [r3, #8] @ |
60 | mov r3, #0xC8000000 @ | 64 | sub r2, r2, #1 @ stride -= 1 |
61 | orr r3, r3, #0x120000 @ r3 = DBOP_BASE | 65 | orr r12, r12, #3<<13 @ |
66 | str r12, [r3, #8] @ DBOP_CTRL |= (1<<13|1<<14) (32bit mode) | ||
62 | 10: @ loop line @ | 67 | 10: @ loop line @ |
63 | ldrb r7, [r4], #1 @ r7 = *Y'_p++; | 68 | ldrb r7, [r4], #1 @ r7 = *Y'_p++; |
64 | ldrb r8, [r5], #1 @ r8 = *Cb_p++; | 69 | ldrb r8, [r5], #1 @ r8 = *Cb_p++; |
@@ -109,12 +114,7 @@ lcd_write_yuv420_lines: | |||
109 | ldrb r12, [r4, r2] @ r12 = Y' = *(Y'_p + stride) | 114 | ldrb r12, [r4, r2] @ r12 = Y' = *(Y'_p + stride) |
110 | @ | 115 | @ |
111 | orr r0, r0, lr, lsl #11 @ r0 = (r << 11) | b | 116 | orr r0, r0, lr, lsl #11 @ r0 = (r << 11) | b |
112 | orr r0, r0, r7, lsl #5 @ r0 = (r << 11) | (g << 5) | b | 117 | orr r11, r0, r7, lsl #5 @ r0 = (r << 11) | (g << 5) | b |
113 | strh r0, [r3, #0x10] @ write pixel | ||
114 | 1: @ busy @ | ||
115 | ldr r7, [r3,#0xc] @ r7 = DBOP_STATUS | ||
116 | tst r7, #DBOP_BUSY @ fifo not empty? | ||
117 | beq 1b @ | ||
118 | @ | 118 | @ |
119 | sub r7, r12, #16 @ r7 = Y = (Y' - 16)*74 | 119 | sub r7, r12, #16 @ r7 = Y = (Y' - 16)*74 |
120 | add r12, r7, r7, asl #2 @ | 120 | add r12, r7, r7, asl #2 @ |
@@ -143,11 +143,8 @@ lcd_write_yuv420_lines: | |||
143 | @ | 143 | @ |
144 | orr r0, r0, lr, lsl #11 @ r0 = (r << 11) | b | 144 | orr r0, r0, lr, lsl #11 @ r0 = (r << 11) | b |
145 | orr r0, r0, r7, lsl #5 @ r0 = (r << 11) | (g << 5) | b | 145 | orr r0, r0, r7, lsl #5 @ r0 = (r << 11) | (g << 5) | b |
146 | strh r0, [r3, #0x10] @ write pixel | 146 | orr r0, r11, r0, lsl#16 @ pack with 2nd pixel |
147 | 1: @ busy @ | 147 | str r0, [r3, #0x10] @ write pixel |
148 | ldr r7, [r3,#0xc] @ r7 = DBOP_STATUS | ||
149 | tst r7, #DBOP_BUSY @ fifo not empty? | ||
150 | beq 1b @ | ||
151 | @ | 148 | @ |
152 | sub r7, r12, #16 @ r7 = Y = (Y' - 16)*74 | 149 | sub r7, r12, #16 @ r7 = Y = (Y' - 16)*74 |
153 | add r12, r7, r7, asl #2 @ | 150 | add r12, r7, r7, asl #2 @ |
@@ -176,12 +173,7 @@ lcd_write_yuv420_lines: | |||
176 | @ | 173 | @ |
177 | @ | 174 | @ |
178 | orr r0, r0, lr, lsl #11 @ r0 = (r << 11) | b | 175 | orr r0, r0, lr, lsl #11 @ r0 = (r << 11) | b |
179 | orr r0, r0, r7, lsl #5 @ r0 = (r << 11) | (g << 5) | b | 176 | orr r11, r0, r7, lsl #5 @ r0 = (r << 11) | (g << 5) | b |
180 | strh r0, [r3, #0x10] @ write pixel | ||
181 | 1: @ busy @ | ||
182 | ldr r7, [r3,#0xc] @ r7 = DBOP_STATUS | ||
183 | tst r7, #DBOP_BUSY @ fifo not empty? | ||
184 | beq 1b @ | ||
185 | @ | 177 | @ |
186 | sub r7, r12, #16 @ r7 = Y = (Y' - 16)*74 | 178 | sub r7, r12, #16 @ r7 = Y = (Y' - 16)*74 |
187 | add r12, r7, r7, asl #2 @ | 179 | add r12, r7, r7, asl #2 @ |
@@ -208,16 +200,20 @@ lcd_write_yuv420_lines: | |||
208 | @ | 200 | @ |
209 | orr r0, r0, lr, lsl #11 @ r0 = (r << 11) | b | 201 | orr r0, r0, lr, lsl #11 @ r0 = (r << 11) | b |
210 | orr r0, r0, r7, lsl #5 @ r0 = (r << 11) | (g << 5) | b | 202 | orr r0, r0, r7, lsl #5 @ r0 = (r << 11) | (g << 5) | b |
211 | strh r0, [r3, #0x10] @ write pixel | 203 | orr r0, r11, r0, lsl#16 @ pack with 2nd pixel |
212 | 1: @ busy @ | 204 | str r0, [r3, #0x10] @ write pixel |
213 | ldr r7, [r3,#0xc] @ r7 = DBOP_STATUS | ||
214 | tst r7, #DBOP_BUSY @ fifo not empty? | ||
215 | beq 1b @ | ||
216 | @ | 205 | @ |
217 | subs r1, r1, #2 @ subtract block from width | 206 | subs r1, r1, #2 @ subtract block from width |
218 | bgt 10b @ loop line @ | 207 | bgt 10b @ loop line @ |
219 | @ | 208 | @ |
220 | ldmfd sp!, { r4-r10, pc } @ restore registers and return | 209 | 1: @ busy |
210 | @ writing at max 110*32 its (LCD_WIDTH/2), the fifo is bigger | ||
211 | @ so polling fifo empty after the loops is save | ||
212 | ldr r7, [r3,#0xc] @ r7 = DBOP_STATUS | ||
213 | tst r7, #DBOP_BUSY @ fifo not empty? | ||
214 | beq 1b @ | ||
215 | |||
216 | ldmfd sp!, { r4-r11, pc } @ restore registers and return | ||
221 | bx lr @ | 217 | bx lr @ |
222 | .ltorg @ dump constant pool | 218 | .ltorg @ dump constant pool |
223 | .size lcd_write_yuv420_lines, .-lcd_write_yuv420_lines | 219 | .size lcd_write_yuv420_lines, .-lcd_write_yuv420_lines |
@@ -263,13 +259,18 @@ lcd_write_yuv420_lines_odither: | |||
263 | @ r5 = yuv_src[1] = Cb_p | 259 | @ r5 = yuv_src[1] = Cb_p |
264 | @ r6 = yuv_src[2] = Cr_p | 260 | @ r6 = yuv_src[2] = Cr_p |
265 | @ | 261 | @ |
266 | sub r2, r2, #1 @ | ||
267 | ldr r14, [sp, #40] @ Line up pattern and kernel quadrant | 262 | ldr r14, [sp, #40] @ Line up pattern and kernel quadrant |
263 | sub r2, r2, #1 @ stride =- 1 | ||
268 | eor r14, r14, r3 @ | 264 | eor r14, r14, r3 @ |
269 | and r14, r14, #0x2 @ | 265 | and r14, r14, #0x2 @ |
270 | mov r14, r14, lsl #6 @ 0x00 or 0x80 | 266 | mov r14, r14, lsl #6 @ 0x00 or 0x80 |
267 | |||
271 | mov r3, #0xC8000000 @ | 268 | mov r3, #0xC8000000 @ |
272 | orr r3, r3, #0x120000 @ r3 = DBOP_BASE | 269 | orr r3, r3, #0x120000 @ r3 = DBOP_BASE, need to be redone |
270 | @ due to lack of registers | ||
271 | ldr r12, [r3, #8] @ | ||
272 | orr r12, r12, #3<<13 @ DBOP_CTRL |= (1<<13|1<<14) | ||
273 | str r12, [r3, #8] @ (32bit mode) | ||
273 | 10: @ loop line @ | 274 | 10: @ loop line @ |
274 | @ | 275 | @ |
275 | ldrb r7, [r4], #1 @ r7 = *Y'_p++; | 276 | ldrb r7, [r4], #1 @ r7 = *Y'_p++; |
@@ -339,13 +340,8 @@ lcd_write_yuv420_lines_odither: | |||
339 | and r11, r11, #0xf800 @ pack pixel | 340 | and r11, r11, #0xf800 @ pack pixel |
340 | and r7, r7, #0x7e00 @ r0 = pixel = (r & 0xf800) | | 341 | and r7, r7, #0x7e00 @ r0 = pixel = (r & 0xf800) | |
341 | orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) | | 342 | orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) | |
342 | orr r0, r11, r0, lsr #10 @ (b >> 10) | 343 | orr r3, r11, r0, lsr #10 @ (b >> 10) |
343 | strh r0, [r3, #0x10] @ write pixel | 344 | @ save pixel |
344 | 1: @ busy @ | ||
345 | ldr r7, [r3,#0xc] @ r7 = DBOP_STATUS | ||
346 | tst r7, #DBOP_BUSY @ fifo not empty? | ||
347 | beq 1b @ | ||
348 | @ | ||
349 | sub r7, r12, #16 @ r7 = Y = (Y' - 16)*149 | 345 | sub r7, r12, #16 @ r7 = Y = (Y' - 16)*149 |
350 | add r12, r7, r7, asl #2 @ | 346 | add r12, r7, r7, asl #2 @ |
351 | add r12, r12, r12, asl #4 @ | 347 | add r12, r12, r12, asl #4 @ |
@@ -389,11 +385,11 @@ lcd_write_yuv420_lines_odither: | |||
389 | and r7, r7, #0x7e00 @ r0 = pixel = (r & 0xf800) | | 385 | and r7, r7, #0x7e00 @ r0 = pixel = (r & 0xf800) | |
390 | orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) | | 386 | orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) | |
391 | orr r0, r11, r0, lsr #10 @ (b >> 10) | 387 | orr r0, r11, r0, lsr #10 @ (b >> 10) |
392 | strh r0, [r3, #0x10] @ write pixel | 388 | orr r3, r3, r0, lsl#16 @ pack with 2nd pixel |
393 | 1: @ busy @ | 389 | mov r0, #0xC8000000 @ |
394 | ldr r7, [r3,#0xc] @ r7 = DBOP_STATUS | 390 | orr r0, r0, #0x120000 @ r3 = DBOP_BASE |
395 | tst r7, #DBOP_BUSY @ fifo not empty? | 391 | |
396 | beq 1b @ | 392 | str r3, [r0, #0x10] @ write pixel |
397 | @ | 393 | @ |
398 | sub r7, r12, #16 @ r7 = Y = (Y' - 16)*149 | 394 | sub r7, r12, #16 @ r7 = Y = (Y' - 16)*149 |
399 | add r12, r7, r7, asl #2 @ | 395 | add r12, r7, r7, asl #2 @ |
@@ -439,12 +435,8 @@ lcd_write_yuv420_lines_odither: | |||
439 | and r11, r11, #0xf800 @ pack pixel | 435 | and r11, r11, #0xf800 @ pack pixel |
440 | and r7, r7, #0x7e00 @ r0 = pixel = (r & 0xf800) | | 436 | and r7, r7, #0x7e00 @ r0 = pixel = (r & 0xf800) | |
441 | orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) | | 437 | orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) | |
442 | orr r0, r11, r0, lsr #10 @ (b >> 10) | 438 | orr r3, r11, r0, lsr #10 @ (b >> 10) |
443 | strh r0, [r3, #0x10] @ write pixel | 439 | @ save pixel |
444 | 1: @ busy @ | ||
445 | ldr r7, [r3,#0xc] @ r7 = DBOP_STATUS | ||
446 | tst r7, #DBOP_BUSY @ fifo not empty? | ||
447 | beq 1b @ | ||
448 | @ | 440 | @ |
449 | sub r7, r12, #16 @ r7 = Y = (Y' - 16)*149 | 441 | sub r7, r12, #16 @ r7 = Y = (Y' - 16)*149 |
450 | add r12, r7, r7, asl #2 @ | 442 | add r12, r7, r7, asl #2 @ |
@@ -487,15 +479,22 @@ lcd_write_yuv420_lines_odither: | |||
487 | and r7, r7, #0x7e00 @ r0 = pixel = (r & 0xf800) | | 479 | and r7, r7, #0x7e00 @ r0 = pixel = (r & 0xf800) | |
488 | orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) | | 480 | orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) | |
489 | orr r0, r11, r0, lsr #10 @ (b >> 10) | 481 | orr r0, r11, r0, lsr #10 @ (b >> 10) |
490 | strh r0, [r3, #0x10] @ write pixel | 482 | orr r3, r3, r0, lsl#16 @ pack with 2nd pixel |
491 | 1: @ busy @ | 483 | mov r0, #0xC8000000 @ |
492 | ldr r7, [r3,#0xc] @ r7 = DBOP_STATUS | 484 | orr r0, r0, #0x120000 @ r3 = DBOP_BASE |
493 | tst r7, #DBOP_BUSY @ fifo not empty? | 485 | |
494 | beq 1b @ | 486 | str r3, [r0, #0x10] @ write pixel |
495 | @ | 487 | @ |
496 | subs r1, r1, #2 @ subtract block from width | 488 | subs r1, r1, #2 @ subtract block from width |
497 | bgt 10b @ loop line @ | 489 | bgt 10b @ loop line @ |
498 | @ | 490 | @ |
491 | 1: @ busy @ | ||
492 | @ writing at max 110*32 its (LCD_WIDTH/2), the fifo is bigger | ||
493 | @ so polling fifo empty after the loops is save | ||
494 | ldr r7, [r0,#0xc] @ r7 = DBOP_STATUS | ||
495 | tst r7, #DBOP_BUSY @ fifo not empty? | ||
496 | beq 1b @ | ||
497 | |||
499 | ldmfd sp!, { r4-r11, pc } @ restore registers and return | 498 | ldmfd sp!, { r4-r11, pc } @ restore registers and return |
500 | .ltorg @ dump constant pool | 499 | .ltorg @ dump constant pool |
501 | .size lcd_write_yuv420_lines_odither, .-lcd_write_yuv420_lines_odither | 500 | .size lcd_write_yuv420_lines_odither, .-lcd_write_yuv420_lines_odither |