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":
--- /dev/null
+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
--- /dev/null
+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), )
--- /dev/null
+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()
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:
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
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
# 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
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
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:
# 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":
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: