summaryrefslogtreecommitdiff
path: root/firmware/target/arm/as3525/lcd-as-e200v2-fuze.S
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/as3525/lcd-as-e200v2-fuze.S')
-rw-r--r--firmware/target/arm/as3525/lcd-as-e200v2-fuze.S103
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)
6210: @ loop line @ 6710: @ 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
1141: @ 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
1471: @ 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
1811: @ 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
2121: @ 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 2091: @ 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)
27310: @ loop line @ 27410: @ 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
3441: @ 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
3931: @ 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
4441: @ 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
4911: @ 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 @
4911: @ 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