LCOV - code coverage report
Current view: top level - zephyr - bindesc.h Coverage Total Hit
Test: new.info Lines: 100.0 % 57 57
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            1 : /*
       2              :  * Copyright (c) 2023 Yonatan Schachter
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : 
       7              : /**
       8              :  * @file
       9              :  * @brief Header file for binary descriptors
      10              :  * @ingroup bindesc
      11              :  */
      12              : 
      13              : #ifndef ZEPHYR_INCLUDE_ZEPHYR_BINDESC_H_
      14              : #define ZEPHYR_INCLUDE_ZEPHYR_BINDESC_H_
      15              : 
      16              : /**
      17              :  * @defgroup bindesc Binary Descriptors
      18              :  * @ingroup os_services
      19              :  * @{
      20              :  */
      21              : 
      22              : #include <zephyr/sys/util_macro.h>
      23              : 
      24              : #ifdef __cplusplus
      25              : extern "C" {
      26              : #endif /* __cplusplus */
      27              : 
      28              : /*
      29              :  * Corresponds to the definitions in scripts/west_commands/bindesc.py.
      30              :  * Do not change without syncing the definitions in both files!
      31              :  */
      32              : 
      33              : /** Magic number used to identify binary descriptor sections in firmware images */
      34            1 : #define BINDESC_MAGIC 0xb9863e5a7ea46046
      35              : /** Required memory alignment for binary descriptor entries */
      36            1 : #define BINDESC_ALIGNMENT 4
      37              : 
      38              : /** @name Binary Descriptor Types */
      39              : /** @{ */
      40            1 : #define BINDESC_TYPE_UINT            0x0 /**< Unsigned integer data */
      41            1 : #define BINDESC_TYPE_STR             0x1 /**< String data */
      42            1 : #define BINDESC_TYPE_BYTES           0x2 /**< Byte array data */
      43            1 : #define BINDESC_TYPE_DESCRIPTORS_END 0xf /**< Marks the end of binary descriptor section */
      44              : /** @} */
      45              : 
      46              : /** Size of the header of a binary descriptor entry */
      47              : /* Needed as sizeof ignores the data as it's a flexible array */
      48            1 : #define BINDESC_ENTRY_HEADER_SIZE (sizeof(struct bindesc_entry))
      49              : 
      50              : /**
      51              :  * @brief Macros for defining binary descriptors in firmware images
      52              :  * @defgroup bindesc_define Binary Descriptor Definition
      53              :  * @ingroup bindesc
      54              :  * @{
      55              :  */
      56              : 
      57              : /*
      58              :  * Corresponds to the definitions in scripts/west_commands/bindesc.py.
      59              :  * Do not change without syncing the definitions in both files!
      60              :  */
      61              : 
      62              : /** The app version string such as "1.2.3" */
      63            1 : #define BINDESC_ID_APP_VERSION_STRING 0x800
      64              : 
      65              : /** The app version major such as 1 */
      66            1 : #define BINDESC_ID_APP_VERSION_MAJOR 0x801
      67              : 
      68              : /** The app version minor such as 2 */
      69            1 : #define BINDESC_ID_APP_VERSION_MINOR 0x802
      70              : 
      71              : /** The app version patchlevel such as 3 */
      72            1 : #define BINDESC_ID_APP_VERSION_PATCHLEVEL 0x803
      73              : 
      74              : /** The app version number such as 0x10203 */
      75            1 : #define BINDESC_ID_APP_VERSION_NUMBER 0x804
      76              : 
      77              : /** The app git reference such as "v3.3.0-18-g2c85d9224fca" */
      78            1 : #define BINDESC_ID_APP_BUILD_VERSION 0x805
      79              : 
      80              : /** The kernel version string such as "3.4.0" */
      81            1 : #define BINDESC_ID_KERNEL_VERSION_STRING 0x900
      82              : 
      83              : /** The kernel version major such as 3 */
      84            1 : #define BINDESC_ID_KERNEL_VERSION_MAJOR 0x901
      85              : 
      86              : /** The kernel version minor such as 4 */
      87            1 : #define BINDESC_ID_KERNEL_VERSION_MINOR 0x902
      88              : 
      89              : /** The kernel version patchlevel such as 0 */
      90            1 : #define BINDESC_ID_KERNEL_VERSION_PATCHLEVEL 0x903
      91              : 
      92              : /** The kernel version number such as 0x30400 */
      93            1 : #define BINDESC_ID_KERNEL_VERSION_NUMBER 0x904
      94              : 
      95              : /** The kernel git reference such as "v3.3.0-18-g2c85d9224fca" */
      96            1 : #define BINDESC_ID_KERNEL_BUILD_VERSION 0x905
      97              : 
      98              : /** The year the image was compiled in */
      99            1 : #define BINDESC_ID_BUILD_TIME_YEAR 0xa00
     100              : 
     101              : /** The month of the year the image was compiled in */
     102            1 : #define BINDESC_ID_BUILD_TIME_MONTH 0xa01
     103              : 
     104              : /** The day of the month the image was compiled in */
     105            1 : #define BINDESC_ID_BUILD_TIME_DAY 0xa02
     106              : 
     107              : /** The hour of the day the image was compiled in */
     108            1 : #define BINDESC_ID_BUILD_TIME_HOUR 0xa03
     109              : 
     110              : /** The minute the image was compiled in */
     111            1 : #define BINDESC_ID_BUILD_TIME_MINUTE 0xa04
     112              : 
     113              : /** The second the image was compiled in */
     114            1 : #define BINDESC_ID_BUILD_TIME_SECOND 0xa05
     115              : 
     116              : /** The UNIX time (seconds since midnight of 1970/01/01) the image was compiled in */
     117            1 : #define BINDESC_ID_BUILD_TIME_UNIX 0xa06
     118              : 
     119              : /** The date and time of compilation such as "2023/02/05 00:07:04" */
     120            1 : #define BINDESC_ID_BUILD_DATE_TIME_STRING 0xa07
     121              : 
     122              : /** The date of compilation such as "2023/02/05" */
     123            1 : #define BINDESC_ID_BUILD_DATE_STRING 0xa08
     124              : 
     125              : /** The time of compilation such as "00:07:04" */
     126            1 : #define BINDESC_ID_BUILD_TIME_STRING 0xa09
     127              : 
     128              : /** The name of the host that compiled the image */
     129            1 : #define BINDESC_ID_HOST_NAME 0xb00
     130              : 
     131              : /** The C compiler name */
     132            1 : #define BINDESC_ID_C_COMPILER_NAME 0xb01
     133              : 
     134              : /** The C compiler version */
     135            1 : #define BINDESC_ID_C_COMPILER_VERSION 0xb02
     136              : 
     137              : /** The C++ compiler name */
     138            1 : #define BINDESC_ID_CXX_COMPILER_NAME 0xb03
     139              : 
     140              : /** The C++ compiler version */
     141            1 : #define BINDESC_ID_CXX_COMPILER_VERSION 0xb04
     142              : 
     143              : /** The end of binary descriptor section */
     144            1 : #define BINDESC_TAG_DESCRIPTORS_END BINDESC_TAG(DESCRIPTORS_END, 0x0fff)
     145              : 
     146              : /**
     147              :  * @cond INTERNAL_HIDDEN
     148              :  */
     149              : 
     150              : /*
     151              :  * Utility macro to generate a tag from a type and an ID
     152              :  *
     153              :  * type - Type of the descriptor, UINT, STR or BYTES
     154              :  * id - Unique ID for the descriptor, must fit in 12 bits
     155              :  */
     156              : #define BINDESC_TAG(type, id) ((BINDESC_TYPE_##type & 0xf) << 12 | (id & 0x0fff))
     157              : 
     158              : /**
     159              :  * @brief Utility macro to get the type of a bindesc tag
     160              :  *
     161              :  * @param tag Tag to get the type of
     162              :  */
     163              : #define BINDESC_GET_TAG_TYPE(tag) ((tag >> 12) & 0xf)
     164              : 
     165              : /**
     166              :  * @endcond
     167              :  */
     168              : 
     169              : #if !defined(_LINKER) || defined(__DOXYGEN__)
     170              : 
     171              : #include <zephyr/sys/byteorder.h>
     172              : #include <zephyr/device.h>
     173              : 
     174              : /**
     175              :  * @cond INTERNAL_HIDDEN
     176              :  */
     177              : 
     178              : /*
     179              :  * Utility macro to get the name of a bindesc entry
     180              :  */
     181              : #define BINDESC_NAME(name) bindesc_entry_##name
     182              : 
     183              : /* Convenience helper for declaring a binary descriptor entry. */
     184              : #define __BINDESC_ENTRY_DEFINE(name)                                                    \
     185              :         __aligned(BINDESC_ALIGNMENT) const struct bindesc_entry BINDESC_NAME(name)      \
     186              :         __in_section(_bindesc_entry, static, name) __used __noasan
     187              : 
     188              : /**
     189              :  * @endcond
     190              :  */
     191              : 
     192              : /**
     193              :  * @brief Define a binary descriptor of type string.
     194              :  *
     195              :  * @details
     196              :  * Define a string that is registered in the binary descriptor header.
     197              :  * The defined string can be accessed using @ref BINDESC_GET_STR
     198              :  *
     199              :  * @note The defined string is not static, so its name must not collide with
     200              :  * any other symbol in the executable.
     201              :  *
     202              :  * @param name Name of the descriptor
     203              :  * @param id Unique ID of the descriptor
     204              :  * @param value A string value for the descriptor
     205              :  */
     206            1 : #define BINDESC_STR_DEFINE(name, id, value)                                                     \
     207              :         __BINDESC_ENTRY_DEFINE(name) = {                                                        \
     208              :                 .tag = BINDESC_TAG(STR, id),                                                    \
     209              :                 .len = (uint16_t)sizeof(value),                                                 \
     210              :                 .data = value,                                                                  \
     211              :         };                                                                                      \
     212              :         BUILD_ASSERT(sizeof(value) <= CONFIG_BINDESC_DEFINE_MAX_DATA_SIZE,                   \
     213              :                      "Bindesc " STRINGIFY(name) " exceeded maximum size, consider reducing the"     \
     214              :                      " size or changing CONFIG_BINDESC_DEFINE_MAX_DATA_SIZE. ")
     215              : 
     216              : /**
     217              :  * @brief Define a binary descriptor of type uint.
     218              :  *
     219              :  * @details
     220              :  * Define an integer that is registered in the binary descriptor header.
     221              :  * The defined integer can be accessed using @ref BINDESC_GET_UINT
     222              :  *
     223              :  * @note The defined integer is not static, so its name must not collide with
     224              :  * any other symbol in the executable.
     225              :  *
     226              :  * @param name Name of the descriptor
     227              :  * @param id Unique ID of the descriptor
     228              :  * @param value An integer value for the descriptor
     229              :  */
     230            1 : #define BINDESC_UINT_DEFINE(name, id, value)            \
     231              :         __BINDESC_ENTRY_DEFINE(name) = {                \
     232              :                 .tag = BINDESC_TAG(UINT, id),           \
     233              :                 .len = (uint16_t)sizeof(uint32_t),      \
     234              :                 .data = sys_uint32_to_array(value),     \
     235              :         }
     236              : 
     237              : /**
     238              :  * @brief Define a binary descriptor of type bytes.
     239              :  *
     240              :  * @details
     241              :  * Define a uint8_t array that is registered in the binary descriptor header.
     242              :  * The defined array can be accessed using @ref BINDESC_GET_BYTES.
     243              :  * The value should be given as an array literal, wrapped in parentheses, for
     244              :  * example:
     245              :  *
     246              :  *     BINDESC_BYTES_DEFINE(name, id, ({1, 2, 3, 4}));
     247              :  *
     248              :  * @note The defined array is not static, so its name must not collide with
     249              :  * any other symbol in the executable.
     250              :  *
     251              :  * @param name Name of the descriptor
     252              :  * @param id Unique ID of the descriptor
     253              :  * @param value A uint8_t array as data for the descriptor
     254              :  */
     255            1 : #define BINDESC_BYTES_DEFINE(name, id, value)                                                   \
     256              :         __BINDESC_ENTRY_DEFINE(name) = {                                                        \
     257              :                 .tag = BINDESC_TAG(BYTES, id),                                                  \
     258              :                 .len = (uint16_t)sizeof((uint8_t [])__DEBRACKET value),                         \
     259              :                 .data = __DEBRACKET value,                                                      \
     260              :         };                                                                                      \
     261              :         BUILD_ASSERT(sizeof((uint8_t [])__DEBRACKET value) <=                                        \
     262              :                      CONFIG_BINDESC_DEFINE_MAX_DATA_SIZE,                                       \
     263              :                      "Bindesc " STRINGIFY(name) " exceeded maximum size, consider reducing the"     \
     264              :                      " size or changing CONFIG_BINDESC_DEFINE_MAX_DATA_SIZE. ")
     265              : 
     266              : /**
     267              :  * @brief Get the value of a string binary descriptor
     268              :  *
     269              :  * @details
     270              :  * Get the value of a string binary descriptor, previously defined by
     271              :  * BINDESC_STR_DEFINE.
     272              :  *
     273              :  * @param name Name of the descriptor
     274              :  */
     275            1 : #define BINDESC_GET_STR(name) BINDESC_NAME(name).data
     276              : 
     277              : /**
     278              :  * @brief Get the value of a uint binary descriptor
     279              :  *
     280              :  * @details
     281              :  * Get the value of a uint binary descriptor, previously defined by
     282              :  * BINDESC_UINT_DEFINE.
     283              :  *
     284              :  * @param name Name of the descriptor
     285              :  */
     286            1 : #define BINDESC_GET_UINT(name) *(uint32_t *)&(BINDESC_NAME(name).data)
     287              : 
     288              : /**
     289              :  * @brief Get the value of a bytes binary descriptor
     290              :  *
     291              :  * @details
     292              :  * Get the value of a string binary descriptor, previously defined by
     293              :  * BINDESC_BYTES_DEFINE. The returned value can be accessed as an array:
     294              :  *
     295              :  *     for (size_t i = 0; i < BINDESC_GET_SIZE(name); i++)
     296              :  *         BINDESC_GET_BYTES(name)[i];
     297              :  *
     298              :  * @param name Name of the descriptor
     299              :  */
     300            1 : #define BINDESC_GET_BYTES(name) BINDESC_NAME(name).data
     301              : 
     302              : /**
     303              :  * @brief Get the size of a binary descriptor
     304              :  *
     305              :  * @details
     306              :  * Get the size of a binary descriptor. This is particularly useful for
     307              :  * bytes binary descriptors where there's no null terminator.
     308              :  *
     309              :  * @param name Name of the descriptor
     310              :  */
     311            1 : #define BINDESC_GET_SIZE(name) BINDESC_NAME(name).len
     312              : 
     313              : /**
     314              :  * @}
     315              :  */
     316              : 
     317              : /**
     318              :  * @brief Functions for reading binary descriptors from firmware images
     319              :  * @defgroup bindesc_read Binary Descriptor Reading
     320              :  * @ingroup bindesc
     321              :  * @{
     322              :  */
     323              : 
     324              : /**
     325              :  * @brief Structure for a binary descriptor entry
     326              :  */
     327            1 : struct bindesc_entry {
     328              :         /** Tag of the entry */
     329            1 :         uint16_t tag;
     330              :         /** Length of the descriptor data */
     331            1 :         uint16_t len;
     332              :         /** Value of the entry. This is either an integer or a string */
     333            1 :         uint8_t data[];
     334              : } __packed;
     335              : 
     336              : /** @cond INTERNAL_HIDDEN */
     337              : /*
     338              :  * We're assuming that `struct bindesc_entry` has a specific layout in
     339              :  * memory, so it's worth making sure that the layout is really what we
     340              :  * think it is. If these assertions fail for your toolchain/platform,
     341              :  * please open a bug report.
     342              :  */
     343              : BUILD_ASSERT(offsetof(struct bindesc_entry, tag) == 0, "Incorrect memory layout");
     344              : BUILD_ASSERT(offsetof(struct bindesc_entry, len) == 2, "Incorrect memory layout");
     345              : BUILD_ASSERT(offsetof(struct bindesc_entry, data) == 4, "Incorrect memory layout");
     346              : /** @endcond */
     347              : 
     348              : /**
     349              :  * @brief Handle for reading binary descriptors from firmware images
     350              :  */
     351            1 : struct bindesc_handle {
     352              :         /** @cond INTERNAL_HIDDEN */
     353              :         const uint8_t *address;
     354              :         enum {
     355              :                 BINDESC_HANDLE_TYPE_RAM,
     356              :                 BINDESC_HANDLE_TYPE_MEMORY_MAPPED_FLASH,
     357              :                 BINDESC_HANDLE_TYPE_FLASH,
     358              :         } type;
     359              :         size_t size_limit;
     360              : #if IS_ENABLED(CONFIG_BINDESC_READ_FLASH)
     361              :         const struct device *flash_device;
     362              :         uint8_t buffer[sizeof(struct bindesc_entry) +
     363              :                         CONFIG_BINDESC_READ_FLASH_MAX_DATA_SIZE] __aligned(BINDESC_ALIGNMENT);
     364              : #endif /* IS_ENABLED(CONFIG_BINDESC_READ_FLASH) */
     365              :         /** @endcond */
     366              : };
     367              : 
     368              : /**
     369              :  * @brief Callback type to be called on descriptors found during a walk
     370              :  *
     371              :  * @param entry Current descriptor
     372              :  * @param user_data The user_data given to @ref bindesc_foreach
     373              :  *
     374              :  * @return Any non zero value will halt the walk
     375              :  */
     376            1 : typedef int (*bindesc_callback_t)(const struct bindesc_entry *entry, void *user_data);
     377              : 
     378              : /**
     379              :  * @brief Open an image's binary descriptors for reading, from a memory mapped flash
     380              :  *
     381              :  * @details
     382              :  * Initializes a bindesc handle for subsequent calls to bindesc API.
     383              :  * Memory mapped flash is any flash that can be directly accessed by the CPU,
     384              :  * without needing to use the flash API for copying the data to RAM.
     385              :  *
     386              :  * @param[out] handle Bindesc handle to be given to subsequent calls
     387              :  * @param offset The offset from the beginning of the flash that the bindesc magic can be found at
     388              :  *
     389              :  * @retval 0 On success
     390              :  * @retval -ENOENT If no bindesc magic was found at the given offset
     391              :  */
     392            1 : int bindesc_open_memory_mapped_flash(struct bindesc_handle *handle, size_t offset);
     393              : 
     394              : /**
     395              :  * @brief Open an image's binary descriptors for reading, from RAM
     396              :  *
     397              :  * @details
     398              :  * Initializes a bindesc handle for subsequent calls to bindesc API.
     399              :  * It's assumed that the whole bindesc context was copied to RAM prior to calling
     400              :  * this function, either by the user or by a bootloader.
     401              :  *
     402              :  * @note The given address must be aligned to @ref BINDESC_ALIGNMENT
     403              :  *
     404              :  * @param[out] handle Bindesc handle to be given to subsequent calls
     405              :  * @param address The address that the bindesc magic can be found at
     406              :  * @param max_size Maximum size of the given buffer
     407              :  *
     408              :  * @retval 0 On success
     409              :  * @retval -ENOENT If no bindesc magic was found at the given address
     410              :  * @retval -EINVAL If the given address is not aligned
     411              :  */
     412            1 : int bindesc_open_ram(struct bindesc_handle *handle, const uint8_t *address, size_t max_size);
     413              : 
     414              : /**
     415              :  * @brief Open an image's binary descriptors for reading, from flash
     416              :  *
     417              :  * @details
     418              :  * Initializes a bindesc handle for subsequent calls to bindesc API.
     419              :  * As opposed to reading bindesc from RAM or memory mapped flash, this
     420              :  * backend requires reading the data from flash to an internal buffer
     421              :  * using the flash API
     422              :  *
     423              :  * @param[out] handle Bindesc handle to be given to subsequent calls
     424              :  * @param offset The offset from the beginning of the flash that the bindesc magic can be found at
     425              :  * @param flash_device Flash device to read descriptors from
     426              :  *
     427              :  * @kconfig_dep{CONFIG_BINDESC_READ_FLASH}
     428              :  *
     429              :  * @retval 0 On success
     430              :  * @retval -ENOENT If no bindesc magic was found at the given offset
     431              :  */
     432            1 : int bindesc_open_flash(struct bindesc_handle *handle, size_t offset,
     433              :                        const struct device *flash_device);
     434              : 
     435              : /**
     436              :  * @brief Walk the binary descriptors and run a user defined callback on each of them
     437              :  *
     438              :  * @note
     439              :  * If the callback returns a non zero value, the walk stops.
     440              :  *
     441              :  * @param handle An initialized bindesc handle
     442              :  * @param callback A user defined callback to be called on each descriptor
     443              :  * @param user_data User defined data to be given to the callback
     444              :  *
     445              :  * @return If the walk was finished prematurely by the callback,
     446              :  *         return the callback's retval, zero otherwise
     447              :  */
     448            1 : int bindesc_foreach(struct bindesc_handle *handle, bindesc_callback_t callback, void *user_data);
     449              : 
     450              : /**
     451              :  * @brief Find a specific descriptor of type string
     452              :  *
     453              :  * @warning
     454              :  * When using the flash backend, result will be invalidated by the next call to any bindesc API.
     455              :  * Use the value immediately or copy it elsewhere.
     456              :  *
     457              :  * @param handle An initialized bindesc handle
     458              :  * @param id ID to search for
     459              :  * @param result Pointer to the found string
     460              :  *
     461              :  * @retval 0 If the descriptor was found
     462              :  * @retval -ENOENT If the descriptor was not found
     463              :  */
     464            1 : int bindesc_find_str(struct bindesc_handle *handle, uint16_t id, const char **result);
     465              : 
     466              : /**
     467              :  * @brief Find a specific descriptor of type uint
     468              :  *
     469              :  * @warning
     470              :  * When using the flash backend, result will be invalidated by the next call to any bindesc API.
     471              :  * Use the value immediately or copy it elsewhere.
     472              :  *
     473              :  * @param handle An initialized bindesc handle
     474              :  * @param id ID to search for
     475              :  * @param result Pointer to the found uint
     476              :  *
     477              :  * @retval 0 If the descriptor was found
     478              :  * @retval -ENOENT If the descriptor was not found
     479              :  */
     480            1 : int bindesc_find_uint(struct bindesc_handle *handle, uint16_t id, const uint32_t **result);
     481              : 
     482              : /**
     483              :  * @brief Find a specific descriptor of type bytes
     484              :  *
     485              :  * @warning
     486              :  * When using the flash backend, result will be invalidated by the next call to any bindesc API.
     487              :  * Use the value immediately or copy it elsewhere.
     488              :  *
     489              :  * @param handle An initialized bindesc handle
     490              :  * @param id ID to search for
     491              :  * @param result Pointer to the found bytes
     492              :  * @param result_size Size of the found bytes
     493              :  *
     494              :  * @retval 0 If the descriptor was found
     495              :  * @retval -ENOENT If the descriptor was not found
     496              :  */
     497            1 : int bindesc_find_bytes(struct bindesc_handle *handle, uint16_t id, const uint8_t **result,
     498              :                        size_t *result_size);
     499              : 
     500              : /**
     501              :  * @brief Get the size of an image's binary descriptors
     502              :  *
     503              :  * @details
     504              :  * Walks the binary descriptor structure to caluculate the total size of the structure
     505              :  * in bytes. This is useful, for instance, if the whole structure is to be copied to RAM.
     506              :  *
     507              :  * @param handle An initialized bindesc handle
     508              :  * @param result Pointer to write result to
     509              :  *
     510              :  * @return 0 On success, negative errno otherwise
     511              :  */
     512            1 : int bindesc_get_size(struct bindesc_handle *handle, size_t *result);
     513              : 
     514              : /**
     515              :  * @}
     516              :  */
     517              : 
     518              : #if defined(CONFIG_BINDESC_KERNEL_VERSION_STRING)
     519              : extern const struct bindesc_entry BINDESC_NAME(kernel_version_string);
     520              : #endif /* defined(CONFIG_BINDESC_KERNEL_VERSION_STRING) */
     521              : 
     522              : #if defined(CONFIG_BINDESC_KERNEL_VERSION_MAJOR)
     523              : extern const struct bindesc_entry BINDESC_NAME(kernel_version_major);
     524              : #endif /* defined(CONFIG_BINDESC_KERNEL_VERSION_MAJOR) */
     525              : 
     526              : #if defined(CONFIG_BINDESC_KERNEL_VERSION_MINOR)
     527              : extern const struct bindesc_entry BINDESC_NAME(kernel_version_minor);
     528              : #endif /* defined(CONFIG_BINDESC_KERNEL_VERSION_MINOR) */
     529              : 
     530              : #if defined(CONFIG_BINDESC_KERNEL_VERSION_PATCHLEVEL)
     531              : extern const struct bindesc_entry BINDESC_NAME(kernel_version_patchlevel);
     532              : #endif /* defined(CONFIG_BINDESC_KERNEL_VERSION_PATCHLEVEL) */
     533              : 
     534              : #if defined(CONFIG_BINDESC_KERNEL_VERSION_NUMBER)
     535              : extern const struct bindesc_entry BINDESC_NAME(kernel_version_number);
     536              : #endif /* defined(CONFIG_BINDESC_KERNEL_VERSION_NUMBER) */
     537              : 
     538              : #if defined(CONFIG_BINDESC_KERNEL_BUILD_VERSION)
     539              : extern const struct bindesc_entry BINDESC_NAME(kernel_build_version);
     540              : #endif /* defined(CONFIG_BINDESC_KERNEL_BUILD_VERSION) */
     541              : 
     542              : #if defined(CONFIG_BINDESC_APP_VERSION_STRING)
     543              : extern const struct bindesc_entry BINDESC_NAME(app_version_string);
     544              : #endif /* defined(CONFIG_BINDESC_APP_VERSION_STRING) */
     545              : 
     546              : #if defined(CONFIG_BINDESC_APP_VERSION_MAJOR)
     547              : extern const struct bindesc_entry BINDESC_NAME(app_version_major);
     548              : #endif /* defined(CONFIG_BINDESC_APP_VERSION_MAJOR) */
     549              : 
     550              : #if defined(CONFIG_BINDESC_APP_VERSION_MINOR)
     551              : extern const struct bindesc_entry BINDESC_NAME(app_version_minor);
     552              : #endif /* defined(CONFIG_BINDESC_APP_VERSION_MINOR) */
     553              : 
     554              : #if defined(CONFIG_BINDESC_APP_VERSION_PATCHLEVEL)
     555              : extern const struct bindesc_entry BINDESC_NAME(app_version_patchlevel);
     556              : #endif /* defined(CONFIG_BINDESC_APP_VERSION_PATCHLEVEL) */
     557              : 
     558              : #if defined(CONFIG_BINDESC_APP_VERSION_NUMBER)
     559              : extern const struct bindesc_entry BINDESC_NAME(app_version_number);
     560              : #endif /* defined(CONFIG_BINDESC_APP_VERSION_NUMBER) */
     561              : 
     562              : #if defined(CONFIG_BINDESC_APP_BUILD_VERSION)
     563              : extern const struct bindesc_entry BINDESC_NAME(app_build_version);
     564              : #endif /* defined(CONFIG_BINDESC_APP_BUILD_VERSION) */
     565              : 
     566              : #if defined(CONFIG_BINDESC_BUILD_TIME_YEAR)
     567              : extern const struct bindesc_entry BINDESC_NAME(build_time_year);
     568              : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_YEAR) */
     569              : 
     570              : #if defined(CONFIG_BINDESC_BUILD_TIME_MONTH)
     571              : extern const struct bindesc_entry BINDESC_NAME(build_time_month);
     572              : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_MONTH) */
     573              : 
     574              : #if defined(CONFIG_BINDESC_BUILD_TIME_DAY)
     575              : extern const struct bindesc_entry BINDESC_NAME(build_time_day);
     576              : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_DAY) */
     577              : 
     578              : #if defined(CONFIG_BINDESC_BUILD_TIME_HOUR)
     579              : extern const struct bindesc_entry BINDESC_NAME(build_time_hour);
     580              : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_HOUR) */
     581              : 
     582              : #if defined(CONFIG_BINDESC_BUILD_TIME_MINUTE)
     583              : extern const struct bindesc_entry BINDESC_NAME(build_time_minute);
     584              : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_MINUTE) */
     585              : 
     586              : #if defined(CONFIG_BINDESC_BUILD_TIME_SECOND)
     587              : extern const struct bindesc_entry BINDESC_NAME(build_time_second);
     588              : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_SECOND) */
     589              : 
     590              : #if defined(CONFIG_BINDESC_BUILD_TIME_UNIX)
     591              : extern const struct bindesc_entry BINDESC_NAME(build_time_unix);
     592              : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_UNIX) */
     593              : 
     594              : #if defined(CONFIG_BINDESC_BUILD_DATE_TIME_STRING)
     595              : extern const struct bindesc_entry BINDESC_NAME(build_date_time_string);
     596              : #endif /* defined(CONFIG_BINDESC_BUILD_DATE_TIME_STRING) */
     597              : 
     598              : #if defined(CONFIG_BINDESC_BUILD_DATE_STRING)
     599              : extern const struct bindesc_entry BINDESC_NAME(build_date_string);
     600              : #endif /* defined(CONFIG_BINDESC_BUILD_DATE_STRING) */
     601              : 
     602              : #if defined(CONFIG_BINDESC_BUILD_TIME_STRING)
     603              : extern const struct bindesc_entry BINDESC_NAME(build_time_string);
     604              : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_STRING) */
     605              : 
     606              : #if defined(CONFIG_BINDESC_HOST_NAME)
     607              : extern const struct bindesc_entry BINDESC_NAME(host_name);
     608              : #endif /* defined(CONFIG_BINDESC_HOST_NAME) */
     609              : 
     610              : #if defined(CONFIG_BINDESC_C_COMPILER_NAME)
     611              : extern const struct bindesc_entry BINDESC_NAME(c_compiler_name);
     612              : #endif /* defined(CONFIG_BINDESC_C_COMPILER_NAME) */
     613              : 
     614              : #if defined(CONFIG_BINDESC_C_COMPILER_VERSION)
     615              : extern const struct bindesc_entry BINDESC_NAME(c_compiler_version);
     616              : #endif /* defined(CONFIG_BINDESC_C_COMPILER_VERSION) */
     617              : 
     618              : #if defined(CONFIG_BINDESC_CXX_COMPILER_NAME)
     619              : extern const struct bindesc_entry BINDESC_NAME(cxx_compiler_name);
     620              : #endif /* defined(CONFIG_BINDESC_CXX_COMPILER_NAME) */
     621              : 
     622              : #if defined(CONFIG_BINDESC_CXX_COMPILER_VERSION)
     623              : extern const struct bindesc_entry BINDESC_NAME(cxx_compiler_version);
     624              : #endif /* defined(CONFIG_BINDESC_CXX_COMPILER_VERSION) */
     625              : 
     626              : #endif /* !defined(_LINKER) */
     627              : 
     628              : #ifdef __cplusplus
     629              : }
     630              : #endif
     631              : 
     632              : /**
     633              :  * @}
     634              :  */
     635              : 
     636              : #endif /* ZEPHYR_INCLUDE_ZEPHYR_BINDESC_H_ */
        

Generated by: LCOV version 2.0-1