Program files for Example program for EVAL-AD7768-1

Dependencies:   platform_drivers

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ad77681.c Source File

ad77681.c

Go to the documentation of this file.
00001 /***************************************************************************//**
00002  *   @file   ad77681.c
00003  *   @brief  Implementation of AD7768-1 Driver.
00004  *   @author SPopa (stefan.popa@analog.com)
00005 ********************************************************************************
00006  * Copyright 2017(c) Analog Devices, Inc.
00007  *
00008  * All rights reserved.
00009  *
00010  * Redistribution and use in source and binary forms, with or without
00011  * modification, are permitted provided that the following conditions are met:
00012  *  - Redistributions of source code must retain the above copyright
00013  *    notice, this list of conditions and the following disclaimer.
00014  *  - Redistributions in binary form must reproduce the above copyright
00015  *    notice, this list of conditions and the following disclaimer in
00016  *    the documentation and/or other materials provided with the
00017  *    distribution.
00018  *  - Neither the name of Analog Devices, Inc. nor the names of its
00019  *    contributors may be used to endorse or promote products derived
00020  *    from this software without specific prior written permission.
00021  *  - The use of this software may or may not infringe the patent rights
00022  *    of one or more patent holders.  This license does not release you
00023  *    from the requirement that you obtain separate licenses from these
00024  *    patent holders to use this software.
00025  *  - Use of the software either in source or binary form, must be run
00026  *    on or directly connected to an Analog Devices Inc. component.
00027  *
00028  * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
00029  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
00030  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00031  * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
00032  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00033  * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR
00034  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00035  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00036  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00037  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00038 *******************************************************************************/
00039 
00040 /******************************************************************************/
00041 /***************************** Include Files **********************************/
00042 /******************************************************************************/
00043 #include "stdio.h"
00044 #include "stdlib.h"
00045 #include "stdbool.h"
00046 #include <string.h>
00047 #include "ad77681.h"
00048 #include "error.h"
00049 #include "delay.h"
00050 
00051 /******************************************************************************/
00052 /************************** Functions Implementation **************************/
00053 /******************************************************************************/
00054 /**
00055  * Compute CRC8 checksum.
00056  * @param data - The data buffer.
00057  * @param data_size - The size of the data buffer.
00058  * @param init_val - CRC initial value.
00059  * @return CRC8 checksum.
00060  */
00061 uint8_t ad77681_compute_crc8(uint8_t *data,
00062                  uint8_t data_size,
00063                  uint8_t init_val)
00064 {
00065     uint8_t i;
00066     uint8_t crc = init_val;
00067 
00068     while (data_size) {
00069         for (i = 0x80; i != 0; i >>= 1) {
00070             if (((crc & 0x80) != 0) != ((*data & i) != 0)) {
00071                 crc <<= 1;
00072                 crc ^= AD77681_CRC8_POLY;
00073             } else
00074                 crc <<= 1;
00075         }
00076         data++;
00077         data_size--;
00078     }
00079     return crc;
00080 }
00081 
00082 /**
00083  * Compute XOR checksum.
00084  * @param data - The data buffer.
00085  * @param data_size - The size of the data buffer.
00086  * @param init_val - CRC initial value.
00087  * @return XOR checksum.
00088  */
00089 uint8_t ad77681_compute_xor(uint8_t *data,
00090                 uint8_t data_size,
00091                 uint8_t init_val)
00092 {
00093     uint8_t crc = init_val;
00094     uint8_t buf[3];
00095     uint8_t i;
00096 
00097     for (i = 0; i < data_size; i++) {
00098         buf[i] = *data;
00099         crc ^= buf[i];
00100         data++;
00101     }
00102     return crc;
00103 }
00104 
00105 /**
00106  * Read from device.
00107  * @param dev - The device structure.
00108  * @param reg_addr - The register address.
00109  * @param reg_data - The register data.
00110  * @return 0 in case of success, negative error code otherwise.
00111  */
00112 int32_t ad77681_spi_reg_read(struct ad77681_dev *dev,
00113                  uint8_t reg_addr,
00114                  uint8_t *reg_data)
00115 {
00116     int32_t ret;
00117     uint8_t crc;
00118     uint8_t buf[3], crc_buf[2];
00119     uint8_t buf_len = (dev->crc_sel == AD77681_NO_CRC) ? 2 : 3;
00120 
00121     buf[0] = AD77681_REG_READ(reg_addr);
00122     buf[1] = 0x00;
00123 
00124     ret = spi_write_and_read(dev->spi_desc, buf, buf_len);
00125     if (ret < 0)
00126         return ret;
00127 
00128     /* XOR or CRC checksum for read transactions */
00129     if (dev->crc_sel != AD77681_NO_CRC) {
00130         crc_buf[0] = AD77681_REG_READ(reg_addr);
00131         crc_buf[1] = buf[1];
00132 
00133         if (dev->crc_sel == AD77681_XOR)
00134             /* INITIAL_CRC is 0, when ADC is not in continuous-read mode */
00135             crc = ad77681_compute_xor(crc_buf, 2, INITIAL_CRC);
00136         else if(dev->crc_sel == AD77681_CRC)
00137             /* INITIAL_CRC is 0, when ADC is not in continuous-read mode */
00138             crc = ad77681_compute_crc8(crc_buf, 2, INITIAL_CRC);
00139 
00140         /* In buf[2] is CRC from the ADC */
00141         if (crc != buf[2])
00142             ret = FAILURE;
00143 #ifdef CRC_DEBUG
00144         printf("\n%x\t%x\tCRC/XOR: %s\n", crc,
00145                buf[2], ((crc !=  buf[2]) ? "FAULT" : "OK"));
00146 #endif /* CRC_DEBUG */
00147     }
00148 
00149     reg_data[0] = AD77681_REG_READ(reg_addr);
00150     memcpy(reg_data + 1, buf + 1, ARRAY_SIZE(buf) - 1);
00151 
00152     return ret;
00153 }
00154 
00155 /**
00156  * Write to device.
00157  * @param dev - The device structure.
00158  * @param reg_addr - The register address.
00159  * @param reg_data - The register data.
00160  * @return 0 in case of success, negative error code otherwise.
00161  */
00162 int32_t ad77681_spi_reg_write(struct ad77681_dev *dev,
00163                   uint8_t reg_addr,
00164                   uint8_t reg_data)
00165 {
00166     uint8_t buf[3];
00167     /* Buffer length in case of checksum usage */
00168     uint8_t buf_len = (dev->crc_sel == AD77681_NO_CRC) ? 2 : 3;
00169 
00170     buf[0] = AD77681_REG_WRITE(reg_addr);
00171     buf[1] = reg_data;
00172 
00173     /* CRC only for read transactions, CRC and XOR for write transactions*/
00174     if (dev->crc_sel != AD77681_NO_CRC)
00175         buf[2] = ad77681_compute_crc8(buf, 2, INITIAL_CRC);
00176 
00177     return spi_write_and_read(dev->spi_desc, buf, buf_len);
00178 }
00179 
00180 /**
00181  * SPI read from device using a mask.
00182  * @param dev - The device structure.
00183  * @param reg_addr - The register address.
00184  * @param mask - The mask.
00185  * @param data - The register data.
00186  * @return 0 in case of success, negative error code otherwise.
00187  */
00188 int32_t ad77681_spi_read_mask(struct ad77681_dev *dev,
00189                   uint8_t reg_addr,
00190                   uint8_t mask,
00191                   uint8_t *data)
00192 {
00193     uint8_t reg_data[3];
00194     int32_t ret;
00195 
00196     ret = ad77681_spi_reg_read(dev, reg_addr, reg_data);
00197     *data = (reg_data[1] & mask);
00198 
00199     return ret;
00200 }
00201 
00202 /**
00203  * SPI write to device using a mask.
00204  * @param dev - The device structure.
00205  * @param reg_addr - The register address.
00206  * @param mask - The mask.
00207  * @param data - The register data.
00208  * @return 0 in case of success, negative error code otherwise.
00209  */
00210 int32_t ad77681_spi_write_mask(struct ad77681_dev *dev,
00211                    uint8_t reg_addr,
00212                    uint8_t mask,
00213                    uint8_t data)
00214 {
00215     uint8_t reg_data[3];
00216     int32_t ret;
00217 
00218     ret = ad77681_spi_reg_read(dev, reg_addr, reg_data);
00219     reg_data[1] &= ~mask;
00220     reg_data[1] |= data;
00221     ret |= ad77681_spi_reg_write(dev, reg_addr, reg_data[1]);
00222 
00223     return ret;
00224 }
00225 
00226 /**
00227  * Helper function to get the number of rx bytes
00228  * @param dev - The device structure.
00229  * @return rx_buf_len - the number of rx bytes
00230  */
00231 uint8_t ad77681_get_rx_buf_len(struct ad77681_dev *dev)
00232 {
00233     uint8_t rx_buf_len = 0;
00234     uint8_t data_len = 0;
00235     uint8_t crc = 0;
00236     uint8_t status_bit = 0;
00237 
00238     data_len = 3;
00239     crc = (dev->crc_sel == AD77681_NO_CRC) ? 0 : 1; // 1 byte for crc
00240     status_bit = dev->status_bit; // one byte for status
00241 
00242     rx_buf_len = data_len + crc + status_bit;
00243 
00244     return rx_buf_len;
00245 }
00246 
00247 /**
00248  * Helper function to get the number of SPI 16bit frames for INTERRUPT ADC DATA READ
00249  * @param dev - The device structure.
00250  * @return frame_16bit - the number of 16 bit SPI frames
00251  */
00252 uint8_t ad77681_get_frame_byte(struct ad77681_dev *dev)
00253 {
00254     /* number of 8bit frames */
00255     uint8_t frame_bytes;
00256     if (dev->conv_len == AD77681_CONV_24BIT)
00257         frame_bytes = 3;
00258     else
00259         frame_bytes = 2;
00260     if (dev->crc_sel != AD77681_NO_CRC)
00261         frame_bytes++;
00262     if (dev->status_bit)
00263         frame_bytes++;
00264 
00265     dev->data_frame_byte = frame_bytes;
00266 
00267     return frame_bytes;
00268 }
00269 
00270 /**
00271  * Read conversion result from device.
00272  * @param dev - The device structure.
00273  * @param adc_data - The conversion result data
00274  * @param mode - Data read mode
00275  *      Accepted values: AD77681_REGISTER_DATA_READ
00276  *               AD77681_CONTINUOUS_DATA_READ
00277  * @return 0 in case of success, negative error code otherwise.
00278  */
00279 int32_t ad77681_spi_read_adc_data(struct ad77681_dev *dev,
00280                   uint8_t *adc_data,
00281                   enum ad77681_data_read_mode mode)
00282 {
00283     uint8_t buf[6], crc_xor, add_buff;
00284     int32_t ret;
00285 
00286     if (mode == AD77681_REGISTER_DATA_READ) {
00287         buf[0] = AD77681_REG_READ(AD77681_REG_ADC_DATA);
00288         add_buff = 1;
00289     } else {
00290         buf[0] = 0x00;
00291         add_buff = 0;
00292     }
00293     buf[1] = 0x00; /* added 2 more array places for max data length read */
00294     buf[2] = 0x00; /* For register data read */
00295     buf[3] = 0x00; /* register address + 3 bytes of data (24bit format) + Status bit + CRC */
00296     buf[4] = 0x00; /* For continuous data read */
00297     buf[5] = 0x00; /* 3 bytes of data (24bit format) + Status bit + CRC */
00298 
00299 
00300     ret = spi_write_and_read(dev->spi_desc, buf, dev->data_frame_byte + add_buff);
00301     if (ret < 0)
00302         return ret;
00303 
00304     if (dev->crc_sel != AD77681_NO_CRC) {
00305         if (dev->crc_sel == AD77681_CRC)
00306             crc_xor = ad77681_compute_crc8(buf + add_buff, dev->data_frame_byte - 1,
00307                                INITIAL_CRC_CRC8);
00308         else
00309             crc_xor = ad77681_compute_xor(buf + add_buff, dev->data_frame_byte - 1,
00310                               INITIAL_CRC_XOR);
00311 
00312         if (crc_xor != buf[dev->data_frame_byte - (1 - add_buff)]) {
00313             printf("%s: CRC Error.\n", __func__);
00314             ret = FAILURE;
00315         }
00316 #ifdef CRC_DEBUG
00317         printf("\n%x\t%x\tCRC/XOR: %s\n", crc_xor,
00318                buf[dev->data_frame_byte - (1 - add_buff)],
00319                ((crc_xor != buf[dev->data_frame_byte - (1 - add_buff)]) ? "FAULT" : "OK"));
00320 #endif /* CRC_DEBUG */
00321     }
00322 
00323     /* Fill the adc_data buffer */
00324     memcpy(adc_data, buf, ARRAY_SIZE(buf));
00325 
00326     return ret;
00327 }
00328 
00329 /**
00330  * CRC and status bit handling after each readout form the ADC
00331  * @param dev - The device structure.
00332  * @param *data_buffer - 16-bit buffer readed from the ADC containing the CRC,
00333  * data and the stattus bit.
00334  * @return 0 in case of success, negative error code otherwise.
00335  */
00336 int32_t ad77681_CRC_status_handling(struct ad77681_dev *dev,
00337                     uint16_t *data_buffer)
00338 {
00339     int32_t ret = 0;
00340     uint8_t status_byte = 0, checksum = 0, checksum_byte = 0, checksum_buf[5],
00341         checksum_length = 0, i;
00342     char print_buf[50];
00343 
00344     /* Status bit handling */
00345     if (dev->status_bit) {
00346         /* 24bit ADC data + 8bit of status = 2 16bit frames */
00347         if (dev->conv_len == AD77681_CONV_24BIT)
00348             status_byte = data_buffer[1] & 0xFF;
00349         /* 16bit ADC data + 8bit of status = 2 16bit frames */
00350         else
00351             status_byte = data_buffer[1] >> 8;
00352     }
00353 
00354     /* Checksum bit handling */
00355     if (dev->crc_sel != AD77681_NO_CRC) {
00356         if ((dev->status_bit == true) & (dev->conv_len == AD77681_CONV_24BIT)) {
00357             /* 24bit ADC data + 8bit of status + 8bit of CRC = 3 16bit frames */
00358             checksum_byte = data_buffer[2] >> 8;
00359             checksum_length = 4;
00360         } else if ((dev->status_bit == true) & (dev->conv_len == AD77681_CONV_16BIT)) {
00361             /* 16bit ADC data + 8bit of status + 8bit of CRC = 2 16bit frames */
00362             checksum_byte = data_buffer[1] & 0xFF;
00363             checksum_length = 3;
00364         } else if ((dev->status_bit == false) & (dev->conv_len == AD77681_CONV_24BIT)) {
00365             /* 24bit ADC data + 8bit of CRC = 2 16bit frames */
00366             checksum_byte = data_buffer[1] & 0xFF;
00367             checksum_length = 3;
00368         } else if ((dev->status_bit == false) & (dev->conv_len == AD77681_CONV_16BIT)) {
00369             /* 16bit ADC data + 8bit of CRC = 2 16bit frames */
00370             checksum_byte = data_buffer[1] >> 8;
00371             checksum_length = 2;
00372         }
00373 
00374         for (i = 0; i < checksum_length; i++) {
00375             if (i % 2)
00376                 checksum_buf[i] = data_buffer[i / 2] & 0xFF;
00377             else
00378                 checksum_buf[i] = data_buffer[i / 2] >> 8;
00379         }
00380 
00381         if (dev->crc_sel == AD77681_CRC)
00382             checksum = ad77681_compute_crc8(checksum_buf, checksum_length,
00383                             INITIAL_CRC_CRC8);
00384         else if (dev->crc_sel == AD77681_XOR)
00385             checksum = ad77681_compute_xor(checksum_buf, checksum_length, INITIAL_CRC_XOR);
00386 
00387         if (checksum != checksum_byte)
00388             ret = FAILURE;
00389 
00390 #ifdef CRC_DEBUG
00391 
00392         char ok[3] = { 'O', 'K' }, fault[6] = { 'F', 'A', 'U', 'L', 'T' };
00393         sprintf(print_buf, "\n%x\t%x\t%x\tCRC %s", checksum_byte, checksum, status_byte,
00394             ((ret == FAILURE) ? (fault) : (ok)));
00395         printf(print_buf);
00396 
00397 #endif /* CRC_DEBUG */
00398     }
00399 
00400     return ret;
00401 }
00402 
00403 /**
00404  * Conversion from measured data to voltage
00405  * @param dev - The device structure.
00406  * @param raw_code - ADC raw code measurements
00407  * @param voltage - Converted ADC code to voltage
00408  * @return 0 in case of success, negative error code otherwise.
00409  */
00410 int32_t ad77681_data_to_voltage(struct ad77681_dev *dev,
00411                 uint32_t *raw_code,
00412                 double *voltage)
00413 {
00414     int32_t converted_data;
00415 
00416     if (*raw_code & 0x800000)
00417         converted_data = (int32_t)((0xFF << 24) | *raw_code);
00418     else
00419         converted_data = (int32_t)((0x00 << 24) | *raw_code);
00420 
00421     /* ((2*Vref)*code)/2^24 */
00422     *voltage = (double)(((2.0 * (((double)(dev->vref)) / 1000.0)) /
00423                  AD7768_FULL_SCALE) * converted_data);
00424 
00425     return SUCCESS;
00426 }
00427 
00428 /**
00429  * Update ADCs sample rate depending on MCLK, MCLK_DIV and filter settings
00430  * @param dev - The device structure.
00431  * @return 0 in case of success, negative error code otherwise.
00432  */
00433 int32_t ad77681_update_sample_rate(struct ad77681_dev *dev)
00434 {
00435     uint8_t mclk_div;
00436     uint16_t osr;
00437 
00438     /* Finding out MCLK divider */
00439     switch (dev->mclk_div) {
00440     case AD77681_MCLK_DIV_16:
00441         mclk_div = 16;
00442         break;
00443     case AD77681_MCLK_DIV_8:
00444         mclk_div = 8;
00445         break;
00446     case AD77681_MCLK_DIV_4:
00447         mclk_div = 4;
00448         break;
00449     case AD77681_MCLK_DIV_2:
00450         mclk_div = 2;
00451         break;
00452     default:
00453         return FAILURE;
00454         break;
00455     }
00456 
00457     /* Finding out decimation ratio */
00458     switch (dev->filter) {
00459     case (AD77681_SINC5 | AD77681_FIR):
00460         /* Decimation ratio of FIR or SINC5 (x32 to x1024) */
00461         switch (dev->decimate) {
00462         case AD77681_SINC5_FIR_DECx32:
00463             osr = 32;
00464             break;
00465         case AD77681_SINC5_FIR_DECx64:
00466             osr = 64;
00467             break;
00468         case AD77681_SINC5_FIR_DECx128:
00469             osr = 128;
00470             break;
00471         case AD77681_SINC5_FIR_DECx256:
00472             osr = 256;
00473             break;
00474         case AD77681_SINC5_FIR_DECx512:
00475             osr = 512;
00476             break;
00477         case AD77681_SINC5_FIR_DECx1024:
00478             osr = 1024;
00479             break;
00480         default:
00481             return FAILURE;
00482             break;
00483         }
00484         break;
00485     /* Decimation ratio of SINC5 x8 */
00486     case AD77681_SINC5_DECx8:
00487         osr = 8;
00488         break;
00489     /* Decimation ratio of SINC5 x16 */
00490     case AD77681_SINC5_DECx16:
00491         osr = 16;
00492         break;
00493     /* Decimation ratio of SINC3 */
00494     case AD77681_SINC3:
00495         osr = (dev->sinc3_osr + 1) * 32;
00496         break;
00497     default:
00498         return FAILURE;
00499         break;
00500     }
00501 
00502     /* Sample rate to Hz */
00503     dev->sample_rate = (dev->mclk / (osr*mclk_div)) * 1000;
00504 
00505     return SUCCESS;
00506 }
00507 
00508 /**
00509  * Get SINC3 filter oversampling ratio register value based on user's inserted
00510  * output data rate ODR
00511  * @param dev - The device structure.
00512  * @param sinc3_dec_reg - Returned closest value of SINC3 register
00513  * @param sinc3_odr - Desired output data rage
00514  * @return 0 in case of success, negative error code otherwise.
00515  */
00516 int32_t ad77681_SINC3_ODR(struct ad77681_dev *dev,
00517               uint16_t *sinc3_dec_reg,
00518               float sinc3_odr)
00519 {
00520     uint8_t mclk_div;
00521     float   odr;
00522 
00523     if (sinc3_odr < 0)
00524         return FAILURE;
00525 
00526     switch (dev->mclk_div) {
00527     case AD77681_MCLK_DIV_16:
00528         mclk_div = 16;
00529         break;
00530     case AD77681_MCLK_DIV_8:
00531         mclk_div = 8;
00532         break;
00533     case AD77681_MCLK_DIV_4:
00534         mclk_div = 4;
00535         break;
00536     case AD77681_MCLK_DIV_2:
00537         mclk_div = 2;
00538         break;
00539     default:
00540         return FAILURE;
00541         break;
00542     }
00543 
00544     odr = ((float)(dev->mclk * 1000.0) / (sinc3_odr * (float)(32 * mclk_div))) - 1;
00545 
00546     /* Sinc3 oversamplig register has 13 bits, biggest value = 8192 */
00547     if (odr < 8193)
00548         *sinc3_dec_reg = (uint16_t)(odr);
00549     else
00550         return FAILURE;
00551 
00552     return SUCCESS;
00553 }
00554 
00555 /**
00556  * Set the power consumption mode of the ADC core.
00557  * @param dev - The device structure.
00558  * @param mode - The power mode.
00559  *                  Accepted values: AD77681_ECO
00560  *                                   AD77681_MEDIAN
00561  *                                   AD77681_FAST
00562  * @return 0 in case of success, negative error code otherwise.
00563  */
00564 int32_t ad77681_set_power_mode(struct ad77681_dev *dev,
00565                    enum ad77681_power_mode mode)
00566 {
00567     int32_t ret;
00568 
00569     ret = ad77681_spi_write_mask(dev,
00570                      AD77681_REG_POWER_CLOCK,
00571                      AD77681_POWER_CLK_PWRMODE_MSK,
00572                      AD77681_POWER_CLK_PWRMODE(mode));
00573 
00574     if (ret == SUCCESS)
00575         dev->power_mode = mode;
00576 
00577     return ret;
00578 }
00579 
00580 /**
00581  * Set the MCLK divider.
00582  * @param dev - The device structure.
00583  * @param clk_div - The MCLK divider.
00584  *                  Accepted values: AD77681_MCLK_DIV_16
00585  *                                   AD77681_MCLK_DIV_8
00586  *                                   AD77681_MCLK_DIV_4
00587  *                                   AD77681_MCLK_DIV_2
00588  * @return 0 in case of success, negative error code otherwise.
00589  */
00590 int32_t ad77681_set_mclk_div(struct ad77681_dev *dev,
00591                  enum ad77681_mclk_div clk_div)
00592 {
00593     int32_t ret;
00594 
00595     ret = ad77681_spi_write_mask(dev,
00596                      AD77681_REG_POWER_CLOCK,
00597                      AD77681_POWER_CLK_MCLK_DIV_MSK,
00598                      AD77681_POWER_CLK_MCLK_DIV(clk_div));
00599 
00600     if (ret == SUCCESS)
00601         dev->mclk_div = clk_div;
00602 
00603     return ret;
00604 }
00605 
00606 /**
00607  * Set the VCM output.
00608  * @param dev - The device structure.
00609  * @param VCM_out - The VCM output voltage.
00610  *          Accepted values: AD77681_VCM_HALF_VCC
00611  *                   AD77681_VCM_2_5V
00612  *                   AD77681_VCM_2_05V
00613  *                   AD77681_VCM_1_9V
00614  *                   AD77681_VCM_1_65V
00615  *                   AD77681_VCM_1_1V
00616  *                   AD77681_VCM_0_9V
00617  *                   AD77681_VCM_OFF
00618  * @return 0 in case of success, negative error code otherwise.
00619  */
00620 int32_t ad77681_set_VCM_output(struct ad77681_dev *dev,
00621                    enum ad77681_VCM_out VCM_out)
00622 {
00623     int32_t ret;
00624 
00625     ret = ad77681_spi_write_mask(dev,
00626                      AD77681_REG_ANALOG2,
00627                      AD77681_ANALOG2_VCM_MSK,
00628                      AD77681_ANALOG2_VCM(VCM_out));
00629 
00630     if (ret == SUCCESS)
00631         dev->VCM_out = VCM_out;
00632 
00633     return ret;
00634 }
00635 
00636 /**
00637  * Set the AIN- precharge buffer.
00638  * @param dev - The device structure.
00639  * @param AINn - The negative analog input precharge buffer selector
00640  *       Accepted values: AD77681_AINn_ENABLED
00641  *                AD77681_AINn_DISABLED
00642  * @return 0 in case of success, negative error code otherwise.
00643  */
00644 int32_t ad77681_set_AINn_buffer(struct ad77681_dev *dev,
00645                 enum ad77681_AINn_precharge AINn)
00646 {
00647     int32_t ret;
00648 
00649     ret = ad77681_spi_write_mask(dev,
00650                      AD77681_REG_ANALOG,
00651                      AD77681_ANALOG_AIN_BUF_NEG_OFF_MSK,
00652                      AD77681_ANALOG_AIN_BUF_NEG_OFF(AINn));
00653 
00654     if (ret == SUCCESS)
00655         dev->AINn = AINn;
00656 
00657     return ret;
00658 }
00659 
00660 /**
00661  * Set the AIN+ precharge buffer.
00662  * @param dev - The device structure.
00663  * @param AINp - The positive analog input precharge buffer selector
00664  *       Accepted values: AD77681_AINp_ENABLED
00665  *                AD77681_AINp_DISABLED
00666  * @return 0 in case of success, negative error code otherwise.
00667  */
00668 int32_t ad77681_set_AINp_buffer(struct ad77681_dev *dev,
00669                 enum ad77681_AINp_precharge AINp)
00670 {
00671     int32_t ret;
00672 
00673     ret = ad77681_spi_write_mask(dev,
00674                      AD77681_REG_ANALOG,
00675                      AD77681_ANALOG_AIN_BUF_POS_OFF_MSK,
00676                      AD77681_ANALOG_AIN_BUF_POS_OFF(AINp));
00677 
00678     if (ret == SUCCESS)
00679         dev->AINp = AINp;
00680 
00681     return ret;
00682 }
00683 
00684 /**
00685  * Set the REF- reference buffer
00686  * @param dev - The device structure.
00687  * @param REFn - The negative reference buffer selector
00688  *       Accepted values: AD77681_BUFn_DISABLED
00689  *                AD77681_BUFn_ENABLED
00690  *                AD77681_BUFn_FULL_BUFFER_ON
00691  * @return 0 in case of success, negative error code otherwise.
00692  */
00693 int32_t ad77681_set_REFn_buffer(struct ad77681_dev *dev,
00694                 enum ad77681_REFn_buffer REFn)
00695 {
00696     int32_t ret;
00697 
00698     ret = ad77681_spi_write_mask(dev,
00699                      AD77681_REG_ANALOG,
00700                      AD77681_ANALOG_REF_BUF_NEG_MSK,
00701                      AD77681_ANALOG_REF_BUF_NEG(REFn));
00702 
00703     if (ret == SUCCESS)
00704         dev->REFn = REFn;
00705 
00706     return ret;
00707 }
00708 
00709 /**
00710  * Set the REF+ reference buffer
00711  * @param dev -  The device structure.
00712  * @param REFp - The positive reference buffer selector
00713  *       Accepted values: AD77681_BUFp_DISABLED
00714  *                AD77681_BUFp_ENABLED
00715  *                AD77681_BUFp_FULL_BUFFER_ON
00716  * @return 0 in case of success, negative error code otherwise.
00717  */
00718 int32_t ad77681_set_REFp_buffer(struct ad77681_dev *dev,
00719                 enum ad77681_REFp_buffer REFp)
00720 {
00721     int32_t ret;
00722 
00723     ret = ad77681_spi_write_mask(dev,
00724                      AD77681_REG_ANALOG,
00725                      AD77681_ANALOG_REF_BUF_POS_MSK,
00726                      AD77681_ANALOG_REF_BUF_POS(REFp));
00727 
00728     if (ret == SUCCESS)
00729         dev->REFp = REFp;
00730     else
00731         return FAILURE;
00732 
00733     return ret;
00734 }
00735 
00736 /**
00737  * Set filter type and decimation ratio
00738  * @param dev - The device structure.
00739  * @param decimate - Decimation ratio of filter
00740  *          Accepted values: AD77681_SINC5_FIR_DECx32
00741  *                   AD77681_SINC5_FIR_DECx64
00742  *                   AD77681_SINC5_FIR_DECx128
00743  *                   AD77681_SINC5_FIR_DECx256
00744  *                   AD77681_SINC5_FIR_DECx512
00745  *                   AD77681_SINC5_FIR_DECx1024
00746  * @param filter - Select filter type
00747  *          Accepted values: AD77681_SINC5
00748  *                   AD77681_SINC5_DECx8
00749  *                   AD77681_SINC5_DECx16
00750  *                   AD77681_SINC3
00751  *                   AD77681_FIR
00752  * @param sinc3_osr - Select decimation ratio for SINC3 filter separately as
00753  *          integer from 0 to 8192.
00754  *          See the AD7768-1 datasheet for more info
00755  * @return 0 in case of success, negative error code otherwise.
00756  */
00757 int32_t ad77681_set_filter_type(struct ad77681_dev *dev,
00758                 enum ad77681_sinc5_fir_decimate decimate,
00759                 enum ad77681_filter_type filter,
00760                 uint16_t sinc3_osr)
00761 {
00762     int32_t ret;
00763 
00764     ret = ad77681_spi_reg_write(dev, AD77681_REG_DIGITAL_FILTER, 0x00);
00765 
00766     /* SINC5 for OSR 8x and 16x*/
00767     if ((filter == AD77681_SINC5_DECx8) || (filter == AD77681_SINC5_DECx16)) {
00768         ret |= ad77681_spi_write_mask(dev,
00769                           AD77681_REG_DIGITAL_FILTER,
00770                           AD77681_DIGI_FILTER_FILTER_MSK,
00771                           AD77681_DIGI_FILTER_FILTER(filter));
00772         /* SINC5 and FIR for osr 32x to 1024x */
00773     } else if ((filter == AD77681_SINC5) || (filter == AD77681_FIR)) {
00774         ret |= ad77681_spi_write_mask(dev,
00775                           AD77681_REG_DIGITAL_FILTER,
00776                           AD77681_DIGI_FILTER_FILTER_MSK,
00777                           AD77681_DIGI_FILTER_FILTER(filter));
00778 
00779         ret |= ad77681_spi_write_mask(dev,
00780                           AD77681_REG_DIGITAL_FILTER,
00781                           AD77681_DIGI_FILTER_DEC_RATE_MSK,
00782                           AD77681_DIGI_FILTER_DEC_RATE(decimate));
00783         /* SINC3*/
00784     } else {
00785         uint8_t sinc3_LSB = 0, sinc3_MSB = 0;
00786 
00787         sinc3_MSB = sinc3_osr >> 8;
00788         sinc3_LSB = sinc3_osr & 0x00FF;
00789 
00790         ret |= ad77681_spi_write_mask(dev,
00791                           AD77681_REG_DIGITAL_FILTER,
00792                           AD77681_DIGI_FILTER_FILTER_MSK,
00793                           AD77681_DIGI_FILTER_FILTER(filter));
00794 
00795         ret |= ad77681_spi_write_mask(dev,
00796                           AD77681_REG_SINC3_DEC_RATE_MSB,
00797                           AD77681_SINC3_DEC_RATE_MSB_MSK,
00798                           AD77681_SINC3_DEC_RATE_MSB(sinc3_MSB));
00799 
00800         ret |= ad77681_spi_write_mask(dev,
00801                           AD77681_REG_SINC3_DEC_RATE_LSB,
00802                           AD77681_SINC3_DEC_RATE_LSB_MSK,
00803                           AD77681_SINC3_DEC_RATE_LSB(sinc3_LSB));
00804     }
00805 
00806     if ( ret == SUCCESS) {
00807         dev->decimate = decimate;
00808         dev->filter = filter;
00809         /* Sync pulse after each filter change */
00810         ret |= ad77681_initiate_sync(dev);
00811     }
00812 
00813     return ret;
00814 }
00815 
00816 /**
00817  * Enable 50/60 Hz rejection
00818  * @param dev - The device structure.
00819  * @param enable - The positive reference buffer selector
00820  *         Accepted values: true
00821  *                  false
00822  * @return 0 in case of success, negative error code otherwise.
00823  */
00824 int32_t ad77681_set_50HZ_rejection(struct ad77681_dev *dev,
00825                    uint8_t enable)
00826 {
00827     int32_t ret;
00828 
00829     ret = ad77681_spi_write_mask(dev,
00830                      AD77681_REG_DIGITAL_FILTER,
00831                      AD77681_DIGI_FILTER_60HZ_REJ_EN_MSK,
00832                      AD77681_DIGI_FILTER_60HZ_REJ_EN(enable));
00833 
00834     return ret;
00835 }
00836 
00837 /**
00838  * Set the REF- reference buffer
00839  * @param dev - The device structure.
00840  * @param continuous_enable - Continous read enable
00841  *       Accepted values: AD77681_CONTINUOUS_READ_ENABLE
00842  *                AD77681_CONTINUOUS_READ_DISABLE
00843  * @return 0 in case of success, negative error code otherwise.
00844  */
00845 int32_t ad77681_set_continuos_read(struct ad77681_dev *dev,
00846                    enum ad77681_continuous_read continuous_enable)
00847 {
00848     int32_t ret;
00849 
00850     if (continuous_enable) {
00851         ret = ad77681_spi_write_mask(dev,
00852                          AD77681_REG_INTERFACE_FORMAT,
00853                          AD77681_INTERFACE_CONT_READ_MSK,
00854                          AD77681_INTERFACE_CONT_READ_EN(continuous_enable));
00855     } else {
00856         /* To exit the continuous read mode, a key 0x6C must be
00857         written into the device over the SPI*/
00858         uint8_t end_key = EXIT_CONT_READ;
00859         ret = spi_write_and_read(dev->spi_desc, &end_key, 1);
00860     }
00861 
00862     return ret;
00863 }
00864 
00865 /**
00866  * Power down / power up the device
00867  * @param dev - The device structure.
00868  * @param sleep_wake - Power down, or power up the ADC
00869  *          Accepted values: AD77681_SLEEP
00870  *                   AD77681_WAKE
00871  * @return 0 in case of success, negative error code otherwise.
00872  */
00873 int32_t ad77681_power_down(struct ad77681_dev *dev,
00874                enum ad77681_sleep_wake sleep_wake)
00875 {
00876     int32_t ret;
00877 
00878     if (sleep_wake == AD77681_SLEEP) {
00879         ret = ad77681_spi_reg_write(dev, AD77681_REG_POWER_CLOCK,
00880                         AD77681_POWER_CLK_POWER_DOWN);
00881     } else {
00882         /* Wake up the ADC over SPI, by sending a wake-up sequence:
00883         1 followed by 63 zeroes and CS hold low*/
00884         uint8_t wake_sequence[8] = { 0 };
00885         /* Insert '1' to the beginning of the wake_sequence*/
00886         wake_sequence[0] = 0x80;
00887         ret = spi_write_and_read(dev->spi_desc, wake_sequence,
00888                      ARRAY_SIZE(wake_sequence));
00889     }
00890 
00891     return ret;
00892 }
00893 
00894 /**
00895  * Conversion mode and source select
00896  * @param dev - The device structure.
00897  * @param conv_mode - Sets the conversion mode of the ADC
00898  *                    Accepted values: AD77681_CONV_CONTINUOUS
00899  *                                     AD77681_CONV_ONE_SHOT
00900  *                                     AD77681_CONV_SINGLE
00901  *                                     AD77681_CONV_PERIODIC
00902  * @param diag_mux_sel - Selects which signal to route through diagnostic mux
00903  *                    Accepted values: AD77681_TEMP_SENSOR
00904  *                                     AD77681_AIN_SHORT
00905  *                                     AD77681_POSITIVE_FS
00906  *                                     AD77681_NEGATIVE_FS
00907  * @param conv_diag_sel - Select the input for conversion as AIN or diagnostic mux
00908  *                    Accepted values: true
00909  *                                     false
00910  * @return 0 in case of success, negative error code otherwise.
00911  */
00912 int32_t ad77681_set_conv_mode(struct ad77681_dev *dev,
00913                   enum ad77681_conv_mode conv_mode,
00914                   enum ad77681_conv_diag_mux diag_mux_sel,
00915                   bool conv_diag_sel)
00916 {
00917     int32_t ret;
00918 
00919     ret = ad77681_spi_write_mask(dev,
00920                      AD77681_REG_CONVERSION,
00921                      AD77681_CONVERSION_MODE_MSK,
00922                      AD77681_CONVERSION_MODE(conv_mode));
00923 
00924     ret |= ad77681_spi_write_mask(dev,
00925                       AD77681_REG_CONVERSION,
00926                       AD77681_CONVERSION_DIAG_MUX_MSK,
00927                       AD77681_CONVERSION_DIAG_MUX_SEL(diag_mux_sel));
00928 
00929     ret |= ad77681_spi_write_mask(dev,
00930                       AD77681_REG_CONVERSION,
00931                       AD77681_CONVERSION_DIAG_SEL_MSK,
00932                       AD77681_CONVERSION_DIAG_SEL(conv_diag_sel));
00933 
00934     if (ret == SUCCESS) {
00935         dev->conv_mode = conv_mode;
00936         dev->diag_mux_sel = diag_mux_sel;
00937         dev->conv_diag_sel = conv_diag_sel;
00938     }
00939 
00940     return ret;
00941 }
00942 
00943 /**
00944  * Set the Conversion Result Output Length.
00945  * @param dev - The device structure.
00946  * @param conv_len - The MCLK divider.
00947  *                  Accepted values: AD77681_CONV_24BIT
00948  *                                   AD77681_CONV_16BIT
00949  * @return 0 in case of success, negative error code otherwise.
00950  */
00951 int32_t ad77681_set_convlen(struct ad77681_dev *dev,
00952                 enum ad77681_conv_len conv_len)
00953 {
00954     int32_t ret;
00955 
00956     ret = ad77681_spi_write_mask(dev,
00957                      AD77681_REG_INTERFACE_FORMAT,
00958                      AD77681_INTERFACE_CONVLEN_MSK,
00959                      AD77681_INTERFACE_CONVLEN(conv_len));
00960 
00961     if (ret == SUCCESS) {
00962         dev->conv_len = conv_len;
00963         ad77681_get_frame_byte(dev);
00964     }
00965 
00966     return ret;
00967 }
00968 
00969 /**
00970  * Activates CRC on all SPI transactions and
00971  * Selects CRC method as XOR or 8-bit polynomial
00972  * @param dev - The device structure.
00973  * @param crc_sel - The CRC type.
00974  *                  Accepted values: AD77681_CRC
00975  *                                   AD77681_XOR
00976  *                                   AD77681_NO_CRC
00977  * @return 0 in case of success, negative error code otherwise.
00978  */
00979 int32_t ad77681_set_crc_sel(struct ad77681_dev *dev,
00980                 enum ad77681_crc_sel crc_sel)
00981 {
00982     int32_t ret;
00983 
00984     if (crc_sel == AD77681_NO_CRC) {
00985         ret = ad77681_spi_write_mask(dev,
00986                          AD77681_REG_INTERFACE_FORMAT,
00987                          AD77681_INTERFACE_CRC_EN_MSK,
00988                          AD77681_INTERFACE_CRC_EN(0));
00989     } else {
00990         ret = ad77681_spi_write_mask(dev,
00991                          AD77681_REG_INTERFACE_FORMAT,
00992                          AD77681_INTERFACE_CRC_EN_MSK,
00993                          AD77681_INTERFACE_CRC_EN(1));
00994 
00995         ret |= ad77681_spi_write_mask(dev,
00996                           AD77681_REG_INTERFACE_FORMAT,
00997                           AD77681_INTERFACE_CRC_TYPE_MSK,
00998                           AD77681_INTERFACE_CRC_TYPE(crc_sel));
00999     }
01000 
01001     if (ret == SUCCESS) {
01002         dev->crc_sel = crc_sel;
01003         ad77681_get_frame_byte(dev);
01004     }
01005 
01006     return ret;
01007 }
01008 
01009 /**
01010  * Enables Status bits output
01011  * @param dev - The device structure.
01012  * @param status_bit - enable or disable status bit
01013  *                  Accepted values: true
01014  *                                   false
01015  * @return 0 in case of success, negative error code otherwise.
01016  */
01017 int32_t ad77681_set_status_bit(struct ad77681_dev *dev,
01018                    bool status_bit)
01019 {
01020     int32_t ret;
01021 
01022     // Set status bit
01023     ret =   ad77681_spi_write_mask(dev,
01024                        AD77681_REG_INTERFACE_FORMAT,
01025                        AD77681_INTERFACE_STATUS_EN_MSK,
01026                        AD77681_INTERFACE_STATUS_EN(status_bit));
01027 
01028     if (ret == SUCCESS) {
01029         dev->status_bit = status_bit;
01030         ad77681_get_frame_byte(dev);
01031     }
01032 
01033     return ret;
01034 }
01035 
01036 /**
01037  * Device reset over SPI.
01038  * @param dev - The device structure.
01039  * @return 0 in case of success, negative error code otherwise.
01040  */
01041 int32_t ad77681_soft_reset(struct ad77681_dev *dev)
01042 {
01043     int32_t ret = 0;
01044 
01045     // Two writes are required to initialize the reset
01046     ret |=  ad77681_spi_write_mask(dev,
01047                        AD77681_REG_SYNC_RESET,
01048                        AD77681_SYNC_RST_SPI_RESET_MSK,
01049                        AD77681_SYNC_RST_SPI_RESET(0x3));
01050 
01051     ret |=  ad77681_spi_write_mask(dev,
01052                        AD77681_REG_SYNC_RESET,
01053                        AD77681_SYNC_RST_SPI_RESET_MSK,
01054                        AD77681_SYNC_RST_SPI_RESET(0x2));
01055 
01056     return ret;
01057 }
01058 
01059 /**
01060  * Initiate a SYNC_OUT pulse over spi
01061  * @param dev - The device structure.
01062  * @return 0 in case of success, negative error code otherwise.
01063  */
01064 int32_t ad77681_initiate_sync(struct ad77681_dev *dev)
01065 {
01066     return ad77681_spi_write_mask(dev,
01067                       AD77681_REG_SYNC_RESET,
01068                       AD77681_SYNC_RST_SPI_STARTB_MSK,
01069                       AD77681_SYNC_RST_SPI_STARTB(0));
01070 }
01071 
01072 /**
01073  * Write to offset registers
01074  * @param dev           The device structure.
01075  * @param value         The desired value of the whole 24-bit offset register
01076  * @return 0 in case of success, negative error code otherwise.
01077  */
01078 int32_t ad77681_apply_offset(struct ad77681_dev *dev,
01079                  uint32_t value)
01080 {
01081     int32_t ret;
01082     uint8_t offset_HI = 0, offset_MID = 0, offset_LO = 0;
01083 
01084     offset_HI = (value & 0x00FF0000) >> 16;
01085     offset_MID = (value & 0x0000FF00) >> 8;
01086     offset_LO = (value & 0x000000FF);
01087 
01088     ret = ad77681_spi_write_mask(dev,
01089                      AD77681_REG_OFFSET_HI,
01090                      AD77681_OFFSET_HI_MSK,
01091                      AD77681_OFFSET_HI(offset_HI));
01092 
01093     ret |= ad77681_spi_write_mask(dev,
01094                       AD77681_REG_OFFSET_MID,
01095                       AD77681_OFFSET_MID_MSK,
01096                       AD77681_OFFSET_MID(offset_MID));
01097 
01098     ret |= ad77681_spi_write_mask(dev,
01099                       AD77681_REG_OFFSET_LO,
01100                       AD77681_OFFSET_LO_MSK,
01101                       AD77681_OFFSET_LO(offset_LO));
01102 
01103     return ret;
01104 }
01105 
01106 /**
01107  * Write to gain registers
01108  * @param dev - The device structure.
01109  * @param value - The desired value of the whole 24-bit gain register
01110  * @return 0 in case of success, negative error code otherwise.
01111  */
01112 int32_t ad77681_apply_gain(struct ad77681_dev *dev,
01113                uint32_t value)
01114 {
01115     int32_t ret;
01116     uint8_t gain_HI = 0, gain_MID = 0, gain_LO = 0;
01117 
01118     gain_HI = (value & 0x00FF0000) >> 16;
01119     gain_MID = (value & 0x0000FF00) >> 8;
01120     gain_LO = (value & 0x000000FF);
01121 
01122     ret = ad77681_spi_write_mask(dev,
01123                      AD77681_REG_GAIN_HI,
01124                      AD77681_GAIN_HI_MSK,
01125                      AD77681_GAIN_HI(gain_HI));
01126 
01127     ret |= ad77681_spi_write_mask(dev,
01128                       AD77681_REG_GAIN_MID,
01129                       AD77681_GAIN_MID_MSK,
01130                       AD77681_GAIN_MID(gain_MID));
01131 
01132     ret |= ad77681_spi_write_mask(dev,
01133                       AD77681_REG_GAIN_LO,
01134                       AD77681_GAIN_LOW_MSK,
01135                       AD77681_GAIN_LOW(gain_LO));
01136 
01137     return ret;
01138 }
01139 
01140 /**
01141  * Upload sequence for Programmamble FIR filter
01142  * @param dev - The device structure.
01143  * @param coeffs - Pointer to the desired filter coefficients array to be written
01144  * @param num_coeffs - Count of active filter coeffs
01145  * @return 0 in case of success, negative error code otherwise.
01146  */
01147 int32_t ad77681_programmable_filter(struct ad77681_dev *dev,
01148                     const float *coeffs,
01149                     uint8_t num_coeffs)
01150 {
01151     uint8_t coeffs_buf[4], coeffs_index, check_back = 0, i, address;
01152     uint32_t twait;
01153     int32_t twos_complement, ret;
01154     const uint8_t coeff_reg_length = 56;
01155 
01156     /* Specific keys in the upload sequence */
01157     const uint8_t key1 = 0xAC, key2 = 0x45, key3 = 0x55;
01158     /* Scaling factor for all coefficients 2^22 */
01159     const float coeff_scale_factor = (1 << 22);
01160     /* Wait time in uS necessary to access the COEFF_CONTROL and */
01161     /* COEFF_DATA registers. Twait = 512/MCLK */
01162     twait = (uint32_t)(((512.0) / ((float)(dev->mclk))) * 1000.0) + 1;
01163 
01164     /* Set Filter to FIR */
01165     ret = ad77681_spi_write_mask(dev,
01166                      AD77681_REG_DIGITAL_FILTER,
01167                      AD77681_DIGI_FILTER_FILTER_MSK,
01168                      AD77681_DIGI_FILTER_FILTER(AD77681_FIR));
01169 
01170     /* Check return value before proceeding */
01171     if (ret < 0)
01172         return ret;
01173 
01174     /* Write the first access key to the ACCESS_KEY register */
01175     ret = ad77681_spi_write_mask(dev,
01176                      AD77681_REG_ACCESS_KEY,
01177                      AD77681_ACCESS_KEY_MSK,
01178                      AD77681_ACCESS_KEY(key1));
01179 
01180     /* Check return value before proceeding */
01181     if (ret < 0)
01182         return ret;
01183 
01184     /* Write the second access key to the ACCESS_KEY register */
01185     ret = ad77681_spi_write_mask(dev,
01186                      AD77681_REG_ACCESS_KEY,
01187                      AD77681_ACCESS_KEY_MSK,
01188                      AD77681_ACCESS_KEY(key2));
01189 
01190     /* Check return value before proceeding */
01191     if (ret < 0)
01192         return ret;
01193 
01194     /* Read the the ACCESS_KEY register bit 0, the key bit */
01195     ret = ad77681_spi_read_mask(dev,
01196                     AD77681_REG_ACCESS_KEY,
01197                     AD77681_ACCESS_KEY_CHECK_MSK,
01198                     &check_back);
01199 
01200     /* Checks ret and key bit, return FAILURE in case key bit not equal to 1 */
01201     if ((ret < 0) || (check_back != 1))
01202         return FAILURE;
01203 
01204     /* Set the initial adress to 0 and enable the  write and coefficient access bits */
01205     address = AD77681_COEF_CONTROL_COEFFACCESSEN_MSK
01206           | AD77681_COEF_CONTROL_COEFFWRITEEN_MSK;
01207 
01208     /* The COEFF_DATA register has to be filled with 56 coeffs.*/
01209     /* In case the number of active filter coefficient is less */
01210     /* than 56, zeros will be padded before the desired coeff. */
01211     for (i = 0; i < coeff_reg_length; i++) {
01212         /* Set the coeff address */
01213         ret = ad77681_spi_reg_write(dev,
01214                         AD77681_REG_COEFF_CONTROL,
01215                         address);
01216 
01217         /* Check return value before proceeding */
01218         if (ret < 0)
01219             return ret;
01220 
01221         /* Wait for Twait uSeconds*/
01222         udelay(twait);
01223 
01224         /* Padding of zeros before the desired coef in case the coef count in less than 56 */
01225         if((num_coeffs + i) < coeff_reg_length) {
01226             /* wirte zeroes to COEFF_DATA, in case of less coeffs than 56*/
01227             coeffs_buf[0] = AD77681_REG_WRITE(AD77681_REG_COEFF_DATA);
01228             coeffs_buf[1] = 0;
01229             coeffs_buf[2] = 0;
01230             coeffs_buf[3] = 0;
01231         } else {/* Writting of desired filter coefficients */
01232             /* Computes the index of coefficients to be uploaded */
01233             coeffs_index = (num_coeffs + i) - coeff_reg_length;
01234             /* Scaling the coefficient value and converting it to 2's complement */
01235             twos_complement = (int32_t)(coeffs[coeffs_index] * coeff_scale_factor);
01236 
01237             /* Write coefficients to COEFF_DATA */
01238             coeffs_buf[0] = AD77681_REG_WRITE(AD77681_REG_COEFF_DATA);
01239             coeffs_buf[1] = (twos_complement & 0xFF0000) >> 16;
01240             coeffs_buf[2] = (twos_complement & 0x00FF00) >> 8;
01241             coeffs_buf[3] = (twos_complement & 0x0000FF);
01242         }
01243 
01244         ret = spi_write_and_read(dev->spi_desc, coeffs_buf, 4);
01245 
01246         /* Check return value before proceeding */
01247         if (ret < 0)
01248             return ret;
01249 
01250         /* Increment the address*/
01251         address++;
01252         /* Wait for Twait uSeconds*/
01253         udelay(twait);
01254     }
01255 
01256     /* Disable coefficient write */
01257     ret = ad77681_spi_write_mask(dev,
01258                      AD77681_REG_COEFF_CONTROL,
01259                      AD77681_COEF_CONTROL_COEFFWRITEEN_MSK,
01260                      AD77681_COEF_CONTROL_COEFFWRITEEN(0x00));
01261 
01262     /* Check return value before proceeding */
01263     if (ret < 0)
01264         return ret;
01265 
01266     udelay(twait);
01267 
01268     /* Disable coefficient access */
01269     ret = ad77681_spi_write_mask(dev,
01270                      AD77681_REG_COEFF_CONTROL,
01271                      AD77681_COEF_CONTROL_COEFFACCESSEN_MSK,
01272                      AD77681_COEF_CONTROL_COEFFACCESSEN(0x00));
01273 
01274     /* Check return value before proceeding */
01275     if (ret < 0)
01276         return ret;
01277 
01278     /* Toggle the synchronization pulse and to begin reading data */
01279     /* Write 0x800000 to COEFF_DATA */
01280     coeffs_buf[0] = AD77681_REG_WRITE(AD77681_REG_COEFF_DATA);
01281     coeffs_buf[1] = 0x80;
01282     coeffs_buf[2] = 0x00;
01283     coeffs_buf[3] = 0x00;
01284 
01285     ret = spi_write_and_read(dev->spi_desc, coeffs_buf, 4);
01286 
01287     /* Check return value before proceeding */
01288     if (ret < 0)
01289         return ret;
01290 
01291     /* Exit filter upload by wirting specific access key 0x55*/
01292     ret = ad77681_spi_write_mask(dev,
01293                      AD77681_REG_ACCESS_KEY,
01294                      AD77681_ACCESS_KEY_MSK,
01295                      AD77681_ACCESS_KEY(key3));
01296 
01297     /* Check return value before proceeding */
01298     if (ret < 0)
01299         return ret;
01300 
01301     /* Send synchronization pulse */
01302     ad77681_initiate_sync(dev);
01303 
01304     return ret;
01305 }
01306 
01307 /**
01308  * Read value from GPIOs present in AD7768-1 separately, or all GPIOS at once.
01309  * @param dev - The device structure.
01310  * @param value - Readed value.
01311  * @param gpio_number - Number of GPIO, the value will be written into
01312  *          Accepted values: AD77681_GPIO0
01313  *                   AD77681_GPIO1
01314  *                   AD77681_GPIO2
01315  *                   AD77681_GPIO3
01316  *                   AD77681_ALL_GPIOS
01317  * @return 0 in case of success, negative error code otherwise.
01318  */
01319 int32_t ad77681_gpio_read(struct ad77681_dev *dev,
01320               uint8_t *value,
01321               enum ad77681_gpios gpio_number)
01322 {
01323     int32_t ret;
01324 
01325     switch (gpio_number) {
01326     case AD77681_GPIO0: /* Read to GPIO0 */
01327         ret = ad77681_spi_read_mask(dev,
01328                         AD77681_REG_GPIO_READ,
01329                         AD77681_GPIO_READ_0_MSK,
01330                         value);
01331         break;
01332     case AD77681_GPIO1: /* Read to GPIO1 */
01333         ret = ad77681_spi_read_mask(dev,
01334                         AD77681_REG_GPIO_READ,
01335                         AD77681_GPIO_READ_1_MSK,
01336                         value);
01337         break;
01338     case AD77681_GPIO2: /* Read to GPIO2 */
01339         ret = ad77681_spi_read_mask(dev,
01340                         AD77681_REG_GPIO_READ,
01341                         AD77681_GPIO_READ_2_MSK,
01342                         value);
01343         break;
01344     case AD77681_GPIO3: /* Read to GPIO3 */
01345         ret = ad77681_spi_read_mask(dev,
01346                         AD77681_REG_GPIO_READ,
01347                         AD77681_GPIO_READ_3_MSK,
01348                         value);
01349         break;
01350     case AD77681_ALL_GPIOS: /* Read to all GPIOs */
01351         ret = ad77681_spi_read_mask(dev,
01352                         AD77681_REG_GPIO_READ,
01353                         AD77681_GPIO_READ_ALL_MSK,
01354                         value);
01355         break;
01356     default:
01357         return FAILURE;
01358         break;
01359     }
01360 
01361     return ret;
01362 }
01363 
01364 /**
01365  * Write value to GPIOs present in AD7768-1 separately, or all GPIOS at once.
01366  * @param dev - The device structure.
01367  * @param value - Value to be written into GPIO
01368  *        Accepted values: GPIO_HIGH
01369  *                 GPIO_LOW
01370  *                 4-bit value for all gpios
01371  * @param gpio_number - Number of GPIO, the value will be written into
01372  *          Accepted values: AD77681_GPIO0
01373  *                   AD77681_GPIO1
01374  *                   AD77681_GPIO2
01375  *                   AD77681_GPIO3
01376  *                   AD77681_ALL_GPIOS
01377  * @return 0 in case of success, negative error code otherwise.
01378  */
01379 int32_t ad77681_gpio_write(struct ad77681_dev *dev,
01380                uint8_t value,
01381                enum ad77681_gpios gpio_number)
01382 {
01383     int32_t ret;
01384 
01385     switch (gpio_number) {
01386     case AD77681_GPIO0: /* Write to GPIO0 */
01387         ret = ad77681_spi_write_mask(dev,
01388                          AD77681_REG_GPIO_WRITE,
01389                          AD77681_GPIO_WRITE_0_MSK,
01390                          AD77681_GPIO_WRITE_0(value));
01391         break;
01392     case AD77681_GPIO1: /* Write to GPIO1 */
01393         ret = ad77681_spi_write_mask(dev,
01394                          AD77681_REG_GPIO_WRITE,
01395                          AD77681_GPIO_WRITE_1_MSK,
01396                          AD77681_GPIO_WRITE_1(value));
01397         break;
01398     case AD77681_GPIO2: /* Write to GPIO2 */
01399         ret = ad77681_spi_write_mask(dev,
01400                          AD77681_REG_GPIO_WRITE,
01401                          AD77681_GPIO_WRITE_2_MSK,
01402                          AD77681_GPIO_WRITE_2(value));
01403         break;
01404     case AD77681_GPIO3: /* Write to GPIO3 */
01405         ret = ad77681_spi_write_mask(dev,
01406                          AD77681_REG_GPIO_WRITE,
01407                          AD77681_GPIO_WRITE_3_MSK,
01408                          AD77681_GPIO_WRITE_3(value));
01409         break;
01410     case AD77681_ALL_GPIOS: /* Write to all GPIOs */
01411         ret = ad77681_spi_write_mask(dev,
01412                          AD77681_REG_GPIO_WRITE,
01413                          AD77681_GPIO_WRITE_ALL_MSK,
01414                          AD77681_GPIO_WRITE_ALL(value));
01415         break;
01416     default:
01417         return FAILURE;
01418         break;
01419     }
01420 
01421     return ret;
01422 }
01423 
01424 /**
01425  * Set AD7768-1s GPIO as input or output.
01426  * @param dev - The device structure.
01427  * @param direction - Direction of the GPIO
01428  *          Accepted values: GPIO_INPUT
01429  *                   GPIO_OUTPUT
01430  *                   4-bit value for all gpios
01431  * @param gpio_number - Number of GPIO, which will be affected
01432  *          Accepted values: AD77681_GPIO0
01433  *                   AD77681_GPIO1
01434  *                   AD77681_GPIO2
01435  *                   AD77681_GPIO3
01436  *                   AD77681_ALL_GPIOS
01437  * @return 0 in case of success, negative error code otherwise.
01438  */
01439 int32_t ad77681_gpio_inout(struct ad77681_dev *dev,
01440                uint8_t direction,
01441                enum ad77681_gpios gpio_number)
01442 {
01443     int32_t ret;
01444 
01445     switch (gpio_number) {
01446     case AD77681_GPIO0: /* Set direction of GPIO0 */
01447         ret = ad77681_spi_write_mask(dev,
01448                          AD77681_REG_GPIO_CONTROL,
01449                          AD77681_GPIO_CNTRL_GPIO0_OP_EN_MSK,
01450                          AD77681_GPIO_CNTRL_GPIO0_OP_EN(direction));
01451         break;
01452     case AD77681_GPIO1: /* Set direction of GPIO1 */
01453         ret = ad77681_spi_write_mask(dev,
01454                          AD77681_REG_GPIO_CONTROL,
01455                          AD77681_GPIO_CNTRL_GPIO1_OP_EN_MSK,
01456                          AD77681_GPIO_CNTRL_GPIO1_OP_EN(direction));
01457         break;
01458     case AD77681_GPIO2: /* Set direction of GPIO2 */
01459         ret = ad77681_spi_write_mask(dev,
01460                          AD77681_REG_GPIO_CONTROL,
01461                          AD77681_GPIO_CNTRL_GPIO2_OP_EN_MSK,
01462                          AD77681_GPIO_CNTRL_GPIO2_OP_EN(direction));
01463         break;
01464     case AD77681_GPIO3: /* Set direction of GPIO3 */
01465         ret = ad77681_spi_write_mask(dev,
01466                          AD77681_REG_GPIO_CONTROL,
01467                          AD77681_GPIO_CNTRL_GPIO3_OP_EN_MSK,
01468                          AD77681_GPIO_CNTRL_GPIO3_OP_EN(direction));
01469         break;
01470     case AD77681_ALL_GPIOS: /* Set direction of all GPIOs */
01471         ret = ad77681_spi_write_mask(dev,
01472                          AD77681_REG_GPIO_CONTROL,
01473                          AD77681_GPIO_CNTRL_ALL_GPIOS_OP_EN_MSK,
01474                          AD77681_GPIO_CNTRL_ALL_GPIOS_OP_EN(direction));
01475         break;
01476     default:
01477         return FAILURE;
01478         break;
01479     }
01480 
01481     return ret;
01482 }
01483 
01484 /**
01485  * Enable global GPIO bit.
01486  * This bit must be set high to change GPIO settings.
01487  * @param dev - The device structure.
01488  * @param gpio_enable - Enable or diable the global GPIO pin
01489  *          Accepted values: AD77681_GLOBAL_GPIO_ENABLE
01490  *                   AD77681_GLOBAL_GPIO_DISABLE
01491  * @return 0 in case of success, negative error code otherwise.
01492  */
01493 int32_t ad77681_global_gpio(struct ad77681_dev *dev,
01494                 enum ad77681_gobal_gpio_enable gpio_enable)
01495 {
01496     return ad77681_spi_write_mask(dev,
01497                       AD77681_REG_GPIO_CONTROL,
01498                       AD77681_GPIO_CNTRL_UGPIO_EN_MSK,
01499                       AD77681_GPIO_CNTRL_UGPIO_EN(gpio_enable));
01500 }
01501 
01502 /**
01503  * Read and write from ADC scratchpad register to check SPI Communication in
01504  * the very beginning, during inicialization.
01505  * @param dev - The device structure.
01506  * @param sequence - The sequence which will be written into scratchpad and the
01507  *            readed sequence will be returned
01508  * @return 0 in case of success, negative error code otherwise.
01509  */
01510 int32_t ad77681_scratchpad(struct ad77681_dev *dev,
01511                uint8_t *sequence)
01512 {
01513     int32_t ret;
01514     const uint8_t check = *sequence;/* Save the original sequence */
01515     uint8_t ret_sequence = 0;/* Return sequence */
01516 
01517     ret = ad77681_spi_write_mask(dev,
01518                      AD77681_REG_SCRATCH_PAD,
01519                      AD77681_SCRATCHPAD_MSK,
01520                      AD77681_SCRATCHPAD(check));
01521 
01522     ret |= ad77681_spi_read_mask(dev,
01523                      AD77681_REG_SCRATCH_PAD,
01524                      AD77681_SCRATCHPAD_MSK,
01525                      &ret_sequence);
01526 
01527     if (check != ret_sequence)/* Compare original an returned sequence */
01528         return FAILURE;
01529 
01530     return ret;
01531 }
01532 
01533 /**
01534  * Set AD7768-1s GPIO output type between strong driver and open drain.
01535  * GPIO3 can not be accessed!
01536  * @param dev - The device structure.
01537  * @param gpio_number - AD7768-1s GPIO to be affected (Only GPIO0, GPIO1 and GPIO2)
01538  *          Accepted values: AD77681_GPIO0
01539  *                   AD77681_GPIO1
01540  *                   AD77681_GPIO2
01541  *                   AD77681_ALL_GPIOS
01542  *
01543  * @param output_type - Output type of the GPIO
01544  *          Accepted values: AD77681_GPIO_STRONG_DRIVER
01545  *                   AD77681_GPIO_OPEN_DRAIN
01546  * @return 0 in case of success, negative error code otherwise.
01547  */
01548 int32_t ad77681_gpio_open_drain(struct ad77681_dev *dev,
01549                 enum ad77681_gpios gpio_number,
01550                 enum ad77681_gpio_output_type output_type)
01551 {
01552     int32_t ret;
01553 
01554     switch (gpio_number) {
01555     case AD77681_GPIO0: /* Set ouptut type of GPIO0 */
01556         ret = ad77681_spi_write_mask(dev,
01557                          AD77681_REG_GPIO_CONTROL,
01558                          AD77681_GPIO_CNTRL_GPIO0_OD_EN_MSK,
01559                          AD77681_GPIO_CNTRL_GPIO0_OD_EN(output_type));
01560         break;
01561     case AD77681_GPIO1: /* Set ouptut type of GPIO1 */
01562         ret = ad77681_spi_write_mask(dev,
01563                          AD77681_REG_GPIO_CONTROL,
01564                          AD77681_GPIO_CNTRL_GPIO1_OD_EN_MSK,
01565                          AD77681_GPIO_CNTRL_GPIO1_OD_EN(output_type));
01566         break;
01567     case AD77681_GPIO2: /* Set ouptut type of GPIO2 */
01568         ret = ad77681_spi_write_mask(dev,
01569                          AD77681_REG_GPIO_CONTROL,
01570                          AD77681_GPIO_CNTRL_GPIO2_OD_EN_MSK,
01571                          AD77681_GPIO_CNTRL_GPIO2_OD_EN(output_type));
01572         break;
01573     case AD77681_ALL_GPIOS: /* Set ouptut type of all GPIOs */
01574         ret = ad77681_spi_write_mask(dev,
01575                          AD77681_REG_GPIO_CONTROL,
01576                          AD77681_GPIO_CNTRL_ALL_GPIOS_OD_EN_MSK,
01577                          AD77681_GPIO_CNTRL_ALL_GPIOS_OD_EN(output_type));
01578         break;
01579     default:
01580         return FAILURE;
01581         break;
01582     }
01583 
01584     return ret;
01585 }
01586 
01587 /**
01588  * Clear all error flags at once
01589  * @param dev - The device structure.
01590  * @return 0 in case of success, negative error code otherwise.
01591  */
01592 int32_t ad77681_clear_error_flags(struct ad77681_dev *dev)
01593 {
01594     int32_t ret;
01595 
01596     /* SPI ignore error CLEAR */
01597     ret = ad77681_spi_write_mask(dev,
01598                      AD77681_REG_SPI_DIAG_STATUS,
01599                      AD77681_SPI_IGNORE_ERROR_MSK,
01600                      AD77681_SPI_IGNORE_ERROR_CLR(ENABLE));
01601     /* SPI read error CLEAR */
01602     ret |= ad77681_spi_write_mask(dev,
01603                       AD77681_REG_SPI_DIAG_STATUS,
01604                       AD77681_SPI_READ_ERROR_MSK,
01605                       AD77681_SPI_READ_ERROR_CLR(ENABLE));
01606     /* SPI write error CLEAR */
01607     ret |= ad77681_spi_write_mask(dev,
01608                       AD77681_REG_SPI_DIAG_STATUS,
01609                       AD77681_SPI_WRITE_ERROR_MSK,
01610                       AD77681_SPI_WRITE_ERROR_CLR(ENABLE));
01611     /* SPI CRC error CLEAR */
01612     ret |= ad77681_spi_write_mask(dev,
01613                       AD77681_REG_SPI_DIAG_STATUS,
01614                       AD77681_SPI_CRC_ERROR_MSK,
01615                       AD77681_SPI_CRC_ERROR_CLR(ENABLE));
01616 
01617     return ret;
01618 }
01619 
01620 /**
01621  * Enabling error flags. All error flags enabled by default
01622  * @param dev - The device structure.
01623  * @return 0 in case of success, negative error code otherwise.
01624  */
01625 int32_t ad77681_error_flags_enabe(struct ad77681_dev *dev)
01626 {
01627     int32_t ret;
01628 
01629     /* SPI ERRORS ENABLE */
01630     /* SPI ignore error enable */
01631     ret = ad77681_spi_write_mask(dev,
01632                      AD77681_REG_SPI_DIAG_ENABLE,
01633                      AD77681_SPI_DIAG_ERR_SPI_IGNORE_MSK,
01634                      AD77681_SPI_DIAG_ERR_SPI_IGNORE(ENABLE));
01635     /*  SPI Clock count error enable */
01636     ret |= ad77681_spi_write_mask(dev,
01637                       AD77681_REG_SPI_DIAG_ENABLE,
01638                       AD77681_SPI_DIAG_ERR_SPI_CLK_CNT_MSK,
01639                       AD77681_SPI_DIAG_ERR_SPI_CLK_CNT(ENABLE));
01640     /* SPI Read error enable */
01641     ret |= ad77681_spi_write_mask(dev,
01642                       AD77681_REG_SPI_DIAG_ENABLE,
01643                       AD77681_SPI_DIAG_ERR_SPI_RD_MSK,
01644                       AD77681_SPI_DIAG_ERR_SPI_RD(ENABLE));
01645     /* SPI Write error enable */
01646     ret |= ad77681_spi_write_mask(dev,
01647                       AD77681_REG_SPI_DIAG_ENABLE,
01648                       AD77681_SPI_DIAG_ERR_SPI_WR_MSK,
01649                       AD77681_SPI_DIAG_ERR_SPI_WR(ENABLE));
01650 
01651     /* ADC DIAG ERRORS ENABLE */
01652     /* DLDO PSM error enable */
01653     ret |= ad77681_spi_write_mask(dev,
01654                       AD77681_REG_ADC_DIAG_ENABLE,
01655                       AD77681_ADC_DIAG_ERR_DLDO_PSM_MSK,
01656                       AD77681_ADC_DIAG_ERR_DLDO_PSM(ENABLE));
01657     /* ALDO PSM error enable */
01658     ret |= ad77681_spi_write_mask(dev,
01659                       AD77681_REG_ADC_DIAG_ENABLE,
01660                       AD77681_ADC_DIAG_ERR_ALDO_PSM_MSK,
01661                       AD77681_ADC_DIAG_ERR_ALDO_PSM(ENABLE));
01662     /* Filter saturated error enable */
01663     ret |= ad77681_spi_write_mask(dev,
01664                       AD77681_REG_ADC_DIAG_ENABLE,
01665                       AD77681_ADC_DIAG_ERR_FILT_SAT_MSK,
01666                       AD77681_ADC_DIAG_ERR_FILT_SAT(ENABLE));
01667     /* Filter not settled error enable */
01668     ret |= ad77681_spi_write_mask(dev,
01669                       AD77681_REG_ADC_DIAG_ENABLE,
01670                       AD77681_ADC_DIAG_ERR_FILT_NOT_SET_MSK,
01671                       AD77681_ADC_DIAG_ERR_FILT_NOT_SET(ENABLE));
01672     /* External clock check error enable */
01673     ret |= ad77681_spi_write_mask(dev,
01674                       AD77681_REG_ADC_DIAG_ENABLE,
01675                       AD77681_ADC_DIAG_ERR_EXT_CLK_QUAL_MSK,
01676                       AD77681_ADC_DIAG_ERR_EXT_CLK_QUAL(ENABLE));
01677 
01678     /* DIG DIAG ENABLE */
01679     /* Memory map CRC error enabled */
01680     ret |= ad77681_spi_write_mask(dev,
01681                       AD77681_REG_DIG_DIAG_ENABLE,
01682                       AD77681_DIG_DIAG_ERR_MEMMAP_CRC_MSK,
01683                       AD77681_DIG_DIAG_ERR_MEMMAP_CRC(ENABLE));
01684     /* RAM CRC error enabled */
01685     ret |= ad77681_spi_write_mask(dev,
01686                       AD77681_REG_DIG_DIAG_ENABLE,
01687                       AD77681_DIG_DIAG_ERR_RAM_CRC_MSK,
01688                       AD77681_DIG_DIAG_ERR_RAM_CRC(ENABLE));
01689     /* FUSE CRC error enabled */
01690     ret |= ad77681_spi_write_mask(dev,
01691                       AD77681_REG_DIG_DIAG_ENABLE,
01692                       AD77681_DIG_DIAG_ERR_FUSE_CRC_MSK,
01693                       AD77681_DIG_DIAG_ERR_FUSE_CRC(ENABLE));
01694     /* Enable MCLK Counter */
01695     ret |= ad77681_spi_write_mask(dev,
01696                       AD77681_REG_DIG_DIAG_ENABLE,
01697                       AD77681_DIG_DIAG_FREQ_COUNT_EN_MSK,
01698                       AD77681_DIG_DIAG_FREQ_COUNT_EN(ENABLE));
01699 
01700     return ret;
01701 }
01702 
01703 /**
01704  * Read from all ADC status registers
01705  * @param dev - The device structure.
01706  * @param status - Structure with all satuts bits
01707  * @return 0 in case of success, negative error code otherwise.
01708  */
01709 int32_t ad77681_status(struct ad77681_dev *dev,
01710                struct ad77681_status_registers *status)
01711 {
01712     int32_t ret;
01713     uint8_t buf[3];
01714 
01715     /* Master status register */
01716     ret = ad77681_spi_reg_read(dev, AD77681_REG_MASTER_STATUS,buf);
01717     status->master_error = buf[1] & AD77681_MASTER_ERROR_MSK;
01718     status->adc_error = buf[1] & AD77681_MASTER_ADC_ERROR_MSK;
01719     status->dig_error = buf[1] & AD77681_MASTER_DIG_ERROR_MSK;
01720     status->adc_err_ext_clk_qual = buf[1] & AD77681_MASTER_DIG_ERR_EXT_CLK_MSK;
01721     status->adc_filt_saturated = buf[1] & AD77681_MASTER_FILT_SAT_MSK;
01722     status->adc_filt_not_settled = buf[1] & AD77681_MASTER_FILT_NOT_SET_MSK;
01723     status->spi_error = buf[1] & AD77681_MASTER_SPI_ERROR_MSK;
01724     status->por_flag = buf[1] & AD77681_MASTER_POR_FLAG_MSK;
01725     /* SPI diag status register */
01726     ret |= ad77681_spi_reg_read(dev, AD77681_REG_SPI_DIAG_STATUS, buf);
01727     status->spi_ignore = buf[1] & AD77681_SPI_IGNORE_ERROR_MSK;
01728     status->spi_clock_count = buf[1] & AD77681_SPI_CLK_CNT_ERROR_MSK;
01729     status->spi_read_error = buf[1] & AD77681_SPI_READ_ERROR_MSK;
01730     status->spi_write_error = buf[1] & AD77681_SPI_WRITE_ERROR_MSK;
01731     status->spi_crc_error = buf[1] & AD77681_SPI_CRC_ERROR_MSK;
01732     /* ADC diag status register */
01733     ret |= ad77681_spi_reg_read(dev, AD77681_REG_ADC_DIAG_STATUS,buf);
01734     status->dldo_psm_error = buf[1] & AD77681_ADC_DLDO_PSM_ERROR_MSK;
01735     status->aldo_psm_error = buf[1] & AD77681_ADC_ALDO_PSM_ERROR_MSK;
01736     status->ref_det_error = buf[1] & AD77681_ADC_REF_DET_ERROR_MSK;
01737     status->filt_sat_error = buf[1] & AD77681_ADC_FILT_SAT_MSK;
01738     status->filt_not_set_error = buf[1] & AD77681_ADC_FILT_NOT_SET_MSK;
01739     status->ext_clk_qual_error = buf[1] & AD77681_ADC_DIG_ERR_EXT_CLK_MSK;
01740     /* DIG diag status register */
01741     ret |= ad77681_spi_reg_read(dev, AD77681_REG_DIG_DIAG_STATUS,buf);
01742     status->memoy_map_crc_error = buf[1] & AD77681_DIG_MEMMAP_CRC_ERROR_MSK;
01743     status->ram_crc_error = buf[1] & AD77681_DIG_RAM_CRC_ERROR_MSK;
01744     status->fuse_crc_error = buf[1] & AD77681_DIG_FUS_CRC_ERROR_MSK;
01745 
01746     return ret;
01747 }
01748 
01749 /**
01750  * Initialize the device.
01751  * @param device - The device structure.
01752  * @param init_param - The structure that contains the device initial
01753  *                     parameters.
01754  * @param status - The structure that will contains the ADC status
01755  * @return 0 in case of success, negative error code otherwise.
01756  */
01757 int32_t ad77681_setup(struct ad77681_dev **device,
01758               struct ad77681_init_param init_param,
01759               struct ad77681_status_registers **status)
01760 {
01761     struct ad77681_dev *dev;
01762     struct ad77681_status_registers *stat;
01763     int32_t ret;
01764     uint8_t scratchpad_check = 0xAD;
01765 
01766     dev = (struct ad77681_dev *)malloc(sizeof(*dev));
01767     if (!dev) {
01768         return -1;
01769     }
01770 
01771     stat = (struct ad77681_status_registers *)malloc(sizeof(*stat));
01772     if (!stat) {
01773         free(dev);
01774         return -1;
01775     }
01776 
01777     dev->power_mode = init_param.power_mode;
01778     dev->mclk_div = init_param.mclk_div;
01779     dev->conv_diag_sel = init_param.conv_diag_sel;
01780     dev->conv_mode = init_param.conv_mode;
01781     dev->diag_mux_sel = init_param.diag_mux_sel;
01782     dev->conv_len = init_param.conv_len;
01783     dev->crc_sel = AD77681_NO_CRC;
01784     dev->status_bit = init_param.status_bit;
01785     dev->VCM_out = init_param.VCM_out;
01786     dev->AINn = init_param.AINn;
01787     dev->AINp = init_param.AINp;
01788     dev->REFn = init_param.REFn;
01789     dev->REFp = init_param.REFp;
01790     dev->filter = init_param.filter;
01791     dev->decimate = init_param.decimate;
01792     dev->sinc3_osr = init_param.sinc3_osr;
01793     dev->vref = init_param.vref;
01794     dev->mclk = init_param.mclk;
01795     dev->sample_rate = init_param.sample_rate;
01796     dev->data_frame_byte = init_param.data_frame_byte;
01797 
01798     ret = spi_init(&dev->spi_desc, &init_param.spi_eng_dev_init);
01799     if (ret < 0) {
01800         free(dev);
01801         free(stat);
01802         return ret;
01803     }
01804 
01805     ret |= ad77681_soft_reset(dev);
01806 
01807     udelay(200);
01808 
01809     /* Check physical connection using scratchpad*/
01810     if (ad77681_scratchpad(dev, &scratchpad_check) == FAILURE) {
01811         scratchpad_check = 0xAD;/* If failure, second try */
01812         ret |= (ad77681_scratchpad(dev, &scratchpad_check));
01813         if(ret == FAILURE) {
01814             free(dev);
01815             free(stat);
01816             return ret;
01817         }
01818     }
01819     ret |= ad77681_set_power_mode(dev, dev->power_mode);
01820     ret |= ad77681_set_mclk_div(dev, dev->mclk_div);
01821     ret |= ad77681_set_conv_mode(dev,
01822                      dev->conv_mode,
01823                      dev->diag_mux_sel,
01824                      dev->conv_diag_sel);
01825     ret |= ad77681_set_convlen(dev, dev->conv_len);
01826     ret |= ad77681_set_status_bit(dev, dev->status_bit);
01827     ret |= ad77681_set_crc_sel(dev, init_param.crc_sel);
01828     ret |= ad77681_set_VCM_output(dev, dev->VCM_out);
01829     ret |= ad77681_set_AINn_buffer(dev, dev->AINn);
01830     ret |= ad77681_set_AINp_buffer(dev, dev->AINp);
01831     ret |= ad77681_set_REFn_buffer(dev, dev->REFn);
01832     ret |= ad77681_set_REFp_buffer(dev, dev->REFp);
01833     ret |= ad77681_set_filter_type(dev, dev->decimate, dev->filter, dev->sinc3_osr);
01834     ret |= ad77681_error_flags_enabe(dev);
01835     ret |= ad77681_clear_error_flags(dev);
01836     ret |= ad77681_status(dev, stat);
01837     ad77681_get_frame_byte(dev);
01838     ad77681_update_sample_rate(dev);
01839     *status = stat;
01840     *device = dev;
01841 
01842     if (!ret)
01843         printf("ad77681 successfully initialized\n");
01844 
01845     return ret;
01846 }
01847