]> Repositories - Adafruit_Blinka-hackapet.git/blobdiff - src/adafruit_blinka/microcontroller/am65xx/pin.py
Added support for Siemens Simatic IOT2050 Basic/Advanced
[Adafruit_Blinka-hackapet.git] / src / adafruit_blinka / microcontroller / am65xx / pin.py
diff --git a/src/adafruit_blinka/microcontroller/am65xx/pin.py b/src/adafruit_blinka/microcontroller/am65xx/pin.py
new file mode 100644 (file)
index 0000000..7040e25
--- /dev/null
@@ -0,0 +1,199 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+# SPDX-FileCopyrightText: 2022 Martin Schnur for Siemens AG
+#
+# SPDX-License-Identifier: MIT
+"""TI AM65XX pin names"""
+
+import mraa
+
+
+class Pin:
+    """Pins don't exist in CPython so...lets make our own!"""
+
+    # pin modes
+    IN = 0
+    OUT = 1
+    ADC = 2
+    DAC = 3
+    PWM = 4
+    # pin values
+    LOW = 0
+    HIGH = 1
+    # pin pulls
+    PULL_NONE = 0
+    PULL_UP = 1
+    PULL_DOWN = 2
+
+    id = None
+    _value = LOW
+    _mode = IN
+
+    def __init__(self, pin_id=None):
+        self.id = pin_id
+        self._mode = None
+        self._pull = None
+        self._pin = None
+
+    def __repr__(self):
+        return str(self.id)
+
+    def __eq__(self, other):
+        return self.id == other
+
+    def init(self, mode=IN, pull=None):
+        """Initialize the Pin"""
+        if self.id is None:
+            raise RuntimeError("Can not init a None type pin.")
+        if mode is not None:
+            if mode == self.IN:
+                self._mode = self.IN
+                mypin = mraa.Gpio(self.id)
+                mypin.dir(mraa.DIR_IN)
+            elif mode == self.OUT:
+                self._mode = self.OUT
+                mypin = mraa.Gpio(self.id)
+                mypin.dir(mraa.DIR_OUT)
+            elif mode in (self.ADC, self.DAC):
+                # ADC (DAC not available) only available on Pin 0-5 (X12 Pin 1-6)
+                if self.id not in (0, 1, 2, 3, 4, 5):
+                    raise ValueError("Pin does not have ADC capabilities")
+                self._pin = mraa.Aio(self.id)
+            elif mode == self.PWM:
+                # PWM only available on Pin 4-9 (X10 Pin 1-2, X11 Pin 5-8)
+                if self.id not in (4, 5, 6, 7, 8, 9):
+                    raise ValueError("Pin does not have PWM capabilities")
+                return
+            else:
+                raise RuntimeError("Invalid mode for pin: %s" % self.id)
+            self._mode = mode
+        if pull is not None:
+            if self._mode != self.IN:
+                raise RuntimeError("Cannot set pull resistor on output")
+            if pull == self.PULL_UP:
+                mypin = mraa.Gpio(self.id)
+                mypin.dir(mraa.DIR_IN)
+            elif pull == self.PULL_DOWN:
+                mypin = mraa.Gpio(self.id)
+                mypin.dir(mraa.DIR_IN)
+            else:
+                raise RuntimeError("Invalid pull for pin: %s" % self.id)
+
+    def value(self, val=None):
+        """Set or return the Pin Value"""
+        # Digital In / Out
+        if self._mode in (Pin.IN, Pin.OUT):
+            if val is not None:
+                if val == self.LOW:
+                    self._value = val
+                    mypin = mraa.Gpio(self.id)
+                    mypin.write(0)
+                elif val == self.HIGH:
+                    self._value = val
+                    mypin = mraa.Gpio(self.id)
+                    mypin.write(1)
+                else:
+                    raise RuntimeError("Invalid value for pin")
+                return None
+            return mraa.Gpio.read(mraa.Gpio(self.id))
+        # Analog In
+        if self._mode == Pin.ADC:
+            if val is None:
+                # Read ADC here
+                mypin = mraa.Aio(self.id)
+                mypin.read()
+                return mypin.read()
+            # read only
+            raise AttributeError("'AnalogIn' object has no attribute 'value'")
+        # Analog Out
+        if self._mode == Pin.DAC:
+            """if val is None:
+                # write only
+                raise AttributeError("unreadable attribute")
+            # Set DAC here
+            mypin = mraa.Aio(self.id)
+            mypin.setBit(val)"""
+            raise AttributeError(
+                "AM65xx doesn't have an DAC! No Analog Output possible!"
+            )
+        raise RuntimeError(
+            "No action for mode {} with value {}".format(self._mode, val)
+        )
+
+
+# Digital Pins (GPIO 0-19)
+D0 = Pin(0)
+D1 = Pin(1)
+D2 = Pin(2)
+D3 = Pin(3)
+D4 = Pin(4)
+D5 = Pin(5)
+D6 = Pin(6)
+D7 = Pin(7)
+D8 = Pin(8)
+D9 = Pin(9)
+D10 = Pin(10)
+D11 = Pin(11)
+D12 = Pin(12)
+D13 = Pin(13)
+D14 = Pin(14)
+D15 = Pin(15)
+D16 = Pin(16)
+D17 = Pin(17)
+D18 = Pin(18)
+D19 = Pin(19)
+
+# Analog Pins (AIO 0-5, only ADC!)
+A0 = Pin(0)
+A1 = Pin(1)
+A2 = Pin(2)
+A3 = Pin(3)
+A4 = Pin(4)
+A5 = Pin(5)
+
+# I2C allocation
+I2C_SCL = "SCL"
+I2C_SDA = "SDA"
+
+# SPI allocation
+SPIO_SCLK = D13
+SPIO_MISO = D12
+SPIO_MOSI = D11
+SPIO_SS = D10
+
+# UART allocation
+UART_TX = "TX"
+UART_RX = "RX"
+
+# pwmOuts (GPIO 4-9)
+PWM_4 = D4
+PWM_5 = D5
+PWM_6 = D6
+PWM_7 = D7
+PWM_8 = D8
+PWM_9 = D9
+
+# I2C
+# ordered as sclID, sdaID
+# i2c-4 (/dev/i2c-4) -> X10 Pin9, Pin10 (SDA, SCL)
+i2cPorts = ((4, I2C_SCL, I2C_SDA),)
+
+# SPI
+# ordered as spiId, sckId, mosiID, misoID
+spiPorts = ((0, SPIO_SCLK, SPIO_MOSI, SPIO_MISO),)
+
+# UART
+# use pySerial = dev/ttyS1
+# ordered as uartID, txID, rxID
+uartPorts = ((0, UART_TX, UART_RX),)
+
+# PWM
+pwmOuts = (
+    ((0, 0), PWM_4),
+    ((0, 1), PWM_5),
+    ((2, 0), PWM_6),
+    ((2, 1), PWM_7),
+    ((4, 0), PWM_8),
+    ((4, 1), PWM_9),
+)