4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TinyGo 本体に新しいマイコンボード定義を追加する方法

Last updated at Posted at 2025-12-24

この記事は TinyGo Advent Calendar 2025 25日目の記事です。

TinyGo に自分が使っているマイコンボード対応を追加したい場合どうするか、という話を例とともに説明します。 TinyGo に新しいマイコンやマイコンボード対応を追加するときの難易度は以下のようになるのですが、今回は一番簡単なマイコンボード対応の追加に限って記載します。

  1. 新しい baremetal architecture の追加
    • 非常に難しい
  2. 新しい chip family もしくは vendor の追加
    • ↑ ほどじゃないにしても非常に難しい
  3. 新しい chip の追加
  4. 新しい board の追加

ここでは 4. 新しい board の追加 を見ていきます。

最初にやること : 公式ドキュメントを読む

まず、公式ドキュメントがあるので読みましょう。基本的には Adding a new boardMaking a board PR を見ておけば十分です。

次にやること : 既存のマージ済み PR を確認する

既存のマージ済み PR はたくさんあるので好きなのを読むとよいです。例えば以下を確認するとよいです。

  1. board: add AKIZUKI DENSHI AE-RP2040 #3853
  2. Seeed XIAO support #1170
  3. board: add M5Stack #2280

で、ターゲットとしてどのマイコンボードが簡単か?というと、 2025/12 時点では圧倒的に RP2040 が搭載されたマイコンボード (↑ の 1) が簡単です。理由はブートローダーが全部同じだから、という部分につきます。 ATSAMD21 (↑ の 2) などは、ブートローダー違いによりうまく動かなかったり、というのが存在するので。 ESP32 系もある程度簡単です。

お勧め順 (or 簡単である可能性が高い順) としては以下?

  1. RP2040
  2. nRF52840 / nRF52833
  3. ESP32
  4. ATSAMD51 / ATSAME51 / ATSAMD21

ここでは以下の PR (秋月電子 AE-RP2040 の追加) を例としてみていきます。

秋月電子の AE-2040 とは

秋月電子オリジナルな RP2040 ボードです。 Type-C であるというあたりで使おうかな、と思って PR を作成しました。値段は 2025/12 時点で 700 円と買いやすい金額。

image.png

変更するファイルを確認する

基本的には以下の 3 ファイルを変更します。

  1. GNUmakefile (昔は Makefile という名前でした)
  2. src/machine/baord_XXXX.go
  3. targets/XXXX.go

場合によっては以下も必要になったりしますが、そのようなケースはあきらめるのも一つの手。 QSPI Flash の種類によって設定を調整する必要があります。で、この設定が誤っていると起動失敗することが多い、等の問題が発生します。

  1. 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 などに合わせていくのが基本となります。

ピン配置図は以下にありました。

image.png

実際のソースコード (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 で質問してください。可能な範囲でサポートできます。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?