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}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче