Skip to content

Commit 634193a

Browse files
committed
drivers: adc: implement voltage biasing for ADS114s08
Implement voltage biasing on the inputs of the ADC ADS114s08. Signed-off-by: Benedikt Schmidt <benedikt.schmidt@embedded-solutions.at>
1 parent ba2a8bd commit 634193a

File tree

6 files changed

+65
-3
lines changed

6 files changed

+65
-3
lines changed

‎drivers/adc/Kconfig‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ config ADC_CONFIGURABLE_INPUTS
3333
config ADC_CONFIGURABLE_EXCITATION_CURRENT_SOURCE_PIN
3434
bool
3535

36+
# By selecting or not this option particular ADC drivers indicate if they
37+
# allow a configurable voltage bias pin.
38+
config ADC_CONFIGURABLE_VBIAS_PIN
39+
bool
40+
3641
config ADC_ASYNC
3742
bool "Asynchronous call support"
3843
select POLL

‎drivers/adc/Kconfig.ads114s0x‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ menuconfig ADC_ADS114S0X
99
select SPI
1010
select ADC_CONFIGURABLE_INPUTS
1111
select ADC_CONFIGURABLE_EXCITATION_CURRENT_SOURCE_PIN
12+
select ADC_CONFIGURABLE_VBIAS_PIN
1213
help
1314
Enable the driver implementation for the ADS114S0X family
1415

‎drivers/adc/adc_ads114s0x.c‎

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ LOG_MODULE_REGISTER(ads114s0x, CONFIG_ADC_LOG_LEVEL);
3232
#define ADS114S0X_REF_INTERNAL 2500
3333
#define ADS114S0X_GPIO_MAX 3
3434
#define ADS114S0X_POWER_ON_RESET_TIME_IN_US 2200
35+
#define ADS114S0X_VBIAS_PIN_MAX 7
36+
#define ADS114S0X_VBIAS_PIN_MIN 0
3537

3638
/* Not mentioned in the datasheet, but instead determined experimentally. */
3739
#define ADS114S0X_RESET_DELAY_TIME_SAFETY_MARGIN_IN_US 1000
@@ -317,6 +319,14 @@ enum ads114s0x_register {
317319
#define ADS114S0X_REGISTER_IDACMUX_I1MUX_SET(target, value) \
318320
ADS114S0X_REGISTER_SET_VALUE(target, value, ADS114S0X_REGISTER_IDACMUX_I1MUX_POS, \
319321
ADS114S0X_REGISTER_IDACMUX_I1MUX_LENGTH)
322+
#define ADS114S0X_REGISTER_VBIAS_VB_LEVEL_LENGTH 1
323+
#define ADS114S0X_REGISTER_VBIAS_VB_LEVEL_POS 7
324+
#define ADS114S0X_REGISTER_VBIAS_VB_LEVEL_GET(value) \
325+
ADS114S0X_REGISTER_GET_VALUE(value, ADS114S0X_REGISTER_VBIAS_VB_LEVEL_POS, \
326+
ADS114S0X_REGISTER_VBIAS_VB_LEVEL_LENGTH)
327+
#define ADS114S0X_REGISTER_VBIAS_VB_LEVEL_SET(target, value) \
328+
ADS114S0X_REGISTER_SET_VALUE(target, value, ADS114S0X_REGISTER_VBIAS_VB_LEVEL_POS, \
329+
ADS114S0X_REGISTER_VBIAS_VB_LEVEL_LENGTH)
320330
#define ADS114S0X_REGISTER_GPIODAT_DIR_LENGTH 4
321331
#define ADS114S0X_REGISTER_GPIODAT_DIR_POS 4
322332
#define ADS114S0X_REGISTER_GPIODAT_DIR_GET(value) \
@@ -410,6 +420,7 @@ struct ads114s0x_config {
410420
const struct gpio_dt_spec gpio_data_ready;
411421
const struct gpio_dt_spec gpio_start_sync;
412422
int idac_current;
423+
uint8_t vbias_level;
413424
};
414425

415426
struct ads114s0x_data {
@@ -597,9 +608,10 @@ static int ads114s0x_channel_setup(const struct device *dev,
597608
uint8_t idac_magnitude = 0;
598609
uint8_t idac_mux = 0;
599610
uint8_t pin_selections[4];
611+
uint8_t vbias = 0;
600612
size_t pin_selections_size;
601613
int result;
602-
enum ads114s0x_register register_addresses[6];
614+
enum ads114s0x_register register_addresses[7];
603615
uint8_t values[ARRAY_SIZE(register_addresses)];
604616
uint16_t acquisition_time_value = ADC_ACQ_TIME_VALUE(channel_cfg->acquisition_time);
605617
uint16_t acquisition_time_unit = ADC_ACQ_TIME_UNIT(channel_cfg->acquisition_time);
@@ -820,20 +832,33 @@ static int ads114s0x_channel_setup(const struct device *dev,
820832
}
821833
}
822834

835+
ADS114S0X_REGISTER_VBIAS_VB_LEVEL_SET(vbias, config->vbias_level);
836+
837+
if ((channel_cfg->vbias_pins &
838+
~GENMASK(ADS114S0X_VBIAS_PIN_MAX, ADS114S0X_VBIAS_PIN_MIN)) != 0) {
839+
LOG_ERR("%s: invalid VBIAS pin selection 0x%08X", dev->name,
840+
channel_cfg->vbias_pins);
841+
return -EINVAL;
842+
}
843+
844+
vbias |= channel_cfg->vbias_pins;
845+
823846
register_addresses[0] = ADS114S0X_REGISTER_INPMUX;
824847
register_addresses[1] = ADS114S0X_REGISTER_PGA;
825848
register_addresses[2] = ADS114S0X_REGISTER_DATARATE;
826849
register_addresses[3] = ADS114S0X_REGISTER_REF;
827850
register_addresses[4] = ADS114S0X_REGISTER_IDACMAG;
828851
register_addresses[5] = ADS114S0X_REGISTER_IDACMUX;
829-
BUILD_ASSERT(ARRAY_SIZE(register_addresses) == 6);
852+
register_addresses[6] = ADS114S0X_REGISTER_VBIAS;
853+
BUILD_ASSERT(ARRAY_SIZE(register_addresses) == 7);
830854
values[0] = input_mux;
831855
values[1] = gain;
832856
values[2] = data_rate;
833857
values[3] = reference_control;
834858
values[4] = idac_magnitude;
835859
values[5] = idac_mux;
836-
BUILD_ASSERT(ARRAY_SIZE(values) == 6);
860+
values[6] = vbias;
861+
BUILD_ASSERT(ARRAY_SIZE(values) == 7);
837862

838863
result = ads114s0x_write_multiple_registers(dev, register_addresses, values,
839864
ARRAY_SIZE(values));
@@ -1473,6 +1498,7 @@ BUILD_ASSERT(CONFIG_ADC_INIT_PRIORITY > CONFIG_SPI_INIT_PRIORITY,
14731498
.gpio_data_ready = GPIO_DT_SPEC_INST_GET(n, drdy_gpios), \
14741499
.gpio_start_sync = GPIO_DT_SPEC_INST_GET_OR(n, start_sync_gpios, {0}), \
14751500
.idac_current = DT_INST_PROP(n, idac_current), \
1501+
.vbias_level = DT_INST_PROP(n, vbias_level), \
14761502
}; \
14771503
static struct ads114s0x_data data_##n; \
14781504
DEVICE_DT_INST_DEFINE(n, ads114s0x_init, NULL, &data_##n, &config_##n, POST_KERNEL, \

‎dts/bindings/adc/adc-controller.yaml‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,10 @@ child-binding:
160160
interpretation depends on the driver. This is used only for drivers
161161
which select the ADC_CONFIGURABLE_EXCITATION_CURRENT_SOURCE_PIN
162162
Kconfig option.
163+
164+
zephyr,vbias-pins:
165+
type: int
166+
description: |
167+
Output pin selection for the bias voltage. The actual interpretation
168+
depends on the driver. This is used only for drivers which select
169+
the ADC_CONFIGURABLE_VBIAS_PIN Kconfig option.

‎dts/bindings/adc/ti,ads114s08.yaml‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,14 @@ properties:
4545
description: |
4646
IDAC current in microampere, the default value turns the current source off
4747
48+
vbias-level:
49+
type: int
50+
enum:
51+
- 0
52+
- 1
53+
default: 0
54+
description: |
55+
bias voltage level: 0 - (AVDD+AVSS)/2, 1 - (AVDD+AVSS)/12
56+
4857
io-channel-cells:
4958
- input

‎include/zephyr/drivers/adc.h‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,18 @@ struct adc_channel_cfg {
156156
*/
157157
uint8_t current_source_pin[2];
158158
#endif /* CONFIG_ADC_CONFIGURABLE_EXCITATION_CURRENT_SOURCE_PIN */
159+
160+
#ifdef CONFIG_ADC_CONFIGURABLE_VBIAS_PIN
161+
/**
162+
* Output pins for the bias voltage.
163+
* This is only available if the driver enables this feature
164+
* via the hidden configuration option ADC_CONFIGURABLE_VBIAS_PIN.
165+
* The field is interpreted as a bitmask, where each bit represents
166+
* one of the input pins. The actual mapping to the physical pins
167+
* depends on the driver itself.
168+
*/
169+
uint32_t vbias_pins;
170+
#endif /* CONFIG_ADC_CONFIGURABLE_VBIAS_PIN */
159171
};
160172

161173
/**
@@ -236,6 +248,8 @@ IF_ENABLED(DT_PROP(node_id, zephyr_differential), \
236248
IF_ENABLED(CONFIG_ADC_CONFIGURABLE_EXCITATION_CURRENT_SOURCE_PIN, \
237249
(.current_source_pin_set = DT_NODE_HAS_PROP(node_id, zephyr_current_source_pin), \
238250
.current_source_pin = DT_PROP_OR(node_id, zephyr_current_source_pin, {0}),)) \
251+
IF_ENABLED(CONFIG_ADC_CONFIGURABLE_VBIAS_PIN, \
252+
(.vbias_pins = DT_PROP_OR(node_id, zephyr_vbias_pins, 0),)) \
239253
}
240254

241255
/**

0 commit comments

Comments
 (0)