scripts/Kconfig: add dt_node_array_prop Kconfig functions
The motivation is to allow accessing array elements from device tree properties in Kconfig. * Add dt_node_array_prop and _node_array_prop functions to extract the array elements from properties. * Add 'dt_node_array_prop_int' and 'dt_node_array_prop_hex' keys to use in Kconfig. Signed-off-by: Eivind Jølsgard <eivind.jolsgard@nordicsemi.no>
This commit is contained in:
parent
fd1423620e
commit
3865e08c96
7 changed files with 129 additions and 0 deletions
|
@ -211,6 +211,32 @@ def _node_int_prop(node, prop, unit=None):
|
|||
return node.props[prop].val >> _dt_units_to_scale(unit)
|
||||
|
||||
|
||||
def _node_array_prop(node, prop, index=0, unit=None):
|
||||
"""
|
||||
This function takes a 'node' and will look to see if that 'node' has a
|
||||
property called 'prop' and if that 'prop' is an array type will return
|
||||
the value of the property 'prop' at the given 'index' as either a string int
|
||||
or string hex value. If the property 'prop' is not found or the given 'index'
|
||||
is out of range it will return 0.
|
||||
|
||||
The function will divide the value based on 'unit':
|
||||
None No division
|
||||
'k' or 'K' divide by 1024 (1 << 10)
|
||||
'm' or 'M' divide by 1,048,576 (1 << 20)
|
||||
'g' or 'G' divide by 1,073,741,824 (1 << 30)
|
||||
"""
|
||||
if not node:
|
||||
return 0
|
||||
|
||||
if prop not in node.props:
|
||||
return 0
|
||||
if node.props[prop].type != "array":
|
||||
return 0
|
||||
if int(index) >= len(node.props[prop].val):
|
||||
return 0
|
||||
return node.props[prop].val[int(index)] >> _dt_units_to_scale(unit)
|
||||
|
||||
|
||||
def _dt_chosen_reg_addr(kconf, chosen, index=0, unit=None):
|
||||
"""
|
||||
This function takes a 'chosen' property and treats that property as a path
|
||||
|
@ -448,6 +474,34 @@ def dt_node_int_prop(kconf, name, path, prop, unit=None):
|
|||
if name == "dt_node_int_prop_hex":
|
||||
return hex(_node_int_prop(node, prop, unit))
|
||||
|
||||
|
||||
def dt_node_array_prop(kconf, name, path, prop, index, unit=None):
|
||||
"""
|
||||
This function takes a 'path', property name ('prop') and index ('index')
|
||||
and looks for an EDT node at that path. If it finds an EDT node, it will
|
||||
look to see if that node has a property called 'prop' and if that 'prop'
|
||||
is an array type will return the value of the property 'prop' at the given
|
||||
'index' as either a string int or string hex value. If not found we return 0.
|
||||
|
||||
The function will divide the value based on 'unit':
|
||||
None No division
|
||||
'k' or 'K' divide by 1024 (1 << 10)
|
||||
'm' or 'M' divide by 1,048,576 (1 << 20)
|
||||
'g' or 'G' divide by 1,073,741,824 (1 << 30)
|
||||
"""
|
||||
if doc_mode or edt is None:
|
||||
return "0"
|
||||
|
||||
try:
|
||||
node = edt.get_node(path)
|
||||
except edtlib.EDTError:
|
||||
return "0"
|
||||
if name == "dt_node_array_prop_int":
|
||||
return str(_node_array_prop(node, prop, index, unit))
|
||||
if name == "dt_node_array_prop_hex":
|
||||
return hex(_node_array_prop(node, prop, index, unit))
|
||||
|
||||
|
||||
def dt_node_str_prop_equals(kconf, _, path, prop, val):
|
||||
"""
|
||||
This function takes a 'path' and property name ('prop') looks for an EDT
|
||||
|
@ -611,6 +665,8 @@ functions = {
|
|||
"dt_nodelabel_has_prop": (dt_nodelabel_has_prop, 2, 2),
|
||||
"dt_node_int_prop_int": (dt_node_int_prop, 2, 3),
|
||||
"dt_node_int_prop_hex": (dt_node_int_prop, 2, 3),
|
||||
"dt_node_array_prop_int": (dt_node_array_prop, 3, 4),
|
||||
"dt_node_array_prop_hex": (dt_node_array_prop, 3, 4),
|
||||
"dt_node_str_prop_equals": (dt_node_str_prop_equals, 3, 3),
|
||||
"dt_nodelabel_has_compat": (dt_nodelabel_has_compat, 2, 2),
|
||||
"dt_nodelabel_path": (dt_nodelabel_path, 1, 1),
|
||||
|
|
8
tests/misc/kconfigoptions/CMakeLists.txt
Normal file
8
tests/misc/kconfigoptions/CMakeLists.txt
Normal file
|
@ -0,0 +1,8 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
cmake_minimum_required(VERSION 3.13.1)
|
||||
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
|
||||
project(kconfigoptions)
|
||||
|
||||
FILE(GLOB app_sources src/*.c)
|
||||
target_sources(app PRIVATE ${app_sources})
|
19
tests/misc/kconfigoptions/Kconfig
Normal file
19
tests/misc/kconfigoptions/Kconfig
Normal file
|
@ -0,0 +1,19 @@
|
|||
# Copyright (c) 2022 Nordic Semiconductor
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
DT_FLASH_CONTROLLER := $(dt_nodelabel_path,flashcontroller0)
|
||||
|
||||
config FLASH_CONTROLLER_ADDRESS
|
||||
int
|
||||
default $(dt_node_array_prop_int,$(DT_FLASH_CONTROLLER),reg,0)
|
||||
|
||||
config FLASH_CONTROLLER_SIZE
|
||||
int
|
||||
default $(dt_node_array_prop_int,$(DT_FLASH_CONTROLLER),reg,1)
|
||||
|
||||
|
||||
menu "Zephyr Kernel"
|
||||
source "Kconfig.zephyr"
|
||||
endmenu
|
9
tests/misc/kconfigoptions/native_posix.overlay
Normal file
9
tests/misc/kconfigoptions/native_posix.overlay
Normal file
|
@ -0,0 +1,9 @@
|
|||
/*
|
||||
* Copyright (c) 2022 Nordic Semiconductor ASA
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
&flashcontroller0 {
|
||||
reg = <0x00000001 4194304>;
|
||||
};
|
1
tests/misc/kconfigoptions/prj.conf
Normal file
1
tests/misc/kconfigoptions/prj.conf
Normal file
|
@ -0,0 +1 @@
|
|||
CONFIG_ZTEST=y
|
32
tests/misc/kconfigoptions/src/main.c
Normal file
32
tests/misc/kconfigoptions/src/main.c
Normal file
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Copyright (c) 2022 Nordic Semiconductor ASA
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <zephyr/ztest.h>
|
||||
|
||||
/**
|
||||
* @brief Test .
|
||||
*
|
||||
*/
|
||||
void test_kconfigoptions_array_hex(void)
|
||||
{
|
||||
zassert_equal(0x1, CONFIG_FLASH_CONTROLLER_ADDRESS,
|
||||
"Unexpected flash controller address (%d)", CONFIG_FLASH_CONTROLLER_ADDRESS);
|
||||
}
|
||||
|
||||
void test_kconfigoptions_array_int(void)
|
||||
{
|
||||
zassert_equal(4194304, CONFIG_FLASH_CONTROLLER_SIZE,
|
||||
"Unexpected flash controller size (%d)", CONFIG_FLASH_CONTROLLER_SIZE);
|
||||
}
|
||||
|
||||
void test_main(void)
|
||||
{
|
||||
ztest_test_suite(kconfigoptions,
|
||||
ztest_unit_test(test_kconfigoptions_array_hex),
|
||||
ztest_unit_test(test_kconfigoptions_array_int)
|
||||
);
|
||||
ztest_run_test_suite(kconfigoptions);
|
||||
}
|
4
tests/misc/kconfigoptions/testcase.yaml
Normal file
4
tests/misc/kconfigoptions/testcase.yaml
Normal file
|
@ -0,0 +1,4 @@
|
|||
tests:
|
||||
misc.kconfigoptions:
|
||||
tags: kconfigoptions
|
||||
platform_allow: native_posix
|
Loading…
Add table
Add a link
Reference in a new issue