RPi用U-Bootをビルド anchor.png

Raspberry PiでNetworkブートする場合,ブートローダーにU-Bootを使用する方法がある。

U-Bootをソースコードからビルドする場合,Raspberry Piでセルフビルドすると時間がかなり掛かってしまうので,PCでクロスコンパイルしてみる。

Windowsマシン上でクロスコンパイラを使用しても,他のビルドツールの問題からかうまくビルド出来なかった。なので,Ubuntuマシンで作業を行った。

Page Top

U-Bootをビルドする anchor.png

U-Bootをビルドするためのクロスコンパイラ(GCC)はいくつかあるようだ。

パッケージでインストール出来るクロスコンパイラを使ってみた。

Page Top

クロスコンパイラのインストール anchor.png

ARM用クロスコンパイラを以下のようにしてインストールした。

32bit ARM用のコンパイラの場合は,

$ sudo apt install g++-arm-linux-gnueabi device-tree-compiler u-boot-tools

のようにしてインストール。

64bit ARM用コンパイラの場合は,

$ sudo apt install g++-aarch64-linux-gnu device-tree-compiler u-boot-tools

のようにしてインストール。

両方インストールしても切り替えて使用できる。

インストール出来ているかの確認。(32bitコンパイラの場合)

$ arm-linux-gnueabi-gcc --version

として,バージョン表示されればインストールは出来ている。

Page Top

U-Bootのソースコード取得 anchor.png

ソースコードを取得する。

$ mkdir ~/rpi
$ cd ~/rpi
$ git clone git://github.com/swarren/u-boot.git(本家の場合:git://git.denx.de/u-boot.git)
$ cd ~/rpi/u-boot
Page Top

U-Bootのビルド anchor.png

環境変数CROSS_COMPILEをセットする。

$ export CROSS_COMPILE="arm-linux-gnueabi-"   (32bit u-boot作成の場合)
  or
$ export CROSS_COMPILE="aarch64-linux-gnu-"   (64bit u-boot作成の場合)

それと,

export USE_PRIVATE_LIBGCC=yes

をセットしておく。これをしないとU-BootがRaspberry Piで動かない。

Raspberry Pi用のU-Bootをビルドする場合,makeにモデルを指定してビルドするようにする。

Raspberry Pi,zero用をビルドする場合は,

$ make clean
$ make distclean
$ make rpi_defconfig
$ make all

とすると,Raspberry Pi,zero用のfileu-boot.binが作成される。

Raspberry Pi2用をビルドする場合は,

$ make clean
$ make distclean
$ make rpi_2_defconfig
$ make all

とすると,Raspberry Pi2用のfileu-boot.binが作成される。

Raspberry Pi3用をビルドする場合は,

$ make clean
$ make distclean
$ make rpi_3_32b_defconfig
$ make all

とすると,Raspberry Pi3用のfileu-boot.binが作成される。

Raspberry Pi4用をビルドする場合は,

$ make clean
$ make distclean
$ make rpi_4_32b_defconfig
$ make all

とすると,Raspberry Pi4用のfileu-boot.binが作成される。

Raspberry Pi Zero W用をビルドする場合は,

$ make clean
$ make distclean
$ make rpi_0_w_defconfig
$ make all

とすると,Raspberry Pi Zero W用のfileu-boot.binが作成される。

Raspberry Pi3(64bit)用をビルドする場合は,

$ make clean
$ make distclean
$ make rpi_3_defconfig
$ make all

とすると,Raspberry Pi3(64bit)用のfileu-boot.binが作成される。

Raspberry Pi4(64bit)用をビルドする場合は,

$ make clean
$ make distclean
$ make rpi_4_defconfig
$ make all

とすると,Raspberry Pi4(64bit)用のfileu-boot.binが作成される。

この時指定する機種は,configsフォルダに定義ファイルが準備してある。
Raspberry Piシリーズだと以下のようなファイルがあった。

  • rpi_defconfig Raspberry Pi, Zero
  • rpi_2_defconfig Raspberry Pi2
  • rpi_3_32b_defconfig Raspberry Pi3(32bit)
  • rpi_3_defconfig Raspberry Pi3(64bit)
  • rpi_0_w_defconfig Raspberry Pi zero W
  • rpi_4_32b_defconfig Raspberry Pi4(32bit)
  • rpi_4_defconfig Raspberry Pi4(64bit)
Page Top

U-BootでSDカードのRaspbianを起動してみる anchor.png

作成したU-Bootを使って,デフォルトのブートローダーの代わりに使ってみます。(SDカードのカーネルとルートファイルシステムを使う)

使用しているRaspbianが入ったSDカードのFAT/FAT32パーテーション(/boot)に,ビルドしたu-boot.binをコピーする。

/boot/config.txtで,u-boot.binを使うように変更します。

kernel=u-boot.bin

これでリブートすると,U-Bootがブートローダーとして起動するようになる。

U-Bootで起動した後,コマンドを自動実行するスクリプトファイルを作成します。
boot.txtを作成する。

mmc dev 0
setenv bootargs "earlyprintk console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait"
fatload mmc 0:1 ${kernel_addr_r} kernel.img
fatload mmc 0:1 ${fdt_addr_r} bcm2708-rpi-b.dtb
bootz ${kernel_addr_r} - ${fdt_addr_r}

boot.txtをU-Bootが認識できるファイルに変換します。
これには,mkimageコマンドを使います。(U-Bootをビルドした時にも,このコマンドもビルドされている。)

$ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "SD Boot" -d boot.txt boot.scr.uimg

fileboot.scr.uimgが作成されます。 作成されたboot.scr.uimgをSDカードの/bootにコピーする。

これで,Raspberry PiをリブートするとU-Bootを使ってRaspbianが起動するようになる。

この場合のU-Bootを使ったブートは,以下のように行われる。

  • U-BootがSD/MicroSDカードから読み込まれ起動する
  • 起動されたU-BootがSD/MicroSDカードの/bootにあるKernelとDevice Treeを読み込む
  • Kernelを起動する
    ここまでがU-Bootで行われる。
  • その後,Kernelに渡されるオプションによりルートファイルがマウントされる
  • 最初のプロセスであるsystemdが起動される

新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 1370, today: 1, yesterday: 1
最終更新: 2020-12-26 (土) 15:07:35 (JST) (1215d) by yuji