ラズパイ3でベアメタル - U-Bootでネットワーク起動

ラズパイ3での動作確認のために毎回microSDカードを書き換えるのは面倒なので、
U-Bootを使用してネットワーク経由でkernel8.imgをRAMの0x80000以降にダウンロードし、起動してみます。


なお、Raspberry Pi 3で64bitベアメタル(bare metal)プログラミングを試してみる
本シリーズの目次はコチラです。



U-Bootでkernel8.imgをネットワーク経由でダウンロード・起動するために必要な作業は以下のとおりです。
0. Raspberry Pi 3とPCをシリアルケーブルで接続
1. U-BootをmicroSDカードへインストール
2. 開発PCへTFTPサーバをセットアップ
3. U-Bootで起動し、ネットワーク経由でダウンロード、起動

0. Raspberry Pi 3とPCをシリアルケーブルで接続

U-Boot上で各種操作を行うコンソールへはシリアル通信でアクセスします。


PCとRaspberry Pi 3のシリアル通信での接続方法は、「Raspberry Pi シリアル通信」辺りで検索すると色々と出てきます。
(Raspberry Pi 3の記事も既に色々なサイトで書かれている様ですが、Raspberry Pi側のピン番号等、
Raspberry Pi 2と同じなので、2の記事を参考にしても良いと思います。)


例えば、以下の記事が参考になるかと思います。


なお、(まだ分かってないですが、)「起動するイメージが毎回同じ」等で、
U-Boot上で操作を行う必要がない場合は、設定を保存しておけばこの手順は不要です。

1. U-BootをmicroSDカードへインストール

Raspberry Pi 3用のU-Bootは、既に移植しバイナリをGitHubで公開されている方が居り、
以下の様な手順でcloneとmicroSDへのインストールが可能です。

[PC]$ sudo mount /dev/mmcblk0p1 /mnt/tmp
[PC]$ git clone https://github.com/Electron752/boot64-rpi3.git
[PC]$ sudo cp boot64-rpi3/boot/{bcm2837-rpi-3-b.dtb,boot.scr.uimg,config.txt,u-boot-stubbed.bin} /mnt/tmp/
[PC]$ sudo umount /mnt/tmp

2. 開発PCへTFTPサーバをセットアップ

開発PC(kernel8.imgのビルドを行っているPC)にTFTPサーバをセットアップします。

[PC]$ sudo apt-get install tftp tftpd
[PC]$ sudo mkdir -p /srv/tftp
[PC]$ sudo chown -R nobody:nogroup /srv/tftp
[PC]$ sudo chmod -R 777 /srv/tftp
[PC]$ sudo systemctl restart inetd


以上でセットアップは完了で、
作成した/srv/tftpディレクトリにネットワーク経由でダウンロードさせたいイメージファイルを配置します。

[PC]$ cp <作業ディレクトリのパス>/kernel8.img /srv/tftp/

あるいはシンボリックリンクでもOKです。

[PC]$ ln -s <作業ディレクトリのパス>/kernel8.img /srv/tftp/kernel8.img


参考

3. U-Bootで起動し、ネットワーク経由でダウンロード、起動

U-BootをインストールしたmicroSDカードを使用してRaspberry Pi 3を起動すると、
PCでシリアルポートを開いている端末アプリ(TeraTerm等)側で以下のように表示されます。

U-Boot 2016.03-g9e6687d (Apr 04 2016 - 15:31:23 -0700)

DRAM:  944 MiB
RPI 3 Model B (0xa02082)
MMC:   bcm2835_sdhci: 0
reading uboot.env

** Unable to read "uboot.env" from mmc0:1 **
Using default environment

In:    serial
Out:   lcd
Err:   lcd
Net:   Net Initialization Skipped
No ethernet found.
starting USB...
USB0:   Core Release: 2.80a
scanning bus 0 for devices... 3 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
       scanning usb for ethernet devices... 1 Ethernet Device(s) found
Hit any key to stop autoboot:  0


以下のメッセージが表示されている間にEnter等何らかのキーを入力してください。

Hit any key to stop autoboot:


すると、以下のようにU-Bootのプロンプトが表示されます。

U-Boot>


ネットワーク経由でイメージをメモリへダウンロードするコマンドは「dhcp」で、
指定したアドレスから実行するコマンドは「go」です。


なので、これまで作成してきたkernel8.imgは以下のように実行できます。

U-Boot> dhcp 0x00080000 <開発PCのIPアドレス>:kernel8.img
U-Boot> go 0x00080000


また、セミコロン(;)で区切ると1行で書けます。

U-Boot> dhcp 0x00080000 <開発PCのIPアドレス>:kernel8.img; go 0x00080000


各コマンドの使い方は「help」コマンドで確認できます。

U-Boot> help <コマンド名>

また、引数なしでhelpを実行すると、使用できるコマンド一覧を表示します。