ADALM-PLUTO MIMO is a separate native RemoteRF device type. It uses the packaged adalm_pluto_mimo schema, opens the radio through pyadi-iio's adi.ad9361 interface, and enables RX and TX channels 0 and 1 by default.

The ADALM-PLUTO MIMO driver uses an ADALM-PLUTO prepared for AD9361 2R2T operation.
The ADALM-PLUTO MIMO driver uses an ADALM-PLUTO prepared for AD9361 2R2T operation.

Overview

RemoteRF treats standard Pluto and Pluto MIMO as two distinct native drivers:

  • Use device_type: adalm_pluto and the generated Pluto client for normal single-channel Pluto operation.
  • Use device_type: adalm_pluto_mimo and the generated PlutoMIMO client when the device is prepared for two receive and two transmit channels.

The MIMO schema inherits the normal Pluto tuning, bandwidth, buffer, DDS, RX, and TX interface. It adds channel-selection controls plus channel 1 receive gain mode, RX hardware gain, and TX hardware gain.

Hardware prerequisite: the RemoteRF driver does not turn a stock physical RF path into a second connected RF channel. Prepare and verify the device's firmware, boot configuration, and any required hardware access for AD9361 2r2t operation before registering it as adalm_pluto_mimo.

Prepare MIMO Mode

Analog Devices documents the Pluto boot configuration used to enable AD9361-compatible 2R2T operation. Follow the official procedure appropriate for your hardware revision, then reboot the Pluto and verify the saved boot values before continuing.

Use the ordinary ADALM-PLUTO tutorial instead if the local AD9361 interface does not expose both complex channel indexes. A RemoteRF manifest setting cannot compensate for a device that is still operating as a single-channel Pluto.

Install and Detect

Install the dependencies on the machine that physically owns the Pluto MIMO. Use remoterf-server for a server-attached radio or remoterf-host for a host-attached radio.

Step 1

Install Pluto Dependencies

The base RemoteRF package already installs pyadi-iio. Install libiio and its tools on the machine that runs the RemoteRF process.

Run:
conda install -y libiio pylibiio libusb
sudo apt-get install -y libiio-utils
Step 2

Find the Serial and USB URI

Confirm that libiio can discover the device without elevated privileges.

Run:
iio_info -s
Expected result: find a line containing the Pluto serial and a URI such as [usb:1.2.3]. Save the serial for devices.yml and the USB URI for the local two-channel check.
Step 3

Check Both Channels Locally

Replace the example URI with the USB URI reported by iio_info -s.

Run:
python - <<'PY'
import adi

sdr = adi.ad9361("usb:1.2.3")
sdr.rx_enabled_channels = [0, 1]
sdr.tx_enabled_channels = [0, 1]
print("RX channels:", sdr.rx_enabled_channels)
print("TX channels:", sdr.tx_enabled_channels)
PY
Expected result: both printed lists contain [0, 1]. Resolve firmware, hardware, libiio, or permissions problems locally before starting RemoteRF.

Manifest Example

Save this file on the machine the Pluto MIMO is physically attached to. For a Pluto MIMO attached to the main RemoteRF server, place it at ~/.config/remoterf/devices.yml. For a Pluto MIMO attached to a RemoteRF host, place it at ~/.config/remoterf/host/devices.yml.

Below is an example devices.yml file for a Pluto MIMO:

devices.yml
yaml
devices:
  - device_id: 2
    device_type: adalm_pluto_mimo
    name: Pluto MIMO Bench
    init:
      serial: "104473f6"
      rx_enabled_channels: [0, 1]
      tx_enabled_channels: [0, 1]

Alternatively, for a Pluto MIMO attached directly to the main RemoteRF server, create the same YAML entry through the CLI:

serverrf --device --add --pluto-mimo "2:Pluto MIMO Bench:104473f6"
serverrf --device --show

For a device attached to a RemoteRF Host, use hostrf instead of serverrf for supported device-add commands.

Verify Two Channels

After reserving the device, refresh the generated client and perform a short receive:

from remoteRF.drivers import ensure_driver

ensure_driver(token=token)
from remoteRF.drivers.adalm_pluto_mimo import PlutoMIMO

sdr = PlutoMIMO(token)
sdr.rx_enabled_channels = [0, 1]
sdr.rx_buffer_size = 4096
channel_0, channel_1 = sdr.rx()

print(channel_0.shape, channel_1.shape)

With two complex receive channels enabled, pyadi-iio returns one array per channel. Use the same ordering for two-channel transmit data: one complex array for channel 0 and one for channel 1.

Troubleshooting: if the device opens with adi.Pluto but not adi.ad9361, or channel index 1 is rejected, return to the MIMO prerequisite and local check. If local two-channel access works but RemoteRF does not connect, confirm the serial and the exact adalm_pluto_mimo device type, then restart the owning RemoteRF process.