From 3181a2faa77710ece2b3873dac147e1a87ff941c Mon Sep 17 00:00:00 2001
From: Gunar Schorcht <gunar@schorcht.net>
Date: Thu, 13 Dec 2018 11:46:45 +0100
Subject: [PATCH] drivers/ccs811: nWAKE and nRESET moved to base

---
 drivers/ccs811/ccs811.c                | 28 +++++++++--------------
 drivers/ccs811/doc.txt                 | 31 +++++++++++++-------------
 drivers/ccs811/include/ccs811_params.h |  9 ++++++++
 drivers/include/ccs811.h               |  8 +++----
 4 files changed, 39 insertions(+), 37 deletions(-)

diff --git a/drivers/ccs811/ccs811.c b/drivers/ccs811/ccs811.c
index 891a46d7fd..86eca15c95 100644
--- a/drivers/ccs811/ccs811.c
+++ b/drivers/ccs811/ccs811.c
@@ -75,7 +75,6 @@ int ccs811_init(ccs811_t *dev, const ccs811_params_t *params)
 
     int res = CCS811_OK;
 
-#if MODULE_CCS811_FULL
     if (dev->params.reset_pin != GPIO_UNDEF &&
         gpio_init(dev->params.reset_pin, GPIO_OUT) == 0) {
         DEBUG_DEV("nRESET pin configured", dev);
@@ -88,20 +87,12 @@ int ccs811_init(ccs811_t *dev, const ccs811_params_t *params)
         /* t_START after reset is 1 ms, we wait 1 further ms */
         xtimer_usleep(1000);
     }
-    else {
-        dev->params.reset_pin = GPIO_UNDEF;
-        DEBUG_DEV("nRESET pin not configured or could not be used", dev);
-    }
 
     if (dev->params.wake_pin != GPIO_UNDEF &&
         gpio_init(dev->params.wake_pin, GPIO_OUT) == 0) {
+        gpio_clear(dev->params.wake_pin);
         DEBUG_DEV("nWAKE pin configured", dev);
     }
