|
1: 2019-06-30 (日) 03:44:21 yuji |
| + | * RPi用U-Bootをビルド [#t0e53277] |
| + | Raspberry PiでNetworkブートする場合,ブートローダーにU-Bootを使用する方法がある。 |
| | | |
| + | U-Bootをソースコードからビルドする場合,Raspberry Piでセルフビルドすると時間がかなり掛かってしまうので,PCでクロスコンパイルしてみる。 |
| + | |
| + | Windowsマシン上でクロスコンパイラを使用しても,他のビルドツールの問題からかうまくビルド出来なかった。~ |
| + | なので,Ubuntuで作業を行った。 |
| + | |
| + | * U-Bootをビルドする [#jed4f84b] |
| + | クロスコンパイラはいくつかあるようだ。 |
| + | |
| + | パッケージでインストール出来るクロスコンパイラを使ってみた。 |
| + | |
| + | ** クロスコンパイラのインストール [#t53fd735] |
| + | ARM用クロスコンパイラを以下のようにしてインストールした。~ |
| + | |
| + | 32bit ARM用のコンパイラの場合は, |
| + | $sudo apt-get 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 |
| + | として,バージョン表示されればインストールは出来ている。 |
| + | |
| + | ** U-Bootのソースコード取得 [#pf077892] |
| + | ソースコードを取得する。~ |
| + | $ mkdir ~/rpi |
| + | $ cd ~/work |
| + | $ git clone https://github.com/RobertCNelson/u-boot (本家の場合:git clone git://git.denx.de/u-boot.git) |
| + | $ cd ~/rpi/u-boot |
| + | |
| + | ** U-Bootのビルドする。~ [#rc493954] |
| + | 環境変数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用の&ref(u-boot.bin);が作成される。 |
| + | |
| + | Raspberry Pi2用をビルドする場合は, |
| + | $ make clean |
| + | $ make distclean |
| + | $ make rpi_2_defconfig |
| + | $ make all |
| + | とすると,Raspberry Pi2用の&ref(u-boot.bin.pi2);が作成される。 |
| + | |
| + | Raspberry Pi3用をビルドする場合は,~ |
| + | $ make clean |
| + | $ make distclean |
| + | $ make rpi_3_32b_defconfig |
| + | $ make all |
| + | とすると,Raspberry Pi3用の&ref(u-boot.bin.pi3);が作成される。 |
| + | |
| + | この時指定する機種は,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)~ |
| + | |
| + | * U-BootでMicroSDカードのRaspbianを起動してみる [#r82d831b] |
| + | 作成したU-Bootを使って,デフォルトのブートローダーの代わりに使ってみます。 |
| + | |
| + | 使用しているRaspbianが入ったMicroSDカードのFAT/FAT32パーテーション(/boot)に,ビルドしたu-boot.binをコピーする。~ |
| + | |
| + | /boot/config.txtで,u-boot.binを使うように変更します。 |
| + | kernel=u-boot.bin |
| + | これでリブートすると,U-Bootがブートローダーとして起動するようになりました。(まだリブートはしない) |
| + | |
| + | U-Bootで起動した後,U-Bootのコマンドを自動実行するスクリプトファイルを作成します。 |
| + | まず,''boot.scr''を作成する。 |
| + | 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.scrをU-Bootが認識できるファイルに変換します。~ |
| + | これには,mkimageコマンドを使います。(U-Bootをビルドした時にも,このコマンドもビルドされている。)~ |
| + | $ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "MMC Boot" -d boot.scr boot.scr.uimg |
| + | boot.scr.uimgが作成されます。 |
| + | 作成されたboot.scr.uimgをMicroSDカードの/bootにコピーする。 |
| + | |
| + | これで,Raspberry PiをリブートするとU-Bootを使ってRaspbianが起動するようになる。 |