FreeBSD で NanoPi Neo2

## Neo2 は64bit

NanoPi Neo2 は


* NanoPi Neo でFreeBSD (ビルド編)
https://qiita.com/s_mitu/items/b54d796a33c35409315e

* NanoPi Neo でFreeBSD （動作編)
https://qiita.com/s_mitu/items/cd78c0b7c4240cdd3ba6

で書いた NanoPi Neo と同じサイズの CPU ボードです。
![P_20181223_115541.jpg](https://qiita-image-store.s3.amazonaws.com/0/103137/126cd6c3-2c55-eeb9-8c43-63f3c3fb5614.jpeg)

上が NanoPi Neo2、下がNanoPi Neoです。Neo2は斜めってるチップが特徴的ですね。

サイズは同じですが、NanoPi Neo が 32bit CPUなのに対して、Neo2 は Allwinner H5 を積んだ 64 bit ボードです。
メモリサイズは、512MBです。

* NanoPi NEO2
http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO2

## イメージ作ってくれた人がいました
crochet には NanoPi Neo と同様に board の定義が無いし、ports にNeo2用 u-boot もありません(他のボード用のportsをコピーして作るのは簡単ですが)。ビルドは面倒です。
そんな中、FreeBSD-arm MLに「NanoPi Neo2 と NanoPi K1 Plus の12Rのイメージを作ったぜ」というポストがありました。

* [FreeBSD-arm ML FreeBSD 12.0-RELEASE on NanoPi-K1-Plus and NanoPi-NEO2](https://lists.freebsd.org/pipermail/freebsd-arm/2018-December/019135.html)


メール内にリンクがあるので、これを使ってみましょう。
ちなみに NanoPi K1 Plus の方のイメージのリンクはなぜか 404 になっちゃってます。落とせても実機がないので私は試せませんが。

## 書き込み
ダウンロードしたイメージ

```
FreeBSD-aarch64-12.0-RELEASE-341684M-NanoPi-NEO2.img.xz
```

をxzcat しつつ dd で書き込みます。SDカードは2G以上あれば起動は問題ありせん。FreeBSDから書き込む場合は /dev/da0 が SD カードとすると、

```
$ xzcat FreeBSD-aarch64-12.0-RELEASE-341684M-NanoPi-NEO2.img.xz | 
sudo dd of=/dev/da0 bs=2m
```

とします。
# 準備
ヘッダピンがついてないのではんだ付けしなくちゃいけないのは NanoPi Neo と同様です。

* [準備 - NanoPi Neo記事](https://qiita.com/s_mitu/items/cd78c0b7c4240cdd3ba6#%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E6%BA%96%E5%82%99)

NanoPi Neo と同様に映像出力はありませんので、USB シリアル変換で接続して操作します。
ピン配置は [NanoPi Neoと同様](https://qiita.com/s_mitu/items/cd78c0b7c4240cdd3ba6#%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%94%E3%83%B3)です。私の持っているバージョンは裏のシルクに書いてあるピン配置が嘘だったので注意が必要です。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">デバッグシリアルは、買った時から生えてる4本のヘッダピンに繋ぎます（他のヘッダピンは自分で半田付けが必要）。<br>《注意》私の買ったバージョンだとヘッダピンのシルクが嘘でした。ちょうど逆になってて、正しくは基盤の端からGND 5V TX RXです。<br>今は直ってるのかなぁ。<a href="https://twitter.com/hashtag/NanoPiNeo2?src=hash&amp;ref_src=twsrc%5Etfw">#NanoPiNeo2</a> <a href="https://t.co/IZj8alLg4c">pic.twitter.com/IZj8alLg4c</a></p>&mdash; 鈴木光宏@FreeBSD Advent Calendar 2018 開催中 (@s_mitu) <a href="https://twitter.com/s_mitu/status/1042801530619912192?ref_src=twsrc%5Etfw">2018年9月20日</a></blockquote>

# 起動
Micro USB で電源接続すると起動開始します。
このイメージは起動時のメニュー表示がされない設定になっているので、NanoPi Neo の記事で出てきた[選択メニュー等](https://camo.qiitausercontent.com/57eaaaf0a9665063c70b200cf9fa40b0e0e2638e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3130333133372f35326339353334622d363539392d333862642d396362652d3761383135373438613132382e706e67)は特に出ずログイン画面が出ます。

デフォルトのユーザーとパスワードは

|| ユーザー | パスワード |
|:-:|:-:|:-:|
|スーパーユーザー|root| 無し |
|一般| admin | admin |

です。

## SMP は動いている
FreeBSD は 64bit モードで動いてます。
arm64 として、SMP も動いています。

![Screenshot_2018-12-23_15-08-26.png](https://qiita-image-store.s3.amazonaws.com/0/103137/07cad096-73c8-b701-e8eb-f62fa3068aeb.png)

# 有線LANが使える

NanoPi Neoで使えなかった有線LANが使えます。

![Screenshot_2018-12-23_15-25-25.png](https://qiita-image-store.s3.amazonaws.com/0/103137/472b891e-e8d5-e4da-3957-930f99af5f78.png)

シリアルコンソールの代わりに、PCと有線接続してssh でコントロールということも可能になります。

#USB でWiFi接続
出荷状態から基板においてあるUSBドングルを挿してWiFiも接続できました。
手順は [NanoPi Neo と同様です](https://qiita.com/s_mitu/items/cd78c0b7c4240cdd3ba6#usb%E3%81%A7-wifi-%E6%8E%A5%E7%B6%9A)。

#ヘッダピンのUSBも使える

一列12ピンのヘッダピンには USB コネクタを２つつなげる事ができますが、両方認識しました。

![P_20181223_163602.jpg](https://qiita-image-store.s3.amazonaws.com/0/103137/8741e7a9-bf06-1085-ab18-728ce21fc61e.jpeg)

写真はmicroSDカードリーダーをつなげてマウントなどを確認しているところです。

#ボード上のLEDを光らせる
[NanoPi Neo と同様](https://qiita.com/s_mitu/items/cd78c0b7c4240cdd3ba6#%E3%83%9C%E3%83%BC%E3%83%89%E4%B8%8A%E3%81%AEled%E3%82%92%E5%85%89%E3%82%89%E3%81%9B%E3%82%8B) に/dev/led 以下に LED 点灯用デバイスノードが生えます。
しかしデバイスノードの名前が違います。

```shell-session:led
/dev/led/nanopi:green:status (実際は青色)
/dev/led/nanopi:red:pwr (実際は緑)
```

となっていて、現状/dev/led/nanopi:green:status が電源 ON 時から点灯しています。たぶん現状 LED への名前の割り振りが間違っているのだと思います。

## GPIO 

GPIOも使用可能です。使用の仕方は NanoPi Neo と同様です。

* GPIO 操作(一覧表示)
https://qiita.com/s_mitu/items/cd78c0b7c4240cdd3ba6#gpio-%E6%93%8D%E4%BD%9C%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA

* GPIO 操作(ピンのIN/OUT設定)
https://qiita.com/s_mitu/items/cd78c0b7c4240cdd3ba6#gpio-%E6%93%8D%E4%BD%9C%E3%83%94%E3%83%B3%E3%81%AEinout%E8%A8%AD%E5%AE%9A

* GPIOを実際に使ってみる

RaspberryPi 用 の [Explorer pHat] (https://shop.pimoroni.com/products/explorer-phat)

![P_20181223_180524.jpg](https://qiita-image-store.s3.amazonaws.com/0/103137/6b4df96e-123a-0914-c695-6cabc52b12b3.jpeg)

をモータードライバとしてつかい、[aitendo の障害物センサー](http://www.aitendo.com/product/10278)

![P_20181223_180446.jpg](https://qiita-image-store.s3.amazonaws.com/0/103137/6bf8e78e-bb91-87b9-416d-3db942997c63.jpeg)

で反応があったらモーターを動かすスクリプトのデモです。

Explorer pHat は RaspberryPi の GPIO に直接挿す形での使用が想定されていますが、NanoPi Neo/Neo2 だと GPIO ピンが足りないので、必要な端子だけケーブルで接続します。

GPIO の PC1とPC2 のそれぞれの端子を[Explore pHAT の 35番と38番の端子](https://pinout.xyz/pinout/explorer_phat#)につなぎ、のON/OFFでモーターの回転を順方向/逆方向を制御します。

障害物センサーは PG11 ピンにつなぎ IN に設定します。通常 1 で、障害物があった場合 0 になるので、0 になったらコンソールに文字出力し、モーターを回転させます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">NanoPI Neo2で、衝突センサーに反応したらモーターを動かすデモ。<a href="https://twitter.com/hashtag/FreeBSD?src=hash&amp;ref_src=twsrc%5Etfw">#FreeBSD</a> <a href="https://twitter.com/hashtag/nanopineo?src=hash&amp;ref_src=twsrc%5Etfw">#nanopineo</a> <a href="https://twitter.com/hashtag/nanopineo2?src=hash&amp;ref_src=twsrc%5Etfw">#nanopineo2</a> <a href="https://t.co/97f4DYINpM">pic.twitter.com/97f4DYINpM</a></p>&mdash; 鈴木光宏@FreeBSD Advent Calendar 2018 開催中 (@s_mitu) <a href="https://twitter.com/s_mitu/status/1076794070897328128?ref_src=twsrc%5Etfw">2018年12月23日</a></blockquote>


```shell-session:gpioスクリプト
#!/bin/sh
PIN_IN=PG11
PIN_MOTOR_P=PC1
PIN_MOTOR_M=PC2

gpioctl -c ${PIN_IN} IN
gpioctl -c ${PIN_MOTOR_P} OUT
gpioctl -c ${PIN_MOTOR_M} OUT

while true; do
	IN=$(gpioctl ${PIN_IN})
	if [ "$IN" -eq 0 ]; then
		echo "当たった"
		gpioctl ${PIN_MOTOR_P} 1
		gpioctl ${PIN_MOTOR_M} 0
		sleep 0.5
		gpioctl ${PIN_MOTOR_P} 0
		gpioctl ${PIN_MOTOR_M} 1
		sleep 0.5
		gpioctl ${PIN_MOTOR_P} 0
		gpioctl ${PIN_MOTOR_M} 0
		sleep 1
	fi
done
```

##　I<sup>2</sup>Cはやはり駄目

i<sup>2</sup>c はやっぱり動きません。

## Nano Pi Neo より色々動く
* 有線LAN
* ヘッダピンのUSB

など、Nano Pi Neo より動いてる部分が多い、というか NanoPi Neo のイメージもちゃんといじればここまでは動くのかもしれないというそういう話かもしれないですねぇ。NanoPi Neo は orange pi の設定をコピーしただけですからねぇ。