From 734256aab67aabab0c036c945619fbea12551310 Mon Sep 17 00:00:00 2001
From: Alexandre Abadie <alexandre.abadie@inria.fr>
Date: Tue, 17 Apr 2018 10:10:25 +0200
Subject: [PATCH] drivers/io1_xplained: add support for light sensor

---
 drivers/Makefile.dep                          |  1 +
 drivers/include/io1_xplained.h                | 15 +++++++++++--
 .../include/io1_xplained_internals.h          | 12 ++++++++++-
 drivers/io1_xplained/io1_xplained.c           | 21 ++++++++++++++++++-
 4 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/drivers/Makefile.dep b/drivers/Makefile.dep
index 078dd14b56..0990b8dc9e 100644
--- a/drivers/Makefile.dep
+++ b/drivers/Makefile.dep
@@ -152,6 +152,7 @@ endif
 
 ifneq (,$(filter io1_xplained,$(USEMODULE)))
   FEATURES_REQUIRED += periph_gpio
+  FEATURES_REQUIRED += periph_adc
   USEMODULE += at30tse75x
   USEMODULE += sdcard_spi
 endif
diff --git a/drivers/include/io1_xplained.h b/drivers/include/io1_xplained.h
index d5a6089838..16d75ec8e8 100644
--- a/drivers/include/io1_xplained.h
+++ b/drivers/include/io1_xplained.h
@@ -53,11 +53,12 @@ enum {
     IO1_XPLAINED_OK = 0,           /**< Initialization successful */
     IO1_XPLAINED_NOTEMP,           /**< Error during temperature sensor initialization */
     IO1_XPLAINED_NOSDCARD,         /**< Error during sdcard initialization */
+    IO1_XPLAINED_NOLIGHT,          /**< Error during light sensor (ADC) initialization */
     IO1_XPLAINED_NOLED,            /**< Error during extension LED initialization */
     IO1_XPLAINED_NOGPIO1,          /**< Error during extension GPIO1 initialization */
     IO1_XPLAINED_NOGPIO2,          /**< Error during extension GPIO2 initialization */
-    IO1_XPLAINED_READ_OK,          /**< Temperature read successful */
-    IO1_XPLAINED_READ_ERR          /**< Error when reading temperature sensor */
+    IO1_XPLAINED_READ_OK,          /**< Light sensor read successful */
+    IO1_XPLAINED_READ_ERR          /**< Error when reading light sensor */
 };
 
 /**
@@ -91,6 +92,16 @@ typedef struct {
  */
 int io1_xplained_init(io1_xplained_t *dev, const io1_xplained_params_t *params);
 
+/**
+ * @brief   Read light sensor level on the IO1 Xplained extension
+ *
+ * @param[out] light        Light level value (between 0 and 1023)
+ *
+ * @return                  IO1_XPLAINED_READ_OK on success
+ * @return                  -IO1_XPLAINED_READ_ERR when the value cannot be read
+ */
+int io1_xplained_read_light_level(uint16_t *light);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/drivers/io1_xplained/include/io1_xplained_internals.h b/drivers/io1_xplained/include/io1_xplained_internals.h
index b5b9383d02..19998da08b 100644
--- a/drivers/io1_xplained/include/io1_xplained_internals.h
+++ b/drivers/io1_xplained/include/io1_xplained_internals.h
@@ -22,7 +22,9 @@
 
 #include "cpu.h"
 #include "periph_cpu.h"
-
+#include "periph/adc.h"
+#include "periph/gpio.h"
+#include "periph/spi.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -50,6 +52,14 @@ extern "C" {
 #define IO1_SDCARD_SPI_PARAM_DETECT        GPIO_PIN(0,23)
 /** @} */
 
+/**
+ * @name    IO1 Xplained Light sensor ADC configuration
+ * @{
+ */
+#define IO1_LIGHT_ADC_LINE                 ADC_LINE(0)
+#define IO1_LIGHT_ADC_RES                  ADC_RES_10BIT
+/** @} */
+
 /**
  * @name    IO1 Xplained LED pin
  * @{
diff --git a/drivers/io1_xplained/io1_xplained.c b/drivers/io1_xplained/io1_xplained.c
index 5f8aef68ca..16c6d053a8 100644
--- a/drivers/io1_xplained/io1_xplained.c
+++ b/drivers/io1_xplained/io1_xplained.c
@@ -24,7 +24,7 @@
 #include "at30tse75x.h"
 #include "sdcard_spi.h"
 
-#include "periph/adc.h"
+#include "periph/i2c.h"
 #include "periph/gpio.h"
 
 #define ENABLE_DEBUG (0)
@@ -73,6 +73,11 @@ int io1_xplained_init(io1_xplained_t *dev, const io1_xplained_params_t *params)
         }
     }
 
+    if (adc_init(IO1_LIGHT_ADC_LINE) < 0) {
+        DEBUG("[io1_xplained] Light sensor (ADC) initialization failed\n");
+        return -IO1_XPLAINED_NOLIGHT;
+    }
+
     if (gpio_init(IO1_LED_PIN, GPIO_OUT) < 0) {
         DEBUG("[io1_xplained] LED initialization failed\n");
         return -IO1_XPLAINED_NOLED;
@@ -92,3 +97,17 @@ int io1_xplained_init(io1_xplained_t *dev, const io1_xplained_params_t *params)
 
     return IO1_XPLAINED_OK;
 }
+
+int io1_xplained_read_light_level(uint16_t *light)
+{
+    int sample = adc_sample(IO1_LIGHT_ADC_LINE, IO1_LIGHT_ADC_RES);
+
+    if (sample < 0) {
+        DEBUG("[io1_xplained] Light sensor read failed\n");
+        return -IO1_XPLAINED_READ_ERR;
+    }
+
+    *light = (1023 - sample);
+
+    return IO1_XPLAINED_READ_OK;
+}
-- 
GitLab