From 4950650c193ec07b2d89eb85b4884b20b7fa6184 Mon Sep 17 00:00:00 2001 From: Hauke Petersen <hauke.petersen@fu-berlin.de> Date: Wed, 18 Nov 2015 16:13:33 +0100 Subject: [PATCH] sys/auto_init: added auto init for SAUL devices --- sys/auto_init/Makefile | 4 ++ sys/auto_init/auto_init.c | 27 ++++++++ sys/auto_init/saul/Makefile | 3 + sys/auto_init/saul/auto_init_gpio.c | 73 ++++++++++++++++++++ sys/auto_init/saul/auto_init_isl29020.c | 74 ++++++++++++++++++++ sys/auto_init/saul/auto_init_l3g4200d.c | 74 ++++++++++++++++++++ sys/auto_init/saul/auto_init_lps331ap.c | 74 ++++++++++++++++++++ sys/auto_init/saul/auto_init_lsm303dlhc.c | 82 +++++++++++++++++++++++ 8 files changed, 411 insertions(+) create mode 100644 sys/auto_init/saul/Makefile create mode 100644 sys/auto_init/saul/auto_init_gpio.c create mode 100644 sys/auto_init/saul/auto_init_isl29020.c create mode 100644 sys/auto_init/saul/auto_init_l3g4200d.c create mode 100644 sys/auto_init/saul/auto_init_lps331ap.c create mode 100644 sys/auto_init/saul/auto_init_lsm303dlhc.c diff --git a/sys/auto_init/Makefile b/sys/auto_init/Makefile index a72b05b9ee..ad7b0b1b7c 100644 --- a/sys/auto_init/Makefile +++ b/sys/auto_init/Makefile @@ -4,4 +4,8 @@ ifneq (,$(filter auto_init_gnrc_netif,$(USEMODULE))) DIRS += netif endif +ifneq (,$(filter auto_init_saul,$(USEMODULE))) +DIRS += saul +endif + include $(RIOTBASE)/Makefile.base diff --git a/sys/auto_init/auto_init.c b/sys/auto_init/auto_init.c index b7fe1305ba..e1e677da88 100644 --- a/sys/auto_init/auto_init.c +++ b/sys/auto_init/auto_init.c @@ -183,4 +183,31 @@ void auto_init(void) #ifdef MODULE_GNRC_IPV6_NETIF gnrc_ipv6_netif_init_by_dev(); #endif + +/* initialize sensors and actuators */ +#ifdef MODULE_AUTO_INIT_SAUL + DEBUG("auto_init SAUL\n"); + +#ifdef MODULE_SAUL_GPIO + extern void auto_init_gpio(void); + auto_init_gpio(); +#endif +#ifdef MODULE_LSM303DLHC + extern void auto_init_lsm303dlhc(void); + auto_init_lsm303dlhc(); +#endif +#ifdef MODULE_LPS331AP + extern void auto_init_lps331ap(void); + auto_init_lps331ap(); +#endif +#ifdef MODULE_ISL29020 + extern void auto_init_isl29020(void); + auto_init_isl29020(); +#endif +#ifdef MODULE_L3G4200D + extern void auto_init_l3g4200d(void); + auto_init_l3g4200d(); +#endif + +#endif /* MODULE_AUTO_INIT_SAUL */ } diff --git a/sys/auto_init/saul/Makefile b/sys/auto_init/saul/Makefile new file mode 100644 index 0000000000..96a5373703 --- /dev/null +++ b/sys/auto_init/saul/Makefile @@ -0,0 +1,3 @@ +MODULE = auto_init_saul + +include $(RIOTBASE)/Makefile.base diff --git a/sys/auto_init/saul/auto_init_gpio.c b/sys/auto_init/saul/auto_init_gpio.c new file mode 100644 index 0000000000..06818eb195 --- /dev/null +++ b/sys/auto_init/saul/auto_init_gpio.c @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2015 Freie Universität Berlin + * + * 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 GPIO pins directly mapped to SAUL reg + * + * @author Hauke Petersen <hauke.petersen@fu-berlin.de> + * + * @} + */ + +#ifdef MODULE_SAUL_GPIO + +#include "saul_reg.h" +#include "saul/periph.h" +#include "gpio_params.h" +#include "periph/gpio.h" + +#define ENABLE_DEBUG (0) +#include "debug.h" + +/** + * @brief Define the number of configured sensors + */ +#define SAUL_GPIO_NUMOF (sizeof(saul_gpio_params)/sizeof(saul_gpio_params[0])) + +/** + * @brief Allocate memory for the device descriptors + */ +static gpio_t saul_gpios[SAUL_GPIO_NUMOF]; + +/** + * @brief Memory for the registry entries + */ +static saul_reg_t saul_reg_entries[SAUL_GPIO_NUMOF]; + +/** + * @brief Reference the driver struct + */ +extern saul_driver_t gpio_saul_driver; + + +void auto_init_gpio(void) +{ + DEBUG("auto init gpio SAUL\n"); + for (int i = 0; i < SAUL_GPIO_NUMOF; i++) { + const saul_gpio_params_t *p = &saul_gpio_params[i]; + + DEBUG("[auto_init_saul] initializing direct GPIO\n"); + saul_gpios[i] = p->pin; + saul_reg_entries[i].dev = &(saul_gpios[i]); + saul_reg_entries[i].name = p->name; + saul_reg_entries[i].driver = &gpio_saul_driver; + /* initialize the GPIO pin */ + gpio_init(p->pin, p->dir, GPIO_NOPULL); + /* add to registry */ + saul_reg_add(&(saul_reg_entries[i])); + } +} + +#else +typedef int dont_be_pedantic; +#endif /* MODULE_SAUL_GPIO */ diff --git a/sys/auto_init/saul/auto_init_isl29020.c b/sys/auto_init/saul/auto_init_isl29020.c new file mode 100644 index 0000000000..c6e0497296 --- /dev/null +++ b/sys/auto_init/saul/auto_init_isl29020.c @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2015 Freie Universität Berlin + * + * 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 ISL29020 light sensors + * + * @author Hauke Petersen <hauke.petersen@fu-berlin.de> + * + * @} + */ + +#ifdef MODULE_ISL29020 + +#include "saul_reg.h" +#include "isl29020.h" +#include "isl29020_params.h" + +#define ENABLE_DEBUG (0) +#include "debug.h" + +/** + * @brief Define the number of configured sensors + */ +#define ISL29020_NUM (sizeof(isl29020_params)/sizeof(isl29020_params[0])) + +/** + * @brief Allocate memory for the device descriptors + */ +static isl29020_t isl29020_devs[ISL29020_NUM]; + +/** + * @brief Memory for the SAUL registry entries + */ +static saul_reg_t saul_entries[ISL29020_NUM]; + +/** + * @brief Reference the driver struct + */ +extern saul_driver_t isl29020_saul_driver; + + +void auto_init_isl29020(void) +{ + for (int i = 0; i < ISL29020_NUM; i++) { + const isl29020_params_t *p = &isl29020_params[i]; + + DEBUG("[auto_init_saul] initializing isl29020 light sensor\n"); + int res = isl29020_init(&isl29020_devs[i], p->i2c, p->addr, + p->range, p->mode); + if (res < 0) { + DEBUG("[auto_init_saul] error during initialization\n"); + } + else { + saul_entries[i].dev = &(isl29020_devs[i]); + saul_entries[i].name = isl29020_saul_info[i].name; + saul_entries[i].driver = &isl29020_saul_driver; + saul_reg_add(&(saul_entries[i])); + } + } +} + +#else +typedef int dont_be_pedantic; +#endif /* MODULE_ISL29020 */ diff --git a/sys/auto_init/saul/auto_init_l3g4200d.c b/sys/auto_init/saul/auto_init_l3g4200d.c new file mode 100644 index 0000000000..a4a9a109ed --- /dev/null +++ b/sys/auto_init/saul/auto_init_l3g4200d.c @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2015 Freie Universität Berlin + * + * 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 L3G4200D pressure sensors + * + * @author Hauke Petersen <hauke.petersen@fu-berlin.de> + * + * @} + */ + +#ifdef MODULE_L3G4200D + +#include "saul_reg.h" +#include "l3g4200d.h" +#include "l3g4200d_params.h" + +#define ENABLE_DEBUG (0) +#include "debug.h" + +/** + * @brief Define the number of configured sensors + */ +#define L3G4200D_NUM (sizeof(l3g4200d_params)/sizeof(l3g4200d_params[0])) + +/** + * @brief Allocate memory for the device descriptors + */ +static l3g4200d_t l3g4200d_devs[L3G4200D_NUM]; + +/** + * @brief Memory for the SAUL registry entries + */ +static saul_reg_t saul_entries[L3G4200D_NUM]; + +/** + * @brief Reference the driver struct + */ +extern saul_driver_t l3g4200d_saul_driver; + + +void auto_init_l3g4200d(void) +{ + for (int i = 0; i < L3G4200D_NUM; i++) { + const l3g4200d_params_t *p = &l3g4200d_params[i]; + + DEBUG("[auto_init_saul] initializing l3g4200d gyroscope\n"); + int res = l3g4200d_init(&l3g4200d_devs[i], p->i2c, p->addr, + p->int1_pin, p->int2_pin, p->mode, p->scale); + if (res < 0) { + DEBUG("[auto_init_saul] error during initialization\n"); + } + else { + saul_entries[i].dev = &(l3g4200d_devs[i]); + saul_entries[i].name = l3g4200d_saul_info[i].name; + saul_entries[i].driver = &l3g4200d_saul_driver; + saul_reg_add(&(saul_entries[i])); + } + } +} + +#else +typedef int dont_be_pedantic; +#endif /* MODULE_L3G4200D */ diff --git a/sys/auto_init/saul/auto_init_lps331ap.c b/sys/auto_init/saul/auto_init_lps331ap.c new file mode 100644 index 0000000000..e505a9e32b --- /dev/null +++ b/sys/auto_init/saul/auto_init_lps331ap.c @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2015 Freie Universität Berlin + * + * 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 LPS331AP pressure sensors + * + * @author Hauke Petersen <hauke.petersen@fu-berlin.de> + * + * @} + */ + +#ifdef MODULE_LPS331AP + +#include "saul_reg.h" +#include "lps331ap.h" +#include "lps331ap_params.h" + +#define ENABLE_DEBUG (0) +#include "debug.h" + +/** + * @brief Define the number of configured sensors + */ +#define LPS331AP_NUM (sizeof(lps331ap_params)/sizeof(lps331ap_params[0])) + +/** + * @brief Allocate memory for the device descriptors + */ +static lps331ap_t lps331ap_devs[LPS331AP_NUM]; + +/** + * @brief Memory for the SAUL registry entries + */ +static saul_reg_t saul_entries[LPS331AP_NUM]; + +/** + * @brief Reference the driver struct + */ +extern saul_driver_t lps331ap_saul_driver; + + +void auto_init_lps331ap(void) +{ + for (int i = 0; i < LPS331AP_NUM; i++) { + const lps331ap_params_t *p = &lps331ap_params[i]; + + DEBUG("[auto_init_saul] initializing lps331ap pressure sensor\n"); + int res = lps331ap_init(&lps331ap_devs[i], p->i2c, p->addr, p->rate); + DEBUG("not done\n"); + if (res < 0) { + DEBUG("[auto_init_saul] error during initialization\n"); + } + else { + saul_entries[i].dev = &(lps331ap_devs[i]); + saul_entries[i].name = lps331ap_saul_info[i].name; + saul_entries[i].driver = &lps331ap_saul_driver; + saul_reg_add(&(saul_entries[i])); + } + } +} + +#else +typedef int dont_be_pedantic; +#endif /* MODULE_LPS331AP */ diff --git a/sys/auto_init/saul/auto_init_lsm303dlhc.c b/sys/auto_init/saul/auto_init_lsm303dlhc.c new file mode 100644 index 0000000000..3c4e71ab93 --- /dev/null +++ b/sys/auto_init/saul/auto_init_lsm303dlhc.c @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2015 Freie Universität Berlin + * + * 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 LSM303DLHC accelerometer/magnetometer + * + * @author Hauke Petersen <hauke.petersen@fu-berlin.de> + * + * @} + */ + +#ifdef MODULE_LSM303DLHC + +#include "saul_reg.h" +#include "lsm303dlhc.h" +#include "lsm303dlhc_params.h" + +#define ENABLE_DEBUG (0) +#include "debug.h" + +/** + * @brief Define the number of configured sensors + */ +#define LSM303DLHC_NUM (sizeof(lsm303dlhc_params)/sizeof(lsm303dlhc_params[0])) + +/** + * @brief Allocate memory for the device descriptors + */ +static lsm303dlhc_t lsm303dlhc_devs[LSM303DLHC_NUM]; + +/** + * @brief Memory for the SAUL registry entries + */ +static saul_reg_t saul_entries[LSM303DLHC_NUM * 2]; + +/** + * @brief Reference the driver structs + * @{ + */ +extern saul_driver_t lsm303dlhc_saul_acc_driver; +extern saul_driver_t lsm303dlhc_saul_mag_driver; +/** @} */ + +void auto_init_lsm303dlhc(void) +{ + for (int i = 0; i < LSM303DLHC_NUM; i++) { + const lsm303dlhc_params_t *p = &lsm303dlhc_params[i]; + + DEBUG("[auto_init_saul] initializing lsm303dlhc acc/mag sensor\n"); + int res = lsm303dlhc_init(&lsm303dlhc_devs[i], p->i2c, + p->acc_pin, p->mag_pin, + p->acc_addr, p->acc_rate, p->acc_scale, + p->mag_addr, p->mag_rate, p->mag_gain); + if (res < 0) { + DEBUG("[auto_init_saul] error during initialization\n"); + } + else { + saul_entries[(i * 2)].dev = &(lsm303dlhc_devs[i]); + saul_entries[(i * 2)].name = lsm303dlhc_saul_info[i].name; + saul_entries[(i * 2)].driver = &lsm303dlhc_saul_acc_driver; + saul_entries[(i * 2) + 1].dev = &(lsm303dlhc_devs[i]); + saul_entries[(i * 2) + 1].name = lsm303dlhc_saul_info[i].name; + saul_entries[(i * 2) + 1].driver = &lsm303dlhc_saul_mag_driver; + saul_reg_add(&(saul_entries[(i * 2)])); + saul_reg_add(&(saul_entries[(i * 2) + 1])); + } + } +} + +#else +typedef int dont_be_pedantic; +#endif /* MODULE_LSM303DLHC */ -- GitLab