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
university:tools:pluto:hacking:power_amp [10 Jul 2019 23:06] – [Test Results] Robin Getzuniversity:tools:pluto:hacking:power_amp [16 Jul 2019 20:15] (current) – [Test Results] Robin Getz
Line 23: Line 23:
 More information about the [[adi>AD9363]] can be found on the product page. More information about the [[adi>AD9363]] can be found on the product page.
  
-===== ADLM-PLUTO implementation =====+===== ADALM-PLUTO implementation =====
  
 ==== VDD_GPO ==== ==== VDD_GPO ====
  
-The power connected to the ''VDD_GPO'' pin is 1.3 V The output voltage on the ''GPO_[0:3]'' pins is expected to be ''VDD_GPO × 0.8'' (1.04 V) and ''VDD_GPO'' (1.30 V). With an output current of 10 mA (typical). If you connect regulators or switches, it may need to be level shifted to achieve the proper voltage control thresholds. +The power connected to the ''VDD_GPO'' pin is 1.3 V The output voltage on the ''GPO_[0:3]'' pins is expected to be ''VDD_GPO × 0.8'' (1.04 V) and ''VDD_GPO'' (1.30 V). With an output current of 10 mA (typical). The off resistance of the GPO pins is 15 Ω. The on resistance of the GPO pins is 32 Ω. If you connect regulators or switches, it may need to be level shifted/have the drive strength increased to achieve the proper voltage control thresholds.
  
-With the 1.3 V ''VDD_GPO'' net, it is known that the AUX_ADC and AUX_DAC will not be functional.+With the 1.3 V ''VDD_GPO'' net, it is known/understood that the AUX_ADC and AUX_DAC will not be functional.
  
 ==== Pinout ==== ==== Pinout ====
Line 41: Line 41:
 ==== Software ==== ==== Software ====
  
-There is a setup portion (if you are unsure of what these attributes do, check out the [[/resources/tools-software/linux-drivers/iio-transceiver/ad9361-customization|documentation]]: ((If you want to delay the assertion of these pins by ''n'' μs, that can be done with the ''gpo0_rx_delay_us'' or ''gpo0_tx_delay_us'' attributes (which we don't cover here)) +There is a setup portion (if you are unsure of what these attributes do, check out the [[/resources/tools-software/linux-drivers/iio-transceiver/ad9361-customization|documentation]]: ((If you want to delay the assertion of these pins by ''n'' μs, that can be done with the ''gpo0-rx-delay-us'' or ''gpo0-tx-delay-us'' attributes (which we don't cover here)) 
   - set up the part in TDD mode (''0'' is TDD mode, ''1'' is FDD mode):<code>iio_attr -a -D ad9361-phy adi,frequency-division-duplex-mode-enable 0</code>   - set up the part in TDD mode (''0'' is TDD mode, ''1'' is FDD mode):<code>iio_attr -a -D ad9361-phy adi,frequency-division-duplex-mode-enable 0</code>
-  - set up ''GPO_0'' to assert when in Tx mode<code>iio_attr -a -D ad9361-phy adi,gpo0_slave_tx_enable 1</code>+  - set up ''GPO_0'' to assert when in Tx mode<code>iio_attr -a -D ad9361-phy adi,gpo0-slave-tx-enable 1</code>
   - write the new configuration to the part <code>iio_attr -a -D ad9361-phy  initialize 1</code>   - write the new configuration to the part <code>iio_attr -a -D ad9361-phy  initialize 1</code>
  
Line 61: Line 61:
 ==== Test Results ==== ==== Test Results ====
  
-A small script on the Pluto will demonstrate:+A small script on the Pluto SDR (or host) will demonstrate:
  
 <xterm> <xterm>
 #!/bin/sh #!/bin/sh
  
 +# Setup : Put into TDD mode, and setup GPO0 and GPO1
 iio_attr -q -a -D ad9361-phy adi,frequency-division-duplex-mode-enable 0 iio_attr -q -a -D ad9361-phy adi,frequency-division-duplex-mode-enable 0
-iio_attr -a -D ad9361-phy adi,gpo0-slave-rx-enable 1 +iio_attr -q -a -D ad9361-phy adi,gpo0-slave-rx-enable 1 
-iio_attr -a -D ad9361-phy adi,gpo1-slave-tx-enable 1+iio_attr -q -a -D ad9361-phy adi,gpo1-slave-tx-enable 1
 iio_attr -q -a -D ad9361-phy  initialize 1 iio_attr -q -a -D ad9361-phy  initialize 1
  
 while [ 1 ] ; do while [ 1 ] ; do
-iio_attr -q -a -d ad9361-phy ensm_mode rx +  iio_attr -q -a -d ad9361-phy ensm_mode rx 
-iio_attr -q -a -d ad9361-phy ensm_mode tx+  # capture buffer 
 +  iio_attr -q -a -d ad9361-phy ensm_mode tx 
 +  # transmit buffer
 done done
 </xterm> </xterm>
Line 80: Line 83:
  
 {{ :university:tools:pluto:hacking:gpo_rx_tx.png?600 |}} {{ :university:tools:pluto:hacking:gpo_rx_tx.png?600 |}}
 +
 +<WRAP round help>While this shows the Rx/Tx switching in 30-35ms or so, this is based on **software** control over SPI, running in an interpreted bash shell. Doing things in a C application, would make things faster, and doing things via pin control (via a state machine in the FPGA) can make things sub ~30 μs between Rx and Tx swaps to handle slotted specifications like LTE. IF you need things to go faster - just ask.
 +</WRAP>
 +
 +OK, someone asked for the C code - it's pretty trivial, just longer. You will need to change the uri, and put in proper error checking.
 +
 +<code>
 +#include <stdio.h>
 +#include <iio.h>
 +#include <unistd.h>
 +#include <stdio.h>
 +#include <signal.h>
 +
 +
 +volatile sig_atomic_t stop = 0;
 +
 +void inthand(int signum) {
 +        stop = 1;
 +}
 +
 +int main(int argc, char **argv)
 +{
 +        struct iio_context *ctx;
 +        struct iio_device *dev;
 +        struct iio_channel *ch;
 +        const char* val_str;
 +        ssize_t ret = 0;
 +        char buf[256];
 +
 +        signal(SIGINT, inthand);
 +
 +        /* Create IIO Context */
 +        ctx = iio_create_context_from_uri("usb:1.3.5");
 +
 +        /* Find IIO device in current context */
 +        dev = iio_context_find_device(ctx, "ad9361-phy");
 +
 +        /* Write into the IIO debug attributes */
 +        iio_device_debug_attr_write_bool(dev, "adi,frequency-division-duplex-mode-enable", 0);
 +        iio_device_debug_attr_write_bool(dev, "adi,gpo0-slave-rx-enable", 1);
 +        iio_device_debug_attr_write_bool(dev, "adi,gpo1-slave-tx-enable", 1);
 +        iio_device_debug_attr_write_bool(dev, "initialize", 1);
 +        
 +        while (!stop) {
 +                ret++;
 +                iio_device_attr_write(dev, "ensm_mode", "rx");
 +                iio_device_attr_write(dev, "ensm_mode", "tx");
 +        }
 +        iio_context_destroy(ctx);
 +        printf("iteration = %li\n", ret);
 +        return EXIT_SUCCESS;
 +}
 +</code>
 +
 +Over USB, you get:<xterm>
 + time ./foo 
 +^Citteration = 2693
 +
 +real 0m5.283s
 +</xterm>
 +
 +or about 0.980876346 ms per Rx/Tx slot.
 +
 +^ Platform  ^ transport ^ Infrastructure  ^  Timing ^
 +| host | USB | shell | 80ms |
 +| host | USB | C code | 0.6 to 1.3 ms |
 +| pluto | local | shell | 30-35ms |
 +| pluto | local | C Code | 0.2 to 0.6 ms | 
 +
 +Again, these are representative numbers for software control, faster is possible with pin control.
 ===== Testing in IIO Oscilloscope ===== ===== Testing in IIO Oscilloscope =====
  
university/tools/pluto/hacking/power_amp.txt · Last modified: 16 Jul 2019 20:15 by Robin Getz