raspberrypi3のCPUのコアはCortex-A53のため、64bitコードを動作させることができる。
しかし、オフィシャルでリリースしているカーネルは現状32bit版のみとなっている。
探してみたところ、すでにraspberrypi3のカーネルをaarch64で動くようにした猛者がいたので、これをyoctoに取り込んで動かしてみた。
今回も手順もの。
作業ディレクトリ
今回は「~/work/yocto/rpi」で作業を行う。 また、ソースコードなどダウンロードしたデータを格納するディレクトリを「~/work/yocto/downloads」とする。
Krogothブランチの取得
下記のコマンドでpokyとmeta-raspberrypiを取得し、krogothブランチをチェックアウトする。
$ git clone git://git.yoctoproject.org/poky.git $ cd poky $ git checkout -b krogoth origin/krogoth $ git clone git://git.yoctoproject.org/meta-raspberrypi
aarch64ビルド用のレイヤの取得
筆者がとりあえず作成したaarch64カーネルをビルドするためのレイヤをダウンロードする。
$ git clone https://github.com/mickey-happygolucky/meta-rpi3-aarch64.git
環境変数を設定
下記を実行してbitbakeの実行に必要な環境変数を設定する。
$ cd ~/work/yocto/rpi $ source poky/oe-init-build-env build64
このコマンドを実行すると、build64ディレクトリへ自動的に移動される。
confディレクトリ以下に、local.confとbblayers.confが生成される。
bblayers.conf
bblayers.confにmeta-raspberrypiの行を追加し、bitbakeのビルド対象に含める。 他のレイヤをビルド対象に追加する場合も、ここに追加する。
自動生成されたものはフルパスが書かれているため、BBLAYERSの部分を下記に置き換える。
LAYERSTOP = "${TOPDIR}/.." BBLAYERS ?= " \ ${LAYERSTOP}/poky/meta \ ${LAYERSTOP}/poky/meta-poky \ ${LAYERSTOP}/poky/meta-yocto-bsp \ ${LAYERSTOP}/poky/meta-raspberrypi \ ${LAYERSTOP}/poky/meta-rpi3-aarch64 \ "
local.conf
RPi3向けaarch64のイメージをビルドするための設定をlocal.confの上の方に下記のように追加する。
MACHINE ?= "raspberrypi3-64" BB_NUMBER_THREADS ?= "${@oe.utils.cpu_count()}" PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}" GPU_MEM = "128" DL_DIR ?= "${HOME}/work/yocto/downloads"
並列化のオプションも実行環境CPUの数を取得するようにした。
イメージ作成
bitbakeを実行してイメージを作成する。
$ bitbake rpi-basic-image
イメージの書き込み
meta-raspberrypiではrpi-sdimgとしてSDカードのイメージが生成されるので、これをddコマンドで書き込む。
$ sudo dd if=./tmp/deploy/images/raspberrypi3-64/rpi-basic-image-raspberrypi3-64.rpi-sdimg of=/dev/sdb bs=40M
/dev/sdbは環境によってはsdbだったりsdcだったりするので適宜変更する。 内蔵HDDの追加など行ってなければ大抵はsdbとなる。
動作確認
無事起動した。
uname -aの結果がaarch64になっているのがわかる。
制限事項
とりあえず動く程度のものなので、32bit版でできることができなかったりする。 以下に例を上げるが、他にもいろいろとあると思われる。
GPUが使用できない
userland.bbに含まれるGPU(VideoCore)にアクセスするライブラリが、32bitコードに強く依存しており、64bit環境ではビルドが通らないため、X11やwaylandなどは動作しない。
framebufferは動作したのでcore-image-directfbなどは作ることができた。
ペリフェラルまわりが怪しい
実際には試していないので推測になるが、元にしたカーネルがデバイスツリー周りをきちんと実装しているように見えなかったので、おそらく使用できないと思われる。
解像度設定
ブートパーティションのconfig.txtによる、解像度指定が32bit版ほどきちんと動いていない。 meta-rpi3-aarch64の環境では1920x1080固定にしている。