2021/7/27追記
overlay dtsの定義をより相応しいものに置き換えた。
2020/6/20追記
起動しない原因がNAS kitに由来するもので、LTSとは関係ないので、内容及びタイトルを一部修正
前回の調査でUSBマスストレージが認識されていないので、起動できないところまでは分かった。
だが、なぜなのだろう?NAS kitでマスストレージが認識されていない状況(u-boot-nanopi-neo2で起動した場合)と認識されている状況で(u-boot-orangepi-pc2で起動した場合)以下のコマンドを実行し、違いを見た。すると、一部のohciとehciでステータスがdisabledになっているのが分かった。
sysctl -b hw.fdt.dtb | dtc -I dtb -O dts
usb@1c1b400 { compatible = "allwinner,sun8i-h3-ohci", "generic-ohci"; reg = <0x1c1b400 0x100>; interrupts = <0x0 0x4b 0x4>; clocks = <0x1b 0x22 0x1b 0x26 0x1b 0x5d>; resets = <0x1b 0x13 0x1b 0x17>; phys = <0x12 0x1>; phy-names = "usb"; status = "disabled"; phandle = <0x16>; }; usb@1c1c000 { compatible = "allwinner,sun8i-h3-ehci", "generic-ehci"; reg = <0x1c1c000 0x100>; interrupts = <0x0 0x4c 0x4>; clocks = <0x1b 0x23 0x1b 0x27>; resets = <0x1b 0x14 0x1b 0x18>; phys = <0x12 0x2>; phy-names = "usb"; status = "disabled"; phandle = <0x17>; }; usb@1c1c400 { compatible = "allwinner,sun8i-h3-ohci", "generic-ohci"; reg = <0x1c1c400 0x100>; interrupts = <0x0 0x4d 0x4>; clocks = <0x1b 0x23 0x1b 0x27 0x1b 0x5e>; resets = <0x1b 0x14 0x1b 0x18>; phys = <0x12 0x2>; phy-names = "usb"; status = "disabled"; phandle = <0x18>; }; usb@1c1c000 { compatible = "allwinner,sun8i-h3-ehci", "generic-ehci"; reg = <0x1c1c000 0x100>; interrupts = <0x0 0x4c 0x4>; clocks = <0x1b 0x23 0x1b 0x27>; resets = <0x1b 0x14 0x1b 0x18>; phys = <0x12 0x2>; phy-names = "usb"; status = "disabled"; phandle = <0x17>; };
それで、改めて、sun50i-h5-orangepi-pc2.dtsとsun50i-h5-nanopi-neo2.dtsを比べてみると、
&ehci1 { status = "okay"; }; &ehci2 { status = "okay"; }; &ohci1 { status = "okay"; }; &ohci2 { status = "okay"; };
がorangepi-pc2には定義されているが、nanopi-neo2には定義されていないのに気づいた。多分もともとこのファイルはLinuxからコピーされたものだと思うのだが、Linuxではこの違いが問題にならなく、FreeBSDでは影響が出てくるとは不思議だ。
だがこの図を見るとUSB1とUSB2はコネクタを通じて外部に端子が出ていて、NAS kitではこれにHDDがつながるようになっている。
いずれにしても、これらをnanopi-neo2にも追加すれば、ehci・ohciのステータスはokayになるのだと思うのだが、FreeBSDソースの一部を恒久的に変更するのはちょっとためらわれる。そこで、オーバーレイのdtboを作って、読みこませればいいのではないかと思ったのだが、どのようにファイルを書けばいいかさっぱりわからなかった。とりあえずコンパイルの仕方は、
dtc -@ -O dtb -o ouput.dtbo input.dtso
でできることは分かった。だが、肝心の入力ファイルをどう書けばよいかわからなかった。たぶん差分を書けばいいのかと思い、
/dts-v1/; /plugin/; / { compatible = "allwinner,sun50i-h5"; }; &ehci1 { status = "okay"; }; &ehci2 { status = "okay"; }; &ohci1 { status = "okay"; }; &ohci2 { status = "okay"; };
として、コンパイルしてみた。エラーは何も出なかったので、OKかと思い、コンパイルしたものを、デコンパイルすると、
/dts-v1/; / { compatible = "allwinner,sun50i-h5"; fragment@0 { target = <0xdeadbeef>; __overlay__ { status = "okay"; }; };
というような感じになり、targetの中にdeadbeefがセットされているので、これは失敗していると思った。それにehciも見えない。色々試してみて、以下の記述でとりあえず動くことが分かった。
/dts-v1/; /plugin/; / { compatible = "allwinner,sun50i-h5"; fragment@0 { target = <&ehci1>; __overlay__ { status = "okay"; }; }; fragment@1 { target = <&ohci1>; __overlay__ { status = "okay"; }; }; fragment@2 { target = <&ehci2>; __overlay__ { status = "okay"; }; }; fragment@3 { target = <&ohci2>; __overlay__ { status = "okay"; }; }; };
コンパイルした結果を/boot/dtb/overlaysと/boot/msdos/dtb/overlaysにコピーし、loader.confのfdt_overlaysにその名前を追記して、起動したら、ハードディスクが検出されるようになった。ずーと調べていたわけではないが、長い道のりだった。それにしても、デバイス・ツリーはよくわからない。