Change-Id: Ia84b5b8ede53f59299a02dc6163d6bbaa31e0fbd
Signed-off-by: Aurélien Martin <martaurel@gmail.com>
Reviewed-on: http://openocd.zylin.com/5272
Tested-by: jenkins
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
.global _start
_start:
wait_fifo:
+ // Kick the watchdog
str r6, [r7, #0]
+ // Load write pointer
ldr r5, [r1, #0]
+ // Abort if it is NULL
cmp r5, #0
beq.n exit
+ // Load read pointer
ldr r4, [r1, #4]
+ // Continue waiting if it equals the write pointer
cmp r4, r5
beq.n wait_fifo
+ // Copy one word from buffer to target, and increment pointers
ldmia r4!, {r5}
stmia r3!, {r5}
+ // If at end of buffer, wrap back to buffer start
cmp r4, r2
bcc.n no_wrap
mov r4, r1
adds r4, #8
no_wrap:
+ // Update read pointer inside the buffer
str r4, [r1, #4]
+ // Deduce the word transferred from the byte count
subs r0, #4
+ // Start again
bne.n wait_fifo
exit:
+ // Wait for OpenOCD
bkpt #0x00
.pool