Wiki

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
resources:tools-software:linux-drivers:iio-adc:axi-adc-hdl [23 Feb 2017 12:34] – [Example platform device initialization] Update compatible list Lars-Peter Clausenresources:tools-software:linux-drivers:iio-adc:axi-adc-hdl [13 Jun 2022 13:11] (current) – [Driver testing] Michael Hennerich
Line 4: Line 4:
  
   * [[adi>AD6676]]   * [[adi>AD6676]]
 +  * [[adi>AD9208]]
   * [[adi>AD9234]]   * [[adi>AD9234]]
   * [[adi>AD9250]]   * [[adi>AD9250]]
Line 30: Line 31:
   * [[resources/eval/user-guides/ad-fmcomms5-ebz |AD-FMCOMMS5-EBZ FMC Card]]   * [[resources/eval/user-guides/ad-fmcomms5-ebz |AD-FMCOMMS5-EBZ FMC Card]]
   * [[resources/eval/user-guides/ad-fmcomms6-ebz|AD-FMCOMMS6-EBZ FMC Card]]   * [[resources/eval/user-guides/ad-fmcomms6-ebz|AD-FMCOMMS6-EBZ FMC Card]]
-  * [[resources/fpga/xilinx/fmc/ad-fmcjesdadc1-ebz| AD-FMCJESDADC1-EBZ FMC Card]] see also [[/resources/tools-software/linux-drivers/iio-adc/axi-jesd204b-hdl|AXI JESD204B Driver]]+  * [[resources/fpga/xilinx/fmc/ad-fmcjesdadc1-ebz| AD-FMCJESDADC1-EBZ FMC Card]] 
   * [[resources/eval/user-guides/ad-fmcadc2-ebz|AD-FMCADC2-EBZ FMC Card]]   * [[resources/eval/user-guides/ad-fmcadc2-ebz|AD-FMCADC2-EBZ FMC Card]]
   * [[resources/eval/user-guides/ad-fmcdaq2-ebz|AD-FMCDAQ2-EBZ FMC Card]]   * [[resources/eval/user-guides/ad-fmcdaq2-ebz|AD-FMCDAQ2-EBZ FMC Card]]
   * [[resources/fpga/xilinx/fmc/ad9467 |AD9467 Native FMC Card]]   * [[resources/fpga/xilinx/fmc/ad9467 |AD9467 Native FMC Card]]
   * [[resources/fpga/xilinx/interposer/ad9467 |AD9467 Evaluation Board, ADC-FMC Interposer]]   * [[resources/fpga/xilinx/interposer/ad9467 |AD9467 Evaluation Board, ADC-FMC Interposer]]
-  * [[resources/fpga/xilinx/interposer/ad9250 |AD9250 Evaluation Board, ADC-FMC Interposer]] see also [[/resources/tools-software/linux-drivers/iio-adc/axi-jesd204b-hdl|AXI JESD204B Driver]]+  * [[resources/fpga/xilinx/interposer/ad9250 |AD9250 Evaluation Board, ADC-FMC Interposer]]
   * [[resources/fpga/xilinx/fmc/ad9265|AD9265 Native FMC Card]]   * [[resources/fpga/xilinx/fmc/ad9265|AD9265 Native FMC Card]]
   * [[resources/eval/user-guides/mykonos | ADRV9371 FMC Card]]   * [[resources/eval/user-guides/mykonos | ADRV9371 FMC Card]]
  
 +===== Sub device Documentation (linked mode) =====
 +
 +  * [[resources:tools-software:linux-drivers:iio-adc:ad9208|AD9208 ADC Linux Driver]]
  
  
Line 44: Line 48:
 ===== Description ===== ===== Description =====
  
