mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-08 13:03:39 +00:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6384ecace0 | |||
| 38881a2850 | |||
| 0f1cf14743 | |||
| 7c34f7704e | |||
| 377415a6c3 | |||
| 1e13c6d18f | |||
| 14121f4b0e | |||
| 7768195835 | |||
| c095b7e9c4 | |||
| 1f6d34d995 | |||
| 9951eb9990 | |||
| c8f77d26a8 | |||
| 8eaa9bd8d0 | |||
| 6061f3db92 | |||
| 410aa0e0d8 | |||
| c66836cf3a | |||
| ca9211b582 | |||
| cb7d470ba4 |
@@ -64,7 +64,6 @@ jobs:
|
|||||||
push: true
|
push: true
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
build-contexts: tinygo-llvm-build=docker-image://tinygo/llvm-17
|
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
cache-to: type=gha,mode=max
|
cache-to: type=gha,mode=max
|
||||||
- name: Trigger Drivers repo build on Github Actions
|
- name: Trigger Drivers repo build on Github Actions
|
||||||
|
|||||||
+102
@@ -1,3 +1,105 @@
|
|||||||
|
0.31.2
|
||||||
|
---
|
||||||
|
|
||||||
|
* **general**
|
||||||
|
* update the `net` submodule to updated version with `Buffers` implementation
|
||||||
|
|
||||||
|
* **compiler**
|
||||||
|
* `syscall`: add wasm_unknown tag to some additional files so it can compile more code
|
||||||
|
|
||||||
|
* **standard library**
|
||||||
|
* `runtime`: add Frame.Entry field
|
||||||
|
|
||||||
|
|
||||||
|
0.31.1
|
||||||
|
---
|
||||||
|
|
||||||
|
* **general**
|
||||||
|
* fix Binaryen build in make task
|
||||||
|
* update final build stage of Docker `dev` image to go1.22
|
||||||
|
* only use GHA cache for building Docker `dev` image
|
||||||
|
* update the `net` submodule to latest version
|
||||||
|
|
||||||
|
* **compiler**
|
||||||
|
* `interp`: make getelementptr offsets signed
|
||||||
|
* `interp`: return a proper error message when indexing out of range
|
||||||
|
|
||||||
|
|
||||||
|
0.31.0
|
||||||
|
---
|
||||||
|
|
||||||
|
* **general**
|
||||||
|
* remove LLVM 14 support
|
||||||
|
* add LLVM 17 support, and use it by default
|
||||||
|
* add Nix flake support
|
||||||
|
* update bundled Binaryen to version 116
|
||||||
|
* add `ports` subcommand that lists available serial ports for `-port` and `-monitor`
|
||||||
|
* support wasmtime version 14
|
||||||
|
* add `-serial=rtt` for serial output over SWD
|
||||||
|
* add Go 1.22 support and use it by default
|
||||||
|
* change minimum Node.js version from 16 to 18
|
||||||
|
* **compiler**
|
||||||
|
* use the new LLVM pass manager
|
||||||
|
* allow systems with more stack space to allocate larger values on the stack
|
||||||
|
* `build`: fix a crash due to sharing GlobalValues between build instances
|
||||||
|
* `cgo`: add `C._Bool` type
|
||||||
|
* `cgo`: fix calling CGo callback inside generic function
|
||||||
|
* `compileopts`: set `purego` build tag by default so that more packages can be built
|
||||||
|
* `compileopts`: force-enable CGo to avoid build issues
|
||||||
|
* `compiler`: fix crash on type assert on interfaces with no methods
|
||||||
|
* `interp`: print LLVM instruction in traceback
|
||||||
|
* `interp`: support runtime times by running them at runtime
|
||||||
|
* `loader`: enforce Go language version in the type checker (this may break existing programs with an incorrect Go version in go.mod)
|
||||||
|
* `transform`: fix bug in StringToBytes optimization pass
|
||||||
|
* **standard library**
|
||||||
|
* `crypto/tls`: stub out a lot of functions
|
||||||
|
* `internal/task`, `machine`: make TinyGo code usable with "big Go" CGo
|
||||||
|
* `machine`: implement `I2C.SetBaudRate` consistently across chips
|
||||||
|
* `machine`: implement `SPI.Configure` consistently across chips
|
||||||
|
* `machine`: add `DeviceID` for nrf, rp2040, sam, stm32
|
||||||
|
* `machine`: use smaller UART buffer size on atmega chips
|
||||||
|
* `machine/usb`: allow setting a serial number using a linker flag
|
||||||
|
* `math`: support more math functions on baremetal (picolibc) systems
|
||||||
|
* `net`: replace entire net package with a new one based on the netdev driver
|
||||||
|
* `os/user`: add bare-bones implementation of this package
|
||||||
|
* `reflect`: stub `CallSlice` and `FuncOf`
|
||||||
|
* `reflect`: add `TypeFor[T]`
|
||||||
|
* `reflect`: update `IsZero` to Go 1.22 semantics
|
||||||
|
* `reflect`: move indirect values into interface when setting interfaces
|
||||||
|
* `runtime`: stub `Breakpoint`
|
||||||
|
* `sync`: implement trylock
|
||||||
|
* **targets**
|
||||||
|
* `atmega`: use UART double speed mode for fewer errors and higher throughput
|
||||||
|
* `atmega328pb`: refactor to enable extra uart
|
||||||
|
* `avr`: don't compile large parts of picolibc (math, stdio) for LLVM 17 support
|
||||||
|
* `esp32`: switch over to the official SVD file
|
||||||
|
* `esp32c3`: implement USB_SERIAL for USBCDC communication
|
||||||
|
* `esp32c3`: implement I2C
|
||||||
|
* `esp32c3`: implement RNG
|
||||||
|
* `esp32c3`: add more ROM functions and update linker script for the in-progress wifi support
|
||||||
|
* `esp32c3`: update to newer SVD files
|
||||||
|
* `rp2040`: add support for UART hardware flow control
|
||||||
|
* `rp2040`: add definition for `machine.PinToggle`
|
||||||
|
* `rp2040`: set XOSC startup delay multiplier
|
||||||
|
* `samd21`: add support for UART hardware flow control
|
||||||
|
* `samd51`: add support for UART hardware flow control
|
||||||
|
* `wasm`: increase default stack size to 64k for wasi/wasm targets
|
||||||
|
* `wasm`: bump wasi-libc version to SDK 20
|
||||||
|
* `wasm`: remove line of dead code in wasm_exec.js
|
||||||
|
* **new targets/boards**
|
||||||
|
* `qtpy-esp32c3`: add Adafruit QT Py ESP32-C3 board
|
||||||
|
* `mksnanov3`: add support for the MKS Robin Nano V3.x
|
||||||
|
* `nrf52840-generic`: add generic nrf52840 chip support
|
||||||
|
* `thumby`: add support for Thumby
|
||||||
|
* `wasm`: add new `wasm-unknown` target that doesn't depend on WASI or a browser
|
||||||
|
* **boards**
|
||||||
|
* `arduino-mkrwifi1010`, `arduino-nano33`, `nano-rp2040`, `matrixportal-m4`, `metro-m4-airlift`, `pybadge`, `pyportal`: add `ninafw` build tag and some constants for BLE support
|
||||||
|
* `gopher-badge`: fix typo in USB product name
|
||||||
|
* `nano-rp2040`: add UART1 and correct mappings for NINA via UART
|
||||||
|
* `pico`: bump default stack size from 2kB to 8kB
|
||||||
|
* `wioterminal`: expose UART4
|
||||||
|
|
||||||
|
|
||||||
0.30.0
|
0.30.0
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -33,7 +33,7 @@ RUN cd /tinygo/ && \
|
|||||||
|
|
||||||
# tinygo-compiler copies the compiler build over to a base Go container (without
|
# tinygo-compiler copies the compiler build over to a base Go container (without
|
||||||
# all the build tools etc).
|
# all the build tools etc).
|
||||||
FROM golang:1.21 AS tinygo-compiler
|
FROM golang:1.22 AS tinygo-compiler
|
||||||
|
|
||||||
# Copy tinygo build.
|
# Copy tinygo build.
|
||||||
COPY --from=tinygo-compiler-build /tinygo/build/release/tinygo /tinygo
|
COPY --from=tinygo-compiler-build /tinygo/build/release/tinygo /tinygo
|
||||||
|
|||||||
+3
-1
@@ -256,7 +256,7 @@ ifneq ($(USE_SYSTEM_BINARYEN),1)
|
|||||||
binaryen: build/wasm-opt$(EXE)
|
binaryen: build/wasm-opt$(EXE)
|
||||||
build/wasm-opt$(EXE):
|
build/wasm-opt$(EXE):
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd lib/binaryen && cmake -G Ninja . -DBUILD_STATIC_LIB=ON $(BINARYEN_OPTION) && ninja bin/wasm-opt$(EXE)
|
cd lib/binaryen && cmake -G Ninja . -DBUILD_STATIC_LIB=ON -DBUILD_TESTS=OFF $(BINARYEN_OPTION) && ninja bin/wasm-opt$(EXE)
|
||||||
cp lib/binaryen/bin/wasm-opt$(EXE) build/wasm-opt$(EXE)
|
cp lib/binaryen/bin/wasm-opt$(EXE) build/wasm-opt$(EXE)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -670,6 +670,8 @@ endif
|
|||||||
@$(MD5SUM) test.hex
|
@$(MD5SUM) test.hex
|
||||||
$(TINYGO) build -size short -o test.hex -target=ae-rp2040 examples/echo
|
$(TINYGO) build -size short -o test.hex -target=ae-rp2040 examples/echo
|
||||||
@$(MD5SUM) test.hex
|
@$(MD5SUM) test.hex
|
||||||
|
$(TINYGO) build -size short -o test.hex -target=thumby examples/echo
|
||||||
|
@$(MD5SUM) test.hex
|
||||||
# test pwm
|
# test pwm
|
||||||
$(TINYGO) build -size short -o test.hex -target=itsybitsy-m0 examples/pwm
|
$(TINYGO) build -size short -o test.hex -target=itsybitsy-m0 examples/pwm
|
||||||
@$(MD5SUM) test.hex
|
@$(MD5SUM) test.hex
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
// Version of TinyGo.
|
// Version of TinyGo.
|
||||||
// Update this value before release of new version of software.
|
// Update this value before release of new version of software.
|
||||||
const version = "0.31.0-dev"
|
const version = "0.31.2"
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// This variable is set at build time using -ldflags parameters.
|
// This variable is set at build time using -ldflags parameters.
|
||||||
|
|||||||
+23
-9
@@ -427,7 +427,11 @@ func (r *runner) run(fn *function, params []value, parentMem *memoryView, indent
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, mem, r.errorAt(inst, err)
|
return nil, mem, r.errorAt(inst, err)
|
||||||
}
|
}
|
||||||
methodSetPtr, err := mem.load(typecodePtr.addOffset(-int64(r.pointerSize)), r.pointerSize).asPointer(r)
|
typecodePtrOffset, err := typecodePtr.addOffset(-int64(r.pointerSize))
|
||||||
|
if err != nil {
|
||||||
|
return nil, mem, r.errorAt(inst, err) // unlikely
|
||||||
|
}
|
||||||
|
methodSetPtr, err := mem.load(typecodePtrOffset, r.pointerSize).asPointer(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, mem, r.errorAt(inst, err)
|
return nil, mem, r.errorAt(inst, err)
|
||||||
}
|
}
|
||||||
@@ -473,7 +477,11 @@ func (r *runner) run(fn *function, params []value, parentMem *memoryView, indent
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, mem, r.errorAt(inst, err)
|
return nil, mem, r.errorAt(inst, err)
|
||||||
}
|
}
|
||||||
methodSetPtr, err := mem.load(typecodePtr.addOffset(-int64(r.pointerSize)), r.pointerSize).asPointer(r)
|
typecodePtrOffset, err := typecodePtr.addOffset(-int64(r.pointerSize))
|
||||||
|
if err != nil {
|
||||||
|
return nil, mem, r.errorAt(inst, err)
|
||||||
|
}
|
||||||
|
methodSetPtr, err := mem.load(typecodePtrOffset, r.pointerSize).asPointer(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, mem, r.errorAt(inst, err)
|
return nil, mem, r.errorAt(inst, err)
|
||||||
}
|
}
|
||||||
@@ -636,11 +644,11 @@ func (r *runner) run(fn *function, params []value, parentMem *memoryView, indent
|
|||||||
case llvm.GetElementPtr:
|
case llvm.GetElementPtr:
|
||||||
// GetElementPtr does pointer arithmetic, changing the offset of the
|
// GetElementPtr does pointer arithmetic, changing the offset of the
|
||||||
// pointer into the underlying object.
|
// pointer into the underlying object.
|
||||||
var offset uint64
|
var offset int64
|
||||||
for i := 1; i < len(operands); i += 2 {
|
for i := 1; i < len(operands); i += 2 {
|
||||||
index := operands[i].Uint()
|
index := operands[i].Int()
|
||||||
elementSize := operands[i+1].Uint()
|
elementSize := operands[i+1].Int()
|
||||||
if int64(elementSize) < 0 {
|
if elementSize < 0 {
|
||||||
// This is a struct field.
|
// This is a struct field.
|
||||||
offset += index
|
offset += index
|
||||||
} else {
|
} else {
|
||||||
@@ -654,11 +662,14 @@ func (r *runner) run(fn *function, params []value, parentMem *memoryView, indent
|
|||||||
return nil, mem, r.errorAt(inst, err)
|
return nil, mem, r.errorAt(inst, err)
|
||||||
}
|
}
|
||||||
// GEP on fixed pointer value (for example, memory-mapped I/O).
|
// GEP on fixed pointer value (for example, memory-mapped I/O).
|
||||||
ptrValue := operands[0].Uint() + offset
|
ptrValue := operands[0].Uint() + uint64(offset)
|
||||||
locals[inst.localIndex] = makeLiteralInt(ptrValue, int(operands[0].len(r)*8))
|
locals[inst.localIndex] = makeLiteralInt(ptrValue, int(operands[0].len(r)*8))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ptr = ptr.addOffset(int64(offset))
|
ptr, err = ptr.addOffset(int64(offset))
|
||||||
|
if err != nil {
|
||||||
|
return nil, mem, r.errorAt(inst, err)
|
||||||
|
}
|
||||||
locals[inst.localIndex] = ptr
|
locals[inst.localIndex] = ptr
|
||||||
if r.debug {
|
if r.debug {
|
||||||
fmt.Fprintln(os.Stderr, indent+"gep:", operands, "->", ptr)
|
fmt.Fprintln(os.Stderr, indent+"gep:", operands, "->", ptr)
|
||||||
@@ -756,7 +767,10 @@ func (r *runner) run(fn *function, params []value, parentMem *memoryView, indent
|
|||||||
if inst.opcode == llvm.Add {
|
if inst.opcode == llvm.Add {
|
||||||
// This likely means this is part of a
|
// This likely means this is part of a
|
||||||
// unsafe.Pointer(uintptr(ptr) + offset) pattern.
|
// unsafe.Pointer(uintptr(ptr) + offset) pattern.
|
||||||
lhsPtr = lhsPtr.addOffset(int64(rhs.Uint()))
|
lhsPtr, err = lhsPtr.addOffset(int64(rhs.Uint()))
|
||||||
|
if err != nil {
|
||||||
|
return nil, mem, r.errorAt(inst, err)
|
||||||
|
}
|
||||||
locals[inst.localIndex] = lhsPtr
|
locals[inst.localIndex] = lhsPtr
|
||||||
} else if inst.opcode == llvm.Xor && rhs.Uint() == 0 {
|
} else if inst.opcode == llvm.Xor && rhs.Uint() == 0 {
|
||||||
// Special workaround for strings.noescape, see
|
// Special workaround for strings.noescape, see
|
||||||
|
|||||||
+3
-3
@@ -517,12 +517,12 @@ func (v pointerValue) offset() uint32 {
|
|||||||
// addOffset essentially does a GEP operation (pointer arithmetic): it adds the
|
// addOffset essentially does a GEP operation (pointer arithmetic): it adds the
|
||||||
// offset to the pointer. It also checks that the offset doesn't overflow the
|
// offset to the pointer. It also checks that the offset doesn't overflow the
|
||||||
// maximum offset size (which is 4GB).
|
// maximum offset size (which is 4GB).
|
||||||
func (v pointerValue) addOffset(offset int64) pointerValue {
|
func (v pointerValue) addOffset(offset int64) (pointerValue, error) {
|
||||||
result := pointerValue{v.pointer + uint64(offset)}
|
result := pointerValue{v.pointer + uint64(offset)}
|
||||||
if checks && v.index() != result.index() {
|
if checks && v.index() != result.index() {
|
||||||
panic("interp: offset out of range")
|
return result, fmt.Errorf("interp: offset %d out of range for object %v", offset, v)
|
||||||
}
|
}
|
||||||
return result
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v pointerValue) len(r *runner) uint32 {
|
func (v pointerValue) len(r *runner) uint32 {
|
||||||
|
|||||||
Vendored
+7
@@ -10,6 +10,8 @@ target triple = "x86_64--linux"
|
|||||||
@main.exposedValue1 = global i16 0
|
@main.exposedValue1 = global i16 0
|
||||||
@main.exposedValue2 = global i16 0
|
@main.exposedValue2 = global i16 0
|
||||||
@main.insertedValue = global {i8, i32, {float, {i64, i16}}} zeroinitializer
|
@main.insertedValue = global {i8, i32, {float, {i64, i16}}} zeroinitializer
|
||||||
|
@main.gepArray = global [8 x i8] zeroinitializer
|
||||||
|
@main.negativeGEP = global ptr null
|
||||||
|
|
||||||
declare void @runtime.printint64(i64) unnamed_addr
|
declare void @runtime.printint64(i64) unnamed_addr
|
||||||
|
|
||||||
@@ -88,6 +90,11 @@ entry:
|
|||||||
%agg2 = insertvalue {i8, i32, {float, {i64, i16}}} %agg, i64 5, 2, 1, 0
|
%agg2 = insertvalue {i8, i32, {float, {i64, i16}}} %agg, i64 5, 2, 1, 0
|
||||||
store {i8, i32, {float, {i64, i16}}} %agg2, ptr @main.insertedValue
|
store {i8, i32, {float, {i64, i16}}} %agg2, ptr @main.insertedValue
|
||||||
|
|
||||||
|
; negative GEP instruction
|
||||||
|
%ngep1 = getelementptr [8 x i8], ptr @main.negativeGEP, i32 0, i32 5
|
||||||
|
%ngep2 = getelementptr [8 x i8], ptr %ngep1, i32 0, i32 -3
|
||||||
|
store ptr %ngep2, ptr @main.negativeGEP
|
||||||
|
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
+2
@@ -9,6 +9,8 @@ target triple = "x86_64--linux"
|
|||||||
@main.exposedValue1 = global i16 0
|
@main.exposedValue1 = global i16 0
|
||||||
@main.exposedValue2 = local_unnamed_addr global i16 0
|
@main.exposedValue2 = local_unnamed_addr global i16 0
|
||||||
@main.insertedValue = local_unnamed_addr global { i8, i32, { float, { i64, i16 } } } zeroinitializer
|
@main.insertedValue = local_unnamed_addr global { i8, i32, { float, { i64, i16 } } } zeroinitializer
|
||||||
|
@main.gepArray = local_unnamed_addr global [8 x i8] zeroinitializer
|
||||||
|
@main.negativeGEP = global ptr getelementptr inbounds (i8, ptr @main.negativeGEP, i64 2)
|
||||||
|
|
||||||
declare void @runtime.printint64(i64) unnamed_addr
|
declare void @runtime.printint64(i64) unnamed_addr
|
||||||
|
|
||||||
|
|||||||
@@ -1225,6 +1225,7 @@ func usage(command string) {
|
|||||||
fmt.Fprintln(os.Stderr, " gdb: run/flash and immediately enter GDB")
|
fmt.Fprintln(os.Stderr, " gdb: run/flash and immediately enter GDB")
|
||||||
fmt.Fprintln(os.Stderr, " lldb: run/flash and immediately enter LLDB")
|
fmt.Fprintln(os.Stderr, " lldb: run/flash and immediately enter LLDB")
|
||||||
fmt.Fprintln(os.Stderr, " monitor: open communication port")
|
fmt.Fprintln(os.Stderr, " monitor: open communication port")
|
||||||
|
fmt.Fprintln(os.Stderr, " ports: list available serial ports")
|
||||||
fmt.Fprintln(os.Stderr, " env: list environment variables used during build")
|
fmt.Fprintln(os.Stderr, " env: list environment variables used during build")
|
||||||
fmt.Fprintln(os.Stderr, " list: run go list using the TinyGo root")
|
fmt.Fprintln(os.Stderr, " list: run go list using the TinyGo root")
|
||||||
fmt.Fprintln(os.Stderr, " clean: empty cache directory ("+goenv.Get("GOCACHE")+")")
|
fmt.Fprintln(os.Stderr, " clean: empty cache directory ("+goenv.Get("GOCACHE")+")")
|
||||||
@@ -1437,7 +1438,6 @@ func main() {
|
|||||||
llvmFeatures := flag.String("llvm-features", "", "comma separated LLVM features to enable")
|
llvmFeatures := flag.String("llvm-features", "", "comma separated LLVM features to enable")
|
||||||
cpuprofile := flag.String("cpuprofile", "", "cpuprofile output")
|
cpuprofile := flag.String("cpuprofile", "", "cpuprofile output")
|
||||||
monitor := flag.Bool("monitor", false, "enable serial monitor")
|
monitor := flag.Bool("monitor", false, "enable serial monitor")
|
||||||
info := flag.Bool("info", false, "print information")
|
|
||||||
baudrate := flag.Int("baudrate", 115200, "baudrate of serial monitor")
|
baudrate := flag.Int("baudrate", 115200, "baudrate of serial monitor")
|
||||||
|
|
||||||
// Internal flags, that are only intended for TinyGo development.
|
// Internal flags, that are only intended for TinyGo development.
|
||||||
@@ -1733,17 +1733,19 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
case "monitor":
|
case "monitor":
|
||||||
if *info {
|
config, err := builder.NewConfig(options)
|
||||||
serialPortInfo, err := ListSerialPorts()
|
handleCompilerError(err)
|
||||||
handleCompilerError(err)
|
err = Monitor("", *port, config)
|
||||||
for _, s := range serialPortInfo {
|
handleCompilerError(err)
|
||||||
fmt.Printf("%s %4s %4s %s\n", s.Name, s.VID, s.PID, s.Target)
|
case "ports":
|
||||||
}
|
serialPortInfo, err := ListSerialPorts()
|
||||||
} else {
|
handleCompilerError(err)
|
||||||
config, err := builder.NewConfig(options)
|
if len(serialPortInfo) == 0 {
|
||||||
handleCompilerError(err)
|
fmt.Println("No serial ports found.")
|
||||||
err = Monitor("", *port, config)
|
}
|
||||||
handleCompilerError(err)
|
fmt.Printf("%-20s %-9s %s\n", "Port", "ID", "Boards")
|
||||||
|
for _, s := range serialPortInfo {
|
||||||
|
fmt.Printf("%-20s %4s:%4s %s\n", s.Name, s.VID, s.PID, s.Target)
|
||||||
}
|
}
|
||||||
case "targets":
|
case "targets":
|
||||||
specs, err := compileopts.GetTargetSpecs()
|
specs, err := compileopts.GetTargetSpecs()
|
||||||
|
|||||||
@@ -210,6 +210,10 @@ func runPlatTests(options compileopts.Options, tests []string, t *testing.T) {
|
|||||||
// limited amount of memory.
|
// limited amount of memory.
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
case "gc.go":
|
||||||
|
// Does not pass due to high mark false positive rate.
|
||||||
|
continue
|
||||||
|
|
||||||
case "json.go", "stdlib.go", "testing.go":
|
case "json.go", "stdlib.go", "testing.go":
|
||||||
// Too big for AVR. Doesn't fit in flash/RAM.
|
// Too big for AVR. Doesn't fit in flash/RAM.
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
//go:build thumby
|
||||||
|
|
||||||
|
// This contains the pin mappings for the Thumby.
|
||||||
|
//
|
||||||
|
// https://thumby.us/
|
||||||
|
package machine
|
||||||
|
|
||||||
|
import (
|
||||||
|
"device/rp"
|
||||||
|
"runtime/interrupt"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
THUMBY_SCK_PIN = I2C1_SDA_PIN
|
||||||
|
THUMBY_SDA_PIN = I2C1_SCL_PIN
|
||||||
|
|
||||||
|
THUMBY_CS_PIN = GPIO16
|
||||||
|
THUMBY_DC_PIN = GPIO17
|
||||||
|
THUMBY_RESET_PIN = GPIO20
|
||||||
|
|
||||||
|
THUMBY_LINK_TX_PIN = UART0_TX_PIN
|
||||||
|
THUMBY_LINK_RX_PIN = UART0_RX_PIN
|
||||||
|
THUMBY_LINK_PU_PIN = GPIO2
|
||||||
|
|
||||||
|
THUMBY_BTN_LDPAD_PIN = GPIO3
|
||||||
|
THUMBY_BTN_RDPAD_PIN = GPIO5
|
||||||
|
THUMBY_BTN_UDPAD_PIN = GPIO4
|
||||||
|
THUMBY_BTN_DDPAD_PIN = GPIO6
|
||||||
|
THUMBY_BTN_B_PIN = GPIO24
|
||||||
|
THUMBY_BTN_A_PIN = GPIO27
|
||||||
|
|
||||||
|
THUMBY_AUDIO_PIN = GPIO28
|
||||||
|
|
||||||
|
THUMBY_SCREEN_RESET_PIN = GPIO20
|
||||||
|
)
|
||||||
|
|
||||||
|
// I2C pins
|
||||||
|
const (
|
||||||
|
I2C0_SDA_PIN Pin = NoPin
|
||||||
|
I2C0_SCL_PIN Pin = NoPin
|
||||||
|
|
||||||
|
I2C1_SDA_PIN Pin = GPIO18
|
||||||
|
I2C1_SCL_PIN Pin = GPIO19
|
||||||
|
)
|
||||||
|
|
||||||
|
// SPI pins
|
||||||
|
const (
|
||||||
|
SPI0_SCK_PIN = GPIO18
|
||||||
|
SPI0_SDO_PIN = GPIO19
|
||||||
|
SPI0_SDI_PIN = GPIO16
|
||||||
|
|
||||||
|
SPI1_SCK_PIN = NoPin
|
||||||
|
SPI1_SDO_PIN = NoPin
|
||||||
|
SPI1_SDI_PIN = NoPin
|
||||||
|
)
|
||||||
|
|
||||||
|
// Onboard crystal oscillator frequency, in MHz.
|
||||||
|
const (
|
||||||
|
xoscFreq = 12 // MHz
|
||||||
|
)
|
||||||
|
|
||||||
|
// USB CDC identifiers
|
||||||
|
const (
|
||||||
|
usb_STRING_PRODUCT = "Thumby"
|
||||||
|
usb_STRING_MANUFACTURER = "TinyCircuits"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
usb_VID uint16 = 0x2E8A
|
||||||
|
usb_PID uint16 = 0x0005
|
||||||
|
)
|
||||||
|
|
||||||
|
// UART pins
|
||||||
|
const (
|
||||||
|
UART0_TX_PIN = GPIO0
|
||||||
|
UART0_RX_PIN = GPIO1
|
||||||
|
UART_TX_PIN = UART0_TX_PIN
|
||||||
|
UART_RX_PIN = UART0_RX_PIN
|
||||||
|
)
|
||||||
|
|
||||||
|
// UART on the Thumby
|
||||||
|
var (
|
||||||
|
UART0 = &_UART0
|
||||||
|
_UART0 = UART{
|
||||||
|
Buffer: NewRingBuffer(),
|
||||||
|
Bus: rp.UART0,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
var DefaultUART = UART0
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
UART0.Interrupt = interrupt.New(rp.IRQ_UART0_IRQ, _UART0.handleInterrupt)
|
||||||
|
}
|
||||||
+1
-1
Submodule src/net updated: c134160ae4...a79417481d
@@ -2011,6 +2011,10 @@ func (v Value) Call(in []Value) []Value {
|
|||||||
panic("unimplemented: (reflect.Value).Call()")
|
panic("unimplemented: (reflect.Value).Call()")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (v Value) CallSlice(in []Value) []Value {
|
||||||
|
panic("unimplemented: (reflect.Value).CallSlice()")
|
||||||
|
}
|
||||||
|
|
||||||
func (v Value) Method(i int) Value {
|
func (v Value) Method(i int) Value {
|
||||||
panic("unimplemented: (reflect.Value).Method()")
|
panic("unimplemented: (reflect.Value).Method()")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ type Frame struct {
|
|||||||
|
|
||||||
File string
|
File string
|
||||||
Line int
|
Line int
|
||||||
|
|
||||||
|
Entry uintptr
|
||||||
}
|
}
|
||||||
|
|
||||||
func CallersFrames(callers []uintptr) *Frames {
|
func CallersFrames(callers []uintptr) *Frames {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
//go:build baremetal || (wasm && !wasip1)
|
//go:build baremetal || (wasm && !wasip1) || wasm_unknown
|
||||||
|
|
||||||
// This file emulates some file-related functions that are only available
|
// This file emulates some file-related functions that are only available
|
||||||
// under a real operating system.
|
// under a real operating system.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
//go:build !(baremetal || (wasm && !wasip1))
|
//go:build !(baremetal || (wasm && !wasip1) || wasm_unknown)
|
||||||
|
|
||||||
// This file assumes there is a libc available that runs on a real operating
|
// This file assumes there is a libc available that runs on a real operating
|
||||||
// system.
|
// system.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
//go:build baremetal || js
|
//go:build baremetal || js || wasm_unknown
|
||||||
|
|
||||||
package syscall
|
package syscall
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build baremetal || nintendoswitch || js
|
//go:build baremetal || nintendoswitch || js || wasm_unknown
|
||||||
|
|
||||||
package syscall
|
package syscall
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
"build-tags": ["avr", "baremetal", "linux", "arm"],
|
"build-tags": ["avr", "baremetal", "linux", "arm"],
|
||||||
"goos": "linux",
|
"goos": "linux",
|
||||||
"goarch": "arm",
|
"goarch": "arm",
|
||||||
"gc": "precise",
|
"gc": "conservative",
|
||||||
"linker": "ld.lld",
|
"linker": "ld.lld",
|
||||||
"scheduler": "none",
|
"scheduler": "none",
|
||||||
"rtlib": "compiler-rt",
|
"rtlib": "compiler-rt",
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"inherits": [
|
||||||
|
"rp2040"
|
||||||
|
],
|
||||||
|
"serial-port": ["2e8a:0005"],
|
||||||
|
"build-tags": ["thumby"],
|
||||||
|
"default-stack-size": 8192,
|
||||||
|
"ldflags": [
|
||||||
|
"--defsym=__flash_size=2048K"
|
||||||
|
],
|
||||||
|
"extra-files": [
|
||||||
|
"targets/pico-boot-stage2.S"
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user