Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions adi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
from adi.ad9265 import ad9265
from adi.ad9434 import ad9434
from adi.ad9467 import ad9467
from adi.ad9508 import ad9508
from adi.ad9625 import ad9625
from adi.ad9680 import ad9680
from adi.ada4961 import ada4961
Expand Down
97 changes: 97 additions & 0 deletions adi/ad9508.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# Copyright (C) 2025 Analog Devices, Inc.
#
# SPDX short identifier: ADIBSD

from adi.attribute import attribute
from adi.context_manager import context_manager


class ad9508(attribute, context_manager):

""" AD9508 ADC """

_device_name = ""

def __init__(self, uri="", device_name="ad9508"):
context_manager.__init__(self, uri, self._device_name)

compatible_part = "ad9508"
self._ctrl = None

if not device_name:
device_name = compatible_part
else:
if device_name != compatible_part:
raise Exception(f"Not a compatible device: {device_name}")

# Select the device matching device_name as working device
for device in self._ctx.devices:
if device.name == device_name:
self._ctrl = device
self._rxadc = device
break

# Raise an exception if the device isn't found
if not self._ctrl:
raise Exception("ad9508 device not found")

self.channel = []
for ch in self._ctrl.channels:
name = ch.id
self.channel.append(self._channel(self._ctrl, name))

class _channel(attribute):
"""AD9508 channel"""

def __init__(self, ctrl, channel_name):
self.name = channel_name
self._ctrl = ctrl

@property
def frequency(self):
"""Get the channel output frequency"""
return self._get_iio_attr(self.name, "frequency", True)

@frequency.setter
def frequency(self, frequency):
"""Set the channel output frequency"""
self._set_iio_attr(self.name, "frequency", True, frequency, self._ctrl)

@property
def phase(self):
"""Get the channel output phase"""
return self._get_iio_attr(self.name, "phase", True)

@phase.setter
def phase(self, phase):
"""Set the channel output phase"""
self._set_iio_attr(self.name, "phase", True, phase, self._ctrl)

@property
def raw(self):
"""Get the state of a channel divider (enabled/powered-down)"""
return self._get_iio_attr(self.name, "raw", True)

@raw.setter
def raw(self, raw):
"""Set the state of a channel divider (enabled/powered-down)"""
self._set_iio_attr(self.name, "raw", True, raw, self._ctrl)

@property
def sync_dividers(self):
"""Get dividers synchronization status"""
raise AttributeError("Cannot access 'sync_dividers' directly")

@sync_dividers.setter
def sync_dividers(self, value):
"""Set dividers synchronization procedure"""
self._set_iio_dev_attr("sync_dividers", value)

def reg_read(self, reg):
"""Direct Register Access via debugfs"""
self._set_iio_debug_attr_str("direct_reg_access", reg, self._ctrl)
return self._get_iio_debug_attr_str("direct_reg_access", self._ctrl)

def reg_write(self, reg, value):
"""Direct Register Access via debugfs"""
self._set_iio_debug_attr_str("direct_reg_access", f"{reg} {value}", self._ctrl)
7 changes: 7 additions & 0 deletions doc/source/devices/adi.ad9508.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
ad9508
=================

