【Raspberry Pi】u-bootを動かす

スポンサーリンク
728×90 ビッグバナー

前の記事で作成した、u-bootを、「Raspberry Pi」に入れて、動かしてみる。

シリアル接続の準備

u-bootでは、シリアル通信を使って、コマンド入出力する。
シリアル-USB変換ケーブルが必要で、私はアマゾンから下記を入手。搭載チップはPL2303HX。
3.3V信号用のものであれば、他のものでも使える。
また、デスクトップパソコンのシリアルポートも使えるが、信号レベル変換が必要。

Windows10パソコンでは、ドライバのバージョンによって認識できない事もあるようで、下記のドライバーを使う事で動作した。
http://www.ifamilysoftware.com/news37.html

Raspberry Piとシリアル接続の配線

Raspberry Piの40ピンコネクタとの配線は、以下の写真を参考。
尚、配線は、Raspberry Pi 2やZeroでも同じである。

写真

Raspberry Pi <ー> シリアル-USB 接続

Raspberry Pi ピン名称 ピン番号 シリアル-USB信号
GND 6 GND (黒)
GPIO 14 (TXD) 8 RX (白)
GPIO 15 (RXD) 10 TX (緑)

※シリアル-USBの+3.3V(赤)は未接続としておく

通信ソフトの準備

通信ソフトは、Windowsでは定番の「Tera Term」を利用する。シリアル通信の設定は、下記。

  • ボーレート :115200
  • データ長 :8bit
  • パリティー :なし
  • ストップビット :1
  • フロー制御 :なし

起動用SDカードの準備

ファイル容量は4GByteもあれば十分なので、FATフォーマットされたマイクロSDカードを準備し、下記ファイルをSDカードのルートに書き込む。

  1. bootcode.bin
  2. start.elf
  3. u-boot.bin
  4. config.txt

注1)1,2のファイルは、Raspberry Piの起動ディスクにあるものか、又は、下記URLから取得する。最新のものを使っていれば、Raspberry Pi Zero〜3まで共通。
 https://github.com/raspberrypi/firmware/tree/master/boot
注2)3のファイルは、前の記事で作成したファイルを使う。
注3) 4のconfig.txtファイルはテキストエディターで作成し、内容は下記。

Raspberry Pi Zero〜2

kernel=u-boot.bin

Raspberry Pi 3

enable_uart=1
kernel=u-boot.bin

Raspberry Piを起動

前記で作成した起動用SDカードを、Raspberry Piにセットして、電源起動すると、シリアル通信で、u-bootの起動メッセージが表示される。
カウントダウンするので、その間にキー入力するとコマンド入力できる。 “help”と入力すると使えるコマンドの一覧が表示される。
これで、Raspberry Piに自作したプログラムを転送して実行できる環境が出来た。
尚、手持ちのRspberry Pi Zero, 2, 3で動作する事は確認できた。

u-boot起動後すぐにコマンド入力待ちにする

u-bootのデフォルトでは、起動直後、環境変数bootdelayに設定の時間カウントダウン待ちした後に、環境変数bootcmdに設定してあるコマンドを自動実行する。bootdelayの値が「-1」の時は、時間待ちせずにすぐにコマンド待ちとなる。
下記の手順で、環境変数bootdelayを設定し記憶する。

U-Boot> setenv bootdelay -1
U-Boot> saveenv

saveenvコマンドにより、u-boot.envファイルがSDカードに作成され、次の起動時に読み込まれる。
もし、デフォルトの状態に戻したければ、このu-boot.envファイルを削除すればよい。

自作プログラムの転送実行

自作したプログラムは、シリアル経由ではloadsやloadbコマンドでロードし、goコマンドで実行する。又は、SDカードに格納したプログラムは、fatloadコマンドでロードできる。
u-bootは最初0x8000番地から実行されるが、その後、後ろのアドレス(0x07F46000番地あたり)に自分自身を移動して動作する。なので自作プログラムは、0x8000番地〜に配置するように作ればOK。

TeraTermでのモトローラSフォーマットファイルの転送&実行手順

U-Boot> loads
(TeraTermから、ファイル→ファイル送信...→<ファイル選択>)
U-Boot> go 8000

TeraTermでのバイナリファイルの転送&実行手順

U-Boot> loadb 8000
(TeraTermから、ファイル→転送→Kermit→送信...→<ファイル選択>)
U-Boot> go 8000

SDカードに格納したバイナリファイルの転送&実行手順

U-Boot> fatload mmc 0 8000 <ファイル名>
U-Boot> go 8000
  • fatloadによるロードは、2016/8/11現在のソースでは不備があるようなので注意(詳しくは前の記事参照)
  • u-bootが自分自身を移動する番地は、bdinfoコマンドで表示される”relocaddr”で確認できる。

SDカードに格納した自作プログラムの自動実行

u-bootは、環境変数bootcmdに設定してあるコマンドを自動実行する。コマンドは;で区切って複数記述できる。下記の要領で設定する。

U-Boot> setenv bootcmd 'fatload mmc 0 8000 <ファイル名>; go 8000'
U-Boot> setenv bootdelay 2
U-boot> saveenv

電源投入で、SDカードに格納してある自作プログラムが自動実行できる。

又、CPUや周辺のハードウェアの初期化処理をきちんと記述すれば、config.txtのkernel行にファイル名を記述して、u-boot経由ではなく自作プログラムを直接実行する事もできる。

簡単な自作プログラムの例やコンパイル方法など、今後の記事で紹介していきたい。

補足

Raspberry Piのブートシーケンスは、電源投入するとARM CPUが立ち上がるのではなく、最初はGPUが立ち上がり、GPUがbootcode.binstart.elfを読み込み実行。
GPUはリセットベクタを0x0番地にコンフィグ情報を0x100番地にセット。続いてconfig.txtのkernel行で指定のファイル(無指定のデフォルトはkernel.img)を0x8000番地に読み込み、ARM CPUのリセットを解除し0x8000番地からのプログラムが実行される。

u-bootの参考マニュアル

別ボード用のマニュアルであるが、以下が参考になる。

コンパイル済u-bootバイナリファイル(2016/8/25追記)

GitHubに公開、後の記事で紹介。

参照記事

参考

  1. Raspberry pi 3 にシリアルで接続できるようにしてみる
  2. Raspberry Pi · GitHub
  3. raspberrypi/firmware
  4. config.txt – Raspberry Pi Documentation
  5. Born in an end summer’s day (Nato un giorno di fine estate): Raspberry PI bare metal Part 1: The Boot Process
  6. Raspberry Pi2(Linux Kernel)のブートシーケンスを読む(その1) アーキテクチャ依存部 – Qiita
スポンサーリンク
レシポンシブ広告
レシポンシブ広告

シェアする

フォローする