mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-16 10:43:29 +00:00
machine: bump rp2040 to 200MHz (#4768)
* machine: add support for core voltage adjustments to rp2040 In preparation for bumping the core frequency of the rp2040, this change implements the required core voltage adjustment logic. * machine: bump rp2040 to 200MHz
This commit is contained in:
@@ -9,7 +9,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
cpuFreq = 125 * MHz
|
cpuFreq = 200 * MHz
|
||||||
_NUMBANK0_GPIOS = 30
|
_NUMBANK0_GPIOS = 30
|
||||||
_NUMBANK0_IRQS = 4
|
_NUMBANK0_IRQS = 4
|
||||||
_NUMIRQ = 32
|
_NUMIRQ = 32
|
||||||
@@ -208,3 +208,16 @@ func (clks *clocksType) initTicks() {} // No ticks on RP2040
|
|||||||
func (wd *watchdogImpl) startTick(cycles uint32) {
|
func (wd *watchdogImpl) startTick(cycles uint32) {
|
||||||
rp.WATCHDOG.TICK.Set(cycles | rp.WATCHDOG_TICK_ENABLE)
|
rp.WATCHDOG.TICK.Set(cycles | rp.WATCHDOG_TICK_ENABLE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func adjustCoreVoltage() bool {
|
||||||
|
if cpuFreq <= 133*MHz {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// The rp2040 is certified to run at 200MHz with the
|
||||||
|
// core voltage set to 1150mV.
|
||||||
|
const targetVoltage = 1150
|
||||||
|
// 0b0101 maps to 800mV and each step is 50mV.
|
||||||
|
const vreg = 0b0101 + (targetVoltage-800)/50
|
||||||
|
rp.VREG_AND_CHIP_RESET.SetVREG_VSEL(vreg)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|||||||
@@ -222,3 +222,7 @@ func EnterBootloader() {
|
|||||||
func (wd *watchdogImpl) startTick(cycles uint32) {
|
func (wd *watchdogImpl) startTick(cycles uint32) {
|
||||||
rp.TICKS.WATCHDOG_CTRL.SetBits(1)
|
rp.TICKS.WATCHDOG_CTRL.SetBits(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func adjustCoreVoltage() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|||||||
@@ -42,6 +42,10 @@ type clock struct {
|
|||||||
cix clockIndex
|
cix clockIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The delay in seconds for core voltage adjustments to
|
||||||
|
// settle. Taken from the Pico SDK.
|
||||||
|
const _VREG_VOLTAGE_AUTO_ADJUST_DELAY = 1 / 1e3
|
||||||
|
|
||||||
// clock returns the clock identified by cix.
|
// clock returns the clock identified by cix.
|
||||||
func (clks *clocksType) clock(cix clockIndex) clock {
|
func (clks *clocksType) clock(cix clockIndex) clock {
|
||||||
return clock{
|
return clock{
|
||||||
@@ -188,6 +192,14 @@ func (clks *clocksType) init() {
|
|||||||
xoscFreq,
|
xoscFreq,
|
||||||
xoscFreq)
|
xoscFreq)
|
||||||
|
|
||||||
|
if adjustCoreVoltage() {
|
||||||
|
// Wait for the voltage to settle.
|
||||||
|
const cycles = _VREG_VOLTAGE_AUTO_ADJUST_DELAY * xoscFreq * MHz
|
||||||
|
for i := 0; i < cycles; i++ {
|
||||||
|
arm.Asm("nop")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// clkSys = pllSys (125MHz) / 1 = 125MHz
|
// clkSys = pllSys (125MHz) / 1 = 125MHz
|
||||||
csys := clks.clock(clkSys)
|
csys := clks.clock(clkSys)
|
||||||
csys.configure(rp.CLOCKS_CLK_SYS_CTRL_SRC_CLKSRC_CLK_SYS_AUX,
|
csys.configure(rp.CLOCKS_CLK_SYS_CTRL_SRC_CLKSRC_CLK_SYS_AUX,
|
||||||
|
|||||||
Reference in New Issue
Block a user