ncs: ボード定義の見直し
2024/09/10
少し ncs への理解が深まった気がするので、nRF5340 の MDBT53ボード用に作った環境を整理する。
- ncs-custom-board
- QSPI を使用しないのを overlay の方で表現していたが、common.dtsi から
"status"
の記述を外せば良いことに気付いた - QSPI, GPIO forwarder, ADC, I2C1, UART0, SPI3, SPI4, IEEE802154 を外した
- QSPI を使用しないのを overlay の方で表現していたが、common.dtsi から
- 各overlayサンプル
usbd
を有効にするのは USB関連の定義だけにするuart0
の有効化を common.dtsi からここに移動i2c1
も有効にしたleds
にcompatible
を追加- 効果があるのか分からん
前回作った SB1602B 液晶サンプルも更新。
- commit
- overlayサンプルを更新
- 未初期化の LED を OFF
main()
の整理
DeviceTree で GPIO output の初期値くらいは設定できそうな気がするのだが、内部プルアップ/プルダウンはあるものの値についてはなさそう。
しかしデジタルな出力なのだから最初は 0
か 1
のどちらかになるはず。
これからすると 0
のはずだ。
実際には gpio_pin_configure_dt()
なんかで設定をしないと反映されない。
つまり、DeviceTree の設定はデータとして持っているだけで、初期化のタイミングは実装者がやるようになっているのだ。
まあ、main()
までに必ず初期化される、とかなっていると困ることもあるだろうし、仕方ないか。
とはいえ gpio_pin_configure_dt()
を使うには、
DT_ALIAS()
などで ID を取ってきて、GPIO_DT_SPEC_GET()
などでstruct gpio_dt_spec
のインスタンスを持ってきて、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 も進めるべきか。