AD4130 Mbed IIO Firmware

Dependencies:   tempsensors sdp_k1_sdram

Committer:
MPhalke@MPHALKE-L02.ad.analog.com
Date:
Fri Jul 15 17:47:44 2022 +0530
Revision:
2:871d585d96ee
AD4130 firmware - initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 1 # Copyright (C) 2021 Analog Devices, Inc.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 2 #
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 3 # All rights reserved.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 4 #
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 5 # Redistribution and use in source and binary forms, with or without modification,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 6 # are permitted provided that the following conditions are met:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 7 # - Redistributions of source code must retain the above copyright
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 8 # notice, this list of conditions and the following disclaimer.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 9 # - Redistributions in binary form must reproduce the above copyright
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 10 # notice, this list of conditions and the following disclaimer in
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 11 # the documentation and/or other materials provided with the
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 12 # distribution.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 13 # - Neither the name of Analog Devices, Inc. nor the names of its
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 14 # contributors may be used to endorse or promote products derived
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 15 # from this software without specific prior written permission.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 16 # - The use of this software may or may not infringe the patent rights
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 17 # of one or more patent holders. This license does not release you
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 18 # from the requirement that you obtain separate licenses from these
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 19 # patent holders to use this software.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 20 # - Use of the software either in source or binary form, must be run
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 21 # on or directly connected to an Analog Devices Inc. component.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 22 #
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 23 # THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 24 # INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 25 # PARTICULAR PURPOSE ARE DISCLAIMED.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 26 #
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 27 # IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 28 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 29 # RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 30 # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 31 # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 32 # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 33
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 34
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 35 from decimal import Decimal
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 36
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 37 import numpy as np
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 38 from adi.attribute import attribute
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 39 from adi.context_manager import context_manager
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 40 from adi.rx_tx import rx
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 41
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 42
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 43 class ad4130(rx, context_manager):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 44 """ AD4130 ADC """
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 45
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 46 _complex_data = False
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 47 channel = [] # type: ignore
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 48 _device_name = ""
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 49
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 50 def __init__(self, uri="", device_name=""):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 51
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 52 context_manager.__init__(self, uri, self._device_name)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 53
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 54 compatible_parts = [
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 55 "ad4130"
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 56 ]
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 57
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 58 self._ctrl = None
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 59
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 60 if not device_name:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 61 device_name = compatible_parts[0]
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 62 else:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 63 if device_name not in compatible_parts:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 64 raise Exception("Not a compatible device: " + device_name)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 65
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 66 # Select the device matching device_name as working device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 67 for device in self._ctx.devices:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 68 if device.name == device_name:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 69 self._ctrl = device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 70 self._rxadc = device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 71 break
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 72
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 73 for ch in self._ctrl.channels:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 74 name = ch._id
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 75 self._rx_channel_names.append(name)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 76 self.channel.append(self._channel(self._ctrl, name))
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 77
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 78 rx.__init__(self)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 79
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 80
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 81 class _channel(attribute):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 82 """AD4130 channel"""
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 83
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 84 def __init__(self, ctrl, channel_name):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 85 self.name = channel_name
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 86 self._ctrl = ctrl
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 87
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 88 @property
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 89 def raw(self):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 90 """AD4130 channel raw value"""
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 91 return self._get_iio_attr(self.name, "raw", False)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 92
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 93 @property
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 94 def offset(self):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 95 """AD4130 channel offset"""
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 96 return float(self._get_iio_attr_str(self.name, "offset", False))
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 97
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 98 @offset.setter
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 99 def offset(self, value):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 100 self._set_iio_attr(self.name, "offset", False, str(Decimal(value).real))
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 101
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 102 @property
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 103 def scale(self):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 104 """AD4130 channel scale"""
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 105 return float(self._get_iio_attr_str(self.name, "scale", False))
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 106
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 107 @scale.setter
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 108 def scale(self, value):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 109 self._set_iio_attr(self.name, "scale", False, str(Decimal(value).real))
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 110
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 111
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 112 def to_volts(self, index, val):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 113 """Converts raw value to SI"""
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 114 _scale = self.channel[index].scale
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 115
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 116 ret = None
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 117
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 118 if isinstance(val, np.int16):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 119 ret = val * _scale
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 120
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 121 if isinstance(val, np.ndarray):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 122 ret = [x * _scale for x in val]
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 123
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 124 return ret