diff --git a/drivers/sensor/CMakeLists.txt b/drivers/sensor/CMakeLists.txt index a3c4df804c6..6ac85e2dfa7 100644 --- a/drivers/sensor/CMakeLists.txt +++ b/drivers/sensor/CMakeLists.txt @@ -55,6 +55,7 @@ add_subdirectory_ifdef(CONFIG_SX9500 sx9500) add_subdirectory_ifdef(CONFIG_TH02 th02) add_subdirectory_ifdef(CONFIG_TMP007 tmp007) add_subdirectory_ifdef(CONFIG_TMP112 tmp112) +add_subdirectory_ifdef(CONFIG_TMP116 tmp116) add_subdirectory_ifdef(CONFIG_VL53L0X vl53l0x) zephyr_sources_ifdef(CONFIG_USERSPACE sensor_handlers.c) diff --git a/drivers/sensor/Kconfig b/drivers/sensor/Kconfig index 6dbcd905c5c..33cb46b0a0a 100644 --- a/drivers/sensor/Kconfig +++ b/drivers/sensor/Kconfig @@ -135,6 +135,8 @@ source "drivers/sensor/tmp007/Kconfig" source "drivers/sensor/tmp112/Kconfig" +source "drivers/sensor/tmp116/Kconfig" + source "drivers/sensor/vl53l0x/Kconfig" endif # SENSOR diff --git a/drivers/sensor/tmp116/CMakeLists.txt b/drivers/sensor/tmp116/CMakeLists.txt new file mode 100644 index 00000000000..b587da0376a --- /dev/null +++ b/drivers/sensor/tmp116/CMakeLists.txt @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: Apache-2.0 + +zephyr_library() + +zephyr_library_sources_ifdef(CONFIG_TMP116 tmp116.c) diff --git a/drivers/sensor/tmp116/Kconfig b/drivers/sensor/tmp116/Kconfig new file mode 100644 index 00000000000..2e06a07d3ac --- /dev/null +++ b/drivers/sensor/tmp116/Kconfig @@ -0,0 +1,13 @@ +# Kconfig - TMP116 temperature sensor configuration options + +# +# Copyright (c) 2019 Centaur Analytics, Inc +# +# SPDX-License-Identifier: Apache-2.0 +# + +menuconfig TMP116 + bool "TMP116 Temperature Sensor" + depends on I2C && HAS_DTS_I2C + help + Enable driver for TMP116 temperature sensor. diff --git a/drivers/sensor/tmp116/tmp116.c b/drivers/sensor/tmp116/tmp116.c new file mode 100644 index 00000000000..1dd33c4a30c --- /dev/null +++ b/drivers/sensor/tmp116/tmp116.c @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2019 Centaur Analytics, Inc + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tmp116.h" + +#define LOG_LEVEL CONFIG_SENSOR_LOG_LEVEL +LOG_MODULE_REGISTER(TMP116); + +static int tmp116_reg_read(struct device *dev, u8_t reg, u16_t *val) +{ + struct tmp116_data *drv_data = dev->driver_data; + const struct tmp116_dev_config *cfg = dev->config->config_info; + + if (i2c_burst_read(drv_data->i2c, cfg->i2c_addr, reg, (u8_t *)val, 2) + < 0) { + return -EIO; + } + + *val = sys_be16_to_cpu(*val); + + return 0; +} + +/** + * @brief Check the Device ID + * + * @param[in] dev Pointer to the device structure + * + * @retval 0 On success + * @retval -EIO Otherwise + */ +static inline int tmp116_device_id_check(struct device *dev) +{ + u16_t value; + + if (tmp116_reg_read(dev, TMP116_REG_DEVICE_ID, &value) != 0) { + LOG_ERR("%s: Failed to get Device ID register!", + DT_INST_0_TI_TMP116_LABEL); + return -EIO; + } + + if (value != TMP116_DEVICE_ID) { + LOG_ERR("%s: Failed to match the device IDs!", + DT_INST_0_TI_TMP116_LABEL); + return -EINVAL; + } + + return 0; +} + +static int tmp116_sample_fetch(struct device *dev, enum sensor_channel chan) +{ + struct tmp116_data *drv_data = dev->driver_data; + u16_t value; + int rc; + + __ASSERT_NO_MSG(chan == SENSOR_CHAN_ALL || + chan == SENSOR_CHAN_AMBIENT_TEMP); + + /* clear sensor values */ + drv_data->sample = 0U; + + /* Get the most recent temperature measurement */ + rc = tmp116_reg_read(dev, TMP116_REG_TEMP, &value); + if (rc < 0) { + LOG_ERR("%s: Failed to read from TEMP register!", + DT_INST_0_TI_TMP116_LABEL); + return rc; + } + + /* store measurements to the driver */ + drv_data->sample = (s16_t)value; + + return 0; +} + +static int tmp116_channel_get(struct device *dev, enum sensor_channel chan, + struct sensor_value *val) +{ + struct tmp116_data *drv_data = dev->driver_data; + s32_t tmp; + + if (chan != SENSOR_CHAN_AMBIENT_TEMP) { + return -ENOTSUP; + } + + /* + * See datasheet "Temperature Results and Limits" section for more + * details on processing sample data. + */ + tmp = (s32_t)drv_data->sample * TMP116_RESOLUTION; + val->val1 = tmp / 10000000; /* Tens of uCelsius */ + val->val2 = tmp % 10000000; + + return 0; +} + +static const struct sensor_driver_api tmp116_driver_api = { + .sample_fetch = tmp116_sample_fetch, + .channel_get = tmp116_channel_get +}; + +static int tmp116_init(struct device *dev) +{ + struct tmp116_data *drv_data = dev->driver_data; + int rc; + + /* Bind to the I2C bus that the sensor is connected */ + drv_data->i2c = device_get_binding(DT_INST_0_TI_TMP116_BUS_NAME); + if (!drv_data->i2c) { + LOG_ERR("Cannot bind to %s device!", + DT_INST_0_TI_TMP116_BUS_NAME); + return -EINVAL; + } + + /* Check the Device ID */ + rc = tmp116_device_id_check(dev); + if (rc < 0) { + return rc; + } + + return 0; +} + +static struct tmp116_data tmp116_data; + +static const struct tmp116_dev_config tmp116_config = { + .i2c_addr = DT_INST_0_TI_TMP116_BASE_ADDRESS, +}; + +DEVICE_AND_API_INIT(hdc1080, DT_INST_0_TI_TMP116_LABEL, tmp116_init, + &tmp116_data, &tmp116_config, POST_KERNEL, + CONFIG_SENSOR_INIT_PRIORITY, &tmp116_driver_api); diff --git a/drivers/sensor/tmp116/tmp116.h b/drivers/sensor/tmp116/tmp116.h new file mode 100644 index 00000000000..0c8107bbbdb --- /dev/null +++ b/drivers/sensor/tmp116/tmp116.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2019 Centaur Analytics, Inc + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef ZEPHYR_DRIVERS_SENSOR_TMP116_TMP116_H_ +#define ZEPHYR_DRIVERS_SENSOR_TMP116_TMP116_H_ + +#define TMP116_REG_TEMP 0x0 +#define TMP116_REG_CFGR 0x1 +#define TMP116_REG_HIGH_LIM 0x2 +#define TMP116_REG_LOW_LIM 0x3 +#define TMP116_REG_EEPROM_UL 0x4 +#define TMP116_REG_EEPROM1 0x5 +#define TMP116_REG_EEPROM2 0x6 +#define TMP116_REG_EEPROM3 0x7 +#define TMP116_REG_EEPROM4 0x8 +#define TMP116_REG_DEVICE_ID 0xF + +#define TMP116_RESOLUTION 78125 /* in tens of uCelsius*/ +#define TMP116_RESOLUTION_DIV 10000000 + +#define TMP116_DEVICE_ID 0x1116 + +struct tmp116_data { + struct device *i2c; + u16_t sample; +}; + +struct tmp116_dev_config { + u16_t i2c_addr; +}; + +#endif /* ZEPHYR_DRIVERS_SENSOR_TMP116_TMP116_H_ */ diff --git a/tests/drivers/build_all/dts_fixup.h b/tests/drivers/build_all/dts_fixup.h index 706abd0475d..4af4300a08c 100644 --- a/tests/drivers/build_all/dts_fixup.h +++ b/tests/drivers/build_all/dts_fixup.h @@ -258,6 +258,13 @@ #define DT_INST_0_TI_HDC_BASE_ADDRESS 0 #endif +#ifndef DT_INST_0_TI_TMP116_LABEL +#define DT_INST_0_TI_TMP116_LABEL "" +#define DT_INST_0_TI_TMP116_BASE_ADDRESS 0 +#define DT_INST_0_TI_TMP116_BUS_NAME "" +#define DT_TI_TMP116_BUS_I2C 1 +#endif + #endif /* CONFIG_HAS_DTS_I2C */ #ifndef DT_ADXL372_DEV_NAME diff --git a/tests/drivers/build_all/sensors_i_z.conf b/tests/drivers/build_all/sensors_i_z.conf index a37cbae0e05..e45a7996b07 100644 --- a/tests/drivers/build_all/sensors_i_z.conf +++ b/tests/drivers/build_all/sensors_i_z.conf @@ -32,4 +32,5 @@ CONFIG_TH02=y CONFIG_TI_HDC=y CONFIG_TMP007=y CONFIG_TMP112=y +CONFIG_TMP116=y CONFIG_VL53L0X=y