Custom Sensor Driver for CT1711 Temperature Sensor

I am trying to create a custom sensor for CT1711 temperature sensor. I have created the sensor driver code and device tree binding, but it won't start (initialize) and the device is not ready. Do I need to add something to the sensor driver, or is there something missing?

drivers/sensor/ct1711/ct1711.c

#define DT_DRV_COMPAT zephyr_ct1711

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/sensor.h>

#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(ct1711, CONFIG_SENSOR_LOG_LEVEL);

...

static int ct1711_sample_fetch(const struct device *dev, enum sensor_channel chan)
{
	if (chan != CT1711_SENSOR_CHANNELS)
	{
		LOG_ERR("Supported channel is SENSOR_CHAN_AMBIENT_TEMP (%d), but %d was requested", CT1711_SENSOR_CHANNELS, chan);
		return -ENOTSUP;
	}

	struct ct1711_data *data = dev->data;

	data->temperature = ct1711_read_temperature(dev);
	if (data->temperature < CT1711_LOWER_THRESHOLD || data->temperature > CT1711_UPPER_THRESHOLD)
	{
		LOG_ERR("Invalid temperature reading: %f", (double)data->temperature);
		return -EIO;
	}

	LOG_DBG("Temperature fetched: %f", (double)data->temperature);
	return 0;
}

static int ct1711_channel_get(const struct device *dev, enum sensor_channel chan, struct sensor_value *val)
{
	if (chan != CT1711_SENSOR_CHANNELS)
	{
		LOG_ERR("Supported channel is SENSOR_CHAN_AMBIENT_TEMP (%d), but %d was requested", CT1711_SENSOR_CHANNELS, chan);
		return -ENOTSUP;
	}

	struct ct1711_data *data = dev->data;

	val->val1 = (int32_t)data->temperature;
	val->val2 = (int32_t)((data->temperature - val->val1) * 1000000);

	LOG_DBG("Temperature value: %d.%06d", val->val1, val->val2);
	return 0;
}

static const struct sensor_driver_api ct1711_driver_api = {
	.sample_fetch = ct1711_sample_fetch,
	.channel_get = ct1711_channel_get,
};

static int ct1711_init(const struct device *dev)
{
	LOG_DBG("Initializing CT1711 sensor");

	const struct ct1711_config *config = dev->config;

	if (!device_is_ready(config->dio.port))
	{
		LOG_ERR("GPIO device %s is not ready", config->dio.port->name);
		return -ENODEV;
	}

	int ret;

	ret = gpio_pin_configure_dt(&config->dio, GPIO_INPUT);
	if (ret < 0)
	{
		LOG_ERR("Failed to configure GPIO pin %d as input: %d", config->dio.pin, ret);
		return ret;
	}

	return 0;
}

#define CT1711_DEFINE(inst)                                                  \
	static struct ct1711_data ct1711_data_##inst;                            \
	static const struct ct1711_config ct1711_config_##inst = {               \
		.dio = GPIO_DT_SPEC_INST_GET(inst, dio_gpios),                       \
	};                                                                       \
	SENSOR_DEVICE_DT_INST_DEFINE(inst, ct1711_init, NULL,                    \
								 &ct1711_data_##inst, &ct1711_config_##inst, \
								 POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY,   \
								 &ct1711_driver_api);

DT_INST_FOREACH_STATUS_OKAY(CT1711_DEFINE)

dts/bindings/sensor/zephyr,ct1711.yaml

description: CT1711 temperature sensor

compatible: "zephyr,ct1711"

include: sensor-device.yaml

properties:
  dio-gpios:
    type: phandle-array
    required: true
    description: DIO GPIOs for the CT1711 sensor.

boards/nr52832.overlay

/ {
    ct1711: ct1711 {
        compatible = "zephyr,ct1711";
        dio-gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>;
        status = "okay";
    };
};

I tried using `device_is_ready()` and it returned an error with the device name "V".

Related