1: 2019-06-30 (日) 03:44:21 yuji | 現: 2020-12-26 (土) 16:07:35 yuji Attached file: u-boot.bin, Attached file: u-boot.bin.pi2, Attached file: u-boot.bin.pi3, Deleted an attach file: u-boot.bin.pi4_6 at 2023-05-03 (水) 12:04:38, Deleted an attach file: u-boot.bin.pi3_6 at 2023-05-03 (水) 12:04:45 at 2023-05-03 (水) 12:05:47, Deleted an attach file: u-boot.bin.pi2 at 2023-05-03 (水) 12:06:16 at 2023-05-03 (水) 12:06:43 |
||
---|---|---|---|
Line 1: | Line 1: | ||
* RPi用U-Bootをビルド [#t0e53277] | * RPi用U-Bootをビルド [#t0e53277] | ||
- | Raspberry PiでNetworkブートする場合,ブートローダーにU-Bootを使用する方法がある。 | + | Raspberry PiでNetworkブートする場合,ブートローダーに[[U-Boot>http://www.denx.de/wiki/U-Boot/]]を使用する方法がある。 |
U-Bootをソースコードからビルドする場合,Raspberry Piでセルフビルドすると時間がかなり掛かってしまうので,PCでクロスコンパイルしてみる。 | U-Bootをソースコードからビルドする場合,Raspberry Piでセルフビルドすると時間がかなり掛かってしまうので,PCでクロスコンパイルしてみる。 | ||
- | Windowsマシン上でクロスコンパイラを使用しても,他のビルドツールの問題からかうまくビルド出来なかった。~ | + | Windowsマシン上でクロスコンパイラを使用しても,他のビルドツールの問題からかうまくビルド出来なかった。なので,Ubuntuマシンで作業を行った。 |
- | なので,Ubuntuで作業を行った。 | + | |
* U-Bootをビルドする [#jed4f84b] | * U-Bootをビルドする [#jed4f84b] | ||
- | クロスコンパイラはいくつかあるようだ。 | + | U-Bootをビルドするためのクロスコンパイラ(GCC)はいくつかあるようだ。 |
パッケージでインストール出来るクロスコンパイラを使ってみた。 | パッケージでインストール出来るクロスコンパイラを使ってみた。 | ||
Line 16: | Line 15: | ||
32bit ARM用のコンパイラの場合は, | 32bit ARM用のコンパイラの場合は, | ||
- | $sudo apt-get install g++-arm-linux-gnueabi device-tree-compiler u-boot-tools | + | $ sudo apt install g++-arm-linux-gnueabi device-tree-compiler u-boot-tools |
のようにしてインストール。 | のようにしてインストール。 | ||
Line 32: | Line 31: | ||
ソースコードを取得する。~ | ソースコードを取得する。~ | ||
$ mkdir ~/rpi | $ mkdir ~/rpi | ||
- | $ cd ~/work | + | $ cd ~/rpi |
- | $ git clone https://github.com/RobertCNelson/u-boot (本家の場合:git clone git://git.denx.de/u-boot.git) | + | $ git clone git://github.com/swarren/u-boot.git(本家の場合:git://git.denx.de/u-boot.git) |
$ cd ~/rpi/u-boot | $ cd ~/rpi/u-boot | ||
- | ** U-Bootのビルドする。~ [#rc493954] | + | ** U-Bootのビルド [#rc493954] |
環境変数CROSS_COMPILEをセットする。 | 環境変数CROSS_COMPILEをセットする。 | ||
$ export CROSS_COMPILE="arm-linux-gnueabi-" (32bit u-boot作成の場合) | $ export CROSS_COMPILE="arm-linux-gnueabi-" (32bit u-boot作成の場合) | ||
Line 43: | Line 42: | ||
それと, | それと, | ||
export USE_PRIVATE_LIBGCC=yes | export USE_PRIVATE_LIBGCC=yes | ||
- | を,しておく。これしておかないと,U-BootがRaspberry Piで起動できない。 | + | をセットしておく。これをしないと''U-BootがRaspberry Piで動かない。'' |
- | Raspberry Pi用のU-Bootをビルドする場合,makeに機種名を指定してビルドするようにする。~ | + | Raspberry Pi用のU-Bootをビルドする場合,makeにモデルを指定してビルドするようにする。~ |
Raspberry Pi,zero用をビルドする場合は, | Raspberry Pi,zero用をビルドする場合は, | ||
Line 59: | Line 58: | ||
$ make rpi_2_defconfig | $ make rpi_2_defconfig | ||
$ make all | $ make all | ||
- | とすると,Raspberry Pi2用の&ref(u-boot.bin.pi2);が作成される。 | + | とすると,Raspberry Pi2用の&ref(u-boot.bin.pi2,u-boot.bin);が作成される。 |
Raspberry Pi3用をビルドする場合は,~ | Raspberry Pi3用をビルドする場合は,~ | ||
Line 66: | Line 65: | ||
$ make rpi_3_32b_defconfig | $ make rpi_3_32b_defconfig | ||
$ make all | $ make all | ||
- | とすると,Raspberry Pi3用の&ref(u-boot.bin.pi3);が作成される。 | + | とすると,Raspberry Pi3用の&ref(u-boot.bin.pi3,u-boot.bin);が作成される。 |
- | この時指定する機種は,configsフォルダに定義ファイルが準備してある。Raspberry Piシリーズだと以下のようなファイルがあった。 | + | Raspberry Pi4用をビルドする場合は,~ |
+ | $ make clean | ||
+ | $ make distclean | ||
+ | $ make rpi_4_32b_defconfig | ||
+ | $ make all | ||
+ | とすると,Raspberry Pi4用の&ref(u-boot.bin.pi4,u-boot.bin);が作成される。 | ||
+ | |||
+ | Raspberry Pi Zero W用をビルドする場合は, | ||
+ | $ make clean | ||
+ | $ make distclean | ||
+ | $ make rpi_0_w_defconfig | ||
+ | $ make all | ||
+ | とすると,Raspberry Pi Zero W用の&ref(u-boot.bin.pi0w,u-boot.bin);が作成される。 | ||
+ | |||
+ | Raspberry Pi3(64bit)用をビルドする場合は,~ | ||
+ | $ make clean | ||
+ | $ make distclean | ||
+ | $ make rpi_3_defconfig | ||
+ | $ make all | ||
+ | とすると,Raspberry Pi3(64bit)用の&ref(u-boot.bin.pi364,u-boot.bin);が作成される。 | ||
+ | |||
+ | Raspberry Pi4(64bit)用をビルドする場合は,~ | ||
+ | $ make clean | ||
+ | $ make distclean | ||
+ | $ make rpi_4_defconfig | ||
+ | $ make all | ||
+ | とすると,Raspberry Pi4(64bit)用の&ref(u-boot.bin.pi464,u-boot.bin);が作成される。 | ||
+ | |||
+ | この時指定する機種は,configsフォルダに定義ファイルが準備してある。~ | ||
+ | Raspberry Piシリーズだと以下のようなファイルがあった。~ | ||
- rpi_defconfig Raspberry Pi, Zero~ | - rpi_defconfig Raspberry Pi, Zero~ | ||
- rpi_2_defconfig Raspberry Pi2~ | - rpi_2_defconfig Raspberry Pi2~ | ||
- rpi_3_32b_defconfig Raspberry Pi3(32bit)~ | - rpi_3_32b_defconfig Raspberry Pi3(32bit)~ | ||
- rpi_3_defconfig Raspberry Pi3(64bit)~ | - 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)~ | ||
- | * U-BootでMicroSDカードのRaspbianを起動してみる [#r82d831b] | + | * U-BootでSDカードのRaspbianを起動してみる [#r82d831b] |
- | 作成したU-Bootを使って,デフォルトのブートローダーの代わりに使ってみます。 | + | 作成したU-Bootを使って,デフォルトのブートローダーの代わりに使ってみます。(SDカードのカーネルとルートファイルシステムを使う) |
- | 使用しているRaspbianが入ったMicroSDカードのFAT/FAT32パーテーション(/boot)に,ビルドしたu-boot.binをコピーする。~ | + | 使用しているRaspbianが入ったSDカードのFAT/FAT32パーテーション(/boot)に,ビルドしたu-boot.binをコピーする。~ |
/boot/config.txtで,u-boot.binを使うように変更します。 | /boot/config.txtで,u-boot.binを使うように変更します。 | ||
kernel=u-boot.bin | kernel=u-boot.bin | ||
- | これでリブートすると,U-Bootがブートローダーとして起動するようになりました。(まだリブートはしない) | + | これでリブートすると,U-Bootがブートローダーとして起動するようになる。 |
- | U-Bootで起動した後,U-Bootのコマンドを自動実行するスクリプトファイルを作成します。 | + | U-Bootで起動した後,コマンドを自動実行するスクリプトファイルを作成します。~ |
- | まず,''boot.scr''を作成する。 | + | ''boot.txt''を作成する。 |
mmc dev 0 | mmc dev 0 | ||
setenv bootargs "earlyprintk console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait" | setenv bootargs "earlyprintk console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait" | ||
Line 90: | Line 121: | ||
fatload mmc 0:1 ${fdt_addr_r} bcm2708-rpi-b.dtb | fatload mmc 0:1 ${fdt_addr_r} bcm2708-rpi-b.dtb | ||
bootz ${kernel_addr_r} - ${fdt_addr_r} | bootz ${kernel_addr_r} - ${fdt_addr_r} | ||
- | boot.scrをU-Bootが認識できるファイルに変換します。~ | + | boot.txtをU-Bootが認識できるファイルに変換します。~ |
これには,mkimageコマンドを使います。(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 | + | $ 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が作成されます。 | + | &ref(boot_sd.scr.uimg,boot.scr.uimg);が作成されます。 |
- | 作成されたboot.scr.uimgをMicroSDカードの/bootにコピーする。 | + | 作成されたboot.scr.uimgをSDカードの/bootにコピーする。 |
これで,Raspberry PiをリブートするとU-Bootを使ってRaspbianが起動するようになる。 | これで,Raspberry PiをリブートするとU-Bootを使ってRaspbianが起動するようになる。 | ||
+ | |||
+ | この場合のU-Bootを使ったブートは,以下のように行われる。~ | ||
+ | - U-BootがSD/MicroSDカードから読み込まれ起動する~ | ||
+ | - 起動されたU-BootがSD/MicroSDカードの/bootにあるKernelとDevice Treeを読み込む~ | ||
+ | - Kernelを起動する~ | ||
+ | ここまでがU-Bootで行われる。~ | ||
+ | - その後,Kernelに渡されるオプションによりルートファイルがマウントされる~ | ||
+ | - 最初のプロセスであるsystemdが起動される~ |