From: Brennen Bearnes <74990+brennen@users.noreply.github.com> Date: Fri, 21 Dec 2018 17:50:19 +0000 (-0700) Subject: Merge pull request #64 from adafruit/platformdetect X-Git-Tag: 1.0.2~1 X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/commitdiff_plain/be392bcbe02a678967fc65197d2d96f5cc13f4de?hp=cded5ff7f49a269af4c6e9541de9afe406e53239 Merge pull request #64 from adafruit/platformdetect Use PlatformDetect for Board / Chip Detection --- diff --git a/.travis.yml b/.travis.yml index 38238b2..58f60ff 100755 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,7 @@ deploy: tags: true install: + - pip install -r requirements.txt - pip install --force-reinstall pylint==1.9.2 - pip install circuitpython-build-tools Sphinx sphinx-rtd-theme diff --git a/requirements.txt b/requirements.txt index 1468be8..e07d505 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ -Adafruit-GPIO +Adafruit-PlatformDetect RPi.GPIO; platform_machine=='armv7l' or platform_machine=='armv6l' rpi_ws281x>=4.0.0; platform_machine=='armv7l' or platform_machine=='armv6l' +spidev diff --git a/setup.py b/setup.py index 5d8474f..0393ef1 100755 --- a/setup.py +++ b/setup.py @@ -33,9 +33,10 @@ setup( # If your package is a single module, use this instead of 'packages': py_modules=['bitbangio', 'board', 'busio', 'digitalio', 'micropython', 'neopixel_write'], install_requires=[ - 'Adafruit-GPIO', + "Adafruit-PlatformDetect", "RPi.GPIO; platform_machine=='armv7l' or platform_machine=='armv6l'", - "rpi_ws281x>=4.0.0; platform_machine=='armv7l' or platform_machine=='armv6l'" + "rpi_ws281x>=4.0.0; platform_machine=='armv7l' or platform_machine=='armv6l'", + "spidev" ], license='MIT', classifiers=[ diff --git a/src/adafruit_blinka/__init__.py b/src/adafruit_blinka/__init__.py index 845c802..47622df 100755 --- a/src/adafruit_blinka/__init__.py +++ b/src/adafruit_blinka/__init__.py @@ -5,7 +5,7 @@ * Author(s): cefn """ -class Enum(object): +class Enum(): """ Object supporting CircuitPython-style of static symbols as seen with Direction.OUTPUT, Pull.UP @@ -43,9 +43,11 @@ class ContextManaged: def __exit__(self, exc_type, exc_value, traceback): self.deinit() + # pylint: disable=no-self-use def deinit(self): """Free any hardware used by the object.""" - pass + return + # pylint: enable=no-self-use class Lockable(ContextManaged): diff --git a/src/adafruit_blinka/agnostic/__init__.py b/src/adafruit_blinka/agnostic/__init__.py index 1d93e6c..1f6eb4c 100755 --- a/src/adafruit_blinka/agnostic/__init__.py +++ b/src/adafruit_blinka/agnostic/__init__.py @@ -5,46 +5,21 @@ common modules and operations, depending on platform support """ import sys +import adafruit_platformdetect # We intentionally are patching into this namespace as module names so skip the name check. # pylint: disable=invalid-name -platform = sys.platform -board_id = None +# We'll define board and chip id values in agnostic rather than accessing +# detector directly elsewhere, just in case additional indirection is necessary +# at some later point: -if platform is not None: - if platform == "esp8266": # TODO more conservative board-guessing - board_id = "feather_huzzah" - elif platform == "samd21": - board_id = "feather_m0_express" - elif platform == "pyboard": - platform = "stm32" - board_id = "pyboard" - elif platform == "linux": - 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" +detector = adafruit_platformdetect.Detector() +chip_id = detector.chip.id +board_id = detector.board.id implementation = sys.implementation.name if implementation == "micropython": from utime import sleep -elif implementation == "circuitpython" or implementation == "cpython": +elif implementation in ("circuitpython", "cpython"): from time import sleep diff --git a/src/adafruit_blinka/board/beaglebone_black.py b/src/adafruit_blinka/board/beaglebone_black.py index ffeb919..f869964 100644 --- a/src/adafruit_blinka/board/beaglebone_black.py +++ b/src/adafruit_blinka/board/beaglebone_black.py @@ -1,4 +1,4 @@ -from adafruit_blinka.microcontroller.beaglebone_black import pin +from adafruit_blinka.microcontroller.am335x import pin # initial pins, to mimic bonescript demo P8_3 = pin.P8_3 @@ -75,7 +75,7 @@ LED_USR2 = pin.USR2 LED_USR3 = pin.USR3 # I2C and SPI pins from: -# src/adafruit_blinka/board/raspi_23.py +# src/adafruit_blinka/board/raspi_40pin.py # SDA = pin.SDA # SCL = pin.SCL # CE1 = pin.D7 diff --git a/src/adafruit_blinka/board/raspi_23.py b/src/adafruit_blinka/board/raspi_40pin.py similarity index 90% rename from src/adafruit_blinka/board/raspi_23.py rename to src/adafruit_blinka/board/raspi_40pin.py index 60898f0..f944eee 100644 --- a/src/adafruit_blinka/board/raspi_23.py +++ b/src/adafruit_blinka/board/raspi_40pin.py @@ -1,4 +1,4 @@ -from adafruit_blinka.microcontroller.raspi_23 import pin +from adafruit_blinka.microcontroller.bcm283x import pin D2 = pin.D2 SDA = pin.SDA diff --git a/src/adafruit_blinka/microcontroller/beaglebone_black/__init__.py b/src/adafruit_blinka/microcontroller/am335x/__init__.py similarity index 100% rename from src/adafruit_blinka/microcontroller/beaglebone_black/__init__.py rename to src/adafruit_blinka/microcontroller/am335x/__init__.py diff --git a/src/adafruit_blinka/microcontroller/beaglebone_black/pin.py b/src/adafruit_blinka/microcontroller/am335x/pin.py similarity index 100% rename from src/adafruit_blinka/microcontroller/beaglebone_black/pin.py rename to src/adafruit_blinka/microcontroller/am335x/pin.py diff --git a/src/adafruit_blinka/microcontroller/raspi_23/__init__.py b/src/adafruit_blinka/microcontroller/bcm283x/__init__.py similarity index 100% rename from src/adafruit_blinka/microcontroller/raspi_23/__init__.py rename to src/adafruit_blinka/microcontroller/bcm283x/__init__.py diff --git a/src/adafruit_blinka/microcontroller/raspi_23/neopixel.py b/src/adafruit_blinka/microcontroller/bcm283x/neopixel.py similarity index 98% rename from src/adafruit_blinka/microcontroller/raspi_23/neopixel.py rename to src/adafruit_blinka/microcontroller/bcm283x/neopixel.py index 3d670c7..d744b25 100644 --- a/src/adafruit_blinka/microcontroller/raspi_23/neopixel.py +++ b/src/adafruit_blinka/microcontroller/bcm283x/neopixel.py @@ -37,7 +37,7 @@ def neopixel_write(gpio, buf): # Initialize the channel in use count = 0 - if len(buf) % 3 == 0: + if len(buf) % 3 == 0: # most common, divisible by 3 is likely RGB LED_STRIP = ws.WS2811_STRIP_RGB count = len(buf)//3 @@ -56,7 +56,7 @@ def neopixel_write(gpio, buf): # Initialize the controller ws.ws2811_t_freq_set(_led_strip, LED_FREQ_HZ) ws.ws2811_t_dmanum_set(_led_strip, LED_DMA_NUM) - + resp = ws.ws2811_init(_led_strip) if resp != ws.WS2811_SUCCESS: if resp == -5: @@ -84,7 +84,7 @@ def neopixel_write(gpio, buf): w = buf[bpp*i+3] pixel = (w << 24) | (r << 16) | (g << 8) | b ws.ws2811_led_set(channel, i, pixel) - + resp = ws.ws2811_render(_led_strip) if resp != ws.WS2811_SUCCESS: message = ws.ws2811_get_return_t_str(resp) diff --git a/src/adafruit_blinka/microcontroller/raspi_23/pin.py b/src/adafruit_blinka/microcontroller/bcm283x/pin.py similarity index 100% rename from src/adafruit_blinka/microcontroller/raspi_23/pin.py rename to src/adafruit_blinka/microcontroller/bcm283x/pin.py diff --git a/src/adafruit_blinka/microcontroller/raspi_23/pulseio/PulseIn.py b/src/adafruit_blinka/microcontroller/bcm283x/pulseio/PulseIn.py similarity index 100% rename from src/adafruit_blinka/microcontroller/raspi_23/pulseio/PulseIn.py rename to src/adafruit_blinka/microcontroller/bcm283x/pulseio/PulseIn.py diff --git a/src/adafruit_blinka/microcontroller/raspi_23/pulseio/libgpiod_pulsein b/src/adafruit_blinka/microcontroller/bcm283x/pulseio/libgpiod_pulsein similarity index 100% rename from src/adafruit_blinka/microcontroller/raspi_23/pulseio/libgpiod_pulsein rename to src/adafruit_blinka/microcontroller/bcm283x/pulseio/libgpiod_pulsein diff --git a/src/bitbangio.py b/src/bitbangio.py index 817bdbc..c4ffcfb 100755 --- a/src/bitbangio.py +++ b/src/bitbangio.py @@ -8,11 +8,13 @@ See `CircuitPython:bitbangio` in CircuitPython for more details. """ from adafruit_blinka import Lockable, agnostic +import adafruit_platformdetect.board as ap_board class I2C(Lockable): def __init__(self, scl, sda, frequency=400000): - if agnostic.microcontroller == "stm32": + # TODO: This one is a bit questionable: + if agnostic.board_id == ap_board.PYBOARD: raise NotImplementedError("No software I2C on {}".format(agnostic.board_id)) self.init(scl, sda, frequency) diff --git a/src/board.py b/src/board.py index d4e6be0..d862e34 100755 --- a/src/board.py +++ b/src/board.py @@ -29,21 +29,31 @@ See `CircuitPython:board` in CircuitPython for more details. """ import sys -from adafruit_blinka.agnostic import board_id +from adafruit_blinka.agnostic import board_id, detector +import adafruit_platformdetect.board as ap_board -if board_id == "feather_huzzah": +# pylint: disable=wildcard-import,unused-wildcard-import,ungrouped-imports + +if board_id == ap_board.FEATHER_HUZZAH: from adafruit_blinka.board.feather_huzzah import * -elif board_id == "nodemcu": + +elif board_id == ap_board.NODEMCU: from adafruit_blinka.board.nodemcu import * -elif board_id == "pyboard": + +elif board_id == ap_board.PYBOARD: from adafruit_blinka.board.pyboard import * -elif board_id == "raspi_2" or board_id == "raspi_3": - from adafruit_blinka.board.raspi_23 import * -elif board_id == "beaglebone_black": + +elif detector.board.any_raspberry_pi_40_pin: + from adafruit_blinka.board.raspi_40pin import * + +elif board_id == ap_board.BEAGLEBONE_BLACK: from adafruit_blinka.board.beaglebone_black import * -elif board_id == "orangepipc": + +elif board_id == ap_board.ORANGE_PI_PC: from adafruit_blinka.board.orangepipc import * + elif "sphinx" in sys.modules: pass + else: raise NotImplementedError("Board not supported") diff --git a/src/busio.py b/src/busio.py index f82e4c3..61bebab 100755 --- a/src/busio.py +++ b/src/busio.py @@ -8,7 +8,8 @@ See `CircuitPython:busio` in CircuitPython for more details. """ 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 class I2C(Lockable): def __init__(self, scl, sda, frequency=400000): @@ -16,7 +17,7 @@ class I2C(Lockable): def init(self, scl, sda, frequency): self.deinit() - if board_id in ("raspi_3", "raspi_2", "beaglebone_black", "orangepipc"): + if detector.board.any_embedded_linux: from adafruit_blinka.microcontroller.generic_linux.i2c import I2C as _I2C else: from machine import I2C as _I2C @@ -26,8 +27,9 @@ class I2C(Lockable): self._i2c = _I2C(portId, mode=_I2C.MASTER, baudrate=frequency) break else: - raise NotImplementedError("No Hardware I2C on (scl,sda)={}\nValid UART ports".format( - (scl, sda), i2cPorts)) + raise NotImplementedError( + "No Hardware I2C on (scl,sda)={}\nValid UART ports: {}".format((scl, sda), i2cPorts) + ) def deinit(self): try: @@ -70,7 +72,7 @@ class I2C(Lockable): class SPI(Lockable): def __init__(self, clock, MOSI=None, MISO=None): self.deinit() - if board_id in ("raspi_3", "raspi_2", "beaglebone_black", "orangepipc"): + if detector.board.any_embedded_linux: from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI else: from machine import SPI as _SPI @@ -88,14 +90,13 @@ class SPI(Lockable): format((clock, MOSI, MISO), spiPorts)) def configure(self, baudrate=100000, polarity=0, phase=0, bits=8): - if board_id == "raspi_3" or board_id == "raspi_2": - from adafruit_blinka.microcontroller.raspi_23.pin import Pin + if detector.board.any_raspberry_pi: + from adafruit_blinka.microcontroller.bcm283x.pin import Pin from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI - elif board_id == "beaglebone_black": - # reuse the raspberry pi class as both boards use Linux spidev - from adafruit_blinka.microcontroller.beaglebone_black.pin import Pin + elif board_id == ap_board.BEAGLEBONE_BLACK: + from adafruit_blinka.microcontroller.am335x.pin import Pin from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI - elif board_id == "orangepipc": + elif board_id == ap_board.ORANGE_PI_PC: from adafruit_blinka.microcontroller.allwinner_h3.pin import Pin from adafruit_blinka.microcontroller.generic_linux.spi import SPI as _SPI else: @@ -156,7 +157,7 @@ class UART(Lockable): if flow is not None: # default 0 raise NotImplementedError( "Parameter '{}' unsupported on {}".format( - "flow", agnostic.board)) + "flow", agnostic.board_id)) # translate parity flag for Micropython if parity is UART.Parity.ODD: @@ -183,8 +184,8 @@ class UART(Lockable): break else: raise NotImplementedError( - "No Hardware UART on (tx,rx)={}\nValid UART ports".format( - (tx, rx), uartPorts)) + "No Hardware UART on (tx,rx)={}\nValid UART ports: {}".format((tx, rx), uartPorts) + ) def deinit(self): self._uart = None diff --git a/src/digitalio.py b/src/digitalio.py index 40f42ad..ab9b761 100755 --- a/src/digitalio.py +++ b/src/digitalio.py @@ -7,14 +7,17 @@ See `CircuitPython:digitalio` in CircuitPython for more details. * Author(s): cefn """ -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 -elif board_id == "beaglebone_black": - from adafruit_blinka.microcontroller.beaglebone_black.pin import Pin -elif board_id == "orangepipc": +from adafruit_blinka.agnostic import board_id, detector + +# pylint: disable=ungrouped-imports,wrong-import-position + +if detector.chip.BCM2XXX: + from adafruit_blinka.microcontroller.bcm283x.pin import Pin +elif detector.chip.AM33XX: + from adafruit_blinka.microcontroller.am335x.pin import Pin +elif detector.chip.SUN8I: from adafruit_blinka.microcontroller.allwinner_h3.pin import Pin -elif board_id == "pyboard": +elif detector.chip.STM32: from machine import Pin from adafruit_blinka import Enum, ContextManaged @@ -113,7 +116,7 @@ class DigitalInOut(ContextManaged): self._pin.init(mode=Pin.IN, pull=Pin.PULL_DOWN) else: raise NotImplementedError("{} unsupported on {}".format( - Pull.DOWN, boardId)) + Pull.DOWN, board_id)) elif pul is None: self._pin.init(mode=Pin.IN, pull=None) else: diff --git a/src/microcontroller/__init__.py b/src/microcontroller/__init__.py index 3bd5b51..a3d7eec 100755 --- a/src/microcontroller/__init__.py +++ b/src/microcontroller/__init__.py @@ -1,7 +1,8 @@ """Microcontroller pins""" +from adafruit_platformdetect import chip as ap_chip from adafruit_blinka import Enum -from adafruit_blinka.agnostic import board_id, platform +from adafruit_blinka.agnostic import board_id, chip_id class Pin(Enum): """Reference Pin object""" @@ -21,20 +22,17 @@ class Pin(Enum): return repr(self) # We intentionally are patching into this namespace so skip the wildcard check. -# pylint: disable=unused-wildcard-import,wildcard-import +# pylint: disable=unused-wildcard-import,wildcard-import,ungrouped-imports -if platform == "esp8266": +if chip_id == ap_chip.ESP8266: from adafruit_blinka.microcontroller.esp8266 import * -elif platform == "stm32": +elif chip_id == ap_chip.STM32: from adafruit_blinka.microcontroller.stm32 import * -elif platform == "linux": - if board_id == "raspi_3" or board_id == "raspi_2": - 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) +elif chip_id == ap_chip.BCM2XXX: + from adafruit_blinka.microcontroller.bcm283x import * +elif chip_id == ap_chip.AM33XX: + from adafruit_blinka.microcontroller.am335x import * +elif chip_id == ap_chip.SUN8I: + from adafruit_blinka.microcontroller.allwinner_h3 import * else: - raise NotImplementedError("Platform not supported:", platform) + raise NotImplementedError("Microcontroller not supported:", chip_id) diff --git a/src/microcontroller/pin.py b/src/microcontroller/pin.py index 9ccd81f..5779050 100755 --- a/src/microcontroller/pin.py +++ b/src/microcontroller/pin.py @@ -1,21 +1,20 @@ """Pins named after their chip name.""" -from adafruit_blinka import agnostic +import adafruit_platformdetect.chip as ap_chip +from adafruit_blinka.agnostic import chip_id # We intentionally are patching into this namespace so skip the wildcard check. -# pylint: disable=unused-wildcard-import,wildcard-import -if agnostic.platform == "esp8266": +# pylint: disable=unused-wildcard-import,wildcard-import,ungrouped-imports + +if chip_id == ap_chip.ESP8266: from adafruit_blinka.microcontroller.esp8266.pin import * -elif agnostic.platform == "stm32": +elif chip_id == ap_chip.STM32: from adafruit_blinka.microcontroller.stm32.pin import * -elif agnostic.platform == "linux": - if agnostic.board_id == "raspi_3" or agnostic.board_id == "raspi_2": - 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) +elif chip_id == ap_chip.BCM2XXX: + from adafruit_blinka.microcontroller.bcm283x.pin import * +elif chip_id == ap_chip.AM33XX: + from adafruit_blinka.microcontroller.am335x.pin import * +elif chip_id == ap_chip.SUN8I: + from adafruit_blinka.microcontroller.allwinner_h3.pin import * else: - raise NotImplementedError("Microcontroller not supported") + raise NotImplementedError("Microcontroller not supported: ", chip_id) diff --git a/src/neopixel_write.py b/src/neopixel_write.py index d5cb7e0..5626bc6 100644 --- a/src/neopixel_write.py +++ b/src/neopixel_write.py @@ -9,10 +9,10 @@ See `CircuitPython:neopixel_write` in CircuitPython for more details. import sys -from adafruit_blinka.agnostic import board_id +from adafruit_blinka.agnostic import detector -if board_id == "raspi_2" or board_id == "raspi_3": - from adafruit_blinka.microcontroller.raspi_23 import neopixel as _neopixel +if detector.board.any_raspberry_pi: + from adafruit_blinka.microcontroller.bcm283x import neopixel as _neopixel elif "sphinx" in sys.modules: pass else: diff --git a/src/pulseio.py b/src/pulseio.py index e2d69fc..2d3f0b5 100644 --- a/src/pulseio.py +++ b/src/pulseio.py @@ -1,6 +1,4 @@ -import sys -from adafruit_blinka.agnostic import board_id +from adafruit_blinka.agnostic import detector - -if board_id == "raspi_2" or board_id == "raspi_3": - from adafruit_blinka.microcontroller.raspi_23.pulseio.PulseIn import PulseIn as PulseIn +if detector.board.any_raspberry_pi: + from adafruit_blinka.microcontroller.bcm283x.pulseio.PulseIn import PulseIn