• Support
  • device_get_binding() returns Build Errors

Hello There,

I have created a new Board type in device tree based off of the NRF52840DK board, but i have added an i2c peripheral:

proto139.dts

`/*
 * Copyright (c) 2017 Linaro Limited
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/dts-v1/;
#include <nordic/nrf52840_qiaa.dtsi>
#include "proto139.dtsi"

/ {
	model = "proto139";
	compatible = "nordic,nrf52840-dk-nrf52840";

	chosen {
		zephyr,console = &uart0;
		zephyr,shell-uart = &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;
	};

/* 	leds {
		compatible = "gpio-leds";
		led0: led_0 {
			//gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
			label = "Green LED 0";
		};
		led1: led_1 {
			//gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
			label = "Green LED 1";
		};
		led2: led_2 {
			//gpios = <&gpio0 15 GPIO_ACTIVE_LOW>;
			label = "Green LED 2";
		};
		led3: led_3 {
			//gpios = <&gpio0 16 GPIO_ACTIVE_LOW>;
			label = "Green LED 3";
		};
	}; */

	pwmleds {
		compatible = "pwm-leds";
		pwm_led0: pwm_led_0 {
			pwms = <&pwm0 0 PWM_MSEC(20) PWM_POLARITY_INVERTED>;
		};
	};



	buttons {
/* 		compatible = "gpio-keys";
		button0: button_0 {
			gpios = <&gpio0 11 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "Push button switch 0";
		};
		button1: button_1 {
			gpios = <&gpio0 12 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "Push button switch 1";
		};
		button2: button_2 {
		//	gpios = <&gpio0 24 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "Push button switch 2";
		};
		button3: button_3 {
		//	gpios = <&gpio0 0 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "Push button switch 3";
		}; */
	};

	arduino_header: connector {
		compatible = "arduino-header-r3";
		#gpio-cells = <2>;
		gpio-map-mask = <0xffffffff 0xffffffc0>;
		gpio-map-pass-thru = <0 0x3f>;
		gpio-map = <0 0 &gpio0 3 0>,	/* A0 */
			   <1 0 &gpio0 4 0>,	/* A1 */
			   <2 0 &gpio0 28 0>,	/* A2 */
			   <3 0 &gpio0 29 0>,	/* A3 */
			   <4 0 &gpio0 30 0>,	/* A4 */
			   <5 0 &gpio0 31 0>,	/* A5 */
			   <6 0 &gpio1 1 0>,	/* D0 */
			   <7 0 &gpio1 2 0>,	/* D1 */
			   <8 0 &gpio1 3 0>,	/* D2 */
			   <9 0 &gpio1 4 0>,	/* D3 */
			   <10 0 &gpio1 5 0>,	/* D4 */
			   <11 0 &gpio1 6 0>,	/* D5 */
			   <12 0 &gpio1 7 0>,	/* D6 */
			   <13 0 &gpio1 8 0>,	/* D7 */
			   <14 0 &gpio1 10 0>,	/* D8 */
			   <15 0 &gpio1 11 0>,	/* D9 */
			   <16 0 &gpio1 12 0>,	/* D10 */
			   <17 0 &gpio1 13 0>,	/* D11 */
			   <18 0 &gpio1 14 0>,	/* D12 */
			   <19 0 &gpio1 15 0>,	/* D13 */
			   <20 0 &gpio0 26 0>,	/* D14 */
			   <21 0 &gpio0 27 0>;	/* D15 */
	};

	arduino_adc: analog-connector {
		compatible = "arduino,uno-adc";
		#io-channel-cells = <1>;
		io-channel-map = <0 &adc 1>,	/* A0 = P0.3 = AIN1 */
				 <1 &adc 2>,	/* A1 = P0.4 = AIN2 */
				 <2 &adc 4>,	/* A2 = P0.28 = AIN4 */
				 <3 &adc 5>,	/* A3 = P0.29 = AIN5 */
				 <4 &adc 6>,	/* A4 = P0.30 = AIN6 */
				 <5 &adc 7>;	/* A5 = P0.31 = AIN7 */
	};

	/* These aliases are provided for compatibility with samples */
	aliases {
		//led0 = &led0;
		//led1 = &led1;
		//led2 = &led2;
		//led3 = &led3;
		//pwm-led0 = &pwm_led0;
		// sw0 = &button0;
		// sw1 = &button1;
		// sw2 = &button2;
		// sw3 = &button3;
		//bootloader-led0 = &led0;
		// mcuboot-button0 = &button0;
		//mcuboot-led0 = &led0;
		watchdog0 = &wdt0;
		//spi-flash0 = &mx25r64;
		i2c0 = &i2c0;
	};
};

&adc {
	status = "okay";
};

&gpiote {
	status = "okay";
};

&gpio0 {
	status = "okay";
};

&gpio1 {
	status = "okay";
};

&uart0 {
	compatible = "nordic,nrf-uarte";
	status = "okay";
	current-speed = <115200>;
	pinctrl-0 = <&uart0_default>;
	pinctrl-1 = <&uart0_sleep>;
	pinctrl-names = "default", "sleep";
};

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

/* arduino_i2c: &i2c0 {
	compatible = "nordic,nrf-twi";
	status = "okay";
	pinctrl-0 = <&i2c0_default>;
	pinctrl-1 = <&i2c0_sleep>;
	pinctrl-names = "default", "sleep";
}; */

/*         interrupt-parent = <&pinctrl_gpio_intr>;
        pinctrl-0 = <&pinctrl_i2c4>;
        gpios = <&gpio1 18 GPIO_ACTIVE_HIGH>;
        interrupts = <3 0>;
        gpio-controller;
        #gpio-cells = <2>;
        interrupt-controller;
        #interrupt-cells = <2>; */
/* 	lsm303agr: lsm_int@76 {
			compatible = "gpio-keys";
			gpios = <&gpio0 25 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "lsm interrupt"; 
			};
		lsmsda {
			compatible = "gpio-keys";
			gpios = <&gpio0 14 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "lsmsda"; 
			};
		lsmscl {
			compatible = "gpio-keys";
			gpios = <&gpio0 12 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "lsm clock"; 
		lsmaddr {
			address: "0x10"; */



&pwm0 {
	status = "okay";
	pinctrl-0 = <&pwm0_default>;
	pinctrl-1 = <&pwm0_sleep>;
	pinctrl-names = "default", "sleep";
};

// &spi0 {
// 	compatible = "nordic,nrf-spi";
// 	/* Cannot be used together with i2c0. */
// 	/* status = "okay"; */
// 	pinctrl-0 = <&spi0_default>;
// 	pinctrl-1 = <&spi0_sleep>;
// 	pinctrl-names = "default", "sleep";
// };

// &spi1 {
// 	compatible = "nordic,nrf-spi";
// 	/* status = "okay"; */
// 	pinctrl-0 = <&spi1_default>;
// 	pinctrl-1 = <&spi1_sleep>;
// 	pinctrl-names = "default", "sleep";
// };

// &spi2 {
// 	compatible = "nordic,nrf-spi";
// 	status = "disabled";
// 	pinctrl-0 = <&spi2_default>;
// 	pinctrl-1 = <&spi2_sleep>;
// 	pinctrl-names = "default", "sleep";
// };

// &qspi {
// 	status = "okay";
// 	pinctrl-0 = <&qspi_default>;
// 	pinctrl-1 = <&qspi_sleep>;
// 	pinctrl-names = "default", "sleep";
// 	mx25r64: mx25r6435f@0 {
// 		compatible = "nordic,qspi-nor";
// 		reg = <0>;
// 		/* MX25R64 supports only pp and pp4io */
// 		writeoc = "pp4io";
// 		/* MX25R64 supports all readoc options */
// 		readoc = "read4io";
// 		sck-frequency = <8000000>;
// 		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 = <67108864>;
// 		has-dpd;
// 		t-enter-dpd = <10000>;
// 		t-exit-dpd = <35000>;
// 	};
// };

// arduino_spi: &spi3 {
// 	status = "okay";
// 	cs-gpios = <&arduino_header 16 GPIO_ACTIVE_LOW>; /* D10 */
// 	pinctrl-0 = <&spi3_default>;
// 	pinctrl-1 = <&spi3_sleep>;
// 	pinctrl-names = "default", "sleep";
// };

&i2c0 {
	compatible = "nordic,nrf-twi";
	status = "okay";
	pinctrl-0 = <&i2c0_default>;
	pinctrl-1 = <&i2c0_sleep>;	
	pinctrl-names = "default", "sleep";	
	label = "I2C0";
    lsm303agr: gpio@10 {
        compatible = "st,lsm303dlhc-magn";
        reg = <0x10>;
		status = "okay";
		label = "lsm303";
		interrupts = <6 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
		//gpios = <&gpio0 6 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
    };
};


&ieee802154 {
	status = "okay";
};

&flash0 {

	partitions {
		compatible = "fixed-partitions";
		#address-cells = <1>;
		#size-cells = <1>;

		boot_partition: partition@0 {
			label = "mcuboot";
			reg = <0x00000000 0x0000C000>;
		};
		slot0_partition: partition@c000 {
			label = "image-0";
			reg = <0x0000C000 0x00067000>;
		};
		slot1_partition: partition@73000 {
			label = "image-1";
			reg = <0x00073000 0x00067000>;
		};
		scratch_partition: partition@da000 {
			label = "image-scratch";
			reg = <0x000da000 0x0001e000>;
		};

		/*
		 * The flash starting at 0x000f8000 and ending at
		 * 0x000fffff is reserved for use by the application.
		 */

		/*
		 * Storage partition will be used by FCB/LittleFS/NVS
		 * if enabled.
		 */
		storage_partition: partition@f8000 {
			label = "storage";
			reg = <0x000f8000 0x00008000>;
		};
	};
};



zephyr_udc0: &usbd {
	compatible = "nordic,nrf-usbd";
	status = "okay";
};`

I am trying to fetch the board config using device_get_binding() as shown in the main.c:

`#include <zephyr/devicetree.h>
#include <zephyr/kernel.h>
#include "lsm303agr_reg.h"
#include <zephyr/logging/log.h>
#include <zephyr/device.h>

LOG_MODULE_REGISTER(foo, CONFIG_LOG_DEFAULT_LEVEL);

#define DT_I2C0_N DT_PATH(soc, i2c_40003000)
#define DT_LSM303_CN DT_CHILD(DT_I2C0_N, gpio_10)



/* void get_dt_dev(const struct device* i2c_dev)
{
}  */

void main(void)
{
	const struct device *i2c_dev = DEVICE_DT_GET(DT_NODELABEL(lsm303agr));
	const struct device *i2c_dev = device_get_binding(DT_LSM303_CN);`

as shown above, i have tried two different methods to retrieve the config and both return the following error:

`build\zephyr\include\generated\devicetree_generated.h:13643:40: error: 'DT_N_S_soc_S_i2c_40003000_S_gpio_10' undeclared (first use in this function); did you mean 'DT_N_S_soc_S_i2c_40003000_S_gpio_10_ORD'?
13643 | #define DT_N_NODELABEL_lsm303agr       DT_N_S_soc_S_i2c_40003000_S_gpio_10
      |                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

`

my prj.config is shown below:

`CONFIG_GPIO=y

# choose RTT console
CONFIG_UART_CONSOLE=n
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y

# Config logger
CONFIG_LOG_BACKEND_RTT=y
CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=4

# Configure sample logging setting
CONFIG_LOG=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y
CONFIG_I2C=y
CONFIG_I2C_NRFX=y`

any help would be much appreciated

Thanks

apologies i dont know what happened to the formatting, trying to fix now

    kevinMoon

    Few tips for you:

    1. Check the Zephyr tree for the drivers for these parts. It may save you a lot of headache doing anything manually.
    2. It would be better to simply set up an overlay for the added I2C devices instead of modifying the .dts file
    3. device_get_binding is deprecated in favor of DEVICE_DT_GET

    I did a few live streams on the subject. You should check these out:

    When searching the Zephyr repo you may even get lucky and find a full example that uses those parts. That way you have a full example you can use to test your own application against.

    Thank you Jared, i will try those now. Would also like to say thank you very much for your videos, your content is very helpful and ive been using it to get my head around devicetree.

      jaredwolff UPDATE: using:

      DEVICE_DT_GET(DT_NODELABEL(lsm303agr)) fixed it.

      Unsure why it wasnt working before, perhaps i cleaned my build and rebuilt

      Again, thanks for the help Jared would be happy to donate if there is a link somewhere

      Terms and Conditions | Privacy Policy