build/kconfig/preprocessor-functions.html · build/kconfig/preprocessor-functions.rst 공식 원문 ↗

Zephyr 3.7.0 · Build · Kconfig

Custom Kconfig preprocessor 함수

Node·property·register·phandle 정보를 Kconfig default로 확장하는 Python 함수 모음입니다.

Official pathbuild/kconfig/preprocessor-functions.html
Source filebuild/kconfig/preprocessor-functions.rst
Source versionZephyr 3.7.0
TranslationFull · reviewed

본문 기준: Zephyr 3.7.0 LTS3 · 이후 유지보수 패치는 별도입니다.

Part 1

요약·해설

*_int와 *_hex 반환 형식, 함수 목록, SPI register address 적용 예제를 보존했습니다.

Source

kconfigfunctions.py

Input

Devicetree

Return

int · hex

Use

Kconfig default

Part 2

접을 수 있는 영어 원문 전체

영어 원문 전체 펼치기
원문 SHA-256 C6D591B199CC412DED25F6D12EA257C7D9E3EBD8032B12202F8095EB1A7EB3CC
.. _kconfig-functions:

Custom Kconfig Preprocessor Functions
#####################################

Kconfiglib supports custom Kconfig preprocessor functions written in Python.
These functions are defined in
:zephyr_file:`scripts/kconfig/kconfigfunctions.py`.

.. note::

   The official Kconfig preprocessor documentation can be found `here
   <https://www.kernel.org/doc/html/latest/kbuild/kconfig-macro-language.html>`__.

Most of the custom preprocessor functions are used to get devicetree
information into Kconfig. For example, the default value of a Kconfig symbol
can be fetched from a devicetree ``reg`` property.

Devicetree-related Functions
****************************

The functions listed below are used to get devicetree information into Kconfig.
See the Python docstrings in :zephyr_file:`scripts/kconfig/kconfigfunctions.py`
for detailed documentation.

The ``*_int`` version of each function returns the value as a decimal integer,
while the ``*_hex`` version returns a hexadecimal value starting with ``0x``.

.. code-block:: none

   $(dt_alias_enabled,<node alias>)
   $(dt_chosen_bool_prop, <property in /chosen>, <prop>)
   $(dt_chosen_enabled,<property in /chosen>)
   $(dt_chosen_has_compat,<property in /chosen>)
   $(dt_chosen_label,<property in /chosen>)
   $(dt_chosen_partition,addr_hex,<chosen>[,<index>,<unit>])
   $(dt_chosen_partition,addr_int,<chosen>[,<index>,<unit>])
   $(dt_chosen_path,<property in /chosen>)
   $(dt_chosen_reg_addr_hex,<property in /chosen>[,<index>,<unit>])
   $(dt_chosen_reg_addr_int,<property in /chosen>[,<index>,<unit>])
   $(dt_chosen_reg_size_hex,<property in /chosen>[,<index>,<unit>])
   $(dt_chosen_reg_size_int,<property in /chosen>[,<index>,<unit>])
   $(dt_compat_any_has_prop,<compatible string>,<prop>)
   $(dt_compat_any_on_bus,<compatible string>,<prop>)
   $(dt_compat_enabled,<compatible string>)
   $(dt_compat_on_bus,<compatible string>,<bus>)
   $(dt_gpio_hogs_enabled)
   $(dt_has_compat,<compatible string>)
   $(dt_has_compat_enabled,<compatible string>)
   $(dt_node_array_prop_hex,<node path>,<prop>,<index>[,<unit>])
   $(dt_node_array_prop_int,<node path>,<prop>,<index>[,<unit>])
   $(dt_node_bool_prop,<node path>,<prop>)
   $(dt_node_has_compat,<node path>,<compatible string>)
   $(dt_node_has_prop,<node path>,<prop>)
   $(dt_node_int_prop_hex,<node path>,<prop>[,<unit>])
   $(dt_node_int_prop_int,<node path>,<prop>[,<unit>])
   $(dt_node_parent,<node path>)
   $(dt_node_ph_array_prop_hex,<node path>,<prop>,<index>,<cell>[,<unit>])
   $(dt_node_ph_array_prop_int,<node path>,<prop>,<index>,<cell>[,<unit>])
   $(dt_node_ph_prop_path,<node path>,<prop>)
   $(dt_node_reg_addr_hex,<node path>[,<index>,<unit>])
   $(dt_node_reg_addr_int,<node path>[,<index>,<unit>])
   $(dt_node_reg_size_hex,<node path>[,<index>,<unit>])
   $(dt_node_reg_size_int,<node path>[,<index>,<unit>])
   $(dt_node_str_prop_equals,<node path>,<prop>,<value>)
   $(dt_nodelabel_array_prop_has_val, <node label>, <prop>, <value>)
   $(dt_nodelabel_bool_prop,<node label>,<prop>)
   $(dt_nodelabel_enabled,<node label>)
   $(dt_nodelabel_enabled_with_compat,<node label>,<compatible string>)
   $(dt_nodelabel_has_compat,<node label>,<compatible string>)
   $(dt_nodelabel_has_prop,<node label>,<prop>)
   $(dt_nodelabel_path,<node label>)
   $(dt_nodelabel_reg_addr_hex,<node label>[,<index>,<unit>])
   $(dt_nodelabel_reg_addr_int,<node label>[,<index>,<unit>])
   $(dt_nodelabel_reg_size_hex,<node label>[,<index>,<unit>])
   $(dt_nodelabel_reg_size_int,<node label>[,<index>,<unit>])
   $(dt_path_enabled,<node path>)
   $(normalize_upper,<string>)
   $(shields_list_contains,<shield name>)
   $(substring,<string>,<start>[,<stop>])


