Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

drivers/tmp00x : Expose Configurations to Kconfig #13989

Merged
merged 3 commits into from
May 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions drivers/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
51 changes: 35 additions & 16 deletions drivers/include/tmp00x.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
#include <stdint.h>
#include <stdbool.h>
#include "periph/i2c.h"
#include "kernel_defines.h"

#ifdef __cplusplus
extern "C"
Expand All @@ -100,40 +101,58 @@ 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 TMP00X_I2C_ADDRESS
#define TMP00X_I2C_ADDRESS (0x40)
#ifndef CONFIG_TMP00X_I2C_ADDRESS
#define CONFIG_TMP00X_I2C_ADDRESS (0x40)
#endif

/**
* @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.
*/
#ifndef TMP00X_CONVERSION_TIME
#define TMP00X_CONVERSION_TIME (1E6)
#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

/**
* @brief Default low power mode
*
* If set to 0, the device will be always-on
* If set to 1, the device will be put in low power mode between measurements.
* This adds a @c TMP00X_CONVERSION_TIME us delay to each measurement call
* for bringing the device out of standby.
* Set this to 1 to put the device in low power mode between measurements
* otherwise the device will always be on.
* Enabling this adds a @c CONFIG_TMP00X_CONVERSION_TIME us delay to each
* measurement call for bringing the device out of standby.
*/
#ifndef TMP00X_USE_LOW_POWER
#define TMP00X_USE_LOW_POWER (0)
#ifdef DOXYGEN
#define CONFIG_TMP00X_USE_LOW_POWER
#endif

/**
* @brief Default raw value mode
*
* If set to 0, measurements will be converted to Celsius.
* If set to 1, raw adc readings will be returned.
* Set this to 1 to return raw adc readings otherwise measurements will be
* converted to Celsius.
*/
#ifndef TMP00X_USE_RAW_VALUES
#define TMP00X_USE_RAW_VALUES (0)
#ifdef DOXYGEN
#define CONFIG_TMP00X_USE_RAW_VALUES
#endif
/** @} */

Expand Down
11 changes: 6 additions & 5 deletions drivers/saul/init_devs/auto_init_tmp00x.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

#include "tmp00x.h"
#include "tmp00x_params.h"
#include "kernel_defines.h"

/**
* @brief Define the number of configured sensors
Expand Down Expand Up @@ -69,12 +70,12 @@ void auto_init_tmp00x(void)
LOG_ERROR("[auto_init_saul] error set active tmp00x #%u\n", i);
continue;
}
#if 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;
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;
}
}
#endif
saul_entries[i].dev = &(tmp00x_devs[i]);
saul_entries[i].name = tmp00x_saul_info[i].name;
saul_entries[i].driver = &tmp00x_saul_driver;
Expand Down
64 changes: 64 additions & 0 deletions drivers/tmp00x/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# Copyright (c) 2020 Freie Universitaet Berlin
leandrolanzieri marked this conversation as resolved.
Show resolved Hide resolved
#
# 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
2 changes: 1 addition & 1 deletion drivers/tmp00x/include/tmp00x_params.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ extern "C" {
#define TMP00X_PARAM_I2C I2C_DEV(0)
#endif
#ifndef TMP00X_PARAM_ADDR
#define TMP00X_PARAM_ADDR (TMP00X_I2C_ADDRESS)
#define TMP00X_PARAM_ADDR (CONFIG_TMP00X_I2C_ADDRESS)
#endif
#ifndef TMP00X_PARAM_RATE
#define TMP00X_PARAM_RATE TMP00X_CONFIG_CR_DEF
Expand Down
92 changes: 44 additions & 48 deletions drivers/tmp00x/tmp00x.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@
#include "periph/i2c.h"
#include "tmp00x.h"
#include "tmp00x_regs.h"
#if TMP00X_USE_LOW_POWER
#include "xtimer.h"
#endif
#include "byteorder.h"
#include "kernel_defines.h"
#include "xtimer.h"


#define ENABLE_DEBUG (0)
#include "debug.h"
Expand Down Expand Up @@ -200,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 (!TMP00X_USE_RAW_VALUES)
int16_t rawtemp, rawvolt;
float tamb, tobj;
#endif

#if TMP00X_USE_LOW_POWER
if (tmp00x_set_active(dev)) {
return TMP00X_ERROR;
}
xtimer_usleep(TMP00X_CONVERSION_TIME);
#endif

int ret;
#if TMP00X_USE_RAW_VALUES
if ((ret = tmp00x_read(dev, to, ta, &drdy)) < 0) {
return ret;
}

if (!drdy) {
#if TMP00X_USE_LOW_POWER
tmp00x_set_standby(dev);
#endif
return -TMP00X_ERROR;
int ret;

if (IS_ACTIVE(CONFIG_TMP00X_USE_LOW_POWER)) {
if (tmp00x_set_active(dev)) {
return TMP00X_ERROR;
}
xtimer_usleep(CONFIG_TMP00X_CONVERSION_TIME);
}

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);
}
return -TMP00X_ERROR;
}
}
else {
if ((ret = tmp00x_read(dev, &rawvolt, &rawtemp, &drdy)) < 0) {
return ret;
}

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;
}
}
#else
if ((ret = tmp00x_read(dev, &rawvolt, &rawtemp, &drdy)) < 0) {
return ret;
}

if (!drdy) {
#if TMP00X_USE_LOW_POWER
tmp00x_set_standby(dev);
#endif
return -TMP00X_ERROR;
}

tmp00x_convert(rawvolt, rawtemp, &tamb, &tobj);
*ta = (int16_t)(tamb*100);
*to = (int16_t)(tobj*100);
#endif

#if TMP00X_USE_LOW_POWER
if (tmp00x_set_standby(dev)) {
return -TMP00X_ERROR;
}
#endif

return TMP00X_OK;
}
16 changes: 9 additions & 7 deletions drivers/tmp00x/tmp00x_saul.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

#include "saul.h"
#include "tmp00x.h"
#include "kernel_defines.h"

static int read_temp(const void *dev, phydat_t *res)
{
Expand All @@ -30,13 +31,14 @@ static int read_temp(const void *dev, phydat_t *res)
return -ECANCELED;
}
res->val[2] = 0;
#if TMP00X_USE_RAW_VALUES
res->unit = UNIT_NONE;
res->scale = 0;
#else
res->unit = UNIT_TEMP_C;
res->scale = -2;
#endif
if (IS_ACTIVE(CONFIG_TMP00X_USE_RAW_VALUES)) {
res->unit = UNIT_NONE;
res->scale = 0;
}
else {
res->unit = UNIT_TEMP_C;
res->scale = -2;
}
return 2;
}

Expand Down
4 changes: 2 additions & 2 deletions tests/driver_tmp00x/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ int main(void)
puts("start measurement [ERROR]");
return -1;
}
xtimer_usleep(TMP00X_CONVERSION_TIME);
xtimer_usleep(CONFIG_TMP00X_CONVERSION_TIME);
puts("[SUCCESS]\n");

while (1) {
Expand All @@ -60,7 +60,7 @@ int main(void)
else {
puts("conversion in progress ... ");
}
xtimer_usleep(TMP00X_CONVERSION_TIME);
xtimer_usleep(CONFIG_TMP00X_CONVERSION_TIME);
}

return 0;
Expand Down