SSブログ

beagleboard を触ろう - x-loader ビルド [組み込みソフト]

それでは、ブートローダーをビルドしてみましょう。
beagleboard のブートローダーは、次のように3段階に分かれています。

第1段        第2段      第3段
Boot ROM ⇒ x-loader ⇒ u-boot

Boot ROM は、OMAP3530 の中にある内臓 ROM に収められているコードです。
どのような処理を行っているか知ることができないばかりか、書き換えることもできません。
リセットベクターのジャンプ先が Boot ROM です。
Boot ROM は、必ず最初に実行されます。

x-loader, u-boot は、両方ともソースコードが公開されているので、入手してビルドすることができます。
x-loader の役割は u-boot をロードすること、u-boot の役割は Linux をロードすることです。

x-loader の役割は u-boot をロードすることだけ?
x-loader 要らなくない?
Boot ROM が、x-loader をすっ飛ばして u-boot をロードした方がいいのでは?

と思えてしまいますが、そうはいきません。
Boot ROM は SDRAM を初期化しないので、SRAM しか使えないんです。
ところが、SRAM のサイズは 64KB しかありません。
u-boot のサイズは 280KB ほどありますので、SRAM に収まり切りません。

そこで、サイズの小さな x-loader が間に挟まれます。
x-loader のサイズは 22KB ほどなので、SRAM に収まります。
x-loader は SDRAM を初期化して、SDRAM に u-boot をロードします。
カーネルのロードは u-boot に任せます。

u-boot に任せる必要あるのか?
カーネルのロードを x-loader がやってしまえばいいのでは?

u-boot は tftp が使えたり、NAND の読み書きができたり、カーネルにパラメータ渡したりと、いろいろなサービスを提供しています。
必要最低限のサービスしか要らないというのであれば、x-loader を拡張して Linux をいきなりブートさせることは可能だと思います。


さて、Boot ROM の所在は 内臓 ROM でしたが、x-loader, u-boot は、SD カードもしくは NAND flash ROM に配置します。
x-loader は SD カード、u-boot は NAND flash(またはその逆)のような構成を取ることもできるはずですが、x-loader, u-boot とも書き込みのしやすい SD カードに置くことにしましょう。

SD カードに置く場合、x-loader のイメージは MLO、u-boot のイメージは u-boot.bin という名前でないといけません。

ソースコードビルドは、http://elinux.org/BeagleBoard#Source を参照します。
そこのリンクから http://gitorious.org/beagleboard-validation/ に行ってみましょう。
x-loader, u-boot, linux のソースコードが取得できそうですね。
x-loader だと、git://gitorious.org/beagleboard-validation/x-load.git という URL が記載されています。

git:// からソースコードを取得するには、git というツールを使います。
git は、Linux 版はもちろんありますし、Windows cygwin 版もあります。
これを使って、↓のようにソース取得します。

$ git clone git://gitorious.org/beagleboard-validation/x-load.git xloader↓

ローカルに xloader ディレクトリが作成され、xloader 以下にソースコードが取得されます。
http://elinux.org/BeagleBoard#Source を見ると、distclean して config して make すればいいと書いてあるので、この通りにします。

$ cd xloader↓
$ make distclean↓
$ make omap3530beagle_config↓
$ make↓

これを行うと、おお、さくっとビルドされますね。
xloader ディレクトリに x-load とか、x-load.bin とかが生成されます。

x-load は、ELF 実行形式ファイルです。
コード+データに、ELF ヘッダー、プログラムヘッダーなど、プログラムロードの際に必要な情報が付加されたものが ELF 実行形式ファイルです。
Linux 上における実行形式ファイルは ELF 形式ですね。
Linux カーネルは、ELF ヘッダー、プログラムヘッダーを解釈して適切にロードしてくれます。

x-loader のようなブートローダーは、カーネルがロードして実行してくれるわけではないので、ELF である必要はありません。
というより、前段ブートローダーである Boot ROM は、x-loader をアドレス 0x40200800 にロードして、その先頭である 0x40200800 にジャンプしてくるので、先頭に ELF ヘッダーがある ELF 実行形式ではうまくいきません。

ELF 実行形式から、objcopy を使って余分な情報を取り除いたのが x-load.bin になります。
BSS 領域の展開も行われるはずですね。
下の図では、BSS が展開されてデータ領域が少し大きくなった様子にしてみました。

x-loader_format.jpg

x-load.bin は、ファイル先頭からコードが配置される構造になっていて、ファイル先頭がエントリポイントになっています。
なので、Boot ROM が x-load.bin を 0x40200800 にロードして、0x40200800 にジャンプしてくると、ちょうど都合よく x-loader のエントリポイントから処理が開始されることになります。

SD ブートさせる場合、SD カードの中には MLO という名前で保存する必要があります。
これは、Boot ROM が SD カードから x-loader をロードする際には、x-load.bin という名前ではなく、MLO という名前でファイルを読み出すように出来ているからです。
MLO という名前は決め打ちになっており、変えることができません。

なお、MLO = x-load.bin ではありません。
x-load.bin の先頭に 8バイトのヘッダーを付加したものが、MLO になります。
この 8バイトヘッダーを付加するには、singGP というツールを使います。

http://beagleboard.googlecode.com/files/signGP.c

からソースコードを入手します。
普通にビルドしましょう。

$ gcc -o signGP signGP.c↓

