BeagleBoneBlack上でUEFIを動かしてみる

BeagleBoneBlack(以下、BBB)実機上でUEFIを動かしてみます。

前回の記事ではBeagleBoardでしたが、ここではBBBを扱います。

QEMUでARM向けUEFIを動かしてみる - めもちょー

既にBBB向けにポーティングしている方がいらっしゃいましたので、 これを使ってみます。

varadgautam/TexasInstrumentsPkg · GitHub

環境

EDK2のクロスコンパイル - めもちょー

上の記事の環境をそのまま使っています。

  • 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 /home/retrage/src/edk2/Build/AppPkg/DEBUG_GCC48/ARM/AppPkg/Applications/Hello/Hello/DEBUG/Hello.dll 0xBA005220

FS0:>

デバッグ情報が前後に出てしまっていますが、動いていることが確認できます。

参考:

Porting UEFI to BeagleBoneBlack: Technical Details I | /home/varad

U-Boot on BeagleBone Black

BeagleBoardPkg - Tianocore