この記事はCoins Advent Calendarの19日目の記事となる予定であったものです。[1]
序文
みなさん、電子辞書は使っていらっしゃるでしょうか。電子辞書には、画面(多くの場合はタッチパネル)とキーボード、そして辞書の情報を処理するためのSoCが積まれています。これはほとんど画面とキーボードのついたRaspberry Piと言えるでしょう。Puhitaku氏の偉大な成果により、シャープの電子辞書Brainの上でLinuxが動くようになったのは周知の事実だと思われます。今回は、その方の作ったDebianポートとは別に、NixOS[2]を電子辞書にポートした記録を書こうと思います。
電子辞書の基本的なスペック
私が持っている(ポートする対象となる)電子辞書は以下のようなスペックを持っています。
SoC: I.MX 283
CPU: ARM926EJ-S 454MHz
割と大昔のARMが載っている
ガラケーやニンテンドーDSと同じ世代
GPU: そんなものはない
一応GPUの欠片くらいの機能を積んだ何かが載ってはいるが、普通には使えない
メモリ: 128MB
eMMC: 8GB
キーボード: あり
タッチパネル: あり
microSDスロット: あり
大変有望なスペックですね。
どうやってポートするのか?
基本的にはNixOSをLicheepiというRisc-Vにポートするときの設定を利用しました。しかし、いくつか修正しなければいけない点がありました。
アーキテクチャの違い
NixOSで公式にサポートされているのはx86_64とARM64のみです。今回使う電子辞書のCPUはいくらARMとはいってもArmv5というArmv7ですらないいにしえのCPUなので、すべてのパッケージを自前でビルドする必要があります。幸いにして、Nixのパッケージはソースさえ存在していればビルドとインストールの差で操作はほとんど変わりませんので助かりました。以下のようにしてパッケージのターゲットを変更すると、Armv5向けにパッケージがビルドされ、インストールされたイメージが作成されます。
config = "armv5tel-unknown-linux-gnueabi";
gcc.arch = "armv5te";
gcc.abi = "aapcs-linux";
この設定はSheevaPlug向けのNixOSのポートを参考にしました。
U-boot
U-bootははるか昔に電子辞書に移植されていますが、電子辞書向けのU-bootはextconfigを読むこむ設定がなされていません。代わりに、zImageという名前のカーネルをそのまま起動するようになっています。このU-bootをそのまま利用するためには、NixOSのイメージビルダーがextconfig.confで本来行うはずだった設定をこちらで行う必要があります。
このようにして電子辞書用カーネルと電子辞書向けU-bootをパッケージングし、イメージをビルドすると…
結論
あとはSubstitutersなどの設定を適切に行いクロスコンパイル環境を整え、電子辞書でパッケージがビルドされないようにすれば[3]電子辞書上のNixOSで快適な開発が可能であると思われます。
私はNeovimなどの設定もNixで管理していたので、そのまま利用することができました。できるだけ早急に電子辞書向けNixOSのイメージとソースを公開できるように整備するつもりです。みなさんもよきNixOS生活をお過ごしください。