From: Franklin Harding Date: Wed, 17 Jun 2020 16:13:30 +0000 (-0700) Subject: Add support for FT2232H "microcontroller" X-Git-Tag: 6.9.2~2^2~7 X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/commitdiff_plain/30d6cd0ac14df67350f14f67a5fa52eb43e59838?ds=inline;hp=-c Add support for FT2232H "microcontroller" --- 30d6cd0ac14df67350f14f67a5fa52eb43e59838 diff --git a/src/adafruit_blinka/board/ftdi_ft2232h.py b/src/adafruit_blinka/board/ftdi_ft2232h.py new file mode 100644 index 0000000..6849127 --- /dev/null +++ b/src/adafruit_blinka/board/ftdi_ft2232h.py @@ -0,0 +1,46 @@ +"""Pin definitions for the FTDI FT2232H""" +from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h import pin + +# MPSSE A +AD4 = pin.AD4 +AD5 = pin.AD5 +AD6 = pin.AD6 +AD7 = pin.AD7 +AC0 = pin.AC0 +AC1 = pin.AC1 +AC2 = pin.AC2 +AC3 = pin.AC3 +AC4 = pin.AC4 +AC5 = pin.AC5 +AC6 = pin.AC6 +AC7 = pin.AC7 + +SDA0 = pin.SDA0 +SCL0 = pin.SCL0 + +SCK0 = pin.SCK0 +SCLK0 = pin.SCLK0 +MOSI0 = pin.MOSI0 +MISO0 = pin.MISO0 + +# MPSSE B +BD4 = pin.BD4 +BD5 = pin.BD5 +BD6 = pin.BD6 +BD7 = pin.BD7 +BC0 = pin.BC0 +BC1 = pin.BC1 +BC2 = pin.BC2 +BC3 = pin.BC3 +BC4 = pin.BC4 +BC5 = pin.BC5 +BC6 = pin.BC6 +BC7 = pin.BC7 + +SDA1 = pin.SDA1 +SCL1 = pin.SCL1 + +SCK1 = pin.SCK1 +SCLK1 = pin.SCLK1 +MOSI1 = pin.MOSI1 +MISO1 = pin.MISO1 diff --git a/src/adafruit_blinka/board/ftdi_ft232h.py b/src/adafruit_blinka/board/ftdi_ft232h.py index ea3fd6e..1d6a867 100644 --- a/src/adafruit_blinka/board/ftdi_ft232h.py +++ b/src/adafruit_blinka/board/ftdi_ft232h.py @@ -1,5 +1,5 @@ """Pin definitions for the FTDI FT232H""" -from adafruit_blinka.microcontroller.ft232h import pin +from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h import pin D4 = pin.D4 D5 = pin.D5 diff --git a/src/adafruit_blinka/microcontroller/ft232h/__init__.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/__init__.py similarity index 100% rename from src/adafruit_blinka/microcontroller/ft232h/__init__.py rename to src/adafruit_blinka/microcontroller/ftdi_mpsse/__init__.py diff --git a/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft2232h/__init__.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft2232h/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft2232h/pin.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft2232h/pin.py new file mode 100644 index 0000000..efd5ff7 --- /dev/null +++ b/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft2232h/pin.py @@ -0,0 +1,53 @@ +from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.pin import Pin + +# See https://eblot.github.io/pyftdi/pinout.html for detailed FTDI device pinout information + +# MPSSE Port A +AD4 = Pin(4, url="ftdi://ftdi:ft2232h/1") +AD5 = Pin(5, url="ftdi://ftdi:ft2232h/1") +AD6 = Pin(6, url="ftdi://ftdi:ft2232h/1") +AD7 = Pin(7, url="ftdi://ftdi:ft2232h/1") +AC0 = Pin(8, url="ftdi://ftdi:ft2232h/1") +AC1 = Pin(9, url="ftdi://ftdi:ft2232h/1") +AC2 = Pin(10, url="ftdi://ftdi:ft2232h/1") +AC3 = Pin(11, url="ftdi://ftdi:ft2232h/1") +AC4 = Pin(12, url="ftdi://ftdi:ft2232h/1") +AC5 = Pin(13, url="ftdi://ftdi:ft2232h/1") +AC6 = Pin(14, url="ftdi://ftdi:ft2232h/1") +AC7 = Pin(15, url="ftdi://ftdi:ft2232h/1") + +SCL0 = Pin(url="ftdi://ftdi:ft2232h/1") +SDA0 = Pin(url="ftdi://ftdi:ft2232h/1") +SCK0 = SCLK0 = Pin(url="ftdi://ftdi:ft2232h/1") +MOSI0 = Pin(url="ftdi://ftdi:ft2232h/1") +MISO0 = Pin(url="ftdi://ftdi:ft2232h/1") + +# MPSSE Port B +BD4 = Pin(4, url="ftdi://ftdi:ft2232h/2") +BD5 = Pin(5, url="ftdi://ftdi:ft2232h/2") +BD6 = Pin(6, url="ftdi://ftdi:ft2232h/2") +BD7 = Pin(7, url="ftdi://ftdi:ft2232h/2") +BC0 = Pin(8, url="ftdi://ftdi:ft2232h/2") +BC1 = Pin(9, url="ftdi://ftdi:ft2232h/2") +BC2 = Pin(10, url="ftdi://ftdi:ft2232h/2") +BC3 = Pin(11, url="ftdi://ftdi:ft2232h/2") +BC4 = Pin(12, url="ftdi://ftdi:ft2232h/2") +BC5 = Pin(13, url="ftdi://ftdi:ft2232h/2") +BC6 = Pin(14, url="ftdi://ftdi:ft2232h/2") +BC7 = Pin(15, url="ftdi://ftdi:ft2232h/2") + +SCL1 = Pin(url="ftdi://ftdi:ft2232h/2") +SDA1 = Pin(url="ftdi://ftdi:ft2232h/2") +SCK1 = SCLK1 = Pin(url="ftdi://ftdi:ft2232h/2") +MOSI1 = Pin(url="ftdi://ftdi:ft2232h/2") +MISO1 = Pin(url="ftdi://ftdi:ft2232h/2") + +i2cPorts = ( + (0, SCL0, SDA0), + (1, SCL1, SDA1), +) + +spiPorts = ( + (0, SCLK0, MOSI0, MISO0), + (1, SCLK1, MOSI1, MISO1), +) diff --git a/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft232h/__init__.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft232h/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft232h/pin.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft232h/pin.py new file mode 100644 index 0000000..e64805c --- /dev/null +++ b/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft232h/pin.py @@ -0,0 +1,23 @@ +from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.pin import Pin + +# See https://eblot.github.io/pyftdi/pinout.html for detailed FTDI device pinout information + +# MPSSE Port A +D4 = Pin(4) +D5 = Pin(5) +D6 = Pin(6) +D7 = Pin(7) +C0 = Pin(8) +C1 = Pin(9) +C2 = Pin(10) +C3 = Pin(11) +C4 = Pin(12) +C5 = Pin(13) +C6 = Pin(14) +C7 = Pin(15) + +SCL = Pin() +SDA = Pin() +SCK = SCLK = Pin() +MOSI = Pin() +MISO = Pin() \ No newline at end of file diff --git a/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/__init__.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/adafruit_blinka/microcontroller/ft232h/i2c.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/i2c.py similarity index 72% rename from src/adafruit_blinka/microcontroller/ft232h/i2c.py rename to src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/i2c.py index 2d21f15..762dd71 100644 --- a/src/adafruit_blinka/microcontroller/ft232h/i2c.py +++ b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/i2c.py @@ -1,11 +1,19 @@ -"""I2C Class for FT232H""" -from adafruit_blinka.microcontroller.ft232h.pin import Pin - +"""I2C Class for FTDI MPSSE""" +from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.pin import Pin class I2C: - """Custom I2C Class for FT232H""" + """Custom I2C Class for FTDI MPSSE""" + + MASTER = 0 + SLAVE = 1 + _mode = None + + # pylint: disable=unused-argument + def __init__(self, id=None, mode=MASTER, baudrate=None, frequency=400000): + if mode != self.MASTER: + raise NotImplementedError("Only I2C Master supported!") + _mode = self.MASTER - def __init__(self, *, frequency=400000): # change GPIO controller to I2C # pylint: disable=import-outside-toplevel from pyftdi.i2c import I2cController @@ -13,8 +21,11 @@ class I2C: # pylint: enable=import-outside-toplevel self._i2c = I2cController() - self._i2c.configure("ftdi://ftdi:ft232h/1", frequency=frequency) - Pin.ft232h_gpio = self._i2c.get_gpio() + if id is None: + self._i2c.configure("ftdi://ftdi:ft232h/1", frequency=frequency) + else: + self._i2c.configure("ftdi://ftdi:ft2232h/{}".format(id+1), frequency=frequency) + Pin.mpsse_gpio = self._i2c.get_gpio() def scan(self): """Perform an I2C Device Scan""" diff --git a/src/adafruit_blinka/microcontroller/ft232h/pin.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/pin.py similarity index 57% rename from src/adafruit_blinka/microcontroller/ft232h/pin.py rename to src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/pin.py index 94b8e14..6a0ea93 100644 --- a/src/adafruit_blinka/microcontroller/ft232h/pin.py +++ b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/pin.py @@ -1,31 +1,31 @@ -"""FT232H pin names""" +"""MPSSE pin names""" class Pin: - """A basic Pin class for use with FT232H.""" + """A basic Pin class for use with FTDI MPSSEs.""" IN = 0 OUT = 1 LOW = 0 HIGH = 1 - ft232h_gpio = None + mpsse_gpio = None - def __init__(self, pin_id=None): + def __init__(self, pin_id=None, url="ftdi://ftdi:ft232h/1"): # setup GPIO controller if not done yet # use one provided by I2C as default - if not Pin.ft232h_gpio: + if not Pin.mpsse_gpio: # pylint: disable=import-outside-toplevel from pyftdi.i2c import I2cController # pylint: enable=import-outside-toplevel i2c = I2cController() - i2c.configure("ftdi://ftdi:ft232h/1") - Pin.ft232h_gpio = i2c.get_gpio() + i2c.configure(url) + Pin.mpsse_gpio = i2c.get_gpio() # check if pin is valid if pin_id: - if Pin.ft232h_gpio.all_pins & 1 << pin_id == 0: + if Pin.mpsse_gpio.all_pins & 1 << pin_id == 0: raise ValueError("Can not use pin {} as GPIO.".format(pin_id)) # ID is just bit position self.id = pin_id @@ -34,22 +34,22 @@ class Pin: """Initialize the Pin""" if not self.id: raise RuntimeError("Can not init a None type pin.") - # FT232H does't have configurable internal pulls? + # MPSSE does't have configurable internal pulls? if pull: raise ValueError("Internal pull up/down not currently supported.") - pin_mask = Pin.ft232h_gpio.pins | 1 << self.id - current = Pin.ft232h_gpio.direction + pin_mask = Pin.mpsse_gpio.pins | 1 << self.id + current = Pin.mpsse_gpio.direction if mode == self.OUT: current |= 1 << self.id else: current &= ~(1 << self.id) - Pin.ft232h_gpio.set_direction(pin_mask, current) + Pin.mpsse_gpio.set_direction(pin_mask, current) def value(self, val=None): """Set or return the Pin Value""" if not self.id: raise RuntimeError("Can not access a None type pin.") - current = Pin.ft232h_gpio.read(with_output=True) + current = Pin.mpsse_gpio.read(with_output=True) # read if val is None: return 1 if current & 1 << self.id != 0 else 0 @@ -60,31 +60,7 @@ class Pin: else: current &= ~(1 << self.id) # must mask out any input pins - Pin.ft232h_gpio.write(current & Pin.ft232h_gpio.direction) + Pin.mpsse_gpio.write(current & Pin.mpsse_gpio.direction) return None # release the kraken - raise RuntimeError("Invalid value for pin") - - -# create pin instances for each pin -# D0 to D3 are used by I2C/SPI -D4 = Pin(4) -D5 = Pin(5) -D6 = Pin(6) -D7 = Pin(7) -C0 = Pin(8) -C1 = Pin(9) -C2 = Pin(10) -C3 = Pin(11) -C4 = Pin(12) -C5 = Pin(13) -C6 = Pin(14) -C7 = Pin(15) -# C8 and C9 are not GPIO - -# create None type pins for I2C and SPI since they are expected to be defined -SCL = Pin() -SDA = Pin() -SCK = SCLK = Pin() -MOSI = Pin() -MISO = Pin() + raise RuntimeError("Invalid value for pin") \ No newline at end of file diff --git a/src/adafruit_blinka/microcontroller/ft232h/spi.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/spi.py similarity index 86% rename from src/adafruit_blinka/microcontroller/ft232h/spi.py rename to src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/spi.py index afdf314..69fe66f 100644 --- a/src/adafruit_blinka/microcontroller/ft232h/spi.py +++ b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/spi.py @@ -1,26 +1,29 @@ -"""SPI Class for FT232H""" -from adafruit_blinka.microcontroller.ft232h.pin import Pin +"""SPI Class for FTDI MPSSE""" +from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.pin import Pin # pylint: disable=protected-access class SPI: - """Custom SPI Class for FT232H""" + """Custom SPI Class for FTDI MPSSE""" MSB = 0 - def __init__(self): + def __init__(self, id=None): # pylint: disable=import-outside-toplevel from pyftdi.spi import SpiController # pylint: enable=import-outside-toplevel self._spi = SpiController(cs_count=1) - self._spi.configure("ftdi://ftdi:ft232h/1") + if id is None: + self._spi.configure("ftdi://ftdi:ft232h/1", frequency=frequency) + else + self._spi.configure("ftdi://ftdi:ft2232h/{}".format(id+1), frequency=frequency) self._port = self._spi.get_port(0) self._port.set_frequency(100000) self._port._cpol = 0 self._port._cpha = 0 # Change GPIO controller to SPI - Pin.ft232h_gpio = self._spi.get_gpio() + Pin.mpsse_gpio = self._spi.get_gpio() # pylint: disable=too-many-arguments,unused-argument def init( diff --git a/src/board.py b/src/board.py index 03aeee9..a9b341d 100755 --- a/src/board.py +++ b/src/board.py @@ -135,6 +135,9 @@ elif board_id == ap_board.DRAGONBOARD_410C: elif board_id == ap_board.FTDI_FT232H: from adafruit_blinka.board.ftdi_ft232h import * +elif board_id == ap_board.FTDI_FT2232H: + from adafruit_blinka.board.ftdi_ft2232h import * + elif board_id == ap_board.BINHO_NOVA: from adafruit_blinka.board.binho_nova import * diff --git a/src/busio.py b/src/busio.py index 5456f65..1ad6e41 100755 --- a/src/busio.py +++ b/src/busio.py @@ -31,7 +31,7 @@ class I2C(Lockable): """Initialization""" self.deinit() if detector.board.ftdi_ft232h: - from adafruit_blinka.microcontroller.ft232h.i2c import I2C as _I2C + from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.i2c import I2C as _I2C self._i2c = _I2C(frequency=frequency) return @@ -52,6 +52,8 @@ class I2C(Lockable): return if detector.board.any_embedded_linux: from adafruit_blinka.microcontroller.generic_linux.i2c import I2C as _I2C + elif detector.board.ftdi_ft2232h: + from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.i2c import I2C as _I2C else: from machine import I2C as _I2C from microcontroller.pin import i2cPorts @@ -146,8 +148,8 @@ class SPI(Lockable): def __init__(self, clock, MOSI=None, MISO=None): self.deinit() 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 + from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.spi import SPI as _SPI + from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h.pin import SCK, MOSI, MISO self._spi = _SPI() self._pins = (SCK, MOSI, MISO) @@ -168,6 +170,8 @@ class SPI(Lockable): return if detector.board.any_embedded_linux: from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI + elif detector.board.ftdi_ft2232h: + from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.spi import SPI as _SPI else: from machine import SPI as _SPI from microcontroller.pin import spiPorts @@ -239,8 +243,11 @@ class SPI(Lockable): from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI from adafruit_blinka.microcontroller.hfu540.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 + from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h.spi import SPI as _SPI + from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h.pin import Pin + elif detector.board.ftdi_ft2232h: + from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h.spi import SPI as _SPI + from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h.pin import Pin elif detector.board.binho_nova: from adafruit_blinka.microcontroller.nova.spi import SPI as _SPI from adafruit_blinka.microcontroller.nova.pin import Pin diff --git a/src/digitalio.py b/src/digitalio.py index 4b0036b..53df368 100755 --- a/src/digitalio.py +++ b/src/digitalio.py @@ -48,7 +48,9 @@ elif detector.chip.MIPS24KEC: elif detector.chip.RK3308: from adafruit_blinka.microcontroller.rockchip.rk3308.pin import Pin elif detector.board.ftdi_ft232h: - from adafruit_blinka.microcontroller.ft232h.pin import Pin + from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h.pin import Pin +elif detector.board.ftdi_ft2232h: + from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h.pin import Pin elif detector.board.binho_nova: from adafruit_blinka.microcontroller.nova.pin import Pin elif detector.board.greatfet_one: diff --git a/src/microcontroller/__init__.py b/src/microcontroller/__init__.py index 027a557..f40d9f0 100755 --- a/src/microcontroller/__init__.py +++ b/src/microcontroller/__init__.py @@ -78,5 +78,9 @@ elif chip_id == ap_chip.MIPS24KC: from adafruit_blinka.microcontroller.atheros.ar9331.pin import * elif chip_id == ap_chip.MIPS24KEC: from adafruit_blinka.microcontroller.mips24kec.pin import * +elif chip_id == ap_chip.FT232H: + from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h.pin import * +elif chip_id == ap_chip.FT2232H: + from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h.pin import * else: raise NotImplementedError("Microcontroller not supported:", chip_id) diff --git a/src/microcontroller/pin.py b/src/microcontroller/pin.py index 09edd3c..5b8bc41 100755 --- a/src/microcontroller/pin.py +++ b/src/microcontroller/pin.py @@ -39,7 +39,9 @@ elif chip_id == ap_chip.IMX8MX: elif chip_id == ap_chip.HFU540: from adafruit_blinka.microcontroller.hfu540.pin import * elif chip_id == ap_chip.FT232H: - from adafruit_blinka.microcontroller.ft232h.pin import * + from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h.pin import * +elif chip_id == ap_chip.FT2232H: + from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h.pin import * elif chip_id == ap_chip.BINHO: from adafruit_blinka.microcontroller.nova.pin import * elif chip_id == ap_chip.LPC4330: