Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
1512388
[nrf noup] samples: bluetooth: Add support for nRF54lm20a to hci_uart
gordonklaus Aug 4, 2025
8d7b9c9
[nrf fromlist] samples: bluetooth: Add support for nRF54lm20a to two …
gordonklaus Aug 4, 2025
2e2beca
Revert "[nrf noup] mcuboot: Add CONFIG_MCUBOOT_BOOTLOADER_USES_SHA512"
nordic-mik7 Jul 29, 2025
c136755
[nrf fromtree] cmake: mcuboot: SHA512/pure image signing
nordic-mik7 Jul 23, 2025
c1ddd14
[nrf noup] bluetooth: host: Allow auto swap feature without privacy
PavelVPV Jul 31, 2025
6fb16ab
[nrf fromlist] doc: extensions: kconfig: Add support for sysbuild
nordicjm Jul 29, 2025
c09cc2f
[nrf fromtree] manifest: Update nRF hw models to latest
aescolar Jun 27, 2025
2c70598
[nrf fromtree] manifest: Update nRF hw models to latest
aescolar Jul 25, 2025
10fd454
[nrf fromlist] drivers: firmware: remove duplicate function definitions
yuxCai Aug 1, 2025
d6ac46b
[nrf fromlist] drivers: hwinfo: nrf: extend supported reset reasons
mstasiaknordic Jul 30, 2025
49957e5
[nrf fromlist] samples: nordic: system_off: check for supported reset…
mstasiaknordic Jul 31, 2025
d451327
[nrf fromtree] soc: nordic: Extend address validation to cover GPREGRET
kl-cruz Jul 29, 2025
b57c64b
[nrf fromtree] dts: nordic: Fix GPREGRET addresses for nRF54LM20A
kl-cruz Jul 29, 2025
1ed3c0d
[nrf fromtree] Bluetooth: Mesh: Blob Server considers friendship
omkar3141 Jul 18, 2025
bb1a8e3
[nrf fromtree] tests: boards: nrf: qdec: Add testing with multiple QD…
nordic-bami May 21, 2025
64d7302
[nrf fromtree] tests: boards: nrf: qdec: Disable testing of 2nd insta…
nordic-bami Jun 24, 2025
e6948df
[nrf fromlist] tests: boards: nrf: qdec: Fix test for multiple instances
mib1-nordic Jul 31, 2025
8876f35
[nrf noup] samples: bluetooth: mesh: update stack sizes
akredalen Aug 3, 2025
f10e671
[nrf fromtree] soc: nordic: 54h20: bicr: Fix order of enum
carlescufi Jun 17, 2025
64848a4
[nrf fromtree] soc: nordic: 54h20: fix typo ETX -> EXT
hakonfam Jun 26, 2025
05746fd
[nrf fromlist] drivers: adc: nrfx_saadc: Add support for DMM
jaz1-nordic Aug 5, 2025
7728962
Revert "[nrf fromlist] drivers: timer: nrf_grtc_timer: Optimize to re…
nordic-krch Aug 4, 2025
3d90834
Revert "[nrf fromlist] net: l2: wifi: Fix the default keepalive value"
rlubos Aug 5, 2025
c162fe2
Revert "[nrf noup] net: l2: wifi: Configure BSS max idle period"
rlubos Aug 5, 2025
8b3dda7
[nrf fromtree] net: mgmt: Convert the mgmt API to use 64-bit masks
jukkar Apr 24, 2025
664e66c
[nrf fromtree] net: socket: mgmt: Create proper socket options for ne…
jukkar Jun 4, 2025
2b89705
[nrf fromtree] doc: migration: 4.2: Add information about net_mgmt AP…
jukkar May 30, 2025
f5093d3
[nrf fromtree] net: mgmt: Increment API major version number
jukkar Jun 9, 2025
22479b9
[nrf fromtree] net: ppp: stats: Fix net_mgmt request handler format
rlubos Jun 26, 2025
2cf4a21
[nrf fromtree] net: events: Add missing net_mgmt.h include
rlubos Jun 26, 2025
9c45c98
[nrf fromtree] net: l2: wifi: Configure BSS max idle period
ajayparida Jun 3, 2024
8277731
[nrf fromtree] net: l2: wifi: Fix the default keepalive value
krish2718 Jul 31, 2025
39a9627
[nrf fromlist] drivers: nrf_wifi: Add check for minimum RX buffer size
kapbh Aug 5, 2025
2c900ff
[nrf fromtree] Bluetooth: Host: Update LE legacy pairing check
HaavardRei Jun 5, 2025
8720fcc
[nrf fromtree] Bluetooth: Host: Fix SMP Pairing failed code on invali…
sjanc Jun 11, 2025
57d8ace
[nrf fromtree] bluetooth: host: gatt: fix null-ptr access if no inclu…
nirav-agrawal Jun 13, 2025
01ec0ff
[nrf fromtree] Bluetooth: Host: l2cap: Fix MPS/MTU confusion
HaavardRei Jul 15, 2025
b07b1bb
[nrf fromtree] Bluetooth: Host: Add l2cap credit param checks
HaavardRei Jul 22, 2025
4c976e3
[nrf fromtree] Bluetooth: Host: Add conn rsp param check
HaavardRei Jul 16, 2025
7de4733
[nrf fromtree] Bluetooth: Host: Use MTU min for l2cap test
HaavardRei Jul 22, 2025
7d913ca
[nrf fromlist] soc: nordic: uicr: Populate UICR.VERSION field in gen_…
jonathannilsen Aug 4, 2025
b1ea2f9
[nrf noup] ci: enable custom brase for manifest-PR
DatGizmo Aug 6, 2025
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
3 changes: 2 additions & 1 deletion .github/workflows/manifest-PR.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ on:
pull_request_target:
types: [opened, synchronize, closed]
branches:
- main
- ncs-v3.1-branch


jobs:
Expand All @@ -15,3 +15,4 @@ jobs:
with:
token: ${{ secrets.NCS_GITHUB_TOKEN }}
manifest-pr-title-details: ${{ github.event.pull_request.title }}
base-branch: v3.1-branch
7 changes: 7 additions & 0 deletions cmake/mcuboot.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,13 @@ function(zephyr_mcuboot_tasks)
set(imgtool_args --align ${write_block_size} ${imgtool_args})
endif()

# Set proper hash calculation algorithm for signing
if(CONFIG_MCUBOOT_BOOTLOADER_SIGNATURE_TYPE_PURE)
set(imgtool_args --pure ${imgtool_args})
elseif(CONFIG_MCUBOOT_BOOTLOADER_USES_SHA512)
set(imgtool_args --sha 512 ${imgtool_args})
endif()

# Extensionless prefix of any output file.
set(output ${ZEPHYR_BINARY_DIR}/${KERNEL_NAME})

Expand Down
276 changes: 146 additions & 130 deletions doc/_extensions/zephyr/kconfig/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,19 +70,24 @@
ZEPHYR_BASE = Path(__file__).parents[4]


def kconfig_load(app: Sphinx) -> tuple[kconfiglib.Kconfig, dict[str, str]]:
def kconfig_load(app: Sphinx) -> tuple[kconfiglib.Kconfig, kconfiglib.Kconfig, dict[str, str]]:
"""Load Kconfig"""
with TemporaryDirectory() as td:
modules = zephyr_module.parse_modules(ZEPHYR_BASE)

# generate Kconfig.modules file
kconfig = ""
sysbuild_kconfig = ""
for module in modules:
kconfig += zephyr_module.process_kconfig(module.project, module.meta)
sysbuild_kconfig += zephyr_module.process_sysbuildkconfig(module.project, module.meta)

with open(Path(td) / "Kconfig.modules", "w") as f:
f.write(kconfig)

with open(Path(td) / "Kconfig.sysbuild.modules", "w") as f:
f.write(sysbuild_kconfig)

# generate dummy Kconfig.dts file
kconfig = ""

Expand Down Expand Up @@ -145,6 +150,13 @@ def kconfig_load(app: Sphinx) -> tuple[kconfiglib.Kconfig, dict[str, str]]:
os.environ["BOARD"] = "boards"
os.environ["KCONFIG_BOARD_DIR"] = str(Path(td) / "boards")

# Sysbuild runs first
os.environ["CONFIG_"] = "SB_CONFIG_"
sysbuild_output = kconfiglib.Kconfig(ZEPHYR_BASE / "share" / "sysbuild" / "Kconfig")

# Normal Kconfig runs second
os.environ["CONFIG_"] = "CONFIG_"

# insert external Kconfigs to the environment
module_paths = dict()
for module in modules:
Expand Down Expand Up @@ -172,7 +184,7 @@ def kconfig_load(app: Sphinx) -> tuple[kconfiglib.Kconfig, dict[str, str]]:
if kconfig.exists():
os.environ[f"ZEPHYR_{name_var}_KCONFIG"] = str(kconfig)

return kconfiglib.Kconfig(ZEPHYR_BASE / "Kconfig"), module_paths
return kconfiglib.Kconfig(ZEPHYR_BASE / "Kconfig"), sysbuild_output, module_paths


class KconfigSearchNode(nodes.Element):
Expand Down Expand Up @@ -332,13 +344,15 @@ def add_option(self, option):


def sc_fmt(sc):
prefix = os.environ["CONFIG_"]

if isinstance(sc, kconfiglib.Symbol):
if sc.nodes:
return f'<a href="#CONFIG_{sc.name}">CONFIG_{sc.name}</a>'
return f'<a href="#{prefix}{sc.name}">{prefix}{sc.name}</a>'
elif isinstance(sc, kconfiglib.Choice):
if not sc.name:
return "&ltchoice&gt"
return f'&ltchoice <a href="#CONFIG_{sc.name}">CONFIG_{sc.name}</a>&gt'
return f'&ltchoice <a href="#{prefix}{sc.name}">{prefix}{sc.name}</a>&gt'

return kconfiglib.standard_sc_expr_str(sc)

Expand All @@ -350,137 +364,139 @@ def kconfig_build_resources(app: Sphinx) -> None:
return

with progress_message("Building Kconfig database..."):
kconfig, module_paths = kconfig_load(app)
kconfig, sysbuild_kconfig, module_paths = kconfig_load(app)
db = list()

for sc in sorted(
chain(kconfig.unique_defined_syms, kconfig.unique_choices),
key=lambda sc: sc.name if sc.name else "",
):
# skip nameless symbols
if not sc.name:
continue

# store alternative defaults (from defconfig files)
alt_defaults = list()
for node in sc.nodes:
if "defconfig" not in node.filename:
for kconfig_obj in [kconfig, sysbuild_kconfig]:
os.environ["CONFIG_"] = kconfig_obj.config_prefix
for sc in sorted(
chain(kconfig_obj.unique_defined_syms, kconfig_obj.unique_choices),
key=lambda sc: sc.name if sc.name else "",
):
# skip nameless symbols
if not sc.name:
continue

for value, cond in node.orig_defaults:
fmt = kconfiglib.expr_str(value, sc_fmt)
if cond is not sc.kconfig.y:
fmt += f" if {kconfiglib.expr_str(cond, sc_fmt)}"
alt_defaults.append([fmt, node.filename])

# build list of symbols that select/imply the current one
# note: all reverse dependencies are ORed together, and conditionals
# (e.g. select/imply A if B) turns into A && B. So we first split
# by OR to include all entries, and we split each one by AND to just
# take the first entry.
selected_by = list()
if isinstance(sc, kconfiglib.Symbol) and sc.rev_dep != sc.kconfig.n:
for select in kconfiglib.split_expr(sc.rev_dep, kconfiglib.OR):
sym = kconfiglib.split_expr(select, kconfiglib.AND)[0]
selected_by.append(f"CONFIG_{sym.name}")

implied_by = list()
if isinstance(sc, kconfiglib.Symbol) and sc.weak_rev_dep != sc.kconfig.n:
for select in kconfiglib.split_expr(sc.weak_rev_dep, kconfiglib.OR):
sym = kconfiglib.split_expr(select, kconfiglib.AND)[0]
implied_by.append(f"CONFIG_{sym.name}")

# only process nodes with prompt or help
nodes = [node for node in sc.nodes if node.prompt or node.help]

inserted_paths = list()
for node in nodes:
# avoid duplicate symbols by forcing unique paths. this can
# happen due to dependencies on 0, a trick used by some modules
path = f"{node.filename}:{node.linenr}"
if path in inserted_paths:
continue
inserted_paths.append(path)

dependencies = None
if node.dep is not sc.kconfig.y:
dependencies = kconfiglib.expr_str(node.dep, sc_fmt)

defaults = list()
for value, cond in node.orig_defaults:
fmt = kconfiglib.expr_str(value, sc_fmt)
if cond is not sc.kconfig.y:
fmt += f" if {kconfiglib.expr_str(cond, sc_fmt)}"
defaults.append(fmt)

