みつきんのメモ

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

Yocto Project CROPSでmeta-riscvをビルドしてみる

はじめに

私の記事を参考にして、meta-riscvをビルドしようとしたけどうまくいかないらしかったので試してみる。

大まかな流れ。

Quick Startの手順をなぞる。

  1. repoの設定(省略)
  2. ワークスペースの作成
  3. setup.shの実行
  4. bitbake実行

CROPSは3の手順から使用する。

ワークスペースの作成

mkdir riscv-yocto && cd riscv-yocto
repo init -u git://github.com/riscv/meta-riscv  -b master -m tools/manifests/riscv-yocto.xml
repo sync
repo start work --all

setup.shの実行

CROPS実行用のスクリプトを作成

riscv-yoctoディレクトリにrun_meta-riscv.shとかの名前で下記のようなスクリプトを作成する。

引数なしで実行した場合は、meta-riscv/setup.shを実行し、 引数を指定した場合は、そのコマンドラインを実行する。

#!/bin/sh

BUILD_DIR=build

cmd="source $(pwd)/openembedded-core/oe-init-build-env ${BUILD_DIR}"
if [ $# -gt 0 ] ; then
    cmd="${cmd} && $*"
else
    cmd="source $(pwd)/meta-riscv/setup.sh"
fi

docker run --rm -it -v "$(pwd)":"$(pwd)" crops/poky --workdir="$(pwd)" bash -c "${cmd}"

実行権限をつけておく。

$ chmod +x ./run_meta-riscv.sh

setup.shを実行する

$ ./run_meta-riscv.sh

bitbake実行

setup.shの結果、buildディレクトリが作成され、その中にauto.confやlocal.conf、bblayers.confなどが作成される。

local.conf

local.confの末尾に次の一行を追加する。

USER_CLASSES:remove = "image-prelink"

bitbakeを実行する

次のようにしてCROPSでbitbakeを実行する。

$ ./run_meta-riscv.sh MACHINE=qemuriscv64 bitbake core-image-full-cmdline

これでイメージがビルドされる。

runqemuの実行

qemuの実行はネットワークデバイスの設定などが面倒臭いのでCROPSは使わずに直接ホストマシンで実行する。

$ source openembedded-core/oe-init-build-env
$ MACHINE=qemuriscv64 runqemu nographic

ホストマシンに必要なパッケージが不足しているとエラーになるが、基本的にはこれでいけるはず。

こんな感じで起動が面がでてくる。

OpenSBI v0.9
   ____                    _____ ____ _____
  / __ \                  / ____|  _ \_   _|
 | |  | |_ __   ___ _ __ | (___ | |_) || |
 | |  | | '_ \ / _ \ '_ \ \___ \|  _ < | |
 | |__| | |_) |  __/ | | |____) | |_) || |_
  \____/| .__/ \___|_| |_|_____/|____/_____|
        | |
        |_|

Platform Name             : riscv-virtio,qemu
Platform Features         : timer,mfdeleg
Platform HART Count       : 4
Firmware Base             : 0x80000000
Firmware Size             : 124 KB
Runtime SBI Version       : 0.2

Domain0 Name              : root
Domain0 Boot HART         : 3
Domain0 HARTs             : 0*,1*,2*,3*
Domain0 Region00          : 0x0000000080000000-0x000000008001ffff ()
Domain0 Region01          : 0x0000000000000000-0xffffffffffffffff (R,W,X)
Domain0 Next Address      : 0x0000000080200000
Domain0 Next Arg1         : 0x0000000082200000
Domain0 Next Mode         : S-mode
Domain0 SysReset          : yes

Boot HART ID              : 3
Boot HART Domain          : root
Boot HART ISA             : rv64imafdcsu
Boot HART Features        : scounteren,mcounteren,time
Boot HART PMP Count       : 16
Boot HART PMP Granularity : 4
Boot HART PMP Address Bits: 54
Boot HART MHPM Count      : 0
Boot HART MHPM Count      : 0
Boot HART MIDELEG         : 0x0000000000000222
Boot HART MEDELEG         : 0x000000000000b109
[    0.000000] Linux version 5.15.16-yocto-standard (oe-user@oe-host) (riscv64-oe-linux-gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37.20210721) #1 SMP PREEMPT Tue Jan 25 14:32:29 UTC 2022
[    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[    0.000000] Machine model: riscv-virtio,qemu
[    0.000000] Memory limited to 256MB
[    0.000000] efi: UEFI not found.
[    0.000000] Zone ranges:

rootでログインしてみる。

OpenEmbedded nodistro.0 qemuriscv64 ttyS0

qemuriscv64 login: root
root@qemuriscv64:~# cat /etc/os-release 
ID=nodistro
NAME="OpenEmbedded"
VERSION="nodistro.0"
VERSION_ID=nodistro.0
PRETTY_NAME="OpenEmbedded nodistro.0"
root@qemuriscv64:~#

まとめ

いちおう、問題なくビルドはできていそう。