1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2010 by Szymon Dziok
12 * Philips Gogear HDD6330 LCD assembly routine
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20 * KIND, either express or implied.
22 ****************************************************************************/
27 /****************************************************************************
28 void lcd_yuv_write_inner_loop(unsigned char const * const ysrc,
29 unsigned char const * const usrc,
30 unsigned char const * const vsrc,
33 .section .icode, "ax", %progbits
35 .global lcd_yuv_write_inner_loop
36 .type lcd_yuv_write_inner_loop, %function
37 lcd_yuv_write_inner_loop:
42 stmfd sp!, { r4-r11, lr } @ save regs
43 mov r4, #0x70000000 @ r4 = LCD2_BLOCK_CTRL - 0x20
45 add r5, r4, #0x100 @ r5 = LCD2_BLOCK_DATA
48 ldrb r7, [r1], #1 @ *usrc++
49 ldrb r8, [r2], #1 @ *vsrc++
51 sub r7, r7, #128 @ Cb -= 128
52 sub r8, r8, #128 @ Cr -= 128
54 add r10, r8, r8, asl #2 @ Cr*101
55 add r10, r10, r8, asl #5
56 add r10, r10, r8, asl #6
58 add r11, r8, r8, asl #1 @ Cr*51 + Cb*24
59 add r11, r11, r11, asl #4
60 add r11, r11, r7, asl #3
61 add r11, r11, r7, asl #4
63 add r12, r7, #2 @ r12 = bu = (Cb*128 + 256) >> 9
65 add r10, r10, #256 @ r10 = rv = (Cr*101 + 256) >> 9
67 rsb r11, r11, #128 @ r11 = guv = (-r11 + 128) >> 8
71 ldrb r7, [r0], #1 @ *ysrc++
72 sub r7, r7, #16 @ Y = (Y' - 16) * 37
73 add r8, r7, r7, asl #2
74 add r7, r8, r7, asl #5
76 add r9, r10, r7, asr #8 @ R = (Y >> 8) + rv
77 add r8, r11, r7, asr #7 @ G = (Y >> 7) + guv
78 add r7, r12, r7, asr #8 @ B = (Y >> 8) + bu
92 orr r6, r7, r8, lsl #5 @ pack pixel
93 orr r6, r6, r9, lsl #11
95 mov r7, r6, lsl #8 @ swap bytes
97 add r6, r7, r6, lsr #8
100 ldrb r7, [r0], #1 @ *ysrc++
101 sub r7, r7, #16 @ Y = (Y' - 16) * 37
102 add r8, r7, r7, asl #2
103 add r7, r8, r7, asl #5
105 add r9, r10, r7, asr #8 @ R = (Y >> 8) + rv
106 add r8, r11, r7, asr #7 @ G = (Y >> 7) + guv
107 add r7, r12, r7, asr #8 @ B = (Y >> 8) + bu
109 cmp r9, #31 @ clamp R
110 mvnhi r9, r9, asr #31
113 cmp r8, #63 @ clamp G
114 mvnhi r8, r8, asr #31
117 cmp r7, #31 @ clamp B
118 mvnhi r7, r7, asr #31
121 orr r7, r7, r8, lsl #5 @ pack pixel
122 orr r7, r7, r9, lsl #11
124 orr r6, r6, r7, lsl #24 @ swap bytes and add pixels simultaneously
126 orr r6, r6, r7, lsl #16
128 11: @ while (!(LCD2_BLOCK_CTRL & LCD2_BLOCK_TXOK));
129 ldr r11, [r4, #0x20] @
130 tst r11, #0x1000000 @
133 str r6, [r5] @ send two pixels
135 subs r3, r3, #2 @ decrease width
138 ldmpc regs=r4-r11 @ restore regs
139 .ltorg @ dump constant pool
140 .size lcd_yuv_write_inner_loop, .-lcd_yuv_write_inner_loop