aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/machine/machine_rp2_xosc.go
diff options
context:
space:
mode:
authorPatricio Whittingslow <[email protected]>2024-12-18 15:36:30 -0300
committerGitHub <[email protected]>2024-12-18 19:36:30 +0100
commit37f35f8c910b05e2040433448546f41b34535b32 (patch)
tree32bdf01b1c2b8d75e9a7f1a24e5c62be9d432ce0 /src/machine/machine_rp2_xosc.go
parent0d13e61d0cbe7aa82678a6dec7dda0115db82397 (diff)
downloadtinygo-37f35f8c910b05e2040433448546f41b34535b32.tar.gz
tinygo-37f35f8c910b05e2040433448546f41b34535b32.zip
Add RP2350 support (#4459)
machine/rp2350: add support * add linker scripts for rp2350 * add bootloader * begin melding rp2040 and rp2350 APIs * add UART * add rp2350 boot patching * Fix RP2350 memory layout (#4626) * Remove rp2040-style second stage bootloader. * Add 'minimum viable' IMAGE_DEF embedded block * Create a pico2 specific target * Implement rp2350 init, clock, and uart support * Merge rp2 reset code back together * Separate chip-specific clock definitions * Clear pad isolation bit on rp2350 * Init UART in rp2350 runtime * Correct usb/serial initialization order * Implement jump-to-bootloader * test: add pico2 to smoketests --------- Signed-off-by: deadprogram <[email protected]> Co-authored-by: Matthew Mets <[email protected]> Co-authored-by: Matt Mets <[email protected]> Co-authored-by: deadprogram <[email protected]>
Diffstat (limited to 'src/machine/machine_rp2_xosc.go')
-rw-r--r--src/machine/machine_rp2_xosc.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/machine/machine_rp2_xosc.go b/src/machine/machine_rp2_xosc.go
new file mode 100644
index 000000000..c9ce58300
--- /dev/null
+++ b/src/machine/machine_rp2_xosc.go
@@ -0,0 +1,47 @@
+//go:build rp2040 || rp2350
+
+package machine
+
+import (
+ "device/rp"
+ "runtime/volatile"
+ "unsafe"
+)
+
+// On some boards, the XOSC can take longer than usual to stabilize. On such
+// boards, this is needed to avoid a hard fault on boot/reset. Refer to
+// PICO_XOSC_STARTUP_DELAY_MULTIPLIER in the Pico SDK for additional details.
+const XOSC_STARTUP_DELAY_MULTIPLIER = 64
+
+type xoscType struct {
+ ctrl volatile.Register32
+ status volatile.Register32
+ dormant volatile.Register32
+ startup volatile.Register32
+ reserved [3 - 3*rp2350ExtraReg]volatile.Register32
+ count volatile.Register32
+}
+
+var xosc = (*xoscType)(unsafe.Pointer(rp.XOSC))
+
+// init initializes the crystal oscillator system.
+//
+// This function will block until the crystal oscillator has stabilised.
+func (osc *xoscType) init() {
+ // Assumes 1-15 MHz input
+ if xoscFreq > 15 {
+ panic("xosc frequency cannot be greater than 15MHz")
+ }
+ osc.ctrl.Set(rp.XOSC_CTRL_FREQ_RANGE_1_15MHZ)
+
+ // Set xosc startup delay
+ delay := (((xoscFreq * MHz) / 1000) + 128) / 256 * XOSC_STARTUP_DELAY_MULTIPLIER
+ osc.startup.Set(uint32(delay))
+
+ // Set the enable bit now that we have set freq range and startup delay
+ osc.ctrl.SetBits(rp.XOSC_CTRL_ENABLE_ENABLE << rp.XOSC_CTRL_ENABLE_Pos)
+
+ // Wait for xosc to be stable
+ for !osc.status.HasBits(rp.XOSC_STATUS_STABLE) {
+ }
+}