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 clone 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が作成される。

この時指定する機種は,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
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

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

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


新しくコメントをつける

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

Front page   Freeze Diff Backup Copy Rename Reload   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Counter: 1193, today: 1, yesterday: 1
Last-modified: 2020-12-26 (Sat) 16:07:35 (JST) (816d) by yuji