selects = list()
for value, cond in node.orig_selects:
fmt = kconfiglib.expr_str(value, sc_fmt)
if cond is not sc.kconfig.y:
fmt += f" if {kconfiglib.expr_str(cond, sc_fmt)}"
selects.append(fmt)

implies = list()
for value, cond in node.orig_implies:
fmt = kconfiglib.expr_str(value, sc_fmt)
if cond is not sc.kconfig.y:
fmt += f" if {kconfiglib.expr_str(cond, sc_fmt)}"
implies.append(fmt)

ranges = list()
for min, max, cond in node.orig_ranges:
fmt = (
f"[{kconfiglib.expr_str(min, sc_fmt)}, "
f"{kconfiglib.expr_str(max, sc_fmt)}]"
# store alternative defaults (from defconfig files)
alt_defaults = list()
for node in sc.nodes:
if "defconfig" not in str(node.filename):
continue

for value, cond in node.orig_defaults:
fmt = kconfiglib.expr_str(value, sc_fmt)
if cond is not sc.kconfig.y:
fmt += f" if {kconfiglib.expr_str(cond, sc_fmt)}"
alt_defaults.append([fmt, node.filename])

# build list of symbols that select/imply the current one
# note: all reverse dependencies are ORed together, and conditionals
# (e.g. select/imply A if B) turns into A && B. So we first split
# by OR to include all entries, and we split each one by AND to just
# take the first entry.
selected_by = list()
if isinstance(sc, kconfiglib.Symbol) and sc.rev_dep != sc.kconfig.n:
for select in kconfiglib.split_expr(sc.rev_dep, kconfiglib.OR):
sym = kconfiglib.split_expr(select, kconfiglib.AND)[0]
selected_by.append(f"{kconfig_obj.config_prefix}{sym.name}")

implied_by = list()
if isinstance(sc, kconfiglib.Symbol) and sc.weak_rev_dep != sc.kconfig.n:
for select in kconfiglib.split_expr(sc.weak_rev_dep, kconfiglib.OR):
sym = kconfiglib.split_expr(select, kconfiglib.AND)[0]
implied_by.append(f"{kconfig_obj.config_prefix}{sym.name}")

# only process nodes with prompt or help
nodes = [node for node in sc.nodes if node.prompt or node.help]

inserted_paths = list()
for node in nodes:
# avoid duplicate symbols by forcing unique paths. this can
# happen due to dependencies on 0, a trick used by some modules
path = f"{node.filename}:{node.linenr}"
if path in inserted_paths:
continue
inserted_paths.append(path)

dependencies = None
if node.dep is not sc.kconfig.y:
dependencies = kconfiglib.expr_str(node.dep, sc_fmt)

defaults = list()
for value, cond in node.orig_defaults:
fmt = kconfiglib.expr_str(value, sc_fmt)
if cond is not sc.kconfig.y:
fmt += f" if {kconfiglib.expr_str(cond, sc_fmt)}"
defaults.append(fmt)

selects = list()
for value, cond in node.orig_selects:
fmt = kconfiglib.expr_str(value, sc_fmt)
if cond is not sc.kconfig.y:
fmt += f" if {kconfiglib.expr_str(cond, sc_fmt)}"
selects.append(fmt)

implies = list()
for value, cond in node.orig_implies:
fmt = kconfiglib.expr_str(value, sc_fmt)
if cond is not sc.kconfig.y:
fmt += f" if {kconfiglib.expr_str(cond, sc_fmt)}"
implies.append(fmt)

ranges = list()
for min, max, cond in node.orig_ranges:
fmt = (
f"[{kconfiglib.expr_str(min, sc_fmt)}, "
f"{kconfiglib.expr_str(max, sc_fmt)}]"
)
if cond is not sc.kconfig.y:
fmt += f" if {kconfiglib.expr_str(cond, sc_fmt)}"
ranges.append(fmt)

choices = list()
if isinstance(sc, kconfiglib.Choice):
for sym in sc.syms:
choices.append(kconfiglib.expr_str(sym, sc_fmt))

menupath = ""
iternode = node
while iternode.parent is not iternode.kconfig.top_node:
iternode = iternode.parent
if iternode.prompt:
title = iternode.prompt[0]
else:
title = kconfiglib.standard_sc_expr_str(iternode.item)
menupath = f" > {title}" + menupath

menupath = "(Top)" + menupath

filename = str(node.filename)
for name, path in module_paths.items():
path += "/"
if str(node.filename).startswith(path):
filename = str(node.filename).replace(path, f"<module:{name}>/")
break

db.append(
{
"name": f"{kconfig_obj.config_prefix}{sc.name}",
"prompt": node.prompt[0] if node.prompt else None,
"type": kconfiglib.TYPE_TO_STR[sc.type],
"help": node.help,
"dependencies": dependencies,
"defaults": defaults,
"alt_defaults": alt_defaults,
"selects": selects,
"selected_by": selected_by,
"implies": implies,
"implied_by": implied_by,
"ranges": ranges,
"choices": choices,
"filename": filename,
"linenr": node.linenr,
"menupath": menupath,
}
)
if cond is not sc.kconfig.y:
fmt += f" if {kconfiglib.expr_str(cond, sc_fmt)}"
ranges.append(fmt)

choices = list()
if isinstance(sc, kconfiglib.Choice):
for sym in sc.syms:
choices.append(kconfiglib.expr_str(sym, sc_fmt))

menupath = ""
iternode = node
while iternode.parent is not iternode.kconfig.top_node:
iternode = iternode.parent
if iternode.prompt:
title = iternode.prompt[0]
else:
title = kconfiglib.standard_sc_expr_str(iternode.item)
menupath = f" > {title}" + menupath

menupath = "(Top)" + menupath

filename = node.filename
for name, path in module_paths.items():
path += "/"
if node.filename.startswith(path):
filename = node.filename.replace(path, f"<module:{name}>/")
break

db.append(
{
"name": f"CONFIG_{sc.name}",
"prompt": node.prompt[0] if node.prompt else None,
"type": kconfiglib.TYPE_TO_STR[sc.type],
"help": node.help,
"dependencies": dependencies,
"defaults": defaults,
"alt_defaults": alt_defaults,
"selects": selects,
"selected_by": selected_by,
"implies": implies,
"implied_by": implied_by,
"ranges": ranges,
"choices": choices,
"filename": filename,
"linenr": node.linenr,
"menupath": menupath,
}
)

app.env.kconfig_db = db # type: ignore

Expand Down
2 changes: 1 addition & 1 deletion doc/connectivity/networking/api/coap_server.rst
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ following example simply prints when an event occurs.
#define COAP_EVENTS_SET (NET_EVENT_COAP_OBSERVER_ADDED | NET_EVENT_COAP_OBSERVER_REMOVED | \
NET_EVENT_COAP_SERVICE_STARTED | NET_EVENT_COAP_SERVICE_STOPPED)

