summaryrefslogtreecommitdiff
path: root/firmware/target/arm/s5l8700/ipodnano2g/lcd-asm-nano2g.S
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/s5l8700/ipodnano2g/lcd-asm-nano2g.S')
-rwxr-xr-xfirmware/target/arm/s5l8700/ipodnano2g/lcd-asm-nano2g.S36
1 files changed, 35 insertions, 1 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/lcd-asm-nano2g.S b/firmware/target/arm/s5l8700/ipodnano2g/lcd-asm-nano2g.S
index 25cf662c3f..3902d34133 100755
--- a/firmware/target/arm/s5l8700/ipodnano2g/lcd-asm-nano2g.S
+++ b/firmware/target/arm/s5l8700/ipodnano2g/lcd-asm-nano2g.S
@@ -22,10 +22,44 @@
22#include "config.h" 22#include "config.h"
23 23
24 .section .icode, "ax", %progbits 24 .section .icode, "ax", %progbits
25
26/****************************************************************************
27 * void lcd_write_line(const fb_data *addr,
28 * int pixelcount,
29 * const unsigned int lcd_base_addr);
30 *
31 * Writes pixelcount pixels from src-pointer (lcd_framebuffer) to LCD dataport.
32 */
33 .align 2
34 .global lcd_write_line
35 .type lcd_write_line, %function
36 /* r0 = addr, must be aligned */
37 /* r1 = pixel count, must be even */
38lcd_write_line: /* r2 = LCD_BASE */
39 stmfd sp!, {r4-r6, lr} /* save non-scratch registers */
40 add r12, r2, #0x40 /* LCD_WDATA = LCD data port */
41
42.loop:
43 ldmia r0!, {r3, r5} /* read 2 pixel (=8 byte) */
44
45 /* wait for FIFO half full */
46.fifo_wait:
47 ldr lr, [r2, #0x1C] /* while (LCD_STATUS & 0x08); */
48 tst lr, #0x8
49 bgt .fifo_wait
50
51 mov r4, r3, asr #16 /* r3 = 1st pixel, r4 = 2nd pixel */
52 mov r6, r5, asr #16 /* r5 = 3rd pixel, r6 = 4th pixel */
53 stmia r12, {r3-r6} /* write pixels (lowest 16 bit used) */
54
55 subs r1, r1, #4
56 bgt .loop
57
58 ldmpc regs=r4-r6
25 59
26/**************************************************************************** 60/****************************************************************************
27 * extern void lcd_write_yuv420_lines(unsigned char const * const src[3], 61 * extern void lcd_write_yuv420_lines(unsigned char const * const src[3],
28 * unsigned LCD_BASE, 62 * const unsigned LCD_BASE,
29 * int width, 63 * int width,
30 * int stride); 64 * int stride);
31 * 65 *