Getting started with gpio overlay

Hi

I am really struggling to get started with overlay files. I have read through a lot of documentation, watched a few hours of YouTube tutorials, and yet I can’t even get going with one gpio.


I have an existing project for the nRF5340_DK, based I think on Nordic’s BLE UART Peripheral example.
I had to change the pins used for the i2c bus, so I managed to hack an overlay fiel for that, which works – but probably isn’t correct.
So now I want to try using one of the GPIO, as an output.


The examples I found were here and here.

I couldn't get either to build.

Any help / guidance / pointers would be appreciated, thank you.

DETAILS

I decided to pick gpio0.25, and then gpio0.26, since they seem to be free.

Here is my overlay file – you will see both attempts at the end of the file – one commented out:

/*
 * Copyright (c) 2022 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
 */

/ {
	chosen {
		nordic,nus-uart = &uart0;
	};
};


&pinctrl {
	i2c2_default: i2c2_default {
		group1 {
			psels = <NRF_PSEL(TWIM_SCL, 0, 6)>, <NRF_PSEL(TWIM_SDA, 0, 7)>;
		};
	};

	i2c2_sleep: i2c2_sleep {
		group1 {
			psels = <NRF_PSEL(TWIM_SDA, 0, 7)>,
				<NRF_PSEL(TWIM_SCL, 0, 6)>;
			low-power-enable;
		};
	};
};

&i2c2 {
	compatible = "nordic,nrf-twim";
	status = "okay";


	pinctrl-0 = <&i2c2_default>;
	pinctrl-1 = <&i2c2_default>;
	pinctrl-names = "default", "sleep";
};


&uart0_default {
	group2 {
		psels = <NRF_PSEL(UART_RX, 0, 22)>, <NRF_PSEL(UART_CTS, 0, 21)>;
	};
};

&uart0_default {
	group1 {
		psels = <NRF_PSEL(UART_RTS, 0, 19)>;
	};
};

// !gpio! - start
// From example here: https://devzone.nordicsemi.com/f/nordic-q-a/94963/need-simple-devicetree-overlay-example-for-gpio
/*
/{

	custom_gpios {
 
	   compatible = "gpio-keys";
 
	   cusgpio0: cusgpio_0 {
 
		  gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>;
 
		  label = "My custom GPIO";
 
	   };
 
	};
 
	aliases {
 
	mycusgpio = &cusgpio0;
	};
 
 };

// From example here: https://devzone.nordicsemi.com/f/nordic-q-a/72618/extra-gpios-in-board-overlay-for-nrf9160dk
*/
/ {
    gpiocustom {
        compatible = "gpio-keys";
        gpiocus0: gpiocus_0 {
            gpios = <&gpio0 25 GPIO_ACTIVE_LOW>;
            label = "Custom gpio 25";
        };
        gpiocus1: gpiocus_1 {
            gpios = <&gpio0 26 GPIO_ACTIVE_LOW>;
            label = "Custom gpio 26";
        };
    };
    aliases {
        gpiocus0 = &gpiocus0;
        gpiocus1 = &gpiocus1;
    };
};
// !gpio! – end

And in main.c, again – two attempts, one commented out:

// !gpio! - start
//#define GPIO025_NODE  DT_ALIAS(mycusgpio)
//#define GPIO025           DT_GPIO_LABEL(GPIO025_NODE, gpios)
#define GPIO025_NODE    DT_ALIAS(gpiocus0)
#define GPIO025         DT_GPIO_LABEL(GPIO025_NODE, gpios)
// !gpio! - end

And in main():

    const struct device *dev_gpio0;                 // !gpio!

    dev_gpio0 = device_get_binding(GPIO025);        // !gpio!

Here are the warnings and errors I get for the first build (for gpio0.25 only – which is the attempt commented out above):

