2026 年 05 月 26 日 ソリューション統括部
Zephyr OS とは ? について解説するブログの第三回目です。
今回は「LCD の表示」に挑戦します。
使用する LCD パネルは本評価ボード MIMXRT1170-EVKB 用に販売されている RK055HDMIPI4MA0 という 5.5 インチの LCD パネルです。
アプリは Zephyr ソースツリーに含まれている samples/modules/lvgl/demos を使用します。
これまでの Zephyr ブログを読んでいない方は 「Zephyrブログ 第一回 はじめての Zephyr(前編)」から読んでいただけると、より理解が深まります。
LCD パネルの諸元は参考資料 1) 2.17 によると次のとおりです。

MIMXRT1170-EVKB ボードはほかに Raspberry Pi Touch Display もサポートしています。
LVGL とは Light and Versatile Graphics Library の頭文字語で、オープンソースの UI ライブラリです。
マイコンなどの組込み向けに開発されました。
単純な UI ならば、100 KB ほどの RAM、200-300 KB ほどの flash ROM、レンダリング用にスクリーンサイズの 1/10 ほどのバッファ、があればよいそうです。
(zephyrproject/modules/lib/gui/lvgl/README.md)
Zephyr はこれを外部モジュールとしてサポートしています。
ソースは zephyrproject/modules/lib/gui/lvgl ディレクトリ配下です。
LVGL demo アプリのソースは zephyr/samples/modules/lvgl/demos ディレクトリ配下にあります。音楽プレイヤーの体をしたデモアプリです。
Zephyr の構築システムはアプリ中心の考え方を採用しています。
https://docs.zephyrproject.org/latest/develop/application/index.html#overview
どういうことかというと、Linux のカーネルのように Zephyr システムだけを構築しておいて、それとは別にアプリを構築して、あとでそれをひとつにあわせる、ということはできないということです。
しかしアプリ中心であるため、Zephyr システムの部分はそれぞれのアプリにとって必要十分な構成にすることができますから、Zephyr の設計思想(https://docs.zephyrproject.org/latest/introduction/index.html#introduction) に適った構築システムといえそうです。
それでふと疑問が生じました。
複数のアプリを同時に使用するアプリを構築することはできるのでしょうか?
もし可能なのであれば、使い方としてすぐに思い付くのは、SMP プロセッサにおいて、コア 0 ではアプリ A を、コア 1 ではアプリ B を実行するとか、です。
しかしそういった仕組みはなくて、したがって単純に複数のアプリを一緒にして(一つのバイナリファイルとして)構築する、みたいなことはできないのかもしれません。 それをしたい場合は、そのように使われることを想定してあらかじめプログラムを組んでおかなければならないのかもしれません。
そうだとしますと、zephyr/subsys/shell ディレクトリ配下のソース(Unix 似の shell)はそのようなプログラムの作り方の具体例になっていそうです。
Zephyr には、Zephyr 構築システムのもう一つ上位に位置する sysbuild(System Build)という構築システムがあります。
https://docs.zephyrproject.org/latest/build/sysbuild/index.html#sysbuild-system-build によればその目的は、一つ以上の Zephyr 構築システムとその他の任意の構築システムとを統合することにあります。
たとえば、Zephyr アプリとブートローダとを一緒に構築して、Flash に書き込み、デバッグする、といったことができるそうです。
MIMXRT1170-EVKB ボードではアプリを NOR Flash 上で XIP 実行するためブートローダが不要ですが、ブートローダが必要な場合はこのような仕組みはとても便利そうです。
さて、ここで一つ注目すべきは「一つ以上の Zephyr 構築システムを統合」できる点です。
これは先の疑問の解となるものでしょうか?
Zephyr アプリに別の Zephyr アプリを追加するときは通常、sysbuild.cmake ファイルを作成し、そこで関数 ExternalZephyrProject_Add() を呼び出し、追加したい Zephyr アプリを記述します。
たとえば、コア間で hwspinlock を取り合うデモアプリ samples/drivers/hwspinlock 配下の sysbuild.cmake には次のような記述があり、remote という名のアプリを追加しています。(Zephyr v4.4.0-rc1 以降に存在します。)
#...
set(REMOTE_APP remote)
ExternalZephyrProject_Add(
APPLICATION ${REMOTE_APP}
SOURCE_DIR ${APP_DIR}/${REMOTE_APP}
BOARD ${SB_CONFIG_REMOTE_BOARD}
BOARD_REVISION ${BOARD_REVISION}
)
#...
sysbuild では、個々の Zephyr 構築システムを ドメイン と呼び、それが二つ以上あるときは マルチドメイン と呼んでいます。
Zephyr 構築システムに限らず構築システムを複数管理しているときは マルチイメージ構築 と呼んでいます。
バイナリファイルが複数作成されるからのようです。
ということはマルチドメインでもそれぞれにバイナリファイルが作成されるということになるのでしょうか?
実際に上に挙げた samples/drivers/hwspinlock を構築して、確認してみることにしました。 このアプリは FRDM-MCXN947 ボードをサポートしています。このボードには dual core Cortex-M33 が搭載されています。
次のコマンドで構築します。
$ west build -b frdm_mcxn947/mcxn947/cpu0 --sysbuild samples/drivers/hwspinlock
結果、次の二つの zephyr.elf ファイルが作成されました。
どちらのアプリがどのコアで動作するかは <board> 指定で行うようです。
つまり hwspinlock アプリのほうは west build の -b オプションで指定された cpu0 で走り、remote アプリのほうは ExternalZephyrProject_Add() の BOARD 引数で渡す
SB_CONFIG_REMOTE_BOARD で走ります。
SB_CONFIG_REMOTE_BOARD の値は、Kconfig.sysbuild ファイルが設定しています。
次のようになっているので、cpu1 ということになります。
config REMOTE_BOARD
string "The board used for remote target"
default "frdm_mcxn947/mcxn947/cpu1" if $(BOARD) = "frdm_mcxn947"
#...
そしてそれぞれのアプリの text が置かれるアドレス領域やメモリ領域はそれぞれの <board> に対応する dts ファイルが指定します。 また、上に述べた二つの zephyr.elf の text セクションを調べてみましたが、次のようになっていて、アドレス領域は重なっていませんでした。


つまり、
ということから、sysbuild はドメインごとにバイナリファイルを作成することしかできないと思われます。
sysbuild はコアごとに走らせるアプリを同時に構築することはできますが、SMP であっても、一つのバイナリイメージにすることはできないようです。
なによりもまず、本アプリを MIMXRT1170-EVKB ボード上で走らせることができるのかが問題となります。
https://docs.zephyrproject.org/latest/samples/modules/lvgl/demos/README.html#building-and-running には構築例として MIMXRT1060-EVK ボードが挙がっていますが、MIMXRT1170-EVKB ボードはありません。
しかし同じ i.MX RT シリーズプロセッサですし、希望がないわけではなさそうと、とりあえず構築してみることにしました。
まず次のコマンド行を試してみました。
$ west build -p always -b mimxrt1170_evk/mimxrt1176/cm7 samples/modules/lvgl/demos
すると、次のようなエラーが出ました。

「デバイスツリーの chosen ノードに "zephyr,display" プロパティがない」というエラーです。
Zephyr の chosen ノードは、Zephyr 公式文書の chosen ノード によると、Linux のそれとは役割がちょっと異なっていて、システム全体に関係するプロパティを置く場所のようです。
同文書の Zephyr 固有の chosen ノードの表には Zephyr 共通の chosen プロパティが記載されていますが、その中に zephyr,display があります。
その目的は「デフォルトのディスプレイコントローラをセットする」となっています。
このプロパティが chosen ノードに必要だとして、ではどのような値を設定すればよいのでしょうか?
LVGL demo アプリは samples/modules/lvgl/demos ディレクトリ配下にあり、west build にこのディレクトリを渡しますが、このような、アプリが定義されているディレクトリのことを application directory (以降 アプリディレクトリ)といいます。
(https://docs.zephyrproject.org/latest/develop/application/index.html#overview)
アプリディレクトリはいくつかのファイル及びディレクトリから構成されます。そのなかの一つに sample.yaml(もしくは testcase.yaml)があります。
これは テストアプリ・コンフィギュレーション・ファイル と呼ばれるもので
(https://docs.zephyrproject.org/latest/develop/test/twister.html#tests)、Twister という Zephyr の提供する Test Runner が参照するファイルです。
LVGL demo アプリにも sample.yaml があり、見ると次のような記述がありました。
common:
modules:
- lvgl
harness: console
filter: dt_chosen_enabled("zephyr,display")
extra_args:
- platform:mimxrt1060_evk:SHIELD=rk043fn66hs_ctg
- platform:mimxrt1170_evk/mimxrt1176/cm7:SHIELD=rk055hdmipi4ma0
- platform:mimxrt595_evk/mimxrt595s/cm33:SHIELD=rk055hdmipi4ma0
- platform:mimxrt700_evk/mimxrt798s/cm33_cpu0:SHIELD=g1120b0mipi
- platform:mimxrt700_evk/mimxrt798s/cm33_cpu0:SHIELD=zc143ac72mipi
#...
sample.yaml の詳細はまだよくわかっていないのですが、extra_args: 配列はテストシナリオを構築するときに構築ツールに渡す引数のようです。 そのことから、west build オプションとして、「ボード mimxrt1170_evk/mimxrt1176/cm7 に対してはシールド rk055hdmipi4ma0 を使用する」と読めそうです。
シールドについてもまだよくわかっていないのですが、シールドによると「アドオンとかドーターボードのようなもの」とあります。
west build コマンドにオプション --sheild rk055hdmipi4ma0 を指定すればよさそうです。
以上から、次のようなコマンド行を試してみました。
$ west build -p always -b mimxrt1170_evk/mimxrt1176/cm7 --shield rk055hdmipi4ma0 samples/modules/lvgl/demos
構築に成功しました。
構築したイメージを west flash コマンドでターゲットに書き込んで、電源を投入したところ、LCD への表示が確認できました。同時にシリアルコンソールには次のような出力がありました。

LCD の表示の様子:

音楽プレイヤーのように振る舞うデモアプリです。
再生ボタンをタップすると再生が始まり、停止ボタンをタップすると停止します。しかし実際に音が鳴っているかどうかは確認できていません。
このように、LCD への表示は確認できたのですが、アプリとしては正常には動作していないようです。
これまでにわかっている問題点は次のとおりです。
[00:00:27.851,000]input: Event dropped, queue full, not blocking in syswq. [00:00:27.861,000] input: Event dropped, queue full, not blocking in syswq. [00:00:27.861,000] input: Event dropped, queue full, not blocking in syswq. [00:00:27.861,000] input: Event dropped, queue full, not blocking in syswq. [00:00:27.871,000] input: Event dropped, queue full, not blocking in syswq. [00:00:27.871,000] input: Event dropped, queue full, not blocking in syswq. [00:00:27.871,000] input: Event dropped, queue full, not blocking in syswq.
今回は LCD への表示の確認が目的ですので、原因は追求していません。
2025 年 05 月 14 日 Vigiles サポート
2024 年 09 月 02 日 Vigiles サポート
2024 年 03 月 01 日 Vigiles サポート
2026 年 02 月 09 日 Yocto Project よもやま話
2026 年 02 月 09 日 Yocto Project よもやま話
2026 年 02 月 09 日 Yocto Project よもやま話
2024 年 01 月 10 日 Linux 技術ネタ
2023 年 12 月 12 日 Linux 技術ネタ
2023 年 03 月 31 日 Linux 技術ネタ
2025 年 12 月 01 日 イベントレポート
2025 年 08 月 08 日 イベントレポート
2024 年 12 月 06 日 イベントレポート
2025 年 04 月 01 日 リクルート
2023 年 05 月 30 日 リクルート
2022 年 12 月 27 日 リクルート
2026 年 05 月 25 日 信州リネオ便り
2026 年 04 月 09 日 信州リネオ便り
2026 年 02 月 09 日 信州リネオ便り
2026 年 05 月 26 日 ソリューション統括部
2026 年 04 月 14 日 ソリューション統括部
2026 年 03 月 18 日 ソリューション統括部
2019 年 12 月 13 日 マーケティング統括部
2019 年 04 月 25 日 マーケティング統括部
2018 年 12 月 18 日 マーケティング統括部