Commit Graph

2045 Commits

Author SHA1 Message Date
diwamoto 435ddc5f2d machine: add international keys 2025-07-16 17:30:54 +02:00
Ayke van Laethem 778164c98e machine: remove some unnecessary "// peripherals:" comments
These things are specified in the shared chip Go file, not in the board
pin aliases.
2025-07-11 10:28:38 +02:00
Ayke van Laethem b3da00ac1f machine: add I2C pin comments
Similar to PWM, I2C can only be used on some pins. To automatically
generate this information per board, we need to add extra comments that
can then be interpreted by doc-gen for the tinygo.org website.
2025-07-11 10:28:38 +02:00
Ayke van Laethem e454ad1b61 machine: standardize I2C errors with "i2c:" prefix
This probably looks better anyway.
2025-07-11 09:25:48 +02:00
Ayke van Laethem f845b469b1 machine: make I2C usable in the simulator
This fixes/improves a few issues with I2C support:

  * Validate I2C pins, so only pins that are supported by the hardware
    can be used (similar to how it's done with PWM).
  * Add address to Tx API (without it, the simulator can't really
    simulate I2C).
  * Add frequency when configuring. Not currently used, but might be
    useful in the future and adding it now avoids possibly breaking
    changes.

This is a breaking change, but since the simulator doesn't support I2C
yet that seems fine to me. (It does in my local changes, but those need
to be cleaned up before I can push them).
2025-07-11 09:25:48 +02:00
emricks 01f3d3eb59 fix: add SPI and I2C to teensy 4.1 (#4943)
* fix: add SPI and I2C to teensy 4.1
* fix: add SPI3 variables back
* fix: formatting

Signed-off-by: Emrick Sorensen <emrickishere@gmail.com>
2025-07-04 08:46:48 +02:00
Ayke van Laethem 0e43146d32 darwin: add threading support and use it by default 2025-06-30 09:07:54 +02:00
Ayke van Laethem 93f40992c1 internal/task: a few small correctness fixes
This shouldn't affect Linux or MacOS, but it's good to have them fixed.
2025-06-30 09:07:54 +02:00
Elias Naur c6b47fe6a0 rp2: use the correct channel mask for rp2350 ADC; hold lock during read (#4938) 2025-06-29 15:20:58 -03:00
Elias Naur 536deaa00a rp2: disable digital input for analog inputs
This is what the Pico SDK does[0] and may fix #4936.

[0] https://github.com/raspberrypi/pico-sdk/blob/ee68c78d0afae2b69c03ae1a72bf5cc267a2d94c/src/rp2_common/hardware_adc/include/hardware/adc.h#L101
2025-06-28 09:34:06 +02:00
Ayke van Laethem e238eb2242 rp2040: add multicore support 2025-06-13 16:19:10 +02:00
Ayke van Laethem 5625f68d51 runtime: don't lock the print output inside interrupts
This should avoid a deadlock when trying to print inside an interrupt,
if the interrupted code is also printing (and therefore has the print
lock taken).
2025-06-13 16:19:10 +02:00
Ayke van Laethem f7d8502572 runtime: don't try to interrupt other cores before they are started
The GC shouldn't try to interrupt other cores before they are started.
For example, it would be possible for the GC to run in a package
initializer (which is currently run on a single core). That would
suggest questionable program design, but it is something that should
work. So this commit makes sure the GC only tries to scan the stack of
other cores when those other cores have in fact started.
2025-06-13 16:19:10 +02:00
Ayke van Laethem e395c94e5f runtime: implement NumCPU for the multicore scheduler
I forgot to add it in the first PR, here:
https://github.com/tinygo-org/tinygo/pull/4851
2025-06-13 16:19:10 +02:00
Ayke van Laethem c08b2dfe06 wasm: add Boehm GC support
This adds support for `-gc=boehm` on `-target=wasip1` and `-target=wasm`
(in a browser or NodeJS). Notably it does *not* add Boehm GC support for
`-target=wasip2`, since that target doesn't have a real libc.
2025-06-13 14:42:23 +02:00
Ayke van Laethem 60f8a62978 all: add support for multicore scheduler
This commit adds support for a scheduler that runs a scheduler on all
available cores. It is meant to be used on baremetal systems with a
fixed number of cores, such as the RP2040.

The initial implementation adds support for multicore scheduling to the
riscv-qemu target as a convenient testing target. This means that this
new multicore scheduler is tested in CI, including a bunch of standard
library tests (`make tinygo-test-baremetal`). This should ensure the new
scheduler is reasonably well tested before trying to use it on
harder-to-debug targets like the RP2040.
2025-06-12 21:04:36 +02:00
Ayke van Laethem 0c7c2926f9 runtime: refactor obtaining the system stack
The system stack is only needed when we're not on it. So we can directly
call task.SystemStack() without problems.

This also saves a tiny bit of binary size.
2025-06-12 21:04:36 +02:00
Ayke van Laethem 3a2188fc7b runtime/interrupt: add Checkpoint type
This type can be used to jump back to a previous position in a program
from inside an interrupt. This is useful for baremetal systems that
implement wfi but not wfe, and therefore have no easy (race-free) way to
wait until a flag gets changed inside an interrupt. This is an issue on
RISC-V, where this is racy (the interrupt might happen after the check
but before the wfi instruction):

    configureInterrupt()
    for flag.Load() != 0 {
        riscv.Asm("wfi")
    }
2025-06-12 21:04:36 +02:00
Ayke van Laethem 64a30424da runtime: add exportedFuncPtr
This function isn't used yet, but will be used for the "cores" scheduler
for RISC-V.
2025-06-12 21:04:36 +02:00
Ayke van Laethem 525c41bac9 sync: fix TestMutexConcurrent test
Accessing the same variable from multiple goroutines is unsafe, and will
fail with parallelism. A lightweight way to avoid issues is by using
atomic variables.
2025-06-12 21:04:36 +02:00
Piotr Bocheński 83de8ff77d net: update submodule to latest commits
And fix module definition pointing to `dev` branch by default.

Signed-off-by: Piotr Bocheński <piotr@bochen.ski>
2025-06-12 14:02:44 +02:00
Ömer Faruk IRMAK f19b288717 runtime/debug: add GC related stubs 2025-06-11 09:57:46 +02:00
Ömer Faruk IRMAK 7c54dbc61f metrics: flesh out some of the metric types 2025-06-11 09:57:46 +02:00
Ömer Faruk IRMAK 1976d9e3fe reflect: Chan related stubs 2025-06-11 09:57:46 +02:00
Michael Smith 87153e9a02 usb: add USB mass storage class support 2025-06-11 07:46:02 +02:00
Michael Smith ba274008d5 machine: implement usb receive message throttling 2025-06-11 07:46:02 +02:00
Michael Smith b059de857c machine: declare usb endpoints per-platform 2025-06-11 07:46:02 +02:00
Ella Fox 888d957f60 machine: Add board support for BigTreeTech SKR Pico (#4842)
* machine: add support for BTT SKR Pico
Adds support for the BigTreeTech SKR Pico 3D-printer mainboard.
This board uses the RP2040.
* Fix build tag
* Add I2C defaults
* Run UART test instead of blinky1
* Use NoPin for I2C and SPI on BTT SKR Pico
* Cleanup comments
* Don't use ADC pin names
2025-06-01 18:15:57 +02:00
Mateusz Nowak f69c579005 machine/samd21: implement watchdog 2025-05-25 10:01:43 +02:00
Mateusz Nowak 5c35bad590 machine/samd51: write to flash memory in 512 byte long chunks 2025-05-24 11:45:29 +02:00
Rolf Sommerhalder c1bff3dad0 Fix DMA to SPI transmits on RP2350 (#4903)
* Fix DMA to SPI transfers on RP2350

DMA DREQ line numbers for "flow control" between SPI bus and DMA channels on RP2350 differ from RP2040.
Tested with st7789 driver for Pico-1.14-LCD from Waveshare on Pico 2W. Without this fix func st7789.tx() blocks indefinitely while attempting to use DMA to SPI transfers.

* Add definitions for DMA DREQ "handshake" lines

Specific for RP2350, missing in generated src/device/rp/rp2350.go

* Add definitions for DMA DREQ "handshake" lines

Specific for RP2040, missing in generated src/device/rp/rp2040.go

* Complete table

* Complete table

* Remove redundant DMA_ prefix

* Correct name of Datasheet

* Correct name of Datasheet

* Refactor

Move global definitions to device/rp/

* Refactor

* Refactor

* Refacture

* Refacture

* Fix comments

* go fmt

* rename new non-generated files
2025-05-24 10:16:58 +02:00
Mateusz Nowak 3eeffca841 machine/samd21: write to flash memory in 64 byte long chunks 2025-05-23 11:29:53 +02:00
Elias Naur 704489ed6d runtime: update comment
I forgot to change the comment in PR #4890.
2025-05-22 09:29:50 +02:00
Ayke van Laethem 9ca6f72583 wasm: refactor/modify stub signal handling
This commit changes signal handling in a few ways:

  * It stubs signals for all wasm targets (not just wasi) and baremetal,
    since none of those have traditional POSIX signals. And moves the
    code for that into a single file, instead of duplicating it.
  * It removes the stub for signal_ignored since the value `false` might
    be wrong in some cases and it doesn't usually seem to be called (it
    is not called in tsgo). Should be trivial to re-add if it is shown
    to be needed.
  * It adds a stub for `os/signal.signalWaitUntilIdle` which _is_ called
    by tsgo.
2025-05-21 20:04:05 +02:00
Ayke van Laethem 584098dfda machine: don't inline RTT WriteByte everywhere
With `-opt=2`, WriteByte gets inlined everywhere a println statement
exists. This blows up binary size for very little gain. In my case, the
binary size roughly doubled. Instead, don't inline it so that the binary
size remains somewhat reasonable. This might slow down WriteByte a tiny
bit, but likely not by any significant amount.
2025-05-21 16:49:21 +02:00
Elias Naur 180662f038 runtime: avoid an allocation in (*time.Timer).Reset 2025-05-16 12:36:14 +02:00
Elias Naur 2da9d26e21 machine/rp2: unexport machine-specific errors
Errors are part of API, and the exported rp2 errors seemed arbitrary.
For example, the very particular ErrRP2040I2CDisable was exported, but
errI2CWriteTimeout (which is defined on all platforms) is not.

While here, remove "RP2040" from an error name and make the messages
consistent and idiomatic.
2025-05-12 12:11:01 +02:00
Elias Naur d840971c42 machine: [rp2] discount scheduling delays in I2C timeouts (#4876)
The `gosched` call introduce arbitrary long delays in general, and in
TinyGo particular because the goroutine scheduler is cooperative and
doesn't preempt busy (e.g. compute-heavy) goroutines.

Before this change, the timeout logic would read, simplified:

  deadline := now() + timeout
  startTX()
	for !txDone() {
	   if now() > deadline { return timeoutError }
		 gosched() // (1)
	}
  startRx() // (2)
	for !rxDone() {
	   // (3)
	   if now() > deadline { return timeoutError }
		 gosched()
	}

What could happen in a busy system is:

- The gosched marked (1) would push now() to be > than deadline.
- startRx is called (2), but the call to rxDone immediately after would
report it not yet done.
- The check marked (3) would fail, even though only a miniscule amount
of time has passed between startRx and the check.

This change ensures that the timeout clock discounts time spent in
`gosched`. The logic now reads, around every call to `gosched`:

  deadline := now() + timeout
  startTX()
	for !txDone() {
	   if now() > deadline { return timeoutError }
		 before := now()
		 gosched()
		 deadline += now() - before
	}

I tested this change by simulating a busy goroutine:

	go func() {
		for {
      // Busy.
			before := time.Now()
			for time.Since(before) < 100*time.Millisecond {
			}
      // Sleep.
			time.Sleep(100 * time.Millisecond)
		}
	}()

and testing that I2C transfers would no longer time out.
2025-05-06 21:42:16 -03:00
Damian Gryski ba3b3e8938 runtime: stub runtime signal functions for os/signal on wasip1 2025-05-06 13:20:30 +02:00
Ayke van Laethem edaf877056 machine: use pointer receiver in simulated PWM peripherals
I only discovered this issue after a while. All the baremetal PWM
implementations use pointers to a PWM instance, instead of the PWM
instance itself. For consistency (and because it's a better idea in
general), the simulated PWMs need to work the same.
2025-05-01 15:08:08 +02:00
Damian Gryski 45743406d0 os: handle relative and abs paths in Executable() 2025-05-01 10:53:49 +02:00
Damian Gryski 5428bfd270 runtime,os: add os.Executable() for Darwin 2025-05-01 10:53:49 +02:00
Ayke van Laethem 72b19555dc machine: add simulated PWM/timer peripherals
I will soon use these as part of the TinyGo tour, to explain the PWM
peripherals on common chips.
2025-04-30 19:44:34 +02:00
Ayke van Laethem 612a38e363 wasm: don't block //go:wasmexport because of running goroutines
This fixes bug https://github.com/tinygo-org/tinygo/issues/4874.
2025-04-29 14:19:17 +02:00
Ayke van Laethem aa63f26f36 windows: use MSVCRT.DLL instead of UCRT on i386
This allows the binaries to run on Windows XP, without needing any extra
DLLs. Tested in an x86 Windows XP SP3 virtual machine.
2025-04-22 17:45:29 +02:00
Ayke van Laethem f542717992 windows: add windows/386 support 2025-04-22 17:45:29 +02:00
Michael Smith febb3906db machine/rp2: expose usb endpoint stall handling 2025-04-17 10:15:44 +02:00
Elias Naur 0f06f59c6e device/arm: clear pending interrupts before enabling them
Without this change, a pending interrupt would spuriously trigger
immediately after enabling. This happens if an interrupt is triggered
during flashing (e.g. by DMA), which survives the subsequent reset.

This behaviour matches e.g. `machine.irqSet` in machine_rp2_rp2350.go.

See 7f970a45, whose symptoms were likely caused by spurious interrupts.
2025-04-16 09:43:23 +02:00
Michael Smith 133e32c1c4 machine/rp2: merge common usb code (#4856)
* machine/rp2: merge common usb code
* chore: add note on noinline reason
2025-04-15 11:07:47 +02:00
Ayke van Laethem 41e501aaf4 runtime: move timeUnit to a single place
The timeUnit is now the same type everywhere. Move it to a single place
and add some documentation to it.
2025-04-15 09:23:23 +02:00