From fe6aa21e9eb88f49005863efd2003d0982920048 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Mon, 3 Oct 2022 10:17:41 +0100 Subject: Remove YUV blitting functions and LCD modes None of this is needed now that mpegplayer is gone. Change-Id: I360366db8513e4d988021e8d7b7d8eb09930efb8 --- firmware/target/coldfire/iaudio/x5/lcd-as-x5.S | 242 ------------------------- firmware/target/coldfire/iaudio/x5/lcd-x5.c | 63 ------- 2 files changed, 305 deletions(-) (limited to 'firmware/target/coldfire/iaudio/x5') diff --git a/firmware/target/coldfire/iaudio/x5/lcd-as-x5.S b/firmware/target/coldfire/iaudio/x5/lcd-as-x5.S index e6621e1dea..b319d745ca 100644 --- a/firmware/target/coldfire/iaudio/x5/lcd-as-x5.S +++ b/firmware/target/coldfire/iaudio/x5/lcd-as-x5.S @@ -25,248 +25,6 @@ .section .icode,"ax",@progbits -/* begin lcd_write_yuv420_lines - * - * See http://en.wikipedia.org/wiki/YCbCr - * ITU-R BT.601 (formerly CCIR 601): - * |Y'| | 0.299000 0.587000 0.114000| |R| - * |Pb| = |-0.168736 -0.331264 0.500000| |G| or 0.564334*(B - Y') - * |Pr| | 0.500000 -0.418688 0.081312| |B| or 0.713267*(R - Y') - * Scaled, normalized and rounded: - * |Y'| | 65 129 25| |R| + 16 : 16->235 - * |Cb| = |-38 -74 112| |G| + 128 : 16->240 - * |Cr| |112 -94 -18| |B| + 128 : 16->240 - * - * The inverse: - * |R| |1.000000 -0.000001 1.402000| |Y'| - * |G| = |1.000000 -0.334136 -0.714136| |Pb| - * |B| |1.000000 1.772000 0.000000| |Pr| - * Scaled, normalized, rounded and tweaked to yield RGB 666: - * |R| |19611723 0 26881894| |Y' - 16| >> 26 - * |G| = |19611723 -6406711 -13692816| |Cb - 128| >> 26 - * |B| |19611723 33976259 0| |Cr - 128| >> 26 - * - * Needs EMAC set to saturated, signed integer mode. - * - * register usage: - * %a0 - LCD data port - * %a1 - Y pointer - * %a2 - C pointer - * %a3 - C width - * %a4 - Y end address - * %a5 - Y factor - * %a6 - BU factor - * %d0 - scratch - * %d1 - B, previous Y \ alternating - * %d2 - U / B, previous Y / - * %d3 - V / G - * %d4 - R / output pixel - * %d5 - GU factor - * %d6 - GV factor - * %d7 - RGB signed -> unsigned conversion mask - */ - .align 2 - .global lcd_write_yuv420_lines - .type lcd_write_yuv420_lines, @function - -lcd_write_yuv420_lines: - lea.l (-44, %sp), %sp /* free up some registers */ - movem.l %d2-%d7/%a2-%a6, (%sp) - - lea.l 0xf0008002, %a0 /* LCD data port */ - movem.l (44+4, %sp), %a1-%a3 /* Y data, C data, C width */ - lea.l (%a1, %a3*2), %a4 /* Y end address */ - - move.l #19611723, %a5 /* y factor */ - move.l #33976259, %a6 /* bu factor */ - move.l #-6406711, %d5 /* gu factor */ - move.l #-13692816, %d6 /* gv factor */ - move.l #0x01040820, %d7 /* bitmask for signed->unsigned conversion - * of R, G and B within RGGB6666 at once */ - - /* chroma for first 2x2 block */ - clr.l %d3 /* load v component */ - move.b (%a2, %a3), %d3 - clr.l %d2 /* load u component */ - move.b (%a2)+, %d2 - moveq.l #-128, %d0 - add.l %d0, %d2 - add.l %d0, %d3 - - mac.l %a6, %d2, %acc0 /* bu */ - mac.l %d5, %d2, %acc1 /* gu */ - mac.l %d6, %d3, %acc1 /* gv */ - move.l #26881894, %d0 /* rv factor */ - mac.l %d0, %d3, %acc2 /* rv */ - - /* luma for very first pixel (top left) */ - clr.l %d1 - move.b (%a1, %a3*2), %d1 - moveq.l #-126, %d0 - add.l %d1, %d0 /* y' (-0.5 ... +0.5) */ - mac.l %a5, %d0, %acc0 - mac.l %a5, %d0, %acc1 - mac.l %a5, %d0, %acc2 - - bra.b .yuv_line_entry - -.yuv_line_loop: - /* chroma for 2x2 pixel block */ - clr.l %d3 /* load v component */ - move.b (%a2, %a3), %d3 - clr.l %d2 /* load u component */ - move.b (%a2)+, %d2 - moveq.l #-128, %d0 - add.l %d0, %d2 - add.l %d0, %d3 - - mac.l %a6, %d2, %acc0 /* bu */ - mac.l %d5, %d2, %acc1 /* gu */ - mac.l %d6, %d3, %acc1 /* gv */ - move.l #26881894, %d0 /* rv factor */ - mac.l %d0, %d3, %acc2 /* rv */ - - /* luma for first pixel (top left) */ - clr.l %d1 - move.b (%a1, %a3*2), %d1 - moveq.l #-126, %d0 - add.l %d1, %d0 /* y' (-0.5 ... +0.5) */ - mac.l %a5, %d0, %acc0 - mac.l %a5, %d0, %acc1 - mac.l %a5, %d0, %acc2 - - move.w %d4, (%a0) - /* 2nd LCD write is delayed one pixel to use it for filling the EMAC latency */ - - /* convert to RGB666, pack and output */ -.yuv_line_entry: - moveq.l #26, %d0 - move.l %acc0, %d4 - move.l %acc1, %d3 - move.l %acc2, %d2 - lsr.l %d0, %d4 - lsr.l %d0, %d3 - lsr.l %d0, %d2 - - lsl.l #6, %d2 - or.l %d3, %d2 /* |00000000|00000000|0000Rrrr|rrGggggg| */ - lsl.l #7, %d2 - or.l %d2, %d3 /* |00000000|00000Rrr|rrrGgggg|g0Gggggg| */ - lsl.l #6, %d3 - or.l %d3, %d4 /* |0000000R|rrrrrGgg|ggg0Gggg|ggBbbbbb| */ - eor.l %d7, %d4 /* |0000000r|rrrrrggg|ggg0gggg|ggbbbbbb| */ - swap %d4 - move.w %d4, (%a0) - swap %d4 - - /* luma for second pixel (bottom left) as delta from the first */ - clr.l %d2 - move.b (%a1)+, %d2 - move.l %d2, %d0 - sub.l %d1, %d0 - mac.l %a5, %d0, %acc0 - mac.l %a5, %d0, %acc1 - mac.l %a5, %d0, %acc2 - - move.w %d4, (%a0) - /* 2nd LCD write is delayed one pixel to use it for filling the EMAC latency */ - - /* convert to RGB666, pack and output */ - moveq.l #26, %d0 - move.l %acc0, %d4 - move.l %acc1, %d3 - move.l %acc2, %d1 - lsr.l %d0, %d4 - lsr.l %d0, %d3 - lsr.l %d0, %d1 - - lsl.l #6, %d1 - or.l %d3, %d1 /* |00000000|00000000|0000Rrrr|rrGggggg| */ - lsl.l #7, %d1 - or.l %d1, %d3 /* |00000000|00000Rrr|rrrGgggg|g0Gggggg| */ - lsl.l #6, %d3 - or.l %d3, %d4 /* |0000000R|rrrrrGgg|ggg0Gggg|ggBbbbbb| */ - eor.l %d7, %d4 /* |0000000r|rrrrrggg|ggg0gggg|ggbbbbbb| */ - swap %d4 - move.w %d4, (%a0) - swap %d4 - - /* luma for third pixel (top right) as delta from the second */ - clr.l %d1 - move.b (%a1, %a3*2), %d1 - move.l %d1, %d0 - sub.l %d2, %d0 - mac.l %a5, %d0, %acc0 - mac.l %a5, %d0, %acc1 - mac.l %a5, %d0, %acc2 - - move.w %d4, (%a0) - /* 2nd LCD write is delayed one pixel to use it for filling the EMAC latency */ - - /* convert to RGB666, pack and output */ - moveq.l #26, %d0 - move.l %acc0, %d4 - move.l %acc1, %d3 - move.l %acc2, %d2 - lsr.l %d0, %d4 - lsr.l %d0, %d3 - lsr.l %d0, %d2 - - lsl.l #6, %d2 - or.l %d3, %d2 /* |00000000|00000000|0000Rrrr|rrGggggg| */ - lsl.l #7, %d2 - or.l %d2, %d3 /* |00000000|00000Rrr|rrrGgggg|g0Gggggg| */ - lsl.l #6, %d3 - or.l %d3, %d4 /* |0000000R|rrrrrGgg|ggg0Gggg|ggBbbbbb| */ - eor.l %d7, %d4 /* |0000000r|rrrrrggg|ggg0gggg|ggbbbbbb| */ - swap %d4 - move.w %d4, (%a0) - swap %d4 - - /* luma for fourth pixel (bottom right) as delta from the thrid */ - clr.l %d2 - move.b (%a1)+, %d2 - move.l %d2, %d0 - sub.l %d1, %d0 - mac.l %a5, %d0, %acc0 - mac.l %a5, %d0, %acc1 - mac.l %a5, %d0, %acc2 - - move.w %d4, (%a0) - /* 2nd LCD write is delayed one pixel to use it for filling the EMAC latency */ - - /* convert to RGB666, pack and output */ - moveq.l #26, %d0 - movclr.l %acc0, %d4 - movclr.l %acc1, %d3 - movclr.l %acc2, %d1 - lsr.l %d0, %d4 - lsr.l %d0, %d3 - lsr.l %d0, %d1 - - lsl.l #6, %d1 - or.l %d3, %d1 /* |00000000|00000000|0000Rrrr|rrGggggg| */ - lsl.l #7, %d1 - or.l %d1, %d3 /* |00000000|00000Rrr|rrrGgggg|g0Gggggg| */ - lsl.l #6, %d3 - or.l %d3, %d4 /* |0000000R|rrrrrGgg|ggg0Gggg|ggBbbbbb| */ - eor.l %d7, %d4 /* |0000000r|rrrrrggg|ggg0gggg|ggbbbbbb| */ - swap %d4 - move.w %d4, (%a0) - swap %d4 - - cmp.l %a1, %a4 /* run %a1 up to end of line */ - bhi.w .yuv_line_loop - - move.w %d4, (%a0) /* write (very) last 2nd word */ - - movem.l (%sp), %d2-%d7/%a2-%a6 - lea.l (44, %sp), %sp /* restore registers */ - rts -.yuv_end: - .size lcd_write_yuv420_lines, .yuv_end - lcd_write_yuv420_lines - - /* begin lcd_write_data */ .align 2 .global lcd_write_data diff --git a/firmware/target/coldfire/iaudio/x5/lcd-x5.c b/firmware/target/coldfire/iaudio/x5/lcd-x5.c index 266a381c40..a6a4fc0176 100644 --- a/firmware/target/coldfire/iaudio/x5/lcd-x5.c +++ b/firmware/target/coldfire/iaudio/x5/lcd-x5.c @@ -414,69 +414,6 @@ bool lcd_active(void) #endif /*** update functions ***/ -/* Line write helper function for lcd_yuv_blit. Write two lines of yuv420. - * y should have two lines of Y back to back, 2nd line first. - * c should contain the Cb and Cr data for the two lines of Y back to back. - * Needs EMAC set to saturated, signed integer mode. - */ -extern void lcd_write_yuv420_lines(const unsigned char *y, - const unsigned char *c, int width); - -/* Performance function to blit a YUV bitmap directly to the LCD - * src_x, src_y, width and height should be even and within the LCD's - * boundaries. - */ -void lcd_blit_yuv(unsigned char * const src[3], - int src_x, int src_y, int stride, - int x, int y, int width, int height) -{ - /* IRAM Y, Cb/bu, guv and Cb/rv buffers. */ - unsigned char y_ibuf[LCD_WIDTH*2]; - unsigned char c_ibuf[LCD_WIDTH]; - const unsigned char *ysrc, *usrc, *vsrc; - const unsigned char *ysrc_max; - - if (!display_on) - return; - - width &= ~1; /* stay on the safe side */ - height &= ~1; - - lcd_write_reg(R_ENTRY_MODE, R_ENTRY_MODE_DIT_HORZ); - /* Set start position and window */ - lcd_write_reg(R_VERT_RAM_ADDR_POS, (LCD_WIDTH-1) << 8); - - ysrc = src[0] + src_y * stride + src_x; - usrc = src[1] + (src_y * stride >> 2) + (src_x >> 1); - vsrc = src[2] + (src_y * stride >> 2) + (src_x >> 1); - ysrc_max = ysrc + height * stride; - - unsigned long macsr = coldfire_get_macsr(); - coldfire_set_macsr(EMAC_SATURATE); - - do - { - lcd_write_reg(R_HORIZ_RAM_ADDR_POS, ((y + y_offset + 1) << 8) | (y + y_offset)); - lcd_write_reg(R_RAM_ADDR_SET, (x << 8) | (y + y_offset)); - lcd_begin_write_gram(); - - memcpy(y_ibuf + width, ysrc, width); - memcpy(y_ibuf, ysrc + stride, width); - memcpy(c_ibuf, usrc, width >> 1); - memcpy(c_ibuf + (width >> 1), vsrc, width >> 1); - lcd_write_yuv420_lines(y_ibuf, c_ibuf, width >> 1); - - y += 2; - ysrc += 2 * stride; - usrc += stride >> 1; - vsrc += stride >> 1; - } - while (ysrc < ysrc_max); - - coldfire_set_macsr(macsr); -} /* lcd_yuv_blit */ - - /* Update the display. This must be called after all other LCD functions that change the lcd frame buffer. */ -- cgit v1.2.3