aboutsummaryrefslogtreecommitdiffstats
path: root/host/docs/usrp_e3xx.dox
diff options
context:
space:
mode:
Diffstat (limited to 'host/docs/usrp_e3xx.dox')
-rw-r--r--host/docs/usrp_e3xx.dox1287
1 files changed, 1287 insertions, 0 deletions
diff --git a/host/docs/usrp_e3xx.dox b/host/docs/usrp_e3xx.dox
new file mode 100644
index 000000000..9382388a3
--- /dev/null
+++ b/host/docs/usrp_e3xx.dox
@@ -0,0 +1,1287 @@
+/*! \page page_usrp_e3xx USRP E3xx Series
+
+\tableofcontents
+
+\section e3xx_feature_list Comparative features list
+There are two category of devices in the E3xx series.
+1. E310 series which includes E310, E312 and E313.
+2. E320 - OEM board-only and with enclosure.
+
+These devices have some differences in their hardware capabilities but both
+are 2-channel transmitter/receiver based on the AD9361 transceiver IC and
+provide two RF channels:
+
+- TX band: 47 MHz to 6.0 GHz
+- RX band: 70 MHz to 6.0 GHz
+- 56 MHz of instantaneous bandwidth
+- 2 RX DDC chains in FPGA
+- 2 TX DUC chain in FPGA
+
+\subsection e3xx_feature_list_e310 E310
+The E310/E312/E313 has a motherboard and a daughterboard in an enclosed module
+with one AD9361 IC with 2 RF channels.
+
+- Hardware Capabilities:
+ - External PPS reference input
+ - 2 USB 2.0 Host ports
+ - Configurable clock rate
+ - Internal IMU
+ - Internal GPS
+ - Internal GPIO connector with UHD API control
+ - External USB Connection for built-in JTAG debugger and serial console
+ - Xilinx Zynq SoC with dual-core ARM Cortex A9 (Speed Grade 1 and 3) and
+ Kintex-7 FPGA (XC7Z020)
+- Software Capabilities:
+ - Full Linux system running on the ARM core
+ - Runs MPM (see also \ref page_mpm) (introduced in UHD v3.15.0.0)
+- FPGA Capabilities:
+ - RFNoC capability
+
+\subsection e3xx_feature_list_e320 E320
+The E320 is monolithic board with one AD9361 IC with 2 RF channels.
+
+- Hardware Capabilities:
+ - Single SFP+ Transceivers (can be used with 1 GigE, 10 GigE, and Aurora)
+ - External PPS input
+ - External 10 MHz input
+ - Configurable clock rate
+ - Internal IMU
+ - Internal GPSDO for timing, location, and 10 MHz reference clock + PPS
+ - External GPIO Connector with UHD API control
+ - External USB Connection for built-in JTAG debugger and serial console
+ - Xilinx Zynq SoC with dual-core ARM Cortex A9 (Speedgrade 3) and
+ Kintex-7 FPGA (XC7Z045)
+ - Fan connector (for board-only version)
+- Software Capabilities:
+ - Full Linux system running on the ARM core
+ - Runs MPM (see also \ref page_mpm)
+- FPGA Capabilities:
+ - RFNoC capability
+
+\section e310_overview E310 Overview
+
+\subsection e310_zynq The Zynq CPU/FPGA and host operating system
+
+The main CPU of the E310 is a Xilinx Zynq SoC XC7Z020. It
+is both a dual-core ARM Cortex A9 CPU and Kintex-7 FPGA on a single die. The
+CPU is clocked at 667 MHz (speed grade 1) and 866 MHz (speed grade 3).
+
+The programmable logic (PL, or FPGA) section of the SoC is responsible for
+handling all sampling data, DMA connections, and any other
+high-speed utility such as custom RFNoC logic. The processing system (PS, or CPU)
+is running a custom-build OpenEmbedded-based Linux operating system. The OS is
+responsible for all the device and peripheral management, such as running MPM
+(see section \ref page_mpm), running local, UHD sessions, etc.
+
+\subsection e31x_migration E310 Migration Guide to MPM architecture
+
+This section covers the details for porting your E310 to the new MPM architecture.
+MPM is a hardware daemon running on the Linux operating system on the ARM cores
+and responsible for the device to function as a USRP.
+
+A large portion of hardware-specific setup is handled by the daemon.
+
+Note that the SD cards shipped with E310s do not contain the latest filesystem images. In order
+to use MPM (see section \ref page_mpm) and all its features, the SD cards need to be
+manually flashed. Refer to \ref update_sdcard in order to upgrade to E310 with UHD v3.15.0.0 or above.
+
+After updating the SD card, you should be able to connect your device to the host OS either via SSH or
+serial console. See sections \ref e3xx_getting_started_ssh and \ref e3xx_getting_started_serial
+respectively, for more details.
+
+Once you are logged in on the device, you should be able to run uhd_usrp_probe or other UHD examples.
+
+Here is a list of a changes with the latest E310 filesystem (UHD v3.15.0.0) that can affect customer usage
+and applications:
+
+1. Hostname:
+The hostname for the devices have changed from ni-e3xx(-sg3) to ni-e31x-<serial>.
+This makes it easier to identify devices. You can change the hostname by modifying the
+`/etc/hostname` file and rebooting.
+
+2. "product" name:
+The "product" name for E310 is now "e310_<speedgrade>" i.e. e310_sg1 and e310_sg3 for speed grade 1
+and 3 respectively. Note that the "type" for e310 remains the same as before i.e. "e3xx".
+
+3. FPGA bit/bin/rpt file name and image target:
+ FPGA type | Old filename | New filename
+ -----------------------------------|-----------------------------|---------------------------------
+ IDLE Image (power saving mode) SG1 | usrp_e3xx_fpga_idle.bit | usrp_e310_sg1_idle_fpga.bit
+ IDLE Image (power saving mode) SG3 | usrp_e3xx_fpga_idle_sg3.bit | usrp_e310_sg3_idle_fpga.bit
+ NORMAL Image SG1 | usrp_e310_fpga.bit | usrp_e310_sg1_fpga.bit
+ NORMAL Image SG3 | usrp_e310_fpga_sg3.bit | usrp_e310_sg3_fpga.bit
+
+ The names of the FPGA build targets have been modified but the old FPGA targets would continue to
+ work as before. The generated bit files names in the build directory will be new as
+ mentioned above.
+ - E310_<speedgrade> for default image
+ - E310_<speedgrade>_RFNOC for RFNOC image (contains a few blocks)
+ - E310_<speedgrade>_IDLE to build idle image (Doesn't need to modified for most cases)
+
+4. Loading FPGA image:
+The device arg "fpga=" can now only be used in the uhd_image_loader; it can no longer be used to
+update the fpga image in other UHD applications. This tooling now matches X310, E320, N3XX, etc.
+devices. See section \ref e3xx_getting_started_fpga_update for details.
+
+5. With UHD v3.15.0.0. or higher, a lot of UHD dependencies have been upgraded too e.g. Boost, CMake,
+etc. The filesystem now runs a newer Linux kernel (e.g. linux-yocto_4.15 or higher). Existing customer
+applications might need to be updated in order to use the new filesystem and new UHD.
+
+6. In order to build a custom filesystem, refer to \ref e3xx_fsbuild for more details.
+
+7. E310 filesystem no longer contains GNURadio by default. Custom filesystems are need to run GNURadio.
+
+8. The network mode (streaming through RJ-45) for the E310 is not supported. In order to use the network
+mode use UHD 3.9 LTS release.
+
+9. Refer section \ref e312_battery for changes related to the battery.
+
+10. Subdev spec has been changed from "A:A and A:B" to "A:0 and A:1" to match X310, N3xx and E320.
+
+
+\section e320_overview E320 Overview
+
+\subsection e320_zynq The Zynq CPU/FPGA and host operating system
+
+The main CPU of the E320 is a Xilinx Zynq SoC XC7Z045. It
+is both a dual-core ARM Cortex A9 CPU and Kintex-7 FPGA on a single die. The
+CPU is clocked at 1GHz (speed grade 3).
+
+The programmable logic (PL, or FPGA) section of the SoC is responsible for
+handling all sampling data, the 1/10 GigE network connections, and any other
+high-speed utility such as custom RFNoC logic. The processing system (PS, or CPU)
+is running a custom-build OpenEmbedded-based Linux operating system. The OS is
+responsible for all the device and peripheral management, such as running MPM
+(see section \ref page_mpm), configuring the network interfaces, running local
+UHD sessions, etc.
+
+It is possible to connect to the host OS either via SSH or serial console (see
+sections \ref e3xx_getting_started_ssh and \ref e3xx_getting_started_serial,
+respectively).
+
+\subsection e320_micro The STM32 microcontroller
+
+The STM32 microcontroller controls various low-level features of the E320 series
+motherboard: It controls the power sequencing, reads out fan speeds and some of
+the temperature sensors. It is connected to the Zynq via an I2C bus.
+
+It is possible to log into the STM32 using the serial interface
+(see \ref e320_getting_started_serial_micro). This will allow certain low-level
+controls, such as remote power cycling should the CPU have become unresponsive
+for whatever reason.
+
+\subsection e3xx_sdcard The SD card
+
+The E310/E312/E313/E320 use a micro SD card as its main storage. The entire root file
+system (Linux kernel, libraries) and any user data are stored on this SD card.
+
+The SD card is partitioned into four partitions:
+
+- Boot partition (contains the bootloader). This partition usually does not
+ require any modifications.
+- A data partition, mounted in /data. This is the only partition that is not
+ erased during file system updates.
+- Two identical system partitions (root file systems). These contain the
+ operating system and the home directory (anything mounted under / that is not
+ the data or boot partition). The reason there are two of these is to enable
+ remote updates: An update running on one partition can update the other one
+ without any effect to the currently running system. Note that the system
+ partitions are erased during updates and are thus unsuitable for permanently
+ storing information.
+
+Note: It is possible to access the currently inactive root file system by
+mounting it. After logging into the device using serial console or SSH (see the
+following two sections), run the following commands:
+
+ $ mkdir temp
+ $ mount /dev/mmcblk0p3 temp
+ $ ls temp # You are now accessing the idle partition:
+ bin data etc lib media proc sbin tmp usr
+ boot dev home lost+found mnt run sys uboot var
+
+The device node in the mount command will likely differ, depending on which
+partition is currently already mounted.
+
+\section e3xx_getting_started Getting started
+
+This will run you through the first steps relevant to getting your USRP E3XX
+up and running.
+Note: This guide was creating on an Ubuntu machine, and other distributions
+or OS's may have different names/methods.
+
+\subsection e3xx_getting_started_assembling Assembling the E3XX
+
+Unlike the X300 or N200 series, there is no assembly required for all E3xx devices
+as E310 motherboard and daughterboard comes in an enclosure and E320, on the other
+hand is a monolithic board (in board-only version) or comes in an enclosure.
+
+Checklist:
+- Connect power and network
+- Read security settings
+- Connect clocking (if required)
+
+\subsection e3xx_getting_started_fs_update Updating the file system
+
+\subsubsection e31x_fs E310/E312/E313 file system
+
+The SD cards shipped with E310s do not contain the latest filesystem images. In order
+to use MPM and all its features, the SD cards need to be manually flashed. Refer to
+\ref update_sdcard in order to upgrade to E310 with UHD v3.15.0.0 or above. Once it has
+been upgraded to the new filesystem, Mender can be used to remotely update the filesystems.
+For details on using Mender, see Section \ref e3xx_rasm_mender.
+
+\subsubsection e320_fs E320 file system
+
+Before doing any major work with a newly acquired USRP E320, it is
+recommended to update the file system. For the OEM/Board-only version of
+E320, the SD card is physically accessible and filesystem update can be
+accomplished directly by using Mender or externally by manually writing
+an image onto a micro SD card and inserting it. For the
+enclosure version of E320, Mender update is required as there is no direct
+physical access to the device. For details on using Mender,
+see Section \ref e3xx_rasm_mender .
+
+\subsubsection update_sdcard Updating the SD card
+
+Manual updating is simply loading an image on the micro SD card. The first step
+in that process is to obtain an image.
+
+To obtain the default micro SD card image for a specific version of UHD, install
+that version of UHD (E320 - 3.13.0.2 or later, E310 - 3.15.0.0 or later) on a host system with Internet access and run:
+
+ $ uhd_images_downloader -t <e310/e320> -t sdimg
+
+ The image will be downloaded to
+ `<UHD_INSTALL_DIR>/share/uhd/images/usrp_<e310/e320>_fs.sdimg`,
+ where `<UHD_INSTALL_DIR>` is the UHD installation directory.
+
+To load an image onto the micro SD card, connect the card to the host and run:
+
+ $ sudo dd if=<YOUR_IMAGE> of=/dev/<YOUR_SD_CARD> bs=1M
+
+ The `<YOUR_IMAGE>` is the path to the micro SD card image
+ (i.e.`<UHD_INSTALL_DIR>/share/uhd/images/usrp_<e310/e320>_fs.sdimg`).
+
+ The `<YOUR_SD_CARD>` device node depends on your operating system and which
+ other devices are plugged in. Typical values are `sdb` or `mmcblk0`.<br>
+
+ CAUTION: The Linux utility `dd` or `bmap` can cause unrecoverable data loss
+ if the incorrect disk is selected, or if the parameters are input incorrectly.
+ Ensure you have selected the correct input and output parameters for your
+ system configuration.
+
+The micro SD card used can be the original SD card shipped with the device or
+another one that is at least 8GB for E310 and at least 16 GB for E320 in size.
+
+\section e3xx_fsbuild Building custom filesystems and SD card images
+
+Ettus Research provides SD card images at regular intervals, but there can be
+good reasons to build custom SD cards, e.g., to test the very latest UHD or MPM
+for which there has not been an SD card release, to add own applications to the
+SD card, or to run a modified version of UHD.
+
+Note that building SD cards is very disk space and RAM intensive.
+
+\subsection e3xx_fsbuild_docker Using Docker to build filesystems
+
+Ettus Research provides a Docker containers to facilitate building filesystems.
+Refer to the <a href="https://github.com/EttusResearch/ettus-docker/blob/master/oe-build/README.md"> README </a> for more details.
+
+\subsection e3xx_getting_started_serial Serial connection
+
+It is possible to gain root access to the device using a serial terminal
+emulator. Most Linux, OSX, or other Unix flavours have a tool called 'screen'
+which can be used for this purpose, by running the following command:
+
+ $ sudo screen /dev/ttyUSB2 115200
+
+In this command, we prepend 'sudo' to elevate user privileges (by default,
+accessing serial ports is not available to regular users), we specify the
+device node (in this case, `/dev/ttyUSB2`), and the baud rate (115200).
+
+The exact device node depends on your operating system's driver and other USB
+devices that might be already connected. Modern Linux systems offer alternatives
+to simply trying device nodes; instead, the OS might have a directory of
+symlinks under `/dev/serial/by-id`:
+
+For E310:
+
+ $ ls /dev/serial/by-id
+ /dev/serial/by-id/usb-FTDI_FT230X_Basic_UART_DQ0041HO-if00-port0
+
+For E320:
+
+ $ ls /dev/serial/by-id
+ /dev/serial/by-id/usb-FTDI_Dual_RS232-HS-if00-port0
+ /dev/serial/by-id/usb-FTDI_Dual_RS232-HS-if01-port0
+ /dev/serial/by-id/usb-Silicon_Labs_CP2105_Dual_USB_to_UART_Bridge_Controller_007F6A6C-if00-port0
+ /dev/serial/by-id/usb-Silicon_Labs_CP2105_Dual_USB_to_UART_Bridge_Controller_007F6A6C-if01-port0
+
+Note: Exact names depend on the host operating system version and may differ.
+
+Every E310 device connected to USB will by default show up as one
+device. The device labeled "FTDI_FT230X_Basic_UART_DQ0041HO" connects
+to Linux.
+
+Every E320 device connected to USB will by default show up as four
+different devices. The devices labeled "USB_to_UART_Bridge_Controller" are the
+devices that offer a serial prompt. The one with the `if01` suffix connects
+to Linux, whereas the one with `if00` suffix connects to the STM32 microcontroller.
+If you have multiple E320 devices connected, you may have to try out multiple
+devices. In this case, to use this symlink instead of the raw device node
+address, modify the command above to:
+
+For E310:
+
+ $ sudo screen /dev/serial/by-id/usb-FTDI_FT230X_Basic_UART_DQ0041HO-if00-port0 115200
+
+For E320:
+
+ $ sudo screen /dev/usb-Silicon_Labs_CP2105_Dual_USB_to_UART_Bridge_Controller_007F6A6C-if01-port0 115200
+
+You should be presented with a shell prompt similar to the following:
+
+ root@ni-<e31x/e320>-<serial>:~#
+
+On this prompt, you can enter any Linux command available. Using the default
+configuration, the serial console will also show all kernel log messages (unlike
+when using SSH, for example), and give access to the boot loader (U-boot
+prompt). This can be used to debug kernel or bootloader issues more efficiently
+than when logged in via SSH.
+
+\subsubsection e320_getting_started_serial_micro Connecting to the microcontroller
+
+The STM32 microcontroller (which controls the power sequencing, among other
+things) also has a serial console available. To connect to the microcontroller,
+use the other UART device. In the example above:
+
+ $ sudo screen /dev/usb-Silicon_Labs_CP2105_Dual_USB_to_UART_Bridge_Controller_007F6CB5-if00-port0 115200
+
+It provides a very simple prompt. The command 'help' will list all available
+commands. A direct connection to the microcontroller can be used to hard-reset
+the device without physically accessing it (i.e., emulating a power button press)
+and other low-level diagnostics.
+
+\subsection e3xx_getting_started_ssh SSH connection
+
+The USRP E310 devices have just one network connection: RJ-45 connector while the
+USRP E320 has two network connections: One SFP port, and an RJ-45 connector.
+
+The RJ-45 connection is by default configured by DHCP; by plugging it into a 1 Gigabit
+switch on a DHCP-capable network, it will get assigned an IP address and thus be
+accessible via ssh.
+
+In case your network setup does not include a DHCP server, refer to the section
+\ref e3xx_getting_started_serial. A serial login can be used to assign an IP address manually.
+
+After the device obtained an IP address you can log in from a Linux or OSX
+machine by typing:
+
+ $ ssh root@ni-<e31x/e320>-<serial> # Replace with your actual device name!
+
+Depending on your network setup, using a `.local` domain may work:
+
+ $ ssh root@ni-<e31x/e320>-<serial>.local
+
+Of course, you can also connect to the IP address directly if you know it (or
+set it manually using the serial console).
+
+Note: The device's hostname is derived from its serial number by default
+(`ni-<e31x/e320>-<SERIAL>`). You can change the hostname by modifying the `/etc/hostname`
+file and rebooting.
+
+On Microsoft Windows, the connection can be established using a tool such as
+Putty, by selecting a username of root without password.
+
+Like with the serial console, you should be presented with a prompt like the
+following:
+
+ root@ni-<e31x/e320>-<serial>:~#
+
+\subsection e3xx_getting_started_connectivity Network Connectivity
+
+The RJ45 port (eth0) comes up with a default configuration of DHCP,
+that will request a network address from your DHCP server (if available on your
+network).
+
+The factory settings are as follows:
+
+ eth0 (DHCP):
+
+ [Match]
+ Name=eth0
+
+ [Network]
+ DHCP=v4
+
+ [DHCPv4]
+ UseHostname=false
+
+E320 has an extra SFP+ (sfp0) port which is configured with static address 192.168.10.2/24.
+The configuration for the sfp0 port is stored in /etc/systemd/networkd/sfp0.network.
+
+For configuration please refer to the
+<a href=https://www.freedesktop.org/software/systemd/man/systemd.network.html>systemd-networkd manual pages</a>
+
+The factory settings are as follows:
+
+ sfp0 (static):
+
+ [Match]
+ Name=sfp0
+
+ [Network]
+ Address=192.168.10.2/24
+
+ [Link]
+ MTUBytes=8000
+
+Note: Care needs to be taken when editing these files on the device, since
+vi / vim sometimes generates undo files (e.g. /etc/systemd/networkd/sfp0.network~),
+that systemd-networkd might accidentally pick up.
+
+Note: Temporarily setting the IP addresses via ifconfig etc will only change the
+value until the next reboot or reload of the FPGA image.
+
+\subsection e3xx_getting_started_security Security-related settings
+
+The E320 ships without a root password set. It is possible to ssh into the
+device by simply connecting as root, and thus gaining access to all subsystems.
+To set a password, run the command
+
+ $ passwd
+
+on the device.
+
+\subsection e3xx_getting_started_fpga_update Updating the FPGA
+
+Updating the FPGA follows the same procedure as other USRPs. Use the `uhd_image_loader`
+command line utility to upload a new FPGA image onto the device. The command can be run
+on the host to load the image via RJ-45 network connection or it can be run on the
+device.
+
+A common reason to update the FPGA image is in the case of a UHD/FPGA compat
+number mismatch (for example, if UHD has been updated, and now expects a newer
+version of the FPGA than is on the device). In this case, simply run
+
+ $ uhd_images_downloader
+
+to update the local cache of FPGA images. Then, run
+
+ $ uhd_image_loader --args type=e3xx,addr=ni-<e31x/e320>-<serial>
+
+to update the FPGA using the default settings. Replace the addr above with the
+correct device address. If a custom FPGA image is targeted for uploading, use the
+`--fpga-path` command line argument. Run
+
+ $ uhd_image_loader --help
+
+to see a full list of command line options. Note that updating the FPGA image
+will force a reload of the FPGA, and in case of E320 it will temporarily take down
+the SFP network interfaces (and temporary settings, such as applied via `ifconfig`
+on the command line, will be lost).
+
+
+\section e3xx_usage Using an E3XX USRP from UHD
+
+Like any other USRP, all E series USRPs are controlled by the UHD software. To
+integrate a USRP E310/E312/E313/E320 into your C++ application, you would generate a UHD
+device in the same way you would for any other USRP:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}
+auto usrp = uhd::usrp::multi_usrp::make("type=e3xx");
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For a list of which arguments can be passed into make(), see Section
+\ref e3xx_usage_device_args.
+
+\subsection e3xx_usage_device_args Device arguments
+
+ Key | Description | Example Value
+---------------------|-------------------------------------------------------------------------------|---------------------
+ addr | IPv4 address of primary SFP+/RJ-45 port to connect to | addr=192.168.30.2
+ find_all | When using broadcast, find all devices, even if unreachable via CHDR. | find_all=1
+ master_clock_rate | Master Clock Rate in Hz. Default is 16 MHz. | master_clock_rate=30.72e6
+ skip_dram | Ignore DRAM FIFO block. Connect TX streamers straight into DUC or radio. | skip_dram=1
+ skip_ddc | Ignore DDC block. Connect Rx streamers straight into radio. | skip_ddc=1
+ skip_duc | Ignore DUC block. Connect Tx streamers or DRAM straight into radio. | skip_duc=1
+ skip_init | Skip the initialization process for the device. | skip_init=1
+ discovery_port | Override default value for MPM discovery port. | discovery_port=49700
+ rpc_port | Override default value for MPM RPC port. | rpc_port=49701
+
+\subsection e3xx_usage_sensors The sensor API
+
+\subsubsection e310_sensors E31X Sensors
+
+Like other USRPs, the E310 series has RF and motherboard sensors.
+When using uhd::usrp::multi_usrp, the following API calls are relevant to
+interact with the sensor API:
+
+- uhd::usrp::multi_usrp::get_mboard_sensor_names()
+- uhd::usrp::multi_usrp::get_mboard_sensor()
+- uhd::usrp::multi_usrp::get_tx_sensor_names()
+- uhd::usrp::multi_usrp::get_rx_sensor_names()
+- uhd::usrp::multi_usrp::get_tx_sensor()
+- uhd::usrp::multi_usrp::get_rx_sensor()
+
+The following motherboard sensors are always available:
+- `temp_fpga`: temperature (in Celsius) of the FPGA die
+- `temp_mb`: temperature (in Celsius) of the motherboard
+- `ref_locked`: This will check that all the daughter boards have locked to the
+reference clock.
+
+\subsubsection e320_sensors E320 Sensors
+
+Like other USRPs, the E320 series has RF and motherboard sensors.
+When using uhd::usrp::multi_usrp, the following API calls are relevant to
+interact with the sensor API:
+
+- uhd::usrp::multi_usrp::get_mboard_sensor_names()
+- uhd::usrp::multi_usrp::get_mboard_sensor()
+- uhd::usrp::multi_usrp::get_tx_sensor_names()
+- uhd::usrp::multi_usrp::get_rx_sensor_names()
+- uhd::usrp::multi_usrp::get_tx_sensor()
+- uhd::usrp::multi_usrp::get_rx_sensor()
+
+The following motherboard sensors are always available:
+- `temp_internal`: temperature (in Celsius) of Temperature Sensor on board
+- `temp_fpga`: temperature (in Celsius) of the FPGA die
+- `temp_rf_channelA`: temperature (in Celsius) near power amplifier RF A
+- `temp_rf_channelB`: temperature (in Celsius) near power amplifier RF B
+- `temp_main_power`: temperature (in Celsius) near power supply
+- `gps_locked`: GPS lock
+- `gps_time`: GPS time in seconds sin ce the epch
+- `gps_tpv`: A TPV report from GPSd serialized as JSON
+- `gps_sky`: A SKY report from GPSd serialized as JSON
+- `ref_locked`: This will check that all the daughter boards have locked to the
+external/internal reference clock.
+- `fan`: get fan speed (in rpm)
+
+\section e3xx_rasm Remote Management
+
+\subsection e3xx_rasm_mender Mender: Remote update capability
+
+Mender is a third-party software that enables remote updating of the root
+file system without physically accessing the device (see also the
+[Mender website](https://mender.io)). Mender can be executed locally on the
+device, or a Mender server can be set up which can be used to remotely update
+an arbitrary number of USRP devices. Mender servers can be self-hosted, or
+hosted by Mender (see [mender.io](https://mender.io) for pricing and
+availability).
+
+When updating the file system using Mender, the tool will overwrite the root file
+system partition that is not currently mounted (note: every SD card comes with
+two separate root file system partitions, only one is ever used at a single
+time). Any data stored on that partition will be permanently lost. After
+updating that partition, it will reboot into the newly updated partition. Only
+if the update is confirmed by the user, the update will be made permanent. This
+means that if an update fails, the device will be always able to reboot into the
+partition from which the update was originally launched (which presumably is in
+a working state). Another update can be launched now to correct the previous,
+failed update, until it works.
+See also Section \ref e3xx_sdcard.
+
+Note: For E310, the SD cards that are shipped with the device do not have the latest
+UHD and do not support MPM by default. The SD cards will have to be flashed with
+UHD v3.15.0.0 or above to be able to use mender. After the first upgrade, mender
+can be used for future upgrades. Refer to the migration guide. \ref e31x_migration
+
+To initiate an update from the device itself, download a Mender artifact
+containing the update itself. These are files with a `.mender` suffix.
+
+Then run mender on the command line:
+
+ $ mender -rootfs /path/to/latest.mender
+
+The artifact can also be stored on a remote server:
+
+ $ mender -rootfs http://server.name/path/to/latest.mender
+
+This procedure will take a while. After mender has logged a successful update,
+reboot the device:
+
+ $ reboot
+
+If the reboot worked, and the device seems functional, commit the changes so
+the boot loader knows to permanently boot into this partition:
+
+ $ mender -commit
+
+To identify the currently installed Mender artifact from the command line, the
+following file can be queried:
+
+ $ cat /etc/mender/artifact_info
+
+If you are running a hosted server, the updates can be initiated from a web
+dashboard. From there, you can start the updates without having to log into the
+device, and can update groups of USRPs with a few clicks in a web GUI. The
+dashboard can also be used to inspect the state of USRPs. This is simple way to
+update groups of rack-mounted USRPs with custom file systems.
+
+\subsection e3xx_rasm_salt Salt: Remote configuration management and execution
+
+Salt (also known as SaltStack, see [Salt Website](https://saltstack.com)) is a
+Python-based tool for maintaining fleets of remote devices. It can be used to
+manage USRP E31X/E320 remotely for all types of settings that are not
+controlled by UHD. For example, if an operator would like to reset the root
+password on multiple devices, or install custom software, this tool might be a
+suitable choice.
+
+Salt is a third-party project with its [own documentation](https://docs.saltstack.com/en/latest/),
+which should be consulted for configuring it. However, the Salt minion is
+installed by default on every E31X/E320 device. To start it, simply log on to the
+device and run:
+
+ $ systemctl start salt-minion
+
+To permanently enable it at every boot, run (this won't by itself launch the
+salt-minion):
+
+ $ systemctl enable salt-minion
+
+To make use of Salt, both the device needs to be configured (the "minion") and,
+typically, a server to act as the Salt master. Refer to the Salt documentation
+on how to configure the minion and the master. A typical sequence to get started
+will look like this:
+
+1. Install the salt-master package on the server (e.g. by running `apt install salt-master`
+ if the server is an Ubuntu system), and make sure the Salt master is running.
+2. Add the network address / hostname of that server to the `/etc/salt/minion`
+ file on the device by editing the `master:` line.
+3. Launch the Salt minion on the USRP by running the command `systemctl start salt-minion`.
+4. The minion will try to connect to the master. You need to authorize the
+ minion by running `salt-key -a $hostname` where `$hostname` is the name of
+ the minion.
+5. Once the device is authorized, you can try various commands to see if the
+ communication was established:
+
+\code{.sh}
+ $ [sudo] salt '*' test.ping
+ ni-e3xx-$serial:
+ True
+ $ [sudo] salt '*' network.interfaces
+ ni-e3xx-$serial:
+ ----------
+ eth0:
+ ----------
+ hwaddr:
+ 02:00:03:11:fe:00
+ inet:
+ |_
+ ----------
+ address:
+ xx.xx.xx.xx
+ broadcast:
+ xx.xx.xx.xx
+ label:
+ eth0
+ netmask:
+ 255.255.254.0
+ up:
+ True
+ # [...]
+\endcode
+
+\section e3xx_theory_of_ops Theory of Operation
+
+All E series devices are on the MPM architecture (see also: \ref page_mpm).
+Inside the Linux operating system running on the ARM
+cores, there is a hardware daemon which needs to be active in order for the
+device to function as a USRP (it is enabled to run by default).
+
+A large portion of hardware-specific setup is handled by the daemon.
+
+\section e3xx_software_dev Modifying and compiling UHD and MPM for the E320
+
+E320 devices ship with all relevant software installed on the SD card. Updating
+UHD and/or MPM on the SD card is typically easiest done by updating the
+filesystem image (see Section \ref e3xx_rasm_mender). However, it is certainly
+possible to compile UHD and MPM by hand, e.g., in order to modify and try out
+changes without having to build entire filesystems in between. At Ettus R&D,
+this mode of operation is often used for rapid iteration cycles.
+
+While on E310 the SD cards that are shipped with the device do not have the latest
+UHD and do not support MPM by default. The SD cards will have to be flashed with
+UHD v3.15.0.0 or above to be able to use mender. After the first upgrade, mender
+can be used for future upgrades. Refer to the migration guide. \ref e31x_migration
+
+\subsection e3xx_software_dev_mpm_native Compiling MPM natively
+
+In general, compiling natively is not a recommended way of compiling code for
+the ARM processors. However, in the case of MPM, the amount of C++ code that
+needs to be compiled is very little, and a full compile of MPM will take a few
+minutes even on the device. First, you need to get a copy of the MPM source code
+onto your device. If you have an internet connection, you can use git to pull
+it directly from the Ettus repository (all commands are run on the device
+itself, inside the home directory):
+
+ $ git clone https://github.com/EttusResearch/uhd.git
+
+You can also SSHFS it from another computer:
+
+ $ mkdir uhd # Create a new, empty directory called uhd
+ $ sshfs user@yourcomputer:src/uhd uhd # This will mount ~/src/uhd from the remote machine to ~/uhd on the device
+
+Now, create a build directory and use the regular cmake/make procedure to kick
+off a build. It can be advantageous (especially for slow network connections)
+to create the build directory outside of the repository directory:
+
+ $ mkdir build_mpm
+ $ cd build_mpm # You are now in /home/root/build_mpm
+ $ cmake ../uhd/mpm
+ $ make -j2 install # This will take several minutes
+
+Note that this overwrites your system MPM. You can install MPM to another
+location by specifying `-DCMAKE_INSTALL_PREFIX`, but make sure to update all of
+your paths appropriately.
+
+If you prefer cross-compiling MPM the same way as UHD, refer to the following
+sections and adapt the instructions for UHD appropriately.
+
+\subsection e3xx_software_dev_sdk Obtaining an SDK
+
+The recommended way to develop software for the E31X/E320 is to cross-compile. By
+running the compiles on a desktop or laptop computer, you will be able to speed
+up compile times considerably (compiling UHD natively would take
+many hours).
+
+SDKs are distributed along with other binaries. They contain a cross-compiler,
+a cross-linker, a cross-debugger, and all the libraries available on the device
+to mirror its environment.
+Note: The SDK for E310 has been updated for UHD versions above v.3.15.0.0. Refer to
+the migration guide for details. \ref e31x_migration
+
+To unpack the SDK, simply execute it after downloading it:
+
+ $ cd /usr/local/share/uhd/images # Change this to where your images are stored
+ $ ./oecore-x86_64-cortexa9hf-neon-toolchain-nodistro.0.sh
+
+If this doesn't work, the executable permissions of the file might have been
+lost (this can occur with some versions of Python). In that case, add those
+permissions back before executing the `.sh` file:
+
+ $ chmod +x oecore-x86_64-cortexa9hf-neon-toolchain-nodistro.0.sh
+
+Executing the `.sh` file will prompt you for an installation path. Please
+ensure you have sufficient disk space, as each of the SDKs may require several
+gigabytes of disk space (depending on the image flavor selected).
+
+This will allow you to compile UHD as well as (depending on the image flavor)
+other software.
+
+Please note, that while several toolchains can be installed in parallel, they
+have to be installed to different directories.
+
+\subsection e3xx_software_dev_sdkusage SDK Usage
+
+Having installed the toolchain in the last step,
+in order to build software for your device open a new shell and type:
+
+ $ . $SDKPATH/environment-setup-armv7ahf-vfp-neon-oe-linux-gnueabi
+
+This will modify the PATH, CC, CXX etc, environment variables and allow you to compile software for your device.
+To verify all went well you can try:
+
+ $ $CC -dumpmachine
+
+which should return 'arm-oe-linux-gnueabi'.
+
+\subsubsection e3xx_software_dev_uhd Building UHD
+
+-# Obtain the UHD source code via git or tarball
+-# Set up your environment as described in \ref e3xx_software_dev_sdkusage
+-# Type the following in the build directory (assuming a build in host/build):
+
+ $ cmake -DCMAKE_TOOLCHAIN_FILE=../host/cmake/Toolchains/oe-sdk_cross.cmake -DCMAKE_INSTALL_PREFIX=/usr .. # Add any CMake options you desire
+ $ make # You can run make -j12 to compile on 12 processes at once
+
+Note: The UHD you are cross-compiling will not run on your host computer (the
+one where you're doing the development). Compiling UHD regularly on your host
+computer (with MPMD enabled) will allow you to talk to your device.
+
+\subsubsection e3xx_software_dev_gr Building GNU Radio
+
+-# Obtain the GNU Radio source code via git or tarball
+-# Set up your environment as described in \ref e3xx_software_dev_sdkusage
+-# Use the following commands to create a build directory, configure and compile gnuradio. You only need create the build directory once.
+
+\code{.sh}
+$ mkdir build-arm
+$ cd build-arm
+$ cmake -Wno-dev -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchains/oe-sdk_cross.cmake \-DCMAKE_INSTALL_PREFIX=/usr -DENABLE_GR_VOCODER=OFF -DENABLE_GR_ATSC=OFF \
+-DENABLE_GR_DTV=OFF -DENABLE_DOXYGEN=OFF ../ # Append any CMake options you desire
+\endcode
+
+Several GNU Radio components depend on running binaries built for the build
+machine during compile. These binaries can be built and used for cross
+compiling, but this is an advanced topic.
+
+\section e31x_device E310-specific Features
+
+\subsection e31x_hw_front_panel Front Panel
+
+\image html e3x0_fp_overlay.png "USRP E310 Front panel"
+
+- **RF A Group**
+ + **TX/RX LED**: Indicates that data is streaming on the TX/RX channel on frontend side A
+ + **RX2 LED**: Indicates that data is streaming on the RX2 channel on frontend side A
+
+- **RF B Group**
+ + **TX/RX LED**: Indicates that data is streaming on the TX/RX channel on frontend B
+ + **RX2 LED**: Indicates that data is streaming on the RX2 channel on frontend B
+- **PWR**: Power switch with integrated status LED, for status description see below.
+
+- **SYNC**: Input port for external PPS signal
+
+- **GPS**: Connection for the GPS antenna
+
+The status LED in the power switch indicates the power and charge status.
+Its behavior is firmware version dependent.
+
+- **Version 1** (original E310)
+ + **Off**: Indicates device is off and not charging
+ + **Solid Red**: Indicates device is charging
+ + **Solid Green**: Indicates device is on
+ + **Fast Blinking Red**: Indicates an error code
+ + 1 - Low voltage error
+ + 2 - Regulator low voltage error
+ + 3 - FPGA power error
+ + 4 - DRAM power error
+ + 5 - 1.8V rail power error
+ + 6 - 3.3V rail power error
+ + 7 - Daughterboard / TX power error
+ + 9 - Temperature error
+
+- **Version 2** (E312 and upgraded E310)
+ + **Off**: Indicates device is off and not charging
+ + **Slow Blinking Green**: Indicates device is off and charging
+ + **Fast Blinking Green**: Indicates device is on and charging
+ + **Solid Green**: Indicates device is on (and not charging, if E312)
+ + **Solid Orange**: Indicates device is on and discharging
+ + **Fast Blinking Orange**: Indicates device is on, discharging, and charge is below 10% charge
+ + **Fast Blinking Red**: Indicates an error code
+ + 1 - Low voltage error
+ + 2 - Regulator low voltage error
+ + 3 - FPGA power error
+ + 4 - DRAM power error
+ + 5 - 1.8V rail power error
+ + 6 - 3.3V rail power error
+ + 7 - Daughterboard / TX power error
+ + 8 - Charger error
+ + 9 - Charger temperature error
+ + 10 - Battery low error
+ + 11 - Fuel Gauge temperature error
+ + 12 - Global (case) temperature error
+
+\subsection e31x_hw_rear_panel Rear Panel
+
+\image html e3x0_rp_overlay.png "USRP E310 Rear Panel"
+
+- **PWR**: Locking connector (Kycon KLDHCX-0202-A-LT) for the USRP-E Series power supply
+- **1G ETH**: RJ45 port for Ethernet interfaces
+- **USB**: USB 2.0 Port
+- **SERIAL**: Micro USB connection for serial uart console
+
+\subsection e31x_hw_sync Clock and Time Synchronization
+
+Unlike most USRP devices, the E310 does not have independent reference clock and time source inputs.
+It is possible, however, to discipline the internal reference clock using an external time (PPS) source
+connected to the SYNC input pin. The E310 FPGA has a subsystem that can use the PPS signal from the
+SYNC pin or the internal GPS to align edges of the reference clock to edges of a shared PPS signal.
+This alignment happens automatically when the time source in UHD is set to "gpsdo" or "external".
+Please note that because the SYNC input can only accept a PPS signal, the only supported value for
+the reference clock source is "internal". Also, keep in mind that the E310
+does *not* have a GPS-disciplined oscillator like other USRPs, the value "gpsdo"
+for the time source was chosen for compatibility with other USRPs.
+
+\subsection e31x_hw_pps PPS - Pulse Per Second
+Using a PPS signal for timestamp synchronization requires a LVCMOS or a 5V logic input signal.
+An external PPS can be used to discipline the internal reference clock. This feature is automatically
+enabled with the time source is set to "external".
+
+To test the PPS input, you can use the following tool from the UHD examples:
+
+- `<args>` are device address arguments (optional if only one USRP device is on your machine)
+
+ cd <install-path>/lib/uhd/examples
+ ./test_pps_input --args=\<args\>
+
+\subsection e31x_hw_gps Internal GPS
+
+Your USRP-E Series device comes with an internal GPS.
+In order to get a lock on a satellite an external GPS antenna is required.
+The PPS from the internal GPS can be used to discipline the internal reference
+clock. This feature is automatically enabled when the time source is set to
+"gpsdo". Again, keep in mind that while the E310 does not have an actual
+GPS-disciplined oscillator (GPSDO) on the board, the value "gpsdo" was named
+such for better compatibility with code written for other devices.
+
+The device provides a 3.3V supply voltage to an external antenna connected to the *GPS* port
+of your device. Note that this supply voltage is turned off in order to safe power upon destruction of the software object.
+
+\subsection e31x_hw_gpio Internal GPIO
+
+### Connector
+
+\image html e3x0_gpio_conn.png "E3xx GPIO Connector"
+
+### Pin Mapping
+
+- Pin 1: +3.3V
+- Pin 2: Reserved
+- Pin 3: Data[5]
+- Pin 4: Reserved
+- Pin 5: Data[4]
+- Pin 6: Data[0]
+- Pin 7: Data[3]
+- Pin 8: Data[1]
+- Pin 9: 0V
+- Pin 10: Data[2]
+
+Please see the \ref page_gpio_api for information on configuring and using the GPIO bus.
+
+\subsection e31x_hw_chipscope Debugging custom FPGA designs with Xilinx Chipscope
+
+### Connector
+
+\image html e3x0_jtag_conn.png "E3xx JTAG Connector"
+
+### Pin Mapping
+
+- Pin 1: TDO
+- Pin 2: 3.3V
+- Pin 3: TCK
+- Pin 4: TDI
+- Pin 5: 0V
+- Pin 6: TMS
+
+
+Xilinx chipscope allows for debugging custom FPGA designs similar to a logic analyzer.
+USRP-E series devices can be used with Xilinx chipscope using the internal JTAG connector.
+
+Further information on how to use Chipscope can be found in the *Xilinx Chipscope Pro Software and Cores User Guide (UG029)*.
+
+\subsection e312_battery Battery notes
+
+The USRP E312 (and with upgraded firmware E310) supports LiIon Battery packs (e.g. AA Portable Power Corp, 749801-01).
+
+\subsubsection e312_battery_connector Connector
+
+The connector J1 on E312's motherboard is a Molex 53014-6310. The corresponding mating connector is a Molex 51004-0300.
+
+\image html e3xx_conn_photo.jpg "Battery pack connector"
+
+The pins are as follows:
+- Pin 1 (Red): VBat
+- Pin 2 (Black): GND
+- Pin 3 (White): Battery Thermistor
+
+\subsubsection e312_battery_information Driver
+
+The battery information is exposed on the device via the sysfs directory under:
+
+ /sys/class/power_supply/e31x-battery/
+
+and for the charger:
+
+ /sys/class/power_supply/e31x-charger/
+
+The values can be accessed via libudev or manually e.g.:
+
+ $ root@ni-e31x-<serial>: cat /sys/class/power_supply/e31x-battery/status
+
+The driver emits uevents on changes, that can be used to write custom UDev rules.
+Using UDev rules one can configure the USRP E3xx to shut down on certain events,
+such as low battery charge, high temperatures or AC power plug in.
+
+The following example will cause the system to shut down at a reported temperature
+of 73C:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+SUBSYSTEM=="power_supply", ATTR{online}=="1", ATTR{temp}=="730", RUN+="/sbin/shutdown -h now"
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The sysfs property "capacity" is no longer supported by the battery driver in the latest filesystem. It was removed to
+comply with the Linux power supply class driver recommendations during the ongoing driver upstreaming process. The capacity
+may still be calculated by the customer application using the following formula (charge_now/charge_full) * 100
+
+For more information, please see the udev manual pages and <a href ="https://www.kernel.org/doc/Documentation/power/power_supply_class.txt"> Kernel Power Supply Docs </a>.
+
+\subsubsection e312_battery_calibration Calibration Procedure
+
+In order for the fuel gauge to give a usable indication of remaining charge it needs to be calibrated.
+The procedure for calibration is as follows:
+
+1. Completely discharge battery (e.g. by booting up without SD card, so OS doesn't auto shutdown)
+2. Unplug the battery pack and external power
+3. Reconnect the battery pack
+4. Reconnect AC power and charge until charge completed.
+
+A faster (less accurate) calibration procedure is as follows:
+
+1. Completely charge battery
+2. Type:
+
+ $ echo 3200000 > /sys/class/power_supply/e31x-battery/charge_now
+
+3. Unplug AC power
+4. Replug AC power and wait until charge completes
+
+\subsection e31x_dboards Daughterboard notes
+
+The USRP E310 MIMO XCVR daughterboard features an integrated MIMO capable RF frontend.
+
+\subsubsection e31x_dboard_e310_tuning Frontend tuning
+
+The RF frontend has individually tunable receive and transmit chains.
+Both transmit and receive can be used in a MIMO configuration. For
+the MIMO case, both receive frontends share the RX LO, and both transmit
+frontends share the TX LO. Each LO is tunable between 50 MHz and 6 GHz.
+
+As there is a single LO for each direction (RX and TX), this means that both
+channels need to use the same LO frequency (i.e., both RX channels share an LO
+frequency, and both TX channels share an LO frequency). If the two channels
+are supposed to receive on different frequencies, the digital tune stages need
+to be used for that. The two frequencies will need to be within the currently
+selected master clock rate, and the final bandwidths need to be chosen
+carefully. Example: Assume the master clock rate is set to 50 MHz, and we want
+to receive at 400 MHz and 440 MHz. We can set the LO to 420 MHz, which will
+sample the spectrum from 395 MHz to 445 MHz. The LO offsets for both channels
+need to be 20 MHz and -20 MHz respectively. However, the final bandwidth should
+be less than 10 MHz (preferably lower), or the signals would exhibit aliasing.
+
+Because both channels share an LO, tuning one channel can possibly affect the
+other channel. It is advisable to read back the actual, current frequency from
+software before assuming the device is tuned to a specific frequency.
+
+\subsubsection e31x_dboard_e310_gain Frontend gain
+
+All frontends have individual analog gain controls. The receive
+frontends have 76 dB of available gain; and the transmit frontends have
+89.5 dB of available gain. Gain settings are application specific, but
+it is recommended that users consider using at least half of the
+available gain to get reasonable dynamic range.
+
+\subsubsection e31x_dboard_e310_pll Frontend LO lock status
+
+The frontends provide a *lo-locked* sensor that can be queried through the UHD API.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}
+// assumes 'usrp' is a valid uhd::usrp::multi_usrp::sptr instance
+
+// get status for rx frontend
+usrp->get_rx_sensor("lo-locked");
+
+// get status for tx frontend
+usrp->get_tx_sensor("lo-locked");
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+\subsubsection e31x_dboard_e310_band_select Frontend Filter and Antenna Switches
+
+The transmit and receive filter banks uses switches to select between the available filters. These paths are
+also dependent on the antenna switch settings. Incorrectly setting the switches generally results
+in attenuated input / output power. Receive filters are band pass (series high & low pass filters),
+transmit filters are low pass.
+
+Source code related to controlling the filter band and antenna switches resides in e31x_radio_ctrl_impl.cpp. The methods set the switches depending on the state of transmit and receive streams.
+
+The following sections provide switch setting tables for antenna and filter selection for frontends A & B receive and transmit paths.
+For further details refer to the schematics.
+
+\subsubsection e31x_dboard_e310_frontend_a_switches Frontend Side A Filter and Antenna Switches
+
+_Note: X = don't care, T = If full duplex, set bits according to transmit table, otherwise don't care.
+Filter range A – B will be selected if A <= freq < B._
+
+__Receive__
+RX Port | RX Filter (MHz) | VCTXRX2_V1,V2 | VCRX2_V1,V2 | RX2_BANDSEL[2:0] | RX2B_BANDSEL[1:0] | RX2C_BANDSEL[1:0]
+:-----: | :-------------: | :-----------: | :---------: | :--------------: | :---------------: | :---------------:
+TRX-A | < 450 | 01 | 10 | 101 | XX | 01
+TRX-A | 450 – 700 | 01 | 10 | 011 | XX | 11
+TRX-A | 700 – 1200 | 01 | 10 | 001 | XX | 10
+TRX-A | 1200 – 1800 | 01 | 10 | 000 | 01 | XX
+TRX-A | 1800 – 2350 | 01 | 10 | 010 | 11 | XX
+TRX-A | 2350 – 2600 | 01 | 10 | 100 | 10 | XX
+TRX-A | 2600 – 6000 | 01 | 01 | XXX | XX | XX
+RX2-A | 70 – 450 | TT | 01 | 101 | XX | 01
+RX2-A | 450 – 700 | TT | 01 | 011 | XX | 11
+RX2-A | 700 – 1200 | TT | 01 | 001 | XX | 10
+RX2-A | 1200 – 1800 | TT | 01 | 000 | 01 | XX
+RX2-A | 1800 – 2350 | TT | 01 | 010 | 11 | XX
+RX2-A | 2350 – 2600 | TT | 01 | 100 | 10 | XX
+RX2-A | >= 2600 | TT | 10 | XXX | XX | XX
+
+__Transmit__
+TX Port | TX Filter (MHz) | VCTXRX2_V1,V2 | TX_ENABLE2A,2B | TX_BANDSEL[2:0]
+:-----: | :-------------: | :-----------: | :------------: | :-------------:
+TRX-A | < 117.7 | 10 | 01 | 111
+TRX-A | 117.7 – 178.2 | 10 | 01 | 110
+TRX-A | 178.2 – 284.3 | 10 | 01 | 101
+TRX-A | 284.3 – 453.7 | 10 | 01 | 100
+TRX-A | 453.7 – 723.8 | 10 | 01 | 011
+TRX-A | 723.8 – 1154.9 | 10 | 01 | 010
+TRX-A | 1154.9 – 1842.6 | 10 | 01 | 001
+TRX-A | 1842.6 – 2940.0 | 10 | 01 | 000
+TRX-A | >= 2940.0 | 11 | 10 | XXX
+_Note: Although the transmit filters are low pass, this table describes UHD's tuning range for selecting each filter path.
+The table also includes the required transmit enable state._
+
+\subsubsection e31x_dboard_e310_frontend_b_switches Frontend Side B Filter and Antenna Switches
+
+_Note: X = don't care, T = If full duplex, set bits according to transmit table, otherwise don't care.
+Filter range A – B will be selected if A <= freq < B._
+
+__Receive__
+RX Port | RX Filter (MHz) | VCTXRX1_V1,V2 | VCRX1_V1,V2 | RX1_BANDSEL[2:0] | RX1B_BANDSEL[1:0] | RX1C_BANDSEL[1:0]
+:-----: | :-------------: | :-----------: | :---------: | :--------------: | :---------------: | :---------------:
+TRX-B | < 450 | 10 | 01 | 100 | XX | 10
+TRX-B | 450 – 700 | 10 | 01 | 010 | XX | 11
+TRX-B | 700 – 1200 | 10 | 01 | 000 | XX | 01
+TRX-B | 1200 – 1800 | 10 | 01 | 001 | 10 | XX
+TRX-B | 1800 – 2350 | 10 | 01 | 011 | 11 | XX
+TRX-B | 2350 – 2600 | 10 | 01 | 101 | 01 | XX
+TRX-B | 2600 – 6000 | 10 | 10 | XXX | XX | XX
+RX2-B | 70 – 450 | TT | 01 | 100 | XX | 10
+RX2-B | 450 – 700 | TT | 01 | 010 | XX | 11
+RX2-B | 700 – 1200 | TT | 01 | 000 | XX | 01
+RX2-B | 1200 – 1800 | TT | 01 | 001 | 10 | XX
+RX2-B | 1800 – 2350 | TT | 01 | 011 | 11 | XX
+RX2-B | 2350 – 2600 | TT | 01 | 101 | 01 | XX
+RX2-B | >= 2600 | TT | 10 | XXX | XX | XX
+
+__Transmit__
+TX Port | TX Filter (MHz) | VCTXRX1_V1,V2 | TX_ENABLE1A,1B | TX1_BANDSEL[2:0]
+:-----: | :-------------: | :-----------: | :------------: | :--------------:
+TRX-B | < 117.7 | 00 | 01 | 111
+TRX-B | 117.7 – 178.2 | 00 | 01 | 110
+TRX-B | 178.2 – 284.3 | 00 | 01 | 101
+TRX-B | 284.3 – 453.7 | 00 | 01 | 100
+TRX-B | 453.7 – 723.8 | 00 | 01 | 011
+TRX-B | 723.8 – 1154.9 | 00 | 01 | 010
+TRX-B | 1154.9 – 1842.6 | 00 | 01 | 001
+TRX-B | 1842.6 – 2940.0 | 00 | 01 | 000
+TRX-B | >= 2940.0 | 11 | 10 | XXX
+_Note: Although the transmit filters are low pass, the following table describes UHD's tuning range for selecting each filter path.
+The table also includes the required transmit enable states._
+
+\section e320_neon E320-specific Features
+
+\subsection e320_panels Front and Rear Panel
+
+Like the USRP X300 and N310 series, E320 has connectors on both the front and back
+panel. The back panel holds the power connector, all network connections, USB
+connections for serial console (see \ref e3xx_getting_started_serial), JTAG and
+peripherals, and front-panel GPIO.
+
+The front panel is used for all RF connections, SMA connectors for GPS antenna
+input, 10 MHz external clock reference.
+
+The connectors are labeled RF A and RF B and are powered by the two channels of
+AD9361 RFIC.
+
+\section e3xx_regmap E3XX FPGA Register Map
+
+The following tables describe how FPGA registers are mapped into the PS.
+This is for reference only, most users will not even have to know about this table.
+
+
+AXI Slave | Address Range | UIO Label | Description
+----------|-----------------------|------------------|-----------------------------------
+Slave 0 | 4000_0000 - 4000_3fff | - | Ethernet DMA SFP (only for E320)
+Slave 1 | 4000_4000 - 4000_4fff | misc-enet-regs | Ethernet registers SFP (only for E320)
+Slave 2 | 4001_0000 - 4001_3fff | mboard-regs | Motherboard control
+Slave 3 | 4001_4000 - 4001_41ff | dboard-regs | Daughterboard control
+
+
+<table>
+<caption id="e3xx_multi_row">E3XX Register Map</caption>
+<tr><th>AXI Slave <th>Module <th>Address <th>Name <th>Read/Write <th>Description
+<tr><td rowspan="1">Slave 0 <td rowspan="1">axi_eth_dma <td>4000_0000 - 4000_4fff <td>Ethernet DMA <td>RW <td>See Linux Driver (only on E320)
+<tr><td rowspan="44">Slave 1 <td rowspan="7">e320_mgt_io_core <td>4000_4000 <td>PORT_INFO <td>RO <td>SFP port information
+<tr> <td>[31:24] <td>COMPAT_NUM <td>RO <td>-
+<tr> <td>[23:18] <td>6'h0 <td>RO <td>-
+<tr> <td>[17] <td>activity <td>RO <td>-
+<tr> <td>[16] <td>link_up <td>RO <td>-
+<tr> <td>[15:8] <td>mgt_protocol <td>RO <td>0 - None, 1 - 1G, 2 - XG, 3 - Aurora
+<tr> <td>[7:0] <td>PORTNUM <td>RO <td>-
+<tr> <td rowspan="8">e320_mgt_io_core <td>4000_4004 <td>MAC_CTRL_STATUS <td>RW <td>Control 10gE and Aurora mac
+<tr> <td>[0] <td>ctrl_tx_enable (PROTOCOL = "10GbE")<td>RW<td>-
+<tr> <td>[0] <td>bist_checker_en (PROTOCOL = "Aurora")<td>RW<td>-
+<tr> <td>[1] <td>bist_gen_en <td>RW <td>-
+<tr> <td>[2] <td>bist_loopback_en<td>RW <td>-
+<tr> <td>[8:3] <td>bist_gen_rate <td>RW <td>-
+<tr> <td>[9] <td>phy_areset <td>RW <td>-
+<tr> <td>[10] <td>mac_clear <td>RW <td>-
+<tr> <td>e320_mgt_io_core <td>4000_4008 <td>PHY_CTRL_STATUS <td>RW <td>Phy reset control
+<tr> <td rowspan="3">e320_mgt_io_core <td>4000_400C <td>MAC_LED_CTL <td>RW <td>Used by ethtool to indicate port
+<tr> <td>[1] <td>identify_enable <td>RW <td>-
+<tr> <td>[0] <td>identify_value <td>RW <td>-
+<tr> <td rowspan="4">mdio_master <td>4000_4010 <td>MDIO_DATA <td>RW <td>-
+<tr> <td>4000_4014 <td>MDIO_ADDR <td>RW <td>-
+<tr> <td>4000_4018 <td>MDIO_OP <td>RW <td>-
+<tr> <td>4000_401C <td>MDIO_CTRL_STATUS<td>RW <td>-
+<tr> <td rowspan="4">e320_mgt_io_core <td>4000_4020 <td>AURORA_OVERUNS <td>RO <td>-
+<tr> <td>4000_4024 <td>AURORA_CHECKSUM_ERRORS<td>RO <td>-
+<tr> <td>4000_4028 <td>AURORA_BIST_CHECKER_SAMPS<td>RO <td>-
+<tr> <td>4000_402C <td>AURORA_BIST_CHECKER_ERRORS<td>RO<td>-
+<tr> <td rowspan="4">eth_switch <td>4000_5000 <td>MAC_LSB <td>RW <td>Device MAC LSB
+<tr> <td>4000_5004 <td>MAC_MSB <td>RW <td>Device MAC MSB
+<tr> <td>4000_6000 <td>IP <td>RW <td>Device IP
+<tr> <td>4000_6004 <td>PORT1, PORT0 <td>RW <td>Device UDP port
+<tr> <td rowspan="2">eth_dispatch <td>4000_6008 <td>[1] ndest, [0] bcast<td>RW <td>Enable Crossover
+<tr> <td>4000_600c <td>[1] my_icmp_type, [0] my_icmp_code<td>-
+<tr> <td rowspan="5">eth_switch <td>4000_6010 <td>BRIDGE_MAC_LSB <td> <td>Bridge SFP ports in ARM
+<tr> <td>4000_6014 <td>BRIDGE_MAC_MSB <td> <td>-
+<tr> <td>4000_6018 <td>BRIDGE_IP <td> <td>-
+<tr> <td>4000_601c <td>BRIDGE_PORT1, BRIDGE_PORT0<td> <td>-
+<tr> <td>4000_6020 <td>BRIDGE_EN <td> <td>-
+<tr> <td rowspan="6">chdr_eth_framer <td>4000_6108 onwards <td>LOCAL_DST_IP <td>W <td>Destination IP, MAC, UDP for Outgoing Packet for 256 SIDs
+<tr> <td>4000_6208 onwards <td>LOCAL_DST_UDP_MAC_MSB<td>W <td>Destination MAC for outgoing packets (MSB)
+<tr> <td>4000_6308 onwards <td>LOCAL_DST_MAC_LSB<td>W <td>Destination MAC for outgoing packets (LSB)
+<tr> <td>4000_7000 onwards <td>REMOTE_DST_IP <td>W <td>Destination IP, MAC, UDP for Outgoing Packet for 16 local addrs
+<tr> <td>4000_7400 onwards <td>REMOTE_DST_UDP_MAC_HI<td>W <td>Destination MAC (MSB)
+<tr> <td>4000_7800 onwards <td>REMOTE_DST_MAC_LO<td>W <td>Destination MAC (LSB)
+
+<tr><td rowspan="32">Slave 2 <td rowspan="27">e320_core <td>4001_0000 <td>COMPAT_NUM <td>R <td>FPGA Compat Number
+<tr> <td>[31:16] <td>Major <td>RO <td>-
+<tr> <td>[15:0] <td>Minor <td>RO <td>-
+<tr> <td>4001_0004 <td>DATESTAMP <td>RO <td>-
+<tr> <td>4001_0008 <td>GIT_HASH <td>RO <td>-
+<tr> <td>4001_000C <td>SCRATCH <td>RO <td>-
+<tr> <td>4001_0010 <td>NUM_CE <td>RO <td>Number of Computation Engines (RFNoC Blocks)
+<tr> <td>4001_0014 <td>NUM_IO_CE <td>RO <td>Number of fixed IO CEs - Radios + DMA Fifo
+<tr> <td>4001_0018 <td>CLOCK_CTRL <td> <td>-
+<tr> <td>[0] <td>pps select (internal 10 MHz)<td>RW<td>One-hot encoded pps_select to use the internal PPS from GPSDO
+<tr> <td>[1] <td>pps select (external 10 MHz)<td>RW<td>One-hot encoded pps_select to use the external PPS.
+<tr> <td>[2] <td>refclk_select (internal/external 10 MHz)<td>RW<td>refclk_select=0 for internal (GPSDO) 10 MHz, refclk_sel=1 for external 10 MHz.
+<tr> <td>4001_001C <td>XADC_READBACK <td>RO <td>-
+<tr> <td>[11:0] <td>FPGA temperature<td>RO <td>-
+<tr> <td>4001_0020 <td>BUS_CLK_RATE <td>RO <td>-
+<tr> <td>4001_0024 <td>BUS_CLK_COUNT <td>RO <td>-
+<tr> <td>4001_0028 <td>SFP_PORT_INFO <td>RO <td>Same as port_info register 0x4000_4000
+<tr> <td>4001_002C <td>FP_GPIO_CTRL <td>RW <td>-
+<tr> <td>4001_0030 <td>FP_GPIO_MASTER <td>RW <td>-
+<tr> <td>4001_0034 <td>FP_GPIO_RADIO_SRC <td>RW <td>-
+<tr> <td>4001_0038 <td>GPS_CTRL <td>RW <td>-
+<tr> <td>[0] <td>GPS_PWR_EN <td>RW <td>Power on GPSDO
+<tr> <td>[1] <td>GPS_RST_N <td>RW <td>-
+<tr> <td>[2] <td>GPS_INITSURV_N <td>RW <td>-
+<tr> <td>4001_003C <td>GPS_STATUS <td>RO <td>GPSDO Status
+<tr> <td>[0] <td>GPS_LOCK <td>RO <td>Returns 1 if GPSDO is locked
+<tr> <td>[1] <td>GPS_ALARM <td>RO <td>-
+<tr> <td>[2] <td>GPS_PHASELOCK <td>RO <td>-
+<tr> <td>[3] <td>GPS_SURVEY <td>RO <td>-
+<tr> <td>[4] <td>GPS_WARMUP <td>RO <td>-
+<tr> <td>4001_0040 <td>DBOARD_CTRL <td>RO <td>-
+<tr> <td>4001_0044 <td>DBOARD_STATUS <td>RO <td>-
+
+<tr> <td rowspan="5">axi_crossbar <td>4001_1010 <td>XBAR_VERSION <td>RO <td>See crossbar kernel driver
+<tr> <td>4001_1014 <td>XBAR_NUM_PORTS <td>RO <td>See crossbar kernel driver
+<tr> <td>4001_1018 <td>LOCAL_ADDR <td>RW <td>See crossbar kernel driver
+<tr> <td>4001_1020 <td>remote_offset <td>WO <td>XBAR settings reg
+<tr> <td>4001_1420 <td>local_offset <td>WO <td>XBAR settings reg
+
+<tr><td rowspan="6">Slave 4 <td>4001_4000<td>4001_41FF<td>Daughterboard Registers<td>- <td>Don't exist now. TBD
+
+
+*/
+// vim:ft=doxygen: