blob: 2b24d371b4db71fa3dd6f4a8608de2f529cd85bd (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
//go:build esp32
// +build esp32
package runtime
import (
"device"
"device/esp"
"machine"
)
// This is the function called on startup right after the stack pointer has been
// set.
//
//export main
func main() {
// Disable the protection on the watchdog timer (needed when started from
// the bootloader).
esp.RTCCNTL.WDTWPROTECT.Set(0x050D83AA1)
// Disable both watchdog timers that are enabled by default on startup.
// Note that these watchdogs can be protected, but the ROM bootloader
// doesn't seem to protect them.
esp.RTCCNTL.WDTCONFIG0.Set(0)
esp.TIMG0.WDTCONFIG0.Set(0)
// Switch SoC clock source to PLL (instead of the default which is XTAL).
// This switches the CPU (and APB) clock from 40MHz to 80MHz.
// Options:
// RTCCNTL_CLK_CONF_SOC_CLK_SEL: PLL (default XTAL)
// RTCCNTL_CLK_CONF_CK8M_DIV_SEL: 2 (default)
// RTCCNTL_CLK_CONF_DIG_CLK8M_D256_EN: Enable (default)
// RTCCNTL_CLK_CONF_CK8M_DIV: DIV256 (default)
// The only real change made here is modifying RTCCNTL_CLK_CONF_SOC_CLK_SEL,
// but setting a fixed value produces smaller code.
esp.RTCCNTL.CLK_CONF.Set((esp.RTCCNTL_CLK_CONF_SOC_CLK_SEL_PLL << esp.RTCCNTL_CLK_CONF_SOC_CLK_SEL_Pos) |
(2 << esp.RTCCNTL_CLK_CONF_CK8M_DIV_SEL_Pos) |
(esp.RTCCNTL_CLK_CONF_DIG_CLK8M_D256_EN_Enable << esp.RTCCNTL_CLK_CONF_DIG_CLK8M_D256_EN_Pos) |
(esp.RTCCNTL_CLK_CONF_CK8M_DIV_DIV256 << esp.RTCCNTL_CLK_CONF_CK8M_DIV_Pos))
// Switch CPU from 80MHz to 160MHz. This doesn't affect the APB clock,
// which is still running at 80MHz.
esp.DPORT.CPU_PER_CONF.Set(esp.DPORT_CPU_PER_CONF_CPUPERIOD_SEL_SEL_160)
// Clear .bss section. .data has already been loaded by the ROM bootloader.
// Do this after increasing the CPU clock to possibly make startup slightly
// faster.
clearbss()
// Initialize UART.
machine.InitSerial()
// Initialize main system timer used for time.Now.
initTimer()
// Initialize the heap, call main.main, etc.
run()
// Fallback: if main ever returns, hang the CPU.
exit(0)
}
//go:extern _sbss
var _sbss [0]byte
//go:extern _ebss
var _ebss [0]byte
func abort() {
for {
device.Asm("waiti 0")
}
}
|