Hello,
I am trying to interface a TCA9548A Multiplexer on my custom board. I am able to set up the channels and read the channel status' with device_get_binding successfully. However when I try to get the child node (the sensors) from each channel it returns NULL at runtime when I use:
and it gives me an undefined reference error at compile time when I attempt to use:
FAILED: zephyr/zephyr_pre0.elf zephyr/zephyr_pre0.map : && ccache /opt/nordic/ncs/toolchains/20d68df7e5/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc -gdwarf-4 zephyr/CMakeFiles/zephyr_pre0.dir/misc/empty_file.c.obj -o zephyr/zephyr_pre0.elf -fuse-ld=bfd -T zephyr/linker_zephyr_pre0.cmd -Wl,-Map=/Users/nyameaama/Documents/MARS-Flight-System-Firmware/base-firmware-V2/build/zephyr/zephyr_pre0.map -Wl,--whole-archive app/libapp.a zephyr/libzephyr.a zephyr/arch/common/libarch__common.a zephyr/arch/arch/arm/core/aarch32/libarch__arm__core__aarch32.a zephyr/arch/arch/arm/core/aarch32/cortex_m/libarch__arm__core__aarch32__cortex_m.a zephyr/arch/arch/arm/core/aarch32/cortex_m/cmse/libarch__arm__core__aarch32__cortex_m__cmse.a zephyr/arch/arch/arm/core/aarch32/mpu/libarch__arm__core__aarch32__mpu.a zephyr/lib/libc/picolibc/liblib__libc__picolibc.a zephyr/lib/libc/common/liblib__libc__common.a zephyr/soc/soc/arm/common/cortex_m/libsoc__arm__common__cortex_m.a zephyr/subsys/random/libsubsys__random.a zephyr/subsys/bluetooth/common/libsubsys__bluetooth__common.a zephyr/subsys/bluetooth/host/libsubsys__bluetooth__host.a zephyr/subsys/net/libsubsys__net.a zephyr/drivers/bluetooth/libdrivers__bluetooth.a zephyr/drivers/clock_control/libdrivers__clock_control.a zephyr/drivers/console/libdrivers__console.a zephyr/drivers/entropy/libdrivers__entropy.a zephyr/drivers/gpio/libdrivers__gpio.a zephyr/drivers/i2c/libdrivers__i2c.a zephyr/drivers/pinctrl/libdrivers__pinctrl.a zephyr/drivers/serial/libdrivers__serial.a zephyr/drivers/timer/libdrivers__timer.a modules/nrf/subsys/nrf_security/src/zephyr/libmbedtls_zephyr.a modules/nrf/modules/tfm/zephyr/libtfm_api_nrf.a modules/trusted-firmware-m/libtfm_api.a modules/hal_nordic/nrfx/libmodules__hal_nordic__nrfx.a modules/segger/libmodules__segger.a -Wl,--no-whole-archive zephyr/kernel/libkernel.a zephyr/CMakeFiles/offsets.dir/./arch/arm/core/offsets/offsets.c.obj -L"/opt/nordic/ncs/toolchains/20d68df7e5/opt/zephyr-sdk/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.2.0/thumb/v8-m.main/nofp" -L/Users/nyameaama/Documents/MARS-Flight-System-Firmware/base-firmware-V2/build/zephyr -lgcc zephyr/arch/common/libisr_tables.a tfm/secure_fw/s_veneers.o -Wl,--gc-sections -Wl,--build-id=none -Wl,--sort-common=descending -Wl,--sort-section=alignment -Wl,-u,_OffsetAbsSyms -Wl,-u,_ConfigAbsSyms -nostdlib -static -Wl,-X -Wl,-N -Wl,--orphan-handling=warn -Wl,-no-pie -DPICOLIBC_INTEGER_PRINTF_SCANF modules/nrf/subsys/nrf_security/src/libmbedcrypto.a /opt/nordic/ncs/v2.5.0/nrfxlib/crypto/nrf_oberon/lib/cortex-m33/soft-float/liboberon_mbedtls_3.0.13.a modules/nrf/subsys/nrf_security/src/libmbedcrypto_base.a -mcpu=cortex-m33 -mthumb -mabi=aapcs -mfp16-format=ieee /opt/nordic/ncs/v2.5.0/nrfxlib/crypto/nrf_oberon/lib/cortex-m33/soft-float/liboberon_3.0.13.a --specs=picolibc.specs -lc -lgcc && cd /Users/nyameaama/Documents/MARS-Flight-System-Firmware/base-firmware-V2/build/zephyr && /opt/nordic/ncs/toolchains/20d68df7e5/Cellar/cmake/3.20.5/bin/cmake -E true /opt/nordic/ncs/toolchains/20d68df7e5/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 `main': /Users/nyameaama/Documents/MARS-Flight-System-Firmware/base-firmware-V2/build/../src/main.c:223: undefined reference to `__device_dts_ord_98' collect2: error: ld returned 1 exit status ninja: build stopped: subcommand failed.
This means I am unable to continue to read/write and setup the drivers for any of the sensors. For some reason it is able to see the mux channels but when I try to reference any of the sensors in the channels, it says they do not exist. Could you help me?
Here is my configuration and code
DeviceTree:
&i2c0 {
bus_0_mux_1: bus_0_mux_1@70{
compatible = "ti,tca9548a";
reg = < 0x70 >;
label = "bus_0_mux_1";
#address-cells = <1>;
#size-cells = <0>;
ch0: mux_i2c@0 {
compatible = "ti,tca9548a-channel";
label = "i2c0_mux_0";
reg = <0x0>;
status = "okay";
#address-cells = <0x1>;
#size-cells = <0x0>;
bmp280_1: bmp280_1@76 {
compatible = "i2c-device";
reg = <0x76>;
status = "okay";
label = "BMP280_1";
};
};
ch1: mux_i2c@1 {
compatible = "ti,tca9548a-channel";
label = "i2c0_mux_1";
reg = <0x1>;
status = "okay";
#address-cells = <0x1>;
#size-cells = <0x0>;
bmp280_2: bmp280_2@76 {
compatible = "i2c-device";
reg = <0x76>;
label = "BMP280_2";
};
};
ch2: mux_i2c@2 {
compatible = "ti,tca9548a-channel";
label = "i2c0_mux_2";
reg = <0x2>;
status = "okay";
#address-cells = <0x1>;
#size-cells = <0x0>;
bmp280_3: bmp280_3@76 {
compatible = "i2c-device";
reg = <0x76>;
label = "BMP280_3";
};
};
ch3: mux_i2c@3 {
compatible = "ti,tca9548a-channel";
label = "i2c0_mux_3";
reg = <0x3>;
status = "okay";
#address-cells = <0x1>;
#size-cells = <0x0>;
icm42688: icm42688@68 {
compatible = "i2c-device";
reg = <0x68>;
label = "ICM42688";
};
};
ch4: mux_i2c@4 {
compatible = "ti,tca9548a-channel";
label = "i2c0_mux_4";
reg = <0x4>;
status = "okay";
#address-cells = <0x1>;
#size-cells = <0x0>;
bmi088_acc: bmi088_acc@18 {
compatible = "i2c-device";
reg = <0x18>;
label = "BMI088-ACC";
};
bmi088_gyro: bmi088_gyro@68 {
compatible = "i2c-device";
reg = <0x68>;
label = "BMI088-GYRO";
};
};
ch5: mux_i2c@5 {
compatible = "ti,tca9548a-channel";
label = "i2c0_mux_5";
reg = <0x5>;
status = "okay";
#address-cells = <0x1>;
#size-cells = <0x0>;
lsm303_acc_1: lsm303_acc_1@19 {
compatible = "i2c-device";
reg = <0x19>;
label = "LSM303_ACC_1";
};
lsm303_mag_1: lsm303_mag_1@1E {
compatible = "i2c-device";
reg = <0x1E>;
label = "LSM303_MAG_1";
};
};
ch6: mux_i2c@6 {
compatible = "ti,tca9548a-channel";
label = "i2c0_mux_6";
reg = <0x6>;
status = "okay";
#address-cells = <0x1>;
#size-cells = <0x0>;
lsm303_acc_2: lsm303_acc_2@19 {
compatible = "i2c-device";
reg = <0x19>;
label = "LSM303_ACC_2";
};
lsm303_mag_2: lsm303_mag_2@1E {
compatible = "i2c-device";
reg = <0x1E>;
label = "LSM303_MAG_2";
};
};
ch7: mux_i2c@7 {
compatible = "ti,tca9548a-channel";
label = "i2c0_mux_7";
reg = <0x7>;
status = "okay";
#address-cells = <0x1>;
#size-cells = <0x0>;
lsm303_acc_3: lsm303_acc_3@19 {
compatible = "i2c-device";
reg = <0x19>;
label = "LSM303_ACC_3";
};
lsm303_mag_3: lsm303_mag_3@1E {
compatible = "i2c-device";
reg = <0x1E>;
label = "LSM303_MAG_3";
};
};
};
status = "okay";
pinctrl-0 = <&i2c0_default>;
pinctrl-names = "default";
};
board defconfig:
CONFIG_I2C=y CONFIG_I2C_TCA954X=y CONFIG_I2C_TCA954X_ROOT_INIT_PRIO=61 CONFIG_I2C_TCA954X_CHANNEL_INIT_PRIO=62
main.c
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#if DT_NODE_HAS_STATUS(DT_NODELABEL(ch0), okay)
#define I2C_0_CTRL_NODE_ID DT_NODELABEL(ch0)
#define I2C_0_CTRL_DEV_NAME DT_LABEL(I2C_0_CTRL_NODE_ID)
#else
#error "I2C 0 controller device not found"
#endif
#if DT_NODE_HAS_STATUS(DT_NODELABEL(ch1), okay)
#define I2C_1_CTRL_NODE_ID DT_NODELABEL(ch1)
#define I2C_1_CTRL_DEV_NAME DT_LABEL(I2C_1_CTRL_NODE_ID)
#else
#error "I2C 0 controller device not found"
#endif
#if DT_NODE_HAS_STATUS(DT_NODELABEL(ch2), okay)
#define I2C_2_CTRL_NODE_ID DT_NODELABEL(ch2)
#define I2C_2_CTRL_DEV_NAME DT_LABEL(I2C_2_CTRL_NODE_ID)
#else
#error "I2C 0 controller device not found"
#endif*/
#if DT_NODE_HAS_STATUS(DT_NODELABEL(ch3), okay)
#define I2C_3_CTRL_NODE_ID DT_NODELABEL(ch3)
#define I2C_3_CTRL_DEV_NAME DT_LABEL(I2C_3_CTRL_NODE_ID)
#else
#error "I2C 0 controller device not found"
#endif
#if DT_NODE_HAS_STATUS(DT_NODELABEL(ch4), okay)
#define I2C_4_CTRL_NODE_ID DT_NODELABEL(ch4)
#define I2C_4_CTRL_DEV_NAME DT_LABEL(I2C_4_CTRL_NODE_ID)
#else
#error "I2C 0 controller device not found"
#endif
#if DT_NODE_HAS_STATUS(DT_NODELABEL(ch5), okay)
#define I2C_5_CTRL_NODE_ID DT_NODELABEL(ch5)
#define I2C_5_CTRL_DEV_NAME DT_LABEL(I2C_5_CTRL_NODE_ID)
#else
#error "I2C 0 controller device not found"
#endif
#if DT_NODE_HAS_STATUS(DT_NODELABEL(ch6), okay)
#define I2C_6_CTRL_NODE_ID DT_NODELABEL(ch6)
#define I2C_6_CTRL_DEV_NAME DT_LABEL(I2C_6_CTRL_NODE_ID)
#else
#error "I2C 0 controller device not found"
#endif
#if DT_NODE_HAS_STATUS(DT_NODELABEL(ch7), okay)
#define I2C_7_CTRL_NODE_ID DT_NODELABEL(ch7)
#define I2C_7_CTRL_DEV_NAME DT_LABEL(I2C_7_CTRL_NODE_ID)
#else
#error "I2C 0 controller device not found"
#endif
#if DT_NODE_HAS_STATUS(DT_NODELABEL(bmp280_1), okay)
#define SENSOR_0_DEV_NAME DEVICE_DT_GET(DT_NODELABEL(bmp280_1))
#else
#error "Sensor 0 device not found"
#endif
int main(){
const struct device *sensor[2];
const struct device *ch[8];
ch[0] = device_get_binding(I2C_0_CTRL_DEV_NAME);
ch[1] = device_get_binding(I2C_1_CTRL_DEV_NAME);
ch[2] = device_get_binding(I2C_2_CTRL_DEV_NAME);
ch[3] = device_get_binding(I2C_3_CTRL_DEV_NAME);
ch[4] = device_get_binding(I2C_4_CTRL_DEV_NAME);
ch[5] = device_get_binding(I2C_5_CTRL_DEV_NAME);
ch[6] = device_get_binding(I2C_6_CTRL_DEV_NAME);
ch[7] = device_get_binding(I2C_7_CTRL_DEV_NAME);
for (int i = 0; i < 8; i++)
{
if (ch[i] == NULL)
{
printk("Could not get I2C mux channel %d", i);
}else{
printk("Channel Success");
}
}
const struct device *sens0 = DEVICE_DT_GET(DT_NODELABEL(bmp280_1));
if (sens0 == NULL){
printk("Could not get device");
}else{
printk("Got device");
}
}