Commit 093f66fe authored by Jordan Yates's avatar Jordan Yates Committed by Benjamin Cabé
Browse files

sensor: tmp108: fix `sample_fetch` API conformance

`sensor_sample_fetch` is documented as blocking until the fetch
operation is complete. Update the implementation so that this is true.

Since the fetch operation now blocks, there is no need for the data
ready trigger.

Signed-off-by: default avatarJordan Yates <jordan@embeint.com>
parent faf912d4
Loading
Loading
Loading
Loading
+29 −19
Changes for drivers/sensor/ti/tmp108/tmp108.c: 29 added lines, 19 removed lines.
Original line number Diff line number Diff line
@@ -100,45 +100,57 @@ static int tmp108_sample_fetch(const struct device *dev,
			       enum sensor_channel chan)
{
	struct tmp108_data *drv_data = dev->data;
	uint16_t config, converting_mask;
	int result;

	if (chan != SENSOR_CHAN_ALL && chan != SENSOR_CHAN_AMBIENT_TEMP) {
		return -ENOTSUP;
	}

	/* If one shot mode is set, query chip for reading
	 * should be finished 30 ms later
	 */
	if (drv_data->one_shot_mode == true) {
	if (!drv_data->one_shot_mode) {
		/* Read the latest temperature result */
		return ti_tmp108_read_temp(dev);
	}

	/* Trigger the conversion */
	result = tmp108_write_config(dev,
					TI_TMP108_MODE_MASK(dev),
					TI_TMP108_MODE_ONE_SHOT(dev));

	if (result < 0) {
		return result;
	}

		/* Schedule read to start in 30 ms if mode change was successful
		 * the typical wakeup time given in the data sheet is 27
	/* Typical conversion time:
	 *   TMP108: 27ms
	 *   AS6212: 36ms
	 * Maximum conversion time:
	 *   TMP108: 35ms
	 *   AS6212: 51ms
	 */
		result = k_work_schedule(&drv_data->scheduled_work,
					 K_MSEC(TMP108_WAKEUP_TIME_IN_MS(dev)));
	const uint32_t conv_time_min = 25;
	const uint32_t conv_time_max = 100;
	const uint32_t poll_period = 5;

	k_sleep(K_MSEC(conv_time_min));
	converting_mask = TI_TMP108_CONF_M1(dev) | TI_TMP108_CONF_M0(dev);

	for (int i = conv_time_min; i < conv_time_max; i += poll_period) {
		/* Read the config register */
		result = tmp108_reg_read(dev, TI_TMP108_REG_CONF, &config);
		if (result < 0) {
			return result;
		}

		return 0;
		if ((config & converting_mask) == 0) {
			/* Conversion has finished */
			LOG_DBG("Conversion complete after %d ms", i);
			return ti_tmp108_read_temp(dev);
		}

	result =  ti_tmp108_read_temp(dev);

	if (result < 0) {
		return result;
		/* Wait before reading again */
		k_sleep(K_MSEC(poll_period));
	}

	return 0;
	/* Conversion timed out */
	return -EAGAIN;
}

static int tmp108_channel_get(const struct device *dev,
@@ -367,8 +379,6 @@ static int tmp108_init(const struct device *dev)
		return -ENODEV;
	}

	drv_data->scheduled_work.work.handler = tmp108_trigger_handle_one_shot;

	/* save this driver instance for passing to other functions */
	drv_data->tmp108_dev = dev;

+2 −11
Changes for drivers/sensor/ti/tmp108/tmp108.h: 2 added lines, 11 removed lines.
Original line number Diff line number Diff line
@@ -31,8 +31,7 @@
			 .CONF_M0   = 0x8000,	\
			 .CONF_RST  = 0x0080,	\
			 .TEMP_MULT = 15625,	\
			 .TEMP_DIV  = 2,        \
			 .WAKEUP_TIME_IN_MS = 120 }
			 .TEMP_DIV  = 2 }

#define TI_TMP108_CONF	{.CONF_HYS0  = 0x0010,	\
			 .CONF_HYS1  = 0x0020,	\
@@ -44,8 +43,7 @@
			 .CONF_CR1   = 0x4000,	\
			 .CONF_RST   = 0x0022,	\
			 .TEMP_MULT  = 15625,	\
			 .TEMP_DIV   = 4,       \
			 .WAKEUP_TIME_IN_MS = 30 }
			 .TEMP_DIV   = 4 }

