9
29
2019
BeagleBone Botic7環境を自分で再構築してみる(その2)
Robert C. Nelson版BeagleBoneカーネルスクリプトをベースにBotic7関係の処理を追加する
前回の記事で、Miroslav Rudisin(Miero)さんが公開している”Botic7″ のGitHubリポジトリ “https://github.com/miero/linux-dev” を通じて、自分の手元のLinux開発環境で ”Botic7″化した Linuxカーネルを作成する手順を簡単に説明した.
今回は、Robert C. Nelsonさんが公開しているBeagleBoneカーネルに対して、Mieroさんがカーネルを”Botic7″ 化するために追加した部分を中心に、その概要を説明することにする.
Robert C. Nelson版BeagleBoneカーネルのビルド環境では、 シェルスクリプト “build_kernel.sh” を起動するだけで最終的なカーネルの構築までほぼ全自動でやってくれるので、その中身の構成が分からなくても何とかなったが、自分でカスタマイズした環境を構築するには、 “build_kernel.sh” スクリプトやそこから呼び出される一連のスクリプト群が何をやっているのかきちんと把握しなければならない.
これらの一連のスクリプト群の中身を覗いて見ると、その中では相当複雑な処理を行っており、Gitやシェルスクリプトのエクスパートでもなければ直ぐにはその内容を把握できないだろう.スクリプト自体はそれ程複雑ではないのだが、Linuxカーネルの構築という処理内容そのものがとても複雑なので、作業全体をスクリプトの組み合わせで行うにはどうしても複雑性が付き纏うのは仕方が無い.
シェルスクリプト愛好家であれば技巧を駆使したシェルスクリプトを見て心躍るのかもしれないが、私のような普通のスキルの人間にとっては他人が技巧を駆使して作ったシェルスクリプトほど厄介な物はないと言って良いくらいだ.勿論、シェルスクリプトでも分かり易くかつ綺麗なスクリプトは世の中に存在するが、大概は技術者の自己満足的な頭の体操のような物が多い.
最近、IT業界では “Ansible” による自動化が持て囃されているが、これまでのようなシェルスクリプトの呪縛から皆解き放されたいのかもしれない.今後は組み込み系の開発などの場面に於いても”Ansible” による自動化が進んで行くのだろうか...
Botic7の実装方法を探る
GitHubの”Botic7″リポジトリからカーネルのビルド環境を取得すると、”linux-dev” というディレクトリ配下は次のような構成となっている事だろう.
これらのファイルやディレクトリの役割や中身を簡単に説明する.”build_kernel.sh” はカーネルの構築を行うためのフロントエンド(メインスクリプト)で、”build_deb.sh” も同じようにカーネルの構築を行うためのフロントエンドだが、アウトプットが Debianのパッケージ形式 (debファイル)で吐き出すようだ.”build_mainline.sh”については、中身を確認していないので正体は不明.
“paches” ディレクトリが、R. C. Nelsonさんのカスタマイズパッチファイル群と今回の主役である、 “Botic7″化するための一連のパッチファイルが置かれている.”botic”ディレクトリ配下には全部で13個のBotic7パッチファイルが置かれており、Botic用のカーネル構成設定ファイル “.config” のテンプレートとして、”botic_defconfig” という構成設定ファイルが配置されている.実はBotic7関連の設定ファイルはこの2つと パッチ当てスクリプト”patch.sh”に書き加えられた “botic()” という関数モジュールだけだ.
パッチ当て処理用シェルスクリプト “patch.sh” の Botic7関係のパッチ当てを行っている部分を示す.#804 〜 #829 行目までの “botic()” 関数モジュールの定義と、#846行目の”botic()” 関数モジュール呼び出し “botic” が Botic7パッチ当て処理の中心部分だ.Botic7に関するコードの追加や関連コードの修正は全てこの “botic” ディレクトリ配下の13個のパッチファイルが担っている.
カーネル構築関連のスクリプトファイルのカスタマイズ
一連のR. C. Nelsonカーネルスクリプトをもう少し詳しく内容を調べておくことにする.
“version.sh”
カーネルのバージョンやビルド番号などの設定と、クロスコンパイラなどのツールのバージョン、カーネル設定ファイルのテンプレートファイル名などの設定を行う.
上記の”version.sh”の内容を書き換えることで、カーネルのバージョンや使用するクロス開発ツールのバージョンなどの組み合わせを変更する事が可能だが、カーネルのメインバージョン番号を V4.8 から V4.9以上に上げてしまうと、関係するカーネルのソースコードの互換性が無くなるため、残念ながら “Botic7” 関連のパッチファイルが適用できなくなってしまう.
”Botic7″がリリースされた当時の Kernel V4.8.13ではなく、カーネルのメインバージョン番号を最っと新しい物にしたい所だが、それを行うには、R. C. Nelson 版のカーネル構築環境自体を新しいバージョンに上げる必要がある.当然ながら”Botic7″ 関連のパッチファイルも自分でその内容を調べて、自分の手作業で関連するソースコードに逐次パッチ当てる作業が必要だ.
“diff”ツールで作成されたパッチファイルの内容は単純なので、人間がその内容を解釈しながらソースコードを改修することはそれ程難しい事では無いが、相当根気の要る作業であることは確かだ.”diff”ツールはとても単純でシンプルなのだが、その分融通が利かないので、後は人間が上手く判断して処理するしかない.
次に示す “version.sh” の内容は、 R. C. nelson版のBeagleBoneカーネル(V4.9 メインラインRealTime版)に、Botic7パッチと lightMPD用のカーネル構成ファイルの組み合わせで、カーネルビルドした際のものである.
“system.sh.sample”
システム側の実行環境設定に関するシェルスクリプト作成用のテンプレートファイルで、この内容を修正した物を “system.sh” というファイル名で同じディレクトリに配置する.環境変数 “CC” にユーザが用意したクロス開発環境が置かれているパスを登録しておくことで、メインスクリプト”build_kernel.sh” の実行中に、外部のクロス開発環境ダウンロードサイトからダウンロードすることなく、ユーザのローカル環境にインストールされているクロス開発環境を利用する事が可能となる.
以上、R. C. Nelson版のカーネル構築環境上でBotic7化されたカーネルを実装する方法について概要を説明したが、次回は”Botic7″化の中身についてもう少し詳しく説明する予定だ.BeagleBoneに実装されている TI の Sitarra SoCプロセッサに組み込まれている、”McASP” というシリアル信号処理モジュールが、”Botic7″での I2S信号出力の要なのだが、時間が無く”McASP”のマニュアルに目を通している暇がないので、”Botic7″での I2Sマルチチャネル再生の実現はもう少し先になりそうだ.
“Botic7″のLinuxルートファイルシステム(ディストリビューション)は一般的な Debian Linux(Wheezy)なので、オーディオプレイヤー用途には向かない.電源を切る前にシャットダウンコマンドを投入しなければならないなんて、オーディオ機器としては論外だ.何時でも “電源ブチッ” ができるようでなければどんなに音が良くても使う気にはなれない.
ネットワークオーディオプレイヤーとしては、やはり lightMPD(+Botic Kernel) の組み合わせが使い勝手が良い.今回、 “Botic7” 化されたカーネルの構築が自分で簡単にできるようになったので、以前入手したBeaglBoard X15 によるオーディオプレイヤー作りも行ってみようと思う.X15のCPU性能はBeagleBone Blackの4倍以上と言うことなので、これにBotic化されたRealTimeカーネル、lightMPDの組み合わせでどのような音が再生されるのか楽しみだ.
時間があれば、lightMPDのルートイメージの作成方法や Yocto Projects による組み込み系のLinux開発についてもフォローしてみようと思う.