Windows 上で Raspberry Pi 3 Model B+ の U-Boot イメージをビルドする手順を書いていく。
ただし、 U-Boot イメージのビルドには Bash on Ubuntu on Windows を使用する。
前提条件
- この記事この記事(Ubuntu on Windows を導入して mintty から操作できるようにする) の通り Bash on Ubuntu on Windows 導入していること
- MSYS2 で U-Boot のビルドに挑戦したけれどうまくいかなかったので、仕方なく Bash on Ubuntu on Windows を使う
U-Boot の準備
ネットワークブートに必要な U-Boot のビルドと設定を行う。 MSYS2 上でのビルドに成功しないので、この作業は Bash on Ubuntu on Windows 上で行う。 このセクションの作業はすべて Bash on Ubuntu on Windows 上で行う。
必要パッケージのインストール
sudo apt install git gcc-aarch64-linux-gnu device-tree-compiler
U-Boot の取得とビルド
mkdir ~/project
cd ~/project
git clone git://git.denx.de/u-boot.git
cd ~/project/u-boot
export CROSS_COMPILE=aarch64-linux-gnu-
make rpi_3_defconfig
make all
ブートスクリプトの作成
Raspberry Pi 起動時に、 TFTP サーバーへ接続してイメージのロードと実行を行うスクリプトを作成する。
boot.txt
を、下記の通り作成する。
dhcp 0x80000 192.168.2.100:kernel8.img
go 0x80000
boot.txt
を、 boot.scr
に変換する。
/PATH/TO/u-boot/tools/mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "PXE Boot" -d boot.txt ./boot.scr
ここで作成した boot.scr
を、 U-Boot 起動時に読み込ませることで、 TFTP サーバー 192.168.2.100
の kernel8.img
をイメージとして取得・ロードしてくれるようになる。
ネットワーク設定
ノート PC の無線 LAN を WAN に、有線を Raspberry Pi 3 に接続する。 そのままだと、有線が優先されるせいか WAN に出れないので、有線 LAN アダプタの設定を行う。
- 「タスクトレイのネットワークアイコンを右クリック -> ネットワーク共有センターを開く」選択
- 「アダプターの設定の変更」を選択
- 「イーサネットを右クリック -> プロパティ」を選択
- 「インターネットプロトコル バージョン 4(TCP/IPv4)」をダブルクリック
- 「次の IP アドレスを使う」を選択
- 下記通りに設定
- IP アドレス : 192.168.2.100
- サブネットマスク : 255.255.255.0
- デフォルトゲートウェイ : 192.168.2.1
- 他は空欄のままでよい
SD カードの準備
- ビルドした成果物の
u-boot.bin
を SD カードのルートにコピーする - 下記ページのファイルをすべて SD カードのルートにコピーする。
boot.scr
を SD カードのルートにコピーするconfig.txt
を書き換える
config.txt
の書き換え後の内容
enable_uart=1
arm_control=0x200
kernel=u-boot.bin
TFTPD の準備
TFTPD の取得
下記ページから tftpd64 standard edition (zip)
をダウンロードする。
TFTPD の設定
ダウンロード・展開してできた tftpd64.exe
を起動し、 Setting ボタンを押下。
グローバル設定画面で、 TFTP Server と DHCP Server を使用するように設定。
TFTPD 設定画面でいろいろ設定する。
- Base Directory
- TFTP で公開するディレクトリのルート(
kernel8.img
を置く。今回はC:\\Users\\mikoto\\project\\raspberrypi_bare_metal\\ftproot
を設定)
- TFTP で公開するディレクトリのルート(
- 下記チェックボックスにチェック
- Option negotiation
- Show Progress bar
- Translate Unix file names
- Bind TFTP to this address
192.168.2.100
(自分が Listen する IP アドレスを入力)
DHCPD 設定画面でもいろいろ設定する。
- この辺直感で設定したので根拠なし。誰かツッコミあればお願いしますって感じで。
OK ボタンを押下。
これで、TFTP のファイルを公開すると同時に、 PC と Raspberry Pi を繋げたときに、 Raspberry Pi に対して IP を設定してくれるようになる。
物理的な準備
- SD カードを Raspberry Pi に挿入
- PC と Raspberry Pi を LAN ケーブルで繋げる
- PC と Raspberry Pi を UART ケーブルでつなげる
ファイルの準備
実行したいプログラム( kernel8.img
) を TFTP のルートディレクトリにコピー
実行
Raspberry Pi の電源を入れる
Raspberry Pi を再起動するたび、 TFTP のルートディレクトリに格納した kernel8.img
が実行されるようになっている。
感想
- U-Boot, 積極的に使っていきたい。
- とりあえず目的は達成できたので満足。
- U-Boot のビルドに Ubuntu を使ったのが悔しくて仕方ない。
参考文献
- ラズパイ3でベアメタル - U-Bootでネットワーク起動 - へにゃぺんて@日々勉強のまとめ
- Raspberry Pi3 / arm64 - Debian/Ubuntu ミートアップ in 札幌 - debianmeetingresume201606-rpi3-presentation.pdf
以上。