NuttX を WSL 上でコンパイルし Raspberry Pi Pico にインストールする

NuttX を WSL 上でコンパイルし Raspberry Pi Pico へインストールします。NuttX へは USB シリアル経由で Windows からアクセスできます。主には NuttX 本家の [Getting Started](https://nuttx.apache.org/docs/latest/quickstart/index.html) を参照しています。また、Pico SDK をインストールする必要がありますがバージョンは 1.1.2 である必要があります。([参照](https://www.mail-archive.com/dev@nuttx.apache.org/msg07224.html))

# WSL で Ubuntu をインストール

WSL への Ubuntu インストール方法は割愛します。他の Web の情報を参照してください。ここでは、Ubuntu 20.04 を前提としています。インストール後はパッケージを最新のものにアップデートしてください。

```
$ sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove --purge -y
```

# 必要なソフトウェアのインストール

[ここ](https://nuttx.apache.org/docs/latest/quickstart/install.html) の手順に従い必要なソフトウェアのインストールを行います。比較的容量が大きいため時間がかかるかもしれません。

```
$ sudo apt install bison flex gettext texinfo libncurses5-dev libncursesw5-dev gperf automake libtool pkg-config build-essential gperf genromfs libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux -y
# sudo apt install kconfig-frontends -y
# sduo apt install gcc-arm-none-eabi binutils-arm-none-eabi -y
```

# Raspberry Pi Pico SDK のインストール

NuttX はブートローダーに Raspberry Pi Pico SDK を使用しています。[ここ](https://www.mail-archive.com/dev@nuttx.apache.org/msg07226.html) に説明がありますが、現時点では NuttX は最新の Raspberry Pi Pico SDK (e.g. 1.3.0) には対応していないため 1.1.2 をインストールする必要があります。

Raspberry Pi Pico SDK のインストールは以下のように行います。環境変数 PICO_SDK_PATH で pico-sdk の場所を指定する必要があります。

```
$ mkdir ~/pico
$ cd ~/pico
$ git clone -b1.1.2 https://github.com/raspberrypi/pico-sdk.git
$ export PICO_SDK_PATH=$HOME/pico/pico-sdk
$ echo "export PICO_SDK_PATH=$HOME/pico/pico-sdk" >> .bashrc
```

# NuttX のダウンロード

NuttX をダウンロードします。現行の NuttX では Raspberry Pi Pico へのシリアル USB 経由での接続をサポートしているようです。

```
$ mkdir ~/nuttx
$ cd ~/nuttx
$ git clone https://github.com/apache/incubator-nuttx.git nuttx
$ git clone https://github.com/apache/incubator-nuttx-apps apps
$ cd nuttx
$ ./tools/configure.sh -L | grep pico
  raspberrypi-pico:lcd1602
  raspberrypi-pico:composite
  raspberrypi-pico:displaypack
  raspberrypi-pico:smp
  raspberrypi-pico:st7735
  raspberrypi-pico:usbmsc
  raspberrypi-pico:nshsram
  raspberrypi-pico:usbnsh
  raspberrypi-pico:enc28j60
  raspberrypi-pico:waveshare-lcd-1.14
  raspberrypi-pico:audiopack
  raspberrypi-pico:spisd
  raspberrypi-pico:ssd1306
  raspberrypi-pico:nsh
  raspberrypi-pico:waveshare-lcd-1.3
```

# NuttX のコンパイル

NuttX のコンパイルは次のように行います。恐らくは数分でコンパイルが終わると思います。コンパイルが成功すると最後に nuttx.uf2 と言う名前の Raspberry Pi Pico 用の UF2 ファイルが作成されます。

```
$ ./tools/configure.sh -l raspberrypi-pico:usbnsh
$ make
<snip>
tools/rp2040/elf2uf2 nuttx nuttx.uf2;
Done.
```

# uf2 ファイルを Raspberry Pi Pico へコピー

Windows から WSL 上のファイルにアクセスするにはエクスプローラーからまず \\wsl$ へアクセスします。さらに Ubuntu > home > [ユーザー名] > nuttx > nuttx 辿っていくと上記のステップで作成された nuttx.uf2 が見つかります。

Raspberry Pi Pico を BOOTSEL ボタンを押しながらパソコンと USB 接続を行います。Raspberry Pi Pico がディスクとして認識されるのでこのディスクに nuttx.uf2 をコピーします。

# Windows から NuttX (Raspberry Pi Pico) にシリアル接続する

nuttx.uf2 をコピーすると Raspberry Pi Pico は自動的に再起動し COM8 などの USB シリアルデバイスとして認識します。このシリアルポートに Tera Term などを使用し接続し速度を 115200 と指定します。何度か Enter キーを押してみて以下のような出力が返ってくれば成功です。

```
NuttShell (NSH) NuttX-10.2.0
nsh>
```

上記出力がされない場合は何度か Tera Term などから接続し直して見たりしてください。

# NuttX のコマンドを実行してみる

help と打つと使用できるコマンドの一覧が表示されます。例えば uname -a を実行すると NuttX のバージョンが表示されます。

```
nsh> help
help usage:  help [-v] [<cmd>]

  .         cd        df        free      mkrd      reboot    test      unset
  [         cp        echo      help      mount     rm        time      usleep
  ?         cmp       env       hexdump   mv        rmdir     true      xd
  basename  dirname   exec      kill      printf    set       truncate
  break     date      exit      ls        ps        sleep     uname
  cat       dd        false     mkdir     pwd       source    umount

Builtin Apps:
  sh        getprime  ostest    hello     nsh
nsh> uname -a
NuttX 10.2.0 c96c96a399 Mar 13 2022 19:56:58 arm raspberrypi-pico
```

デフォルトでは最小限のコマンドのみ使用できます。

[ここ](https://nuttx.apache.org/docs/latest/quickstart/configuring.html) などに説明がありますが ~/nuttx/nuttx で make menuconfig を実行すると表情に多くの設定項目が出てきます。git コマンドで clons した apps にあるアプリケーションもここから設定ができます。

例えば以下の様に VI Work-Alike Text Editor をチェックし新しく作成された nuttx.uf2 を Raspberry Pi Pico にコピーしてみます。尚、unzip が必要だったため make menuconfig の前にインストールしています。

```
$ apt get install unzip -y
$ cd ~/nuttx/nuttx
# make menuconfig
Application Configuration  --->
System Libraries and NSH Add-Ons --->
VI Work-Alike Text Editor をチェックし Exit
```

上記を実行すると help で vi コマンドが表示されます。このままだとファイルの保存はできませんが vi コマンドを実行すると vi の一部操作ができるエディタが起動します。尚、このソースコードは $HOME/nuttx/apps/system/vi にあります。

```
nsh> help
<snip>
Builtin Apps:
  vi        sh        getprime  ostest    hello     nsh
```

make menuconfig にはネットワーク用の設定もあり Raspberry Pi Pico をネットワークに接続して遊んでみるのも面白いかもです。

# 参照
[NuttX Getting Started](https://qiita.com/drafts/3e73fcaab597074b1d61/edit)
[dev@nuttx.apache.org (ML) - RE: Raspberry Pi Pico Not Responing](https://www.mail-archive.com/dev@nuttx.apache.org/msg07224.htmlf)
[NuttX for Raspberry Pi PicoのUSBデバイスサポート](https://qiita.com/yunkya2/items/a06f5033598e96b6b0cb)
[【NuttX】ラズパイPicoにOSをインストールしてみた！](https://www.youtube.com/watch?v=zz_Z2tBOVvI&t=0s)