sensor: bme280: convert to _dt_spec

Convert bme280 driver to use `spi_dt_spec` and `i2c_dt_spec`.

Signed-off-by: Jordan Yates <jordan.yates@data61.csiro.au>
This commit is contained in:
Jordan Yates 2021-08-07 14:06:18 +10:00 committed by Christopher Friedt
commit 757bb42d5f
4 changed files with 39 additions and 84 deletions

View file

@ -58,9 +58,8 @@ struct bme280_data {
}; };
struct bme280_config { struct bme280_config {
const struct device *bus; union bme280_bus bus;
const struct bme280_bus_io *bus_io; const struct bme280_bus_io *bus_io;
const union bme280_bus_config bus_config;
}; };
static inline struct bme280_data *to_data(const struct device *dev) static inline struct bme280_data *to_data(const struct device *dev)
@ -68,39 +67,27 @@ static inline struct bme280_data *to_data(const struct device *dev)
return dev->data; return dev->data;
} }
static inline const struct bme280_config *to_config(const struct device *dev)
{
return dev->config;
}
static inline const struct device *to_bus(const struct device *dev)
{
return to_config(dev)->bus;
}
static inline const union bme280_bus_config*
to_bus_config(const struct device *dev)
{
return &to_config(dev)->bus_config;
}
static inline int bme280_bus_check(const struct device *dev) static inline int bme280_bus_check(const struct device *dev)
{ {
return to_config(dev)->bus_io->check(to_bus(dev), to_bus_config(dev)); const struct bme280_config *cfg = dev->config;
return cfg->bus_io->check(&cfg->bus);
} }
static inline int bme280_reg_read(const struct device *dev, static inline int bme280_reg_read(const struct device *dev,
uint8_t start, uint8_t *buf, int size) uint8_t start, uint8_t *buf, int size)
{ {
return to_config(dev)->bus_io->read(to_bus(dev), to_bus_config(dev), const struct bme280_config *cfg = dev->config;
start, buf, size);
return cfg->bus_io->read(&cfg->bus, start, buf, size);
} }
static inline int bme280_reg_write(const struct device *dev, uint8_t reg, static inline int bme280_reg_write(const struct device *dev, uint8_t reg,
uint8_t val) uint8_t val)
{ {
return to_config(dev)->bus_io->write(to_bus(dev), to_bus_config(dev), const struct bme280_config *cfg = dev->config;
reg, val);
return cfg->bus_io->write(&cfg->bus, reg, val);
} }
/* /*
@ -340,9 +327,6 @@ static int bme280_chip_init(const struct device *dev)
struct bme280_data *data = to_data(dev); struct bme280_data *data = to_data(dev);
int err; int err;
LOG_DBG("initializing \"%s\" on bus \"%s\"",
dev->name, to_bus(dev)->name);
err = bme280_bus_check(dev); err = bme280_bus_check(dev);
if (err < 0) { if (err < 0) {
LOG_DBG("bus check failed: %d", err); LOG_DBG("bus check failed: %d", err);
@ -440,20 +424,16 @@ int bme280_pm_ctrl(const struct device *dev, enum pm_device_action action)
/* Initializes a struct bme280_config for an instance on a SPI bus. */ /* Initializes a struct bme280_config for an instance on a SPI bus. */
#define BME280_CONFIG_SPI(inst) \ #define BME280_CONFIG_SPI(inst) \
{ \ { \
.bus = DEVICE_DT_GET(DT_INST_BUS(inst)), \ .bus.spi = SPI_DT_SPEC_INST_GET( \
inst, BME280_SPI_OPERATION, 0), \
.bus_io = &bme280_bus_io_spi, \ .bus_io = &bme280_bus_io_spi, \
.bus_config.spi_cfg = \
SPI_CONFIG_DT_INST(inst, \
BME280_SPI_OPERATION, \
0), \
} }
/* Initializes a struct bme280_config for an instance on an I2C bus. */ /* Initializes a struct bme280_config for an instance on an I2C bus. */
#define BME280_CONFIG_I2C(inst) \ #define BME280_CONFIG_I2C(inst) \
{ \ { \
.bus = DEVICE_DT_GET(DT_INST_BUS(inst)), \ .bus.i2c = I2C_DT_SPEC_INST_GET(inst), \
.bus_io = &bme280_bus_io_i2c, \ .bus_io = &bme280_bus_io_i2c, \
.bus_config.i2c_addr = DT_INST_REG_ADDR(inst), \
} }
/* /*

View file

@ -20,22 +20,19 @@
#define BME280_BUS_SPI DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) #define BME280_BUS_SPI DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
#define BME280_BUS_I2C DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c) #define BME280_BUS_I2C DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c)
union bme280_bus_config { union bme280_bus {
#if BME280_BUS_SPI #if BME280_BUS_SPI
struct spi_config spi_cfg; struct spi_dt_spec spi;
#endif #endif
#if BME280_BUS_I2C #if BME280_BUS_I2C
uint16_t i2c_addr; struct i2c_dt_spec i2c;
#endif #endif
}; };
typedef int (*bme280_bus_check_fn)(const struct device *bus, typedef int (*bme280_bus_check_fn)(const union bme280_bus *bus);
const union bme280_bus_config *bus_config); typedef int (*bme280_reg_read_fn)(const union bme280_bus *bus,
typedef int (*bme280_reg_read_fn)(const struct device *bus,
const union bme280_bus_config *bus_config,
uint8_t start, uint8_t *buf, int size); uint8_t start, uint8_t *buf, int size);
typedef int (*bme280_reg_write_fn)(const struct device *bus, typedef int (*bme280_reg_write_fn)(const union bme280_bus *bus,
const union bme280_bus_config *bus_config,
uint8_t reg, uint8_t val); uint8_t reg, uint8_t val);
struct bme280_bus_io { struct bme280_bus_io {

View file

@ -13,26 +13,21 @@
#include "bme280.h" #include "bme280.h"
#if BME280_BUS_I2C #if BME280_BUS_I2C
static int bme280_bus_check_i2c(const struct device *bus, static int bme280_bus_check_i2c(const union bme280_bus *bus)
const union bme280_bus_config *bus_config)
{ {
return device_is_ready(bus) ? 0 : -ENODEV; return device_is_ready(bus->i2c.bus) ? 0 : -ENODEV;
} }
static int bme280_reg_read_i2c(const struct device *bus, static int bme280_reg_read_i2c(const union bme280_bus *bus,
const union bme280_bus_config *bus_config,
uint8_t start, uint8_t *buf, int size) uint8_t start, uint8_t *buf, int size)
{ {
return i2c_burst_read(bus, bus_config->i2c_addr, return i2c_burst_read_dt(&bus->i2c, start, buf, size);
start, buf, size);
} }
static int bme280_reg_write_i2c(const struct device *bus, static int bme280_reg_write_i2c(const union bme280_bus *bus,
const union bme280_bus_config *bus_config,
uint8_t reg, uint8_t val) uint8_t reg, uint8_t val)
{ {
return i2c_reg_write_byte(bus, bus_config->i2c_addr, return i2c_reg_write_byte_dt(&bus->i2c, reg, val);
reg, val);
} }
const struct bme280_bus_io bme280_bus_io_i2c = { const struct bme280_bus_io bme280_bus_io_i2c = {

View file

@ -17,28 +17,12 @@
LOG_MODULE_DECLARE(BME280, CONFIG_SENSOR_LOG_LEVEL); LOG_MODULE_DECLARE(BME280, CONFIG_SENSOR_LOG_LEVEL);
static int bme280_bus_check_spi(const struct device *bus, static int bme280_bus_check_spi(const union bme280_bus *bus)
const union bme280_bus_config *bus_config)
{ {
const struct spi_cs_control *cs; return spi_is_ready(&bus->spi) ? 0 : -ENODEV;
if (!device_is_ready(bus)) {
LOG_DBG("SPI bus %s not ready", bus->name);
return -ENODEV;
}
cs = bus_config->spi_cfg.cs;
if (cs && !device_is_ready(cs->gpio_dev)) {
LOG_DBG("SPI CS GPIO controller %s not ready",
cs->gpio_dev->name);
return -ENODEV;
}
return 0;
} }
static int bme280_reg_read_spi(const struct device *bus, static int bme280_reg_read_spi(const union bme280_bus *bus,
const union bme280_bus_config *bus_config,
uint8_t start, uint8_t *buf, int size) uint8_t start, uint8_t *buf, int size)
{ {
uint8_t addr; uint8_t addr;
@ -68,7 +52,7 @@ static int bme280_reg_read_spi(const struct device *bus,
addr = (start + i) | 0x80; addr = (start + i) | 0x80;
rx_buf[1].buf = &buf[i]; rx_buf[1].buf = &buf[i];
ret = spi_transceive(bus, &bus_config->spi_cfg, &tx, &rx); ret = spi_transceive_dt(&bus->spi, &tx, &rx);
if (ret) { if (ret) {
LOG_DBG("spi_transceive FAIL %d\n", ret); LOG_DBG("spi_transceive FAIL %d\n", ret);
return ret; return ret;
@ -78,8 +62,7 @@ static int bme280_reg_read_spi(const struct device *bus,
return 0; return 0;
} }
static int bme280_reg_write_spi(const struct device *bus, static int bme280_reg_write_spi(const union bme280_bus *bus,
const union bme280_bus_config *bus_config,
uint8_t reg, uint8_t val) uint8_t reg, uint8_t val)
{ {
uint8_t cmd[] = { reg & 0x7F, val }; uint8_t cmd[] = { reg & 0x7F, val };
@ -93,7 +76,7 @@ static int bme280_reg_write_spi(const struct device *bus,
}; };
int ret; int ret;
ret = spi_write(bus, &bus_config->spi_cfg, &tx); ret = spi_write_dt(&bus->spi, &tx);
if (ret) { if (ret) {
LOG_DBG("spi_write FAIL %d\n", ret); LOG_DBG("spi_write FAIL %d\n", ret);
return ret; return ret;