diff options
Diffstat (limited to 'firmware/target/arm/s5l8700/ipodnano2g/lcd-asm-nano2g.S')
-rwxr-xr-x | firmware/target/arm/s5l8700/ipodnano2g/lcd-asm-nano2g.S | 36 |
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 */ | ||
38 | lcd_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 | * |