@@ -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
415426struct 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, \
0 commit comments