ncs: ボード定義の見直し

2024/09/10

少し ncs への理解が深まった気がするので、nRF5340 の MDBT53ボード用に作った環境を整理する。

前回作った SB1602B 液晶サンプルも更新。

DeviceTree で GPIO output の初期値くらいは設定できそうな気がするのだが、内部プルアップ/プルダウンはあるものの値についてはなさそう。
しかしデジタルな出力なのだから最初は 01 のどちらかになるはず。
これからすると 0 のはずだ。

image

実際には gpio_pin_configure_dt() なんかで設定をしないと反映されない。 つまり、DeviceTree の設定はデータとして持っているだけで、初期化のタイミングは実装者がやるようになっているのだ。 まあ、main()までに必ず初期化される、とかなっていると困ることもあるだろうし、仕方ないか。

とはいえ gpio_pin_configure_dt() を使うには、

と面倒だ。

面倒なのはまだよいとして struct gpio_dt_spec のインスタンスを保持しておくのはもったいない。 struct gpio_dt_specはメンバーが3つだけなので、const struct device* の先が一番大きいデータになりそうだ。
アドレスをログに出してみたが 0x6284 と Flash のアドレスだった(mapファイルで見ると”zephyr/drivers/gpio/libdrivers__gpio.a(gpio_nrfx.c.obj)”だった)。 つまり、DeviceTree の設定は Flash にあらかじめ保存されているから RAM の心配はしなくてよいのだ。

そうなると今度は、GPIO のピン 1つに 1つの変数を持っておくというのが煩わしくなってくる。 そもそもデバイスドライバという階層があるのだから GPIO も単独で操作することはないので、煩わしいのはデバイスドライバの実装だけである。

それなら・・・これくらいはもうよいような気がしてきた。
GPIO を直接操作したいのは LED や SW を除いたらリセットの制御のようにデバイスを制御したいときだから、1つのデバイスに対してたくさん必要になることが少ないだろう。

dk_buttons_and_leds

そういえば DevAcademy で使われている dk_buttons_and_leds ライブラリは複数の LED を制御していたがどう実装されているのだろうか。

LEDのDeviceTree設定配列をつくってまとめて初期化で1つずつgpio_pin_configure_dt()で呼び出している。
単独で設定するときはdk_set_led()を使うし、まとめて設定するときもそのDeviceTree設定配列をforでぐりぐり回すだけである。
DT_PATH()DT_FOREACH_CHILD()を使うところ以外は素直だと思う。

LED

見ていて気付いたが Light-Emitting Diode (LED) というドライバがあった。
LED だけなのに大げさな、と思ったが、RGB だったり matrix だったりと単なる ON/OFF だけの LED ではないようだ。
zephyr/drivers/led/にもファイルがたくさんある。
GPIO を見ても brightness なんて文字もあるし、立派な?LED 用なのだろう。

デバイス制御への理解を深めるために

いろいろ知識が足りていないことが分かった。
アプリだけでなくデイバス操作もすることを考えると、DevAcademy Intermediate も進めるべきか。

nRF Connect SDK Intermediate