mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
drivers/si114x: initial basic support
This commit is contained in:
parent
6ca74fa145
commit
3a6a3b8b14
@ -280,6 +280,12 @@ ifneq (,$(filter sht11,$(USEMODULE)))
|
||||
USEMODULE += xtimer
|
||||
endif
|
||||
|
||||
ifneq (,$(filter si114%,$(USEMODULE)))
|
||||
USEMODULE += xtimer
|
||||
FEATURES_REQUIRED += periph_i2c
|
||||
USEMODULE += si114x
|
||||
endif
|
||||
|
||||
ifneq (,$(filter si70%,$(USEMODULE)))
|
||||
USEMODULE += xtimer
|
||||
FEATURES_REQUIRED += periph_i2c
|
||||
|
@ -190,6 +190,10 @@ ifneq (,$(filter sdcard_spi,$(USEMODULE)))
|
||||
USEMODULE_INCLUDES += $(RIOTBASE)/drivers/sdcard_spi/include
|
||||
endif
|
||||
|
||||
ifneq (,$(filter si114x,$(USEMODULE)))
|
||||
USEMODULE_INCLUDES += $(RIOTBASE)/drivers/si114x/include
|
||||
endif
|
||||
|
||||
ifneq (,$(filter si70xx,$(USEMODULE)))
|
||||
USEMODULE_INCLUDES += $(RIOTBASE)/drivers/si70xx/include
|
||||
endif
|
||||
|
141
drivers/include/si114x.h
Normal file
141
drivers/include/si114x.h
Normal file
@ -0,0 +1,141 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2018 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup drivers_si114x Si1145/6/7 UV/Ambient light/Proximity sensors
|
||||
* @ingroup drivers_sensors
|
||||
* @brief Device driver for the Si1145/6/7 sensors family
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief Device driver interface for the Si114x sensors family
|
||||
*
|
||||
* @author Alexandre Abadie <alexandre.abadie@inria.fr>
|
||||
* Bas Stottelaar <basstottelaar@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef SI114X_H
|
||||
#define SI114X_H
|
||||
|
||||
#include "saul.h"
|
||||
#include "periph/i2c.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Initialization return codes
|
||||
*/
|
||||
typedef enum {
|
||||
SI114X_OK,
|
||||
SI114X_ERR_I2C,
|
||||
SI114X_ERR_NODEV
|
||||
} si114x_ret_code_t;
|
||||
|
||||
/**
|
||||
* @brief Active LED current parameters
|
||||
*/
|
||||
typedef enum {
|
||||
SI114X_PS_LED1 = 1, /**< 5.6mA */
|
||||
SI114X_PS_LED2, /**< 11.2mA */
|
||||
SI114X_PS_LED3, /**< 22.4mA */
|
||||
SI114X_PS_LED4, /**< 45mA */
|
||||
SI114X_PS_LED5, /**< 67mA */
|
||||
SI114X_PS_LED6, /**< 90mA */
|
||||
SI114X_PS_LED7, /**< 112mA */
|
||||
SI114X_PS_LED8, /**< 135mA */
|
||||
SI114X_PS_LED9, /**< 157mA */
|
||||
SI114X_PS_LED10, /**< 180mA */
|
||||
SI114X_PS_LED11, /**< 202mA */
|
||||
SI114X_PS_LED12, /**< 224mA */
|
||||
SI114X_PS_LED13, /**< 269mA */
|
||||
SI114X_PS_LED14, /**< 314mA */
|
||||
SI114X_PS_LED15 /**< 359mA */
|
||||
} si114x_led_current_t;
|
||||
|
||||
/**
|
||||
* @brief Device initialization parameters
|
||||
*/
|
||||
typedef struct {
|
||||
i2c_t i2c_dev; /**< I2C device which is used */
|
||||
si114x_led_current_t led_current; /**< Proximity LED current */
|
||||
} si114x_params_t;
|
||||
|
||||
|
||||
/**
|
||||
* @brief Device descriptor for the Si114x sensor
|
||||
*/
|
||||
typedef struct {
|
||||
si114x_params_t params; /**< Si114x initialization parameters */
|
||||
} si114x_t;
|
||||
|
||||
/**
|
||||
* @brief Initialize the given Si114x device
|
||||
*
|
||||
* @param[out] dev Initialized device descriptor of Si114x device
|
||||
* @param[in] params Initialization parameters
|
||||
*
|
||||
* @return SI114X_OK: all good
|
||||
* @return -SI114X_ERR_I2C: I2C bus cannot be initialized
|
||||
* @return -SI114X_ERR_NODEV: not a valid Si114x device
|
||||
*/
|
||||
int8_t si114x_init(si114x_t *dev, const si114x_params_t * params);
|
||||
|
||||
/**
|
||||
* @brief Read UV index from the given Si114x device
|
||||
*
|
||||
* @param[in] dev Device descriptor of Si114x device to read from
|
||||
*
|
||||
* @return UV index
|
||||
*/
|
||||
uint16_t si114x_read_uv(si114x_t *dev);
|
||||
|
||||
/**
|
||||
* @brief Read IR light value from the given Si114x device, returned in lx
|
||||
*
|
||||
* @param[in] dev Device descriptor of Si114x device to read from
|
||||
*
|
||||
* @return IR light in lx
|
||||
*/
|
||||
uint16_t si114x_read_ir(si114x_t *dev);
|
||||
|
||||
/**
|
||||
* @brief Read visible light value from the given Si114x device, returned in lx
|
||||
*
|
||||
* @param[in] dev Device descriptor of Si114x device to read from
|
||||
*
|
||||
* @return Visible light in lx
|
||||
*/
|
||||
uint16_t si114x_read_visible(si114x_t *dev);
|
||||
|
||||
/**
|
||||
* @brief Read distance measure from the given Si114x device, returned in ADC
|
||||
* counts.
|
||||
*
|
||||
* @param[in] dev Device descriptor of Si114x device to read from
|
||||
*
|
||||
* @return Distance in ADC counts
|
||||
*/
|
||||
uint16_t si114x_read_distance(si114x_t *dev);
|
||||
|
||||
/**
|
||||
* @brief Read the response register.
|
||||
*
|
||||
* @param[in] dev Device descriptor of Si114x device to read from
|
||||
*
|
||||
* @return Device response register contents
|
||||
*/
|
||||
uint8_t si114x_read_response(si114x_t *dev);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SI114X_H */
|
||||
/** @} */
|
1
drivers/si114x/Makefile
Normal file
1
drivers/si114x/Makefile
Normal file
@ -0,0 +1 @@
|
||||
include $(RIOTBASE)/Makefile.base
|
207
drivers/si114x/include/si114x_internals.h
Normal file
207
drivers/si114x/include/si114x_internals.h
Normal file
@ -0,0 +1,207 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2018 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 drivers_si114x
|
||||
* @brief Internal addresses, registers, constants for the Si114x sensors family.
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief Internal addresses, registers, constants for the Si114x sensor.
|
||||
*
|
||||
* @author Alexandre Abadie <alexandre.abadie@inria.fr>
|
||||
*/
|
||||
|
||||
#ifndef SI114X_INTERNALS_H
|
||||
#define SI114X_INTERNALS_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Si114x I2C address
|
||||
*/
|
||||
#define SI114X_ADDR (0x60)
|
||||
|
||||
/**
|
||||
* @name Si114x commands
|
||||
* @{
|
||||
*/
|
||||
#define SI114X_PARAM_QUERY (0x80)
|
||||
#define SI114X_PARAM_SET (0xA0)
|
||||
#define SI114X_NOP (0x00)
|
||||
#define SI114X_RESET (0x01)
|
||||
#define SI114X_BUSADDR (0x02)
|
||||
#define SI114X_PS_FORCE (0x05)
|
||||
#define SI114X_ALS_FORCE (0x06)
|
||||
#define SI114X_PS_ALS_FORCE (0x07)
|
||||
#define SI114X_PS_PAUSE (0x09)
|
||||
#define SI114X_ALS_PAUSE (0x0A)
|
||||
#define SI114X_PS_ALS_PAUSE (0x0B)
|
||||
#define SI114X_PS_AUTO (0x0D)
|
||||
#define SI114X_ALS_AUTO (0x0E)
|
||||
#define SI114X_PS_ALS_AUTO (0x0F)
|
||||
#define SI114X_GET_CAL (0x12)
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name Si114x registers
|
||||
* @{
|
||||
*/
|
||||
#define SI114X_REG_PART_ID (0x00)
|
||||
#define SI114X_REG_REV_ID (0x01)
|
||||
#define SI114X_REG_SEQ_ID (0x02)
|
||||
#define SI114X_REG_INT_CFG (0x03)
|
||||
#define SI114X_REG_IRQ_ENABLE (0x04)
|
||||
#define SI114X_REG_IRQ_MODE1 (0x05)
|
||||
#define SI114X_REG_IRQ_MODE2 (0x06)
|
||||
#define SI114X_REG_HW_KEY (0x07)
|
||||
#define SI114X_REG_MEAS_RATE0 (0x08)
|
||||
#define SI114X_REG_MEAS_RATE1 (0x09)
|
||||
#define SI114X_REG_PS_LED21 (0x0F)
|
||||
#define SI114X_REG_PS_LED3 (0x10)
|
||||
#define SI114X_REG_UCOEF0 (0x13)
|
||||
#define SI114X_REG_UCOEF1 (0x14)
|
||||
#define SI114X_REG_UCOEF2 (0x15)
|
||||
#define SI114X_REG_UCOEF3 (0x16)
|
||||
#define SI114X_REG_PARAM_WR (0x17)
|
||||
#define SI114X_REG_COMMAND (0x18)
|
||||
#define SI114X_REG_RESPONSE (0x20)
|
||||
#define SI114X_REG_IRQ_STATUS (0x21)
|
||||
#define SI114X_REG_ALS_VIS_DATA0 (0x22)
|
||||
#define SI114X_REG_ALS_VIS_DATA1 (0x23)
|
||||
#define SI114X_REG_ALS_IR_DATA0 (0x24)
|
||||
#define SI114X_REG_ALS_IR_DATA1 (0x25)
|
||||
#define SI114X_REG_PS1_DATA0 (0x26)
|
||||
#define SI114X_REG_PS1_DATA1 (0x27)
|
||||
#define SI114X_REG_PS2_DATA0 (0x28)
|
||||
#define SI114X_REG_PS2_DATA1 (0x29)
|
||||
#define SI114X_REG_PS3_DATA0 (0x2A)
|
||||
#define SI114X_REG_PS3_DATA1 (0x2B)
|
||||
#define SI114X_REG_UV_INDEX0 (0x2C)
|
||||
#define SI114X_REG_UV_INDEX1 (0x2D)
|
||||
#define SI114X_REG_PARAM_RD (0x2E)
|
||||
#define SI114X_REG_CHIP_STAT (0x30)
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name Si114x response register error codes
|
||||
* @{
|
||||
*/
|
||||
#define SI114X_NO_ERROR (0x00)
|
||||
#define SI114X_INVALID_SETTING (0x80)
|
||||
#define SI114X_PS1_ADC_OVERFLOW (0x88)
|
||||
#define SI114X_PS2_ADC_OVERFLOW (0x89)
|
||||
#define SI114X_PS3_ADC_OVERFLOW (0x8A)
|
||||
#define SI114X_ALS_VIS_ADC_OVERFLOW (0x8C)
|
||||
#define SI114X_ALS_IR_ADC_OVERFLOW (0x8D)
|
||||
#define SI114X_UV_ADC_OVERFLOW (0x8E)
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name Si114x parameters RAM
|
||||
*
|
||||
* @note These parameter can be accessed indirectly using PARAM_QUERY or
|
||||
* PARAM_SET commands.
|
||||
* @{
|
||||
*/
|
||||
#define SI114X_I2C_ADDR (0x00)
|
||||
#define SI114X_PARAM_CHLIST (0x01)
|
||||
#define SI114X_PARAM_CHLIST_ENUV (0x80)
|
||||
#define SI114X_PARAM_CHLIST_ENAUX (0x40)
|
||||
#define SI114X_PARAM_CHLIST_ENALSIR (0x20)
|
||||
#define SI114X_PARAM_CHLIST_ENALSVIS (0x10)
|
||||
#define SI114X_PARAM_CHLIST_ENPS1 (0x01)
|
||||
#define SI114X_PARAM_CHLIST_ENPS2 (0x02)
|
||||
#define SI114X_PARAM_CHLIST_ENPS3 (0x04)
|
||||
#define SI114X_PARAM_PSLED12SEL (0x02)
|
||||
#define SI114X_PARAM_PSLED12SEL_PS2NONE (0x00)
|
||||
#define SI114X_PARAM_PSLED12SEL_PS2LED1 (0x10)
|
||||
#define SI114X_PARAM_PSLED12SEL_PS2LED2 (0x20)
|
||||
#define SI114X_PARAM_PSLED12SEL_PS2LED3 (0x40)
|
||||
#define SI114X_PARAM_PSLED12SEL_PS1NONE (0x00)
|
||||
#define SI114X_PARAM_PSLED12SEL_PS1LED1 (0x01)
|
||||
#define SI114X_PARAM_PSLED12SEL_PS1LED2 (0x02)
|
||||
#define SI114X_PARAM_PSLED12SEL_PS1LED3 (0x04)
|
||||
#define SI114X_PARAM_PSLED3SEL (0x03)
|
||||
#define SI114X_PARAM_PSENCODE (0x05)
|
||||
#define SI114X_PARAM_ALSENCODE (0x06)
|
||||
#define SI114X_PARAM_PS1ADCMUX (0x07)
|
||||
#define SI114X_PARAM_PS2ADCMUX (0x08)
|
||||
#define SI114X_PARAM_PS3ADCMUX (0x09)
|
||||
#define SI114X_PARAM_PSADCOUNTER (0x0A)
|
||||
#define SI114X_PARAM_PSADCGAIN (0x0B)
|
||||
#define SI114X_PARAM_PSADCMISC (0x0C)
|
||||
#define SI114X_PARAM_PSADCMISC_RANGE (0x20)
|
||||
#define SI114X_PARAM_PSADCMISC_PSMODE (0x04)
|
||||
#define SI114X_PARAM_ALSIRADCMUX (0x0E)
|
||||
#define SI114X_PARAM_AUXADCMUX (0x0F)
|
||||
#define SI114X_PARAM_ALSVISADCOUNTER (0x10)
|
||||
#define SI114X_PARAM_ALSVISADCGAIN (0x11)
|
||||
#define SI114X_PARAM_ALSVISADCMISC (0x12)
|
||||
#define SI114X_PARAM_ALSVISADCMISC_VISRANGE (0x20)
|
||||
#define SI114X_PARAM_ALSIRADCOUNTER (0x1D)
|
||||
#define SI114X_PARAM_ALSIRADCGAIN (0x1E)
|
||||
#define SI114X_PARAM_ALSIRADCMISC (0x1F)
|
||||
#define SI114X_PARAM_ALSIRADCMISC_RANGE (0x20)
|
||||
#define SI114X_PARAM_ADCMUX_SMALLIR (0x00)
|
||||
#define SI114X_PARAM_ADCMUX_LARGEIR (0x03)
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name Si114x constants
|
||||
* @{
|
||||
*/
|
||||
#define SI1145_ID (0x45)
|
||||
#define SI1146_ID (0x46)
|
||||
#define SI1147_ID (0x47)
|
||||
#define SI114X_STARTUP_TIME (25000UL) /* 25ms */
|
||||
#define SI114X_WAIT_10MS (10000UL) /* 10ms */
|
||||
#define SI114X_INIT_VALUE (0x17)
|
||||
#define SI114X_UCOEF0_DEFAULT (0x29)
|
||||
#define SI114X_UCOEF1_DEFAULT (0x89)
|
||||
#define SI114X_UCOEF2_DEFAULT (0x02)
|
||||
#define SI114X_UCOEF3_DEFAULT (0x00)
|
||||
#define SI114X_ADC_REC_CLK (0x70) /* 511 ADC Clock */
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name Si114x register bits
|
||||
* @{
|
||||
*/
|
||||
#define SI114X_EN_UV (0x80)
|
||||
#define SI114X_EN_AUX (0x40)
|
||||
#define SI114X_EN_ALS_IR (0x20)
|
||||
#define SI114X_EN_ALS_VIS (0x10)
|
||||
|
||||
#define SI114X_EN_PS3_IE (0x10)
|
||||
#define SI114X_EN_PS2_IE (0x08)
|
||||
#define SI114X_EN_PS1_IE (0x04)
|
||||
#define SI114X_EN_ALS_IE (0x01)
|
||||
|
||||
#define SI114X_INTCFG_INTOE (0x01)
|
||||
#define SI114X_INTCFG_INTMODE (0x02)
|
||||
|
||||
#define SI114X_PS3_ALIGN (0x40)
|
||||
#define SI114X_PS2_ALIGN (0x20)
|
||||
#define SI114X_PS1_ALIGN (0x10)
|
||||
#define SI114X_ALS_IR_ALIGN (0x20)
|
||||
#define SI114X_ALS_VIS_ALIGN (0x10)
|
||||
#define SI114X_PS_RANGE (0x20)
|
||||
#define SI114X_PS_ADC_MODE (0x04)
|
||||
#define SI114X_VIS_RANGE (0x20)
|
||||
#define SI114X_IR_RANGE (0x20)
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SI114X_INTERNALS_H */
|
||||
/** @} */
|
69
drivers/si114x/include/si114x_params.h
Normal file
69
drivers/si114x/include/si114x_params.h
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2018 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 drivers_si114x
|
||||
*
|
||||
* @{
|
||||
* @file
|
||||
* @brief Default configuration for SI114x
|
||||
*
|
||||
* @author Alexandre Abadie <alexandre.abadie@inria.fr>
|
||||
*/
|
||||
|
||||
#ifndef SI114X_PARAMS_H
|
||||
#define SI114X_PARAMS_H
|
||||
|
||||
#include "board.h"
|
||||
#include "si114x.h"
|
||||
#include "saul_reg.h"
|
||||
#include "si114x_internals.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @name Set default configuration parameters for the Si114x
|
||||
* @{
|
||||
*/
|
||||
#ifndef SI114X_PARAM_I2C_DEV
|
||||
#define SI114X_PARAM_I2C_DEV I2C_DEV(1)
|
||||
#endif
|
||||
|
||||
#ifndef SI114X_PARAMS
|
||||
#define SI114X_PARAMS { .i2c_dev = SI114X_PARAM_I2C_DEV, \
|
||||
.led_current = SI114X_PS_LED1 }
|
||||
#endif
|
||||
#ifndef SI114X_SAUL_INFO
|
||||
#define SI114X_SAUL_INFO { .name = "si114x" }
|
||||
#endif
|
||||
/**@}*/
|
||||
|
||||
/**
|
||||
* @brief Configure Si114x
|
||||
*/
|
||||
static const si114x_params_t si114x_params[] =
|
||||
{
|
||||
SI114X_PARAMS
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Allocate and configure entries to the SAUL registry
|
||||
*/
|
||||
saul_reg_t si114x_saul_reg_info[] =
|
||||
{
|
||||
SI114X_SAUL_INFO
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SI114X_PARAMS_H */
|
||||
/** @} */
|
272
drivers/si114x/si114x.c
Normal file
272
drivers/si114x/si114x.c
Normal file
@ -0,0 +1,272 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2018 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 drivers_si114x
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief Device driver implementation for the Si114x proximity/UV/Ambient
|
||||
* light sensor with I2C interface.
|
||||
*
|
||||
* @author Alexandre Abadie <alexandre.abadie@inria.fr>
|
||||
* Bas Stottelaar <basstottelaar@gmail.com>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "xtimer.h"
|
||||
|
||||
#include "periph/i2c.h"
|
||||
|
||||
#include "si114x.h"
|
||||
#include "si114x_internals.h"
|
||||
|
||||
#define ENABLE_DEBUG (0)
|
||||
#include "debug.h"
|
||||
|
||||
#define DEV_I2C (dev->params.i2c_dev)
|
||||
|
||||
/* Internal function prototypes */
|
||||
static void _reset(si114x_t *dev);
|
||||
static void _initialize(si114x_t *dev);
|
||||
static void _set_param(si114x_t *dev, uint8_t param, uint8_t value);
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Si114x Core API *
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
int8_t si114x_init(si114x_t *dev, const si114x_params_t *params)
|
||||
{
|
||||
dev->params = *params;
|
||||
|
||||
/* wait before sensor is ready */
|
||||
xtimer_usleep(SI114X_STARTUP_TIME);
|
||||
|
||||
/* initialize I2C interface */
|
||||
if (i2c_init_master(DEV_I2C, I2C_SPEED_NORMAL)) {
|
||||
DEBUG("[Error] I2C device not enabled\n");
|
||||
return -SI114X_ERR_I2C;
|
||||
}
|
||||
|
||||
/* acquire exclusive access */
|
||||
i2c_acquire(DEV_I2C);
|
||||
|
||||
/* check sensor ID */
|
||||
char checkid = 0;
|
||||
i2c_read_reg(DEV_I2C, SI114X_ADDR, SI114X_REG_PART_ID, &checkid);
|
||||
if ((checkid != SI1145_ID) && (checkid != SI1146_ID) && (checkid != SI1147_ID)) {
|
||||
DEBUG("[Error] The given i2c is not enabled.\n");
|
||||
i2c_release(DEV_I2C);
|
||||
return -SI114X_ERR_NODEV;
|
||||
}
|
||||
|
||||
/* reset sensor */
|
||||
_reset(dev);
|
||||
|
||||
/* initialize internals registers */
|
||||
_initialize(dev);
|
||||
|
||||
/* release I2C device */
|
||||
i2c_release(DEV_I2C);
|
||||
|
||||
return SI114X_OK;
|
||||
}
|
||||
|
||||
uint16_t si114x_read_uv(si114x_t *dev)
|
||||
{
|
||||
/* acquire exclusive access */
|
||||
i2c_acquire(DEV_I2C);
|
||||
|
||||
uint8_t buffer[2];
|
||||
i2c_read_regs(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_UV_INDEX0, &buffer, 2);
|
||||
|
||||
/* release I2C device */
|
||||
i2c_release(DEV_I2C);
|
||||
|
||||
return (uint16_t)(((buffer[1] << 8) | buffer[0]) / 100);
|
||||
}
|
||||
|
||||
uint16_t si114x_read_ir(si114x_t *dev)
|
||||
{
|
||||
/* acquire exclusive access */
|
||||
i2c_acquire(DEV_I2C);
|
||||
|
||||
uint8_t buffer[2];
|
||||
i2c_read_regs(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_ALS_IR_DATA0, &buffer, 2);
|
||||
|
||||
/* release I2C device */
|
||||
i2c_release(DEV_I2C);
|
||||
|
||||
return (uint16_t)((buffer[1] << 8) | buffer[0]);
|
||||
}
|
||||
|
||||
uint16_t si114x_read_visible(si114x_t *dev)
|
||||
{
|
||||
/* acquire exclusive access */
|
||||
i2c_acquire(DEV_I2C);
|
||||
|
||||
uint8_t buffer[2];
|
||||
i2c_read_regs(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_ALS_VIS_DATA0, &buffer, 2);
|
||||
|
||||
/* release I2C device */
|
||||
i2c_release(DEV_I2C);
|
||||
|
||||
return (uint16_t)((buffer[1] << 8) | buffer[0]);
|
||||
}
|
||||
|
||||
uint16_t si114x_read_distance(si114x_t *dev)
|
||||
{
|
||||
/* acquire exclusive access */
|
||||
i2c_acquire(DEV_I2C);
|
||||
|
||||
uint8_t buffer[2];
|
||||
i2c_read_regs(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_PS1_DATA0, &buffer, 2);
|
||||
|
||||
/* release I2C device */
|
||||
i2c_release(DEV_I2C);
|
||||
|
||||
return (uint16_t)((buffer[1] << 8) | buffer[0]);
|
||||
}
|
||||
|
||||
uint8_t si114x_read_response(si114x_t *dev)
|
||||
{
|
||||
/* acquire exclusive access */
|
||||
i2c_acquire(DEV_I2C);
|
||||
|
||||
uint8_t buffer[1];
|
||||
i2c_read_regs(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_RESPONSE, &buffer, 1);
|
||||
|
||||
/* release I2C device */
|
||||
i2c_release(DEV_I2C);
|
||||
|
||||
return buffer[0];
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------------*/
|
||||
/* Internal functions */
|
||||
/*------------------------------------------------------------------------------------*/
|
||||
|
||||
void _reset(si114x_t *dev)
|
||||
{
|
||||
DEBUG("Resetting sensor.\n");
|
||||
|
||||
/* write configuration values */
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_MEAS_RATE0, 0);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_MEAS_RATE1, 0);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_IRQ_ENABLE, 0);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_IRQ_MODE1, 0);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_IRQ_MODE2, 0);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_INT_CFG, 0);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_IRQ_STATUS, 0xFF);
|
||||
|
||||
/* perform RESET command */
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_COMMAND, SI114X_RESET);
|
||||
xtimer_usleep(SI114X_WAIT_10MS);
|
||||
|
||||
/* write HW_KEY for proper operation */
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_HW_KEY, SI114X_INIT_VALUE);
|
||||
xtimer_usleep(SI114X_WAIT_10MS);
|
||||
}
|
||||
|
||||
|
||||
void _initialize(si114x_t *dev)
|
||||
{
|
||||
DEBUG("Initializing sensor.\n");
|
||||
|
||||
/* set default UV measurement coefs */
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_UCOEF0, SI114X_UCOEF0_DEFAULT);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_UCOEF1, SI114X_UCOEF1_DEFAULT);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_UCOEF2, SI114X_UCOEF2_DEFAULT);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_UCOEF3, SI114X_UCOEF3_DEFAULT);
|
||||
|
||||
/* enable measures */
|
||||
_set_param(dev, SI114X_PARAM_CHLIST,
|
||||
SI114X_PARAM_CHLIST_ENUV | SI114X_PARAM_CHLIST_ENALSIR |
|
||||
SI114X_PARAM_CHLIST_ENALSVIS | SI114X_PARAM_CHLIST_ENPS1);
|
||||
|
||||
/* enable interrupt on every sample */
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_INT_CFG, SI114X_INTCFG_INTOE);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_IRQ_ENABLE, SI114X_EN_ALS_IE | SI114X_EN_PS1_IE);
|
||||
|
||||
/* active LED current */
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_PS_LED21, dev->params.led_current);
|
||||
|
||||
_set_param(dev, SI114X_PARAM_PS1ADCMUX, SI114X_PARAM_ADCMUX_LARGEIR);
|
||||
|
||||
/* proximity sensor uses LED1 */
|
||||
_set_param(dev, SI114X_PARAM_PSLED12SEL, SI114X_PARAM_PSLED12SEL_PS1LED1);
|
||||
|
||||
/* ADC gain */
|
||||
_set_param(dev, SI114X_PARAM_PSADCGAIN, 0);
|
||||
_set_param(dev, SI114X_PARAM_PSADCOUNTER, SI114X_ADC_REC_CLK);
|
||||
|
||||
/* proximity range */
|
||||
_set_param(dev, SI114X_PARAM_PSADCMISC,
|
||||
SI114X_PARAM_PSADCMISC_RANGE | SI114X_PARAM_PSADCMISC_PSMODE);
|
||||
_set_param(dev, SI114X_PARAM_ALSIRADCMUX, SI114X_PARAM_ADCMUX_SMALLIR);
|
||||
|
||||
/* clocks configuration */
|
||||
_set_param(dev, SI114X_PARAM_ALSIRADCGAIN, 0);
|
||||
_set_param(dev, SI114X_PARAM_ALSIRADCOUNTER, SI114X_ADC_REC_CLK);
|
||||
|
||||
/* high range mode */
|
||||
_set_param(dev, SI114X_PARAM_ALSIRADCMISC, SI114X_PARAM_ALSIRADCMISC_RANGE);
|
||||
|
||||
/* clocks config */
|
||||
_set_param(dev, SI114X_PARAM_ALSVISADCGAIN, 0);
|
||||
_set_param(dev, SI114X_PARAM_ALSVISADCOUNTER, SI114X_ADC_REC_CLK);
|
||||
|
||||
_set_param(dev, SI114X_PARAM_ALSVISADCMISC,
|
||||
SI114X_PARAM_ALSVISADCMISC_VISRANGE);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_MEAS_RATE0, 0xFF);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_MEAS_RATE1, 0x00);
|
||||
|
||||
/* auto-run */
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_COMMAND, SI114X_PS_ALS_AUTO);
|
||||
}
|
||||
|
||||
void _set_param(si114x_t *dev, uint8_t param, uint8_t value)
|
||||
{
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_PARAM_WR, value);
|
||||
i2c_write_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_COMMAND, param | SI114X_PARAM_SET);
|
||||
|
||||
uint8_t ret;
|
||||
i2c_read_reg(DEV_I2C, SI114X_ADDR,
|
||||
SI114X_REG_PARAM_RD, &ret);
|
||||
}
|
89
drivers/si114x/si114x_saul.c
Normal file
89
drivers/si114x/si114x_saul.c
Normal file
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2018 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 drivers_si114x
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief SAUL adaption for Si114x devices family
|
||||
*
|
||||
* @author Alexandre Abadie <alexandre.abadie@inria.fr>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "saul.h"
|
||||
#include "si114x.h"
|
||||
#include "xtimer.h"
|
||||
|
||||
static int read_uv(const void *dev, phydat_t *res)
|
||||
{
|
||||
si114x_t *d = (si114x_t *)dev;
|
||||
|
||||
res->val[0] = si114x_read_uv(d);
|
||||
res->unit = UNIT_NONE;
|
||||
res->scale = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int read_ir(const void *dev, phydat_t *res)
|
||||
{
|
||||
si114x_t *d = (si114x_t *)dev;
|
||||
|
||||
res->val[0] = si114x_read_ir(d);
|
||||
res->unit = UNIT_LUX;
|
||||
res->scale = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int read_visible(const void *dev, phydat_t *res)
|
||||
{
|
||||
si114x_t *d = (si114x_t *)dev;
|
||||
|
||||
res->val[0] = si114x_read_visible(d);
|
||||
res->unit = UNIT_LUX;
|
||||
res->scale = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int read_distance(const void *dev, phydat_t *res)
|
||||
{
|
||||
si114x_t *d = (si114x_t *)dev;
|
||||
|
||||
res->val[0] = si114x_read_distance(d);
|
||||
res->unit = UNIT_M;
|
||||
res->scale = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
const saul_driver_t si114x_uv_saul_driver = {
|
||||
.read = read_uv,
|
||||
.write = saul_notsup,
|
||||
.type = SAUL_SENSE_ANY
|
||||
};
|
||||
|
||||
const saul_driver_t si114x_ir_saul_driver = {
|
||||
.read = read_ir,
|
||||
.write = saul_notsup,
|
||||
.type = SAUL_SENSE_ANY
|
||||
};
|
||||
|
||||
const saul_driver_t si114x_visible_saul_driver = {
|
||||
.read = read_visible,
|
||||
.write = saul_notsup,
|
||||
.type = SAUL_SENSE_ANY
|
||||
};
|
||||
|
||||
const saul_driver_t si114x_distance_saul_driver = {
|
||||
.read = read_distance,
|
||||
.write = saul_notsup,
|
||||
.type = SAUL_SENSE_ANY
|
||||
};
|
@ -93,6 +93,11 @@ PSEUDOMODULES += adc121c
|
||||
PSEUDOMODULES += sx1272
|
||||
PSEUDOMODULES += sx1276
|
||||
|
||||
# include variants of Si114x drivers as pseudo modules
|
||||
PSEUDOMODULES += si1145
|
||||
PSEUDOMODULES += si1146
|
||||
PSEUDOMODULES += si1147
|
||||
|
||||
# include variants of Si70xx drivers as pseudo modules
|
||||
PSEUDOMODULES += si7006
|
||||
PSEUDOMODULES += si7013
|
||||
|
Loading…
Reference in New Issue
Block a user