隠居日録

隠居日録

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

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

2021/7/27追記
overlay dtsの定義をより相応しいものに置き換えた。
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";

        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にその名前を追記して、起動したら、ハードディスクが検出されるようになった。ずーと調べていたわけではないが、長い道のりだった。それにしても、デバイス・ツリーはよくわからない。

人体、なんでそうなった?

ネイサン・レンツ の人体、なんでしょうなった?(原題 HUMAN ERRORS. A Panorama of Our Glitches, from Pointless Bones to Broken Genes)を読んだ。本書は我々の体にはいかに多くの欠陥があるかということを解説した本だ。本書ではたびたび「デザイン」という言葉が登場する。原文でこれがdesignになっているのか他の言葉なのかはわからないが、一つはっきりしているのは、誰も設計などしていないということだ。我々の体がこのようになっているのは、偶然であり、偶然の変化がその時に他のしくみよりも有利だったので、生き残っただけであろう。なので、多くの場合「何なのだこの体は!」と思っても、「それはかくかくしかじかで」というような説明は出てこない。

目の構造

人間の目には盲点があり、そこでは光を感知できないことも知っていたし、人間の目の奥には視神経乳頭という部分があり、そこを視神経が通っていることも知っていたのだが、よもやわれわれの目がこのようなことになっていることは知らなかった。

f:id:prozorec:20200608212753p:plain
脊椎動物の目の構造

最初、本書の説明を読んでもよく理解できなかった。「網膜の光受容細胞が後ろ向きになっている」と書かれているのだ。光は光受容器にたどり着くために、光受容細胞の隙間を進んで、そして視神経は目の内側に向かっており、そこから視神経乳頭を通り抜けているのだ。もちろん、なぜこのような構造になったかを説明する仮説もないという。面白いことに、タコやイカなどの頭足類ではこのような逆転構造にはなっていなくて、すっきりした接続になっている。脊椎動物の目の進化と頭足類の目の進化は独立に起こったということなのだろう。

必須アミノ酸

人間は20種類の必須アミノ酸のうち9種類は自分の体で合成することができない。そのため、食物としてそれらを摂取しなければならない。なぜ失ったのかは、きっと偶然なのだろうが、それでもそのような欠損した状態でも我々が淘汰されなかったのは、きっとその能力を失っても食物として摂取できたからではないかと仮定している。

この合成できないアミノ酸があるということが、我々は色々な食物を食べなければならない、単一の食物に依存することができない最も大きな理由なのだが、興味深いことに、飢饉の時の最大の死亡要因は、実はカロリー不足ではなく、タンパク質と必須アミノ酸不足なのだという。

Alu因子と遺伝子重複

ある古代の哺乳類の精子卵子の中であるミスが生じた。精子卵子の一方の7SL RNA分子の頭がもう一方の7SL RNA分子の尾部に結合し、一つに融合した。偶然に、あるレトロウィルス感染がその同じ細胞を破壊していて、そのウィルスの一つがたまたま、この出来損ないの倍になった7SL RNA分子を捕まえ、このDNAのコピーを作った(逆転写)。このDNAのコピーはその後、哺乳類の細胞のゲノムに戻り、7SLの複数のコピーを作った。細胞はこの融合した7SL遺伝子を正常な遺伝子であるかのようにRNA転写し、また先ほどのレトロウィルスが再び融合した7SL遺伝子のRNA生成物を使ってDNAのコピーを作った。このサイクルが何度も繰り返されて、因子は指数関数的に増幅した。7SL融合因子は今ではAluと呼ばれている。

3000年前、ヒトの祖先は別の色に反応するオプシンタンパク質を2種類持っていた。ある時Alu因子がオプシン遺伝子の近くの遺伝子に入り込み、自分をコピーしたのだが、オプシン遺伝子を完璧にコピーし、そのコピーを連れ出した。このコピーされたAlu因子がゲノムのどこかに戻ってきたとき、コピーされた遺伝子も一緒に持ち込んだ。その結果オプシン遺伝子は2つから3つになった。これを遺伝子重複という。このおかげで我々は3種類の色を知覚できるようになったのだという。

免疫機能 クローン除去

ヒトに限らないが生物に備わっている免疫機能は本当に不思議だ。体外からの異物を検知するのは我々にとって非常に有用だが、時には異物ではない自分自身を攻撃することもあり、なぜ検出できる時とできないときがあるのかの明確な理由は分かっていないという。しかし、正しく区別するためには訓練が必要で、免疫系のトレーニングは2段階に分かれているようだ。

最初は母親の子宮の中にいるときで、クローン除去と呼ばれている。胎児の体の免疫細胞に、自分自身の体に由来するタンパク質を見せることから始まる。その時、自分のタンパク質に反応した免疫細胞は排除される。この作業は何週間にもわたって行われ、自分自身に反応しそうな免疫細胞はすっかり排除される。

乳児が生まれると、環境には様々な菌があふれている。そして、それらの菌から攻撃されることになるが、早期の免疫系はゆっくり反応して、「成り行きを見守る」方法を採用しているという。そして、感染症が発生するかどうかを見極めるのだ。もし感染症が発生すれば、異物は危険であり、攻撃を開始する。感染症が起きなければ、異物は取るに足らないもので、攻撃する必要がない。このようにして、異物を学習しているのだという。