From 0cfac519cc09765a2e78faa9a2707e1c494e8345 Mon Sep 17 00:00:00 2001 From: Peter Bigot Date: Mon, 16 Dec 2019 09:59:39 -0600 Subject: [PATCH] sensor: dht: convert from Kconfig to devicetree Define a binding for the Aosong DHT family of temperature/humidity sensors. Remove the Kconfig settings, and update the driver to use devicetree information. Signed-off-by: Peter Bigot --- drivers/sensor/dht/Kconfig | 44 +--------- drivers/sensor/dht/dht.c | 122 +++++++++++++++------------- drivers/sensor/dht/dht.h | 5 ++ dts/bindings/sensor/aosong,dht.yaml | 29 +++++++ tests/drivers/build_all/dts_fixup.h | 7 ++ 5 files changed, 109 insertions(+), 98 deletions(-) create mode 100644 dts/bindings/sensor/aosong,dht.yaml diff --git a/drivers/sensor/dht/Kconfig b/drivers/sensor/dht/Kconfig index 98370b7bc0a..a95230c49b8 100644 --- a/drivers/sensor/dht/Kconfig +++ b/drivers/sensor/dht/Kconfig @@ -3,50 +3,8 @@ # Copyright (c) 2016 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -menuconfig DHT +config DHT bool "DHT Temperature and Humidity Sensor" depends on GPIO help Enable driver for the DHT temperature and humidity sensor family. - -if DHT - -choice - prompt "Chip type" - default DHT_CHIP_DHT11 - help - Choose desired chip type from the DHT family. - -config DHT_CHIP_DHT11 - bool "DHT11" - help - Choose this option to enable the DHT11 chip. - -config DHT_CHIP_DHT22 - bool "DHT22" - help - Choose this option to enable the DHT22 chip. - -endchoice - -config DHT_NAME - string "Driver name" - default "DHT11" if DHT_CHIP_DHT11 - default "DHT22" if DHT_CHIP_DHT22 - help - Device name with which the sensor is identified. - -config DHT_GPIO_DEV_NAME - string "GPIO device" - default "GPIO_0" - help - The device name of the GPIO device to which the chip's data pin - is connected. - -config DHT_GPIO_PIN_NUM - int "Interrupt GPIO pin number" - default 0 - help - The number of the GPIO on which the chip's data pin is connected. - -endif # DHT diff --git a/drivers/sensor/dht/dht.c b/drivers/sensor/dht/dht.c index 55181e780a5..806bdb1f4b6 100644 --- a/drivers/sensor/dht/dht.c +++ b/drivers/sensor/dht/dht.c @@ -26,9 +26,11 @@ LOG_MODULE_REGISTER(DHT, CONFIG_SENSOR_LOG_LEVEL); * @return duration in usec of signal being measured, * -1 if duration exceeds DHT_SIGNAL_MAX_WAIT_DURATION */ -static s8_t dht_measure_signal_duration(struct dht_data *drv_data, - u32_t signal_val) +static s8_t dht_measure_signal_duration(struct device *dev, + u32_t signal_val) { + struct dht_data *drv_data = dev->driver_data; + const struct dht_config *cfg = dev->config->config_info; u32_t val; u32_t elapsed_cycles; u32_t max_wait_cycles = (u32_t)( @@ -39,7 +41,7 @@ static s8_t dht_measure_signal_duration(struct dht_data *drv_data, u32_t start_cycles = k_cycle_get_32(); do { - gpio_pin_read(drv_data->gpio, CONFIG_DHT_GPIO_PIN_NUM, &val); + gpio_pin_read(drv_data->gpio, cfg->pin, &val); elapsed_cycles = k_cycle_get_32() - start_cycles; if (elapsed_cycles > max_wait_cycles) { @@ -55,6 +57,7 @@ static s8_t dht_measure_signal_duration(struct dht_data *drv_data, static int dht_sample_fetch(struct device *dev, enum sensor_channel chan) { struct dht_data *drv_data = dev->driver_data; + const struct dht_config *cfg = dev->config->config_info; int ret = 0; s8_t signal_duration[DHT_DATA_BITS_NUM]; s8_t max_duration, min_duration, avg_duration; @@ -64,30 +67,30 @@ static int dht_sample_fetch(struct device *dev, enum sensor_channel chan) __ASSERT_NO_MSG(chan == SENSOR_CHAN_ALL); /* send start signal */ - gpio_pin_write(drv_data->gpio, CONFIG_DHT_GPIO_PIN_NUM, 0); + gpio_pin_write(drv_data->gpio, cfg->pin, 0); k_busy_wait(DHT_START_SIGNAL_DURATION); - gpio_pin_write(drv_data->gpio, CONFIG_DHT_GPIO_PIN_NUM, 1); + gpio_pin_write(drv_data->gpio, cfg->pin, 1); /* switch to DIR_IN to read sensor signals */ - gpio_pin_configure(drv_data->gpio, CONFIG_DHT_GPIO_PIN_NUM, + gpio_pin_configure(drv_data->gpio, cfg->pin, GPIO_DIR_IN); /* wait for sensor response */ - if (dht_measure_signal_duration(drv_data, 1) == -1) { + if (dht_measure_signal_duration(dev, 1) == -1) { ret = -EIO; goto cleanup; } /* read sensor response */ - if (dht_measure_signal_duration(drv_data, 0) == -1) { + if (dht_measure_signal_duration(dev, 0) == -1) { ret = -EIO; goto cleanup; } /* wait for sensor data */ - if (dht_measure_signal_duration(drv_data, 1) == -1) { + if (dht_measure_signal_duration(dev, 1) == -1) { ret = -EIO; goto cleanup; } @@ -95,13 +98,13 @@ static int dht_sample_fetch(struct device *dev, enum sensor_channel chan) /* read sensor data */ for (i = 0U; i < DHT_DATA_BITS_NUM; i++) { /* LOW signal to indicate a new bit */ - if (dht_measure_signal_duration(drv_data, 0) == -1) { + if (dht_measure_signal_duration(dev, 0) == -1) { ret = -EIO; goto cleanup; } /* HIGH signal duration indicates bit value */ - signal_duration[i] = dht_measure_signal_duration(drv_data, 1); + signal_duration[i] = dht_measure_signal_duration(dev, 1); if (signal_duration[i] == -1) { ret = -EIO; goto cleanup; @@ -152,9 +155,8 @@ static int dht_sample_fetch(struct device *dev, enum sensor_channel chan) cleanup: /* switch to DIR_OUT and leave pin to HIGH until next fetch */ - gpio_pin_configure(drv_data->gpio, CONFIG_DHT_GPIO_PIN_NUM, - GPIO_DIR_OUT); - gpio_pin_write(drv_data->gpio, CONFIG_DHT_GPIO_PIN_NUM, 1); + gpio_pin_configure(drv_data->gpio, cfg->pin, GPIO_DIR_OUT); + gpio_pin_write(drv_data->gpio, cfg->pin, 1); return ret; } @@ -165,45 +167,48 @@ static int dht_channel_get(struct device *dev, { struct dht_data *drv_data = dev->driver_data; - __ASSERT_NO_MSG(chan == SENSOR_CHAN_AMBIENT_TEMP || chan == SENSOR_CHAN_HUMIDITY); + __ASSERT_NO_MSG(chan == SENSOR_CHAN_AMBIENT_TEMP + || chan == SENSOR_CHAN_HUMIDITY); /* see data calculation example from datasheet */ -#if defined(CONFIG_DHT_CHIP_DHT11) - /* use only integral data byte */ - if (chan == SENSOR_CHAN_HUMIDITY) { - val->val1 = drv_data->sample[0]; - val->val2 = 0; - } else { /* chan == SENSOR_CHAN_AMBIENT_TEMP */ - val->val1 = drv_data->sample[2]; - val->val2 = 0; - } -#elif defined(CONFIG_DHT_CHIP_DHT22) - /* - * use both integral and decimal data bytes; resulted 16bit data has - * a resolution of 0.1 units - */ - s16_t raw_val, sign; + if (IS_ENABLED(DT_INST_0_AOSONG_DHT_DHT22)) { + /* + * use both integral and decimal data bytes; resulted + * 16bit data has a resolution of 0.1 units + */ + s16_t raw_val, sign; - if (chan == SENSOR_CHAN_HUMIDITY) { - raw_val = (drv_data->sample[0] << 8) | drv_data->sample[1]; - val->val1 = raw_val / 10; - val->val2 = (raw_val % 10) * 100000; - } else { /* chan == SENSOR_CHAN_AMBIENT_TEMP */ - raw_val = (drv_data->sample[2] << 8) | drv_data->sample[3]; + if (chan == SENSOR_CHAN_HUMIDITY) { + raw_val = (drv_data->sample[0] << 8) + + drv_data->sample[1]; + val->val1 = raw_val / 10; + val->val2 = (raw_val % 10) * 100000; + } else { /* chan == SENSOR_CHAN_AMBIENT_TEMP */ + raw_val = (drv_data->sample[2] << 8) + + drv_data->sample[3]; - sign = raw_val & 0x8000; - raw_val = raw_val & ~0x8000; + sign = raw_val & 0x8000; + raw_val = raw_val & ~0x8000; - val->val1 = raw_val / 10; - val->val2 = (raw_val % 10) * 100000; + val->val1 = raw_val / 10; + val->val2 = (raw_val % 10) * 100000; - /* handle negative value */ - if (sign) { - val->val1 = -val->val1; - val->val2 = -val->val2; + /* handle negative value */ + if (sign) { + val->val1 = -val->val1; + val->val2 = -val->val2; + } + } + } else { + /* use only integral data byte */ + if (chan == SENSOR_CHAN_HUMIDITY) { + val->val1 = drv_data->sample[0]; + val->val2 = 0; + } else { /* chan == SENSOR_CHAN_AMBIENT_TEMP */ + val->val1 = drv_data->sample[2]; + val->val2 = 0; } } -#endif return 0; } @@ -215,23 +220,30 @@ static const struct sensor_driver_api dht_api = { static int dht_init(struct device *dev) { + int rc = 0; struct dht_data *drv_data = dev->driver_data; + const struct dht_config *cfg = dev->config->config_info; - drv_data->gpio = device_get_binding(CONFIG_DHT_GPIO_DEV_NAME); + drv_data->gpio = device_get_binding(cfg->ctrl); if (drv_data->gpio == NULL) { - LOG_ERR("Failed to get GPIO device."); + LOG_ERR("Failed to get GPIO device %s.", cfg->ctrl); return -EINVAL; } - gpio_pin_configure(drv_data->gpio, CONFIG_DHT_GPIO_PIN_NUM, - GPIO_DIR_OUT); + rc = gpio_pin_configure(drv_data->gpio, cfg->pin, GPIO_DIR_OUT); + if (rc == 0) { + rc = gpio_pin_write(drv_data->gpio, cfg->pin, 1); + } - gpio_pin_write(drv_data->gpio, CONFIG_DHT_GPIO_PIN_NUM, 1); - - return 0; + return rc; } -struct dht_data dht_data; +static struct dht_data dht_data; +static const struct dht_config dht_config = { + .ctrl = DT_INST_0_AOSONG_DHT_DIO_GPIOS_CONTROLLER, + .pin = DT_INST_0_AOSONG_DHT_DIO_GPIOS_PIN, +}; -DEVICE_AND_API_INIT(dht_dev, CONFIG_DHT_NAME, &dht_init, &dht_data, - NULL, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, &dht_api); +DEVICE_AND_API_INIT(dht_dev, DT_INST_0_AOSONG_DHT_LABEL, &dht_init, + &dht_data, &dht_config, + POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, &dht_api); diff --git a/drivers/sensor/dht/dht.h b/drivers/sensor/dht/dht.h index c01642d8862..862f2f38a09 100644 --- a/drivers/sensor/dht/dht.h +++ b/drivers/sensor/dht/dht.h @@ -18,4 +18,9 @@ struct dht_data { u8_t sample[4]; }; +struct dht_config { + const char *ctrl; + u8_t pin; +}; + #endif diff --git a/dts/bindings/sensor/aosong,dht.yaml b/dts/bindings/sensor/aosong,dht.yaml new file mode 100644 index 00000000000..fceb4369545 --- /dev/null +++ b/dts/bindings/sensor/aosong,dht.yaml @@ -0,0 +1,29 @@ +# Copyright (c) 2019 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +title: Aosong DHT Digital-output Humidity and Temperature Sensor + +description: | + The Aosong DHT family of sensors provide temperature and humidity + measurements through a bidirectional serial digital signal. The + DHT11 uses a polymer humidity capacitor with NTC thermistor; the + DHT22 replaces the thermistor with a DS18B20 1-wire thermometer. + + The DHT22 is also known as an AM2303. + +compatible: "aosong,dht" + +include: base.yaml + +properties: + dio-gpios: + type: phandle-array + required: true + description: | + Pin on which sensor communication will be performed. + + dht22: + type: boolean + description: | + Set to identify sensor as a DHT22/AM2303. Leave unset to identify + sensor as a DHT11. diff --git a/tests/drivers/build_all/dts_fixup.h b/tests/drivers/build_all/dts_fixup.h index e92730dd6f5..fa9138c96a5 100644 --- a/tests/drivers/build_all/dts_fixup.h +++ b/tests/drivers/build_all/dts_fixup.h @@ -62,6 +62,13 @@ #define DT_INST_0_AMS_CCS811_BASE_ADDRESS 0 #endif +#ifndef DT_INST_0_AOSONG_DHT_LABEL +#define DT_INST_0_AOSONG_DHT_LABEL "" +#define DT_INST_0_AOSONG_DHT_DIO_GPIOS_CONTROLLER "" +#define DT_INST_0_AOSONG_DHT_DIO_GPIOS_PIN 0 +#define DT_INST_0_AOSONG_DHT_DIO_GPIOS_FLAGS 0 +#endif + #ifndef DT_INST_0_NXP_FXAS21002_LABEL #define DT_INST_0_NXP_FXAS21002_LABEL "" #define DT_INST_0_NXP_FXAS21002_BASE_ADDRESS 0