使ったことなかったけど読んでいておもしろかったので要点だけメモ
デバイスツリーファイルの仕様
https://www.devicetree.org/specifications/
.dts あるいは .dtsi はデバイスツリーソースファイルで、この記法はデバイスツリーの仕様の最後らへんに書いてある。
デバイスツリーの仕様上、プロパティ名には , # @ などが有効で、特に意味のある記号ではないので読むとき注意。例えば # が行頭についていてもコメントという意味ではなく、名前の一部として numbet of の意味で使われている。
あくまで設定ファイルなのでこれをどう扱うかは実装による。
Zepher のデバイスツリー
例:BlackPill F401 の dts https://github.com/zephyrproject-rtos/zephyr/blob/master/boards/arm/blackpill_f401ce/blackpill_f401ce.dts
ボードごとにデバイスツリーがある。ボードのデバイスツリーファイルは使っている mcu のデバイスツリーファイルを include するような形でソースファイルが共通化されている。
https://docs.zephyrproject.org/2.3.0/guides/dts/howtos.html あたりがざっくりわかりやすい。
デバイスツリーファイルはビルド時に特定の規則でヘッダファイルに変換される。単純は値は DT_PROP() というマクロでとれる。
struct device
struct device* device_get_binding(char*)
という関数で指定した名前の struct device* を取得できる。
device_get_binding() は DEVICE_DEFINE() で宣言されたデバイスを取得する。全ての struct device* は配列として RAM に配置されているが、これはリンカで解決される。
DEVICE_DEFINE() は
__attribute__((__section__(".device_" #level STRINGIFY(prio))))
をつけて struct device を宣言しており、これをリンカスクリプトで集めて配置している。
感想
特殊なセクション名を使ってリンカで配列を構成しておくというのが(もしかしてこの手のやつでは当たり前なのかもしれないけど)、はじめて見たし発想がなかったのでおもしろポイントだった。