【Ubuntu 18.04/16.04 LTS】Raspberry Pi用のu-bootをコンパイルする

スポンサーリンク

Raspberry Pi」用に、u-bootをUbuntのLinux上でコンパイルする。

ARMクロスコンパイル環境の準備

ARMツールチェーンなどのコンパイル環境は、下記記事でインストール済の環境を使う。

【Ubuntu 18.04 LTS Server】ARMのGCCコンパイル環境を構築する
以前の記事で、「Ubuntu 18.04 LTS Server」をインストールした。 そこで、ARM用のGCCコンパイラをインストールして使えるようにしたので備忘録を残す。 ARMツールチェーンのインストール 「gcc-arm-none-e...
【Windows10/WSL Ubuntu 18.04】ARMのGCCコンパイル環境を構築する
以前の記事で、Windows10のWSLで「Ubuntu 18.04」が使えるようにした。そこで、ARM用のGCCコンパイラをインストールして使えるようにしたので備忘録を残す。 ARMツールチェーンのインストール 「gcc-arm-none...
【macOS】ARMのGCCコンパイル環境を構築する(brewから公式「GNU Arm Embedded Toolchain」をインストール)
以前の記事でARMのGCCコンパイル環境を構築したが、Homebrewからインストールできたので、備忘録を残す。 ARMツールチェーンのインストール 基本的には、下記GitHubに記載の手順でインストール。「the Arm GCC tool...
  • macOSでもコンパイル可能。

u-bootソース一式を取得

適当な作業フォルダーで、下記gitコマンドでGitHubから取得(本家サイトからでも可)

$ git clone https://github.com/RobertCNelson/u-boot
  • 本家のサイトからは「git clone git://git.denx.de/u-boot.git」コマンドで取得。

「Raspberry Pi」用をコンパイル

作業フォルダに移動

$ cd u-boot

環境変数の設定(~/.bashrcなどに記述しておいてもよい)

$ export CROSS_COMPILE="arm-none-eabi-"

まずは、「Raspberry Pi 」用をコンパイル(ZeroでもOK)

$ make distclean
$ make rpi_defconfig
$ make u-boot.bin

作成した、u-boot.binをどこかにコピーしておき、
続いて、「Raspberry Pi 2」用をコンパイル

$ make clean
$ make distclean
$ make rpi_2_defconfig
$ make u-boot.bin

作成した、u-boot.binをどこかにコピーしておき、
続いて、「Raspberry Pi 3(32bit)」用をコンパイル

$ make clean
$ make distclean
$ make rpi_3_32b_defconfig
$ make u-boot.bin

尚、コンパイルできる種類は、configsのフォルダに定義が準備してあり、Raspberry Pi関係は以下の指定が使える
・rpi_defconfig … Raspberry Pi 1, Zero用
・rpi_2_defconfig …Raspberry Pi 2用
・rpi_3_32b_defconfig …Raspberry Pi 3(32bit)用
・rpi_3_defconfig …Raspberry Pi 3(64bit)用

※Raspberry Pi 3(64bit)用は、2016/8/11現在、私の環境ではコンパイルエラーとなった。いまの所64bit版は必要ないので、とりあえずヨシとする。

u-bootを起動

ここで、作成したu-boot.binのファイルをSDカードにコピーし、config.txtファイルに、下記行を記述して起動する。

# Raspberry Pi 3では下記を有効にする
# enable_uart=1
kernel=u-boot.bin

尚、Raspberry Piでのu-bootの起動については、後の記事で紹介する。

fatloadコマンドで不具合?

loads や loadbコマンドで、自作プログラムをシリアル経由で転送して実行させる事はできたが、fatload コマンドで、SDカードに記録しておいたプログラムを読み込んで実行させようとすると、2016/8/11版のソースではうまく実行できなかった。
どうやらキャッシュ不整合がおきているような感じなので、ソースの下記部分を修正したu-bootで試すとOK。
本不具合はそのうち修正されるかもしれないので、参考まで。

/fs/fs.cのdo_load()関数内の下記ソースの箇所に”flush_cache(addr, len_read);”の行を追加

 416                 puts(")");
 417         }
 418         puts("\n");
 419 
 420         flush_cache(addr, len_read);   //←この行を追加 
 421 
 422         setenv_hex("fileaddr", addr);
 423         setenv_hex("filesize", len_read);
 424 
 425         return 0;
 426 }

コンパイル済u-bootバイナリファイル(2016/8/25追記)

GitHubに公開、後の記事で紹介。

【Raspberry Pi】u-bootバイナリファイル公開(JTAGピン有効版)
関連記事で報告した、Raspbery Pi Zero〜3用のコンパイル済みu-bootのバイナリファイルをGitHubに公開した。(下記URL) u-boot起動に必要な全てのファイルを同梱。JTAGピンも有効にしてあり、コンパイル環境を揃...

補足

  • コンパイラのバージョンは、多少違ってても大丈夫だが Ver6.x 以上が必要。

参照記事

「GNU Make 第3版 日本語版(オライリー)」の無料PDF
ソフトウェアのビルドに欠かせないmakeですが、便利な反面機能も豊富。 私が読んだ中でお薦めなのが、オライリー「GNU Make 第3版」の本。この本は持ってはいるのですが、分厚い本なので持ち運びも大変で電子版が出たら買いたいと思っていたら...

参考

  1. Das U-Boot
  2. git.denx.de Git – u-boot.git/summary
  3. GitHub u-bootミラー
  4. Raspberry Pi 2 で PXE boot してみる
  5. KMC Staff Blog:KZM-A9-GTボードのU-Bootをソースからビルドする(更新)
  6. KMC Staff Blog:U-Bootのデバッグ

コメント

  1.  高木 利公 より:

    記事のU-Boot(GitHubに公開されていたもの)をいろいろ使わせて頂きました。有難うございました。
    さて、「Raspberry Pi Zero W/WH」へのu-boot適用(Zero WHで動作確認済み)のご報告です。Raspberry Pi1用のu-boot.binを作り直して、config.txtに「enable_uart=1」挿入で動作しました。
     また、configsのフォルダにはrpi_0_w_defconfigも定義されてましたが、make rpi_0_w_defconfigで作成したu-boot.binでは動きませんでした。原因は不明です。

    ーーー ビルド環境 —
    2018年8月に、以下のようにして u-boot.bin(Zero W/WH用)を作成しました。
    マシン:Ubunts 18.04 64ビット
    U-Boot ソース:「git clone https://github.com/RobertCNelson/u-boot」で2018年7月末にget。
    make:  以下の2種類を作成。ビルドは成功。
        1) make rpi_defconfig
        2) make rpi_0_w_defconfig
    実際にZero WH で動かしてみましたが、2)で作成したu-boot.binでは動来ませんでした。
    1)で作成したu-boot.binに、config.txtに「enable_uart=1」挿入で動作しました。
    なお、2016年版(GitHubに公開)のPai1用のu-boot.binではenable_uart=1」挿入でもだめでした。

    以上 ご報告まで。
     高木

    • yoko より:

      コメントありがとうございます。
      「Raspberry Pi Zero W」は持ってないので、また機会があれば試してみようと思います。
      きっと今までのuartは、Raspberry Pi3と同じようにブルートゥースとかに使われているのでしょうね。
      ご報告ありがとうございました。

タイトルとURLをコピーしました