のような感じです。
x-load.bin を signGP にかませると、x-load.bin.ift なるファイルが出来上がります。

$ ./signGP x-load.bin↓

x-load.bin.ift が、x-load.bin に 8バイトヘッダーを付加したファイルです。
x-load.bin.ift を、MLO という名前にリネームし、SD カードにコピーします。
SD カードは先頭 64MB が FAT32、残りが ext3 になっていますが、FAT32 の方にコピーです。

それではこの MLO でブートしてみましょう。
SD ブートさせるには、beagleboard に搭載されている 2つのボタンのうち、USER ボタンを押下しておく必要があります。
SD カードを刺して USER ボタンを押しながら、5V 電源オンです。


Texas Instruments X-Loader 1.4.4ss (Jul 17 2011 - 07:57:49)
Beagle Rev C4
Reading boot sector
Loading u-boot.bin from mmc


U-Boot 2011.03-rc1-00000-g5ace684-dirty (May 15 2011 - 18:50:56)

OMAP3530-GP ES3.1, CPU-OPP2, L3-165MHz, Max CPU Clock 720 mHz
OMAP3 Beagle board + LPDDR/NAND
I2C: ready
DRAM: 256 MiB
NAND: 256 MiB
MMC: OMAP SD/MMC: 0
*** Warning - bad CRC, using default environment

In: serial
Out: serial
Err: serial
Beagle Rev C4
timed out in wait_for_pin: I2C_STAT=0
No EEPROM on expansion board
Die ID #0bea0004000000000403a38103023017
Hit any key to stop autoboot: 2


めでたく次段ブートローダーである u-boot がブートできていますね。
x-loader のビルドは成功です。


ここで、MLO と x-load.bin の先頭を比べてみましょう。

x-loader_head.png

MLO の先頭には、0x58 0x5a 0x00 0x00 0x00 0x08 0x20 0x40 の 8バイトが付加されていることが分かります。
MLO の 8バイト目以降は、x-load.bin と同じですね。
MLO の先頭 8バイトは、4バイトのファイルサイズ、4バイトのロードアドレスというフォーマットです。

ファイルサイズ:0x5a58 (= 23128)
ロードアドレス:0x40200800

ファイルサイズは、x-load.bin のファイルサイズですね。
Boot ROM は、この情報を見て、x-loader をアドレス 0x40200800 から 23128 バイト分 SRAM にロードして、アドレス 0x40200800 にジャンプしていると思われます。

試しに、この 0x40200800 を違うアドレスに変えてみましょう。

変更できるアドレスは、SRAM のアドレスに限ります。
アドレス範囲は、0x40200000 - 0x4020FFFF の 64KB です。

ここでは、ロードアドレスを 0x40201000 に変更してみます。
そのために、2つの作業を行う必要があります。

・1つ目は、x-loader をビルドし直して開始アドレスを 0x40201000 に変えること
・2つ目は、MLO のヘッダー内のロードアドレスを 0x40201000 に変えること

まず 1つ目です。
x-loader は、デフォルトでは 0x40200800 が開始アドレスとなるようにビルドされます。
ビルドの様子を見てみると、最後のリンクで次のようなメッセージが出ています。


arm-none-linux-gnueabi-ld -Bstatic -T /home/beagle/beagleboard/xloader/board/omap3530beagle/x-load.lds -Ttext 0x40200800 ・・・


-Ttext 0x40200800 が、開始アドレスを決定しているところですね。
board/omap3530beagle/config.mk に TEXT_BASE = 0x40200800 とありますので、これを変更します。
TEXT_BASE = 0x40201000 に変更して、make clean して再ビルドしてみましょう。

arm-none-linux-gnueabi-ld -Bstatic -T /home/beagle/beagleboard/xloader/board/omap3530beagle/x-load.lds -Ttext 0x40201000 ・・・

リンクメッセージを見てみると、0x40200800 から 0x40201000 に変わっています。

次に 2つ目の作業です。
signGP.c を見てみると、ヘッダーのロードアドレスを変更するには、第3引数にロードアドレスを指定すればよいことが分かります。

$ ./signGP x-load.bin 0x40201000↓

とやると、ヘッダーには先頭アドレス 0x40201000 が書かれた x-load.bin.ift ができあがります。
一応先頭部分を確認してみましょう。

x-loader_head2.png

4バイト目のところが 0x00 0x10 0x20 0x40 になっているので、0x40201000 ですね。

これで準備 OK です。
x-load.bin.ift を MLO にリネームして、SD カードにコピーしましょう。
そして、SD カードを beagleboard に刺し、USER ボタンを押しながら、5V 電源オンです。

Texas Instruments X-Loader 1.4.4ss (Jul 17 2011 - 21:56:54)
Beagle Rev C4
Reading boot sector
Loading u-boot.bin from mmc


U-Boot 2011.03-rc1-00000-g5ace684-dirty (May 15 2011 - 18:50:56)


u-boot が普通にブートします。
OK です。

・・・

だから何?という気もしますが、まあそれはそれで・・
nice!(0)  コメント(1)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 1

Mataerord

Fedex Progesterone Online Amex Accepted Overseas Cod Knowsley http://cialibuy.com - п»їcialis Low Cost Cialis Generic <a href=http://cialibuy.com>online cialis</a> Acquisto Levitra Bayer
by Mataerord (2020-01-25 06:28) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。