Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions soc/raspberrypi/rpi_pico/common/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,16 @@ zephyr_sources(
)

zephyr_sources_ifdef(CONFIG_RPI_PICO_ROM_BOOTLOADER rom_bootloader.c)

zephyr_library_sources_ifdef(CONFIG_RPI_PICO_BINARY_INFO
binary_info.c
binary_info_pins.c
)

zephyr_linker_sources_ifdef(CONFIG_RPI_PICO_BINARY_INFO
ROM_START SORT_KEY 0x0binary_info_header binary_info_header.ld
)

zephyr_linker_sources_ifdef(CONFIG_RPI_PICO_BINARY_INFO
RODATA binary_info.ld
)
4 changes: 4 additions & 0 deletions soc/raspberrypi/rpi_pico/common/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright (c) 2025 TOKITA Hiroshi
# SPDX-License-Identifier: Apache-2.0

source "soc/raspberrypi/rpi_pico/common/Kconfig.*"
177 changes: 177 additions & 0 deletions soc/raspberrypi/rpi_pico/common/Kconfig.binary_info
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
# Copyright (c) 2024 TOKITA Hiroshi
# SPDX-License-Identifier: Apache-2.0

config RPI_PICO_BINARY_INFO
bool "Generate RaspberryPi Pico binary info"
default y
help
Binary info is able to embed machine readable information with the binary in flash.
It can read with picotool(https://github.com/raspberrypi/picotool).
Binary info is generated automatically when this option is enabled,

When this feature is enabled, pinctrl groups are restricted to consisting
of pins with a single rpi_pico function.
In other words, SPI's MISO and MOSI can be in the same group, but I2C's
SDA cannot be included in this group. This is rarely an issue in normal use,
and can be resolved by dividing them into separate groups.

if RPI_PICO_BINARY_INFO

config RPI_PICO_BINARY_INFO_PROGRAM_NAME
bool "Generate program_name in binary info"
default y

if RPI_PICO_BINARY_INFO_PROGRAM_NAME

config RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_NAME
string "Override program_name in binary info"
depends on RPI_PICO_BINARY_INFO_PROGRAM_NAME

config RPI_PICO_BINARY_INFO_PROGRAM_NAME_OVERRIDDEN
bool
default RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_NAME != ""
depends on RPI_PICO_BINARY_INFO_PROGRAM_NAME

endif

config RPI_PICO_BINARY_INFO_PROGRAM_URL
bool "Generate program_url in binary info"
default y

if RPI_PICO_BINARY_INFO_PROGRAM_URL

config RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_URL
string "Override program_url in binary info"
depends on RPI_PICO_BINARY_INFO_PROGRAM_URL

config RPI_PICO_BINARY_INFO_PROGRAM_URL_OVERRIDDEN
bool
default RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_URL != ""
depends on RPI_PICO_BINARY_INFO_PROGRAM_URL

endif

config RPI_PICO_BINARY_INFO_PROGRAM_DESCRIPTION
bool "Generate program_description in binary info"
default y

if RPI_PICO_BINARY_INFO_PROGRAM_DESCRIPTION

config RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_DESCRIPTION
string "Override program_description in binary info"
depends on RPI_PICO_BINARY_INFO_PROGRAM_DESCRIPTION

config RPI_PICO_BINARY_INFO_PROGRAM_DESCRIPTION_OVERRIDDEN
bool
default RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_DESCRIPTION != ""
depends on RPI_PICO_BINARY_INFO_PROGRAM_DESCRIPTION

endif

config RPI_PICO_BINARY_INFO_PROGRAM_BUILD_DATE
bool "Generate program_build_date in binary info"
default y

if RPI_PICO_BINARY_INFO_PROGRAM_BUILD_DATE

config RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_BUILD_DATE
string "Override program_build_date in binary info"
depends on RPI_PICO_BINARY_INFO_PROGRAM_BUILD_DATE

config RPI_PICO_BINARY_INFO_PROGRAM_BUILD_DATE_OVERRIDDEN
bool
default RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_BUILD_DATE != ""
depends on RPI_PICO_BINARY_INFO_PROGRAM_BUILD_DATE

endif

config RPI_PICO_BINARY_INFO_PROGRAM_VERSION_STRING
bool "Generate program_version_string in binary info"
default y

if RPI_PICO_BINARY_INFO_PROGRAM_VERSION_STRING

config RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_VERSION_STRING
string "Override program_version_string in binary info"
depends on RPI_PICO_BINARY_INFO_PROGRAM_VERSION_STRING

config RPI_PICO_BINARY_INFO_PROGRAM_VERSION_STRING_OVERRIDDEN
bool
default RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_VERSION_STRING != ""
depends on RPI_PICO_BINARY_INFO_PROGRAM_VERSION_STRING

endif

config RPI_PICO_BINARY_INFO_SDK_VERSION_STRING
bool "Generate sdk_version_string in binary info"
default y

if RPI_PICO_BINARY_INFO_SDK_VERSION_STRING

config RPI_PICO_BINARY_INFO_OVERRIDE_SDK_VERSION_STRING
string "Override sdk_version_string in binary info"
depends on RPI_PICO_BINARY_INFO_SDK_VERSION_STRING

config RPI_PICO_BINARY_INFO_SDK_VERSION_STRING_OVERRIDDEN
bool
default RPI_PICO_BINARY_INFO_OVERRIDE_SDK_VERSION_STRING != ""
depends on RPI_PICO_BINARY_INFO_SDK_VERSION_STRING

endif

config RPI_PICO_BINARY_INFO_PICO_BOARD
bool "Generate pico_board in binary info"
default y

if RPI_PICO_BINARY_INFO_PICO_BOARD

config RPI_PICO_BINARY_INFO_OVERRIDE_PICO_BOARD
string "Override pico_board in binary info"
depends on RPI_PICO_BINARY_INFO_PICO_BOARD

config RPI_PICO_BINARY_INFO_PICO_BOARD_OVERRIDDEN
bool
default RPI_PICO_BINARY_INFO_OVERRIDE_PICO_BOARD != ""
depends on RPI_PICO_BINARY_INFO_PICO_BOARD

endif

config RPI_PICO_BINARY_INFO_ATTRIBUTE_BUILD_TYPE
bool "Generate attribute_build_type in binary info"
default y

if RPI_PICO_BINARY_INFO_ATTRIBUTE_BUILD_TYPE

config RPI_PICO_BINARY_INFO_OVERRIDE_ATTRIBUTE_BUILD_TYPE
string "Override attribute_build_type in binary info"
depends on RPI_PICO_BINARY_INFO_ATTRIBUTE_BUILD_TYPE

config RPI_PICO_BINARY_INFO_ATTRIBUTE_BUILD_TYPE_OVERRIDDEN
bool
default RPI_PICO_BINARY_INFO_OVERRIDE_ATTRIBUTE_BUILD_TYPE != ""
depends on RPI_PICO_BINARY_INFO_ATTRIBUTE_BUILD_TYPE

endif

config RPI_PICO_BINARY_INFO_BOOT_STAGE2_NAME
bool "Generate boot_stage2_name in binary info"
default y

if RPI_PICO_BINARY_INFO_BOOT_STAGE2_NAME

config RPI_PICO_BINARY_INFO_OVERRIDE_BOOT_STAGE2_NAME
string "Override boot_stage2_name in binary info"
depends on RPI_PICO_BINARY_INFO_BOOT_STAGE2_NAME

config RPI_PICO_BINARY_INFO_BOOT_STAGE2_NAME_OVERRIDDEN
bool
default RPI_PICO_BINARY_INFO_OVERRIDE_BOOT_STAGE2_NAME != ""
depends on RPI_PICO_BINARY_INFO_BOOT_STAGE2_NAME

endif

config RPI_PICO_BINARY_INFO_PIN_CONFIGURATIONS
bool "Generate pin configuration info in binary info"
default y

endif
53 changes: 53 additions & 0 deletions soc/raspberrypi/rpi_pico/common/binary_info.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright (c) 2023 TOKITA Hiroshi <[email protected]>
*
* SPDX-License-Identifier: Apache-2.0
*/

#include "binary_info.h"

extern uint32_t __rom_region_end;
bi_decl(bi_binary_end((intptr_t)&__rom_region_end));

#ifdef CONFIG_RPI_PICO_BINARY_INFO_PROGRAM_NAME
bi_decl(bi_program_name((uint32_t)BI_PROGRAM_NAME));
#endif

#if defined(CONFIG_RPI_PICO_BINARY_INFO_PROGRAM_VERSION_STRING)
bi_decl(bi_program_version_string((uint32_t)BI_PROGRAM_VERSION_STRING));
#endif

#ifdef CONFIG_RPI_PICO_BINARY_INFO_PROGRAM_DESCRIPTION
bi_decl(bi_program_description((uint32_t)BI_PROGRAM_DESCRIPTION));
#endif

#ifdef CONFIG_RPI_PICO_BINARY_INFO_PROGRAM_URL
bi_decl(bi_program_url((uint32_t)BI_PROGRAM_URL));
#endif

#ifdef CONFIG_RPI_PICO_BINARY_INFO_PROGRAM_BUILD_DATE
bi_decl(bi_program_build_date_string((uint32_t)BI_PROGRAM_BUILD_DATE));
#endif

#ifdef CONFIG_RPI_PICO_BINARY_INFO_PICO_BOARD
bi_decl(bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PICO_BOARD,
(uint32_t)BI_PICO_BOARD));
#endif

#ifdef CONFIG_RPI_PICO_BINARY_INFO_SDK_VERSION_STRING
bi_decl(bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_SDK_VERSION,
(uint32_t)BI_SDK_VERSION_STRING));
#endif

#ifdef CONFIG_RPI_PICO_BINARY_INFO_BOOT_STAGE2_NAME
bi_decl(bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_BOOT2_NAME,
(uint32_t)BI_BOOT_STAGE2_NAME));
#endif

#ifdef CONFIG_RPI_PICO_BINARY_INFO_ATTRIBUTE_BUILD_TYPE
#ifdef CONFIG_DEBUG
bi_decl(bi_program_build_attribute((uint32_t)"Debug"));
#else
bi_decl(bi_program_build_attribute((uint32_t)"Release"));
#endif
#endif
130 changes: 130 additions & 0 deletions soc/raspberrypi/rpi_pico/common/binary_info.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
/*
* Copyright (c) 2025 TOKITA Hiroshi <[email protected]>
*
* SPDX-License-Identifier: Apache-2.0
*/

#ifndef ZEPHYR_SOC_RASPBERRYPI_RPI_PICO_COMMON_BINARY_INFO_H_
#define ZEPHYR_SOC_RASPBERRYPI_RPI_PICO_COMMON_BINARY_INFO_H_

#include <zephyr/kernel.h>
#include <zephyr/devicetree.h>
#include <zephyr/sys/util_macro.h>

#include <zephyr/dt-bindings/pinctrl/rpi-pico-pinctrl-common.h>

#include <soc.h>

#include <boot_stage2/config.h>
#include <pico/binary_info.h>

#include <version.h>

#define BI_PROGRAM_NAME CONFIG_RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_NAME
#define BI_PROGRAM_DESCRIPTION CONFIG_RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_DESCRIPTION
#define BI_PROGRAM_URL CONFIG_RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_URL
#define BI_PROGRAM_VERSION_STRING CONFIG_RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_VERSION_STRING

#ifdef CONFIG_RPI_PICO_BINARY_INFO_PICO_BOARD
#define BI_PICO_BOARD CONFIG_RPI_PICO_BINARY_INFO_OVERRIDE_PICO_BOARD
#else
#define BI_PICO_BOARD CONFIG_BOARD
#endif

#ifdef CONFIG_RPI_PICO_BINARY_INFO_SDK_VERSION_STRING_OVERRIDDEN
#define BI_SDK_VERSION_STRING CONFIG_RPI_PICO_BINARY_INFO_OVERRIDE_SDK_VERSION_STRING
#else
#define BI_SDK_VERSION_STRING "zephyr-" STRINGIFY(BUILD_VERSION)
#endif

#ifdef CONFIG_RPI_PICO_BINARY_INFO_PROGRAM_BUILD_DATE_OVERRIDDEN
#define BI_PROGRAM_BUILD_DATE CONFIG_RPI_PICO_BINARY_INFO_OVERRIDE_PROGRAM_BUILD_DATE
#else
#define BI_PROGRAM_BUILD_DATE __DATE__
#endif

#ifdef CONFIG_RPI_PICO_BINARY_INFO_BOOT_STAGE2_NAME
#define BI_BOOT_STAGE2_NAME CONFIG_RPI_PICO_BINARY_INFO_OVERRIDE_BOOT_STAGE2_NAME
#else
#define BI_BOOT_STAGE2_NAME PICO_BOOT_STAGE2_NAME
#endif

/* Utilities for pin encoding calcluation */

#ifdef CONFIG_SOC_RP2040
#define MAX_PIN_ENTRIES 4
#define ENCODE_BASE_IDX 1
#define ENCODE_BYTES 5
#define ENCODE_PADDING 2
#define ENCODE_PINS_WITH_FUNC __bi_encoded_pins_with_func
#else
#define MAX_PIN_ENTRIES 6
#define ENCODE_BASE_IDX 1
#define ENCODE_BYTES 8
#define ENCODE_PADDING 0
#define ENCODE_PINS_WITH_FUNC __bi_encoded_pins_64_with_func
#endif

/* Get group-wide pin functions */

#define PIN_FUNC_OFFSET 3
#define PIN_FUNC(n, _, idx) ((DT_PROP_BY_IDX(n, pinmux, idx)) & RP2_ALT_FUNC_MASK)
#define PIN_GROUP_FUNC(n) (DT_FOREACH_PROP_ELEM_SEP(n, pinmux, PIN_FUNC, (|)))
#define PIN_GROUP_HEADER(n) (BI_PINS_ENCODING_MULTI | (PIN_GROUP_FUNC(n) << PIN_FUNC_OFFSET))

/* Encode the pins in a group */

#define PINMUX_COUNT(n) COND_CODE_1(DT_NODE_HAS_PROP(n, pinmux), (DT_PROP_LEN(n, pinmux)), (0))
#define PIN_NUM(n, idx) (((DT_PROP_BY_IDX(n, pinmux, idx)) >> RP2_PIN_NUM_POS) & RP2_PIN_NUM_MASK)

#define ENCODE_OFFSET(idx) (((idx + ENCODE_BASE_IDX) * ENCODE_BYTES) + ENCODE_PADDING)
#define ENCODE_PIN(n, idx) ((uint64_t)PIN_NUM(n, idx) << ENCODE_OFFSET(idx))
#define ENCODE_TERMINATE(n, i, end) ((((i) + 1) == (end)) ? ENCODE_PIN(n, i + 1) : 0)
#define ENCODE_EACH_PIN(n, p, i, end) \
(DT_PROP_HAS_IDX(n, p, i) ? ENCODE_PIN(n, i) : 0) | ENCODE_TERMINATE(n, i, end)
#define ENCODE_PIN_GROUP(n) \
DT_FOREACH_PROP_ELEM_SEP_VARGS(n, pinmux, ENCODE_EACH_PIN, (|), PINMUX_COUNT(n))

