Good morning,
I have got the AD9081-FMCA-EBZ running successfully on a custom Versal carrier using a petalinux build with the meta-adi yocto layer. I have been using the example VCK190 device tree (linux/arch/arm64/boot/dts/xilinx/versal-vck190-reva-ad9081.dts at master · analogdevicesinc/linux (github.com)), and I am now trying to change the JESD modes. I'd like to run all channels at max ADC / DAC rates with real data (no I/Q) and bypass all the NCO's and decimation & interpolation. For this I am trying to use JESD204C modes RX 27 and TX 35, but I am running into the following error in the bootlog -
[ 8.799242] axi-jesd204-rx a4a90000.axi-jesd204-rx: axi_jesd204_rx_jesd204_link_pre_setup: Link2 set REFCLK to device/link rate 187500000 Hz failed (-22)
[ 8.813097] axi-jesd204-tx a4b90000.axi-jesd204-tx: axi_jesd204_tx_jesd204_link_pre_setup: Link0 set REFCLK to device/link rate 187500000 Hz failed (-22)
This error is very similar to one described here - Troubleshooting JESD204B Tx links [Analog Devices Wiki]. However I am struggling to see how to modify the CPLL/QPLL as advised in the VCK190 example HDL. I have tried increasing the adi,divider values to force the clock, and also editing the HDL timing constraints. Please could you advise on next steps? I have attached my device tree below.
Many thanks
Jack
// SPDX-License-Identifier: GPL-2.0 /* * Analog Devices AD9081-FMC-EBZ * https://wiki.analog.com/resources/tools-software/linux-drivers/iio-mxfe/ad9081 * https://wiki.analog.com/resources/eval/user-guides/ad9081_fmca_ebz/ad9081_fmca_ebz_hdl * * hdl_project: <ad9081_fmca_ebz/vck190> * board_revision: <> * * Copyright (C) 2019-2023 Analog Devices Inc. */ #include "versal-vck190-revA.dts" #include <dt-bindings/interrupt-controller/irq.h> #include <dt-bindings/iio/adc/adi,ad9081.h> #include <dt-bindings/jesd204/adxcvr.h> #include <dt-bindings/iio/frequency/hmc7044.h> /* RX path */ #define AD9081_RX_LANERATE_KHZ 24750000 #define AD9081_RX_LINK_CLK 375000000 /* TX path */ #define AD9081_TX_LANERATE_KHZ 24750000 #define AD9081_TX_LINK_CLK 375000000 / { model = "DTS Edit 2"; chosen { bootargs = "console=ttyAMA0 earlycon=pl011,mmio32,0xFF000000,115200n8 clk_ignore_unused root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait"; stdout-path = "serial0:115200"; }; fpga_axi: fpga-axi@0 { interrupt-parent = <&gic>; compatible = "simple-bus"; #address-cells = <0x1>; #size-cells = <0x1>; ranges = <0 0 0 0xffffffff>; clocks { rx_fixed_linerate: clock@0 { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <AD9081_RX_LANERATE_KHZ>; clock-output-names = "rx_lane_clk"; }; tx_fixed_linerate: clock@1 { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <AD9081_TX_LANERATE_KHZ>; clock-output-names = "tx_lane_clk"; }; rx_fixed_link_clk: clock@2 { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <AD9081_RX_LINK_CLK>; clock-output-names = "rx_link_clk"; }; tx_fixed_link_clk: clock@3 { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <AD9081_TX_LINK_CLK>; clock-output-names = "tx_link_clk"; }; }; axi_gpio: gpio@a4000000 { #gpio-cells = <2>; #interrupt-cells = <2>; clock-names = "s_axi_aclk"; clocks = <&versal_clk PMC_PL0_REF>; compatible = "xlnx,axi-gpio-2.0", "xlnx,xps-gpio-1.00.a"; gpio-controller; interrupt-controller; interrupt-names = "ip2intc_irpt"; interrupt-parent = <&gic>; interrupts = <0 84 4>; reg = <0xa4000000 0x1000>; xlnx,all-inputs = <0x0>; xlnx,all-inputs-2 = <0x0>; xlnx,all-outputs = <0x0>; xlnx,all-outputs-2 = <0x0>; xlnx,dout-default = <0x00000000>; xlnx,dout-default-2 = <0x00000000>; xlnx,gpio-width = <0x20>; xlnx,gpio2-width = <0x20>; xlnx,interrupt-present = <0x1>; xlnx,is-dual = <0x1>; xlnx,tri-default = <0xFFFFFFFF>; xlnx,tri-default-2 = <0xFFFFFFFF>; }; rx_dma: dma@bc420000 { compatible = "adi,axi-dmac-1.00.a"; reg = <0xbc420000 0x10000>; #dma-cells = <1>; #clock-cells = <0>; interrupts = <0 97 IRQ_TYPE_LEVEL_HIGH>; clocks = <&versal_clk PMC_PL1_REF>; adi,channels { #size-cells = <0>; #address-cells = <1>; dma-channel@0 { reg = <0>; adi,source-bus-type = <2>; adi,destination-bus-type = <0>; }; }; }; tx_dma: dma@bc430000 { compatible = "adi,axi-dmac-1.00.a"; reg = <0xbc430000 0x10000>; #dma-cells = <1>; #clock-cells = <0>; interrupts = <0 96 IRQ_TYPE_LEVEL_HIGH>; clocks = <&versal_clk PMC_PL1_REF>; adi,channels { #size-cells = <0>; #address-cells = <1>; dma-channel@0 { reg = <0>; adi,source-bus-type = <0>; adi,destination-bus-type = <2>; }; }; }; axi_ad9081_core_rx: axi-ad9081-rx-hpc@a4a10000 { compatible = "adi,axi-ad9081-rx-1.0"; reg = <0xa4a10000 0x8000>; dmas = <&rx_dma 0>; dma-names = "rx"; spibus-connected = <&trx0_ad9081>; jesd204-device; #jesd204-cells = <2>; jesd204-inputs = <&axi_ad9081_rx_jesd 0 FRAMER_LINK0_RX>; }; axi_ad9081_core_tx: axi-ad9081-tx-hpc@a4b10000 { compatible = "adi,axi-ad9081-tx-1.0"; reg = <0xa4b10000 0x4000>; dmas = <&tx_dma 0>; dma-names = "tx"; clocks = <&trx0_ad9081 1>; clock-names = "sampl_clk"; spibus-connected = <&trx0_ad9081>; jesd204-device; #jesd204-cells = <2>; jesd204-inputs = <&axi_ad9081_tx_jesd 0 DEFRAMER_LINK0_TX>; }; axi_ad9081_rx_jesd: axi-jesd204-rx@a4a90000 { compatible = "adi,axi-jesd204-rx-1.0"; reg = <0xa4a90000 0x1000>; interrupts = <0 95 IRQ_TYPE_LEVEL_HIGH>; clocks = <&versal_clk PMC_PL0_REF>, <&hmc7044 10>, <&rx_fixed_link_clk>, <&rx_fixed_linerate>; clock-names = "s_axi_aclk", "device_clk", "link_clk", "lane_clk"; #clock-cells = <0>; clock-output-names = "jesd_rx_lane_clk"; jesd204-device; #jesd204-cells = <2>; jesd204-inputs = <&hmc7044 0 FRAMER_LINK0_RX>; }; axi_ad9081_tx_jesd: axi-jesd204-tx@a4b90000 { compatible = "adi,axi-jesd204-tx-1.0"; reg = <0xa4b90000 0x1000>; interrupts = <0 94 IRQ_TYPE_LEVEL_HIGH>; clocks = <&versal_clk PMC_PL0_REF>, <&hmc7044 6>, <&tx_fixed_link_clk>, <&tx_fixed_linerate>; clock-names = "s_axi_aclk", "device_clk", "link_clk", "lane_clk"; #clock-cells = <0>; clock-output-names = "jesd_tx_lane_clk"; jesd204-device; #jesd204-cells = <2>; jesd204-inputs = <&hmc7044 0 DEFRAMER_LINK0_TX>; }; axi_sysid_0: axi-sysid-0@a5000000 { compatible = "adi,axi-sysid-1.00.a"; reg = <0xa5000000 0x10000>; }; }; }; &gic { num_cpus = <2>; num_interrupts = <96>; }; &lpd_dma_chan0 { status = "okay"; }; &lpd_dma_chan1 { status = "okay"; }; &lpd_dma_chan2 { status = "okay"; }; &lpd_dma_chan3 { status = "okay"; }; &lpd_dma_chan4 { status = "okay"; }; &lpd_dma_chan5 { status = "okay"; }; &lpd_dma_chan6 { status = "okay"; }; &lpd_dma_chan7 { status = "okay"; }; &cci { status = "okay"; }; &smmu { status = "okay"; }; &i2c1 { status = "disabled"; }; &gpio1 { status = "okay"; }; &qspi { is-dual = <1>; num-cs = <1>; spi-rx-bus-width = <4>; spi-tx-bus-width = <4>; status = "okay"; }; &sdhci1 { clock-frequency = <199999985>; status = "okay"; }; &serial0 { cts-override ; device_type = "serial"; port-number = <0>; }; &spi0 { is-decoded-cs = <0>; num-cs = <3>; status = "okay"; }; &spi1 { is-decoded-cs = <0>; num-cs = <3>; status = "okay"; }; &ttc0 { status = "okay"; }; &ref_clk { clock-frequency = <50000000>; }; &gem0 { local-mac-address = [00 0a 35 ad 90 81]; }; &fpga_axi { axi_data_offload_tx: axi-data-offload-0@bc440000 { compatible = "adi,axi-data-offload-1.0.a"; reg = <0xbc440000 0x10000>; }; axi_data_offload_rx: axi-data-offload-1@bc450000 { compatible = "adi,axi-data-offload-1.0.a"; reg = <0xbc450000 0x10000>; }; }; &axi_ad9081_core_tx { adi,axi-data-offload-connected = <&axi_data_offload_tx>; adi,axi-pl-fifo-enable; }; #define fmc_spi spi0 &spi1 { status = "okay"; hmc7044: hmc7044@0 { #address-cells = <1>; #size-cells = <0>; #clock-cells = <1>; compatible = "adi,hmc7044"; reg = <0>; spi-max-frequency = <1000000>; jesd204-device; #jesd204-cells = <2>; jesd204-sysref-provider; adi,jesd204-max-sysref-frequency-hz = <2000000>; /* 2 MHz */ /* * There are different versions of the AD9081-FMCA-EBZ & AD9082-FMCA-EBZ * VCXO = 122.880 MHz, XO = 122.880MHz (AD9081-FMC-EBZ & AD9082-FMC-EBZ) * VCXO = 100.000 MHz, XO = 100.000MHz (AD9081-FMC-EBZ-A2 & AD9082-FMC-EBZ-A2) * To determine which board is which, read the freqency printed on the VCXO * or use the fru-dump utility: * #fru-dump -b /sys/bus/i2c/devices/15-0050/eeprom */ //adi,pll1-clkin-frequencies = <122880000 30720000 0 0>; //adi,vcxo-frequency = <122880000>; adi,pll1-clkin-frequencies = <100000000 10000000 0 0>; adi,pll1-ref-prio-ctrl = <0xE1>; /* prefer CLKIN1 -> CLKIN0 -> CLKIN2 -> CLKIN3 */ adi,pll1-ref-autorevert-enable; adi,vcxo-frequency = <100000000>; adi,pll1-loop-bandwidth-hz = <200>; adi,pll1-charge-pump-current-ua = <720>; adi,pfd1-maximum-limit-frequency-hz = <1000000>; /* 1 MHz */ adi,pll2-output-frequency = <3000000000>; adi,sysref-timer-divider = <1024>; adi,pulse-generator-mode = <0>; adi,clkin0-buffer-mode = <0x07>; adi,clkin1-buffer-mode = <0x07>; adi,oscin-buffer-mode = <0x15>; adi,gpi-controls = <0x00 0x00 0x00 0x00>; adi,gpo-controls = <0x37 0x33 0x00 0x00>; clock-output-names = "hmc7044_out0", "hmc7044_out1", "hmc7044_out2", "hmc7044_out3", "hmc7044_out4", "hmc7044_out5", "hmc7044_out6", "hmc7044_out7", "hmc7044_out8", "hmc7044_out9", "hmc7044_out10", "hmc7044_out11", "hmc7044_out12", "hmc7044_out13"; hmc7044_c0: channel@0 { reg = <0>; adi,extended-name = "CORE_CLK_RX"; adi,divider = <8>; // 375 adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; // LVDS }; hmc7044_c2: channel@2 { reg = <2>; adi,extended-name = "DEV_REFCLK"; adi,divider = <8>; // 375 adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; // LVDS }; hmc7044_c3: channel@3 { reg = <3>; adi,extended-name = "DEV_SYSREF"; adi,divider = <768>; // 3.90625 adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; // LVDS adi,jesd204-sysref-chan; }; hmc7044_c6: channel@6 { reg = <6>; adi,extended-name = "CORE_CLK_TX"; adi,divider = <12>; // 250 = LR/66*4/6 adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; // LVDS }; hmc7044_c8: channel@8 { reg = <8>; adi,extended-name = "FPGA_REFCLK1"; adi,divider = <4>; // 750 adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; // LVDS }; hmc7044_c10: channel@10 { reg = <10>; adi,extended-name = "CORE_CLK_RX"; adi,divider = <12>; // 250 = LR/66*4/6 adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; // LVDS }; hmc7044_c12: channel@12 { reg = <12>; adi,extended-name = "FPGA_REFCLK"; adi,divider = <8>; // 375 adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; // LVDS }; hmc7044_c13: channel@13 { reg = <13>; adi,extended-name = "FPGA_SYSREF"; adi,divider = <768>; // 3.90625 adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; // LVDS adi,jesd204-sysref-chan; }; }; }; &fmc_spi { trx0_ad9081: ad9081@0 { #address-cells = <1>; #size-cells = <0>; compatible = "adi,ad9081"; reg = <0>; spi-max-frequency = <5000000>; /* Clocks */ clocks = <&hmc7044 2>; clock-names = "dev_clk"; clock-output-names = "rx_sampl_clk", "tx_sampl_clk"; #clock-cells = <1>; reset-gpios = <&axi_gpio 23 0>; sysref-req-gpios = <&axi_gpio 11 0>; rx2-enable-gpios = <&axi_gpio 25 0>; rx1-enable-gpios = <&axi_gpio 24 0>; tx2-enable-gpios = <&axi_gpio 27 0>; tx1-enable-gpios = <&axi_gpio 26 0>; jesd204-device; #jesd204-cells = <2>; jesd204-top-device = <0>; /* This is the TOP device */ jesd204-link-ids = <FRAMER_LINK0_RX DEFRAMER_LINK0_TX>; jesd204-inputs = <&axi_ad9081_core_rx 0 FRAMER_LINK0_RX>, <&axi_ad9081_core_tx 0 DEFRAMER_LINK0_TX>; adi,tx-dacs { #size-cells = <0>; #address-cells = <1>; adi,dac-frequency-hz = /bits/ 64 <4000000000>; adi,main-data-paths { #address-cells = <1>; #size-cells = <0>; adi,interpolation = <2>; ad9081_dac0: dac@0 { reg = <0>; adi,crossbar-select = <&ad9081_tx_fddc_chan0>; adi,nco-frequency-shift-hz = /bits/ 64 <0>; /* 100 MHz */ }; ad9081_dac1: dac@1 { reg = <1>; adi,crossbar-select = <&ad9081_tx_fddc_chan1>; adi,nco-frequency-shift-hz = /bits/ 64 <0>; /* 1100 MHz */ }; ad9081_dac2: dac@2 { reg = <2>; adi,crossbar-select = <&ad9081_tx_fddc_chan2>; /* All 4 channels @ dac2 */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; /* 300 MHz */ }; ad9081_dac3: dac@3 { reg = <3>; adi,crossbar-select = <&ad9081_tx_fddc_chan3>; /* All 4 channels @ dac2 */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; /* 400 MHz */ }; }; adi,channelizer-paths { #address-cells = <1>; #size-cells = <0>; adi,interpolation = <1>; ad9081_tx_fddc_chan0: channel@0 { reg = <0>; adi,gain = <0>; /* 2048 * 10^(gain_dB/20) */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; ad9081_tx_fddc_chan1: channel@1 { reg = <1>; adi,gain = <0>; /* 2048 * 10^(gain_dB/20) */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; ad9081_tx_fddc_chan2: channel@2 { reg = <2>; adi,gain = <0>; /* 2048 * 10^(gain_dB/20) */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; ad9081_tx_fddc_chan3: channel@3 { reg = <3>; adi,gain = <0>; /* 2048 * 10^(gain_dB/20) */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; }; adi,jesd-links { #size-cells = <0>; #address-cells = <1>; ad9081_tx_jesd_l0: link@0 { #address-cells = <1>; #size-cells = <0>; reg = <0>; adi,logical-lane-mapping = /bits/ 8 <0 2 7 6 1 5 4 3>; adi,link-mode = <35>; /* JESD Quick Configuration Mode */ adi,subclass = <1>; /* JESD SUBCLASS 0,1,2 */ adi,version = <2>; /* JESD VERSION 0=204A,1=204B,2=204C */ adi,dual-link = <0>; /* JESD Dual Link Mode */ adi,converters-per-device = <4>; /* JESD M */ adi,octets-per-frame = <3>; /* JESD F */ adi,frames-per-multiframe = <256>; /* JESD K */ adi,converter-resolution = <12>; /* JESD N */ adi,bits-per-sample = <12>; /* JESD NP' */ adi,control-bits-per-sample = <0>; /* JESD CS */ adi,lanes-per-device = <8>; /* JESD L */ adi,samples-per-converter-per-frame = <4>; /* JESD S */ adi,high-density = <0>; /* JESD HD */ adi,tpl-phase-adjust = <0x3b>; }; }; }; adi,rx-adcs { #size-cells = <0>; #address-cells = <1>; adi,adc-frequency-hz = /bits/ 64 <4000000000>; adi,main-data-paths { #address-cells = <1>; #size-cells = <0>; ad9081_adc0: adc@0 { reg = <0>; adi,decimation = <1>; adi,nco-frequency-shift-hz = /bits/ 64 <0>; adi,nco-mixer-mode = <AD9081_ADC_NCO_VIF>; }; ad9081_adc1: adc@1 { reg = <1>; adi,decimation = <1>; adi,nco-frequency-shift-hz = /bits/ 64 <0>; adi,nco-mixer-mode = <AD9081_ADC_NCO_VIF>; }; ad9081_adc2: adc@2 { reg = <2>; adi,decimation = <1>; adi,nco-frequency-shift-hz = /bits/ 64 <0>; adi,nco-mixer-mode = <AD9081_ADC_NCO_VIF>; }; ad9081_adc3: adc@3 { reg = <3>; adi,decimation = <1>; adi,nco-frequency-shift-hz = /bits/ 64 <0>; adi,nco-mixer-mode = <AD9081_ADC_NCO_VIF>; }; }; adi,channelizer-paths { #address-cells = <1>; #size-cells = <0>; ad9081_rx_fddc_chan0: channel@0 { reg = <0>; adi,decimation = <1>; adi,gain = <0>; /* 2048 * 10^(gain_dB/20) */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; ad9081_rx_fddc_chan1: channel@1 { reg = <1>; adi,decimation = <1>; adi,gain = <0>; /* 2048 * 10^(gain_dB/20) */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; ad9081_rx_fddc_chan4: channel@4 { reg = <4>; adi,decimation = <1>; adi,gain = <0>; /* 2048 * 10^(gain_dB/20) */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; ad9081_rx_fddc_chan5: channel@5 { reg = <5>; adi,decimation = <1>; adi,gain = <0>; /* 2048 * 10^(gain_dB/20) */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; }; adi,jesd-links { #size-cells = <0>; #address-cells = <1>; ad9081_rx_jesd_l0: link@0 { reg = <0>; adi,converter-select = <&ad9081_rx_fddc_chan0 FDDC_I>, <&ad9081_rx_fddc_chan1 FDDC_I>, <&ad9081_rx_fddc_chan4 FDDC_I>, <&ad9081_rx_fddc_chan5 FDDC_I>; adi,logical-lane-mapping = /bits/ 8 <2 0 7 6 5 4 3 1>; adi,link-mode = <27>; /* JESD Quick Configuration Mode */ adi,subclass = <1>; /* JESD SUBCLASS 0,1,2 */ adi,version = <2>; /* JESD VERSION 0=204A,1=204B,2=204C */ adi,dual-link = <0>; /* JESD Dual Link Mode */ adi,converters-per-device = <4>; /* JESD M */ adi,octets-per-frame = <3>; /* JESD F */ adi,frames-per-multiframe = <256>; /* JESD K */ adi,converter-resolution = <12>; /* JESD N */ adi,bits-per-sample = <12>; /* JESD NP' */ adi,control-bits-per-sample = <0>; /* JESD CS */ adi,lanes-per-device = <8>; /* JESD L */ adi,samples-per-converter-per-frame = <4>; /* JESD S */ adi,high-density = <0>; /* JESD HD */ }; }; }; }; };