sensor: sht3xd: convert to i2c_dt_spec

Convert sht3xd driver to `struct i2c_dt_spec` as a demonstration.

Signed-off-by: Jordan Yates <jordan.yates@data61.csiro.au>
This commit is contained in:
Jordan Yates 2021-08-01 20:27:22 +10:00 committed by Anas Nashif
commit 6cf6d515b1
2 changed files with 21 additions and 45 deletions

View file

@ -52,31 +52,30 @@ static uint8_t sht3xd_compute_crc(uint16_t value)
int sht3xd_write_command(const struct device *dev, uint16_t cmd) int sht3xd_write_command(const struct device *dev, uint16_t cmd)
{ {
const struct sht3xd_config *config = dev->config;
uint8_t tx_buf[2]; uint8_t tx_buf[2];
sys_put_be16(cmd, tx_buf); sys_put_be16(cmd, tx_buf);
return i2c_write(sht3xd_i2c_device(dev), tx_buf, sizeof(tx_buf), return i2c_write_dt(&config->bus, tx_buf, sizeof(tx_buf));
sht3xd_i2c_address(dev));
} }
int sht3xd_write_reg(const struct device *dev, uint16_t cmd, uint16_t val) int sht3xd_write_reg(const struct device *dev, uint16_t cmd, uint16_t val)
{ {
const struct sht3xd_config *config = dev->config;
uint8_t tx_buf[5]; uint8_t tx_buf[5];
sys_put_be16(cmd, &tx_buf[0]); sys_put_be16(cmd, &tx_buf[0]);
sys_put_be16(val, &tx_buf[2]); sys_put_be16(val, &tx_buf[2]);
tx_buf[4] = sht3xd_compute_crc(val); tx_buf[4] = sht3xd_compute_crc(val);
return i2c_write(sht3xd_i2c_device(dev), tx_buf, sizeof(tx_buf), return i2c_write_dt(&config->bus, tx_buf, sizeof(tx_buf));
sht3xd_i2c_address(dev));
} }
static int sht3xd_sample_fetch(const struct device *dev, static int sht3xd_sample_fetch(const struct device *dev,
enum sensor_channel chan) enum sensor_channel chan)
{ {
const struct sht3xd_config *config = dev->config;
struct sht3xd_data *data = dev->data; struct sht3xd_data *data = dev->data;
const struct device *i2c = sht3xd_i2c_device(dev);
uint8_t address = sht3xd_i2c_address(dev);
uint8_t rx_buf[6]; uint8_t rx_buf[6];
uint16_t t_sample, rh_sample; uint16_t t_sample, rh_sample;
@ -92,7 +91,7 @@ static int sht3xd_sample_fetch(const struct device *dev,
} }
k_sleep(K_MSEC(measure_wait[SHT3XD_REPEATABILITY_IDX] / USEC_PER_MSEC)); k_sleep(K_MSEC(measure_wait[SHT3XD_REPEATABILITY_IDX] / USEC_PER_MSEC));
if (i2c_read(i2c, rx_buf, sizeof(rx_buf), address) < 0) { if (i2c_read_dt(&config->bus, rx_buf, sizeof(rx_buf)) < 0) {
LOG_DBG("Failed to read data sample!"); LOG_DBG("Failed to read data sample!");
return -EIO; return -EIO;
} }
@ -102,8 +101,8 @@ static int sht3xd_sample_fetch(const struct device *dev,
sys_put_be16(SHT3XD_CMD_FETCH, tx_buf); sys_put_be16(SHT3XD_CMD_FETCH, tx_buf);
if (i2c_write_read(i2c, address, tx_buf, sizeof(tx_buf), if (i2c_write_read_dt(&config->bus, tx_buf, sizeof(tx_buf),
rx_buf, sizeof(rx_buf)) < 0) { rx_buf, sizeof(rx_buf)) < 0) {
LOG_DBG("Failed to read data sample!"); LOG_DBG("Failed to read data sample!");
return -EIO; return -EIO;
} }
@ -167,22 +166,12 @@ static const struct sensor_driver_api sht3xd_driver_api = {
static int sht3xd_init(const struct device *dev) static int sht3xd_init(const struct device *dev)
{ {
struct sht3xd_data *data = dev->data;
const struct sht3xd_config *cfg = dev->config; const struct sht3xd_config *cfg = dev->config;
const struct device *i2c = device_get_binding(cfg->bus_name);
if (i2c == NULL) { if (!device_is_ready(cfg->bus.bus)) {
LOG_DBG("Failed to get pointer to %s device!", LOG_ERR("I2C bus %s is not ready!", cfg->bus.bus->name);
cfg->bus_name);
return -EINVAL; return -EINVAL;
} }
data->bus = i2c;
if (!cfg->base_address) {
LOG_DBG("No I2C address");
return -EINVAL;
}
data->dev = dev;
/* clear status register */ /* clear status register */
if (sht3xd_write_command(dev, SHT3XD_CMD_CLEAR_STATUS) < 0) { if (sht3xd_write_command(dev, SHT3XD_CMD_CLEAR_STATUS) < 0) {
@ -204,6 +193,9 @@ static int sht3xd_init(const struct device *dev)
k_busy_wait(measure_wait[SHT3XD_REPEATABILITY_IDX]); k_busy_wait(measure_wait[SHT3XD_REPEATABILITY_IDX]);
#endif #endif
#ifdef CONFIG_SHT3XD_TRIGGER #ifdef CONFIG_SHT3XD_TRIGGER
struct sht3xd_data *data = dev->data;
data->dev = dev;
if (sht3xd_init_interrupt(dev) < 0) { if (sht3xd_init_interrupt(dev) < 0) {
LOG_DBG("Failed to initialize interrupt"); LOG_DBG("Failed to initialize interrupt");
return -EIO; return -EIO;
@ -215,11 +207,10 @@ static int sht3xd_init(const struct device *dev)
struct sht3xd_data sht3xd0_driver; struct sht3xd_data sht3xd0_driver;
static const struct sht3xd_config sht3xd0_cfg = { static const struct sht3xd_config sht3xd0_cfg = {
.bus_name = DT_INST_BUS_LABEL(0), .bus = I2C_DT_SPEC_INST_GET(0),
#ifdef CONFIG_SHT3XD_TRIGGER #ifdef CONFIG_SHT3XD_TRIGGER
.alert_gpio_name = DT_INST_GPIO_LABEL(0, alert_gpios), .alert_gpio_name = DT_INST_GPIO_LABEL(0, alert_gpios),
#endif #endif
.base_address = DT_INST_REG_ADDR(0),
#ifdef CONFIG_SHT3XD_TRIGGER #ifdef CONFIG_SHT3XD_TRIGGER
.alert_pin = DT_INST_GPIO_PIN(0, alert_gpios), .alert_pin = DT_INST_GPIO_PIN(0, alert_gpios),
.alert_flags = DT_INST_GPIO_FLAGS(0, alert_gpios), .alert_flags = DT_INST_GPIO_FLAGS(0, alert_gpios),
@ -227,6 +218,6 @@ static const struct sht3xd_config sht3xd0_cfg = {
}; };
DEVICE_DT_INST_DEFINE(0, sht3xd_init, NULL, DEVICE_DT_INST_DEFINE(0, sht3xd_init, NULL,
&sht3xd0_driver, &sht3xd0_cfg, &sht3xd0_driver, &sht3xd0_cfg,
POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY,
&sht3xd_driver_api); &sht3xd_driver_api);

View file

@ -10,6 +10,7 @@
#include <device.h> #include <device.h>
#include <kernel.h> #include <kernel.h>
#include <drivers/gpio.h> #include <drivers/gpio.h>
#include <drivers/i2c.h>
#define SHT3XD_CMD_FETCH 0xE000 #define SHT3XD_CMD_FETCH 0xE000
#define SHT3XD_CMD_ART 0x2B32 #define SHT3XD_CMD_ART 0x2B32
@ -44,12 +45,12 @@
#define SHT3XD_CLEAR_STATUS_WAIT_USEC 1000 #define SHT3XD_CLEAR_STATUS_WAIT_USEC 1000
struct sht3xd_config { struct sht3xd_config {
char *bus_name; struct i2c_dt_spec bus;
#ifdef CONFIG_SHT3XD_TRIGGER #ifdef CONFIG_SHT3XD_TRIGGER
char *alert_gpio_name; char *alert_gpio_name;
#endif /* CONFIG_SHT3XD_TRIGGER */ #endif /* CONFIG_SHT3XD_TRIGGER */
uint8_t base_address;
#ifdef CONFIG_SHT3XD_TRIGGER #ifdef CONFIG_SHT3XD_TRIGGER
uint8_t alert_pin; uint8_t alert_pin;
uint8_t alert_flags; uint8_t alert_flags;
@ -57,13 +58,11 @@ struct sht3xd_config {
}; };
struct sht3xd_data { struct sht3xd_data {
const struct device *dev;
const struct device *bus;
uint16_t t_sample; uint16_t t_sample;
uint16_t rh_sample; uint16_t rh_sample;
#ifdef CONFIG_SHT3XD_TRIGGER #ifdef CONFIG_SHT3XD_TRIGGER
const struct device *dev;
const struct device *alert_gpio; const struct device *alert_gpio;
struct gpio_callback alert_cb; struct gpio_callback alert_cb;
@ -86,20 +85,6 @@ struct sht3xd_data {
#endif /* CONFIG_SHT3XD_TRIGGER */ #endif /* CONFIG_SHT3XD_TRIGGER */
}; };
static inline uint8_t sht3xd_i2c_address(const struct device *dev)
{
const struct sht3xd_config *dcp = dev->config;
return dcp->base_address;
}
static inline const struct device *sht3xd_i2c_device(const struct device *dev)
{
const struct sht3xd_data *ddp = dev->data;
return ddp->bus;
}
#ifdef CONFIG_SHT3XD_TRIGGER #ifdef CONFIG_SHT3XD_TRIGGER
int sht3xd_write_command(const struct device *dev, uint16_t cmd); int sht3xd_write_command(const struct device *dev, uint16_t cmd);