diff --git a/drivers/include/io1_xplained.h b/drivers/include/io1_xplained.h index c45157e6948718f9a99c542627feda231f48f787..99e95afba2da6678c44a74fef96dd9265369e707 100644 --- a/drivers/include/io1_xplained.h +++ b/drivers/include/io1_xplained.h @@ -29,42 +29,46 @@ extern "C" { #endif /** - * @brief Device descriptor for the IO1 Xplained extension. + * @brief IO1 Xplained driver return codes */ -typedef struct { - at30tse75x_t temp /**< On-board temperature sensor */; -} io1_xplained_t; - +enum { + IO1_XPLAINED_OK = 0, /**< Initialization successful */ + IO1_XPLAINED_NOTEMP, /**< Error during temperature sensor 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 */ +}; /** * @brief Device initialization parameters */ typedef struct { - uint8_t addr; /**< extension custom address */ + uint8_t addr; /**< extension custom address */ } io1_xplained_params_t; /** - * @brief export SAUL endpoints - * @{ - */ -extern const saul_driver_t io1_xplained_temperature_saul_driver; -/** @} */ - -/** - * @brief auto-initialize all configured IO1 Xplained extensions + * @brief Device descriptor for the IO1 Xplained extension. */ -void io1_xplained_auto_init(void); +typedef struct { + io1_xplained_params_t params; /**< Initialization parameters */ + at30tse75x_t temp; /**< On-board temperature sensor */ +} io1_xplained_t; /** * @brief Initialize the given IO1 Xplained extension * * @param[out] dev Initialized device descriptor of IO1 Xplained extension - * @param[in] addr Custom address of the extension board + * @param[in] params Device initialization parameters * - * @return 0 on success - * @return -1 if given I2C is not enabled in board config + * @return IO1_XPLAINED_OK on success + * @return -IO1_XPLAINED_NOTEMP if temperature sensor initialization failed + * @return -IO1_XPLAINED_NOLED if LED initialization failed + * @return -IO1_XPLAINED_NOGPIO1 if GPIO1 initialization failed + * @return -IO1_XPLAINED_NOGPIO2 if GPIO2 initialization failed */ -int io1_xplained_init(io1_xplained_t *dev, uint8_t addr); +int io1_xplained_init(io1_xplained_t *dev, const io1_xplained_params_t *params); /** * @brief Read temperature value from the given IO1 Xplained extension, returned in °C @@ -72,34 +76,25 @@ int io1_xplained_init(io1_xplained_t *dev, uint8_t addr); * @param[in] dev Device descriptor of IO1 Xplained to read from * @param[out] temperature Temperature in °C * - * @return 0 on success - * @return -1 if device's I2C is not enabled in board config + * @return IO1_XPLAINED_READ_OK on success + * @return -IO1_XPLAINED_READ_ERR if temperature sensor read failed */ int io1_xplained_read_temperature(io1_xplained_t *dev, float *temperature); /** * @brief Set the on-board led of the IO1 Xplained extension - * - * @return 0 on success - * @return -1 if extension GPIO is not enabled in board config */ -int io1_xplained_set_led(void); +void io1_xplained_set_led(void); /** * @brief Clear the on-board led of the IO1 Xplained extension - * - * @return 0 on success - * @return -1 if extension GPIO is not enabled in board config */ -int io1_xplained_clear_led(void); +void io1_xplained_clear_led(void); /** * @brief Toggle the on-board led of the IO1 Xplained extension - * - * @return 0 on success - * @return -1 if extension GPIO is not enabled in board config */ -int io1_xplained_toggle_led(void); +void io1_xplained_toggle_led(void); #ifdef __cplusplus } diff --git a/drivers/io1_xplained/Makefile b/drivers/io1_xplained/Makefile index 075a3c4ea781acfaab3f77d2442e89111a8ee3af..48422e909a47d7cd428d10fa73825060ccc8d8c2 100644 --- a/drivers/io1_xplained/Makefile +++ b/drivers/io1_xplained/Makefile @@ -1,3 +1 @@ -MODULE = io1_xplained - include $(RIOTBASE)/Makefile.base diff --git a/drivers/io1_xplained/include/io1_xplained_params.h b/drivers/io1_xplained/include/io1_xplained_params.h index 5bd1ea7f012dc3d5b41aa0a99c9d2e06f862ffd3..dfc966ba4be4c6989e86012f0520740937659224 100644 --- a/drivers/io1_xplained/include/io1_xplained_params.h +++ b/drivers/io1_xplained/include/io1_xplained_params.h @@ -21,9 +21,10 @@ #include "board.h" #include "io1_xplained.h" -#include "saul.h" +#include "io1_xplained_internals.h" #include "saul_reg.h" #include "saul/periph.h" +#include "periph/gpio.h" #ifdef __cplusplus extern "C" { @@ -52,54 +53,28 @@ static const io1_xplained_params_t io1_xplained_params[] = #endif }; -/** - * @brief Get the number of configured IO1 Xplained extension - */ -#define IO1_XPLAINED_NUMOF (sizeof(io1_xplained_params) / sizeof(io1_xplained_params[0])) - -/** - * @brief Reference the gpio driver struct - */ -extern saul_driver_t gpio_saul_driver; - -#ifdef MODULE_SAUL_REG /** * @brief Allocate and configure entries to the SAUL registry */ -saul_reg_t io1_xplained_saul_reg[][4] = +saul_reg_info_t io1_xplained_saul_reg_info[][4] = { { - { - .name = "Temperature (IO1 Xplained)", - .driver = &io1_xplained_temperature_saul_driver - }, - { - .name = "LED (IO1 Xplained)", - .driver = &gpio_saul_driver - }, - { - .name = "GPIO1 (IO1 Xplained)", - .driver = &gpio_saul_driver - }, - { - .name = "GPIO2 (IO1 Xplained)", - .driver = &gpio_saul_driver - }, + { .name = "Temperature (IO1 Xplained)" }, + { .name = "LED (IO1 Xplained)" }, + { .name = "GPIO1 (IO1 Xplained)" }, + { .name = "GPIO2 (IO1 Xplained)" } } }; -#endif -#ifdef MODULE_SAUL_GPIO /** * @brief Allocate and configure the extension LED gpios */ -static gpio_t io1_xplained_saul_gpios[3] = +gpio_t io1_xplained_saul_gpios[3] = { IO1_LED_PIN, IO1_GPIO1_PIN, IO1_GPIO2_PIN, }; -#endif #ifdef __cplusplus diff --git a/drivers/io1_xplained/io1_xplained.c b/drivers/io1_xplained/io1_xplained.c index 33d1a66dbcb66a0ad801f79c9481c11b250744b4..d729ada603ef58658023d80edc4934b88ab99b6a 100644 --- a/drivers/io1_xplained/io1_xplained.c +++ b/drivers/io1_xplained/io1_xplained.c @@ -18,105 +18,72 @@ * @} */ -#include <math.h> - #include "log.h" #include "io1_xplained.h" #include "io1_xplained_internals.h" -#include "io1_xplained_params.h" #include "at30tse75x.h" #include "periph/i2c.h" #include "periph/gpio.h" -#include "xtimer.h" - -#define ENABLE_DEBUG (0) -#include "debug.h" - -/** - * @brief Allocation of memory for device descriptors - */ -io1_xplained_t io1_xplained_devs[IO1_XPLAINED_NUMOF]; /*---------------------------------------------------------------------------* * IO1 Xplained Core API * *---------------------------------------------------------------------------*/ -int io1_xplained_init(io1_xplained_t *dev, uint8_t addr) +int io1_xplained_init(io1_xplained_t *dev, const io1_xplained_params_t *params) { + dev->params = *params; + /* Initialize I2C interface */ if (at30tse75x_init(&dev->temp, I2C_DEV(0), - I2C_SPEED_NORMAL, (TEMPERATURE_BASE_ADDR | addr)) < 0) { - DEBUG("[Error] Cannot initialize temperature sensor.\n"); - return -1; + I2C_SPEED_NORMAL, (TEMPERATURE_BASE_ADDR | dev->params.addr)) < 0) { + LOG_ERROR("Cannot initialize temperature sensor.\n"); + return -IO1_XPLAINED_NOTEMP; } /* Use maximum resolution */ at30tse75x_set_resolution(&dev->temp, AT30TSE75X_RESOLUTION_12BIT); if (gpio_init(IO1_LED_PIN, GPIO_OUT) < 0) { - DEBUG("[Error] GPIO LED not enabled\n"); - return -1; + LOG_ERROR("GPIO LED not enabled\n"); + return -IO1_XPLAINED_NOLED; } if (gpio_init(IO1_GPIO1_PIN, GPIO_OUT) < 0) { - DEBUG("[Error] GPIO1 not enabled\n"); - return -1; + LOG_ERROR("GPIO1 not enabled\n"); + return -IO1_XPLAINED_NOGPIO1; } if (gpio_init(IO1_GPIO2_PIN, GPIO_OUT) < 0) { - DEBUG("[Error] GPIO2 not enabled\n"); - return -1; + LOG_ERROR("GPIO2 not enabled\n"); + return -IO1_XPLAINED_NOGPIO2; } - DEBUG("[Info] IO1 Xplained extension initialized!\n"); - - return 0; -} + LOG_DEBUG("IO1 Xplained extension initialized!\n"); -void io1_xplained_auto_init(void) -{ - for (unsigned i = 0; i < IO1_XPLAINED_NUMOF; i++) { - if (io1_xplained_init(&io1_xplained_devs[i], - io1_xplained_params[i].addr) < 0) { - LOG_ERROR("Unable to initialize IO1 Xplained #%i\n", i); - } -#ifdef MODULE_SAUL_REG - io1_xplained_saul_reg[i][0].dev = &io1_xplained_devs[i]; - saul_reg_add(&io1_xplained_saul_reg[i][0]); -#endif -#ifdef MODULE_SAUL_GPIO - for (unsigned j = 1; j < 4; j++) { - io1_xplained_saul_reg[i][j].dev = &(io1_xplained_saul_gpios[j-1]); - saul_reg_add(&(io1_xplained_saul_reg[i][j])); - } -#endif - } + return IO1_XPLAINED_OK; } int io1_xplained_read_temperature(io1_xplained_t *dev, float *temperature) { if (at30tse75x_get_temperature(&dev->temp, temperature) < 0) { - DEBUG("[Error] Cannot read IO1 Xplained temperatuse sensor.\n"); - return -1; + LOG_ERROR("Cannot read temperature sensor.\n"); + return -IO1_XPLAINED_READ_ERR; } - return 0; + return IO1_XPLAINED_READ_OK; } -int io1_xplained_set_led(void) +void io1_xplained_set_led(void) { gpio_set(IO1_LED_PIN); - return 0; } -int io1_xplained_clear_led(void) +void io1_xplained_clear_led(void) { gpio_clear(IO1_LED_PIN); - return 0; } -int io1_xplained_toggle_led(void) +void io1_xplained_toggle_led(void) { gpio_toggle(IO1_LED_PIN); - return 0; } diff --git a/drivers/io1_xplained/io1_xplained_saul.c b/drivers/io1_xplained/io1_xplained_saul.c index 0d5c23b7985ef54c1187fe8aace9094e85d062a4..6864bb70b90d0fdab499312dfa784c13ac40db05 100644 --- a/drivers/io1_xplained/io1_xplained_saul.c +++ b/drivers/io1_xplained/io1_xplained_saul.c @@ -22,7 +22,6 @@ #include "saul.h" #include "io1_xplained.h" -#include "xtimer.h" static float temperature; diff --git a/sys/auto_init/auto_init.c b/sys/auto_init/auto_init.c index 4ff488f2b0479f5750a23555c331156a1e14a523..251b5bf1bf17ffce4f3022ff9f25b84b4055a734 100644 --- a/sys/auto_init/auto_init.c +++ b/sys/auto_init/auto_init.c @@ -20,10 +20,6 @@ #include "auto_init.h" -#ifdef MODULE_IO1_XPLAINED -#include "io1_xplained.h" -#endif - #ifdef MODULE_SHT11 #include "sht11.h" #endif @@ -104,10 +100,6 @@ void auto_init(void) DEBUG("Auto init rtc module.\n"); rtc_init(); #endif -#ifdef MODULE_IO1_XPLAINED - DEBUG("Auto init IO1 Xplained extension module.\n"); - io1_xplained_auto_init(); -#endif #ifdef MODULE_SHT11 DEBUG("Auto init SHT11 module.\n"); sht11_init(); @@ -319,6 +311,10 @@ void auto_init(void) extern void auto_init_veml6070(void); auto_init_veml6070(); #endif +#ifdef MODULE_IO1_XPLAINED + extern void auto_init_io1_xplained(void); + auto_init_io1_xplained(); +#endif #ifdef MODULE_ADXL345 extern void auto_init_adxl345(void); auto_init_adxl345(); diff --git a/sys/auto_init/saul/auto_init_io1_xplained.c b/sys/auto_init/saul/auto_init_io1_xplained.c new file mode 100644 index 0000000000000000000000000000000000000000..4f288dbd2e1c60689b40f9fb623b678556469b21 --- /dev/null +++ b/sys/auto_init/saul/auto_init_io1_xplained.c @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2016 Inria + * + * 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. + */ + +/** + * @ingroup auto_init_saul + * @{ + * + * @file + * @brief Auto initialization of IO1 Xplained extension driver. + * + * @author Alexandre Abadie <alexandre.abadie@inria.fr> + * + * @} + */ + +#ifdef MODULE_IO1_XPLAINED + +#include "log.h" +#include "saul_reg.h" + +#include "io1_xplained.h" +#include "io1_xplained_params.h" + +/** + * @brief Define the number of configured sensors + */ +#define IO1_XPLAINED_NUMOF (sizeof(io1_xplained_params) / sizeof(io1_xplained_params[0])) + +/** + * @brief Allocation of memory for device descriptors + */ +static io1_xplained_t io1_xplained_devs[IO1_XPLAINED_NUMOF]; + +/** + * @brief Memory for the SAUL registry entries + */ +static saul_reg_t saul_entries[IO1_XPLAINED_NUMOF * 4]; + +/** + * @brief Reference the driver structs. + * @{ + */ +extern const saul_driver_t _saul_driver; +extern const saul_driver_t io1_xplained_temperature_saul_driver; +/** @} */ + +void auto_init_io1_xplained(void) +{ + for (unsigned i = 0; i < IO1_XPLAINED_NUMOF; i++) { + if (io1_xplained_init(&io1_xplained_devs[i], + &io1_xplained_params[i]) != IO1_XPLAINED_OK) { + LOG_ERROR("Unable to initialize IO1 Xplained #%i\n", i); + continue; + } + + /* Temperature */ + saul_entries[i * 4].dev = &(io1_xplained_devs[i]); + saul_entries[i * 4].name = io1_xplained_saul_reg_info[i][0].name; + saul_entries[i * 4].driver = &io1_xplained_temperature_saul_driver; + saul_reg_add(&(saul_entries[i * 4])); + + /* GPIOs */ + for (unsigned j = 1; j < 4; j++) { + saul_entries[i * 4 + j].dev = &(io1_xplained_saul_gpios[j - 1]); + saul_entries[i * 4 + j].name = io1_xplained_saul_reg_info[i][j - 1].name; + saul_reg_add(&(saul_entries[i * 4 + j])); + } + } +} +#else +typedef int dont_be_pedantic; +#endif /* MODULE_IO1_XPLAINED */ diff --git a/tests/driver_io1_xplained/Makefile b/tests/driver_io1_xplained/Makefile index 5794cb2e9677972c7032c176321c667e9afd2440..4302992555b88e77c0cee913c7f158388526c05d 100644 --- a/tests/driver_io1_xplained/Makefile +++ b/tests/driver_io1_xplained/Makefile @@ -5,10 +5,4 @@ USEMODULE += io1_xplained USEMODULE += xtimer USEMODULE += printf_float -# set default device parameters in case they are undefined -TEST_ADDR ?= 0x07 - -# export parameters -CFLAGS += -DTEST_ADDR=$(TEST_ADDR) - include $(RIOTBASE)/Makefile.include diff --git a/tests/driver_io1_xplained/main.c b/tests/driver_io1_xplained/main.c index 39ca98edcc6da3f5ef8ba68b33c80722c07e1217..60e0f908243fccfcfa471a92568c696c3634ecdb 100644 --- a/tests/driver_io1_xplained/main.c +++ b/tests/driver_io1_xplained/main.c @@ -18,14 +18,11 @@ * @} */ -#ifndef TEST_ADDR -#error "TEST_ADDR not defined" -#endif - #include <stdio.h> #include <inttypes.h> #include "io1_xplained.h" +#include "io1_xplained_params.h" #include "xtimer.h" #include "board.h" @@ -35,21 +32,17 @@ int main(void) { io1_xplained_t dev; float temperature; - int result; puts("IO1 Xplained extention test application\n"); + puts("+-------------Initializing------------+\n"); - printf("+------------Initializing------------+\n"); - result = io1_xplained_init(&dev, TEST_ADDR); - if (result == -1) { + if (io1_xplained_init(&dev, &io1_xplained_params[0]) != IO1_XPLAINED_OK) { puts("[Error] Cannot initialize the IO1 Xplained extension\n"); return 1; } - else { - printf("Initialization successful\n\n"); - } - printf("\n+--------Starting tests --------+\n"); + puts("Initialization successful"); + puts("\n+--------Starting tests --------+"); while (1) { /* Get temperature in degrees celsius */ io1_xplained_read_temperature(&dev, &temperature);