From: Limor "Ladyada" Fried Date: Mon, 3 Dec 2018 21:15:13 +0000 (-0800) Subject: Merge pull request #59 from ladyada/orangepipc X-Git-Tag: 0.4.0 X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/commitdiff_plain/cded5ff7f49a269af4c6e9541de9afe406e53239?hp=4846a3ff5a0df9d3a04fc09ea86709c6070daeec Merge pull request #59 from ladyada/orangepipc libgpiod & orangepipc support --- diff --git a/src/adafruit_blinka/agnostic/__init__.py b/src/adafruit_blinka/agnostic/__init__.py index 0327ae9..1d93e6c 100755 --- a/src/adafruit_blinka/agnostic/__init__.py +++ b/src/adafruit_blinka/agnostic/__init__.py @@ -21,16 +21,27 @@ if platform is not None: platform = "stm32" board_id = "pyboard" elif platform == "linux": - from Adafruit_GPIO import Platform - if Platform.platform_detect() == Platform.RASPBERRY_PI: - if Platform.pi_version() == 1: - board_id = "raspi_1" - elif Platform.pi_version() == 2: - board_id = "raspi_2" - elif Platform.pi_version() == 3: - board_id = "raspi_3" - elif Platform.platform_detect() == Platform.BEAGLEBONE_BLACK: - board_id = "beaglebone_black" + import re + # we're going to redo the Platform detection, this is a terrible hack + # for now. + try: + # lets see if we're an armbian board + for line in open("/etc/armbian-release", 'r'): + #print(line) + m = re.search('BOARD=(.*)', line) + if m: + board_id = m.group(1) + except: + from Adafruit_GPIO import Platform + if Platform.platform_detect() == Platform.RASPBERRY_PI: + if Platform.pi_version() == 1: + board_id = "raspi_1" + elif Platform.pi_version() == 2: + board_id = "raspi_2" + elif Platform.pi_version() == 3: + board_id = "raspi_3" + elif Platform.platform_detect() == Platform.BEAGLEBONE_BLACK: + board_id = "beaglebone_black" implementation = sys.implementation.name if implementation == "micropython": diff --git a/src/adafruit_blinka/board/orangepipc.py b/src/adafruit_blinka/board/orangepipc.py new file mode 100644 index 0000000..e5ab3ef --- /dev/null +++ b/src/adafruit_blinka/board/orangepipc.py @@ -0,0 +1,39 @@ +from adafruit_blinka.microcontroller.allwinner_h3 import pin + +PA12 = pin.PA12 +SDA = pin.PA12 +PA11 = pin.PA11 +SCL = pin.PA11 +PA6 = pin.PA6 +PA1 = pin.PA1 +PA0 = pin.PA0 +PA3 = pin.PA3 +PC0 = pin.PC0 +MOSI = pin.PC0 +PC1 = pin.PC1 +MISO = pin.PC1 +PC2 = pin.PC2 +SCK = pin.PC2 +SCLK = pin.PC2 +PA19 = pin.PA19 +PA7 = pin.PA7 +PA8 = pin.PA8 +PA9 = pin.PA9 +PA10 = pin.PA10 +PA20 = pin.PA20 + +PA13 = pin.PA13 +TX = pin.PA13 +PA14 = pin.PA14 +RX = pin.PA14 +PD14 = pin.PD14 +PC4 = pin.PC4 +PC7 = pin.PC7 +PA2 = pin.PA2 +PC3 = pin.PC3 +PA21 = pin.PA21 +PA18 = pin.PA18 +PG8 = pin.PG8 +PG9 = pin.PG9 +PG6 = pin.PG6 +PG7 = pin.PG7 diff --git a/src/adafruit_blinka/microcontroller/allwinner_h3/__init__.py b/src/adafruit_blinka/microcontroller/allwinner_h3/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/adafruit_blinka/microcontroller/allwinner_h3/pin.py b/src/adafruit_blinka/microcontroller/allwinner_h3/pin.py new file mode 100644 index 0000000..6961d48 --- /dev/null +++ b/src/adafruit_blinka/microcontroller/allwinner_h3/pin.py @@ -0,0 +1,47 @@ +from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin + +PA0 = Pin(0) +PA1 = Pin(1) +PA2 = Pin(2) +PA3 = Pin(3) +PA6 = Pin(6) +PA7 = Pin(7) +PA8 = Pin(8) +PA9 = Pin(9) +PA10 = Pin(10) +PA11 = Pin(11) +TWI0_SCL = PA11 +PA12 = Pin(12) +TWI0_SDA = PA12 +PA13 = Pin(13) +UART3_TX = PA13 +PA14 = Pin(14) +UART3_RX = PA14 +PA18 = Pin(18) +PA19 = Pin(19) +PA20 = Pin(20) +PA21 = Pin(21) + +PC0 = Pin(64) +SPI0_MOSI = PC0 +PC1 = Pin(65) +SPI0_MISO = PC1 +PC2 = Pin(66) +SPI0_SCLK = PC2 +PC3 = Pin(67) +SPI0_CS = PC3 +PC4 = Pin(68) +PC7 = Pin(71) + +PD14 = Pin(110) + +PG6 = Pin(198) +PG7 = Pin(199) +PG8 = Pin(200) +PG9 = Pin(201) + +i2cPorts = ( (0, TWI0_SCL, TWI0_SDA), ) +# ordered as spiId, sckId, mosiId, misoId +spiPorts = ( (0, SPI0_SCLK, SPI0_MOSI, SPI0_MISO), ) +# ordered as uartId, txId, rxId +uartPorts = ( (3, UART3_TX, UART3_RX), ) diff --git a/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py b/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py new file mode 100644 index 0000000..396a94c --- /dev/null +++ b/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py @@ -0,0 +1,74 @@ +try: + import gpiod +except ImportError: + raise ImportError("libgpiod Python bindings not found, please install and try again! See https://github.com/adafruit/Raspberry-Pi-Installer-Scripts/blob/master/libgpiod.sh") + +# Pins dont exist in CPython so...lets make our own! +class Pin: + IN = 0 + OUT = 1 + LOW = 0 + HIGH = 1 + PULL_NONE = 0 + PULL_UP = 1 + PULL_DOWN = 2 + _CONSUMER = 'adafruit_blinka' + + id = None + _value = LOW + _mode = IN + + def __init__(self, pin_number, gpiod_chipname="gpiochip0"): + self.id = int(pin_number) + # FIXME: Presumably this might vary by system: + self._chip = gpiod.Chip(gpiod_chipname, gpiod.Chip.OPEN_BY_NAME) + self._line = None + + def __repr__(self): + return str(self.id) + + def __eq__(self, other): + return self.id == other + + def init(self, mode=IN, pull=None): + if not self._line: + self._line = self._chip.get_line(int(self.id)) + #print("init line: ", int(self.id), self._line) + + if mode != None: + if mode == self.IN: + flags = 0 + if pull != None: + if pull == self.PULL_UP: + raise NotImplementedError("Internal pullups not supported in libgpiod, use physical resistor instead!") + elif pull == self.PULL_DOWN: + raise NotImplementedError("Internal pulldowns not supported in libgpiod, use physical resistor instead!") + else: + raise RuntimeError("Invalid pull for pin: %s" % self.id) + + self._mode = self.IN + self._line.release() + self._line.request(consumer=self._CONSUMER, + type=gpiod.LINE_REQ_DIR_IN, + flags=flags) + + elif mode == self.OUT: + if pull != None: + raise RuntimeError("Cannot set pull resistor on output") + self._mode = self.OUT + self._line.release() + self._line.request(consumer=self._CONSUMER, + type=gpiod.LINE_REQ_DIR_OUT) + + else: + raise RuntimeError("Invalid mode for pin: %s" % self.id) + + def value(self, val=None): + if val != None: + if val in (self.LOW, self.HIGH): + self._value = val + self._line.set_value(val) + else: + raise RuntimeError("Invalid value for pin") + else: + return self._line.get_value() diff --git a/src/board.py b/src/board.py index 4dab385..d4e6be0 100755 --- a/src/board.py +++ b/src/board.py @@ -41,6 +41,8 @@ elif board_id == "raspi_2" or board_id == "raspi_3": from adafruit_blinka.board.raspi_23 import * elif board_id == "beaglebone_black": from adafruit_blinka.board.beaglebone_black import * +elif board_id == "orangepipc": + from adafruit_blinka.board.orangepipc import * elif "sphinx" in sys.modules: pass else: diff --git a/src/busio.py b/src/busio.py index 1576ac9..f82e4c3 100755 --- a/src/busio.py +++ b/src/busio.py @@ -16,7 +16,7 @@ class I2C(Lockable): def init(self, scl, sda, frequency): self.deinit() - if board_id == "raspi_3" or board_id == "raspi_2" or board_id == "beaglebone_black": + if board_id in ("raspi_3", "raspi_2", "beaglebone_black", "orangepipc"): from adafruit_blinka.microcontroller.generic_linux.i2c import I2C as _I2C else: from machine import I2C as _I2C @@ -69,23 +69,16 @@ class I2C(Lockable): class SPI(Lockable): def __init__(self, clock, MOSI=None, MISO=None): - print("SPI(): __init()") self.deinit() - if board_id == "raspi_3" or board_id == "raspi_2" or board_id == "beaglebone_black": + if board_id in ("raspi_3", "raspi_2", "beaglebone_black", "orangepipc"): from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI else: from machine import SPI as _SPI from microcontroller.pin import spiPorts - print("spiPorts: {0}".format(spiPorts)) - print("for:") for portId, portSck, portMosi, portMiso in spiPorts: - print(portId, portSck, portMosi, portMiso) if ((clock == portSck) and # Clock is required! (MOSI == portMosi or MOSI == None) and # But can do with just output (MISO == portMiso or MISO == None)): # Or just input - print("Line 91") - print(_SPI) - print(_SPI(portId)) self._spi = _SPI(portId) self._pins = (portSck, portMosi, portMiso) break @@ -102,6 +95,9 @@ class SPI(Lockable): # reuse the raspberry pi class as both boards use Linux spidev from adafruit_blinka.microcontroller.beaglebone_black.pin import Pin from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI + elif board_id == "orangepipc": + from adafruit_blinka.microcontroller.allwinner_h3.pin import Pin + from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI else: from machine import SPI as _SPI from machine import Pin diff --git a/src/digitalio.py b/src/digitalio.py index 2ad41bc..40f42ad 100755 --- a/src/digitalio.py +++ b/src/digitalio.py @@ -10,8 +10,10 @@ See `CircuitPython:digitalio` in CircuitPython for more details. from adafruit_blinka.agnostic import board_id if board_id == "raspi_3" or board_id == "raspi_2": from adafruit_blinka.microcontroller.raspi_23.pin import Pin -if board_id == "beaglebone_black": +elif board_id == "beaglebone_black": from adafruit_blinka.microcontroller.beaglebone_black.pin import Pin +elif board_id == "orangepipc": + from adafruit_blinka.microcontroller.allwinner_h3.pin import Pin elif board_id == "pyboard": from machine import Pin from adafruit_blinka import Enum, ContextManaged diff --git a/src/microcontroller/__init__.py b/src/microcontroller/__init__.py index e6e6c54..3bd5b51 100755 --- a/src/microcontroller/__init__.py +++ b/src/microcontroller/__init__.py @@ -32,6 +32,8 @@ elif platform == "linux": from adafruit_blinka.microcontroller.raspi_23 import * elif board_id == "beaglebone_black": from adafruit_blinka.microcontroller.beaglebone_black import * + elif board_id == "orangepipc": + from adafruit_blinka.microcontroller.allwinner_h3 import * else: raise NotImplementedError("Board not supported:", board_id) else: diff --git a/src/microcontroller/pin.py b/src/microcontroller/pin.py index d1f0d8b..9ccd81f 100755 --- a/src/microcontroller/pin.py +++ b/src/microcontroller/pin.py @@ -4,7 +4,6 @@ from adafruit_blinka import agnostic # We intentionally are patching into this namespace so skip the wildcard check. # pylint: disable=unused-wildcard-import,wildcard-import - if agnostic.platform == "esp8266": from adafruit_blinka.microcontroller.esp8266.pin import * elif agnostic.platform == "stm32": @@ -14,6 +13,8 @@ elif agnostic.platform == "linux": from adafruit_blinka.microcontroller.raspi_23.pin import * elif agnostic.board_id == "beaglebone_black": from adafruit_blinka.microcontroller.beaglebone_black.pin import * + elif agnostic.board_id == "orangepipc": + from adafruit_blinka.microcontroller.allwinner_h3.pin import * else: raise NotImplementedError("Board not supported: ", agnostic.board_id) else: