X-Git-Url: https://git.ayoreis.com/hackapet/Adafruit_Blinka.git/blobdiff_plain/b7bfa06a5bde8ed679a6b9b79f98111949175779..76ca3e6a3c4c2f2695d96bdb0ee2db66d3f0f32c:/src/busio.py diff --git a/src/busio.py b/src/busio.py index f5a93af..73c88ef 100755 --- a/src/busio.py +++ b/src/busio.py @@ -7,25 +7,23 @@ See `CircuitPython:busio` in CircuitPython for more details. * Author(s): cefn """ +import threading + from adafruit_blinka import Enum, Lockable, agnostic -from adafruit_blinka.agnostic import board_id +from adafruit_blinka.agnostic import board_id, detector import adafruit_platformdetect.board as ap_board -EMBEDDED_LINUX_BOARDS = ( - ap_board.RASPBERRY_PI_2B, - ap_board.RASPBERRY_PI_3B, - ap_board.RASPBERRY_PI_3B_PLUS, - ap_board.BEAGLEBONE_BLACK, - ap_board.ORANGE_PI_PC, -) - class I2C(Lockable): def __init__(self, scl, sda, frequency=400000): self.init(scl, sda, frequency) def init(self, scl, sda, frequency): self.deinit() - if board_id in EMBEDDED_LINUX_BOARDS: + if detector.board.ftdi_ft232h: + from adafruit_blinka.microcontroller.ft232h.i2c import I2C + self._i2c = I2C() + return + elif detector.board.any_embedded_linux: from adafruit_blinka.microcontroller.generic_linux.i2c import I2C as _I2C else: from machine import I2C as _I2C @@ -36,9 +34,11 @@ class I2C(Lockable): break else: raise NotImplementedError( - "No Hardware I2C on (scl,sda)={}\nValid UART ports: {}".format((scl, sda), i2cPorts) + "No Hardware I2C on (scl,sda)={}\nValid I2C ports: {}".format((scl, sda), i2cPorts) ) + self._lock = threading.RLock() + def deinit(self): try: del self._i2c @@ -46,9 +46,11 @@ class I2C(Lockable): pass def __enter__(self): + self._lock.acquire() return self def __exit__(self, exc_type, exc_value, traceback): + self._lock.release() self.deinit() def scan(self): @@ -80,7 +82,13 @@ class I2C(Lockable): class SPI(Lockable): def __init__(self, clock, MOSI=None, MISO=None): self.deinit() - if board_id in EMBEDDED_LINUX_BOARDS: + if detector.board.ftdi_ft232h: + from adafruit_blinka.microcontroller.ft232h.spi import SPI as _SPI + from adafruit_blinka.microcontroller.ft232h.pin import SCK, MOSI, MISO + self._spi = _SPI() + self._pins = (SCK, MOSI, MISO) + return + elif detector.board.any_embedded_linux: from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI else: from machine import SPI as _SPI @@ -98,15 +106,42 @@ class SPI(Lockable): format((clock, MOSI, MISO), spiPorts)) def configure(self, baudrate=100000, polarity=0, phase=0, bits=8): - if board_id in ap_board.ANY_RASPBERRY_PI_2_OR_3: + if detector.board.any_raspberry_pi or detector.board.any_raspberry_pi_40_pin: from adafruit_blinka.microcontroller.bcm283x.pin import Pin from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI - elif board_id == ap_board.BEAGLEBONE_BLACK: + elif detector.board.any_beaglebone: from adafruit_blinka.microcontroller.am335x.pin import Pin from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI - elif board_id == ap_board.ORANGE_PI_PC: + elif board_id == ap_board.ORANGE_PI_PC or board_id == ap_board.ORANGE_PI_R1 or board_id == ap_board.ORANGE_PI_ZERO: from adafruit_blinka.microcontroller.allwinner_h3.pin import Pin from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI + elif board_id == ap_board.GIANT_BOARD: + from adafruit_blinka.microcontroller.sama5.pin import Pin + from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI + elif board_id == ap_board.CORAL_EDGE_TPU_DEV: + from adafruit_blinka.microcontroller.nxp_imx8m.pin import Pin + from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI + elif board_id == ap_board.ODROID_C2: + from adafruit_blinka.microcontroller.amlogic.s905.pin import Pin + from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI + elif board_id == ap_board.DRAGONBOARD_410C: + from adafruit_blinka.microcontroller.snapdragon.apq8016.pin import Pin + from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI + elif board_id == ap_board.JETSON_NANO: + from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI + from adafruit_blinka.microcontroller.tegra.t210.pin import Pin + elif board_id == ap_board.JETSON_TX1: + from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI + from adafruit_blinka.microcontroller.tegra.t210.pin import Pin + elif board_id == ap_board.JETSON_TX2: + from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI + from adafruit_blinka.microcontroller.tegra.t186.pin import Pin + elif board_id == ap_board.JETSON_XAVIER: + from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI + from adafruit_blinka.microcontroller.tegra.t194.pin import Pin + elif detector.board.ftdi_ft232h: + from adafruit_blinka.microcontroller.ft232h.spi import SPI as _SPI + from adafruit_blinka.microcontroller.ft232h.pin import Pin else: from machine import SPI as _SPI from machine import Pin @@ -130,11 +165,18 @@ class SPI(Lockable): self._spi = None self._pinIds = None + @property + def frequency(self): + try: + return self._spi.frequency + except AttributeError: + raise NotImplementedError("Frequency attribute not implemented for this platform") + def write(self, buf, start=0, end=None): return self._spi.write(buf, start, end) def readinto(self, buf, start=0, end=None, write_value=0): - return self._spi.readinto(buf, start, end) + return self._spi.readinto(buf, start, end, write_value=write_value) def write_readinto(self, buffer_out, buffer_in, out_start=0, out_end=None, in_start=0, in_end=None): return self._spi.write_readinto(buffer_out, buffer_in, out_start, out_end, in_start, in_end) @@ -157,7 +199,10 @@ class UART(Lockable): timeout=1000, receiver_buffer_size=64, flow=None): - from machine import UART as _UART + if detector.board.any_embedded_linux: + raise RuntimeError('busio.UART not supported on this platform. Please use pyserial instead.') + else: + from machine import UART as _UART from microcontroller.pin import uartPorts self.baudrate = baudrate