rp2040

RP2040 Programming without SDK
Log | Files | Refs

mc.s (1410B)


      1 	.global mcfork // int mcfork(void)
      2 mcfork:
      3 	push {r4, lr}
      4 	ldr r0, =0x20000800
      5 	mov r1, lr
      6 	str r1, [r0, #0]
      7 mcfork_retry:
      8 	bl mc_fifo_drain
      9 	mov r0, #0
     10 	bl mc_fifo_send
     11 	bl mc_fifo_recv
     12 	cmp r0, #0
     13 	bne mcfork_retry
     14 
     15 	bl mc_fifo_drain
     16 	mov r0, #0
     17 	bl mc_fifo_send
     18 	bl mc_fifo_recv
     19 	cmp r0, #0
     20 	bne mcfork_retry
     21 
     22 	mov r0, #1
     23 	bl mc_fifo_send
     24 	bl mc_fifo_recv
     25 	cmp r0, #1
     26 	bne mcfork_retry
     27 
     28 	ldr r0, =0x10000100 // __vectors
     29 	mov r4, r0
     30 	bl mc_fifo_send
     31 	bl mc_fifo_recv
     32 	cmp r0, r4
     33 	bne mcfork_retry
     34 
     35 	ldr r0, =0x200007fc // initial sp
     36 	mov r4, r0
     37 	bl mc_fifo_send
     38 	bl mc_fifo_recv
     39 	cmp r0, r4
     40 	bne mcfork_retry
     41 
     42 	adr r0, mcfork_ent
     43 	add r0, r0, #1 // thumb mode
     44 	mov r4, r0
     45 	bl mc_fifo_send
     46 	bl mc_fifo_recv
     47 	cmp r0, r4
     48 	bne mcfork_retry
     49 	.align 2
     50 mcfork_ent: // this part doesn't work for cpu1
     51 	ldr r0, sio_base
     52 	ldr r0, [r0, #0]
     53 	pop {r4, pc}
     54 
     55 mc_fifo_drain:
     56 	ldr r0, sio_base
     57 mc_fifo_not_empty:
     58 	ldr r1, [r0, #0x50] // SIO_FIFO_ST
     59 	mov r2, #1
     60 	and r1, r2
     61 	beq mc_fifo_empty
     62 	ldr r3, [r0, #0x58] // SIO_FIFO_RD
     63 	b mc_fifo_not_empty
     64 mc_fifo_empty:
     65 	sev
     66 	bx lr
     67 
     68 mc_fifo_send:
     69 	ldr r1, sio_base
     70 mc_fifo_full:
     71 	ldr r2, [r1, #0x50] // SIO_FIFO_ST
     72 	mov r3, #2
     73 	and r2, r3
     74 	beq mc_fifo_full
     75 	str r0, [r1, #0x54] // SIO_FIFO_WR
     76 	sev
     77 	bx lr
     78 
     79 mc_fifo_recv:
     80 	ldr r1, sio_base
     81 	ldr r2, [r1, #0x50] // SIO_FIFO_ST
     82 	mov r3, #1
     83 	and r2, r3
     84 	bne mc_fifo_redy
     85 	wfe
     86 mc_fifo_redy:
     87 	ldr r0, [r1, #0x58] // SIO_FIFO_RD
     88 	bx lr
     89