この記事は TinyGo Advent Calendar 2025 25日目の記事です。
TinyGo に自分が使っているマイコンボード対応を追加したい場合どうするか、という話を例とともに説明します。 TinyGo に新しいマイコンやマイコンボード対応を追加するときの難易度は以下のようになるのですが、今回は一番簡単なマイコンボード対応の追加に限って記載します。
- 新しい baremetal architecture の追加
- 非常に難しい
- 新しい chip family もしくは vendor の追加
- ↑ ほどじゃないにしても非常に難しい
- 新しい chip の追加
- だいぶ簡単になってきたけど割と大変 (より小さな chip になる場合は簡単)
例1: Seeed WioTerminal support #1124
例2: atsame54: add initial support for atsame54-xpro #1806
- だいぶ簡単になってきたけど割と大変 (より小さな chip になる場合は簡単)
- 新しい board の追加
- 多くの場合、簡単
例1: board: add AKIZUKI DENSHI AE-RP2040 #3853
例2: Seeed XIAO support #1170
例3: board: add M5Stack #2280
- 多くの場合、簡単
ここでは 4. 新しい board の追加 を見ていきます。
最初にやること : 公式ドキュメントを読む
まず、公式ドキュメントがあるので読みましょう。基本的には Adding a new board と Making a board PR を見ておけば十分です。
次にやること : 既存のマージ済み PR を確認する
既存のマージ済み PR はたくさんあるので好きなのを読むとよいです。例えば以下を確認するとよいです。
で、ターゲットとしてどのマイコンボードが簡単か?というと、 2025/12 時点では圧倒的に RP2040 が搭載されたマイコンボード (↑ の 1) が簡単です。理由はブートローダーが全部同じだから、という部分につきます。 ATSAMD21 (↑ の 2) などは、ブートローダー違いによりうまく動かなかったり、というのが存在するので。 ESP32 系もある程度簡単です。
お勧め順 (or 簡単である可能性が高い順) としては以下?
- RP2040
- nRF52840 / nRF52833
- ESP32
- ATSAMD51 / ATSAME51 / ATSAMD21
ここでは以下の PR (秋月電子 AE-RP2040 の追加) を例としてみていきます。
秋月電子の AE-2040 とは
秋月電子オリジナルな RP2040 ボードです。 Type-C であるというあたりで使おうかな、と思って PR を作成しました。値段は 2025/12 時点で 700 円と買いやすい金額。
変更するファイルを確認する
基本的には以下の 3 ファイルを変更します。
- GNUmakefile (昔は Makefile という名前でした)
- src/machine/baord_XXXX.go
- targets/XXXX.go
場合によっては以下も必要になったりしますが、そのようなケースはあきらめるのも一つの手。 QSPI Flash の種類によって設定を調整する必要があります。で、この設定が誤っていると起動失敗することが多い、等の問題が発生します。
- targets/XXXX-boot-stage2.S
ということで順番に見ていきます。なお、tinygo flash -target=ae-rp2040 というような形で実行 したい 場合は、 XXXX の部分は ae-rp2040 になります。以下では ae-rp2040 を例として説明します。なお、ビルドタグには - が使用できないので、かわりに _ を使う必要があるので注意してください。
targets/ae-rp2040.json
ビルドの設定を書きます。 RP2040 を搭載するマイコンボードの場合は、原則として以下でよいです。変更するべきところにはコメントを入れました (が、実際にはコメントは使えないので注意)。
{
"inherits": [
"rp2040"
],
"build-tags": ["ae_rp2040"], // `-` は使えないので `_` にしておく
"serial-port": ["2e8a:000A"], // 元の設定や Arduino の設定と同じ値に設定する
"ldflags": [
"--defsym=__flash_size=2048K" // マイコンボードに合わせて設定する
],
"extra-files": [
"targets/pico-boot-stage2.S" // ここがちょっと難しいので後述
]
}
困ったら以下を参考にするのがよさそう。
When adding RP2040 boards in the future, it is better to check the following
https://github.com/raspberrypi/pico-sdk/tree/master/src/boards/include/boards
target/pico-boot-stage2.S について
2025/12 時点では以下があります。とりあえず pico-boot-stage2.S を試してうまくいかなかったら順番に試す、ぐらいでよいかもしれません。
targets/pico-boot-stage2.S
targets/feather-rp2040-boot-stage2.S
targets/macropad-rp2040-boot-stage2.S
targets/qtpy-rp2040-boot-stage2.S
targets/trinkey-qt2040-boot-stage2.S
この部分は Arduino などのソースを参考することができるので、以下を参考にするとよさそう。
When adding RP2040 boards in the future, it is better to check the following
https://github.com/raspberrypi/pico-sdk/tree/master/src/boards/include/boards
src/machine/board_ae_rp2040.go
ピン定義などを足していきます。ここでも基本的にはピン配置図があればそれに合わせていきます。名前で困ったら Arduino などに合わせていくのが基本となります。
ピン配置図は以下にありました。
実際のソースコード (v0.40.1 時点) は以下です。雰囲気で合わせこんでいくとよいでしょう。
//go:build ae_rp2040
package machine
// GPIO pins
const (
GP0 Pin = GPIO0
GP1 Pin = GPIO1
GP2 Pin = GPIO2
GP3 Pin = GPIO3
GP4 Pin = GPIO4
GP5 Pin = GPIO5
GP6 Pin = GPIO6
GP7 Pin = GPIO7
GP8 Pin = GPIO8
GP9 Pin = GPIO9
GP10 Pin = GPIO10
GP11 Pin = GPIO11
GP12 Pin = GPIO12
GP13 Pin = GPIO13
GP14 Pin = GPIO14
GP15 Pin = GPIO15
GP16 Pin = GPIO16
GP17 Pin = GPIO17
GP18 Pin = GPIO18
GP19 Pin = GPIO19
GP20 Pin = GPIO20
GP21 Pin = GPIO21
GP22 Pin = GPIO22
GP26 Pin = GPIO26
GP27 Pin = GPIO27
GP28 Pin = GPIO28
GP29 Pin = GPIO29
// Onboard crystal oscillator frequency, in MHz.
xoscFreq = 12 // MHz
)
// I2C Default pins on Raspberry Pico.
const (
I2C0_SDA_PIN = GP4
I2C0_SCL_PIN = GP5
I2C1_SDA_PIN = GP2
I2C1_SCL_PIN = GP3
)
// SPI default pins
const (
// Default Serial Clock Bus 0 for SPI communications
SPI0_SCK_PIN = GPIO18
// Default Serial Out Bus 0 for SPI communications
SPI0_SDO_PIN = GPIO19 // Tx
// Default Serial In Bus 0 for SPI communications
SPI0_SDI_PIN = GPIO16 // Rx
// Default Serial Clock Bus 1 for SPI communications
SPI1_SCK_PIN = GPIO10
// Default Serial Out Bus 1 for SPI communications
SPI1_SDO_PIN = GPIO11 // Tx
// Default Serial In Bus 1 for SPI communications
SPI1_SDI_PIN = GPIO12 // Rx
)
// UART pins
const (
UART0_TX_PIN = GPIO0
UART0_RX_PIN = GPIO1
UART1_TX_PIN = GPIO8
UART1_RX_PIN = GPIO9
UART_TX_PIN = UART0_TX_PIN
UART_RX_PIN = UART0_RX_PIN
)
var DefaultUART = UART0
// USB identifiers
const (
usb_STRING_PRODUCT = "AE-RP2040"
usb_STRING_MANUFACTURER = "AKIZUKI DENSHI"
)
var (
usb_VID uint16 = 0x2E8A
usb_PID uint16 = 0x000A
)
GNUmakefile
ビルドできることを最低限確認するため smoketest に追加します。 v0.40.1 時点では以下のような形になります。 PR の例として示した時点とは異なっていますが、読み替えてください。
smoketest: testchdir
(省略)
$(TINYGO) build -size short -o test.hex -target=ae-rp2040 examples/echo
@$(MD5SUM) test.hex
(省略)
PR を作成する
上記が完了し動作確認を行い、 make smoketest も実行できるようになったら Pull Request を作成しましょう。 PR には最低限以下を書くべきだと (私は) 思っています。
- マイコンボードの情報
- ボード名
- 製造元
- 回路図
- ピン配置図
- オフィシャルの URL
- マニュアル等あれば
- チップの情報
- チップ名
- Clock / ROM / RAM などの情報
- datasheet 等
- 各種参考情報 (あれば
例としては以下。
* Board
* Name
* AE-RP2040
* Board developer / designer / manufacturer
* AKIZUKI DENSHI
* schematic
* https://akizukidenshi.com/download/ds/akizuki/AE_RP2040_schematic.pdf
* pinout and stuff
* https://akizukidenshi.com/download/ds/akizuki/AE_RP2040_pins.pdf
* URL
* https://akizukidenshi.com/catalog/g/gK-17542/
* User manual for the board (if it exists)
* -
* Chip
* chip name
* RP2040
* Clock / ROM / RAM size
* 125MHz (133 MHz) / 2048 KB / 264 KB
* datasheet URL of the chip
* https://akizukidenshi.com/download/ds/raspberry/rp2040-datasheet.pdf
* URL of the source, such as arduino (if it exists)
* -
まとめ
ということで、マイコンボードを追加するための情報をまとめました。 TinyGo にコントリビュートしてみたい、特に PR を出したい場合はマイコンボード追加がおすすめです。是非チャレンジしてみてください。
なお、いきなり PR を出すのは不安、とか、作ってみたけどうまくいかない、等は X/Twitter や Discord で質問してください。可能な範囲でサポートできます。
- X/Twitter : https://x.com/sago35tk
- Discord (TinyGo Keeb) : https://discord.gg/rQU58PTDD2