src\main.c:213:13: warning: Macro is deprecated
  213 |  dev_gpio0 = device_get_binding(GPIO025);
      |             ^~~~~~~~~~~~~~~~~~~~~
 build\zephyr\include\generated\devicetree_unfixed.h:1749:58: error: 'DT_N_S_soc_S_peripheral_40000000_S_gpio_842500_P_label' undeclared (first use in this function); did you mean 'DT_N_S_soc_S_peripheral_40000000_S_gpio_842500_P_reg'?
 1749 | #define DT_N_S_custom_gpios_S_cusgpio_0_P_gpios_IDX_0_PH DT_N_S_soc_S_peripheral_40000000_S_gpio_842500
      |                                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:3068:24: note: in definition of macro 'DT_CAT'
 3068 | #define DT_CAT(a1, a2) a1 ## a2
      |                        ^~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:106:2: note: in expansion of macro 'DT_PROP'
  106 |  DT_PROP(DT_GPIO_CTLR_BY_IDX(node_id, gpio_pha, idx), label) __DEPRECATED_MACRO
      |  ^~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:3076:41: note: in expansion of macro 'DT_N_S_custom_gpios_S_cusgpio_0_P_gpios_IDX_0_PH'
 3076 | #define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
      |                                         ^~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:1247:2: note: in expansion of macro 'DT_CAT6'
 1247 |  DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
      |  ^~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:54:2: note: in expansion of macro 'DT_PHANDLE_BY_IDX'
   54 |  DT_PHANDLE_BY_IDX(node_id, gpio_pha, idx)
      |  ^~~~~~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:106:10: note: in expansion of macro 'DT_GPIO_CTLR_BY_IDX'
  106 |  DT_PROP(DT_GPIO_CTLR_BY_IDX(node_id, gpio_pha, idx), label) __DEPRECATED_MACRO
      |          ^~~~~~~~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:120:2: note: in expansion of macro 'DT_GPIO_LABEL_BY_IDX'
  120 |  DT_GPIO_LABEL_BY_IDX(node_id, gpio_pha, 0) __DEPRECATED_MACRO
      |  ^~~~~~~~~~~~~~~~~~~~
 src\main.c:64:19: note: in expansion of macro 'DT_GPIO_LABEL'
   64 | #define GPIO025   DT_GPIO_LABEL(GPIO025_NODE, gpios)
      |                   ^~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:3068:24: note: in expansion of macro 'DT_N_ALIAS_mycusgpio'
 3068 | #define DT_CAT(a1, a2) a1 ## a2
      |                        ^~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:213:25: note: in expansion of macro 'DT_CAT'
  213 | #define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
      |                         ^~~~~~
 src\main.c:63:22: note: in expansion of macro 'DT_ALIAS'
   63 | #define GPIO025_NODE DT_ALIAS(mycusgpio)
      |                      ^~~~~~~~
 src\main.c:64:33: note: in expansion of macro 'GPIO025_NODE'
   64 | #define GPIO025   DT_GPIO_LABEL(GPIO025_NODE, gpios)
      |                                 ^~~~~~~~~~~~
 src\main.c:213:33: note: in expansion of macro 'GPIO025'
  213 |  dev_gpio0 = device_get_binding(GPIO025);   
      |                                 ^~~~~~~
 build\zephyr\include\generated\devicetree_unfixed.h:1749:58: note: each undeclared identifier is reported only once for each function it appears in
 1749 | #define DT_N_S_custom_gpios_S_cusgpio_0_P_gpios_IDX_0_PH DT_N_S_soc_S_peripheral_40000000_S_gpio_842500
      |                                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:3068:24: note: in definition of macro 'DT_CAT'
 3068 | #define DT_CAT(a1, a2) a1 ## a2
      |                        ^~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:106:2: note: in expansion of macro 'DT_PROP'
  106 |  DT_PROP(DT_GPIO_CTLR_BY_IDX(node_id, gpio_pha, idx), label) __DEPRECATED_MACRO
      |  ^~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:3076:41: note: in expansion of macro 'DT_N_S_custom_gpios_S_cusgpio_0_P_gpios_IDX_0_PH'
 3076 | #define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
      |                                         ^~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:1247:2: note: in expansion of macro 'DT_CAT6'
 1247 |  DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
      |  ^~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:54:2: note: in expansion of macro 'DT_PHANDLE_BY_IDX'
   54 |  DT_PHANDLE_BY_IDX(node_id, gpio_pha, idx)
      |  ^~~~~~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:106:10: note: in expansion of macro 'DT_GPIO_CTLR_BY_IDX'
  106 |  DT_PROP(DT_GPIO_CTLR_BY_IDX(node_id, gpio_pha, idx), label) __DEPRECATED_MACRO
      |          ^~~~~~~~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:120:2: note: in expansion of macro 'DT_GPIO_LABEL_BY_IDX'
  120 |  DT_GPIO_LABEL_BY_IDX(node_id, gpio_pha, 0) __DEPRECATED_MACRO
      |  ^~~~~~~~~~~~~~~~~~~~
 src\main.c:64:19: note: in expansion of macro 'DT_GPIO_LABEL'
   64 | #define GPIO025   DT_GPIO_LABEL(GPIO025_NODE, gpios)
      |                   ^~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:3068:24: note: in expansion of macro 'DT_N_ALIAS_mycusgpio'
 3068 | #define DT_CAT(a1, a2) a1 ## a2
      |                        ^~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:213:25: note: in expansion of macro 'DT_CAT'
  213 | #define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
      |                         ^~~~~~
 src\main.c:63:22: note: in expansion of macro 'DT_ALIAS'
   63 | #define GPIO025_NODE DT_ALIAS(mycusgpio)
      |                      ^~~~~~~~
 src\main.c:64:33: note: in expansion of macro 'GPIO025_NODE'
   64 | #define GPIO025   DT_GPIO_LABEL(GPIO025_NODE, gpios)
      |                                 ^~~~~~~~~~~~
 src\main.c:213:33: note: in expansion of macro 'GPIO025'
  213 |  dev_gpio0 = device_get_binding(GPIO025);   
      |                                 ^~~~~~~
[27/221] Building C object zephyr/drivers/mbox/CMakeFiles/drivers__mbox.dir/mbox_nrfx_ipc.c.obj
[29/219] Building C object modules/nrf/lib/dk_buttons_and_leds/CMakeFiles/..__nrf__lib__dk_buttons_and_leds.dir/dk_buttons_and_leds.c.obj
ninja: build stopped: subcommand failed.
FATAL ERROR: command exited with status 1

And the error and warning for my second attempt:

../src/main.c: In function 'main':
src\main.c:215:13: warning: Macro is deprecated
  215 |  dev_gpio0 = device_get_binding(GPIO025);  // !gpio!
      |             ^~~~~~~~~~~~~~~~~~~~~
build\zephyr\include\generated\devicetree_unfixed.h:1752:56: error: 'DT_N_S_soc_S_peripheral_40000000_S_gpio_842500_P_label' undeclared (first use in this function); did you mean 'DT_N_S_soc_S_peripheral_40000000_S_gpio_842500_P_reg'?
 1752 | #define DT_N_S_gpiocustom_S_gpiocus_0_P_gpios_IDX_0_PH DT_N_S_soc_S_peripheral_40000000_S_gpio_842500
      |                                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:3068:24: note: in definition of macro 'DT_CAT'
 3068 | #define DT_CAT(a1, a2) a1 ## a2
      |                        ^~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:106:2: note: in expansion of macro 'DT_PROP'
  106 |  DT_PROP(DT_GPIO_CTLR_BY_IDX(node_id, gpio_pha, idx), label) __DEPRECATED_MACRO
      |  ^~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:3076:41: note: in expansion of macro 'DT_N_S_gpiocustom_S_gpiocus_0_P_gpios_IDX_0_PH'
 3076 | #define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
      |                                         ^~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:1247:2: note: in expansion of macro 'DT_CAT6'
 1247 |  DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
      |  ^~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:54:2: note: in expansion of macro 'DT_PHANDLE_BY_IDX'
   54 |  DT_PHANDLE_BY_IDX(node_id, gpio_pha, idx)
      |  ^~~~~~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:106:10: note: in expansion of macro 'DT_GPIO_CTLR_BY_IDX'
  106 |  DT_PROP(DT_GPIO_CTLR_BY_IDX(node_id, gpio_pha, idx), label) __DEPRECATED_MACRO
      |          ^~~~~~~~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:120:2: note: in expansion of macro 'DT_GPIO_LABEL_BY_IDX'
  120 |  DT_GPIO_LABEL_BY_IDX(node_id, gpio_pha, 0) __DEPRECATED_MACRO
      |  ^~~~~~~~~~~~~~~~~~~~
src\main.c:66:19: note: in expansion of macro 'DT_GPIO_LABEL'
   66 | #define GPIO025   DT_GPIO_LABEL(GPIO025_NODE, gpios)
      |                   ^~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:3068:24: note: in expansion of macro 'DT_N_ALIAS_gpiocus0'
 3068 | #define DT_CAT(a1, a2) a1 ## a2
      |                        ^~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:213:25: note: in expansion of macro 'DT_CAT'
  213 | #define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
      |                         ^~~~~~
src\main.c:65:22: note: in expansion of macro 'DT_ALIAS'
   65 | #define GPIO025_NODE DT_ALIAS(gpiocus0)
      |                      ^~~~~~~~
src\main.c:66:33: note: in expansion of macro 'GPIO025_NODE'
   66 | #define GPIO025   DT_GPIO_LABEL(GPIO025_NODE, gpios)
      |                                 ^~~~~~~~~~~~
src\main.c:215:33: note: in expansion of macro 'GPIO025'
  215 |  dev_gpio0 = device_get_binding(GPIO025);  // !gpio!
      |                                 ^~~~~~~
build\zephyr\include\generated\devicetree_unfixed.h:1752:56: note: each undeclared identifier is reported only once for each function it appears in
 1752 | #define DT_N_S_gpiocustom_S_gpiocus_0_P_gpios_IDX_0_PH DT_N_S_soc_S_peripheral_40000000_S_gpio_842500
      |                                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:3068:24: note: in definition of macro 'DT_CAT'
 3068 | #define DT_CAT(a1, a2) a1 ## a2
      |                        ^~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:106:2: note: in expansion of macro 'DT_PROP'
  106 |  DT_PROP(DT_GPIO_CTLR_BY_IDX(node_id, gpio_pha, idx), label) __DEPRECATED_MACRO
      |  ^~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:3076:41: note: in expansion of macro 'DT_N_S_gpiocustom_S_gpiocus_0_P_gpios_IDX_0_PH'
 3076 | #define DT_CAT6(a1, a2, a3, a4, a5, a6) a1 ## a2 ## a3 ## a4 ## a5 ## a6
      |                                         ^~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:1247:2: note: in expansion of macro 'DT_CAT6'
 1247 |  DT_CAT6(node_id, _P_, prop, _IDX_, idx, _PH)
      |  ^~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:54:2: note: in expansion of macro 'DT_PHANDLE_BY_IDX'
   54 |  DT_PHANDLE_BY_IDX(node_id, gpio_pha, idx)
      |  ^~~~~~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:106:10: note: in expansion of macro 'DT_GPIO_CTLR_BY_IDX'
  106 |  DT_PROP(DT_GPIO_CTLR_BY_IDX(node_id, gpio_pha, idx), label) __DEPRECATED_MACRO
      |          ^~~~~~~~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree\gpio.h:120:2: note: in expansion of macro 'DT_GPIO_LABEL_BY_IDX'
  120 |  DT_GPIO_LABEL_BY_IDX(node_id, gpio_pha, 0) __DEPRECATED_MACRO
      |  ^~~~~~~~~~~~~~~~~~~~
src\main.c:66:19: note: in expansion of macro 'DT_GPIO_LABEL'
   66 | #define GPIO025   DT_GPIO_LABEL(GPIO025_NODE, gpios)
      |                   ^~~~~~~~~~~~~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:3068:24: note: in expansion of macro 'DT_N_ALIAS_gpiocus0'
 3068 | #define DT_CAT(a1, a2) a1 ## a2
      |                        ^~
C:\Users\me\ncs\v2.1.0\zephyr\include\zephyr\devicetree.h:213:25: note: in expansion of macro 'DT_CAT'
  213 | #define DT_ALIAS(alias) DT_CAT(DT_N_ALIAS_, alias)
      |                         ^~~~~~
src\main.c:65:22: note: in expansion of macro 'DT_ALIAS'
   65 | #define GPIO025_NODE DT_ALIAS(gpiocus0)
      |                      ^~~~~~~~
src\main.c:66:33: note: in expansion of macro 'GPIO025_NODE'
   66 | #define GPIO025   DT_GPIO_LABEL(GPIO025_NODE, gpios)
      |                                 ^~~~~~~~~~~~
src\main.c:215:33: note: in expansion of macro 'GPIO025'
  215 |  dev_gpio0 = device_get_binding(GPIO025);  // !gpio!
      |                                 ^~~~~~~
[27/222] Building C object zephyr/drivers/pinctrl/CMakeFiles/drivers__pinctrl.dir/pinctrl_nrf.c.obj
[29/220] Building C object zephyr/drivers/mbox/CMakeFiles/drivers__mbox.dir/mbox_nrfx_ipc.c.obj
[30/220] Building C object zephyr/drivers/entropy/CMakeFiles/drivers__entropy.dir/C_/Users/garrett/ncs/v2.1.0/nrf/drivers/entropy/entropy_cc3xx.c.obj
[31/220] Building C object modules/nrf/lib/dk_buttons_and_leds/CMakeFiles/..__nrf__lib__dk_buttons_and_leds.dir/dk_buttons_and_leds.c.obj
ninja: build stopped: subcommand failed.
FATAL ERROR: command exited with status 1

By the way, I don’t know where this came from, in the overlay file – I suspect is was from when I was playing with the Device Tree GUI:

&uart0_default {
	group2 {
		psels = <NRF_PSEL(UART_RX, 0, 22)>, <NRF_PSEL(UART_CTS, 0, 21)>;
	};
};

&uart0_default {
	group1 {
		psels = <NRF_PSEL(UART_RTS, 0, 19)>;
	};
};

Parents Reply Children
No Data
Related