/***************************************************************************//** * @file adf4382.h * @brief Implementation of adf4382 Driver. * @authors Ciprian Hegbeli (ciprian.hegbeli@analog.com) * Jude Osemene (jude.osemene@analog.com) ******************************************************************************** * Copyright 2024(c) Analog Devices, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. Neither the name of Analog Devices, Inc. nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. “AS IS” AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL ANALOG DEVICES, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #ifdef __cplusplus extern "C" { #endif #include #include #include "no_os_units.h" #include "no_os_util.h" #include "no_os_spi.h" /* ADF4382 REG0000 Map */ #define ADF4382_SOFT_RESET_R_MSK NO_OS_BIT(7) #define ADF4382_LSB_FIRST_R_MSK NO_OS_BIT(6) #define ADF4382_ADDRESS_ASC_R_MSK NO_OS_BIT(5) #define ADF4382_SDO_ACTIVE_R_MSK NO_OS_BIT(4) #define ADF4382_SDO_ACTIVE_MSK NO_OS_BIT(3) #define ADF4382_ADDRESS_ASC_MSK NO_OS_BIT(2) #define ADF4382_LSB_FIRST_MSK NO_OS_BIT(1) #define ADF4382_SOFT_RESET_MSK NO_OS_BIT(0) #define ADF4382_RESET_CMD 0x81 /* ADF4382 REG0000 NO_OS_BIT Definition */ #define ADF4382_SDO_ACTIVE_SPI_3W 0x0 #define ADF4382_SDO_ACTIVE_SPI_4W 0x1 #define ADF4382_ADDR_ASC_AUTO_DECR 0x0 #define ADF4382_ADDR_ASC_AUTO_INCR 0x1 #define ADF4382_LSB_FIRST_MSB 0x0 #define ADF4382_LSB_FIRST_LSB 0x1 #define ADF4382_SOFT_RESET_N_OP 0x0 #define ADF4382_SOFT_RESET_EN 0x1 /* ADF4382 REG0001 Map */ #define ADF4382_SINGLE_INSTR_MSK NO_OS_BIT(7) #define ADF4382_MASTER_RB_CTRL_MSK NO_OS_BIT(5) /* ADF4382 REG0001 NO_OS_BIT Definition */ #define ADF4382_SPI_STREAM_EN 0x0 #define ADF4382_SPI_STREAM_DIS 0x1 #define ADF4382_RB_SLAVE_REG 0x0 #define ADF4382_RB_MASTER_REG 0x1 /* ADF4382 REG0003 NO_OS_BIT Definition */ #define ADF4382_CHIP_TYPE 0x06 /* ADF4382 REG0004 NO_OS_BIT Definition */ #define ADF4382_PRODUCT_ID_LSB 0x0005 /* ADF4382 REG0005 NO_OS_BIT Definition */ #define ADF4382_PRODUCT_ID_MSB 0x0005 /* ADF4382 REG000A Map */ #define ADF4382_SCRATCHPAD_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG000C NO_OS_BIT Definition */ #define ADF4382_VENDOR_ID_LSB 0x56 /* ADF4382 REG000D NO_OS_BIT Definition */ #define ADF4382_VENDOR_ID_MSB 0x04 /* ADF4382 REG000F NO_OS_BIT Definition */ #define ADF4382_M_S_TRANSF_NO_OS_BIT_MSK NO_OS_BIT(0) /* ADF4382 REG0010 Map*/ #define ADF4382_N_INT_LSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0011 Map*/ #define ADF4382_CLKOUT_DIV_MSK NO_OS_GENMASK(7, 5) #define ADF4382_INV_CLK_OUT_MSK NO_OS_BIT(4) #define ADF4382_N_INT_MSB_MSK NO_OS_GENMASK(3, 0) /* ADF4382 REG0012 Map */ #define ADF4382_FRAC1WORD_LSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0013 Map */ #define ADF4382_FRAC1WORD_MID_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0014 Map */ #define ADF4382_FRAC1WORD_MSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0015 Map */ #define ADF4382_M_VCO_BAND_LSB_MSK NO_OS_BIT(7) #define ADF4382_M_VCO_CORE_MSK NO_OS_BIT(6) #define ADF4382_BIAS_DEC_MODE_MSK NO_OS_GENMASK(5, 3) #define ADF4382_INT_MODE_MSK NO_OS_BIT(2) #define ADF4382_PFD_POL_MSK NO_OS_BIT(1) #define ADF4382_FRAC1WORD_MSB NO_OS_BIT(0) /* ADF4382 REG0016 Map */ #define ADF4382_M_VCO_BAND_MSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0017 Map */ #define ADF4382_FRAC2WORD_LSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0018 Map */ #define ADF4382_FRAC2WORD_MID_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0019 Map */ #define ADF4382_FRAC2WORD_MSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG001A Map */ #define ADF4382_MOD2WORD_LSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG001B Map */ #define ADF4382_MOD2WORD_MID_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG001C Map */ #define ADF4382_MOD2WORD_MSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG001D Map */ #define ADF4382_FINE_BLEED_LSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG001E Map */ #define ADF4382_EN_PHASE_RESYNC_MSK NO_OS_BIT(7) #define ADF4382_EN_REF_RST_MSK NO_OS_BIT(6) #define ADF4382_TIMED_SYNC_MSK NO_OS_BIT(5) #define ADF4382_COARSE_BLEED_MSK NO_OS_GENMASK(4, 1) #define ADF4382_FINE_BLEED_MSB_MSK NO_OS_BIT(0) /* ADF4382 REG001F Map */ #define ADF4382_SW_SYNC_MSK NO_OS_BIT(7) #define ADF4382_SPARE_1F_MSK NO_OS_BIT(6) #define ADF4382_BLEED_POL_MSK NO_OS_BIT(5) #define ADF4382_EN_BLEED_MSK NO_OS_BIT(4) #define ADF4382_CP_I_MSK NO_OS_GENMASK(3, 0) /* ADF4382 REG0020 Map */ #define ADF4382_EN_AUTOCAL_MSK NO_OS_BIT(7) #define ADF4382_EN_RDBLR_MSK NO_OS_BIT(6) #define ADF4382_R_DIV_MSK NO_OS_GENMASK(5, 0) /* ADF4382 REG0021 Map */ #define ADF4382_PHASE_WORD_LSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0022 Map */ #define ADF4382_PHASE_WORD_MID_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0023 Map */ #define ADF4382_PHASE_WORD_MSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0024 Map */ #define ADF4382_SPARE_24_MSK NO_OS_GENMASK(7, 5) #define ADF4382_DCLK_DIV_SEL_MSK NO_OS_BIT(4) #define ADF4382_DNCLK_DIV1_MSK NO_OS_GENMASK(3, 2) #define ADF4382_DCLK_DIV1_MSK NO_OS_GENMASK(1, 0) /* ADF4382 REG0025 Map */ #define ADF4382_RESYNC_WAIT_LSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0026 Map */ #define ADF4382_RESYNC_WAIT_MSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0027 Map */ #define ADF4382_CAL_BLEED_FINE_MIN_MSK NO_OS_GENMASK(7, 4) #define ADF4382_BLEED_ADJ_SCALE_MSK NO_OS_GENMASK(3, 0) /* ADF4382 REG0028 Map */ #define ADF4382_PH_RESYNC_RB_SEL_MSK NO_OS_BIT(7) #define ADF4382_LSB_P1_MSK NO_OS_BIT(6) #define ADF4382_VAR_MOD_EN_MSK NO_OS_BIT(5) #define ADF4382_DITHER1_SCALE_MSK NO_OS_GENMASK(4, 2) #define ADF4382_EN_DITHER2_MSK NO_OS_BIT(1) #define ADF4382_EN_DITHER1_MSK NO_OS_BIT(0) /* ADF4382 REG0029 Map */ #define ADF4382_CLK2_OPWR_MSK NO_OS_GENMASK(7, 4) #define ADF4382_CLK1_OPWR_MSK NO_OS_GENMASK(3, 0) /* ADF4382 REG002A Map */ #define ADF4382_FN_DBL_MSK NO_OS_BIT(7) #define ADF4382_PD_NDIV_TL_MSK NO_OS_BIT(6) #define ADF4382_CLKOUT_BST_MSK NO_OS_BIT(5) #define ADF4382_PD_SYNC_MSK NO_OS_BIT(4) #define ADF4382_PD_CLK_MSK NO_OS_BIT(3) #define ADF4382_PD_RDET_MSK NO_OS_BIT(2) #define ADF4382_PD_ADC_MSK NO_OS_BIT(1) #define ADF4382_PD_CALGEN_MSK NO_OS_BIT(0) /* ADF4382 REG002B Map */ #define ADF4382_PD_ALL_MSK NO_OS_BIT(7) #define ADF4382_PD_RDIV_TL_MSK NO_OS_BIT(6) #define ADF4382_PD_NDIV_MSK NO_OS_BIT(5) #define ADF4382_PD_VCO_MSK NO_OS_BIT(4) #define ADF4382_PD_LD_MSK NO_OS_BIT(3) #define ADF4382_PD_PFDCP_MSK NO_OS_BIT(2) #define ADF4382_PD_CLKOUT1_MSK NO_OS_BIT(1) #define ADF4382_PD_CLKOUT2_MSK NO_OS_BIT(0) /* ADF4382 REG002C Map */ #define ADF4382_LDWIN_PW_MSK NO_OS_GENMASK(7, 5) #define ADF4382_LD_COUNT_OPWR_MSK NO_OS_GENMASK(4, 0) /* ADF4382 REG002D Map */ #define ADF4382_EN_DNCLK_MSK NO_OS_BIT(7) #define ADF4382_EN_DRCLK_MSK NO_OS_BIT(6) #define ADF4382_EN_LOL_MSK NO_OS_BIT(5) #define ADF4382_EN_LDWIN_MSK NO_OS_BIT(4) #define ADF4382_PDET_POL_MSK NO_OS_BIT(3) #define ADF4382_RST_LD_MSK NO_OS_BIT(2) #define ADF4382_LD_O_CTRL_MSK NO_OS_GENMASK(1, 0) /* ADF4382 REG002E Map */ #define ADF4382_MUXOUT_MSK NO_OS_GENMASK(7, 4) #define ADF4382_ABPW_WD_MSK NO_OS_BIT(3) #define ADF4382_EN_CPTEST_MSK NO_OS_BIT(2) #define ADF4382_CP_DOWN_MSK NO_OS_BIT(1) #define ADF4382_CP_UP_MSK NO_OS_BIT(0) /* ADF4382 REG002F Map*/ #define ADF4382_BST_REF_MSK NO_OS_BIT(7) #define ADF4382_FILT_REF_MSK NO_OS_BIT(6) #define ADF4382_RDBLR_DC_MSK NO_OS_GENMASK(5, 0) /* ADF4382 REG0030 Map */ #define ADF4382_MUTE_NCLK_MSK NO_OS_BIT(7) #define ADF4382_MUTE_RCLK_MSK NO_OS_BIT(6) #define ADF4382_REF_SEL_MSK NO_OS_BIT(5) #define ADF4382_INV_RDBLR_MSK NO_OS_BIT(4) #define ADF4382_RDBLR_DEL_SEL_MSK NO_OS_GENMASK(3, 0) /* ADF4382 REG0031 Map */ #define ADF4382_SYNC_DEL_MSK NO_OS_GENMASK(7, 5) #define ADF4382_RST_SYS_MSK NO_OS_BIT(4) #define ADF4382_EN_ADC_CLK_MSK NO_OS_BIT(3) #define ADF4382_EN_VCAL_MSK NO_OS_BIT(2) #define ADF4382_CAL_CT_SEL_MSK NO_OS_BIT(1) #define ADF4382_DCLK_MODE_MSK NO_OS_BIT(0) /* ADF4382 REG0032 Map */ #define ADF4382_SPARE_32_MSK NO_OS_BIT(7) #define ADF4382_BLEED_ADJ_CAL_MSK NO_OS_BIT(6) #define ADF4382_DEL_MODE_MSK NO_OS_BIT(5) #define ADF4382_EN_AUTO_ALIGN_MSK NO_OS_BIT(4) #define ADF4382_PHASE_ADJ_POL_MSK NO_OS_BIT(3) #define ADF4382_EFM3_MODE_MSK NO_OS_GENMASK(2, 0) /* ADF4382 REG0033 Map */ #define ADF4382_PHASE_ADJUST_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0034 Map */ #define ADF4382_PHASE_ADJ_MSK NO_OS_BIT(7) #define ADF4382_DRCLK_DEL_MSK NO_OS_GENMASK(6, 4) #define ADF4382_DNCLK_DEL_MSK NO_OS_GENMASK(3, 1) #define ADF4382_RST_CNTR_MSK NO_OS_BIT(0) /* ADF4382 REG0035 Map */ #define ADF4382_SPARE_35_MSK NO_OS_GENMASK(7, 6) #define ADF4382_M_VCO_BIAS_MSK NO_OS_GENMASK(5, 0) /* ADF4382 REG0036 Map */ #define ADF4382_CLKODIV_DB_MSK NO_OS_BIT(7) #define ADF4382_DCLK_DIV_DB_MSK NO_OS_BIT(6) #define ADF4382_SPARE_36_MSK NO_OS_GENMASK(5, 2) #define ADF4382_EN_LUT_GEN_MSK NO_OS_BIT(1) #define ADF4382_EN_LUT_CAL_MSK NO_OS_BIT(0) /* ADF4382 REG0037 Map */ #define ADF4382_CAL_COUNT_TO_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0038 Map */ #define ADF4382_CAL_VTUNE_TO_LSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0039 Map */ #define ADF4382_O_VCO_DB_MSK NO_OS_BIT(7) #define ADF4382_CAL_VTUNE_TO_MSB_MSK NO_OS_GENMASK(6, 0) /* ADF4382 REG003A Map */ #define ADF4382_CAL_VCO_TO_LSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG003B Map */ #define ADF4382_DEL_CTRL_DB_MSK NO_OS_BIT(7) #define ADF4382_CAL_VCO_TO_MSB_MSK NO_OS_GENMASK(6, 0) /* ADF4382 REG003C Map */ #define ADF4382_CNTR_DIV_WORD_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG003D Map */ #define ADF4382_SPARE_3D_MSK NO_OS_BIT(7) #define ADF4382_SYNC_SP_DB_MSK NO_OS_BIT(6) #define ADF4382_CMOS_OV_MSK NO_OS_BIT(5) #define ADF4382_READ_MODE_MSK NO_OS_BIT(4) #define ADF4382_CNTR_DIV_WORD_MSB_MSK NO_OS_GENMASK(3, 0) /* ADF4382 REG003E Map */ #define ADF4382_ADC_CLK_DIV_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG003F Map */ #define ADF4382_EN_ADC_CNV_MSK NO_OS_BIT(7) #define ADF4382_EN_ADC_VTEST_MSK NO_OS_BIT(6) #define ADF4382_ADC_VTEST_SEL_MSK NO_OS_BIT(5) #define ADF4382_ADC_MUX_SEL_MSK NO_OS_BIT(4) #define ADF4382_ADC_F_CONV_MSK NO_OS_BIT(3) #define ADF4382_ADC_C_CONV_MSK NO_OS_BIT(2) #define ADF4382_EN_ADC_MSK NO_OS_BIT(1) #define ADF4382_SPARE_3F_MSK NO_OS_BIT(0) /* ADF4382 REG0040 Map */ #define ADF4382_EXT_DIV_DEC_SEL_MSK NO_OS_BIT(7) #define ADF4382_ADC_CLK_TEST_SEL_MSK NO_OS_BIT(6) #define ADF4382_MUTE_CLKOUT2_MSK NO_OS_GENMASK(5, 3) #define ADF4382_MUTE_CLKOUT1_MSK NO_OS_GENMASK(2, 0) /* ADF4382 REG0041 Map */ #define ADF4382_EXT_DIV_MSK NO_OS_GENMASK(7, 5) #define ADF4382_EN_VCO_CAP_TEST_MSK NO_OS_BIT(4) #define ADF4382_EN_CALGEN_CAP_TEST_MSK NO_OS_BIT(3) #define ADF4382_EN_CP_CAP_TEST_MSK NO_OS_BIT(2) #define ADF4382_CAP_TEST_STATE_MSK NO_OS_BIT(1) #define ADF4382_TRANS_LOOP_SEL_MSK NO_OS_BIT(0) /* ADF4382 REG0042 Map */ #define ADF4382_NDIV_PWRUP_TIMEOUT_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0043 Map */ #define ADF4382_CAL_BLEED_FINE_MAX_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0044 Map */ #define ADF4382_VCAL_ZERO_MSK NO_OS_BIT(7) #define ADF4382_VPTAT_CALGEN_MSK NO_OS_GENMASK(6, 0) /* ADF4382 REG0045 Map */ #define ADF4382_SPARE_45_MSK NO_OS_BIT(7) #define ADF4382_VCTAT_CALGEN_MSK NO_OS_GENMASK(6, 0) /* ADF4382 REG0046 Map */ #define ADF4382_NVMDIN_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0047 Map */ #define ADF4382_SPARE_47_MSK NO_OS_BIT(7) #define ADF4382_NVMADDR_MSK NO_OS_GENMASK(6, 3) #define ADF4382_NVMNO_OS_BIT_SEL NO_OS_GENMASK(2, 0) /* ADF4382 REG0048 Map */ #define ADF4382_TRIM_LATCH_MSK NO_OS_BIT(7) #define ADF4382_NVMTEST_MSK NO_OS_BIT(6) #define ADF4382_NVMPROG_MSK NO_OS_BIT(5) #define ADF4382_NVMRD_MSK NO_OS_BIT(4) #define ADF4382_NVMSTART_MSK NO_OS_BIT(3) #define ADF4382_NVMON_MSK NO_OS_BIT(2) #define ADF4382_MARGIN_MSK NO_OS_GENMASK(1, 0) /* ADF4382 REG0049 Map */ #define ADF4382_NVMDOUT_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG004A Map */ #define ADF4382_SCAN_MODE_CODE_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG004B Map */ #define ADF4382_TEMP_OFFSET_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG004C Map */ #define ADF4382_SPARE_4C_MSK NO_OS_GENMASK(7, 6) #define ADF4382_TEMP_SLOPE_MSK NO_OS_GENMASK(5, 0) /* ADF4382 REG004D Map */ #define ADF4382_VCO_FSM_TEST_MUX_MSK NO_OS_GENMASK(7, 5) #define ADF4382_SPARE_4D_MSK NO_OS_GENMASK(4, 3) #define ADF4382_O_VCO_BIAS_MSK NO_OS_BIT(2) #define ADF4382_O_VCO_BAND_MSK NO_OS_BIT(1) #define ADF4382_O_VCO_CORE_MSK NO_OS_BIT(0) /* ADF4382 REG004E Map */ #define ADF4382_SPARE_4E_MSK NO_OS_GENMASK(7, 5) #define ADF4382_EN_TWO_PASS_CAL_MSK NO_OS_BIT(4) #define ADF4382_TWO_PASS_BAND_START_MSK NO_OS_GENMASK(3, 0) /* ADF4382 REG004F Map */ #define ADF4382_LUT_SCALE_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0050 Map */ #define ADF4382_SPARE0_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0051 Map */ #define ADF4382_SPARE1_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0052 Map */ #define ADF4382_SYNC_REF_SPARE_MSK NO_OS_GENMASK(7, 4) #define ADF4382_SYNC_MON_DEL_MSK NO_OS_GENMASK(3, 0) /* ADF4382 REG0053 Map */ #define ADF4382_SPARE_53_MSK NO_OS_BIT(7) #define ADF4382_PD_SYNC_MON_MSK NO_OS_BIT(6) #define ADF4382_SYNC_SEL_MSK NO_OS_BIT(5) #define ADF4382_RST_SYNC_MON_MSK NO_OS_BIT(4) #define ADF4382_SYNC_SH_DEL_MSK NO_OS_GENMASK(3, 0) /* ADF4382 REG0054 Map */ #define ADF4382_ADC_ST_CNV_MSK NO_OS_BIT(0) /* ADF4382 REG0058 Map */ #define ADF4382_FSM_BUSY_MSK NO_OS_BIT(1) #define ADF4382_LOCKED_MSK NO_OS_BIT(0) /* ADF4382 REG005E Map */ #define ADF4382_VCO_BAND_LSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG005F Map */ #define ADF4382_VCO_CORE_MSK NO_OS_BIT(1) #define ADF4382_VCO_BAND_MSB_MSK NO_OS_BIT(0) /* ADF4382 REG0200 Map */ #define ADF4382_LUT_WR_ADDR_MSK NO_OS_GENMASK(5, 1) #define ADF4382_O_VCO_LUT_MSK NO_OS_BIT(0) /* ADF4382 REG0201 Map */ #define ADF4382_M_LUT_BAND_LSB_MSK NO_OS_GENMASK(7, 0) /* ADF4382 REG0202 Map */ #define ADF4382_M_LUT_N_LSB_MSK NO_OS_GENMASK(7, 2) #define ADF4382_M_LUT_CORE_MSK NO_OS_BIT(1) #define ADF4382_M_LUT_BAND_MSB_MSK NO_OS_BIT(0) /* ADF4382 REG0203 Map */ #define ADF4382_M_LUT_N_MSB_MSK NO_OS_GENMASK(5, 0) #define ADF4382_SPI_3W_CFG(x) (no_os_field_prep(ADF4382_SDO_ACTIVE_MSK, x) | \ no_os_field_prep(ADF4382_SDO_ACTIVE_R_MSK, x)) #define ADF4382_BLEED_MSB_MSK (ADF4382_COARSE_BLEED_MSK | \ ADF4382_FINE_BLEED_MSB_MSK) #define ADF4382_SPI_SCRATCHPAD_TEST 0x5A /* Specifications */ #define ADF4382_SPI_WRITE_CMD 0x0 #define ADF4382_SPI_READ_CMD 0x8000 #define ADF4382_SPI_DUMMY_DATA 0x00 #define ADF4382_BUFF_SIZE_BYTES 3 #define ADF4382_VCO_FREQ_MIN 11000000000U // 11GHz #define ADF4382_VCO_FREQ_MAX 22000000000U // 22GHz #define ADF4383_VCO_FREQ_MIN 10000000000U // 10GHz #define ADF4383_VCO_FREQ_MAX 20000000000U // 20GHz #define ADF4382A_VCO_FREQ_MIN 11500000000U // 11.5GHz #define ADF4382A_VCO_FREQ_MAX 21000000000U // 21GHz #define ADF4382_MOD1WORD 0x2000000U // 2^25 #define ADF4382_MOD2WORD_MAX 0xFFFFFFU // 2^24 - 1 #define ADF4382_PHASE_RESYNC_MOD2WORD_MAX 0x1FFFFU // 2^17 - 1 #define ADF4382_CHANNEL_SPACING_MAX 78125U #define ADF4382_PFD_FREQ_MAX 625000000U // 625MHz #define ADF4382_PFD_FREQ_FRAC_MAX 250000000U // 250MHz #define ADF4382_PFD_FREQ_MIN 5400000U // 5.4MHz #define ADF4382_DCLK_DIV1_0_MAX 160000000U // 160MHz #define ADF4382_DCLK_DIV1_1_MAX 320000000U // 320MHz #define ADF4382_CLKOUT_DIV_REG_VAL_MAX 4 #define ADF4382A_CLKOUT_DIV_REG_VAL_MAX 2 #define ADF4383_RFOUT_MAX 20000000000U #define ADF4383_RFOUT_MIN 625000000U #define ADF4382_RFOUT_MAX 22000000000U #define ADF4382_RFOUT_MIN 687500000U #define ADF4382A_RFOUT_MAX 21000000000U #define ADF4382A_RFOUT_MIN 2875000000U #define ADF4382_REF_CLK_MAX 5000000000U #define ADF4382_REF_CLK_MIN 10000000 #define ADF4382_REF_DIV_MAX 63 #define ADF4382_OUT_PWR_MAX 15 #define ADF4382_CPI_VAL_MAX 15 #define ADF4382_BLEED_WORD_MAX 8191 #define ADF4382_VPTAT_CALGEN 46 #define ADF4382_VCTAT_CALGEN 82 #define ADF4382_FASTCAL_VPTAT_CALGEN 30 #define ADF4382_FASTCAL_VCTAT_CALGEN 70 #define ADF4382_PHASE_BLEED_CNST 2044000 #define ADF4382_VCO_CAL_CNT 183 #define ADF4382_VCO_CAL_VTUNE 640 #define ADF4382_VCO_CAL_ALC 123 #define ADF4382_POR_DELAY_US 200 #define ADF4382_LKD_DELAY_US 500 #define ADF4382_COARSE_BLEED_CONST 180U // 180 microseconds #define ADF4382_FINE_BLEED_CONST_1 512U // 512 microseconds #define ADF4382_FINE_BLEED_CONST_2 250U // 250 microseconds #define MHZ MEGA #define S_TO_NS NANO #define PS_TO_S PICO #define NS_TO_PS KHZ_PER_MHZ /** * @brief Supported device ids. */ enum adf4382_dev_id { ID_ADF4382, ID_ADF4382A, ID_ADF4383, }; /** * @struct adf4382_init_param * @brief ADF4382 Initialization Parameters structure. */ struct adf4382_init_param { /** SPI Initialization parameters */ struct no_os_spi_init_param *spi_init; bool spi_3wire_en; bool cmos_3v3; uint64_t ref_freq_hz; uint64_t freq; bool ref_doubler_en; uint8_t ref_div; uint8_t cp_i; uint16_t bleed_word; uint8_t ld_count; uint8_t en_lut_gen; uint8_t en_lut_cal; enum adf4382_dev_id id; }; /** * @struct adf4382_dev * @brief ADF4382 Device Descriptor. */ struct adf4382_dev { /** SPI Descriptor */ struct no_os_spi_desc *spi_desc; bool spi_3wire_en; bool cmos_3v3; uint64_t ref_freq_hz; uint64_t freq; bool ref_doubler_en; uint8_t ref_div; uint8_t cp_i; uint16_t bleed_word; uint8_t ld_count; uint32_t phase_adj; uint8_t en_lut_gen; uint8_t en_lut_cal; uint64_t vco_max; uint64_t vco_min; uint64_t freq_max; uint64_t freq_min; uint8_t clkout_div_reg_val_max; // N_INT variable to trigger auto calibration uint16_t n_int; }; /** * @struct reg_sequence * @brief ADF4382 register format structure for default values */ struct reg_sequence { uint16_t reg; uint8_t val; }; /** * @struct adf4382_reg_defaults * @brief ADF4382 register initialization */ static const struct reg_sequence adf4382_reg_defaults[] = { { 0x000, 0x18 }, { 0x00a, 0xA5 }, { 0x200, 0x00 }, { 0x201, 0x00 }, { 0x202, 0x00 }, { 0x203, 0x00 }, { 0x203, 0x00 }, { 0x203, 0x00 }, { 0x100, 0x25 }, { 0x101, 0x3F }, { 0x102, 0x3F }, { 0x103, 0x3F }, { 0x104, 0x3F }, { 0x105, 0x3F }, { 0x106, 0x3F }, { 0x107, 0x3F }, { 0x108, 0x3F }, { 0x109, 0x25 }, { 0x10A, 0x25 }, { 0x10B, 0x3F }, { 0x10C, 0x3F }, { 0x10D, 0x3F }, { 0x10E, 0x3F }, { 0x10F, 0x3F }, { 0x110, 0x3F }, { 0x111, 0x3F }, { 0x054, 0x00 }, { 0x053, 0x45 }, { 0x052, 0x00 }, { 0x051, 0x00 }, { 0x050, 0x00 }, { 0x04f, 0x08 }, { 0x04e, 0x06 }, { 0x04d, 0x00 }, { 0x04c, 0x2B }, { 0x04b, 0x5D }, { 0x04a, 0x00 }, { 0x048, 0x00 }, { 0x047, 0x00 }, { 0x046, 0x00 }, { 0x045, 0x52 }, { 0x044, 0x2E }, { 0x043, 0xB8 }, { 0x042, 0x01 }, { 0x041, 0x00 }, { 0x040, 0x00 }, { 0x03f, 0x82 }, { 0x03e, 0x4E }, { 0x03c, 0x00 }, { 0x03b, 0x00 }, { 0x03a, 0xFA }, { 0x039, 0x80 }, { 0x038, 0x71 }, { 0x037, 0x82 }, { 0x036, 0xC0 }, { 0x035, 0x00 }, { 0x034, 0x36 }, { 0x033, 0x00 }, { 0x032, 0x40 }, { 0x031, 0x63 }, { 0x030, 0x0F }, { 0x02f, 0x3F }, { 0x02e, 0x00 }, { 0x02d, 0xF1 }, { 0x02c, 0x0E }, { 0x02b, 0x01 }, { 0x02a, 0x30 }, { 0x029, 0x09 }, { 0x028, 0x00 }, { 0x027, 0xF0 }, { 0x026, 0x00 }, { 0x025, 0x01 }, { 0x024, 0x01 }, { 0x023, 0x00 }, { 0x022, 0x00 }, { 0x021, 0x00 }, { 0x020, 0xC1 }, { 0x01f, 0x0F }, { 0x01e, 0x20 }, { 0x01d, 0x00 }, { 0x01c, 0x00 }, { 0x01b, 0x00 }, { 0x01a, 0x00 }, { 0x019, 0x00 }, { 0x018, 0x00 }, { 0x017, 0x00 }, { 0x016, 0x00 }, { 0x015, 0x06 }, { 0x014, 0x00 }, { 0x013, 0x00 }, { 0x012, 0x00 }, { 0x011, 0x00 }, { 0x010, 0x50 }, }; /** ADF4382 SPI write */ int adf4382_spi_write(struct adf4382_dev *dev, uint16_t reg_addr, uint8_t data); /** ADF4382 SPI Read */ int adf4382_spi_read(struct adf4382_dev *dev, uint16_t reg_addr, uint8_t *data); /** ADF4382 updates a bit in the register space over SPI */ int adf4382_spi_update_bits(struct adf4382_dev *dev, uint16_t reg_addr, uint8_t mask, uint8_t data); /** ADF4382 Register dump */ int adf4382_reg_dump(struct adf4382_dev *dev); /** ADF4382 Set reference frequency attribute */ int adf4382_set_ref_clk(struct adf4382_dev *dev, uint64_t val); /** ADF4382 Get reference frequency attribute */ int adf4382_get_ref_clk(struct adf4382_dev *dev, uint64_t *val); /** ADF4382 Set reference doubler attribute */ int adf4382_set_en_ref_doubler(struct adf4382_dev *dev, bool en); /** ADF4382 Get reference doubler attribute */ int adf4382_get_en_ref_doubler(struct adf4382_dev *dev, bool *en); /** ADF4382 Set reference divider attribute */ int adf4382_set_ref_div(struct adf4382_dev *dev, int32_t div); /** ADF4382 Get reference divider attribute */ int adf4382_get_ref_div(struct adf4382_dev *dev, int32_t *div); /** ADF4382 Set charge pump current attribute */ int adf4382_set_cp_i(struct adf4382_dev *dev, int32_t reg_val); /** ADF4382 Get charge pump current attribute */ int adf4382_get_cp_i(struct adf4382_dev *dev, int32_t *reg_val); /** ADF4382 Set bleed current attribute */ int adf4382_set_bleed_word(struct adf4382_dev *dev, int32_t word); /** ADF4382 Get bleed current attribute */ int adf4382_get_bleed_word(struct adf4382_dev *dev, int32_t *word); /** ADF4382 Set output frequency attribute */ int adf4382_set_rfout(struct adf4382_dev *dev, uint64_t val); /** ADF4382 Get output frequency attribute */ int adf4382_get_rfout(struct adf4382_dev *dev, uint64_t *val); /** ADF4382 Set output power attributes */ int adf4382_set_out_power(struct adf4382_dev *dev, uint8_t ch, int32_t pwr); /** ADF4382 Get output power attributes */ int adf4382_get_out_power(struct adf4382_dev *dev, uint8_t ch, int32_t *pwr); /** ADF4382 Set channel enable attributes */ int adf4382_set_en_chan(struct adf4382_dev *dev, uint8_t ch, bool en); /** ADF4382 Get channel enable attributes */ int adf4382_get_en_chan(struct adf4382_dev *dev, uint8_t ch, bool *en); /** ADF4382 Sets frequency */ int adf4382_set_freq(struct adf4382_dev *dev); /** ADF4382 Set fast calibration attributes */ int adf4382_set_en_fast_calibration(struct adf4382_dev *dev, bool en_fast_cal); /** ADF4382 Set fast calibration LUT calibration attributes */ int adf4382_set_en_lut_calibration(struct adf4382_dev *dev, bool en_lut_cal); /** ADF4382 Get Fast Calibration LUT Calibration attributes */ int adf4382_get_en_lut_calibration(struct adf4382_dev *dev, bool *en); /** ADF4382 Set Output Frequency without writing the Ndiv Register */ int adf4382_set_change_freq(struct adf4382_dev *dev); /** ADF4382 Get Change Output Frequency attribute value */ int adf4382_get_change_rfout(struct adf4382_dev *dev, uint64_t *val); /** ADF4382 Set Change Output Frequency attribute value */ int adf4382_set_change_rfout(struct adf4382_dev *dev, uint64_t val); /** ADF4382 Set the NDIV register attribute value */ int adf4382_set_start_calibration(struct adf4382_dev *dev); /** ADF4382 Get the NDIV register attribute value as 0 */ int adf4382_get_start_calibration(struct adf4382_dev *dev, bool *start_cal); /** ADF4382 Sets Phase adjustment */ int adf4382_set_phase_adjust(struct adf4382_dev *dev, uint32_t phase_ps); /** ADF4382 Sets Phase adjustment polarity*/ int adf4382_set_phase_pol(struct adf4382_dev *dev, bool polarity); /** ADF4382 Gets Phase adjustment polarity*/ int adf4382_get_phase_pol(struct adf4382_dev *dev, bool *polarity); /** ADF4382 Set EZSYNC feature attributes */ int adf4382_set_ezsync_setup(struct adf4382_dev *dev, bool sync); /** ADF4382 Set Timed SYNC feature attributes */ int adf4382_set_timed_sync_setup(struct adf4382_dev *dev, bool sync); /** ADF4382 Get EZSYNC and Timed SYNC feature attributes */ int adf4382_get_phase_sync_setup(struct adf4382_dev *dev, bool *en); /** ADF4382 Set sw_sync attribute */ int adf4382_set_sw_sync(struct adf4382_dev *dev, bool sw_sync); /** ADF4382 Get sw_sync attribute */ int adf4382_get_sw_sync(struct adf4382_dev *dev, bool *sw_sync); /** ADF4382 Initialization */ int adf4382_init(struct adf4382_dev **device, struct adf4382_init_param *init_param); /** ADF4382 Remove */ int adf4382_remove(struct adf4382_dev *dev); #ifdef __cplusplus } #endif