<?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>Nordic Q&amp;amp;A - Recent Threads</title><link>https://devzone.nordicsemi.com/f/nordic-q-a</link><description>Nordic Tech Support - private tickets and public Q&amp;amp;A</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Wed, 09 Sep 2026 07:08:14 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a" /><item><title>nRF5 SDK 17.1.0: Numeric Comparison pairing dialog on phone fails to dismiss after peripheral rejects pairing</title><link>https://devzone.nordicsemi.com/thread/129130?ContentTypeID=0</link><pubDate>Wed, 09 Sep 2026 07:08:14 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:6075151c-e456-4ba4-8c2e-1bc40abb941d</guid><dc:creator>David Duan</dc:creator><slash:comments>0</slash:comments><comments>https://devzone.nordicsemi.com/thread/129130?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129130/nrf5-sdk-17-1-0-numeric-comparison-pairing-dialog-on-phone-fails-to-dismiss-after-peripheral-rejects-pairing/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi DevZone,&lt;/p&gt;
&lt;p&gt;My customer is using &lt;strong&gt;nRF5 SDK v17.1.0&lt;/strong&gt; with &lt;strong&gt;LESC Numeric Comparison&lt;/strong&gt; pairing. They have encountered an issue during the pairing process: when the central (phone) initiates pairing, the&lt;/p&gt;
&lt;p&gt;peripheral correctly displays the passkey. However, if the pairing request is rejected on the peripheral side, the pairing dialog box on the central side does not disappear. According to the&lt;/p&gt;
&lt;p&gt;customer, BLE chips from other vendors do not exhibit this behavior.&lt;/p&gt;
&lt;p&gt;I replicated and tested this issue using a standard &lt;strong&gt;nRF5 SDK v17.1.0&lt;/strong&gt; example on an &lt;strong&gt;nRF52832 DK&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The results confirmed that when the peripheral rejects the pairing, the pairing dialog box on the phone remains visible. Interestingly, when I ran the same test using &lt;strong&gt;NCS 3.4&lt;/strong&gt;, the pairing dialog dismissed normally as expected.&lt;/p&gt;
&lt;p&gt;After further investigation, I noticed that in NCS, if the peripheral rejects the pairing, it explicitly sends an &lt;strong&gt;SMP Pairing Failed&lt;/strong&gt; packet. However, in the nRF5 SDK, even though the corresponding code logic triggers &lt;code dir="ltr"&gt;key_type = BLE_GAP_AUTH_KEY_TYPE_NONE&lt;/code&gt;, the device does not actually send the &lt;strong&gt;SMP Pairing Failed (Reason: 0x04 - Confirm Value Failed)&lt;/strong&gt; command.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;static ret_code_t num_comp_reply(uint16_t conn_handle, bool accept)
{
    uint8_t    key_type;
    ret_code_t err_code;

    if (accept)
    {
        NRF_LOG_INFO(&amp;quot;Numeric match confirmed. Conn handle: %d&amp;quot;, conn_handle);
        key_type = BLE_GAP_AUTH_KEY_TYPE_PASSKEY;
    }
    else
    {
        NRF_LOG_INFO(&amp;quot;Numeric match rejected. Conn handle: %d&amp;quot;, conn_handle);
        key_type = BLE_GAP_AUTH_KEY_TYPE_NONE;

        // Must be set before the reply: replying with BLE_GAP_AUTH_KEY_TYPE_NONE makes the
        // SoftDevice send an SMP Pairing Failed PDU (Numeric Comparison Failed) and raise
        // BLE_GAP_EVT_AUTH_STATUS, which in turn produces PM_EVT_CONN_SEC_FAILED.
        m_num_comp_rejected_locally = true;
    }

    err_code = sd_ble_gap_auth_key_reply(conn_handle, key_type, NULL);

    // Do NOT use APP_ERROR_CHECK() here: a failure must stay visible instead of
    // resetting the chip, because on an error nothing is transmitted and the SMP
    // request is still pending.
    if (err_code == NRF_SUCCESS)
    {
        NRF_LOG_INFO(&amp;quot;sd_ble_gap_auth_key_reply(key_type=%d) OK&amp;quot;, key_type);
    }
    else
    {
        m_num_comp_rejected_locally = false;
        NRF_LOG_ERROR(&amp;quot;sd_ble_gap_auth_key_reply(key_type=%d) failed: 0x%x (%s)&amp;quot;,
                      key_type, err_code, nrf_log_push((char *)nrf_strerror_get(err_code)));
        NRF_LOG_ERROR(&amp;quot;Nothing was sent on air; the SMP request is still pending.&amp;quot;);
        printf(&amp;quot;\r\nauth_key_reply failed: 0x%lx\r\n&amp;quot;, (unsigned long)err_code);
    }

    return err_code;
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NCS 3.4 Test Result:&lt;/strong&gt; When the peripheral rejects the pairing request, the pairing dialog box on the phone disappears normally.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/NCS_5F00_SDK_5F00_V1.mp4"&gt;devzone.nordicsemi.com/.../NCS_5F00_SDK_5F00_V1.mp4&lt;/a&gt;&lt;span&gt;&lt;strong&gt;nRF5 SDK 17.10 Test Result:&lt;/strong&gt; When the peripheral rejects the pairing request, the pairing dialog box on the phone fails to disappear.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href="https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/NRF5_5F00_SDK_5F00_V1.mp4"&gt;devzone.nordicsemi.com/.../NRF5_5F00_SDK_5F00_V1.mp4&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The test project for NRF5 SDK(nrf5sdk 17.10,SEGGER Embedded Studio for ARM v5.68)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/ble_5F00_app_5F00_uart_5F00_tst.7z"&gt;devzone.nordicsemi.com/.../ble_5F00_app_5F00_uart_5F00_tst.7z&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The test project on NCS3.4.0&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/peripheral_5F00_lesc.7z"&gt;devzone.nordicsemi.com/.../peripheral_5F00_lesc.7z&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="background-color:rgba(255, 255, 0, 1);"&gt;Question:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="background-color:rgba(255, 255, 0, 1);"&gt;I would like to confirm whether the nRF5 SDK SoftDevice itself inherently does not support sending this SMP Pairing Failed command in this scenario?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;div&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>nRF52840: QSPI pin configuration confirmation</title><link>https://devzone.nordicsemi.com/thread/129129?ContentTypeID=0</link><pubDate>Wed, 09 Sep 2026 06:43:23 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:9090a0e9-4e93-4608-bbc2-5b2e8770a79d</guid><dc:creator>Kaushik Thumar</dc:creator><slash:comments>0</slash:comments><comments>https://devzone.nordicsemi.com/thread/129129?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129129/nrf52840-qspi-pin-configuration-confirmation/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi Team,&lt;/p&gt;
&lt;p&gt;We are planning to use the following nRF52840 GPIOs for our current SPI interface, with the intention of migrating to QSPI in the future:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;CSn:&lt;/b&gt; P0.08&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;CLK:&lt;/b&gt; P0.16&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;IO0 / MOSI:&lt;/b&gt; P0.15&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;IO1 / MISO:&lt;/b&gt; P1.08&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;IO2 / WPn:&lt;/b&gt; P0.04&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;IO3 / RESETn:&lt;/b&gt; P0.05&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Could you please confirm if there are any restrictions when using these specific pins for standard SPI and subsequently QSPI?&lt;/p&gt;
&lt;p&gt;Additionally, since the Nordic reference design recommends different default pins for QSPI, will using our custom pin assignment cause any side effects—such as limitations on maximum clock speed, potential RF/OTA degradation, or anything else?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thanks and regards,&lt;/p&gt;
&lt;p&gt;Kaushik Thumar&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Cannot get whitelisted for ant-nrfconnect/sdk-ant github repository</title><link>https://devzone.nordicsemi.com/thread/129128?ContentTypeID=0</link><pubDate>Wed, 09 Sep 2026 06:34:39 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:967674e9-3132-44bc-b7fa-9856d510472c</guid><dc:creator>Arthur C</dc:creator><slash:comments>0</slash:comments><comments>https://devzone.nordicsemi.com/thread/129128?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129128/cannot-get-whitelisted-for-ant-nrfconnect-sdk-ant-github-repository/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hello, since thisisant.com is no more, the process to get whitelisted for the&amp;nbsp;&lt;em&gt;ant-nrfconnect/sdk-ant github&lt;/em&gt; repository through the ANT Adopter process does not work. I have tried both using the Visual Studio nrf Connect SDK and using the command line to add +ant to my SDK version manifest and `west update` with the same results.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I&amp;#39;m a hobbyist trying to do some data translation to expose to a Garmin GPS using an nrf52840 SoC.&lt;/p&gt;
&lt;p&gt;My github account is &lt;em&gt;dyniper&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thanks for helping with this.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Increased current consumption on nrf54l15 + s145</title><link>https://devzone.nordicsemi.com/thread/129127?ContentTypeID=0</link><pubDate>Wed, 09 Sep 2026 06:22:52 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:31701a1c-eafa-453b-8487-afe9fa3c1c13</guid><dc:creator>Maciej</dc:creator><slash:comments>0</slash:comments><comments>https://devzone.nordicsemi.com/thread/129127?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129127/increased-current-consumption-on-nrf54l15-s145/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi all,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#39;re building a PoC of a simple BLE device with a following setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;custom PCB with nrf54l15 rev2 and 32MHz oscillator&lt;/li&gt;
&lt;li&gt;FreeRTOS + custom port&lt;/li&gt;
&lt;li&gt;nrfx version 3.14.0&lt;/li&gt;
&lt;li&gt;softdevice s145 version 10.0.0&lt;/li&gt;
&lt;li&gt;our application layer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In order to handle the softdevice operation we&amp;#39;re using some of the modules from nRF5 SDK (like nrf_sdh, nrf_sdh_ble etc.).&lt;/p&gt;
&lt;p&gt;The baseline current consumption for now for most of the functionalities disabled and the mcu sleeping is 6uA. The moment the softdevice is enabled with&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;em&gt;nrf_clock_lf_cfg_t const clock_lf_cfg =&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&amp;nbsp; &amp;nbsp; {&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .source &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;nbsp; &amp;nbsp; &amp;nbsp;0,&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .rc_ctiv &amp;nbsp; &amp;nbsp; &amp;nbsp; =&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;32,&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .rc_temp_ctiv &amp;nbsp;= 2,&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .accuracy &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;nbsp; &amp;nbsp;1,&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .hfclk_latency = 1000,&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .hfint_ctiv &amp;nbsp; &amp;nbsp;=&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;8&lt;/span&gt;,&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&amp;nbsp; &amp;nbsp; };&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;em&gt;ret_code = sd_softdevice_enable(&amp;amp;clock_lf_cfg, app_error_fault_handler);&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;the current consumption increases to about 140uA and stays on this level&amp;nbsp;as long as the softdevice is enabled. The moment the softdevice is disabled with&amp;nbsp;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;em&gt;sd_softdevice_disable()&lt;/em&gt;&amp;nbsp;the level goes back to 6uA. That is the case even if no BLE functionalities are started.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;If the&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;em&gt;NRF_CLOCK.TASKS_XOSTOP&lt;/em&gt;&amp;nbsp;&lt;/span&gt;is triggered manually, the current level goes back to 6uA, but the softdevice stops working correctly.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;On initialization the&amp;nbsp;&lt;em&gt;nrf_oscillators_hfxo_cap_set&lt;/em&gt; is called.&lt;/div&gt;
&lt;div&gt;After a full power cycle the behaviour is the same.&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;For the builds with app protection off, if the device is reset by the debbuger - the moment the debugging session is closed and the debugger is disconnected, the current also goes back to 6uA even if the softdevice is still enabled (the debugging session is crucial not physically disconnecting the probe). After that, softdevice and the device itself are working correctly.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;Is the clock configuration wrong? Some peripherals are handled incorrectly?&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Regards,&lt;/div&gt;
&lt;div&gt;Maciej&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>nrf54LM20A SPI_MOSI pin not working</title><link>https://devzone.nordicsemi.com/thread/129126?ContentTypeID=0</link><pubDate>Tue, 08 Sep 2026 22:01:03 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:888aea8f-be98-4052-8163-7b7f5769bef8</guid><dc:creator>Fred F</dc:creator><slash:comments>1</slash:comments><comments>https://devzone.nordicsemi.com/thread/129126?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129126/nrf54lm20a-spi_mosi-pin-not-working/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;An SPI port is configured as a master, and all the signals seem to operate correctly except the SPI_MOSI.&lt;/p&gt;
&lt;p&gt;The configuration is shown below.&amp;nbsp; When the spi_transceive_dt() function is used, the CS and CLK likes operate as expected, but the MOSI line does not toggle.&amp;nbsp; There is data in the TX buffer that is non-zero and data is read on the MISO line.&amp;nbsp; Is there a configuration problem that is preventing the MOSI signal from working?&amp;nbsp; Checking the configuration register for SPI21, the MOSI pin selection looks correct (0x02);&lt;/p&gt;
&lt;div style="background-color:rgba(18, 19, 20, 1);color:rgba(187, 190, 191, 1);font-family:Consolas, &amp;#39;Courier New&amp;#39;, monospace;font-size:14px;font-weight:normal;line-height:19px;white-space:pre;"&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;spi21_default&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;: &lt;/span&gt;&lt;span style="color:rgba(78, 201, 176, 1);"&gt;spi21_default&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color:rgba(78, 201, 176, 1);"&gt;group1&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;psels&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &lt;/span&gt;&lt;span style="color:rgba(212, 212, 212, 1);"&gt;=&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &amp;lt;&lt;/span&gt;&lt;span style="color:rgba(86, 156, 214, 1);"&gt;NRF_PSEL&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;(&lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;SPIM_SCK&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;, &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;1&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;, &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;18&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;)&amp;gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:rgba(86, 156, 214, 1);"&gt;NRF_PSEL&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;(&lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;SPIM_MISO&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;, &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;3&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;, &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;7&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;)&amp;gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:rgba(86, 156, 214, 1);"&gt;NRF_PSEL&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;(&lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;SPIM_MOSI&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;, &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;0&lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;,&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;2&lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;)&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;spi21_sleep&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;: &lt;/span&gt;&lt;span style="color:rgba(78, 201, 176, 1);"&gt;spi21_sleep&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color:rgba(78, 201, 176, 1);"&gt;group1&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;psels&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &lt;/span&gt;&lt;span style="color:rgba(212, 212, 212, 1);"&gt;=&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &amp;lt;&lt;/span&gt;&lt;span style="color:rgba(86, 156, 214, 1);"&gt;NRF_PSEL&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;(&lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;SPIM_SCK&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;, &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;1&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;, &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;18&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;)&amp;gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:rgba(86, 156, 214, 1);"&gt;NRF_PSEL&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;(&lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;SPIM_MISO&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;, &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;3&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;, &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;7&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;)&amp;gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:rgba(86, 156, 214, 1);"&gt;NRF_PSEL&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;(&lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;SPIM_MOSI&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;, &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;0&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;, &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;2&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;)&amp;gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style="background-color:rgba(18, 19, 20, 1);color:rgba(187, 190, 191, 1);font-family:Consolas, &amp;#39;Courier New&amp;#39;, monospace;font-size:14px;font-weight:normal;line-height:19px;white-space:pre;"&gt;
&lt;div&gt;&lt;span style="color:rgba(212, 212, 212, 1);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:rgba(78, 201, 176, 1);"&gt;spi21&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:rgba(139, 148, 158, 1);"&gt; &amp;nbsp; compatible = &amp;quot;nordic,nrf-spim&amp;quot;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;status&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &lt;/span&gt;&lt;span style="color:rgba(212, 212, 212, 1);"&gt;=&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &lt;/span&gt;&lt;span style="color:rgba(165, 214, 255, 1);"&gt;&amp;quot;okay&amp;quot;&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;cs-gpios&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &lt;/span&gt;&lt;span style="color:rgba(212, 212, 212, 1);"&gt;=&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:rgba(212, 212, 212, 1);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:rgba(78, 201, 176, 1);"&gt;gpio1&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &lt;/span&gt;&lt;span style="color:rgba(181, 206, 168, 1);"&gt;19&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &lt;/span&gt;&lt;span style="color:rgba(86, 156, 214, 1);"&gt;GPIO_ACTIVE_LOW&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;gt;; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color:rgba(201, 209, 217, 1);"&gt;pinctrl-0&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &lt;/span&gt;&lt;span style="color:rgba(212, 212, 212, 1);"&gt;=&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt; &amp;lt;&lt;/span&gt;&lt;span style="color:rgba(212, 212, 212, 1);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:rgba(78, 201, 176, 1);"&gt;spi21_default&lt;/span&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:rgba(139, 148, 158, 1);"&gt; &amp;nbsp; pinctrl-1 = &amp;lt;&amp;amp;spi21_sleep&amp;gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:rgba(139, 148, 158, 1);"&gt; &amp;nbsp; pinctrl-names = &amp;quot;default&amp;quot;, &amp;quot;sleep&amp;quot;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(139, 148, 158, 1);"&gt; &amp;nbsp; &amp;nbsp;w5500device: w5500device@0 {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(139, 148, 158, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; compatible = &amp;quot;vnd,spi-device&amp;quot;; &amp;nbsp; // raw/manual SPI access&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(139, 148, 158, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reg = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(139, 148, 158, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; spi-max-frequency = &amp;lt;4000000&amp;gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(139, 148, 158, 1);"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:rgba(187, 190, 191, 1);"&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Problems flashing non-secure apps to nrf7002dk</title><link>https://devzone.nordicsemi.com/thread/129125?ContentTypeID=0</link><pubDate>Tue, 08 Sep 2026 20:14:24 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:f751fbf9-3a8b-4ba1-ad32-bbc124dd2f88</guid><dc:creator>cshaw</dc:creator><slash:comments>0</slash:comments><comments>https://devzone.nordicsemi.com/thread/129125?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129125/problems-flashing-non-secure-apps-to-nrf7002dk/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I&amp;#39;m running into issues when specifying non-secure for the build target, even for the basic Blinky sample. I created a build configuration with the nRF Connect SDK v3.4.0 and nRF Connect SDK Toolchain v3.4.0. The board target I&amp;#39;m trying to use is nrf7002dk/nrf5340/cpuapp/ns. I&amp;#39;ve left all the other options blank/default. I don&amp;#39;t see any issues in the build output or flashing step that would indicate that the sample app would fail. Instead of a blinking LED, I only see the status LED lit up next to the IMCU.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Notably, flashing the exact same application as a secure app (nrf7002dk/nrf5340/cpuapp) works perfectly fine on this board, and I&amp;#39;m able to see the LED blink.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;VS Code and the related SDKs and utilities are installed in a Ubuntu 22.04 distrobox while the host OS is Fedora Silverblue. I&amp;#39;ve also tested in a devcontainer with the same build configuration, toolchain, and SDK and ran into the same issue with non-secure apps.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Build&lt;/strong&gt; &lt;strong&gt;output&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;*&amp;nbsp; Executing task: nRF Connect: Build configuration blinky/build for nrf7002dk/nrf5340/cpuapp/ns&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Building blinky&lt;br /&gt;west build --build-dir /var/home/cameronshaw/code/test-nrf/blinky/build /var/home/cameronshaw/code/test-nrf/blinky --pristine --board nrf7002dk/nrf5340/cpuapp/ns -- -DCONFIG_DEBUG_OPTIMIZATIONS=y -DCONFIG_DEBUG_THREAD_INFO=y&lt;br /&gt;&lt;br /&gt;-- west build: generating a build system&lt;br /&gt;Loading Zephyr module(s) (Zephyr base): sysbuild_default&lt;br /&gt;-- Found Python3: /var/home/cameronshaw/ncs/toolchains/fbf7391cab/usr/local/bin/python3.12 (found suitable version &amp;quot;3.12.4&amp;quot;, minimum required is &amp;quot;3.12&amp;quot;) found components: Interpreter&lt;br /&gt;-- Cache files will be written to: /var/home/cameronshaw/.cache/zephyr&lt;br /&gt;-- Found west (found suitable version &amp;quot;1.5.0&amp;quot;, minimum required is &amp;quot;0.14.0&amp;quot;)&lt;br /&gt;-- Board: nrf7002dk, qualifiers: nrf5340/cpuapp/ns&lt;br /&gt;Parsing /var/home/cameronshaw/ncs/v3.4.0/zephyr/share/sysbuild/Kconfig&lt;br /&gt;Loaded configuration &amp;#39;/var/home/cameronshaw/code/test-nrf/blinky/build/_sysbuild/empty.conf&amp;#39;&lt;br /&gt;Merged configuration &amp;#39;/var/home/cameronshaw/code/test-nrf/blinky/build/_sysbuild/empty.conf&amp;#39;&lt;br /&gt;Configuration saved to &amp;#39;/var/home/cameronshaw/code/test-nrf/blinky/build/zephyr/.config&amp;#39;&lt;br /&gt;Kconfig header saved to &amp;#39;/var/home/cameronshaw/code/test-nrf/blinky/build/_sysbuild/autoconf.h&amp;#39;&lt;br /&gt;--&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;****************************&lt;br /&gt;&amp;nbsp; &amp;nbsp;* Running CMake for blinky *&lt;br /&gt;&amp;nbsp; &amp;nbsp;****************************&lt;br /&gt;&lt;br /&gt;Loading Zephyr default modules (Zephyr base).&lt;br /&gt;-- Application: /var/home/cameronshaw/code/test-nrf/blinky&lt;br /&gt;-- CMake version: 4.2.1&lt;br /&gt;-- Found Python3: /var/home/cameronshaw/ncs/toolchains/fbf7391cab/usr/local/bin/python3.12 (found suitable version &amp;quot;3.12.4&amp;quot;, minimum required is &amp;quot;3.12&amp;quot;) found components: Interpreter&lt;br /&gt;-- Cache files will be written to: /var/home/cameronshaw/.cache/zephyr&lt;br /&gt;-- Zephyr version: 4.4.0 (/var/home/cameronshaw/ncs/v3.4.0/zephyr)&lt;br /&gt;-- Found west (found suitable version &amp;quot;1.5.0&amp;quot;, minimum required is &amp;quot;0.14.0&amp;quot;)&lt;br /&gt;-- Board: nrf7002dk, qualifiers: nrf5340/cpuapp/ns&lt;br /&gt;-- Found host-tools: zephyr 1.0.1 (/var/home/cameronshaw/ncs/toolchains/fbf7391cab/opt/zephyr-sdk)&lt;br /&gt;-- Found toolchain: zephyr 1.0.1 (/var/home/cameronshaw/ncs/toolchains/fbf7391cab/opt/zephyr-sdk)&lt;br /&gt;-- Found Dtc: /var/home/cameronshaw/ncs/toolchains/fbf7391cab/usr/bin/dtc (found suitable version &amp;quot;1.5.0&amp;quot;, minimum required is &amp;quot;1.4.6&amp;quot;)&lt;br /&gt;-- Found BOARD.dts: /var/home/cameronshaw/ncs/v3.4.0/zephyr/boards/nordic/nrf7002dk/nrf7002dk_nrf5340_cpuapp_ns.dts&lt;br /&gt;-- Generated zephyr.dts: /var/home/cameronshaw/code/test-nrf/blinky/build/blinky/zephyr/zephyr.dts&lt;br /&gt;-- Generated pickled edt: /var/home/cameronshaw/code/test-nrf/blinky/build/blinky/zephyr/edt.pickle&lt;br /&gt;-- Generated devicetree_generated.h: /var/home/cameronshaw/code/test-nrf/blinky/build/blinky/zephyr/include/generated/zephyr/devicetree_generated.h&lt;br /&gt;&lt;br /&gt;warning: Experimental symbol TFM_EXPERIMENTAL is enabled.&lt;br /&gt;&lt;br /&gt;Parsing /var/home/cameronshaw/ncs/v3.4.0/zephyr/Kconfig&lt;br /&gt;Loaded configuration &amp;#39;/var/home/cameronshaw/ncs/v3.4.0/zephyr/boards/nordic/nrf7002dk/nrf7002dk_nrf5340_cpuapp_ns_defconfig&amp;#39;&lt;br /&gt;Merged configuration &amp;#39;/var/home/cameronshaw/code/test-nrf/blinky/prj.conf&amp;#39;&lt;br /&gt;Merged configuration &amp;#39;/var/home/cameronshaw/code/test-nrf/blinky/build/blinky/zephyr/misc/generated/extra_kconfig_options.conf&amp;#39;&lt;br /&gt;Merged configuration &amp;#39;/var/home/cameronshaw/code/test-nrf/blinky/build/blinky/zephyr/.config.sysbuild&amp;#39;&lt;br /&gt;Configuration saved to &amp;#39;/var/home/cameronshaw/code/test-nrf/blinky/build/blinky/zephyr/.config&amp;#39;&lt;br /&gt;Kconfig header saved to &amp;#39;/var/home/cameronshaw/code/test-nrf/blinky/build/blinky/zephyr/include/generated/zephyr/autoconf.h&amp;#39;&lt;br /&gt;-- Found GnuLd: /var/home/cameronshaw/ncs/toolchains/fbf7391cab/opt/zephyr-sdk/gnu/arm-zephyr-eabi/arm-zephyr-eabi/bin/ld.bfd (found version &amp;quot;2.43.1&amp;quot;)&lt;br /&gt;-- The C compiler identification is GNU 14.3.0&lt;br /&gt;-- The CXX compiler identification is GNU 14.3.0&lt;br /&gt;-- The ASM compiler identification is GNU&lt;br /&gt;-- Found assembler: /var/home/cameronshaw/ncs/toolchains/fbf7391cab/opt/zephyr-sdk/gnu/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc&lt;br /&gt;-- Found Python3: /var/home/cameronshaw/ncs/toolchains/fbf7391cab/usr/local/bin/python3.12 (found version &amp;quot;3.12.4&amp;quot;) found components: Interpreter&lt;br /&gt;-- Could NOT find Threads (missing: Threads_FOUND)&amp;nbsp;&lt;br /&gt;-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS&lt;br /&gt;-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS - Success&lt;br /&gt;-- Using ccache: /var/home/cameronshaw/ncs/toolchains/fbf7391cab/usr/bin/ccache&lt;br /&gt;-- Found gen_kobject_list: /var/home/cameronshaw/ncs/v3.4.0/zephyr/scripts/build/gen_kobject_list.py&lt;br /&gt;-- Configuring done (6.4s)&lt;br /&gt;-- Generating done (0.3s)&lt;br /&gt;-- Build files have been written to: /var/home/cameronshaw/code/test-nrf/blinky/build/blinky&lt;br /&gt;-- Configuring done (9.4s)&lt;br /&gt;-- Generating done (0.0s)&lt;br /&gt;-- Build files have been written to: /var/home/cameronshaw/code/test-nrf/blinky/build&lt;br /&gt;-- west build: building application&lt;br /&gt;[1/263] Preparing syscall dependency handling&lt;br /&gt;&lt;br /&gt;[5/263] Generating include/generated/zephyr/version.h&lt;br /&gt;-- Zephyr version: 4.4.0 (/var/home/cameronshaw/ncs/v3.4.0/zephyr), build: ncs-v3.4.0&lt;br /&gt;[7/263] Generating ../../tfm/CMakeCache.txt&lt;br /&gt;-- Found Git: /var/home/cameronshaw/ncs/toolchains/fbf7391cab/usr/local/bin/git (found version &amp;quot;2.52.0&amp;quot;)&lt;br /&gt;-- The C compiler identification is GNU 14.3.0&lt;br /&gt;-- The CXX compiler identification is GNU 14.3.0&lt;br /&gt;-- The ASM compiler identification is GNU&lt;br /&gt;-- Found assembler: /var/home/cameronshaw/ncs/toolchains/fbf7391cab/opt/zephyr-sdk/gnu/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc&lt;br /&gt;-- Found Python3: /var/home/cameronshaw/ncs/toolchains/fbf7391cab/usr/local/bin/python3.12 (found version &amp;quot;3.12.4&amp;quot;) found components: Interpreter&lt;br /&gt;-- Found Python3: /var/home/cameronshaw/ncs/toolchains/fbf7391cab/usr/local/bin/python3.12 (found suitable version &amp;quot;3.12.4&amp;quot;, minimum required is &amp;quot;3.12&amp;quot;) found components: Interpreter&lt;br /&gt;-- Cache files will be written to: /var/home/cameronshaw/.cache/zephyr&lt;br /&gt;-- Found Python3: /var/home/cameronshaw/ncs/toolchains/fbf7391cab/usr/local/bin/python3.12 (found version &amp;quot;3.12.4&amp;quot;) found components: Interpreter&lt;br /&gt;CMake Warning (dev) at /var/home/cameronshaw/ncs/v3.4.0/nrf/modules/trusted-firmware-m/tfm_boards/nrf5340_cpuapp/CMakeLists.txt:21 (install):&lt;br /&gt;&amp;nbsp; Policy CMP0177 is not set: install() DESTINATION paths are normalized.&amp;nbsp; Run&lt;br /&gt;&amp;nbsp; &amp;quot;cmake --help-policy CMP0177&amp;quot; for policy details.&amp;nbsp; Use the cmake_policy&lt;br /&gt;&amp;nbsp; command to set the policy and suppress this warning.&lt;br /&gt;This warning is for project developers.&amp;nbsp; Use -Wno-dev to suppress it.&lt;br /&gt;&lt;br /&gt;-- Configuring done (0.7s)&lt;br /&gt;-- Generating done (0.1s)&lt;br /&gt;CMake Warning:&lt;br /&gt;&amp;nbsp; Manually-specified variables were not used by the project:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; QCBOR_PATH&lt;br /&gt;&amp;nbsp; &amp;nbsp; TFM_CREATE_SIGNING_LAYOUT_OBJECTS&lt;br /&gt;&amp;nbsp; &amp;nbsp; T_COSE_PATH&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-- Build files have been written to: /var/home/cameronshaw/code/test-nrf/blinky/build/blinky/tfm&lt;br /&gt;[193/195] Linking C executable bin/tfm_s.axf&lt;br /&gt;Memory region&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Used Size&amp;nbsp; Region Size&amp;nbsp; %age Used&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FLASH:&amp;nbsp; &amp;nbsp; &amp;nbsp; 130540 B&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;256 KB&amp;nbsp; &amp;nbsp; &amp;nbsp;49.80%&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RAM:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;50088 B&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;256 KB&amp;nbsp; &amp;nbsp; &amp;nbsp;19.11%&lt;br /&gt;[19/263] Performing install step for &amp;#39;tfm&amp;#39;&lt;br /&gt;-- Install configuration: &amp;quot;Debug&amp;quot;&lt;br /&gt;----- Installing platform NS -----&lt;br /&gt;[263/263] Linking C executable zephyr/zephyr.elf&lt;br /&gt;Memory region&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Used Size&amp;nbsp; Region Size&amp;nbsp; %age Used&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FLASH:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;31276 B&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;192 KB&amp;nbsp; &amp;nbsp; &amp;nbsp;15.91%&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RAM:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4776 B&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;192 KB&amp;nbsp; &amp;nbsp; &amp;nbsp; 2.43%&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IDT_LIST:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 B&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 32 KB&amp;nbsp; &amp;nbsp; &amp;nbsp; 0.00%&lt;br /&gt;Generating files from /var/home/cameronshaw/code/test-nrf/blinky/build/blinky/zephyr/zephyr.elf for board: nrf7002dk/nrf5340/cpuapp/ns&lt;br /&gt;[8/8] Completed &amp;#39;blinky&amp;#39;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Flash output:&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp; Executing task: nRF Connect: Flash: blinky/build&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Flashing build to nRF7002 DK&lt;br /&gt;west flash -d /var/home/cameronshaw/code/test-nrf/blinky/build --dev-id 001050700558&lt;br /&gt;&lt;br /&gt;-- west flash: rebuilding&lt;br /&gt;[0/3] Performing build step for &amp;#39;blinky&amp;#39;&lt;br /&gt;[0/16] Performing build step for &amp;#39;tfm&amp;#39;&lt;br /&gt;ninja: no work to do.&lt;br /&gt;[2/3] Performing install step for &amp;#39;tfm&amp;#39;&lt;br /&gt;-- Install configuration: &amp;quot;Debug&amp;quot;&lt;br /&gt;----- Installing platform NS -----&lt;br /&gt;[3/3] Completed &amp;#39;tfm&amp;#39;&lt;br /&gt;[2/3] No install step for &amp;#39;blinky&amp;#39;&lt;br /&gt;[3/3] Completed &amp;#39;blinky&amp;#39;&lt;br /&gt;-- west flash: using runner nrfutil&lt;br /&gt;-- runners.nrfutil: reset after flashing requested&lt;br /&gt;-- runners.nrfutil: Flashing file: /var/home/cameronshaw/code/test-nrf/blinky/build/blinky/zephyr/tfm_merged.hex&lt;br /&gt;-- runners.nrfutil: Connecting to probe&lt;br /&gt;-- runners.nrfutil: Erasing address ranges touched by firmware&lt;br /&gt;-- runners.nrfutil: Programming image&lt;br /&gt;-- runners.nrfutil: Verifying image&lt;br /&gt;-- runners.nrfutil: Reset&lt;br /&gt;-- runners.nrfutil: Board(s) with serial number(s) 1050700558 flashed successfully.&lt;br /&gt;&amp;nbsp;*&amp;nbsp; Terminal will be reused by tasks, press any key to close it.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>tcp sendmsg() EAGAIN handling</title><link>https://devzone.nordicsemi.com/thread/129124?ContentTypeID=0</link><pubDate>Tue, 08 Sep 2026 17:56:21 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:af3909ff-fefb-4d5f-96c7-3a384eedba95</guid><dc:creator>dpf</dc:creator><slash:comments>0</slash:comments><comments>https://devzone.nordicsemi.com/thread/129124?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129124/tcp-sendmsg-eagain-handling/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;we have a &amp;#39;long lived&amp;#39; tcp connection w/ regular data sends (1hz of 256 bytes for mqtt publishes) where sendmsg() sometimes returns&amp;nbsp;EAGAIN. when trying again it usually works but sometimes we get the poll() read event and this indicates that the peer reset the connection.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;i interpret this as there being an erro w/ the retry, an unexpected resend should be ok but only if it matches the previous send. are there conditions that the device-side where it could resend something different?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>tcp mss vs mtu</title><link>https://devzone.nordicsemi.com/thread/129123?ContentTypeID=0</link><pubDate>Tue, 08 Sep 2026 17:35:25 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:79f0f9ee-8be7-4e39-ba50-a99ce029cc2a</guid><dc:creator>dpf</dc:creator><slash:comments>0</slash:comments><comments>https://devzone.nordicsemi.com/thread/129123?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129123/tcp-mss-vs-mtu/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;our current network provider says that they have a restriction on their sim profile so that the mtu should be less than 1430. however things like pdn_dynamic_params_get() and at+cgcontrdp report differently (1500).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;however, when we make a tcp connection (w/ tls) we see the tcp max-segment-size option set w/ 708. my reading of this option means that the modem&amp;#39;s networking should restrict things so that it could have data outstanding but it&amp;#39;s going to be restricted so that it doesnt get out of hand. the interfaces to the network stack dont allow for querying this (eg, getsockopt()) so asking how this value is getting set?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>System clock stops permanently after a GRTC compare event is lost</title><link>https://devzone.nordicsemi.com/thread/129122?ContentTypeID=0</link><pubDate>Tue, 08 Sep 2026 16:14:56 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:dfc6c1f1-bbbe-444a-b822-4fbdffa713e3</guid><dc:creator>Samuel0123</dc:creator><slash:comments>0</slash:comments><comments>https://devzone.nordicsemi.com/thread/129122?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129122/system-clock-stops-permanently-after-a-grtc-compare-event-is-lost/rss?ContentTypeId=0</wfw:commentRss><description>&lt;h2&gt;&lt;/h2&gt;
&lt;h1&gt;nRF54L15: system clock stops permanently after a GRTC compare event is lost&lt;/h1&gt;
&lt;h2&gt;Disclaimer&lt;/h2&gt;
&lt;p&gt;Claude Code (Opus 5) was used to assist with this investigation and with the drafting of this report. The failure itself was found by the author, on our own hardware. Every register capture, code path and conclusion below has been manually reviewed and verified by the author.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Under sustained BLE traffic the Zephyr system tick stops permanently. Every kernel timeout then stalls forever while the GRTC SYSCOUNTER keeps running.&lt;/p&gt;
&lt;p&gt;We trace this to a race in the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;branch of&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_syscounter_cc_abs_set()&lt;/code&gt;. That branch clears&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;in order to discard a stale event from the previous CC value; if the newly programmed compare fires between the counter sample and the clear, the clear destroys the legitimate event along with the stale one. Nothing regenerates it, and the driver is never called again to rewrite the CC, so the stall is permanent.&lt;/p&gt;
&lt;p&gt;The state captured on the halted target is what identifies it:&lt;/p&gt;
&lt;table border="1" cellpadding="6" cellspacing="0"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Register&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CC[6].CCEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;the compare fired&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EVENTS_COMPARE[6]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;its event is nevertheless gone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INTEN2&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;bit 6&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;the interrupt was enabled the whole time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;We built a standalone reproducer, attached as&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;GRTC-CompareLoss-Reproduction.zip&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and described under&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="#standalone-reproduction"&gt;Standalone reproduction&lt;/a&gt;. It destroys COMPARE events inside&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_syscounter_cc_abs_set()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;on demand, on a private channel, with a control pass that differs only in the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;argument and loses nothing; it kills the Zephyr system tick through the ordinary timeout API, ending in the register signature above; and it measures the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;behaviour the diagnosis rests on directly, on hardware.&lt;/p&gt;
&lt;p&gt;Our fix, described under&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="#our-fix"&gt;Our fix&lt;/a&gt;, is in nrfx rather than in Zephyr: the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;branch now clears the event&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;before&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;arming the channel, the ordering nrfx&amp;#39;s own sibling entry point&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_syscounter_cc_absolute_set()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;already uses, so that no clear can follow the new CC going live and no event it generates can be destroyed. We are filing this because the code path is unchanged in Zephyr main and in nrfx 4.5.0, and because the fix belongs upstream rather than in every application&amp;#39;s patch directory.&lt;/p&gt;
&lt;h2&gt;Environment&lt;/h2&gt;
&lt;table border="1" cellpadding="6" cellspacing="0"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SoC&lt;/td&gt;
&lt;td&gt;nRF54L15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Board&lt;/td&gt;
&lt;td&gt;nRF54L15-DK (1.0.0, 2025.51)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SDK&lt;/td&gt;
&lt;td&gt;nRF Connect SDK v3.3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zephyr&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fd9204a02d5&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2026-04-20)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nrfx&lt;/td&gt;
&lt;td&gt;4.2.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Driver&lt;/td&gt;
&lt;td&gt;&lt;code&gt;drivers/timer/nrf_grtc_timer.c&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Relevant configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CONFIG_TICKLESS_KERNEL=y
CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=1000000
CONFIG_SYS_CLOCK_TICKS_PER_SEC=31250        # CYC_PER_TICK = 32
CONFIG_NRF_GRTC_START_SYSCOUNTER=y
CONFIG_NRF_GRTC_TIMER_AUTO_KEEP_ALIVE=y
CONFIG_NRF_GRTC_TIMER_SOURCE_LFXO=y
CONFIG_BT=y                                 # SoftDevice Controller, peripheral
CONFIG_MPSL=y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GRTC devicetree:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;grtc {
    owned-channels       = &amp;lt;0 1 2 3 4 5 6 7 8 9 10 11&amp;gt;;
    child-owned-channels = &amp;lt;3 4 7 8 9 10 11&amp;gt;;   /* 7-11 = MPSL */
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Allowed application channel mask is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;0x67&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;= {0,1,2,5,6}.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_flag32_alloc()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;returns the highest free bit, so the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;system clock owns channel 6&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;On secure cpuapp&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;GRTC_IRQ_GROUP = 2&lt;/code&gt;, so the relevant registers are&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;INTEN2&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;INTPEND2&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and the relevant per-domain register is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;SYSCOUNTER[2]&lt;/code&gt;. Zephyr uses IRQ 228 (&lt;code&gt;GRTC_2&lt;/code&gt;); MPSL uses IRQ 229 (&lt;code&gt;GRTC_3&lt;/code&gt;).&lt;/p&gt;
&lt;h2&gt;Symptom&lt;/h2&gt;
&lt;p&gt;After a period of BLE communication testing the device stops making forward progress. Breakpoints in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_timeout_handler()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;are never hit, while the GRTC SYSCOUNTER continues to increment. Halting the debugger always lands in the idle thread at&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;__WFI&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Frequency: roughly twice per hour of intensive BLE testing, with many connect/disconnect cycles. Observed onset times range from ~30 s to ~2 h of uptime.&lt;/p&gt;
&lt;p&gt;Because the CPU is asleep rather than spinning, a watchdog configured with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;WDT_OPT_PAUSE_IN_SLEEP&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;never fires either, so the failure presents as a completely silent, indefinite hang.&lt;/p&gt;
&lt;h2&gt;State captured at the hang&lt;/h2&gt;
&lt;p&gt;Two reproductions were captured, in separate runs. Note up front that they are&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;not&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;two views of one event: the driver statics below come only from run 1, and the CC/CCEN registers only from run 2.&lt;/p&gt;
&lt;h3&gt;Reproduction 1 — established that no software path had suppressed the interrupt&lt;/h3&gt;
&lt;table border="1" cellpadding="6" cellspacing="0"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU context&lt;/td&gt;
&lt;td&gt;idle thread at&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;__WFI&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;normal for&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;arch_cpu_idle()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PRIMASK&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;normal, set by&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;arch_cpu_idle()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;around WFI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BASEPRI&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;nothing masked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VECTACTIVE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;thread mode, not stuck in an ISR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ISER[7]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x30&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IRQ 228 and 229 both enabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ISPR[7]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x20&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;only IRQ 229 pending (MPSL, fires during the halt, benign)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INTEN2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x40&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;channel 6 interrupt&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;is&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;enabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INTPEND2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x00&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no compare event pending -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE[6] == 0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SYSCOUNTER&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1:0xD9DC3163&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;= 7,950,053,731 cycles ~= 2 h 12 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;nrf_grtc_timer.c&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;statics:&lt;/p&gt;
&lt;table border="1" cellpadding="6" cellspacing="0"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Static&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cc_value&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;57516636&lt;/td&gt;
&lt;td&gt;=&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;0x036DA25C&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;expired_cc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;57516538&lt;/td&gt;
&lt;td&gt;previous expiry,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;98 cycles&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;= 98 us earlier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;int_mask&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x67&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;equals the allowed mask; no channel interrupt-locked&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The 98-cycle figure is the distance from the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;previous expiry&lt;/strong&gt;. Reconstructing the forward distance that was actually requested:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cc_value - expired_cc = last_elapsed + cyc - d = 98,  d = expired_cc - last_count,
d in [0, 32) because the handler advances last_count by whole ticks

=&amp;gt; cyc &amp;lt;= 98 + d &amp;lt; 130, so the request was AT MOST 4 TICKS (128 us) ahead.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So the driver&amp;#39;s software state froze at t ~= 57.5 s while the hardware counter ran on to t ~= 7950 s, with channel 6 holding a compare the counter had passed two hours earlier and its interrupt enabled (we intentionally let it run for some time even when frozen).&lt;/p&gt;
&lt;h3&gt;Reproduction 2 — identified the mechanism&lt;/h3&gt;
&lt;p&gt;This run had&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CONFIG_NRF_GRTC_ALWAYS_ON=y&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(see&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="#what-we-ruled-out"&gt;What we ruled out&lt;/a&gt;):&lt;/p&gt;
&lt;table border="1" cellpadding="6" cellspacing="0"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Register&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SYSCOUNTER[2].ACTIVE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the keep-awake request was in effect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CC[6].CCL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x01CE1AC1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;= 30,284,993, i.e. fired at ~30.28 s uptime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CC[6].CCH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x00000000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CC[6].CCEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;the compare fired&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INTEN2&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;bit 6&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;interrupt still enabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INTPEND2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x00&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;EVENTS_COMPARE[6] == 0&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SYSCOUNTER&lt;/td&gt;
&lt;td&gt;far beyond&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CC[6]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;CCEN&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is the reading the diagnosis rests on. Its behaviour is not described in the nRF54L15 Product Specification (see&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="#questions"&gt;question 5&lt;/a&gt;), so phase A0 of the reproducer measures it, on a compare channel: it writes a CC and reads&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN&lt;/code&gt;, then waits for the compare and reads&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;again. On the DK,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN == 1&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;after the write, and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN == 0&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE == 1&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;after the compare fires.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN == 0&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE == 0&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;therefore means a fired-then-destroyed compare — we cannot construct another sequence that produces that pair — and the eliminations below that depend on it stand.&lt;/p&gt;
&lt;h2&gt;Mechanism&lt;/h2&gt;
&lt;p&gt;Confirmed directly, not merely reconstructed from the end state: phase A of the attached reproducer drives the race in isolation and counts the destroyed events, and phase B drives it through the ordinary Zephyr timeout API until the tick dies.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cc_value != expired_cc&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;on entry to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_set_timeout()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;means the function ran twice with no expiry in between — a timeout was aborted and rescheduled. That takes the absolute path, and because&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;prev_cc_val - now&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;was under&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;LATENCY_THR_TICKS&lt;/code&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;was selected:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* drivers/timer/nrf_grtc_timer.c - sys_clock_set_timeout() */
if (prev_cc_val &amp;lt; cc_value) {
    safe_setting = (int64_t)(prev_cc_val - now) &amp;lt; LATENCY_THR_TICKS;
}
nrfx_grtc_syscounter_cc_abs_set(ch, cc_value, safe_setting);

/* nrfx_grtc.c - the safe_setting branch */
nrfy_grtc_sys_counter_cc_set(NRF_GRTC, channel, val);          /* CCEN &amp;lt;- 1 */
if (nrfy_grtc_sys_counter_compare_event_check(NRF_GRTC, channel)) {
    now = nrfx_grtc_syscounter_get();                          /* sample     */
    if (val &amp;gt; now) {
        nrfy_grtc_sys_counter_compare_event_clear(NRF_GRTC, channel);  /* wipe */
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The clear exists to discard a stale event left by the previous CC value. Between sampling&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;now&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and executing the clear, the SYSCOUNTER can cross the newly programmed&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;val&lt;/code&gt;; hardware then sets&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and clears&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN&lt;/code&gt;, and the clear wipes that legitimate event along with the stale one. In run 1 both CC values were in play within ~100 us of each other (the reschedule was at most 128 us ahead), which is what makes the overlap likely rather than exotic.&lt;/p&gt;
&lt;p&gt;Independent of which interleaving occurred, the structural defect is plain in the code: the branch never verifies, after the write, that the CC still lies ahead of the SYSCOUNTER, nor that an event it is about to clear had not just been generated legitimately. It clears unconditionally on the strength of a counter sample taken before the clear.&lt;/p&gt;
&lt;h3&gt;Why it is permanent&lt;/h3&gt;
&lt;p&gt;Once the counter is past the CC with the event flag clear, nothing regenerates it. The handler never runs, so&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_announce()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;never runs, so&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_set_timeout()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is never called again — the driver never gets a chance to rewrite the CC and recover. With a 52-bit SYSCOUNTER there is no wrap-around to save it either (~142 years at 1 MHz).&lt;/p&gt;
&lt;p&gt;This is the structural difference from&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrf_rtc_timer.c&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;on earlier parts, where a lost compare self-heals after the 512 s RTC wrap.&lt;/p&gt;
&lt;h2&gt;Standalone reproduction&lt;/h2&gt;
&lt;p&gt;Attached as&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;GRTC-CompareLoss-Reproduction.zip&lt;/code&gt;:&lt;/p&gt;
&lt;table border="1" cellpadding="6" cellspacing="0"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Contents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;grtc_bug_reproduction/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;standalone Zephyr/NCS application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nrfx_grtc-clear-before-write.patch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;our fix, as quoted under&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="#our-fix"&gt;Our fix&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The application needs no Bluetooth, no MPSL and none of our own firmware. It is console-only and tickless on a stock&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrf54l15dk/nrf54l15/cpuapp&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;board target, built against an unmodified NCS v3.3.0:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;west -z &amp;quot;$ZEPHYR_BASE&amp;quot; build -b nrf54l15dk/nrf54l15/cpuapp -d build
west flash -d build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Console is the DK&amp;#39;s default UART at 115200 8N1. Its&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;carries the full derivation and the expected output;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CMakePresets.json&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;has one preset per configuration. The two phases are independent, each behind its own Kconfig symbol, and both reproduce.&lt;/p&gt;
&lt;h3&gt;Phase A — the nrfx race in isolation (&lt;code&gt;CONFIG_GRTC_REPRO_ISOLATED&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Calls&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_syscounter_cc_abs_set(ch, val, true)&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;directly, on a channel allocated to the application with no interrupt enabled, and classifies every attempt from the hardware registers alone: event present (fine),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;still set after the deadline (the compare never fired — a different anomaly, counted separately), or&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN == 0&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE == 0&lt;/code&gt;, i.e. an event the hardware generated and the driver destroyed.&lt;/p&gt;
&lt;p&gt;Each attempt first leaves a stale event on the channel — the state the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;path exists to clean up — and then programs a new CC a swept 0..31 us ahead of a freshly read SYSCOUNTER, with interrupts locked across the call so the only window in play is the one inside nrfx. The identical loop then runs again with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting = false&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;as a control. The two passes differ in nothing else. The race pass destroys events; the control pass destroys none.&lt;/p&gt;
&lt;p&gt;That isolates the loss to the event clear in the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;branch, with the Zephyr timer driver, our firmware, BLE and MPSL all out of the picture.&lt;/p&gt;
&lt;p&gt;Phase A0 additionally settles the two hardware properties the analysis needs and the PS does not state: the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;state machine (see&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="#state-captured-at-the-hang"&gt;State captured at the hang&lt;/a&gt;), and whether a CC written into the past generates an event at all. It does.&lt;/p&gt;
&lt;h3&gt;Phase B — the tick stall through the public API (&lt;code&gt;CONFIG_GRTC_REPRO_TICK_STALL&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Reproduces the user-visible symptom with nothing but&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;k_timer&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;k_sleep&lt;/code&gt;, and ends in the field signature:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN = 0&lt;/code&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE = 0&lt;/code&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;INTEN&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;bit set, CC far in the past, SYSCOUNTER running on, no thread ever scheduled again.&lt;/p&gt;
&lt;p&gt;Working out how to reach the race from the timeout API also answers why the failure is rare in the field and absent from most applications. Three constraints must hold at once:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;now&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;must be stale.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;now = last_count + last_elapsed&lt;/code&gt;, and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;last_elapsed&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is only refreshed through&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_elapsed()&lt;/code&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;kernel/timeout.c&lt;/code&gt;&amp;#39;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;elapsed()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;returns 0 while&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;announce_remaining != 0&lt;/code&gt;, so for the whole of&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_announce()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;now&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;stays frozen at the announce base while the SYSCOUNTER runs on. Every call from thread context samples the counter first and lands a full tick ahead of it, out of reach.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It must be the last CC write before the compare would have fired; any later write re-arms&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and silently repairs the damage. Since&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_announce()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;always ends with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_set_timeout(next_timeout(0), false)&lt;/code&gt;, a call from a timer callback is always followed by that one and can never be fatal. The fatal call is the closing one itself.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That closing call must take the absolute path with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting = true&lt;/code&gt;, which needs&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;next_timeout()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to be larger at the closing call than it was at an abort earlier in the same announce (&lt;code&gt;z_abort_timeout()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;being the only thing that calls&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_set_timeout()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;from a callback, since&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;z_add_timeout()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is suppressed while&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;announce_remaining != 0&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Constraint 3 is why the obvious &amp;quot;start two timers and abort the earlier one&amp;quot; pattern reproduces nothing:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;z_abort_timeout()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;removes the timeout before evaluating&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;next_timeout()&lt;/code&gt;, and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;remove_timeout()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;hands the removed entry&amp;#39;s dticks to its successor, so&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;next_timeout()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is unchanged and the closing call rewrites the same&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;cc_value&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting = false&lt;/code&gt;. The exception is aborting a timeout whose dticks is 0 — one sharing the currently firing deadline. It contributes nothing to its successor,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;next_timeout()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;returns 0,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;cyc&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;becomes 0, and the driver&amp;#39;s relative path forces&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;cyc = 1&lt;/code&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCADD += 1&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;puts the CC one microsecond in the past, which the hardware turns into an&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;immediately. That is the stale event the race needs. With a second timeout also on that deadline, the announce loop pops it after the callback returns and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;next_timeout()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;then jumps up to the surviving timeout, so the closing call sees&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;prev_cc_val = expired_cc + 1     one microsecond above the frozen announce base
cc_value    = now + N ticks      now being that same frozen base
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;i.e.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;prev_cc_val &amp;lt; cc_value&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;prev_cc_val - now == 1&lt;/code&gt;: absolute path,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;true,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;already set, and no CC write behind it.&lt;/p&gt;
&lt;p&gt;The application constructs that state deliberately from four&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;k_timer&lt;/code&gt;s (one carrying the pattern, three no-op shields of which two share its deadline), then busy-waits until the SYSCOUNTER is a swept distance short of the CC the closing call is about to program, so that the counter crosses it in the few cycles between nrfx&amp;#39;s sample and its clear. The distance is swept across a 0..40 us window in single busy-loop iterations, subdivided by NOPs so no offset is skipped; a full sweep takes roughly half a second, which makes this a sweep rather than a lottery. A per-round self-check confirms the abort really was the dticks == 0 one, so a run that does not reproduce can be told apart from a run that never reached the right call.&lt;/p&gt;
&lt;p&gt;Two practical notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;k_uptime_get()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is not a stall detector.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_tick_get()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;adds&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_elapsed()&lt;/code&gt;, which samples the free-running SYSCOUNTER, so uptime keeps advancing perfectly correctly right through the stall. Everything that merely reads the time looks healthy; only the fact that no callback runs any more exposes the failure. Phase B therefore detects the stall from a watchdog on a private GRTC channel, armed through&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;z_nrf_grtc_timer_set()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;— which routes to the race-free&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_syscounter_cc_absolute_set()&lt;/code&gt;, so the watchdog cannot lose its own event — and reports from its ISR, since by then no thread will ever run again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Both phases require a stock&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc.c&lt;/code&gt;, and phase B additionally a stock&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;drivers/timer/nrf_grtc_timer.c&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;— our fix removes the race outright, so there is nothing left to observe. The build warns at configure time if it detects either patch in the workspace.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What we ruled out&lt;/h2&gt;
&lt;h3&gt;Software suppression of the interrupt&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fatal error / assert halt&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;—&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;arch_system_halt()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;spins with interrupts locked, which would show non-zero&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;BASEPRI&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and a PC inside the halt loop.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;BASEPRI&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is 0 and the CPU is in the idle thread.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interrupts masked by a leaked lock&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;—&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;BASEPRI&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;0;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;PRIMASK&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;1 is explained by&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;arch_cpu_idle()&lt;/code&gt;;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;VECTACTIVE&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;0.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stuck or starving ISR&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;—&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;VECTACTIVE&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;0, thread mode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Channel interrupt disabled by&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;compare_int_lock()&lt;/code&gt;&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;—&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;INTEN2 = 0x40&lt;/code&gt;, and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;int_mask = 0x67&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;agrees that all allowed channels are enabled.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVIC interrupt disabled&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;—&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;ISER[7] = 0x30&lt;/code&gt;, IRQ 228 enabled.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Empty timeout queue (legitimate tickless idle)&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;— the application always has pending timeouts: a 250 ms watchdog tick timer and a 500 ms main-loop sleep.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SYSCOUNTER sleep / CC latch latency — ruled out by experiment&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;CONFIG_NRF_GRTC_ALWAYS_ON=y&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(keeping the SYSCOUNTER continuously active, so a CC write can never race a sleep/wake transition) does not prevent the hang: reproduction 2 ran with it enabled, and the hang&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;still reproduced&lt;/strong&gt;, with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;SYSCOUNTER[2].ACTIVE = 0x1&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;confirming the keep-awake request was in effect throughout.&lt;/p&gt;
&lt;p&gt;Note the correct register:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_active_request_set()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;writes&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;GRTC_SYSCOUNTER.ACTIVE&lt;/code&gt;, which is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;SYSCOUNTER[NRF_GRTC_DOMAIN_INDEX]&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;=&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;SYSCOUNTER[GRTC_IRQ_GROUP]&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;=&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;SYSCOUNTER[2]&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;on secure cpuapp.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;SYSCOUNTER[0]&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;belongs to another domain and reads 0 regardless of this setting.&lt;/p&gt;
&lt;p&gt;This is consistent with the actual mechanism: the race is between the CPU and the free-running counter, so counter sleep/wake latency is irrelevant to it.&lt;/p&gt;
&lt;h3&gt;CC written into the past, or lost in the CCL -&amp;gt; CCH write window — ruled out by the CCEN reading&lt;/h3&gt;
&lt;p&gt;Both are candidate mechanisms by which the compare might never fire at all, and both are excluded by&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CC[6].CCEN = 0&lt;/code&gt;: a compare that never matched would leave&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;at 1 (the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;state machine as measured by phase A0). The past-CC candidate is doubly excluded: A0 also shows the hardware raises&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;for a CC written into the past, so that is not a way for a compare to go missing.&lt;/p&gt;
&lt;h3&gt;Other channel owners disabling CCEN on channel 6 — excluded by inspection of the source for this build configuration&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nrf_sys_event&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;—&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CONFIG_NRF_SYS_EVENT&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is not set, so&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;USE_SYS_EVENT&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is undefined and the GRTC-channel path in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;soc/nordic/common/nrf_sys_event.c&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is compiled out.&lt;/li&gt;
&lt;li&gt;The&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CONFIG_POWEROFF&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;channel sweep in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;z_nrf_grtc_wakeup_prepare()&lt;/code&gt;, which disables every allowed channel except its own —&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CONFIG_POWEROFF&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is not set.&lt;/li&gt;
&lt;li&gt;The 802.15.4 platform glue, which calls&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;z_nrf_grtc_timer_abort()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;—&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CONFIG_NRF_802154_RADIO_DRIVER&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is not set.&lt;/li&gt;
&lt;li&gt;The Zephyr LL&amp;#39;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;radio.c&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;cntr.c&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;— this build uses&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CONFIG_BT_LL_SOFTDEVICE&lt;/code&gt;, and those files use channels 10/11 in any case.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nrfx_grtc_uninit()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;via&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_disable()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;— it would leave&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;SYSCOUNTER[2].ACTIVE = 0&lt;/code&gt;, which reads 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;MPSL interference — only partly excluded&lt;/h3&gt;
&lt;p&gt;The pending IRQ 229 is enabled and serviced normally, its channels 8/9 are in MPSL&amp;#39;s reserved block, and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CONFIG_BT_UNINIT_MPSL_ON_DISABLE&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is not set, so&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;bt_disable()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;does not tear down MPSL&amp;#39;s IRQ. But MPSL ships as a binary library, so unlike the cases above we cannot inspect it to confirm it never touches channel 6 or the group-2 registers. We have no positive evidence that it does; we simply cannot rule it out the way we ruled out the others, and the correlation with BLE traffic is the one thing that would be equally well explained by MPSL involvement. If you can confirm from the MPSL side that channel 6 is untouched, that would close the last alternative we are aware of.&lt;/p&gt;
&lt;p&gt;The reproducer has no Bluetooth and no MPSL in the image, so MPSL is not needed to explain the failure — it remains possible as a second contributor to the field failures, but not as an alternative explanation.&lt;/p&gt;
&lt;h3&gt;Silicon anomalies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;L15_22 / L15_24 / L15_25&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;— these cover&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE[n]&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;on the TIMER peripheral, not the GRTC (per Nordic in DevZone 127458).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L15_30&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(&amp;quot;CLOCK, GRTC: GRTC operates incorrectly at low temperature&amp;quot;) — describes GRTC frequency drift when the system runs on HFINT. The failure here is a single lost compare event, not a drifting time base. Please confirm this is not a contributing factor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Open points&lt;/h2&gt;
&lt;p&gt;Collected here rather than left buried in the prose above, so you can see exactly where the analysis is load-bearing and where it is not.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We did not measure the width of the window between the counter sample and the event clear, and cannot bound it from the documentation. The reproducer sweeps its offset until it hits the window instead of measuring it. What we can say is that phase A locks interrupts across the call, so the window is wide enough to lose events with nothing widening it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MPSL cannot be inspected, so it alone is excluded by inference rather than by reading the code. Not being needed to reproduce the defect does not close it out as a second contributor in the field.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The two field captures are from different runs, so for the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;field&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;failures &amp;quot;the CC was too close AND the event was lost&amp;quot; still joins two observations by argument. In the reproducer both halves are present in a single run.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Whether the interleaving the reproducer forces is the one that fires in the field. It is the same mechanism ending in the same register state, but the field path is necessarily inferred: our firmware does not construct that timer pattern deliberately, it arrives there under BLE load.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Whether the retry in our fix is necessary. That a spurious COMPARE event on this path would be misinterpreted is read off Zephyr&amp;#39;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_timeout_handler()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(see&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="#our-fix"&gt;Our fix&lt;/a&gt;); we have not provoked one and watched the clock jump. The retry costs nothing when no event is pending, so we kept it either way.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Our fix&lt;/h2&gt;
&lt;p&gt;Applied locally as a patch to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;modules/hal/nordic/nrfx/drivers/src/nrfx_grtc.c&lt;/code&gt;. It supersedes a stopgap of ours in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;drivers/timer/nrf_grtc_timer.c&lt;/code&gt;, which detected the lost event after the fact (&lt;code&gt;CCEN == 0&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE == 0&lt;/code&gt;) and re-raised it; that one recovered the system clock only, whereas the race is in nrfx and reaches every caller of&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_syscounter_cc_abs_set()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the hang stopped reproducing under the BLE test load that previously triggered it within minutes to a couple of hours, first under that stopgap and since under this fix, and neither phase of the reproducer reproduces against it. The soak on this fix is still running; given the fault was intermittent we will report back if it recurs.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (safe_setting)
{
    bool retry;

    do
    {
        nrfy_grtc_sys_counter_compare_event_clear(NRF_GRTC, channel);
        nrfy_grtc_sys_counter_cc_set(NRF_GRTC, channel, val);

        retry = nrfy_grtc_sys_counter_compare_event_check(NRF_GRTC, channel) &amp;amp;&amp;amp;
                (val &amp;gt; nrfx_grtc_syscounter_get());
    } while (retry);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Clearing before arming is the ordering&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_syscounter_cc_absolute_set()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;already uses, and it is what removes the defect: no clear can follow the new CC going live, so no event the new CC generates can be destroyed. It also needs no assumption about hardware timing.&lt;/p&gt;
&lt;p&gt;The loop is there because the reordering alone would trade the lost event for a spurious one, and for this caller that is not a benign trade. The&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;previous&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;CC is still armed while the clear runs — that is precisely the situation&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;exists for — so it can expire between the clear and the CC write and leave behind an event that does not belong to the new CC. The nrfx ISR passes the handler&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;m_cb.cc_value[]&lt;/code&gt;, which this function has already advanced to the new value, so&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_timeout_handler()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;would announce the whole new timeout immediately and set&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;last_count&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;past the SYSCOUNTER, after which&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;counter_sub()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_elapsed()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;underflows. A lost compare stops the clock; an unrepaired spurious one throws it forward.&lt;/p&gt;
&lt;p&gt;The loop resolves that without reopening the original window:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An event present after the CC write is either generated by the new CC —&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;val&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is already in the past, the event is due, keep it — or left by the previous CC.&lt;/li&gt;
&lt;li&gt;The two are told apart by reading the SYSCOUNTER after the event check, not before:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;val &amp;gt; now&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;then proves the counter had not reached&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;val&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;at the moment the event was observed, so that event cannot belong to the new CC and is safe to clear. This is the ordering the original branch got wrong.&lt;/li&gt;
&lt;li&gt;Every clear is immediately followed by a CC write that re-arms the channel, so no iteration can leave a fired compare without an event — the state that stalls the clock is unreachable from inside the loop.&lt;/li&gt;
&lt;li&gt;It terminates: after the first CC write only&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;val&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;itself can generate an event, and such an event implies&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;now &amp;gt;= val&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;on the next pass.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cost, on the path where nothing is pending, is one extra register write — the clear — and no SYSCOUNTER read, so the optimisation the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;path exists for is kept. We did not add a critical section around the clear/write pair, since the function is documented as &amp;quot;must be called with interrupts locked&amp;quot;;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_syscounter_cc_absolute_set()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;takes one, and if that is deliberate rather than defensive the same should be done here.&lt;/p&gt;
&lt;p&gt;The alternative we did not take: phase A0 confirms the hardware raises&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;for a CC written into the past, so a lost compare can also be recovered by rewriting the CC. That is still a recovery after the fact, and it rests on a hardware property we measured on one DK rather than one that is documented, so we preferred the ordering fix.&lt;/p&gt;
&lt;h2&gt;Upstream status (checked 2026-09-08)&lt;/h2&gt;
&lt;h3&gt;Zephyr&lt;/h3&gt;
&lt;p&gt;Upstream main still has the same call into the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;path and no post-write verification. Commits to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;drivers/timer/nrf_grtc_timer.c&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;after the revision in NCS v3.3.0:&lt;/p&gt;
&lt;table border="1" cellpadding="6" cellspacing="0"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Commit&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;f4a2a270715&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-06-10&lt;/td&gt;
&lt;td&gt;kernel: timeout: make the system clock tick interface unsigned -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_set_timeout(uint32_t ticks, ...)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;48f35d88c68&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-06-23&lt;/td&gt;
&lt;td&gt;drivers: timer: clean up tick clamps for the unsigned interface -&amp;gt; for GRTC, only an&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;(int32_t)&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;cast removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;aad2c65d69e&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-07-31&lt;/td&gt;
&lt;td&gt;release LFCLK before GRTC uninit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;839c682963f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-08-21&lt;/td&gt;
&lt;td&gt;&lt;code&gt;__ASSERT_ON&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;migration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;None touches the compare path.&lt;/p&gt;
&lt;h3&gt;nrfx&lt;/h3&gt;
&lt;p&gt;NCS v3.3.0 ships nrfx 4.2.1. Upstream master is at 4.5.0 (2026-07-23), three releases newer. The GRTC entries in between are:&lt;/p&gt;
&lt;table border="1" cellpadding="6" cellspacing="0"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Release&lt;/th&gt;
&lt;th&gt;GRTC entry&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4.3.0&lt;/td&gt;
&lt;td&gt;&amp;quot;Fixed extended channel mask definition for devices supporting MINTERVAL feature in the GRTC driver.&amp;quot; — unrelated, build-time mask definition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.4.0&lt;/td&gt;
&lt;td&gt;(no GRTC changes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.5.0&lt;/td&gt;
&lt;td&gt;(no GRTC changes)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;More directly:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_syscounter_cc_abs_set()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;on nrfx master is byte-for-byte identical to the 4.2.1 copy quoted above. The&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;branch is unchanged. Upgrading nrfx will not fix this.&lt;/p&gt;
&lt;h2&gt;History&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;nrfx 3.12.0 (2025-06-02)&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;— &amp;quot;Added functions for setting compare value in an optimized way in the GRTC driver.&amp;quot; This is where&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_syscounter_cc_abs_set()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;first appears, with the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;branch as quoted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zephyr&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;af3c8b973ed&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2024-05-22)&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;— &amp;quot;drivers: timer: nrf_grtc_timer: Fix for random system hangs&amp;quot; restored an early return in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_timeout_handler()&lt;/code&gt;, noting that without it &amp;quot;some stress tests which were using system timers heavily started to hang&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zephyr&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;d6fb9384ebf&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2025-03-31)&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;— &amp;quot;drivers: timer: nrf_grtc_timer: Optimize to reduce register access&amp;quot; introduced&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;cc_value&lt;/code&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;expired_cc&lt;/code&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;LATENCY_THR_TICKS&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;path. Its commit message names the exact scenario that fails here:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;If value in CC is earlier than the new CC value (if earlier timeout was aborted) then there is a risk of COMPARE event happening while it is being overwritten. That case requires long and safer procedure of setting CC.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The safer procedure prevents a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;spurious&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;event. Nothing on either side prevents or detects a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;lost&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;one.&lt;/p&gt;
&lt;p&gt;The closest public report, DevZone 127458 (&amp;quot;NRF54L15 Timer interrupt not generating after few cycles&amp;quot;), describes the same shape and remains unanswered with no root cause.&lt;/p&gt;
&lt;h2&gt;Questions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Is the read-modify-write in the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;safe_setting&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;branch of&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_syscounter_cc_abs_set()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;considered safe as written? It samples the SYSCOUNTER, decides, and then clears an event register that the hardware can set in between. Phase A settles the empirical half, so what is left is what nrfx intends here. Specifically: is the clear-before-write ordering under&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="#our-fix"&gt;Our fix&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;— the one&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrfx_grtc_syscounter_cc_absolute_set()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;already uses, plus the retry that repairs an event left by the previous CC — acceptable as a fix, and is our reading correct that the retry is needed, i.e. that a spurious event on this path would be misinterpreted by the Zephyr system clock rather than tolerated?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is there a documented minimum distance between a CC write and the SYSCOUNTER value at which the compare is guaranteed to fire?&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;nrf_rtc_timer.c&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;cites such a figure for RTC (&amp;quot;when the current counter value is N, a value of N+2 written to the CC register is guaranteed to trigger a COMPARE event at N+2&amp;quot;), and that driver additionally loops, re-reading the counter and re-arming until the CC verifiably lands in the future. We can find no equivalent statement for GRTC — the GRTC chapter of the nRF54L15 Product Specification resolves to register and SPU navigation only, with no functional description of compare-event generation or CC write latching. Phases A0 and B0 measure that a CC written into the past raises&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;EVENTS_COMPARE&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;anyway (including via the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCADD += 1&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;form the Zephyr driver emits for&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;cyc == 0&lt;/code&gt;), but that is a measurement on one DK rather than a guarantee we can rely on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;LATENCY_THR_TICKS = 200&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;intended to bound this case? Despite the name it is compared against a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;cycle&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;difference (&lt;code&gt;prev_cc_val - now&lt;/code&gt;, in 1 MHz units), so it is a 200 us threshold, not 200 ticks (6.4 ms). Intended?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Should&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_set_timeout()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;enforce a minimum forward distance on the absolute path? It currently computes&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;now = last_count + last_elapsed&lt;/code&gt;, a software estimate rather than a hardware read, and on the path out of&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;sys_clock_announce()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;that value is the expiry time of the timeout that just fired — stale by the interrupt latency plus every callback the announce loop ran. Combined with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;ticks == 0&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;being reachable,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;cc_value == now&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is expressible. The pre-&lt;code&gt;d6fb9384ebf&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;code read the counter at the point of the write and applied a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;MAX(..., 1)&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;floor; both were removed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can the GRTC&amp;#39;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;CCEN&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;behaviour be documented, or at least confirmed? The diagnosis above, and several of the eliminations, rest on it. Neither it, nor CC write latching, nor compare-event generation appears in the nRF54L15 Product Specification, and a measurement on a single DK is a thin foundation for a state machine.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/GRTC_2D00_CompareLoss_2D00_Reproduction.zip"&gt;devzone.nordicsemi.com/.../GRTC_2D00_CompareLoss_2D00_Reproduction.zip&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Does single-cell location nrfcloud API work in India for Jio network?</title><link>https://devzone.nordicsemi.com/thread/129121?ContentTypeID=0</link><pubDate>Tue, 08 Sep 2026 14:05:38 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b58b06bf-d3e3-4e7d-be4a-7073f1ddd822</guid><dc:creator>anupamvarghese</dc:creator><slash:comments>3</slash:comments><comments>https://devzone.nordicsemi.com/thread/129121?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129121/does-single-cell-location-nrfcloud-api-work-in-india-for-jio-network/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;We are&amp;nbsp;unable to get the correct location (even approximate) using the nrfCloud API for Location based on Single-Cell.&lt;br /&gt;For the given &lt;br /&gt;&amp;quot;mcc&amp;quot;,&amp;nbsp;&amp;quot;mnc&amp;quot;, &amp;quot;tac&amp;quot; and&amp;nbsp;&amp;quot;eci&amp;quot; combination, it seems to always return some location in Mumbai for a SIM being testing in Bangalore.&lt;br /&gt;&lt;br /&gt;Could you please confirm Jio&amp;#39;s&amp;nbsp;NB-IoT tower network in India is mapped on your cloud?&lt;br /&gt;&lt;br /&gt;Thanks.&lt;/p&gt;
&lt;p&gt;- Anupam&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>nRF9151 DK: spi slave</title><link>https://devzone.nordicsemi.com/thread/129120?ContentTypeID=0</link><pubDate>Tue, 08 Sep 2026 09:51:11 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:adf60a23-1415-48c0-b1af-cd578b1eb173</guid><dc:creator>Aparna Pacharne</dc:creator><slash:comments>0</slash:comments><comments>https://devzone.nordicsemi.com/thread/129120?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129120/nrf9151-dk-spi-slave/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I am using the &lt;strong&gt;nRF9151-DK as an SPI slave&lt;/strong&gt;. The SPI communication is not working as expected, and the &lt;strong&gt;nRF9151-DK is not receiving any data from the SPI master&lt;/strong&gt;.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I have configured &lt;strong&gt;SPIS3&lt;/strong&gt;, but the SPI transfer callback is not receiving any data.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Environment:&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Board:&lt;/strong&gt; nRF9151-DK&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nRF Connect SDK:&lt;/strong&gt; v3.3.4&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zephyr:&lt;/strong&gt; v4.3.99&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Board target:&lt;/strong&gt; &lt;code&gt;nrf9151dk/nrf9151/ns&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SPI peripheral:&lt;/strong&gt; SPIS3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Programming external module over SWD using nrf7002dk</title><link>https://devzone.nordicsemi.com/thread/129119?ContentTypeID=0</link><pubDate>Tue, 08 Sep 2026 06:30:41 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:5c2112fb-0bdd-4651-a080-eb80f8eea77c</guid><dc:creator>ccdev</dc:creator><slash:comments>2</slash:comments><comments>https://devzone.nordicsemi.com/thread/129119?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129119/programming-external-module-over-swd-using-nrf7002dk/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I am using an nrf7002dk and my external modules have arrived. The external modules are Minewsemi MS12SF1, which is a combo of nrf5340 and nrf7002.&lt;/p&gt;
&lt;p&gt;To start, I wanted to ensure that I am connecting the module correctly to the P20 custom SWD header on the dev kit. My goal is to flash the hello world sdk sample to the module. The problem I am having is that the module dopesnt appear to be connected, and I think I can confirm this using the JLinkExe (see output below).&lt;/p&gt;
&lt;p&gt;I have things wired as follows:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;P20&amp;nbsp;SWDIO -&amp;gt; module&amp;nbsp;&lt;span&gt;SWDIO&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;P20&lt;/span&gt;&amp;nbsp;SWDCLK -&amp;gt; module&amp;nbsp;&lt;span&gt;SWDCLK&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;P20&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pin2 (VDD) -&amp;gt;&amp;nbsp;&lt;span&gt;module&amp;nbsp;VCC&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;P20&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pin3 (VTG) -&amp;gt;&amp;nbsp;&lt;span&gt;module&amp;nbsp;VCC&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;P20&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;GND DETECT -&amp;gt;&amp;nbsp;&lt;span&gt;common&amp;nbsp;&lt;/span&gt;GND&lt;/p&gt;
&lt;p&gt;P1 GND -&amp;gt;&lt;span&gt;common&amp;nbsp;&lt;/span&gt;GND&lt;/p&gt;
&lt;p&gt;module&amp;nbsp;GND -&amp;gt; common GND&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;So as you can see, Im powering the module using the P20 pin2, as per the nordic documentation which states:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If it is inconvenient to have a separate power supply on the external board, the nRF7002 DK can supply power through pin 2 (VDD) of P20&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(&lt;/em&gt;the full documentation for the nrf7002dk can be found here&lt;em&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.farnell.com/datasheets/4628156.pdf)"&gt;https://www.farnell.com/datasheets/4628156.pdf)&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I understand that the P20 pin2 will only provide 1.8v, so this feels like a catch22 situation because the MS12SF1 module requires ~3.v.&amp;nbsp;If I power the module using the P20 header pin2, then it would seem Im not providing enough power to the module. Yet, if I power the module externally using a ~3v power supply, then there is a clear mismatch in voltage on the SWD line (1.8v vs 3v).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;What can I do to solve this problem? My instinct tells me that I need to do one of the following:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;1. logic level shifting on the swd line i.e 1.8v &amp;lt;&amp;gt; 3v&lt;/p&gt;
&lt;p&gt;2.&amp;nbsp;use a different dev kit that operates at 3v instead of 1.8v&lt;/p&gt;
&lt;p&gt;3. just go ahead and try powering the module externally using 3v (and not simulataneously the 1.8v P20 pin2), and hope things dont get damaged.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;What is the correct solution here?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;FYI the reason I am confident that there is no connection being made between the dev kit and the module is that when i run JLinkExe, I always see the same output, whether the module is connected to the SWD line or not, i.e:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;➜ hello_world_4 git:(master) ✗ JLinkExe&lt;br /&gt;SEGGER J-Link Commander V9.74 (Compiled Sep 2 2026 12:36:32)&lt;br /&gt;DLL version V9.74, compiled Sep 2 2026 12:35:17&lt;/p&gt;
&lt;p&gt;Connecting to J-Link ...O.K.&lt;br /&gt;Firmware: J-Link OB-nRF5340-NordicSemi compiled Jun 11 2026 13:12:28&lt;br /&gt;Hardware version: V1.00&lt;br /&gt;J-Link uptime (since boot): 0d 00h 00m 07s&lt;br /&gt;S/N: 1050780352&lt;br /&gt;License(s): RDI,FlashBP,FlashDL,JFlash,GDB&lt;br /&gt;USB speed mode: Full speed (12 MBit/s)&lt;br /&gt;VTref=3.300V&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Type &amp;quot;connect&amp;quot; to establish a target connection, &amp;#39;?&amp;#39; for help&lt;br /&gt;J-Link&amp;gt;connect&lt;br /&gt;Please specify device / core. &amp;lt;Default&amp;gt;: NRF5340_XXAA_APP&lt;br /&gt;Type &amp;#39;?&amp;#39; for selection dialog&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Device&amp;gt;&lt;br /&gt;Please specify target interface:&lt;br /&gt;J) JTAG (Default)&lt;br /&gt;S) SWD&lt;br /&gt;T) cJTAG&lt;br /&gt;TIF&amp;gt;s&lt;br /&gt;Specify target interface speed [kHz]. &amp;lt;Default&amp;gt;: 4000 kHz&lt;br /&gt;Speed&amp;gt;&lt;br /&gt;Device &amp;quot;NRF5340_XXAA_APP&amp;quot; selected.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Connecting to target via SWD&lt;br /&gt;ConfigTargetSettings() start&lt;br /&gt;ConfigTargetSettings() end - Took 6us&lt;br /&gt;InitTarget() start&lt;br /&gt;InitTarget() end - Took 3.32ms&lt;br /&gt;Found SW-DP with ID 0x6BA02477&lt;br /&gt;DPIDR: 0x6BA02477&lt;br /&gt;CoreSight SoC-400 or earlier&lt;br /&gt;AP map detection skipped. Manually configured AP map found.&lt;br /&gt;AP[0]: AHB-AP (IDR: Not set, ADDR: 0x00000000)&lt;br /&gt;AP[1]: AHB-AP (IDR: Not set, ADDR: 0x00000000)&lt;br /&gt;AP[2]: MEM-AP (IDR: Not set, ADDR: 0x00000000)&lt;br /&gt;AP[3]: MEM-AP (IDR: Not set, ADDR: 0x00000000)&lt;br /&gt;AP[0]: Core found&lt;br /&gt;AP[0]: AHB-AP ROM base: 0xE00FE000&lt;br /&gt;CPUID register: 0x410FD214. Implementer code: 0x41 (ARM)&lt;br /&gt;Feature set: Mainline&lt;br /&gt;Cache: No cache&lt;br /&gt;Found Cortex-M33 r0p4, Little endian.&lt;br /&gt;FPUnit: 8 code (BP) slots and 0 literal slots&lt;br /&gt;Security extension: implemented&lt;br /&gt;Secure debug: enabled&lt;br /&gt;CoreSight components:&lt;br /&gt;ROMTbl[0] @ E00FE000&lt;br /&gt;[0][0]: E00FF000 CID B105100D PID 000BB4C9 ROM Table&lt;br /&gt;ROMTbl[1] @ E00FF000&lt;br /&gt;[1][0]: E000E000 CID B105900D PID 000BBD21 DEVARCH 47702A04 DEVTYPE 00 Cortex-M33&lt;br /&gt;[1][1]: E0001000 CID B105900D PID 000BBD21 DEVARCH 47701A02 DEVTYPE 00 DWT&lt;br /&gt;[1][2]: E0002000 CID B105900D PID 000BBD21 DEVARCH 47701A03 DEVTYPE 00 FPB&lt;br /&gt;[1][3]: E0000000 CID B105900D PID 000BBD21 DEVARCH 47701A01 DEVTYPE 43 ITM&lt;br /&gt;[1][5]: E0041000 CID B105900D PID 002BBD21 DEVARCH 47724A13 DEVTYPE 13 ETM&lt;br /&gt;[1][6]: E0042000 CID B105900D PID 000BBD21 DEVARCH 47701A14 DEVTYPE 14 CSS600-CTI&lt;br /&gt;[0][1]: E0040000 CID B105900D PID 000BBD21 DEVARCH 00000000 DEVTYPE 11 TPIU&lt;/p&gt;
&lt;p&gt;Memory zones:&lt;br /&gt;Zone: &amp;quot;Default&amp;quot; Description: Default access mode&lt;br /&gt;Cortex-M33 identified.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;J-Link&amp;gt;mem32 0x00000000 16&lt;br /&gt;00000000 = 200017A0 00000B81 000044A5 00000B6D&lt;br /&gt;00000010 = 00000B6D 00000B6D 00000B6D 00000B6D&lt;br /&gt;00000020 = 00000000 00000000 00000000 00000C51&lt;br /&gt;00000030 = 00000B6D 00000000 00000DED 00000B6D&lt;br /&gt;00000040 = 00000E65 00000E65 00000E65 00000E65&lt;br /&gt;00000050 = 00000E65 00000E65&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The last part always looks the same, which to me says that I am always reading the dev kit, even when the module is connected to the P20 header, i.e:&lt;/p&gt;
&lt;p&gt;&lt;span&gt;J-Link&amp;gt;mem32 0x00000000 16&lt;/span&gt;&lt;br /&gt;&lt;span&gt;00000000 = 200017A0 00000B81 000044A5 00000B6D&lt;/span&gt;&lt;br /&gt;&lt;span&gt;00000010 = 00000B6D 00000B6D 00000B6D 00000B6D&lt;/span&gt;&lt;br /&gt;&lt;span&gt;00000020 = 00000000 00000000 00000000 00000C51&lt;/span&gt;&lt;br /&gt;&lt;span&gt;00000030 = 00000B6D 00000000 00000DED 00000B6D&lt;/span&gt;&lt;br /&gt;&lt;span&gt;00000040 = 00000E65 00000E65 00000E65 00000E65&lt;/span&gt;&lt;br /&gt;&lt;span&gt;00000050 = 00000E65 00000E65&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;If the module was being detected, then&amp;nbsp;i expect the&amp;nbsp;output of this command would predictable change whether the module is connected or not because we would be reading memory from either the dev kit of the module.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>nRF54L15: Can Direction Finding (AoA/AoD) and Channel Sounding both work on this chip?</title><link>https://devzone.nordicsemi.com/thread/129118?ContentTypeID=0</link><pubDate>Tue, 08 Sep 2026 05:19:31 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:56db66bd-7069-4e57-9fef-80d215a6e67f</guid><dc:creator>Pravyuha</dc:creator><slash:comments>0</slash:comments><comments>https://devzone.nordicsemi.com/thread/129118?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129118/nrf54l15-can-direction-finding-aoa-aod-and-channel-sounding-both-work-on-this-chip/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Does the nRF54L15 support Direction Finding (AoA/AoD) and Channel Sounding together — i.e., can both features run on this specific chip, either simultaneously or at all?&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve seen Nordic staff confirm in other threads that AoA/AoD is &amp;quot;not supported&amp;quot; on the nRF54L series (e.g. case ID 343792), while Channel Sounding is supported. Can you confirm:&lt;/p&gt;
&lt;p&gt;1. Does the nRF54L15 support AoA/AoD at all, currently or planned?&lt;br /&gt;2. Does it support Channel Sounding? If yes, which NCS version/sample should I use to evaluate it?&lt;br /&gt;3. If AoA/AoD is added in a future update, could it run alongside Channel Sounding on this same chip, or would the two be mutually exclusive on this silicon?&lt;br /&gt;4. In the &amp;quot;AOA and AOD on nrf54L15&amp;quot; thread, a user mentioned they were able to add a CTE to advertising packets on the nRF54L15 (by adapting the direction_finding_connectionless_tx sample under NCS 3.1.1), and suggested this makes AoA work on this chip. Can you confirm whether this is genuinely functional, and if so, whether it would be reliable/accurate enough for practical AoA use, or if this is not officially supported/validated?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Problem installing CHIP tool</title><link>https://devzone.nordicsemi.com/thread/129117?ContentTypeID=0</link><pubDate>Mon, 07 Sep 2026 10:22:23 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e4f029ab-6721-4860-bca6-ad90a1899313</guid><dc:creator>Jenzo</dc:creator><slash:comments>4</slash:comments><comments>https://devzone.nordicsemi.com/thread/129117?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129117/problem-installing-chip-tool/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span&gt;I am using SDK 2.7.0. When trying to install the CHIP tool, I get the error - view below.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I have tried everything - it seems that the OAuth client is hardcoded into the SDK. Could you please help with a remedy.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;ERROR message:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;BOOTSTRAP! Bootstrap may take a few minutes; please be patient.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;b&gt;Downloading and installing packages into local source directory:&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;Setting up CIPD package manager...[|]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Not logged in to CIPD and no anonymous access to the following CIPD paths:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;fuchsia/third_party/zap&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Attempting CIPD login&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Getting a refresh token with following OAuth scopes:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;* &lt;a href="https://www.googleapis.com/auth/userinfo.email"&gt;www.googleapis.com/.../userinfo.email&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[P80629 11:42:32.287 client.go:357 W] RPC failed permanently: rpc error: code = PermissionDenied desc = OAuth client 446450136466-mj75ourhccki9fffaq8bc1e50di315po.apps.googleusercontent.com is not allowed {&amp;quot;host&amp;quot;:&amp;quot;ci.chromium.org&amp;quot;, &amp;quot;method&amp;quot;:&amp;quot;CreateLoginSession&amp;quot;, &amp;quot;service&amp;quot;:&amp;quot;luci.auth.loginsessions.LoginSessions&amp;quot;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Login failed: failed to create the login session: rpc error: code = PermissionDenied desc = OAuth client 446450136466-mj75ourhccki9fffaq8bc1e50di315po.apps.googleusercontent.com is not allowed&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;CIPD login failed&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;failed (3.9s)&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Is AT%XMONITOR no longer supported with the serial modem app?</title><link>https://devzone.nordicsemi.com/thread/129116?ContentTypeID=0</link><pubDate>Mon, 07 Sep 2026 09:50:52 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:8d68dcf7-9fa2-4c37-8e43-98b41b259396</guid><dc:creator>Daniel B. J.</dc:creator><slash:comments>2</slash:comments><comments>https://devzone.nordicsemi.com/thread/129116?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129116/is-at-xmonitor-no-longer-supported-with-the-serial-modem-app/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;We use the nRF9151 modem and need the following data from it:&amp;nbsp;Mobile Country Code (MCC), Mobile Network Code (MNC),&amp;nbsp;Tracking Area Code (TAC),&amp;nbsp;cell_id and&amp;nbsp;rsrp.&lt;/p&gt;
&lt;p&gt;We have used&amp;nbsp;the AT%XMONITOR command for this before, but I can&amp;#39;t seem to find anything other than a minor mention in an .obj and .a file with the serial modem app v2.0.0.&lt;/p&gt;
&lt;p&gt;Is the&amp;nbsp;AT%XMONITOR command no longer supported? And if so what would be the recommended command to get the information we need?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thank you in advance.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Daniel.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>nRF5340 LE Audio: Audio quality randomly good or degraded depending on connection with Google Pixel 7</title><link>https://devzone.nordicsemi.com/thread/129115?ContentTypeID=0</link><pubDate>Mon, 07 Sep 2026 07:07:04 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:2d59828f-b3f2-450c-90a6-039de32f76c8</guid><dc:creator>Raphael01</dc:creator><slash:comments>2</slash:comments><comments>https://devzone.nordicsemi.com/thread/129115?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129115/nrf5340-le-audio-audio-quality-randomly-good-or-degraded-depending-on-connection-with-google-pixel-7/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;we are currently developing a device based on the nRF5340 using LE Audio.&lt;/p&gt;
&lt;p&gt;The device streams audio to a smartphone, where the corresponding Android application can record the incoming audio stream.&lt;/p&gt;
&lt;p&gt;Our software is based on the nRF5340 Audio Unicast Server application from nRF Connect SDK v3.1.1.&lt;/p&gt;
&lt;p&gt;Due to hardware constraints, the nRF5340 has to operate as an I2S slave. The external I2S source provides a sample rate of approximately 46.875 kHz, while the LE Audio/LC3 pipeline operates at 48 kHz.&lt;/p&gt;
&lt;p&gt;To compensate for this difference, we implemented a resampling stage using the ratio 125:128, converting the incoming I2S audio to 48 kHz before passing it to the LC3 encoder.&lt;/p&gt;
&lt;p&gt;With a Samsung Galaxy S25, the audio quality is consistently good.&lt;/p&gt;
&lt;p&gt;With a Google Pixel 7, however, the behavior is different: after establishing the LE Audio connection, the audio quality is either good or noticeably degraded/“robotic”. Once the connection is established, the quality remains in that state for the entire connection. Reconnecting or restarting the device can result in either a good or a bad connection again.&lt;/p&gt;
&lt;p&gt;This makes us suspect that the issue may not be caused by the resampling itself, but rather by something that is configured or initialized during LE Audio stream establishment.&lt;/p&gt;
&lt;p&gt;Could this behavior be related to the negotiated BAP/ASE/CIS/QoS configuration, ISO timing, or another Android-specific LE Audio configuration?&lt;/p&gt;
&lt;p&gt;Are there any known differences or issues with Pixel devices in this regard, or any LE Audio parameters/callbacks we should specifically check to determine why one connection starts in a good state while another starts in a degraded state?&lt;/p&gt;
&lt;p&gt;Thanks in advance for your help.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;br /&gt;Raphael&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>nRF52840 chip have SIL‑compliant</title><link>https://devzone.nordicsemi.com/thread/129114?ContentTypeID=0</link><pubDate>Mon, 07 Sep 2026 05:29:11 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:4b0c5a99-5c3c-4e2f-bb5f-6f3b3f6321c2</guid><dc:creator>Sam01234</dc:creator><slash:comments>2</slash:comments><comments>https://devzone.nordicsemi.com/thread/129114?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129114/nrf52840-chip-have-sil-compliant/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Does the nRF52840 chip have SIL‑compliant functional safety libraries according to the IEC 61508 standard?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>[Design Review] nRF52840 Custom Board - Schematic &amp; Layout Check</title><link>https://devzone.nordicsemi.com/thread/129113?ContentTypeID=0</link><pubDate>Mon, 07 Sep 2026 04:26:51 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:61374610-f0e5-4ee4-b7d6-8d38e8c1d6f7</guid><dc:creator>Van Le</dc:creator><slash:comments>5</slash:comments><comments>https://devzone.nordicsemi.com/thread/129113?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129113/design-review-nrf52840-custom-board---schematic-layout-check/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi Nordic Support Team,&lt;/p&gt;
&lt;p&gt;I have designed a custom board based on the nRF52840 and would appreciate it if you could review my schematic and PCB layout before I proceed with manufacturing.&lt;/p&gt;
&lt;p&gt;Here are the specifications of my design:&lt;br /&gt;- Target IC: nRF52840-QFAA (Package: QFN-48 / WQFN-48, 6x6 mm)&lt;br /&gt;- Power Supply: 3.7V LiPo battery charged via TP4056 with DW01S/FS8205A protection, regulated down to 3.3V via external LDO (AP2112K-3.3) feeding into VDD pins. (Normal Voltage Mode)&lt;br /&gt;- DC/DC Regulators: Enabled (DC/DC mode using external inductors L1 = 10uH on DCC and L2 = 15nH on DEC4/DEC6)&lt;br /&gt;- HF Clock: 32 MHz external crystal (X1: 3225 12pF with 12pF load capacitors)&lt;br /&gt;- LF Clock: 32.768 kHz external crystal (X2: 3215 12.5pF with 12pF load capacitors)&lt;br /&gt;- Antenna type: 2.4 GHz Meandered Inverted-F PCB Trace Antenna (MIFA) with an LC matching network (L3 = 4.7nH, C13 = 1pF, C14 = 1.2pF, L4 = 2.2nH)&lt;br /&gt;- Additional RF: Integrated PCB NFC antenna coil tuned with 91pF capacitors (C24, C26)&lt;br /&gt;- PCB Stackup:&lt;br /&gt; * Total Layers: 2-layer&lt;br /&gt; * Total Board Thickness: 1.6 mm (Standard FR-4, Er ~ 4.4, 1 oz copper)&lt;br /&gt; * Distance from Top Layer to Bottom GND Reference Plane: ~1.5 mm&lt;/p&gt;
&lt;p&gt;I have attached the design archive containing:&lt;br /&gt;1. Schematic (PDF &amp;amp; native design files)&lt;br /&gt;2. PCB Layout (Gerber files / native design files)&lt;br /&gt;3. Bill of Materials (BOM)&lt;/p&gt;
&lt;p&gt;Specific points I would like feedback on:&lt;br /&gt;1. RF transmission line layout and matching network values for the 2.4 GHz MIFA antenna.&lt;br /&gt;2. DC/DC regulator circuitry routing (DCC, DEC4/DEC6 inductors and caps).&lt;br /&gt;3. Decoupling capacitor placement and ground return path integrity under the MCU.&lt;br /&gt;4. NFC antenna trace geometry and tuning capacitor values.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thank you very much for your support!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>nRF54LM20A</title><link>https://devzone.nordicsemi.com/thread/129111?ContentTypeID=0</link><pubDate>Mon, 07 Sep 2026 03:46:29 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:4e050c08-aa59-43c8-b748-f8fa1801a5fc</guid><dc:creator>z c</dc:creator><slash:comments>1</slash:comments><comments>https://devzone.nordicsemi.com/thread/129111?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129111/nrf54lm20a/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;How much current budget should I provide for the VBUS pin of the nRF54LM20A?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>nRF93M1: plans to expose LTE Timing Advance through the AT command interface?</title><link>https://devzone.nordicsemi.com/thread/129110?ContentTypeID=0</link><pubDate>Sun, 06 Sep 2026 21:23:14 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:fbde60a3-15cf-409a-8335-cbd9f54ca934</guid><dc:creator>ing-barbiz</dc:creator><slash:comments>3</slash:comments><comments>https://devzone.nordicsemi.com/thread/129110?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129110/nrf93m1-plans-to-expose-lte-timing-advance-through-the-at-command-interface/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hello Nordic Support,&lt;/p&gt;
&lt;p&gt;I am developing a cellular positioning solution using an nRF93M1 LTE Cat 1 bis module.&lt;/p&gt;
&lt;p&gt;I currently use the following command to retrieve the serving cell and neighboring-cell measurements:&lt;/p&gt;
&lt;p&gt;AT%BCINFO=3,20&lt;/p&gt;
&lt;p&gt;The command provides:&lt;/p&gt;
&lt;p&gt;- EARFCN&lt;br /&gt;- PCI&lt;br /&gt;- RSRP&lt;br /&gt;- RSRQ&lt;br /&gt;- MCC/MNC&lt;br /&gt;- E-UTRAN Cell ID&lt;br /&gt;- TAC&lt;/p&gt;
&lt;p&gt;However, it does not appear to provide the LTE Timing Advance for the serving cell.&lt;/p&gt;
&lt;p&gt;On the nRF91/nRF91x1 family, the %NCELLMEAS response includes a&lt;br /&gt;&amp;lt;timing_advance&amp;gt; field and its measurement timestamp. I could not find an&lt;br /&gt;equivalent documented command or response field in the current nRF93M1 AT&lt;br /&gt;Commands Reference Guide.&lt;/p&gt;
&lt;p&gt;Timing Advance would be useful for improving third-party cellular positioning&lt;br /&gt;requests, for example when using APIs that accept the serving-cell Timing&lt;br /&gt;Advance in addition to ECI, TAC, PCI, EARFCN, RSRP, and neighbor measurements.&lt;/p&gt;
&lt;p&gt;Could you please clarify:&lt;/p&gt;
&lt;p&gt;1. Is the serving-cell Timing Advance currently available through any nRF93M1&lt;br /&gt; AT command or diagnostic interface?&lt;br /&gt;2. If not, is support planned for a future nRF93M1 module firmware release?&lt;/p&gt;
&lt;p&gt;Thank you&lt;/p&gt;
&lt;p&gt;marco&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Achieving pin retention in nRF54L15 GPIO without hardware pull-up through sys_reboot()</title><link>https://devzone.nordicsemi.com/thread/129108?ContentTypeID=0</link><pubDate>Fri, 04 Sep 2026 15:46:20 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ccf5573d-6ce5-4781-b66a-d615597afbba</guid><dc:creator>htownclyde</dc:creator><slash:comments>1</slash:comments><comments>https://devzone.nordicsemi.com/thread/129108?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129108/achieving-pin-retention-in-nrf54l15-gpio-without-hardware-pull-up-through-sys_reboot/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I have encountered a challenge with the nRF54L15 that I am hoping someone might know a solution for!&lt;/p&gt;
&lt;p&gt;My device has a power enable pin (on GPIO1) that must ideally *always* remain HIGH. Unfortunately, it has no HW pull-up and one cannot be added.&lt;/p&gt;
&lt;p&gt;So through software, I would like to keep this pin HIGH through sys_poweroff(), jumping to MCUboot, and resetting out of MCUboot.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My finding so far:&lt;/strong&gt;&amp;nbsp;The nRF54L15 has automatic pin retention for all GPIOs, but *only* through sys_poweroff() as it appears to be mainly intended as a power-saving feature to mitigate current leakage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My challenge&lt;/strong&gt;: Dropping into MCUboot from appcode hits a warm sys_reboot() - which clears the pin for ~5ms, and is problematic in my design.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;My solution so far is just to intercept all problematic sys_reboot() calls and instead use a scheduled GRTC wakeup + sys_poweroff() to keep pin retention, but ideally I don&amp;#39;t want to have to do this.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;: Is there any way to (without a dedicated HW pull-up) configure a GPIO on nRF54L15 to survive a sys_reboot() call?&lt;br /&gt;&lt;br /&gt;Thank you!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>PSA protected storage, encryption keys and FOTA</title><link>https://devzone.nordicsemi.com/thread/129107?ContentTypeID=0</link><pubDate>Fri, 04 Sep 2026 10:47:19 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:3ee581fb-0b31-43ce-8534-9c22235e8071</guid><dc:creator>Tom01</dc:creator><slash:comments>2</slash:comments><comments>https://devzone.nordicsemi.com/thread/129107?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129107/psa-protected-storage-encryption-keys-and-fota/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Dear Nordic team,&lt;/p&gt;
&lt;p&gt;we are developing an application for a nRF9151 which will perform some HTTPS requests. For that purpose we want to encrypt and store an API key (string of max. 32 characters). We are working with the non-secure board target and SDK v3.3.0. Our application was initially based on the &amp;quot;https_client&amp;quot; sample which uses the minimal TF-M profile for the nRF9151 DK board. We are aware that PSA protected storage is only available for the non-minimal TF-M profile.&amp;nbsp;Additionally, we are planning to implement a FOTA procedure using the available libraries. To plan ahead, we have some questions regarding the persistence of the protected storage, generated encryption keys and dependencies of the FOTA libraries.&amp;nbsp;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Are PSA protected storage&amp;#39;s key-value pairs persistent across firmware updates (e.g. FOTA) as long as the TF-M layout&amp;nbsp;and its profile remain unmodified?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Are encryption keys (like the one generated in the &amp;quot;persistent_key&amp;quot; sample) persistent across firmware updates (e.g. FOTA) as long as the TF-M layout&amp;nbsp;and its profile remain unmodified?&lt;/li&gt;
&lt;li&gt;Is the PSA protected storage a valid place to store information like API keys?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Does FOTA support directly rely on using the non-minimal TF-M profile or could we stick with the minimal profile?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Tom&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>l0destar - ultra low-power open-source hardware and software vehicle tracker you can build at home</title><link>https://devzone.nordicsemi.com/thread/129106?ContentTypeID=0</link><pubDate>Fri, 04 Sep 2026 10:31:39 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:f6b15f46-e2de-4821-a125-d230bf1ab17e</guid><dc:creator>m4rkw</dc:creator><slash:comments>3</slash:comments><comments>https://devzone.nordicsemi.com/thread/129106?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129106/l0destar---ultra-low-power-open-source-hardware-and-software-vehicle-tracker-you-can-build-at-home/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;p&gt;This isn&amp;#39;t about a problem so I&amp;#39;m not sure if this is an inappropriate post to make here, if so please feel free to remove it, however there is no commercial incentive to this so hopefully it will be received positively.&lt;/p&gt;
&lt;p&gt;I am building a completely open-source vehicle tracker that anyone can build at home - &lt;a href="https://l0destar.com"&gt;https://l0destar.com&lt;/a&gt;&amp;nbsp;- making use of the nRF9151 SIP via the Makerdiary Connect Kit.&lt;/p&gt;
&lt;p&gt;Thanks in part to the incredible power efficiency of the nRF9151 it currently achieves a sleep current of around ~120uA (yes, microamps) with the accelerometer armed and waking on movement or impact.&lt;/p&gt;
&lt;p&gt;I have working prototypes and have tracked about 85 miles so far in my own car with no problems.&lt;/p&gt;
&lt;p&gt;Anyone reading this and wishing to offer feedback, ideas, suggestions or anything else in relation to it would be most welcome &lt;span class="emoticon" data-url="https://devzone.nordicsemi.com/cfs-file/__key/system/emoji/1f642.svg" title="Slight smile"&gt;&amp;#x1f642;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Mark&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Clarification on CE RED Compliance of nRF52840 Variants</title><link>https://devzone.nordicsemi.com/thread/129105?ContentTypeID=0</link><pubDate>Fri, 04 Sep 2026 09:26:06 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:9cfad38c-fccc-4c51-92d8-79c7a1f5551c</guid><dc:creator>Gowsika</dc:creator><slash:comments>3</slash:comments><comments>https://devzone.nordicsemi.com/thread/129105?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129105/clarification-on-ce-red-compliance-of-nrf52840-variants/rss?ContentTypeId=0</wfw:commentRss><description>&lt;div&gt;
&lt;p&gt;Hello Nordic Semiconductor Team,&lt;/p&gt;
&lt;p&gt;I would like to clarify a component change in our Bluetooth device design.&lt;/p&gt;
&lt;p&gt;In our previous product, we used the &lt;strong&gt;nRF52840-QIAA-R&lt;/strong&gt; component, whereas in our new product we are using the &lt;strong&gt;nRF52840-QIAA-F-R&lt;/strong&gt; component.&lt;/p&gt;
&lt;p&gt;Could you please confirm whether both components have the same compliance status with respect to &lt;strong&gt;CE RED requirements&lt;/strong&gt;, including &lt;strong&gt;EMC, RF, and Safety&lt;/strong&gt; standards? We would like to understand if the component change has any impact on CE RED certification and compliance.&lt;/p&gt;
&lt;p&gt;Thank you for your support.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Gowsika G&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>NRF_MODEM_LIB_MEM_DIAG_ALLOC Kconfig setting needs log but increments the failed allocs (which is not only used for logging statistics but for diagnosis as well).</title><link>https://devzone.nordicsemi.com/thread/129103?ContentTypeID=0</link><pubDate>Fri, 04 Sep 2026 07:30:13 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ed1bfce0-6f73-4a08-9abc-22f8950bc643</guid><dc:creator>Peter Horauer</dc:creator><slash:comments>2</slash:comments><comments>https://devzone.nordicsemi.com/thread/129103?ContentTypeID=0</comments><wfw:commentRss>https://devzone.nordicsemi.com/f/nordic-q-a/129103/nrf_modem_lib_mem_diag_alloc-kconfig-setting-needs-log-but-increments-the-failed-allocs-which-is-not-only-used-for-logging-statistics-but-for-diagnosis-as-well/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I am using the SDK v3.4.0 LTS&lt;/p&gt;
&lt;p&gt;for modem error debugging I included:&lt;br /&gt;&lt;br /&gt;prj.conf&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;CONFIG_NRF_MODEM_LIB_MEM_DIAG=y

# depends on CONFIG_LOG=y
CONFIG_NRF_MODEM_LIB_MEM_DIAG_ALLOC=y&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;I am mapping errors depending on wether memory allocations failed.&lt;/p&gt;
&lt;p&gt;I am fetching the stats with nrf_modem_lib_diag_stats_get() and checking wether the stats.library.failed_allocs and&amp;nbsp;stats.shmem.failed_allocs&amp;nbsp;have incremented since last check. But these values are always passed as 0 when CONFIG_NRF_MODEM_LIB_MEM_DIAG_ALLOC is not&amp;nbsp;set to =y as the internal counter is only incremented when it the Kconfig is set.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;nrf_modem_os.c&lt;/span&gt;&lt;br /&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;void *nrf_modem_os_alloc(size_t bytes)
{
	extern uint32_t nrf_modem_lib_failed_allocs;
	void * const addr = k_heap_alloc(&amp;amp;nrf_modem_lib_heap, bytes, K_NO_WAIT);

	if (IS_ENABLED(CONFIG_NRF_MODEM_LIB_MEM_DIAG_ALLOC) &amp;amp;&amp;amp; !addr) {
		nrf_modem_lib_failed_allocs++;
	}

	return addr;
}

void *nrf_modem_os_shm_tx_alloc(size_t bytes)
{
extern uint32_t nrf_modem_lib_shmem_failed_allocs;

#if (CONFIG_SOC_SERIES_NRF92 &amp;amp;&amp;amp; CONFIG_DCACHE)
/* Allocate cache line aligned memory. */
void * const addr = k_heap_aligned_alloc(&amp;amp;nrf_modem_lib_shmem_heap, CONFIG_DCACHE_LINE_SIZE,
ROUND_UP(bytes, CONFIG_DCACHE_LINE_SIZE), K_NO_WAIT);
#else
void * const addr = k_heap_alloc(&amp;amp;nrf_modem_lib_shmem_heap, bytes, K_NO_WAIT);
#endif

if (IS_ENABLED(CONFIG_NRF_MODEM_LIB_MEM_DIAG_ALLOC) &amp;amp;&amp;amp; !addr) {
nrf_modem_lib_shmem_failed_allocs++;
}

return addr;
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;I have now implemented a workaround so CONFIG_LOG does not have to be used for this to work correctly with a custom Kconfig definition like the following:&lt;/p&gt;
&lt;p&gt;Kconfig&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;config NRF_MODEM_LIB_MEM_DIAG_ALLOC
bool
default y if NRF_MODEM_LIB_MEM_DIAG&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I do not understand why NRF_MODEM_LIB_MEM_DIAG_ALLOC depends on LOG, as it not only adds log functionality but also a counts the failed allocations inside the library. It seems like a bug to me that would not report the correct values for failed allocations if&amp;nbsp;&lt;span&gt;NRF_MODEM_LIB_MEM_DIAG_ALLOC is not used (which depends on LOG if not set otherwise like in my workaroung).&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>