Raspberry Pi Pico W と Rust でＬチカをする

## はじめに
Raspberry Pi Pico W（以降ラスピコW）のオンボードLEDを動かすには少し手間がかかります。
私がLチカしようとしたときに少しつまるところはあったので、動くものとしてここに供養しておきます。
私は未だ入門者なので、どんどん改変して使っていただけたらと思います。


## Lチカに詰まったポイント
- オンボードのLEDに繋がるピン`WL-GPIO0`は無線チップに繋がっている。
データシートは[こちら](https://datasheets.raspberrypi.com/picow/pico-w-datasheet.pdf)
- 無線チップの制御に[embassy](https://github.com/embassy-rs/embassy/tree/main)という開発中のドライバを導入する必要がある。
- 開発中という理由のためかクレートが[crates.io](https://crates.io/)にないので、ドライバの導入は手動で行う必要がある。（2023/7/15現在）

### 実行環境
Windows 10
VS Code

# Lチカまでの手順
### Rustのインストール
Rustは[公式サイト](https://www.rust-lang.org/ja/tools/install)からインストールしてください。

### クロスコンバイラをインストール
```
$ rustup target install thumbv6m-none-eabi
```

### ユーティリティをインストール
```
$ cargo install elf2uf2-rs flip-link probe-run
```
今回probeによるデバッグ環境がないのでelf2uf2-rsをランナーとして使用します。

### プロジェクトの作成
プロジェクトを新しく作成します。
プロジェクト名`sample-project`のところは自由に決めてください。
```
$ cargo new sample-project --bin
```
--binオプションを渡すことで、ライブラリではなく実行可能なバイナリが作成されます。

### ライブラリの導入
lib/ 配下にembassyライブラリをダウンロードすることとします。
```
$ mkdir lib
$ cd lib
$ git clone https://github.com/embassy-rs/embassy.git
$ cd ..
```
ダウンロードが終了すると `lib/embassy/examples/rp/` にラズピコ用のサンプルコードが表れます。
今回はここにあるものを拝借していきます。

<!-- 書く予定の内容
必要そうなのをコピーする。
Cargo.tomlを書き換える
.cargo/config.tomlのrunnerを変更する
rust-toolchain.toml をコピーする。
-->

### なんか必要そうなファイルをとってくる
`lib/embassy/examples/rp/`から自分のプロジェクトのディレクトリに必要そうなファイルをコピーします。
どれが何に必要なのか理解していませんが、コピーすれば動くのでよし。
以下のファイル（フォルダ）をプロジェクトのルートディレクトリにコピーしてください。
上4つは`lib/embassy/examples/rp/`に最後は`lib/embassy/`にあります。

- .cargo/
- assets/
- build.rs
- memory.x
- rust-toolchain.toml

Windowsの方は以下をどうぞ。
```
$ xcopy ".\lib\embassy\examples\rp\.cargo\" ".\.cargo\" /E /I /H
$ xcopy ".\lib\embassy\examples\rp\assets\" ".\assets\" /E /I /H
$ copy ".\lib\embassy\examples\rp\build.rs" ".\build.rs"
$ copy ".\lib\embassy\examples\rp\memory.x" ".\memory.x"
$ copy ".\lib\embassy\rust-toolchain.toml" ".\rust-toolchain.toml"
```

### Cargo.toml の書き換え
`lib/embassy/examples/rp/Cargo.toml`の8行目に[dependencies]とあります。
それ以降を全選択し、自分のプロジェクトの`Cargo.toml`にペーストしてください。

このままではパスの指定が間違っているのでうまくライブラリを読み込めません。
9行目`embassy-embedded-hal`から24行目`cyw43-pio`までの`path`を以下のように修正します。
```
embassy-embedded-hal = { version = "0.1.0", path = "../../embassy-embedded-hal", features = ["defmt"] }
↓
embassy-embedded-hal = { version = "0.1.0", path = "lib/embassy/embassy-embedded-hal", features = ["defmt"] }
```
これは、9行目から24行目の全てのパスに対して行ってください。
VS Codeをお使いの場合は`Ctrl + D`を使うと楽です。

### Config.toml の書き換え
書き込みに使う`runner`を書き換えます。
```
runner = "probe-rs run --chip RP2040"
↓
runner = "elf2uf2-rs -d"
```
probeを使わない場合に下のランナーを使用してください。
（使うとしても上のやつprube-runではないのかな...？）

### デモコードのビルド&書きこみ

<!-- 書く予定の内容
サンプルコード wifi_blinky をsrc/binにコピーする。
$ cargo run --bin wifi_blinky
--bin: バイナリ指定
-->
サンプルコードの`wifi_blinky`をコピーします。
examplesに習って`src/bin/`配下にコードを配置します。
```
$ cd src
$ mkdir bin
$ copy "..\lib\embassy\examples\rp\src\bin\wifi_blinky.rs" ".\bin\"
```
`wifi_blinky`は、無線チップからLEDの制御を行うプログラム。
コード解説などは出来ません。

コード内にもパスを指定している箇所があるので変更して書き換えてください。
```
30|    let fw = include_bytes!("../../../../cyw43-firmware/43439A0.bin");
31|    let clm = include_bytes!("../../../../cyw43-firmware/43439A0_clm.bin");
↓
30|    let fw = include_bytes!("../../lib/embassy/cyw43-firmware/43439A0.bin");
31|    let clm = include_bytes!("../../lib/embassy/cyw43-firmware/43439A0_clm.bin");
```

### いざ、、書き込み
ラズピコのUSBケーブルを指すときは、本体についている白いボタンを押しながら指してください。`RPI-PP2`のようなフォルダがエクスプローラーで開かれるはずです。

次のコマンドでビルドと書き込みが行われます。
```
$ cargo run --bin wifi_blinky
```
通った人もそうでない人もお疲れさまでした。おやすみなさい。

## 参考文献
1. [Raspberry Pi PicoとRustで組み込みプログラム環境を整える](https://nkon.github.io/RasPico-Rust/) - GitHub 出張所
2. [Raspberry Pi Pico WでのRustについて](https://zenn.dev/tana_ash/scraps/2156cd41c1e031) - tana
3. [embassy公式](https://github.com/embassy-rs/embassy/tree/main) 
4. [Rust公式インストールサイト](https://www.rust-lang.org/ja/tools/install)
5. [Raspberry Pi Pico W データシート](https://datasheets.raspberrypi.com/picow/pico-w-datasheet.pdf)