/* * Copyright (c) 2024 Gustavo Silva * * SPDX-License-Identifier: Apache-2.0 */ #define DT_DRV_COMPAT sciosense_ens160 #include #include "ens160.h" LOG_MODULE_DECLARE(ENS160, CONFIG_SENSOR_LOG_LEVEL); #if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) #define ENS160_SPI_READ_BIT BIT(0) static int ens160_read_reg_spi(const struct device *dev, uint8_t reg, uint8_t *val) { const struct ens160_config *config = dev->config; uint8_t tx_buffer = (reg << 1) | ENS160_SPI_READ_BIT; const struct spi_buf tx_buf = { .buf = &tx_buffer, .len = 1, }; const struct spi_buf_set tx = { .buffers = &tx_buf, .count = 1, }; struct spi_buf rx_buf[2] = { { .buf = NULL, .len = 1, }, { .buf = val, .len = 1, } }; const struct spi_buf_set rx = { .buffers = rx_buf, .count = 2, }; return spi_transceive_dt(&config->spi, &tx, &rx); } static int ens160_read_data_spi(const struct device *dev, uint8_t start, uint8_t *data, size_t len) { const struct ens160_config *config = dev->config; uint8_t tx_buffer = (start << 1) | ENS160_SPI_READ_BIT; const struct spi_buf tx_buf = { .buf = &tx_buffer, .len = 1, }; const struct spi_buf_set tx = { .buffers = &tx_buf, .count = 1, }; struct spi_buf rx_buf[2] = { { .buf = NULL, .len = 1, }, { .buf = data, .len = len, } }; const struct spi_buf_set rx = { .buffers = rx_buf, .count = 2, }; return spi_transceive_dt(&config->spi, &tx, &rx); } static int ens160_write_reg_spi(const struct device *dev, uint8_t reg, uint8_t val) { const struct ens160_config *config = dev->config; uint8_t tx_buffer = reg << 1; const struct spi_buf buf[2] = { { .buf = &tx_buffer, .len = 1, }, { .buf = &val, .len = 1, } }; const struct spi_buf_set tx = { .buffers = buf, .count = 2, }; return spi_write_dt(&config->spi, &tx); } static int ens160_write_data_spi(const struct device *dev, uint8_t reg, uint8_t *data, size_t len) { const struct ens160_config *config = dev->config; uint8_t tx_buffer = reg << 1; const struct spi_buf buf[2] = { { .buf = &tx_buffer, .len = 1, }, { .buf = &data, .len = len, } }; const struct spi_buf_set tx = { .buffers = buf, .count = 2, }; return spi_write_dt(&config->spi, &tx); } const struct ens160_transfer_function ens160_spi_transfer_function = { .read_reg = ens160_read_reg_spi, .read_data = ens160_read_data_spi, .write_reg = ens160_write_reg_spi, .write_data = ens160_write_data_spi, }; int ens160_spi_init(const struct device *dev) { const struct ens160_config *config = dev->config; struct ens160_data *data = dev->data; if (!spi_is_ready_dt(&config->spi)) { LOG_DBG("SPI bus not ready"); return -ENODEV; } data->tf = &ens160_spi_transfer_function; return 0; } #endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */