retrage.github.io

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 
ome/retrage/src/edk2/Build/AppPkg/DEBUG_GCC48/ARM/AppPkg/Applications/Hello/Hello/DEBUG/Hello.dll 0xBA005220
FS0:\> 

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

参考: