nrf52840 S140 Central DFU Bluetooth Zephyr 2.0.0 nrf52840 peripheral

We have nrf52840 S140 BLE Central device that currently connects to TI based sensors. I have implemented code that can upgrade those TI sensors' firmware using the TI BLE protocol.

Now we are developing our own BLE peripheral sensors also based on the nrf52840 but now using the newly supported Zephyr 2.0.0. RF connect stuff. I can update the sensors using the Nordic Android program (unauthenticated for now) and now need to implement upgrading BLE DFU using our central device which connects to a cellular gateway.

I do not want to reinvent the wheel, writing existing code, like I had to do with the TI sensors.

Could you point me to code that allows a Central device to update a peripheral device BLE DFU?

If not where can I look to reinvent another wheel?

Thanks David

  • OK, you are of course correct about the last block and upload_chuck being updated.

    My Central code reports that the DFU goes well but the nRF9160-DK and my custom end units still do not upgrade.

     The image checksum compared to my harddrive is the same.

    [ami_smp.c: 676] DFU:317200/319026
    [ami_smp.c: 676] DFU:317600/319026
    [ami_smp.c: 676] DFU:318000/319026
    [ami_smp.c: 676] DFU:318400/319026
    [ami_smp.c: 676] DFU:318800/319026
    [ami_smp.c: 777] ImageChecksum AF3A0C7A
    [ami_smp.c: 911] SMP UploadOK
    [ami_smp.c:1192] ImageList
    
    -----------PRIMARY IMAGE-----------
          slot: 0
          version: 0.0.0
          hash: 0x76d196d413b84fe1177ba6c33a79744f579a07298a6a282d97ffd7a73d82ee6
          bootable: true
          pending: false
          confirmed: true
          active: true
          permanent: false
    
    -----------SECONDARY IMAGE-----------
          slot: 1
          version: 0.0.0
          hash: 0x4165b6dabeb5dfab85e276b4e927b2e32358d38f1ef8d698617c5f449a095
          bootable: true
          pending: false
          confirmed: false
          active: false
          permanent: false
    [ami_smp.c:1195] ImageTest
    
    -----------PRIMARY IMAGE-----------
          slot: 0
          version: 0.0.0
          hash: 0x76d196d413b84fe1177ba6c33a79744f579a07298a6a282d97ffd7a73d82ee6
          bootable: true
          pending: false
          confirmed: true
          active: true
          permanent: false
    
    -----------SECONDARY IMAGE-----------
          slot: 1
          version: 0.0.0
          hash: 0x4165b6dabeb5dfab85e276b4e927b2e32358d38f1ef8d698617c5f449a095
          bootable: true
          pending: true
          confirmed: false
          active: false
          permanent: false
    [ami_smp.c:1198] ImageReset
    22/02/2023 20:49:50[ami_ble.c: 861] Disconnected: C0:F1:EE:C6:31:44 (random) (reason 8)
    [ami_ble.c:2639] DFUConnectFinishedErr:0
    

    #define UPLOAD_CHUNK		400 // (50 worked) This has to be at least 32 bytes, since first it has to send the whole header (which is 32 bytes)
    void send_upload2(void)
    {
            uint8_t       data[UPLOAD_CHUNK+1]; // One more byte, to store '/0'
    	    zcbor_state_t zse[2];
      	    size_t        payload_len;
    		int           start_addr   = 0; // AMI_VIBEBT_PM_MCUBOOT_SECONDARY_ADDRESS; 
    		int           last_addr    = 0; // AMI_VIBEBT_PM_MCUBOOT_SECONDARY_ADDRESS+ami_state->dfu.ImageSize.ulong; 
    		int           curr_addr    = 0; // AMI_VIBEBT_PM_MCUBOOT_SECONDARY_ADDRESS;
    		int           upload_chunk = UPLOAD_CHUNK;
    		int           err;
            uint64_t      off = 0;
    	    bool          update_complete = false;
            uint8_t       encode_len;
    
    		ami_state->DFUErr                 = AMI_SMP_DFU_ERR_OK;
            ami_state->dfu.uAddChecksum.word  = 0;
            ami_state->dfu.uXORChecksum       = 0;
    		while (!update_complete){
    			struct smp_buffer smp_cmd;
    			zcbor_new_encode_state(zse, ARRAY_SIZE(zse), smp_cmd.payload,sizeof(smp_cmd.payload), 0);
    			//-----------------------------------------------------------------
    			// Wait until response is received until sending the next chunk
    			//-----------------------------------------------------------------
    			// ?!? err = k_sem_take(&upload_sem, K_MSEC(AMI_DFU_MAX_SEND_ACK_MS));		    
    			k_sem_take(&upload_sem, K_FOREVER);
    			last_addr    = ami_state->dfu.ImageSize.ulong;
                err = 0;
    			if (ami_state->DFUErr){
    			  d_printf(LINE_INFO,kDbg_Error|kDbg_Host,"SMPErr:%u",ami_state->DFUErr);
    			  update_complete = true;
    			  break;
    			}
    			//-------------------------------------------------------
    			// Disconnected?
    			//-------------------------------------------------------
    			if (!atomic_get(&ble_connected)){
    			  ami_state->DFUErr = AMI_DFU_ERR_DISCONNECTED;
    			  update_complete = true;
    			  break;
    			}
    			//-----------------------------------------------------------------
    			// No Error but semiphore times out!
    			//-----------------------------------------------------------------
    			if (err){
    			  ami_state->DFUErr = AMI_SMP_DFU_ERR_LOOP_TIMEOUT;
    			  update_complete = true;
    			  break;
    			}
    			//-----------------------------------------------------------------
    			// Last block?
    			//-----------------------------------------------------------------
    			if ((curr_addr+UPLOAD_CHUNK) > last_addr){
    				upload_chunk = last_addr - curr_addr;
    				update_complete = true;
    			}
    			progress_print(curr_addr-start_addr,last_addr-start_addr);
    			//-----------------------------------------------------------------
    			// Get the data block from ringbuffer
    			//-----------------------------------------------------------------
    			ami_state->DFUErr = ami_smp_RetDataBlock(data,upload_chunk);
    			if (ami_state->DFUErr){ 
    			  update_complete = true;
    			  break;
    			}
    			//-----------------------------------------------------------------
    			// First block add image size
    			//-----------------------------------------------------------------
    			off = curr_addr - start_addr;
    			if (off == 0){
    				encode_len = 8;
    			} else {
    				encode_len = 6;
    			}
    			data[upload_chunk] = '\0';
    			zse->constant_state->stop_on_error = true;
    			zcbor_map_start_encode(zse, encode_len);
    			zcbor_tstr_put_lit(zse, "image");
    			zcbor_int64_put(zse, 0);
    			zcbor_tstr_put_lit(zse, "data");
    			zcbor_bstr_put_lit(zse, data);
    			if(off == 0){
    				zcbor_tstr_put_lit(zse, "len");
    				zcbor_uint64_put(zse, (uint64_t)last_addr-start_addr);
    			}
    			zcbor_tstr_put_lit(zse, "off");
    			zcbor_uint64_put(zse, off);
    			if(off == 0){
    				zcbor_tstr_put_lit(zse, "sha");
    				zcbor_bstr_put_lit(zse, "12345");
    			}
    			zcbor_tstr_put_lit(zse, "upgrade");
    			zcbor_bool_put(zse, false);
    			zcbor_map_end_encode(zse, encode_len);
    
    			if (!zcbor_check_error(zse)) {
    				d_printf(LINE_INFO,kDbg_Error|kDbg_Host,"Failed to encode SMP test packet, err: %d", zcbor_pop_error(zse));
    				ami_state->DFUErr = AMI_SMP_DFU_ERR_UPLOAD_ENCODE;
    				break;
    			}
    			curr_addr+=upload_chunk;
    			payload_len = (size_t)(zse->payload - smp_cmd.payload);
    			smp_cmd.header.op = 2; /* write request */
    			smp_cmd.header.flags = 0;
    			smp_cmd.header.len_h8 = (uint8_t)((payload_len >> 8) & 0xFF);
    			smp_cmd.header.len_l8 = (uint8_t)((payload_len >> 0) & 0xFF);
    			smp_cmd.header.group_h8 = 0;
    			smp_cmd.header.group_l8 = 1; /* IMAGE */
    			smp_cmd.header.seq = 0;
    			smp_cmd.header.id  = 1; /* UPLOAD */
    			//-----------------------------------------------------------------
    			// ZCBOR error?
    			//-----------------------------------------------------------------
    			err = bt_dfu_smp_command(&dfu_smp,smp_upload_rsp_proc,sizeof(smp_cmd.header)+payload_len,&smp_cmd); 
    			if (err){
    			  d_printf(LINE_INFO,kDbg_Error|kDbg_Host,"bt_dfu_smp_command failed with %d", err);
    			  ami_state->DFUErr = AMI_SMP_DFU_ERR_SEND;
    			  break;
    			}
    		} // while
    		if (!ami_state->DFUErr){
    		  ami_smp_PrintChecksums();
    		  d_printf(LINE_INFO,kDbg_General|kDbg_Host,"SMP UploadOK");
    		}
      	    atomic_set(&smp_finished,true);
    } // send_upload2
    

    Could you please send me your nRF9160-Dk or other board's child mcuboot.conf file and the prg.conf file that you tested?

    Is the child mcuboot.conf file just additions to the default mcuboot prog.conf file?

     I still can't get the bootloader to output anything in the sensor's RTT log, but I see the additional printks

    00> ARRAY_SIZE(image_upload_decode): [6]
    00> req.off [0]
    00> req.size [319026]
    00> req.upgrade [0]
    00> req.image [0]
    00> req.img_data.len [400]
    00> req.img_data.value [536969252]
    00> req.data_sha.len [5]
    00> req.data_sha.value [536969671]

    (Connection lost)
    00> SEGGER J-Link V7.66a - Real time terminal output
    00> J-Link OB-K22-NordicSemi compiled Nov  7 2022 16:21:34 V1.0, SN=960005601
    00> Process: JLinkGDBServerCL.exe
    00> [00:00:00.035,827] <err> LSM6DSL: lsm6dsl_init: Failed to initialize chip
    00> *** Booting Zephyr OS build v3.2.99-ncs1 ***
    00> [00:00:00.036,529] <inf> mcumgr_zephyr_grp: zephyr_basic_mgmt_init: Registering Zephyr basic mgmt group
    00> 00/00/0000 00:00:00[ami_main.c: 631] Startup
    00> 00/00/0000 00:00:00[ami_cfg.c: 256] DeviceID:0
    00> 00/00/0000 00:00:00[ami_main.c: 448] MainInitErr:4096
    00> 00/00/0000 00:00:00[ami_main.c: 657] VaporBLE#0 23-Feb-2023 v1.0.0 1.0 2.23
    00> build time: Feb 23 2023 08:27:22
    00> [00:00:00.141,448] <inf> sdc_hci_driver: hci_driver_open: SoftDevice Controller build revision:
    00>                                          6d 90 41 2a 38 e8 ad 17  29 a5 03 38 39 27 d7 85 |m.A*8... )..89'..
    00>                                          1f 85 d8 e1                                      |....
    00> [00:00:00.145,721] <inf> bt_hci_core: hci_vs_init: HW Platform: Nordic Semiconductor (0x0002)
    00> [00:00:00.146,240] <inf> bt_hci_core: hci_vs_init: HW Variant: nRF52x (0x0002)
    00> [00:00:00.146,728] <inf> bt_hci_core: hci_vs_init: Firmware: Standard Bluetooth controller (0x00) Version 109.16784 Build 2917677098
    00> [00:00:00.147,827] <inf> bt_hci_core: bt_init: No ID address. App must call settings_load()
    00> 00/00/0000 00:00:00[ami_ble.c: 506] ActualTxPwr:8
    00> 00/00/0000 00:00:00[ami_ble.c: 788] Bluetooth initialized
    00> [00:00:00.149,383] <wrn> bt_hci_core: bt_set_name: Unable to store name
    00> [00:00:00.150,299] <inf> bt_hci_core: bt_dev_show_info: Identity: C0:F1:EE:C6:31:44 (random)
    00> [00:00:00.150,817] <inf> bt_hci_core: bt_dev_show_info: HCI: version 5.3 (0x0c) revision 0x11fa, manufacturer 0x0059
    00> [00:00:00.151,458] <inf> bt_hci_core: bt_dev_show_info: LMP: version 5.3 (0x0c) subver 0x11fa
    00> [00:00:00.152,191] <wrn> bt_hci_core: bt_set_name: Unable to store name
    00> 00/00/0000 00:00:00[ami_ble.c: 555] UpdateAdv x:0 y:0 z:0 Tmp:0 F:0x20
    00> 00/00/0000 00:00:00[ami_ble.c: 593] AdvertisingStarted
    00> 00/00/0000 00:00:00[ami_main.c: 676] BootConfirmed
    00> 00/00/0000 00:00:00[ami_main.c: 683] ResetCause:1
    00> [00:00:00.169,036] <err> bt_gatt: db_hash_store: Failed to save Database Hash (err -2)
    00> 01/01/2004 00:00:01[ami_adc.c: 470] RdLSM6DSLThread
    00> 01/01/2004 00:00:26[ami_main.c: 143] Connected
    00> 01/01/2004 00:00:26[ami_main.c: 198] LE PHY updated: TX PHY LE 2M, RX PHY LE 2M
    00> 01/01/2004 00:00:31[ami_main.c: 175] Connection parameters updated.
    00>  interval: 40, latency: 0, timeout: 42
    00> 01/01/2004 00:00:34[ami_main_serv.c:  58] Received data, handle 0, conn 0x20002860
    00> 22/02/2023 20:30:10[ami_main.c: 153] Disconnected reason:19
    00> 22/02/2023 20:30:10[ami_ble.c: 555] UpdateAdv x:0 y:0 z:0 Tmp:0 F:0x0
    00> 22/02/2023 20:30:10[ami_ble.c: 593] AdvertisingStarted
    00> 22/02/2023 20:30:11[ami_ble.c: 555] UpdateAdv x:0 y:0 z:0 Tmp:0 F:0x0
    00> 22/02/2023 20:30:35[ami_main.c: 601] NewMin
    00> 22/02/2023 20:31:24[ami_main.c: 143] Connected
    00> 22/02/2023 20:31:25[ami_main.c: 198] LE PHY updated: TX PHY LE 2M, RX PHY LE 2M
    00> 22/02/2023 20:31:29[ami_main.c: 175] Connection parameters updated.
    00>  interval: 40, latency: 0, timeout: 42
    00> ARRAY_SIZE(image_upload_decode): [6]
    00> req.off [0]
    00> req.size [319026]
    00> req.upgrade [0]
    00> req.image [0]
    00> req.img_data.len [400]
    00> req.img_data.value [536969252]
    00> req.data_sha.len [5]
    00> req.data_sha.value [536969671]
    00> 22/02/2023 20:31:34[ami_main.c: 175] Connection parameters updated.
    00>  interval: 9, latency: 0, timeout: 42
    00> 22/02/2023 20:31:35[ami_main.c: 601] NewMin
    00> 22/02/2023 20:32:35[ami_main.c: 601] NewMin
    00> [00:00:00.035,827] <err> LSM6DSL: lsm6dsl_init: Failed to initialize chip
    00> *** Booting Zephyr OS build v3.2.99-ncs1 ***
    00> [00:00:00.036,499] <inf> mcumgr_zephyr_grp: zephyr_basic_mgmt_init: Registering Zephyr basic mgmt group
    00> 00/00/0000 00:00:00[ami_main.c: 631] Startup
    00> 00/00/0000 00:00:00[ami_cfg.c: 256] DeviceID:0
    00> 00/00/0000 00:00:00[ami_main.c: 448] MainInitErr:4096
    00> 00/00/0000 00:00:00[ami_main.c: 657] VaporBLE#0 23-Feb-2023 v1.0.0 1.0 2.23
    00> build time: Feb 23 2023 08:27:22
    00> [00:00:00.141,448] <inf> sdc_hci_driver: hci_driver_open: SoftDevice Controller build revision:
    00>                                          6d 90 41 2a 38 e8 ad 17  29 a5 03 38 39 27 d7 85 |m.A*8... )..89'..
    00>                                          1f 85 d8 e1                                      |....
    00> [00:00:00.145,721] <inf> bt_hci_core: hci_vs_init: HW Platform: Nordic Semiconductor (0x0002)
    00> [00:00:00.146,240] <inf> bt_hci_core: hci_vs_init: HW Variant: nRF52x (0x0002)
    00> [00:00:00.146,728] <inf> bt_hci_core: hci_vs_init: Firmware: Standard Bluetooth controller (0x00) Version 109.16784 Build 2917677098
    00> [00:00:00.147,827] <inf> bt_hci_core: bt_init: No ID address. App must call settings_load()
    00> 00/00/0000 00:00:00[ami_ble.c: 506] ActualTxPwr:8
    00> 00/00/0000 00:00:00[ami_ble.c: 788] Bluetooth initialized
    00> [00:00:00.149,383] <wrn> bt_hci_core: bt_set_name: Unable to store name
    00> [00:00:00.150,299] <inf> bt_hci_core: bt_dev_show_info: Identity: C0:F1:EE:C6:31:44 (random)
    00> [00:00:00.150,817] <inf> bt_hci_core: bt_dev_show_info: HCI: version 5.3 (0x0c) revision 0x11fa, manufacturer 0x0059
    00> [00:00:00.151,458] <inf> bt_hci_core: bt_dev_show_info: LMP: version 5.3 (0x0c) subver 0x11fa
    00> [00:00:00.152,191] <wrn> bt_hci_core: bt_set_name: Unable to store name
    00> 00/00/0000 00:00:00[ami_ble.c: 555] UpdateAdv x:0 y:0 z:0 Tmp:0 F:0x20
    00> 00/00/0000 00:00:00[ami_ble.c: 593] AdvertisingStarted
    00> 00/00/0000 00:00:00[ami_main.c: 676] BootConfirmed
    00> 00/00/0000 00:00:00[ami_main.c: 683] ResetCause:1
    00> [00:00:00.169,036] <err> bt_gatt: db_hash_store: Failed to save Database Hash (err -2)
    00> 01/01/2004 00:00:01[ami_adc.c: 470] RdLSM6DSLThread

     

    Thanks David

  • DavidKaplan said:
    Could you please send me your nRF9160-Dk or other board's child mcuboot.conf file and the prg.conf file that you tested?

    For the SMP Server, I used code supplied by you,

    I used my Bluetooth: Central SMP Client DFU sample for the SMP Client. The only change was the UUID to make it connect to your device.
    This sample is an edited version of Simon's example.

    DavidKaplan said:
    Is the child mcuboot.conf file just additions to the default mcuboot prog.conf file?

    Yes. child_image/mcuboot.conf is added as extra configurations to the MCUboot default prj.conf.
    However, if you use child_image/mcuboot/prj.conf, it will overwrite the MCUboot configuration. I do not recommend using child_image/mcuboot/prj.conf.

    Regards,
    Sigurd Hellesvik

  • I understand the mcuboot configuration as you explained, mcuboot.conf are additions and prj.conf override.

    Then you say that you used my project definitions and get mcuboot information on the peripheral without any changes in the RTT log?

    I cannot see any bootloader mcuboot  information in the nRF9160 RTT log.

    So How did you get it? 

    What am I doing wrong?

    Your log:

    *** Booting Zephyr OS build v3.2.99-ncs1 ***
    I: Starting bootloader
    I: Primary image: magic=good, swap_type=0x2, copy_done=0x1, image_ok=0x1
    I: Secondary image: magic=good, swap_type=0x2, copy_done=0x3, image_ok=0x3
    I: Boot source: none
    I: Swap type: test
    I: Starting swap using move algorithm.
    I: Bootloader chainload address offset: 0xc000
    *** Booting Zephyr OS build v3.2.99-ncs1 ***
    [00:00:00.000,610] <inf> mcumgr_zephyr_grp: zephyr_basic_mgmt_init: Registering Zephyr basic mgmt group
    FFFFFFFFFFFFFFFFFFFFF
    

    My log:

    00> SEGGER J-Link V7.66a - Real time terminal output
    00> J-Link OB-K22-NordicSemi compiled Nov  7 2022 16:21:34 V1.0, SN=960005601
    00> Process: JLinkGDBServerCL.exe
    00> [00:00:00.035,827] <err> LSM6DSL: lsm6dsl_init: Failed to initialize chip
    00> *** Booting Zephyr OS build v3.2.99-ncs1 ***
    00> [00:00:00.036,529] <inf> mcumgr_zephyr_grp: zephyr_basic_mgmt_init: Registering Zephyr basic mgmt group
    00> 00/00/0000 00:00:00[ami_main.c: 631] Startup
    

    When I upload does the peripheral information seem OK?

    00> 22/02/2023 20:31:29[ami_main.c: 175] Connection parameters updated.
    00>  interval: 40, latency: 0, timeout: 42
    00> ARRAY_SIZE(image_upload_decode): [6]
    00> req.off [0]
    00> req.size [319026]
    00> req.upgrade [0]
    00> req.image [0]
    00> req.img_data.len [400]
    00> req.img_data.value [536969252]
    00> req.data_sha.len [5]
    00> req.data_sha.value [536969671]
    

    Thanks, and have a good weekend, David

  • DavidKaplan said:

    I cannot see any bootloader mcuboot  information in the nRF9160 RTT log.

    So How did you get it? 

    What am I doing wrong?

    Aha, this was a misunderstanding.

    Since working with the Development Kit, I used UART for logging.

    I have used RTT for logging from the Bootloader before, but I remember it to be unstable.
    Whether you want to continue trying to make Bootloader RTT work is up to you.

    Have you been able to update the peripheral using the changes I made to the SMP Client?

    Regards,
    Sigurd Hellesvik

  • Sorry but for some reason I could not get the nRF9160-Dk 's nrf52840 to output anything on its uart.

    According to the documentation, it should output on VCOM1 using uart TX P0.3 & RX P0.5.

    # ----------------------------------------
    # USE Uart Instead of RTT
    # ----------------------------------------
    CONFIG_UART_CONSOLE=y
    CONFIG_LOG_BACKEND_UART=y
    CONFIG_SERIAL=y
    # ----------------------------------------
    # Enable UART console, for printk()
    # ----------------------------------------
    CONFIG_CONSOLE_HANDLER=n
    CONFIG_CONSOLE=y
    CONFIG_PRINTK=y
    
    # ----------------------------------------
    # USE RTT  Instead of Uart
    # ----------------------------------------
    #CONFIG_CONSOLE=y
    #CONFIG_RTT_CONSOLE=y
    #CONFIG_USE_SEGGER_RTT=y
    #CONFIG_LOG_BACKEND_RTT=y
    

    What am I missing?

    Could you just post your board files?

    Also, on my central zephyr v2.2.0 complains about not using pin ctrl for the uart.

    I added the ms88sf2-pinctrl.dtsi file which I included in ms88sf2.dts

    &uart1 {
    	status = "okay";
    	current-speed = <115200>;
    	pinctrl-0 = <&uart1_default>;
    	pinctrl-1 = <&uart1_sleep>;
    	pinctrl-names = "default", "sleep";
    };
    

    &pinctrl {
    	uart1_default: uart1_default {
    		group1 {
    			psels = <NRF_PSEL(UART_TX, 0, 3)>,
    				<NRF_PSEL(UART_RTS, 1, 8)>;
    		};
    		group2 {
    			psels = <NRF_PSEL(UART_RX, 0, 5)>,
    				<NRF_PSEL(UART_CTS, 0, 7)>;
    			bias-pull-up;
    		};
    	};
    
    	uart1_sleep: uart1_sleep {
    		group1 {
    			psels = <NRF_PSEL(UART_TX, 0, 3)>,
    				<NRF_PSEL(UART_RX, 0, 5)>,
    				<NRF_PSEL(UART_RTS, 1, 8)>,
    				<NRF_PSEL(UART_CTS, 0, 7)>;
    			low-power-enable;
    		};
    	};
    
    };
    

                     from C:\ncs\v2.2.0\zephyr\drivers\serial\uart_nrfx_uarte.c:11:
    C:\ncs\v2.2.0\zephyr\include\zephyr\toolchain\gcc.h:77:36: error: static assertion failed: "/soc/uart@40028000 defined without required pin configuration"
       77 | #define BUILD_ASSERT(EXPR, MSG...) _Static_assert(EXPR, "" MSG)
          |                                    ^~~~~~~~~~~~~~
    c:\ncs\v2.2.0\zephyr\soc\arm\nordic_nrf\common\soc_nrf_common.h:218:9: note: in expansion of macro 'BUILD_ASSERT'
      218 |         BUILD_ASSERT((IS_ENABLED(CONFIG_PINCTRL) &&                     \
          |         ^~~~~~~~~~~~
    C:\ncs\v2.2.0\zephyr\drivers\serial\uart_nrfx_uarte.c:2080:9: note: in expansion of macro 'NRF_DT_CHECK_PIN_ASSIGNMENTS'
     2080 |         NRF_DT_CHECK_PIN_ASSIGNMENTS(UARTE(idx), 1,                            \
          |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
    C:\ncs\v2.2.0\zephyr\drivers\serial\uart_nrfx_uarte.c:2189:1: note: in expansion of macro 'UART_NRF_UARTE_DEVICE'
     2189 | UART_NRF_UARTE_DEVICE(1);
          | ^~~~~~~~~~~~~~~~~~~~~
    C:\ncs\v2.2.0\zephyr\include\zephyr\toolchain\gcc.h:77:36: error: static assertion failed: "/soc/uart@40028000 has pinctrl states defined although PINCTRL is not enabled"
       77 | #define BUILD_ASSERT(EXPR, MSG...) _Static_assert(EXPR, "" MSG)
          |                                    ^~~~~~~~~~~~~~
    c:\ncs\v2.2.0\zephyr\soc\arm\nordic_nrf\common\soc_nrf_common.h:234:9: note: in expansion of macro 'BUILD_ASSERT'
      234 |         BUILD_ASSERT(IS_ENABLED(CONFIG_PINCTRL) ||                      \
          |         ^~~~~~~~~~~~
    C:\ncs\v2.2.0\zephyr\drivers\serial\uart_nrfx_uarte.c:2080:9: note: in expansion of macro 'NRF_DT_CHECK_PIN_ASSIGNMENTS'
     2080 |         NRF_DT_CHECK_PIN_ASSIGNMENTS(UARTE(idx), 1,                            \
          |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
    C:\ncs\v2.2.0\zephyr\drivers\serial\uart_nrfx_uarte.c:2189:1: note: in expansion of macro 'UART_NRF_UARTE_DEVICE'
     2189 | UART_NRF_UARTE_DEVICE(1);
          | ^~~~~~~~~~~~~~~~~~~~~

Related