maixbit: add board definition and dummy runtime
Этот коммит содержится в:
родитель
2fe4a9be71
коммит
7814964693
6 изменённых файлов: 284 добавлений и 1 удалений
55
src/machine/board_k210.go
Обычный файл
55
src/machine/board_k210.go
Обычный файл
|
@ -0,0 +1,55 @@
|
||||||
|
// +build maixbit
|
||||||
|
|
||||||
|
package machine
|
||||||
|
|
||||||
|
// K210 IO pins.
|
||||||
|
const (
|
||||||
|
P00 Pin = 0
|
||||||
|
P01 Pin = 1
|
||||||
|
P02 Pin = 2
|
||||||
|
P03 Pin = 3
|
||||||
|
P04 Pin = 4
|
||||||
|
P05 Pin = 5
|
||||||
|
P06 Pin = 6
|
||||||
|
P07 Pin = 7
|
||||||
|
P08 Pin = 8
|
||||||
|
P09 Pin = 9
|
||||||
|
P10 Pin = 10
|
||||||
|
P11 Pin = 11
|
||||||
|
P12 Pin = 12
|
||||||
|
P13 Pin = 13
|
||||||
|
P14 Pin = 14
|
||||||
|
P15 Pin = 15
|
||||||
|
P16 Pin = 16
|
||||||
|
P17 Pin = 17
|
||||||
|
P18 Pin = 18
|
||||||
|
P19 Pin = 19
|
||||||
|
P20 Pin = 20
|
||||||
|
P21 Pin = 21
|
||||||
|
P22 Pin = 22
|
||||||
|
P23 Pin = 23
|
||||||
|
P24 Pin = 24
|
||||||
|
P25 Pin = 25
|
||||||
|
P26 Pin = 26
|
||||||
|
P27 Pin = 27
|
||||||
|
P28 Pin = 28
|
||||||
|
P29 Pin = 29
|
||||||
|
P30 Pin = 30
|
||||||
|
P31 Pin = 31
|
||||||
|
P32 Pin = 32
|
||||||
|
P33 Pin = 33
|
||||||
|
P34 Pin = 34
|
||||||
|
P35 Pin = 35
|
||||||
|
P36 Pin = 36
|
||||||
|
P37 Pin = 37
|
||||||
|
P38 Pin = 38
|
||||||
|
P39 Pin = 39
|
||||||
|
P40 Pin = 40
|
||||||
|
P41 Pin = 41
|
||||||
|
P42 Pin = 42
|
||||||
|
P43 Pin = 43
|
||||||
|
P44 Pin = 44
|
||||||
|
P45 Pin = 45
|
||||||
|
P46 Pin = 46
|
||||||
|
P47 Pin = 47
|
||||||
|
)
|
61
src/machine/board_maixbit.go
Обычный файл
61
src/machine/board_maixbit.go
Обычный файл
|
@ -0,0 +1,61 @@
|
||||||
|
// +build maixbit
|
||||||
|
|
||||||
|
package machine
|
||||||
|
|
||||||
|
// GPIO pins.
|
||||||
|
const (
|
||||||
|
D0 = P08
|
||||||
|
D1 = P09
|
||||||
|
D2 = P10
|
||||||
|
D3 = P11
|
||||||
|
D4 = P12
|
||||||
|
D5 = P13
|
||||||
|
D6 = P14
|
||||||
|
D7 = P15
|
||||||
|
)
|
||||||
|
|
||||||
|
// High-speed GPIO pins (GPIOHS).
|
||||||
|
const (
|
||||||
|
DHS0 = P16
|
||||||
|
DHS1 = P17
|
||||||
|
DHS2 = P18
|
||||||
|
DHS3 = P19
|
||||||
|
DHS4 = P20
|
||||||
|
DHS5 = P21
|
||||||
|
DHS6 = P22
|
||||||
|
DHS7 = P23
|
||||||
|
DHS8 = P24
|
||||||
|
DHS9 = P25
|
||||||
|
DHS10 = P26
|
||||||
|
DHS11 = P27
|
||||||
|
DHS12 = P28
|
||||||
|
DHS13 = P29
|
||||||
|
DHS14 = P30
|
||||||
|
DHS15 = P31
|
||||||
|
DHS16 = P32
|
||||||
|
DHS17 = P33
|
||||||
|
DHS18 = P34
|
||||||
|
DHS19 = P35
|
||||||
|
DHS20 = P36
|
||||||
|
DHS21 = P37
|
||||||
|
DHS22 = P38
|
||||||
|
DHS23 = P39
|
||||||
|
DHS24 = P40
|
||||||
|
DHS25 = P41
|
||||||
|
DHS26 = P42
|
||||||
|
DHS27 = P43
|
||||||
|
DHS28 = P44
|
||||||
|
DHS29 = P45
|
||||||
|
DHS30 = P46
|
||||||
|
DHS31 = P47
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
LED = LED1
|
||||||
|
LED1 = LED_RED
|
||||||
|
LED2 = LED_GREEN
|
||||||
|
LED3 = LED_BLUE
|
||||||
|
LED_RED = D5
|
||||||
|
LED_GREEN = D4
|
||||||
|
LED_BLUE = D6
|
||||||
|
)
|
30
src/machine/machine_k210.go
Обычный файл
30
src/machine/machine_k210.go
Обычный файл
|
@ -0,0 +1,30 @@
|
||||||
|
// +build k210
|
||||||
|
|
||||||
|
package machine
|
||||||
|
|
||||||
|
func CPUFrequency() uint32 {
|
||||||
|
return 400000000
|
||||||
|
}
|
||||||
|
|
||||||
|
type PinMode uint8
|
||||||
|
|
||||||
|
const (
|
||||||
|
PinInput PinMode = iota
|
||||||
|
PinOutput
|
||||||
|
PinPWM
|
||||||
|
PinSPI
|
||||||
|
PinI2C = PinSPI
|
||||||
|
)
|
||||||
|
|
||||||
|
// Configure this pin with the given configuration.
|
||||||
|
func (p Pin) Configure(config PinConfig) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the pin to high or low.
|
||||||
|
func (p Pin) Set(high bool) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns the current value of a GPIO pin.
|
||||||
|
func (p Pin) Get() bool {
|
||||||
|
return true
|
||||||
|
}
|
110
src/runtime/runtime_k210.go
Обычный файл
110
src/runtime/runtime_k210.go
Обычный файл
|
@ -0,0 +1,110 @@
|
||||||
|
// +build k210
|
||||||
|
|
||||||
|
// This file implements target-specific things for the K210 chip as used in the
|
||||||
|
// MAix Bit with Mic.
|
||||||
|
|
||||||
|
package runtime
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"device/riscv"
|
||||||
|
"runtime/volatile"
|
||||||
|
)
|
||||||
|
|
||||||
|
type timeUnit int64
|
||||||
|
|
||||||
|
func postinit() {}
|
||||||
|
|
||||||
|
//export main
|
||||||
|
func main() {
|
||||||
|
// todo
|
||||||
|
|
||||||
|
// Set the interrupt address.
|
||||||
|
// Note that this address must be aligned specially, otherwise the MODE bits
|
||||||
|
// of MTVEC won't be zero.
|
||||||
|
riscv.MTVEC.Set(uintptr(unsafe.Pointer(&handleInterruptASM)))
|
||||||
|
|
||||||
|
// Reset the MIE register and enable external interrupts.
|
||||||
|
// It must be reset here because it not zeroed at startup.
|
||||||
|
riscv.MIE.Set(1 << 11) // bit 11 is for machine external interrupts
|
||||||
|
|
||||||
|
// Enable global interrupts now that they've been set up.
|
||||||
|
riscv.MSTATUS.SetBits(1 << 3) // MIE
|
||||||
|
|
||||||
|
preinit()
|
||||||
|
initPeripherals()
|
||||||
|
run()
|
||||||
|
abort()
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:extern handleInterruptASM
|
||||||
|
var handleInterruptASM [0]uintptr
|
||||||
|
|
||||||
|
//export handleInterrupt
|
||||||
|
func handleInterrupt() {
|
||||||
|
cause := riscv.MCAUSE.Get()
|
||||||
|
code := uint(cause &^ (1 << 31))
|
||||||
|
if cause&(1<<31) != 0 {
|
||||||
|
// Topmost bit is set, which means that it is an interrupt.
|
||||||
|
switch code {
|
||||||
|
case 7: // Machine timer interrupt
|
||||||
|
// Signal timeout.
|
||||||
|
timerWakeup.Set(1)
|
||||||
|
// Disable the timer, to avoid triggering the interrupt right after
|
||||||
|
// this interrupt returns.
|
||||||
|
riscv.MIE.ClearBits(1 << 7) // MTIE bit
|
||||||
|
case 11: // Machine external interrupt
|
||||||
|
// Claim this interrupt.
|
||||||
|
//id := sifive.PLIC.CLAIM.Get()
|
||||||
|
// Call the interrupt handler, if any is registered for this ID.
|
||||||
|
callInterruptHandler(int(0))
|
||||||
|
// Complete this interrupt.
|
||||||
|
//sifive.PLIC.CLAIM.Set(id)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Topmost bit is clear, so it is an exception of some sort.
|
||||||
|
// We could implement support for unsupported instructions here (such as
|
||||||
|
// misaligned loads). However, for now we'll just print a fatal error.
|
||||||
|
handleException(code)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// initPeripherals configures periperhals the way the runtime expects them.
|
||||||
|
func initPeripherals() {
|
||||||
|
// todo
|
||||||
|
}
|
||||||
|
|
||||||
|
func putchar(c byte) {
|
||||||
|
//machine.UART0.WriteByte(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
const asyncScheduler = false
|
||||||
|
|
||||||
|
var timerWakeup volatile.Register8
|
||||||
|
|
||||||
|
func ticks() timeUnit {
|
||||||
|
// todo
|
||||||
|
}
|
||||||
|
|
||||||
|
func sleepTicks(d timeUnit) {
|
||||||
|
// todo
|
||||||
|
}
|
||||||
|
|
||||||
|
// handleException is called from the interrupt handler for any exception.
|
||||||
|
// Exceptions can be things like illegal instructions, invalid memory
|
||||||
|
// read/write, and similar issues.
|
||||||
|
func handleException(code uint) {
|
||||||
|
// For a list of exception codes, see:
|
||||||
|
// https://content.riscv.org/wp-content/uploads/2019/08/riscv-privileged-20190608-1.pdf#page=49
|
||||||
|
print("fatal error: exception with mcause=")
|
||||||
|
print(code)
|
||||||
|
print(" pc=")
|
||||||
|
print(riscv.MEPC.Get())
|
||||||
|
println()
|
||||||
|
abort()
|
||||||
|
}
|
||||||
|
|
||||||
|
// callInterruptHandler is a compiler-generated function that calls the
|
||||||
|
// appropriate interrupt handler for the given interrupt ID.
|
||||||
|
func callInterruptHandler(id int)
|
27
src/runtime/runtime_k210_baremetal.go
Обычный файл
27
src/runtime/runtime_k210_baremetal.go
Обычный файл
|
@ -0,0 +1,27 @@
|
||||||
|
// +build k210,!qemu
|
||||||
|
|
||||||
|
package runtime
|
||||||
|
|
||||||
|
import (
|
||||||
|
"device/kendryte"
|
||||||
|
"device/riscv"
|
||||||
|
)
|
||||||
|
|
||||||
|
var clockFrequency uint32 = kendryte.SYSCTL.CLK_FREQ.Get()
|
||||||
|
|
||||||
|
// ticksToNanoseconds converts RTC ticks to nanoseconds.
|
||||||
|
func ticksToNanoseconds(ticks timeUnit) int64 {
|
||||||
|
return int64(ticks) * 1e9 / clockFrequency
|
||||||
|
}
|
||||||
|
|
||||||
|
// nanosecondsToTicks converts nanoseconds to RTC ticks.
|
||||||
|
func nanosecondsToTicks(ns int64) timeUnit {
|
||||||
|
return timeUnit(ns * 64 / 1953125)
|
||||||
|
}
|
||||||
|
|
||||||
|
func abort() {
|
||||||
|
// lock up forever
|
||||||
|
for {
|
||||||
|
riscv.Asm("wfi")
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,5 +2,5 @@
|
||||||
"inherits": ["k210"],
|
"inherits": ["k210"],
|
||||||
"build-tags": ["maixbit"],
|
"build-tags": ["maixbit"],
|
||||||
"linkerscript": "targets/maixbit.ld",
|
"linkerscript": "targets/maixbit.ld",
|
||||||
"flash-command": "kflash -p /dev/ttyUSB0 {hex}"
|
"flash-command": "kflash -p {port} {hex}"
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче