Hello, I hope you are well.
I created a new driver for an i2c accelerometer with 2 gpio interrupts, but it does not build properly. When calling `static const struct device * accel = DEVICE_DT_GET(DT_NODELABEL(accel_0));` I have the following error:
/opt/nordic/ncs/toolchains/b8efef2ad5/opt/zephyr-sdk/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.2.0/../../../../arm-zephyr-eabi/bin/ld.bfd: app/libapp.a(main.c.obj): in function `z_impl_gpio_pin_configure': /opt/nordic/ncs/sdk/zephyr/include/zephyr/drivers/gpio.h:969: undefined reference to `__device_dts_ord_110' collect2: error: ld returned 1 exit status
Here is my `.overlay` file:
&gpio1 { status = "okay"; }; &gpio0 { status = "okay"; }; &i2c22 { compatible = "nordic,nrf-twim"; status = "okay"; pinctrl-0 = <&i2c22_default>; pinctrl-1 = <&i2c22_sleep>; pinctrl-names = "default", "sleep"; clock-frequency = <100000>; accel_0: accel@6a { status = "okay"; compatible = "device-custom"; reg = <0x6a>; int1-gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; int2-gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>; }; };
Here is the dts binding `.yaml` file:
description: | 3-axis IMU (Inertial Measurement Unit) sensor accessed through I2C bus compatible: "device-custom" include: ["i2c-device.yaml"] properties: reg: required: true int1-gpios: type: phandle-array required: true description: | INT1 pin int2-gpios: type: phandle-array required: true description: | INT2 pin
And here is the driver definition in C:
struct drv_imu_config_t { const struct i2c_dt_spec i2c; const struct gpio_dt_spec int1_gpio; const struct gpio_dt_spec int2_gpio; }; static int driver_init(const struct device *p_dev) { // ... // gpio_pin_configure_dt(), gpio_pin_interrupt_configure_dt(), gpio_init_callback(), and gpio_add_callback(). } #define DRV_IMU_DEFINE(inst) \ static const struct drv_imu_config_t imu_config_##inst = { \ .i2c = I2C_DT_SPEC_INST_GET(inst), \ .int1_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, int1_gpios, {0}), \ .int2_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, int2_gpios, {0}), \ }; \ DEVICE_DT_INST_DEFINE(inst, driver_init, NULL, NULL, &imu_config_##inst, POST_KERNEL, DRV_IMU_INIT_PRIORITY, NULL); DT_INST_FOREACH_STATUS_OKAY(DRV_IMU_DEFINE)
I define `DRV_IMU_DEFINE=y` in the `Kconfig` file, and `CONFIG_DRV_IMU_DEFINE`, `CONFIG_GPIO` and `CONFIG_I2C` are enabled. But it does not build, with the warning `
warning: 'driver_init' defined but not used [-Wunused-function]` and the error `undefined reference to `__device_dts_ord_110'`.
Also, when I grep 110 in the `build/zephyr/devicetree_generated.h`, it does not refer to a gpio device but i2c:
* 110 /soc/peripheral@50000000/i2c@c8000/accel@6a 110, /* /soc/peripheral@50000000/i2c@c8000/accel@6a */ #define DT_N_S_soc_S_peripheral_50000000_S_clock_10e000_P_reg {1105920 /* 0x10e000 */, 4096 /* 0x1000 */} #define DT_N_S_soc_S_peripheral_50000000_S_clock_10e000_P_reg_IDX_0 1105920 #define DT_N_S_soc_S_peripheral_50000000_S_i2c_c6000_P_reg {811008 /* 0xc6000 */, 4096 /* 0x1000 */} #define DT_N_S_soc_S_peripheral_50000000_S_i2c_c6000_P_reg_IDX_0 811008 #define DT_N_S_soc_S_peripheral_50000000_S_spi_c6000_P_reg {811008 /* 0xc6000 */, 4096 /* 0x1000 */} #define DT_N_S_soc_S_peripheral_50000000_S_spi_c6000_P_reg_IDX_0 811008 #define DT_N_S_soc_S_peripheral_50000000_S_uart_c6000_P_reg {811008 /* 0xc6000 */, 4096 /* 0x1000 */} #define DT_N_S_soc_S_peripheral_50000000_S_uart_c6000_P_reg_IDX_0 811008 110, /* /soc/peripheral@50000000/i2c@c8000/accel@6a */ \ #define DT_N_S_soc_S_peripheral_50000000_S_i2c_c8000_S_accel_6a_ORD 110 #define DT_N_S_soc_S_peripheral_50000000_S_i2c_c8000_S_accel_6a_ORD_STR_SORTABLE 00110 #define DT_N_S_soc_S_peripheral_50000000_S_power_10e000_RANGES_IDX_0_VAL_PARENT_BUS_ADDRESS 1105920 /* 0x10e000 */ #define DT_N_S_soc_S_peripheral_50000000_S_power_10e000_P_reg {1105920 /* 0x10e000 */, 4096 /* 0x1000 */} #define DT_N_S_soc_S_peripheral_50000000_S_power_10e000_P_reg_IDX_0 1105920
Best regards,