Zepher のデバイスツリーまわりの実装の覚書
使ったことなかったけど読んでいておもしろかったので要点だけメモ
デバイスツリーファイルの仕様
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 を宣言しており、これをリンカスクリプトで集めて配置している。
感想
特殊なセクション名を使ってリンカで配列を構成しておくというのが(もしかしてこの手のやつでは当たり前なのかもしれないけど)、はじめて見たし発想がなかったのでおもしろポイントだった。
関連エントリー
- STM32F401CC の安いボード Type-C コネクタ 25MHz / 32.768 kHz 水晶つき NRST / BOOT ボタン 裏面に WeAct と書いてあった。...
- Raspberry Pi 2 B+ と 3.2inch LCD もともと初代 Raspberry Pi 用に買ったものだけれど、初代 Raspberry Pi をいよいよ捨てたので、ついでにいろいろ調べな...
- Mac でウェブカメラの定期撮影を Swift で書く macOS 用にウェブカメラからjpgを取得するコマンドラインツールにimagesnapというのがある。単発で使うには問題ないんだけど、イン...
- Raspberry Pi から HDMI-CEC コントロール サイネージ HDMI CEC 連携 カレンダーを表示するおうちサイネージ というのを作っていたがモニタの置き場がなくなってしまったので、テレ...
- root化しなくても Wi-Fi 経由での adb はできる Android Debug Bridge (adb) | Android Developers に従うだけ。 一旦 USB で接続して、...