AD4130 Mbed IIO Firmware
Dependencies: tempsensors sdp_k1_sdram
scripts/ad4130.py@2:871d585d96ee, 2022-07-15 (annotated)
- 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?
User | Revision | Line number | New 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 |