AD5770R No-OS Driver
ad5770r.c@3:e2c56c903ec8, 2020-03-27 (annotated)
- Committer:
- mbradley
- Date:
- Fri Mar 27 19:05:55 2020 +0000
- Revision:
- 3:e2c56c903ec8
- Parent:
- 2:a22a3d5d9f41
removing license file, as the noos already have a license in the header.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mbradley | 1:bcc701b1fd33 | 1 | /***************************************************************************//** |
mbradley | 1:bcc701b1fd33 | 2 | * @file ad5770r.c |
mbradley | 1:bcc701b1fd33 | 3 | * @brief Implementation of ad5770r Driver. |
mbradley | 1:bcc701b1fd33 | 4 | * @author Mircea Caprioru (mircea.caprioru@analog.com) |
mbradley | 1:bcc701b1fd33 | 5 | ******************************************************************************** |
mbradley | 1:bcc701b1fd33 | 6 | * Copyright 2018, 2020(c) Analog Devices, Inc. |
mbradley | 1:bcc701b1fd33 | 7 | * |
mbradley | 1:bcc701b1fd33 | 8 | * All rights reserved. |
mbradley | 1:bcc701b1fd33 | 9 | * |
mbradley | 1:bcc701b1fd33 | 10 | * Redistribution and use in source and binary forms, with or without |
mbradley | 1:bcc701b1fd33 | 11 | * modification, are permitted provided that the following conditions are met: |
mbradley | 1:bcc701b1fd33 | 12 | * - Redistributions of source code must retain the above copyright |
mbradley | 1:bcc701b1fd33 | 13 | * notice, this list of conditions and the following disclaimer. |
mbradley | 1:bcc701b1fd33 | 14 | * - Redistributions in binary form must reproduce the above copyright |
mbradley | 1:bcc701b1fd33 | 15 | * notice, this list of conditions and the following disclaimer in |
mbradley | 1:bcc701b1fd33 | 16 | * the documentation and/or other materials provided with the |
mbradley | 1:bcc701b1fd33 | 17 | * distribution. |
mbradley | 1:bcc701b1fd33 | 18 | * - Neither the name of Analog Devices, Inc. nor the names of its |
mbradley | 1:bcc701b1fd33 | 19 | * contributors may be used to endorse or promote products derived |
mbradley | 1:bcc701b1fd33 | 20 | * from this software without specific prior written permission. |
mbradley | 1:bcc701b1fd33 | 21 | * - The use of this software may or may not infringe the patent rights |
mbradley | 1:bcc701b1fd33 | 22 | * of one or more patent holders. This license does not release you |
mbradley | 1:bcc701b1fd33 | 23 | * from the requirement that you obtain separate licenses from these |
mbradley | 1:bcc701b1fd33 | 24 | * patent holders to use this software. |
mbradley | 1:bcc701b1fd33 | 25 | * - Use of the software either in source or binary form, must be run |
mbradley | 1:bcc701b1fd33 | 26 | * on or directly connected to an Analog Devices Inc. component. |
mbradley | 1:bcc701b1fd33 | 27 | * |
mbradley | 1:bcc701b1fd33 | 28 | * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR |
mbradley | 1:bcc701b1fd33 | 29 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, |
mbradley | 1:bcc701b1fd33 | 30 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
mbradley | 1:bcc701b1fd33 | 31 | * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, |
mbradley | 1:bcc701b1fd33 | 32 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
mbradley | 1:bcc701b1fd33 | 33 | * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR |
mbradley | 1:bcc701b1fd33 | 34 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
mbradley | 1:bcc701b1fd33 | 35 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
mbradley | 1:bcc701b1fd33 | 36 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
mbradley | 1:bcc701b1fd33 | 37 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
mbradley | 1:bcc701b1fd33 | 38 | *******************************************************************************/ |
mbradley | 1:bcc701b1fd33 | 39 | |
mbradley | 1:bcc701b1fd33 | 40 | /******************************************************************************/ |
mbradley | 1:bcc701b1fd33 | 41 | /***************************** Include Files **********************************/ |
mbradley | 1:bcc701b1fd33 | 42 | /******************************************************************************/ |
mbradley | 1:bcc701b1fd33 | 43 | #include <stdio.h> |
mbradley | 1:bcc701b1fd33 | 44 | #include <stdlib.h> |
mbradley | 1:bcc701b1fd33 | 45 | #include <stdbool.h> |
mbradley | 1:bcc701b1fd33 | 46 | #include <string.h> |
mbradley | 1:bcc701b1fd33 | 47 | #include "platform_drivers.h" |
mbradley | 1:bcc701b1fd33 | 48 | #include "ad5770r.h" |
mbradley | 1:bcc701b1fd33 | 49 | |
mbradley | 1:bcc701b1fd33 | 50 | /******************************************************************************/ |
mbradley | 1:bcc701b1fd33 | 51 | /************************** Functions Implementation **************************/ |
mbradley | 1:bcc701b1fd33 | 52 | /******************************************************************************/ |
mbradley | 1:bcc701b1fd33 | 53 | /** |
mbradley | 1:bcc701b1fd33 | 54 | * Read from device. |
mbradley | 1:bcc701b1fd33 | 55 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 56 | * @param reg_addr - The register address. |
mbradley | 1:bcc701b1fd33 | 57 | * @param reg_data - The register data. |
mbradley | 1:bcc701b1fd33 | 58 | * @return 0 in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 59 | */ |
mbradley | 1:bcc701b1fd33 | 60 | int32_t ad5770r_spi_reg_read(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 61 | uint8_t reg_addr, |
mbradley | 1:bcc701b1fd33 | 62 | uint8_t *reg_data) |
mbradley | 1:bcc701b1fd33 | 63 | { |
mbradley | 1:bcc701b1fd33 | 64 | uint8_t buf[2]; |
mbradley | 1:bcc701b1fd33 | 65 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 66 | |
mbradley | 1:bcc701b1fd33 | 67 | if (!dev | !reg_data) |
mbradley | 1:bcc701b1fd33 | 68 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 69 | |
mbradley | 1:bcc701b1fd33 | 70 | buf[0] = AD5770R_REG_READ(reg_addr); |
mbradley | 1:bcc701b1fd33 | 71 | buf[1] = 0x00; |
mbradley | 1:bcc701b1fd33 | 72 | |
mbradley | 1:bcc701b1fd33 | 73 | ret = spi_write_and_read(dev->spi_desc, buf, sizeof(buf)); |
mbradley | 1:bcc701b1fd33 | 74 | |
mbradley | 1:bcc701b1fd33 | 75 | if (ret) |
mbradley | 1:bcc701b1fd33 | 76 | return ret; |
mbradley | 1:bcc701b1fd33 | 77 | |
mbradley | 1:bcc701b1fd33 | 78 | *reg_data = buf[1]; |
mbradley | 1:bcc701b1fd33 | 79 | |
mbradley | 1:bcc701b1fd33 | 80 | return ret; |
mbradley | 1:bcc701b1fd33 | 81 | } |
mbradley | 1:bcc701b1fd33 | 82 | |
mbradley | 1:bcc701b1fd33 | 83 | /** |
mbradley | 1:bcc701b1fd33 | 84 | * Multibyte read from device. A register read begins with the address |
mbradley | 1:bcc701b1fd33 | 85 | * and autoincrements for each aditional byte in the transfer. |
mbradley | 1:bcc701b1fd33 | 86 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 87 | * @param reg_addr - The register address. |
mbradley | 1:bcc701b1fd33 | 88 | * @param reg_data - The register data. |
mbradley | 1:bcc701b1fd33 | 89 | * @param count - Number of bytes to read. |
mbradley | 1:bcc701b1fd33 | 90 | * @return 0 in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 91 | */ |
mbradley | 1:bcc701b1fd33 | 92 | int32_t ad5770r_spi_reg_read_multiple(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 93 | uint8_t reg_addr, |
mbradley | 1:bcc701b1fd33 | 94 | uint8_t *reg_data, |
mbradley | 1:bcc701b1fd33 | 95 | uint16_t count) |
mbradley | 1:bcc701b1fd33 | 96 | { |
mbradley | 1:bcc701b1fd33 | 97 | uint8_t *buf; |
mbradley | 1:bcc701b1fd33 | 98 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 99 | |
mbradley | 1:bcc701b1fd33 | 100 | if (!dev || !reg_data) |
mbradley | 1:bcc701b1fd33 | 101 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 102 | |
mbradley | 1:bcc701b1fd33 | 103 | buf = (uint8_t*)calloc(count + 1, sizeof(uint8_t)); |
mbradley | 1:bcc701b1fd33 | 104 | |
mbradley | 1:bcc701b1fd33 | 105 | buf[0] = AD5770R_REG_READ(reg_addr); |
mbradley | 1:bcc701b1fd33 | 106 | |
mbradley | 1:bcc701b1fd33 | 107 | ret = spi_write_and_read(dev->spi_desc, buf, count + 1); |
mbradley | 1:bcc701b1fd33 | 108 | |
mbradley | 1:bcc701b1fd33 | 109 | if (ret) { |
mbradley | 1:bcc701b1fd33 | 110 | free(buf); |
mbradley | 1:bcc701b1fd33 | 111 | return ret; |
mbradley | 1:bcc701b1fd33 | 112 | } |
mbradley | 1:bcc701b1fd33 | 113 | |
mbradley | 1:bcc701b1fd33 | 114 | memcpy(reg_data, buf + 1, count); |
mbradley | 1:bcc701b1fd33 | 115 | free(buf); |
mbradley | 1:bcc701b1fd33 | 116 | |
mbradley | 1:bcc701b1fd33 | 117 | return ret; |
mbradley | 1:bcc701b1fd33 | 118 | } |
mbradley | 1:bcc701b1fd33 | 119 | /** |
mbradley | 1:bcc701b1fd33 | 120 | * Write to device. |
mbradley | 1:bcc701b1fd33 | 121 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 122 | * @param reg_addr - The register address. |
mbradley | 1:bcc701b1fd33 | 123 | * @param reg_data - The register data. |
mbradley | 1:bcc701b1fd33 | 124 | * @return 0 in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 125 | */ |
mbradley | 1:bcc701b1fd33 | 126 | int32_t ad5770r_spi_reg_write(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 127 | uint8_t reg_addr, |
mbradley | 1:bcc701b1fd33 | 128 | uint8_t reg_data) |
mbradley | 1:bcc701b1fd33 | 129 | { |
mbradley | 1:bcc701b1fd33 | 130 | uint8_t buf[2]; |
mbradley | 1:bcc701b1fd33 | 131 | |
mbradley | 1:bcc701b1fd33 | 132 | if (!dev) |
mbradley | 1:bcc701b1fd33 | 133 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 134 | |
mbradley | 1:bcc701b1fd33 | 135 | buf[0] = AD5770R_REG_WRITE(reg_addr); |
mbradley | 1:bcc701b1fd33 | 136 | buf[1] = reg_data; |
mbradley | 1:bcc701b1fd33 | 137 | |
mbradley | 1:bcc701b1fd33 | 138 | return spi_write_and_read(dev->spi_desc, buf, sizeof(buf)); |
mbradley | 1:bcc701b1fd33 | 139 | } |
mbradley | 1:bcc701b1fd33 | 140 | |
mbradley | 1:bcc701b1fd33 | 141 | /** |
mbradley | 1:bcc701b1fd33 | 142 | * Multibyte write from device. A register write begins with the address |
mbradley | 1:bcc701b1fd33 | 143 | * and autoincrements for each additional byte in the transfer. |
mbradley | 1:bcc701b1fd33 | 144 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 145 | * @param reg_addr - The register address. |
mbradley | 1:bcc701b1fd33 | 146 | * @param reg_data - The register data. |
mbradley | 1:bcc701b1fd33 | 147 | * @param count - Number of bytes to read. |
mbradley | 1:bcc701b1fd33 | 148 | * @return 0 in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 149 | */ |
mbradley | 1:bcc701b1fd33 | 150 | int32_t ad5770r_spi_reg_write_multiple(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 151 | uint8_t reg_addr, |
mbradley | 1:bcc701b1fd33 | 152 | uint8_t *reg_data, |
mbradley | 1:bcc701b1fd33 | 153 | uint16_t count) |
mbradley | 1:bcc701b1fd33 | 154 | { |
mbradley | 1:bcc701b1fd33 | 155 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 156 | uint8_t *data; |
mbradley | 1:bcc701b1fd33 | 157 | |
mbradley | 1:bcc701b1fd33 | 158 | if (!dev | !reg_data) |
mbradley | 1:bcc701b1fd33 | 159 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 160 | |
mbradley | 1:bcc701b1fd33 | 161 | data = (uint8_t*)calloc(count + 1, sizeof(uint8_t)); |
mbradley | 1:bcc701b1fd33 | 162 | |
mbradley | 1:bcc701b1fd33 | 163 | data[0] = AD5770R_REG_WRITE(reg_addr); |
mbradley | 1:bcc701b1fd33 | 164 | memcpy(&data[1], reg_data, count); |
mbradley | 1:bcc701b1fd33 | 165 | |
mbradley | 1:bcc701b1fd33 | 166 | ret = spi_write_and_read(dev->spi_desc, data, count + 1); |
mbradley | 1:bcc701b1fd33 | 167 | free(data); |
mbradley | 1:bcc701b1fd33 | 168 | |
mbradley | 1:bcc701b1fd33 | 169 | return ret; |
mbradley | 1:bcc701b1fd33 | 170 | } |
mbradley | 1:bcc701b1fd33 | 171 | |
mbradley | 1:bcc701b1fd33 | 172 | /** |
mbradley | 1:bcc701b1fd33 | 173 | * SPI write to device using a mask. |
mbradley | 1:bcc701b1fd33 | 174 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 175 | * @param reg_addr - The register address. |
mbradley | 1:bcc701b1fd33 | 176 | * @param mask - The mask. |
mbradley | 1:bcc701b1fd33 | 177 | * @param data - The register data. |
mbradley | 1:bcc701b1fd33 | 178 | * @return 0 in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 179 | */ |
mbradley | 1:bcc701b1fd33 | 180 | int32_t ad5770r_spi_write_mask(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 181 | uint8_t reg_addr, |
mbradley | 1:bcc701b1fd33 | 182 | uint32_t mask, |
mbradley | 1:bcc701b1fd33 | 183 | uint8_t data) |
mbradley | 1:bcc701b1fd33 | 184 | { |
mbradley | 1:bcc701b1fd33 | 185 | uint8_t reg_data; |
mbradley | 1:bcc701b1fd33 | 186 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 187 | |
mbradley | 1:bcc701b1fd33 | 188 | if (!dev) |
mbradley | 1:bcc701b1fd33 | 189 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 190 | |
mbradley | 1:bcc701b1fd33 | 191 | ret = ad5770r_spi_reg_read(dev, reg_addr, ®_data); |
mbradley | 1:bcc701b1fd33 | 192 | reg_data &= ~mask; |
mbradley | 1:bcc701b1fd33 | 193 | reg_data |= data; |
mbradley | 1:bcc701b1fd33 | 194 | ret |= ad5770r_spi_reg_write(dev, reg_addr, reg_data); |
mbradley | 1:bcc701b1fd33 | 195 | |
mbradley | 1:bcc701b1fd33 | 196 | return ret; |
mbradley | 1:bcc701b1fd33 | 197 | } |
mbradley | 1:bcc701b1fd33 | 198 | |
mbradley | 1:bcc701b1fd33 | 199 | /** |
mbradley | 1:bcc701b1fd33 | 200 | * Set device spi settings. |
mbradley | 1:bcc701b1fd33 | 201 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 202 | * @param spi_settings - The structure that contains the device spi |
mbradley | 1:bcc701b1fd33 | 203 | * parameters. |
mbradley | 1:bcc701b1fd33 | 204 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 205 | */ |
mbradley | 1:bcc701b1fd33 | 206 | int32_t ad5770r_set_device_spi(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 207 | const struct ad5770r_device_spi_settings *spi_settings) |
mbradley | 1:bcc701b1fd33 | 208 | { |
mbradley | 1:bcc701b1fd33 | 209 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 210 | |
mbradley | 1:bcc701b1fd33 | 211 | if (!dev || !spi_settings) |
mbradley | 1:bcc701b1fd33 | 212 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 213 | |
mbradley | 1:bcc701b1fd33 | 214 | ret = ad5770r_spi_write_mask(dev, |
mbradley | 1:bcc701b1fd33 | 215 | AD5770R_INTERFACE_CONFIG_A, |
mbradley | 1:bcc701b1fd33 | 216 | AD5770R_INTERFACE_CONFIG_A_ADDR_ASCENSION_MSB_MSK, |
mbradley | 1:bcc701b1fd33 | 217 | AD5770R_INTERFACE_CONFIG_A_ADDR_ASCENSION_MSB(spi_settings->addr_ascension)); |
mbradley | 1:bcc701b1fd33 | 218 | |
mbradley | 1:bcc701b1fd33 | 219 | ret |= ad5770r_spi_write_mask(dev, |
mbradley | 1:bcc701b1fd33 | 220 | AD5770R_INTERFACE_CONFIG_B, |
mbradley | 1:bcc701b1fd33 | 221 | AD5770R_INTERFACE_CONFIG_B_SINGLE_INST_MSK, |
mbradley | 1:bcc701b1fd33 | 222 | AD5770R_INTERFACE_CONFIG_B_SINGLE_INST(spi_settings->single_instruction)); |
mbradley | 1:bcc701b1fd33 | 223 | |
mbradley | 1:bcc701b1fd33 | 224 | ret |= ad5770r_spi_reg_write(dev, |
mbradley | 1:bcc701b1fd33 | 225 | AD5770R_STREAM_MODE, |
mbradley | 1:bcc701b1fd33 | 226 | spi_settings->stream_mode_length); |
mbradley | 1:bcc701b1fd33 | 227 | |
mbradley | 1:bcc701b1fd33 | 228 | if (ret) |
mbradley | 1:bcc701b1fd33 | 229 | return ret; |
mbradley | 1:bcc701b1fd33 | 230 | |
mbradley | 1:bcc701b1fd33 | 231 | dev->dev_spi_settings.addr_ascension = |
mbradley | 1:bcc701b1fd33 | 232 | spi_settings->addr_ascension; |
mbradley | 1:bcc701b1fd33 | 233 | dev->dev_spi_settings.single_instruction = |
mbradley | 1:bcc701b1fd33 | 234 | spi_settings->single_instruction; |
mbradley | 1:bcc701b1fd33 | 235 | dev->dev_spi_settings.stream_mode_length = |
mbradley | 1:bcc701b1fd33 | 236 | spi_settings->stream_mode_length; |
mbradley | 1:bcc701b1fd33 | 237 | |
mbradley | 1:bcc701b1fd33 | 238 | return SUCCESS; |
mbradley | 1:bcc701b1fd33 | 239 | } |
mbradley | 1:bcc701b1fd33 | 240 | |
mbradley | 1:bcc701b1fd33 | 241 | /** |
mbradley | 1:bcc701b1fd33 | 242 | * Set the channel configuration. |
mbradley | 1:bcc701b1fd33 | 243 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 244 | * @param channel_config - The structure that contains the channel |
mbradley | 1:bcc701b1fd33 | 245 | * configuration. |
mbradley | 1:bcc701b1fd33 | 246 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 247 | */ |
mbradley | 1:bcc701b1fd33 | 248 | int32_t ad5770r_channel_config(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 249 | const struct ad5770r_channel_switches *channel_config) |
mbradley | 1:bcc701b1fd33 | 250 | { |
mbradley | 1:bcc701b1fd33 | 251 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 252 | |
mbradley | 1:bcc701b1fd33 | 253 | if (!dev || !channel_config) |
mbradley | 1:bcc701b1fd33 | 254 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 255 | |
mbradley | 1:bcc701b1fd33 | 256 | ret = ad5770r_spi_reg_write(dev, |
mbradley | 1:bcc701b1fd33 | 257 | AD5770R_CHANNEL_CONFIG, |
mbradley | 1:bcc701b1fd33 | 258 | AD5770R_CHANNEL_CONFIG_CH0_SHUTDOWN_B(channel_config->en0) | |
mbradley | 1:bcc701b1fd33 | 259 | AD5770R_CHANNEL_CONFIG_CH1_SHUTDOWN_B(channel_config->en1) | |
mbradley | 1:bcc701b1fd33 | 260 | AD5770R_CHANNEL_CONFIG_CH2_SHUTDOWN_B(channel_config->en2) | |
mbradley | 1:bcc701b1fd33 | 261 | AD5770R_CHANNEL_CONFIG_CH3_SHUTDOWN_B(channel_config->en3) | |
mbradley | 1:bcc701b1fd33 | 262 | AD5770R_CHANNEL_CONFIG_CH4_SHUTDOWN_B(channel_config->en4) | |
mbradley | 1:bcc701b1fd33 | 263 | AD5770R_CHANNEL_CONFIG_CH5_SHUTDOWN_B(channel_config->en5) | |
mbradley | 1:bcc701b1fd33 | 264 | AD5770R_CHANNEL_CONFIG_CH0_SINK_EN(channel_config->sink0)); |
mbradley | 1:bcc701b1fd33 | 265 | |
mbradley | 1:bcc701b1fd33 | 266 | if (ret) |
mbradley | 1:bcc701b1fd33 | 267 | return ret; |
mbradley | 1:bcc701b1fd33 | 268 | |
mbradley | 1:bcc701b1fd33 | 269 | dev->channel_config = *channel_config; |
mbradley | 1:bcc701b1fd33 | 270 | |
mbradley | 1:bcc701b1fd33 | 271 | return ret; |
mbradley | 1:bcc701b1fd33 | 272 | } |
mbradley | 1:bcc701b1fd33 | 273 | |
mbradley | 1:bcc701b1fd33 | 274 | /** |
mbradley | 1:bcc701b1fd33 | 275 | * Set the channel configuration. |
mbradley | 1:bcc701b1fd33 | 276 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 277 | * @param output_mode - The structure that contains the channel output |
mbradley | 1:bcc701b1fd33 | 278 | * parameters. |
mbradley | 1:bcc701b1fd33 | 279 | * @param channel - The channel number. |
mbradley | 1:bcc701b1fd33 | 280 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 281 | */ |
mbradley | 1:bcc701b1fd33 | 282 | int32_t ad5770r_set_output_mode(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 283 | const struct ad5770r_output_range *output_mode, |
mbradley | 1:bcc701b1fd33 | 284 | enum ad5770r_channels channel) |
mbradley | 1:bcc701b1fd33 | 285 | { |
mbradley | 1:bcc701b1fd33 | 286 | |
mbradley | 1:bcc701b1fd33 | 287 | if (!dev || !output_mode) |
mbradley | 1:bcc701b1fd33 | 288 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 289 | |
mbradley | 1:bcc701b1fd33 | 290 | return ad5770r_spi_reg_write(dev, |
mbradley | 1:bcc701b1fd33 | 291 | AD5770R_OUTPUT_RANGE_CH0 + channel, |
mbradley | 1:bcc701b1fd33 | 292 | AD5770R_OUTPUT_RANGE_OUTPUT_SCALING(output_mode->output_scale) | |
mbradley | 1:bcc701b1fd33 | 293 | AD5770R_OUTPUT_RANGE_MODE(output_mode->output_range_mode)); |
mbradley | 1:bcc701b1fd33 | 294 | }; |
mbradley | 1:bcc701b1fd33 | 295 | |
mbradley | 1:bcc701b1fd33 | 296 | /** |
mbradley | 1:bcc701b1fd33 | 297 | * Set reference configuration. |
mbradley | 1:bcc701b1fd33 | 298 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 299 | * @param external_reference - Enable external reference. |
mbradley | 1:bcc701b1fd33 | 300 | * @param reference_selector - The reference to be selected. |
mbradley | 1:bcc701b1fd33 | 301 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 302 | */ |
mbradley | 1:bcc701b1fd33 | 303 | int32_t ad5770r_set_reference(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 304 | bool external_reference, |
mbradley | 1:bcc701b1fd33 | 305 | enum ad5770r_reference_voltage reference_selector) |
mbradley | 1:bcc701b1fd33 | 306 | { |
mbradley | 1:bcc701b1fd33 | 307 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 308 | |
mbradley | 1:bcc701b1fd33 | 309 | if (!dev) |
mbradley | 1:bcc701b1fd33 | 310 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 311 | |
mbradley | 1:bcc701b1fd33 | 312 | ret = ad5770r_spi_reg_write(dev, |
mbradley | 1:bcc701b1fd33 | 313 | AD5770R_REFERENCE, |
mbradley | 1:bcc701b1fd33 | 314 | AD5770R_REFERENCE_RESISTOR_SEL(external_reference) | |
mbradley | 1:bcc701b1fd33 | 315 | AD5770R_REFERENCE_VOLTATE_SEL(reference_selector)); |
mbradley | 1:bcc701b1fd33 | 316 | |
mbradley | 1:bcc701b1fd33 | 317 | if (ret) |
mbradley | 1:bcc701b1fd33 | 318 | return ret; |
mbradley | 1:bcc701b1fd33 | 319 | |
mbradley | 1:bcc701b1fd33 | 320 | dev->reference_selector = reference_selector; |
mbradley | 1:bcc701b1fd33 | 321 | dev->external_reference = external_reference; |
mbradley | 1:bcc701b1fd33 | 322 | |
mbradley | 1:bcc701b1fd33 | 323 | return ret; |
mbradley | 1:bcc701b1fd33 | 324 | }; |
mbradley | 1:bcc701b1fd33 | 325 | |
mbradley | 1:bcc701b1fd33 | 326 | /** |
mbradley | 1:bcc701b1fd33 | 327 | * Set reference configuration. |
mbradley | 1:bcc701b1fd33 | 328 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 329 | * @param alarm_config - Pointer to the array that contains the alarms |
mbradley | 1:bcc701b1fd33 | 330 | * that will be enabled. |
mbradley | 1:bcc701b1fd33 | 331 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 332 | */ |
mbradley | 1:bcc701b1fd33 | 333 | int32_t ad5770r_set_alarm(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 334 | const struct ad5770r_alarm_cfg *const alarm_config) |
mbradley | 1:bcc701b1fd33 | 335 | { |
mbradley | 1:bcc701b1fd33 | 336 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 337 | |
mbradley | 1:bcc701b1fd33 | 338 | if (!dev || !alarm_config) |
mbradley | 1:bcc701b1fd33 | 339 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 340 | |
mbradley | 1:bcc701b1fd33 | 341 | ret = ad5770r_spi_reg_write(dev, |
mbradley | 1:bcc701b1fd33 | 342 | AD5770R_ALARM_CONFIG, |
mbradley | 1:bcc701b1fd33 | 343 | AD5770R_ALARM_CONFIG_OPEN_DRAIN_EN(alarm_config->open_drain_en) | |
mbradley | 1:bcc701b1fd33 | 344 | AD5770R_ALARM_CONFIG_THERMAL_SHUTDOWN_EN(alarm_config->thermal_shutdown_en) | |
mbradley | 1:bcc701b1fd33 | 345 | AD5770R_ALARM_CONFIG_BACKGROUND_CRC_EN(alarm_config->background_crc_en) | |
mbradley | 1:bcc701b1fd33 | 346 | AD5770R_ALARM_CONFIG_TEMP_WARNING_ALARM_MASK(alarm_config->temp_warning_msk) | |
mbradley | 1:bcc701b1fd33 | 347 | AD5770R_ALARM_CONFIG_OVER_TEMP_ALARM_MASK(alarm_config->over_temp_msk) | |
mbradley | 1:bcc701b1fd33 | 348 | AD5770R_ALARM_CONFIG_NEGATIVE_CHANNEL0_ALARM_MASK(alarm_config->neg_ch0_msk) | |
mbradley | 1:bcc701b1fd33 | 349 | AD5770R_ALARM_CONFIG_IREF_FAULT_ALARM_MASK(alarm_config->iref_fault_msk) | |
mbradley | 1:bcc701b1fd33 | 350 | AD5770R_ALARM_CONFIG_BACKGROUND_CRC_ALARM_MASK( |
mbradley | 1:bcc701b1fd33 | 351 | alarm_config->background_crc_msk)); |
mbradley | 1:bcc701b1fd33 | 352 | |
mbradley | 1:bcc701b1fd33 | 353 | if (ret) |
mbradley | 1:bcc701b1fd33 | 354 | return ret; |
mbradley | 1:bcc701b1fd33 | 355 | |
mbradley | 1:bcc701b1fd33 | 356 | dev->alarm_config = *alarm_config; |
mbradley | 1:bcc701b1fd33 | 357 | |
mbradley | 1:bcc701b1fd33 | 358 | return ret; |
mbradley | 1:bcc701b1fd33 | 359 | }; |
mbradley | 1:bcc701b1fd33 | 360 | |
mbradley | 1:bcc701b1fd33 | 361 | /** |
mbradley | 1:bcc701b1fd33 | 362 | * Set the channel output filter resistor. |
mbradley | 1:bcc701b1fd33 | 363 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 364 | * @param output_filter - The structure that contains the channel output |
mbradley | 1:bcc701b1fd33 | 365 | * filter resistor values. |
mbradley | 1:bcc701b1fd33 | 366 | * @param channel - The channel number. |
mbradley | 1:bcc701b1fd33 | 367 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 368 | */ |
mbradley | 1:bcc701b1fd33 | 369 | int32_t ad5770r_set_output_filter(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 370 | enum ad5770r_output_filter_resistor output_filter, |
mbradley | 1:bcc701b1fd33 | 371 | enum ad5770r_channels channel) |
mbradley | 1:bcc701b1fd33 | 372 | { |
mbradley | 1:bcc701b1fd33 | 373 | if (!dev) |
mbradley | 1:bcc701b1fd33 | 374 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 375 | |
mbradley | 1:bcc701b1fd33 | 376 | return ad5770r_spi_reg_write(dev, |
mbradley | 1:bcc701b1fd33 | 377 | AD5770R_OUTPUT_FILTER_CH0 + channel, |
mbradley | 1:bcc701b1fd33 | 378 | AD5770R_OUTPUT_FILTER_CH(output_filter)); |
mbradley | 1:bcc701b1fd33 | 379 | }; |
mbradley | 1:bcc701b1fd33 | 380 | |
mbradley | 1:bcc701b1fd33 | 381 | /** |
mbradley | 1:bcc701b1fd33 | 382 | * Set the hardware ldac configuration. |
mbradley | 1:bcc701b1fd33 | 383 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 384 | * @param mask_hw_ldac - The array contains HW LDAC channel masks. |
mbradley | 1:bcc701b1fd33 | 385 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 386 | */ |
mbradley | 1:bcc701b1fd33 | 387 | int32_t ad5770r_set_hw_ldac(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 388 | const struct ad5770r_channel_switches *mask_hw_ldac) |
mbradley | 1:bcc701b1fd33 | 389 | { |
mbradley | 1:bcc701b1fd33 | 390 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 391 | |
mbradley | 1:bcc701b1fd33 | 392 | if (!dev || !mask_hw_ldac) |
mbradley | 1:bcc701b1fd33 | 393 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 394 | |
mbradley | 1:bcc701b1fd33 | 395 | ret = ad5770r_spi_reg_write(dev, |
mbradley | 1:bcc701b1fd33 | 396 | AD5770R_HW_LDAC, |
mbradley | 1:bcc701b1fd33 | 397 | AD5770R_HW_LDAC_MASK_CH(mask_hw_ldac->en0, AD5770R_CH0) | |
mbradley | 1:bcc701b1fd33 | 398 | AD5770R_HW_LDAC_MASK_CH(mask_hw_ldac->en1, AD5770R_CH1) | |
mbradley | 1:bcc701b1fd33 | 399 | AD5770R_HW_LDAC_MASK_CH(mask_hw_ldac->en2, AD5770R_CH2) | |
mbradley | 1:bcc701b1fd33 | 400 | AD5770R_HW_LDAC_MASK_CH(mask_hw_ldac->en3, AD5770R_CH3) | |
mbradley | 1:bcc701b1fd33 | 401 | AD5770R_HW_LDAC_MASK_CH(mask_hw_ldac->en4, AD5770R_CH4) | |
mbradley | 1:bcc701b1fd33 | 402 | AD5770R_HW_LDAC_MASK_CH(mask_hw_ldac->en5, AD5770R_CH5)); |
mbradley | 1:bcc701b1fd33 | 403 | |
mbradley | 1:bcc701b1fd33 | 404 | if (ret) |
mbradley | 1:bcc701b1fd33 | 405 | return ret; |
mbradley | 1:bcc701b1fd33 | 406 | |
mbradley | 1:bcc701b1fd33 | 407 | dev->mask_hw_ldac = *mask_hw_ldac; |
mbradley | 1:bcc701b1fd33 | 408 | |
mbradley | 1:bcc701b1fd33 | 409 | return ret; |
mbradley | 1:bcc701b1fd33 | 410 | }; |
mbradley | 1:bcc701b1fd33 | 411 | |
mbradley | 1:bcc701b1fd33 | 412 | /** |
mbradley | 1:bcc701b1fd33 | 413 | * Set dac value. |
mbradley | 1:bcc701b1fd33 | 414 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 415 | * @param dac_value - value that will be set in the register. |
mbradley | 1:bcc701b1fd33 | 416 | * @param channel - the selected channel. |
mbradley | 1:bcc701b1fd33 | 417 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 418 | */ |
mbradley | 1:bcc701b1fd33 | 419 | int32_t ad5770r_set_dac_value(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 420 | uint16_t dac_value, enum ad5770r_channels channel) |
mbradley | 1:bcc701b1fd33 | 421 | { |
mbradley | 1:bcc701b1fd33 | 422 | uint8_t data[2]; |
mbradley | 1:bcc701b1fd33 | 423 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 424 | |
mbradley | 1:bcc701b1fd33 | 425 | if (!dev) |
mbradley | 1:bcc701b1fd33 | 426 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 427 | |
mbradley | 1:bcc701b1fd33 | 428 | data[1] = (uint8_t)AD5770R_CH_DAC_DATA_LSB(dac_value); |
mbradley | 1:bcc701b1fd33 | 429 | data[0] = (uint8_t)((dac_value & 0x3FC0) >> 6); |
mbradley | 1:bcc701b1fd33 | 430 | |
mbradley | 1:bcc701b1fd33 | 431 | ret = ad5770r_spi_reg_write_multiple(dev, |
mbradley | 1:bcc701b1fd33 | 432 | AD5770R_CH0_DAC_MSB + 2 * channel, |
mbradley | 1:bcc701b1fd33 | 433 | data, sizeof(data)); |
mbradley | 1:bcc701b1fd33 | 434 | |
mbradley | 1:bcc701b1fd33 | 435 | if (ret) |
mbradley | 1:bcc701b1fd33 | 436 | return ret; |
mbradley | 1:bcc701b1fd33 | 437 | |
mbradley | 1:bcc701b1fd33 | 438 | dev->dac_value[channel] = dac_value; |
mbradley | 1:bcc701b1fd33 | 439 | dev->input_value[channel] = dac_value; |
mbradley | 1:bcc701b1fd33 | 440 | |
mbradley | 1:bcc701b1fd33 | 441 | return ret; |
mbradley | 1:bcc701b1fd33 | 442 | }; |
mbradley | 1:bcc701b1fd33 | 443 | |
mbradley | 1:bcc701b1fd33 | 444 | /** |
mbradley | 1:bcc701b1fd33 | 445 | * Set dac value. |
mbradley | 1:bcc701b1fd33 | 446 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 447 | * @param dac_input - value that will be set in the register. |
mbradley | 1:bcc701b1fd33 | 448 | * @param channel - the selected channel. |
mbradley | 1:bcc701b1fd33 | 449 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 450 | */ |
mbradley | 1:bcc701b1fd33 | 451 | int32_t ad5770r_set_dac_input(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 452 | uint16_t dac_input, enum ad5770r_channels channel) |
mbradley | 1:bcc701b1fd33 | 453 | { |
mbradley | 1:bcc701b1fd33 | 454 | uint8_t data[2]; |
mbradley | 1:bcc701b1fd33 | 455 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 456 | |
mbradley | 1:bcc701b1fd33 | 457 | if (!dev) |
mbradley | 1:bcc701b1fd33 | 458 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 459 | |
mbradley | 1:bcc701b1fd33 | 460 | data[1] = (uint8_t)AD5770R_CH_DAC_DATA_LSB(dac_input); |
mbradley | 1:bcc701b1fd33 | 461 | data[0] = (uint8_t)((dac_input & 0x3FC0) >> 6); |
mbradley | 1:bcc701b1fd33 | 462 | |
mbradley | 1:bcc701b1fd33 | 463 | ret = ad5770r_spi_reg_write_multiple(dev, |
mbradley | 1:bcc701b1fd33 | 464 | AD5770R_CH0_INPUT_MSB + 2 * channel, |
mbradley | 1:bcc701b1fd33 | 465 | data, sizeof(data)); |
mbradley | 1:bcc701b1fd33 | 466 | if (ret) |
mbradley | 1:bcc701b1fd33 | 467 | return ret; |
mbradley | 1:bcc701b1fd33 | 468 | |
mbradley | 1:bcc701b1fd33 | 469 | dev->input_value[channel] = dac_input; |
mbradley | 1:bcc701b1fd33 | 470 | |
mbradley | 1:bcc701b1fd33 | 471 | return ret; |
mbradley | 1:bcc701b1fd33 | 472 | }; |
mbradley | 1:bcc701b1fd33 | 473 | |
mbradley | 1:bcc701b1fd33 | 474 | /** |
mbradley | 1:bcc701b1fd33 | 475 | * Set page mask for dac value and input. |
mbradley | 1:bcc701b1fd33 | 476 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 477 | * @param page_mask - The structure contains the page mask values. |
mbradley | 1:bcc701b1fd33 | 478 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 479 | */ |
mbradley | 1:bcc701b1fd33 | 480 | int32_t ad5770r_set_page_mask(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 481 | const struct ad5770r_dac_page_mask *page_mask) |
mbradley | 1:bcc701b1fd33 | 482 | { |
mbradley | 1:bcc701b1fd33 | 483 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 484 | uint8_t data[2]; |
mbradley | 1:bcc701b1fd33 | 485 | |
mbradley | 1:bcc701b1fd33 | 486 | if (!dev || !page_mask) |
mbradley | 1:bcc701b1fd33 | 487 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 488 | |
mbradley | 1:bcc701b1fd33 | 489 | data[1] = (uint8_t)AD5770R_CH_DAC_DATA_LSB(page_mask->dac_data_page_mask); |
mbradley | 1:bcc701b1fd33 | 490 | data[0] = (uint8_t)((page_mask->dac_data_page_mask & 0x3FC0) >> 6); |
mbradley | 1:bcc701b1fd33 | 491 | |
mbradley | 1:bcc701b1fd33 | 492 | ret = ad5770r_spi_reg_write_multiple(dev, |
mbradley | 1:bcc701b1fd33 | 493 | AD5770R_DAC_PAGE_MASK_MSB, |
mbradley | 1:bcc701b1fd33 | 494 | data, sizeof(data)); |
mbradley | 1:bcc701b1fd33 | 495 | |
mbradley | 1:bcc701b1fd33 | 496 | if (ret) |
mbradley | 1:bcc701b1fd33 | 497 | return ret; |
mbradley | 1:bcc701b1fd33 | 498 | |
mbradley | 1:bcc701b1fd33 | 499 | data[1] = (uint8_t)AD5770R_CH_DAC_DATA_LSB(page_mask->input_page_mask); |
mbradley | 1:bcc701b1fd33 | 500 | data[0] = (uint8_t)((page_mask->input_page_mask & 0x3FC0) >> 6); |
mbradley | 1:bcc701b1fd33 | 501 | |
mbradley | 1:bcc701b1fd33 | 502 | return ad5770r_spi_reg_write_multiple(dev, |
mbradley | 1:bcc701b1fd33 | 503 | AD5770R_INPUT_PAGE_MASK_MSB, |
mbradley | 1:bcc701b1fd33 | 504 | data, sizeof(data)); |
mbradley | 1:bcc701b1fd33 | 505 | } |
mbradley | 1:bcc701b1fd33 | 506 | |
mbradley | 1:bcc701b1fd33 | 507 | /** |
mbradley | 1:bcc701b1fd33 | 508 | * Set channel select. |
mbradley | 1:bcc701b1fd33 | 509 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 510 | * @param mask_channel_sel - The array contains channel selection options. |
mbradley | 1:bcc701b1fd33 | 511 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 512 | */ |
mbradley | 1:bcc701b1fd33 | 513 | int32_t ad5770r_set_mask_channel(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 514 | const struct ad5770r_channel_switches *mask_channel_sel) |
mbradley | 1:bcc701b1fd33 | 515 | { |
mbradley | 1:bcc701b1fd33 | 516 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 517 | |
mbradley | 1:bcc701b1fd33 | 518 | if (!dev || !mask_channel_sel) |
mbradley | 1:bcc701b1fd33 | 519 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 520 | |
mbradley | 1:bcc701b1fd33 | 521 | ret = ad5770r_spi_reg_write(dev, |
mbradley | 1:bcc701b1fd33 | 522 | AD5770R_CH_SELECT, |
mbradley | 1:bcc701b1fd33 | 523 | AD5770R_CH_SELECT_SEL_CH(mask_channel_sel->en0, AD5770R_CH0) | |
mbradley | 1:bcc701b1fd33 | 524 | AD5770R_CH_SELECT_SEL_CH(mask_channel_sel->en1, AD5770R_CH1) | |
mbradley | 1:bcc701b1fd33 | 525 | AD5770R_CH_SELECT_SEL_CH(mask_channel_sel->en2, AD5770R_CH2) | |
mbradley | 1:bcc701b1fd33 | 526 | AD5770R_CH_SELECT_SEL_CH(mask_channel_sel->en3, AD5770R_CH3) | |
mbradley | 1:bcc701b1fd33 | 527 | AD5770R_CH_SELECT_SEL_CH(mask_channel_sel->en4, AD5770R_CH4) | |
mbradley | 1:bcc701b1fd33 | 528 | AD5770R_CH_SELECT_SEL_CH(mask_channel_sel->en5, AD5770R_CH5)); |
mbradley | 1:bcc701b1fd33 | 529 | |
mbradley | 1:bcc701b1fd33 | 530 | if (ret) |
mbradley | 1:bcc701b1fd33 | 531 | return ret; |
mbradley | 1:bcc701b1fd33 | 532 | |
mbradley | 1:bcc701b1fd33 | 533 | dev->mask_channel_sel = *mask_channel_sel; |
mbradley | 1:bcc701b1fd33 | 534 | |
mbradley | 1:bcc701b1fd33 | 535 | return ret; |
mbradley | 1:bcc701b1fd33 | 536 | } |
mbradley | 1:bcc701b1fd33 | 537 | |
mbradley | 1:bcc701b1fd33 | 538 | /** |
mbradley | 1:bcc701b1fd33 | 539 | * Set software LDAC. |
mbradley | 1:bcc701b1fd33 | 540 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 541 | * @param sw_ldac - The array contains channel selection options. |
mbradley | 1:bcc701b1fd33 | 542 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 543 | */ |
mbradley | 1:bcc701b1fd33 | 544 | int32_t ad5770r_set_sw_ldac(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 545 | const struct ad5770r_channel_switches *sw_ldac) |
mbradley | 1:bcc701b1fd33 | 546 | { |
mbradley | 1:bcc701b1fd33 | 547 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 548 | uint8_t sw_ldac_value; |
mbradley | 1:bcc701b1fd33 | 549 | uint8_t i; |
mbradley | 1:bcc701b1fd33 | 550 | |
mbradley | 1:bcc701b1fd33 | 551 | if (!dev || !sw_ldac) |
mbradley | 1:bcc701b1fd33 | 552 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 553 | |
mbradley | 1:bcc701b1fd33 | 554 | sw_ldac_value = AD5770R_SW_LDAC_CH(sw_ldac->en0, AD5770R_CH0) | |
mbradley | 1:bcc701b1fd33 | 555 | AD5770R_SW_LDAC_CH(sw_ldac->en1, AD5770R_CH1) | |
mbradley | 1:bcc701b1fd33 | 556 | AD5770R_SW_LDAC_CH(sw_ldac->en2, AD5770R_CH2) | |
mbradley | 1:bcc701b1fd33 | 557 | AD5770R_SW_LDAC_CH(sw_ldac->en3, AD5770R_CH3) | |
mbradley | 1:bcc701b1fd33 | 558 | AD5770R_SW_LDAC_CH(sw_ldac->en4, AD5770R_CH4) | |
mbradley | 1:bcc701b1fd33 | 559 | AD5770R_SW_LDAC_CH(sw_ldac->en5, AD5770R_CH5); |
mbradley | 1:bcc701b1fd33 | 560 | |
mbradley | 1:bcc701b1fd33 | 561 | ret = ad5770r_spi_reg_write(dev, AD5770R_SW_LDAC, sw_ldac_value); |
mbradley | 1:bcc701b1fd33 | 562 | |
mbradley | 1:bcc701b1fd33 | 563 | if (ret) |
mbradley | 1:bcc701b1fd33 | 564 | return ret; |
mbradley | 1:bcc701b1fd33 | 565 | |
mbradley | 1:bcc701b1fd33 | 566 | dev->sw_ldac = *sw_ldac; |
mbradley | 1:bcc701b1fd33 | 567 | |
mbradley | 1:bcc701b1fd33 | 568 | for (i = 0; i <= AD5770R_CH5; i++) { |
mbradley | 1:bcc701b1fd33 | 569 | if ((sw_ldac_value >> i) & BIT(0)) { |
mbradley | 1:bcc701b1fd33 | 570 | dev->dac_value[i] = dev->input_value[i]; |
mbradley | 1:bcc701b1fd33 | 571 | } |
mbradley | 1:bcc701b1fd33 | 572 | } |
mbradley | 1:bcc701b1fd33 | 573 | |
mbradley | 1:bcc701b1fd33 | 574 | return ret; |
mbradley | 1:bcc701b1fd33 | 575 | } |
mbradley | 1:bcc701b1fd33 | 576 | |
mbradley | 1:bcc701b1fd33 | 577 | /** |
mbradley | 1:bcc701b1fd33 | 578 | * Get status value. |
mbradley | 1:bcc701b1fd33 | 579 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 580 | * @param status - The status of the device. |
mbradley | 1:bcc701b1fd33 | 581 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 582 | */ |
mbradley | 1:bcc701b1fd33 | 583 | int32_t ad5770r_get_status(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 584 | uint8_t *status) |
mbradley | 1:bcc701b1fd33 | 585 | { |
mbradley | 1:bcc701b1fd33 | 586 | return ad5770r_spi_reg_read(dev, |
mbradley | 1:bcc701b1fd33 | 587 | AD5770R_STATUS, |
mbradley | 1:bcc701b1fd33 | 588 | status); |
mbradley | 1:bcc701b1fd33 | 589 | }; |
mbradley | 1:bcc701b1fd33 | 590 | |
mbradley | 1:bcc701b1fd33 | 591 | /** |
mbradley | 1:bcc701b1fd33 | 592 | * Get interface status value. |
mbradley | 1:bcc701b1fd33 | 593 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 594 | * @param status - The INTERFACE STATUS A register value. |
mbradley | 1:bcc701b1fd33 | 595 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 596 | */ |
mbradley | 1:bcc701b1fd33 | 597 | int32_t ad5770r_get_interface_status(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 598 | uint8_t *status) |
mbradley | 1:bcc701b1fd33 | 599 | { |
mbradley | 1:bcc701b1fd33 | 600 | return ad5770r_spi_reg_read(dev, |
mbradley | 1:bcc701b1fd33 | 601 | AD5770R_INTERFACE_STATUS_A, |
mbradley | 1:bcc701b1fd33 | 602 | status); |
mbradley | 1:bcc701b1fd33 | 603 | }; |
mbradley | 1:bcc701b1fd33 | 604 | |
mbradley | 1:bcc701b1fd33 | 605 | /** |
mbradley | 1:bcc701b1fd33 | 606 | * Set the channel monitor configuration. |
mbradley | 1:bcc701b1fd33 | 607 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 608 | * @param mon_setup - The structure that contains the monitor setup |
mbradley | 1:bcc701b1fd33 | 609 | * values. |
mbradley | 1:bcc701b1fd33 | 610 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 611 | */ |
mbradley | 1:bcc701b1fd33 | 612 | int32_t ad5770r_set_monitor_setup(struct ad5770r_dev *dev, |
mbradley | 1:bcc701b1fd33 | 613 | const struct ad5770r_monitor_setup *mon_setup) |
mbradley | 1:bcc701b1fd33 | 614 | { |
mbradley | 1:bcc701b1fd33 | 615 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 616 | |
mbradley | 1:bcc701b1fd33 | 617 | if (!dev || !mon_setup) |
mbradley | 1:bcc701b1fd33 | 618 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 619 | |
mbradley | 1:bcc701b1fd33 | 620 | ret = ad5770r_spi_reg_write(dev, |
mbradley | 1:bcc701b1fd33 | 621 | AD5770R_MONITOR_SETUP, |
mbradley | 1:bcc701b1fd33 | 622 | AD5770R_MONITOR_SETUP_MON_CH(mon_setup->monitor_channel) | |
mbradley | 1:bcc701b1fd33 | 623 | AD5770R_MONITOR_SETUP_IB_EXT_EN(mon_setup->ib_ext_en) | |
mbradley | 1:bcc701b1fd33 | 624 | AD5770R_MONITOR_SETUP_MUX_BUFFER(mon_setup->mux_buffer) | |
mbradley | 1:bcc701b1fd33 | 625 | AD5770R_MONITOR_SETUP_MON_FUNCTION(mon_setup->monitor_function)); |
mbradley | 1:bcc701b1fd33 | 626 | |
mbradley | 1:bcc701b1fd33 | 627 | if (ret) |
mbradley | 1:bcc701b1fd33 | 628 | return ret; |
mbradley | 1:bcc701b1fd33 | 629 | |
mbradley | 1:bcc701b1fd33 | 630 | dev->mon_setup = *mon_setup; |
mbradley | 1:bcc701b1fd33 | 631 | |
mbradley | 1:bcc701b1fd33 | 632 | return ret; |
mbradley | 1:bcc701b1fd33 | 633 | }; |
mbradley | 1:bcc701b1fd33 | 634 | |
mbradley | 1:bcc701b1fd33 | 635 | /** |
mbradley | 1:bcc701b1fd33 | 636 | * Initialize the device. |
mbradley | 1:bcc701b1fd33 | 637 | * @param device - The device structure. |
mbradley | 1:bcc701b1fd33 | 638 | * @param init_param - The structure that contains the device initial |
mbradley | 1:bcc701b1fd33 | 639 | * parameters. |
mbradley | 1:bcc701b1fd33 | 640 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 641 | */ |
mbradley | 1:bcc701b1fd33 | 642 | int32_t ad5770r_init(struct ad5770r_dev **device, |
mbradley | 1:bcc701b1fd33 | 643 | const struct ad5770r_init_param *init_param) |
mbradley | 1:bcc701b1fd33 | 644 | { |
mbradley | 1:bcc701b1fd33 | 645 | struct ad5770r_dev *dev; |
mbradley | 1:bcc701b1fd33 | 646 | uint8_t product_id_l, product_id_h; |
mbradley | 1:bcc701b1fd33 | 647 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 648 | enum ad5770r_channels i; |
mbradley | 1:bcc701b1fd33 | 649 | |
mbradley | 1:bcc701b1fd33 | 650 | if (!device || !init_param) |
mbradley | 1:bcc701b1fd33 | 651 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 652 | |
mbradley | 1:bcc701b1fd33 | 653 | dev = (struct ad5770r_dev *)calloc(1, sizeof(*dev)); |
mbradley | 1:bcc701b1fd33 | 654 | if (!dev) |
mbradley | 1:bcc701b1fd33 | 655 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 656 | |
mbradley | 1:bcc701b1fd33 | 657 | /* SPI */ |
mbradley | 1:bcc701b1fd33 | 658 | ret = spi_init(&dev->spi_desc, &init_param->spi_init); |
mbradley | 1:bcc701b1fd33 | 659 | |
mbradley | 1:bcc701b1fd33 | 660 | /* Query device presence */ |
mbradley | 1:bcc701b1fd33 | 661 | ad5770r_spi_reg_read(dev, AD5770R_PRODUCT_ID_L, &product_id_l); |
mbradley | 1:bcc701b1fd33 | 662 | ad5770r_spi_reg_read(dev, AD5770R_PRODUCT_ID_H, &product_id_h); |
mbradley | 1:bcc701b1fd33 | 663 | |
mbradley | 1:bcc701b1fd33 | 664 | if (product_id_l != 0x04 || product_id_h != 0x40) { |
mbradley | 1:bcc701b1fd33 | 665 | printf("failed to read id (0x%X : 0x%X)\n", product_id_l, |
mbradley | 1:bcc701b1fd33 | 666 | product_id_h); |
mbradley | 1:bcc701b1fd33 | 667 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 668 | } |
mbradley | 1:bcc701b1fd33 | 669 | |
mbradley | 1:bcc701b1fd33 | 670 | /* Device settings */ |
mbradley | 1:bcc701b1fd33 | 671 | ret = ad5770r_set_device_spi(dev, |
mbradley | 1:bcc701b1fd33 | 672 | &init_param->dev_spi_settings); |
mbradley | 1:bcc701b1fd33 | 673 | |
mbradley | 1:bcc701b1fd33 | 674 | ret |= ad5770r_channel_config(dev, |
mbradley | 1:bcc701b1fd33 | 675 | &init_param->channel_config); |
mbradley | 1:bcc701b1fd33 | 676 | |
mbradley | 1:bcc701b1fd33 | 677 | ret |= ad5770r_set_reference(dev, |
mbradley | 1:bcc701b1fd33 | 678 | init_param->external_reference, |
mbradley | 1:bcc701b1fd33 | 679 | init_param->reference_selector); |
mbradley | 1:bcc701b1fd33 | 680 | ret |= ad5770r_set_alarm(dev, &init_param->alarm_config); |
mbradley | 1:bcc701b1fd33 | 681 | |
mbradley | 1:bcc701b1fd33 | 682 | ret |= ad5770r_set_hw_ldac(dev, |
mbradley | 1:bcc701b1fd33 | 683 | &init_param->mask_hw_ldac); |
mbradley | 1:bcc701b1fd33 | 684 | |
mbradley | 1:bcc701b1fd33 | 685 | for( i = AD5770R_CH0; i <= AD5770R_CH5; i++) { |
mbradley | 1:bcc701b1fd33 | 686 | ret |= ad5770r_set_output_mode(dev, |
mbradley | 1:bcc701b1fd33 | 687 | &init_param->output_mode[i], i); |
mbradley | 1:bcc701b1fd33 | 688 | ret |= ad5770r_set_output_filter(dev, |
mbradley | 1:bcc701b1fd33 | 689 | init_param->output_filter[i], i); |
mbradley | 1:bcc701b1fd33 | 690 | ret |= ad5770r_set_dac_value(dev, |
mbradley | 1:bcc701b1fd33 | 691 | init_param->dac_value[i], i); |
mbradley | 1:bcc701b1fd33 | 692 | ret |= ad5770r_set_dac_input(dev, |
mbradley | 1:bcc701b1fd33 | 693 | init_param->input_value[i], i); |
mbradley | 1:bcc701b1fd33 | 694 | |
mbradley | 1:bcc701b1fd33 | 695 | dev->output_mode[i] = init_param->output_mode[i]; |
mbradley | 1:bcc701b1fd33 | 696 | dev->output_filter[i] = init_param->output_filter[i]; |
mbradley | 1:bcc701b1fd33 | 697 | dev->dac_value[i] = init_param->dac_value[i]; |
mbradley | 1:bcc701b1fd33 | 698 | dev->input_value[i] = init_param->input_value[i]; |
mbradley | 1:bcc701b1fd33 | 699 | } |
mbradley | 1:bcc701b1fd33 | 700 | |
mbradley | 1:bcc701b1fd33 | 701 | ret |= ad5770r_set_page_mask(dev, |
mbradley | 1:bcc701b1fd33 | 702 | &init_param->page_mask); |
mbradley | 1:bcc701b1fd33 | 703 | ret |= ad5770r_set_mask_channel(dev, |
mbradley | 1:bcc701b1fd33 | 704 | &init_param->mask_channel_sel); |
mbradley | 1:bcc701b1fd33 | 705 | ret |= ad5770r_set_sw_ldac(dev, |
mbradley | 1:bcc701b1fd33 | 706 | &init_param->sw_ldac); |
mbradley | 1:bcc701b1fd33 | 707 | ret |= ad5770r_set_monitor_setup(dev, |
mbradley | 1:bcc701b1fd33 | 708 | &init_param->mon_setup); |
mbradley | 1:bcc701b1fd33 | 709 | |
mbradley | 1:bcc701b1fd33 | 710 | *device = dev; |
mbradley | 1:bcc701b1fd33 | 711 | |
mbradley | 1:bcc701b1fd33 | 712 | if (!ret) |
mbradley | 1:bcc701b1fd33 | 713 | printf("ad5770r successfully initialized\n"); |
mbradley | 1:bcc701b1fd33 | 714 | else |
mbradley | 1:bcc701b1fd33 | 715 | printf("ad5770r initialization error (%d)\n", ret); |
mbradley | 1:bcc701b1fd33 | 716 | |
mbradley | 1:bcc701b1fd33 | 717 | return ret; |
mbradley | 1:bcc701b1fd33 | 718 | } |
mbradley | 1:bcc701b1fd33 | 719 | |
mbradley | 1:bcc701b1fd33 | 720 | /** |
mbradley | 1:bcc701b1fd33 | 721 | * Delete and remove the device. |
mbradley | 2:a22a3d5d9f41 | 722 | * @param dev - The device structure. |
mbradley | 1:bcc701b1fd33 | 723 | * @return SUCCESS in case of success, negative error code otherwise. |
mbradley | 1:bcc701b1fd33 | 724 | */ |
mbradley | 1:bcc701b1fd33 | 725 | int32_t ad5770r_remove(struct ad5770r_dev *dev) |
mbradley | 1:bcc701b1fd33 | 726 | { |
mbradley | 1:bcc701b1fd33 | 727 | int32_t ret; |
mbradley | 1:bcc701b1fd33 | 728 | |
mbradley | 1:bcc701b1fd33 | 729 | if (!dev) |
mbradley | 1:bcc701b1fd33 | 730 | return FAILURE; |
mbradley | 1:bcc701b1fd33 | 731 | |
mbradley | 1:bcc701b1fd33 | 732 | ret = spi_remove(dev->spi_desc); |
mbradley | 1:bcc701b1fd33 | 733 | |
mbradley | 1:bcc701b1fd33 | 734 | free(dev); |
mbradley | 1:bcc701b1fd33 | 735 | |
mbradley | 1:bcc701b1fd33 | 736 | return ret; |
mbradley | 1:bcc701b1fd33 | 737 | } |