SDK 2.2 + "__device_dts_ord_XX" errors

Hi community,

I try to acces gpio0 and adc channels on a icarus board (nRF9160 + SDK 2.2).

On building, i have these errors "__device_dts_ord_94", "__device_dts_ord_95" and "__device_dts_ord_4".

DEVICE_DT_GET seems not accepted.
Any idea to solve this ?
Many thanks !

#define GPIO_NODE DT_NODELABEL(gpio0)
#define ADC_0 DT_CHILD(DT_NODELABEL(adc), channel_0)
#define ADC_5 DT_CHILD(DT_NODELABEL(adc), channel_5)

static const struct device *adc0;
static const struct device *adc5;
static const struct device *gpio;

adc0 = DEVICE_DT_GET(ADC_0);
adc5 = DEVICE_DT_GET(ADC_5);	
gpio = DEVICE_DT_GET(GPIO_NODE);

and overlay

&adc {
	#address-cells = <1>;
	#size-cells = <0>;
	
	channel@0 {
		reg = <0>;
		zephyr,gain = "ADC_GAIN_1_6";
		zephyr,reference = "ADC_REF_INTERNAL";
		zephyr,acquisition-time = <ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 20)>;
		zephyr,input-positive = <NRF_SAADC_AIN0>;
		zephyr,resolution = < 10 >;
	};

	channel@5 {
		reg = <5>;
		zephyr,gain = "ADC_GAIN_1_6";
		zephyr,reference = "ADC_REF_INTERNAL";
		zephyr,acquisition-time = <ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 20)>;
		zephyr,input-positive = <NRF_SAADC_AIN5>;
		zephyr,resolution = < 10 >;
	};
};

Parents
  • Hello

    Could you please share the adc node in your generated device tree in build/zephyr/zephyr.dts?

    You'll need to add a "compatible" property if it isn't already defined.

    I also suspect you might have to add

    #address-cells = <1>;
    #size-cells = <0>;

    to your overlay if you define reg as simply <5>.

    Best regards,

    Einar

  • The adc node

    adc: feather_adc: arduino_adc: adc@e000 {
    				compatible = "nordic,nrf-saadc";
    				reg = < 0xe000 0x1000 >;
    				interrupts = < 0xe 0x1 >;
    				status = "okay";
    				#io-channel-cells = < 0x1 >;
    				#address-cells = < 0x1 >;
    				#size-cells = < 0x0 >;
    				phandle = < 0x10 >;
    				channel@0 {
    					reg = < 0x0 >;
    					zephyr,gain = "ADC_GAIN_1_6";
    					zephyr,reference = "ADC_REF_INTERNAL";
    					zephyr,acquisition-time = < 0x4014 >;
    					zephyr,input-positive = < 0x1 >;
    					zephyr,resolution = < 0xa >;
    				};
    				channel@5 {
    					reg = < 0x5 >;
    					zephyr,gain = "ADC_GAIN_1_6";
    					zephyr,reference = "ADC_REF_INTERNAL";
    					zephyr,acquisition-time = < 0x4014 >;
    					zephyr,input-positive = < 0x6 >;
    					zephyr,resolution = < 0xa >;
    				};
    			};

    the gpio node

    gpio0: gpio@842500 {
    				compatible = "nordic,nrf-gpio";
    				gpio-controller;
    				reg = < 0x842500 0x300 >;
    				#gpio-cells = < 0x2 >;
    				status = "okay";
    				port = < 0x0 >;
    				phandle = < 0xa >;
    			};

  • Hi

    I just tried to build your project on a fresh NCS install in Ubuntu, and I'm still getting the pm_config.h error.

    How did you install NCS?

    Did you install it through the nRF Connect for Desktop Toolchain Manager, or did you install it manually?

    Have you made any changes to any files in the SDK?

    -Einar

  • Hi,

    With nRF Connect yes, and no change except copy board files for 2.2 version (no impact, i think).

    Board files for Actinius Icarus

  • Thanks, that did have an impact, I now get the same error as you.

    I'll try to see if I can figure out what's causing your device_dts_ord error then.

    -Einar

  • Damned, sorry i wasn't thinking

    Thanks for helping

  • It seems like it's difficult accessing the adc channel subnodes using the DEVICE_DT_GET macro.

    I was able to compile when I exchanged DEVICE_DT_GET with ADC_DT_SPEC_GET_BY_IDX,

    and adc_channel_setup with adc_channel_setup_dt.

    My main.c now looks like this:

    #include <zephyr/kernel.h>				// Noyau
    #include <zephyr/device.h>
    #include <zephyr/drivers/adc.h>			// ADC
    #include <zephyr/drivers/gpio.h>		// GPIO
    #include <stdio.h>						// Calcul
    #include <zephyr/sys/printk.h>			// Affichage
    #include <zephyr/logging/log.h>			// Logging
    
    LOG_MODULE_REGISTER(main);
    
    #define GPIO_NODE DT_NODELABEL(gpio0)
    
    static const struct adc_dt_spec adc_chan0 = ADC_DT_SPEC_GET_BY_IDX(DT_PATH(zephyr_user),0);
    static const struct adc_dt_spec adc_chan5 = ADC_DT_SPEC_GET_BY_IDX(DT_PATH(zephyr_user),1);
    static const struct device *gpio_dev;
    
    bool init_adc_0() {
    	int err;
    
    	err = adc_channel_setup_dt(&adc_chan0);
    	if (err) {
    		return false;
    	}
    	return true;
    }
    
    bool init_adc_5() {
    	int err;
    
    	err = adc_channel_setup_dt(&adc_chan5);
    	if (err) {
    		return false;
    	}
    	return true;
    }
    
    bool init_gpio() {
    	gpio_dev = DEVICE_DT_GET(GPIO_NODE);
    
    	if (!device_is_ready(gpio_dev)) {
    		return false;
    	};
    	return true;
    }
    
    int main(void)
    {
    	init_gpio();
    	init_adc_0();
    	init_adc_5();
    
        return true;
    }

    And I also had to add this to the overlay:

    / {
    	zephyr,user {
    		io-channels = <&adc 0>, <&adc 5>;
    	};
    };

    -Einar

Reply
  • It seems like it's difficult accessing the adc channel subnodes using the DEVICE_DT_GET macro.

    I was able to compile when I exchanged DEVICE_DT_GET with ADC_DT_SPEC_GET_BY_IDX,

    and adc_channel_setup with adc_channel_setup_dt.

    My main.c now looks like this:

    #include <zephyr/kernel.h>				// Noyau
    #include <zephyr/device.h>
    #include <zephyr/drivers/adc.h>			// ADC
    #include <zephyr/drivers/gpio.h>		// GPIO
    #include <stdio.h>						// Calcul
    #include <zephyr/sys/printk.h>			// Affichage
    #include <zephyr/logging/log.h>			// Logging
    
    LOG_MODULE_REGISTER(main);
    
    #define GPIO_NODE DT_NODELABEL(gpio0)
    
    static const struct adc_dt_spec adc_chan0 = ADC_DT_SPEC_GET_BY_IDX(DT_PATH(zephyr_user),0);
    static const struct adc_dt_spec adc_chan5 = ADC_DT_SPEC_GET_BY_IDX(DT_PATH(zephyr_user),1);
    static const struct device *gpio_dev;
    
    bool init_adc_0() {
    	int err;
    
    	err = adc_channel_setup_dt(&adc_chan0);
    	if (err) {
    		return false;
    	}
    	return true;
    }
    
    bool init_adc_5() {
    	int err;
    
    	err = adc_channel_setup_dt(&adc_chan5);
    	if (err) {
    		return false;
    	}
    	return true;
    }
    
    bool init_gpio() {
    	gpio_dev = DEVICE_DT_GET(GPIO_NODE);
    
    	if (!device_is_ready(gpio_dev)) {
    		return false;
    	};
    	return true;
    }
    
    int main(void)
    {
    	init_gpio();
    	init_adc_0();
    	init_adc_5();
    
        return true;
    }

    And I also had to add this to the overlay:

    / {
    	zephyr,user {
    		io-channels = <&adc 0>, <&adc 5>;
    	};
    };

    -Einar

Children
Related