diff --git a/CODEOWNERS b/CODEOWNERS index bd2cf96bfe180..080e67259225f 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -126,6 +126,8 @@ /drivers/pcie/ @gnuless /drivers/pinmux/stm32/ @rsalveti @idlethread /drivers/sensor/ @bogdan-davidoaia @MaureenHelm +/drivers/sensor/ams_iAQcore/ @alexanderwachter +/drivers/sensor/ens210/ @alexanderwachter /drivers/sensor/hts*/ @avisconti /drivers/sensor/lis*/ @avisconti /drivers/sensor/lps*/ @avisconti @@ -152,6 +154,8 @@ /dts/bindings/serial/ns16550.yaml @gnuless /dts/bindings/*/nordic* @anangl /dts/bindings/*/nxp* @MaureenHelm +/dts/bindings/sensor/ams,ens210.yaml @alexanderwachter +/dts/bindings/sensor/ams,iaqcore.yaml @alexanderwachter /ext/fs/ @nashif @ramakrishnapallala /ext/hal/cmsis/ @MaureenHelm @galak /ext/hal/libmetal/ @galak diff --git a/drivers/sensor/CMakeLists.txt b/drivers/sensor/CMakeLists.txt index 69f73209d2056..f9a0bc96aa944 100644 --- a/drivers/sensor/CMakeLists.txt +++ b/drivers/sensor/CMakeLists.txt @@ -5,6 +5,7 @@ add_subdirectory_ifdef(CONFIG_ADXL362 adxl362) add_subdirectory_ifdef(CONFIG_ADXL372 adxl372) add_subdirectory_ifdef(CONFIG_AK8975 ak8975) add_subdirectory_ifdef(CONFIG_AMG88XX amg88xx) +add_subdirectory_ifdef(CONFIG_AMS_IAQ_CORE ams_iAQcore) add_subdirectory_ifdef(CONFIG_APDS9960 apds9960) add_subdirectory_ifdef(CONFIG_BMA280 bma280) add_subdirectory_ifdef(CONFIG_BMC150_MAGN bmc150_magn) @@ -14,6 +15,7 @@ add_subdirectory_ifdef(CONFIG_BMI160 bmi160) add_subdirectory_ifdef(CONFIG_BMM150 bmm150) add_subdirectory_ifdef(CONFIG_CCS811 ccs811) add_subdirectory_ifdef(CONFIG_DHT dht) +add_subdirectory_ifdef(CONFIG_ENS210 ens210) add_subdirectory_ifdef(CONFIG_FXAS21002 fxas21002) add_subdirectory_ifdef(CONFIG_FXOS8700 fxos8700) add_subdirectory(grove) diff --git a/drivers/sensor/Kconfig b/drivers/sensor/Kconfig index 4441d94c76ac2..b477ae8815a38 100644 --- a/drivers/sensor/Kconfig +++ b/drivers/sensor/Kconfig @@ -35,6 +35,8 @@ source "drivers/sensor/ak8975/Kconfig" source "drivers/sensor/amg88xx/Kconfig" +source "drivers/sensor/ams_iAQcore/Kconfig" + source "drivers/sensor/apds9960/Kconfig" source "drivers/sensor/bma280/Kconfig" @@ -53,6 +55,8 @@ source "drivers/sensor/ccs811/Kconfig" source "drivers/sensor/dht/Kconfig" +source "drivers/sensor/ens210/Kconfig" + source "drivers/sensor/fxas21002/Kconfig" source "drivers/sensor/fxos8700/Kconfig" diff --git a/drivers/sensor/ams_iAQcore/CMakeLists.txt b/drivers/sensor/ams_iAQcore/CMakeLists.txt new file mode 100644 index 0000000000000..df0ee12e6db8a --- /dev/null +++ b/drivers/sensor/ams_iAQcore/CMakeLists.txt @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: Apache-2.0 + +zephyr_library() + +zephyr_library_sources_ifdef(CONFIG_AMS_IAQ_CORE iAQcore.c) diff --git a/drivers/sensor/ams_iAQcore/Kconfig b/drivers/sensor/ams_iAQcore/Kconfig new file mode 100644 index 0000000000000..46c4d42c1c12e --- /dev/null +++ b/drivers/sensor/ams_iAQcore/Kconfig @@ -0,0 +1,23 @@ +# Kconfig - iAQ-core Digital VOC sensor configuration options + +# +# Copyright (c) 2018 Alexander Wachter +# +# SPDX-License-Identifier: Apache-2.0 +# + +menuconfig AMS_IAQ_CORE + bool "iAQ-core Digital VOC sensor" + depends on I2C && HAS_DTS_I2C + help + Enable driver for iAQ-core Digital VOC sensor. + +if AMS_IAQ_CORE + +config IAQ_CORE_MAX_READ_RETRIES + int "Number of read retries" + default 4 + help + Number of retries when reading failed or device not ready. + +endif # AMS_IAQ_CORE diff --git a/drivers/sensor/ams_iAQcore/iAQcore.c b/drivers/sensor/ams_iAQcore/iAQcore.c new file mode 100644 index 0000000000000..650d6f074295e --- /dev/null +++ b/drivers/sensor/ams_iAQcore/iAQcore.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018 Alexander Wachter. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "iAQcore.h" + +#define LOG_LEVEL CONFIG_SENSOR_LOG_LEVEL +LOG_MODULE_REGISTER(IAQ_CORE); + +static int iaqcore_sample_fetch(struct device *dev, enum sensor_channel chan) +{ + struct iaq_core_data *drv_data = dev->driver_data; + struct iaq_registers buf; + struct i2c_msg msg; + int ret, tries; + + __ASSERT_NO_MSG(chan == SENSOR_CHAN_ALL); + + msg.buf = (u8_t *)&buf; + msg.len = sizeof(struct iaq_registers); + msg.flags = I2C_MSG_READ | I2C_MSG_STOP; + + for (tries = 0; tries < CONFIG_IAQ_CORE_MAX_READ_RETRIES; tries++) { + + ret = i2c_transfer(drv_data->i2c, &msg, 1, + DT_AMS_IAQCORE_0_BASE_ADDRESS); + if (ret < 0) { + LOG_ERR("Failed to read registers data [%d].", ret); + return -EIO; + } + + drv_data->status = buf.status; + + if (buf.status == 0x00) { + drv_data->co2 = sys_be16_to_cpu(buf.co2_pred); + drv_data->voc = sys_be16_to_cpu(buf.voc); + drv_data->status = buf.status; + drv_data->resistance = sys_be32_to_cpu(buf.resistance); + + return 0; + } + + k_sleep(100); + } + + if (drv_data->status == 0x01) { + LOG_INF("Sensor data not available"); + } + + if (drv_data->status == 0x80) { + LOG_ERR("Sensor Error"); + } + + return -EIO; +} + +static int iaqcore_channel_get(struct device *dev, + enum sensor_channel chan, + struct sensor_value *val) +{ + struct iaq_core_data *drv_data = dev->driver_data; + + switch (chan) { + case SENSOR_CHAN_CO2: + val->val1 = drv_data->co2; + val->val2 = 0; + break; + case SENSOR_CHAN_VOC: + val->val1 = drv_data->voc; + val->val2 = 0; + break; + case SENSOR_CHAN_RESISTANCE: + val->val1 = drv_data->resistance; + val->val2 = 0; + break; + default: + return -ENOTSUP; + } + + return 0; +} + +static const struct sensor_driver_api iaq_core_driver_api = { + .sample_fetch = iaqcore_sample_fetch, + .channel_get = iaqcore_channel_get, +}; + +static int iaq_core_init(struct device *dev) +{ + struct iaq_core_data *drv_data = dev->driver_data; + + drv_data->i2c = device_get_binding(DT_AMS_IAQCORE_0_BUS_NAME); + if (drv_data->i2c == NULL) { + LOG_ERR("Failed to get pointer to %s device!", + DT_AMS_IAQCORE_0_BUS_NAME); + return -EINVAL; + } + + return 0; +} + +static struct iaq_core_data iaq_core_driver; + +DEVICE_AND_API_INIT(iaq_core, DT_AMS_IAQCORE_0_LABEL, iaq_core_init, + &iaq_core_driver, NULL, POST_KERNEL, + CONFIG_SENSOR_INIT_PRIORITY, &iaq_core_driver_api); diff --git a/drivers/sensor/ams_iAQcore/iAQcore.h b/drivers/sensor/ams_iAQcore/iAQcore.h new file mode 100644 index 0000000000000..e66dec2b15fe3 --- /dev/null +++ b/drivers/sensor/ams_iAQcore/iAQcore.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018 Alexander Wachter + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef ZEPHYR_DRIVERS_SENSOR_AMS_IAQCORE_IAQCORE_H_ +#define ZEPHYR_DRIVERS_SENSOR_AMS_IAQCORE_IAQCORE_H_ + +#include +#include + +struct iaq_registers { + u16_t co2_pred; + u8_t status; + s32_t resistance; + u16_t voc; +} __packed; + +struct iaq_core_data { + struct device *i2c; + u16_t co2; + u16_t voc; + u8_t status; + s32_t resistance; +}; + +#endif /* ZEPHYR_DRIVERS_SENSOR_AMS_IAQCORE_IAQCORE_H_ */ diff --git a/drivers/sensor/ens210/CMakeLists.txt b/drivers/sensor/ens210/CMakeLists.txt new file mode 100644 index 0000000000000..4620c2eb10a2e --- /dev/null +++ b/drivers/sensor/ens210/CMakeLists.txt @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: Apache-2.0 + +zephyr_library() + +zephyr_library_sources_ifdef(CONFIG_ENS210 ens210.c) diff --git a/drivers/sensor/ens210/Kconfig b/drivers/sensor/ens210/Kconfig new file mode 100644 index 0000000000000..24a89673d027e --- /dev/null +++ b/drivers/sensor/ens210/Kconfig @@ -0,0 +1,35 @@ +# Kconfig - ENS210 Digital Temperature and Humidity sensor configuration options + +# +# Copyright (c) 2018 Alexander Wachter. +# +# SPDX-License-Identifier: Apache-2.0 +# + +menuconfig ENS210 + bool "ENS210 Digital Temperature and Humidity sensor" + depends on I2C && HAS_DTS_I2C + help + Enable driver for ENS210 Digital Temperature and Humidity sensor. +if ENS210 + +config ENS210_CRC_CHECK + bool "Enable CRC Check" + default y + help + Check the crc value after data reading. + +config ENS210_MAX_STAT_RETRIES + int "Number of status read retries" + default 4 + help + Number of retries when status reading failed or device not ready. + +config ENS210_MAX_READ_RETRIES + int "Number of value reading retries" + default 4 + help + Number of retries when value reading failed, value not valid + or crc not ok. + +endif # ENS210 diff --git a/drivers/sensor/ens210/ens210.c b/drivers/sensor/ens210/ens210.c new file mode 100644 index 0000000000000..7220a32635377 --- /dev/null +++ b/drivers/sensor/ens210/ens210.c @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2018 Alexander Wachter. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "ens210.h" + +#define LOG_LEVEL CONFIG_SENSOR_LOG_LEVEL +LOG_MODULE_REGISTER(ENS210); + +#ifdef ENS210_CRC_CHECK +u32_t ens210_crc7(u32_t bitstream) +{ + u32_t polynomial = (ENS210_CRC7_POLY << (ENS210_CRC7_DATA_WIDTH - 1)); + u32_t bit = ENS210_CRC7_DATA_MSB << ENS210_CRC7_WIDTH; + u32_t val = (bitstream << ENS210_CRC7_WIDTH) | ENS210_CRC7_IVEC; + + while (bit & (ENS210_CRC7_DATA_MASK << ENS210_CRC7_WIDTH)) { + if (bit & val) { + val ^= polynomial; + } + + bit >>= 1; + polynomial >>= 1; + } + + return val; +} +#endif /*ENS210_CRC_CHECK*/ + +static int ens210_sample_fetch(struct device *dev, enum sensor_channel chan) +{ + struct ens210_data *drv_data = dev->driver_data; + struct ens210_value_data data[2]; + int ret, cnt; + +#ifdef ENS210_CRC_CHECK + u32_t temp_valid, humidity_valid; +#endif /*ENS210_CRC_CHECK*/ + + __ASSERT_NO_MSG(chan == SENSOR_CHAN_ALL); + + for (cnt = 0; cnt <= CONFIG_ENS210_MAX_READ_RETRIES; cnt++) { + ret = i2c_burst_read(drv_data->i2c, DT_AMS_ENS210_0_BASE_ADDRESS, + ENS210_REG_T_VAL, (u8_t *)&data, sizeof(data)); + if (ret < 0) { + LOG_ERR("Failed to read data"); + continue; + } + + if (!data[0].valid) { + LOG_WRN("Temperature not valid"); + continue; + } + + if (!data[1].valid) { + LOG_WRN("Humidity not valid"); + continue; + } + +#ifdef ENS210_CRC_CHECK + temp_valid = data[0].val | + (data[0].valid << (sizeof(data[0].val) * 8)); + humidity_valid = data[1].val | + (data[1].valid << (sizeof(data[1].val) * 8)); + + if (ens210_crc7(temp_valid) != data[0].crc7) { + LOG_WRN("Temperature CRC error"); + continue; + } + + if (ens210_crc7(humidity_valid) != data[1].crc7) { + LOG_WRN("Humidity CRC error"); + continue; + } +#endif /*ENS210_CRC_CHECK*/ + + drv_data->temp = data[0]; + drv_data->humidity = data[1]; + + return 0; + } + + return -EIO; +} + +static int ens210_channel_get(struct device *dev, + enum sensor_channel chan, + struct sensor_value *val) +{ + struct ens210_data *drv_data = dev->driver_data; + s32_t temp_frac; + s32_t humidity_frac; + + switch (chan) { + case SENSOR_CHAN_AMBIENT_TEMP: + /* Temperature is in 1/64 Kelvin. Subtract 273.15 for Celsius */ + temp_frac = sys_le16_to_cpu(drv_data->temp.val) * (1000000 / 64); + temp_frac -= 273150000; + + val->val1 = temp_frac / 1000000; + val->val2 = temp_frac - val->val1; + break; + case SENSOR_CHAN_HUMIDITY: + humidity_frac = sys_le16_to_cpu(drv_data->humidity.val) * + (1000000 / 512); + val->val1 = humidity_frac / 1000000; + val->val2 = humidity_frac - val->val1; + + break; + default: + return -ENOTSUP; + } + + return 0; +} + +static int ens210_sys_reset(struct device *i2c_dev) +{ + const struct ens210_sys_ctrl sys_ctrl = {.low_power = 0, .reset = 1}; + int ret; + + ret = i2c_reg_write_byte(i2c_dev, DT_AMS_ENS210_0_BASE_ADDRESS, + ENS210_REG_SYS_CTRL, *(u8_t *)&sys_ctrl); + if (ret < 0) { + LOG_ERR("Failed to set SYS_CTRL to 0x%x", *(u8_t *)&sys_ctrl); + } + return ret; +} + +static int ens210_sys_enable(struct device *i2c_dev) +{ + const struct ens210_sys_ctrl sys_ctrl = {.low_power = 0, .reset = 0}; + int ret; + + ret = i2c_reg_write_byte(i2c_dev, DT_AMS_ENS210_0_BASE_ADDRESS, + ENS210_REG_SYS_CTRL, *(u8_t *)&sys_ctrl); + if (ret < 0) { + LOG_ERR("Failed to set SYS_CTRL to 0x%x", *(u8_t *)&sys_ctrl); + } + return ret; +} + +static int ens210_wait_boot(struct device *i2c_dev) +{ + int cnt; + int ret; + struct ens210_sys_stat sys_stat; + + for (cnt = 0; cnt <= CONFIG_ENS210_MAX_STAT_RETRIES; cnt++) { + ret = i2c_reg_read_byte(i2c_dev, DT_AMS_ENS210_0_BASE_ADDRESS, + ENS210_REG_SYS_STAT, + (u8_t *)&sys_stat); + + if (ret < 0) { + k_sleep(1); + continue; + } + + if (sys_stat.sys_active) { + return 0; + } + + if (cnt == 0) { + ens210_sys_reset(i2c_dev); + } + + ens210_sys_enable(i2c_dev); + + k_sleep(2); + } + + if (ret < 0) { + LOG_ERR("Failed to read SYS_STATE"); + } + + + LOG_ERR("Sensor is not in active state"); + return -EIO; +} + +static const struct sensor_driver_api en210_driver_api = { + .sample_fetch = ens210_sample_fetch, + .channel_get = ens210_channel_get, +}; + +static int ens210_init(struct device *dev) +{ + struct ens210_data *drv_data = dev->driver_data; + const struct ens210_sens_run sense_run = { + .t_run = 1, + .h_run = 1 + }; + const struct ens210_sens_start sense_start = { + .t_start = 1, + .h_start = 1 + }; + int ret; + u16_t part_id; + + drv_data->i2c = device_get_binding(DT_AMS_ENS210_0_BUS_NAME); + if (drv_data->i2c == NULL) { + LOG_ERR("Failed to get pointer to %s device!", + DT_AMS_ENS210_0_BUS_NAME); + return -EINVAL; + } + + /* Wait until the device is ready. */ + ret = ens210_wait_boot(drv_data->i2c); + if (ret < 0) { + return -EIO; + } + + /* Check Hardware ID. This is only possible after device is ready */ + ret = i2c_burst_read(drv_data->i2c, DT_AMS_ENS210_0_BASE_ADDRESS, + ENS210_REG_PART_ID, (u8_t *)&part_id, + sizeof(part_id)); + if (ret < 0) { + LOG_ERR("Failed to read Part ID register"); + return -EIO; + } + + if (part_id != ENS210_PART_ID) { + LOG_ERR("Part ID does not match. Want 0x%x, got 0x%x", + ENS210_PART_ID, part_id); + return -EIO; + } + + /* Set continuous measurement */ + ret = i2c_reg_write_byte(drv_data->i2c, DT_AMS_ENS210_0_BASE_ADDRESS, + ENS210_REG_SENS_RUN, *(u8_t *)&sense_run); + if (ret < 0) { + LOG_ERR("Failed to set SENS_RUN to 0x%x", + *(u8_t *)&sense_run); + return -EIO; + } + + /* Start measuring */ + ret = i2c_reg_write_byte(drv_data->i2c, DT_AMS_ENS210_0_BASE_ADDRESS, + ENS210_REG_SENS_START, *(u8_t *)&sense_start); + if (ret < 0) { + LOG_ERR("Failed to set SENS_START to 0x%x", + *(u8_t *)&sense_start); + return -EIO; + } + return 0; +} + +static struct ens210_data ens210_driver; + +DEVICE_AND_API_INIT(ens210, DT_AMS_ENS210_0_LABEL, ens210_init, &ens210_driver, + NULL, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, + &en210_driver_api); diff --git a/drivers/sensor/ens210/ens210.h b/drivers/sensor/ens210/ens210.h new file mode 100644 index 0000000000000..99c39c76fe531 --- /dev/null +++ b/drivers/sensor/ens210/ens210.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018 Alexander Wachter. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef ZEPHYR_DRIVERS_SENSOR_ENS210_ENS210_H_ +#define ZEPHYR_DRIVERS_SENSOR_CCS8ZEPHYR_DRIVERS_SENSOR_ENS210_ENS210_H_11_CCS811_H_ + +#include +#include +#include + +/* Registers */ +#define ENS210_REG_PART_ID 0x00 +#define ENS210_REG_UID 0x04 +#define ENS210_REG_SYS_CTRL 0x10 +#define ENS210_REG_SYS_STAT 0x11 +#define ENS210_REG_SENS_RUN 0x21 +#define ENS210_REG_SENS_START 0x22 +#define ENS210_REG_SENS_STOP 0x23 +#define ENS210_REG_SENS_STAT 0x24 +#define ENS210_REG_T_VAL 0x30 +#define ENS210_REG_H_VAL 0x33 + +#define ENS210_PART_ID 0x0210 + +/* + * Polynomial + * 0b 1000 1001 ~ x^7+x^3+x^0 + * 0x 8 9 + */ +#define ENS210_CRC7_WIDTH 7 +#define ENS210_CRC7_POLY 0x89 +#define ENS210_CRC7_IVEC ((1UL << ENS210_CRC7_WIDTH) - 1) +#define ENS210_CRC7_DATA_WIDTH 17 +#define ENS210_CRC7_DATA_MASK ((1UL << ENS210_CRC7_DATA_WIDTH) - 1) +#define ENS210_CRC7_DATA_MSB (1UL << (ENS210_CRC7_DATA_WIDTH - 1)) + +struct ens210_value_data { + u16_t val; + u8_t valid : 1; + u8_t crc7 : 7; +} __packed; + +struct ens210_sys_ctrl { + u8_t low_power : 1; + u8_t reserved : 6; + u8_t reset : 1; +} __packed; + +struct ens210_sys_stat { + u8_t sys_active : 1; + u8_t reserved : 7; +} __packed; + +struct ens210_sens_run { + u8_t t_run : 1; + u8_t h_run : 1; + u8_t reserved : 6; +} __packed; + +struct ens210_sens_start { + u8_t t_start : 1; + u8_t h_start : 1; + u8_t reserved : 6; +} __packed; + +struct ens210_sens_stop { + u8_t t_stop : 1; + u8_t h_stop : 1; + u8_t reserved : 6; +} __packed; + +struct ens210_sens_stat { + u8_t t_stat : 1; + u8_t h_stat : 1; + u8_t reserved : 6; +} __packed; + +struct ens210_data { + struct device *i2c; + struct ens210_value_data temp; + struct ens210_value_data humidity; +}; + +#endif /* ZEPHYR_DRIVERS_SENSOR_ENS210_ENS210_H_ */ diff --git a/dts/bindings/sensor/ams,ens210.yaml b/dts/bindings/sensor/ams,ens210.yaml new file mode 100644 index 0000000000000..49882daacb3a5 --- /dev/null +++ b/dts/bindings/sensor/ams,ens210.yaml @@ -0,0 +1,21 @@ +# +# Copyright (c) 2018, Alexander Wachter +# +# SPDX-License-Identifier: Apache-2.0 +# +--- +title: AMS (Austria Mikro Systeme) Relative Humidity and Temperature Sensor +version: 0.1 + +description: > + This binding gives a base representation of ens210 Relative Humidity and + Temperature Sensor + +inherits: + !include i2c-device.yaml + +properties: + compatible: + constraint: "ams,ens210" + +... diff --git a/dts/bindings/sensor/ams,iaqcore.yaml b/dts/bindings/sensor/ams,iaqcore.yaml new file mode 100644 index 0000000000000..fd19c14490b20 --- /dev/null +++ b/dts/bindings/sensor/ams,iaqcore.yaml @@ -0,0 +1,21 @@ +# +# Copyright (c) 2018, Alexander Wachter +# +# SPDX-License-Identifier: Apache-2.0 +# +--- +title: AMS (Austria Mikro Systeme) Indoor Air Quality Sensor iAQ-core +version: 0.1 + +description: > + This binding gives a base representation of iAQ-core indoor air quality + sensor + +inherits: + !include i2c-device.yaml + +properties: + compatible: + constraint: "ams,iaqcore" + +... diff --git a/include/sensor.h b/include/sensor.h index 972f84b5561ed..f12d409e016b7 100644 --- a/include/sensor.h +++ b/include/sensor.h @@ -119,6 +119,8 @@ enum sensor_channel { SENSOR_CHAN_VOLTAGE, /** Current, in amps **/ SENSOR_CHAN_CURRENT, + /** Resistance , in Ohm **/ + SENSOR_CHAN_RESISTANCE, /** Angular rotation, in degrees */ SENSOR_CHAN_ROTATION, diff --git a/samples/sensor/ams_iAQcore/CMakeLists.txt b/samples/sensor/ams_iAQcore/CMakeLists.txt new file mode 100644 index 0000000000000..d2910c832b85a --- /dev/null +++ b/samples/sensor/ams_iAQcore/CMakeLists.txt @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.13.1) + +set(DTC_OVERLAY_FILE "${CMAKE_CURRENT_SOURCE_DIR}/iaq_core.overlay") + +include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE) +project(iAQcore) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) diff --git a/samples/sensor/ams_iAQcore/README.rst b/samples/sensor/ams_iAQcore/README.rst new file mode 100644 index 0000000000000..b9588b29a6755 --- /dev/null +++ b/samples/sensor/ams_iAQcore/README.rst @@ -0,0 +1,36 @@ +.. _ams_iaqcore: + +ams iAQcore Indoor air quality sensor +##################################### + +Overview +******** + +This sample application demonstrates how to use the ams iAQcore sensor to +measure CO2 equivalent and VOC. The CO2 value is a predicted value derived from +VOC. The values are fetched and printed every second. + +Building and Running +******************** + +This sample application uses the sensor connected to the i2c stated in the +iaq_core.overlay file. +Flash the binary to a board of choice with a sensor connected. +This sample can run on every board with i2c. +For example build for a nucleo_f446re board: + +.. zephyr-app-commands:: + :zephyr-app: samples/sensors/ams_iAQcore + :board: nucleo_f446re + :goals: build flash + :compact: + +Sample Output +============= + +.. code-block:: console + + device is 0x20001a08, name is IAQ_CORE + Co2: 882.000000ppm; VOC: 244.000000ppb + Co2: 863.000000ppm; VOC: 239.000000ppb + Co2: 836.000000ppm; VOC: 232.000000ppb diff --git a/samples/sensor/ams_iAQcore/iaq_core.overlay b/samples/sensor/ams_iAQcore/iaq_core.overlay new file mode 100644 index 0000000000000..f039bcf2f43ee --- /dev/null +++ b/samples/sensor/ams_iAQcore/iaq_core.overlay @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2018 Alexander Wachter + * SPDX-License-Identifier: Apache-2.0 + */ + +&arduino_i2c { + status = "ok"; + clock-frequency = ; + + iaqcore: iaqcore@5a { + compatible = "ams,iaqcore"; + reg = <0x5a>; + label = "IAQ_CORE"; + }; +}; diff --git a/samples/sensor/ams_iAQcore/prj.conf b/samples/sensor/ams_iAQcore/prj.conf new file mode 100644 index 0000000000000..70fc8b66364a9 --- /dev/null +++ b/samples/sensor/ams_iAQcore/prj.conf @@ -0,0 +1,3 @@ +CONFIG_I2C=y +CONFIG_SENSOR=y +CONFIG_AMS_IAQ_CORE=y diff --git a/samples/sensor/ams_iAQcore/sample.yaml b/samples/sensor/ams_iAQcore/sample.yaml new file mode 100644 index 0000000000000..42468f2a33cf6 --- /dev/null +++ b/samples/sensor/ams_iAQcore/sample.yaml @@ -0,0 +1,8 @@ +sample: + description: Demonstration of the AMS iAQ-core Digital VOC Sensor driver + name: iAQcore sample +tests: + test: + harness: sensor + tags: samples + depends_on: i2c arduino_i2c diff --git a/samples/sensor/ams_iAQcore/src/main.c b/samples/sensor/ams_iAQcore/src/main.c new file mode 100644 index 0000000000000..a7d73bdd44d0c --- /dev/null +++ b/samples/sensor/ams_iAQcore/src/main.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018 Alexander Wachter + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +void main(void) +{ + struct device *dev; + struct sensor_value co2, voc; + + dev = device_get_binding(DT_AMS_IAQCORE_0_LABEL); + if (!dev) { + printk("Failed to get device binding"); + return; + } + + printk("device is %p, name is %s\n", dev, dev->config->name); + + while (1) { + sensor_sample_fetch(dev); + sensor_channel_get(dev, SENSOR_CHAN_CO2, &co2); + sensor_channel_get(dev, SENSOR_CHAN_VOC, &voc); + printk("Co2: %d.%06dppm; VOC: %d.%06dppb\n", + co2.val1, co2.val2, + voc.val1, voc.val2); + + k_sleep(1000); + } +} diff --git a/samples/sensor/ens210/CMakeLists.txt b/samples/sensor/ens210/CMakeLists.txt new file mode 100644 index 0000000000000..4d9acb8693ee8 --- /dev/null +++ b/samples/sensor/ens210/CMakeLists.txt @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.13.1) + +set(DTC_OVERLAY_FILE "${CMAKE_CURRENT_SOURCE_DIR}/ens210.overlay") + +include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE) +project(ens210) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) diff --git a/samples/sensor/ens210/README.rst b/samples/sensor/ens210/README.rst new file mode 100644 index 0000000000000..206f06a62f9e9 --- /dev/null +++ b/samples/sensor/ens210/README.rst @@ -0,0 +1,34 @@ +.. _ens210: + +ams ens210 Relative Humidity and Temperature Sensor +################################################### + +Overview +******** + +This sample application demonstrates how to use the ams ens210 sensor to +measure the ambient temperature and relative humidity. + +Building and Running +******************** + +This sample application uses the sensor connected to the i2c stated in the +ens210.overlay file. +Flash the binary to a board of choice with a sensor connected. +For example build for a nucleo_f446re board: + +.. zephyr-app-commands:: + :zephyr-app: samples/sensors/ens210 + :board: nucleo_f446re + :goals: build flash + :compact: + +Sample Output +============= + +.. code-block:: console + + device is 0x20001174, name is ENS210 + Temperature: 28.28881222 C; Humidity: 25.25689737% + Temperature: 28.28912472 C; Humidity: 25.25799105% + Temperature: 28.28959347 C; Humidity: 25.25760045% diff --git a/samples/sensor/ens210/ens210.overlay b/samples/sensor/ens210/ens210.overlay new file mode 100644 index 0000000000000..7bfce6b16a7d1 --- /dev/null +++ b/samples/sensor/ens210/ens210.overlay @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2018 Alexander Wachter + * SPDX-License-Identifier: Apache-2.0 + */ + +&arduino_i2c { + status = "ok"; + clock-frequency = ; + + ens210: ens210@43 { + compatible = "ams,ens210"; + reg = <0x43>; + label = "ENS210"; + }; +}; diff --git a/samples/sensor/ens210/prj.conf b/samples/sensor/ens210/prj.conf new file mode 100644 index 0000000000000..6842996e3de72 --- /dev/null +++ b/samples/sensor/ens210/prj.conf @@ -0,0 +1,3 @@ +CONFIG_I2C=y +CONFIG_SENSOR=y +CONFIG_ENS210=y diff --git a/samples/sensor/ens210/sample.yaml b/samples/sensor/ens210/sample.yaml new file mode 100644 index 0000000000000..a027787843a8a --- /dev/null +++ b/samples/sensor/ens210/sample.yaml @@ -0,0 +1,8 @@ +sample: + description: Demonstration of the AMS Temperature and Humidity Sensor driver + name: ENS210 sample +tests: + test: + harness: sensor + tags: samples + depends_on: i2c arduino_i2c diff --git a/samples/sensor/ens210/src/main.c b/samples/sensor/ens210/src/main.c new file mode 100644 index 0000000000000..77e071eec80fa --- /dev/null +++ b/samples/sensor/ens210/src/main.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018 Alexander Wachter + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +void main(void) +{ + struct device *dev; + struct sensor_value temperature, humidity; + + dev = device_get_binding(DT_AMS_ENS210_0_LABEL); + if (!dev) { + printk("Failed to get device binding"); + return; + } + + printk("device is %p, name is %s\n", dev, dev->config->name); + + while (1) { + sensor_sample_fetch(dev); + sensor_channel_get(dev, SENSOR_CHAN_HUMIDITY, &humidity); + sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &temperature); + printk("Temperature: %d.%06d C; Humidity: %d.%06d%%\n", + temperature.val1, temperature.val2, + humidity.val1, humidity.val2); + + k_sleep(1000); + } +} diff --git a/tests/drivers/build_all/dts_fixup.h b/tests/drivers/build_all/dts_fixup.h index 4a86380e2790a..68f8a9c71b080 100644 --- a/tests/drivers/build_all/dts_fixup.h +++ b/tests/drivers/build_all/dts_fixup.h @@ -190,6 +190,18 @@ #define DT_LSM9DS0_GYRO_INT_GPIO_PIN 1 #endif +#ifndef DT_AMS_IAQCORE_0_LABEL +#define DT_AMS_IAQCORE_0_LABEL "" +#define DT_AMS_IAQCORE_0_BUS_NAME "" +#define DT_AMS_IAQCORE_0_BASE_ADDRESS 0x00 +#endif + +#ifndef DT_AMS_ENS210_0_LABEL +#define DT_AMS_ENS210_0_LABEL "" +#define DT_AMS_ENS210_0_BUS_NAME "" +#define DT_AMS_ENS210_0_BASE_ADDRESS 0x00 +#endif + #endif /* CONFIG_HAS_DTS_I2C */ #if defined(CONFIG_HAS_DTS_SPI) diff --git a/tests/drivers/build_all/sensors_a_h.conf b/tests/drivers/build_all/sensors_a_h.conf index e0a98d843c516..0c28cfb9ddcfd 100644 --- a/tests/drivers/build_all/sensors_a_h.conf +++ b/tests/drivers/build_all/sensors_a_h.conf @@ -16,6 +16,7 @@ CONFIG_ADXL362=y CONFIG_ADXL372=y CONFIG_AK8975=y CONFIG_AMG88XX=y +CONFIG_AMS_IAQ_CORE=y CONFIG_APDS9960=y CONFIG_BMA280=y CONFIG_BMC150_MAGN=y @@ -25,6 +26,7 @@ CONFIG_BMI160=y CONFIG_BMM150=y CONFIG_CCS811=y CONFIG_DHT=y +CONFIG_ENS210=y CONFIG_FXAS21002=y CONFIG_FXOS8700=y #CONFIG_HDC1008=y