Example Usage
=============

Assume that the devicetree for some board looks like this:

.. code-block:: devicetree

   {
   	soc {
   		#address-cells = <1>;
   		#size-cells = <1>;

   		spi0: spi@10014000 {
   			compatible = "sifive,spi0";
   			reg = <0x10014000 0x1000 0x20010000 0x3c0900>;
   			reg-names = "control", "mem";
   			...
   		};
   };

The second entry in ``reg`` in ``spi@1001400`` (``<0x20010000 0x3c0900>``)
corresponds to ``mem``, and has the address ``0x20010000``. This address can be
inserted into Kconfig as follows:

.. code-block:: kconfig

   config FLASH_BASE_ADDRESS
   	default $(dt_node_reg_addr_hex,/soc/spi@1001400,1)

After preprocessor expansion, this turns into the definition below:

.. code-block:: kconfig

   config FLASH_BASE_ADDRESS
   	default 0x20010000

Part 3

한국어 전문 번역

Custom Kconfig preprocessor 함수

Kconfiglib는 Python으로 작성한 custom Kconfig preprocessor 함수를 지원합니다. Zephyr 함수는 scripts/kconfig/kconfigfunctions.py에 정의되어 있습니다.

대부분은 Devicetree 정보를 Kconfig로 가져오는 데 사용합니다. 예를 들어 Kconfig symbol의 default를 devicetree reg property에서 얻을 수 있습니다. 공식 Kconfig macro language 문서도 함께 참고할 수 있습니다.

Devicetree 관련 함수

각 함수의 자세한 argument와 반환 규칙은 kconfigfunctions.py의 Python docstring에 있습니다. 이름이 *_int인 함수는 decimal integer를, *_hex는 0x로 시작하는 hexadecimal 값을 반환합니다.

$(dt_alias_enabled,<node alias>)
$(dt_chosen_bool_prop, <property in /chosen>, <prop>)
$(dt_chosen_enabled,<property in /chosen>)
$(dt_chosen_has_compat,<property in /chosen>)
$(dt_chosen_label,<property in /chosen>)
$(dt_chosen_partition,addr_hex,<chosen>[,<index>,<unit>])
$(dt_chosen_partition,addr_int,<chosen>[,<index>,<unit>])
$(dt_chosen_path,<property in /chosen>)
$(dt_chosen_reg_addr_hex,<property in /chosen>[,<index>,<unit>])
$(dt_chosen_reg_addr_int,<property in /chosen>[,<index>,<unit>])
$(dt_chosen_reg_size_hex,<property in /chosen>[,<index>,<unit>])
$(dt_chosen_reg_size_int,<property in /chosen>[,<index>,<unit>])
$(dt_compat_any_has_prop,<compatible string>,<prop>)
$(dt_compat_any_on_bus,<compatible string>,<prop>)
$(dt_compat_enabled,<compatible string>)
$(dt_compat_on_bus,<compatible string>,<bus>)
$(dt_gpio_hogs_enabled)
$(dt_has_compat,<compatible string>)
$(dt_has_compat_enabled,<compatible string>)
$(dt_node_array_prop_hex,<node path>,<prop>,<index>[,<unit>])
$(dt_node_array_prop_int,<node path>,<prop>,<index>[,<unit>])
$(dt_node_bool_prop,<node path>,<prop>)
$(dt_node_has_compat,<node path>,<compatible string>)
$(dt_node_has_prop,<node path>,<prop>)
$(dt_node_int_prop_hex,<node path>,<prop>[,<unit>])
$(dt_node_int_prop_int,<node path>,<prop>[,<unit>])
$(dt_node_parent,<node path>)
$(dt_node_ph_array_prop_hex,<node path>,<prop>,<index>,<cell>[,<unit>])
$(dt_node_ph_array_prop_int,<node path>,<prop>,<index>,<cell>[,<unit>])
$(dt_node_ph_prop_path,<node path>,<prop>)
$(dt_node_reg_addr_hex,<node path>[,<index>,<unit>])
$(dt_node_reg_addr_int,<node path>[,<index>,<unit>])
$(dt_node_reg_size_hex,<node path>[,<index>,<unit>])
$(dt_node_reg_size_int,<node path>[,<index>,<unit>])
$(dt_node_str_prop_equals,<node path>,<prop>,<value>)
$(dt_nodelabel_array_prop_has_val, <node label>, <prop>, <value>)
$(dt_nodelabel_bool_prop,<node label>,<prop>)
$(dt_nodelabel_enabled,<node label>)
$(dt_nodelabel_enabled_with_compat,<node label>,<compatible string>)
$(dt_nodelabel_has_compat,<node label>,<compatible string>)
$(dt_nodelabel_has_prop,<node label>,<prop>)
$(dt_nodelabel_path,<node label>)
$(dt_nodelabel_reg_addr_hex,<node label>[,<index>,<unit>])
$(dt_nodelabel_reg_addr_int,<node label>[,<index>,<unit>])
$(dt_nodelabel_reg_size_hex,<node label>[,<index>,<unit>])
$(dt_nodelabel_reg_size_int,<node label>[,<index>,<unit>])
$(dt_path_enabled,<node path>)
$(normalize_upper,<string>)
$(shields_list_contains,<shield name>)
$(substring,<string>,<start>[,<stop>])

함수들은 alias·chosen·compatible·node path·node label·property·register·phandle array를 조회하고, 문자열 정규화·shield 목록·substring 처리도 제공합니다.

사용 예제

다음 board devicetree에서 spi@10014000 node의 reg는 control과 mem 두 영역을 정의합니다.

{
	soc {
		#address-cells = <1>;
		#size-cells = <1>;

		spi0: spi@10014000 {
			compatible = "sifive,spi0";
			reg = <0x10014000 0x1000 0x20010000 0x3c0900>;
			reg-names = "control", "mem";
			...
		};
};

reg의 두 번째 entry인 <0x20010000 0x3c0900>가 mem 영역이고 address는 0x20010000입니다. Kconfig에서는 index 1의 register address를 다음처럼 가져옵니다.

config FLASH_BASE_ADDRESS
	default $(dt_node_reg_addr_hex,/soc/spi@1001400,1)

Preprocessor가 확장한 뒤에는 실제 address가 default 값으로 들어갑니다.

config FLASH_BASE_ADDRESS
	default 0x20010000

이 방식은 hardware 주소를 Kconfig file에 중복 기입하지 않고 Devicetree를 단일 source of truth로 유지합니다.

Source

출처

영어 원문에는 문단, 문서 지시문, 표, 코드, 코드 심벌, 경로를 그대로 보존했습니다.