this is testing

Committer:
pmallick
Date:
Thu Jan 14 18:54:16 2021 +0530
Revision:
0:3afcd581558d
this is testing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pmallick 0:3afcd581558d 1 /***************************************************************************//**
pmallick 0:3afcd581558d 2 * @file ad5592r.c
pmallick 0:3afcd581558d 3 * @brief Implementation of AD5592R driver.
pmallick 0:3afcd581558d 4 * @author Mircea Caprioru (mircea.caprioru@analog.com)
pmallick 0:3afcd581558d 5 ********************************************************************************
pmallick 0:3afcd581558d 6 * Copyright 2018, 2020(c) Analog Devices, Inc.
pmallick 0:3afcd581558d 7 *
pmallick 0:3afcd581558d 8 * All rights reserved.
pmallick 0:3afcd581558d 9 *
pmallick 0:3afcd581558d 10 * Redistribution and use in source and binary forms, with or without
pmallick 0:3afcd581558d 11 * modification, are permitted provided that the following conditions are met:
pmallick 0:3afcd581558d 12 * - Redistributions of source code must retain the above copyright
pmallick 0:3afcd581558d 13 * notice, this list of conditions and the following disclaimer.
pmallick 0:3afcd581558d 14 * - Redistributions in binary form must reproduce the above copyright
pmallick 0:3afcd581558d 15 * notice, this list of conditions and the following disclaimer in
pmallick 0:3afcd581558d 16 * the documentation and/or other materials provided with the
pmallick 0:3afcd581558d 17 * distribution.
pmallick 0:3afcd581558d 18 * - Neither the name of Analog Devices, Inc. nor the names of its
pmallick 0:3afcd581558d 19 * contributors may be used to endorse or promote products derived
pmallick 0:3afcd581558d 20 * from this software without specific prior written permission.
pmallick 0:3afcd581558d 21 * - The use of this software may or may not infringe the patent rights
pmallick 0:3afcd581558d 22 * of one or more patent holders. This license does not release you
pmallick 0:3afcd581558d 23 * from the requirement that you obtain separate licenses from these
pmallick 0:3afcd581558d 24 * patent holders to use this software.
pmallick 0:3afcd581558d 25 * - Use of the software either in source or binary form, must be run
pmallick 0:3afcd581558d 26 * on or directly connected to an Analog Devices Inc. component.
pmallick 0:3afcd581558d 27 *
pmallick 0:3afcd581558d 28 * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
pmallick 0:3afcd581558d 29 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
pmallick 0:3afcd581558d 30 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
pmallick 0:3afcd581558d 31 * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
pmallick 0:3afcd581558d 32 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
pmallick 0:3afcd581558d 33 * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR
pmallick 0:3afcd581558d 34 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
pmallick 0:3afcd581558d 35 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
pmallick 0:3afcd581558d 36 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
pmallick 0:3afcd581558d 37 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
pmallick 0:3afcd581558d 38 *******************************************************************************/
pmallick 0:3afcd581558d 39 #include "error.h"
pmallick 0:3afcd581558d 40 #include "ad5592r-base.h"
pmallick 0:3afcd581558d 41 #include "ad5592r.h"
pmallick 0:3afcd581558d 42
pmallick 0:3afcd581558d 43 const struct ad5592r_rw_ops ad5592r_rw_ops = {
pmallick 0:3afcd581558d 44 .write_dac = ad5592r_write_dac,
pmallick 0:3afcd581558d 45 .read_adc = ad5592r_read_adc,
pmallick 0:3afcd581558d 46 .multi_read_adc = ad5592r_multi_read_adc,
pmallick 0:3afcd581558d 47 .reg_write = ad5592r_reg_write,
pmallick 0:3afcd581558d 48 .reg_read = ad5592r_reg_read,
pmallick 0:3afcd581558d 49 .gpio_read = ad5592r_gpio_read,
pmallick 0:3afcd581558d 50 };
pmallick 0:3afcd581558d 51
pmallick 0:3afcd581558d 52 /**
pmallick 0:3afcd581558d 53 * Write NOP and read value.
pmallick 0:3afcd581558d 54 *
pmallick 0:3afcd581558d 55 * @param dev - The device structure.
pmallick 0:3afcd581558d 56 * @param buf - buffer where to read
pmallick 0:3afcd581558d 57 * @return 0 in case of success, negative error code otherwise
pmallick 0:3afcd581558d 58 */
pmallick 0:3afcd581558d 59 static int32_t ad5592r_spi_wnop_r16(struct ad5592r_dev *dev, uint16_t *buf)
pmallick 0:3afcd581558d 60 {
pmallick 0:3afcd581558d 61 int32_t ret;
pmallick 0:3afcd581558d 62 uint16_t spi_msg_nop = 0; /* NOP */
pmallick 0:3afcd581558d 63
pmallick 0:3afcd581558d 64 ret = spi_write_and_read(dev->spi, (uint8_t *)&spi_msg_nop,
pmallick 0:3afcd581558d 65 sizeof(spi_msg_nop));
pmallick 0:3afcd581558d 66 if (ret < 0)
pmallick 0:3afcd581558d 67 return ret;
pmallick 0:3afcd581558d 68
pmallick 0:3afcd581558d 69 *buf = swab16(spi_msg_nop);
pmallick 0:3afcd581558d 70
pmallick 0:3afcd581558d 71 return ret;
pmallick 0:3afcd581558d 72 }
pmallick 0:3afcd581558d 73
pmallick 0:3afcd581558d 74 /**
pmallick 0:3afcd581558d 75 * Write DAC channel.
pmallick 0:3afcd581558d 76 *
pmallick 0:3afcd581558d 77 * @param dev - The device structure.
pmallick 0:3afcd581558d 78 * @param chan - The channel number.
pmallick 0:3afcd581558d 79 * @param value - DAC value
pmallick 0:3afcd581558d 80 * @return 0 in case of success, negative error code otherwise
pmallick 0:3afcd581558d 81 */
pmallick 0:3afcd581558d 82 int32_t ad5592r_write_dac(struct ad5592r_dev *dev, uint8_t chan,
pmallick 0:3afcd581558d 83 uint16_t value)
pmallick 0:3afcd581558d 84 {
pmallick 0:3afcd581558d 85 if (!dev)
pmallick 0:3afcd581558d 86 return FAILURE;
pmallick 0:3afcd581558d 87
pmallick 0:3afcd581558d 88 dev->spi_msg = swab16( BIT(15) | (uint16_t)(chan << 12) | value);
pmallick 0:3afcd581558d 89
pmallick 0:3afcd581558d 90 return spi_write_and_read(dev->spi, (uint8_t *)&dev->spi_msg,
pmallick 0:3afcd581558d 91 sizeof(dev->spi_msg));
pmallick 0:3afcd581558d 92 }
pmallick 0:3afcd581558d 93
pmallick 0:3afcd581558d 94 /**
pmallick 0:3afcd581558d 95 * Read ADC channel.
pmallick 0:3afcd581558d 96 *
pmallick 0:3afcd581558d 97 * @param dev - The device structure.
pmallick 0:3afcd581558d 98 * @param chan - The channel number.
pmallick 0:3afcd581558d 99 * @param value - ADC value
pmallick 0:3afcd581558d 100 * @return 0 in case of success, negative error code otherwise
pmallick 0:3afcd581558d 101 */
pmallick 0:3afcd581558d 102 int32_t ad5592r_read_adc(struct ad5592r_dev *dev, uint8_t chan,
pmallick 0:3afcd581558d 103 uint16_t *value)
pmallick 0:3afcd581558d 104 {
pmallick 0:3afcd581558d 105 int32_t ret;
pmallick 0:3afcd581558d 106
pmallick 0:3afcd581558d 107 if (!dev)
pmallick 0:3afcd581558d 108 return FAILURE;
pmallick 0:3afcd581558d 109
pmallick 0:3afcd581558d 110 dev->spi_msg = swab16((uint16_t)(AD5592R_REG_ADC_SEQ << 11) |
pmallick 0:3afcd581558d 111 BIT(chan));
pmallick 0:3afcd581558d 112
pmallick 0:3afcd581558d 113 ret = spi_write_and_read(dev->spi, (uint8_t *)&dev->spi_msg,
pmallick 0:3afcd581558d 114 sizeof(dev->spi_msg));
pmallick 0:3afcd581558d 115 if (ret < 0)
pmallick 0:3afcd581558d 116 return ret;
pmallick 0:3afcd581558d 117
pmallick 0:3afcd581558d 118 /*
pmallick 0:3afcd581558d 119 * Invalid data:
pmallick 0:3afcd581558d 120 * See Figure 40. Single-Channel ADC Conversion Sequence
pmallick 0:3afcd581558d 121 */
pmallick 0:3afcd581558d 122 ret = ad5592r_spi_wnop_r16(dev, &dev->spi_msg);
pmallick 0:3afcd581558d 123 if (ret < 0)
pmallick 0:3afcd581558d 124 return ret;
pmallick 0:3afcd581558d 125
pmallick 0:3afcd581558d 126 ret = ad5592r_spi_wnop_r16(dev, &dev->spi_msg);
pmallick 0:3afcd581558d 127 if (ret < 0)
pmallick 0:3afcd581558d 128 return ret;
pmallick 0:3afcd581558d 129
pmallick 0:3afcd581558d 130 *value = dev->spi_msg;
pmallick 0:3afcd581558d 131
pmallick 0:3afcd581558d 132 return 0;
pmallick 0:3afcd581558d 133 }
pmallick 0:3afcd581558d 134
pmallick 0:3afcd581558d 135 /**
pmallick 0:3afcd581558d 136 * Read Multiple ADC Channels.
pmallick 0:3afcd581558d 137 *
pmallick 0:3afcd581558d 138 * @param dev - The device structure.
pmallick 0:3afcd581558d 139 * @param chans - The ADC channels to be readback
pmallick 0:3afcd581558d 140 * @param values - ADC value array
pmallick 0:3afcd581558d 141 * @return 0 in case of success, negative error code otherwise
pmallick 0:3afcd581558d 142 */
pmallick 0:3afcd581558d 143 int32_t ad5592r_multi_read_adc(struct ad5592r_dev *dev, uint16_t chans,
pmallick 0:3afcd581558d 144 uint16_t *values)
pmallick 0:3afcd581558d 145 {
pmallick 0:3afcd581558d 146 int32_t ret;
pmallick 0:3afcd581558d 147 uint8_t samples;
pmallick 0:3afcd581558d 148 uint8_t i;
pmallick 0:3afcd581558d 149
pmallick 0:3afcd581558d 150 if (!dev)
pmallick 0:3afcd581558d 151 return FAILURE;
pmallick 0:3afcd581558d 152
pmallick 0:3afcd581558d 153 samples = hweight8(chans);
pmallick 0:3afcd581558d 154
pmallick 0:3afcd581558d 155 dev->spi_msg = swab16((uint16_t)(AD5592R_REG_ADC_SEQ << 11) | chans);
pmallick 0:3afcd581558d 156
pmallick 0:3afcd581558d 157 ret = spi_write_and_read(dev->spi, (uint8_t *)&dev->spi_msg,
pmallick 0:3afcd581558d 158 sizeof(dev->spi_msg));
pmallick 0:3afcd581558d 159 if (ret < 0)
pmallick 0:3afcd581558d 160 return ret;
pmallick 0:3afcd581558d 161
pmallick 0:3afcd581558d 162 /*
pmallick 0:3afcd581558d 163 * Invalid data:
pmallick 0:3afcd581558d 164 * See Figure 40. Single-Channel ADC Conversion Sequence
pmallick 0:3afcd581558d 165 */
pmallick 0:3afcd581558d 166 ret = ad5592r_spi_wnop_r16(dev, &dev->spi_msg);
pmallick 0:3afcd581558d 167 if (ret < 0)
pmallick 0:3afcd581558d 168 return ret;
pmallick 0:3afcd581558d 169
pmallick 0:3afcd581558d 170 for (i = 0; i < samples; i++) {
pmallick 0:3afcd581558d 171 ret = ad5592r_spi_wnop_r16(dev, &dev->spi_msg);
pmallick 0:3afcd581558d 172 if (ret < 0)
pmallick 0:3afcd581558d 173 return ret;
pmallick 0:3afcd581558d 174 values[i] = dev->spi_msg;
pmallick 0:3afcd581558d 175 }
pmallick 0:3afcd581558d 176
pmallick 0:3afcd581558d 177 return 0;
pmallick 0:3afcd581558d 178 }
pmallick 0:3afcd581558d 179
pmallick 0:3afcd581558d 180 /**
pmallick 0:3afcd581558d 181 * Write register.
pmallick 0:3afcd581558d 182 *
pmallick 0:3afcd581558d 183 * @param dev - The device structure.
pmallick 0:3afcd581558d 184 * @param reg - The register address.
pmallick 0:3afcd581558d 185 * @param value - register value
pmallick 0:3afcd581558d 186 * @return 0 in case of success, negative error code otherwise
pmallick 0:3afcd581558d 187 */
pmallick 0:3afcd581558d 188 int32_t ad5592r_reg_write(struct ad5592r_dev *dev, uint8_t reg, uint16_t value)
pmallick 0:3afcd581558d 189 {
pmallick 0:3afcd581558d 190 if (!dev)
pmallick 0:3afcd581558d 191 return FAILURE;
pmallick 0:3afcd581558d 192
pmallick 0:3afcd581558d 193 dev->spi_msg = swab16((reg << 11) | value);
pmallick 0:3afcd581558d 194
pmallick 0:3afcd581558d 195 return spi_write_and_read(dev->spi, (uint8_t *)&dev->spi_msg,
pmallick 0:3afcd581558d 196 sizeof(dev->spi_msg));
pmallick 0:3afcd581558d 197 }
pmallick 0:3afcd581558d 198
pmallick 0:3afcd581558d 199 /**
pmallick 0:3afcd581558d 200 * Read register.
pmallick 0:3afcd581558d 201 *
pmallick 0:3afcd581558d 202 * @param dev - The device structure.
pmallick 0:3afcd581558d 203 * @param reg - The register address.
pmallick 0:3afcd581558d 204 * @param value - register value
pmallick 0:3afcd581558d 205 * @return 0 in case of success, negative error code otherwise
pmallick 0:3afcd581558d 206 */
pmallick 0:3afcd581558d 207 int32_t ad5592r_reg_read(struct ad5592r_dev *dev, uint8_t reg, uint16_t *value)
pmallick 0:3afcd581558d 208 {
pmallick 0:3afcd581558d 209 int32_t ret;
pmallick 0:3afcd581558d 210
pmallick 0:3afcd581558d 211 if (!dev)
pmallick 0:3afcd581558d 212 return FAILURE;
pmallick 0:3afcd581558d 213
pmallick 0:3afcd581558d 214 dev->spi_msg = swab16((AD5592R_REG_LDAC << 11) |
pmallick 0:3afcd581558d 215 AD5592R_LDAC_READBACK_EN | (reg << 2) | dev->ldac_mode);
pmallick 0:3afcd581558d 216
pmallick 0:3afcd581558d 217 ret = spi_write_and_read(dev->spi, (uint8_t *)&dev->spi_msg,
pmallick 0:3afcd581558d 218 sizeof(dev->spi_msg));
pmallick 0:3afcd581558d 219 if (ret < 0)
pmallick 0:3afcd581558d 220 return ret;
pmallick 0:3afcd581558d 221
pmallick 0:3afcd581558d 222 ret = ad5592r_spi_wnop_r16(dev, &dev->spi_msg);
pmallick 0:3afcd581558d 223 if (ret < 0)
pmallick 0:3afcd581558d 224 return ret;
pmallick 0:3afcd581558d 225
pmallick 0:3afcd581558d 226 *value = dev->spi_msg;
pmallick 0:3afcd581558d 227
pmallick 0:3afcd581558d 228 return 0;
pmallick 0:3afcd581558d 229 }
pmallick 0:3afcd581558d 230
pmallick 0:3afcd581558d 231 /**
pmallick 0:3afcd581558d 232 * Read GPIOs.
pmallick 0:3afcd581558d 233 *
pmallick 0:3afcd581558d 234 * @param dev - The device structure.
pmallick 0:3afcd581558d 235 * @param value - GPIOs value.
pmallick 0:3afcd581558d 236 * @return 0 in case of success, negative error code otherwise
pmallick 0:3afcd581558d 237 */
pmallick 0:3afcd581558d 238 int32_t ad5592r_gpio_read(struct ad5592r_dev *dev, uint8_t *value)
pmallick 0:3afcd581558d 239 {
pmallick 0:3afcd581558d 240 int32_t ret;
pmallick 0:3afcd581558d 241
pmallick 0:3afcd581558d 242 if (!dev)
pmallick 0:3afcd581558d 243 return FAILURE;
pmallick 0:3afcd581558d 244
pmallick 0:3afcd581558d 245 ret = ad5592r_reg_write(dev, AD5592R_REG_GPIO_IN_EN,
pmallick 0:3afcd581558d 246 AD5592R_GPIO_READBACK_EN | dev->gpio_in);
pmallick 0:3afcd581558d 247 if (ret < 0)
pmallick 0:3afcd581558d 248 return ret;
pmallick 0:3afcd581558d 249
pmallick 0:3afcd581558d 250 ret = ad5592r_spi_wnop_r16(dev, &dev->spi_msg);
pmallick 0:3afcd581558d 251 if (ret < 0)
pmallick 0:3afcd581558d 252 return ret;
pmallick 0:3afcd581558d 253
pmallick 0:3afcd581558d 254 *value = (uint8_t)dev->spi_msg;
pmallick 0:3afcd581558d 255
pmallick 0:3afcd581558d 256 return 0;
pmallick 0:3afcd581558d 257 }
pmallick 0:3afcd581558d 258
pmallick 0:3afcd581558d 259 /**
pmallick 0:3afcd581558d 260 * Initialize AD5593r device.
pmallick 0:3afcd581558d 261 *
pmallick 0:3afcd581558d 262 * @param dev - The device structure.
pmallick 0:3afcd581558d 263 * @param init_param - The initial parameters of the device.
pmallick 0:3afcd581558d 264 * @return 0 in case of success, negative error code otherwise
pmallick 0:3afcd581558d 265 */
pmallick 0:3afcd581558d 266 int32_t ad5592r_init(struct ad5592r_dev *dev,
pmallick 0:3afcd581558d 267 struct ad5592r_init_param *init_param)
pmallick 0:3afcd581558d 268 {
pmallick 0:3afcd581558d 269 int32_t ret;
pmallick 0:3afcd581558d 270 uint16_t temp_reg_val;
pmallick 0:3afcd581558d 271
pmallick 0:3afcd581558d 272 if (!dev)
pmallick 0:3afcd581558d 273 return FAILURE;
pmallick 0:3afcd581558d 274
pmallick 0:3afcd581558d 275 dev->ops = &ad5592r_rw_ops;
pmallick 0:3afcd581558d 276
pmallick 0:3afcd581558d 277 ret = ad5592r_software_reset(dev);
pmallick 0:3afcd581558d 278 if (ret < 0)
pmallick 0:3afcd581558d 279 return ret;
pmallick 0:3afcd581558d 280
pmallick 0:3afcd581558d 281 ret = ad5592r_set_channel_modes(dev);
pmallick 0:3afcd581558d 282 if (ret < 0)
pmallick 0:3afcd581558d 283 return ret;
pmallick 0:3afcd581558d 284
pmallick 0:3afcd581558d 285 if(init_param->int_ref) {
pmallick 0:3afcd581558d 286 ret = ad5592r_reg_read(dev, AD5592R_REG_PD, &temp_reg_val);
pmallick 0:3afcd581558d 287 if (ret < 0)
pmallick 0:3afcd581558d 288 return ret;
pmallick 0:3afcd581558d 289 temp_reg_val |= AD5592R_REG_PD_EN_REF;
pmallick 0:3afcd581558d 290
pmallick 0:3afcd581558d 291 return ad5592r_reg_write(dev, AD5592R_REG_PD, temp_reg_val);
pmallick 0:3afcd581558d 292 }
pmallick 0:3afcd581558d 293
pmallick 0:3afcd581558d 294 return ret;
pmallick 0:3afcd581558d 295 }