summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build.yml5
-rw-r--r--Makefile6
-rw-r--r--docs/shared_bindings_matrix.py220
m---------lib/tinyusb0
-rw-r--r--locale/ID.po10
-rw-r--r--locale/circuitpython.pot10
-rw-r--r--locale/cs.po10
-rw-r--r--locale/de_DE.po10
-rw-r--r--locale/en_US.po10
-rw-r--r--locale/en_x_pirate.po10
-rw-r--r--locale/es.po10
-rw-r--r--locale/fil.po10
-rw-r--r--locale/fr.po21
-rw-r--r--locale/it_IT.po10
-rw-r--r--locale/ko.po10
-rw-r--r--locale/nl.po13
-rw-r--r--locale/pl.po10
-rw-r--r--locale/pt_BR.po10
-rw-r--r--locale/sv.po13
-rw-r--r--locale/zh_Latn_pinyin.po13
-rw-r--r--ports/atmel-samd/boards/escornabot_makech/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/fluff_m0/board.c38
-rw-r--r--ports/atmel-samd/boards/fluff_m0/mpconfigboard.h20
-rw-r--r--ports/atmel-samd/boards/fluff_m0/mpconfigboard.mk18
-rw-r--r--ports/atmel-samd/boards/fluff_m0/pins.c38
-rw-r--r--ports/atmel-samd/boards/meowmeow/mpconfigboard.mk3
-rw-r--r--ports/atmel-samd/boards/pyruler/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/common-hal/digitalio/DigitalInOut.c6
-rw-r--r--ports/atmel-samd/common-hal/pulseio/PWMOut.c2
-rw-r--r--ports/atmel-samd/supervisor/port.c8
-rw-r--r--ports/cxd56/common-hal/digitalio/DigitalInOut.c6
-rw-r--r--ports/esp32s2/Makefile6
-rw-r--r--ports/esp32s2/boards/espressif_saola_1_wroom/board.c8
-rw-r--r--ports/esp32s2/boards/espressif_saola_1_wroom/mpconfigboard.mk2
-rw-r--r--ports/esp32s2/boards/espressif_saola_1_wrover/board.c8
-rw-r--r--ports/esp32s2/boards/espressif_saola_1_wrover/mpconfigboard.mk2
-rw-r--r--ports/esp32s2/common-hal/digitalio/DigitalInOut.c86
-rw-r--r--ports/esp32s2/common-hal/microcontroller/Pin.c41
-rw-r--r--ports/esp32s2/common-hal/microcontroller/Pin.h9
-rw-r--r--ports/esp32s2/common-hal/microcontroller/__init__.c9
-rw-r--r--ports/esp32s2/modules/module.h35
-rw-r--r--ports/esp32s2/modules/none.c28
-rw-r--r--ports/esp32s2/modules/wroom.c37
-rw-r--r--ports/esp32s2/modules/wrover.c38
-rw-r--r--ports/esp32s2/mpconfigport.mk2
-rw-r--r--ports/esp32s2/peripherals/pins.h4
-rw-r--r--ports/esp32s2/supervisor/port.c4
-rw-r--r--ports/litex/common-hal/digitalio/DigitalInOut.c6
-rw-r--r--ports/mimxrt10xx/common-hal/busio/I2C.c2
-rw-r--r--ports/mimxrt10xx/common-hal/digitalio/DigitalInOut.c6
-rw-r--r--ports/nrf/boards/hiibot_bluefi/board.c103
-rw-r--r--ports/nrf/boards/hiibot_bluefi/mpconfigboard.h67
-rw-r--r--ports/nrf/boards/hiibot_bluefi/mpconfigboard.mk18
-rw-r--r--ports/nrf/boards/hiibot_bluefi/pins.c180
-rw-r--r--ports/nrf/common-hal/digitalio/DigitalInOut.c6
-rw-r--r--ports/stm/common-hal/digitalio/DigitalInOut.c8
-rw-r--r--shared-bindings/_pixelbuf/PixelBuf.c53
-rw-r--r--shared-bindings/_pixelbuf/PixelBuf.h2
-rw-r--r--shared-bindings/digitalio/DigitalInOut.c10
-rw-r--r--shared-bindings/digitalio/DigitalInOut.h7
-rw-r--r--shared-module/_pixelbuf/PixelBuf.c27
62 files changed, 991 insertions, 376 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 6eb55ed12..0719b40e9 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -180,10 +180,12 @@ jobs:
- "feather_nrf52840_express"
- "feather_radiofruit_zigbee"
- "feather_stm32f405_express"
+ - "fluff_m0"
- "gemma_m0"
- "grandcentral_m4_express"
- "hallowing_m0_express"
- "hallowing_m4_express"
+ - "hiibot_bluefi"
- "imxrt1010_evk"
- "imxrt1020_evk"
- "imxrt1060_evk"
@@ -389,9 +391,8 @@ jobs:
id: idf-cache
with:
path: ${{ github.workspace }}/.idf_tools
- key: ${{ runner.os }}-idf-tools-${{ hashFiles('.git/modules/ports/esp32s2/esp-idf/HEAD') }}
+ key: ${{ runner.os }}-idf-tools-${{ hashFiles('.git/modules/ports/esp32s2/esp-idf/HEAD') }}-20200523
- name: Install IDF tools
- if: steps.idf-cache.outputs.cache-hit != 'true'
run: |
$IDF_PATH/tools/idf_tools.py --non-interactive install required
$IDF_PATH/tools/idf_tools.py --non-interactive install cmake
diff --git a/Makefile b/Makefile
index 842c18da5..b64217596 100644
--- a/Makefile
+++ b/Makefile
@@ -210,6 +210,12 @@ locale/circuitpython.pot: all-source
translate: locale/circuitpython.pot
for po in $(shell ls locale/*.po); do msgmerge -U $$po -s --no-fuzzy-matching --add-location=file locale/circuitpython.pot; done
+merge-translate:
+ git merge HEAD 1>&2 2> /dev/null; test $$? -eq 128
+ rm locale/*~ || true
+ git checkout --ours -- locale/*
+ make translate
+
check-translate: locale/circuitpython.pot $(wildcard locale/*.po)
$(PYTHON) tools/check_translations.py $^
diff --git a/docs/shared_bindings_matrix.py b/docs/shared_bindings_matrix.py
index aa5ef02e2..02ef68349 100644
--- a/docs/shared_bindings_matrix.py
+++ b/docs/shared_bindings_matrix.py
@@ -24,49 +24,11 @@
import json
import os
import re
+import subprocess
+import sys
-SUPPORTED_PORTS = ["atmel-samd", "nrf", "stm", "mimxrt10xx"]
-
-
-def parse_port_config(contents, chip_keyword=None):
- """ Compile a dictionary of port-wide module configs, which may
- be categorized by chipset.
- """
- chip_fam = "all"
- ifeq_found = False
- port_config_results = {"all": []}
-
- chip_pattern = ""
- if chip_keyword:
- chip_pattern = (
- re.compile("(?<=ifeq\s\(\$\({}\)\,)(\w+)".format(chip_keyword))
- )
-
- for line in contents:
- if chip_keyword:
- if not ifeq_found:
- check_ifeq = chip_pattern.search(line)
- if check_ifeq:
- ifeq_found = True
- chip_fam = check_ifeq.group(1)
- #print("found chip:", chip_fam)
- else:
- ifeq_found = False
- chip_fam = "all"
- else:
- if "endif" in line:
- ifeq_found = False
- chip_fam = "all"
-
- if "CIRCUITPY_" in line:
- if chip_fam in port_config_results:
- port_config_results[chip_fam].append(line.rstrip("\n"))
- else:
- port_config_results[chip_fam] = [line.rstrip("\n")]
-
- #print(port_config_results)
- return port_config_results
+SUPPORTED_PORTS = ['atmel-samd', 'esp32s2', 'litex', 'mimxrt10xx', 'nrf', 'stm']
def get_shared_bindings():
""" Get a list of modules in shared-bindings based on folder names
@@ -117,149 +79,64 @@ def build_module_map():
"excluded": {}
}
- #print(base)
return base
+def get_settings_from_makefile(port_dir, board_name):
+ """ Invoke make in a mode which prints the database, then parse it for
+ settings.
-def get_excluded_boards(base):
- """ Cycles through each board's `mpconfigboard.mk` file to determine
- if each module is included or not. Boards are selected by existence
- in a port listed in `SUPPORTED_PORTS` (e.g. `/port/nrf/feather_52840`)
-
- Boards are further categorized by their respective chipset (SAMD21,
- SAMD51, nRF52840, etc.)
+ This means that the effect of all Makefile directives is taken
+ into account, without having to re-encode the logic that sets them
+ in this script, something that has proved error-prone
"""
- modules = list(base.keys())
-
- re_board_chip = None
- chip_keyword = None
- for port in SUPPORTED_PORTS:
- # each port appears to use its own define for the chipset
- if port in ["atmel-samd"]:
- re_board_chip = re.compile("CHIP_FAMILY\s=\s(\w+)")
- chip_keyword = "CHIP_FAMILY"
- elif port in ["nrf"]:
- re_board_chip = re.compile(r"MCU_VARIANT\s=\s(\w+)")
- elif port in ["stm"]:
- re_board_chip = re.compile(r"MCU_SERIES\s*=\s*(\w+)")
- chip_keyword = "MCU_SERIES"
-
- port_dir = "ports/{}".format(port)
-
- port_config_contents = ""
- with open(os.path.join(port_dir, "mpconfigport.mk")) as port_config:
- port_config_contents = port_config.readlines()
- port_config = parse_port_config(port_config_contents, chip_keyword)
-
- for entry in os.scandir(os.path.join(port_dir, "boards")):
- if not entry.is_dir():
- continue
-
- contents = ""
- board_dir = os.path.join(entry.path, "mpconfigboard.mk")
- with open(board_dir) as board:
- contents = board.read()
-
- board_chip = re_board_chip.search(contents)
- if not board_chip:
- board_chip = "Unknown Chip"
- else:
- #print(entry.name, board_chip.group(1))
- board_chip = board_chip.group(1)
-
- # add port_config results to contents
- contents += "\n" + "\n".join(port_config["all"])
- if board_chip in port_config:
- contents += "\n" + "\n".join(port_config[board_chip])
-
- check_dependent_modules = dict()
- for module in modules:
- board_is_excluded = False
- # check if board turns off `FULL_BUILD`. if yes, and current
- # module is marked as `FULL_BUILD`, board is excluded
- small_build = re.search("CIRCUITPY_FULL_BUILD = 0", contents)
- if small_build and base[module]["full_build"] == "1":
- board_is_excluded = True
-
- # check if module is specifically disabled for this board
- re_pattern = r"CIRCUITPY_{}\s=\s(\w)".format(module.upper())
- find_module = re.search(re_pattern, contents)
- if not find_module:
- if base[module]["default_value"].isdigit():
- # check if default inclusion is off ('0'). if the board doesn't
- # have it explicitly enabled, its excluded.
- if base[module]["default_value"] == "0":
- board_is_excluded = True
- else:
- # this module is dependent on another module. add it
- # to the list to check after processing all other modules.
- # only need to check exclusion if it isn't already excluded.
- if (not board_is_excluded and
- base[module]["default_value"] not in [
- "None",
- "CIRCUITPY_DEFAULT_BUILD"
- ]):
- check_dependent_modules[module] = base[module]["default_value"]
- else:
- board_is_excluded = find_module.group(1) == "0"
-
- if board_is_excluded:
- if board_chip in base[module]["excluded"]:
- base[module]["excluded"][board_chip].append(entry.name)
- else:
- base[module]["excluded"][board_chip] = [entry.name]
-
- for module in check_dependent_modules:
- depend_results = set()
-
- parents = check_dependent_modules[module].split("CIRCUITPY_")
- parents = [item.strip(", ").lower() for item in parents if item]
-
- for parent in parents:
- if parent in base:
- if (board_chip in base[parent]["excluded"] and
- entry.name in base[parent]["excluded"][board_chip]):
- depend_results.add(False)
- else:
- depend_results.add(True)
-
- # only exclude the module if there were zero parents enabled
- # as determined by the 'depend_results' set.
- if not any(depend_results):
- if board_chip in base[module]["excluded"]:
- base[module]["excluded"][board_chip].append(entry.name)
- else:
- base[module]["excluded"][board_chip] = [entry.name]
-
- #print(json.dumps(base, indent=2))
- return base
+ contents = subprocess.run(
+ ["make", "-C", port_dir, f"BOARD={board_name}", "-qp", "print-CC"],
+ encoding="utf-8",
+ errors="replace",
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE
+ )
+ # Make signals errors with exit status 2; 0 and 1 are "non-error" statuses
+ if contents.returncode not in (0, 1):
+ error_msg = (
+ f"Invoking '{' '.join(contents.args)}' exited with "
+ f"{contents.returncode}: {contents.stderr}"
+ )
+ raise RuntimeError(error_msg)
+ settings = {}
+ for line in contents.stdout.split('\n'):
+ m = re.match(r'^([A-Z][A-Z0-9_]*) = (.*)$', line)
+ if m:
+ settings[m.group(1)] = m.group(2)
-def support_matrix_excluded_boards():
- """ Compiles a list of available modules, and which board definitions
- do not include them.
- """
- base = build_module_map()
+ return settings
- return get_excluded_boards(base)
+def lookup_setting(settings, key, default=''):
+ while True:
+ value = settings.get(key, default)
+ if not value.startswith('$'):
+ break
+ key = value[2:-1]
+ return value
def support_matrix_by_board():
""" Compiles a list of the available core modules available for each
board.
"""
base = build_module_map()
- base_with_exclusions = get_excluded_boards(base)
boards = dict()
for port in SUPPORTED_PORTS:
+
port_dir = "ports/{}/boards".format(port)
for entry in os.scandir(port_dir):
if not entry.is_dir():
continue
board_modules = []
- board_name = entry.name
- board_contents = ""
+ settings = get_settings_from_makefile(f'ports/{port}', entry.name)
+
with open(os.path.join(entry.path, "mpconfigboard.h")) as get_name:
board_contents = get_name.read()
board_name_re = re.search("(?<=MICROPY_HW_BOARD_NAME)\s+(.+)",
@@ -267,18 +144,15 @@ def support_matrix_by_board():
if board_name_re:
board_name = board_name_re.group(1).strip('"')
- for module in base_with_exclusions.keys():
- #print(module)
- board_has_module = True
- if base_with_exclusions[module]["excluded"]:
- for port in base_with_exclusions[module]["excluded"].values():
- #print(port)
- if entry.name in port:
- board_has_module = False
-
- if board_has_module:
- board_modules.append(base_with_exclusions[module]["name"])
+ board_modules = []
+ for module in base:
+ key = f'CIRCUITPY_{module.upper()}'
+ if int(lookup_setting(settings, key, '0')):
+ board_modules.append(base[module]['name'])
boards[board_name] = sorted(board_modules)
#print(json.dumps(boards, indent=2))
return boards
+
+if __name__ == '__main__':
+ print(json.dumps(support_matrix_by_board(), indent=2))
diff --git a/lib/tinyusb b/lib/tinyusb
-Subproject dc5445e2f45cb348a44fe24fc1be4bc8b5ba5ba
+Subproject 76bf96bcb0c12ba241ee4ecc175afb257e550d1
diff --git a/locale/ID.po b/locale/ID.po
index 16d7865ff..f181c7426 100644
--- a/locale/ID.po
+++ b/locale/ID.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1086,10 +1086,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr ""
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr ""
@@ -1253,6 +1249,10 @@ msgstr ""
msgid "Pin does not have ADC capabilities"
msgstr "Pin tidak mempunya kemampuan untuk ADC (Analog Digital Converter)"
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot
index 4b72833a7..4fbe72000 100644
--- a/locale/circuitpython.pot
+++ b/locale/circuitpython.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1075,10 +1075,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr ""
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr ""
@@ -1241,6 +1237,10 @@ msgstr ""
msgid "Pin does not have ADC capabilities"
msgstr ""
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
diff --git a/locale/cs.po b/locale/cs.po
index c333ca8eb..7aecaa135 100644
--- a/locale/cs.po
+++ b/locale/cs.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1075,10 +1075,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr ""
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr ""
@@ -1241,6 +1237,10 @@ msgstr ""
msgid "Pin does not have ADC capabilities"
msgstr ""
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 6a630d903..7ed8e9aaf 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: 2020-05-18 02:48+0000\n"
"Last-Translator: Jeff Epler <jepler@gmail.com>\n"
"Language-Team: German <https://later.unpythonic.net/projects/circuitpython/"
@@ -1091,10 +1091,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr ""
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr "Kein CCCD für diese Charakteristik"
@@ -1263,6 +1259,10 @@ msgstr "Zugang verweigert"
msgid "Pin does not have ADC capabilities"
msgstr "Pin hat keine ADC Funktionalität"
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
diff --git a/locale/en_US.po b/locale/en_US.po
index ff72c4a5d..4e0806839 100644
--- a/locale/en_US.po
+++ b/locale/en_US.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -1075,10 +1075,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr ""
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr ""
@@ -1241,6 +1237,10 @@ msgstr ""
msgid "Pin does not have ADC capabilities"
msgstr ""
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
diff --git a/locale/en_x_pirate.po b/locale/en_x_pirate.po
index 809c31553..291d0fdcc 100644
--- a/locale/en_x_pirate.po
+++ b/locale/en_x_pirate.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: 2020-03-30 22:11+0000\n"
"Last-Translator: Tannewt <devnull@unpythonic.net>\n"
"Language-Team: English <https://later.unpythonic.net/projects/circuitpython/"
@@ -1084,10 +1084,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr ""
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr ""
@@ -1250,6 +1246,10 @@ msgstr ""
msgid "Pin does not have ADC capabilities"
msgstr "Belay that! Th' Pin be not ADC capable"
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
diff --git a/locale/es.po b/locale/es.po
index 391820d82..ae4bec77e 100644
--- a/locale/es.po
+++ b/locale/es.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: 2020-05-17 20:56+0000\n"
"Last-Translator: Jeff Epler <jepler@gmail.com>\n"
"Language-Team: \n"
@@ -1084,10 +1084,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr ""
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr ""
@@ -1256,6 +1252,10 @@ msgstr "Permiso denegado"
msgid "Pin does not have ADC capabilities"
msgstr "Pin no tiene capacidad ADC"
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
diff --git a/locale/fil.po b/locale/fil.po
index 6744a4547..4b1075bfe 100644
--- a/locale/fil.po
+++ b/locale/fil.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: 2018-12-20 22:15-0800\n"
"Last-Translator: Timothy <me@timothygarcia.ca>\n"
"Language-Team: fil\n"
@@ -1091,10 +1091,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr ""
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr ""
@@ -1261,6 +1257,10 @@ msgstr "Walang pahintulot"
msgid "Pin does not have ADC capabilities"
msgstr "Ang pin ay walang kakayahan sa ADC"
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
diff --git a/locale/fr.po b/locale/fr.po
index 19a3cd98d..a73076e68 100644
--- a/locale/fr.po
+++ b/locale/fr.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
-"PO-Revision-Date: 2020-05-17 20:56+0000\n"
-"Last-Translator: Anonymous <noreply@weblate.org>\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
+"PO-Revision-Date: 2020-05-26 19:37+0000\n"
+"Last-Translator: Jeff Epler <jepler@gmail.com>\n"
"Language-Team: French <https://later.unpythonic.net/projects/circuitpython/"
"circuitpython-master/fr/>\n"
"Language: fr\n"
@@ -1106,10 +1106,6 @@ msgstr "Doit utiliser un multiple de 6 broches RVB, pas %d"
msgid "Name too long"
msgstr "Nom trop long"
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr "Étape négative non prise en charge"
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr "Pas de CCCD pour cette caractéristique"
@@ -1282,6 +1278,10 @@ msgstr "Permission refusée"
msgid "Pin does not have ADC capabilities"
msgstr "La broche ne peut être utilisée pour l'ADC"
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr "La broche doit prendre en charge les interruptions matérielles"
@@ -1307,7 +1307,7 @@ msgstr "Ainsi que tout autre module présent sur le système de fichiers\n"
#: shared-module/vectorio/Polygon.c
msgid "Polygon needs at least 3 points"
-msgstr ""
+msgstr "Polygone a besoin d’au moins 3 points"
#: shared-bindings/ps2io/Ps2.c
msgid "Pop from an empty Ps2 buffer"
@@ -1533,7 +1533,7 @@ msgstr "La largeur de la tuile doit diviser exactement la largeur de l'image"
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
-msgstr ""
+msgstr "Le délai est trop long : le délai maximal est de %d secondes"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
@@ -3548,6 +3548,9 @@ msgstr "'step' nul"
#~ msgid "Must be a Group subclass."
#~ msgstr "Doit être une sous-classe de 'Group'"
+#~ msgid "Negative step not supported"
+#~ msgstr "Étape négative non prise en charge"
+
#~ msgid "No PulseIn support for %q"
#~ msgstr "Pas de support de PulseIn pour %q"
diff --git a/locale/it_IT.po b/locale/it_IT.po
index 5dafec864..d098045a6 100644
--- a/locale/it_IT.po
+++ b/locale/it_IT.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: 2018-10-02 16:27+0200\n"
"Last-Translator: Enrico Paganin <enrico.paganin@mail.com>\n"
"Language-Team: \n"
@@ -1095,10 +1095,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr ""
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr ""
@@ -1270,6 +1266,10 @@ msgstr "Permesso negato"
msgid "Pin does not have ADC capabilities"
msgstr "Il pin non ha capacità di ADC"
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
diff --git a/locale/ko.po b/locale/ko.po
index b7af51667..ddd4166a8 100644
--- a/locale/ko.po
+++ b/locale/ko.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: 2019-05-06 14:22-0700\n"
"Last-Translator: \n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1079,10 +1079,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr ""
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr ""
@@ -1245,6 +1241,10 @@ msgstr ""
msgid "Pin does not have ADC capabilities"
msgstr ""
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
diff --git a/locale/nl.po b/locale/nl.po
index 957fa91fb..581f66bcd 100644
--- a/locale/nl.po
+++ b/locale/nl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: 2020-05-19 17:08+0000\n"
"Last-Translator: Dustin Watts <dustin_watts@yahoo.com>\n"
"Language-Team: none\n"
@@ -1095,10 +1095,6 @@ msgstr "Een meervoud van 6 rgb pinnen moet worden gebruikt, niet %d"
msgid "Name too long"
msgstr "Naam te lang"
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr "Negatieve stappen niet ondersteund"
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr "Geen CCCD voor deze Characteristic"
@@ -1270,6 +1266,10 @@ msgstr "Toegang geweigerd"
msgid "Pin does not have ADC capabilities"
msgstr "Pin heeft geen ADC mogelijkheden"
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr "Pin moet hardware interrupts ondersteunen"
@@ -3269,3 +3269,6 @@ msgstr ""
#: py/objrange.c
msgid "zero step"
msgstr ""
+
+#~ msgid "Negative step not supported"
+#~ msgstr "Negatieve stappen niet ondersteund"
diff --git a/locale/pl.po b/locale/pl.po
index 80a3b2012..f68b062d1 100644
--- a/locale/pl.po
+++ b/locale/pl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: 2019-03-19 18:37-0700\n"
"Last-Translator: Radomir Dopieralski <circuitpython@sheep.art.pl>\n"
"Language-Team: pl\n"
@@ -1080,10 +1080,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr ""
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr ""
@@ -1246,6 +1242,10 @@ msgstr "Odmowa dostępu"
msgid "Pin does not have ADC capabilities"
msgstr "Nóżka nie obsługuje ADC"
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
diff --git a/locale/pt_BR.po b/locale/pt_BR.po
index 1bfb574ed..e31fc5a58 100644
--- a/locale/pt_BR.po
+++ b/locale/pt_BR.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: 2018-10-02 21:14-0000\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -1087,10 +1087,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr ""
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr ""
@@ -1256,6 +1252,10 @@ msgstr "Permissão negada"
msgid "Pin does not have ADC capabilities"
msgstr "O pino não tem recursos de ADC"
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
diff --git a/locale/sv.po b/locale/sv.po
index 13e0169b7..dac0428fa 100644
--- a/locale/sv.po
+++ b/locale/sv.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-19 15:01+0800\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: 2020-05-20 18:32+0000\n"
"Last-Translator: Jonny Bergdahl <jonny@bergdahl.it>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1095,10 +1095,6 @@ msgstr "Måste använda ett multipel av 6 rgb-pinnar, inte %d"
msgid "Name too long"
msgstr "Name är för långt"
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr "Negativt step stöds inte"
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr "Ingen CCCD för denna karaktäristik"
@@ -1268,6 +1264,10 @@ msgstr "Åtkomst nekad"
msgid "Pin does not have ADC capabilities"
msgstr "Pinnen har inte ADC-funktionalitet"
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr "Pinnen måste stödja hårdvaruavbrott"
@@ -3278,5 +3278,8 @@ msgstr "y-värde utanför intervall"
msgid "zero step"
msgstr "noll steg"
+#~ msgid "Negative step not supported"
+#~ msgstr "Negativt step stöds inte"
+
#~ msgid "empty %q list"
#~ msgstr "tom %q-lista"
diff --git a/locale/zh_Latn_pinyin.po b/locale/zh_Latn_pinyin.po
index 58637394e..6bae33fc7 100644
--- a/locale/zh_Latn_pinyin.po
+++ b/locale/zh_Latn_pinyin.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: circuitpython-cn\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-21 11:18-0400\n"
+"POT-Creation-Date: 2020-05-26 13:09-0700\n"
"PO-Revision-Date: 2019-04-13 10:10-0700\n"
"Last-Translator: hexthat\n"
"Language-Team: Chinese Hanyu Pinyin\n"
@@ -1088,10 +1088,6 @@ msgstr ""
msgid "Name too long"
msgstr ""
-#: shared-bindings/_pixelbuf/PixelBuf.c
-msgid "Negative step not supported"
-msgstr "Bù zhīchí fù bù"
-
#: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic"
msgstr "Zhège tèzhēng méiyǒu CCCD"
@@ -1260,6 +1256,10 @@ msgstr "Quánxiàn bèi jùjué"
msgid "Pin does not have ADC capabilities"
msgstr "Pin méiyǒu ADC nénglì"
+#: shared-bindings/digitalio/DigitalInOut.c
+msgid "Pin is input only"
+msgstr ""
+
#: ports/atmel-samd/common-hal/countio/Counter.c
msgid "Pin must support hardware interrupts"
msgstr ""
@@ -3446,6 +3446,9 @@ msgstr "líng bù"
#~ msgid "Must be a Group subclass."
#~ msgstr "Bìxū shì fēnzǔ zi lèi."
+#~ msgid "Negative step not supported"
+#~ msgstr "Bù zhīchí fù bù"
+
#~ msgid "No default I2C bus"
#~ msgstr "Méiyǒu mòrèn I2C gōnggòng qìchē"
diff --git a/ports/atmel-samd/boards/escornabot_makech/mpconfigboard.mk b/ports/atmel-samd/boards/escornabot_makech/mpconfigboard.mk
index 93f6b1c90..e45b5aae3 100644
--- a/ports/atmel-samd/boards/escornabot_makech/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/escornabot_makech/mpconfigboard.mk
@@ -9,5 +9,6 @@ CHIP_FAMILY = samd21
INTERNAL_FLASH_FILESYSTEM = 1
LONGINT_IMPL = NONE
CIRCUITPY_FULL_BUILD = 0
+CIRCUITPY_RTC = 0
SUPEROPT_GC = 0
diff --git a/ports/atmel-samd/boards/fluff_m0/board.c b/ports/atmel-samd/boards/fluff_m0/board.c
new file mode 100644
index 000000000..c8e20206a
--- /dev/null
+++ b/ports/atmel-samd/boards/fluff_m0/board.c
@@ -0,0 +1,38 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "boards/board.h"
+
+void board_init(void)
+{
+}
+
+bool board_requests_safe_mode(void) {
+ return false;
+}
+
+void reset_board(void) {
+}
diff --git a/ports/atmel-samd/boards/fluff_m0/mpconfigboard.h b/ports/atmel-samd/boards/fluff_m0/mpconfigboard.h
new file mode 100644
index 000000000..0782c980d
--- /dev/null
+++ b/ports/atmel-samd/boards/fluff_m0/mpconfigboard.h
@@ -0,0 +1,20 @@
+#define MICROPY_HW_BOARD_NAME "Fluff M0"
+#define MICROPY_HW_MCU_NAME "samd21e18"
+
+#define MICROPY_PORT_A (0)
+#define MICROPY_PORT_B (0)
+#define MICROPY_PORT_C (0)
+
+#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
+#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
+
+#define DEFAULT_SPI_BUS_SCK (&pin_PA30)
+#define DEFAULT_SPI_BUS_MOSI (&pin_PA00)
+#define DEFAULT_SPI_BUS_MISO (&pin_PA31)
+
+#define DEFAULT_UART_BUS_RX (&pin_PA11)
+#define DEFAULT_UART_BUS_TX (&pin_PA10)
+
+// USB is always used internally so skip the pin objects for it.
+#define IGNORE_PIN_PA24 1
+#define IGNORE_PIN_PA25 1
diff --git a/ports/atmel-samd/boards/fluff_m0/mpconfigboard.mk b/ports/atmel-samd/boards/fluff_m0/mpconfigboard.mk
new file mode 100644
index 000000000..8efc1b575
--- /dev/null
+++ b/ports/atmel-samd/boards/fluff_m0/mpconfigboard.mk
@@ -0,0 +1,18 @@
+USB_VID = 0x239A
+USB_PID = 0x80B0
+USB_PRODUCT = "Fluff M0"
+USB_MANUFACTURER = "Radomir Dopieralski"
+
+CHIP_VARIANT = SAMD21E18A
+CHIP_FAMILY = samd21
+
+INTERNAL_FLASH_FILESYSTEM = 1
+LONGINT_IMPL = NONE
+CIRCUITPY_FULL_BUILD = 0
+
+SUPEROPT_GC = 0
+
+CFLAGS_BOARD = --param max-inline-insns-auto=15
+ifeq ($(TRANSLATION), zh_Latn_pinyin)
+CFLAGS_INLINE_LIMIT = 35
+endif
diff --git a/ports/atmel-samd/boards/fluff_m0/pins.c b/ports/atmel-samd/boards/fluff_m0/pins.c
new file mode 100644
index 000000000..d80d46b89
--- /dev/null
+++ b/ports/atmel-samd/boards/fluff_m0/pins.c
@@ -0,0 +1,38 @@
+#include "shared-bindings/board/__init__.h"
+
+STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_AREF), MP_ROM_PTR(&pin_PA03) },
+
+ { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) },
+ { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA06) },
+ { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PA08) },
+ { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA04) },
+ { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA05) },
+ { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_PA07) },
+
+ { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA31) },
+ { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PA00) },
+ { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA30) },
+
+ { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA11) },
+ { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA11) },
+ { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA10) },
+ { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA10) },
+
+ { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA22) },
+ { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA23) },
+
+ { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA15) },
+ { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA01) },
+ { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA14) },
+ { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) },
+ { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA16) },
+ { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA19) },
+ { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PA17) },
+
+ { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
+ { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
+ { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
+};
+MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table);
diff --git a/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk b/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk
index bd0afb60e..175501313 100644
--- a/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk
@@ -9,5 +9,8 @@ CHIP_FAMILY = samd21
INTERNAL_FLASH_FILESYSTEM = 1
LONGINT_IMPL = NONE
CIRCUITPY_FULL_BUILD = 0
+CIRCUITPY_ROTARYIO = 0
+CIRCUITPY_COUNTIO = 0
+CIRCUITPY_RTC = 0
SUPEROPT_GC = 0
diff --git a/ports/atmel-samd/boards/pyruler/mpconfigboard.mk b/ports/atmel-samd/boards/pyruler/mpconfigboard.mk
index 475d8b634..885f58e4e 100644
--- a/ports/atmel-samd/boards/pyruler/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pyruler/mpconfigboard.mk
@@ -10,6 +10,7 @@ INTERNAL_FLASH_FILESYSTEM = 1
LONGINT_IMPL = NONE
CIRCUITPY_FULL_BUILD = 0
CIRCUITPY_COUNTIO = 0
+CIRCUITPY_RTC = 0
SUPEROPT_GC = 0
CFLAGS_BOARD = --param max-inline-insns-auto=15
diff --git a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk
index e56517b5c..46f727131 100644
--- a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk
@@ -13,6 +13,7 @@ LONGINT_IMPL = MPZ
CIRCUITPY_BITBANGIO = 0
CIRCUITPY_COUNTIO = 0
+CIRCUITPY_RTC = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_I2CSLAVE = 0
diff --git a/ports/atmel-samd/common-hal/digitalio/DigitalInOut.c b/ports/atmel-samd/common-hal/digitalio/DigitalInOut.c
index 68d3da806..e37769c15 100644
--- a/ports/atmel-samd/common-hal/digitalio/DigitalInOut.c
+++ b/ports/atmel-samd/common-hal/digitalio/DigitalInOut.c
@@ -73,7 +73,7 @@ void common_hal_digitalio_digitalinout_switch_to_input(
common_hal_digitalio_digitalinout_set_pull(self, pull);
}
-void common_hal_digitalio_digitalinout_switch_to_output(
+digitalinout_result_t common_hal_digitalio_digitalinout_switch_to_output(
digitalio_digitalinout_obj_t* self, bool value,
digitalio_drive_mode_t drive_mode) {
const uint8_t pin = self->pin->number;
@@ -86,6 +86,7 @@ void common_hal_digitalio_digitalinout_switch_to_output(
// Direction is set in set_value. We don't need to do it here.
common_hal_digitalio_digitalinout_set_value(self, value);
+ return DIGITALINOUT_OK;
}
digitalio_direction_t common_hal_digitalio_digitalinout_get_direction(
@@ -128,7 +129,7 @@ bool common_hal_digitalio_digitalinout_get_value(
}
}
-void common_hal_digitalio_digitalinout_set_drive_mode(
+digitalinout_result_t common_hal_digitalio_digitalinout_set_drive_mode(
digitalio_digitalinout_obj_t* self,
digitalio_drive_mode_t drive_mode) {
bool value = common_hal_digitalio_digitalinout_get_value(self);
@@ -138,6 +139,7 @@ void common_hal_digitalio_digitalinout_set_drive_mode(
if (value) {
common_hal_digitalio_digitalinout_set_value(self, value);
}
+ return DIGITALINOUT_OK;
}
digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode(
diff --git a/ports/atmel-samd/common-hal/pulseio/PWMOut.c b/ports/atmel-samd/common-hal/pulseio/PWMOut.c
index 1da0da844..b627dadc5 100644
--- a/ports/atmel-samd/common-hal/pulseio/PWMOut.c
+++ b/ports/atmel-samd/common-hal/pulseio/PWMOut.c
@@ -181,7 +181,7 @@ pwmout_result_t common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self,
mux_position = j;
// Claim channel.
tcc_channels[timer->index] |= (1 << tcc_channel(timer));
-
+ tcc_refcount[timer->index]++;
}
}
}
diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c
index eadd3e8f5..2b3e9826f 100644
--- a/ports/atmel-samd/supervisor/port.c
+++ b/ports/atmel-samd/supervisor/port.c
@@ -69,6 +69,7 @@
#include "samd/events.h"
#include "samd/external_interrupts.h"
#include "samd/dma.h"
+#include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/rtc/__init__.h"
#include "reset.h"
@@ -496,7 +497,12 @@ void port_sleep_until_interrupt(void) {
(void) __get_FPSCR();
}
#endif
- __WFI();
+ common_hal_mcu_disable_interrupts();
+ if (!tud_task_event_ready()) {
+ __DSB();
+ __WFI();
+ }
+ common_hal_mcu_enable_interrupts();
}
/**
diff --git a/ports/cxd56/common-hal/digitalio/DigitalInOut.c b/ports/cxd56/common-hal/digitalio/DigitalInOut.c
index c9af12e44..37b695567 100644
--- a/ports/cxd56/common-hal/digitalio/DigitalInOut.c
+++ b/ports/cxd56/common-hal/digitalio/DigitalInOut.c
@@ -70,7 +70,7 @@ void common_hal_digitalio_digitalinout_switch_to_input(digitalio_digitalinout_ob
board_gpio_config(self->pin->number, 0, true, true, pull);
}
-void common_hal_digitalio_digitalinout_switch_to_output(digitalio_digitalinout_obj_t *self, bool value, digitalio_drive_mode_t drive_mode) {
+digitalinout_result_t common_hal_digitalio_digitalinout_switch_to_output(digitalio_digitalinout_obj_t *self, bool value, digitalio_drive_mode_t drive_mode) {
self->input = false;
self->open_drain = drive_mode == DRIVE_MODE_OPEN_DRAIN;
board_gpio_write(self->pin->number, -1);
@@ -80,6 +80,7 @@ void common_hal_digitalio_digitalinout_switch_to_output(digitalio_digitalinout_o
board_gpio_write(self->pin->number, 0);
}
common_hal_digitalio_digitalinout_set_value(self, value);
+ return DIGITALINOUT_OK;
}
digitalio_direction_t common_hal_digitalio_digitalinout_get_direction(digitalio_digitalinout_obj_t *self) {
@@ -104,7 +105,7 @@ bool common_hal_digitalio_digitalinout_get_value(digitalio_digitalinout_obj_t *s
return board_gpio_read(self->pin->number);
}
-void common_hal_digitalio_digitalinout_set_drive_mode(digitalio_digitalinout_obj_t *self, digitalio_drive_mode_t drive_mode) {
+digitalinout_result_t common_hal_digitalio_digitalinout_set_drive_mode(digitalio_digitalinout_obj_t *self, digitalio_drive_mode_t drive_mode) {
if (drive_mode == DRIVE_MODE_PUSH_PULL) {
board_gpio_write(self->pin->number, -1);
board_gpio_config(self->pin->number, 0, false, true, PIN_FLOAT);
@@ -115,6 +116,7 @@ void common_hal_digitalio_digitalinout_set_drive_mode(digitalio_digitalinout_obj
board_gpio_write(self->pin->number, 0);
self->open_drain = true;
}
+ return DIGITALINOUT_OK;
}
digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode(digitalio_digitalinout_obj_t *self) {
diff --git a/ports/esp32s2/Makefile b/ports/esp32s2/Makefile
index be4b2f00f..1104c5289 100644
--- a/ports/esp32s2/Makefile
+++ b/ports/esp32s2/Makefile
@@ -31,6 +31,9 @@ else
endif
endif
+# If the flash PORT is not given, use the default /dev/tty.SLAB_USBtoUART.
+PORT ?= /dev/tty.SLAB_USBtoUART
+
# If the build directory is not given, make it reflect the board name.
BUILD ?= build-$(BOARD)
@@ -149,6 +152,7 @@ SRC_C += \
mphalport.c \
boards/$(BOARD)/board.c \
boards/$(BOARD)/pins.c \
+ modules/$(CIRCUITPY_MODULE).c \
lib/libc/string0.c \
lib/mp-readline/readline.c \
lib/oofatfs/ff.c \
@@ -270,7 +274,7 @@ $(BUILD)/firmware.bin: $(BUILD)/esp-idf/partition_table/partition-table.bin $(BU
$(Q)$(PYTHON) ../../tools/join_bins.py $@ 0x1000 $(BUILD)/esp-idf/bootloader/bootloader.bin 0x8000 $(BUILD)/esp-idf/partition_table/partition-table.bin 0x10000 $(BUILD)/circuitpython-firmware.bin
flash: $(BUILD)/firmware.bin
- esptool.py --chip esp32s2 -p /dev/tty.SLAB_USBtoUART -b 460800 --before=default_reset --after=hard_reset write_flash $(FLASH_FLAGS) 0x0000 $^
+ esptool.py --chip esp32s2 -p $(PORT) -b 460800 --before=default_reset --after=hard_reset write_flash $(FLASH_FLAGS) 0x0000 $^
include $(TOP)/py/mkrules.mk
diff --git a/ports/esp32s2/boards/espressif_saola_1_wroom/board.c b/ports/esp32s2/boards/espressif_saola_1_wroom/board.c
index a3a351f27..b7b2c4ef5 100644
--- a/ports/esp32s2/boards/espressif_saola_1_wroom/board.c
+++ b/ports/esp32s2/boards/espressif_saola_1_wroom/board.c
@@ -26,8 +26,16 @@
#include "boards/board.h"
#include "mpconfigboard.h"
+#include "shared-bindings/microcontroller/Pin.h"
void board_init(void) {
+ // USB
+ never_reset_pin(&pin_GPIO19);
+ never_reset_pin(&pin_GPIO20);
+
+ // Debug UART
+ never_reset_pin(&pin_GPIO43);
+ never_reset_pin(&pin_GPIO44);
}
bool board_requests_safe_mode(void) {
diff --git a/ports/esp32s2/boards/espressif_saola_1_wroom/mpconfigboard.mk b/ports/esp32s2/boards/espressif_saola_1_wroom/mpconfigboard.mk
index aa82588a5..cd2735615 100644
--- a/ports/esp32s2/boards/espressif_saola_1_wroom/mpconfigboard.mk
+++ b/ports/esp32s2/boards/espressif_saola_1_wroom/mpconfigboard.mk
@@ -18,3 +18,5 @@ CIRCUITPY_MICROCONTROLLER = 0
CIRCUITPY_ESP_FLASH_MODE=dio
CIRCUITPY_ESP_FLASH_FREQ=40m
CIRCUITPY_ESP_FLASH_SIZE=4MB
+
+CIRCUITPY_MODULE=wroom
diff --git a/ports/esp32s2/boards/espressif_saola_1_wrover/board.c b/ports/esp32s2/boards/espressif_saola_1_wrover/board.c
index a3a351f27..b7b2c4ef5 100644
--- a/ports/esp32s2/boards/espressif_saola_1_wrover/board.c
+++ b/ports/esp32s2/boards/espressif_saola_1_wrover/board.c
@@ -26,8 +26,16 @@
#include "boards/board.h"
#include "mpconfigboard.h"
+#include "shared-bindings/microcontroller/Pin.h"
void board_init(void) {
+ // USB
+ never_reset_pin(&pin_GPIO19);
+ never_reset_pin(&pin_GPIO20);
+
+ // Debug UART
+ never_reset_pin(&pin_GPIO43);
+ never_reset_pin(&pin_GPIO44);
}
bool board_requests_safe_mode(void) {
diff --git a/ports/esp32s2/boards/espressif_saola_1_wrover/mpconfigboard.mk b/ports/esp32s2/boards/espressif_saola_1_wrover/mpconfigboard.mk
index ff7e6228a..0b847de94 100644
--- a/ports/esp32s2/boards/espressif_saola_1_wrover/mpconfigboard.mk
+++ b/ports/esp32s2/boards/espressif_saola_1_wrover/mpconfigboard.mk
@@ -18,3 +18,5 @@ CIRCUITPY_MICROCONTROLLER = 0
CIRCUITPY_ESP_FLASH_MODE=dio
CIRCUITPY_ESP_FLASH_FREQ=40m
CIRCUITPY_ESP_FLASH_SIZE=4MB
+
+CIRCUITPY_MODULE=wrover
diff --git a/ports/esp32s2/common-hal/digitalio/DigitalInOut.c b/ports/esp32s2/common-hal/digitalio/DigitalInOut.c
index 349da6bf4..7745a9c0a 100644
--- a/ports/esp32s2/common-hal/digitalio/DigitalInOut.c
+++ b/ports/esp32s2/common-hal/digitalio/DigitalInOut.c
@@ -30,24 +30,18 @@
#include "driver/gpio.h"
-
-#include "esp_log.h"
-
-static const char* TAG = "CircuitPython digitalio";
+#include "esp-idf/components/soc/include/hal/gpio_hal.h"
void common_hal_digitalio_digitalinout_never_reset(
digitalio_digitalinout_obj_t *self) {
- (void)self;
+ never_reset_pin_number(self->pin->number);
}
digitalinout_result_t common_hal_digitalio_digitalinout_construct(
digitalio_digitalinout_obj_t *self, const mcu_pin_obj_t *pin) {
-
- // claim_pin(pin);
+ claim_pin(pin);
self->pin = pin;
- ESP_EARLY_LOGW(TAG, "construct %d", pin->number);
-
return DIGITALINOUT_OK;
}
@@ -60,78 +54,86 @@ void common_hal_digitalio_digitalinout_deinit(digitalio_digitalinout_obj_t *self
return;
}
- // reset_pin_number(0, self->pin->number);
+ reset_pin_number(self->pin->number);
self->pin = mp_const_none;
}
void common_hal_digitalio_digitalinout_switch_to_input(
digitalio_digitalinout_obj_t *self, digitalio_pull_t pull) {
- gpio_config_t config = {
- .pin_bit_mask = 1 << self->pin->number,
- .mode = GPIO_MODE_INPUT
- };
- if (pull == PULL_UP) {
- config.pull_up_en = GPIO_PULLUP_ENABLE;
- } else if (pull == PULL_DOWN) {
- config.pull_down_en = GPIO_PULLDOWN_ENABLE;
- }
-
- gpio_config(&config);
+ common_hal_digitalio_digitalinout_set_pull(self, pull);
+ gpio_set_direction(self->pin->number, GPIO_MODE_DEF_INPUT);
}
-void common_hal_digitalio_digitalinout_switch_to_output(
+digitalinout_result_t common_hal_digitalio_digitalinout_switch_to_output(
digitalio_digitalinout_obj_t *self, bool value,
digitalio_drive_mode_t drive_mode) {
- gpio_config_t config = {
- .pin_bit_mask = 1ULL << self->pin->number,
- .mode = GPIO_MODE_OUTPUT
- };
- if (drive_mode == DRIVE_MODE_OPEN_DRAIN) {
- config.mode = GPIO_MODE_OUTPUT_OD;
- }
gpio_set_level(self->pin->number, value);
- gpio_config(&config);
+ return common_hal_digitalio_digitalinout_set_drive_mode(self, drive_mode);
}
digitalio_direction_t common_hal_digitalio_digitalinout_get_direction(
digitalio_digitalinout_obj_t *self) {
-
+ uint32_t iomux = READ_PERI_REG(GPIO_PIN_MUX_REG[self->pin->number]);
+ if ((iomux & FUN_IE) != 0) {
+ return DIRECTION_INPUT;
+ }
return DIRECTION_OUTPUT;
}
void common_hal_digitalio_digitalinout_set_value(
digitalio_digitalinout_obj_t *self, bool value) {
- ESP_EARLY_LOGW(TAG, "set %d %d", self->pin->number, value);
gpio_set_level(self->pin->number, value);
}
bool common_hal_digitalio_digitalinout_get_value(
digitalio_digitalinout_obj_t *self) {
- return true;
+ return gpio_get_level(self->pin->number) == 1;
}
-void common_hal_digitalio_digitalinout_set_drive_mode(
+digitalinout_result_t common_hal_digitalio_digitalinout_set_drive_mode(
digitalio_digitalinout_obj_t *self,
digitalio_drive_mode_t drive_mode) {
- (void)self;
- (void)drive_mode;
+ gpio_num_t number = self->pin->number;
+ gpio_mode_t mode;
+ if (drive_mode == DRIVE_MODE_OPEN_DRAIN) {
+ mode = GPIO_MODE_DEF_OD;
+ } else {
+ mode = GPIO_MODE_DEF_OUTPUT;
+ }
+ esp_err_t result = gpio_set_direction(number, mode);
+ if (result != ESP_OK) {
+ return DIGITALINOUT_INPUT_ONLY;
+ }
+ return DIGITALINOUT_OK;
}
digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode(
digitalio_digitalinout_obj_t *self) {
- // if (common_hal_digitalio_digitalinout_get_direction(self) == DIRECTION_OUTPUT)
- // return DRIVE_MODE_PUSH_PULL;
- // else
- return DRIVE_MODE_OPEN_DRAIN;
+ if (GPIO_HAL_GET_HW(GPIO_PORT_0)->pin[self->pin->number].pad_driver == 1) {
+ return DRIVE_MODE_OPEN_DRAIN;
+ }
+ return DRIVE_MODE_PUSH_PULL;
}
void common_hal_digitalio_digitalinout_set_pull(
digitalio_digitalinout_obj_t *self, digitalio_pull_t pull) {
- (void)self;
- (void)pull;
+ gpio_num_t number = self->pin->number;
+ gpio_pullup_dis(number);
+ gpio_pulldown_dis(number);
+ if (pull == PULL_UP) {
+ gpio_pullup_en(number);
+ } else if (pull == PULL_DOWN) {
+ gpio_pulldown_en(number);
+ }
}
digitalio_pull_t common_hal_digitalio_digitalinout_get_pull(
digitalio_digitalinout_obj_t *self) {
+ gpio_num_t gpio_num = self->pin->number;
+ if (REG_GET_BIT(GPIO_PIN_MUX_REG[gpio_num], FUN_PU) == 1) {
+ return PULL_UP;
+ } else if (REG_GET_BIT(GPIO_PIN_MUX_REG[gpio_num], FUN_PD) == 1) {
+ return PULL_DOWN;
+ }
return PULL_NONE;
}
diff --git a/ports/esp32s2/common-hal/microcontroller/Pin.c b/ports/esp32s2/common-hal/microcontroller/Pin.c
index e142191fd..4c39eea16 100644
--- a/ports/esp32s2/common-hal/microcontroller/Pin.c
+++ b/ports/esp32s2/common-hal/microcontroller/Pin.c
@@ -29,18 +29,51 @@
#include "py/mphal.h"
+#include "esp-idf/components/driver/include/driver/gpio.h"
+#include "esp-idf/components/soc/include/hal/gpio_hal.h"
+
+STATIC uint32_t never_reset_pins[2];
+STATIC uint32_t in_use[2];
+
+void never_reset_pin_number(gpio_num_t pin_number) {
+ never_reset_pins[pin_number / 32] |= 1 << pin_number % 32;
+}
+
+void never_reset_pin(const mcu_pin_obj_t* pin) {
+ never_reset_pin_number(pin->number);
+}
+
// Mark pin as free and return it to a quiescent state.
-void reset_pin_number(uint8_t pin_port, uint8_t pin_number) {
+void reset_pin_number(gpio_num_t pin_number) {
+ never_reset_pins[pin_number / 32] &= ~(1 << pin_number % 32);
+ in_use[pin_number / 32] &= ~(1 << pin_number % 32);
}
+void reset_all_pins(void) {
+ for (uint8_t i = 0; i < GPIO_PIN_COUNT; i++) {
+ uint32_t iomux_address = GPIO_PIN_MUX_REG[i];
+ if (iomux_address == 0 ||
+ (never_reset_pins[i / 32] & (1 << i % 32)) != 0) {
+ continue;
+ }
+ gpio_set_direction(i, GPIO_MODE_DEF_INPUT);
+ gpio_pullup_dis(i);
+ gpio_pulldown_dis(i);
+ }
+ in_use[0] = 0;
+ in_use[1] = 0;
+}
void claim_pin(const mcu_pin_obj_t* pin) {
+ in_use[pin->number / 32] |= (1 << pin->number % 32);
}
-bool pin_number_is_free(uint8_t pin_port, uint8_t pin_number) {
- return true;
+bool pin_number_is_free(gpio_num_t pin_number) {
+ uint8_t offset = pin_number / 32;
+ uint8_t mask = 1 << pin_number % 32;
+ return (never_reset_pins[offset] & mask) == 0 && (in_use[offset] & mask) == 0;
}
bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t *pin) {
- return pin_number_is_free(0, pin->number);
+ return pin_number_is_free(pin->number);
}
diff --git a/ports/esp32s2/common-hal/microcontroller/Pin.h b/ports/esp32s2/common-hal/microcontroller/Pin.h
index ab5574422..6f47b1ed3 100644
--- a/ports/esp32s2/common-hal/microcontroller/Pin.h
+++ b/ports/esp32s2/common-hal/microcontroller/Pin.h
@@ -34,11 +34,10 @@
void reset_all_pins(void);
// reset_pin_number takes the pin number instead of the pointer so that objects don't
// need to store a full pointer.
-void reset_pin_number(uint8_t pin_port, uint8_t pin_number);
+void reset_pin_number(gpio_num_t pin_number);
void claim_pin(const mcu_pin_obj_t* pin);
-bool pin_number_is_free(uint8_t pin_port, uint8_t pin_number);
-void never_reset_pin_number(uint8_t pin_port, uint8_t pin_number);
-// GPIO_TypeDef * pin_port(uint8_t pin_port);
-uint16_t pin_mask(uint8_t pin_number);
+bool pin_number_is_free(gpio_num_t pin_number);
+void never_reset_pin_number(gpio_num_t pin_number);
+void never_reset_pin(const mcu_pin_obj_t* pin);
#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_MICROCONTROLLER_PIN_H
diff --git a/ports/esp32s2/common-hal/microcontroller/__init__.c b/ports/esp32s2/common-hal/microcontroller/__init__.c
index a36d0c440..6b2e18673 100644
--- a/ports/esp32s2/common-hal/microcontroller/__init__.c
+++ b/ports/esp32s2/common-hal/microcontroller/__init__.c
@@ -39,24 +39,31 @@
#include "supervisor/filesystem.h"
#include "supervisor/shared/safe_mode.h"
+#include "freertos/FreeRTOS.h"
+
void common_hal_mcu_delay_us(uint32_t delay) {
}
volatile uint32_t nesting_count = 0;
+static portMUX_TYPE cp_mutex = portMUX_INITIALIZER_UNLOCKED;
void common_hal_mcu_disable_interrupts(void) {
+ if (nesting_count == 0) {
+ portENTER_CRITICAL(&cp_mutex);
+ }
nesting_count++;
}
void common_hal_mcu_enable_interrupts(void) {
if (nesting_count == 0) {
-
+ // Maybe log here because it's very bad.
}
nesting_count--;
if (nesting_count > 0) {
return;
}
+ portEXIT_CRITICAL(&cp_mutex);
}
void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) {
diff --git a/ports/esp32s2/modules/module.h b/ports/esp32s2/modules/module.h
new file mode 100644
index 000000000..6c40e30e0
--- /dev/null
+++ b/ports/esp32s2/modules/module.h
@@ -0,0 +1,35 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+
+#ifndef MICROPY_INCLUDED_ESP32S2_MODULES_MODULE_H
+#define MICROPY_INCLUDED_ESP32S2_MODULES_MODULE_H
+
+#include "shared-bindings/microcontroller/Pin.h"
+
+void never_reset_module_internal_pins(void);
+
+#endif // MICROPY_INCLUDED_ESP32S2_MODULES_MODULE_H
diff --git a/ports/esp32s2/modules/none.c b/ports/esp32s2/modules/none.c
new file mode 100644
index 000000000..9b5433bd9
--- /dev/null
+++ b/ports/esp32s2/modules/none.c
@@ -0,0 +1,28 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+void never_reset_module_internal_pins(void) {
+}
diff --git a/ports/esp32s2/modules/wroom.c b/ports/esp32s2/modules/wroom.c
new file mode 100644
index 000000000..16c586118
--- /dev/null
+++ b/ports/esp32s2/modules/wroom.c
@@ -0,0 +1,37 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "modules/module.h"
+
+void never_reset_module_internal_pins(void) {
+ // SPI Flash
+ never_reset_pin(&pin_GPIO27);
+ never_reset_pin(&pin_GPIO28);
+ never_reset_pin(&pin_GPIO29);
+ never_reset_pin(&pin_GPIO30);
+ never_reset_pin(&pin_GPIO31);
+ never_reset_pin(&pin_GPIO32);
+}
diff --git a/ports/esp32s2/modules/wrover.c b/ports/esp32s2/modules/wrover.c
new file mode 100644
index 000000000..d589a8fd4
--- /dev/null
+++ b/ports/esp32s2/modules/wrover.c
@@ -0,0 +1,38 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "modules/module.h"
+
+void never_reset_module_internal_pins(void) {
+ // SPI Flash and RAM
+ never_reset_pin(&pin_GPIO26);
+ never_reset_pin(&pin_GPIO27);
+ never_reset_pin(&pin_GPIO28);
+ never_reset_pin(&pin_GPIO29);
+ never_reset_pin(&pin_GPIO30);
+ never_reset_pin(&pin_GPIO31);
+ never_reset_pin(&pin_GPIO32);
+}
diff --git a/ports/esp32s2/mpconfigport.mk b/ports/esp32s2/mpconfigport.mk
index 6d66d9057..c9df81db0 100644
--- a/ports/esp32s2/mpconfigport.mk
+++ b/ports/esp32s2/mpconfigport.mk
@@ -33,3 +33,5 @@ CIRCUITPY_TOUCHIO = 0
# Enable USB support
CIRCUITPY_USB_HID = 1
CIRCUITPY_USB_MIDI = 1
+
+CIRCUITPY_MODULE ?= none
diff --git a/ports/esp32s2/peripherals/pins.h b/ports/esp32s2/peripherals/pins.h
index 1a74b0367..07d0b908e 100644
--- a/ports/esp32s2/peripherals/pins.h
+++ b/ports/esp32s2/peripherals/pins.h
@@ -33,10 +33,12 @@
#include <stdint.h>
#include "esp32s2_peripherals_config.h"
+#include "esp-idf/config/sdkconfig.h"
+#include "esp-idf/components/soc/include/hal/gpio_types.h"
typedef struct {
PIN_PREFIX_FIELDS
- uint8_t number;
+ gpio_num_t number;
} mcu_pin_obj_t;
extern const mcu_pin_obj_t pin_GPIO0;
diff --git a/ports/esp32s2/supervisor/port.c b/ports/esp32s2/supervisor/port.c
index 4389bb6a8..9e83e5778 100644
--- a/ports/esp32s2/supervisor/port.c
+++ b/ports/esp32s2/supervisor/port.c
@@ -29,10 +29,12 @@
#include <sys/time.h>
#include "supervisor/port.h"
#include "boards/board.h"
+#include "modules/module.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
+#include "common-hal/microcontroller/Pin.h"
#include "supervisor/memory.h"
#include "supervisor/shared/tick.h"
@@ -56,12 +58,14 @@ safe_mode_t port_init(void) {
if (result != ESP_OK) {
ESP_EARLY_LOGE(TAG, "Unable to create tick timer.");
}
+ never_reset_module_internal_pins();
ESP_EARLY_LOGW(TAG, "port init done");
return NO_SAFE_MODE;
}
void reset_port(void) {
+ reset_all_pins();
}
void reset_to_bootloader(void) {
diff --git a/ports/litex/common-hal/digitalio/DigitalInOut.c b/ports/litex/common-hal/digitalio/DigitalInOut.c
index 574d0de56..26f79f16d 100644
--- a/ports/litex/common-hal/digitalio/DigitalInOut.c
+++ b/ports/litex/common-hal/digitalio/DigitalInOut.c
@@ -64,12 +64,13 @@ void common_hal_digitalio_digitalinout_switch_to_input(
touch_oe_write(touch_oe_read() & ~(1 << self->pin->number));
}
-void common_hal_digitalio_digitalinout_switch_to_output(
+digitalinout_result_t common_hal_digitalio_digitalinout_switch_to_output(
digitalio_digitalinout_obj_t *self, bool value,
digitalio_drive_mode_t drive_mode) {
(void)drive_mode;
common_hal_digitalio_digitalinout_set_value(self, value);
touch_oe_write(touch_oe_read() | (1 << self->pin->number));
+ return DIGITALINOUT_OK;
}
digitalio_direction_t common_hal_digitalio_digitalinout_get_direction(
@@ -92,11 +93,12 @@ bool common_hal_digitalio_digitalinout_get_value(
return !!(touch_i_read() & (1 << self->pin->number));
}
-void common_hal_digitalio_digitalinout_set_drive_mode(
+digitalinout_result_t common_hal_digitalio_digitalinout_set_drive_mode(
digitalio_digitalinout_obj_t *self,
digitalio_drive_mode_t drive_mode) {
(void)self;
(void)drive_mode;
+ return DIGITALINOUT_OK;
}
digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode(
diff --git a/ports/mimxrt10xx/common-hal/busio/I2C.c b/ports/mimxrt10xx/common-hal/busio/I2C.c
index 0bb7dcc6c..cad0fef98 100644
--- a/ports/mimxrt10xx/common-hal/busio/I2C.c
+++ b/ports/mimxrt10xx/common-hal/busio/I2C.c
@@ -81,7 +81,7 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
}
if(self->sda_pin == NULL || self->scl_pin == NULL) {
- mp_raise_RuntimeError(translate("Invalid I2C pin selection"));
+ mp_raise_ValueError(translate("Invalid I2C pin selection"));
} else {
self->i2c = mcu_i2c_banks[self->sda_pin->bank_idx - 1];
}
diff --git a/ports/mimxrt10xx/common-hal/digitalio/DigitalInOut.c b/ports/mimxrt10xx/common-hal/digitalio/DigitalInOut.c
index 4931599d4..e4eda9f4f 100644
--- a/ports/mimxrt10xx/common-hal/digitalio/DigitalInOut.c
+++ b/ports/mimxrt10xx/common-hal/digitalio/DigitalInOut.c
@@ -97,7 +97,7 @@ void common_hal_digitalio_digitalinout_switch_to_input(
common_hal_digitalio_digitalinout_set_pull(self, pull);
}
-void common_hal_digitalio_digitalinout_switch_to_output(
+digitalinout_result_t common_hal_digitalio_digitalinout_switch_to_output(
digitalio_digitalinout_obj_t* self, bool value,
digitalio_drive_mode_t drive_mode) {
self->output = true;
@@ -108,6 +108,7 @@ void common_hal_digitalio_digitalinout_switch_to_output(
const gpio_pin_config_t config = { kGPIO_DigitalOutput, value, kGPIO_NoIntmode };
GPIO_PinInit(self->pin->gpio, self->pin->number, &config);
+ return DIGITALINOUT_OK;
}
digitalio_direction_t common_hal_digitalio_digitalinout_get_direction(
@@ -125,7 +126,7 @@ bool common_hal_digitalio_digitalinout_get_value(
return GPIO_PinRead(self->pin->gpio, self->pin->number);
}
-void common_hal_digitalio_digitalinout_set_drive_mode(
+digitalinout_result_t common_hal_digitalio_digitalinout_set_drive_mode(
digitalio_digitalinout_obj_t* self,
digitalio_drive_mode_t drive_mode) {
bool value = common_hal_digitalio_digitalinout_get_value(self);
@@ -138,6 +139,7 @@ void common_hal_digitalio_digitalinout_set_drive_mode(
if (value) {
common_hal_digitalio_digitalinout_set_value(self, value);
}
+ return DIGITALINOUT_OK;
}
digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode(
diff --git a/ports/nrf/boards/hiibot_bluefi/board.c b/ports/nrf/boards/hiibot_bluefi/board.c
new file mode 100644
index 000000000..6b53cab13
--- /dev/null
+++ b/ports/nrf/boards/hiibot_bluefi/board.c
@@ -0,0 +1,103 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "boards/board.h"
+#include "mpconfigboard.h"
+
+#include "shared-bindings/busio/SPI.h"
+#include "shared-bindings/displayio/FourWire.h"
+#include "shared-module/displayio/__init__.h"
+#include "shared-module/displayio/mipi_constants.h"
+
+displayio_fourwire_obj_t board_display_obj;
+
+#define DELAY 0x80
+
+uint8_t display_init_sequence[] = {
+ 0x01, 0 | DELAY, 150, // SWRESET
+ 0x11, 0 | DELAY, 255, // SLPOUT
+ 0x36, 1, 0b10100000, // _MADCTL for rotation 0
+ 0x3a, 1, 0x55, // COLMOD - 16bit color
+ 0x21, 0 | DELAY, 10, // _INVON
+ 0x13, 0 | DELAY, 10, // _NORON
+ 0x29, 0 | DELAY, 255, // _DISPON
+};
+
+void board_init(void) {
+ busio_spi_obj_t* spi = &displays[0].fourwire_bus.inline_bus;
+ common_hal_busio_spi_construct(spi, &pin_P0_07, &pin_P1_08, NULL); // SCK, MOSI, MISO
+ common_hal_busio_spi_never_reset(spi);
+
+ displayio_fourwire_obj_t* bus = &displays[0].fourwire_bus;
+ bus->base.type = &displayio_fourwire_type;
+ common_hal_displayio_fourwire_construct(bus,
+ spi,
+ &pin_P0_27, // TFT_DC Command or data
+ &pin_P0_05, // TFT_CS Chip select
+ NULL, // no TFT_RST Reset
+ //&pin_P1_14, // TFT_RST Reset
+ 60000000, // Baudrate
+ 0, // Polarity
+ 0); // Phase
+
+ displayio_display_obj_t* display = &displays[0].display;
+ display->base.type = &displayio_display_type;
+ common_hal_displayio_display_construct(display,
+ bus,
+ 240, // Width (after rotation)
+ 240, // Height (after rotation)
+ 80, // column start
+ 0, // row start
+ 180, // rotation
+ 16, // Color depth
+ false, // Grayscale
+ false, // Pixels in a byte share a row. Only used for depth < 8
+ 1, // bytes per cell. Only valid for depths < 8
+ false, // reverse_pixels_in_byte. Only valid for depths < 8
+ true, // reverse_pixels_in_word
+ MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
+ MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
+ MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command
+ 0x37, // set vertical scroll command
+ display_init_sequence,
+ sizeof(display_init_sequence),
+ &pin_P1_13, // backlight pin
+ NO_BRIGHTNESS_COMMAND,
+ 1.0f, // brightness (ignored)
+ true, // auto_brightness
+ false, // single_byte_bounds
+ false, // data_as_commands
+ true, // auto_refresh
+ 60, // native_frames_per_second
+ true); // backlight_on_high
+}
+
+bool board_requests_safe_mode(void) {
+ return false;
+}
+
+void reset_board(void) {
+}
diff --git a/ports/nrf/boards/hiibot_bluefi/mpconfigboard.h b/ports/nrf/boards/hiibot_bluefi/mpconfigboard.h
new file mode 100644
index 000000000..c4833e719
--- /dev/null
+++ b/ports/nrf/boards/hiibot_bluefi/mpconfigboard.h
@@ -0,0 +1,67 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2016 Glenn Ruben Bakke
+ * Copyright (c) 2018 Dan Halbert for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "nrfx/hal/nrf_gpio.h"
+
+#define MICROPY_HW_BOARD_NAME "HiiBot BlueFi"
+#define MICROPY_HW_MCU_NAME "nRF52840"
+
+#define MICROPY_HW_NEOPIXEL (&pin_P1_10) // P18 / D18
+
+#define MICROPY_HW_LED_STATUS (&pin_P1_12) // P17 / D17
+
+#if QSPI_FLASH_FILESYSTEM
+#define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(1, 1)
+#define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(1, 4)
+#define MICROPY_QSPI_DATA2 NRF_GPIO_PIN_MAP(1, 6)
+#define MICROPY_QSPI_DATA3 NRF_GPIO_PIN_MAP(1, 5)
+#define MICROPY_QSPI_SCK NRF_GPIO_PIN_MAP(1, 3)
+#define MICROPY_QSPI_CS NRF_GPIO_PIN_MAP(1, 2)
+#endif
+
+#if SPI_FLASH_FILESYSTEM
+#define SPI_FLASH_MOSI_PIN &pin_P1_01
+#define SPI_FLASH_MISO_PIN &pin_P1_04
+#define SPI_FLASH_SCK_PIN &pin_P1_03
+#define SPI_FLASH_CS_PIN &pin_P1_02
+#endif
+
+// No 32kHz crystal. THere's a 32MHz crystal in the nRF module.
+#define BOARD_HAS_32KHZ_XTAL (0)
+
+#define DEFAULT_I2C_BUS_SCL (&pin_P0_00)
+#define DEFAULT_I2C_BUS_SDA (&pin_P0_31)
+
+#define DEFAULT_SPI_BUS_SCK (&pin_P0_06)
+#define DEFAULT_SPI_BUS_MOSI (&pin_P0_26)
+#define DEFAULT_SPI_BUS_MISO (&pin_P0_04)
+
+#define DEFAULT_UART_BUS_RX (&pin_P0_28)
+#define DEFAULT_UART_BUS_TX (&pin_P0_02)
+
+
+
diff --git a/ports/nrf/boards/hiibot_bluefi/mpconfigboard.mk b/ports/nrf/boards/hiibot_bluefi/mpconfigboard.mk
new file mode 100644
index 000000000..ad477e534
--- /dev/null
+++ b/ports/nrf/boards/hiibot_bluefi/mpconfigboard.mk
@@ -0,0 +1,18 @@
+USB_VID = 0x239A
+USB_PID = 0x0016
+USB_PRODUCT = "HiiBot BlueFi"
+USB_MANUFACTURER = "HiiBot"
+
+MCU_CHIP = nrf52840
+
+QSPI_FLASH_FILESYSTEM = 1
+EXTERNAL_FLASH_DEVICE_COUNT = 1
+EXTERNAL_FLASH_DEVICES = "W25Q16JV_IQ"
+
+# Allocate two, not just one I2C peripheral for Bluefi, so that we have both
+# on-board and off-board I2C available.
+# When SPIM3 becomes available we'll be able to have two I2C and two SPI peripherals.
+# We use a CFLAGS define here because there are include order issues
+# if we try to include "mpconfigport.h" into nrfx_config.h .
+CFLAGS += -DCIRCUITPY_NRF_NUM_I2C=2
+
diff --git a/ports/nrf/boards/hiibot_bluefi/pins.c b/ports/nrf/boards/hiibot_bluefi/pins.c
new file mode 100644
index 000000000..340ea948c
--- /dev/null
+++ b/ports/nrf/boards/hiibot_bluefi/pins.c
@@ -0,0 +1,180 @@
+#include "shared-bindings/board/__init__.h"
+
+#include "boards/board.h"
+#include "shared-module/displayio/__init__.h"
+
+STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_P0), MP_ROM_PTR(&pin_P0_28) },
+ { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_P0_28) },
+ { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_P0_28) },
+ { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_P0_28) },
+
+ { MP_ROM_QSTR(MP_QSTR_P1), MP_ROM_PTR(&pin_P0_02) },
+ { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_P0_02) },
+ { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_P0_02) },
+ { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_P0_02) },
+
+ { MP_ROM_QSTR(MP_QSTR_P2), MP_ROM_PTR(&pin_P0_29) },
+ { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_P0_29) },
+ { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_P0_29) },
+
+ { MP_ROM_QSTR(MP_QSTR_P3), MP_ROM_PTR(&pin_P0_30) },
+ { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_P0_30) },
+ { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_P0_30) },
+
+ { MP_ROM_QSTR(MP_QSTR_P4), MP_ROM_PTR(&pin_P0_03) },
+ { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_P0_03) },
+ { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_P0_03) },
+
+ { MP_ROM_QSTR(MP_QSTR_P5), MP_ROM_PTR(&pin_P1_07) },
+ { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_P1_07) },
+ { MP_ROM_QSTR(MP_QSTR_BUTTON_A), MP_ROM_PTR(&pin_P1_07) },
+
+ { MP_ROM_QSTR(MP_QSTR_P6), MP_ROM_PTR(&pin_P0_08) },
+ { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_P0_08) },
+
+ { MP_ROM_QSTR(MP_QSTR_P7), MP_ROM_PTR(&pin_P0_25) },
+ { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_P0_25) },
+
+ { MP_ROM_QSTR(MP_QSTR_P8), MP_ROM_PTR(&pin_P0_23) },
+ { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_P0_23) },
+
+ { MP_ROM_QSTR(MP_QSTR_P9), MP_ROM_PTR(&pin_P0_21) },
+ { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_P0_21) },
+
+ { MP_ROM_QSTR(MP_QSTR_P10), MP_ROM_PTR(&pin_P0_19) },
+ { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_P0_19) },
+
+ { MP_ROM_QSTR(MP_QSTR_P11), MP_ROM_PTR(&pin_P1_09) },
+ { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_P1_09) },
+ { MP_ROM_QSTR(MP_QSTR_BUTTON_B), MP_ROM_PTR(&pin_P1_09) },
+
+ { MP_ROM_QSTR(MP_QSTR_P12), MP_ROM_PTR(&pin_P0_16) },
+ { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_P0_16) },
+
+ { MP_ROM_QSTR(MP_QSTR_P13), MP_ROM_PTR(&pin_P0_06) },
+ { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_P0_06) },
+ { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_P0_06) },
+
+ { MP_ROM_QSTR(MP_QSTR_P14), MP_ROM_PTR(&pin_P0_04) },
+ { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_P0_04) },
+ { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_P0_04) },
+ { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_P0_04) },
+
+ { MP_ROM_QSTR(MP_QSTR_P15), MP_ROM_PTR(&pin_P0_26) },
+ { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_P0_26) },
+ { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_P0_26) },
+
+ { MP_ROM_QSTR(MP_QSTR_P16), MP_ROM_PTR(&pin_P0_01) },
+ { MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_P0_01) },
+
+ { MP_ROM_QSTR(MP_QSTR_P17), MP_ROM_PTR(&pin_P1_12) },
+ { MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_P1_12) },
+ { MP_ROM_QSTR(MP_QSTR_REDLED), MP_ROM_PTR(&pin_P1_12) },
+
+ { MP_ROM_QSTR(MP_QSTR_P18), MP_ROM_PTR(&pin_P1_10) },
+ { MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_P1_10) },
+ { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_P1_10) },
+
+ { MP_ROM_QSTR(MP_QSTR_P19), MP_ROM_PTR(&pin_P0_00) },
+ { MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_P0_00) },
+ { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_P0_00) },
+
+ { MP_ROM_QSTR(MP_QSTR_P20), MP_ROM_PTR(&pin_P0_31) },
+ { MP_ROM_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_P0_31) },
+ { MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_P0_31) },
+ { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_P0_31) },
+
+ { MP_ROM_QSTR(MP_QSTR_P21), MP_ROM_PTR(&pin_P0_09) },
+ { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_P0_09) },
+ { MP_ROM_QSTR(MP_QSTR_MICROPHONE_CLOCK), MP_ROM_PTR(&pin_P0_09) },
+
+ { MP_ROM_QSTR(MP_QSTR_P22), MP_ROM_PTR(&pin_P0_10) },
+ { MP_ROM_QSTR(MP_QSTR_D22), MP_ROM_PTR(&pin_P0_10) },
+ { MP_ROM_QSTR(MP_QSTR_MICROPHONE_DATA), MP_ROM_PTR(&pin_P0_10) },
+
+ { MP_ROM_QSTR(MP_QSTR_P23), MP_ROM_PTR(&pin_P0_07) },
+ { MP_ROM_QSTR(MP_QSTR_D23), MP_ROM_PTR(&pin_P0_07) },
+ { MP_ROM_QSTR(MP_QSTR_TFT_SCK), MP_ROM_PTR(&pin_P0_07) },
+
+ { MP_ROM_QSTR(MP_QSTR_P24), MP_ROM_PTR(&pin_P1_08) },
+ { MP_ROM_QSTR(MP_QSTR_D24), MP_ROM_PTR(&pin_P1_08) },
+ { MP_ROM_QSTR(MP_QSTR_TFT_MOSI), MP_ROM_PTR(&pin_P1_08) },
+
+ { MP_ROM_QSTR(MP_QSTR_P25), MP_ROM_PTR(&pin_P0_05) },
+ { MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_P0_05) },
+ { MP_ROM_QSTR(MP_QSTR_TFT_CS), MP_ROM_PTR(&pin_P0_05) },
+
+ { MP_ROM_QSTR(MP_QSTR_P26), MP_ROM_PTR(&pin_P0_27) },
+ { MP_ROM_QSTR(MP_QSTR_D26), MP_ROM_PTR(&pin_P0_27) },
+ { MP_ROM_QSTR(MP_QSTR_TFT_DC), MP_ROM_PTR(&pin_P0_27) },
+
+ { MP_ROM_QSTR(MP_QSTR_P27), MP_ROM_PTR(&pin_P1_14) },
+ { MP_ROM_QSTR(MP_QSTR_D27), MP_ROM_PTR(&pin_P1_14) },
+ { MP_ROM_QSTR(MP_QSTR_TFT_RESET), MP_ROM_PTR(&pin_P1_14) },
+ { MP_ROM_QSTR(MP_QSTR_TFT_BACKLIGHT), MP_ROM_PTR(&pin_P1_14) },
+
+ // P28~P33/D28~D33 connecte into QSPI FlashROM (W25Q16JV_IQ)
+
+ { MP_ROM_QSTR(MP_QSTR_P34), MP_ROM_PTR(&pin_P0_22) },
+ { MP_ROM_QSTR(MP_QSTR_D34), MP_ROM_PTR(&pin_P0_22) },
+ { MP_ROM_QSTR(MP_QSTR_WIFI_SCK), MP_ROM_PTR(&pin_P0_22) },
+
+ { MP_ROM_QSTR(MP_QSTR_P35), MP_ROM_PTR(&pin_P0_17) },
+ { MP_ROM_QSTR(MP_QSTR_D35), MP_ROM_PTR(&pin_P0_17) },
+ { MP_ROM_QSTR(MP_QSTR_WIFI_MISO), MP_ROM_PTR(&pin_P0_17) },
+
+ { MP_ROM_QSTR(MP_QSTR_P36), MP_ROM_PTR(&pin_P0_20) },
+ { MP_ROM_QSTR(MP_QSTR_D36), MP_ROM_PTR(&pin_P0_20) },
+ { MP_ROM_QSTR(MP_QSTR_WIFI_MOSI), MP_ROM_PTR(&pin_P0_20) },
+
+ { MP_ROM_QSTR(MP_QSTR_P37), MP_ROM_PTR(&pin_P0_15) },
+ { MP_ROM_QSTR(MP_QSTR_D37), MP_ROM_PTR(&pin_P0_15) },
+ { MP_ROM_QSTR(MP_QSTR_WIFI_BUSY), MP_ROM_PTR(&pin_P0_15) },
+
+ { MP_ROM_QSTR(MP_QSTR_P38), MP_ROM_PTR(&pin_P0_24) },
+ { MP_ROM_QSTR(MP_QSTR_D38), MP_ROM_PTR(&pin_P0_24) },
+ { MP_ROM_QSTR(MP_QSTR_WIFI_CS), MP_ROM_PTR(&pin_P0_24) },
+
+ { MP_ROM_QSTR(MP_QSTR_P39), MP_ROM_PTR(&pin_P1_00) },
+ { MP_ROM_QSTR(MP_QSTR_D39), MP_ROM_PTR(&pin_P1_00) },
+ { MP_ROM_QSTR(MP_QSTR_WIFI_RESET), MP_ROM_PTR(&pin_P1_00) },
+
+ { MP_ROM_QSTR(MP_QSTR_P40), MP_ROM_PTR(&pin_P0_13) },
+ { MP_ROM_QSTR(MP_QSTR_D40), MP_ROM_PTR(&pin_P0_13) },
+ { MP_ROM_QSTR(MP_QSTR_WIFI_PWR), MP_ROM_PTR(&pin_P0_13) },
+
+ { MP_ROM_QSTR(MP_QSTR_P41), MP_ROM_PTR(&pin_P0_11) },
+ { MP_ROM_QSTR(MP_QSTR_D41), MP_ROM_PTR(&pin_P0_11) },
+ { MP_ROM_QSTR(MP_QSTR_SENSORS_SCL), MP_ROM_PTR(&pin_P0_11) },
+
+ { MP_ROM_QSTR(MP_QSTR_P42), MP_ROM_PTR(&pin_P0_12) },
+ { MP_ROM_QSTR(MP_QSTR_D42), MP_ROM_PTR(&pin_P0_12) },
+ { MP_ROM_QSTR(MP_QSTR_SENSORS_SDA), MP_ROM_PTR(&pin_P0_12) },
+
+ { MP_ROM_QSTR(MP_QSTR_P43), MP_ROM_PTR(&pin_P0_14) },
+ { MP_ROM_QSTR(MP_QSTR_D43), MP_ROM_PTR(&pin_P0_14) },
+ { MP_ROM_QSTR(MP_QSTR_IMU_IRQ), MP_ROM_PTR(&pin_P0_14) },
+ { MP_ROM_QSTR(MP_QSTR_ACCELEROMETER_INTERRUPT), MP_ROM_PTR(&pin_P0_14) },
+
+ { MP_ROM_QSTR(MP_QSTR_P44), MP_ROM_PTR(&pin_P1_14) },
+ { MP_ROM_QSTR(MP_QSTR_D44), MP_ROM_PTR(&pin_P1_14) },
+ { MP_ROM_QSTR(MP_QSTR_WHITELED), MP_ROM_PTR(&pin_P1_14) },
+
+ { MP_ROM_QSTR(MP_QSTR_P45), MP_ROM_PTR(&pin_P1_11) },
+ { MP_ROM_QSTR(MP_QSTR_D45), MP_ROM_PTR(&pin_P1_11) },
+ { MP_ROM_QSTR(MP_QSTR_SPEAKER_ENABLE), MP_ROM_PTR(&pin_P1_11) },
+
+ { MP_ROM_QSTR(MP_QSTR_P46), MP_ROM_PTR(&pin_P1_15) },
+ { MP_ROM_QSTR(MP_QSTR_D46), MP_ROM_PTR(&pin_P1_15) },
+ { MP_ROM_QSTR(MP_QSTR_SPEAKER), MP_ROM_PTR(&pin_P1_15) },
+ { MP_ROM_QSTR(MP_QSTR_AUDIO), MP_ROM_PTR(&pin_P1_15) },
+
+ { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
+ { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
+ { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
+
+ { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)}
+};
+
+MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
diff --git a/ports/nrf/common-hal/digitalio/DigitalInOut.c b/ports/nrf/common-hal/digitalio/DigitalInOut.c
index c5a7a7dfb..2a72151b7 100644
--- a/ports/nrf/common-hal/digitalio/DigitalInOut.c
+++ b/ports/nrf/common-hal/digitalio/DigitalInOut.c
@@ -65,12 +65,13 @@ void common_hal_digitalio_digitalinout_switch_to_input(
common_hal_digitalio_digitalinout_set_pull(self, pull);
}
-void common_hal_digitalio_digitalinout_switch_to_output(
+digitalinout_result_t common_hal_digitalio_digitalinout_switch_to_output(
digitalio_digitalinout_obj_t *self, bool value,
digitalio_drive_mode_t drive_mode) {
common_hal_digitalio_digitalinout_set_drive_mode(self, drive_mode);
common_hal_digitalio_digitalinout_set_value(self, value);
+ return DIGITALINOUT_OK;
}
digitalio_direction_t common_hal_digitalio_digitalinout_get_direction(
@@ -92,7 +93,7 @@ bool common_hal_digitalio_digitalinout_get_value(
: nrf_gpio_pin_out_read(self->pin->number);
}
-void common_hal_digitalio_digitalinout_set_drive_mode(
+digitalinout_result_t common_hal_digitalio_digitalinout_set_drive_mode(
digitalio_digitalinout_obj_t *self,
digitalio_drive_mode_t drive_mode) {
nrf_gpio_cfg(self->pin->number,
@@ -101,6 +102,7 @@ void common_hal_digitalio_digitalinout_set_drive_mode(
NRF_GPIO_PIN_NOPULL,
drive_mode == DRIVE_MODE_OPEN_DRAIN ? NRF_GPIO_PIN_H0D1 : NRF_GPIO_PIN_H0H1,
NRF_GPIO_PIN_NOSENSE);
+ return DIGITALINOUT_OK;
}
digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode(
diff --git a/ports/stm/common-hal/digitalio/DigitalInOut.c b/ports/stm/common-hal/digitalio/DigitalInOut.c
index 647a46e90..1354e1a32 100644
--- a/ports/stm/common-hal/digitalio/DigitalInOut.c
+++ b/ports/stm/common-hal/digitalio/DigitalInOut.c
@@ -29,7 +29,7 @@
#include "py/runtime.h"
#include "supervisor/shared/translate.h"
-// The HAL is sparse on obtaining register information, so we use the LLs here.
+// The HAL is sparse on obtaining register information, so we use the LLs here.
#if (CPY_STM32H7)
#include "stm32h7xx_ll_gpio.h"
#elif (CPY_STM32F7)
@@ -85,12 +85,13 @@ void common_hal_digitalio_digitalinout_switch_to_input(
common_hal_digitalio_digitalinout_set_pull(self, pull);
}
-void common_hal_digitalio_digitalinout_switch_to_output(
+digitalinout_result_t common_hal_digitalio_digitalinout_switch_to_output(
digitalio_digitalinout_obj_t *self, bool value,
digitalio_drive_mode_t drive_mode) {
common_hal_digitalio_digitalinout_set_drive_mode(self, drive_mode);
common_hal_digitalio_digitalinout_set_value(self, value);
+ return DIGITALINOUT_OK;
}
digitalio_direction_t common_hal_digitalio_digitalinout_get_direction(
@@ -112,7 +113,7 @@ bool common_hal_digitalio_digitalinout_get_value(
: LL_GPIO_IsOutputPinSet(pin_port(self->pin->port), pin_mask(self->pin->number));
}
-void common_hal_digitalio_digitalinout_set_drive_mode(
+digitalinout_result_t common_hal_digitalio_digitalinout_set_drive_mode(
digitalio_digitalinout_obj_t *self,
digitalio_drive_mode_t drive_mode) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
@@ -122,6 +123,7 @@ void common_hal_digitalio_digitalinout_set_drive_mode(
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(pin_port(self->pin->port), &GPIO_InitStruct);
+ return DIGITALINOUT_OK;
}
digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode(
diff --git a/shared-bindings/_pixelbuf/PixelBuf.c b/shared-bindings/_pixelbuf/PixelBuf.c
index d8f1810db..63a4eaa17 100644
--- a/shared-bindings/_pixelbuf/PixelBuf.c
+++ b/shared-bindings/_pixelbuf/PixelBuf.c
@@ -53,18 +53,13 @@ static void parse_byteorder(mp_obj_t byteorder_obj, pixelbuf_byteorder_details_t
//| When brightness is less than 1.0, a second buffer will be used to store the color values
//| before they are adjusted for brightness.
//|
-//| When ``P`` (pwm duration) is present as the 4th character of the byteorder
+//| When ``P`` (PWM duration) is present as the 4th character of the byteorder
//| string, the 4th value in the tuple/list for a pixel is the individual pixel
-//| brightness (0.0-1.0) and will enable a Dotstar compatible 1st byte in the
-//| output buffer (``buf``).
-//|
-//| When ``P`` (pwm duration) is present as the first character of the byteorder
-//| string, the 4th value in the tuple/list for a pixel is the individual pixel
-//| brightness (0.0-1.0) and will enable a Dotstar compatible 1st byte in the
-//| output buffer (``buf``).
+//| brightness (0.0-1.0) and will enable a Dotstar compatible 1st byte for each
+//| pixel.
//|
//| :param ~int size: Number of pixels
-//| :param ~str byteorder: Byte order string (such as "BGR" or "PBGR")
+//| :param ~str byteorder: Byte order string (such as "RGB", "RGBW" or "PBGR")
//| :param ~float brightness: Brightness (0 to 1.0, default 1.0)
//| :param ~bool auto_write: Whether to automatically write pixels (Default False)
//| :param bytes header: Sequence of bytes to always send before pixel values.
@@ -276,13 +271,16 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(pixelbuf_pixelbuf_fill_obj, pixelbuf_pixelbuf_f
//| def __getitem__(self, index: Any) -> Any:
//| """Returns the pixel value at the given index as a tuple of (Red, Green, Blue[, White]) values
-//| between 0 and 255."""
+//| between 0 and 255. When in PWM (DotStar) mode, the 4th tuple value is a float of the pixel
+//| intensity from 0-1.0."""
//| ...
//|
//| def __setitem__(self, index: Any, value: Any) -> Any:
-//| """Sets the pixel value at the given index. Value can either be a tuple of (Red, Green, Blue
-//| [, White]) values between 0 and 255 or an integer where the red, green and blue values are
-//| packed into the lower three bytes (0xRRGGBB)."""
+//| """Sets the pixel value at the given index. Value can either be a tuple or integer. Tuples are
+//| The individual (Red, Green, Blue[, White]) values between 0 and 255. If given an integer, the
+//| red, green and blue values are packed into the lower three bytes (0xRRGGBB).
+//| For RGBW byteorders, if given only RGB values either as an int or as a tuple, the white value
+//| is used instead when the red, green, and blue values are the same."""
//| ...
//|
STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value) {
@@ -300,17 +298,20 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
size_t length = common_hal__pixelbuf_pixelbuf_get_len(self_in);
mp_seq_get_fast_slice_indexes(length, index_in, &slice);
- if (slice.step < 0) {
- mp_raise_IndexError(translate("Negative step not supported"));
+ size_t slice_len;
+ if (slice.step > 0) {
+ slice_len = slice.stop - slice.start;
+ } else {
+ slice_len = 1 + slice.start - slice.stop;
+ }
+ if (slice.step > 1 || slice.step < -1) {
+ size_t step = slice.step > 0 ? slice.step : slice.step * -1;
+ slice_len = (slice_len / step) + (slice_len % step ? 1 : 0);
}
if (value == MP_OBJ_SENTINEL) { // Get
- size_t len = slice.stop - slice.start;
- if (slice.step > 1) {
- len = (len / slice.step) + (len % slice.step ? 1 : 0);
- }
- mp_obj_tuple_t* t = MP_OBJ_TO_PTR(mp_obj_new_tuple(len, NULL));
- for (uint i = 0; i < len; i++) {
+ mp_obj_tuple_t* t = MP_OBJ_TO_PTR(mp_obj_new_tuple(slice_len, NULL));
+ for (uint i = 0; i < slice_len; i++) {
t->items[i] = common_hal__pixelbuf_pixelbuf_get_pixel(self_in, i * slice.step + slice.start);
}
return MP_OBJ_FROM_PTR(t);
@@ -321,10 +322,6 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
mp_raise_ValueError(translate("tuple/list required on RHS"));
}
- size_t dst_len = (slice.stop - slice.start);
- if (slice.step > 1) {
- dst_len = (dst_len / slice.step) + (dst_len % slice.step ? 1 : 0);
- }
mp_obj_t *src_objs;
size_t num_items;
if (MP_OBJ_IS_TYPE(value, &mp_type_list)) {
@@ -336,12 +333,12 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
num_items = l->len;
src_objs = l->items;
}
- if (num_items != dst_len) {
+ if (num_items != slice_len) {
mp_raise_ValueError_varg(translate("Unmatched number of items on RHS (expected %d, got %d)."),
- dst_len, num_items);
+ slice_len, num_items);
}
- common_hal__pixelbuf_pixelbuf_set_pixels(self_in, slice.start, slice.stop, slice.step, src_objs);
+ common_hal__pixelbuf_pixelbuf_set_pixels(self_in, slice.start, slice.step, slice_len, src_objs);
return mp_const_none;
#else
return MP_OBJ_NULL; // op not supported
diff --git a/shared-bindings/_pixelbuf/PixelBuf.h b/shared-bindings/_pixelbuf/PixelBuf.h
index 68d6d4eef..14ee2e900 100644
--- a/shared-bindings/_pixelbuf/PixelBuf.h
+++ b/shared-bindings/_pixelbuf/PixelBuf.h
@@ -47,6 +47,6 @@ void common_hal__pixelbuf_pixelbuf_fill(mp_obj_t self, mp_obj_t item);
void common_hal__pixelbuf_pixelbuf_show(mp_obj_t self);
mp_obj_t common_hal__pixelbuf_pixelbuf_get_pixel(mp_obj_t self, size_t index);
void common_hal__pixelbuf_pixelbuf_set_pixel(mp_obj_t self, size_t index, mp_obj_t item);
-void common_hal__pixelbuf_pixelbuf_set_pixels(mp_obj_t self_in, size_t start, size_t stop, size_t step, mp_obj_t* values);
+void common_hal__pixelbuf_pixelbuf_set_pixels(mp_obj_t self_in, size_t start, mp_int_t step, size_t slice_len, mp_obj_t* values);
#endif // CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H
diff --git a/shared-bindings/digitalio/DigitalInOut.c b/shared-bindings/digitalio/DigitalInOut.c
index 0cea74da0..eaf2c1810 100644
--- a/shared-bindings/digitalio/DigitalInOut.c
+++ b/shared-bindings/digitalio/DigitalInOut.c
@@ -131,7 +131,10 @@ STATIC mp_obj_t digitalio_digitalinout_switch_to_output(size_t n_args, const mp_
drive_mode = DRIVE_MODE_OPEN_DRAIN;
}
// do the transfer
- common_hal_digitalio_digitalinout_switch_to_output(self, args[ARG_value].u_bool, drive_mode);
+ digitalinout_result_t result = common_hal_digitalio_digitalinout_switch_to_output(self, args[ARG_value].u_bool, drive_mode);
+ if (result == DIGITALINOUT_INPUT_ONLY) {
+ mp_raise_NotImplementedError(translate("Pin is input only"));
+ }
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_KW(digitalio_digitalinout_switch_to_output_obj, 1, digitalio_digitalinout_switch_to_output);
@@ -207,7 +210,10 @@ STATIC mp_obj_t digitalio_digitalinout_obj_set_direction(mp_obj_t self_in, mp_ob
if (value == &digitalio_direction_input_obj) {
common_hal_digitalio_digitalinout_switch_to_input(self, PULL_NONE);
} else if (value == &digitalio_direction_output_obj) {
- common_hal_digitalio_digitalinout_switch_to_output(self, false, DRIVE_MODE_PUSH_PULL);
+ digitalinout_result_t result = common_hal_digitalio_digitalinout_switch_to_output(self, false, DRIVE_MODE_PUSH_PULL);
+ if (result == DIGITALINOUT_INPUT_ONLY) {
+ mp_raise_NotImplementedError(translate("Pin is input only"));
+ }
} else {
mp_raise_ValueError(translate("Invalid direction."));
}
diff --git a/shared-bindings/digitalio/DigitalInOut.h b/shared-bindings/digitalio/DigitalInOut.h
index eee0d5801..dd6f088ab 100644
--- a/shared-bindings/digitalio/DigitalInOut.h
+++ b/shared-bindings/digitalio/DigitalInOut.h
@@ -37,18 +37,19 @@ extern const mp_obj_type_t digitalio_digitalinout_type;
typedef enum {
DIGITALINOUT_OK,
- DIGITALINOUT_PIN_BUSY
+ DIGITALINOUT_PIN_BUSY,
+ DIGITALINOUT_INPUT_ONLY
} digitalinout_result_t;
digitalinout_result_t common_hal_digitalio_digitalinout_construct(digitalio_digitalinout_obj_t* self, const mcu_pin_obj_t* pin);
void common_hal_digitalio_digitalinout_deinit(digitalio_digitalinout_obj_t* self);
bool common_hal_digitalio_digitalinout_deinited(digitalio_digitalinout_obj_t* self);
void common_hal_digitalio_digitalinout_switch_to_input(digitalio_digitalinout_obj_t* self, digitalio_pull_t pull);
-void common_hal_digitalio_digitalinout_switch_to_output(digitalio_digitalinout_obj_t* self, bool value, digitalio_drive_mode_t drive_mode);
+digitalinout_result_t common_hal_digitalio_digitalinout_switch_to_output(digitalio_digitalinout_obj_t* self, bool value, digitalio_drive_mode_t drive_mode);
digitalio_direction_t common_hal_digitalio_digitalinout_get_direction(digitalio_digitalinout_obj_t* self);
void common_hal_digitalio_digitalinout_set_value(digitalio_digitalinout_obj_t* self, bool value);
bool common_hal_digitalio_digitalinout_get_value(digitalio_digitalinout_obj_t* self);
-void common_hal_digitalio_digitalinout_set_drive_mode(digitalio_digitalinout_obj_t* self, digitalio_drive_mode_t drive_mode);
+digitalinout_result_t common_hal_digitalio_digitalinout_set_drive_mode(digitalio_digitalinout_obj_t* self, digitalio_drive_mode_t drive_mode);
digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode(digitalio_digitalinout_obj_t* self);
void common_hal_digitalio_digitalinout_set_pull(digitalio_digitalinout_obj_t* self, digitalio_pull_t pull);
digitalio_pull_t common_hal_digitalio_digitalinout_get_pull(digitalio_digitalinout_obj_t* self);
diff --git a/shared-module/_pixelbuf/PixelBuf.c b/shared-module/_pixelbuf/PixelBuf.c
index 31350b875..9d671e454 100644
--- a/shared-module/_pixelbuf/PixelBuf.c
+++ b/shared-module/_pixelbuf/PixelBuf.c
@@ -147,18 +147,11 @@ void _pixelbuf_parse_color(pixelbuf_pixelbuf_obj_t* self, mp_obj_t color, uint8_
*r = value >> 16 & 0xff;
*g = (value >> 8) & 0xff;
*b = value & 0xff;
- // Int colors can't set white directly so convert to white when all components are equal.
- if (!byteorder->is_dotstar && byteorder->bpp == 4 && byteorder->has_white && *r == *g && *r == *b) {
- *w = *r;
- *r = 0;
- *g = 0;
- *b = 0;
- }
} else {
mp_obj_t *items;
size_t len;
mp_obj_get_array(color, &len, &items);
- if (len != byteorder->bpp && !byteorder->is_dotstar) {
+ if (len < 3 || len > 4) {
mp_raise_ValueError_varg(translate("Expected tuple of length %d, got %d"), byteorder->bpp, len);
}
@@ -171,8 +164,17 @@ void _pixelbuf_parse_color(pixelbuf_pixelbuf_obj_t* self, mp_obj_t color, uint8_
} else {
*w = mp_obj_get_int_truncated(items[PIXEL_W]);
}
+ return;
}
}
+ // Int colors can't set white directly so convert to white when all components are equal.
+ // Also handles RGBW values assigned an RGB tuple.
+ if (!byteorder->is_dotstar && byteorder->bpp == 4 && byteorder->has_white && *r == *g && *r == *b) {
+ *w = *r;
+ *r = 0;
+ *g = 0;
+ *b = 0;
+ }
}
void _pixelbuf_set_pixel_color(pixelbuf_pixelbuf_obj_t* self, size_t index, uint8_t r, uint8_t g, uint8_t b, uint8_t w) {
@@ -216,12 +218,11 @@ void _pixelbuf_set_pixel(pixelbuf_pixelbuf_obj_t* self, size_t index, mp_obj_t v
_pixelbuf_set_pixel_color(self, index, r, g, b, w);
}
-void common_hal__pixelbuf_pixelbuf_set_pixels(mp_obj_t self_in, size_t start, size_t stop, size_t step, mp_obj_t* values) {
+void common_hal__pixelbuf_pixelbuf_set_pixels(mp_obj_t self_in, size_t start, mp_int_t step, size_t slice_len, mp_obj_t* values) {
pixelbuf_pixelbuf_obj_t* self = native_pixelbuf(self_in);
- size_t source_i = 0;
- for (size_t target_i = start; target_i < stop; target_i += step) {
- _pixelbuf_set_pixel(self, target_i, values[source_i]);
- source_i++;
+ for (size_t i = 0; i < slice_len; i++) {
+ _pixelbuf_set_pixel(self, start, values[i]);
+ start+=step;
}
if (self->auto_write) {
common_hal__pixelbuf_pixelbuf_show(self_in);