Compare commits

...

43 Commits

Author SHA1 Message Date
Robert Lubos
031155b611 samples: net: mdns_responder: Verify accept() result in echo server
The mdns_responder sample has a simple TCP echo server running, however
the accept() function errors were ignored, making the server defunct in
case server socket started to report errors (for example when network
went down).

Update the sample to restart the echo server in case of accept() errors
to make the sample more reliable.

Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
(cherry picked from commit 735f16f12f)
2026-01-13 12:36:12 +00:00
Robert Lubos
c4ec030254 net: sockets: Report an unrelying errors from accept()
If the underlying listening TCP context reported an error, it's no
longer usable, therefore accept() call for such a socket should report
an error as well, otherwise it may block indefinitely.

Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
(cherry picked from commit 1a2d9f7b8f)
2026-01-13 12:36:12 +00:00
Robert Lubos
2509a8c393 net: tcp: Make sure TCP context is dereferenced only once on network down
In case network interface goes down, all underlying TCP contexts are
being dereferenced, however they are not released until application
dereferences them as well (i.e. closed the socket). If the application
does not do so however timely, and network interface goes down again,
the TCP context would still be present on the active contexts list and
could've been dereferenced for the second time.

Fix this by checking the context state before dereferencing it on the
stack behalf. Non-listening TCP context are being set to CLOSED state
upon dereferencing.  For the listening contexts, the TCP context has
only one ref from the application side, so use the `accept_cb` pointer
value as an indicator that the accept callback, indicating an error,
has already been called for the context.

Additionally, add a mutex lock when releasing listening context on
network down even, to avoid potential races with yet unprocessed
incoming packets.

Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
(cherry picked from commit 913fae5169)
2026-01-13 12:36:12 +00:00
Joel Schaller
59e779d9ed shell: backend: telnet: No Error ENETDOWN
Set Log Level to Info when the Telnet socket reports ENETDOWN,
instead of logging an error each time the network is down.

Signed-off-by: Joel Schaller <joel.schaller16@gmail.com>
(cherry picked from commit 8f6b216ec0)
2026-01-12 12:50:23 -05:00
Sven Ginka
fd649f17f0 drivers: ethernet: dsa_nxp_imx_netc: fix zephyr random mac
zephyr,random-mac-address defaults to 0 or 1, which is always
available in generated code. so we can use the value itself.

Signed-off-by: Sven Ginka <s.ginka@sensry.de>
(cherry picked from commit c4a4d8aa87)
2026-01-12 12:48:16 -05:00
Missael Maciel
e0a24d3471 drivers: uart: save interrupts in PM Action
Removed usart_intenset attribute from conditional compilation
in mcux_flexcomm_data structure since this parameter needs to
be saved/restored independently if the interrupts are enabled
or not based on the PR feedback

Signed-off-by: Missael Maciel <davidmissael.maciel@nxp.com>
(cherry picked from commit 726e7b64c2)
2026-01-12 14:39:08 +02:00
Missael Maciel
1ff7fbbaa2 drivers: uart: save interrupts in PM Action
The PM action saves the interrupts enabled using a
global variable called usart_intenset. The problem is
when you have multiple uart instances that have different
configurations, when entering/exiting from a power level,
only one configuration is saved and will be applied to all
uart instances when exiting from a power level. We need to
keep this setting individual for each instance. To do this,
usart_intenset was added as a new element to mcux_flexcomm_data
structure. In this way, each uart instance will keep/restore
each own setting.

Signed-off-by: Missael Maciel <davidmissael.maciel@nxp.com>
(cherry picked from commit a84e0b5413)
2026-01-12 14:39:08 +02:00
Pieter De Gendt
ee992eb6a8 scripts: west: packages: Print warning on windows or run new command
On non-Windows systems execute a new program, replacing the west packages
call, when trying to install packages using pip.
For Windows, update the documented way of installing python packages,
or using 'west packages pip --install' print a warning.

Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
(cherry picked from commit 7f97d3dd0a)
2026-01-12 14:35:56 +02:00
Tomasz Chyrowicz
ef1b2dfd56 mcumgr: Prevent FW loader from self-destruction
The FW loader reports and manages exactly two slots:
 - slot 0: this is the slot for the application code to update
 - slot 1: this is the slot, in which the FW loader is placed

The slot 1 is reported, so tools can fetch metadata about the
FW loader installed on the device.
Unfortunately, currently SMP-based FW loader allows to issue slot erase
command for the slot 1, effectively erasing the FW loader code that is
being executed.

This change correctly identifies the slot 1 as an active one, marking it
as used and blocking erase operation on that slot.

Signed-off-by: Tomasz Chyrowicz <tomasz.chyrowicz@nordicsemi.no>
(cherry picked from commit 26128ab73d)
2026-01-12 14:35:44 +02:00
Alberto Escolar Piedras
cde22a3191 drivers: xen: Fix uninitialized variable warning
gcc complains about the posibility of ret and gfn being used
unitialiazed (with the input npages == 0).
Let's fix it by initializing ret to 0.

The warnings being:
```
      zephyr/CMakeFiles/zephyr.dir/drivers/xen/gnttab.c.obj
In file included from include/zephyr/logging/log.h:11,
                 from drivers/xen/gnttab.c:31:
include/zephyr/logging/log_core.h: In function 'gnttab_get_pages':
include/zephyr/logging/log_core.h:221:9: warning: 'gfn' may be used
uninitialized [-Wmaybe-uninitialized]
  221 |         z_log_minimal_printk("%c: " fmt "\n", \
      |         ^~~~~~~~~~~~~~~~~~~~
drivers/xen/gnttab.c:202:19: note: 'gfn' was declared here
  202 |         xen_pfn_t gfn;
      |                   ^~~
include/zephyr/logging/log_core.h:221:9: warning: 'ret' may be used
uninitialized [-Wmaybe-uninitialized]
  221 |         z_log_minimal_printk("%c: " fmt "\n", \
      |         ^~~~~~~~~~~~~~~~~~~~
drivers/xen/gnttab.c:199:13: note: 'ret' was declared here
  199 |         int ret;
      |             ^~~
```

Signed-off-by: Alberto Escolar Piedras <alberto.escolar.piedras@nordicsemi.no>
(cherry picked from commit 139b7c20c2)
2026-01-12 14:35:33 +02:00
Martin Stumpf
6173a3cb3e MCUmgr: OS: fix set datetime millisecond handling
According to the docs the millis were in the format `.SSSSSS`. In
reality though, it only accepted exactly `.SSS`, not `.SS` or `.SSSS`
and specifically also not `.SSSSSS`, contrary to the docs. Further, it did
not fail with an error message but simply produced the wrong value.

With this change it accepts everything from `.` to `.SSSSSS` and
produces the correct result. This is compatible with the previous
behavior, with the documentation and with everything in between.

Signed-off-by: Martin Stumpf <finomnis@gmail.com>
(cherry picked from commit ffb046b797)
2026-01-12 14:35:12 +02:00
Yong Cong Sin
cffdb1d8cf driver: i2c: i2c_dw: clear block mode on init
Depending on the IP's `IC_TX_CMD_BLOCK_DEFAULT` parameter, we
might have to clear the `TX_CMD_BLOCK` bit on init so that
Controller mode works.

Signed-off-by: Yong Cong Sin <ycsin@meta.com>
Signed-off-by: Yong Cong Sin <yongcong.sin@gmail.com>
(cherry picked from commit a028d8fafc)
2025-12-12 16:31:15 +02:00
Furkan Akkiz
260d76b698 manifest: Update hal_adi revision
Update hal_adi revision to get HAL fix commits. One of the fix commits
addresses an issue where the MAX32650 system clock frequency value was
not set correctly, which could lead to improper operation of
time-dependent functions.

Signed-off-by: Furkan Akkiz <hasanfurkan.akkiz@analog.com>
(cherry picked from commit 2385641f12)
2025-12-12 16:31:05 +02:00
Derek Snell
7b0ad6bd9d boards: nxp: mimxrt1180_evk: fix directory for Jlink script
Fixes path to the script file so the script is used with "west debug".

Signed-off-by: Derek Snell <derek.snell@nxp.com>
(cherry picked from commit 6044d455e4)
2025-12-12 16:30:54 +02:00
Fabian Blatz
fd6cfbd96b modules: lvgl: Prevent false pointer input events
Fixes an issue where input events which have the sync flag set but are
neither X/Y coordiante updates nor press/release updates triggers a false
reporting of input to LVGL.

Signed-off-by: Fabian Blatz <fabianblatz@gmail.com>
(cherry picked from commit 25d96b2589)
2025-12-03 16:34:15 +02:00
Martin Hoff
3ab62f13b8 soc: silabs: siwx91x: introduce zero latency irq
The HAL used by the SiWx91x SoC implements a mechanism to protect
atomic sections. Since this HAL also supports a zero-latency
interrupt (ZLI) mechanism, we need to ensure the same number of
bits are used for ZLI interrupts.
The interrupt priority level (2) depends on a hardcoded value in the
Simplicity SDK (CORE_ATOMIC_BASE_PRIORITY_LEVEL).
Without this fix, arch_irq_lock (which sets the BASEPRI register to
0x4 when zero-latency interrupts are not enabled) is overridden by
CORE_EnterAtomic in the HAL, which sets BASEPRI to 0xC since the HAL
does not use the BASEPRI_MAX function. IRQ might then fires since it's
register with a lowest priority in Zephyr.

Signed-off-by: Martin Hoff <martin.hoff@silabs.com>
(cherry picked from commit 87ab3e337a)
2025-12-03 16:33:58 +02:00
Cristian Bulacu
f46be4550e net: l2: openthread: border_router: Delete multicast route by iface
This commit makes use of #98464 and deletes a multicast route by
specified interface.

Signed-off-by: Cristian Bulacu <cristian.bulacu@nxp.com>
(cherry picked from commit 4520215968)
2025-12-03 16:33:48 +02:00
Declan Snyder
c2665034a3 tests: spi_loopback: Fix race condition with CS testing
There is a race condition in this method of CS behavior verification,
where multiple CS signal transitions can happen during one interrupt
processing, thereby only getting one callback and marking the trigger
count as being less than what is accurate. At least we can account for
most real situations where this happens by also looking at the CS pin
logic level and comparing to how it started, to potentially realize that
there was another edge that happened when it either should or shouldn't
have happened.

Signed-off-by: Declan Snyder <declan.snyder@nxp.com>
(cherry picked from commit 6c2410cb90)
2025-12-03 16:33:21 +02:00
Declan Snyder
ffcda664c7 drivers: flexcomm spi: Fix 0 length xfer in dma path
If rx and tx length are both 0 in dma path then do nothing.

Signed-off-by: Declan Snyder <declan.snyder@nxp.com>
(cherry picked from commit 2f51f06d6f)
2025-12-03 16:33:21 +02:00
Aksel Skauge Mellbye
e959c4fc93 drivers: entropy: gecko_trng: Fix blocking behavior
entropy_get_entropy() is allowed to block while waiting for
entropy. Don't exit with an error if entropy is exhausted,
wait instead. Move clock enable out of the inner loop to avoid
unnecessarily calling it multiple times.

Signed-off-by: Aksel Skauge Mellbye <aksel.mellbye@silabs.com>
(cherry picked from commit ad867a1264)
2025-12-03 11:14:32 +02:00
Martin Hoff
357d7c91c0 soc: silabs: siwg917: add dependency when PM device is enabled
This patch fixes a compilation error when CONFIG_PM_DEVICE is enabled
without CONFIG_PM_DEVICE_RUNTIME and CONFIG_POWER_DOMAIN.

Signed-off-by: Martin Hoff <martin.hoff@silabs.com>
(cherry picked from commit 94ed533c31)
2025-12-03 11:14:24 +02:00
Erwan Gouriou
6ce17559f9 drivers: interrupt_controller: stm32: Fix discontinuous index in n6/mp1x
Similarly to what was present on L0, GPIO port indexes are not continuous
in EXTI configuration register and a dedicated treatment is required.
Deal with it case by case.

Signed-off-by: Erwan Gouriou <erwan.gouriou@st.com>
(cherry picked from commit 6b6018e969)
2025-12-03 11:02:51 +02:00
Dmitrii Sharshakov
4e0b47a85e soc: raspberrypi: rp2350: imply XIP
Imply XIP from the SoC config to make XIP the default to match the
behaviour between Cortex-M33 and Hazard3 variants.

This fixes cbe6a716d3, which stopped
selecting XIP at the SoC level.

Signed-off-by: Dmitrii Sharshakov <d3dx12.xx@gmail.com>
(cherry picked from commit e3ef835ffe)
2025-12-03 11:02:37 +02:00
Sudan Landge
1b1df572f7 arch: arm: fix start of the privileged stack
Make sure that arch.mode is set with appropriate flags before setting up
the privileged stack start.

Fixes #99895

Signed-off-by: Sudan Landge <sudan.landge@arm.com>
(cherry picked from commit 9962bc12cf)
2025-12-03 11:02:22 +02:00
Vinayak Kariappa Chettimada
cf8801709e Bluetooth: Controller: nRF54Lx: Fix Radio Tx Power set
Fix incorrectly high Radio Tx Power being set as default.

Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
(cherry picked from commit 2ab41387a4)
2025-12-03 11:02:09 +02:00
Jamie McCrae
ab0251d2ca mgmt: mcumgr: grp: img_mgmt: Fix detecting where a slot resides
Fixes an issue introduced in commit
32615695ad which wrongly did not
check what the residing device was on before determining if a
slot was part of a partition area

Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
(cherry picked from commit ae2b4a44dc)
2025-12-03 11:01:46 +02:00
Aleksandar Stanoev
baf69fca19 bluetooth: host: Fix bt_conn reference leak in Frame Space Update
Fix a missing unref of a bt_conn reference, leading to a ref count
mismatch, and causing the following warning to be printed:
bt_conn: Found valid connection ... in disconnected state.

Signed-off-by: Aleksandar Stanoev <aleksandar.stanoev@nordicsemi.no>
(cherry picked from commit 1eea6adad2)
2025-12-03 11:01:35 +02:00
Robert Lubos
7b82586e8c tests: net: dns_resolve: Add tests for dns_unpack_name()
Verify that dns_unpack_name() generates a valid DNS name when unpacking
records and that it returns an error in case of overflow.

Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
(cherry picked from commit 7a9ca8e410)
2025-12-03 11:01:18 +02:00
Robert Lubos
769aa4de58 net: dns: Fix potential buffer overflow when unpacking labels
As the loop unpacking the DNS name from records checks the current
label length on each iteration, it's also needed to update the remaining
buffer length on each iteration, otherwise the buffer length checks
doesn't work as expected.

Additionally, the remaining buffer checks while technically worked, they
were conceptually wrong and unintuitive. The buf->data pointer doesn't
move, so comparing against this pointer when adding new labels doesn't
make sense. It's more intuitive to simply compare the label size vs
the remaining buffer space.

Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
(cherry picked from commit 7bd45cd39b)
2025-12-03 11:01:18 +02:00
Cristian Bulacu
fcc1b73a66 openthread: platform: udp: init udp fds before external net connection
When OpenThread iface is brought up `ot ifconfig up` there are several
modules that will attempt to open a platform socket and perform bind
and bind to netif operation.
Since now, `sockfd_upd` structure was initialized after the backbone
interface announced connectivity, but this implies that OpenThread
interface will always be brought up only after this event, which is not
true, or imposed.

Signed-off-by: Cristian Bulacu <cristian.bulacu@nxp.com>
(cherry picked from commit 5b8b5df90e)
2025-12-03 11:00:57 +02:00
Martin Stumpf
fca2826e06 drivers: current_sense_amplifier: fix zero-current-voltage binding
It seems the new microvolt/microamp rework (#95588) simply forgot to
implement zero current voltage offsets.

Signed-off-by: Martin Stumpf <finomnis@gmail.com>
(cherry picked from commit 0c9d8b7a8e)
2025-12-03 11:00:19 +02:00
Chris Friedt
309a7de5bc arch: riscv + xtensa + x86: workaround needed for LLVM linker
Due to slight differences in the way that LLVM and GNU linkers work,
the call to `z_stack_space_get()` is not dead-stripped when linking
with `lld` but it is dead-stripped when linking with GNU `ld`.

The `z_stack_space_get()` function is only available when
`CONFIG_INIT_STACKS` and `CONFIG_THREAD_STACK_INFO` are defined.

The issue is reproducible (although requires building LLVM and
setting up some environment variables) and goes away with the proposed
workaround.

Signed-off-by: Robin Kastberg <robin.kastberg@iar.com>
Signed-off-by: Chris Friedt <cfriedt@tenstorrent.com>
(cherry picked from commit 27180d2fc5)
2025-12-03 10:59:52 +02:00
Jamie McCrae
a65d0578da drivers: i2c: i2c_nrfx_twi: Fix not guarding deinit function
Fixes an issue with an unused function being defined if
CONFIG_DEVICE_DEINIT_SUPPORT was disabled

Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
(cherry picked from commit 09d520cbd0)
2025-12-03 10:59:38 +02:00
Jamie McCrae
1858e07427 drivers: spi: spi_nrfx_spim: Fix not guarding deinit function
Fixes an issue with an unused function being defined if
CONFIG_DEVICE_DEINIT_SUPPORT was disabled

Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
(cherry picked from commit 828183f45a)
2025-12-03 10:59:38 +02:00
Jamie McCrae
81b8d50c91 drivers: serial: uart_nrfx_uarte: Fix not guarding deinit function
Fixes an issue with an unused function being defined if
CONFIG_DEVICE_DEINIT_SUPPORT was disabled

Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
(cherry picked from commit 6a07d96b5f)
2025-12-03 10:59:38 +02:00
Joel Schaller
b45a60cb79 net: http_server: No Error ENETDOWN
Set Log Level to Info when the HTTP socket reports ENETDOWN,
instead of logging an error each time the network is down.

Signed-off-by: Joel Schaller <joel.schaller16@gmail.com>
(cherry picked from commit f22899e80c)
2025-12-03 10:59:28 +02:00
Yong Cong Sin
da9921200c shell: backends: select RING_BUFFER_LARGE when necessary
Depending on the ring buffer configuration, users may encounter
the "size too big" assertion in runtime. Let's enable the
RING_BUFFER_LARGE when we know that it is required.

Signed-off-by: Yong Cong Sin <ycsin@meta.com>
Signed-off-by: Yong Cong Sin <yongcong.sin@gmail.com>
(cherry picked from commit 6847421188)
2025-12-03 10:59:15 +02:00
Yong Cong Sin
fe706b9c61 ring_buffer: update assert message when size too big
Make the runtime assertion message more obvious on why it's
failing.

Signed-off-by: Yong Cong Sin <ycsin@meta.com>
Signed-off-by: Yong Cong Sin <yongcong.sin@gmail.com>
(cherry picked from commit aff6123cfd)
2025-12-03 10:59:15 +02:00
Albort Xue
df69f01359 tests: pm: power_domain: add ISR safe power management test coverage
Add a new test configuration to verify power domain functionality with
ISR safe power management enabled. The test conditionally applies
PM_DEVICE_ISR_SAFE flags to test devices based on the new
CONFIG_TEST_PM_DEVICE_ISR_SAFE configuration option.

Enhance existing test assertions to verify the PD_CLAIMED flag is
properly set when devices claim power domains and cleared when they
release them, ensuring correct power domain reference counting in
both regular and ISR safe contexts.

Signed-off-by: Albort Xue <yao.xue@nxp.com>
(cherry picked from commit d9196c4714)
2025-12-03 10:59:03 +02:00
Albort Xue
dc309b8482 pm: device_runtime: fix PD_CLAIMED flag logic in ISR_SAFE context
Fix the power domain claiming condition which was inverted, causing
domains to be claimed when they were already claimed instead of when
they weren't. Add null check for power domain before accessing its
properties to prevent potential null pointer dereference. Also ensure
the PD_CLAIMED flag is properly cleared when putting the power domain.

Signed-off-by: Albort Xue <yao.xue@nxp.com>
(cherry picked from commit 3781f6bf9f)
2025-12-03 10:59:03 +02:00
Raffael Rostagno
38edcafef2 samples: openthread: shell: Remove unnecessary file
Remove unnecessary file. Node is already enabled on board's DTS.

Signed-off-by: Raffael Rostagno <raffael.rostagno@espressif.com>
(cherry picked from commit 4f3d0e49a1)
2025-12-03 10:58:40 +02:00
Raffael Rostagno
98845243a3 drivers: ieee802154: esp32: Todo's review
Review todo items to make sure points are solved.

Signed-off-by: Raffael Rostagno <raffael.rostagno@espressif.com>
(cherry picked from commit 9ca6920d98)
2025-12-03 10:58:40 +02:00
Raffael Rostagno
d66a39f7b5 drivers: ieee802154: esp32: Fix start/stop API
Fix start/stop driver API implementation. OT stack expects these
functions to only put IEEE802.15.4 in sleep mode and back in RX
mode when calling start. Fixes ifconfig down/up cycling as well
as nodes staying in leader role and not forming a network.

Signed-off-by: Raffael Rostagno <raffael.rostagno@espressif.com>
(cherry picked from commit 7d46b82568)
2025-12-03 10:58:40 +02:00
68 changed files with 1572 additions and 586 deletions

View File

@@ -107,6 +107,18 @@ void arch_new_thread(struct k_thread *thread, k_thread_stack_t *stack,
#endif /* FP_GUARD_EXTRA_SIZE */
#endif /* CONFIG_MPU_STACK_GUARD */
#if defined(CONFIG_ARM_STORE_EXC_RETURN) || defined(CONFIG_USERSPACE)
thread->arch.mode = 0;
#if defined(CONFIG_ARM_STORE_EXC_RETURN)
thread->arch.mode_exc_return = DEFAULT_EXC_RETURN;
#endif
#if FP_GUARD_EXTRA_SIZE > 0
if ((thread->base.user_options & K_FP_REGS) != 0) {
thread->arch.mode |= Z_ARM_MODE_MPU_GUARD_FLOAT_Msk;
}
#endif
#endif
iframe = Z_STACK_PTR_TO_FRAME(struct __basic_sf, stack_ptr);
#if defined(CONFIG_USERSPACE)
thread->arch.priv_stack_start = 0;
@@ -144,17 +156,6 @@ void arch_new_thread(struct k_thread *thread, k_thread_stack_t *stack,
thread->callee_saved.psp = (uint32_t)iframe;
thread->arch.basepri = 0;
#if defined(CONFIG_ARM_STORE_EXC_RETURN) || defined(CONFIG_USERSPACE)
thread->arch.mode = 0;
#if defined(CONFIG_ARM_STORE_EXC_RETURN)
thread->arch.mode_exc_return = DEFAULT_EXC_RETURN;
#endif
#if FP_GUARD_EXTRA_SIZE > 0
if ((thread->base.user_options & K_FP_REGS) != 0) {
thread->arch.mode |= Z_ARM_MODE_MPU_GUARD_FLOAT_Msk;
}
#endif
#endif
/*
* initial values in all other registers/thread entries are
* irrelevant.

View File

@@ -115,6 +115,18 @@ void arch_new_thread(struct k_thread *thread, k_thread_stack_t *stack, char *sta
#endif /* FP_GUARD_EXTRA_SIZE */
#endif /* CONFIG_MPU_STACK_GUARD */
#if defined(CONFIG_ARM_STORE_EXC_RETURN) || defined(CONFIG_USERSPACE)
thread->arch.mode = 0;
#if defined(CONFIG_ARM_STORE_EXC_RETURN)
thread->arch.mode_exc_return = DEFAULT_EXC_RETURN;
#endif
#if FP_GUARD_EXTRA_SIZE > 0
if ((thread->base.user_options & K_FP_REGS) != 0) {
thread->arch.mode |= Z_ARM_MODE_MPU_GUARD_FLOAT_Msk;
}
#endif
#endif
iframe = Z_STACK_PTR_TO_FRAME(struct __basic_sf, stack_ptr);
#if defined(CONFIG_USERSPACE)
thread->arch.priv_stack_start = 0;
@@ -141,17 +153,6 @@ void arch_new_thread(struct k_thread *thread, k_thread_stack_t *stack, char *sta
thread->callee_saved.psp = (uint32_t)iframe;
thread->arch.basepri = 0;
#if defined(CONFIG_ARM_STORE_EXC_RETURN) || defined(CONFIG_USERSPACE)
thread->arch.mode = 0;
#if defined(CONFIG_ARM_STORE_EXC_RETURN)
thread->arch.mode_exc_return = DEFAULT_EXC_RETURN;
#endif
#if FP_GUARD_EXTRA_SIZE > 0
if ((thread->base.user_options & K_FP_REGS) != 0) {
thread->arch.mode |= Z_ARM_MODE_MPU_GUARD_FLOAT_Msk;
}
#endif
#endif
#ifdef CONFIG_ARM_PAC_PER_THREAD
/* Generate PAC key and save it in thread context to be set later
* when the thread is actually switched in

View File

@@ -207,6 +207,15 @@ FUNC_NORETURN void arch_user_mode_enter(k_thread_entry_t user_entry,
int arch_thread_priv_stack_space_get(const struct k_thread *thread, size_t *stack_size,
size_t *unused_ptr)
{
if (!IS_ENABLED(CONFIG_INIT_STACKS) || !IS_ENABLED(CONFIG_THREAD_STACK_INFO)) {
/*
* This is needed to ensure that the call to z_stack_space_get() below is properly
* dead-stripped when linking using LLVM / lld. For more info, please see issue
* #98491.
*/
return -EINVAL;
}
if ((thread->base.user_options & K_USER) != K_USER) {
return -EINVAL;
}

View File

@@ -189,6 +189,15 @@ FUNC_NORETURN void arch_user_mode_enter(k_thread_entry_t user_entry,
int arch_thread_priv_stack_space_get(const struct k_thread *thread, size_t *stack_size,
size_t *unused_ptr)
{
if (!IS_ENABLED(CONFIG_INIT_STACKS) || !IS_ENABLED(CONFIG_THREAD_STACK_INFO)) {
/*
* This is needed to ensure that the call to z_stack_space_get() below is properly
* dead-stripped when linking using LLVM / lld. For more info, please see issue
* #98491.
*/
return -EINVAL;
}
struct z_x86_thread_stack_header *hdr_stack_obj;
if ((thread->base.user_options & K_USER) != K_USER) {

View File

@@ -240,6 +240,15 @@ FUNC_NORETURN void arch_user_mode_enter(k_thread_entry_t user_entry,
int arch_thread_priv_stack_space_get(const struct k_thread *thread, size_t *stack_size,
size_t *unused_ptr)
{
if (!IS_ENABLED(CONFIG_INIT_STACKS) || !IS_ENABLED(CONFIG_THREAD_STACK_INFO)) {
/*
* This is needed to ensure that the call to z_stack_space_get() below is properly
* dead-stripped when linking using LLVM / lld. For more info, please see issue
* #98491.
*/
return -EINVAL;
}
struct xtensa_thread_stack_header *hdr_stack_obj;
if ((thread->base.user_options & K_USER) != K_USER) {

View File

@@ -7,14 +7,15 @@
# Note1: Suggest developers use Secure Provisioning Tool(SPT) to download RT1180 image
# SPT can be downloaded on NXP web: https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/mcuxpresso-secure-provisioning-tool:MCUXPRESSO-SECURE-PROVISIONING
# Details about the usage of SPT on MIMXRT1180-EVK board can be referred on chapter 7 of getting start with Mcuxpresso SDK for MIMXRT1180-EVK doc in SDK package.
set(JLINKSCRIPTDIR ${CMAKE_CURRENT_LIST_DIR}/jlinkscript)
if(CONFIG_SOC_MIMXRT1189_CM33 OR CONFIG_SECOND_CORE_MCUX)
board_runner_args(linkserver "--device=MIMXRT1189xxxxx:MIMXRT1180-EVK")
board_runner_args(jlink "--device=MIMXRT1189xxx8_M33" "--reset-after-load" "--tool-opt=-jlinkscriptfile jlinkscript/evkmimxrt1180_cm33.jlinkscript")
board_runner_args(jlink "--device=MIMXRT1189xxx8_M33" "--reset-after-load" "--tool-opt=-jlinkscriptfile ${JLINKSCRIPTDIR}/evkmimxrt1180_cm33.jlinkscript")
elseif(CONFIG_SOC_MIMXRT1189_CM7)
# Note: Only support run cm7 image when debugging due to default boot core on board is cm33 core
board_runner_args(linkserver "--device=MIMXRT1189xxxxx:MIMXRT1180-EVK")
board_runner_args(linkserver "--core=cm7")
board_runner_args(jlink "--device=MIMXRT1189xxx8_M7" "--speed=4000" "--no-reset" "--tool-opt=-jlinkscriptfile jlinkscript/evkmimxrt1180_cm7.jlinkscript" "--tool-opt=-ir")
board_runner_args(jlink "--device=MIMXRT1189xxx8_M7" "--speed=4000" "--no-reset" "--tool-opt=-jlinkscriptfile ${JLINKSCRIPTDIR}/evkmimxrt1180_cm7.jlinkscript" "--tool-opt=-ir")
endif()
include(${ZEPHYR_BASE}/boards/common/linkserver.board.cmake)

View File

@@ -83,7 +83,7 @@ of i.MX NETC.
.phy_mode = NETC_PHY_MODE(port), \
}; \
struct dsa_port_config dsa_##n##_##port##_config = { \
.use_random_mac_addr = DT_NODE_HAS_PROP(port, zephyr_random_mac_address), \
.use_random_mac_addr = DT_PROP(port, zephyr_random_mac_address), \
.mac_addr = DT_PROP_OR(port, local_mac_address, {0}), \
.port_idx = DT_REG_ADDR(port), \
.phy_dev = DEVICE_DT_GET_OR_NULL(DT_PHANDLE(port, phy_handle)), \

View File

@@ -136,16 +136,39 @@ Keeping Zephyr updated
To update the Zephyr project source code, you need to get the latest
changes via ``git``. Afterwards, run ``west update`` as mentioned in
the previous paragraph.
Additionally, in the case of updated or added Python dependencies, running
``west packages pip --install`` will make sure these are up-to-date.
Additionally, check for updated or added Python dependencies.
.. code-block:: console
.. tabs::
# replace zephyrproject with the path you gave west init
cd zephyrproject/zephyr
git pull
west update
west packages pip --install
.. group-tab:: Linux/macOS
.. code-block:: console
# replace zephyrproject with the path you gave west init
cd zephyrproject/zephyr
git pull
west update
west packages pip --install
.. group-tab:: Windows
.. tabs::
.. code-tab:: bat
:: replace zephyrproject with the path you gave west init
cd zephyrproject\zephyr
git pull
west update
cmd /c scripts\utils\west-packages-pip-install.cmd
.. code-tab:: powershell
# replace zephyrproject with the path you gave west init
cd zephyrproject\zephyr
git pull
west update
python -m pip install @((west packages pip) -split ' ')
Export Zephyr CMake package
***************************

View File

@@ -266,6 +266,10 @@ chosen. You'll also install Zephyr's additional Python dependencies in a
west packages pip --install
.. note::
This could downgrade or upgrade west itself.
.. group-tab:: macOS
#. Create a new virtual environment:
@@ -317,6 +321,10 @@ chosen. You'll also install Zephyr's additional Python dependencies in a
west packages pip --install
.. note::
This could downgrade or upgrade west itself.
.. group-tab:: Windows
#. Open a ``cmd.exe`` or PowerShell terminal window **as a regular user**
@@ -389,9 +397,19 @@ chosen. You'll also install Zephyr's additional Python dependencies in a
#. Install Python dependencies using ``west packages``.
.. code-block:: bat
.. tabs::
west packages pip --install
.. code-tab:: bat
cmd /c scripts\utils\west-packages-pip-install.cmd
.. code-tab:: powershell
python -m pip install @((west packages pip) -split ' ')
.. note::
This could downgrade or upgrade west itself.
Install the Zephyr SDK
**********************

View File

@@ -76,17 +76,16 @@ static int entropy_gecko_trng_get_entropy(const struct device *dev,
ARG_UNUSED(dev);
#ifdef CONFIG_CRYPTO_ACC_GECKO_TRNG
CMU_ClockEnable(cmuClock_CRYPTOACC, true);
#endif
while (length) {
#ifndef CONFIG_CRYPTO_ACC_GECKO_TRNG
available = TRNG0->FIFOLEVEL * 4;
#else
CMU_ClockEnable(cmuClock_CRYPTOACC, true);
available = S2_FIFO_LEVEL * 4;
#endif
if (available == 0) {
return -EINVAL;
}
count = SL_MIN(length, available);
entropy_gecko_trng_read(buffer, count);
buffer += count;

View File

@@ -451,7 +451,7 @@ static struct dsa_api dsa_netc_api = {
.phy_mode = NETC_PHY_MODE(port), \
}; \
struct dsa_port_config dsa_##n##_##port##_config = { \
.use_random_mac_addr = DT_NODE_HAS_PROP(port, zephyr_random_mac_address), \
.use_random_mac_addr = DT_PROP(port, zephyr_random_mac_address), \
.mac_addr = DT_PROP_OR(port, local_mac_address, {0}), \
.port_idx = DT_REG_ADDR(port), \
.phy_dev = DEVICE_DT_GET_OR_NULL(DT_PHANDLE(port, phy_handle)), \
@@ -482,6 +482,6 @@ static struct dsa_api dsa_netc_api = {
POST_KERNEL, \
CONFIG_ETH_INIT_PRIORITY, \
NULL); \
DSA_SWITCH_INST_INIT(n, &dsa_netc_api, &dsa_netc_data_##n, DSA_NETC_PORT_INST_INIT); \
DSA_SWITCH_INST_INIT(n, &dsa_netc_api, &dsa_netc_data_##n, DSA_NETC_PORT_INST_INIT);
DT_INST_FOREACH_STATUS_OKAY(DSA_NETC_DEVICE);

View File

@@ -1294,6 +1294,11 @@ static int i2c_dw_initialize(const struct device *dev)
uint32_t reg_base = get_regs(dev);
clear_bit_enable_en(reg_base);
/*
* depending on the IP configuration, we may have to disable block mode in
* controller mode
*/
clear_bit_enable_block(reg_base);
/* verify that we have a valid DesignWare register first */
if (read_comp_type(reg_base) != I2C_DW_MAGIC_KEY) {

View File

@@ -224,10 +224,12 @@ static int i2c_nrfx_twim_init(const struct device *dev)
return i2c_nrfx_twim_common_init(dev);
}
#ifdef CONFIG_DEVICE_DEINIT_SUPPORT
static int i2c_nrfx_twim_deinit(const struct device *dev)
{
return i2c_nrfx_twim_common_deinit(dev);
}
#endif
static DEVICE_API(i2c, i2c_nrfx_twim_driver_api) = {
.configure = i2c_nrfx_twim_configure,

View File

@@ -151,6 +151,7 @@ int i2c_nrfx_twim_common_init(const struct device *dev)
return pm_device_driver_init(dev, twim_nrfx_pm_action);
}
#ifdef CONFIG_DEVICE_DEINIT_SUPPORT
int i2c_nrfx_twim_common_deinit(const struct device *dev)
{
const struct i2c_nrfx_twim_common_config *config = dev->config;
@@ -178,3 +179,4 @@ int i2c_nrfx_twim_common_deinit(const struct device *dev)
nrfx_twim_uninit(&config->twim);
return 0;
}
#endif

View File

@@ -211,10 +211,12 @@ static int i2c_nrfx_twim_rtio_init(const struct device *dev)
return i2c_nrfx_twim_common_init(dev);
}
#ifdef CONFIG_DEVICE_DEINIT_SUPPORT
static int i2c_nrfx_twim_rtio_deinit(const struct device *dev)
{
return i2c_nrfx_twim_common_deinit(dev);
}
#endif
#define CONCAT_BUF_SIZE(idx) \
COND_CODE_1(DT_NODE_HAS_PROP(I2C(idx), zephyr_concat_buf_size), \

View File

@@ -292,6 +292,7 @@ static int shim_nrf_twis_init(const struct device *dev)
return pm_device_driver_init(dev, shim_nrf_twis_pm_action_cb);
}
#ifdef CONFIG_DEVICE_DEINIT_SUPPORT
static int shim_nrf_twis_deinit(const struct device *dev)
{
const struct shim_nrf_twis_config *dev_config = dev->config;
@@ -320,6 +321,7 @@ static int shim_nrf_twis_deinit(const struct device *dev)
nrfx_twis_uninit(&dev_config->twis);
return 0;
}
#endif
#define SHIM_NRF_TWIS_NAME(id, name) \
_CONCAT_4(shim_nrf_twis_, name, _, id)

View File

@@ -61,8 +61,7 @@ void esp_ieee802154_receive_done(uint8_t *frame, esp_ieee802154_frame_info_t *fr
/* The ESP-IDF HAL handles FCS already and drops frames with bad checksum. The checksum at
* the end of a valid frame is replaced with RSSI and LQI values.
*
* ToDo: Check if L2 needs a valid checksum in the frame.
* Zephyr L2 expects only valid frames, so checksum is not needed for a re-check.
*/
if (IS_ENABLED(CONFIG_IEEE802154_L2_PKT_INCL_FCS)) {
len = frame[0];
@@ -121,7 +120,7 @@ static enum ieee802154_hw_caps esp32_get_capabilities(const struct device *dev)
/* ToDo: Double-check and extend */
return IEEE802154_HW_ENERGY_SCAN | IEEE802154_HW_FILTER | IEEE802154_HW_TX_RX_ACK |
IEEE802154_HW_CSMA;
IEEE802154_HW_CSMA | IEEE802154_HW_PROMISC | IEEE802154_RX_ON_WHEN_IDLE;
}
/* override weak function in components/ieee802154/esp_ieee802154.c of ESP-IDF */
@@ -345,9 +344,6 @@ static int esp32_tx(const struct device *dev, enum ieee802154_tx_mode tx_mode, s
err = k_sem_take(&data->tx_wait, K_MSEC(IEEE802154_ESP32_TX_TIMEOUT_MS));
/* set the radio back to RX mode as quickly as possible */
ieee802154_receive();
if (err != 0) {
LOG_ERR("TX timeout");
} else {
@@ -359,36 +355,26 @@ static int esp32_tx(const struct device *dev, enum ieee802154_tx_mode tx_mode, s
static int esp32_start(const struct device *dev)
{
struct ieee802154_esp32_data *data = dev->data;
ARG_UNUSED(dev);
if (data->is_started) {
return 0;
} else if (esp_ieee802154_enable() == 0) {
esp_ieee802154_set_promiscuous(false);
esp_ieee802154_set_rx_when_idle(true);
/* ToDo: check if this is necessary */
esp_ieee802154_receive();
data->is_started = true;
return 0;
if (esp_ieee802154_receive() != 0) {
LOG_ERR("Failed to start radio");
return -EIO;
}
return -EIO;
return 0;
}
static int esp32_stop(const struct device *dev)
{
struct ieee802154_esp32_data *data = dev->data;
ARG_UNUSED(dev);
if (!data->is_started) {
return 0;
} else if (esp_ieee802154_disable() == 0) {
data->is_started = false;
return 0;
if (esp_ieee802154_sleep() != 0) {
LOG_ERR("Failed to stop radio");
return -EIO;
}
return -EIO;
return 0;
}
/* override weak function in components/ieee802154/esp_ieee802154.c of ESP-IDF */
@@ -404,7 +390,7 @@ void IRAM_ATTR esp_ieee802154_energy_detect_done(int8_t power)
callback = esp32_data.energy_scan_done;
esp32_data.energy_scan_done = NULL;
dev = net_if_get_device(esp32_data.iface);
callback(dev, power); /* TODO: check scaling */
callback(dev, power);
}
static int esp32_ed_scan(const struct device *dev, uint16_t duration, energy_scan_done_cb_t done_cb)
@@ -416,7 +402,7 @@ static int esp32_ed_scan(const struct device *dev, uint16_t duration, energy_sca
if (esp32_data.energy_scan_done == NULL) {
esp32_data.energy_scan_done = done_cb;
/* The duration of energy detection, in symbol unit (16 us). TODO: check scaling */
/* The duration of energy detection, in symbol unit (16 us) */
if (esp_ieee802154_energy_detect(duration * USEC_PER_MSEC / US_PER_SYMBLE) != 0) {
esp32_data.energy_scan_done = NULL;
err = -EBUSY;
@@ -470,6 +456,15 @@ static int esp32_init(const struct device *dev)
k_sem_init(&data->cca_wait, 0, 1);
k_sem_init(&data->tx_wait, 0, 1);
if (esp_ieee802154_enable() != 0) {
LOG_ERR("IEEE 802154 enabling failed!");
return -EIO;
}
/* Default radio settings */
esp_ieee802154_set_promiscuous(false);
esp_ieee802154_set_rx_when_idle(true);
LOG_INF("IEEE 802154 radio initialized");
return 0;

View File

@@ -24,8 +24,6 @@ struct ieee802154_esp32_data {
/* CCA result. Holds information whether channel is free or not. */
bool channel_free;
bool is_started;
/* TX synchronization semaphore. Unlocked when frame has been
* sent or send procedure failed.
*/

View File

@@ -40,6 +40,11 @@ struct stm32_exti_range {
#define EXTI_NUM_LINES_TOTAL DT_PROP(EXTI_NODE, num_lines)
#define NUM_EXTI_LINES DT_PROP(EXTI_NODE, num_gpio_lines)
#if defined(CONFIG_SOC_SERIES_STM32N6X)
/* Index 8 of CR stands for PORTN instead of PORTI */
#define STM32_PORT_GAP (STM32_PORTN - STM32_PORTI)
#endif
BUILD_ASSERT(EXTI_NUM_LINES_TOTAL >= NUM_EXTI_LINES,
"The total number of EXTI lines must be greater or equal than the number of GPIO lines");
@@ -284,15 +289,26 @@ void stm32_exti_set_line_src_port(gpio_pin_t line, uint32_t port)
{
uint32_t ll_line = stm32_exti_linenum_to_src_cfg_line(line);
#if defined(CONFIG_SOC_SERIES_STM32L0X) && defined(LL_SYSCFG_EXTI_PORTH)
/*
* Ports F and G are not present on some STM32L0 parts, so
* for these parts port H external interrupt should be enabled
* by writing value 0x5 instead of 0x7.
* On some series, or specific parts, it may happen that a discontinuity
* exists in the indexes of port used in configuration registers.
* Fix those case by case
*/
#if defined(CONFIG_SOC_SERIES_STM32L0X) && defined(LL_SYSCFG_EXTI_PORTH)
if (port == STM32_PORTH) {
/* Port H (index 7) uses value 5 */
port = LL_SYSCFG_EXTI_PORTH;
}
#elif defined(CONFIG_SOC_SERIES_STM32MP1X)
if (port == STM32_PORTZ) {
/* Port Z (index 25) uses value 11 */
port = LL_EXTI_CONFIG_PORTZ;
}
#elif defined(CONFIG_SOC_SERIES_STM32N6X)
if (port >= STM32_PORTN) {
/* Ports N and above (starting index 13) use value 8 and higher */
port = port - STM32_PORT_GAP;
}
#endif
z_stm32_hsem_lock(CFG_HW_EXTI_SEMID, HSEM_LOCK_DEFAULT_RETRY);
@@ -329,15 +345,26 @@ uint32_t stm32_exti_get_line_src_port(gpio_pin_t line)
port = LL_SYSCFG_GetEXTISource(ll_line);
#endif
#if defined(CONFIG_SOC_SERIES_STM32L0X) && defined(LL_SYSCFG_EXTI_PORTH)
/*
* Ports F and G are not present on some STM32L0 parts, so
* for these parts port H external interrupt is enabled
* by writing value 0x5 instead of 0x7.
* On some series, or specific parts, it may happen that a discontinuity
* exists in the indexes of port used in configuration registers.
* Fix those case by case.
*/
#if defined(CONFIG_SOC_SERIES_STM32L0X) && defined(LL_SYSCFG_EXTI_PORTH)
if (port == LL_SYSCFG_EXTI_PORTH) {
/* Value 7 is for port H */
port = STM32_PORTH;
}
#elif defined(CONFIG_SOC_SERIES_STM32MP1X)
if (port == LL_EXTI_CONFIG_PORTZ) {
/* Value 11 is for port Z */
port = STM32_PORTZ;
}
#elif defined(CONFIG_SOC_SERIES_STM32N6X)
if (port >= STM32_PORTN) {
/* Value 8 and higher are for ports N and above */
port = port + STM32_PORT_GAP;
}
#endif
return port;

View File

@@ -108,6 +108,7 @@ struct mcux_flexcomm_data {
bool pm_policy_state_lock;
struct k_work pm_lock_work;
#endif
uint32_t usart_intenset;
};
#ifdef CONFIG_PM_POLICY_DEVICE_CONSTRAINTS
@@ -1205,10 +1206,10 @@ static void mcux_flexcomm_pm_restore_wake(const struct device *dev,
}
#endif /* FC_UART_IS_WAKEUP */
static uint32_t usart_intenset;
static int mcux_flexcomm_pm_action(const struct device *dev, enum pm_device_action action)
{
const struct mcux_flexcomm_config *config = dev->config;
struct mcux_flexcomm_data *data = dev->data;
int ret;
switch (action) {
@@ -1217,14 +1218,14 @@ static int mcux_flexcomm_pm_action(const struct device *dev, enum pm_device_acti
case PM_DEVICE_ACTION_SUSPEND:
break;
case PM_DEVICE_ACTION_TURN_OFF:
usart_intenset = USART_GetEnabledInterrupts(config->base);
data->usart_intenset = USART_GetEnabledInterrupts(config->base);
break;
case PM_DEVICE_ACTION_TURN_ON:
ret = mcux_flexcomm_init_common(dev);
if (ret) {
return ret;
}
USART_EnableInterrupts(config->base, usart_intenset);
USART_EnableInterrupts(config->base, data->usart_intenset);
break;
default:
return -ENOTSUP;

View File

@@ -2412,10 +2412,12 @@ static int uarte_instance_init(const struct device *dev,
return pm_device_driver_init(dev, uarte_nrfx_pm_action);
}
#ifdef CONFIG_DEVICE_DEINIT_SUPPORT
static int uarte_instance_deinit(const struct device *dev)
{
return pm_device_driver_deinit(dev, uarte_nrfx_pm_action);
}
#endif
#define UARTE_GET_ISR(idx) \
COND_CODE_1(CONFIG_UART_##idx##_ASYNC, (uarte_nrfx_isr_async), (uarte_nrfx_isr_int))

View File

@@ -659,8 +659,8 @@ static int transceive_dma(const struct device *dev,
const struct spi_mcux_config *config = dev->config;
struct spi_mcux_data *data = dev->data;
SPI_Type *base = config->base;
int ret;
uint8_t word_size = (uint8_t)SPI_WORD_SIZE_GET(spi_cfg->operation);
int ret = 0;
if (word_size > SPI_MAX_DATA_WIDTH) {
LOG_ERR("Word size %d is greater than %d", word_size, SPI_MAX_DATA_WIDTH);
@@ -671,6 +671,14 @@ static int transceive_dma(const struct device *dev,
spi_context_lock(&data->ctx, asynchronous, cb, userdata, spi_cfg);
spi_context_buffers_setup(&data->ctx, tx_bufs, rx_bufs, 1);
if ((data->ctx.tx_count + data->ctx.rx_count) == 0) {
/* no data to transfer */
ret = 0;
goto out;
}
data->word_size_bits = word_size;
data->word_size_bytes = (word_size > 8) ? (sizeof(uint16_t)) : (sizeof(uint8_t));
ret = spi_mcux_configure(dev, spi_cfg);
@@ -678,8 +686,6 @@ static int transceive_dma(const struct device *dev,
goto out;
}
spi_context_buffers_setup(&data->ctx, tx_bufs, rx_bufs, 1);
spi_context_cs_control(&data->ctx, true);
/* Clear FIFOs and any previous errors before transfer */

View File

@@ -712,6 +712,7 @@ static int spi_nrfx_init(const struct device *dev)
return pm_device_driver_init(dev, spim_nrfx_pm_action);
}
#ifdef CONFIG_DEVICE_DEINIT_SUPPORT
static int spi_nrfx_deinit(const struct device *dev)
{
#if defined(CONFIG_PM_DEVICE)
@@ -732,6 +733,7 @@ static int spi_nrfx_deinit(const struct device *dev)
return 0;
}
#endif
#define SPI_NRFX_SPIM_EXTENDED_CONFIG(idx) \
IF_ENABLED(NRFX_SPIM_EXTENDED_ENABLED, \

View File

@@ -196,7 +196,7 @@ static void gop_eagain_retry(int cmd, struct gnttab_map_grant_ref *gref)
void *gnttab_get_pages(unsigned int npages)
{
int ret;
int ret = 0;
void *page_addr;
unsigned int removed;
xen_pfn_t gfn;

View File

@@ -88,6 +88,7 @@ current_sense_amplifier_scale_ua_dt(const struct current_sense_amplifier_dt_spec
* (INT32_MAX * 1000) * UINT16_MAX <= INT64_MAX
* ~2**57 <= 2**63
*/
temp = temp - 1000 * (int64_t)(spec->zero_current_voltage_mv);
int64_t scaled = temp * 1000 * spec->sense_gain_div;
/* Perform final divisions */
return scaled / spec->sense_gain_mult / spec->sense_milli_ohms;

View File

@@ -32,12 +32,13 @@ extern "C" {
#ifdef CONFIG_RING_BUFFER_LARGE
typedef uint32_t ring_buf_idx_t;
#define RING_BUFFER_MAX_SIZE (UINT32_MAX / 2)
#define RING_BUFFER_SIZE_ASSERT_MSG "Size too big"
#else
typedef uint16_t ring_buf_idx_t;
#define RING_BUFFER_MAX_SIZE (UINT16_MAX / 2)
#define RING_BUFFER_SIZE_ASSERT_MSG "Size too big, please enable CONFIG_RING_BUFFER_LARGE"
#endif
#define RING_BUFFER_SIZE_ASSERT_MSG "Size too big"
struct ring_buf_index { ring_buf_idx_t head, tail, base; };

View File

@@ -57,6 +57,8 @@ static void lvgl_pointer_process_event(struct input_event *evt, void *user_data)
data->common_data.pending_event.state =
evt->value ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
break;
default:
return;
}
if (!evt->sync) {

View File

@@ -122,6 +122,7 @@ int notify_new_tx_frame(struct net_pkt *pkt);
otError infra_if_init(otInstance *instance, struct net_if *ail_iface);
otError infra_if_start_icmp6_listener(void);
void infra_if_stop_icmp6_listener(void);
void udp_plat_init_sockfd(void);
otError udp_plat_init(otInstance *ot_instance, struct net_if *ail_iface, struct net_if *ot_iface);
void udp_plat_deinit(void);
otError mdns_plat_socket_init(otInstance *ot_instance, uint32_t ail_iface_idx);

View File

@@ -36,6 +36,13 @@ static void udp_receive_handler(struct net_socket_service_event *evt);
NET_SOCKET_SERVICE_SYNC_DEFINE_STATIC(handle_udp_receive, udp_receive_handler,
CONFIG_OPENTHREAD_ZEPHYR_BORDER_ROUTER_MAX_UDP_SERVICES);
void udp_plat_init_sockfd(void)
{
for (uint8_t i = 0; i < CONFIG_OPENTHREAD_ZEPHYR_BORDER_ROUTER_MAX_UDP_SERVICES; i++) {
sockfd_udp[i].fd = -1;
}
}
otError udp_plat_init(otInstance *ot_instance, struct net_if *ail_iface, struct net_if *ot_iface)
{
ot_instance_ptr = ot_instance;

View File

@@ -26,11 +26,7 @@ static int welcome(int fd)
return send(fd, msg, sizeof(msg), 0);
}
/* This is mainly here to bind to a port to get service advertisement
* to work.. but since we're already here we might as well do something
* useful.
*/
void service(void)
static int echo_service(const struct sockaddr *server_addr)
{
int r;
int server_fd;
@@ -38,11 +34,116 @@ void service(void)
socklen_t len;
void *addrp;
uint16_t *portp;
struct sockaddr client_addr;
struct sockaddr_storage client_addr;
char addrstr[INET6_ADDRSTRLEN];
uint8_t line[64];
static struct sockaddr server_addr;
r = socket(server_addr->sa_family, SOCK_STREAM, 0);
if (r == -1) {
r = -errno;
NET_DBG("socket() failed (%d)", r);
return r;
}
server_fd = r;
NET_DBG("server_fd is %d", server_fd);
r = setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int));
if (r == -1) {
r = -errno;
LOG_ERR("setsockopt() failed (%d)", r);
close(server_fd);
return r;
}
r = bind(server_fd, server_addr, sizeof(*server_addr));
if (r == -1) {
r = -errno;
NET_DBG("bind() failed (%d)", r);
close(server_fd);
return r;
}
if (server_addr->sa_family == AF_INET6) {
addrp = &net_sin6((server_addr))->sin6_addr;
portp = &net_sin6(server_addr)->sin6_port;
} else {
addrp = &net_sin(server_addr)->sin_addr;
portp = &net_sin(server_addr)->sin_port;
}
inet_ntop(server_addr->sa_family, addrp, addrstr, sizeof(addrstr));
NET_DBG("bound to [%s]:%u", addrstr, ntohs(*portp));
r = listen(server_fd, 1);
if (r == -1) {
r = -errno;
NET_DBG("listen() failed (%d)", r);
close(server_fd);
return r;
}
for (;;) {
len = sizeof(client_addr);
r = accept(server_fd, (struct sockaddr *)&client_addr, &len);
if (r == -1) {
NET_DBG("accept() failed (%d)", errno);
break;
}
client_fd = r;
inet_ntop(server_addr->sa_family, addrp, addrstr, sizeof(addrstr));
NET_DBG("accepted connection from [%s]:%u", addrstr, ntohs(*portp));
/* send a banner */
r = welcome(client_fd);
if (r == -1) {
NET_DBG("send() failed (%d)", errno);
close(client_fd);
continue;
}
for (;;) {
/* echo 1 line at a time */
r = recv(client_fd, line, sizeof(line), 0);
if (r == -1) {
NET_DBG("recv() failed (%d)", errno);
close(client_fd);
break;
}
if (r == 0) {
NET_DBG("connection closed by peer");
close(client_fd);
break;
}
len = r;
r = send(client_fd, line, len, 0);
if (r == -1) {
NET_DBG("send() failed (%d)", errno);
close(client_fd);
break;
}
}
}
close(server_fd);
return 0;
}
/* This is mainly here to bind to a port to get service advertisement
* to work.. but since we're already here we might as well do something
* useful.
*/
void service(void)
{
int r = 0;
static struct sockaddr_storage server_addr;
#if DEFAULT_PORT == 0
/* The advanced use case: ephemeral port */
@@ -62,90 +163,21 @@ void service(void)
#endif
if (IS_ENABLED(CONFIG_NET_IPV6)) {
net_sin6(&server_addr)->sin6_family = AF_INET6;
net_sin6(&server_addr)->sin6_addr = in6addr_any;
net_sin6(&server_addr)->sin6_port = sys_cpu_to_be16(DEFAULT_PORT);
net_sin6(net_sad(&server_addr))->sin6_family = AF_INET6;
net_sin6(net_sad(&server_addr))->sin6_addr = in6addr_any;
net_sin6(net_sad(&server_addr))->sin6_port = sys_cpu_to_be16(DEFAULT_PORT);
} else if (IS_ENABLED(CONFIG_NET_IPV4)) {
net_sin(&server_addr)->sin_family = AF_INET;
net_sin(&server_addr)->sin_addr.s_addr = htonl(INADDR_ANY);
net_sin(&server_addr)->sin_port = sys_cpu_to_be16(DEFAULT_PORT);
net_sin(net_sad(&server_addr))->sin_family = AF_INET;
net_sin(net_sad(&server_addr))->sin_addr.s_addr = htonl(INADDR_ANY);
net_sin(net_sad(&server_addr))->sin_port = sys_cpu_to_be16(DEFAULT_PORT);
} else {
__ASSERT(false, "Neither IPv6 nor IPv4 are enabled");
}
r = socket(server_addr.sa_family, SOCK_STREAM, 0);
if (r == -1) {
NET_DBG("socket() failed (%d)", errno);
return;
}
server_fd = r;
NET_DBG("server_fd is %d", server_fd);
r = bind(server_fd, &server_addr, sizeof(server_addr));
if (r == -1) {
NET_DBG("bind() failed (%d)", errno);
close(server_fd);
return;
}
if (server_addr.sa_family == AF_INET6) {
addrp = &net_sin6(&server_addr)->sin6_addr;
portp = &net_sin6(&server_addr)->sin6_port;
} else {
addrp = &net_sin(&server_addr)->sin_addr;
portp = &net_sin(&server_addr)->sin_port;
}
inet_ntop(server_addr.sa_family, addrp, addrstr, sizeof(addrstr));
NET_DBG("bound to [%s]:%u",
addrstr, ntohs(*portp));
r = listen(server_fd, 1);
if (r == -1) {
NET_DBG("listen() failed (%d)", errno);
close(server_fd);
return;
}
for (;;) {
len = sizeof(client_addr);
r = accept(server_fd, (struct sockaddr *)&client_addr, &len);
if (r == -1) {
NET_DBG("accept() failed (%d)", errno);
continue;
}
client_fd = r;
inet_ntop(server_addr.sa_family, addrp, addrstr, sizeof(addrstr));
NET_DBG("accepted connection from [%s]:%u",
addrstr, ntohs(*portp));
/* send a banner */
r = welcome(client_fd);
if (r == -1) {
NET_DBG("send() failed (%d)", errno);
close(client_fd);
return;
}
for (;;) {
/* echo 1 line at a time */
r = recv(client_fd, line, sizeof(line), 0);
if (r == -1) {
NET_DBG("recv() failed (%d)", errno);
close(client_fd);
break;
}
len = r;
r = send(client_fd, line, len, 0);
if (r == -1) {
NET_DBG("send() failed (%d)", errno);
close(client_fd);
break;
}
while (r == 0) {
r = echo_service((struct sockaddr *)&server_addr);
if (r < 0) {
NET_ERR("Fatal echo server error, %d", r);
}
}
}

View File

@@ -1,9 +0,0 @@
/*
* Copyright (c) 2025 Espressif Systems (Shanghai) Co., Ltd.
*
* SPDX-License-Identifier: Apache-2.0
*/
&ieee802154 {
status = "okay";
};

View File

@@ -0,0 +1,27 @@
:: SPDX-FileCopyrightText: Copyright The Zephyr Project Contributors
:: SPDX-License-Identifier: Apache-2.0
@echo off
rem Collect packages from west and install them with a single pip call.
setlocal enabledelayedexpansion
set "PACKAGES="
for /f "usebackq delims=" %%p in (`west packages pip`) do (
if defined PACKAGES (
set "PACKAGES=!PACKAGES! %%p"
) else (
set "PACKAGES=%%p"
)
)
if not defined PACKAGES (
echo west packages pip returned no packages to install.
exit /b 0
)
echo Installing packages with: python.exe -m pip install %PACKAGES%
python.exe -m pip install %PACKAGES%
set "RESULT=%ERRORLEVEL%"
endlocal & exit /b %RESULT%

View File

@@ -4,13 +4,15 @@
import argparse
import os
import platform
import subprocess
import sys
import textwrap
from itertools import chain
from pathlib import Path
from pathlib import Path, PureWindowsPath
from west.commands import WestCommand
from west.util import quote_sh_list
from zephyr_ext_common import ZEPHYR_BASE
sys.path.append(os.fspath(Path(__file__).parent.parent))
@@ -157,11 +159,38 @@ class Packages(WestCommand):
self.die("Running pip install outside of a virtual environment")
if len(requirements) > 0:
subprocess.check_call(
[sys.executable, "-m", "pip", "install"]
+ list(chain.from_iterable([("-r", r) for r in requirements]))
+ manager_args
cmd = [sys.executable, "-m", "pip", "install"]
cmd += chain.from_iterable([("-r", str(r)) for r in requirements])
cmd += manager_args
self.dbg(quote_sh_list(cmd))
# Use os.execv to execute a new program, replacing the current west process,
# this unloads all python modules first and allows for pip to update packages safely
if platform.system() != 'Windows':
os.execv(cmd[0], cmd)
# Only reachable on Windows systems
# Windows does not really support os.execv:
# https://github.com/python/cpython/issues/63323
# https://github.com/python/cpython/issues/101191
# Warn the users about permission errors as those reported in:
# https://github.com/zephyrproject-rtos/zephyr/issues/100296
cmdscript = (
PureWindowsPath(__file__).parents[1] / "utils" / "west-packages-pip-install.cmd"
)
self.wrn(
"Updating packages on Windows with 'west packages pip --install', that are "
"currently in use by west, results in permission errors. Leaving your "
"environment with conflicting package versions. Recommended is to start with "
"a new environment in that case.\n\n"
"To avoid this using powershell run the following command instead:\n"
f"{sys.executable} -m pip install @((west packages pip) -split ' ')\n\n"
"Using cmd.exe execute the helper script:\n"
f"cmd /c {cmdscript}\n\n"
"Running 'west packages pip --install -- --dry-run' can provide information "
"without actually updating the environment."
)
subprocess.check_call(cmd)
else:
self.inf("Nothing to install")
return

View File

@@ -7,6 +7,7 @@ config SOC_SERIES_RP2350
select HAS_RPI_PICO
select HAS_SEGGER_RTT if ZEPHYR_SEGGER_MODULE
select SOC_RESET_HOOK
imply XIP
config SOC_RP2350A_HAZARD3
select HAS_FLASH_LOAD_OFFSET

View File

@@ -13,6 +13,22 @@ configdefault SYS_CLOCK_TICKS_PER_SEC
configdefault UART_NS16550_DW8250_DW_APB
default y
configdefault ZERO_LATENCY_IRQS
default y
configdefault ZERO_LATENCY_LEVELS
default 2
if PM_DEVICE
configdefault PM_DEVICE_RUNTIME
default y
configdefault POWER_DOMAIN
default y
endif # PM_DEVICE
if SILABS_SIWX91X_NWP
# WiseConnect create threads with realtime priority. Default (10kHz) clock tick

View File

@@ -311,29 +311,14 @@ void radio_phy_set(uint8_t phy, uint8_t flags)
void radio_tx_power_set(int8_t power)
{
#if defined(CONFIG_SOC_COMPATIBLE_NRF54LX)
uint32_t value;
value = hal_radio_tx_power_value(power);
NRF_RADIO->TXPOWER = value;
#elif defined(CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET)
uint32_t value;
/* NOTE: TXPOWER register only accepts upto 0dBm, hence use the HAL
* floor value for the TXPOWER register. Permit +3dBm by using high
* voltage being set for radio.
*/
value = hal_radio_tx_power_floor(power);
NRF_RADIO->TXPOWER = value;
#if defined(CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET)
hal_radio_tx_power_high_voltage_set(power);
#else /* !CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET && !CONFIG_SOC_COMPATIBLE_NRF54LX */
/* NOTE: valid value range is passed by Kconfig define. */
NRF_RADIO->TXPOWER = (uint32_t)power;
#endif /* !CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET && !CONFIG_SOC_COMPATIBLE_NRF54LX */
#endif /* CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET */
}
void radio_tx_power_max_set(void)
@@ -346,32 +331,17 @@ void radio_tx_power_max_set(void)
int8_t radio_tx_power_min_get(void)
{
return (int8_t)hal_radio_tx_power_min_get();
return hal_radio_tx_power_min_get();
}
int8_t radio_tx_power_max_get(void)
{
#if defined(CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET)
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
#else /* !CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET */
return (int8_t)hal_radio_tx_power_max_get();
#endif /* !CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET */
return hal_radio_tx_power_max_get();
}
int8_t radio_tx_power_floor(int8_t power)
{
#if defined(CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET)
/* NOTE: TXPOWER register only accepts upto 0dBm, +3dBm permitted by
* use of high voltage being set for radio when TXPOWER register is set.
*/
if (power >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
}
#endif /* CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET */
return (int8_t)hal_radio_tx_power_floor(power);
return hal_radio_tx_power_floor(power);
}
void radio_freq_chan_set(uint32_t chan)

View File

@@ -67,43 +67,77 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}
static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg30dBm;
return -30; /* -30 dBm */
}
static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_max_get(void)
{
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
return 4; /* +4 dBm */
}
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
if (tx_power_lvl >= 4) {
return 4;
}
if (tx_power_lvl >= 0) {
return 0;
}
if (tx_power_lvl >= -4) {
return -4;
}
if (tx_power_lvl >= -8) {
return -8;
}
if (tx_power_lvl >= -12) {
return -12;
}
if (tx_power_lvl >= -16) {
return -16;
}
if (tx_power_lvl >= -20) {
return -20;
}
/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= 4) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}

View File

@@ -255,51 +255,88 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}
static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
return -40; /* -40 dBm */
}
static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_max_get(void)
{
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
return 4; /* +4 dBm */
}
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
if (tx_power_lvl >= 4) {
return 4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
if (tx_power_lvl >= 3) {
return 3;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
return RADIO_TXPOWER_TXPOWER_0dBm;
if (tx_power_lvl >= 0) {
return 0;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
if (tx_power_lvl >= -4) {
return -4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
if (tx_power_lvl >= -8) {
return -8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
if (tx_power_lvl >= -12) {
return -12;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
if (tx_power_lvl >= -16) {
return -16;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
if (tx_power_lvl >= -20) {
return -20;
}
/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= 4) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
}
if (tx_power_lvl >= 3) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
}
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
}

View File

@@ -274,51 +274,88 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}
static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
return -40; /* -40 dBm */
}
static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_max_get(void)
{
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
return 4; /* +4 dBm */
}
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
if (tx_power_lvl >= 4) {
return 4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
if (tx_power_lvl >= 3) {
return 3;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
return RADIO_TXPOWER_TXPOWER_0dBm;
if (tx_power_lvl >= 0) {
return 0;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
if (tx_power_lvl >= -4) {
return -4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
if (tx_power_lvl >= -8) {
return -8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
if (tx_power_lvl >= -12) {
return -12;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
if (tx_power_lvl >= -16) {
return -16;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
if (tx_power_lvl >= -20) {
return -20;
}
/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= 4) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
}
if (tx_power_lvl >= 3) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
}
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
}

View File

@@ -444,51 +444,88 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}
static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
return -40; /* -40 dBm */
}
static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_max_get(void)
{
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
return 4; /* +4 dBm */
}
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
if (tx_power_lvl >= 4) {
return 4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
if (tx_power_lvl >= 3) {
return 3;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
return RADIO_TXPOWER_TXPOWER_0dBm;
if (tx_power_lvl >= 0) {
return 0;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
if (tx_power_lvl >= -4) {
return -4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
if (tx_power_lvl >= -8) {
return -8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
if (tx_power_lvl >= -12) {
return -12;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
if (tx_power_lvl >= -16) {
return -16;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
if (tx_power_lvl >= -20) {
return -20;
}
/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= 4) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
}
if (tx_power_lvl >= 3) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
}
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
}

View File

@@ -433,71 +433,128 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}
static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
return -40; /* -40 dBm */
}
static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_max_get(void)
{
return RADIO_TXPOWER_TXPOWER_Pos8dBm;
return 8; /* +8 dBm */
}
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos8dBm) {
return RADIO_TXPOWER_TXPOWER_Pos8dBm;
if (tx_power_lvl >= 8) {
return 8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos7dBm) {
return RADIO_TXPOWER_TXPOWER_Pos7dBm;
if (tx_power_lvl >= 7) {
return 7;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos6dBm) {
return RADIO_TXPOWER_TXPOWER_Pos6dBm;
if (tx_power_lvl >= 6) {
return 6;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos5dBm) {
return RADIO_TXPOWER_TXPOWER_Pos5dBm;
if (tx_power_lvl >= 5) {
return 5;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
if (tx_power_lvl >= 4) {
return 4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
if (tx_power_lvl >= 3) {
return 3;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos2dBm) {
return RADIO_TXPOWER_TXPOWER_Pos2dBm;
if (tx_power_lvl >= 2) {
return 2;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
return RADIO_TXPOWER_TXPOWER_0dBm;
if (tx_power_lvl >= 0) {
return 0;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
if (tx_power_lvl >= -4) {
return -4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
if (tx_power_lvl >= -8) {
return -8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
if (tx_power_lvl >= -12) {
return -12;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
if (tx_power_lvl >= -16) {
return -16;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
if (tx_power_lvl >= -20) {
return -20;
}
/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= 8) {
return RADIO_TXPOWER_TXPOWER_Pos8dBm;
}
if (tx_power_lvl >= 7) {
return RADIO_TXPOWER_TXPOWER_Pos7dBm;
}
if (tx_power_lvl >= 6) {
return RADIO_TXPOWER_TXPOWER_Pos6dBm;
}
if (tx_power_lvl >= 5) {
return RADIO_TXPOWER_TXPOWER_Pos5dBm;
}
if (tx_power_lvl >= 4) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
}
if (tx_power_lvl >= 3) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
}
if (tx_power_lvl >= 2) {
return RADIO_TXPOWER_TXPOWER_Pos2dBm;
}
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
}

View File

@@ -272,51 +272,88 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}
static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
return -40; /* -40 dBm */
}
static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_max_get(void)
{
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
return 4; /* +4 dBm */
}
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
if (tx_power_lvl >= 4) {
return 4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
if (tx_power_lvl >= 3) {
return 3;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
return RADIO_TXPOWER_TXPOWER_0dBm;
if (tx_power_lvl >= 0) {
return 0;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
if (tx_power_lvl >= -4) {
return -4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
if (tx_power_lvl >= -8) {
return -8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
if (tx_power_lvl >= -12) {
return -12;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
if (tx_power_lvl >= -16) {
return -16;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
if (tx_power_lvl >= -20) {
return -20;
}
/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= 4) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
}
if (tx_power_lvl >= 3) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
}
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
}

View File

@@ -443,71 +443,128 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}
static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
return -40; /* -40 dBm */
}
static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_max_get(void)
{
return RADIO_TXPOWER_TXPOWER_Pos8dBm;
return 8; /* +8 dBm */
}
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos8dBm) {
return RADIO_TXPOWER_TXPOWER_Pos8dBm;
if (tx_power_lvl >= 8) {
return 8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos7dBm) {
return RADIO_TXPOWER_TXPOWER_Pos7dBm;
if (tx_power_lvl >= 7) {
return 7;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos6dBm) {
return RADIO_TXPOWER_TXPOWER_Pos6dBm;
if (tx_power_lvl >= 6) {
return 6;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos5dBm) {
return RADIO_TXPOWER_TXPOWER_Pos5dBm;
if (tx_power_lvl >= 5) {
return 5;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
if (tx_power_lvl >= 4) {
return 4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
if (tx_power_lvl >= 3) {
return 3;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos2dBm) {
return RADIO_TXPOWER_TXPOWER_Pos2dBm;
if (tx_power_lvl >= 2) {
return 2;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
return RADIO_TXPOWER_TXPOWER_0dBm;
if (tx_power_lvl >= 0) {
return 0;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
if (tx_power_lvl >= -4) {
return -4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
if (tx_power_lvl >= -8) {
return -8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
if (tx_power_lvl >= -12) {
return -12;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
if (tx_power_lvl >= -16) {
return -16;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
if (tx_power_lvl >= -20) {
return -20;
}
/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= 8) {
return RADIO_TXPOWER_TXPOWER_Pos8dBm;
}
if (tx_power_lvl >= 7) {
return RADIO_TXPOWER_TXPOWER_Pos7dBm;
}
if (tx_power_lvl >= 6) {
return RADIO_TXPOWER_TXPOWER_Pos6dBm;
}
if (tx_power_lvl >= 5) {
return RADIO_TXPOWER_TXPOWER_Pos5dBm;
}
if (tx_power_lvl >= 4) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
}
if (tx_power_lvl >= 3) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
}
if (tx_power_lvl >= 2) {
return RADIO_TXPOWER_TXPOWER_Pos2dBm;
}
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
}

View File

@@ -457,71 +457,128 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}
static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
return -40; /* -40 dBm */
}
static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_max_get(void)
{
return RADIO_TXPOWER_TXPOWER_Pos8dBm;
return 8; /* +8 dBm */
}
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos8dBm) {
return RADIO_TXPOWER_TXPOWER_Pos8dBm;
if (tx_power_lvl >= 8) {
return 8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos7dBm) {
return RADIO_TXPOWER_TXPOWER_Pos7dBm;
if (tx_power_lvl >= 7) {
return 7;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos6dBm) {
return RADIO_TXPOWER_TXPOWER_Pos6dBm;
if (tx_power_lvl >= 6) {
return 6;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos5dBm) {
return RADIO_TXPOWER_TXPOWER_Pos5dBm;
if (tx_power_lvl >= 5) {
return 5;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
if (tx_power_lvl >= 4) {
return 4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
if (tx_power_lvl >= 3) {
return 3;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos2dBm) {
return RADIO_TXPOWER_TXPOWER_Pos2dBm;
if (tx_power_lvl >= 2) {
return 2;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
return RADIO_TXPOWER_TXPOWER_0dBm;
if (tx_power_lvl >= 0) {
return 0;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
if (tx_power_lvl >= -4) {
return -4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
if (tx_power_lvl >= -8) {
return -8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
if (tx_power_lvl >= -12) {
return -12;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
if (tx_power_lvl >= -16) {
return -16;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
if (tx_power_lvl >= -20) {
return -20;
}
/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= 8) {
return RADIO_TXPOWER_TXPOWER_Pos8dBm;
}
if (tx_power_lvl >= 7) {
return RADIO_TXPOWER_TXPOWER_Pos7dBm;
}
if (tx_power_lvl >= 6) {
return RADIO_TXPOWER_TXPOWER_Pos6dBm;
}
if (tx_power_lvl >= 5) {
return RADIO_TXPOWER_TXPOWER_Pos5dBm;
}
if (tx_power_lvl >= 4) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
}
if (tx_power_lvl >= 3) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
}
if (tx_power_lvl >= 2) {
return RADIO_TXPOWER_TXPOWER_Pos2dBm;
}
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
}

View File

@@ -357,13 +357,6 @@
#endif /* !CONFIG_BT_CTLR_TIFS_HW */
#endif /* !CONFIG_BT_CTLR_RADIO_ENABLE_FAST */
/* nRF5340 supports +3dBm Tx Power using high voltage request, define +3dBm
* value for Controller use.
*/
#ifndef RADIO_TXPOWER_TXPOWER_Pos3dBm
#define RADIO_TXPOWER_TXPOWER_Pos3dBm (0x03UL)
#endif
/* HAL abstraction of Radio bitfields */
#define HAL_NRF_RADIO_EVENT_END NRF_RADIO_EVENT_END
#define HAL_RADIO_EVENTS_END EVENTS_END
@@ -452,73 +445,130 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}
static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_max_get(void)
{
return RADIO_TXPOWER_TXPOWER_0dBm;
return 3; /* 3 dBm */
}
static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
return -40; /* -40 dBm */
}
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
return RADIO_TXPOWER_TXPOWER_0dBm;
if (tx_power_lvl >= 3) {
return 3;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg1dBm) {
return RADIO_TXPOWER_TXPOWER_Neg1dBm;
if (tx_power_lvl >= 0) {
return 0;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg2dBm) {
return RADIO_TXPOWER_TXPOWER_Neg2dBm;
if (tx_power_lvl >= -1) {
return -1;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg3dBm) {
return RADIO_TXPOWER_TXPOWER_Neg3dBm;
if (tx_power_lvl >= -2) {
return -2;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
if (tx_power_lvl >= -3) {
return -3;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg5dBm) {
return RADIO_TXPOWER_TXPOWER_Neg5dBm;
if (tx_power_lvl >= -4) {
return -4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg6dBm) {
return RADIO_TXPOWER_TXPOWER_Neg6dBm;
if (tx_power_lvl >= -5) {
return -5;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg7dBm) {
return RADIO_TXPOWER_TXPOWER_Neg7dBm;
if (tx_power_lvl >= -6) {
return -6;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
if (tx_power_lvl >= -7) {
return -7;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
if (tx_power_lvl >= -8) {
return -8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
if (tx_power_lvl >= -12) {
return -12;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
if (tx_power_lvl >= -16) {
return -16;
}
if (tx_power_lvl >= -20) {
return -20;
}
/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}
if (tx_power_lvl >= -1) {
return RADIO_TXPOWER_TXPOWER_Neg1dBm;
}
if (tx_power_lvl >= -2) {
return RADIO_TXPOWER_TXPOWER_Neg2dBm;
}
if (tx_power_lvl >= -3) {
return RADIO_TXPOWER_TXPOWER_Neg3dBm;
}
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}
if (tx_power_lvl >= -5) {
return RADIO_TXPOWER_TXPOWER_Neg5dBm;
}
if (tx_power_lvl >= -6) {
return RADIO_TXPOWER_TXPOWER_Neg6dBm;
}
if (tx_power_lvl >= -7) {
return RADIO_TXPOWER_TXPOWER_Neg7dBm;
}
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
}
static inline void hal_radio_tx_power_high_voltage_set(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
if (tx_power_lvl >= 3) {
nrf_vreqctrl_radio_high_voltage_set(NRF_VREQCTRL, true);
}
}

View File

@@ -5,63 +5,63 @@
*/
#if defined(CONFIG_BT_CTLR_TX_PWR_PLUS_10)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos10dBm
#define RADIO_TXP_DEFAULT (+10)
#elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_9)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos9dBm
#define RADIO_TXP_DEFAULT (+9)
#elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_8)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos8dBm
#define RADIO_TXP_DEFAULT (+8)
#elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_7)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos7dBm
#define RADIO_TXP_DEFAULT (+7)
#elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_6)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos6dBm
#define RADIO_TXP_DEFAULT (+6)
#elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_5)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos5dBm
#define RADIO_TXP_DEFAULT (+5)
#elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_4)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos4dBm
#define RADIO_TXP_DEFAULT (+4)
#elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_3)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos3dBm
#define RADIO_TXP_DEFAULT (+3)
#elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_2)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos2dBm
#define RADIO_TXP_DEFAULT (+2)
#elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_1)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos1dBm
#define RADIO_TXP_DEFAULT (+1)
#elif defined(CONFIG_BT_CTLR_TX_PWR_0)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_0dBm
#define RADIO_TXP_DEFAULT (0)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_1)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg1dBm
#define RADIO_TXP_DEFAULT (-1)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_2)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg2dBm
#define RADIO_TXP_DEFAULT (-2)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_3)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg3dBm
#define RADIO_TXP_DEFAULT (-3)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_4)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg4dBm
#define RADIO_TXP_DEFAULT (-4)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_5)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg5dBm
#define RADIO_TXP_DEFAULT (-5)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_6)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg6dBm
#define RADIO_TXP_DEFAULT (-6)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_7)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg7dBm
#define RADIO_TXP_DEFAULT (-7)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_8)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg8dBm
#define RADIO_TXP_DEFAULT (-8)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_9)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg9dBm
#define RADIO_TXP_DEFAULT (-9)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_10)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg10dBm
#define RADIO_TXP_DEFAULT (-10)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_12)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg12dBm
#define RADIO_TXP_DEFAULT (-12)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_14)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg14dBm
#define RADIO_TXP_DEFAULT (-14)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_16)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg16dBm
#define RADIO_TXP_DEFAULT (-16)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_20)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg20dBm
#define RADIO_TXP_DEFAULT (-20)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_26)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg26dBm
#define RADIO_TXP_DEFAULT (-26)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_30)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg30dBm
#define RADIO_TXP_DEFAULT (-30)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_40)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg40dBm
#define RADIO_TXP_DEFAULT (-40)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_46)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg46dBm
#define RADIO_TXP_DEFAULT (-46)
#elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_70)
#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg70dBm
#define RADIO_TXP_DEFAULT (-70)
#endif

View File

@@ -408,71 +408,128 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}
static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
return -40; /* -40 dBm */
}
static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_max_get(void)
{
return RADIO_TXPOWER_TXPOWER_Pos8dBm;
return 8; /* +8 dBm */
}
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos8dBm) {
return RADIO_TXPOWER_TXPOWER_Pos8dBm;
if (tx_power_lvl >= 8) {
return 8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos7dBm) {
return RADIO_TXPOWER_TXPOWER_Pos7dBm;
if (tx_power_lvl >= 7) {
return 7;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos6dBm) {
return RADIO_TXPOWER_TXPOWER_Pos6dBm;
if (tx_power_lvl >= 6) {
return 6;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos5dBm) {
return RADIO_TXPOWER_TXPOWER_Pos5dBm;
if (tx_power_lvl >= 5) {
return 5;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
if (tx_power_lvl >= 4) {
return 4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
if (tx_power_lvl >= 3) {
return 3;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos2dBm) {
return RADIO_TXPOWER_TXPOWER_Pos2dBm;
if (tx_power_lvl >= 2) {
return 2;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
return RADIO_TXPOWER_TXPOWER_0dBm;
if (tx_power_lvl >= 0) {
return 0;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
if (tx_power_lvl >= -4) {
return -4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
if (tx_power_lvl >= -8) {
return -8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
if (tx_power_lvl >= -12) {
return -12;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
if (tx_power_lvl >= -16) {
return -16;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
if (tx_power_lvl >= -20) {
return -20;
}
/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= 8) {
return RADIO_TXPOWER_TXPOWER_Pos8dBm;
}
if (tx_power_lvl >= 7) {
return RADIO_TXPOWER_TXPOWER_Pos7dBm;
}
if (tx_power_lvl >= 6) {
return RADIO_TXPOWER_TXPOWER_Pos6dBm;
}
if (tx_power_lvl >= 5) {
return RADIO_TXPOWER_TXPOWER_Pos5dBm;
}
if (tx_power_lvl >= 4) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
}
if (tx_power_lvl >= 3) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
}
if (tx_power_lvl >= 2) {
return RADIO_TXPOWER_TXPOWER_Pos2dBm;
}
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
}

View File

@@ -355,13 +355,6 @@
#endif /* !CONFIG_BT_CTLR_TIFS_HW */
#endif /* !CONFIG_BT_CTLR_RADIO_ENABLE_FAST */
/* nRF5340 supports +3dBm Tx Power using high voltage request, define +3dBm
* value for Controller use.
*/
#ifndef RADIO_TXPOWER_TXPOWER_Pos3dBm
#define RADIO_TXPOWER_TXPOWER_Pos3dBm (0x03UL)
#endif
/* HAL abstraction of Radio bitfields */
#define HAL_NRF_RADIO_EVENT_END NRF_RADIO_EVENT_END
#define HAL_RADIO_EVENTS_END EVENTS_END
@@ -432,73 +425,130 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}
static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_max_get(void)
{
return RADIO_TXPOWER_TXPOWER_0dBm;
return 3; /* 3 dBm */
}
static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
return -40; /* -40 dBm */
}
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
return RADIO_TXPOWER_TXPOWER_0dBm;
if (tx_power_lvl >= 3) {
return 3;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg1dBm) {
return RADIO_TXPOWER_TXPOWER_Neg1dBm;
if (tx_power_lvl >= 0) {
return 0;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg2dBm) {
return RADIO_TXPOWER_TXPOWER_Neg2dBm;
if (tx_power_lvl >= -1) {
return -1;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg3dBm) {
return RADIO_TXPOWER_TXPOWER_Neg3dBm;
if (tx_power_lvl >= -2) {
return -2;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
if (tx_power_lvl >= -3) {
return -3;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg5dBm) {
return RADIO_TXPOWER_TXPOWER_Neg5dBm;
if (tx_power_lvl >= -4) {
return -4;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg6dBm) {
return RADIO_TXPOWER_TXPOWER_Neg6dBm;
if (tx_power_lvl >= -5) {
return -5;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg7dBm) {
return RADIO_TXPOWER_TXPOWER_Neg7dBm;
if (tx_power_lvl >= -6) {
return -6;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
if (tx_power_lvl >= -7) {
return -7;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
if (tx_power_lvl >= -8) {
return -8;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
if (tx_power_lvl >= -12) {
return -12;
}
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
if (tx_power_lvl >= -16) {
return -16;
}
if (tx_power_lvl >= -20) {
return -20;
}
/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}
if (tx_power_lvl >= -1) {
return RADIO_TXPOWER_TXPOWER_Neg1dBm;
}
if (tx_power_lvl >= -2) {
return RADIO_TXPOWER_TXPOWER_Neg2dBm;
}
if (tx_power_lvl >= -3) {
return RADIO_TXPOWER_TXPOWER_Neg3dBm;
}
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}
if (tx_power_lvl >= -5) {
return RADIO_TXPOWER_TXPOWER_Neg5dBm;
}
if (tx_power_lvl >= -6) {
return RADIO_TXPOWER_TXPOWER_Neg6dBm;
}
if (tx_power_lvl >= -7) {
return RADIO_TXPOWER_TXPOWER_Neg7dBm;
}
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
}
static inline void hal_radio_tx_power_high_voltage_set(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
if (tx_power_lvl >= 3) {
nrf_vreqctrl_radio_high_voltage_set(NRF_VREQCTRL, true);
}
}

View File

@@ -1856,6 +1856,8 @@ static void le_frame_space_update_complete(struct net_buf *buf)
}
bt_conn_notify_frame_space_update_complete(conn, &params);
bt_conn_unref(conn);
}
#endif /* CONFIG_BT_FRAME_SPACE_UPDATE */

View File

@@ -11,6 +11,7 @@
#include <stdio.h>
#include <string.h>
#include <zephyr/logging/log.h>
#include <zephyr/devicetree.h>
#include <zephyr/dfu/mcuboot.h>
#include <zephyr/dfu/flash_img.h>
#include <zephyr/dfu/mcuboot.h>
@@ -23,11 +24,16 @@ LOG_MODULE_REGISTER(flash_img, CONFIG_IMG_MANAGER_LOG_LEVEL);
#include <bootutil/bootutil_public.h>
#endif
#define FIXED_PARTITION_GET_FLASH_NODE(node_id) \
COND_CODE_1(DT_NODE_HAS_COMPAT(DT_PARENT(node_id), fixed_subpartitions), \
(DT_PARENT(DT_GPARENT(node_id))), (DT_GPARENT(node_id)))
#define FIXED_PARTITION_IS_RUNNING_APP_PARTITION(label) \
DT_SAME_NODE(FIXED_PARTITION_GET_FLASH_NODE(DT_CHOSEN(zephyr_code_partition)), \
FIXED_PARTITION_GET_FLASH_NODE(DT_NODELABEL(label))) && \
(FIXED_PARTITION_OFFSET(label) <= CONFIG_FLASH_LOAD_OFFSET && \
FIXED_PARTITION_OFFSET(label) + FIXED_PARTITION_SIZE(label) > CONFIG_FLASH_LOAD_OFFSET)
#include <zephyr/devicetree.h>
#if defined(CONFIG_TRUSTED_EXECUTION_NONSECURE) && (CONFIG_TFM_MCUBOOT_IMAGE_NUMBER == 2)
#define UPLOAD_FLASH_AREA_LABEL slot1_ns_partition
#else

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2018-2021 mcumgr authors
* Copyright (c) 2022-2024 Nordic Semiconductor ASA
* Copyright (c) 2022-2025 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -48,7 +48,13 @@
to be able to figure out application running slot.
#endif
#define FIXED_PARTITION_GET_FLASH_NODE(node_id) \
COND_CODE_1(DT_NODE_HAS_COMPAT(DT_PARENT(node_id), fixed_subpartitions), \
(DT_PARENT(DT_GPARENT(node_id))), (DT_GPARENT(node_id)))
#define FIXED_PARTITION_IS_RUNNING_APP_PARTITION(label) \
DT_SAME_NODE(FIXED_PARTITION_GET_FLASH_NODE(DT_CHOSEN(zephyr_code_partition)), \
FIXED_PARTITION_GET_FLASH_NODE(DT_NODELABEL(label))) && \
(FIXED_PARTITION_OFFSET(label) <= CONFIG_FLASH_LOAD_OFFSET && \
FIXED_PARTITION_OFFSET(label) + FIXED_PARTITION_SIZE(label) > CONFIG_FLASH_LOAD_OFFSET)

View File

@@ -361,15 +361,13 @@ img_mgmt_state_any_pending(void)
int
img_mgmt_slot_in_use(int slot)
{
#if defined(CONFIG_MCUBOOT_BOOTLOADER_MODE_FIRMWARE_UPDATER)
return 0;
#else
int image = img_mgmt_slot_to_image(slot);
int active_slot = img_mgmt_active_slot(image);
#if !defined(CONFIG_MCUBOOT_BOOTLOADER_MODE_DIRECT_XIP) && \
!defined(CONFIG_MCUBOOT_BOOTLOADER_MODE_RAM_LOAD) && \
!defined(CONFIG_MCUBOOT_BOOTLOADER_MODE_RAM_LOAD_WITH_REVERT)
!defined(CONFIG_MCUBOOT_BOOTLOADER_MODE_RAM_LOAD_WITH_REVERT) && \
!defined(CONFIG_MCUBOOT_BOOTLOADER_MODE_FIRMWARE_UPDATER)
enum img_mgmt_next_boot_type type = NEXT_BOOT_TYPE_NORMAL;
int nbs = img_mgmt_get_next_boot_slot(image, &type);
@@ -391,7 +389,6 @@ img_mgmt_slot_in_use(int slot)
#endif
return (active_slot == slot);
#endif /* !defined(CONFIG_MCUBOOT_BOOTLOADER_MODE_FIRMWARE_UPDATER) */
}
/**

View File

@@ -18,6 +18,7 @@
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <zcbor_common.h>
#include <zcbor_encode.h>
@@ -117,8 +118,6 @@ struct datetime_parser {
#define RTC_DATETIME_MINUTE_MAX 59
#define RTC_DATETIME_SECOND_MIN 0
#define RTC_DATETIME_SECOND_MAX 59
#define RTC_DATETIME_MILLISECOND_MIN 0
#define RTC_DATETIME_MILLISECOND_MAX 999
/* Size used for datetime creation buffer */
#ifdef CONFIG_MCUMGR_GRP_OS_DATETIME_MS
@@ -129,7 +128,7 @@ struct datetime_parser {
/* Minimum/maximum size of a datetime string that a client can provide */
#define RTC_DATETIME_MIN_STRING_SIZE 19
#define RTC_DATETIME_MAX_STRING_SIZE 26
#define RTC_DATETIME_MAX_STRING_SIZE 31
#endif
/* Specifies what the "all" ('a') of info parameter shows */
@@ -969,7 +968,7 @@ static int os_mgmt_datetime_write(struct smp_streamer *ctxt)
bool ok = true;
char *pos;
char *new_pos;
char date_string[RTC_DATETIME_MAX_STRING_SIZE];
char date_string[RTC_DATETIME_MAX_STRING_SIZE + 1];
struct rtc_time new_time = {
.tm_wday = -1,
.tm_yday = -1,
@@ -1024,7 +1023,7 @@ static int os_mgmt_datetime_write(struct smp_streamer *ctxt)
if (zcbor_map_decode_bulk(zsd, datetime_decode, ARRAY_SIZE(datetime_decode), &decoded)) {
return MGMT_ERR_EINVAL;
} else if (datetime.len < RTC_DATETIME_MIN_STRING_SIZE ||
datetime.len >= RTC_DATETIME_MAX_STRING_SIZE) {
datetime.len > RTC_DATETIME_MAX_STRING_SIZE) {
return MGMT_ERR_EINVAL;
}
@@ -1060,16 +1059,20 @@ static int os_mgmt_datetime_write(struct smp_streamer *ctxt)
}
#ifdef CONFIG_MCUMGR_GRP_OS_DATETIME_MS
if (*(pos - 1) == '.' && *pos != '\0') {
/* Provided value has a ms value, extract it */
new_time.tm_nsec = strtol(pos, &new_pos, RTC_DATETIME_NUMERIC_BASE);
if (*(pos - 1) == '.') {
uint32_t msec = 0;
uint32_t mul = 100; /* first digit: 10^-1 second = 100 ms */
if (new_time.tm_nsec < RTC_DATETIME_MILLISECOND_MIN ||
new_time.tm_nsec > RTC_DATETIME_MILLISECOND_MAX) {
return MGMT_ERR_EINVAL;
/* Parse up to 3 fractional digits */
while (isdigit((unsigned char)*pos) && mul >= 1) {
msec += (uint32_t)(*pos - '0') * mul;
mul /= 10;
pos++;
}
new_time.tm_nsec *= RTC_DATETIME_MS_TO_NS;
/* "." without digits yields 0 µs */
new_time.tm_nsec = msec * RTC_DATETIME_MS_TO_NS;
}
#endif

View File

@@ -4758,10 +4758,16 @@ static void close_tcp_conn(struct tcp *conn, void *user_data)
return;
}
if (conn->state == TCP_CLOSED) {
return;
}
/* net_tcp_put() will handle decrementing refcount on stack's behalf */
if (net_context_get_state(context) != NET_CONTEXT_LISTENING) {
net_tcp_put(context, true);
} else {
k_mutex_lock(&conn->lock, K_FOREVER);
if (context->conn_handler) {
net_conn_unregister(context->conn_handler);
context->conn_handler = NULL;
@@ -4769,7 +4775,10 @@ static void close_tcp_conn(struct tcp *conn, void *user_data)
if (conn->accept_cb != NULL) {
conn->accept_cb(conn->context, NULL, 0, -ENETDOWN, context->user_data);
conn->accept_cb = NULL;
}
k_mutex_unlock(&conn->lock);
}
}

View File

@@ -297,7 +297,8 @@ static void ot_bbr_multicast_listener_handler(void *context,
}
}
} else {
struct net_route_entry_mcast *route_to_del = net_route_mcast_lookup(&recv_addr);
struct net_route_entry_mcast *route_to_del =
net_route_mcast_lookup_by_iface(&recv_addr, ot_context->iface);
struct net_if_mcast_addr *addr_to_del;
addr_to_del = net_if_ipv6_maddr_lookup(&recv_addr, &(ot_context->iface));
@@ -307,6 +308,8 @@ static void ot_bbr_multicast_listener_handler(void *context,
if (addr_to_del != NULL && net_if_ipv6_maddr_is_joined(addr_to_del)) {
net_if_ipv6_maddr_leave(ot_context->iface, addr_to_del);
net_if_ipv6_maddr_rm(ot_context->iface,
(const struct in6_addr *)&recv_addr);
}
}
}
@@ -325,6 +328,7 @@ void openthread_border_router_init(struct openthread_context *ot_ctx)
NET_EVENT_IPV4_ADDR_ADD);
net_mgmt_add_event_callback(&ail_net_event_ipv4_addr_cb);
#endif /* CONFIG_NET_IPV4 */
udp_plat_init_sockfd();
openthread_set_bbr_multicast_listener_cb(ot_bbr_multicast_listener_handler, (void *)ot_ctx);
(void)infra_if_start_icmp6_listener();
}

View File

@@ -486,7 +486,6 @@ int mdns_unpack_query_header(struct dns_msg_t *msg, uint16_t *src_id)
int dns_unpack_name(const uint8_t *msg, int maxlen, const uint8_t *src,
struct net_buf *buf, const uint8_t **eol)
{
int dest_size = net_buf_tailroom(buf);
const uint8_t *end_of_label = NULL;
const uint8_t *curr_src = src;
int loop_check = 0, len = -1;
@@ -525,6 +524,8 @@ int dns_unpack_name(const uint8_t *msg, int maxlen, const uint8_t *src,
return -EMSGSIZE;
}
} else {
size_t dest_size = net_buf_tailroom(buf);
/* Max label length is 64 bytes (because 2 bits are
* used for pointer)
*/
@@ -533,8 +534,7 @@ int dns_unpack_name(const uint8_t *msg, int maxlen, const uint8_t *src,
return -EMSGSIZE;
}
if (((buf->data + label_len + 1) >=
(buf->data + dest_size)) ||
if ((label_len + 1 >= dest_size) ||
((curr_src + label_len) >= (msg + maxlen))) {
return -EMSGSIZE;
}

View File

@@ -612,9 +612,14 @@ static int http_server_run(struct http_server_ctx *ctx)
continue;
}
/* Listening socket error, abort. */
LOG_ERR("Listening socket error, aborting.");
ret = -sock_error;
if (ret == -ENETDOWN) {
LOG_INF("Network is down");
} else {
LOG_ERR("Listening socket error, aborting. (%d)", ret);
}
goto closing;
}

View File

@@ -488,6 +488,11 @@ int zsock_accept_ctx(struct net_context *parent, struct sockaddr *addr,
return -1;
}
if (sock_is_error(parent)) {
errno = POINTER_TO_INT(parent->user_data);
return -1;
}
if (!sock_is_nonblock(parent)) {
k_timeout_t timeout = K_FOREVER;

View File

@@ -2,6 +2,7 @@
* Copyright (c) 2018 Intel Corporation.
* Copyright (c) 2021 Nordic Semiconductor ASA.
* Copyright (c) 2025 HubbleNetwork.
* Copyright (c) 2025 NXP.
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -159,16 +160,20 @@ static int get_sync_locked(const struct device *dev)
uint32_t flags = pm->base.flags;
if (pm->base.usage == 0) {
if (flags & BIT(PM_DEVICE_FLAG_PD_CLAIMED)) {
if ((flags & BIT(PM_DEVICE_FLAG_PD_CLAIMED)) == 0) {
const struct device *domain = PM_DOMAIN(&pm->base);
if (domain->pm_base->flags & BIT(PM_DEVICE_FLAG_ISR_SAFE)) {
ret = pm_device_runtime_get(domain);
if (ret < 0) {
return ret;
if (domain != NULL) {
if ((domain->pm_base->flags & BIT(PM_DEVICE_FLAG_ISR_SAFE)) != 0) {
ret = pm_device_runtime_get(domain);
if (ret < 0) {
return ret;
}
/* Power domain successfully claimed */
pm->base.flags |= BIT(PM_DEVICE_FLAG_PD_CLAIMED);
} else {
return -EWOULDBLOCK;
}
} else {
return -EWOULDBLOCK;
}
}
@@ -331,6 +336,7 @@ static int put_sync_locked(const struct device *dev)
if (domain->pm_base->flags & BIT(PM_DEVICE_FLAG_ISR_SAFE)) {
ret = put_sync_locked(domain);
pm->base.flags &= ~BIT(PM_DEVICE_FLAG_PD_CLAIMED);
} else {
ret = -EWOULDBLOCK;
}

View File

@@ -98,6 +98,15 @@ config SHELL_BACKEND_SERIAL_RX_RING_BUFFER_SIZE
escape sequences). However, if bulk data is transferred it may be
required to increase it.
config SHELL_BACKEND_SERIAL_NEEDS_LARGE_RING_BUFFER
bool
default y if SHELL_BACKEND_SERIAL_TX_RING_BUFFER_SIZE > $(INT16_MAX)
default y if SHELL_BACKEND_SERIAL_RX_RING_BUFFER_SIZE > $(INT16_MAX)
select RING_BUFFER_LARGE
help
This is a helper Kconfig to select RING_BUFFER_LARGE when the implementation
requires a ring buffer of > 32kB.
if SHELL_BACKEND_SERIAL_API_ASYNC
config SHELL_BACKEND_SERIAL_ASYNC_RX_TIMEOUT
@@ -322,6 +331,14 @@ config SHELL_MQTT_RX_BUF_SIZE
help
Buffer size for the MQTT data reception.
config SHELL_MQTT_NEEDS_LARGE_RING_BUFFER
bool
default y if SHELL_MQTT_RX_BUF_SIZE > $(INT16_MAX)
select RING_BUFFER_LARGE
help
This is a helper Kconfig to select RING_BUFFER_LARGE when the implementation
requires a ring buffer of > 32kB.
config SHELL_MQTT_TX_BUF_SIZE
int "TX buffer size"
range 32 $(UINT16_MAX)

View File

@@ -465,6 +465,7 @@ error:
static void telnet_server_cb(struct net_socket_service_event *evt)
{
int sock_error;
int ret;
socklen_t optlen = sizeof(int);
if (sh_telnet == NULL) {
@@ -475,7 +476,14 @@ static void telnet_server_cb(struct net_socket_service_event *evt)
(evt->event.revents & ZSOCK_POLLNVAL)) {
(void)zsock_getsockopt(evt->event.fd, SOL_SOCKET,
SO_ERROR, &sock_error, &optlen);
NET_ERR("Telnet socket %d error (%d)", evt->event.fd, sock_error);
ret = -sock_error;
if (ret == -ENETDOWN) {
LOG_INF("Network is down");
} else {
LOG_ERR("Telnet socket %d error (%d)", evt->event.fd, ret);
}
if (evt->event.fd == sh_telnet->fds[SOCK_ID_CLIENT].fd) {
telnet_end_client_connection();

View File

@@ -142,21 +142,66 @@ static const struct gpio_dt_spec cs_loopback_gpio =
GPIO_DT_SPEC_GET_OR(DT_PATH(zephyr_user), cs_loopback_gpios, {0});
static struct gpio_callback cs_cb_data;
atomic_t cs_count;
int cs_start;
static void spi_loopback_gpio_cs_loopback_prepare(void)
{
/* record start state of CS pin and reset edge counter */
cs_start = gpio_pin_get_dt(&cs_loopback_gpio);
atomic_set(&cs_count, 0);
}
/* valid expected triggers are 0, 1, or 2, and this function input is not validated */
static int spi_loopback_gpio_cs_loopback_check(int expected_triggers)
{
int actual_triggers = atomic_get(&cs_count);
/* 1 should mean CS is asserted, 0 not */
int cs_level = gpio_pin_get_dt(&cs_loopback_gpio);
if (actual_triggers != expected_triggers) {
TC_PRINT("Expected %d CS triggers, got %d", expected_triggers, actual_triggers);
/* putting this first simplifies a lot of the checks needed below */
if (actual_triggers > expected_triggers) {
goto error;
}
/* Case should not happen unless test is set up wrong */
if (actual_triggers == 0 && cs_level != cs_start) {
TC_PRINT("Got 0 triggers but CS changed, GPIO interrupt not working?");
return -1;
}
/* already handled error case for this */
if (expected_triggers == 0) {
return 0;
}
/* all the other cases should get at least one gpio callback */
if (actual_triggers == 0) {
goto error;
}
/* a lot of the following code for cases of expecting 1 and 2 is for
* handling race conditions due to gpio interrupt latency, where two edges can happen
* before the first one's interrupt is processed
*/
/* expected case is that cs level is opposite of start */
if ((expected_triggers == 1) && (cs_level == cs_start)) {
/* only possibly case at this point is that the CS triggered twice */
actual_triggers = 2;
goto error;
}
/* expected case is that cs level is same as start */
if ((expected_triggers == 2) && (cs_level != cs_start)) {
/* only possibly case at this point is that the CS triggered once */
actual_triggers = 1;
goto error;
}
return 0;
error:
TC_PRINT("Expected %d CS triggers, got %d", expected_triggers, actual_triggers);
return -1;
}
static void cs_callback(const struct device *port,
@@ -167,7 +212,6 @@ static void cs_callback(const struct device *port,
ARG_UNUSED(cb);
ARG_UNUSED(pins);
/* Give semaphore to indicate CS triggered */
atomic_inc(&cs_count);
}

View File

@@ -28,6 +28,7 @@ LOG_MODULE_REGISTER(net_test, CONFIG_DNS_RESOLVER_LOG_LEVEL);
#define NET_LOG_ENABLED 1
#include "net_private.h"
#include "dns_pack.h"
#if defined(CONFIG_DNS_RESOLVER_LOG_LEVEL_DBG)
#define DBG(fmt, ...) printk(fmt, ##__VA_ARGS__)
@@ -909,4 +910,143 @@ ZTEST(dns_resolve, test_dns_localhost_resolve_ipv6)
0, "not loopback address");
}
NET_BUF_POOL_DEFINE(test_dns_qname_pool, 2, CONFIG_DNS_RESOLVER_MAX_QUERY_LEN,
0, NULL);
ZTEST(dns_resolve, test_dns_unpack_name)
{
/* NULL string terminator serves a role of a final zero-length label */
static const uint8_t *test_records[] = {
/* example.com */
"\007example\003com",
/* www.zephyrproject.org */
"\003www\015zephyrproject\003org",
/* These records should barely fit (fills up the buffer size limit). */
"\077very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx"
"\077very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx"
"\077very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx"
"\076very_long_record_that_has_a_length_of_62_bytes_xxxxxxxxxxxxxxx",
};
static const uint8_t *expected_names[] = {
"example.com",
"www.zephyrproject.org",
"very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx."
"very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx."
"very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx."
"very_long_record_that_has_a_length_of_62_bytes_xxxxxxxxxxxxxxx",
};
struct net_buf *result;
int ret;
zassert_equal(CONFIG_DNS_RESOLVER_MAX_QUERY_LEN, 255, "Invalid test configuration");
for (int i = 0; i < ARRAY_SIZE(test_records); i++) {
const uint8_t *end_of_label = NULL;
result = net_buf_alloc(&test_dns_qname_pool, K_NO_WAIT);
zassert_not_null(result, "Failed to allocate buffer");
/* +1 to include NULL as terminating label */
ret = dns_unpack_name(test_records[i], strlen(test_records[i]) + 1,
test_records[i], result, &end_of_label);
zassert_equal(ret, strlen(expected_names[i]),
"Error parsing records (%d)", ret);
zassert_str_equal(expected_names[i], result->data,
"Parsed wrong name (%s)", result->data);
zassert_equal_ptr(test_records[i] + strlen(test_records[i]) + 1,
end_of_label, "Wrong end of label");
net_buf_unref(result);
}
}
ZTEST(dns_resolve, test_dns_unpack_name_with_pointer)
{
static const uint8_t test_records[] = {
/* www.example.com followed by ftp.example.com with pointer */
"\003www\007example\003com\000\003ftp\300\004" /* Last two bytes are pointer */
};
static const uint8_t *expected_names[] = {
"www.example.com",
"ftp.example.com",
};
const size_t offset_2nd_rec = 17;
const uint8_t *end_of_label = NULL;
struct net_buf *result;
int ret;
/* First name */
result = net_buf_alloc(&test_dns_qname_pool, K_NO_WAIT);
zassert_not_null(result, "Failed to allocate buffer");
ret = dns_unpack_name(test_records, sizeof(test_records),
test_records, result, &end_of_label);
zassert_equal(ret, strlen(expected_names[0]),
"Error parsing records (%d)", ret);
zassert_str_equal(expected_names[0], result->data,
"Parsed wrong name (%s)", result->data);
zassert_equal_ptr(test_records + offset_2nd_rec, end_of_label,
"Wrong end of label");
net_buf_unref(result);
/* Second name with a pointer within */
end_of_label = NULL;
result = net_buf_alloc(&test_dns_qname_pool, K_NO_WAIT);
zassert_not_null(result, "Failed to allocate buffer");
ret = dns_unpack_name(test_records, sizeof(test_records),
test_records + offset_2nd_rec, result, &end_of_label);
zassert_equal(ret, strlen(expected_names[1]),
"Error parsing records (%d)", ret);
zassert_str_equal(expected_names[1], result->data,
"Parsed wrong name (%s)", result->data);
/* -1 as end_of_label should point to the last byte in the buffer (pointer offset) */
zassert_equal_ptr(test_records + sizeof(test_records) - 1, end_of_label,
"Wrong end of label");
net_buf_unref(result);
}
ZTEST(dns_resolve, test_dns_unpack_name_overflow)
{
static const uint8_t *test_records[] = {
/* 4 records 63 bytes (252 bytes) + 3 bytes for dot separators,
* no space left for NULL terminator.
*/
"\077very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx"
"\077very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx"
"\077very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx"
"\077very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx",
/* 4 records fit (251 bytes), 4 bytes for dot separators, 5th one-byte
* record won't fit.
*/
"\077very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx"
"\077very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx"
"\077very_long_record_that_has_a_length_of_63_bytes_xxxxxxxxxxxxxxxx"
"\076very_long_record_that_has_a_length_of_62_bytes_xxxxxxxxxxxxxxx"
"\001x",
/* Single 64 byte record, that's forbidden (max record len is 63). */
"\100very_long_record_that_has_a_length_of_64_bytes_that_is_incorrect",
};
struct net_buf *result;
int ret;
zassert_equal(CONFIG_DNS_RESOLVER_MAX_QUERY_LEN, 255, "Invalid test configuration");
for (int i = 0; i < ARRAY_SIZE(test_records); i++) {
result = net_buf_alloc(&test_dns_qname_pool, K_NO_WAIT);
zassert_not_null(result, "Failed to allocate buffer");
/* +1 to include NULL as terminating label */
ret = dns_unpack_name(test_records[i], strlen(test_records[i]) + 1,
test_records[i], result, NULL);
zassert_equal(ret, -EMSGSIZE, "Name parsing should've failed");
net_buf_unref(result);
}
}
ZTEST_SUITE(dns_resolve, NULL, test_init, NULL, NULL, NULL);

View File

@@ -6,13 +6,20 @@
*/
#include <zephyr/ztest.h>
#include <zephyr/devicetree.h>
#include <zephyr/storage/flash_map.h>
#include <zephyr/dfu/flash_img.h>
#define SLOT0_PARTITION slot0_partition
#define SLOT1_PARTITION slot1_partition
#define FIXED_PARTITION_GET_FLASH_NODE(node_id) \
COND_CODE_1(DT_NODE_HAS_COMPAT(DT_PARENT(node_id), fixed_subpartitions), \
(DT_PARENT(DT_GPARENT(node_id))), (DT_GPARENT(node_id)))
#define FIXED_PARTITION_IS_RUNNING_APP_PARTITION(label) \
DT_SAME_NODE(FIXED_PARTITION_GET_FLASH_NODE(DT_CHOSEN(zephyr_code_partition)), \
FIXED_PARTITION_GET_FLASH_NODE(DT_NODELABEL(label))) && \
(FIXED_PARTITION_OFFSET(label) <= CONFIG_FLASH_LOAD_OFFSET && \
FIXED_PARTITION_OFFSET(label) + FIXED_PARTITION_SIZE(label) > CONFIG_FLASH_LOAD_OFFSET)

View File

@@ -0,0 +1,8 @@
# Copyright 2025 NXP
#
# SPDX-License-Identifier: Apache-2.0
source "Kconfig.zephyr"
config TEST_PM_DEVICE_ISR_SAFE
bool "Use ISR safe PM for the test"

View File

@@ -91,11 +91,14 @@ static int devb_pm_action(const struct device *dev,
}
PM_DEVICE_DT_DEFINE(TEST_DOMAIN, domain_pm_action);
PM_DEVICE_DT_DEFINE(TEST_DOMAIN, domain_pm_action,
COND_CODE_1(CONFIG_TEST_PM_DEVICE_ISR_SAFE, (PM_DEVICE_ISR_SAFE), (0)));
DEVICE_DT_DEFINE(TEST_DOMAIN, NULL, PM_DEVICE_DT_GET(TEST_DOMAIN),
NULL, NULL, POST_KERNEL, 10, NULL);
PM_DEVICE_DT_DEFINE(TEST_DEVA, deva_pm_action);
PM_DEVICE_DT_DEFINE(TEST_DEVA, deva_pm_action,
COND_CODE_1(CONFIG_TEST_PM_DEVICE_ISR_SAFE, (PM_DEVICE_ISR_SAFE), (0)));
DEVICE_DT_DEFINE(TEST_DEVA, NULL, PM_DEVICE_DT_GET(TEST_DEVA),
NULL, NULL, POST_KERNEL, 20, NULL);
@@ -157,18 +160,22 @@ ZTEST(power_domain_1cpu, test_power_domain_device_runtime)
pm_device_state_get(deva, &state);
zassert_equal(state, PM_DEVICE_STATE_ACTIVE);
zassert_true(atomic_test_bit(&deva->pm_base->flags, PM_DEVICE_FLAG_PD_CLAIMED));
pm_device_state_get(domain, &state);
zassert_equal(state, PM_DEVICE_STATE_ACTIVE);
ret = pm_device_runtime_get(devc);
zassert_equal(ret, 0);
zassert_true(atomic_test_bit(&devc->pm_base->flags, PM_DEVICE_FLAG_PD_CLAIMED));
ret = pm_device_runtime_get(devb);
zassert_equal(ret, 0);
zassert_true(atomic_test_bit(&devb->pm_base->flags, PM_DEVICE_FLAG_PD_CLAIMED));
ret = pm_device_runtime_put(deva);
zassert_equal(ret, 0);
zassert_false(atomic_test_bit(&deva->pm_base->flags, PM_DEVICE_FLAG_PD_CLAIMED));
/*
* The domain has to still be active since device B
@@ -183,9 +190,11 @@ ZTEST(power_domain_1cpu, test_power_domain_device_runtime)
*/
ret = pm_device_runtime_put(devb);
zassert_equal(ret, 0);
zassert_false(atomic_test_bit(&devb->pm_base->flags, PM_DEVICE_FLAG_PD_CLAIMED));
ret = pm_device_runtime_put(devc);
zassert_equal(ret, 0);
zassert_false(atomic_test_bit(&devc->pm_base->flags, PM_DEVICE_FLAG_PD_CLAIMED));
pm_device_state_get(domain, &state);
zassert_equal(state, PM_DEVICE_STATE_SUSPENDED);

View File

@@ -5,3 +5,11 @@ tests:
integration_platforms:
- native_sim
tags: pm
pm.power_doamin.isr_safe:
platform_allow:
- native_sim
integration_platforms:
- native_sim
extra_configs:
- CONFIG_TEST_PM_DEVICE_ISR_SAFE=y
tags: pm

View File

@@ -144,7 +144,7 @@ manifest:
groups:
- fs
- name: hal_adi
revision: eeb155f7382343438114605963ae64436cc53434
revision: 4a189d5d2d20267084d9066cd0c4548dd730f809
path: modules/hal/adi
groups:
- hal