contents
  1. FriendlyARM NanoPi Neo2
  2. NetBSDのAllwinner対応
  3. 手っ取り早く環境を構築する方法
  4. 自分で環境を構築する方法
    1. Release build: ディスクイメージarmv7.img(とkernel)を作る
    2. ブートローダーu-bootの作成
      1. 8MBを超える大きなkernel起動のためのu-boot側の対応
    3. microSD作成
    4. kernelの置き換え
    5. 起動!!
  5. その後のお楽しみ
    1. 内蔵LEDの操作
  6. 制限事項
    1. マルチコアCPUの対応
    2. 64bitの対応
    3. Ethernetインタフェース
    4. GPIOの動作
    5. I2Cの利用
    6. 8.99.7と8.99.9(最新の)dmesg差分
  7. おわりに

NanoPi Neo2でNetBSDを動かす

この記事は、 Qiita Advent Calendar 2017NetBSD 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対応と、小型ながらかなりの高性能です。

nanopineo2.png

主な仕様は、以下のとおりです。

  • 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)によるまとめがあります。 対応バージョンを見てみると、現在も活発に開発が続いていることがわかります。

余談になりますが、筆者の手元にあるボードの対応状況だけを抜き出すと、以下のようになります。 ただ、まだ手元で動かせていないものもあります。

FamilySoCNetBSD version Example boards Notes
sun50iH5 8.99.4 and laterFriendlyARM NanoPi NEO2aarch32 mode
sun5i R8 8.99.2 and laterPocket C.H.I.P.(C.H.I.P.)
sun8i H3 8.0 and later FriendlyARM NanoPi NEO
sun7i A207.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がマルチユーザモードで起動するはずです。

動作状況は、 u-bootdmesgを参照してください。

その後のお楽しみ

内蔵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、楽しいですね!!

Last modified: 2017-12-21
Post-it: New Post-it (help)

Text color: [_][_][_][_]

Background: [_][_][_][_][_][_]

Draw Line:

x: y: