Skip to content

Commit

Permalink
drivers:adc-dac:ad5592r: Driver Enhancement
Browse files Browse the repository at this point in the history
1. Added driver apis for reg updtae,adc range, dac range, power down,set
internal reference and set adc buffer to the base driver.
2. Added API to enable busy indicator on AD5592r
3. Removed static for spi nop API for visibilty.
4. Moved some macros from ad5593.c to header file for visibility.
5. Renamed start and stop macros.

Signed-off-by: Disha D <[email protected]>
  • Loading branch information
D-Disha authored and [email protected] committed Jan 27, 2025
1 parent 764a2a8 commit b2d8cdd
Show file tree
Hide file tree
Showing 6 changed files with 360 additions and 52 deletions.
173 changes: 172 additions & 1 deletion drivers/adc-dac/ad5592r/ad5592r-base.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* @brief Implementation of AD5592R Base Driver.
* @author Mircea Caprioru ([email protected])
********************************************************************************
* Copyright 2018, 2020(c) Analog Devices, Inc.
* Copyright 2018, 2020, 2025(c) Analog Devices, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
Expand Down Expand Up @@ -320,3 +320,174 @@ int32_t ad5592r_reset_channel_modes(struct ad5592r_dev *dev)

return ad5592r_set_channel_modes(dev);
}

/**
* Register update
*
* @param dev - The device structure.
* @param reg_addr - The Register address
* @param data - The data to be written
* @param mask - The mask
* @return 0 in case of success, negative error code otherwise
*/
int32_t ad5592r_base_reg_update(struct ad5592r_dev *dev, uint16_t reg_addr,
uint16_t data, uint16_t mask)
{

uint16_t temp_reg_val;
int32_t ret;

if (!dev)
return -1;

ret = ad5592r_base_reg_read(dev, reg_addr, &temp_reg_val);
if (ret < 0)
return ret;

temp_reg_val &= ~mask;
temp_reg_val |= data;

ret = ad5592r_base_reg_write(dev, reg_addr, temp_reg_val);
if (ret < 0)
return ret;

return 0;
}

/**
* Set ADC Range of the device
*
* @param dev - The device structure.
* @param adc_range - ADC Range
* @return 0 in case of success, negative error code otherwise
*/
int32_t ad5592r_set_adc_range(struct ad5592r_dev *dev,
enum ad559xr_range adc_range)
{
int32_t ret;
uint16_t status = 0;

if (!dev)
return -1;

status = adc_range ? AD5592R_REG_CTRL_ADC_RANGE : 0;

ret = ad5592r_base_reg_update(dev, AD5592R_REG_CTRL, status,
AD5592R_REG_CTRL_ADC_RANGE);
if (ret < 0)
return ret;

dev->adc_range = adc_range;

return 0;
}

/**
* Set DAC Range of the device
*
* @param dev - The device structure.
* @param dac_range - DAC Range
* @return 0 in case of success, negative error code otherwise
*/
int32_t ad5592r_set_dac_range(struct ad5592r_dev *dev,
enum ad559xr_range dac_range)
{
int32_t ret;
uint16_t status = 0;

if (!dev)
return -1;

status = dac_range ? AD5592R_REG_CTRL_DAC_RANGE : 0;

ret = ad5592r_base_reg_update(dev, AD5592R_REG_CTRL, status,
AD5592R_REG_CTRL_DAC_RANGE);
if (ret < 0)
return ret;

dev->dac_range = dac_range;

return 0;
}

/**
* Set Power Down DAC Channel of the device
*
* @param dev - The device structure.
* @param chan - The channel number.
* @param enable - Status to enable/disable power down.
* @return 0 in case of success, negative error code otherwise
*/
int32_t ad5592r_power_down(struct ad5592r_dev *dev, uint8_t chan, bool enable)
{
int ret;
uint16_t temp_reg_val = 0;

if (!dev)
return -1;

temp_reg_val = enable ? NO_OS_BIT(chan) : 0;

ret = ad5592r_base_reg_update(dev, AD5592R_REG_PD, temp_reg_val,
NO_OS_BIT(chan));
if (ret < 0)
return ret;

dev->power_down[chan] = enable;

return 0;
}

/**
* Set Reference Select option for the device
*
* @param dev - The device structure.
* @param enable - Status to enable/disable internal reference.
* @return 0 in case of success, negative error code otherwise
*/
int32_t ad5592r_set_int_ref(struct ad5592r_dev *dev, bool enable)
{
uint16_t temp_reg_val = 0;
int ret;

if (!dev)
return -1;

temp_reg_val = enable ? AD5592R_REG_PD_EN_REF : 0;

ret = ad5592r_base_reg_update(dev, AD5592R_REG_PD, temp_reg_val,
AD5592R_REG_PD_EN_REF);
if (ret < 0)
return ret;

dev->int_ref = enable;

return 0;
}

/**
* Set ADC Buffer for the device
*
* @param dev - The device structure.
* @param enable - Status to enable/disable adc buffer.
* @return 0 in case of success, negative error code otherwise
*/
int32_t ad5592r_set_adc_buffer(struct ad5592r_dev *dev, bool enable)
{
uint16_t temp_reg_val = 0;
int ret;

if (!dev)
return -1;

temp_reg_val = enable ? AD5592R_REG_CTRL_ADC_BUFF_EN : 0;

ret = ad5592r_base_reg_update(dev, AD5592R_REG_CTRL, temp_reg_val,
AD5592R_REG_CTRL_ADC_BUFF_EN);
if (ret < 0)
return ret;

dev->adc_buf = enable;

return 0;
}
33 changes: 32 additions & 1 deletion drivers/adc-dac/ad5592r/ad5592r-base.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* @brief Header file of AD5592R Base Driver.
* @author Mircea Caprioru ([email protected])
********************************************************************************
* Copyright 2018, 2020(c) Analog Devices, Inc.
* Copyright 2018, 2020, 2025(c) Analog Devices, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
Expand Down Expand Up @@ -38,6 +38,7 @@
#include "no_os_spi.h"
#include "no_os_i2c.h"
#include "no_os_util.h"
#include "no_os_alloc.h"
#include <stdbool.h>

#define CH_MODE_UNUSED 0
Expand Down Expand Up @@ -92,6 +93,8 @@ enum ad5592r_registers {

#define INTERNAL_VREF_VOLTAGE 2.5

#define NUM_OF_CHANNELS 8

struct ad5592r_dev;

struct ad5592r_rw_ops {
Expand All @@ -108,8 +111,22 @@ struct ad5592r_rw_ops {
int32_t (*gpio_read)(struct ad5592r_dev *dev, uint8_t *value);
};

enum ad559xr_range {
ZERO_TO_VREF,
ZERO_TO_2VREF
};

struct ad5592r_init_param {
bool int_ref;
struct no_os_spi_init_param *spi_init;
struct no_os_i2c_init_param *i2c_init;
uint8_t channel_modes[8];
uint8_t channel_offstate[8];
enum ad559xr_range adc_range;
enum ad559xr_range dac_range;
bool adc_buf;
uint16_t cached_dac[8];
uint8_t power_down[8];
};

struct ad5592r_dev {
Expand All @@ -126,6 +143,11 @@ struct ad5592r_dev {
uint8_t gpio_in;
uint8_t gpio_val;
uint8_t ldac_mode;
enum ad559xr_range adc_range;
enum ad559xr_range dac_range;
bool int_ref;
uint8_t power_down[8];
bool adc_buf;
};

int32_t ad5592r_base_reg_write(struct ad5592r_dev *dev, uint8_t reg,
Expand All @@ -141,5 +163,14 @@ int32_t ad5592r_gpio_direction_output(struct ad5592r_dev *dev,
int32_t ad5592r_software_reset(struct ad5592r_dev *dev);
int32_t ad5592r_set_channel_modes(struct ad5592r_dev *dev);
int32_t ad5592r_reset_channel_modes(struct ad5592r_dev *dev);
int32_t ad5592r_set_adc_range(struct ad5592r_dev *dev,
enum ad559xr_range adc_range);
int32_t ad5592r_set_dac_range(struct ad5592r_dev *dev,
enum ad559xr_range dac_range);
int32_t ad5592r_power_down(struct ad5592r_dev *dev, uint8_t chan, bool enable);
int32_t ad5592r_set_int_ref(struct ad5592r_dev *dev, bool enable);
int32_t ad5592r_set_adc_buffer(struct ad5592r_dev *dev, bool enable);
int32_t ad5592r_base_reg_update(struct ad5592r_dev* dev, uint16_t reg_addr,
uint16_t data, uint16_t mask);

#endif /* AD5592R_BASE_H_ */
Loading

0 comments on commit b2d8cdd

Please sign in to comment.