ADF4030
ADF4030 IIO 10-Channel Precision Synchronizer.
Supported Devices
Evaluation Boards
Description
The ADF4030 is a 10-channel precision synchronizer with integrated time-to- digital converter (TDC) for high-accuracy clock distribution and alignment. It supports JESD204B/C system synchronization, with BSYNC clock-edge alignment to less than 5 ps at the device pins relative to the selected reference BSYNC channel.
Source Code
Status
Source |
Mainlined? |
||
|---|---|---|---|
No |
Files
Function |
File |
|
|---|---|---|
driver |
||
Documentation |
||
ABI documentation |
Adding Linux driver support
Kernel configuration
Configure kernel with make menuconfig (alternatively use make xconfig or
make qconfig)
Note
The ADF4030 driver depends on SPI and selects REGMAP_SPI
Configure kernel with make menuconfig (alternatively use make xconfig or
make qconfig)
Linux Kernel Configuration
Device Drivers --->
<*> Industrial I/O support --->
--- Industrial I/O support
Frequency Synthesizers DDS/PLL --->
*** Phase-Locked Loop (PLL) frequency synthesizers ***
<*> Analog Devices ADF4030 10-Channel Precision Synchronizer
Devicetree configuration
Example platform device initialization
The ADF4030 driver is a SPI bus driver and can be instantiated via device tree.
Properties:
compatible: `adi,adf4030`
clocks: Input reference clock (maxItems: 1)
clock-names: `refin`
adi,vco-frequency-hz: VCO output frequency in Hz
adi,bsync-frequency-hz: Primary BSync output frequency in Hz
adi,bsync-secondary-frequency-hz: Secondary BSync output frequency in Hz
adi,bsync-autoalign-reference-channel: Reference channel number for auto alignment
adi,bsync-autoalign-iteration-count: Number of iterations for auto alignment
adi,bsync-autoalign-threshold-fs: Threshold for auto alignment in femtoseconds
clock-output-names: Names of the clock outputs (minItems: 1, maxItems: 10)
#clock-cells: 1
Pattern Properties: * ^channel@[0-9]+$: ADF4030 channel configuration
reg: Channel number
adi,delay-fs: Delay in femtoseconds
adi,extended-name: Extended name for the channel
adi,reference-channel-num: Reference channel number
adi,output-en: Enable output for the channel
adi,input-output-reconfig-en: Enable input-output reconfiguration for the channel
adi,use-secondary-odiv-b-en: Enable use of secondary ODIV B
auto-align-on-sync-en: Enable auto alignment on sync
adi,invert-en: Enable inversion for the channel
adi,ac-coupled-en: Enable AC coupling for the channel
adi,link-tx-en: Enable link TX for the channel
adi,link-rx-en: Enable link RX for the channel
adi,float-tx-en: Enable float TX for the channel
adi,float-rx-en: Enable float RX for the channel
adi,rcm: RCM value for the channel
Required properties:
compatible: Should always be one of these:
adi,adf4030
reg: SPI chip select number.
clocks: a list of phandle, one for each entry in clock-names.
clock-names: Must include the following entry:
refinadi,vco-frequency-hz: VCO output frequency in Hz
adi,bsync-frequency-hz: Primary BSync output frequency in Hz
Example:
spi {
#address-cells = <1>;
#size-cells = <0>;
adf4030@0 {
#clock-cells = <1>;
compatible = "adi,adf4030";
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
spi-max-frequency = <1000000>;
clocks = <<c6952 5>;
clock-names = "refin";
clock-output-names = "adf4030_bsync_0", "adf4030_bsync_1",
"adf4030_bsync_2", "adf4030_bsync_3", "adf4030_bsync_4",
"adf4030_bsync_5", "adf4030_bsync_6", "adf4030_bsync_7",
"adf4030_bsync_8", "adf4030_bsync_9" ;
label = "adf4030";
adi,vco-frequency-hz = <2500000000>; /* 2.5 GHz */
adi,bsync-frequency-hz = <12500000>; /* 12.5 MHz */
adi,bsync-autoalign-reference-channel = <8>;
adi,bsync-autoalign-iteration-count = <6>;
channel@0 {
reg = <0>;
adi,extended-name = "SYSREF_0";
adi,output-en;
adi,input-output-reconfig-en;
auto-align-on-sync-en;
adi,rcm = <1>;
};
channel@1 {
reg = <1>;
adi,extended-name = "SYSREF_1";
adi,output-en;
adi,input-output-reconfig-en;
auto-align-on-sync-en;
adi,rcm = <1>;
};
channel@4 {
reg = <4>;
adi,extended-name = "FPGA_SYSREF_0";
adi,output-en;
adi,input-output-reconfig-en;
auto-align-on-sync-en;
adi,rcm = <62>;
};
channel@8 {
reg = <8>;
adi,extended-name = "REF";
adi,rcm = <62>;
};
};
};
Driver testing
Each and every IIO device, typically a hardware chip, has a device folder under
/sys/bus/iio/devices/iio:deviceX. Where X is the IIO index of the device. Under
every of these directory folders reside a set of files, depending on the
characteristics and features of the hardware device in question. These files
are consistently generalized and documented in the IIO ABI documentation. In
order to determine which IIO deviceX corresponds to which hardware device, the
user can read the name file /sys/bus/iio/devices/iio:deviceX/name. In case
the sequence in which the iio device drivers are loaded/registered is constant,
the numbering is constant and may be known in advance.
analog:/sys/bus/iio/devices/iio:device0# cd /sys/bus/iio/devices/
root@analog:/sys/bus/iio/devices# ls
iio:device0
root@analog:/sys/bus/iio/devices#
root@analog:/sys/bus/iio/devices# cd iio\:device0
root@analog:/sys/bus/iio/devices/iio:device0# ls -l
total 0
drwxr-xr-x 2 root root 0 Jan 1 00:03 .
drwxr-xr-x 5 root root 0 Jan 1 00:03 ..
-rw-r--r-- 1 root root 4096 Jan 1 00:03 in_temp0_input
-r--r--r-- 1 root root 4096 Jan 1 00:03 label
-r--r--r-- 1 root root 4096 Jan 1 00:03 name
lrwxrwxrwx 1 root root 0 Jan 1 00:03 of_node -> ../../../../../../../../firmware/devicetree/base/amba_pl/spi@44A80000/a4
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage0_SYSREF_0_frequency
-r--r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage0_SYSREF_0_label
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage0_SYSREF_0_output_enable
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage0_SYSREF_0_phase
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage0_SYSREF_0_reference_channel
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage1_SYSREF_1_frequency
-r--r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage1_SYSREF_1_label
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage1_SYSREF_1_output_enable
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage1_SYSREF_1_phase
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage1_SYSREF_1_reference_channel
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage4_FPGA_SYSREF_0_frequency
-r--r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage4_FPGA_SYSREF_0_label
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage4_FPGA_SYSREF_0_output_enable
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage4_FPGA_SYSREF_0_phase
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage4_FPGA_SYSREF_0_reference_channel
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage8_REF_frequency
-r--r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage8_REF_label
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage8_REF_output_enable
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage8_REF_phase
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage8_REF_reference_channel
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage_autoalign_iteration
-rw-r--r-- 1 root root 4096 Jan 1 00:03 out_altvoltage_autoalign_threshold
lrwxrwxrwx 1 root root 0 Jan 1 00:03 subsystem -> ../../../../../../../../bus/iio
-rw-r--r-- 1 root root 4096 Jan 1 00:03 uevent
-r
root@analog:/sys/bus/iio/devices/iio:device0#
Identify the device
root@analog:/sys/bus/iio/devices/iio:device0# cat name
adf4030
Read BSYNC frequency
What: out_altvoltageX_[<adi,extended-name>]_frequency
Returns the BSYNC frequency set via devicetree property
adi,bsync-frequency-hz
root@analog:/sys/bus/iio/devices/iio:device0# cat out_altvoltage0_SYSREF_0_frequency
6250000
Set Reference Channel
What: out_altvoltageX_[<adi,extended-name>]_reference_channel
Set reference channel for TDC measurement and BSYNC alignment.
Value |
Input |
|---|---|
|
BSYNC0 |
|
BSYNC1 |
|
BSYNC2 |
|
BSYNC3 |
|
BSYNC4 |
|
BSYNC5 |
|
BSYNC6 |
|
BSYNC7 |
|
BSYNC8 |
|
BSYNC9 |
|
root@analog:/sys/bus/iio/devices/iio:device0# echo 8 > out_altvoltage0_SYSREF_0_reference_channel
Read TDC Measurement
What: out_altvoltageX_[<adi,extended-name>]_phase
Measure the time difference between this and the reference channel using the time-to-digital converter (TDC). Results are counted in femtoseconds (fs)
root@analog:/sys/bus/iio/devices/iio:device0# cat out_altvoltage0_SYSREF_0_phase
72412
Set Time Delay Offset
What: out_altvoltageX_[<adi,extended-name>]_phase
Set the desired time delay offset for the Single-Channel Alignment in femtoseconds (fs).
root@analog:/sys/bus/iio/devices/iio:device0# echo 0 > out_altvoltage0_SYSREF_0_phase
Start Single-Channel Alignment
Writing the channel’s phase attribute sets the requested delay and immediately
starts alignment against its selected reference channel. There is no separate
autoalign_enable attribute in this interface.
Run these commands in the device’s sysfs directory to request zero delay and read back the phase. Use the required delay in femtoseconds instead of zero when configuring another alignment target.
echo 0 > out_altvoltage0_SYSREF_0_phase
cat out_altvoltage0_SYSREF_0_phase
Channel Direction Control
What: out_altvoltageX_[<adi,extended-name>]_output_enable
Writing this attribute with 1 enables the BSYNC driver (output), writing it
with 0 enables the BSYNC receiver (input). Care must be taken to avoid that
both ends drive the signal.
root@analog:/sys/bus/iio/devices/iio:device0# echo 1 > out_altvoltage0_SYSREF_0_output_enable
Alignment Cycles Control
What: out_altvoltage_autoalign_iteration
Sets the actual number of alignment cycles, from 1 through 8. The attribute is shared by channel type, so its name omits the channel number and extended name. The driver converts this count to the hardware’s zero-based encoding.
Value |
Mode |
|---|---|
|
Run 1 alignment cycle |
|
Run 2 alignment cycles |
|
Run 3 alignment cycles |
|
Run 4 alignment cycles |
|
Run 5 alignment cycles |
|
Run 6 alignment cycles |
|
Run 7 alignment cycles |
|
Run 8 alignment cycles |
echo 8 > out_altvoltage_autoalign_iteration
Alignment Threshold Control
What: out_altvoltage_autoalign_threshold
The threshold alignment procedure repeats the alignment until either the
alignment becomes lower than a desired threshold or the alignment cycles reach
the maximum number of alignment cycles set with
out_altvoltage_autoalign_iteration. Values are in femtoseconds (fs).
echo 100 > out_altvoltage_autoalign_threshold
echo 1 > out_altvoltage_autoalign_threshold_en
Threshold checking has a separate enable; setting its value alone does not enable it.
Temperature Reading
What: in_temp0_input
The temperature measurement system contains a proportional to ambient temperature (PTAT) circuit, an ADC, and a code-to-temperature converter (CTC). Ideally, the PTAT circuit generates a voltage that varies linearly with the silicon die temperature in its vicinity. The CTC output, that is the temperature measurement, is expressed in °C. The purpose of the temperature measurement system is to measure changes in die temperature, not the absolute junction temperature.
This attribute returns this temperature in milli-degrees Celsius.
root@analog:/sys/bus/iio/devices/iio:device0# cat in_temp0_input
45000