Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

drivers: adc: ltc2451: Add ltc2451 driver #64390

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions drivers/adc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
2 changes: 2 additions & 0 deletions drivers/adc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,6 @@ source "drivers/adc/Kconfig.max11102_17"

source "drivers/adc/Kconfig.ad5592"

source "drivers/adc/Kconfig.ltc2451"

endif # ADC
8 changes: 8 additions & 0 deletions drivers/adc/Kconfig.ltc2451
Original file line number Diff line number Diff line change
@@ -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 changes: 105 additions & 0 deletions drivers/adc/adc_ltc2451.c
Original file line number Diff line number Diff line change
@@ -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;
bbilas marked this conversation as resolved.
Show resolved Hide resolved
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)) {
bbilas marked this conversation as resolved.
Show resolved Hide resolved
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), \
}; \
\
bbilas marked this conversation as resolved.
Show resolved Hide resolved
DEVICE_DT_INST_DEFINE(index, &ltc2451_init, NULL, NULL, \
&ltc2451_cfg_##index, POST_KERNEL, CONFIG_ADC_INIT_PRIORITY, \
&ltc2451_api);

DT_INST_FOREACH_STATUS_OKAY(LTC2451_DEFINE)
16 changes: 16 additions & 0 deletions dts/bindings/adc/lltc,ltc2451.yaml
Original file line number Diff line number Diff line change
@@ -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
7 changes: 7 additions & 0 deletions tests/drivers/build_all/adc/boards/native_posix.overlay
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
1 change: 1 addition & 0 deletions tests/drivers/build_all/adc/testcase.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading