2020-07-20 04:49:42 +00:00
|
|
|
#include "rpi-base.h"
|
|
|
|
#include "defs.h"
|
|
|
|
|
|
|
|
#include "macros.S"
|
|
|
|
|
|
|
|
.text
|
|
|
|
|
|
|
|
.global capture_line_fast_eightbits_8bpp
|
2020-09-07 15:24:05 +00:00
|
|
|
.global capture_line_fast_ninebitslo_16bpp
|
|
|
|
.global capture_line_fast_ninebitshi_16bpp
|
2020-09-01 20:08:07 +00:00
|
|
|
.global capture_line_fast_twelvebits_16bpp
|
2020-07-20 04:49:42 +00:00
|
|
|
|
|
|
|
// The capture line function is provided the following:
|
|
|
|
// r0 = pointer to current line in frame buffer
|
|
|
|
// r1 = number of complete psync cycles to capture (=param_chars_per_line)
|
|
|
|
// r2 = frame buffer line pitch in bytes (=param_fb_pitch)
|
|
|
|
// r3 = flags register
|
|
|
|
// r4 = GPLEV0 constant
|
|
|
|
// r5 = line number count down to 0 (initial value =param_nlines)
|
|
|
|
// r6 = scan line count modulo 10
|
|
|
|
// r7 = number of psyncs to skip
|
|
|
|
// r8 = frame buffer height (=param_fb_height)
|
|
|
|
//
|
|
|
|
// All registers are available as scratch registers (i.e. nothing needs to be preserved)
|
|
|
|
|
|
|
|
|
|
|
|
.ltorg
|
|
|
|
|
|
|
|
// *** 8 bit ***
|
2020-11-03 03:08:30 +00:00
|
|
|
.align 6
|
2020-07-20 04:49:42 +00:00
|
|
|
b preload_capture_line_fast_eightbits_8bpp
|
|
|
|
capture_line_fast_eightbits_8bpp:
|
|
|
|
push {lr}
|
|
|
|
SETUP_VSYNC_DEBUG_R11_R12
|
2021-11-23 01:19:16 +00:00
|
|
|
SKIP_PSYNC_NO_OLD_CPLD_HIGH_LATENCY
|
2021-11-03 02:19:28 +00:00
|
|
|
mov r1, r1, lsr #3
|
2020-07-28 04:38:35 +00:00
|
|
|
SETUP_EIGHT_BITS_MASK_R14
|
2020-07-20 04:49:42 +00:00
|
|
|
loop_8bpp:
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_EIGHT_BITS_8BPP_0 r11 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_EIGHT_BITS_8BPP_1 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_EIGHT_BITS_8BPP_2 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_EIGHT_BITS_8BPP_3 r5 // input in r8
|
|
|
|
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_EIGHT_BITS_8BPP_0 r12 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_EIGHT_BITS_8BPP_1 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_EIGHT_BITS_8BPP_2 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_EIGHT_BITS_8BPP_3 r6 // input in r8
|
|
|
|
|
2021-11-16 00:34:27 +00:00
|
|
|
stmia r0!, {r5, r6}
|
|
|
|
subs r1, r1, #1
|
2020-07-20 04:49:42 +00:00
|
|
|
bne loop_8bpp
|
|
|
|
|
2021-11-03 02:19:28 +00:00
|
|
|
pop {r0, pc}
|
2020-07-20 04:49:42 +00:00
|
|
|
|
|
|
|
preload_capture_line_fast_eightbits_8bpp:
|
|
|
|
SETUP_DUMMY_PARAMETERS
|
|
|
|
b capture_line_fast_eightbits_8bpp
|
2020-07-27 05:28:57 +00:00
|
|
|
|
|
|
|
.ltorg
|
2020-11-03 03:08:30 +00:00
|
|
|
.align 6
|
2020-07-27 05:28:57 +00:00
|
|
|
// *** 16 bit ***
|
2020-09-01 20:08:07 +00:00
|
|
|
b preload_capture_line_fast_twelvebits_16bpp
|
|
|
|
capture_line_fast_twelvebits_16bpp:
|
2020-07-27 05:28:57 +00:00
|
|
|
push {lr}
|
2020-09-12 23:06:33 +00:00
|
|
|
SETUP_VSYNC_DEBUG_16BPP_R11
|
2021-07-04 02:17:37 +00:00
|
|
|
tst r3, #BITDUP_ENABLE_FFOSD | BITDUP_ENABLE_GREY_DETECT
|
|
|
|
bne TEST_capture_line_fast_twelvebits_16bpp
|
2021-04-19 21:32:37 +00:00
|
|
|
|
2021-11-23 01:19:16 +00:00
|
|
|
SKIP_PSYNC_NO_OLD_CPLD_HIGH_LATENCY
|
2021-11-03 02:19:28 +00:00
|
|
|
mov r1, r1, lsr #3
|
2020-07-28 04:38:35 +00:00
|
|
|
SETUP_TWELVE_BITS_MASK_R14
|
2020-07-27 05:28:57 +00:00
|
|
|
loop_16bpp:
|
2021-07-04 02:17:37 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_TWELVE_BITS_16BPP_LO r11 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_TWELVE_BITS_16BPP_HI r5 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_TWELVE_BITS_16BPP_LO r11 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_TWELVE_BITS_16BPP_HI r6 // input in r8
|
|
|
|
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_TWELVE_BITS_16BPP_LO r11 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_TWELVE_BITS_16BPP_HI r7 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_TWELVE_BITS_16BPP_LO r11 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_TWELVE_BITS_16BPP_HI r10 // input in r8
|
|
|
|
stmia r0!, {r5, r6, r7, r10}
|
|
|
|
|
|
|
|
subs r1, r1, #1
|
|
|
|
bne loop_16bpp
|
|
|
|
|
2021-11-03 02:19:28 +00:00
|
|
|
pop {r0, pc}
|
2021-07-04 02:17:37 +00:00
|
|
|
|
|
|
|
TEST_capture_line_fast_twelvebits_16bpp:
|
|
|
|
tst r3, #BIT_OSD | BITDUP_ENABLE_GREY_DETECT
|
|
|
|
bne OSD_capture_line_fast_twelvebits_16bpp
|
|
|
|
|
2021-11-23 01:19:16 +00:00
|
|
|
SKIP_PSYNC_NO_OLD_CPLD_HIGH_LATENCY
|
2021-11-03 02:19:28 +00:00
|
|
|
mov r1, r1, lsr #3
|
2021-07-04 02:17:37 +00:00
|
|
|
SETUP_TWELVE_BITS_MASK_R14
|
|
|
|
TEST_loop_16bpp:
|
2020-07-28 04:38:35 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2021-05-13 17:02:44 +00:00
|
|
|
TEST_CAPTURE_TWELVE_BITS_16BPP_LO r11 // input in r8
|
2020-07-28 04:38:35 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2021-05-13 17:02:44 +00:00
|
|
|
TEST_CAPTURE_TWELVE_BITS_16BPP_HI r5 // input in r8
|
2020-07-28 04:38:35 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2021-05-13 17:02:44 +00:00
|
|
|
TEST_CAPTURE_TWELVE_BITS_16BPP_LO r11 // input in r8
|
2020-07-28 04:38:35 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2021-05-13 17:02:44 +00:00
|
|
|
TEST_CAPTURE_TWELVE_BITS_16BPP_HI r6 // input in r8
|
2020-07-28 04:38:35 +00:00
|
|
|
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2021-05-13 17:02:44 +00:00
|
|
|
TEST_CAPTURE_TWELVE_BITS_16BPP_LO r11 // input in r8
|
2020-07-28 04:38:35 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2021-05-13 17:02:44 +00:00
|
|
|
TEST_CAPTURE_TWELVE_BITS_16BPP_HI r7 // input in r8
|
2020-07-28 04:38:35 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2021-05-13 17:02:44 +00:00
|
|
|
TEST_CAPTURE_TWELVE_BITS_16BPP_LO r11 // input in r8
|
2020-07-28 04:38:35 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2021-05-13 17:02:44 +00:00
|
|
|
TEST_CAPTURE_TWELVE_BITS_16BPP_HI r10 // input in r8
|
2020-07-27 05:28:57 +00:00
|
|
|
stmia r0!, {r5, r6, r7, r10}
|
|
|
|
|
|
|
|
subs r1, r1, #1
|
2021-07-04 02:17:37 +00:00
|
|
|
bne TEST_loop_16bpp
|
2020-07-27 05:28:57 +00:00
|
|
|
|
2021-11-03 02:19:28 +00:00
|
|
|
pop {r0, pc}
|
2020-07-27 05:28:57 +00:00
|
|
|
|
2021-04-19 21:32:37 +00:00
|
|
|
OSD_capture_line_fast_twelvebits_16bpp:
|
2021-05-13 17:02:44 +00:00
|
|
|
tst r3, #BITDUP_ENABLE_GREY_DETECT
|
2021-07-04 02:17:37 +00:00
|
|
|
orrne r3, r3, #BITDUP_LINE_CONDITION_DETECTED
|
2021-11-23 01:19:16 +00:00
|
|
|
SKIP_PSYNC_NO_OLD_CPLD_HIGH_LATENCY
|
2021-11-03 02:19:28 +00:00
|
|
|
mov r1, r1, lsr #3
|
2021-04-19 21:32:37 +00:00
|
|
|
SETUP_TWELVE_BITS_MASK_R14
|
|
|
|
OSD_loop_16bpp:
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
OSD_CAPTURE_TWELVE_BITS_16BPP_LO r11 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
OSD_CAPTURE_TWELVE_BITS_16BPP_HI r5 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
OSD_CAPTURE_TWELVE_BITS_16BPP_LO r11 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
OSD_CAPTURE_TWELVE_BITS_16BPP_HI r6 // input in r8
|
|
|
|
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
OSD_CAPTURE_TWELVE_BITS_16BPP_LO r11 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
OSD_CAPTURE_TWELVE_BITS_16BPP_HI r7 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
OSD_CAPTURE_TWELVE_BITS_16BPP_LO r11 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
OSD_CAPTURE_TWELVE_BITS_16BPP_HI r10 // input in r8
|
|
|
|
stmia r0!, {r5, r6, r7, r10}
|
|
|
|
|
|
|
|
subs r1, r1, #1
|
|
|
|
bne OSD_loop_16bpp
|
|
|
|
|
2021-11-03 02:19:28 +00:00
|
|
|
pop {r0, pc}
|
2021-04-19 21:32:37 +00:00
|
|
|
|
2020-09-01 20:08:07 +00:00
|
|
|
preload_capture_line_fast_twelvebits_16bpp:
|
2020-07-27 05:28:57 +00:00
|
|
|
SETUP_DUMMY_PARAMETERS
|
2020-09-01 20:08:07 +00:00
|
|
|
b capture_line_fast_twelvebits_16bpp
|
2020-09-07 15:24:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
.ltorg
|
2020-11-03 03:08:30 +00:00
|
|
|
.align 6
|
2020-09-07 15:24:05 +00:00
|
|
|
// *** 16 bit ***
|
|
|
|
b preload_capture_line_fast_ninebitslo_16bpp
|
|
|
|
capture_line_fast_ninebitslo_16bpp:
|
|
|
|
push {lr}
|
2020-09-12 23:06:33 +00:00
|
|
|
SETUP_VSYNC_DEBUG_16BPP_R11
|
2021-11-23 01:19:16 +00:00
|
|
|
SKIP_PSYNC_NO_OLD_CPLD_HIGH_LATENCY
|
2021-11-03 02:19:28 +00:00
|
|
|
mov r1, r1, lsr #3
|
2021-01-26 03:20:55 +00:00
|
|
|
SETUP_NINELO_BITS_MASK_R14
|
2020-09-07 15:24:05 +00:00
|
|
|
loop_16lobpp:
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_NINELO_BITS_16BPP_LO r11 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_NINELO_BITS_16BPP_HI r5 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2020-09-12 23:06:33 +00:00
|
|
|
CAPTURE_NINELO_BITS_16BPP_LO r11 // input in r8
|
2020-09-07 15:24:05 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_NINELO_BITS_16BPP_HI r6 // input in r8
|
|
|
|
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2020-09-12 23:06:33 +00:00
|
|
|
CAPTURE_NINELO_BITS_16BPP_LO r11 // input in r8
|
2020-09-07 15:24:05 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_NINELO_BITS_16BPP_HI r7 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2020-09-12 23:06:33 +00:00
|
|
|
CAPTURE_NINELO_BITS_16BPP_LO r11 // input in r8
|
2020-09-07 15:24:05 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_NINELO_BITS_16BPP_HI r10 // input in r8
|
|
|
|
stmia r0!, {r5, r6, r7, r10}
|
|
|
|
|
|
|
|
subs r1, r1, #1
|
|
|
|
bne loop_16lobpp
|
|
|
|
|
2021-11-03 02:19:28 +00:00
|
|
|
pop {r0, pc}
|
2020-09-07 15:24:05 +00:00
|
|
|
|
|
|
|
preload_capture_line_fast_ninebitslo_16bpp:
|
|
|
|
SETUP_DUMMY_PARAMETERS
|
|
|
|
b capture_line_fast_ninebitslo_16bpp
|
|
|
|
|
|
|
|
|
|
|
|
.ltorg
|
2020-11-03 03:08:30 +00:00
|
|
|
.align 6
|
2020-09-07 15:24:05 +00:00
|
|
|
// *** 16 bit ***
|
|
|
|
b preload_capture_line_fast_ninebitshi_16bpp
|
|
|
|
capture_line_fast_ninebitshi_16bpp:
|
|
|
|
push {lr}
|
2020-09-12 23:06:33 +00:00
|
|
|
SETUP_VSYNC_DEBUG_16BPP_R11
|
2021-11-23 01:19:16 +00:00
|
|
|
SKIP_PSYNC_NO_OLD_CPLD_HIGH_LATENCY
|
2021-11-03 02:19:28 +00:00
|
|
|
mov r1, r1, lsr #3
|
2021-01-26 03:20:55 +00:00
|
|
|
SETUP_NINEHI_BITS_MASK_R14
|
2020-09-07 15:24:05 +00:00
|
|
|
loop_16hibpp:
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_NINEHI_BITS_16BPP_LO r11 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_NINEHI_BITS_16BPP_HI r5 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2020-09-12 23:06:33 +00:00
|
|
|
CAPTURE_NINEHI_BITS_16BPP_LO r11 // input in r8
|
2020-09-07 15:24:05 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_NINEHI_BITS_16BPP_HI r6 // input in r8
|
|
|
|
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2020-09-12 23:06:33 +00:00
|
|
|
CAPTURE_NINEHI_BITS_16BPP_LO r11 // input in r8
|
2020-09-07 15:24:05 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_NINEHI_BITS_16BPP_HI r7 // input in r8
|
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
2020-09-12 23:06:33 +00:00
|
|
|
CAPTURE_NINEHI_BITS_16BPP_LO r11 // input in r8
|
2020-09-07 15:24:05 +00:00
|
|
|
WAIT_FOR_PSYNC_EDGE_FAST // expects GPLEV0 in r4, result in r8
|
|
|
|
CAPTURE_NINEHI_BITS_16BPP_HI r10 // input in r8
|
|
|
|
stmia r0!, {r5, r6, r7, r10}
|
|
|
|
|
|
|
|
subs r1, r1, #1
|
|
|
|
bne loop_16hibpp
|
|
|
|
|
2021-11-03 02:19:28 +00:00
|
|
|
pop {r0, pc}
|
2020-09-07 15:24:05 +00:00
|
|
|
|
|
|
|
preload_capture_line_fast_ninebitshi_16bpp:
|
|
|
|
SETUP_DUMMY_PARAMETERS
|
|
|
|
b capture_line_fast_ninebitshi_16bpp
|