/** * @file * @brief Flash Devicetree macro public API header file. */ /* * Copyright (c) 2020, Linaro Ltd. * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_DEVICETREE_FIXED_PARTITION_H_ #define ZEPHYR_INCLUDE_DEVICETREE_FIXED_PARTITION_H_ #ifdef __cplusplus extern "C" { #endif /** * @defgroup devicetree-fixed-partition Devicetree Fixed Partition API * @ingroup devicetree * @{ */ /** * @brief Get a node identifier for a fixed partition with * a given label property * * Example devicetree fragment: * * flash@... { * partitions { * compatible = "fixed-partitions"; * boot_partition: partition@0 { * label = "mcuboot"; * }; * slot0_partition: partition@c000 { * label = "image-0"; * }; * ... * }; * }; * * Example usage: * * DT_NODE_BY_FIXED_PARTITION_LABEL(mcuboot) // node identifier for boot_partition * DT_NODE_BY_FIXED_PARTITION_LABEL(image_0) // node identifier for slot0_partition * * @param label lowercase-and-underscores label property value * @return a node identifier for the partition with that label property */ #define DT_NODE_BY_FIXED_PARTITION_LABEL(label) \ DT_CAT(DT_COMPAT_fixed_partitions_LABEL_, label) /** * @brief Test if a fixed partition with a given label property exists * @param label lowercase-and-underscores label property value * @return 1 if any "fixed-partitions" child node has the given label, * 0 otherwise. */ #define DT_HAS_FIXED_PARTITION_LABEL(label) \ IS_ENABLED(DT_CAT3(DT_COMPAT_fixed_partitions_LABEL_, label, _EXISTS)) /** * @brief Test if fixed-partition compatible node exists * * @param node_id DTS node to test * @return 1 if node exists and is fixed-partition compatible, 0 otherwise. */ #define DT_FIXED_PARTITION_EXISTS(node_id) \ DT_NODE_HAS_COMPAT(DT_PARENT(node_id), fixed_partitions) /** * @brief Get a numeric identifier for a fixed partition * @param node_id node identifier for a fixed-partitions child node * @return the partition's ID, a unique zero-based index number */ #define DT_FIXED_PARTITION_ID(node_id) DT_CAT(node_id, _PARTITION_ID) /** * @brief Get the node identifier of the flash memory for a partition * @param node_id node identifier for a fixed-partitions child node * @return the node identifier of the internal memory that contains the * fixed-partitions node, or @ref DT_INVALID_NODE if it doesn't exist. */ #define DT_MEM_FROM_FIXED_PARTITION(node_id) \ COND_CODE_1(DT_NODE_HAS_COMPAT(DT_GPARENT(node_id), soc_nv_flash), (DT_GPARENT(node_id)), \ (DT_INVALID_NODE)) /** * @brief Get the node identifier of the flash controller for a partition * @param node_id node identifier for a fixed-partitions child node * @return the node identifier of the memory technology device that * contains the fixed-partitions node. */ #define DT_MTD_FROM_FIXED_PARTITION(node_id) \ COND_CODE_1(DT_NODE_EXISTS(DT_MEM_FROM_FIXED_PARTITION(node_id)), \ (DT_PARENT(DT_MEM_FROM_FIXED_PARTITION(node_id))), (DT_GPARENT(node_id))) /** * @brief Get the absolute address of a fixed partition * * Example devicetree fragment: * * &flash_controller { * flash@1000000 { * compatible = "soc-nv-flash"; * partitions { * compatible = "fixed-partitions"; * storage_partition: partition@3a000 { * label = "storage"; * }; * }; * }; * }; * * Here, the "storage" partition is seen to belong to flash memory * starting at address 0x1000000. The partition's unit address of * 0x3a000 represents an offset inside that flash memory. * * Example usage: * * DT_FIXED_PARTITION_ADDR(DT_NODELABEL(storage_partition)) // 0x103a000 * * This macro can only be used with partitions of internal memory * addressable by the CPU. Otherwise, it may produce a compile-time * error, such as: `'__REG_IDX_0_VAL_ADDRESS' undeclared`. * * @param node_id node identifier for a fixed-partitions child node * @return the partition's offset plus the base address of the flash * node containing it. */ #define DT_FIXED_PARTITION_ADDR(node_id) \ (DT_REG_ADDR(DT_MEM_FROM_FIXED_PARTITION(node_id)) + DT_REG_ADDR(node_id)) /** * @} */ #ifdef __cplusplus } #endif #endif /* ZEPHYR_INCLUDE_DEVICETREE_FIXED_PARTITION_H_ */