Use of the USB CDC ACM interface together with the BT Mesh Stack on the nRF52840 dongle

Dear Nordic developer community,

I am in the process of developing a communication with the PC via the USB CDC ACM interface of the nRF52840 chip. The information received from the PC will first be evaluated via this serial interface and then distributed via the BT Mesh. That is the plan. This plan is to be realized with the nRF52840 dongle, which will first be implemented and tested on the nRF52840 DK. The procedure for this is already available, has also been implemented and is running on the nRF52840 DK.

The main procedure initialise

  1. a few status LEDs
  2. and then the initialization of the serial interface,
  3. at the end Bluetooth is switched on and the mesh is initialized.

/** @file  main.c
 *  @brief This is a special BT Mesh Node that acts as the bridge between a computer and the BT Mesh.
 * 
 * As platform should be used Nordic's nRF52840 Dongle. The platform has its own USB Device as well as a BT Stack.
 */

// BT Mesh
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/drivers/gpio.h>				// for handling the GPIO Set - e.g. PS_HOLD pin for set system on or off
#include <bluetooth/mesh/models.h>
#include <bluetooth/mesh/dk_prov.h>
#include "model_handler.h"						// for BT mesh functions and the own vendor bt mesh
// Peripheral equipment
#include "serial.h"								// includes zephyr's => kernel.h | device.h | drivers/uart.h
#include "rgb_io.h"								// RGB Interface => to handle app states as an UI
#include <zephyr/sys/printk.h>					// for Logging with printk
// Logging
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(main, 3);

// Set pin for the hardware switch (only to measure the output in dongle & DK environment)
#define ZEPHYR_USER_NODE DT_PATH(zephyr_user)	// have a path to the attribute section inside the device tree
const struct gpio_dt_spec ps_hold_pin = GPIO_DT_SPEC_GET(ZEPHYR_USER_NODE, ps_hold_pin_gpios); // handles the GPIO container for the PS_HOLD pin, which should be set in the very beginning

static void bt_ready(int err) {

	if (err) { 	LOG_ERR("Bluetooth init failed (err %d)", err); return; }

	err = bt_mesh_init(bt_mesh_dk_prov_init(), model_handler_init()); 		// inside the model_handler_init() several clients will be created
	
	if (err) { 	LOG_ERR("Initializing mesh failed (err %d)", err); return; }

	if (IS_ENABLED(CONFIG_BT_MESH_LOW_POWER)) {
		bt_mesh_lpn_set(true);
	}

	if (IS_ENABLED(CONFIG_SETTINGS)) {
		settings_load();
	}

	/* This will be a no-op if settings_load() loaded provisioning info */
	bt_mesh_prov_enable(BT_MESH_PROV_ADV | BT_MESH_PROV_GATT);

	LOG_INF("Mesh initialized");
}

int main(void) {

	k_sleep(K_MSEC(200)); 	// wake up time 200 ms

	// Sets first serial message with platform & zephyr version
	printk("%s (Zephyr OS Build %s) is initializing...\n\n", CONFIG_USB_DEVICE_PRODUCT, STRINGIFY(BUILD_VERSION)); // set up the present platform with zephyr build version

	// Set power switch pin to active high
	if (!gpio_is_ready_dt(&ps_hold_pin)) { LOG_ERR("GPIO spec is not ready for use. PS_HOLD pin cannot be set."); return 0; } // the pin is defined in the top
	gpio_pin_configure_dt(&ps_hold_pin, GPIO_OUTPUT_HIGH); // set P0.28 ACTIVE HIGH, that pulls up the PS_HOLD line for the hardware switch which provides the supply voltage permanently
	
	/* BEGIN BOOT */
	int err;

	// Initializes the RGB LED, the thread for state changing on this LED & set STATE_BOOT
	rgb_io_init();			// initialize the RGB LED as well as the status display system | initializes the (low prior) thread for handling the given app states on the RGB LED
	err = rgb_io_update_app_state(RGB_IO_APP_STATE_TYPE_BASE, RGB_IO_BASE_STATE_BOOT, 50);					// indicate on RGB LED: boot start sequence
	while (err) err = rgb_io_update_app_state(RGB_IO_APP_STATE_TYPE_BASE, RGB_IO_BASE_STATE_BOOT, 50);		// retry if not successful, e.g. get no system time

	/**
	 * Initialize the serial interface
	 * 
	 * It sets a callback function 'serial_cb' for handling incoming data and enables UART receive interrupts. 
 	 * If there is an error in setting the callback, it prints an appropriate error message. 
 	 * Procedure:   1. check if device is ready (statically created uart_device, that points to uart-alias in the overlay.)
 	 *              2. enable USB subsystem [usb_enable()] and associated hardware ( if the underlying platform supports that, e.g. nRF52832 don't supports that )
 	 *              3. get UART line control (with DTR - data terminal ready) -> waits as long as the system initiates UART as well as the control of DTR state
 	 *              4. test the interrupt endpoint, in that way that a DSR and a DCD are placed on the controlled line | check also baudrate
 	 *              5. set interrupt handler (callback function) and enables the RX interrupt
	 */
	init_serial();	// enable USB, initialize UART, printing LOG messages as well as 'printk'-outputs
	
	k_sleep(K_MSEC(500)); // spend further bootup time 500 ms => for stabilization the hardware stacks

	err = bt_enable(bt_ready); // calls the BT enable function in hci_core.c and passes our callback function to our BT Mesh clients 
	if (err) { LOG_ERR("Bluetooth init failed (err %d)", err); }

	k_sleep(K_MSEC(2000));	// wait for the hardware

	err = rgb_io_update_app_state(RGB_IO_APP_STATE_TYPE_BASE, RGB_IO_BASE_STATE_BOOT_FIN, 50);				// indicate on LED: boot finished
	while (err) err = rgb_io_update_app_state(RGB_IO_APP_STATE_TYPE_BASE, RGB_IO_BASE_STATE_BOOT_FIN, 50);	// retry if not successful, e.g. get no system time
	LOG_INF("...booting is done!");
	/* END BOOT */

	err = rgb_io_update_app_state(RGB_IO_APP_STATE_TYPE_BASE, RGB_IO_BASE_STATE_RUN, 50);					// indicate on LED: running state
	while (err) err = rgb_io_update_app_state(RGB_IO_APP_STATE_TYPE_BASE, RGB_IO_BASE_STATE_RUN, 50);		// retry if not successful, e.g. get no system time

	return 0;
}

After the build process for the nRF52840 DK (no warnings, no errors) and the subsequent flashing, everything works perfectly. The serial interface shows me all log and output data and the processed data is sent to the mesh.

When I create a build for the dongle, the serial interface and the RGB LED on the system work, but only up to the point at which I want to initialise the BT Mesh. At this point, the system hangs and does not continue. The terminal can no longer connect to the serial interface and the RGB LED no longer changes its status.

I have already looked at the complete generated .configs of both system builds, but have not really found the decisive clue as to why it runs on the DK system and on the dongle only when either the serial interface or Bluetooth is switched off.

It would be great if you could take a look at the generated configs or use your wealth of experience to give me a tip as to why the USB / Mesh combination does not work on the dongle.
For a better overview, I have compared the two generated configuration files and copied all the differences to the top (after this line --- everthing is equal). This way you can see the different configuration attributes at a glance when comparing them in an editor; the generated configs are quite long. Hope that helps.

And of course, I can share the complete project, but I think it's a bit too much for now.


Thanks in advance for any help
best regards
uli

Config Files: 8764.build_config_nrf5240_DK.txt   0830.build_config_nrf5240_dongle.txt 

DTS-File nRF52840 DK: 

/dts-v1/;

/ {
	#address-cells = < 0x1 >;
	#size-cells = < 0x1 >;
	model = "Nordic nRF52840 DK NRF52840";
	compatible = "nordic,nrf52840-dk-nrf52840";
	chosen {
		zephyr,entropy = &cryptocell;
		zephyr,flash-controller = &flash_controller;
		zephyr,console = &cdc_acm_uart0;
		zephyr,shell-uart = &cdc_acm_uart0;
		zephyr,uart-mcumgr = &uart0;
		zephyr,bt-mon-uart = &uart0;
		zephyr,bt-c2h-uart = &uart0;
		zephyr,sram = &sram0;
		zephyr,flash = &flash0;
		zephyr,code-partition = &slot0_partition;
		zephyr,ieee802154 = &ieee802154;
	};
	aliases {
		led0 = &led0;
		led1 = &led1;
		led2 = &led2;
		sw0 = &button0;
		sw1 = &button1;
		sw2 = &button2;
		sw3 = &button3;
		bootloader-led0 = &led0;
		mcuboot-button0 = &button0;
		mcuboot-led0 = &led0;
		watchdog0 = &wdt0;
		spi-flash0 = &mx25r64;
		sensovo-uart = &cdc_acm_uart0;
		red-pwm-led = &red_pwm_led;
		green-pwm-led = &green_pwm_led;
		blue-pwm-led = &blue_pwm_led;
		ps-hold-pin = &gpio0;
	};
	soc {
		#address-cells = < 0x1 >;
		#size-cells = < 0x1 >;
		compatible = "nordic,nRF52840-QIAA", "nordic,nRF52840", "nordic,nRF52", "simple-bus";
		interrupt-parent = < &nvic >;
		ranges;
		nvic: interrupt-controller@e000e100 {
			#address-cells = < 0x1 >;
			compatible = "arm,v7m-nvic";
			reg = < 0xe000e100 0xc00 >;
			interrupt-controller;
			#interrupt-cells = < 0x2 >;
			arm,num-irq-priority-bits = < 0x3 >;
			phandle = < 0x1 >;
		};
		systick: timer@e000e010 {
			compatible = "arm,armv7m-systick";
			reg = < 0xe000e010 0x10 >;
			status = "disabled";
		};
		ficr: ficr@10000000 {
			compatible = "nordic,nrf-ficr";
			reg = < 0x10000000 0x1000 >;
			status = "okay";
		};
		uicr: uicr@10001000 {
			compatible = "nordic,nrf-uicr";
			reg = < 0x10001000 0x1000 >;
			status = "okay";
		};
		sram0: memory@20000000 {
			compatible = "mmio-sram";
			reg = < 0x20000000 0x40000 >;
		};
		clock: clock@40000000 {
			compatible = "nordic,nrf-clock";
			reg = < 0x40000000 0x1000 >;
			interrupts = < 0x0 0x1 >;
			status = "okay";
		};
		power: power@40000000 {
			compatible = "nordic,nrf-power";
			reg = < 0x40000000 0x1000 >;
			interrupts = < 0x0 0x1 >;
			status = "okay";
			#address-cells = < 0x1 >;
			#size-cells = < 0x1 >;
			gpregret1: gpregret1@4000051c {
				compatible = "nordic,nrf-gpregret";
				reg = < 0x4000051c 0x1 >;
				status = "okay";
			};
			gpregret2: gpregret2@40000520 {
				compatible = "nordic,nrf-gpregret";
				reg = < 0x40000520 0x1 >;
				status = "okay";
			};
		};
		radio: radio@40001000 {
			compatible = "nordic,nrf-radio";
			reg = < 0x40001000 0x1000 >;
			interrupts = < 0x1 0x1 >;
			status = "okay";
			ieee802154-supported;
			ble-2mbps-supported;
			ble-coded-phy-supported;
			tx-high-power-supported;
			ieee802154: ieee802154 {
				compatible = "nordic,nrf-ieee802154";
				status = "okay";
			};
		};
		uart0: uart@40002000 {
			compatible = "nordic,nrf-uarte";
			reg = < 0x40002000 0x1000 >;
			interrupts = < 0x2 0x1 >;
			status = "okay";
			current-speed = < 0x1c200 >;
			pinctrl-0 = < &uart0_default >;
			pinctrl-1 = < &uart0_sleep >;
			pinctrl-names = "default", "sleep";
		};
		i2c0: arduino_i2c: i2c@40003000 {
			compatible = "nordic,nrf-twi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40003000 0x1000 >;
			clock-frequency = < 0x186a0 >;
			interrupts = < 0x3 0x1 >;
			status = "okay";
			pinctrl-0 = < &i2c0_default >;
			pinctrl-1 = < &i2c0_sleep >;
			pinctrl-names = "default", "sleep";
		};
		spi0: spi@40003000 {
			compatible = "nordic,nrf-spi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40003000 0x1000 >;
			interrupts = < 0x3 0x1 >;
			max-frequency = < 0x7a1200 >;
			easydma-maxcnt-bits = < 0x10 >;
			status = "disabled";
			pinctrl-0 = < &spi0_default >;
			pinctrl-1 = < &spi0_sleep >;
			pinctrl-names = "default", "sleep";
		};
		i2c1: i2c@40004000 {
			compatible = "nordic,nrf-twi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40004000 0x1000 >;
			clock-frequency = < 0x186a0 >;
			interrupts = < 0x4 0x1 >;
			status = "disabled";
			pinctrl-0 = < &i2c1_default >;
			pinctrl-1 = < &i2c1_sleep >;
			pinctrl-names = "default", "sleep";
		};
		spi1: spi@40004000 {
			compatible = "nordic,nrf-spi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40004000 0x1000 >;
			interrupts = < 0x4 0x1 >;
			max-frequency = < 0x7a1200 >;
			easydma-maxcnt-bits = < 0x10 >;
			status = "okay";
			pinctrl-0 = < &spi1_default >;
			pinctrl-1 = < &spi1_sleep >;
			pinctrl-names = "default", "sleep";
		};
		nfct: nfct@40005000 {
			compatible = "nordic,nrf-nfct";
			reg = < 0x40005000 0x1000 >;
			interrupts = < 0x5 0x1 >;
			status = "okay";
		};
		gpiote: gpiote@40006000 {
			compatible = "nordic,nrf-gpiote";
			reg = < 0x40006000 0x1000 >;
			interrupts = < 0x6 0x5 >;
			status = "okay";
		};
		adc: adc@40007000 {
			compatible = "nordic,nrf-saadc";
			reg = < 0x40007000 0x1000 >;
			interrupts = < 0x7 0x1 >;
			status = "okay";
			#io-channel-cells = < 0x1 >;
			phandle = < 0x1b >;
		};
		timer0: timer@40008000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x40008000 0x1000 >;
			cc-num = < 0x4 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0x8 0x1 >;
			prescaler = < 0x0 >;
		};
		timer1: timer@40009000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x40009000 0x1000 >;
			cc-num = < 0x4 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0x9 0x1 >;
			prescaler = < 0x0 >;
		};
		timer2: timer@4000a000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x4000a000 0x1000 >;
			cc-num = < 0x4 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0xa 0x1 >;
			prescaler = < 0x0 >;
			phandle = < 0x17 >;
		};
		rtc0: rtc@4000b000 {
			compatible = "nordic,nrf-rtc";
			reg = < 0x4000b000 0x1000 >;
			cc-num = < 0x3 >;
			interrupts = < 0xb 0x1 >;
			status = "disabled";
			clock-frequency = < 0x8000 >;
			prescaler = < 0x1 >;
		};
		temp: temp@4000c000 {
			compatible = "nordic,nrf-temp";
			reg = < 0x4000c000 0x1000 >;
			interrupts = < 0xc 0x1 >;
			status = "okay";
		};
		rng: random@4000d000 {
			compatible = "nordic,nrf-rng";
			reg = < 0x4000d000 0x1000 >;
			interrupts = < 0xd 0x1 >;
			status = "okay";
		};
		ecb: ecb@4000e000 {
			compatible = "nordic,nrf-ecb";
			reg = < 0x4000e000 0x1000 >;
			interrupts = < 0xe 0x1 >;
			status = "okay";
		};
		ccm: ccm@4000f000 {
			compatible = "nordic,nrf-ccm";
			reg = < 0x4000f000 0x1000 >;
			interrupts = < 0xf 0x1 >;
			length-field-length-8-bits;
			status = "okay";
		};
		wdt: wdt0: watchdog@40010000 {
			compatible = "nordic,nrf-wdt";
			reg = < 0x40010000 0x1000 >;
			interrupts = < 0x10 0x1 >;
			status = "okay";
		};
		rtc1: rtc@40011000 {
			compatible = "nordic,nrf-rtc";
			reg = < 0x40011000 0x1000 >;
			cc-num = < 0x4 >;
			interrupts = < 0x11 0x1 >;
			status = "disabled";
			clock-frequency = < 0x8000 >;
			prescaler = < 0x1 >;
		};
		qdec: qdec0: qdec@40012000 {
			compatible = "nordic,nrf-qdec";
			reg = < 0x40012000 0x1000 >;
			interrupts = < 0x12 0x1 >;
			status = "disabled";
		};
		comp: comparator@40013000 {
			compatible = "nordic,nrf-comp";
			reg = < 0x40013000 0x1000 >;
			interrupts = < 0x13 0x1 >;
			status = "disabled";
			#io-channel-cells = < 0x1 >;
		};
		egu0: swi0: egu@40014000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40014000 0x1000 >;
			interrupts = < 0x14 0x1 >;
			status = "okay";
		};
		egu1: swi1: egu@40015000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40015000 0x1000 >;
			interrupts = < 0x15 0x1 >;
			status = "okay";
		};
		egu2: swi2: egu@40016000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40016000 0x1000 >;
			interrupts = < 0x16 0x1 >;
			status = "okay";
		};
		egu3: swi3: egu@40017000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40017000 0x1000 >;
			interrupts = < 0x17 0x1 >;
			status = "okay";
		};
		egu4: swi4: egu@40018000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40018000 0x1000 >;
			interrupts = < 0x18 0x1 >;
			status = "okay";
		};
		egu5: swi5: egu@40019000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40019000 0x1000 >;
			interrupts = < 0x19 0x1 >;
			status = "okay";
		};
		timer3: timer@4001a000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x4001a000 0x1000 >;
			cc-num = < 0x6 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0x1a 0x1 >;
			prescaler = < 0x0 >;
		};
		timer4: timer@4001b000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x4001b000 0x1000 >;
			cc-num = < 0x6 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0x1b 0x1 >;
			prescaler = < 0x0 >;
		};
		pwm0: pwm@4001c000 {
			compatible = "nordic,nrf-pwm";
			reg = < 0x4001c000 0x1000 >;
			interrupts = < 0x1c 0x1 >;
			status = "okay";
			#pwm-cells = < 0x3 >;
			pinctrl-0 = < &pwm0_default >;
			pinctrl-1 = < &pwm0_sleep >;
			pinctrl-names = "default", "sleep";
			phandle = < 0x19 >;
		};
		pdm0: pdm@4001d000 {
			compatible = "nordic,nrf-pdm";
			reg = < 0x4001d000 0x1000 >;
			interrupts = < 0x1d 0x1 >;
			status = "disabled";
		};
		acl: acl@4001e000 {
			compatible = "nordic,nrf-acl";
			reg = < 0x4001e000 0x1000 >;
			status = "okay";
		};
		flash_controller: flash-controller@4001e000 {
			compatible = "nordic,nrf52-flash-controller";
			reg = < 0x4001e000 0x1000 >;
			partial-erase;
			#address-cells = < 0x1 >;
			#size-cells = < 0x1 >;
			flash0: flash@0 {
				compatible = "soc-nv-flash";
				erase-block-size = < 0x1000 >;
				write-block-size = < 0x4 >;
				reg = < 0x0 0x100000 >;
				partitions {
					compatible = "fixed-partitions";
					#address-cells = < 0x1 >;
					#size-cells = < 0x1 >;
					boot_partition: partition@0 {
						label = "mcuboot";
						reg = < 0x0 0xc000 >;
					};
					slot0_partition: partition@c000 {
						label = "image-0";
						reg = < 0xc000 0x76000 >;
					};
					slot1_partition: partition@82000 {
						label = "image-1";
						reg = < 0x82000 0x76000 >;
					};
					storage_partition: partition@f8000 {
						label = "storage";
						reg = < 0xf8000 0x8000 >;
					};
				};
			};
		};
		ppi: ppi@4001f000 {
			compatible = "nordic,nrf-ppi";
			reg = < 0x4001f000 0x1000 >;
			status = "okay";
		};
		mwu: mwu@40020000 {
			compatible = "nordic,nrf-mwu";
			reg = < 0x40020000 0x1000 >;
			status = "okay";
		};
		pwm1: pwm@40021000 {
			compatible = "nordic,nrf-pwm";
			reg = < 0x40021000 0x1000 >;
			interrupts = < 0x21 0x1 >;
			status = "disabled";
			#pwm-cells = < 0x3 >;
		};
		pwm2: pwm@40022000 {
			compatible = "nordic,nrf-pwm";
			reg = < 0x40022000 0x1000 >;
			interrupts = < 0x22 0x1 >;
			status = "disabled";
			#pwm-cells = < 0x3 >;
		};
		spi2: spi@40023000 {
			compatible = "nordic,nrf-spi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40023000 0x1000 >;
			interrupts = < 0x23 0x1 >;
			max-frequency = < 0x7a1200 >;
			easydma-maxcnt-bits = < 0x10 >;
			status = "disabled";
			pinctrl-0 = < &spi2_default >;
			pinctrl-1 = < &spi2_sleep >;
			pinctrl-names = "default", "sleep";
		};
		rtc2: rtc@40024000 {
			compatible = "nordic,nrf-rtc";
			reg = < 0x40024000 0x1000 >;
			cc-num = < 0x4 >;
			interrupts = < 0x24 0x1 >;
			status = "disabled";
			clock-frequency = < 0x8000 >;
			prescaler = < 0x1 >;
		};
		i2s0: i2s@40025000 {
			compatible = "nordic,nrf-i2s";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40025000 0x1000 >;
			interrupts = < 0x25 0x1 >;
			status = "disabled";
		};
		usbd: zephyr_udc0: usbd@40027000 {
			compatible = "nordic,nrf-usbd";
			reg = < 0x40027000 0x1000 >;
			interrupts = < 0x27 0x1 >;
			num-bidir-endpoints = < 0x1 >;
			num-in-endpoints = < 0x7 >;
			num-out-endpoints = < 0x7 >;
			num-isoin-endpoints = < 0x1 >;
			num-isoout-endpoints = < 0x1 >;
			status = "okay";
			cdc_acm_uart0: cdc_acm_uart0 {
				compatible = "zephyr,cdc-acm-uart";
			};
		};
		uart1: arduino_serial: uart@40028000 {
			compatible = "nordic,nrf-uarte";
			reg = < 0x40028000 0x1000 >;
			interrupts = < 0x28 0x1 >;
			status = "disabled";
			current-speed = < 0x1c200 >;
			pinctrl-0 = < &uart1_default >;
			pinctrl-1 = < &uart1_sleep >;
			pinctrl-names = "default", "sleep";
		};
		qspi: qspi@40029000 {
			compatible = "nordic,nrf-qspi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40029000 0x1000 >, < 0x12000000 0x8000000 >;
			reg-names = "qspi", "qspi_mm";
			interrupts = < 0x29 0x1 >;
			status = "okay";
			pinctrl-0 = < &qspi_default >;
			pinctrl-1 = < &qspi_sleep >;
			pinctrl-names = "default", "sleep";
			mx25r64: mx25r6435f@0 {
				compatible = "nordic,qspi-nor";
				reg = < 0x0 >;
				writeoc = "pp4io";
				readoc = "read4io";
				sck-frequency = < 0x7a1200 >;
				jedec-id = [ C2 28 17 ];
				sfdp-bfp = [ E5 20 F1 FF FF FF FF 03 44 EB 08 6B 08 3B 04 BB EE FF FF FF FF FF 00 FF FF FF 00 FF 0C 20 0F 52 10 D8 00 FF 23 72 F5 00 82 ED 04 CC 44 83 68 44 30 B0 30 B0 F7 C4 D5 5C 00 BE 29 FF F0 D0 FF FF ];
				size = < 0x4000000 >;
				has-dpd;
				t-enter-dpd = < 0x2710 >;
				t-exit-dpd = < 0x88b8 >;
			};
		};
		pwm3: pwm@4002d000 {
			compatible = "nordic,nrf-pwm";
			reg = < 0x4002d000 0x1000 >;
			interrupts = < 0x2d 0x1 >;
			status = "disabled";
			#pwm-cells = < 0x3 >;
		};
		spi3: arduino_spi: spi@4002f000 {
			compatible = "nordic,nrf-spim";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x4002f000 0x1000 >;
			interrupts = < 0x2f 0x1 >;
			max-frequency = < 0x1e84800 >;
			easydma-maxcnt-bits = < 0x10 >;
			rx-delay-supported;
			rx-delay = < 0x2 >;
			status = "okay";
			cs-gpios = < &arduino_header 0x10 0x1 >;
			pinctrl-0 = < &spi3_default >;
			pinctrl-1 = < &spi3_sleep >;
			pinctrl-names = "default", "sleep";
		};
		gpio0: gpio@50000000 {
			compatible = "nordic,nrf-gpio";
			gpio-controller;
			reg = < 0x50000000 0x200 0x50000500 0x300 >;
			#gpio-cells = < 0x2 >;
			status = "okay";
			port = < 0x0 >;
			phandle = < 0x18 >;
		};
		gpio1: gpio@50000300 {
			compatible = "nordic,nrf-gpio";
			gpio-controller;
			reg = < 0x50000300 0x200 0x50000800 0x300 >;
			#gpio-cells = < 0x2 >;
			ngpios = < 0x10 >;
			status = "okay";
			port = < 0x1 >;
			phandle = < 0x1a >;
		};
		cryptocell: crypto@5002a000 {
			compatible = "nordic,nrf-cc310";
			reg = < 0x5002a000 0x1000 >;
			status = "okay";
			#address-cells = < 0x1 >;
			#size-cells = < 0x1 >;
			cryptocell310: crypto@5002b000 {
				compatible = "arm,cryptocell-310";
				reg = < 0x5002b000 0x1000 >;
				interrupts = < 0x2a 0x1 >;
			};
		};
	};
	pinctrl: pin-controller {
		compatible = "nordic,nrf-pinctrl";
		uart0_default: uart0_default {
			phandle = < 0x2 >;
			group1 {
				psels = < 0x6 >, < 0x20005 >;
			};
			group2 {
				psels = < 0x10008 >, < 0x30007 >;
				bias-pull-up;
			};
		};
		uart0_sleep: uart0_sleep {
			phandle = < 0x3 >;
			group1 {
				psels = < 0x6 >, < 0x10008 >, < 0x20005 >, < 0x30007 >;
				low-power-enable;
			};
		};
		uart1_default: uart1_default {
			phandle = < 0x10 >;
			group1 {
				psels = < 0x10021 >;
				bias-pull-up;
			};
			group2 {
				psels = < 0x22 >;
			};
		};
		uart1_sleep: uart1_sleep {
			phandle = < 0x11 >;
			group1 {
				psels = < 0x10021 >, < 0x22 >;
				low-power-enable;
			};
		};
		i2c0_default: i2c0_default {
			phandle = < 0x4 >;
			group1 {
				psels = < 0xc001a >, < 0xb001b >;
			};
		};
		i2c0_sleep: i2c0_sleep {
			phandle = < 0x5 >;
			group1 {
				psels = < 0xc001a >, < 0xb001b >;
				low-power-enable;
			};
		};
		i2c1_default: i2c1_default {
			phandle = < 0x8 >;
			group1 {
				psels = < 0xc001e >, < 0xb001f >;
			};
		};
		i2c1_sleep: i2c1_sleep {
			phandle = < 0x9 >;
			group1 {
				psels = < 0xc001e >, < 0xb001f >;
				low-power-enable;
			};
		};
		pwm0_default: pwm0_default {
			phandle = < 0xc >;
			group1 {
				psels = < 0x16000d >, < 0x17000e >, < 0x18000f >;
				nordic,invert;
			};
		};
		pwm0_sleep: pwm0_sleep {
			phandle = < 0xd >;
			group1 {
				psels = < 0x16000d >, < 0x17000e >, < 0x18000f >;
				low-power-enable;
			};
		};
		spi0_default: spi0_default {
			phandle = < 0x6 >;
			group1 {
				psels = < 0x4001b >, < 0x5001a >, < 0x6001d >;
			};
		};
		spi0_sleep: spi0_sleep {
			phandle = < 0x7 >;
			group1 {
				psels = < 0x4001b >, < 0x5001a >, < 0x6001d >;
				low-power-enable;
			};
		};
		spi1_default: spi1_default {
			phandle = < 0xa >;
			group1 {
				psels = < 0x4001f >, < 0x5001e >, < 0x60028 >;
			};
		};
		spi1_sleep: spi1_sleep {
			phandle = < 0xb >;
			group1 {
				psels = < 0x4001f >, < 0x5001e >, < 0x60028 >;
				low-power-enable;
			};
		};
		spi2_default: spi2_default {
			phandle = < 0xe >;
			group1 {
				psels = < 0x40013 >, < 0x50014 >, < 0x60015 >;
			};
		};
		spi2_sleep: spi2_sleep {
			phandle = < 0xf >;
			group1 {
				psels = < 0x40013 >, < 0x50014 >, < 0x60015 >;
				low-power-enable;
			};
		};
		qspi_default: qspi_default {
			phandle = < 0x12 >;
			group1 {
				psels = < 0x1d0013 >, < 0x1f0014 >, < 0x200015 >, < 0x210016 >, < 0x220017 >, < 0x1e0011 >;
				nordic,drive-mode = < 0x3 >;
			};
		};
		qspi_sleep: qspi_sleep {
			phandle = < 0x13 >;
			group1 {
				psels = < 0x1d0013 >, < 0x1f0014 >, < 0x200015 >, < 0x210016 >, < 0x220017 >;
				low-power-enable;
			};
			group2 {
				psels = < 0x1e0011 >;
				low-power-enable;
				bias-pull-up;
			};
		};
		spi3_default: spi3_default {
			phandle = < 0x15 >;
			group1 {
				psels = < 0x4002f >, < 0x6002e >, < 0x5002d >;
			};
		};
		spi3_sleep: spi3_sleep {
			phandle = < 0x16 >;
			group1 {
				psels = < 0x4002f >, < 0x6002e >, < 0x5002d >;
				low-power-enable;
			};
		};
	};
	rng_hci: entropy_bt_hci {
		compatible = "zephyr,bt-hci-entropy";
		status = "okay";
	};
	cpus {
		#address-cells = < 0x1 >;
		#size-cells = < 0x0 >;
		cpu@0 {
			device_type = "cpu";
			compatible = "arm,cortex-m4f";
			reg = < 0x0 >;
			#address-cells = < 0x1 >;
			#size-cells = < 0x1 >;
			itm: itm@e0000000 {
				compatible = "arm,armv7m-itm";
				reg = < 0xe0000000 0x1000 >;
				swo-ref-frequency = < 0x1e84800 >;
			};
		};
	};
	sw_pwm: sw-pwm {
		compatible = "nordic,nrf-sw-pwm";
		status = "disabled";
		generator = < &timer2 >;
		clock-prescaler = < 0x0 >;
		#pwm-cells = < 0x3 >;
	};
	leds {
		compatible = "gpio-leds";
		led0: led_0 {
			gpios = < &gpio0 0xd 0x1 >;
			label = "Green LED 0";
		};
		led1: led_1 {
			gpios = < &gpio0 0xe 0x1 >;
			label = "Green LED 1";
		};
		led2: led_2 {
			gpios = < &gpio0 0xf 0x1 >;
			label = "Green LED 2";
		};
		led3: led_3 {
			gpios = < &gpio0 0x10 0x1 >;
			label = "Green LED 3";
		};
	};
	pwmleds {
		compatible = "pwm-leds";
		red_pwm_led: red_pwm_led {
			pwms = < &pwm0 0x0 0x989680 0x1 >;
			label = "red channel";
		};
		green_pwm_led: green_pwm_led {
			pwms = < &pwm0 0x1 0x989680 0x1 >;
			label = "green channel";
		};
		blue_pwm_led: blue_pwm_led {
			pwms = < &pwm0 0x2 0x989680 0x1 >;
			label = "blue channel";
		};
	};
	buttons {
		compatible = "gpio-keys";
		button0: button_0 {
			gpios = < &gpio0 0xb 0x11 >;
			label = "Push button switch 0";
		};
		button1: button_1 {
			gpios = < &gpio0 0xc 0x11 >;
			label = "Push button switch 1";
		};
		button2: button_2 {
			gpios = < &gpio0 0x18 0x11 >;
			label = "Push button switch 2";
		};
		button3: button_3 {
			gpios = < &gpio0 0x19 0x11 >;
			label = "Push button switch 3";
		};
	};
	arduino_header: connector {
		compatible = "arduino-header-r3";
		#gpio-cells = < 0x2 >;
		gpio-map-mask = < 0xffffffff 0xffffffc0 >;
		gpio-map-pass-thru = < 0x0 0x3f >;
		gpio-map = < 0x0 0x0 &gpio0 0x3 0x0 >, < 0x1 0x0 &gpio0 0x4 0x0 >, < 0x2 0x0 &gpio0 0x1c 0x0 >, < 0x3 0x0 &gpio0 0x1d 0x0 >, < 0x4 0x0 &gpio0 0x1e 0x0 >, < 0x5 0x0 &gpio0 0x1f 0x0 >, < 0x6 0x0 &gpio1 0x1 0x0 >, < 0x7 0x0 &gpio1 0x2 0x0 >, < 0x8 0x0 &gpio1 0x3 0x0 >, < 0x9 0x0 &gpio1 0x4 0x0 >, < 0xa 0x0 &gpio1 0x5 0x0 >, < 0xb 0x0 &gpio1 0x6 0x0 >, < 0xc 0x0 &gpio1 0x7 0x0 >, < 0xd 0x0 &gpio1 0x8 0x0 >, < 0xe 0x0 &gpio1 0xa 0x0 >, < 0xf 0x0 &gpio1 0xb 0x0 >, < 0x10 0x0 &gpio1 0xc 0x0 >, < 0x11 0x0 &gpio1 0xd 0x0 >, < 0x12 0x0 &gpio1 0xe 0x0 >, < 0x13 0x0 &gpio1 0xf 0x0 >, < 0x14 0x0 &gpio0 0x1a 0x0 >, < 0x15 0x0 &gpio0 0x1b 0x0 >;
		phandle = < 0x14 >;
	};
	arduino_adc: analog-connector {
		compatible = "arduino,uno-adc";
		#io-channel-cells = < 0x1 >;
		io-channel-map = < 0x0 &adc 0x1 >, < 0x1 &adc 0x2 >, < 0x2 &adc 0x4 >, < 0x3 &adc 0x5 >, < 0x4 &adc 0x6 >, < 0x5 &adc 0x7 >;
	};
	zephyr,user {
		ps_hold_pin-gpios = < &gpio0 0x1c 0x0 >;
	};
};
    DTS-File nRF52840 Dongle:  
/dts-v1/;

/ {
	#address-cells = < 0x1 >;
	#size-cells = < 0x1 >;
	model = "Nordic nRF52840 Dongle NRF52840";
	compatible = "nordic,nrf52840-dongle-nrf52840";
	chosen {
		zephyr,entropy = &cryptocell;
		zephyr,flash-controller = &flash_controller;
		zephyr,console = &cdc_acm_uart;
		zephyr,shell-uart = &cdc_acm_uart;
		zephyr,uart-mcumgr = &cdc_acm_uart;
		zephyr,bt-mon-uart = &cdc_acm_uart;
		zephyr,bt-c2h-uart = &cdc_acm_uart;
		zephyr,sram = &sram0;
		zephyr,flash = &flash0;
		zephyr,code-partition = &slot0_partition;
		zephyr,ieee802154 = &ieee802154;
	};
	aliases {
		sw0 = &button0;
		led0 = &led0_green;
		led1 = &led1_red;
		led2 = &led1_green;
		led3 = &led1_blue;
		led0-green = &led0_green;
		led1-red = &led1_red;
		led1-green = &led1_green;
		led1-blue = &led1_blue;
		pwm-led0 = &red_pwm_led;
		pwm-led1 = &green_pwm_led;
		pwm-led2 = &blue_pwm_led;
		red-pwm-led = &red_pwm_led;
		green-pwm-led = &green_pwm_led;
		blue-pwm-led = &blue_pwm_led;
		mcuboot-button0 = &button0;
		mcuboot-led0 = &led0_green;
		watchdog0 = &wdt0;
		sensovo-uart = &cdc_acm_uart;
	};
	soc {
		#address-cells = < 0x1 >;
		#size-cells = < 0x1 >;
		compatible = "nordic,nRF52840-QIAA", "nordic,nRF52840", "nordic,nRF52", "simple-bus";
		interrupt-parent = < &nvic >;
		ranges;
		nvic: interrupt-controller@e000e100 {
			#address-cells = < 0x1 >;
			compatible = "arm,v7m-nvic";
			reg = < 0xe000e100 0xc00 >;
			interrupt-controller;
			#interrupt-cells = < 0x2 >;
			arm,num-irq-priority-bits = < 0x3 >;
			phandle = < 0x1 >;
		};
		systick: timer@e000e010 {
			compatible = "arm,armv7m-systick";
			reg = < 0xe000e010 0x10 >;
			status = "disabled";
		};
		ficr: ficr@10000000 {
			compatible = "nordic,nrf-ficr";
			reg = < 0x10000000 0x1000 >;
			status = "okay";
		};
		uicr: uicr@10001000 {
			compatible = "nordic,nrf-uicr";
			reg = < 0x10001000 0x1000 >;
			status = "okay";
		};
		sram0: memory@20000000 {
			compatible = "mmio-sram";
			reg = < 0x20000000 0x40000 >;
		};
		clock: clock@40000000 {
			compatible = "nordic,nrf-clock";
			reg = < 0x40000000 0x1000 >;
			interrupts = < 0x0 0x1 >;
			status = "okay";
		};
		power: power@40000000 {
			compatible = "nordic,nrf-power";
			reg = < 0x40000000 0x1000 >;
			interrupts = < 0x0 0x1 >;
			status = "okay";
			#address-cells = < 0x1 >;
			#size-cells = < 0x1 >;
			gpregret1: gpregret1@4000051c {
				compatible = "nordic,nrf-gpregret";
				reg = < 0x4000051c 0x1 >;
				status = "okay";
			};
			gpregret2: gpregret2@40000520 {
				compatible = "nordic,nrf-gpregret";
				reg = < 0x40000520 0x1 >;
				status = "okay";
			};
		};
		radio: radio@40001000 {
			compatible = "nordic,nrf-radio";
			reg = < 0x40001000 0x1000 >;
			interrupts = < 0x1 0x1 >;
			status = "okay";
			ieee802154-supported;
			ble-2mbps-supported;
			ble-coded-phy-supported;
			tx-high-power-supported;
			ieee802154: ieee802154 {
				compatible = "nordic,nrf-ieee802154";
				status = "okay";
			};
		};
		uart0: uart@40002000 {
			compatible = "nordic,nrf-uarte";
			reg = < 0x40002000 0x1000 >;
			interrupts = < 0x2 0x1 >;
			status = "okay";
			current-speed = < 0x1c200 >;
			pinctrl-0 = < &uart0_default >;
			pinctrl-1 = < &uart0_sleep >;
			pinctrl-names = "default", "sleep";
		};
		i2c0: i2c@40003000 {
			compatible = "nordic,nrf-twi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40003000 0x1000 >;
			clock-frequency = < 0x186a0 >;
			interrupts = < 0x3 0x1 >;
			status = "okay";
			pinctrl-0 = < &i2c0_default >;
			pinctrl-1 = < &i2c0_sleep >;
			pinctrl-names = "default", "sleep";
		};
		spi0: spi@40003000 {
			compatible = "nordic,nrf-spi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40003000 0x1000 >;
			interrupts = < 0x3 0x1 >;
			max-frequency = < 0x7a1200 >;
			easydma-maxcnt-bits = < 0x10 >;
			status = "disabled";
			pinctrl-0 = < &spi0_default >;
			pinctrl-1 = < &spi0_sleep >;
			pinctrl-names = "default", "sleep";
		};
		i2c1: i2c@40004000 {
			compatible = "nordic,nrf-twi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40004000 0x1000 >;
			clock-frequency = < 0x186a0 >;
			interrupts = < 0x4 0x1 >;
			status = "disabled";
			pinctrl-0 = < &i2c1_default >;
			pinctrl-1 = < &i2c1_sleep >;
			pinctrl-names = "default", "sleep";
		};
		spi1: spi@40004000 {
			compatible = "nordic,nrf-spi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40004000 0x1000 >;
			interrupts = < 0x4 0x1 >;
			max-frequency = < 0x7a1200 >;
			easydma-maxcnt-bits = < 0x10 >;
			status = "okay";
			pinctrl-0 = < &spi1_default >;
			pinctrl-1 = < &spi1_sleep >;
			pinctrl-names = "default", "sleep";
		};
		nfct: nfct@40005000 {
			compatible = "nordic,nrf-nfct";
			reg = < 0x40005000 0x1000 >;
			interrupts = < 0x5 0x1 >;
			status = "okay";
		};
		gpiote: gpiote@40006000 {
			compatible = "nordic,nrf-gpiote";
			reg = < 0x40006000 0x1000 >;
			interrupts = < 0x6 0x5 >;
			status = "okay";
		};
		adc: adc@40007000 {
			compatible = "nordic,nrf-saadc";
			reg = < 0x40007000 0x1000 >;
			interrupts = < 0x7 0x1 >;
			status = "okay";
			#io-channel-cells = < 0x1 >;
		};
		timer0: timer@40008000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x40008000 0x1000 >;
			cc-num = < 0x4 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0x8 0x1 >;
			prescaler = < 0x0 >;
		};
		timer1: timer@40009000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x40009000 0x1000 >;
			cc-num = < 0x4 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0x9 0x1 >;
			prescaler = < 0x0 >;
		};
		timer2: timer@4000a000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x4000a000 0x1000 >;
			cc-num = < 0x4 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0xa 0x1 >;
			prescaler = < 0x0 >;
			phandle = < 0xe >;
		};
		rtc0: rtc@4000b000 {
			compatible = "nordic,nrf-rtc";
			reg = < 0x4000b000 0x1000 >;
			cc-num = < 0x3 >;
			interrupts = < 0xb 0x1 >;
			status = "disabled";
			clock-frequency = < 0x8000 >;
			prescaler = < 0x1 >;
		};
		temp: temp@4000c000 {
			compatible = "nordic,nrf-temp";
			reg = < 0x4000c000 0x1000 >;
			interrupts = < 0xc 0x1 >;
			status = "okay";
		};
		rng: random@4000d000 {
			compatible = "nordic,nrf-rng";
			reg = < 0x4000d000 0x1000 >;
			interrupts = < 0xd 0x1 >;
			status = "okay";
		};
		ecb: ecb@4000e000 {
			compatible = "nordic,nrf-ecb";
			reg = < 0x4000e000 0x1000 >;
			interrupts = < 0xe 0x1 >;
			status = "okay";
		};
		ccm: ccm@4000f000 {
			compatible = "nordic,nrf-ccm";
			reg = < 0x4000f000 0x1000 >;
			interrupts = < 0xf 0x1 >;
			length-field-length-8-bits;
			status = "okay";
		};
		wdt: wdt0: watchdog@40010000 {
			compatible = "nordic,nrf-wdt";
			reg = < 0x40010000 0x1000 >;
			interrupts = < 0x10 0x1 >;
			status = "okay";
		};
		rtc1: rtc@40011000 {
			compatible = "nordic,nrf-rtc";
			reg = < 0x40011000 0x1000 >;
			cc-num = < 0x4 >;
			interrupts = < 0x11 0x1 >;
			status = "disabled";
			clock-frequency = < 0x8000 >;
			prescaler = < 0x1 >;
		};
		qdec: qdec0: qdec@40012000 {
			compatible = "nordic,nrf-qdec";
			reg = < 0x40012000 0x1000 >;
			interrupts = < 0x12 0x1 >;
			status = "disabled";
		};
		comp: comparator@40013000 {
			compatible = "nordic,nrf-comp";
			reg = < 0x40013000 0x1000 >;
			interrupts = < 0x13 0x1 >;
			status = "disabled";
			#io-channel-cells = < 0x1 >;
		};
		egu0: swi0: egu@40014000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40014000 0x1000 >;
			interrupts = < 0x14 0x1 >;
			status = "okay";
		};
		egu1: swi1: egu@40015000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40015000 0x1000 >;
			interrupts = < 0x15 0x1 >;
			status = "okay";
		};
		egu2: swi2: egu@40016000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40016000 0x1000 >;
			interrupts = < 0x16 0x1 >;
			status = "okay";
		};
		egu3: swi3: egu@40017000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40017000 0x1000 >;
			interrupts = < 0x17 0x1 >;
			status = "okay";
		};
		egu4: swi4: egu@40018000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40018000 0x1000 >;
			interrupts = < 0x18 0x1 >;
			status = "okay";
		};
		egu5: swi5: egu@40019000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40019000 0x1000 >;
			interrupts = < 0x19 0x1 >;
			status = "okay";
		};
		timer3: timer@4001a000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x4001a000 0x1000 >;
			cc-num = < 0x6 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0x1a 0x1 >;
			prescaler = < 0x0 >;
		};
		timer4: timer@4001b000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x4001b000 0x1000 >;
			cc-num = < 0x6 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0x1b 0x1 >;
			prescaler = < 0x0 >;
		};
		pwm0: pwm@4001c000 {
			compatible = "nordic,nrf-pwm";
			reg = < 0x4001c000 0x1000 >;
			interrupts = < 0x1c 0x1 >;
			status = "okay";
			#pwm-cells = < 0x3 >;
			pinctrl-0 = < &pwm0_default >;
			pinctrl-1 = < &pwm0_sleep >;
			pinctrl-names = "default", "sleep";
			phandle = < 0x11 >;
		};
		pdm0: pdm@4001d000 {
			compatible = "nordic,nrf-pdm";
			reg = < 0x4001d000 0x1000 >;
			interrupts = < 0x1d 0x1 >;
			status = "disabled";
		};
		acl: acl@4001e000 {
			compatible = "nordic,nrf-acl";
			reg = < 0x4001e000 0x1000 >;
			status = "okay";
		};
		flash_controller: flash-controller@4001e000 {
			compatible = "nordic,nrf52-flash-controller";
			reg = < 0x4001e000 0x1000 >;
			partial-erase;
			#address-cells = < 0x1 >;
			#size-cells = < 0x1 >;
			flash0: flash@0 {
				compatible = "soc-nv-flash";
				erase-block-size = < 0x1000 >;
				write-block-size = < 0x4 >;
				reg = < 0x0 0x100000 >;
				partitions {
					compatible = "fixed-partitions";
					#address-cells = < 0x1 >;
					#size-cells = < 0x1 >;
					boot_partition: partition@1000 {
						label = "mcuboot";
						reg = < 0x1000 0xf000 >;
					};
					slot0_partition: partition@10000 {
						label = "image-0";
						reg = < 0x10000 0x66000 >;
					};
					slot1_partition: partition@76000 {
						label = "image-1";
						reg = < 0x76000 0x66000 >;
					};
					storage_partition: partition@dc000 {
						label = "storage";
						reg = < 0xdc000 0x4000 >;
					};
				};
			};
		};
		ppi: ppi@4001f000 {
			compatible = "nordic,nrf-ppi";
			reg = < 0x4001f000 0x1000 >;
			status = "okay";
		};
		mwu: mwu@40020000 {
			compatible = "nordic,nrf-mwu";
			reg = < 0x40020000 0x1000 >;
			status = "okay";
		};
		pwm1: pwm@40021000 {
			compatible = "nordic,nrf-pwm";
			reg = < 0x40021000 0x1000 >;
			interrupts = < 0x21 0x1 >;
			status = "disabled";
			#pwm-cells = < 0x3 >;
		};
		pwm2: pwm@40022000 {
			compatible = "nordic,nrf-pwm";
			reg = < 0x40022000 0x1000 >;
			interrupts = < 0x22 0x1 >;
			status = "disabled";
			#pwm-cells = < 0x3 >;
		};
		spi2: spi@40023000 {
			compatible = "nordic,nrf-spim";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40023000 0x1000 >;
			interrupts = < 0x23 0x1 >;
			max-frequency = < 0x7a1200 >;
			easydma-maxcnt-bits = < 0x10 >;
			status = "disabled";
		};
		rtc2: rtc@40024000 {
			compatible = "nordic,nrf-rtc";
			reg = < 0x40024000 0x1000 >;
			cc-num = < 0x4 >;
			interrupts = < 0x24 0x1 >;
			status = "disabled";
			clock-frequency = < 0x8000 >;
			prescaler = < 0x1 >;
		};
		i2s0: i2s@40025000 {
			compatible = "nordic,nrf-i2s";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40025000 0x1000 >;
			interrupts = < 0x25 0x1 >;
			status = "disabled";
		};
		usbd: zephyr_udc0: usbd@40027000 {
			compatible = "nordic,nrf-usbd";
			reg = < 0x40027000 0x1000 >;
			interrupts = < 0x27 0x1 >;
			num-bidir-endpoints = < 0x1 >;
			num-in-endpoints = < 0x7 >;
			num-out-endpoints = < 0x7 >;
			num-isoin-endpoints = < 0x1 >;
			num-isoout-endpoints = < 0x1 >;
			status = "okay";
			cdc_acm_uart: cdc_acm_uart {
				compatible = "zephyr,cdc-acm-uart";
			};
		};
		uart1: uart@40028000 {
			compatible = "nordic,nrf-uarte";
			reg = < 0x40028000 0x1000 >;
			interrupts = < 0x28 0x1 >;
			status = "disabled";
		};
		qspi: qspi@40029000 {
			compatible = "nordic,nrf-qspi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40029000 0x1000 >, < 0x12000000 0x8000000 >;
			reg-names = "qspi", "qspi_mm";
			interrupts = < 0x29 0x1 >;
			status = "disabled";
		};
		pwm3: pwm@4002d000 {
			compatible = "nordic,nrf-pwm";
			reg = < 0x4002d000 0x1000 >;
			interrupts = < 0x2d 0x1 >;
			status = "disabled";
			#pwm-cells = < 0x3 >;
		};
		spi3: spi@4002f000 {
			compatible = "nordic,nrf-spim";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x4002f000 0x1000 >;
			interrupts = < 0x2f 0x1 >;
			max-frequency = < 0x1e84800 >;
			easydma-maxcnt-bits = < 0x10 >;
			rx-delay-supported;
			rx-delay = < 0x2 >;
			status = "disabled";
		};
		gpio0: gpio@50000000 {
			compatible = "nordic,nrf-gpio";
			gpio-controller;
			reg = < 0x50000000 0x200 0x50000500 0x300 >;
			#gpio-cells = < 0x2 >;
			status = "okay";
			port = < 0x0 >;
			phandle = < 0xf >;
		};
		gpio1: gpio@50000300 {
			compatible = "nordic,nrf-gpio";
			gpio-controller;
			reg = < 0x50000300 0x200 0x50000800 0x300 >;
			#gpio-cells = < 0x2 >;
			ngpios = < 0x10 >;
			status = "okay";
			port = < 0x1 >;
			phandle = < 0x10 >;
		};
		cryptocell: crypto@5002a000 {
			compatible = "nordic,nrf-cc310";
			reg = < 0x5002a000 0x1000 >;
			status = "okay";
			#address-cells = < 0x1 >;
			#size-cells = < 0x1 >;
			cryptocell310: crypto@5002b000 {
				compatible = "arm,cryptocell-310";
				reg = < 0x5002b000 0x1000 >;
				interrupts = < 0x2a 0x1 >;
			};
		};
	};
	pinctrl: pin-controller {
		compatible = "nordic,nrf-pinctrl";
		uart0_default: uart0_default {
			phandle = < 0x2 >;
			group1 {
				psels = < 0x14 >, < 0x20011 >;
			};
			group2 {
				psels = < 0x10018 >, < 0x30016 >;
				bias-pull-up;
			};
		};
		uart0_sleep: uart0_sleep {
			phandle = < 0x3 >;
			group1 {
				psels = < 0x14 >, < 0x10018 >, < 0x20011 >, < 0x30016 >;
				low-power-enable;
			};
		};
		i2c0_default: i2c0_default {
			phandle = < 0x4 >;
			group1 {
				psels = < 0xc001a >, < 0xb001b >;
			};
		};
		i2c0_sleep: i2c0_sleep {
			phandle = < 0x5 >;
			group1 {
				psels = < 0xc001a >, < 0xb001b >;
				low-power-enable;
			};
		};
		i2c1_default: i2c1_default {
			phandle = < 0x8 >;
			group1 {
				psels = < 0xc001e >, < 0xb001f >;
			};
		};
		i2c1_sleep: i2c1_sleep {
			phandle = < 0x9 >;
			group1 {
				psels = < 0xc001e >, < 0xb001f >;
				low-power-enable;
			};
		};
		pwm0_default: pwm0_default {
			phandle = < 0xc >;
			group1 {
				psels = < 0x160008 >, < 0x170029 >, < 0x18000c >;
				nordic,invert;
			};
		};
		pwm0_sleep: pwm0_sleep {
			phandle = < 0xd >;
			group1 {
				psels = < 0x160008 >, < 0x170029 >, < 0x18000c >;
				low-power-enable;
			};
		};
		spi0_default: spi0_default {
			phandle = < 0x6 >;
			group1 {
				psels = < 0x4001b >, < 0x5001a >, < 0x6002a >;
			};
		};
		spi0_sleep: spi0_sleep {
			phandle = < 0x7 >;
			group1 {
				psels = < 0x4001b >, < 0x5001a >, < 0x6002a >;
				low-power-enable;
			};
		};
		spi1_default: spi1_default {
			phandle = < 0xa >;
			group1 {
				psels = < 0x4001f >, < 0x5001e >, < 0x6002d >;
			};
		};
		spi1_sleep: spi1_sleep {
			phandle = < 0xb >;
			group1 {
				psels = < 0x4001f >, < 0x5001e >, < 0x6002d >;
				low-power-enable;
			};
		};
	};
	rng_hci: entropy_bt_hci {
		compatible = "zephyr,bt-hci-entropy";
		status = "okay";
	};
	cpus {
		#address-cells = < 0x1 >;
		#size-cells = < 0x0 >;
		cpu@0 {
			device_type = "cpu";
			compatible = "arm,cortex-m4f";
			reg = < 0x0 >;
			#address-cells = < 0x1 >;
			#size-cells = < 0x1 >;
			itm: itm@e0000000 {
				compatible = "arm,armv7m-itm";
				reg = < 0xe0000000 0x1000 >;
				swo-ref-frequency = < 0x1e84800 >;
			};
		};
	};
	sw_pwm: sw-pwm {
		compatible = "nordic,nrf-sw-pwm";
		status = "disabled";
		generator = < &timer2 >;
		clock-prescaler = < 0x0 >;
		#pwm-cells = < 0x3 >;
	};
	leds {
		compatible = "gpio-leds";
		led0_green: led_0 {
			gpios = < &gpio0 0x6 0x1 >;
			label = "Green LED 0";
		};
		led1_red: led_1 {
			gpios = < &gpio0 0x8 0x1 >;
			label = "Red LED 1";
		};
		led1_green: led_2 {
			gpios = < &gpio1 0x9 0x1 >;
			label = "Green LED 1";
		};
		led1_blue: led_3 {
			gpios = < &gpio0 0xc 0x1 >;
			label = "Blue LED 1";
		};
	};
	pwmleds {
		compatible = "pwm-leds";
		red_pwm_led: red_pwm_led {
			pwms = < &pwm0 0x0 0x989680 0x1 >;
			label = "red channel";
		};
		green_pwm_led: green_pwm_led {
			pwms = < &pwm0 0x1 0x989680 0x1 >;
			label = "green channel";
		};
		blue_pwm_led: blue_pwm_led {
			pwms = < &pwm0 0x2 0x989680 0x1 >;
			label = "blue channel";
		};
	};
	buttons {
		compatible = "gpio-keys";
		button0: button_0 {
			gpios = < &gpio1 0x6 0x11 >;
			label = "Push button switch 0";
		};
	};
	zephyr,user {
		ps_hold_pin-gpios = < &gpio0 0x1d 0x0 >;
	};
};


P.S. here are the details of my setup - and please feel free to ask me if anything is unclear
---------------------------------------
OS: Windows 10
nRF Connect v5.0.2 (Programmer v4.4.0 / Terminal v1.4.1)
SDK v2.4.3 (Zephyr 3.3.99)
DK: NRF52840_xxAA_REV3
Dongle: NRF52840 (PCA 10059)
bt_hci_core: Firmware: Standard Bluetooth controller, Version 152.30490 Build 4211350319

  • I have some more info after debugging the dongle via the nRF52 DK until the system crashed:

    • Inside <int bt_enable(bt_ready_cb_t cb)> [from the hci_core.c file] the implemented and sent callback function is initialised.
    • At the end of this function, <bt_mesh_prov(BT_MESH_PROV_ADV | BT_MESH_PROV_GATT);> is called.
    • At the end of this function, there are two queries (one ADV and one GATT) in which the callback is to be linked to the provsioning bearer:
      • bt_mesh_pb_adv.link_accept(bt_mesh_prov_bearer_cb_get(), NULL);. ( prov_device.c ).
      • When returning to "bt_mesh_pb_adv", the pointer to the prov_bearer is still returned.
      • On the second return to "bt_mesh_pb_gatt" there is a system crash in the "prov.c" file.

    int main(void) {
    
    	[...]
    	init_serial();	// enable USB, initialize UART, printing LOG messages as well as 'printk'-outputs
        [...]
    	err = bt_enable(bt_ready); // calls the BT enable function in hci_core.c and passes our callback function to our BT Mesh clients 
        
        ------------------
        int bt_enable(bt_ready_cb_t cb) { [...] k_work_submit(&bt_dev.init); return 0; }
        ------------------
        static void bt_ready(int err) { [...] bt_mesh_prov_enable(BT_MESH_PROV_ADV | BT_MESH_PROV_GATT); }
        ------------------
        int bt_mesh_prov_enable(bt_mesh_prov_bearer_t bearers) { 
            [...]
        	if (IS_ENABLED(CONFIG_BT_MESH_PB_ADV) &&
        	    (bearers & BT_MESH_PROV_ADV)) {
        		bt_mesh_pb_adv.link_accept(bt_mesh_prov_bearer_cb_get(), NULL);
        	    ------------------
            	    const struct prov_bearer_cb *bt_mesh_prov_bearer_cb_get(void) { 
            	        return &prov_bearer_cb;  // HERE IT STILL WORKS
            	    }
        	    ------------------
            }
        	if (IS_ENABLED(CONFIG_BT_MESH_PB_GATT) &&
        	    (bearers & BT_MESH_PROV_GATT)) {
        		bt_mesh_pb_gatt.link_accept(bt_mesh_prov_bearer_cb_get(), NULL);
        		------------------
            	    const struct prov_bearer_cb *bt_mesh_prov_bearer_cb_get(void) { 
            	        return &prov_bearer_cb;  // HERE CRASHES
            	    }
        	    ------------------
        	}
        [...]
        


    Thanks for looking at it, 
    sunny regards
    uli

  • Hello Uli,

    Sorry for the late reply. 

    When you debug, and find the place where it crashes. What does that mean? Does it stop/hang? Does the (RTT) log say anything at this point in time? If you have a debugger connected you can monitor the RTT log. 

    And if it is inconclusive, feel free to upload the DK and dongle application files so that I can have a look. It is easier to test and try to replicate than reading through thousands of lines of config not knowing what to look for. 

    And how did you flash the application to the dongle? Via the pre-programmed bootloader, or using a debugger? If you used a debugger, does that mean that you have erased the pre-programmed bootloader?

    Best regards,

    Edvin

  • Hey Edvin,

    don't worry, I wrote this post right before the weekend, so I don't expect to get an answer soon.

    My debug environment is: VS Code & nRF Connect and a nRF52 DK. (I have also tried to use only the nRF52840 DK, but it crashes during serial initialisation or the debugger hangs.)

    At the place of system crash i mentioned above leads to a "fatal errer: Kernel oops". 

    The output from DEBUG CONSOLE is the following:

    JLinkGDBServerCL: SEGGER J-Link GDB Server V7.94e Command Line Version
    JLinkGDBServerCL: 
    JLinkGDBServerCL: JLinkARM.dll V7.94e (DLL compiled Jan 15 2024 15:18:46)
    JLinkGDBServerCL: 
    JLinkGDBServerCL: -----GDB Server start settings-----
    JLinkGDBServerCL: GDBInit file:                  none
    JLinkGDBServerCL: GDB Server Listening port:     58968
    JLinkGDBServerCL: SWO raw output listening port: 2332
    JLinkGDBServerCL: Terminal I/O port:             2333
    JLinkGDBServerCL: Accept remote connection:      localhost only
    JLinkGDBServerCL: Generate logfile:              off
    JLinkGDBServerCL: Verify download:               off
    JLinkGDBServerCL: Init regs on start:            off
    JLinkGDBServerCL: Silent mode:                   on
    JLinkGDBServerCL: Single run mode:               on
    JLinkGDBServerCL: Target connection timeout:     0 ms
    JLinkGDBServerCL: ------J-Link related settings------
    JLinkGDBServerCL: J-Link Host interface:         USB
    JLinkGDBServerCL: J-Link script:                 none
    JLinkGDBServerCL: J-Link settings file:          none
    JLinkGDBServerCL: ------Target related settings------
    JLinkGDBServerCL: Target device:                 nRF52840_xxAA
    JLinkGDBServerCL: Target device parameters:      none
    JLinkGDBServerCL: Target interface:              SWD
    JLinkGDBServerCL: Target interface speed:        12000kHz
    JLinkGDBServerCL: Target endian:                 little
    JLinkGDBServerCL: 
    =thread-group-added,id="i1"
    =cmd-param-changed,param="pagination",value="off"
    z_arm_reset () at C:/ncs/v2.4.3/zephyr/arch/arm/core/aarch32/cortex_m\reset.S:73
    73	    movs.n r0, #0
    [New Remote target]
    [New Thread 536891328]
    [New Thread 536891144]
    [New Thread 536880744]
    [New Thread 536882016]
    [New Thread 536882232]
    [New Thread 536890928]
    [New Thread 536891512]
    [New Thread 536885248]
    [New Thread 536880560]
    [Switching to Thread 536891328]
    
    Thread 3 hit Breakpoint 1, main () at ../src/main.c:46
    46	int main(void) {
    Execute debugger commands using "-exec <command>" or "`<command>", for example "-exec info registers" or "`info registers" will list registers in use (when GDB is the debugger)
    [New Thread 536880560]
    
    Thread 3 hit Breakpoint 4, main () at ../src/main.c:76
    76		init_serial();	// enable USB, initialize UART, printing LOG messages as well as 'printk'-outputs
    [New Thread 536882448]
    [New Thread 536882632]
    [New Thread 536890696]
    [New Thread 536884792]
    [Switching to Thread 536891512]
    
    Thread 9 hit Breakpoint 2, bt_ready (err=0) at ../src/main.c:42
    42		bt_mesh_prov_enable(BT_MESH_PROV_ADV | BT_MESH_PROV_GATT); // with the bit wise 'OR' ()"1"|"2" =) "3" => (01 | 10 =) 11 (bit-style) is send
    
    Thread 9 hit Breakpoint 6, bt_mesh_prov_bearer_cb_get () at C:/ncs/v2.4.3/zephyr/subsys/bluetooth/mesh/prov.c:417
    417		return &prov_bearer_cb;
    
    Thread 9 hit Breakpoint 5, bt_mesh_prov_enable (bearers=bearers@entry=(BT_MESH_PROV_ADV | BT_MESH_PROV_GATT)) at C:/ncs/v2.4.3/zephyr/subsys/bluetooth/mesh/prov_device.c:685
    685		if (IS_ENABLED(CONFIG_BT_MESH_PB_GATT) &&
    
    Thread 9 hit Breakpoint 6, bt_mesh_prov_bearer_cb_get () at C:/ncs/v2.4.3/zephyr/subsys/bluetooth/mesh/prov.c:417
    417		return &prov_bearer_cb;
    [New Remote target]
    [Switching to Remote target]
    
    Thread 17 hit Breakpoint 7, k_sys_fatal_error_handler (reason=3, esf=0x2000b85c <z_interrupt_stacks+1948>) at C:/ncs/v2.4.3/nrf/lib/fatal_error/fatal_error.c:18
    18	{



    Regarding your question about flashing:
    (Firstly, I have several dongles ;-), one that is connected to the nRF52 DK and several with pre-programmed bootloader on it). I do the (standalone) app flashing via the nRF Connect Tool using the generated hex file and the pre-programmed bootloader. However, with the compiled NRF5_BOOTLOADER=y and the included fstab-stock.dts settings. This is changed for debugging. With the changed conf and dts settings, I flash the dongle connected to the nRF52 DK from VS Code. Everything according to your https://devzone.nordicsemi.com/guides/short-range-guides/b/getting-started/posts/nrf52840-dongle-programming-tutorial.

    Here is the complete project: mesh_node_uart.zip

    To compile your own build version, you would have to select the nrf52840dongle.overlay and the prj_dongle.conf. And for debugging, you should also go to the board settings of the 2.4.3 SDK (here is the path: \ncs\v2.4.3\zephyr\boards\arm\nrf52840dongle_nrf52840 ) in the Kconfig the entry BOARD_HAS_NRF5_BOOTLOADER=n and in the nrf52840dongle_nrf52840.dts instead of the line #include "fstab-stock.dts" use the line #include "fstab-debugger.dts". I probably didn't need to write that to you, because of course you know that.

    Many thanks in advance for your help.

    Best regards Uli

  • Dear Edvin,

    I played around a bit with the reproducibility of the problem. Because I also wanted to be able to check the process on the nRF52840 DK. On that I was already able to use our system (serial interface incl. BT Mesh) to analyse a transferred protocol:

    • But every time I started the debugger, the nRF52840 DK system ran into a ‘fatal error’ at the breakpoints during the initialisation of the serial interface.
    • On reflection, it occurred to me that the hardware of time-based systems such as UART requires certain response times during initialisation, which must not be undercut.
    • So I removed all breakpoints during the initialisation of the serial interface and came to exactly the initialisation point of BT Mesh that leads to the error as mentioned in the post above.
    • This allowed me to reproduce the same error on the nRF52840 DK as on the nRF52 DK with the nRF52840 dongle connected.
    • But I thought to myself that BT Mesh/BLE is also a time-based system and that certain response times or, in this case, a switch to another ‘worker’ is necessary at certain times.
    • So I started the debugger again on the nRF52 DK and found out that this system also runs through without errors, as long as the serial initialisation or the initialisation of BT Mesh is not interrupted.
    • On both systems (nRF52 DK with connected nRF52840 dongle & nRF52840 DK) the project can be compiled, debugged and executed without any problems

    Sometimes it makes sense to take a look at the datasheet of the microcontroller and the exact specifications of the hardware, in particular the required/requested time intervals of the used systems (UART/BLE) Wink.

    Now, however, I wanted to find out why the dongle cannot be started without debugging options or why it keeps resetting all the time after he is flashed.

    • To do this, I created a build on the nRF52 DK with the nRF52840 dongle connected, which does not contain any debugging options. This build was flashed to the dongle via the nRF52 DK.
    • (And even as a standalone dongle - also tested on other PC systems...)
      this build works as it should on the nRF52840 dongle !!!

    Maybe I had changed some tweak in the meantime (which I had meticulously made sure not to do) that made the dongle work. Okay, programming the dongle with the bootloader:

    • The nrf52840dongle_nrf52840.dts set back to #include ‘fstab-stock.dts’ and in the KConfig set BOARD_HAS_NRF5_BOOTLOADER setting back to default y
    • Then generated a presitina build and flashed the created zephyr.hex via the programmer to the dongle with the bootloader ( graviton_bootloader_mbr_v1.0.1-[nRF5_SDK_15.0.1-1.alpha_f76d012].hex ).
    • Error: the dongle is plugged into the USB port and keeps restarting - it probably keeps starting a reset

    Could it have something to do with our project? We have modelled our BT Mesh project on your examples: Bluetooth Mesh Light, BT Mesh Light Switch, BT Mesh Chat. So I took your Bluetooth Mesh Light example project and simply added our serial interface (also derived from your CDC ACM example) to it. Same procedure as above:

    • prestina build via nRF52 DK flashed to connected nRF52840 dongle (nrf52840dongle_nrf52840.dts with #include ‘fstab-debugger.dts’ / BOARD_HAS_NRF5_BOOTLOADER default n)
    • => works!
    • prestina build, zephyr.hex flashed to the dongle via the programmer (nrf52840dongle_nrf52840.dts with #include ‘fstab-stock.dts’ / BOARD_HAS_NRF5_BOOTLOADER default y)
    • => does not work! Constant resets.

    The only difference in both conf's is:

    • Bootloader => CONFIG_FLASH_LOAD_OFFSET=0x1000 & CONFIG_BOARD_HAS_NRF5_BOOTLOADER=y
    • nRF52 DK => CONFIG_FLASH_LOAD_OFFSET=0 & #CONFIG_BOARD_HAS_NRF5_BOOTLOADER is not set

    The differences in the DTS are in the four partitions (boot, slot0, slot1, storage):
    Bootloader / nRF52 DK

    flash_controller: flash-controller@4001e000 {
    	compatible = "nordic,nrf52-flash-controller";
    	reg = < 0x4001e000 0x1000 >;
    	partial-erase;
    	#address-cells = < 0x1 >;
    	#size-cells = < 0x1 >;
    	flash0: flash@0 {
    		compatible = "soc-nv-flash";
    		erase-block-size = < 0x1000 >;
    		write-block-size = < 0x4 >;
    		reg = < 0x0 0x100000 >;
    		partitions {
    			compatible = "fixed-partitions";
    			#address-cells = < 0x1 >;
    			#size-cells = < 0x1 >;
    			boot_partition: partition@1000 {
    				label = "mcuboot";
    				reg = < 0x1000 0xf000 >;
    			};
    			slot0_partition: partition@10000 {
    				label = "image-0";
    				reg = < 0x10000 0x66000 >;
    			};
    			slot1_partition: partition@76000 {
    				label = "image-1";
    				reg = < 0x76000 0x66000 >;
    			};
    			storage_partition: partition@dc000 {
    				label = "storage";
    				reg = < 0xdc000 0x4000 >;
    			};
    		};
    	};
    };

    flash_controller: flash-controller@4001e000 {
    	compatible = "nordic,nrf52-flash-controller";
    	reg = < 0x4001e000 0x1000 >;
    	partial-erase;
    	#address-cells = < 0x1 >;
    	#size-cells = < 0x1 >;
    	flash0: flash@0 {
    		compatible = "soc-nv-flash";
    		erase-block-size = < 0x1000 >;
    		write-block-size = < 0x4 >;
    		reg = < 0x0 0x100000 >;
    		partitions {
    			compatible = "fixed-partitions";
    			#address-cells = < 0x1 >;
    			#size-cells = < 0x1 >;
    			boot_partition: partition@0 {
    				label = "mcuboot";
    				reg = < 0x0 0x12000 >;
    			};
    			slot0_partition: partition@12000 {
    				label = "image-0";
    				reg = < 0x12000 0x75000 >;
    			};
    			slot1_partition: partition@87000 {
    				label = "image-1";
    				reg = < 0x87000 0x75000 >;
    			};
    			storage_partition: partition@fc000 {
    				label = "storage";
    				reg = < 0xfc000 0x4000 >;
    			};
    		};
    	};
    };

    At this point, I'm at a bit of a loss. Could it have something to do with the CONFIG_HEAP_MEM_POOL_SIZE=4096 attribute that we have set?
    Could it be that the access points have changed and the bootloader is not processing them correctly?

    Perhaps you have already been able to take a look at it and get an overview.

    I am curious about it
    best regards 
    uli

  • Hello Uli,

    Thank you for clarifying Slight smile This was the kind of information I was fishing for, what you did with the bootloader, but it seems like you are on top of things. 

    Some general hints:

    The way you set up the different builds is not really how it is intended to be done. Although it may seem harmless to use prj_dongle.conf as the base configuration file, that will actually cause the rest of the project to fail. You see, if you set the base configuration file to prj_dongle.conf, it will also look for all the other files, such as board files, child image files ending in _dongle.*

    This means e.g. that it will not automatically pick up the board files (if you had any).

    So the "correct" way to do this is to use a common prj.conf file that will be used for all your different builds. Then you can add your prj_dongle.conf as an extra KConfig file by using the "Extra KConfig fragments" option. Alternatively, if you would have named the other conf file <board_name>.conf, like this:

    nrf52840dongle_nrf52840.conf, 

    then it will automatically be picked up as an extra KConfig fragment. The same goes for the .overlay files. If it was called nrf52840dongle_nrf52840.overlay, then the compiler will pick it up automatically. 

    Anyway, it is possible to add any files as extra KConfig fragments.

    Sorry that this took so long, but I needed to add a debug header to one of my nRF52840 dongles. 

    When I ran your application (both on DK and dongle) it stopped at 

    	LOG_INF("Wait for DTR");
    
    	while (true) {
    		uint32_t dtr = 0U;
    		if ( (int_ret = uart_line_ctrl_get(uart_dev, UART_LINE_CTRL_DTR, &dtr)) ) {
    		    LOG_ERR("Failed to retrieve line control for UART, ret code %d", int_ret);  // ENOTSUP = 134 -> Unsupported value | if API is not enabled // ENOSYS = 88 -> Function not implemented                                                                                      
    	    }
            
    		if (dtr) {
    			break; // jump out of the while
    		} 
    
            /* [else] Give CPU resources to low priority threads. */
    		k_sleep(K_MSEC(100));
    	}

    I am not sure what is actually supposed to happen here. Perhaps I am using the wrong terminal or something. I read your last reply, and I understand that you did some changes, but I am not sure which ones. 

    If I break out of this while loop, then I get a Bus Fault:

    00> Sensovo Dongle (Zephyr OS Build v3.3.99-ncs1-2) is initializing...
    00> 
    00> [00:00:00.701,019] <inf> serial: Wait for DTR
    00> [00:00:00.701,019] <inf> serial: DTR set
    00> [00:00:00.842,285] <err> usb_nrfx: Endpoint 0x81 is not enabled
    00> [00:00:01.094,573] <inf> serial: Baudrate detected: 115200
    00> [00:00:01.701,965] <err> os: ***** BUS FAULT *****
    00> [00:00:01.701,995] <err> os:   Imprecise data bus error[0m
    00> [00:00:01.701,995] <err> os: r0/a1:  0x00000000  r1/a2:  0x2000bc2c  r2/a3:  0x20004f04
    00> [00:00:01.702,026] <err> os: r3/a4:  0x00000000 r12/ip:  0x00000000 r14/lr:  0x0003ef5d
    00> [00:00:01.702,026] <err> os:  xpsr:  0x61000000
    00> [00:00:01.702,056] <err> os: Faulting instruction address (r15/pc): 0x0002396c
    00> [00:00:01.702,087] <err> os: >>> ZEPHYR FATAL ERROR 26: Unknown error on CPU 0
    00> [00:00:01.702,117] <err> os: Current thread: 0x20004cd0 (unknown)
    00> [00:00:01.930,023] <err> fatal_error: Resetting system[0m

    Is this what you are seeing as well?

    Best regards,

    Edvin

Related