2014年09月24日

[Yocto] Intel E38xx Bay Trail用BSPのビルド

新しい研究テーマとしてYocto Projectへの取り組みを始めました。本業の仕事で同じテーマの研究開発をやっているため必要に迫られて始めてしまったものですが、Yocto Projectが組込み分野において将来性の高いテーマであることが判ってきたことも大きな理由です。

Intel Z37xx Bay Trail-Tを搭載したタブレット製品はすでに日本国内でもたくさんの種類の製品が販売されていますが、E38xx Bay Trail-Iを搭載した製品はまだ数が少ないようです。しかし、海外ではすでに多くの種類の製品が登場しています。ARMも本来は省電力性能に優れたコアですが、SoCやSoM上に高性能なGPUを一緒に搭載するケースが増えるに伴い、ここ数年で消費電力が一気に高くなってきました。モバイル機器の場合搭載できるバッテリーの容量に限界があるため、プロセッサの省電力性能は製品設計上の大きな要件となります。ここにきてZ37xxやE38xxなどのBay Tralシリーズを搭載した製品が増えている理由は、これらのプロセッサの処理能力対省電力の性能バランスが非常に優れているからです。しかも、現状多くのARMブロセッサがまだ32ビット・コアなのに対してBay Trailは64ビット・コアです。これからBay Trailを搭載した製品がさらに増えていくでしょうし、タブレットなどのコンシューマ製品だけでなく組込み機器でも採用例が急増していくでしょう。x86アーキテクチャはARMより歴史が長いため、Linuxを代表とするオープンソース・ソフトウェア資産の量と質でも優位性があります。Intel社も組込み分野の取り組みを拡大しているので、Bay Trailとその動向を追いかけていくことは大きな可能性があると思っています。Intel Atom E38xxシリーズ製品のトップページと同プロセッサのデータシートのリンクを下に掲載しておきます。

 Intel(R) Atom(TM) Processor E3800 Product Family (Formerly Bay Trail)
 Intel(R) Atom(TM) Processor E3800: Datasheet

前記事では、Yocto LinuxをQEMU x86ターゲット用にビルドして動作確認を行うまでの手順について解説しました。QEMUは実機ターゲット無しで始められるので手っ取り早くて良いのですが、やはり実機ターゲットを使わないと組込み開発の醍醐味は味わえない気がします。そこで、Yocto Project研究着手の第二段階の作業として、Intel Atom E38xx Bay TrailターゲットでYocto Linuxを動かすことに挑戦します。Intel E38xx Bay Trailプロセッサを搭載したボードはまだ手に入れていないので、取りあえず、本記事にはBSPのビルド手順についてのみ記載します。E38xx用BSPはYocto Projectのサイトで配布されていますが、同BSPのビルド手順が記載されたドキュメントはIntel Embedded Design Centerから入手できます(同サイトの一部のドキュメントやソフトウェアは、ユーザー登録をしないと入手できせん)。それらのリンクを掲載しておきます。
  1. Yocto Project* Setup: Getting Start Guide
  2. Building Intel(R) Atom(TM) Processor E3800 Development Kit Yocto Project Board Support Package (BSP): User Guide

以降の作業は、上記のドキュメントを参照しながら進めていきました。また、Yocto LinuxのIntel E38xx BSPをビルドする過程で一つの問題に遭遇したので、それを解決した際のTips情報も記します。

■ Intel E38xx BSPビルド環境のセットアップ


まず最初に、Yocto Projectの公式サイトからIntel E38xxのBSPパッケージをダウンロードしました。そして、それをディレクトリpoky-daisy-11.0.1(Yocto LinuxのYP Core - Daisy 1.6.1リリースのパッケージファイルyocto-1.6.1/poky-daisy-11.0.1.tar.bz2を展開すると、作成されるディレクトリ)の中へ展開しました。
$ wget http://downloads.yoctoproject.org/releases/yocto/yocto-1.6.1/machines/valleyisland/valleyisland-1.0-daisy-1.6.1.tar.bz2
$ tar -jxvf valleyisland-1.0-daisy-1.6.1.tar.bz2 -C poky-daisy-11.0.1

