<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>nRF54L15 CPU idle thread hooks</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/119365/nrf54l15-cpu-idle-thread-hooks</link><description>Hi, 
 
 I would like to be able to hook into the system idle thread before/after the CPU is put to sleep to do some more custom power management things. Is there a way to do that easily (using NCS v2.9.0)? 
 For context, as a baseline I would like to</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 18 Mar 2025 13:56:37 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/119365/nrf54l15-cpu-idle-thread-hooks" /><item><title>RE: nRF54L15 CPU idle thread hooks</title><link>https://devzone.nordicsemi.com/thread/527863?ContentTypeID=1</link><pubDate>Tue, 18 Mar 2025 13:56:37 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:2835144a-1279-4e08-8e43-d2a55f3a6d43</guid><dc:creator>bryanv-firefly</dc:creator><description>&lt;p&gt;By sleep I mean system ON IDLE. I was able to achieve a solution/workaround by&amp;nbsp;patching&amp;nbsp;the upstream ncs v2.9.0. These changes dynamically disable the console UART after all logging has been sent over the interface. It also, &amp;quot;wakes up&amp;quot; the shell/UART interface to accept commands on RX activity, and the disables the UART when a inactivity timeout happens.&lt;/p&gt;
&lt;p&gt;Source modifications:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;diff --git a/subsys/shell/backends/Kconfig.backends b/subsys/shell/backends/Kconfig.backends&lt;/code&gt;&lt;br /&gt;&lt;code&gt;index 4524d03b9a4..1321f6453d1 100644&lt;/code&gt;&lt;br /&gt;&lt;code&gt;--- a/subsys/shell/backends/Kconfig.backends&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+++ b/subsys/shell/backends/Kconfig.backends&lt;/code&gt;&lt;br /&gt;&lt;code&gt;@@ -655,4 +655,23 @@ config SHELL_BACKEND_ADSP_MEMORY_WINDOW_POLL_INTERVAL&lt;/code&gt;&lt;br /&gt; &lt;br /&gt;&lt;code&gt; endif # SHELL_BACKEND_ADSP_MEMORY_WINDOW&lt;/code&gt;&lt;br /&gt; &lt;br /&gt;&lt;code&gt;+if SHELL&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+config SHELL_LOW_POWER&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ bool &amp;quot;Enable the low power shell support&amp;quot;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ depends on DT_HAS_SERIAL_WAKEUP_ENABLED&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ select PM_DEVICE&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ default n&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ help&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ Enable the low power shell support.&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+config SHELL_RX_INACTIVITY_TIMEOUT&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ int &amp;quot;RX inactivity timeout&amp;quot;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ depends on SHELL_LOW_POWER&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ default 30&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ help&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ RX inactivity timeout (in seconds).&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+endif&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt; endif # SHELL_BACKENDS&lt;/code&gt;&lt;br /&gt;&lt;code&gt;diff --git a/subsys/shell/backends/shell_uart.c b/subsys/shell/backends/shell_uart.c&lt;/code&gt;&lt;br /&gt;&lt;code&gt;index 1d19ce19a31..0b1ee06e0af 100644&lt;/code&gt;&lt;br /&gt;&lt;code&gt;--- a/subsys/shell/backends/shell_uart.c&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+++ b/subsys/shell/backends/shell_uart.c&lt;/code&gt;&lt;br /&gt;&lt;code&gt;@@ -14,6 +14,9 @@&lt;/code&gt;&lt;br /&gt;&lt;code&gt; #include &amp;lt;zephyr/logging/log.h&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt; #include &amp;lt;zephyr/net_buf.h&amp;gt;&lt;/code&gt;&lt;br /&gt; &lt;br /&gt;&lt;code&gt;+#include &amp;lt;zephyr/drivers/gpio.h&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+#include &amp;lt;zephyr/pm/device.h&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt; #define LOG_MODULE_NAME shell_uart&lt;/code&gt;&lt;br /&gt;&lt;code&gt; LOG_MODULE_REGISTER(shell_uart);&lt;/code&gt;&lt;br /&gt; &lt;br /&gt;&lt;code&gt;@@ -28,6 +31,62 @@ NET_BUF_POOL_DEFINE(smp_shell_rx_pool, CONFIG_MCUMGR_TRANSPORT_SHELL_RX_BUF_COUN&lt;/code&gt;&lt;br /&gt;&lt;code&gt; SMP_SHELL_RX_BUF_SIZE, 0, NULL);&lt;/code&gt;&lt;br /&gt;&lt;code&gt; #endif /* CONFIG_MCUMGR_TRANSPORT_SHELL */&lt;/code&gt;&lt;br /&gt; &lt;br /&gt;&lt;code&gt;+#ifdef CONFIG_SHELL_LOW_POWER&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+#define RX_INACTIVITY_EXPIRY (CONFIG_SHELL_RX_INACTIVITY_TIMEOUT * 1000)&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+static volatile bool rx_session_active = false;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+static struct gpio_callback rx_gpio_cb;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+static struct k_timer rx_inactivity_timer;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+static struct uart_config shell_uart_config;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+static int shell_power_up(const struct device *dev)&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+{&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ return pm_device_action_run(dev, PM_DEVICE_ACTION_RESUME);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+}&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+static void shell_rx_receieved(const struct device *dev, struct gpio_callback *cb, uint32_t pins)&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+{&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ const struct device *uart = DEVICE_DT_GET(DT_CHOSEN(zephyr_shell_uart));&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ rx_session_active = true;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ uart_configure(uart, &amp;amp;shell_uart_config);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ shell_power_up(uart);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ k_timer_start(&amp;amp;rx_inactivity_timer,&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ K_MSEC(RX_INACTIVITY_EXPIRY), K_NO_WAIT);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+}&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+static int shell_power_down(const struct device *dev)&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+{&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ const struct gpio_dt_spec rx_pin =&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ GPIO_DT_SPEC_GET_OR(DT_NODELABEL(shell_rx), gpios, {0});&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ // We have the console enabled&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ if (rx_session_active) {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ return 0;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ int status = pm_device_action_run(dev, PM_DEVICE_ACTION_SUSPEND);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ // Configure RX pin as an interrupt&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ gpio_pin_configure_dt(&amp;amp;rx_pin, GPIO_INPUT);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ gpio_pin_interrupt_configure_dt(&amp;amp;rx_pin, GPIO_INT_EDGE_BOTH);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ gpio_init_callback(&amp;amp;rx_gpio_cb, shell_rx_receieved,&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ BIT(rx_pin.pin));&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ gpio_add_callback(rx_pin.port, &amp;amp;rx_gpio_cb);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ return status;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+}&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+static void rx_inactivity_expiry(struct k_timer *timer_id)&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+{&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ const struct device *dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_shell_uart));&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ rx_session_active = false;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ shell_power_down(dev);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+}&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+#endif&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt; static void async_callback(const struct device *dev, struct uart_event *evt, void *user_data)&lt;/code&gt;&lt;br /&gt;&lt;code&gt; {&lt;/code&gt;&lt;br /&gt;&lt;code&gt; struct shell_uart_async *sh_uart = (struct shell_uart_async *)user_data;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;@@ -181,6 +240,9 @@ static void uart_tx_handle(const struct device *dev, struct shell_uart_int_drive&lt;/code&gt;&lt;br /&gt;&lt;code&gt; if (len) {&lt;/code&gt;&lt;br /&gt;&lt;code&gt; int err;&lt;/code&gt;&lt;br /&gt; &lt;br /&gt;&lt;code&gt;+#ifdef CONFIG_SHELL_LOW_POWER&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ shell_power_up(dev);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+#endif&lt;/code&gt;&lt;br /&gt;&lt;code&gt; len = uart_fifo_fill(dev, data, len);&lt;/code&gt;&lt;br /&gt;&lt;code&gt; err = ring_buf_get_finish(&amp;amp;sh_uart-&amp;gt;tx_ringbuf, len);&lt;/code&gt;&lt;br /&gt;&lt;code&gt; __ASSERT_NO_MSG(err == 0);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;@@ -188,6 +250,9 @@ static void uart_tx_handle(const struct device *dev, struct shell_uart_int_drive&lt;/code&gt;&lt;br /&gt;&lt;code&gt; } else {&lt;/code&gt;&lt;br /&gt;&lt;code&gt; uart_irq_tx_disable(dev);&lt;/code&gt;&lt;br /&gt;&lt;code&gt; sh_uart-&amp;gt;tx_busy = 0;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+#ifdef CONFIG_SHELL_LOW_POWER&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ shell_power_down(dev);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+#endif&lt;/code&gt;&lt;br /&gt;&lt;code&gt; }&lt;/code&gt;&lt;br /&gt; &lt;br /&gt;&lt;code&gt; sh_uart-&amp;gt;common.handler(SHELL_TRANSPORT_EVT_TX_RDY, sh_uart-&amp;gt;common.context);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;@@ -551,6 +616,12 @@ static int enable_shell_uart(void)&lt;/code&gt;&lt;br /&gt; &lt;br /&gt;&lt;code&gt; shell_init(&amp;amp;shell_uart, dev, cfg_flags, log_backend, level);&lt;/code&gt;&lt;br /&gt; &lt;br /&gt;&lt;code&gt;+#ifdef CONFIG_SHELL_LOW_POWER&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ uart_config_get(dev, &amp;amp;shell_uart_config);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ k_timer_init(&amp;amp;rx_inactivity_timer, rx_inactivity_expiry, NULL);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+ shell_power_down(dev);&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+#endif&lt;/code&gt;&lt;br /&gt;&lt;code&gt;+&lt;/code&gt;&lt;br /&gt;&lt;code&gt; return 0;&lt;/code&gt;&lt;br /&gt;&lt;code&gt; }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Defined a new device tree binding for the RX pin (this may be unnecessary):&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;GPIO (RX) pin to enable the serial console to remain active&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;compatible&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&amp;quot;serial-wakeup&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;properties&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; gpios&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;phandle-array&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; The GPIO (RX) pin to wake up the serial interface.&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And corresponding overlay:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;code&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; shell_rx:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;shell_rx&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; status&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;okay&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; compatible&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;serial-wakeup&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gpios&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;gpio0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GPIO_ACTIVE_LOW&lt;/span&gt;&lt;span&gt;&amp;gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; };&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;There is probably a more robust way of doing this at a lower layer, but this works for my purposes. Hopefully, this helps someone would hopes to achieve similar.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF54L15 CPU idle thread hooks</title><link>https://devzone.nordicsemi.com/thread/527774?ContentTypeID=1</link><pubDate>Tue, 18 Mar 2025 08:27:29 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:450d3c86-df6f-40a1-b1c8-ec5038c791fa</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;Using logging while awake will also increase your current consumption, and particularly if your device is battery operated, I guess this is something that you don&amp;#39;t want. The UART in itself also generates events when it is done processing the logs, which will again wake the device.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Can you please specify what you mean by sleep? Do you mean the System On Mode (light sleep) that occurs every time you you use e.g. k_sleep(), which will occur between the connection events (the events that occurs every connection interval), and between every advertisement? Or do you mean System Off Mode, which will occur only if you call&amp;nbsp;sys_poweroff() or&amp;nbsp;nrf_power_system_off(), going into the lowest power state, where it can only be woken up by an external interrupt.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF54L15 CPU idle thread hooks</title><link>https://devzone.nordicsemi.com/thread/526560?ContentTypeID=1</link><pubDate>Mon, 10 Mar 2025 13:29:41 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:0f6528d6-2c1b-4a4a-9990-2e2a0e3666b8</guid><dc:creator>bryanv-firefly</dc:creator><description>&lt;p&gt;I think I tend to disagree. Console logging from my experience is very useful for the QA and debug processes, and if we have them enabled for dev and QA process only, and then release a version of the code that has them disabled, we haven&amp;#39;t confidently validated that exact binary image which will be deployed to production/the field.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The real show stopper for me is not having that capability in our QA process. Detecting and root causing bugs becomes significantly more difficult with no logging available and will likely slow down the way we can iterate as we&amp;#39;re trying to release a version of firmware.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This is a type of functionality I have accomplished many times (although outside of Zephyr and the ncs framework), so I know it&amp;#39;s possible, but I&amp;#39;d rather avoid having the modify the kernel code to put the appropriate hooks into place to accomplish.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF54L15 CPU idle thread hooks</title><link>https://devzone.nordicsemi.com/thread/525076?ContentTypeID=1</link><pubDate>Thu, 27 Feb 2025 13:45:17 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:513ace45-aec8-43c4-957e-1217ca682381</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I don&amp;#39;t think it makes sense to enable and disable logging like that, when going in and out of sleep. Besides, you would typically enable logs only while developing, and turn it off before going into production, so it wouldn&amp;#39;t affect the current consumption.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I suspect we are looking at an XY problem. What is it that makes you want to turn off logging before going to sleep in the first place? Why do you not just turn it off when you want to do your measurements, and turn it back on later?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>