contents
- FriendlyARM NanoPi Neo2
- NetBSDのAllwinner対応
- 手っ取り早く環境を構築する方法
- 自分で環境を構築する方法
- Release build: ディスクイメージarmv7.img(とkernel)を作る
- ブートローダーu-bootの作成
- 8MBを超える大きなkernel起動のためのu-boot側の対応
- microSD作成
- kernelの置き換え
- 起動!!
- その後のお楽しみ
- 内蔵LEDの操作
- 制限事項
- マルチコアCPUの対応
- 64bitの対応
- Ethernetインタフェース
- GPIOの動作
- I2Cの利用
- 8.99.7と8.99.9(最新の)dmesg差分
- おわりに
NanoPi Neo2でNetBSDを動かす
この記事は、 Qiita Advent Calendar 2017の NetBSD Advent Calendar 2017 20日目のエントリとして書かれました。
この記事のベースとなった作業は、 関西*BSDユーザ会第19回定期総会 + 併設研究会で NanoPi Neo2でNetBSDを動かしたい'''と思っていたら動いた'''の として紹介していますが、試行錯誤の過程の紹介であることと、内容が古くなっていることから、参考程度にとどめてください。
同じNetBSD Advent Calendar 2017 13日目の NetBSD/evbearmでfdt(4)対応した環境を試してみる も参考になりますので、ぜひ読んでみてください。
FriendlyARM NanoPi Neo2
NanoPi Neo2は、 FriendlyARMが発売しているAllwinner(ARM)をSoCに利用した小型ボードです。 64bitのCortex-A53を採用し、Ethernetは1G対応と、小型ながらかなりの高性能です。
主な仕様は、以下のとおりです。
- SoC: Allwinner’s 64-bit H5 quad-core (Cortex-A53)
- GPU: Mail450
- RAM: 512M DDR3
- I/O: microSD, Ethernet 10/100/1000M, USB, Serial, GPIO, Audio
- Size: 40 x 40mm, 13g
- OS: UbuntuCore 16.04, Debian, NetBSD
- Price: 秋月 2400円, FriendlyARM $14.99
OSは、公式には、UbuntuCoreとDebianが提供されています。
Hat(Arduinoなどでのシールド)と呼ばれる拡張ボードもいくつか提供されています。 例えば、OLEDの表示と3ボタン入力ができる NanoHat OLEDや、 簡単にI2Cやアナログ・デジタル入出力ができる NanoHat Hubなどがあります。
NetBSDのAllwinner対応
NetBSDのAllwinner対応状況は、 NetBSD/evbarm on Allwinner Technology SoCsにまとまっています。 また、 NetBSD on Allwinner SoCs Updateに、2017/11/08時点の Allwinner関連の開発者Jared McNeill氏(@jmcwhatever)によるまとめがあります。 対応バージョンを見てみると、現在も活発に開発が続いていることがわかります。
余談になりますが、筆者の手元にあるボードの対応状況だけを抜き出すと、以下のようになります。 ただ、まだ手元で動かせていないものもあります。
Family | SoC | NetBSD version | Example boards | Notes |
sun50i | H5 | 8.99.4 and later | FriendlyARM NanoPi NEO2 | aarch32 mode |
sun5i | R8 | 8.99.2 and later | Pocket C.H.I.P.(C.H.I.P.) | |
sun8i | H3 | 8.0 and later | FriendlyARM NanoPi NEO | |
sun7i | A20 | 7.0 and later | LeMaker Banana Pi |
Allwinner SoCに対応するkernel configは、SUNXIになります。
SUNXIに対する最近の話題としては、以下のようなものがあります。
- Flatten Device Tree対応改善
- armv7.imgに関して
- SoCに応じて起動するkernelを変更する (boot.cmdスクリプト)
- 各種ボード対応*.dtbファイルのインストール
手っ取り早く環境を構築する方法
NetBSD ARM Bootable Imagesには、 ARMの様々なボード用のブート可能なディスクイメージが提供されています。 ここからイメージをダウンロードし、(micro)SDなどに書き込むことで、簡単に各種ボードで起動可能なメディアを作成することが可能です。
2017/12/20現在では、Get NetBSDと書かれたリストから、ボードに対応するイメージを選択することで、自動的にダウンロードが始まります。
ブートするメディアの作成は、以下のように行います。
% dd if=NetBSD-nanopi-neo2-201712150740Z.img of=/dev/rld0d bs=1m
手元の201712150740Zは、起動するのですが、シリアルからのキー入力がうまく動かないようです。 詳しくは、dmesgを参照してください。
しかし、Ethernetインタフェースが認識されているおり、今後利用できることが期待できます。
rgephy0 at sunxiemac0 phy 7: RTL8169S/8110S/8211 1000BASE-T media interface, rev. 5 rgephy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT, 1000baseT-FDX, auto
自分で環境を構築する方法
最新のNetBSD currentで、動作環境を構築する方法は、以下のとおりです。
実際の作業に関しては、 NetBSD on Allwinner (sunxi) family SoCs に詳しくまとまっているので、一度目を通しておきましょう。
Release build: ディスクイメージarmv7.img(とkernel)を作る
NanoPi Neo2でブートするmicroSDを作成するために、ディスクイメージarmv7.imgを作成します。
はじめに、何らかの方法で、NetBSDのソースツリーを入手します。 現在の開発状況を考えると、NetBSD-currentを利用するほうが良いでしょう。
詳細は省きますが、anonymass cvsを使って、以下のように最新のソースツリーを取得することができます。
% cvs -d :pserver:anoncvs@anoncvs.netbsd.org:/cvsroot login CVS password: anoncvs % cvs -d :pserver:anoncvs@anoncvs.netbsd.org:/cvsroot co src
NetBSDのソースは、NetBSD自身だけでなく、FreeBSDやLinuxなどでも構築できるようになっているので、好みの環境で構築してください。
構築は、取得したsrcディレクトリで以下のように行います。
% ./build.sh -uU -m evbearmv7hf-el tools % ./build.sh -uU -m evbearmv7hf-el kernel=SUNXI release
構築後、ディスクイメージは、 obj/releasedir/evbarm/binary/gzimg/armv7.img.gz に作成されます。 対応するkernelは、 obj/releasedir/evbarm/binary/kernel/netbsd-SUNXI.ub.gz となります。
ブートローダーu-bootの作成
各種ボード用のu-bootは、 pkgsrc/sysutils/u-boot-* として提供されています。
NanoPi Neo2のu-bootは、 pkgsrc/sysutils/u-boot-nanopi-neo2/ になります。 ここで、make installすることで、 /usr/pkg/share/u-boot/nanopi-neo2/u-boot-sunxi-with-spl.bin にu-bootがインストールされます。
8MBを超える大きなkernel起動のためのu-boot側の対応
pkgsrcで作成されるu-bootでは、ブートできるkernelの大きさは、8MBに制限されています。
最近のcurrentでは、kernelの大きさが8MBを超えており、このままではブートすることができません。
% ls -l netbsd-SUNXI.ub -rw-r--r-- 1 mutoh mutoh 11019664 Dec 18 13:13 netbsd-SUNXI.ub
ここでは、以下のようなパッチを当てて、32MB対応のu-bootを作成します。 これは、手元で動いているkernelの大きさが、27MiBあるからです。
% diff -u work/u-boot-2017.11/common/bootm.c{.org,} --- work/u-boot-2017.11/common/bootm.c.org 2017-12-04 12:30:20.000000000 +0900 +++ work/u-boot-2017.11/common/bootm.c 2017-12-04 12:30:36.000000000 +0900 @@ -32,7 +32,7 @@ #ifndef CONFIG_SYS_BOOTM_LEN /* use 8MByte as default max gunzip size */ -#define CONFIG_SYS_BOOTM_LEN 0x800000 +#define CONFIG_SYS_BOOTM_LEN 0x2000000 #endif #define IH_INITRD_ARCH IH_ARCH_DEFAULT
microSD作成
ここまでで作成した、以下のものを書き込んでmicroSDを作成します。
- disk image (armv7.img)
- u-boot (u-boot-sunxi-with-spl.bin)
手順は、以下のとおりです。
% dd if=armv7.img of=/dev/rld0d bs=1m conv=sync % dd if=/usr/pkg/share/u-boot/nanopi-neo2/u-boot-sunxi-with-spl.bin \ of=/dev/rld0d bs=1k seek=8 conv=sync
kernelの置き換え
手元の8.99.9では、このままのmicroSDでは、kernelが起動しません。 このため、少し古いkernel 8.99.7で動かしています。 念のため、このkernelを置いておきます。
kernelは、microSDのMS-DOSパーティションに入っているので、これを置き換えます。 ここでは、MS-DOSパーティションが /boot にマウントされていると仮定します。
% cp /boot/netbsd-SUNXI.ub /boot/netbsd-SUNXI.ub.bak % cp somewhere/netbsd-SUNXI.ub.8.99.7 /boot/netbsd-SUNXI.ub
起動!!
これで、NetBSDがマルチユーザモードで起動するはずです。
その後のお楽しみ
内蔵LEDの操作
緑と青の2つ内蔵LEDは、GPIO経由で接続されており、NetBSDからはsysctlを使って操作可能です。
sunxigpio0 at fdt1: PIO gpio0 at sunxigpio0: 94 pins sunxigpio0: interrupting on GIC irq 43 sunxigpio1 at fdt1: PIO gpio1 at sunxigpio1: 12 pins sunxigpio1: interrupting on GIC irq 77 (snip) gpioleds0 at fdt0: nanopi:green:pwr nanopi:blue:status
LEDの現在の状態は、以下のように取得できます。
% sysctl hw.led hw.led.nanopi_green_pwr = 1 hw.led.nanopi_blue_status = 0
変更するためには、-wオプションを付けて、以下のように指定します。
% sudo sysctl -w hw.led.nanopi_blue_status=1 hw.led.nanopi_blue_status: 0 -> 1
制限事項
現在、わかっている制限事項は、以下のとおりです。
マルチコアCPUの対応
CPUは、4つ認識していますが、1つしか動いていないようです。
cpu0 at cpus0: Cortex-A53 r0p4 (Cortex V8A core) cpu0: DC enabled IC enabled WB disabled EABT branch prediction enabled cpu0: 32KB/64B 2-way L1 VIPT Instruction cache cpu0: 32KB/64B 2-way L1 VIPT Instruction cacheIPT Data cache cpu0: 32KB/64B 4-way write-back-locking-C L1 PIPT Data cache cpu0: 512KB/64B 16-way write-through L2 PIPT Unified cache vfp0 at cpu0: NEON MPE (VFP 3.0+), rounding, NaN propagation, denormals cpu1 at cpus0: disabled (unresponsive) cpu2 at cpus0: disabled (unresponsive) cpu3 at cpus0: disabled (unresponsive)
64bitの対応
現状では、NanoPi Neo2は、64bitモード(aarch64)ではなく、32bitモード(aarch32)での動作しか対応していません。
% uname -a NetBSD nanopineo2 8.99.7 NetBSD 8.99.7 (SUNXI) #3: Mon Nov 27 09:39:44 JST 2017 root@trueos-610:/usr/home/mutoh/NetBSD/src/sys/arch/evbarm/compile/obj/SUNXI evbarm
Ethernetインタフェース
現在、Ethernetインタフェースは、認識しないようです。
ただ、 @jmcwhatever 氏によると、新しいDeviceTreeとkernelの組み合わせで認識するはずということなので、新しいkernelが起動するようになると遠からず解決されるのではないかと思います。
GPIOの動作
NetBSDでGPIOを使う方法は、 netbsd-gpio-doc にまとまっています。
NanoPi Neo2では、以下のようにGPIOが認識されています。
% dmesg|grep gpio sunxigpio0 at fdt1: PIO gpio0 at sunxigpio0: 94 pins sunxigpio0: interrupting on GIC irq 43 sunxigpio1 at fdt1: PIO gpio1 at sunxigpio1: 12 pins sunxigpio1: interrupting on GIC irq 77 gpioleds0 at fdt0: nanopi:green:pwr nanopi:blue:status
ところが、現状では、以下のように入出力ともできないようです。
% sudo gpioctl gpio0 0 gpioctl: GPIOREAD: Operation not permitted % sudo gpioctl gpio0 0 1 gpioctl: GPIOWRITE: Operation not permitted
ただ、筆者が使い方がわかっていない可能性もあります。 内蔵LEDは、GPIO接続なので、GPIOが使えるようになる可能性は高いです。
I2Cの利用
NanoPi Neo2の拡張ボードであるHatには、I2Cで接続されているものがあります。
NetBSDの他のportでは、I2Cがサポートされています。 また、公式のUbuntuCoreで利用できているので、NetBSDでも利用できるようになるのを期待しています。
8.99.7と8.99.9(最新の)dmesg差分
手元で動いている8.99.7と最新の8.99.9とのdmesgの差分を以下に示します。
主な違いは、以下のようです。
- Ethernetインタフェースが認識されている
- USBハブ周りが変わっている
- SDカード周りが変わっている
- タイマー周りがARM専用からgenericなものになっている
おわりに
この記事では、NetBSDでNanoPi Neo2を動かす方法を解説しました。 他のAllwinnerやARM coreでNetBSDを動かすときにも、同じような作業を行うことで動作する可能性がありますので、参考にしてみてください。
また機会がありましたら、(Pocket)C.H.I.P.などのFELモードでNetBSDを動かす方法についても解説をかけたらと思います。
NetBSD、楽しいですね!!