diff --git a/drivers/Kconfig b/drivers/Kconfig index 9eccda868f..77d60ab5fd 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -27,6 +27,7 @@ rsource "mma8x5x/Kconfig" rsource "opt3001/Kconfig" rsource "sps30/Kconfig" rsource "tcs37727/Kconfig" +rsource "tmp00x/Kconfig" endmenu # Sensor Device Drivers menu "Storage Device Drivers" diff --git a/drivers/include/tmp00x.h b/drivers/include/tmp00x.h index 8036cb9b8a..f2d373d34c 100644 --- a/drivers/include/tmp00x.h +++ b/drivers/include/tmp00x.h @@ -101,8 +101,10 @@ extern "C" /** * @brief Default Address * - * I2C Address depends on the state of ADR0 and ADR1 Pins - * For more information, please refer to section 7.3.6.2 of TMP007 datasheet (SBOS685B). + * TMP006/TMP007 allows for up to 8 devices on a single bus. The address value + * depends on the state of ADR0 and ADR1 pins. Default value (0x40) corresponds + * to ADR0 and ADR1 pins tied to GND. For more information refer to the 'Serial + * Bus Address' section in the datasheet. */ #ifndef CONFIG_TMP00X_I2C_ADDRESS #define CONFIG_TMP00X_I2C_ADDRESS (0x40) @@ -110,7 +112,23 @@ extern "C" /** * @brief Default Conversion Time in us + * + * The duration of the analog-to-digital(A/D) conversion is determined by the + * conversion rate bits CR0, CR1 and CR2. For more information refer to the + * datasheet. */ +#if IS_ACTIVE(CONFIG_TMP00X_CONVERSION_TIME_0_25S) +#define CONFIG_TMP00X_CONVERSION_TIME (25E4) +#elif IS_ACTIVE(CONFIG_TMP00X_CONVERSION_TIME_0_5S) +#define CONFIG_TMP00X_CONVERSION_TIME (5E5) +#elif IS_ACTIVE(CONFIG_TMP00X_CONVERSION_TIME_1S) +#define CONFIG_TMP00X_CONVERSION_TIME (1E6) +#elif IS_ACTIVE(CONFIG_TMP00X_CONVERSION_TIME_2S) +#define CONFIG_TMP00X_CONVERSION_TIME (2E6) +#elif IS_ACTIVE(CONFIG_TMP00X_CONVERSION_TIME_4S) +#define CONFIG_TMP00X_CONVERSION_TIME (4E6) +#endif + #ifndef CONFIG_TMP00X_CONVERSION_TIME #define CONFIG_TMP00X_CONVERSION_TIME (1E6) #endif @@ -130,8 +148,8 @@ extern "C" /** * @brief Default raw value mode * - * Set this to 1 to return raw adc readings otherwise - * measurements will be converted to Celsius. + * Set this to 1 to return raw adc readings otherwise measurements will be + * converted to Celsius. */ #ifdef DOXYGEN #define CONFIG_TMP00X_USE_RAW_VALUES diff --git a/drivers/saul/init_devs/auto_init_tmp00x.c b/drivers/saul/init_devs/auto_init_tmp00x.c index 3543ad6281..1e10d96e62 100644 --- a/drivers/saul/init_devs/auto_init_tmp00x.c +++ b/drivers/saul/init_devs/auto_init_tmp00x.c @@ -70,12 +70,12 @@ void auto_init_tmp00x(void) LOG_ERROR("[auto_init_saul] error set active tmp00x #%u\n", i); continue; } - if (IS_ACTIVE(CONFIG_TMP00X_USE_LOW_POWER)) { + if (IS_ACTIVE(CONFIG_TMP00X_USE_LOW_POWER)) { if (tmp00x_set_standby(&tmp00x_devs[i]) != TMP00X_OK) { LOG_ERROR("[auto_init_saul] error set standby tmp00x #%u\n", i); continue; } - } + } saul_entries[i].dev = &(tmp00x_devs[i]); saul_entries[i].name = tmp00x_saul_info[i].name; saul_entries[i].driver = &tmp00x_saul_driver; diff --git a/drivers/tmp00x/Kconfig b/drivers/tmp00x/Kconfig new file mode 100644 index 0000000000..ddb0f5be9a --- /dev/null +++ b/drivers/tmp00x/Kconfig @@ -0,0 +1,64 @@ +# Copyright (c) 2020 Freie Universitaet Berlin +# +# This file is subject to the terms and conditions of the GNU Lesser +# General Public License v2.1. See the file LICENSE in the top level +# directory for more details. +# +menuconfig KCONFIG_MODULE_TMP00X + bool "Configure TMP00X driver" + depends on MODULE_TMP00X + help + Configure the TMP00X driver using Kconfig. + +if KCONFIG_MODULE_TMP00X + +config TMP00X_I2C_ADDRESS + hex "Default I2C Address" + range 0x40 0x47 + default 0x40 + help + TMP006/TMP007 allows for up to 8 devices on a single bus. The address + value depends on the state of ADR0 and ADR1 pins. Default value (0x40) + corresponds to ADR0 and ADR1 pins tied to GND. For more information + refer to the 'Serial Bus Address' section in the datasheet. + +choice + bool "Conversion time" + default TMP00X_CONVERSION_TIME_1S + help + The duration of the analog-to-digital(A/D) conversion is determined by + the conversion rate bits CR0, CR1 and CR2. For more information refer + datasheet. + +config TMP00X_CONVERSION_TIME_0_25S + bool "0.25 s" + +config TMP00X_CONVERSION_TIME_0_5S + bool "0.5 s" + +config TMP00X_CONVERSION_TIME_1S + bool "1 s" + +config TMP00X_CONVERSION_TIME_2S + bool "2 s" + +config TMP00X_CONVERSION_TIME_4S + bool "4 s" + +endchoice + +config TMP00X_USE_LOW_POWER + bool "Enable low power mode" + help + Enable this to put the device in low power mode between measurements. + By default the device will always be on. Enabling this also adds a delay + based on "Conversion time" to each measurement call for bringing the + device out of standby. + +config TMP00X_USE_RAW_VALUES + bool "Enable raw ADC readings" + help + Enable this to return raw ADC readings. By default measurements are + converted to Celsius. + +endif # KCONFIG_MODULE_TMP00X diff --git a/drivers/tmp00x/tmp00x.c b/drivers/tmp00x/tmp00x.c index 9fd54f1f1d..6be6b2ddef 100644 --- a/drivers/tmp00x/tmp00x.c +++ b/drivers/tmp00x/tmp00x.c @@ -34,10 +34,8 @@ #include "tmp00x_regs.h" #include "byteorder.h" #include "kernel_defines.h" - -#if IS_ACTIVE(CONFIG_TMP00X_USE_LOW_POWER) #include "xtimer.h" -#endif + #define ENABLE_DEBUG (0) #include "debug.h" @@ -202,54 +200,50 @@ void tmp00x_convert(int16_t rawv, int16_t rawt, float *tamb, float *tobj) int tmp00x_read_temperature(const tmp00x_t *dev, int16_t *ta, int16_t *to) { - uint16_t drdy; -#if (!IS_ACTIVE(CONFIG_TMP00X_USE_RAW_VALUES)) int16_t rawtemp, rawvolt; float tamb, tobj; -#endif + int ret; -#if IS_ACTIVE(CONFIG_TMP00X_USE_LOW_POWER) - if (tmp00x_set_active(dev)) { - return TMP00X_ERROR; - } - xtimer_usleep(CONFIG_TMP00X_CONVERSION_TIME); -#endif - -int ret; -#if IS_ACTIVE(CONFIG_TMP00X_USE_RAW_VALUES) - if ((ret = tmp00x_read(dev, to, ta, &drdy)) < 0) { - return ret; + if (IS_ACTIVE(CONFIG_TMP00X_USE_LOW_POWER)) { + if (tmp00x_set_active(dev)) { + return TMP00X_ERROR; + } + xtimer_usleep(CONFIG_TMP00X_CONVERSION_TIME); } - if (!drdy) { -#if IS_ACTIVE(CONFIG_TMP00X_USE_LOW_POWER) - tmp00x_set_standby(dev); -#endif - return -TMP00X_ERROR; - } -#else - if ((ret = tmp00x_read(dev, &rawvolt, &rawtemp, &drdy)) < 0) { - return ret; - } + if (IS_ACTIVE(CONFIG_TMP00X_USE_RAW_VALUES)) { + if ((ret = tmp00x_read(dev, to, ta, &drdy)) < 0) { + return ret; + } - if (!drdy) { -#if IS_ACTIVE(CONFIG_TMP00X_USE_LOW_POWER) - tmp00x_set_standby(dev); -#endif - return -TMP00X_ERROR; + if (!drdy) { + if (IS_ACTIVE(CONFIG_TMP00X_USE_LOW_POWER)) { + tmp00x_set_standby(dev); + } + return -TMP00X_ERROR; + } } + else { + if ((ret = tmp00x_read(dev, &rawvolt, &rawtemp, &drdy)) < 0) { + return ret; + } - tmp00x_convert(rawvolt, rawtemp, &tamb, &tobj); - *ta = (int16_t)(tamb*100); - *to = (int16_t)(tobj*100); -#endif + if (!drdy) { + if (IS_ACTIVE(CONFIG_TMP00X_USE_LOW_POWER)) { + tmp00x_set_standby(dev); + } + return -TMP00X_ERROR; + } + tmp00x_convert(rawvolt, rawtemp, &tamb, &tobj); + *ta = (int16_t)(tamb*100); + *to = (int16_t)(tobj*100); + } if (IS_ACTIVE(CONFIG_TMP00X_USE_LOW_POWER)) { if (tmp00x_set_standby(dev)) { return -TMP00X_ERROR; } } - return TMP00X_OK; }