みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

raspberrypi3 yocto 64bit kernel

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となる。

動作確認

無事起動した。

f:id:mickey_happygolucky:20160511234154j:plain

uname -aの結果がaarch64になっているのがわかる。

制限事項

とりあえず動く程度のものなので、32bit版でできることができなかったりする。 以下に例を上げるが、他にもいろいろとあると思われる。

GPUが使用できない

userland.bbに含まれるGPU(VideoCore)にアクセスするライブラリが、32bitコードに強く依存しており、64bit環境ではビルドが通らないため、X11やwaylandなどは動作しない。

framebufferは動作したのでcore-image-directfbなどは作ることができた。

ペリフェラルまわりが怪しい

実際には試していないので推測になるが、元にしたカーネルがデバイスツリー周りをきちんと実装しているように見えなかったので、おそらく使用できないと思われる。

解像度設定

ブートパーティションのconfig.txtによる、解像度指定が32bit版ほどきちんと動いていない。 meta-rpi3-aarch64の環境では1920x1080固定にしている。