ESP-IDFを使ってみる

Kconfig Languageテクニック


esp-idfではmenuconfigを使ってビルドオプションを指定します。
menuconfigは、Kconfig.projbuild に従って動きます。
Kconfig.projbuild は Kconfig Language を使って記述しますが、Kconfig Languageに関する資料は余り見つかりません。
そこで、esp-idfのサンプルコードの中で使われているテクニックを幾つか紹介します。

ESP32の各モデルでは使えるGPIOの上限が違います。
以下の様に、モデルごとのGPIOの下限と上限を、別の定義ファイル(Kconfig.env_caps)から取り出すことができます。
このテクニックはこ ちらのサンプルなどで使われています。
menu "Example Configuration"

    orsource "$IDF_PATH/examples/common_components/env_caps/$IDF_TARGET/Kconfig.env_caps"

    config GPIO_OUTPUT_0
        int "GPIO output pin 0"
        range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
        default 18 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3
        default 8 if IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
        help
            GPIO pin number to be used as GPIO_OUTPUT_IO_0.

endmenu

Kconfig.env_capsはESP-IDF Ver5から追加されたファイルで、モデルごとに存在し、以下の内容になっています。
4つの変数が定義されています。
$ ls $HOME/esp-idf/examples/common_components/env_caps
README.md  esp32  esp32c2  esp32c3  esp32h2  esp32s2  esp32s3

$ cat $HOME/esp-idf/examples/common_components/env_caps/esp32/Kconfig.env_caps
config ENV_GPIO_RANGE_MIN
    int
    default 0

config ENV_GPIO_RANGE_MAX
    int
    default 39

config ENV_GPIO_IN_RANGE_MAX
    int
    default ENV_GPIO_RANGE_MAX

config ENV_GPIO_OUT_RANGE_MAX
    int
    default 33

Kconfig.env_capsはESP-IDF Ver5から追加されたファイルなので、ESP-IDF Ver4では、以下の様に Kconfig.projbuild 内で変数を定義する必要が有ります。
menu "Example Configuration"

    config ENV_GPIO_RANGE_MIN
        int
        default 0

    config ENV_GPIO_RANGE_MAX
        int
        default 33 if IDF_TARGET_ESP32
        default 46 if IDF_TARGET_ESP32S2
        default 19 if IDF_TARGET_ESP32C3
        default 48 if IDF_TARGET_ESP32S3

    config GPIO_OUTPUT_0
        int "GPIO output pin 0"
        range ENV_GPIO_RANGE_MIN ENV_GPIO_RANGE_MAX
        default 18 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3
        default 8 if IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
        help
            GPIO pin number to be used as GPIO_OUTPUT_IO_0.

endmenu

IDE_TARGET_ESP32とよく似た使い方ですがESP32 RISCVシリーズの総称として、IDF_TARGET_ARCH_RISCVと言う 定義を使うことができます。
この定義はこ ちらのサンプルなどで使われています。
実際の使用例は有りませんが、ESP32/ESP32S2/ESP32S3の総称として、IDF_TARGET_ARCH_XTENSAも使えま す。



複数の候補から1つを選ぶ場合、以下の様にchoiceを使います。
menu "Example configuration"

  choice
    prompt "CC1101 Frequency"
    default CC1101_FREQ2
    help
        Select ISM band frequency

    config CC1101_FREQ315
        bool "315 MHz"
    config CC1101_FREQ433
        bool "433 MHz"
    config CC1101_FREQ868
        bool "868 MHz"
    config CC1101_FREQ915
        bool "915 MHz"
  endchoice

endmenu

これをこのままコードで使用すると、以下の様になります。
#if CONFIG_CC1101_FREQ315
    float freq = 315000000;
#elif CONFIG_CC1101_FREQ433
    float freq = 433000000;
#elif CONFIG_CC1101_FREQ868
    float freq = 868000000;
#else
    float freq = 915000000;
#endif

以下の様にすることで、CONFIG_CC1101_FREQ変数として扱うことができます。
このテクニックはこ ちらのサンプルなどで使われています。
menu "Example configuration"

  choice
    prompt "CC1101 Frequency"
    default CC1101_FREQ2
    help
        Select ISM band frequency

    config CC1101_FREQ315
        bool "315 MHz"
    config CC1101_FREQ433
        bool "433 MHz"
    config CC1101_FREQ868
        bool "868 MHz"
    config CC1101_FREQ915
        bool "915 MHz"
  endchoice

  config CC1101_FREQ
    int
    default 315 if CC1101_FREQ315
    default 433 if CC1101_FREQ433
    default 868 if CC1101_FREQ868
    default 915 if CC1101_FREQ915

endmenu

CONFIG_CC1101_FREQ変数を使用すると、以下の様になります。
    float freq = CONFIG_CC1101_FREQ;



オプションの有効/無効はbool変数を使います。
以下の様にするとAPP_COMPATIBLE_PRE_V2_1_BOOTLOADERSを有効にすると、
それに応じてAPP_COMPATIBLE_PRE_V3_1_BOOTLOADERSも有効になり、無効にすることはできなくなります。
このテクニックはこ ちらなどで使われています。
menu "Application configuration"

    config APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS
        bool "App compatible with bootloaders before ESP-IDF v2.1"
        select APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS
        default n

    config APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS
        bool "App compatible with bootloader and partition table before ESP-IDF v3.1"
        default n

endmenu