BeagleBoneBlack上でUEFIを動かしてみる
BeagleBoneBlack(以下、BBB)実機上でUEFIを動かしてみます。
前回の記事ではBeagleBoardでしたが、ここではBBBを扱います。
既にBBB向けにポーティングしている方がいらっしゃいましたので、 これを使ってみます。
varadgautam/TexasInstrumentsPkg · GitHub
環境
上の記事の環境をそのまま使っています。
Ubuntu 14.04 LTS
EDK2 df60fb4cc2ca896fcea9e37b06c276d569f1a6b8
TexasInstrumentsPkg 694f654c9ab4ab34e207e3c2f591e2076c794e61
動作確認には以下のものを使いました。
BeagleBoneBlack Rev A5C
FTDI TTL-232R-3V3
ビルド
まずはEDK2のディレクトリにBBB向けのパッケージを持ってきます。
$ pwd
/home/retrage/src/edk2
$ git clone https://github.com/varadgautam/TexasInstrumentsPkg.git
Conf/target.txt
を編集してBBBのパッケージを指定。
ACTIVE_PLATFORM = TexasInstrumentsPkg/BeagleBoneBlackPkg/BeagleBoneBlackPkg.dsc
これでビルドできるはずなのですが、私の環境ではundefined reference to '__stack_chk_fail'
などと出て
ビルドが失敗してしまいました。いくつか対処方法はあるようですが、ここではConf/tools_def.txt
を編集して
DEBUG_GCC48_ARM_CC_FLAGS = DEF(GCC48_ARM_CC_FLAGS) -O0 -fno-stack-protector
とすることでスタック保護機能を無効にしてしまいました。これで一応はビルドが通るようになりました。
ビルドが通るとBuild/
にファイルが置かれます。
$ ls Build/BeagleBoneBlack/DEBUG_GCC48/FV/
BEAGLEBONEBLACK_EFI.fd FVMAIN_COMPACT.Fv.map FVMAIN.Fv FVMAIN.inf
Ffs FVMAIN_COMPACT.Fv.txt FVMAIN.Fv.map GuidedSectionTools.txt
FVMAIN_COMPACT.Fv FVMAIN_COMPACT.inf FVMAIN.Fv.txt Guid.xref
BEAGLEBONEBLACK_EFI.fd
を使ってみます。
動作確認
できたBEAGLEBONEBLACK_EFI.fd
をmicroSDに入れておきます。
microSDはFATでフォーマットされたものを使います。
ポーティングされた方が書かれたブログ記事にはU-Bootがu-boot.img
を探して起動するから
.fdのファイルの名前を変えておく、みたいな話がありますが、
ここでは手動で読み込ませるので特に必要なさそうですが、とりあえず変えておきました。
次にBBB実機を使って動作確認をしてみます。 BBBにFTDIのケーブルを接続してPCとシリアル通信させます。 FTDIの黒色の線とBBB基板の白ドットのある側のピンを接続し、一方のUSBをPCに接続します。
私の環境ではホストをMac OS XとしてVMWare Fusionで上記のUbuntuを動かしています。 そのため、下記のコマンドは環境により異なると思います。
$ screen /dev/tty.usbserial-FTHK48YW 115200
BBB上のU-Bootを起動します。私の環境ではmicroSDを入れた状態で再起動することで起動しました。
U-Boot# mmc list
OMAP SD/MMC: 0
OMAP SD/MMC: 1
MMC0がmicroSDでした。
U-Boot# fatls mmc 0 /
...
983040 u-boot.img
2 file(s), 4 dir(s)
ここで、TexasInstrumentsPkg/BeagleBoneBlackPkg/BeagleBoneBlackPkg.fdf
に書かれているBaseAdressを確認します。そのままでは
[FD.BeagleBoneBlack_EFI]
BaseAddress = 0x80800000|gArmTokenSpaceGuid.PcdFdBaseAddress # The base address of the Firmware in NOR Flash.
...
となっているので、0x80800000がBaseAdressになっているようです。
以下のコマンドでBaseAdressにu-boot.img
を読み込ませます。
U-Boot# fatload mmc 0 80800000 u-boot.img
reading u-boot.img
983040 bytes read in 120 ms (7.8 MiB/s)
実行します。
U-Boot# go 80800000
するとUEFI Shellが起動します。
Shell>
Shell> ver
UEFI Interactive Shell v2.1
EDK II
UEFI v2.50 (BeagleBoneBlack EFI Nov 7 2015 21:58:09, 0x00000000)
これで動作することが確認できました。
おまけ
AppPkgをビルドしてできるUEFIアプリケーションをmicroSDに入れて実行してみました。
Shell> fs0:
FS0:\> Hello.efi
...
add-symbol-file > /home/retrage/src/edk2/Build/AppPkg/DEBUG_GCC48/ARM/AppPkg/Applications/Hello/Hello/DEBUG/Hello.dll 0xBA005220
Loading driver at 0x000BA005000 EntryPoint=0x000BA005221 Hello.fi
Hello there fellow Programmer.
Welcome to the world of EDK II.
remove-symbol-file
ome/retrage/src/edk2/Build/AppPkg/DEBUG_GCC48/ARM/AppPkg/Applications/Hello/Hello/DEBUG/Hello.dll 0xBA005220
FS0:\>
デバッグ情報が前後に出てしまっていますが、動いていることが確認できます。
参考: