Skip to content

Commit

Permalink
Merge pull request analogdevicesinc#3 from analogdevicesinc/adrv9009
Browse files Browse the repository at this point in the history
ADRV9009 and SOM support
  • Loading branch information
tfcollins authored Aug 24, 2019
2 parents 0cc40b7 + 6b6221d commit 1c53673
Show file tree
Hide file tree
Showing 8 changed files with 411 additions and 32 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
### Currently supported hardware
- AD936X (Pluto, FMComms, ADRV936X)
- AD9371
- ADRV9009

### Dependencies
- libiio with python bindings
Expand Down
22 changes: 2 additions & 20 deletions adi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,29 +33,11 @@

from adi.ad9361 import *


class ad9361(ad9361):
pass


class ad9363(ad9363):
pass


class ad9364(ad9364):
pass


class Pluto(Pluto):
pass


from adi.ad9371 import *

from adi.adrv9009 import *

class ad9371(ad9371):
pass

from adi.adrv9009_zu11eg import *

__version__ = "0.0.2"
name = "Analog Devices Hardware Interfaces"
147 changes: 147 additions & 0 deletions adi/adrv9009.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
# Copyright (C) 2019 Analog Devices, Inc.
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
# - Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# - Neither the name of Analog Devices, Inc. nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
# - The use of this software may or may not infringe the patent rights
# of one or more patent holders. This license does not release you
# from the requirement that you obtain separate licenses from these
# patent holders to use this software.
# - Use of the software either in source or binary form, must be run
# on or directly connected to an Analog Devices Inc. component.
#
# THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
# INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED.
#
# IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY
# RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

from adi.rx_tx import rx_tx
from adi.context_manager import context_manager


class adrv9009(rx_tx, context_manager):
""" ADRV9009 Transceiver """

complex_data = True
rx_channel_names = ["voltage0_i", "voltage0_q", "voltage1_i", "voltage1_q"]
tx_channel_names = ["voltage0", "voltage1", "voltage2", "voltage3"]
device_name = ""
rx_enabled_channels = [0, 1]
tx_enabled_channels = [0, 1]

def __init__(self, uri=""):

context_manager.__init__(self, uri, self.device_name)

self.ctrl = self.ctx.find_device("adrv9009-phy")
self.rxadc = self.ctx.find_device("axi-adrv9009-rx-hpc")
self.rxobs = self.ctx.find_device("axi-adrv9009-rx-obs-hpc")
self.txdac = self.ctx.find_device("axi-adrv9009-tx-hpc")

rx_tx.__init__(self, self.rx_enabled_channels, self.tx_enabled_channels)

# @property
# def profile(self):
# """Load profile file. Provide path to profile file to attribute"""
# return self.get_iio_dev_attr("profile_config")
#
# @profile.setter
# def profile(self, value):
# with open(value, "r") as file:
# data = file.read()
# self.set_iio_dev_attr_str("profile_config", data)

@property
def gain_control_mode(self):
"""gain_control_mode: Mode of receive path AGC. Options are:
slow_attack, manual"""
return self.get_iio_attr("voltage0", "gain_control_mode", False)

@gain_control_mode.setter
def gain_control_mode(self, value):
self.set_iio_attr_str("voltage0", "gain_control_mode", False, value)

@property
def rx_hardwaregain_chan0(self):
"""rx_hardwaregain: Gain applied to RX path channel 0. Only applicable when
gain_control_mode is set to 'manual'"""
return self.get_iio_attr("voltage0", "hardwaregain", False)

@rx_hardwaregain_chan0.setter
def rx_hardwaregain_chan0(self, value):
if self.gain_control_mode == "manual":
self.set_iio_attr("voltage0", "hardwaregain", False, value)

@property
def rx_hardwaregain_chan1(self):
"""rx_hardwaregain: Gain applied to RX path channel 1. Only applicable when
gain_control_mode is set to 'manual'"""
return self.get_iio_attr("voltage1", "hardwaregain", False)

@rx_hardwaregain_chan1.setter
def rx_hardwaregain_chan1(self, value):
if self.gain_control_mode == "manual":
self.set_iio_attr("voltage1", "hardwaregain", False, value)

@property
def tx_hardwaregain_chan0(self):
"""tx_hardwaregain: Attenuation applied to TX path channel 0"""
return self.get_iio_attr("voltage0", "hardwaregain", True)

@tx_hardwaregain_chan0.setter
def tx_hardwaregain_chan0(self, value):
self.set_iio_attr("voltage0", "hardwaregain", True, value)

@property
def tx_hardwaregain_chan1(self):
"""tx_hardwaregain: Attenuation applied to TX path channel 1"""
return self.get_iio_attr("voltage1", "hardwaregain", True)

@tx_hardwaregain_chan1.setter
def tx_hardwaregain_chan1(self, value):
self.set_iio_attr("voltage1", "hardwaregain", True, value)

@property
def rx_rf_bandwidth(self):
"""rx_rf_bandwidth: Bandwidth of front-end analog filter of RX path"""
return self.get_iio_attr("voltage0", "rf_bandwidth", False)

@property
def tx_rf_bandwidth(self):
"""tx_rf_bandwidth: Bandwidth of front-end analog filter of TX path"""
return self.get_iio_attr("voltage0", "rf_bandwidth", True)

@property
def rx_sample_rate(self):
"""rx_sample_rate: Sample rate RX path in samples per second"""
return self.get_iio_attr("voltage0", "sampling_frequency", False)

@property
def tx_sample_rate(self):
"""tx_sample_rate: Sample rate TX path in samples per second"""
return self.get_iio_attr("voltage0", "sampling_frequency", True)

@property
def trx_lo(self):
"""trx_lo: Carrier frequency of TX and RX path"""
return self.get_iio_attr("altvoltage0", "frequency", True)

@trx_lo.setter
def trx_lo(self, value):
self.set_iio_attr("altvoltage0", "frequency", True, value)
147 changes: 147 additions & 0 deletions adi/adrv9009_zu11eg.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
# Copyright (C) 2019 Analog Devices, Inc.
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
# - Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# - Neither the name of Analog Devices, Inc. nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
# - The use of this software may or may not infringe the patent rights
# of one or more patent holders. This license does not release you
# from the requirement that you obtain separate licenses from these
# patent holders to use this software.
# - Use of the software either in source or binary form, must be run
# on or directly connected to an Analog Devices Inc. component.
#
# THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
# INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED.
#
# IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY
# RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

from adi.adrv9009 import adrv9009


class adrv9009_zu11eg(adrv9009):
""" ADRV9009-ZU11EG System-On-Module """

rx_channel_names = [
"voltage0_i",
"voltage0_q",
"voltage1_i",
"voltage1_q",
"voltage2_i",
"voltage2_q",
"voltage3_i",
"voltage3_q",
]
tx_channel_names = [
"voltage0",
"voltage1",
"voltage2",
"voltage3",
"voltage4",
"voltage5",
"voltage6",
"voltage7",
]
device_name = ""
rx_enabled_channels = [0, 1]
tx_enabled_channels = [0, 1]

def __init__(self, uri=""):
adrv9009.__init__(self, uri=uri)
self.ctrl_b = self.ctx.find_device("adrv9009-phy-b")

@property
def gain_control_mode_chip_b(self):
"""gain_control_mode_chip_b: Mode of receive path AGC. Options are:
slow_attack, manual"""
return self.get_iio_attr("voltage0", "gain_control_mode", False, self.ctrl_b)

@gain_control_mode_chip_b.setter
def gain_control_mode_chip_b(self, value):
self.set_iio_attr_str(
"voltage0", "gain_control_mode", False, value, self.ctrl_b
)

@property
def rx_hardwaregain_chan0_chip_b(self):
"""rx_hardwaregain: Gain applied to RX path channel 0. Only applicable when
gain_control_mode is set to 'manual'"""
return self.get_iio_attr("voltage0", "hardwaregain", False, self.ctrl_b)

@rx_hardwaregain_chan0_chip_b.setter
def rx_hardwaregain_chan0_chip_b(self, value):
if self.gain_control_mode_chip_b == "manual":
self.set_iio_attr("voltage0", "hardwaregain", False, value, self.ctrl_b)

@property
def rx_hardwaregain_chan1_chip_b(self):
"""rx_hardwaregain: Gain applied to RX path channel 1. Only applicable when
gain_control_mode is set to 'manual'"""
return self.get_iio_attr("voltage1", "hardwaregain", False, self.ctrl_b)

@rx_hardwaregain_chan1_chip_b.setter
def rx_hardwaregain_chan1_chip_b(self, value):
if self.gain_control_mode_chip_b == "manual":
self.set_iio_attr("voltage1", "hardwaregain", False, value, self.ctrl_b)

@property
def tx_hardwaregain_chan0_chip_b(self):
"""tx_hardwaregain: Attenuation applied to TX path channel 0"""
return self.get_iio_attr("voltage0", "hardwaregain", True, self.ctrl_b)

@tx_hardwaregain_chan0_chip_b.setter
def tx_hardwaregain_chan0_chip_b(self, value):
self.set_iio_attr("voltage0", "hardwaregain", True, value, self.ctrl_b)

@property
def tx_hardwaregain_chan1_chip_b(self):
"""tx_hardwaregain: Attenuation applied to TX path channel 1"""
return self.get_iio_attr("voltage1", "hardwaregain", True, self.ctrl_b)

@tx_hardwaregain_chan1_chip_b.setter
def tx_hardwaregain_chan1_chip_b(self, value):
self.set_iio_attr("voltage1", "hardwaregain", True, value, self.ctrl_b)

@property
def rx_rf_bandwidth_chip_b(self):
"""rx_rf_bandwidth: Bandwidth of front-end analog filter of RX path"""
return self.get_iio_attr("voltage0", "rf_bandwidth", False, self.ctrl_b)

@property
def tx_rf_bandwidth_chip_b(self):
"""tx_rf_bandwidth: Bandwidth of front-end analog filter of TX path"""
return self.get_iio_attr("voltage0", "rf_bandwidth", True, self.ctrl_b)

@property
def rx_sample_rate_chip_b(self):
"""rx_sample_rate: Sample rate RX path in samples per second"""
return self.get_iio_attr("voltage0", "sampling_frequency", False, self.ctrl_b)

@property
def tx_sample_rate_chip_b(self):
"""tx_sample_rate: Sample rate TX path in samples per second"""
return self.get_iio_attr("voltage0", "sampling_frequency", True, self.ctrl_b)

@property
def trx_lo_chip_b(self):
"""trx_lo: Carrier frequency of TX and RX path"""
return self.get_iio_attr("altvoltage0", "frequency", True, self.ctrl_b)

@trx_lo_chip_b.setter
def trx_lo_chip_b(self, value):
self.set_iio_attr("altvoltage0", "frequency", True, value, self.ctrl_b)
35 changes: 25 additions & 10 deletions adi/attribute.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,29 +33,44 @@


class attribute:
def set_iio_attr_str(self, channel_name, attr_name, output, value):
channel = self.ctrl.find_channel(channel_name, output)
def set_iio_attr_str(self, channel_name, attr_name, output, value, ctrl=None):
if ctrl:
channel = ctrl.find_channel(channel_name, output)
else:
channel = self.ctrl.find_channel(channel_name, output)
try:
channel.attrs[attr_name].value = str(value)
except Exception as ex:
raise ex

def set_iio_attr(self, channel_name, attr_name, output, value):
channel = self.ctrl.find_channel(channel_name, output)
def set_iio_attr(self, channel_name, attr_name, output, value, ctrl=None):
if ctrl:
channel = ctrl.find_channel(channel_name, output)
else:
channel = self.ctrl.find_channel(channel_name, output)
try:
channel.attrs[attr_name].value = str(int(value))
except Exception as ex:
raise ex

def get_iio_attr(self, channel_name, attr_name, output):
channel = self.ctrl.find_channel(channel_name, output)
def get_iio_attr(self, channel_name, attr_name, output, ctrl=None):
if ctrl:
channel = ctrl.find_channel(channel_name, output)
else:
channel = self.ctrl.find_channel(channel_name, output)
return channel.attrs[attr_name].value

def set_iio_dev_attr_str(self, attr_name, value):
def set_iio_dev_attr_str(self, attr_name, value, ctrl=None):
try:
self.ctrl.attrs[attr_name].value = str(value)
if ctrl:
ctrl.attrs[attr_name].value = str(value)
else:
self.ctrl.attrs[attr_name].value = str(value)
except Exception as ex:
raise ex

def get_iio_dev_attr(self, attr_name):
return self.ctrl.attrs[attr_name].value
def get_iio_dev_attr(self, attr_name, ctrl=None):
if ctrl:
return ctrl.attrs[attr_name].value
else:
return self.ctrl.attrs[attr_name].value
Loading

0 comments on commit 1c53673

Please sign in to comment.