このパッケージを展開すると、ディレクトリpoky-daisy-11.0.1の中にmeta-intelというディレクトリが作成されます。このディレクトリの中にIntel E38xx BSPのレシピが格納されています(Yocto Linuxでは、BSPもレシピの集合体です)。

ちなみに、このBSPは複数のIntel製E38xx搭載ボードに対応していますが、その中の一つが「Valley Island Development Kit」という旧称だったらしいです。Audio CodecやEthernet Controllerなどの外付けデバイスを除いて、市販のE38xx搭載ボードはIntel製ボードと同じ回路構成になっているものが多いようです。そのため、このBSPから生成したイメージは大抵のE38xxターゲットでそのまま動作します。

続いて、これからE38xxターゲット用にYocto Linuxのビルドを進めていくので、その作業ディレクトリを作成しました。
$ cd poky-daisy-11.0.1
$ source oe-init-build-env valleyisland

スクリプトoe-init-build-envを実行すると、パラメータで指定したディレクトリが作成され、自動的にそのディレクトリへ移動します。また、同ディレクトリの中に以下の3つのファイルが作成されます。
  • conf/bblayers.conf
  • conf/local.conf
  • conf/templateconf.cfg

参照ドキュメントBに記載されている手順に従って、ここで、conf/bblayers.confに以下のような変更を加えました。
--- bblayers.conf.orig	2014-09-24 10:37:56.647617629 +0900
+++ bblayers.conf 2014-09-24 11:51:08.512524758 +0900
@@ -9,6 +9,9 @@
/home/yuhri/Yocto/poky-daisy-11.0.1/meta \
/home/yuhri/Yocto/poky-daisy-11.0.1/meta-yocto \
/home/yuhri/Yocto/poky-daisy-11.0.1/meta-yocto-bsp \
+ /home/yuhri/Yocto/poky-daisy-11.0.1/meta-intel \
+ /home/yuhri/Yocto/poky-daisy-11.0.1/meta-intel/meta-isg/meta-valleyisland \
+ /home/yuhri/Yocto/poky-daisy-11.0.1/meta-intel/meta-tlk \
"
BBLAYERS_NON_REMOVABLE ?= " \
/home/yuhri/Yocto/poky-daisy-11.0.1/meta \

このbblayers.confというファイルには、レシピが格納されてる最上位ディレクトリ(これを「Layer(レイヤ)と呼びます」)の一覧が定義されています。bitbakeコマンドの実行時に、これらのディレクトリがレシピ検索の対象となります。上では、既存のレイヤにmeta-intelディレクトリに格納されている3つのレイヤを追加しています。これによって、E38xx BSPを構成する全レシピがbitbakeコマンドから参照できるようになります。

さらに、conf/local.confにも以下の変更を加えました。
--- local.conf.orig	2014-09-24 10:37:56.643617498 +0900
+++ local.conf 2014-09-24 10:50:20.594415847 +0900
@@ -17,18 +17,18 @@
# These two options control how much parallelism BitBake should use. The first
# option determines how many tasks bitbake should run in parallel:
#
-#BB_NUMBER_THREADS ?= "4"
+BB_NUMBER_THREADS ?= "8"
#
# Default to setting automatically based on cpu count
-BB_NUMBER_THREADS ?= "${@oe.utils.cpu_count()}"
+#BB_NUMBER_THREADS ?= "${@oe.utils.cpu_count()}"
#
# The second option controls how many processes make should run in parallel when
# running compile tasks:
#
-#PARALLEL_MAKE ?= "-j 4"
+PARALLEL_MAKE ?= "-j 8"
#
# Default to setting automatically based on cpu count
-PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}"
+#PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}"
#
# For a quad-core machine, BB_NUMBER_THREADS = "4", PARALLEL_MAKE = "-j 4" would
# be appropriate for example.
@@ -55,7 +55,7 @@
#MACHINE ?= "edgerouter"
#
# This sets the default machine to be qemux86 if no other machine is selected:
-MACHINE ??= "qemux86"
+MACHINE ??= "valleyisland-64"

#
# Where to place downloads
@@ -251,3 +251,8 @@
# track the version of this file when it was generated. This can safely be ignored if
# this doesn't mean anything to you.
CONF_VERSION = "1"
+
+# The meta-valleyisland contains support for Intel HD Audio. However, HD Audio
+# driver is dependent on gstreamer plugins and ffmpeg plugins to work properly.
+# These gstreamer plugins require license flags in order to be included in the build.
+LICENSE_FLAGS_WHITELIST = "commercial"

local.conf内に存在する「MACHINE ??= "valleyisland-64"」という設定項目がビルド対象ターゲットの定義です(local.confが作成された段階では、本項目は常に「qemux86」に設定されています)。Yocto LinuxのBSPには必ずターゲット定義ファイルというものが格納されています。E38xx BSPのターゲット定義ファイルは以下の2つです。
  • meta-intel/meta-isg/meta-valleyisland/conf/machine/valleyisland-32.conf
  • meta-intel/meta-isg/meta-valleyisland/conf/machine/valleyisland-64.conf

ファイル名から判るように、上記はそれぞれ32ビットと64ビット版Linuxのシステム構成です。これらのファイルの中から選択して、そのファイル名(「.conf」を除いた)を「MACHINE」に設定すると、bitbakeコマンドはターゲットを確定できるようになります。

また、local.conf内のBB_NUMBER_THREADS PARALLEL_MAKEの値をいずれも「8」に変更していますが、その理由は、開発ホストのUbunutを動かしているVMware仮想マシンのプロセッサコア数を4に変更したからです。

■ Intel E38xx BSPのビルド


Intel E38xx BSPのビルド環境が整ったので、ビルド対象イメージとしてcore-image-satoを指定して、その全ソースをダウンロードしました。
$ bitbake -c fetchall core-image-sato

しかし、下のようなエラーメッセージが出力されて、この処理は途中で停止してしまいました(エラー停止したのは、10分以上処理が進んだ後でした)。
ERROR: Fetcher failure: Fetch command failed with exit code 128, output:
fatal: repository '/home/ilab/linux-yocto/linux-yocto-3.10' does not exist

ERROR: Function failed: Fetcher failure for URL: 'git:///home/ilab/linux-yocto/linux-yocto-3.10;protocol=file;nocheckout=1;branch=standard/base,meta,valleyisland-io-2.0;name=machine,meta,valleyisland-io'. Unable to fetch URL from any source.
ERROR: Logfile of failure stored in: /home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-intel-common-poky-linux/linux-yocto/3.10.43+gitAUTOINC+cf4d9720de_aa677a2d02-r0/temp/log.do_fetch.13046
ERROR: Task 19 (/home/yuhri/Yocto/poky-daisy-11.0.1/meta/recipes-kernel/linux/linux-yocto_3.10.bb, do_fetch) failed with exit code '1'
NOTE: Tasks Summary: Attempted 628 tasks of which 0 didn't need to be rerun and 1 failed.
Waiting for 0 running tasks to finish:

Summary: 1 task failed:
/home/yuhri/Yocto/poky-daisy-11.0.1/meta/recipes-kernel/linux/linux-yocto_3.10.bb, do_fetch
Summary: There were 14 WARNING messages shown.
Summary: There were 2 ERROR messages shown, returning a non-zero exit code.

上のエラーメッセージの一部の文字列を指定してgrep検索すると、meta-intel/meta-isg/meta-valleyisland/recipes-kernel/linux/linux-yocto_3.10.bbappendというファイルがヒットしました。そこで、このファイルの内容を眺めていると、その中に以下のような記述の誤りが存在することに気づきました。
--- linux-yocto_3.10.bbappend.orig	2014-06-18 20:23:30.000000000 +0900
+++ linux-yocto_3.10.bbappend 2014-09-24 12:22:41.806418515 +0900
@@ -1,35 +1,35 @@
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

