隠居日録

隠居日録

2016年(世にいう平成28年)、発作的に会社を辞め、隠居生活に入る。日々を読書と散歩に費やす

FreeBSD NanoPi NEO2上で全てのUSBを有効にし、無事にNAS Kitでブートできるようになった

2020/6/20追記
起動しない原因がNAS kitに由来するもので、LTSとは関係ないので、内容及びタイトルを一部修正

前回の調査でUSBマスストレージが認識されていないので、起動できないところまでは分かった。

prozorec.hatenablog.com

だが、なぜなのだろう?NAS kitでマスストレージが認識されていない状況(u-boot-nanopi-neo2で起動した場合)と認識されている状況で(u-boot-orangepi-pc2で起動した場合)以下のコマンドを実行し、違いを見た。すると、一部のohciehciでステータスが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がつながるようになっている。
https://wiki.friendlyarm.com/wiki/images/2/27/NEO2_pinout-02.jpg

いずれにしても、これらをnanopi-neo2にも追加すれば、ehciohciのステータスは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";
};

&{/soc} {
  usb@1c1b000 {
    compatible = "allwinner,sun8i-h3-ehci", "generic-ehci";
    status = "okay";
  };
  usb@1c1c000 {
    compatible = "allwinner,sun8i-h3-ehci", "generic-ehci";
    status = "okay";
  };
  usb@1c1c400 {
    compatible = "allwinner,sun8i-h3-ohci", "generic-ohci";
    status = "okay";
  };
  usb@1c1b400 {
    compatible = "allwinner,sun8i-h3-ohci", "generic-ohci";
    status = "okay";
  };
};

コンパイルした結果を/boot/dtb/overlaysと/boot/msdos/dtb/overlaysにコピーし、loader.confのfdt_overlaysにその名前を追記して、起動したら、ハードディスクが検出されるようになった。ずーと調べていたわけではないが、長い道のりだった。それにしても、デバイス・ツリーはよくわからない。