.. automodule:: adi.ad9508
:members:
:undoc-members:
:show-inheritance:
1 change: 1 addition & 0 deletions doc/source/devices/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ Supported Devices
adi.ad937x
adi.ad9434
adi.ad9467
adi.ad9508
adi.ad9625
adi.ad9680
adi.ad4858
Expand Down
1 change: 1 addition & 0 deletions supported_parts.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@
- AD9375
- AD9434
- AD9467
- AD9508
- AD9625
- AD9680
- AD4858
Expand Down
2 changes: 2 additions & 0 deletions test/emu/devices/ad9508.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE context [<!ELEMENT context (device | context-attribute)*><!ELEMENT context-attribute EMPTY><!ELEMENT device (channel | attribute | debug-attribute | buffer-attribute)*><!ELEMENT channel (scan-element?, attribute*)><!ELEMENT attribute EMPTY><!ELEMENT scan-element EMPTY><!ELEMENT debug-attribute EMPTY><!ELEMENT buffer-attribute EMPTY><!ATTLIST context name CDATA #REQUIRED description CDATA #IMPLIED><!ATTLIST context-attribute name CDATA #REQUIRED value CDATA #REQUIRED><!ATTLIST device id CDATA #REQUIRED name CDATA #IMPLIED><!ATTLIST channel id CDATA #REQUIRED type (input|output) #REQUIRED name CDATA #IMPLIED><!ATTLIST scan-element index CDATA #REQUIRED format CDATA #REQUIRED scale CDATA #IMPLIED><!ATTLIST attribute name CDATA #REQUIRED filename CDATA #IMPLIED value CDATA #IMPLIED><!ATTLIST debug-attribute name CDATA #REQUIRED value CDATA #IMPLIED><!ATTLIST buffer-attribute name CDATA #REQUIRED value CDATA #IMPLIED>]><context name="network" description="10.48.65.248 Linux analog 6.1.0-271838-g69fc41f0840e-dirty #11 SMP PREEMPT Wed Jan 15 17:36:35 EET 2025 armv7l" ><context-attribute name="hdl_system_id" value="[ad488x_fmc_evb] on [zed] git branch [dev_ad4880] git [d3d3fc1afff25028fa728ee5f50e95d664c7ee31] dirty [2025-01-15 13:50:03] UTC" /><context-attribute name="hw_model" value="EVAL-AD4880-FMCZU1 on Xilinx Zynq ZED" /><context-attribute name="hw_carrier" value="Xilinx Zynq ZED" /><context-attribute name="hw_mezzanine" value="EVAL-AD4880-FMCZU1" /><context-attribute name="hw_name" value="EVAL-AD4880-FMCZ-U1" /><context-attribute name="hw_vendor" value="Analog Devices" /><context-attribute name="hw_serial" value="Empty Field" /><context-attribute name="local,kernel" value="6.1.0-271838-g69fc41f0840e-dirty" /><context-attribute name="uri" value="ip:10.48.65.248" /><context-attribute name="ip,ip-addr" value="10.48.65.248" /><device id="hwmon0" name="e000b000ethernetffffffff00" ><channel id="temp1" type="input" ><attribute name="crit" filename="temp1_crit" value="100000" /><attribute name="input" filename="temp1_input" value="41000" /><attribute name="max_alarm" filename="temp1_max_alarm" value="0" /></channel></device><device id="iio:device0" name="xadc" ><channel id="voltage5" name="vccoddr" type="input" ><attribute name="label" filename="in_voltage5_vccoddr_label" value="vccoddr" /><attribute name="raw" filename="in_voltage5_vccoddr_raw" value="2038" /><attribute name="scale" filename="in_voltage5_vccoddr_scale" value="0.732421875" /></channel><channel id="voltage0" name="vccint" type="input" ><attribute name="label" filename="in_voltage0_vccint_label" value="vccint" /><attribute name="raw" filename="in_voltage0_vccint_raw" value="1387" /><attribute name="scale" filename="in_voltage0_vccint_scale" value="0.732421875" /></channel><channel id="voltage4" name="vccpaux" type="input" ><attribute name="label" filename="in_voltage4_vccpaux_label" value="vccpaux" /><attribute name="raw" filename="in_voltage4_vccpaux_raw" value="2451" /><attribute name="scale" filename="in_voltage4_vccpaux_scale" value="0.732421875" /></channel><channel id="temp0" type="input" ><attribute name="offset" filename="in_temp0_offset" value="-2219" /><attribute name="raw" filename="in_temp0_raw" value="2626" /><attribute name="scale" filename="in_temp0_scale" value="123.040771484" /></channel><channel id="voltage7" name="vrefn" type="input" ><attribute name="label" filename="in_voltage7_vrefn_label" value="vrefn" /><attribute name="raw" filename="in_voltage7_vrefn_raw" value="5" /><attribute name="scale" filename="in_voltage7_vrefn_scale" value="0.732421875" /></channel><channel id="voltage1" name="vccaux" type="input" ><attribute name="label" filename="in_voltage1_vccaux_label" value="vccaux" /><attribute name="raw" filename="in_voltage1_vccaux_raw" value="2451" /><attribute name="scale" filename="in_voltage1_vccaux_scale" value="0.732421875" /></channel><channel id="voltage2" name="vccbram" type="input" ><attribute name="label" filename="in_voltage2_vccbram_label" value="vccbram" /><attribute name="raw" filename="in_voltage2_vccbram_raw" value="1391" /><attribute name="scale" filename="in_voltage2_vccbram_scale" value="0.732421875" /></channel><channel id="voltage3" name="vccpint" type="input" ><attribute name="label" filename="in_voltage3_vccpint_label" value="vccpint" /><attribute name="raw" filename="in_voltage3_vccpint_raw" value="1387" /><attribute name="scale" filename="in_voltage3_vccpint_scale" value="0.732421875" /></channel><channel id="voltage6" name="vrefp" type="input" ><attribute name="label" filename="in_voltage6_vrefp_label" value="vrefp" /><attribute name="raw" filename="in_voltage6_vrefp_raw" value="1713" /><attribute name="scale" filename="in_voltage6_vrefp_scale" value="0.732421875" /></channel><attribute name="sampling_frequency" value="961538" /><attribute name="waiting_for_supplier" value="0" /></device><device id="iio:device1" name="one-bit-adc-dac" ><channel id="voltage0" type="output" ><attribute name="label" filename="out_voltage0_label" value="SYNC_N" /><attribute name="raw" filename="out_voltage0_raw" value="0" /></channel><attribute name="waiting_for_supplier" value="0" /></device><device id="iio:device2" name="/axi/spi@e0007000/adf4350@1" ><channel id="altvoltage0" type="output" ><attribute name="frequency" filename="out_altvoltage0_frequency" value="400000000" /><attribute name="frequency_resolution" filename="out_altvoltage0_frequency_resolution" value="100000" /><attribute name="powerdown" filename="out_altvoltage0_powerdown" value="0" /><attribute name="refin_frequency" filename="out_altvoltage0_refin_frequency" value="25000000" /></channel><attribute name="waiting_for_supplier" value="0" /><debug-attribute name="direct_reg_access" value="0x400000" /></device><device id="iio:device3" name="ad9508" ><channel id="altvoltage3" name="CLK_A" type="output" ><attribute name="frequency" filename="out_altvoltage3_CLK_A_frequency" value="400000000" /><attribute name="label" filename="out_altvoltage3_CLK_A_label" value="CLK_A" /><attribute name="phase" filename="out_altvoltage3_CLK_A_phase" value="0.000000" /><attribute name="raw" filename="out_altvoltage3_CLK_A_raw" value="1" /></channel><channel id="altvoltage0" name="CNV_B" type="output" ><attribute name="frequency" filename="out_altvoltage0_CNV_B_frequency" value="40000000" /><attribute name="label" filename="out_altvoltage0_CNV_B_label" value="CNV_B" /><attribute name="phase" filename="out_altvoltage0_CNV_B_phase" value="0.000000" /><attribute name="raw" filename="out_altvoltage0_CNV_B_raw" value="1" /></channel><channel id="altvoltage1" name="CLK_B" type="output" ><attribute name="frequency" filename="out_altvoltage1_CLK_B_frequency" value="400000000" /><attribute name="label" filename="out_altvoltage1_CLK_B_label" value="CLK_B" /><attribute name="phase" filename="out_altvoltage1_CLK_B_phase" value="0.000000" /><attribute name="raw" filename="out_altvoltage1_CLK_B_raw" value="1" /></channel><channel id="altvoltage2" name="CNV_A" type="output" ><attribute name="frequency" filename="out_altvoltage2_CNV_A_frequency" value="40000000" /><attribute name="label" filename="out_altvoltage2_CNV_A_label" value="CNV_A" /><attribute name="phase" filename="out_altvoltage2_CNV_A_phase" value="0.000000" /><attribute name="raw" filename="out_altvoltage2_CNV_A_raw" value="1" /></channel><attribute name="sync_dividers" value="ERROR" /><attribute name="waiting_for_supplier" value="0" /><debug-attribute name="direct_reg_access" value="0x81" /></device><device id="iio:device6" name="ad4880" ><channel id="voltage0" type="input" ><scan-element index="0" format="le:S20/32&gt;&gt;0" scale="0.000006" /><attribute name="lvds_cnv" filename="in_voltage0_lvds_cnv" value="1" /><attribute name="lvds_sync" filename="in_voltage0_lvds_sync" value="enable" /><attribute name="scale" filename="in_voltage0_scale" value="0.000005722" /></channel><channel id="voltage1" type="input" ><scan-element index="1" format="le:S20/32&gt;&gt;0" scale="0.000006" /><attribute name="lvds_cnv" filename="in_voltage1_lvds_cnv" value="1" /><attribute name="lvds_sync" filename="in_voltage1_lvds_sync" value="enable" /><attribute name="scale" filename="in_voltage1_scale" value="0.000005722" /></channel><attribute name="filter_sel" value="disabled" /><attribute name="filter_sel_available" value="disabled sinc1 sinc5 sinc5_plus_compensation" /><attribute name="sampling_frequency" value="40000000" /><attribute name="sinc_dec_rate" value="2" /><attribute name="sinc_dec_rate_available" value="2 4 8 16 32 64 128 256 512 1024" /><attribute name="sync_start_enable" value="disarm" /><attribute name="sync_start_enable_available" value="arm" /><attribute name="waiting_for_supplier" value="0" /><buffer-attribute name="data_available" value="0" /><buffer-attribute name="direction" value="in" /><buffer-attribute name="length_align_bytes" value="8" /><debug-attribute name="pseudorandom_err_check" value="CH0 : PN9 : In Sync : OK" /><debug-attribute name="direct_reg_access" value="0x10" /></device><device id="iio:device7" name="ad4880_chb" ><channel id="voltage0" type="input" ><attribute name="lvds_cnv" filename="in_voltage0_lvds_cnv" value="1" /><attribute name="lvds_sync" filename="in_voltage0_lvds_sync" value="enable" /><attribute name="scale" filename="in_voltage0_scale" value="0.000005722" /></channel><channel id="voltage1" type="input" ><attribute name="lvds_cnv" filename="in_voltage1_lvds_cnv" value="1" /><attribute name="lvds_sync" filename="in_voltage1_lvds_sync" value="enable" /><attribute name="scale" filename="in_voltage1_scale" value="0.000005722" /></channel><attribute name="filter_sel" value="disabled" /><attribute name="filter_sel_available" value="disabled sinc1 sinc5 sinc5_plus_compensation" /><attribute name="sampling_frequency" value="40000000" /><attribute name="sinc_dec_rate" value="2" /><attribute name="sinc_dec_rate_available" value="2 4 8 16 32 64 128 256 512 1024" /><attribute name="sync_start_enable" value="disarm" /><attribute name="sync_start_enable_available" value="arm" /><attribute name="waiting_for_supplier" value="0" /><debug-attribute name="pseudorandom_err_check" value="CH0 : PN9 : In Sync : OK
CH1 : UNDEF : In Sync : PN Error" /><debug-attribute name="direct_reg_access" value="0x10" /></device><device id="iio_sysfs_trigger" ><attribute name="add_trigger" value="ERROR" /><attribute name="remove_trigger" value="ERROR" /></device></context>
10 changes: 9 additions & 1 deletion test/emu/hardware_map.yml
Original file line number Diff line number Diff line change
Expand Up @@ -790,4 +790,12 @@ ad7490:
- emulate:
- filename: ad7490.xml
- data_devices:
- iio:device0
- iio:device0
ad9508:
- ad9508
- pyadi_iio_class_support:
- ad9508
- emulate:
- filename: ad9508.xml
- data_devices:
- iio:device3
Loading