diff --git a/drivers/include/isl29020.h b/drivers/include/isl29020.h index f17a2c0aa3..b8b62af62d 100644 --- a/drivers/include/isl29020.h +++ b/drivers/include/isl29020.h @@ -33,15 +33,6 @@ extern "C" { */ #define ISL29020_DEFAULT_ADDRESS 0x44 -/** - * @brief Device descriptor for ISL29020 sensors - */ -typedef struct { - i2c_t i2c; /**< I2C device the sensor is connected to */ - uint8_t address; /**< I2C bus address of the sensor */ - float lux_fac; /**< factor to calculate actual lux value */ -} isl29020_t; - /** * @brief Possible modes for the ISL29020 sensor */ @@ -70,20 +61,24 @@ typedef struct { isl29020_mode_t mode; /**< measurement mode to use */ } isl29020_params_t; +/** + * @brief Device descriptor for ISL29020 sensors + */ +typedef struct { + isl29020_params_t params; /**< device initialization parameters */ + float lux_fac; /**< factor to calculate actual lux value */ +} isl29020_t; + /** * @brief Initialize a new ISL29020 device * * @param[in] dev device descriptor of an ISL29020 device - * @param[in] i2c I2C device the sensor is connected to - * @param[in] address I2C address of the sensor - * @param[in] range measurement range - * @param[in] mode configure if sensor reacts to ambient or infrared light + * @param[in] params initialization parameters * * @return 0 on success * @return -1 on error */ -int isl29020_init(isl29020_t *dev, i2c_t i2c, uint8_t address, - isl29020_range_t range, isl29020_mode_t mode); +int isl29020_init(isl29020_t *dev, const isl29020_params_t *params); /** * @brief Read a lighting value from the sensor, the result is given in lux diff --git a/drivers/isl29020/include/isl29020_params.h b/drivers/isl29020/include/isl29020_params.h index dc8e4db074..e942089c14 100644 --- a/drivers/isl29020/include/isl29020_params.h +++ b/drivers/isl29020/include/isl29020_params.h @@ -44,10 +44,15 @@ extern "C" { #define ISL29020_PARAM_MODE (ISL29020_MODE_AMBIENT) #endif -#define ISL29020_PARAMS_DEFAULT { .i2c = ISL29020_PARAM_I2C, \ - .addr = ISL29020_PARAM_ADDR, \ +#ifndef ISL29020_PARAMS +#define ISL29020_PARAMS { .i2c = ISL29020_PARAM_I2C, \ + .addr = ISL29020_PARAM_ADDR, \ .range = ISL29020_PARAM_RANGE, \ - .mode = ISL29020_PARAM_MODE,} + .mode = ISL29020_PARAM_MODE } +#endif +#ifndef ISL29020_SAUL_INFO +#define ISL29020_SAUL_INFO { .name = "isl29020" } +#endif /**@}*/ /** @@ -55,11 +60,7 @@ extern "C" { */ static const isl29020_params_t isl29020_params[] = { -#ifdef ISL29020_PARAMS_CUSTOM - ISL29020_PARAMS_CUSTOM, -#else - ISL29020_PARAMS_DEFAULT, -#endif + ISL29020_PARAMS }; /** @@ -67,7 +68,7 @@ static const isl29020_params_t isl29020_params[] = */ static const saul_reg_info_t isl29020_saul_info[] = { - { .name = "isl29020" } + ISL29020_SAUL_INFO }; #ifdef __cplusplus diff --git a/drivers/isl29020/isl29020.c b/drivers/isl29020/isl29020.c index 37aa8d106b..8c8a525501 100644 --- a/drivers/isl29020/isl29020.c +++ b/drivers/isl29020/isl29020.c @@ -26,27 +26,32 @@ #define ENABLE_DEBUG (0) #include "debug.h" -int isl29020_init(isl29020_t *dev, i2c_t i2c, uint8_t address, - isl29020_range_t range, isl29020_mode_t mode) +#define DEV_I2C (dev->params.i2c) +#define DEV_ADDR (dev->params.addr) +#define DEV_RANGE (dev->params.range) +#define DEV_MODE (dev->params.mode) + +int isl29020_init(isl29020_t *dev, const isl29020_params_t *params) { + dev->params = *params; + int res; uint8_t tmp; /* initialize device descriptor */ - dev->i2c = i2c; - dev->address = address; - dev->lux_fac = (float)((1 << (10 + (2 * range))) - 1) / 0xffff; + dev->lux_fac = (float)((1 << (10 + (2 * DEV_RANGE))) - 1) / 0xffff; /* acquire exclusive access to the bus */ - i2c_acquire(dev->i2c); + i2c_acquire(DEV_I2C); /* initialize the I2C bus */ - i2c_init_master(i2c, I2C_SPEED_NORMAL); + i2c_init_master(DEV_I2C, I2C_SPEED_NORMAL); /* configure and enable the sensor */ - tmp = ISL29020_CMD_EN | ISL29020_CMD_MODE | ISL29020_RES_INT_16 | range | (mode << 5); - res = i2c_write_reg(dev->i2c, address, ISL29020_REG_CMD, tmp); + tmp = (ISL29020_CMD_EN | ISL29020_CMD_MODE | + ISL29020_RES_INT_16 | DEV_RANGE | (DEV_MODE << 5)); + res = i2c_write_reg(DEV_I2C, DEV_ADDR, ISL29020_REG_CMD, tmp); /* release the bus for other threads */ - i2c_release(dev->i2c); + i2c_release(DEV_I2C); if (res < 1) { return -1; } @@ -59,11 +64,11 @@ int isl29020_read(const isl29020_t *dev) uint16_t res; int ret; - i2c_acquire(dev->i2c); + i2c_acquire(DEV_I2C); /* read lighting value */ - ret = i2c_read_reg(dev->i2c, dev->address, ISL29020_REG_LDATA, &low); - ret += i2c_read_reg(dev->i2c, dev->address, ISL29020_REG_HDATA, &high); - i2c_release(dev->i2c); + ret = i2c_read_reg(DEV_I2C, DEV_ADDR, ISL29020_REG_LDATA, &low); + ret += i2c_read_reg(DEV_I2C, DEV_ADDR, ISL29020_REG_HDATA, &high); + i2c_release(DEV_I2C); if (ret < 2) { return -1; } @@ -78,19 +83,19 @@ int isl29020_enable(const isl29020_t *dev) int res; uint8_t tmp; - i2c_acquire(dev->i2c); - res = i2c_read_reg(dev->i2c, dev->address, ISL29020_REG_CMD, &tmp); + i2c_acquire(DEV_I2C); + res = i2c_read_reg(DEV_I2C, DEV_ADDR, ISL29020_REG_CMD, &tmp); if (res < 1) { - i2c_release(dev->i2c); + i2c_release(DEV_I2C); return -1; } tmp |= ISL29020_CMD_EN; - res = i2c_write_reg(dev->i2c, dev->address, ISL29020_REG_CMD, tmp); + res = i2c_write_reg(DEV_I2C, DEV_ADDR, ISL29020_REG_CMD, tmp); if (res < 1) { - i2c_release(dev->i2c); + i2c_release(DEV_I2C); return -1; } - i2c_release(dev->i2c); + i2c_release(DEV_I2C); return 0; } @@ -99,18 +104,18 @@ int isl29020_disable(const isl29020_t *dev) int res; uint8_t tmp; - i2c_acquire(dev->i2c); - res = i2c_read_reg(dev->i2c, dev->address, ISL29020_REG_CMD, &tmp); + i2c_acquire(DEV_I2C); + res = i2c_read_reg(DEV_I2C, DEV_ADDR, ISL29020_REG_CMD, &tmp); if (res < 1) { - i2c_release(dev->i2c); + i2c_release(DEV_I2C); return -1; } tmp &= ~(ISL29020_CMD_EN); - res = i2c_write_reg(dev->i2c, dev->address, ISL29020_REG_CMD, tmp); + res = i2c_write_reg(DEV_I2C, DEV_ADDR, ISL29020_REG_CMD, tmp); if (res < 1) { - i2c_release(dev->i2c); + i2c_release(DEV_I2C); return -1; } - i2c_release(dev->i2c); + i2c_release(DEV_I2C); return 0; }