Raspberry Pi PicoによるTOPPERS ASP3, FMP3の実行

# 概要

TOPPERSプロジェクトが公開しているオープンソースのリアルタイムOSであるASP3カーネルとFMP3カーネルをRaspberry Pi Picoで実行する方法を解説します。

ASP3カーネルはシングルコア動作、FMP3カーネルはデュアルコア動作をサポートします。

# 必要ハードウェア

- Raspberry Pi Pico
- デバッグアダプタ（デバッガを使う場合）
  - デバッグアダプタ用にもう一台Raspberry Pi Picoを用意するのが一番手軽です。JLink等も使えます。
- USB-UART変換器（オプション）

# 必要ソフトウェア

- ネイティブのビルド環境
- ネイティブのRuby
- ARMv6-Mのクロスビルド環境（いわゆるarm-none-eabi-gcc系）
- シリアルモニタ

# デバッグ環境の準備

## OpenOCDのビルド

デバッガを利用する場合は、公式ガイドGetting started with Raspberry Pi PicoのAppendix Aに従ってOpenOCDをビルドします。

```bash
$ git clone https://github.com/raspberrypi/openocd.git --branch picoprobe --depth=1
$ cd openocd
$ ./bootstrap
$ ./configure --enable-picoprobe --disable-werror --prefix=<path to install>
$ make
$ make install
```

Windows環境の場合はビルドにMYSYS2が必要となるため、以下ページからWindows版のOpenOCDのバイナリをダウンロードして使う方法もあります。

https://qiita.com/yunkya2/items/4e3d89f08b2237ef551f

ただしこちらのバイナリを利用する場合、openocd-w64/share/openocd/scripts/target/rp2040.cfg に下記を追加してください。

```:rp2040.cfg
targets rp2040.core0
```

## デバッグアダプタの接続

Raspberry Pi Picoを二台用意し、片方をデバッグアダプタ（Picoprobe）として利用する場合は、公式ガイドGetting started with Raspberry Pi PicoのAppendix Aに従って配線を行います。

PCとはデバッガ側PicoのUSBによって接続します。

| デバッガ側 | ターゲット側 |
| ---------- | ------------ |
| VBUS       | VBUS         |
| GND        | GND          |
| GP2        | SWCLK        |
| GP3        | SWDIO        |
| GP4        | GP1          |
| GP5        | GP0          |

## デバッガファームウェアの書き込み

Raspberry Pi公式からPicoprobeのUF2イメージをダウンロードします。

（2021/10/19現在、次のリンクからダウンロードできます。 https://datasheets.raspberrypi.com/soft/picoprobe.uf2）

デバッガ側PicoのBOOTSELスイッチを押下しながらPCとUSB接続することで、PCにマスストレージが現れます。

このストレージにPicoprobeのUF2イメージを書き込むことで、Raspberry Pi Picoがデバッグアダプタ兼USB-UART変換器になります。

# カーネルのビルド

TOPPERS公式からASP3もしくはFMP3カーネルのRaspberry Pi Pico簡易パッケージをダウンロードします。

ASP3 https://www.toppers.jp/asp3-e-download.html

FMP3 https://www.toppers.jp/fmp3-e-download.html

サンプルプログラムは以下のようにビルドすることができます。

```bash
# ASP3カーネルの場合
$ mkdir obj
$ cd obj
$ ruby ../configure.rb -T raspberrypi_pico_gcc
$ make
```

```bash
# FMP3カーネルの場合
$ mkdir obj
$ cd obj
$ ruby ../configure.rb -T raspberrypi_pico_gcc -w -S "syslog.o banner.o serial.o logtask.o chip_serial.o"
$ make
```

## Rubyのエラーが出る場合

ASP3ではRubyのバージョンによって以下のようなエラーが発生する可能性があります。

```
$ ruby ../configure.rb -T raspberrypi_pico_gcc
Traceback (most recent call last):
        2: from ../configure.rb:47:in `<main>'
        1: from /usr/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
/usr/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require': cannot load such file -- shell (LoadError)
```

この場合、以下のようにGemをインストールします。

```
$ sudo gem install shell
```

# ターゲットへの書き込み

## Picoprobeを利用する場合

Picoprobeを利用する場合はOpenOCDにPATHを通した後に以下のコマンドで書き込みが行えます。

```bash
$ make run
```

## デバッガを利用しない場合

デバッガなしで実行する場合は、まずELFファイルをUF2ファイルに変換する必要があります。

これを行うには、以下の手順で公式の変換ツールであるelf2uf2をビルドします。

```bash
$ git clone git@github.com:raspberrypi/pico-sdk.git
$ cd pico-sdk/tools/elf2uf2
$ mkdir build
$ cd build
$ cmake ..
$ make
```

ビルドされたelf2uf2にPATHを通した上で（フルパス指定でも良いです）ASP3またはFMP3のビルドディレクトリに戻り、以下のコマンドでUF2ファイルを生成します（WindowsではELFファイルはasp.exeのような名前かもしれません）。

```bash
$ elf2uf2 asp asp.uf2 # ASP3の場合
$ elf2uf2 fmp fmp.uf2 # FMP3の場合
```

Raspberry Pi PicoのBOOTSELスイッチを押下しながらPCとUSB接続することで、PCにマスストレージが現れます。

このストレージに生成されたUF2イメージを書き込むことで、ターゲットにプログラムがダウンロードされます。

# 動作確認

GP0をTX、GP1をRXとしてUARTが動作するので、適当な手段でPCから接続するとサンプルプログラムの出力が見られます。

シリアルポートの設定はデータ8ビット、ストップ1ビット、パリティなし、ボーレート115200bpsです。

サンプルプログラムの動作についてはsample/sample1.cをご覧ください。

デバッグアダプタは以下のように起動します。

```bash
# OpenOCD + Picoprobeの場合
$ openocd -f interface/picoprobe.cfg -f target/rp2040.cfg
# JLinkの場合
$ JLinkGDBServer -device RP2040_M0_0 -if SWD -speed auto -ir -nogui
```

Picoprobeを使う場合はGDBからスレッドとして各コアが見られます。

# USB-UART変換器がない場合

USB-UART変換器がない場合は、Raspberry Pi PicoのUSBをUSB-CDCとして動作させることができます。

公式のSDKとTOPPERS OSを組み合わせ、TOPPERSのシリアルドライバをUSB-CDCで実装するサンプルを用意しました。

ASP3 https://github.com/komori-t/RPi_Pico_ASP3

FMP3 https://github.com/komori-t/RPi_Pico_FMP3

以下のようにしてビルドできます（TOPPERS公式バージョンとはconfigureの引数が異なります）。

```
$ mkdir obj
$ cd obj
$ ruby ../configure.rb -T raspberrypi_pico_gcc -w -S "syslog.o banner.o serial.o logtask.o"
$ make
```

書き込みやデバッグについてはTOPEPRS公式版と同様です。

また、一部SDKの機能を使うこともできます。

利用できる機能については target/raspberrypi_pico_gcc/pico-sdk ディレクトリを参照ください。