drivers: adc: ltc2451: Add ltc2451 driver
Adds support for the Linear Technologies LTC2451 ADC. Signed-off-by: Ethan Duckett <ethan.duckett@brillpower.com>
This commit is contained in:
parent
dbed251249
commit
da4e3e713b
|
@ -47,3 +47,4 @@ zephyr_library_sources_ifdef(CONFIG_ADC_NXP_S32_ADC_SAR adc_nxp_s32_adc_sar.c)
|
|||
zephyr_library_sources_ifdef(CONFIG_ADC_MAX1125X adc_max1125x.c)
|
||||
zephyr_library_sources_ifdef(CONFIG_ADC_MAX11102_17 adc_max11102_17.c)
|
||||
zephyr_library_sources_ifdef(CONFIG_ADC_AD5592 adc_ad5592.c)
|
||||
zephyr_library_sources_ifdef(CONFIG_ADC_LTC2451 adc_ltc2451.c)
|
||||
|
|
|
@ -118,4 +118,6 @@ source "drivers/adc/Kconfig.max11102_17"
|
|||
|
||||
source "drivers/adc/Kconfig.ad5592"
|
||||
|
||||
source "drivers/adc/Kconfig.ltc2451"
|
||||
|
||||
endif # ADC
|
||||
|
|
8
drivers/adc/Kconfig.ltc2451
Normal file
8
drivers/adc/Kconfig.ltc2451
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Copyright (c) 2023 Brill Power
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
config ADC_LTC2451
|
||||
bool "LTC2451 driver"
|
||||
default y
|
||||
depends on DT_HAS_LLTC_LTC2451_ENABLED
|
||||
select I2C
|
105
drivers/adc/adc_ltc2451.c
Normal file
105
drivers/adc/adc_ltc2451.c
Normal file
|
@ -0,0 +1,105 @@
|
|||
/* LLTC LTC2451 ADC
|
||||
*
|
||||
* Copyright (c) 2023 Brill Power Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <zephyr/device.h>
|
||||
#include <zephyr/drivers/adc.h>
|
||||
#include <zephyr/drivers/i2c.h>
|
||||
#include <zephyr/logging/log.h>
|
||||
#include <zephyr/sys/byteorder.h>
|
||||
|
||||
LOG_MODULE_REGISTER(ltc2451, CONFIG_ADC_LOG_LEVEL);
|
||||
|
||||
#define DT_DRV_COMPAT lltc_ltc2451
|
||||
|
||||
struct ltc2451_config {
|
||||
struct i2c_dt_spec i2c;
|
||||
uint8_t conversion_speed;
|
||||
};
|
||||
|
||||
static int ltc2451_channel_setup(const struct device *dev,
|
||||
const struct adc_channel_cfg *channel_cfg)
|
||||
{
|
||||
ARG_UNUSED(dev);
|
||||
|
||||
if (channel_cfg->channel_id != 0) {
|
||||
LOG_ERR("Invalid channel id '%d'", channel_cfg->channel_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ltc2451_set_conversion_speed(const struct device *dev, uint8_t conversion_speed)
|
||||
{
|
||||
const struct ltc2451_config *config = dev->config;
|
||||
uint8_t wr_buf[1];
|
||||
int err;
|
||||
|
||||
if (conversion_speed == 60) {
|
||||
wr_buf[0] = 0;
|
||||
} else if (conversion_speed == 30) {
|
||||
wr_buf[0] = 1;
|
||||
} else {
|
||||
LOG_ERR("Invalid conversion speed selected");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
err = i2c_write_dt(&config->i2c, wr_buf, sizeof(wr_buf));
|
||||
|
||||
if (err != 0) {
|
||||
LOG_ERR("LTC write failed (err %d)", err);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ltc2451_read_latest_conversion(const struct device *dev,
|
||||
const struct adc_sequence *sequence)
|
||||
{
|
||||
const struct ltc2451_config *config = dev->config;
|
||||
uint8_t rd_buf[2];
|
||||
uint16_t *value_buf;
|
||||
int err = i2c_read_dt(&config->i2c, rd_buf, sizeof(rd_buf));
|
||||
|
||||
if (err == 0) {
|
||||
value_buf = (uint16_t *)sequence->buffer;
|
||||
value_buf[0] = sys_get_be16(rd_buf);
|
||||
} else {
|
||||
LOG_ERR("LTC read failed (err %d)", err);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ltc2451_init(const struct device *dev)
|
||||
{
|
||||
const struct ltc2451_config *config = dev->config;
|
||||
|
||||
if (!device_is_ready(config->i2c.bus)) {
|
||||
LOG_ERR("I2C device not ready");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return ltc2451_set_conversion_speed(dev, config->conversion_speed);
|
||||
}
|
||||
|
||||
static const struct adc_driver_api ltc2451_api = {
|
||||
.channel_setup = ltc2451_channel_setup,
|
||||
.read = ltc2451_read_latest_conversion,
|
||||
};
|
||||
|
||||
#define LTC2451_DEFINE(index) \
|
||||
static const struct ltc2451_config ltc2451_cfg_##index = { \
|
||||
.i2c = I2C_DT_SPEC_INST_GET(index), \
|
||||
.conversion_speed = DT_INST_PROP(index, conversion_speed), \
|
||||
}; \
|
||||
\
|
||||
DEVICE_DT_INST_DEFINE(index, <c2451_init, NULL, NULL, \
|
||||
<c2451_cfg_##index, POST_KERNEL, CONFIG_ADC_INIT_PRIORITY, \
|
||||
<c2451_api);
|
||||
|
||||
DT_INST_FOREACH_STATUS_OKAY(LTC2451_DEFINE)
|
16
dts/bindings/adc/lltc,ltc2451.yaml
Normal file
16
dts/bindings/adc/lltc,ltc2451.yaml
Normal file
|
@ -0,0 +1,16 @@
|
|||
# Copyright (c) 2023 Brill Power Ltd. All Rights Reserved.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
description: Linear Technology LTC2451 ADC
|
||||
|
||||
compatible: "lltc,ltc2451"
|
||||
|
||||
include: i2c-device.yaml
|
||||
|
||||
properties:
|
||||
conversion-speed:
|
||||
type: int
|
||||
enum:
|
||||
- 30
|
||||
- 60
|
||||
description: Set conversion speed in Hz
|
|
@ -87,6 +87,13 @@
|
|||
reg = <0x7>;
|
||||
#io-channel-cells = <1>;
|
||||
};
|
||||
|
||||
test_i2c_ltc2451: ltc2451@8{
|
||||
compatible = "lltc,ltc2451";
|
||||
reg = <0x8>;
|
||||
conversion-speed = <60>;
|
||||
#io-channel-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
test_spi: spi@33334444 {
|
||||
|
|
|
@ -18,6 +18,7 @@ tests:
|
|||
- adc_ads114s08
|
||||
- adc_emul
|
||||
- adc_max1125x
|
||||
- adc_ltc2451
|
||||
extra_args: "CONFIG_GPIO=y"
|
||||
drivers.adc.cc32xx.build:
|
||||
platform_allow: cc3220sf_launchxl
|
||||
|
|
Loading…
Reference in a new issue