-The AXI ADC HDL driver is the driver for the HDL interface core which is used on various FPGA designs. The driver is implemented as an Linux IIO driver. It's register map can be found here: [[resources:fpga:docs:hdl:regmap|Base register  map (common to all cores)]]+The AXI ADC HDL driver is the driver for [[resources:fpga:docs:axi_adc_ip|Generic AXI ADC IP core]] which is used on various FPGA designs. The driver is implemented as an Linux IIO driver. It's register map can be found here: [[resources:fpga:docs:hdl:regmap|Base register  map (common to all cores)]] 
 + 
 +This driver is split into two parts. A control driver let’s call it SPI-ADC which configures the converter internal control registers, this part is typically instantiated via the SPI bus. 
 +(see:  [[linux.github>master?drivers/iio/adc/ad9467.c | ad9467.c]],  [[linux.github>master?drivers/iio/adc/ad9361_conv.c | ad9361_conv.c]] or [[linux.github>mykonos?drivers/iio/adc/ad9361_conv.c | ad9371_conv.c]]) 
 +Device probing for the data capture driver (AXI-ADC) which controls the AXI HDL core registers and the DMA, is delayed until the SPI control driver is fully probed. 
 +The device tree phandle "**spibus-connected**" is used to connect the capture driver with is SPI control driver. This split is required since the AXI-ADC and the SPI-ADC parts are instantiated via different busses. The AXI-ADC driver registers the IIO device, the SPI-ADC instance doesn’t. However a shared data structure (struct axiadc_converter) is used so that the methods local to the SPI-ADC driver can extend the IIO attributes provided the AXI-ADC driver. There is also a callback provided (post_setup) which calls a from the AXI-ADC into the AXI-SPI driver after the AXI-ADC is fully alive. This post setup callback is then typically used to finally configure the digital data path, test and tune the digital data interface etc. 
 + 
 +For the **AD9361** and **AD9371** family of transceivers, things are a bit more differentiated. In fact these devices have a separate IIO device for the radio control portion. 
 +We call them the PHY devices. ([[linux.github>master?drivers/iio/adc/ad9361.c | ad9361.c]] and [[linux.github>master?drivers/iio/adc/ad9371.c | ad9371.c]] )  The **PHY** drivers are intended to be independent from our AXI-ADC capture drivers and underlying HDL designs.  
 +Therefore things related to the AXI-ADC driver are located in the ad93X1_conv.c files.   
 + 
  
 ====== Source Code ====== ====== Source Code ======
Line 51: Line 66:
  
 ^  Source  ^  Mainlined?  ^ ^  Source  ^  Mainlined?  ^
-| [[linux.github>xcomm_zynq?drivers/iio/adc/cf_axi_adc_core.c | drivers/iio/adc/cf_axi_adc_core.c]] | [[git.linux.org>drivers/iio/adc/cf_axi_adc_core.c|WIP]] |+| [[linux.github>master?drivers/iio/adc/cf_axi_adc_core.c | drivers/iio/adc/cf_axi_adc_core.c]] | [[git.linux.org>drivers/iio/adc/cf_axi_adc_core.c|WIP]] |
  
 ===== Files ===== ===== Files =====
 ^ Function ^ File ^ ^ Function ^ File ^
-| driver  | [[linux.github>xcomm_zynq?drivers/iio/adc/ad9467.c | drivers/iio/adc/ad9467.c]] | +| driver  | [[linux.github>master?drivers/iio/adc/ad6676.c | drivers/iio/adc/ad6676.c]] | 
-| driver  | [[linux.github>xcomm_zynq?drivers/iio/adc/ad9361_conv.c | drivers/iio/adc/ad9361_conv.c]] | +| driver  | [[linux.github>master?drivers/iio/adc/ad9208.c | drivers/iio/adc/ad9208.c]] | 
-| driver  | [[linux.github>mykonos?drivers/iio/adc/ad9361_conv.c | drivers/iio/adc/ad9371_conv.c]] | +| driver  | [[linux.github>master?drivers/iio/adc/ad9467.c | drivers/iio/adc/ad9467.c]] | 
-| driver  | [[linux.github>xcomm_zynq?drivers/iio/adc/cf_axi_adc_core.c | drivers/iio/adc/cf_axi_adc_core.c]] | +| driver  | [[linux.github>master?drivers/iio/adc/ad9680.c | drivers/iio/adc/ad9680.c]] | 
-| driver  | [[linux.github>xcomm_zynq?drivers/iio/adc/cf_axi_adc_ring.c | drivers/iio/adc/cf_axi_adc_ring.c]] | +| driver  | [[linux.github>master?drivers/iio/adc/ad9361_conv.c | drivers/iio/adc/ad9361_conv.c]] | 
-| driver  | [[linux.github>xcomm_zynq?drivers/iio/adc/cf_axi_adc_ring_stream.c | drivers/iio/adc/cf_axi_adc_ring_stream.c]] | +| driver  | [[linux.github>master?drivers/iio/adc/ad9361_conv.c | drivers/iio/adc/ad9371_conv.c]] | 
-| include | [[linux.github>xcomm_zynq?drivers/iio/adc/cf_axi_adc.h | drivers/iio/adc/cf_axi_adc.h]] |+| driver  | [[linux.github>master?drivers/iio/adc/adrv9009_conv.c | drivers/iio/adc/adrv9009_conv.c]] | 
 +core driver  | [[linux.github>master?drivers/iio/adc/cf_axi_adc_core.c | drivers/iio/adc/cf_axi_adc_core.c]] | 
 +core driver  | [[linux.github>master?drivers/iio/adc/cf_axi_adc_ring_stream.c | drivers/iio/adc/cf_axi_adc_ring_stream.c]] | 
 +core include | [[linux.github>master?drivers/iio/adc/cf_axi_adc.h | drivers/iio/adc/cf_axi_adc.h]] |
  
  
Line 82: Line 100:
     * "adi,axi-ad6676-1.0"     * "adi,axi-ad6676-1.0"
     * "adi,axi-ad9684-1.0"     * "adi,axi-ad9684-1.0"
 +    * "adi,axi-ad9371-rx-1.0"
 +    * "adi,axi-ad9684-1.0"
 +    * "adi,axi-adrv9009-rx-1.0"
 +    * "adi,axi-ad9208-1.0"
     * For a complete list see driver source: static const struct of_device_id axiadc_of_match[]      * For a complete list see driver source: static const struct of_device_id axiadc_of_match[] 
  
Line 107: Line 129:
  
 &fpga_axi { &fpga_axi {
- rx_dma: rx-dmac@44A30000 {+ rx_dma: rx-dmac@44a30000 {
  compatible = "adi,axi-dmac-1.00.a";  compatible = "adi,axi-dmac-1.00.a";
  reg = <0x44A30000 0x10000>;  reg = <0x44A30000 0x10000>;
Line 114: Line 136:
  clocks = <&clkc 16>;  clocks = <&clkc 16>;
  
- dma-channel { + adi,channels { 
- adi,type = <0>;+ #size-cells = <0>; 
 + #address-cells = <1>; 
 + 
 + dma-channel@0 
 + reg = <0>; 
 + adi,source-bus-width = <16>; 
 + adi,source-bus-type = <2>; 
 + adi,destination-bus-width = <64>; 
 + adi,destination-bus-type = <0>
 + };
  };  };
  };  };
  
- cf_ad9467_core_0: cf-ad9467-core-lpc@44A00000 {+ cf_ad9467_core_0: cf-ad9467-core-lpc@44a00000 {
  compatible = "xlnx,cf-ad9467-core-1.00.a";  compatible = "xlnx,cf-ad9467-core-1.00.a";
  reg = <0x44A00000 0x10000>;  reg = <0x44A00000 0x10000>;
  dmas = <&rx_dma 0>;  dmas = <&rx_dma 0>;
  dma-names = "rx";  dma-names = "rx";
 +
  spibus-connected = <&adc_ad9467>;  spibus-connected = <&adc_ad9467>;
- } ; + }; 
-};+}; 
 </code> </code>
 ====== Enabling Linux driver support ====== ====== Enabling Linux driver support ======
Line 142: Line 174:
 "make qconfig") "make qconfig")
  
-<code>+ <code>
 Linux Kernel Configuration Linux Kernel Configuration
  Device Drivers  --->  Device Drivers  --->
Line 153: Line 185:
            *** Analog to digital converters ***            *** Analog to digital converters ***
      [--snip--]      [--snip--]
- +         -*Analog Devices High-Speed AXI ADC driver core              
- <*>   Analog Devices AD9467 AD9643 High-Speed AXI ADC driver +                <*> Analog Devices AD9208 and similar high speed ADCs          
 +                <*> Analog Devices AD9371 RF Transceiver driver                
 +                <*> Analog Devices ADRV9009/ADRV9008 RF Transceiver driver     
 +                <*> Analog Devices AD6676 Wideband IF Receiver driver          
 +                <*> Analog Devices AD9467 etc. high speed ADCs                 
 +                <*> Analog Devices AD9680 and similar high speed ADCs 
      [--snip--]      [--snip--]
 </code> </code>
Line 285: Line 321:
 </xterm></WRAP> </xterm></WRAP>
  
 +=== External Synchronization ===
  
-in_voltage0_test_mode:off+The [[resources:fpga:peripherals:jesd204:jesd204_tpl_adc|ADC TPL HDL]] core supports the [[resources:fpga:peripherals:jesd204:jesd204_tpl_adc#External_synchronization|EXT_SYNC]] feature, allowing to synchronize multiple channels within a ADC or across multiple instances. 
 +This feature can also synchronize between the [[resources:fpga:peripherals:jesd204:jesd204_tpl_adc|ADC TPL HDL]] and [[resources:fpga:peripherals:jesd204:jesd204_tpl_dac|DAC TPL HDL]] core.  
 + 
 +There are two device attributes which allows controlling this feature: 
 +''sync_start_enable'' and ''sync_start_enable_available'' reading the 
 +later returns the available modes which depend on HDL core synthesis 
 +parameters. The options are explained below. Reading 'sync_start_enable' 
 +returns either 'arm' while waiting for the external synchronization 
 +signal or 'disarm' otherwise. 
 + 
 +  * ''arm'': Setting this key will arm the trigger mechanism sensitive to an external sync signal. Once the external sync signal goes high it synchronizes channels within a ADC, and across multiple instances. This key has an effect only the EXT_SYNC synthesis parameter is set.  
 + 
 +  * ''disarm'': Setting this key will disarm the trigger mechanism sensitive to an external sync signal. This key has an effect only the EXT_SYNC synthesis parameter is set. 
 + 
 +  * ''trigger_manual'': Setting this key will issue an external sync event if it is hooked up inside the fabric. This key has an effect only the EXT_SYNC synthesis parameter is set. 
 +         
 +== Example: == 
 + 
 +<WRAP box bggreen><wrap info>This specifies any shell prompt running on the target</wrap> 
 +<xterm> 
 +root@analog:/sys/bus/iio/devices/iio:device3# **cat sync_start_enable_available**                                                                                                                        
 +**arm disarm trigger_manual** 
 +root@analog:/sys/bus/iio/devices/iio:device3# **cat sync_start_enable** 
 +**disarm** 
 +root@analog:/sys/bus/iio/devices/iio:device3# **echo arm > sync_start_enable**                                                                                                                                  
 +root@analog:/sys/bus/iio/devices/iio:device3# **cat sync_start_enable** 
 +**arm** 
 +root@analog:/sys/bus/iio/devices/iio:device3# **echo trigger_manual > sync_start_enable**                                                                                                                       
 +root@analog:/sys/bus/iio/devices/iio:device3# **cat sync_start_enable** 
 +**disarm** 
 +</xterm></WRAP>
 ===== Buffer management ===== ===== Buffer management =====
  
resources/tools-software/linux-drivers/iio-adc/axi-adc-hdl.1487849680.txt.gz · Last modified: 23 Feb 2017 12:34 by Lars-Peter Clausen