-    else {
-        dev->params.wake_pin = GPIO_UNDEF;
-        DEBUG_DEV("nWAKE pin not configured or could not be used", dev);
-    }
-#endif /* MODULE_CCS811_FULL */
 
     /* check whether sensor is available including the check of the hardware id */
     if ((res = _is_available(dev)) != CCS811_OK) {
@@ -370,14 +361,15 @@ int ccs811_power_down (ccs811_t *dev)
 {
     ASSERT_PARAM(dev != NULL);
 
-    if (dev->params.wake_pin == GPIO_UNDEF) {
-        DEBUG_DEV("nWAKE signal pin not configured", dev);
-        return CCS811_ERROR_NO_WAKE_PIN;
-    }
-
     ccs811_mode_t tmp_mode = dev->params.mode;
     int res = ccs811_set_mode(dev, CCS811_MODE_IDLE);
     dev->params.mode = tmp_mode;
+
+    if (dev->params.wake_pin != GPIO_UNDEF) {
+        DEBUG_DEV("Setting nWAKE pin high", dev);
+        gpio_set(dev->params.wake_pin);
+    }
+
     return res;
 }
 
@@ -385,9 +377,9 @@ int ccs811_power_up (ccs811_t *dev)
 {
     ASSERT_PARAM(dev != NULL);
 
-    if (dev->params.wake_pin == GPIO_UNDEF) {
-        DEBUG_DEV("nWAKE signal pin not configured", dev);
-        return CCS811_ERROR_NO_WAKE_PIN;
+    if (dev->params.wake_pin != GPIO_UNDEF) {
+        DEBUG_DEV("Setting nWAKE pin low", dev);
+        gpio_clear(dev->params.wake_pin);
     }
 
     return ccs811_set_mode(dev, dev->params.mode);
diff --git a/drivers/ccs811/doc.txt b/drivers/ccs811/doc.txt
index 96eff87113..6ab141b634 100644
--- a/drivers/ccs811/doc.txt
+++ b/drivers/ccs811/doc.txt
@@ -29,7 +29,7 @@ The driver is for the usage with [RIOT-OS](https://github.com/RIOT-OS/RIOT).
     1. [Hardware Configurations](#hardware_configuration)
     2. [Driver Configuration Parameters](#driver_configuration)
 
-### <a name="overview"> Overview </a> &nbsp;&nbsp; [[TOC](#toc)]
+## <a name="overview"> Overview </a> &nbsp;&nbsp; [[TOC](#toc)]
 
 ### <a name="about"> About the sensor </a> &nbsp;&nbsp; [[TOC](#toc)]
 
@@ -68,9 +68,9 @@ and ```ccs811_full``` are used.
 Feature | Module
 --------|-------
 read raw and converted gas sensor data (eCO2, TVOC) | ```ccs811```
-test for new sensor gas data | ```ccs811```
+poling for new sensor gas data | ```ccs811```
+power saving using sleep mode with wakeup | ```ccs811```
 data ready and threshold interrupt handling | ```ccs811_full```
-power saving using sleep mode with wakeup | ```ccs811_full```
 ambient temperatur calculation with NTC | ```ccs811_full```
 compensate gas readings using an external sensor | ```ccs811_full```
 manual baseline handling | ```ccs811_full```
@@ -304,29 +304,31 @@ ccs811_set_int_mode (&sensor, CCS811_INT_THRESHOLD);
 
 ## <a name="power saving"> Power Saving </a> &nbsp;&nbsp; [[TOC](#toc)]
 
-The CCS811 offers a sleep mode with wake-up function. By using the active
-low **nWAKE** signal connected to a GPIO, power can be saved. If the
+The CCS811 offers a **sleep mode** with **wake-up** function. By using the
+active low **nWAKE** signal connected to a GPIO, power can be saved. If the
 **nWAKE** signal is low, the CCS811 is active and can communicate over
-I2C. When this signal is high, the CCS811 goes into sleep mode and can
+I2C. When this signal is high, the CCS811 goes into sleep mode and can't
 be reached via I2C. The measuring process is not affected.
 
 The driver supports this feature when the **nWAKE** signal pin
 (#ccs811_params_t::wake_pin) is configured, see the
 [Configuration](#Configuration) section.
 
-@note This feature can only be used with the ```ccs811_full``` module.
+@note If the **nWAKE** signal pin is not used, it must be permanently pulled
+down. Sleep mode/wake-up feature can not be used in this case.
 
-With the function #ccs811_power_down the CCS811 can be disabled, when
-no measurements are required. To re-enable the CCS811 in the previous
-measurement mode, the #ccs811_power_up function can be used.
+Additionally, CCS811 can be disabled with the #ccs811_power_down function
+function, when no measurements are required. For that purpose, the sensor is
+switched to the idle, low current mode (#CCS811_MODE_IDLE).
+To reactivate the CCS811 in the previous measurement mode, the
+#ccs811_power_up function has to be used.
 
 @note It may take several minutes before accurate readings are
 generated when the sensor switches back from idle mode to the
 previous measurement mode.
-
-The best power-saving solution in measurement modes is the use of the
-data-ready interrupt (#CCS811_INT_DATA_READY) in conjunction with
-the **nWAKE** signal as supported by the driver.
+Therefore, the best power-saving solution is to leave the sensor in any
+measurement mode and to use it with data-ready interrupt
+(#CCS811_INT_DATA_READY) in conjunction with the **nWAKE** signal pin.
 
 ## <a name="baseline"> Baseline </a> &nbsp;&nbsp; [[TOC](#toc)]
 
@@ -378,7 +380,6 @@ the interrupt pin has to be connected to a GPIO pin.
 ```
 
 To use the hardware reset and/or the sleep mode with wake-up feature,
-(only with ```ccs811_full``` module),
 additional GPIOs have to be used. This is the most energy-efficient
 hardware configuration of the sensor but requires more GPIO pins.
 Used GPIOs must be configured accordingly in driver [configuration
diff --git a/drivers/ccs811/include/ccs811_params.h b/drivers/ccs811/include/ccs811_params.h
index d14fa10ba8..f872bea719 100644
--- a/drivers/ccs811/include/ccs811_params.h
+++ b/drivers/ccs811/include/ccs811_params.h
@@ -52,6 +52,7 @@ extern "C" {
 #endif
 
 #ifndef CCS811_PARAMS
+#ifdef MODULE_CCS811_FULL
 #define CCS811_PARAMS    { .i2c_dev   = CCS811_PARAM_I2C_DEV,  \
                            .i2c_addr  = CCS811_PARAM_I2C_ADDR, \
                            .mode      = CCS811_PARAM_MODE,     \
@@ -60,6 +61,14 @@ extern "C" {
                            .wake_pin  = CCS811_PARAM_WAKE_PIN, \
                            .reset_pin = CCS811_PARAM_RESET_PIN \
                          }
+#else
+#define CCS811_PARAMS    { .i2c_dev   = CCS811_PARAM_I2C_DEV,  \
+                           .i2c_addr  = CCS811_PARAM_I2C_ADDR, \
+                           .mode      = CCS811_PARAM_MODE,     \
+                           .wake_pin  = CCS811_PARAM_WAKE_PIN, \
+                           .reset_pin = CCS811_PARAM_RESET_PIN \
+                         }
+#endif
 #endif
 #ifndef CCS811_SAUL_INFO
 #define CCS811_SAUL_INFO { .name = "ccs811" }
diff --git a/drivers/include/ccs811.h b/drivers/include/ccs811.h
index 9983e96e52..2421055489 100644
--- a/drivers/include/ccs811.h
+++ b/drivers/include/ccs811.h
@@ -94,13 +94,13 @@ typedef struct {
 
     i2c_t   i2c_dev;            /**< I2C device, clock stretching required (default I2C_DEV(0)) */
     uint8_t i2c_addr;           /**< I2C address (default CCS811_I2C_ADDRESS_1) */
-
+    ccs811_mode_t mode;         /**< measurement mode used (default #CCS811_MODE_IDLE) */
+#if MODULE_CCS811_FULL || DOXYGEN
     gpio_t  int_pin;            /**< nINT signal pin (default GPIO_PIN(0, 0) */
+    ccs811_int_mode_t int_mode; /**< interrupt mode used (default #CCS811_INT_NONE) */
+#endif
     gpio_t  wake_pin;           /**< nWAKE signal pin (default GPIO_UNDEF) */
     gpio_t  reset_pin;          /**< nRESET signal pin (default GPIO_UNDEF) */
-
-    ccs811_mode_t mode;         /**< measurement mode used (default #CCS811_MODE_IDLE) */
-    ccs811_int_mode_t int_mode; /**< interrupt mode used (default #CCS811_INT_NONE) */
 } ccs811_params_t;
 
 /**
-- 
GitLab