#define TI_TMP108_MODE_SHUTDOWN(x) 0
#define TI_TMP108_MODE_ONE_SHOT(x) (TI_TMP108_CONF_M0(x) | TI_TMP108_CONF_SLEEP(x))
@@ -84,7 +82,6 @@

#define TMP108_TEMP_MULTIPLIER(x)	TI_TMP108_GET_CONF(x, TEMP_MULT)
#define TMP108_TEMP_DIVISOR(x)	TI_TMP108_GET_CONF(x, TEMP_DIV)
#define TMP108_WAKEUP_TIME_IN_MS(x)	TI_TMP108_GET_CONF(x, WAKEUP_TIME_IN_MS)
#define TMP108_CONF_RST(x)	TI_TMP108_GET_CONF(x, CONF_RST)

#define TI_TMP108_CONF_NA 0x0000
@@ -101,7 +98,6 @@ struct tmp_108_reg_def {
	uint16_t CONF_HYS0;	/** Temperature hysteresis config 2 bit */
	int32_t TEMP_MULT;	/** Temperature multiplier */
	int32_t TEMP_DIV;	/** Temperature divisor */
	uint16_t WAKEUP_TIME_IN_MS; /** Wake up and conversion time from one shot */
	uint16_t CONF_RST;	/** default reset values on init */
};

@@ -120,14 +116,9 @@ struct tmp108_data {

	bool one_shot_mode;

	struct k_work_delayable scheduled_work;

	const struct sensor_trigger *temp_alert_trigger;
	sensor_trigger_handler_t temp_alert_handler;

	sensor_trigger_handler_t data_ready_handler;
	const struct sensor_trigger *data_ready_trigger;

	struct gpio_callback temp_alert_gpio_cb;
};

+0 −44
Changes for drivers/sensor/ti/tmp108/tmp108_trigger.c: 0 added lines, 44 removed lines.
Original line number Diff line number Diff line
@@ -10,46 +10,8 @@

#include "tmp108.h"

#define TMP108_ONE_SHOT_RETRY_TIME_IN_MS 10

LOG_MODULE_DECLARE(TMP108, CONFIG_SENSOR_LOG_LEVEL);

void tmp108_trigger_handle_one_shot(struct k_work *work)
{
	struct k_work_delayable *delayable_work = k_work_delayable_from_work(work);
	struct tmp108_data *drv_data = CONTAINER_OF(delayable_work,
						    struct tmp108_data,
						    scheduled_work);

	uint16_t config = 0;
	bool shutdown_mode = false;

	tmp108_reg_read(drv_data->tmp108_dev, TI_TMP108_REG_CONF, &config);

	/* check shutdown mode which indicates a one shot read was successful */
	shutdown_mode = (config & (TI_TMP108_CONF_M1(drv_data->tmp108_dev) |
				   TI_TMP108_CONF_M0(drv_data->tmp108_dev))) == 0;

	if (shutdown_mode == true) {
		ti_tmp108_read_temp(drv_data->tmp108_dev);
	} else {
		LOG_ERR("Temperature one shot mode read failed, retrying");
		/* Wait for typical wake up time, retry if the read fails
		 * assuming the chip should wake up and take a reading after the typical
		 * wake up time and call of this thread plus 10 ms time has passed
		 */
		k_work_reschedule(&drv_data->scheduled_work,
				  K_MSEC(TMP108_ONE_SHOT_RETRY_TIME_IN_MS));
		return;
	}

	/* Successful read, call set callbacks */
	if (drv_data->data_ready_handler) {
		drv_data->data_ready_handler(drv_data->tmp108_dev,
					     drv_data->data_ready_trigger);
	}
}

void tmp108_trigger_handle_alert(const struct device *gpio,
				 struct gpio_callback *cb,
				 gpio_port_pins_t pins)
@@ -72,12 +34,6 @@ int tmp_108_trigger_set(const struct device *dev,
{
	struct tmp108_data *drv_data = dev->data;

	if (trig->type == SENSOR_TRIG_DATA_READY) {
		drv_data->data_ready_handler = handler;
		drv_data->data_ready_trigger = trig;
		return 0;
	}

	if (trig->type == SENSOR_TRIG_THRESHOLD) {
		drv_data->temp_alert_handler = handler;
		drv_data->temp_alert_trigger = trig;