コグノスケ


link 未来から過去へ表示  link 過去から未来へ表示(*)

link もっと前
2022年2月6日 >>> 2022年2月6日
link もっと後

2022年2月6日

ZephyrのDevice Tree Overlayと独自のbindings

目次: Zephyr

前回の続きです。ZephyrのDevice Tree Overlay(2022年1月3日の日記参照)で独自のbindingsを定義(compatibleやプロパティの定義)する方法を紹介します。

前回はこんなノードを追加しました。

qemu_riscv64.overlayの例

/* samples/hello_world/boards/qemu_riscv64.overlay */

/ {
	resources {
		compatible = "test-overlay";
		value1 = <1>;
		value2 = <10>;
	};
};

ノードを追加しただけではエラーにはなりませんが、コードからvalue1の値を参照しようとするとビルドエラーになって怒られます。

詳細はZephyrのDevice Tree APIマニュアル(Devicetree API - Zephyr Project Documentation)が参考になります。

Hello worldでvalue1, value2の値を参照する

// samples/hello_world/src/main.c

#include <zephyr.h>
#include <sys/printk.h>

void main(void)
{
	printk("Hello World! %s\n", CONFIG_BOARD);

	printk("value1:%d\n", DT_PROP(DT_INST(0, test_overlay), value1));
	printk("value2:%d\n", DT_PROP(DT_INST(0, test_overlay), value2));
}
ビルド結果
$ ninja
...

zephyr/include/generated/devicetree_unfixed.h:308:34: error: 'DT_N_S_resources_P
_value1' undeclared (first use in this function); did you mean 'DT_N_S_resources
_PATH'?
  308 | #define DT_N_INST_0_test_overlay DT_N_S_resources
      |                                  ^~~~~~~~~~~~~~~~

このあとも大量に怒られる……。

Zephyrはコード内でデバイスツリーの値を参照すると、ビルド時に全て解決される仕組みです。そのためデバイスツリーに不都合な点があるとビルド時に猛烈に怒られます。Zephyrのデバイスツリー処理はPythonとマクロマジックが駆使されていて、コンパイルエラーのメッセージからエラーの原因がすぐにわからないのが難点ですね……。

Linuxは実行時に参照、書き換えが可能なので、ZephyrとLinuxの大きく異なる部分と言えましょう。

デバイスツリー定義yamlファイル

問題の解決にはdts/*.yamlを追加する必要があります。ファイル名はcompatible名.yamlになります。このファイルもOverlayファイル同様に追加するだけでビルドシステムが勝手に感知して処理してくれます。便利ですね。

test-overlay.yamlの位置
samples/hello_world/
├──CMakeLists.txt
├──README.rst
├──boards
│   └──qemu_riscv64.overlay
├──dts
│   └──bindings
│       └──test-overlay.yaml    ★これ★
├──prj.conf
├──sample.yaml
└──src
    └──main.c
test-overlay.yamlの例

# samples/hello_world/dts/bindings/test-overlay.yaml


description: |
    This binding provides AAA and BBB, something for CCC application in Zephyr.

compatible: "test-overlay"

properties:
    value1:
        type: int
        required: true
        description: |
          Identity of AAA of something. This is ...

    value2:
        type: int
        required: true
        description: |
          Identity of BBB of something. This is ...

追加したyamlファイルは非常にシンプルで、compatibleの名前と、value1, value2というint型のプロパティが必須だよ、ということを定義しただけです。

その他のbindingsの定義については、Zephyrのマニュアル(Devicetree bindings - Zephyr Project Documentation)をご覧ください。

ファイルを追加したら改めてビルド&実行しましょう。

bindings追加後のビルド&実行
$ ninja
...

[123/123] Linking C executable zephyr/zephyr.elf
Memory region         Used Size  Region Size  %age Used
             RAM:       23700 B       256 MB      0.01%
        IDT_LIST:          0 GB         2 KB      0.00%


$ ninja run

[0/1] To exit from QEMU enter: 'CTRL+a, x'[QEMU] CPU: riscv64
*** Booting Zephyr OS build v2.7.99-3416-g7dac931e3662  ***
Hello World! qemu_riscv64
value1:1
value2:10

うまく行きました。Device Tree Overlayとbindingsは同じCコードでボードごとに設定だけ変えたい場合に有用です。

この仕組みはtests下にあるコードでよく使われています。例えばGPIOのテストがわかりやすいでしょう。2つのポートが通信できるか?割り込みが正常に入るか?などがGPIOテストの内容です。

実際に動作させるにはボードごとに配線やピン設定が違いますから、ボードAはピン10と11を使う、ボードBは21と22を使う、というようにボードごとに違う設定を与える必要があります。

設定はコードに書かずにDevice Tree Overlayに逃がして、コードはテストしたい内容のみを記述することで設定もコードもすっきりする、ってわけです。

編集者:すずき(2023/09/24 12:08)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2022年2月6日 >>> 2022年2月6日
link もっと後

管理用メニュー

link 記事を新規作成

<2022>
<<<02>>>
--12345
6789101112
13141516171819
20212223242526
2728-----

最近のコメント5件

  • link 24年4月22日
    hdkさん (04/24 08:36)
    「うちのHHFZ4310は15年突破しまし...」
  • link 24年4月22日
    すずきさん (04/24 00:37)
    「ちゃんと数えてないですけど蛍光管が10年...」
  • link 24年4月22日
    hdkさん (04/23 20:52)
    「おお... うちのHHFZ4310より後...」
  • link 20年6月19日
    すずきさん (04/06 22:54)
    「ディレクトリを予め作成しておけば良いです...」
  • link 20年6月19日
    斎藤さん (04/06 16:25)
    「「Preferencesというメニューか...」

最近の記事3件

  • link 24年4月25日
    すずき (04/26 16:49)
    「[AVIFの変換] AVIFが読めないアプリケーションがたまにあるので、AVIF(AV1 Image File Format)...」
  • link 24年2月7日
    すずき (04/24 02:52)
    「[複数の音声ファイルのラウドネスを統一したい] PCやデジタル音楽プレーヤーで音楽を聞いていると、曲によって音量の大小が激しく...」
  • link 24年4月22日
    すずき (04/23 20:13)
    「[仕事部屋の照明が壊れた] いきなり仕事部屋のシーリングライトが消えました。蛍光管の寿命にしては去年(2022年10月19日の...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 04/26 16:49