SpresenseをWindows10(WSL)で開発する

#噂のSpresenseが届いたぞ
すごいぞソニー、(SPIRITZERとして発表した1年前から)待ってたぞソニー
<img src=https://qiita-image-store.s3.amazonaws.com/0/281844/422e73a0-21d4-7f53-d773-285c2626c73e.jpeg width=80%>
重さは5.9g　GNSS込みでこのサイズ感なのでロボットやドローンにもってこいなだな
ただし本体についてるGPIOは1.8Vなので[こういうレベル変換](http://akizukidenshi.com/catalog/g/gM-04522/)が必要
<img src=https://qiita-image-store.s3.amazonaws.com/0/281844/1dd92973-b043-8a04-1436-7ef9e0599485.png width=50%>
何がすごいってこのブロック図がやばい
メインプロセッサはCortex-M4の6コアだけど、GNSS用のCortex-M4とIO用のCortex-M0+も乗ってる
**大奮発だな！**

###早速開発環境を用意するぞ
SpresenseはNuttXというPOSIXなリアルタイムOSで動いている
ちなみにドローンのコントローラで有名なPixHawkも実はNuttXで動いてたりする

>*Arduino？男は黙ってRTOSだぞ*
>...別に否定するつもりはないんですが、Arduinoだと今のところマルチコア使うプログラムは書けないそうで
>価格帯からしても入門者向けなマイコンではないんじゃないかな

**けどLinux用意するの面倒だなぁ (USBブートとか仮想とかラズパイとかあるけどさ)**

##Windows10上で開発できるようにする
Windows Subsystem for Linuxを利用します　ちょっと前までBash on Ubuntu on Windowsとか呼ばれてたあれです。
わたしゃコレとゲーム画面録画機能がwindows10最大の恩恵だと思ってます

*2018/9/18*
・Windows10 Pro 1803 (April 2018 Update)
・WSL Ubuntu 16.04 LTS (Linux 4.4.0-17134-Microsoft)
・Spresense SDK v1.0.1
所要時間：おおよそ45分(WSL導入に時間がかかる)

#####始める前に
Linuxにほとんど触ったことないって人は、コマンドをググりながら頑張ってね
それと指定のフォルダでコマンドライン(cmd.exe)の作業をしたいとき、
<img src=https://qiita-image-store.s3.amazonaws.com/0/281844/c84df2a8-c92e-775b-2c1d-3c4269868cf6.png width=50%>
エクスプローラでフォルダを開き、そのアドレスバーに```cmd```と打つと
<img src=https://qiita-image-store.s3.amazonaws.com/0/281844/67ba259f-84e0-b6af-c70b-710ae1f94594.png width=50%>
そのフォルダを作業フォルダとしてcmdが呼べます
またアドレスバーにbashと打つとWSL(ubuntu)が起動できます
さらにcmd上で```wsl ls```のように頭にwslを付けるとlinuxコマンドが使えます

今回はNuttXのビルドをWSLで、書き込みをcmdで行うのでややこしいです

###1、WSLをインストールする
https://qiita.com/Brutus/items/f26af71d3cc6f50d1640
こちらとか参考に
以下ざっくり説明
１、スタートから「Windowsの機能の有効化または無効化」を検索
２、「Windows Subsystem for Linux」にチェックを入れ、指示に従い再起動
３、Microsoft StoreでLinuxと検索しUbuntuを入手、起動してユーザー名とパスワード設定
４、レポジトリを日本(jaist)に設定して更新

```
$ sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get upgrade
```
linuxコマンドなんて使ったことないって人はググってね
upgradeは時間がかかるのでほっといて次の作業に移りましょう

###2、雑多な準備

作業フォルダを用意します
今回は私の好みでユーザーフォルダ内にwsというフォルダを作って、作業フォルダとします
```C:\Users\ユーザー名\ws```

書き込みに必要なCP2101N(シリアル変換)のドライバーを入手
https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers
zipを解凍し、```CP210xVCPInstaller_x64.exe```に従いドライバーを導入してください
スタートでデバイスマネージャを検索し実行します
```ポート(COMとLPT)```の項目に```Silicon Labs CP210x USBto UART Bridge (COM3)```
という項目があれば成功です　COMポート番号を覚えておいてください

###3、WSL内にSpresense SDKを構築
[公式wiki](https://developer.sony.com/ja/develop/spresense/developer-tools/get-started-using-nuttx/nuttx-developer-guide#_%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)や[GithubのREADME](https://github.com/sonydevworld/spresense)を参考に

作業フォルダ```C:\Users\ユーザー名\ws```でWSLを呼び出します(アドレスバーに```bash```と入力)

ツールの準備

```
$ sudo apt-get install make git gperf libncurses5-dev flex bison gcc-arm-none-eabi
```
Spresense SDkを取ってきます　(~~wiki手順が間違ってます~~修正されたようです　9/3追記)

```
$ git clone --recursive https://github.com/sonydevworld/spresense.git
$ git submodule foreach git checkout master
```
kconfigの取得とリポジトリのクローン　(wiki手順だと失敗？Githubを参照)

```
$ git clone -n https://patacongo@bitbucket.org/nuttx/tools.git tools
$ cd tools
$ git config core.autocrlf false
$ git checkout 891510d2534287afef6b5c90a375f94442a7e94d
$ cd kconfig-frontends/
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig
$ cd ..
$ cd ..
```

ブートローダーを以下からダウンロードしてきます　(注:2018/8/18現在　このリンクが分かりにくい)
https://developer.sony.com/file/download/download-spresense-firmware-v1-0-000
ws内に移動して解凍し、**zipもws内に残しておきます**

ブートローダー更新

```
$ cd spresense/sdk
$ tools/config.py examples/hello
$ ./tools/flash.sh -e /mnt/c/Users/ユーザー名/ws/spresense-binaries-v1.0.000.zip
```
```Update succeed.```と表示されれば成功です

ここから、windows側でブートローダーの書き込みを行います
>ここからは公式にない自己流です
>WSLから書き込むことができなかったため、flash.shが呼び出しているflash_writer.exeを使います

まず、先ほど解凍したブートローダーの中にある
```gnssfw.espk``` ```loader.espk```の2ファイルをコピーし、
```/ws/spresense/sdk/tools/windows/```フォルダ内に貼り付けます
このwindowsフォルダにてcmd.exeを呼び出します(エクスプローラのアドレスバーにcmd)
以下を実行します(COMポート番号はデバイスマネージャで確認)

```ruby:cmd.exe
flash_writer.exe -s -c COM3 -d -b 115200 -n gnssfw.espk loader.espk
```
何事もなく元のcmdに戻ってきたら書き込み成功です　cmdを閉じてください
```Cannnot open port : COM3``` と出た場合、シリアル接続に問題があるようです

最後に、```flash_writer.exe```をコピーし、```/ws/spresense/sdk```内に貼り付けます

###4、サンプルコードのビルドと書き込み
いよいよサンプルコードのビルドです
なぜかWSLがCPUをフルパワーで使ってくれないので結構時間がかかります
(引き続き```/ws/spresense/sdk```にてWSLを起動して)

```
$ tools/config.py --kernel release
$ tools/config.py examples/hello
$ make buildkernel
$ make
```
これでエラー表示が出ず、```sdk```フォルダ内に```nuttx.spk```が生成されれば成功です

書き込みは```/ws/spresense/sdk```でcmd.exeを呼び出して

```ruby:cmd.exe
flash_writer.exe -s -c COM3 -d -b 115200 -n nuttx.spk
```

**これで書き込めました**
WSLからscreenでシリアル接続してみます(Teraterm等お好みで)
デバイスは(COM3の時)ttyS3、ボーレートは115200、フロー制御:なし です

```
sudo screen /dev/ttyS3 115200 -fn
```
enterを押すとnshターミナルが出てきます
```help```で実行可能なコマンドと先ほど書き込んだサンプルコードが見えます
<img src=https://qiita-image-store.s3.amazonaws.com/0/281844/9d1637ff-3b3a-31e4-793a-a5457a3d82d1.png width=50%>
```hello```でサンプルコードが実行されます
<img src=https://qiita-image-store.s3.amazonaws.com/0/281844/dbcdd814-99ae-8c0a-d9f9-3047cae2e326.png width=50%>
screenは```Ctrl + a``` ```k``` ```y``` で終了できます (終了できないとプロセスが残るのでタスクマネージャから消してください)

いまのところ手元には拡張ボードがないので、ほかに試せるサンプルは```gnss```ぐらいですね
####デバッガはまた今度
だって拡張ボード買うお金ないんだもん
VScodeにopenOCDを連携させるつもりです
いずれはVScodeからビルドも呼び出せるようにしたい

##感想
twitterで様子見してましたが、Ubuntu導入からつまずいてる人がちょくちょく見られるので書いてみました

Bash on Windowsが初めて登場した時はデバイスが繋がらなくてはーつっかえ...でしたが、いつの間にかUSBストレージやらシリアルやら使えるようになってたんですね
GithubにはdockerによるSDK導入も書いてあったんですが、私ではどうにもWSLにdockerが入らなかったので諦めました
Kconfigを使ってるので、完全にwindowsネイティブでビルドするのは今後も難しいんですかね

maker faire 2017で発表されたときはマルチコアなマイコンにどんな開発環境が用意されるのか不安でしたが、wikiを見た感じわりと丁寧に用意されてるようで安心しました
立ち位置的にはmbedやラズパイZERO（Edisonなんてなかった)がライバルといったところでしょうか
やや玄人向けですが、ハイグレード・マイコンとしてガシガシ使っていきたいです

####...ところで、Spresenseってなんて読むんですか...?