rp2040

RP2040 Programming without SDK
Log | Files | Refs

commit 07d07fe2aeaee6b1cbda4b132c08aa68a483b4f7
parent e15aac2f4537c9045462db34543a5bd779dc8520
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Mon, 27 Mar 2023 10:44:22 +0900

try to use core1

Diffstat:
Mas.s | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Mmain.c | 16+++++++++-------
2 files changed, 102 insertions(+), 9 deletions(-)

diff --git a/as.s b/as.s @@ -121,8 +121,6 @@ pll_lock: pop {pc} -// functions - unreset: // unreset subsystems specified by r0 // args: bit mask to specify the subsystems to unreset @@ -144,6 +142,99 @@ reset_chk: beq reset_chk bx lr + .global mcfork // int mcfork(void) +mcfork: + push {r4, lr} + ldr r0, =0x20000800 + mov r1, lr + str r1, [r0, #0] +mcfork_retry: + bl mc_fifo_drain + mov r0, #0 + bl mc_fifo_send + bl mc_fifo_recv + cmp r0, #0 + bne mcfork_retry + + bl mc_fifo_drain + mov r0, #0 + bl mc_fifo_send + bl mc_fifo_recv + cmp r0, #0 + bne mcfork_retry + + bl led_p0 + + mov r0, #1 + bl mc_fifo_send + bl mc_fifo_recv + cmp r0, #1 + bne mcfork_retry + + bl led_p1 + + ldr r0, =0x10000100 // __vectors + mov r4, r0 + bl mc_fifo_send + bl mc_fifo_recv + cmp r0, r4 + bne mcfork_retry + + ldr r0, =0x200007fc // initial sp + mov r4, r0 + bl mc_fifo_send + bl mc_fifo_recv + cmp r0, r4 + bne mcfork_retry + + + adr r0, mcfork_ent + add r0, r0, #1 // thumb mode + mov r4, r0 + bl mc_fifo_send + bl mc_fifo_recv + cmp r0, r4 + bne mcfork_retry + .align 2 +mcfork_ent: + pop {r4, pc} + + +mc_fifo_drain: + ldr r0, sio_base +mc_fifo_not_empty: + ldr r1, [r0, #0x50] // SIO_FIFO_ST + mov r2, #1 + and r1, r2 + bne mc_fifo_empty + ldr r3, [r0, #0x58] // SIO_FIFO_RD + b mc_fifo_not_empty +mc_fifo_empty: + sev + bx lr + +mc_fifo_send: + ldr r1, sio_base +mc_fifo_full: + ldr r2, [r1, #0x50] // SIO_FIFO_ST + mov r3, #2 + and r2, r3 + beq mc_fifo_full + str r0, [r1, #0x54] // SIO_FIFO_WR + sev + bx lr + +mc_fifo_recv: + ldr r1, sio_base + ldr r2, [r1, #0x50] // SIO_FIFO_ST + mov r3, #1 + and r2, r3 + bne mc_fifo_redy + wfe +mc_fifo_redy: + ldr r0, [r1, #0x58] // SIO_FIFO_RD + bx lr + .global putchar putchar: uart0_write: diff --git a/main.c b/main.c @@ -1,13 +1,15 @@ void main(void) { - char *s = "unko\n"; - char *c; + int cpuid; init(); - while(1) { - for (c = s; *c != '\0'; c++) { - putchar(*c); - } - delay(); + print("unko\n"); + cpuid = mcfork(); + if (cpuid == 0) { + print("cpu0\n"); + } else if (cpuid == 1) { + print("cpu1\n"); + } else { + print("something wrong\n"); } }