組込みLinux Beaglebone Black でやってみる その5 ツールチェーン、U-Bootビルド

Cross Tool Chain インストール

Cross Tool Chainは多種のコンパイラを持っています。 ビルドを実行するホストPC用でダウンロードし、ターゲット(組込ボード)のCPUのアーキテクチャ(プラットフォーム)に適合したバイナリにコンパイルするためのものです。

クロスコンパイラ ダウンロード

Linaroはarm用のCross Tool ChainやLinux Kernelも手がける、arm用のクロスコンパイラとして最も有名な団体です。

  • uBuntu PCの場合、https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/ に行き、gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz をダウンロードします。(後々でますが、Buildroot-2022.11ではLinaro-ARM-2018.05しか使えませんでしたので、Buildroot時に別途2018.05もBuildroot内にインストールしました。)
  • 好きなところでExtract(解凍)する。 私の場合は、~/BBB_Workspace/Udemy-build/ で解凍しました。
  • *eabihfのhfはHard Floatの意味。 浮動小数点演算時HFだとFPUのレジスタに渡して受け取る。 Soft Floatは汎用レジスタ引き渡し。 BBBは浮動小数点演算をハードで処理するam3358 SoCを搭載しているのでhf指定です。

クロスコンパイラ用パス設定

ダウンロードして解凍したクロスコンパイラの場所のPATHを指定します。

  • export PATH=$PATH:/home/ichiri/BBB_Workspace/Udemy-build/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin を~/.bashrcの最後に書き込む。 
  • viのインサートモードでShift+Insで貼り付け。『viの使い方』
  • source .bashrc で.bashrc を再実行
  • ~/(ホームディレクトリ)で armと打ち込みTabキーを2回押すと、上記パス内のファイルが表示される。 これでPATHが通っていることが分かりクロスコンパイラのインストール完了。

U-BOOT コンパイル

U-BOOT ソースコード入手

以下のリンクからzipでダウンロードした

GitHub - u-boot/u-boot at v2022.10
"Das U-Boot" Source Tree. Contribute to u-boot/u-boot development by creating an account on GitHub.

*下の図は2021になっていますが、上記リンクは2022.11となっていて、私が使ったのも2022.11バージョンです。

以下のリンクはリストから選択してダウンロードできます。

Index of /pub/u-boot/

前回オブジェクトファイル削除

  • ~/BBB_Workspace/Downloads/u-boot-2022.10/ に移動
$ cd ~/BBB_Workspace/Downloads/u-boot-2022.10/
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

U-BOOTにBBBのデフォルトコンフィギュレーションを追加

  • 以下のコマンドで U−BOOTの各種設定する.config ファイルを生成。 
  • 1分弱で完了しました。
  • .configファイルは絶対に編集してはいけません。 編集するのは次のmanuconfigで編集する。
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am335x_evm_defconfig
//make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am335x_boneblack_defconfig <--- U-BOOT-2017年以前はこれ

menuconfigの設定を追加

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

menuconfigとは

  • U-BOOT、Linux Kernel、BusyBox、Buildrootなどのビルド前に、Windows BIOSの様なGUIで環境設定を変更できる。
  • Linux Kernelの場合は、menuconfigでドライバーの使用有無を設定できる
  • < > はKernel Moduleのモジュール化が可能な項目
  • この際、<*>とするとKernelに組み込まれてビルドされる。 高速に動作するが、RAM(DDR)容量を占有する。 また、後から見て何のModuleがインストールされたかがわからない。
  • <M>とすると、moduleとしてルートファイルシステムのディレクトリに入れられる。
  • { }には、Mか*しか設定できない。波括弧のオプションは他の機能/ドライバーがこの機能に依存しているため有効化またはモジュールとして有効化のみ。無効化することはできまない。
  • -M-、-*- は他の機能/ドライバーによって表示されている形式で、選択できない。
  • 基本的に、xxxxx_defconfigの初期値設定を使ってmenuconfigが出来ているので、アーキテクチャー用となっている。
  • xxxxx_defconfigは、複数のパターン(ボードやアーキテクチャー)をサポートしているので、本当に必要なドライバー以外も多く含まれているので、ビルド後のファイルサイズが大きくなる。
  • 不要なものはmenuconfigで削除する。
  • menuconfigはそれをカスタマイズする為のもの。
  • 項目上で『?』とすると、その項目のヘルプが表示される。 モジュールとして組み込む場合のモジュール名も記載されている。
  • どこからでも『/』を押すと検索ができる
  • 前の画面に戻るには『ESC』を2回押す

U-BOOT ビルド

最後にU-BOOTをビルドします。

  • 2分弱程度
  • 2回目以降、distcleanしなくても、menuconfigで値を変更してコンパイルできました。

このコンパイルで以下の3つのファイルが生成されます。 MLOはTI用ファイルです。

  • MLO ーーーUART経由立ち上げ以外の時の、RBLの次の2ndブートローダ。
  • u-boot-spl.bin —–UART経由でu-boot.img転送して立ち上げる時の2ndブートローダ。
  • u-boot.img ーー/BOOT/に入れておく、3rdブートローダーのU-BOOTイメージ。 U-BOOTの本体イメージファイル。 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j2   //2 core PCでコンパイルの時 2分弱で完成
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4   //4 core PCでコンパイルの時
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8   //8 core PCでコンパイルの時

ビルドを実行したディレクトリにMLOとu-boot.imgができました。 またその下のディレクトリ/spl/にu-boot-spl.binファイルができました。 これらをmicroSDに入れて使用します。

この3つのファイルが生成されたら『その5』は完了です。 新しく作ったMLOやu-boot.imgで『その4』を試してみてもいいと思います。

arm-linux-gnueabihf-gcc not found エラー対処法

U-BOOTコンパイルをした時、最初上記のエラーがでたので以下の対処をしました。

$ sudo apt install arm-linux-gnueabihf-gcc

コメント