github.com/usbarmory/tamago@v0.0.0-20240508072735-8612bbe1e454/soc/bcm2835/bcm2835.go (about) 1 // BCM2835 SoC support 2 // https://github.com/usbarmory/tamago 3 // 4 // Copyright (c) the bcm2835 package authors 5 // 6 // Use of this source code is governed by the license 7 // that can be found in the LICENSE file. 8 9 // Package bcm2835 provides support to Go bare metal unikernels written using 10 // the TamaGo framework on BCM2835/BCM2836 SoCs. 11 // 12 // This package is only meant to be used with `GOOS=tamago GOARCH=arm` as 13 // supported by the TamaGo framework for bare metal Go on ARM SoCs, see 14 // https://github.com/usbarmory/tamago. 15 package bcm2835 16 17 import ( 18 _ "unsafe" 19 20 "github.com/usbarmory/tamago/arm" 21 ) 22 23 // nanos - should be same value as arm/timer.go refFreq 24 const refFreq int64 = 1000000000 25 26 // DRAM_FLAG_NOCACHE disables caching by setting to high bits 27 const DRAM_FLAG_NOCACHE = 0xC0000000 28 29 // peripheralBase represents the (remapped) peripheral base address, it varies 30 // by model and it is therefore initialized (see Init) by individual board 31 // packages. 32 var peripheralBase uint32 33 34 // ARM processor instance 35 var ARM = &arm.CPU{} 36 37 //go:linkname ramStackOffset runtime.ramStackOffset 38 var ramStackOffset uint32 = 0x100000 // 1 MB 39 40 //go:linkname nanotime1 runtime.nanotime1 41 func nanotime1() int64 { 42 return read_systimer()*ARM.TimerMultiplier + ARM.TimerOffset 43 } 44 45 // Init takes care of the lower level SoC initialization triggered early in 46 // runtime setup (e.g. runtime.hwinit). 47 func Init(base uint32) { 48 peripheralBase = base 49 50 ARM.Init(ramStart) 51 ARM.EnableVFP() 52 53 // required when booting in SDP mode 54 ARM.EnableSMP() 55 56 // MMU initialization is required to take advantage of data cache 57 ARM.InitMMU() 58 ARM.EnableCache() 59 60 ARM.TimerMultiplier = refFreq / SysTimerFreq 61 ARM.TimerFn = read_systimer 62 63 // initialize serial console 64 MiniUART.Init() 65 } 66 67 // PeripheralAddress returns the absolute address for a peripheral. The Pi 68 // boards map 'bus addresses' to board specific base addresses but with 69 // consistent layout otherwise. 70 func PeripheralAddress(offset uint32) uint32 { 71 return peripheralBase + offset 72 }