drivers: sensor: ccs811: Update driver to use i2c_dt_spec
Simplify driver by using i2c_dt_spec for bus access. Signed-off-by: Benjamin Björnsson <benjamin.bjornsson@gmail.com>
This commit is contained in:
parent
15aefccf17
commit
3ac870b03b
2 changed files with 48 additions and 54 deletions
|
@ -46,12 +46,11 @@ static void set_wake(const struct device *dev, bool enable)
|
||||||
*/
|
*/
|
||||||
static int fetch_status(const struct device *dev)
|
static int fetch_status(const struct device *dev)
|
||||||
{
|
{
|
||||||
struct ccs811_data *drv_data = dev->data;
|
const struct ccs811_config *config = dev->config;
|
||||||
uint8_t status;
|
uint8_t status;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
if (i2c_reg_read_byte(drv_data->i2c, DT_INST_REG_ADDR(0),
|
if (i2c_reg_read_byte_dt(&config->i2c, CCS811_REG_STATUS, &status) < 0) {
|
||||||
CCS811_REG_STATUS, &status) < 0) {
|
|
||||||
LOG_ERR("Failed to read Status register");
|
LOG_ERR("Failed to read Status register");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
@ -60,8 +59,7 @@ static int fetch_status(const struct device *dev)
|
||||||
if (status & CCS811_STATUS_ERROR) {
|
if (status & CCS811_STATUS_ERROR) {
|
||||||
uint8_t error_id;
|
uint8_t error_id;
|
||||||
|
|
||||||
if (i2c_reg_read_byte(drv_data->i2c, DT_INST_REG_ADDR(0),
|
if (i2c_reg_read_byte_dt(&config->i2c, CCS811_REG_ERROR_ID, &error_id) < 0) {
|
||||||
CCS811_REG_ERROR_ID, &error_id) < 0) {
|
|
||||||
LOG_ERR("Failed to read ERROR_ID register");
|
LOG_ERR("Failed to read ERROR_ID register");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
@ -88,6 +86,7 @@ int ccs811_configver_fetch(const struct device *dev,
|
||||||
struct ccs811_configver_type *ptr)
|
struct ccs811_configver_type *ptr)
|
||||||
{
|
{
|
||||||
struct ccs811_data *drv_data = dev->data;
|
struct ccs811_data *drv_data = dev->data;
|
||||||
|
const struct ccs811_config *config = dev->config;
|
||||||
uint8_t cmd;
|
uint8_t cmd;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
@ -97,24 +96,21 @@ int ccs811_configver_fetch(const struct device *dev,
|
||||||
|
|
||||||
set_wake(dev, true);
|
set_wake(dev, true);
|
||||||
cmd = CCS811_REG_HW_VERSION;
|
cmd = CCS811_REG_HW_VERSION;
|
||||||
rc = i2c_write_read(drv_data->i2c, DT_INST_REG_ADDR(0),
|
rc = i2c_write_read_dt(&config->i2c, &cmd, sizeof(cmd), &ptr->hw_version,
|
||||||
&cmd, sizeof(cmd),
|
sizeof(ptr->hw_version));
|
||||||
&ptr->hw_version, sizeof(ptr->hw_version));
|
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
cmd = CCS811_REG_FW_BOOT_VERSION;
|
cmd = CCS811_REG_FW_BOOT_VERSION;
|
||||||
rc = i2c_write_read(drv_data->i2c, DT_INST_REG_ADDR(0),
|
rc = i2c_write_read_dt(&config->i2c, &cmd, sizeof(cmd),
|
||||||
&cmd, sizeof(cmd),
|
(uint8_t *)&ptr->fw_boot_version,
|
||||||
(uint8_t *)&ptr->fw_boot_version,
|
sizeof(ptr->fw_boot_version));
|
||||||
sizeof(ptr->fw_boot_version));
|
|
||||||
ptr->fw_boot_version = sys_be16_to_cpu(ptr->fw_boot_version);
|
ptr->fw_boot_version = sys_be16_to_cpu(ptr->fw_boot_version);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
cmd = CCS811_REG_FW_APP_VERSION;
|
cmd = CCS811_REG_FW_APP_VERSION;
|
||||||
rc = i2c_write_read(drv_data->i2c, DT_INST_REG_ADDR(0),
|
rc = i2c_write_read_dt(&config->i2c, &cmd, sizeof(cmd),
|
||||||
&cmd, sizeof(cmd),
|
(uint8_t *)&ptr->fw_app_version,
|
||||||
(uint8_t *)&ptr->fw_app_version,
|
sizeof(ptr->fw_app_version));
|
||||||
sizeof(ptr->fw_app_version));
|
|
||||||
ptr->fw_app_version = sys_be16_to_cpu(ptr->fw_app_version);
|
ptr->fw_app_version = sys_be16_to_cpu(ptr->fw_app_version);
|
||||||
}
|
}
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
|
@ -132,15 +128,14 @@ int ccs811_configver_fetch(const struct device *dev,
|
||||||
int ccs811_baseline_fetch(const struct device *dev)
|
int ccs811_baseline_fetch(const struct device *dev)
|
||||||
{
|
{
|
||||||
const uint8_t cmd = CCS811_REG_BASELINE;
|
const uint8_t cmd = CCS811_REG_BASELINE;
|
||||||
struct ccs811_data *drv_data = dev->data;
|
const struct ccs811_config *config = dev->config;
|
||||||
int rc;
|
int rc;
|
||||||
uint16_t baseline;
|
uint16_t baseline;
|
||||||
|
|
||||||
set_wake(dev, true);
|
set_wake(dev, true);
|
||||||
|
|
||||||
rc = i2c_write_read(drv_data->i2c, DT_INST_REG_ADDR(0),
|
rc = i2c_write_read_dt(&config->i2c, &cmd, sizeof(cmd), (uint8_t *)&baseline,
|
||||||
&cmd, sizeof(cmd),
|
sizeof(baseline));
|
||||||
(uint8_t *)&baseline, sizeof(baseline));
|
|
||||||
set_wake(dev, false);
|
set_wake(dev, false);
|
||||||
if (rc <= 0) {
|
if (rc <= 0) {
|
||||||
rc = baseline;
|
rc = baseline;
|
||||||
|
@ -152,14 +147,14 @@ int ccs811_baseline_fetch(const struct device *dev)
|
||||||
int ccs811_baseline_update(const struct device *dev,
|
int ccs811_baseline_update(const struct device *dev,
|
||||||
uint16_t baseline)
|
uint16_t baseline)
|
||||||
{
|
{
|
||||||
struct ccs811_data *drv_data = dev->data;
|
const struct ccs811_config *config = dev->config;
|
||||||
uint8_t buf[1 + sizeof(baseline)];
|
uint8_t buf[1 + sizeof(baseline)];
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
buf[0] = CCS811_REG_BASELINE;
|
buf[0] = CCS811_REG_BASELINE;
|
||||||
memcpy(buf + 1, &baseline, sizeof(baseline));
|
memcpy(buf + 1, &baseline, sizeof(baseline));
|
||||||
set_wake(dev, true);
|
set_wake(dev, true);
|
||||||
rc = i2c_write(drv_data->i2c, buf, sizeof(buf), DT_INST_REG_ADDR(0));
|
rc = i2c_write_dt(&config->i2c, buf, sizeof(buf));
|
||||||
set_wake(dev, false);
|
set_wake(dev, false);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -168,7 +163,7 @@ int ccs811_envdata_update(const struct device *dev,
|
||||||
const struct sensor_value *temperature,
|
const struct sensor_value *temperature,
|
||||||
const struct sensor_value *humidity)
|
const struct sensor_value *humidity)
|
||||||
{
|
{
|
||||||
struct ccs811_data *drv_data = dev->data;
|
const struct ccs811_config *config = dev->config;
|
||||||
int rc;
|
int rc;
|
||||||
uint8_t buf[5] = { CCS811_REG_ENV_DATA };
|
uint8_t buf[5] = { CCS811_REG_ENV_DATA };
|
||||||
|
|
||||||
|
@ -227,7 +222,7 @@ int ccs811_envdata_update(const struct device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
set_wake(dev, true);
|
set_wake(dev, true);
|
||||||
rc = i2c_write(drv_data->i2c, buf, sizeof(buf), DT_INST_REG_ADDR(0));
|
rc = i2c_write_dt(&config->i2c, buf, sizeof(buf));
|
||||||
set_wake(dev, false);
|
set_wake(dev, false);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -236,6 +231,7 @@ static int ccs811_sample_fetch(const struct device *dev,
|
||||||
enum sensor_channel chan)
|
enum sensor_channel chan)
|
||||||
{
|
{
|
||||||
struct ccs811_data *drv_data = dev->data;
|
struct ccs811_data *drv_data = dev->data;
|
||||||
|
const struct ccs811_config *config = dev->config;
|
||||||
struct ccs811_result_type *rp = &drv_data->result;
|
struct ccs811_result_type *rp = &drv_data->result;
|
||||||
const uint8_t cmd = CCS811_REG_ALG_RESULT_DATA;
|
const uint8_t cmd = CCS811_REG_ALG_RESULT_DATA;
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -243,9 +239,7 @@ static int ccs811_sample_fetch(const struct device *dev,
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
|
|
||||||
set_wake(dev, true);
|
set_wake(dev, true);
|
||||||
rc = i2c_write_read(drv_data->i2c, DT_INST_REG_ADDR(0),
|
rc = i2c_write_read_dt(&config->i2c, &cmd, sizeof(cmd), (uint8_t *)buf, sizeof(buf));
|
||||||
&cmd, sizeof(cmd),
|
|
||||||
(uint8_t *)buf, sizeof(buf));
|
|
||||||
set_wake(dev, false);
|
set_wake(dev, false);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
@ -328,7 +322,7 @@ static const struct sensor_driver_api ccs811_driver_api = {
|
||||||
|
|
||||||
static int switch_to_app_mode(const struct device *dev)
|
static int switch_to_app_mode(const struct device *dev)
|
||||||
{
|
{
|
||||||
struct ccs811_data *drv_data = dev->data;
|
const struct ccs811_config *config = dev->config;
|
||||||
uint8_t buf;
|
uint8_t buf;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
@ -353,7 +347,7 @@ static int switch_to_app_mode(const struct device *dev)
|
||||||
|
|
||||||
buf = CCS811_REG_APP_START;
|
buf = CCS811_REG_APP_START;
|
||||||
/* Set the device to application mode */
|
/* Set the device to application mode */
|
||||||
if (i2c_write(drv_data->i2c, &buf, 1, DT_INST_REG_ADDR(0)) < 0) {
|
if (i2c_write_dt(&config->i2c, &buf, 1) < 0) {
|
||||||
LOG_ERR("Failed to set Application mode");
|
LOG_ERR("Failed to set Application mode");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
@ -382,6 +376,7 @@ int ccs811_mutate_meas_mode(const struct device *dev,
|
||||||
uint8_t clear)
|
uint8_t clear)
|
||||||
{
|
{
|
||||||
struct ccs811_data *drv_data = dev->data;
|
struct ccs811_data *drv_data = dev->data;
|
||||||
|
const struct ccs811_config *config = dev->config;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
uint8_t mode = set | (drv_data->mode & ~clear);
|
uint8_t mode = set | (drv_data->mode & ~clear);
|
||||||
|
|
||||||
|
@ -395,9 +390,7 @@ int ccs811_mutate_meas_mode(const struct device *dev,
|
||||||
|
|
||||||
if (mode != drv_data->mode) {
|
if (mode != drv_data->mode) {
|
||||||
set_wake(dev, true);
|
set_wake(dev, true);
|
||||||
rc = i2c_reg_write_byte(drv_data->i2c, DT_INST_REG_ADDR(0),
|
rc = i2c_reg_write_byte_dt(&config->i2c, CCS811_REG_MEAS_MODE, mode);
|
||||||
CCS811_REG_MEAS_MODE,
|
|
||||||
mode);
|
|
||||||
LOG_DBG("CCS811 meas mode change %02x to %02x got %d",
|
LOG_DBG("CCS811 meas mode change %02x to %02x got %d",
|
||||||
drv_data->mode, mode, rc);
|
drv_data->mode, mode, rc);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
|
@ -417,6 +410,7 @@ int ccs811_mutate_meas_mode(const struct device *dev,
|
||||||
int ccs811_set_thresholds(const struct device *dev)
|
int ccs811_set_thresholds(const struct device *dev)
|
||||||
{
|
{
|
||||||
struct ccs811_data *drv_data = dev->data;
|
struct ccs811_data *drv_data = dev->data;
|
||||||
|
const struct ccs811_config *config = dev->config;
|
||||||
const uint8_t buf[5] = {
|
const uint8_t buf[5] = {
|
||||||
CCS811_REG_THRESHOLDS,
|
CCS811_REG_THRESHOLDS,
|
||||||
drv_data->co2_l2m >> 8,
|
drv_data->co2_l2m >> 8,
|
||||||
|
@ -427,7 +421,7 @@ int ccs811_set_thresholds(const struct device *dev)
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
set_wake(dev, true);
|
set_wake(dev, true);
|
||||||
rc = i2c_write(drv_data->i2c, buf, sizeof(buf), DT_INST_REG_ADDR(0));
|
rc = i2c_write_dt(&config->i2c, buf, sizeof(buf));
|
||||||
set_wake(dev, false);
|
set_wake(dev, false);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -437,18 +431,16 @@ int ccs811_set_thresholds(const struct device *dev)
|
||||||
static int ccs811_init(const struct device *dev)
|
static int ccs811_init(const struct device *dev)
|
||||||
{
|
{
|
||||||
struct ccs811_data *drv_data = dev->data;
|
struct ccs811_data *drv_data = dev->data;
|
||||||
|
const struct ccs811_config *config = dev->config;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int status;
|
int status;
|
||||||
uint16_t fw_ver;
|
uint16_t fw_ver;
|
||||||
uint8_t cmd;
|
uint8_t cmd;
|
||||||
uint8_t hw_id;
|
uint8_t hw_id;
|
||||||
|
|
||||||
*drv_data = (struct ccs811_data){ 0 };
|
if (!device_is_ready(config->i2c.bus)) {
|
||||||
drv_data->i2c = device_get_binding(DT_INST_BUS_LABEL(0));
|
LOG_ERR("I2C bus device not ready");
|
||||||
if (drv_data->i2c == NULL) {
|
return -ENODEV;
|
||||||
LOG_ERR("Failed to get pointer to %s device!",
|
|
||||||
DT_INST_BUS_LABEL(0));
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DT_INST_NODE_HAS_PROP(0, wake_gpios)
|
#if DT_INST_NODE_HAS_PROP(0, wake_gpios)
|
||||||
|
@ -510,8 +502,7 @@ static int ccs811_init(const struct device *dev)
|
||||||
0xFF, 0x11, 0xE5, 0x72, 0x8A,
|
0xFF, 0x11, 0xE5, 0x72, 0x8A,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (i2c_write(drv_data->i2c, reset_seq, sizeof(reset_seq),
|
if (i2c_write_dt(&config->i2c, reset_seq, sizeof(reset_seq)) < 0) {
|
||||||
DT_INST_REG_ADDR(0)) < 0) {
|
|
||||||
LOG_ERR("Failed to issue SW reset");
|
LOG_ERR("Failed to issue SW reset");
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -527,8 +518,7 @@ static int ccs811_init(const struct device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check Hardware ID */
|
/* Check Hardware ID */
|
||||||
if (i2c_reg_read_byte(drv_data->i2c, DT_INST_REG_ADDR(0),
|
if (i2c_reg_read_byte_dt(&config->i2c, CCS811_REG_HW_ID, &hw_id) < 0) {
|
||||||
CCS811_REG_HW_ID, &hw_id) < 0) {
|
|
||||||
LOG_ERR("Failed to read Hardware ID register");
|
LOG_ERR("Failed to read Hardware ID register");
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -542,9 +532,7 @@ static int ccs811_init(const struct device *dev)
|
||||||
|
|
||||||
/* Check application firmware version (first byte) */
|
/* Check application firmware version (first byte) */
|
||||||
cmd = CCS811_REG_FW_APP_VERSION;
|
cmd = CCS811_REG_FW_APP_VERSION;
|
||||||
if (i2c_write_read(drv_data->i2c, DT_INST_REG_ADDR(0),
|
if (i2c_write_read_dt(&config->i2c, &cmd, sizeof(cmd), &fw_ver, sizeof(fw_ver)) < 0) {
|
||||||
&cmd, sizeof(cmd),
|
|
||||||
&fw_ver, sizeof(fw_ver)) < 0) {
|
|
||||||
LOG_ERR("Failed to read App Firmware Version register");
|
LOG_ERR("Failed to read App Firmware Version register");
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -564,9 +552,7 @@ static int ccs811_init(const struct device *dev)
|
||||||
#elif defined(CONFIG_CCS811_DRIVE_MODE_4)
|
#elif defined(CONFIG_CCS811_DRIVE_MODE_4)
|
||||||
meas_mode = CCS811_MODE_IAQ_250MSEC;
|
meas_mode = CCS811_MODE_IAQ_250MSEC;
|
||||||
#endif
|
#endif
|
||||||
if (i2c_reg_write_byte(drv_data->i2c, DT_INST_REG_ADDR(0),
|
if (i2c_reg_write_byte_dt(&config->i2c, CCS811_REG_MEAS_MODE, meas_mode) < 0) {
|
||||||
CCS811_REG_MEAS_MODE,
|
|
||||||
meas_mode) < 0) {
|
|
||||||
LOG_ERR("Failed to set Measurement mode");
|
LOG_ERR("Failed to set Measurement mode");
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -597,9 +583,13 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ccs811_data ccs811_driver;
|
static struct ccs811_data ccs811_data_inst;
|
||||||
|
|
||||||
|
static const struct ccs811_config ccs811_config_inst = {
|
||||||
|
.i2c = I2C_DT_SPEC_INST_GET(0),
|
||||||
|
};
|
||||||
|
|
||||||
DEVICE_DT_INST_DEFINE(0, ccs811_init, NULL,
|
DEVICE_DT_INST_DEFINE(0, ccs811_init, NULL,
|
||||||
&ccs811_driver, NULL,
|
&ccs811_data_inst, &ccs811_config_inst,
|
||||||
POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY,
|
POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY,
|
||||||
&ccs811_driver_api);
|
&ccs811_driver_api);
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#define ZEPHYR_DRIVERS_SENSOR_CCS811_CCS811_H_
|
#define ZEPHYR_DRIVERS_SENSOR_CCS811_CCS811_H_
|
||||||
|
|
||||||
#include <zephyr/device.h>
|
#include <zephyr/device.h>
|
||||||
|
#include <zephyr/drivers/i2c.h>
|
||||||
#include <zephyr/drivers/gpio.h>
|
#include <zephyr/drivers/gpio.h>
|
||||||
#include <zephyr/sys/util.h>
|
#include <zephyr/sys/util.h>
|
||||||
#include <zephyr/drivers/sensor/ccs811.h>
|
#include <zephyr/drivers/sensor/ccs811.h>
|
||||||
|
@ -48,7 +49,6 @@
|
||||||
#define CCS811_CO2_MAX_PPM 32767
|
#define CCS811_CO2_MAX_PPM 32767
|
||||||
|
|
||||||
struct ccs811_data {
|
struct ccs811_data {
|
||||||
const struct device *i2c;
|
|
||||||
#if DT_INST_NODE_HAS_PROP(0, irq_gpios)
|
#if DT_INST_NODE_HAS_PROP(0, irq_gpios)
|
||||||
const struct device *irq_gpio;
|
const struct device *irq_gpio;
|
||||||
#ifdef CONFIG_CCS811_TRIGGER
|
#ifdef CONFIG_CCS811_TRIGGER
|
||||||
|
@ -83,6 +83,10 @@ struct ccs811_data {
|
||||||
uint8_t app_fw_ver;
|
uint8_t app_fw_ver;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ccs811_config {
|
||||||
|
struct i2c_dt_spec i2c;
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_CCS811_TRIGGER
|
#ifdef CONFIG_CCS811_TRIGGER
|
||||||
|
|
||||||
int ccs811_mutate_meas_mode(const struct device *dev,
|
int ccs811_mutate_meas_mode(const struct device *dev,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue