そして、Kconfigやprj.confファイルはすべてテキストで記述されています。
prj.confファイルではプロジェクト全体に対して機能の有効化を行っています。
例えば、ADCとDAC、そしてOPAMPドライバはKconfigで定義されています。このKconfigで定義されている機能を利用する場合に、prj.confに「CONFIG_」を先頭に追加して宣言します。
Kconfig:ADCの定義Kconfig:ADCの定義
prj.conf例prj.conf例
my_hello/
├── CMakeLists.txt
├── Kconfig <- 新規追加:アプリ独自のKconfig
├── prj.conf <- アプリの共通設定
├── src/
│ └── main.c <- ハードウェア非依存の共通コード
└── boards/ <- 新規作成フォルダ
├── frdm_mcxa153.overlay <- 新規作成:FRDM-MCXA153用のデバイスツリー設定
├── frdm_mcxa153.conf <- 新規作成:FRDM-MCXA153用のKconfig設定
├── frdm_mcxn947_cpu0.overlay <- 新規作成:FRDM-MCXN947用のデバイスツリー設定
└── frdm_mcxn947_cpu0.conf <- 新規作成:FRDM-MCXN947用のKconfig設定
参考: アプリケーションのディレクトリ内に特定のファイルを作成することで、Zephyrのビルドシステム(West)は自動的にそれらを認識し、設定を適用します。
- Kconfigの追加: アプリケーションフォルダに 「Kconfig」 ファイルを置くことで、独自のコンフィグシンボルを追加できます。
- ボードごとの設定 (「boards/」 ディレクトリ): アプリケーション内に 「boards」 ディレクトリを作成し、そこに 「[ボード名].overlay」 や 「[ボード名].conf」 を配置すると、そのボードをターゲットとしてビルドした時にのみ、自動的にオーバーレイやKconfigの上書きが適用されます。
mainmenu "my LED blink"
config CUSTOM_BLINK_RATE_MS
int "LED blink rate in milliseconds"
default 1000
help
Set LED blink frequency. #LEDの点滅周期(ミリ秒)を設定します
config ENABLE_BUTTON_TOGGLE
bool "Enable button to toggle LED state"
default y
help
Enable button to toggle LED state. # ボタン入力によるLEDの点滅/点灯状態>の切り替え機能を有効にします。
config BOARD_NAME_STRING
string "Board Name String"
default "Unknown Board"
help
Set board name for printf. # 標準出力に表示するボード名を設定します。
source "Kconfig.zephyr"# GPIOの有効化
CONFIG_GPIO=y
# アプリケーションの共通設定
CONFIG_CUSTOM_BLINK_RATE_MS=500
CONFIG_ENABLE_BUTTON_TOGGLE=y/ {
aliases {
sw0 = &user_button_2; /* FRDM-MCXA153のユーザーボタン */
};
};CONFIG_BOARD_NAME_STRING="FRDM-MCXA153 Board"/ {
aliases {
sw0 = &user_button_3; /* FRDM-MCXN947のユーザーボタン */
};
};CONFIG_BOARD_NAME_STRING="FRDM-MCXN947 Board"
CONFIG_CUSTOM_BLINK_RATE_MS=250#include
#include
#include
/* Devicetreeのエイリアスを参照する */
/* どのボードでも、一番目のLEDは通常 "led0" と定義されています */
#define LED0_NODE DT_ALIAS(led0)
#define SW0_NODE DT_ALIAS(sw0)
/* エイリアスからGPIO仕様(ポート、ピン、フラグ)を取得 */
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
/* ボタン機能がKconfigで有効化されている場合のみコンパイルされる部分 */
#ifdef CONFIG_ENABLE_BUTTON_TOGGLE
static const struct gpio_dt_spec sw = GPIO_DT_SPEC_GET(SW0_NODE, gpios);
static struct gpio_callback button_cb_data;
static bool is_blinking = true;
void button_pressed(const struct device *dev, struct gpio_callback *cb, uint32_t pins)
{
is_blinking = !is_blinking;
if (!is_blinking) {
/* 点滅オフ時はLEDを点灯させた状態にする */
gpio_pin_set_dt(&led, 1);
}
}
#endif //CONFIG_ENABLE_BUTTON_TOGGLE
int main(void)
{
int ret;
/* Kconfigで設定されたボード名を出力 */
printf("Starting application on %s\n", CONFIG_BOARD_NAME_STRING);
/* デバイスの準備確認 */
if (!gpio_is_ready_dt(&led)) {
return -1;
}
/* ピンの設定 (Devicetreeで定義された初期状態などを考慮して設定) */
ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
if (ret < 0) {
return -1;
}
#ifdef CONFIG_ENABLE_BUTTON_TOGGLE
if (!gpio_is_ready_dt(&sw)) {
return -1;
}
ret = gpio_pin_configure_dt(&sw, GPIO_INPUT);
if (ret < 0) {
return -1;
}
ret = gpio_pin_interrupt_configure_dt(&sw, GPIO_INT_EDGE_TO_ACTIVE);
if (ret < 0) {
return -1;
}
gpio_init_callback(&button_cb_data, button_pressed, BIT(sw.pin));
gpio_add_callback(sw.port, &button_cb_data);
#endif //CONFIG_ENABLE_BUTTON_TOGGLE
while (1) {
#ifdef CONFIG_ENABLE_BUTTON_TOGGLE
if (is_blinking) {
ret = gpio_pin_toggle_dt(&led);
}
#else
/* ピンの状態を反転 (ボタン機能が無効な場合は常に点滅) */
ret = gpio_pin_toggle_dt(&led);
#endif //CONFIG_ENABLE_BUTTON_TOGGLE
/* Kconfigで設定された点滅間隔で待機 */
k_msleep(CONFIG_CUSTOM_BLINK_RATE_MS);
}
return 0;
} さて、実際に動作を確認してみます。ビルド環境セットアップやwestコマンド有効化については、前回の記事を参考にしてください。
まずは、下記のコマンド手順の様にインストールしているzephyrprojectリポジトリのディレクトリに移動し、west 有効化を行ってから進めます。
## ホームディレクトリからZephyrprojectディレクトリに移動
cd ~/zephyrproject
## west環境を有効化
source .venv/bin/activate
## zephyr v4.3をチェックアウトしていない場合は、前回(第3回 初めてのLチカとソフトウェアの再利用性)を参考にv4.3をチェックアウトしてください。
west build -b frdm_mcxa153 my_hello
west flash# -pオプションを使用し、frdm_mcxa153のビルド情報をクリーンしてビルドします。
west build -p -b frdm_mcxn947//cpu0 my_hello
west flashFRDM-MCXA153とFRDM-MCXN947では、LED制御しているGPIOやスイッチボタンに繋がっているGPIOが異なりますが、デバイスツリーによりその差分が吸収され、アプリケーションのプログラムとハードウェアがきれいに分離できていることが実感できたと思います。
=========================
本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。
お手数をおかけしますが、お問い合わせの際には「NXPへの技術質問 - 問い合わせ方法 (日本語ブログ)」をご参照ください。
(既に弊社NXP代理店、もしくはNXPとお付き合いのある方は、直接担当者へご質問いただいてもかまいません。)
Zephyrのソフトウェア再利用性を高めるための特徴であるデバイスツリーとKconfigの概要を説明します。そして、それらを実践で利用するためにステップを踏んで説明していきます。
このぜZephyrシリーズ第1回から今回の第4回までを読み終えると、Zephyr RTOSを利用してプログラムが書けるようになります。