X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/blobdiff_plain/498d20f05e125c355acf4bfccc9e35bb7461f9d5..99ce0ad895659a2e1ba26003d4b5f78e6471f8e4:/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 index 0000000..7040e25 --- /dev/null +++ b/src/adafruit_blinka/microcontroller/am65xx/pin.py @@ -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), +)