sensor: Add Silabs SI7055 support
Add support for the Silabs SI7055 temperature sensor Signed-off-by: Greg Leach <greg.leach@lairdconnect.com>
This commit is contained in:
parent
66f454acd4
commit
41da0769c1
8 changed files with 219 additions and 0 deletions
|
@ -61,6 +61,7 @@ add_subdirectory_ifdef(CONFIG_QDEC_NRFX qdec_nrfx)
|
|||
add_subdirectory_ifdef(CONFIG_TEMP_NRF5 nrf5)
|
||||
add_subdirectory_ifdef(CONFIG_SHT3XD sht3xd)
|
||||
add_subdirectory_ifdef(CONFIG_SI7006 si7006)
|
||||
add_subdirectory_ifdef(CONFIG_SI7055 si7055)
|
||||
add_subdirectory_ifdef(CONFIG_SI7060 si7060)
|
||||
add_subdirectory_ifdef(CONFIG_STTS751 stts751)
|
||||
add_subdirectory_ifdef(CONFIG_SX9500 sx9500)
|
||||
|
|
|
@ -161,6 +161,8 @@ source "drivers/sensor/sht3xd/Kconfig"
|
|||
|
||||
source "drivers/sensor/si7006/Kconfig"
|
||||
|
||||
source "drivers/sensor/si7055/Kconfig"
|
||||
|
||||
source "drivers/sensor/si7060/Kconfig"
|
||||
|
||||
source "drivers/sensor/stts751/Kconfig"
|
||||
|
|
5
drivers/sensor/si7055/CMakeLists.txt
Normal file
5
drivers/sensor/si7055/CMakeLists.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
zephyr_library()
|
||||
|
||||
zephyr_library_sources_ifdef(CONFIG_SI7055 si7055.c)
|
18
drivers/sensor/si7055/Kconfig
Normal file
18
drivers/sensor/si7055/Kconfig
Normal file
|
@ -0,0 +1,18 @@
|
|||
# Copyright (c) 2019 Electronut Labs
|
||||
# Copyright (c) 2020 Laird Connectivity
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
menuconfig SI7055
|
||||
bool "Si7055 Temperature Sensor"
|
||||
depends on (I2C && HAS_DTS_I2C)
|
||||
help
|
||||
Enable I2C-based driver for Si7055 Temperature Sensor.
|
||||
|
||||
if SI7055
|
||||
|
||||
config SI7055_ENABLE_CHECKSUM
|
||||
bool "SI7055 Checksum On Measurement"
|
||||
help
|
||||
Validates the additional checksum byte for temperature measurements.
|
||||
|
||||
endif # SI7055
|
149
drivers/sensor/si7055/si7055.c
Normal file
149
drivers/sensor/si7055/si7055.c
Normal file
|
@ -0,0 +1,149 @@
|
|||
/*
|
||||
* Copyright (c) 2020 Laird Connectivity
|
||||
* Copyright (c) 2019 Electronut Labs
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#define DT_DRV_COMPAT silabs_si7055
|
||||
|
||||
#include <drivers/sensor.h>
|
||||
#include <kernel.h>
|
||||
#include <device.h>
|
||||
#include <logging/log.h>
|
||||
#include <drivers/i2c.h>
|
||||
#include "si7055.h"
|
||||
#if CONFIG_SI7055_ENABLE_CHECKSUM
|
||||
#include <sys/crc.h>
|
||||
#endif
|
||||
|
||||
LOG_MODULE_REGISTER(si7055, CONFIG_SENSOR_LOG_LEVEL);
|
||||
|
||||
struct si7055_data {
|
||||
struct device *i2c_dev;
|
||||
uint16_t temperature;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief function to get temperature
|
||||
*
|
||||
* @return int 0 on success
|
||||
* -EIO for I/O and checksum errors
|
||||
*/
|
||||
static int si7055_get_temperature(struct device *i2c_dev,
|
||||
struct si7055_data *si_data)
|
||||
{
|
||||
int retval;
|
||||
#if CONFIG_SI7055_ENABLE_CHECKSUM
|
||||
uint8_t temp[SI7055_TEMPERATURE_READ_WITH_CHECKSUM_SIZE];
|
||||
#else
|
||||
uint8_t temp[SI7055_TEMPERATURE_READ_NO_CHECKSUM_SIZE];
|
||||
#endif
|
||||
|
||||
retval = i2c_burst_read(i2c_dev, DT_INST_REG_ADDR(0),
|
||||
SI7055_MEAS_TEMP_MASTER_MODE,
|
||||
temp, sizeof(temp));
|
||||
|
||||
/* Refer to
|
||||
* https://www.silabs.com/documents/public/data-sheets/Si7050-1-3-4-5-A20.pdf
|
||||
*/
|
||||
|
||||
if (retval == 0) {
|
||||
#if CONFIG_SI7055_ENABLE_CHECKSUM
|
||||
if (crc8(temp, SI7055_DATA_SIZE, SI7055_CRC_POLY,
|
||||
SI7055_CRC_INIT, false) != temp[SI7055_DATA_SIZE]){
|
||||
LOG_ERR("checksum failed.\n");
|
||||
return(-EIO);
|
||||
}
|
||||
#endif
|
||||
si_data->temperature = (temp[SI7055_TEMPERATURE_DATA_BYTE_0]
|
||||
<< 8) |
|
||||
temp[SI7055_TEMPERATURE_DATA_BYTE_1];
|
||||
} else {
|
||||
LOG_ERR("read register err");
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief fetch a sample from the sensor
|
||||
*
|
||||
* @return 0
|
||||
*/
|
||||
static int si7055_sample_fetch(struct device *dev, enum sensor_channel chan)
|
||||
{
|
||||
int retval;
|
||||
struct si7055_data *si_data = dev->driver_data;
|
||||
|
||||
retval = si7055_get_temperature(si_data->i2c_dev, si_data);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief sensor value get
|
||||
*
|
||||
* @return -ENOTSUP for unsupported channels
|
||||
*/
|
||||
static int si7055_channel_get(struct device *dev, enum sensor_channel chan,
|
||||
struct sensor_value *val)
|
||||
{
|
||||
struct si7055_data *si_data = dev->driver_data;
|
||||
|
||||
/* Refer to
|
||||
* https://www.silabs.com/documents/public/data-sheets/Si7050-1-3-4-5-A20.pdf
|
||||
*/
|
||||
|
||||
if (chan == SENSOR_CHAN_AMBIENT_TEMP) {
|
||||
|
||||
int32_t temp_ucelcius = (((SI7055_CONV_FACTOR_1 *
|
||||
(int32_t)si_data->temperature) /
|
||||
(__UINT16_MAX__ + 1)) -
|
||||
SI7055_CONV_FACTOR_2) *
|
||||
SI7055_MULTIPLIER;
|
||||
|
||||
val->val1 = temp_ucelcius / SI7055_DIVIDER;
|
||||
val->val2 = temp_ucelcius % SI7055_DIVIDER;
|
||||
|
||||
LOG_DBG("temperature = val1:%d, val2:%d",
|
||||
val->val1, val->val2);
|
||||
|
||||
return 0;
|
||||
} else {
|
||||
return -ENOTSUP;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct sensor_driver_api si7055_api = {
|
||||
.sample_fetch = &si7055_sample_fetch,
|
||||
.channel_get = &si7055_channel_get,
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief initialize the sensor
|
||||
*
|
||||
* @return 0 for success
|
||||
*/
|
||||
|
||||
static int si7055_init(struct device *dev)
|
||||
{
|
||||
struct si7055_data *drv_data = dev->driver_data;
|
||||
|
||||
drv_data->i2c_dev = device_get_binding(
|
||||
DT_INST_BUS_LABEL(0));
|
||||
|
||||
if (!drv_data->i2c_dev) {
|
||||
LOG_ERR("i2c master not found.");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
LOG_DBG("si7055 init ok");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct si7055_data si_data;
|
||||
|
||||
DEVICE_AND_API_INIT(si7055, DT_INST_LABEL(0), si7055_init,
|
||||
&si_data, NULL, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, &si7055_api);
|
37
drivers/sensor/si7055/si7055.h
Normal file
37
drivers/sensor/si7055/si7055.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Copyright (c) 2020 Laird Connectivity
|
||||
* Copyright (c) 2019 Electronut Labs
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef _SI7055_H
|
||||
#define _SI7055_H
|
||||
|
||||
/* Si7055 register addresses */
|
||||
#define SI7055_MEAS_TEMP_MASTER_MODE 0xE3
|
||||
#define SI7055_MEAS_TEMP_NO_MASTER_MODE 0xF3
|
||||
#define SI7055_RESET 0xFE
|
||||
#define SI7055_READ_ID_LOW_0 0xFA
|
||||
#define SI7055_READ_ID_LOW_1 0x0F
|
||||
#define SI7055_READ_ID_HIGH_0 0xFC
|
||||
#define SI7055_READ_ID_HIGH_1 0xC9
|
||||
#define SI7055_FIRMWARE_0 0x84
|
||||
#define SI7055_FIRMWARE_1 0xB8
|
||||
/* Si7055 temperature conversion factors and constants */
|
||||
#define SI7055_CONV_FACTOR_1 17572
|
||||
#define SI7055_CONV_FACTOR_2 4685
|
||||
#define SI7055_MULTIPLIER 10000
|
||||
#define SI7055_DIVIDER 1000000
|
||||
/* Si7055 buffer sizes and locations */
|
||||
#define SI7055_TEMPERATURE_READ_NO_CHECKSUM_SIZE 0x02
|
||||
#define SI7055_TEMPERATURE_READ_WITH_CHECKSUM_SIZE 0x03
|
||||
#define SI7055_TEMPERATURE_DATA_BYTE_0 0x0
|
||||
#define SI7055_TEMPERATURE_DATA_BYTE_1 0x1
|
||||
/* Si7055 Checksum constants */
|
||||
#define SI7055_CRC_POLY 0x31
|
||||
#define SI7055_CRC_SIZE sizeof(uint8_t)
|
||||
#define SI7055_CRC_INIT 0x0
|
||||
#define SI7055_DATA_SIZE (sizeof(uint8_t) * 2)
|
||||
|
||||
#endif /* _SI7055_H */
|
|
@ -267,6 +267,12 @@ test_i2c_si7006: si7006@24 {
|
|||
reg = <0x24>;
|
||||
};
|
||||
|
||||
test_i2c_si7055: si7055@40 {
|
||||
compatible = "silabs,si7055";
|
||||
label = "SI7055";
|
||||
reg = <0x40>;
|
||||
};
|
||||
|
||||
test_i2c_si7060: si7060@25 {
|
||||
compatible = "silabs,si7060";
|
||||
label = "SI7060";
|
||||
|
|
|
@ -30,6 +30,7 @@ CONFIG_MS5607=y
|
|||
CONFIG_OPT3001=y
|
||||
CONFIG_SHT3XD=y
|
||||
CONFIG_SI7006=y
|
||||
CONFIG_SI7055=y
|
||||
CONFIG_SI7060=y
|
||||
CONFIG_SX9500=y
|
||||
CONFIG_TEMP_NRF5=y
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue