前の記事で作成した、u-bootを、「Raspberry Pi」に入れて、動かしてみる。
シリアル接続の準備
u-bootでは、シリアル通信を使って、コマンド入出力する。
シリアル-USB変換ケーブルが必要で、私はアマゾンから下記を入手。搭載チップはPL2303HX。
3.3V信号用のものであれば、他のものでも使える。
また、デスクトップパソコンのシリアルポートも使えるが、信号レベル変換が必要。
Windows10パソコンでは、ドライバのバージョンによって認識できない事もあるようで、下記のドライバーを使う事で動作した。
http://www.ifamilysoftware.com/news37.html
【2018/03/03追記】
- パソコン更新したら、Windows10で上記ドライバーで動かせなかったが、下記記事を参考にドライバのダウングレードで動いた。
Windows10でPL2303を無理やり動かす
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カードのルートに書き込む。
bootcode.bin
start.elf
u-boot.bin
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.bin
→start.elf
を読み込み実行。
GPUはリセットベクタを0x0番地にコンフィグ情報を0x100番地にセット。続いてconfig.txtのkernel行で指定のファイル(無指定のデフォルトはkernel.img
)を0x8000番地に読み込み、ARM CPUのリセットを解除し0x8000番地からのプログラムが実行される。
u-bootの参考マニュアル
別ボード用のマニュアルであるが、以下が参考になる。
コンパイル済u-bootバイナリファイル(2016/8/25追記)
GitHubに公開、後の記事で紹介。
コメント