#############################
# MACHINE = valleyisland-32 #
#############################
COMPATIBLE_MACHINE_valleyisland-32 = "valleyisland-32"
KMACHINE_valleyisland-32 = "valleyisland-32"
KBRANCH_valleyisland-32 = "standard/base"
KERNEL_FEATURES_valleyisland-32 = " features/valleyisland-io/valleyisland-io \
features/valleyisland-io/valleyisland-io-pci"

LINUX_VERSION_valleyisland-32 = "3.10.43"
SRCREV_machine_valleyisland-32 = "aa677a2d02677ec92d59a8c36d001cf2f5cf3260"
SRCREV_meta_valleyisland-32 = "199943142f7e0a283240246ee6c02f4376b315f0"
SRCREV_valleyisland-io_valleyisland-32 = "27bc40c174bb4ca160eafd6ccf3da9e774c9a8c7"

SRC_URI_valleyisland-32 = "git://git.yoctoproject.org/linux-yocto-3.10.git;protocol=git;nocheckout=1;branch=${KBRANCH},${KMETA},valleyisland-io-2.0;name=machine,meta,valleyisland-io"

#############################
# MACHINE = valleyisland-64 #
#############################
COMPATIBLE_MACHINE_valleyisland-64 = "valleyisland-64"
KMACHINE_valleyisland-64 = "valleyisland"
KBRANCH_valleyisland-64 = "standard/base"
KERNEL_FEATURES_valleyisland-64 = " features/valleyisland-io/valleyisland-io \
features/valleyisland-io/valleyisland-io-pci.scc"

LINUX_VERSION_valleyisland-64 = "3.10.43"
SRCREV_machine_valleyisland-64 = "aa677a2d02677ec92d59a8c36d001cf2f5cf3260"
-SRCREV_meta_valleyisland-64 = "cf4d9720de1c0f64402de70833dd6ccc12d04a3f"
+SRCREV_meta_valleyisland-64 = "199943142f7e0a283240246ee6c02f4376b315f0"
SRCREV_valleyisland-io_valleyisland-64 = "27bc40c174bb4ca160eafd6ccf3da9e774c9a8c7"

-SRC_URI_valleyisland-64 = "git:///home/ilab/linux-yocto/linux-yocto-3.10;protocol=file;nocheckout=1;branch=${KBRANCH},${KMETA},valleyisland-io-2.0;name=machine,meta,valleyisland-io"
+SRC_URI_valleyisland-64 = "git://git.yoctoproject.org/linux-yocto-3.10.git;protocol=git;nocheckout=1;branch=${KBRANCH},${KMETA},valleyisland-io-2.0;name=machine,meta,valleyisland-io"

module_autoload_i2c-dev = "i2c-dev"

SRCREV_meta_valleyisland-64SRC_URI_valleyisland-64はGit経由で取得するソースのリビジョンとURIの定義のようですが、オリジナルのlinux-yocto_3.10.bbappendでは、これらの値が前方に存在するSRCREV_meta_valleyisland-32SRC_URI_valleyisland-32と異なっています。32ビットと64ビット版BSPのソースは一括してGitリポジトリ上で管理されているはずなので、これらは同じ値でなければならないはずです。修正前のSRC_URI_valleyisland-64の設定値は、ローカルなディレクトリからソースを取得するための定義のように見えます(本BSPのメンテナーが開発中の暫定的な記述を残したまま、このファイルをGitリポジトリへCommitしてしまったのでしょう)。そのため、E38xx BSPの64ビット版ソースの一部を取得する処理で停止してしまったようです。

meta-intel/meta-isg/meta-valleyisland/recipes-kernel/linux/linux-yocto_3.10.bbappendに上の修正を加えた上で、再度「bitbake -c fetchall core-image-sato」コマンドを実行すると、ソースのダウンロード処理は最後まで通って正常に終了しました(全ソースをダウンロードするのに、エラー前後の時間を合計して25分かかりました)。

