diff --git a/contrib/loaders/flash/nrf5/nrf5.S b/contrib/loaders/flash/nrf5/nrf5.S index 6f7ed9ae7..53551a2c2 100644 --- a/contrib/loaders/flash/nrf5/nrf5.S +++ b/contrib/loaders/flash/nrf5/nrf5.S @@ -35,24 +35,35 @@ .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