/*
* Macro for checking pin settings
* Checks that a group consists of a single pin-function.
*/

#define PIN_FUNC_IS(n, p, i, func) (PIN_FUNC(n, p, i) == func)
#define ALL_PINS_FUNC_IS_SAME(n) \
(DT_FOREACH_PROP_ELEM_SEP_VARGS(n, pinmux, PIN_FUNC_IS, (&&), PIN_GROUP_FUNC(n)))

/*
* Create binary info for pin-cfg group.
*/

#define DECLARE_PINCFG_GROUP(n) \
BUILD_ASSERT(PINMUX_COUNT(n) > 0, "Group must contain at least one pin"); \
BUILD_ASSERT(PINMUX_COUNT(n) <= MAX_PIN_ENTRIES, "Too many pins in group"); \
BUILD_ASSERT(ALL_PINS_FUNC_IS_SAME(n), "Group pins must share identical function"); \
bi_decl(ENCODE_PINS_WITH_FUNC(PIN_GROUP_HEADER(n) | ENCODE_PIN_GROUP(n)))

/*
* Scan pin-cfg and the groups it contains.
* Each enumerates its child elements, but since the same macro cannot be used within nesting,
* DT_FOREACH_CHILD_VARGS and DT_FOREACH_CHILD_SEP_VARGS are used accordingly.
*/

#define PINMUX_NUM_IF_MATCH_GROUP(node, g_idx) \
COND_CODE_1(IS_EQ(DT_NODE_CHILD_IDX(node), g_idx), (DT_PROP_LEN(node, pinmux)), ())
#define PINMUX_NUM_IF_MATCH_PINCFG(node, pcfg_idx, g_idx) \
COND_CODE_1(IS_EQ(DT_NODE_CHILD_IDX(node), pcfg_idx), \
(DT_FOREACH_CHILD_SEP_VARGS(node, PINMUX_NUM_IF_MATCH_GROUP, (), g_idx)), ())
#define PINMUX_NUM_OF_PINCFG_GROUP(node, pcfg_idx, g_idx) \
DT_FOREACH_CHILD_VARGS(node, PINMUX_NUM_IF_MATCH_PINCFG, pcfg_idx, g_idx)

#define BINARY_INFO_IF_MATCH_GROUP(node, g_idx) \
COND_CODE_1(IS_EQ(DT_NODE_CHILD_IDX(node), g_idx), (DECLARE_PINCFG_GROUP(node)), ())
#define BINARY_INFO_IF_MATCH_PINCFG(node, pcfg_idx, g_idx) \
COND_CODE_1(IS_EQ(DT_NODE_CHILD_IDX(node), pcfg_idx), \
(DT_FOREACH_CHILD_SEP_VARGS(node, BINARY_INFO_IF_MATCH_GROUP, (), g_idx)), ())
#define BINARY_INFO_FROM_PINCFG_GROUP(node, pcfg_idx, g_idx) \
COND_CODE_1(IS_EMPTY(PINMUX_NUM_OF_PINCFG_GROUP(node, pcfg_idx, g_idx)), (), \
(DT_FOREACH_CHILD_VARGS(node, BINARY_INFO_IF_MATCH_PINCFG, pcfg_idx, g_idx)))

#endif /* ZEPHYR_SOC_RASPBERRYPI_RPI_PICO_COMMON_BINARY_INFO_H_ */
11 changes: 11 additions & 0 deletions soc/raspberrypi/rpi_pico/common/binary_info.ld
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/*
* Copyright (c) 2023 TOKITA Hiroshi <[email protected]>
*
* SPDX-License-Identifier: Apache-2.0
*/

. = ALIGN(4);
__binary_info_start = .;
KEEP(*(.binary_info.keep.*))
*(.binary_info.*)
__binary_info_end = .;
Loading
Loading