ソースのダウンロードが完了したので、core-image-satoイメージのビルドを実行しました。
$ time bitbake core-image-sato
Loading cache: 100% |###############################################################| ETA: 00:00:00
Loaded 1243 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION = "1.22.0"
BUILD_SYS = "i686-linux"
NATIVELSBSTRING = "Ubuntu-12.04"
TARGET_SYS = "x86_64-poky-linux"
MACHINE = "valleyisland-64"
DISTRO = "poky"
DISTRO_VERSION = "1.6.1"
TUNE_FEATURES = "m64 corei7"
TARGET_FPU = ""
meta
meta-yocto
meta-yocto-bsp
meta-intel
meta-valleyisland
meta-tlk = "<unknown>:<unknown>"

NOTE: Preparing runqueue
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/eglibc/2.19-r0/packages-split/nscd/usr/sbin/nscd' has relocations in .text
NOTE: validating kernel config, see log.do_kernel_configcheck for details
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/bin/quotasync' has relocations in .text
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/bin/quota' has relocations in .text
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/sbin/rpc.rquotad' has relocations in .text
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/sbin/quotaon' has relocations in .text
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/sbin/quot' has relocations in .text
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/sbin/setquota' has relocations in .text
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/sbin/convertquota' has relocations in .text
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/sbin/xqmstats' has relocations in .text
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/sbin/repquota' has relocations in .text
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/sbin/quotastats' has relocations in .text
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/sbin/quotacheck' has relocations in .text
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/sbin/edquota' has relocations in .text
WARNING: QA Issue: ELF binary '/home/yuhri/Yocto/poky-daisy-11.0.1/valleyisland/tmp/work/corei7-64-poky-linux/quota/4.01-r1/packages-split/quota/usr/sbin/warnquota' has relocations in .text
WARNING: The postinstall intercept hook 'update_pixbuf_cache' failed (exit code: 139)! See log for details!
WARNING: The postinstalls for the following packages will be postponed for first boot: gdk-pixbuf-loader-xpm gdk-pixbuf-loader-gif gdk-pixbuf-loader-jpeg gdk-pixbuf-loader-png
WARNING: The postinstall intercept hook 'update_font_cache' failed (exit code: 139)! See log for details!
WARNING: The postinstalls for the following packages will be postponed for first boot: liberation-fonts
NOTE: Tasks Summary: Attempted 4925 tasks of which 668 didn't need to be rerun and all succeeded.

Summary: There were 18 WARNING messages shown.

real 199m7.092s
user 556m26.375s
sys 121m47.961s

いくつかの警告メッセージが出力されましたが、ビルド処理は正常に終了しているようです(ビルドにかかった時間は3時間19分でした)。

下のとおり、ブートやrootfsのイメージはちゃんと生成されているようでした。
$ ls tmp/deploy/images/valleyisland-64
bootx64.efi
bzImage
bzImage--3.10.43+git0+199943142f_aa677a2d02-r0-valleyisland-64-20140924035205.bin
bzImage-valleyisland-64.bin
core-image-minimal-initramfs-valleyisland-64-20140924035205.rootfs.cpio.gz
core-image-minimal-initramfs-valleyisland-64-20140924035205.rootfs.manifest
core-image-minimal-initramfs-valleyisland-64.cpio.gz
core-image-minimal-initramfs-valleyisland-64.manifest
core-image-sato-valleyisland-64-20140924035205.hddimg
core-image-sato-valleyisland-64-20140924035205.iso
core-image-sato-valleyisland-64-20140924035205.rootfs.ext3
core-image-sato-valleyisland-64-20140924035205.rootfs.manifest
core-image-sato-valleyisland-64.ext3
core-image-sato-valleyisland-64.hddimg
core-image-sato-valleyisland-64.iso
core-image-sato-valleyisland-64.manifest
modules--3.10.43+git0+199943142f_aa677a2d02-r0-valleyisland-64-20140924035205.tgz
modules-valleyisland-64.tgz
README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt

E38xxを搭載したターゲットボードをまだ入手できていないので、ここまでで同プロセッサ搭載ターゲット用のYocto Linuxのビルド作業は一旦終了です。近いうちにターゲットを入手する予定なので、実機環境が整ったら、今回の作業で生成したイメージを使ってターゲットによる動作確認をやるつもりです。
posted by とみやん at 09:42| Comment(0) | TrackBack(0) | Embedded Linux > Yocto Project
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/103898091

この記事へのトラックバック