リネオブログ

Zephyrブログ 第三回 「LCD に表示してみる」

2026 年 05 月 26 日   ソリューション統括部

はじめに

Zephyr OS とは ? について解説するブログの第三回目です。
今回は「LCD の表示」に挑戦します。

使用する LCD パネルは本評価ボード MIMXRT1170-EVKB 用に販売されている RK055HDMIPI4MA0 という 5.5 インチの LCD パネルです。
アプリは Zephyr ソースツリーに含まれている samples/modules/lvgl/demos を使用します。

これまでの Zephyr ブログを読んでいない方は 「Zephyrブログ 第一回 はじめての Zephyr(前編)」から読んでいただけると、より理解が深まります。

目次

LCD パネル諸元

LCD パネルの諸元は参考資料 1) 2.17 によると次のとおりです。

LEDパネルRK055HDMIPI4Mの諸元

MIMXRT1170-EVKB ボードはほかに Raspberry Pi Touch Display もサポートしています。

LVGL demo アプリ

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 OS の構築システム

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)はそのようなプログラムの作り方の具体例になっていそうです。

sysbuild

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 ファイルが作成されました。

  • build/hwspinlock/zephyr/zephyr.elf
  • build/remote/zephyr/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 セクションを調べてみましたが、次のようになっていて、アドレス領域は重なっていませんでした。

  • hwspinlock/zephyr/zephyr.elf:

Zephyr OSを用いたLED表示

  • remote/zephyr/zephyr.elf:

Zephyr OSを用いたLED表示

つまり、

  • elf ファイルがドメインごとに存在する。
  • text セクションのアドレス領域が重なっていない。
  • zephyr アプリを一つに統合するリンクシステムがなさそう。

ということから、sysbuild はドメインごとにバイナリファイルを作成することしかできないと思われます。

sysbuild はコアごとに走らせるアプリを同時に構築することはできますが、SMP であっても、一つのバイナリイメージにすることはできないようです。

LVGL demo アプリの構築

なによりもまず、本アプリを 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

すると、次のようなエラーが出ました。

LVGL demoアプリの構築でのエラー

「デバイスツリーの chosen ノードに "zephyr,display" プロパティがない」というエラーです。

Zephyr の chosen ノードは、Zephyr 公式文書の chosen ノード によると、Linux のそれとは役割がちょっと異なっていて、システム全体に関係するプロパティを置く場所のようです。

同文書の Zephyr 固有の chosen ノードの表には Zephyr 共通の chosen プロパティが記載されていますが、その中に zephyr,display があります。
その目的は「デフォルトのディスプレイコントローラをセットする」となっています。
このプロパティが chosen ノードに必要だとして、ではどのような値を設定すればよいのでしょうか?

構築の仕方の参考になる sample.yaml

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

構築に成功しました。

LVGL demo アプリの実行

構築したイメージを west flash コマンドでターゲットに書き込んで、電源を投入したところ、LCD への表示が確認できました。同時にシリアルコンソールには次のような出力がありました。

west flash コマンドでターゲットに書き込んで、電源を投入した際のシリアルコンソールの出力

LCD の表示の様子:

west flash コマンドでターゲットに書き込んで、電源を投入した際のLED表示

音楽プレイヤーのように振る舞うデモアプリです。

再生ボタンをタップすると再生が始まり、停止ボタンをタップすると停止します。しかし実際に音が鳴っているかどうかは確認できていません。

このように、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.
  • 再生・停止を数度繰り返すと、停止できなくなる
  • shell はキー入力を受け付けない(コマンドを試せない)。

今回は LCD への表示の確認が目的ですので、原因は追求していません。

参考資料

  1. MIMXRT1170EVKBHUG.pdf :: MIMXRT1170-EVKB Board Hardware User Guide
Yocto Project 公式実践講座 7 月 ~ 9 月 開催分 受講お申込み受付中!
Vigiles サポート
Yocto Project よもやま話
Yocto よもやま話 第 19 回 「Yocto Project 5.3 Whinlatter」
Yocto よもやま話 第 19 回 「Yocto Project 5.3 Whinlatter」

2026 年 02 月 09 日 Yocto Project よもやま話

Yocto よもやま話 第 18 回 「Yocto Project 5.2 Walnascar」
Yocto よもやま話 第 18 回 「Yocto Project 5.2 Walnascar」

2026 年 02 月 09 日 Yocto Project よもやま話

Yocto よもやま話 第 17 回 「Yocto Project 5.1 Styhead」
Yocto よもやま話 第 17 回 「Yocto Project 5.1 Styhead」

2026 年 02 月 09 日 Yocto Project よもやま話

Linux 技術ネタ
RISC-Vについて学ぶ-後編
RISC-Vについて学ぶ-後編

2024 年 01 月 10 日 Linux 技術ネタ

RISC-Vについて学ぶ-前編
RISC-Vについて学ぶ-前編

2023 年 12 月 12 日 Linux 技術ネタ

イベントレポート
EdgeTech+ 2025 出展レポート
EdgeTech+ 2025 出展レポート

2025 年 12 月 01 日 イベントレポート

EdgeTech+ West 2025 出展レポート
EdgeTech+ West 2025 出展レポート

2025 年 08 月 08 日 イベントレポート

EdgeTech+ 2024 出展レポート
EdgeTech+ 2024 出展レポート

2024 年 12 月 06 日 イベントレポート

リクルート
新卒採用、絶賛募集中!
新卒採用、絶賛募集中!

2025 年 04 月 01 日 リクルート

新卒採用、絶賛募集中!
新卒採用、絶賛募集中!

2023 年 05 月 30 日 リクルート

信州リネオ便り
新たな信州土産を入手しました
新たな信州土産を入手しました

2026 年 05 月 25 日 信州リネオ便り

旧制松本高等学校を歩く
旧制松本高等学校を歩く

2026 年 04 月 09 日 信州リネオ便り

奈良井宿アイスキャンドル祭りに行ってきました
奈良井宿アイスキャンドル祭りに行ってきました

2026 年 02 月 09 日 信州リネオ便り

ソリューション統括部
Zephyrブログ 第三回 「LCD に表示してみる」
Zephyrブログ 第三回 「LCD に表示してみる」

2026 年 05 月 26 日 ソリューション統括部

Zephyrブログ 第二回 はじめての Zephyr(後編)
Zephyrブログ 第二回 はじめての Zephyr(後編)

2026 年 04 月 14 日 ソリューション統括部

Zephyrブログ 第一回 はじめての Zephyr(前編)
Zephyrブログ 第一回 はじめての Zephyr(前編)

2026 年 03 月 18 日 ソリューション統括部

マーケティング統括部
大成功決起大会!!(ET2019)
大成功決起大会!!(ET2019)

2019 年 12 月 13 日 マーケティング統括部

ESEC 2019 決起大会
ESEC 2019 決起大会

2019 年 04 月 25 日 マーケティング統括部

シリコンバレー探検記 その 2
シリコンバレー探検記 その 2

2018 年 12 月 18 日 マーケティング統括部