ラズパイ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を実行すると、使用できるコマンド一覧を表示します。