void coap_event_handler(uint32_t mgmt_event, struct net_if *iface,
void coap_event_handler(uint64_t mgmt_event, struct net_if *iface,
void *info, size_t info_length, void *user_data)
{
switch (mgmt_event) {
Expand Down
6 changes: 3 additions & 3 deletions doc/connectivity/networking/api/net_mgmt.rst
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ An example follows.
struct net_mgmt_event_callback ipv4_callback;

void callback_handler(struct net_mgmt_event_callback *cb,
uint32_t mgmt_event,
uint64_t mgmt_event,
struct net_if *iface)
{
if (mgmt_event == NET_EVENT_IF_xxx) {
Expand Down Expand Up @@ -139,7 +139,7 @@ Or similarly using :c:macro:`NET_MGMT_REGISTER_EVENT_HANDLER`.
#define EVENT_IFACE_SET (NET_EVENT_IF_xxx | NET_EVENT_IF_yyy)
#define EVENT_IPV4_SET (NET_EVENT_IPV4_xxx | NET_EVENT_IPV4_yyy)

static void event_handler(uint32_t mgmt_event, struct net_if *iface,
static void event_handler(uint64_t mgmt_event, struct net_if *iface,
void *info, size_t info_length,
void *user_data)
{
Expand Down Expand Up @@ -183,7 +183,7 @@ You define your handler modeled with this signature:

.. code-block:: c

static int your_handler(uint32_t mgmt_event, struct net_if *iface,
static int your_handler(uint64_t mgmt_event, struct net_if *iface,
void *data, size_t len);

and then register it with an associated mgmt_request code:
Expand Down
Loading
Loading