summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2019-07-31 16:32:54 -0500
committerJeff Epler <jepler@gmail.com>2019-07-31 16:32:54 -0500
commitb0f7c7bc4cbecdef9c52e81b734dc7c4aa6d0421 (patch)
tree18c3f1b6e87bd3d0934d98c764be3b903606e4f1
parent3b3a7bbd064c5722946f09d5a7bfa90d7eee9b52 (diff)
parent366fdcce18e148a6828b7a7074e1e4198fca3595 (diff)
Merge remote-tracking branch 'origin/master' into nrf-pwm-audio
-rwxr-xr-x.travis.yml17
-rw-r--r--conf.py20
-rw-r--r--docs/c2rst.py46
-rw-r--r--docs/library/network.rst1
-rw-r--r--docs/rstjinja.py24
-rw-r--r--docs/shared_bindings_matrix.py244
-rw-r--r--locale/ID.po14
-rw-r--r--locale/circuitpython.pot14
-rw-r--r--locale/de_DE.po14
-rw-r--r--locale/en_US.po14
-rw-r--r--locale/en_x_pirate.po14
-rw-r--r--locale/es.po14
-rw-r--r--locale/fil.po14
-rw-r--r--locale/fr.po14
-rw-r--r--locale/it_IT.po14
-rw-r--r--locale/pl.po14
-rw-r--r--locale/pt_BR.po14
-rw-r--r--locale/zh_Latn_pinyin.po52
-rw-r--r--ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk3
-rw-r--r--ports/atmel-samd/boards/hallowing_m0_express/board.c2
-rw-r--r--ports/atmel-samd/boards/pybadge/board.c2
-rw-r--r--ports/atmel-samd/boards/pybadge_airlift/board.c2
-rw-r--r--ports/atmel-samd/boards/pygamer/board.c2
-rw-r--r--ports/atmel-samd/boards/pygamer_advance/board.c2
-rw-r--r--ports/atmel-samd/boards/pyportal/board.c2
-rw-r--r--ports/atmel-samd/boards/robohatmm1/pins.c88
-rw-r--r--ports/atmel-samd/boards/robohatmm1_m0/board.c (renamed from ports/atmel-samd/boards/robohatmm1/board.c)0
-rw-r--r--ports/atmel-samd/boards/robohatmm1_m0/mpconfigboard.h (renamed from ports/atmel-samd/boards/robohatmm1/mpconfigboard.h)16
-rw-r--r--ports/atmel-samd/boards/robohatmm1_m0/mpconfigboard.mk (renamed from ports/atmel-samd/boards/robohatmm1/mpconfigboard.mk)20
-rw-r--r--ports/atmel-samd/boards/robohatmm1_m0/pins.c88
-rw-r--r--ports/atmel-samd/boards/robohatmm1_m4/board.c39
-rw-r--r--ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.h44
-rw-r--r--ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk31
-rw-r--r--ports/atmel-samd/boards/robohatmm1_m4/pins.c89
-rw-r--r--ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/ugame10/board.c2
-rw-r--r--shared-bindings/bleio/Peripheral.c2
-rw-r--r--shared-bindings/displayio/Display.c16
-rw-r--r--shared-bindings/displayio/Display.h5
-rw-r--r--shared-bindings/index.rst63
-rw-r--r--shared-bindings/support_matrix.rst16
-rw-r--r--shared-module/displayio/Display.c27
-rw-r--r--shared-module/displayio/Palette.h2
-rw-r--r--shared-module/displayio/TileGrid.c6
-rw-r--r--shared-module/displayio/__init__.c48
-rw-r--r--supervisor/shared/display.c3
-rw-r--r--tools/travis_new_boards_check.py51
47 files changed, 917 insertions, 314 deletions
diff --git a/.travis.yml b/.travis.yml
index d75b4e7d4..44369ddfe 100755
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,11 +21,11 @@ git:
# that SDK is shortest and add it there. In the case of major re-organizations,
# just try to make the builds "about equal in run time"
env:
- - TRAVIS_TESTS="unix docs translations website" TRAVIS_BOARDS="circuitplayground_express mini_sam_m4 grandcentral_m4_express capablerobot_usbhub pygamer pca10056 pca10059 feather_nrf52840_express makerdiary_nrf52840_mdk makerdiary_nrf52840_mdk_usb_dongle particle_boron particle_argon particle_xenon sparkfun_nrf52840_mini electronut_labs_papyr electronut_labs_blip" TRAVIS_SDK=arm:nrf
+ - TRAVIS_TESTS="unix docs translations website" TRAVIS_BOARDS="trinket_m0_haxpress circuitplayground_express mini_sam_m4 grandcentral_m4_express capablerobot_usbhub pygamer pca10056 pca10059 feather_nrf52840_express makerdiary_nrf52840_mdk makerdiary_nrf52840_mdk_usb_dongle particle_boron particle_argon particle_xenon sparkfun_nrf52840_mini electronut_labs_papyr electronut_labs_blip" TRAVIS_SDK=arm:nrf
- TRAVIS_BOARDS="metro_m0_express metro_m4_express metro_m4_airlift_lite pirkey_m0 trellis_m4_express trinket_m0 sparkfun_lumidrive sparkfun_redboard_turbo bast_pro_mini_m0 datum_distance pyruler" TRAVIS_SDK=arm
- - TRAVIS_BOARDS="feather_radiofruit_zigbee gemma_m0 hallowing_m0_express itsybitsy_m0_express itsybitsy_m4_express meowmeow sam32 uchip escornabot_makech pygamer_advance datum_imu" TRAVIS_SDK=arm
- - TRAVIS_BOARDS="feather_m0_express_crickit feather_m0_rfm69 feather_m0_rfm9x feather_m4_express arduino_zero arduino_mkr1300 arduino_mkrzero pewpew10 kicksat-sprite ugame10 robohatmm1 datum_light" TRAVIS_SDK=arm
- - TRAVIS_BOARDS="circuitplayground_express_crickit feather_m0_adalogger feather_m0_basic feather_m0_express catwan_usbstick pyportal sparkfun_samd21_mini sparkfun_samd21_dev pybadge pybadge_airlift datum_weather" TRAVIS_SDK=arm
+ - TRAVIS_BOARDS="cp32-m4 feather_radiofruit_zigbee gemma_m0 hallowing_m0_express itsybitsy_m0_express itsybitsy_m4_express meowmeow sam32 uchip escornabot_makech pygamer_advance datum_imu" TRAVIS_SDK=arm
+ - TRAVIS_BOARDS="feather_m0_supersized feather_m0_express_crickit feather_m0_rfm69 feather_m0_rfm9x feather_m4_express arduino_zero arduino_mkr1300 arduino_mkrzero pewpew10 kicksat-sprite ugame10 robohatmm1_m0 robohatmm1_m4 datum_light" TRAVIS_SDK=arm
+ - TRAVIS_BOARDS="datalore_ip_m4 circuitplayground_express_crickit feather_m0_adalogger feather_m0_basic feather_m0_express catwan_usbstick pyportal sparkfun_samd21_mini sparkfun_samd21_dev pybadge pybadge_airlift datum_weather" TRAVIS_SDK=arm
addons:
artifacts:
@@ -71,7 +71,6 @@ before_script:
- function var_search () { case "$1" in *$2*) true;; *) false;; esac; }
- sudo dpkg --add-architecture i386
-
- (! var_search "${TRAVIS_SDK-}" arm || (wget https://s3.amazonaws.com/adafruit-circuit-python/gcc-arm-embedded_7-2018q2-1~xenial1_amd64.deb && sudo dpkg -i gcc-arm-embedded*_amd64.deb))
# For huzzah builds
@@ -80,12 +79,16 @@ before_script:
# For coverage testing (upgrade is used to get latest urllib3 version)
- sudo apt-get install -y python3-pip
- - pip3 install --user sh click
+ - pip3 install --user sh click setuptools
- ([[ -z "$TRAVIS_TESTS" ]] || sudo pip install --upgrade cpp-coveralls)
- (! var_search "${TRAVIS_TESTS-}" docs || sudo apt-get install -y librsvg2-bin)
- - (! var_search "${TRAVIS_TESTS-}" docs || pip install --user Sphinx sphinx-rtd-theme recommonmark sphinxcontrib-svg2pdfconverter)
+ - (! var_search "${TRAVIS_TESTS-}" docs || pip3 install --user Sphinx sphinx-rtd-theme recommonmark sphinxcontrib-svg2pdfconverter)
- (! var_search "${TRAVIS_TESTS-}" translations || pip3 install --user polib)
+ # Check if there's any board missing in TRAVIS_BOARDS
+ - cd tools && python3 -u travis_new_boards_check.py
+ - cd ..
+
# report some good version numbers to the build
- gcc --version
- (! var_search "${TRAVIS_SDK-}" arm || arm-none-eabi-gcc --version)
diff --git a/conf.py b/conf.py
index 59e19a513..56625e758 100644
--- a/conf.py
+++ b/conf.py
@@ -13,6 +13,7 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
+import json
import sys
import os
@@ -24,8 +25,20 @@ from recommonmark.parser import CommonMarkParser
sys.path.insert(0, os.path.abspath('docs'))
sys.path.insert(0, os.path.abspath('.'))
+import shared_bindings_matrix
+
master_doc = 'docs/index'
+# Grab the JSON values to use while building the module support matrix
+# in 'shared-bindings/index.rst'
+
+#modules_support_matrix = shared_bindings_matrix.support_matrix_excluded_boards()
+modules_support_matrix = shared_bindings_matrix.support_matrix_by_board()
+
+html_context = {
+ 'support_matrix': modules_support_matrix
+}
+
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
@@ -40,7 +53,9 @@ extensions = [
'sphinxcontrib.rsvgconverter',
'sphinx.ext.intersphinx',
'sphinx.ext.todo',
- 'sphinx.ext.coverage'
+ 'sphinx.ext.coverage',
+ 'rstjinja',
+ 'c2rst'
]
# Add any paths that contain templates here, relative to this directory.
@@ -49,8 +64,7 @@ templates_path = ['templates']
# The suffix of source filenames.
source_suffix = ['.rst', '.md', '.c', '.h']
-source_parsers = {'.md': CommonMarkParser,
- '.c': "c2rst.CStrip", '.h': "c2rst.CStrip"}
+source_parsers = {'.md': CommonMarkParser}
# The encoding of source files.
#source_encoding = 'utf-8-sig'
diff --git a/docs/c2rst.py b/docs/c2rst.py
index 904fb7408..76489dca3 100644
--- a/docs/c2rst.py
+++ b/docs/c2rst.py
@@ -1,19 +1,31 @@
-import sphinx.parsers
+def c2rst(app, docname, source):
+ """ Pre-parse '.c' & '.h' files that contain rST source.
+ """
+ # Make sure we're outputting HTML
+ if app.builder.format != 'html':
+ return
-class CStrip(sphinx.parsers.Parser):
- def __init__(self):
- self.rst_parser = sphinx.parsers.RSTParser()
+ fname = app.env.doc2path(docname)
+ if (not fname.endswith(".c") and
+ not fname.endswith(".h")):
+ #print("skipping:", fname)
+ return
- def parse(self, inputstring, document):
- # This setting is missing starting with Sphinx 1.7.1 so we set it ourself.
- document.settings.tab_width = 4
- document.settings.character_level_inline_markup = False
- stripped = []
- for line in inputstring.split("\n"):
- line = line.strip()
- if line == "//|":
- stripped.append("")
- elif line.startswith("//| "):
- stripped.append(line[len("//| "):])
- stripped = "\r\n".join(stripped)
- self.rst_parser.parse(stripped, document)
+ src = source[0]
+
+ stripped = []
+ for line in src.split("\n"):
+ line = line.strip()
+ if line == "//|":
+ stripped.append("")
+ elif line.startswith("//| "):
+ stripped.append(line[len("//| "):])
+ stripped = "\r\n".join(stripped)
+
+ rendered = app.builder.templates.render_string(
+ stripped, app.config.html_context
+ )
+ source[0] = rendered
+
+def setup(app):
+ app.connect("source-read", c2rst)
diff --git a/docs/library/network.rst b/docs/library/network.rst
index d25f9f388..cdcc5f323 100644
--- a/docs/library/network.rst
+++ b/docs/library/network.rst
@@ -5,6 +5,7 @@
.. include:: ../templates/unsupported_in_circuitpython.inc
.. module:: network
+ :noindex:
:synopsis: network configuration
This module provides network drivers and routing configuration. To use this
diff --git a/docs/rstjinja.py b/docs/rstjinja.py
new file mode 100644
index 000000000..3a08b2599
--- /dev/null
+++ b/docs/rstjinja.py
@@ -0,0 +1,24 @@
+# Derived from code on Eric Holscher's blog, found at:
+# https://www.ericholscher.com/blog/2016/jul/25/integrating-jinja-rst-sphinx/
+
+def rstjinja(app, docname, source):
+ """
+ Render our pages as a jinja template for fancy templating goodness.
+ """
+ # Make sure we're outputting HTML
+ if app.builder.format != 'html':
+ return
+
+ # we only want our one jinja template to run through this func
+ if "shared-bindings/support_matrix" not in docname:
+ return
+
+ src = source[0]
+ print(docname)
+ rendered = app.builder.templates.render_string(
+ src, app.config.html_context
+ )
+ source[0] = rendered
+
+def setup(app):
+ app.connect("source-read", rstjinja)
diff --git a/docs/shared_bindings_matrix.py b/docs/shared_bindings_matrix.py
new file mode 100644
index 000000000..ed88efc75
--- /dev/null
+++ b/docs/shared_bindings_matrix.py
@@ -0,0 +1,244 @@
+# The MIT License (MIT)
+#
+# Copyright (c) 2019 Michael Schroeder
+#
+# 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.
+#
+
+import json
+import os
+import re
+
+
+SUPPORTED_PORTS = ["atmel-samd", "nrf"]
+
+
+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
+
+def get_shared_bindings():
+ """ Get a list of modules in shared-bindings based on folder names
+ """
+ return [item for item in os.listdir("./shared-bindings")]
+
+
+def read_mpconfig():
+ """ Open 'circuitpy_mpconfig.mk' and return the contents.
+ """
+ configs = []
+ with open("py/circuitpy_mpconfig.mk") as mpconfig:
+ configs = mpconfig.read()
+
+ return configs
+
+
+def build_module_map():
+ """ Establish the base of the JSON file, based on the contents from
+ `configs`. Base will contain module names, if they're part of
+ the `FULL_BUILD`, or their default value (0 | 1).
+
+ """
+ base = dict()
+ modules = get_shared_bindings()
+ configs = read_mpconfig()
+ full_build = False
+ for module in modules:
+ full_name = module
+ search_name = module.lstrip("_")
+ re_pattern = "CIRCUITPY_{}\s=\s(.+)".format(search_name.upper())
+ find_config = re.search(re_pattern, configs)
+ #print(module, "|", find_config)
+ if not find_config:
+ continue
+ full_build = int("FULL_BUILD" in find_config.group(0))
+ #print(find_config[1])
+ if not full_build:
+ default_val = find_config.group(1)
+ else:
+ default_val = "None"
+ base[search_name] = {
+ "name": full_name,
+ "full_build": str(full_build),
+ "default_value": default_val,
+ "excluded": {}
+ }
+
+ return base
+
+
+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.)
+ """
+ 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("MCU_VARIANT\s=\s(\w+)")
+
+ 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)
+ #print(entry.name, board_chip.group(1))
+ if not board_chip:
+ board_chip = "Unknown Chip"
+ else:
+ 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])
+
+ for module in modules:
+ board_is_excluded = False
+ # check if board uses `SMALL_BUILD`. if yes, and current
+ # module is marked as `FULL_BUILD`, board is excluded
+ small_build = re.search("CIRCUITPY_SMALL_BUILD = 1", 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 = "CIRCUITPY_{}\s=\s(\w)".format(module.upper())
+ find_module = re.search(re_pattern, contents)
+ if not find_module:
+ # 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:
+ if (find_module.group(1) == "0" and
+ find_module.group(1) != base[module]["default_value"]):
+ board_is_excluded = True
+
+ 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]
+ #print(json.dumps(base, indent=2))
+ return base
+
+
+def support_matrix_excluded_boards():
+ """ Compiles a list of available modules, and which board definitions
+ do not include them.
+ """
+ base = build_module_map()
+
+ return get_excluded_boards(base)
+
+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 = ""
+ 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+(.+)",
+ board_contents)
+ 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"])
+ boards[board_name] = sorted(board_modules)
+
+ #print(json.dumps(boards, indent=2))
+ return boards
diff --git a/locale/ID.po b/locale/ID.po
index 6c87b39c1..2b8f5a91c 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: 2019-07-25 21:12-0500\n"
+"POT-Creation-Date: 2019-07-31 16:30-0500\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"
@@ -255,7 +255,7 @@ msgstr "Semua timer untuk pin ini sedang digunakan"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c
#: shared-module/_pew/PewPew.c
msgid "All timers in use"
@@ -330,7 +330,7 @@ msgstr ""
msgid "Buffer incorrect size. Should be %d bytes."
msgstr ""
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
msgstr ""
@@ -718,6 +718,10 @@ msgstr ""
msgid "Function requires lock"
msgstr ""
+#: shared-bindings/displayio/Display.c
+msgid "Group already used"
+msgstr ""
+
#: shared-module/displayio/Group.c
msgid "Group full"
msgstr ""
@@ -953,7 +957,7 @@ msgid "Not connected"
msgstr "Tidak dapat menyambungkan ke AP"
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
-#: shared-bindings/audiopwmio/AudioOut.c
+#: shared-bindings/audiopwmio/PWMAudioOut.c
msgid "Not playing"
msgstr ""
@@ -1083,7 +1087,7 @@ msgid "Sample rate must be positive"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr "Nilai sampel terlalu tinggi. Nilai harus kurang dari %d"
diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot
index df227ea2d..b872fa74d 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: 2019-07-25 21:13-0500\n"
+"POT-Creation-Date: 2019-07-31 16:30-0500\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"
@@ -253,7 +253,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c
#: shared-module/_pew/PewPew.c
msgid "All timers in use"
@@ -326,7 +326,7 @@ msgstr ""
msgid "Buffer incorrect size. Should be %d bytes."
msgstr ""
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
msgstr ""
@@ -703,6 +703,10 @@ msgstr ""
msgid "Function requires lock"
msgstr ""
+#: shared-bindings/displayio/Display.c
+msgid "Group already used"
+msgstr ""
+
#: shared-module/displayio/Group.c
msgid "Group full"
msgstr ""
@@ -937,7 +941,7 @@ msgid "Not connected"
msgstr ""
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
-#: shared-bindings/audiopwmio/AudioOut.c
+#: shared-bindings/audiopwmio/PWMAudioOut.c
msgid "Not playing"
msgstr ""
@@ -1063,7 +1067,7 @@ msgid "Sample rate must be positive"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index bf9e5d261..9d1b5fec7 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: 2019-07-25 21:12-0500\n"
+"POT-Creation-Date: 2019-07-31 16:30-0500\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: Pascal Deneaux\n"
"Language-Team: Sebastian Plamauer, Pascal Deneaux\n"
@@ -255,7 +255,7 @@ msgstr "Alle timer für diesen Pin werden bereits benutzt"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c
#: shared-module/_pew/PewPew.c
msgid "All timers in use"
@@ -330,7 +330,7 @@ msgstr "Die Helligkeit ist nicht einstellbar"
msgid "Buffer incorrect size. Should be %d bytes."
msgstr "Der Puffergröße ist inkorrekt. Sie sollte %d bytes haben."
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
msgstr ""
@@ -707,6 +707,10 @@ msgstr ""
msgid "Function requires lock"
msgstr "Die Funktion erwartet, dass der 'lock'-Befehl zuvor ausgeführt wurde"
+#: shared-bindings/displayio/Display.c
+msgid "Group already used"
+msgstr ""
+
#: shared-module/displayio/Group.c
msgid "Group full"
msgstr "Gruppe voll"
@@ -950,7 +954,7 @@ msgid "Not connected"
msgstr "Nicht verbunden"
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
-#: shared-bindings/audiopwmio/AudioOut.c
+#: shared-bindings/audiopwmio/PWMAudioOut.c
msgid "Not playing"
msgstr "Spielt nicht"
@@ -1080,7 +1084,7 @@ msgid "Sample rate must be positive"
msgstr "Abtastrate muss positiv sein"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr "Abtastrate zu hoch. Wert muss unter %d liegen"
diff --git a/locale/en_US.po b/locale/en_US.po
index 7f4abc3c7..e98c863fd 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: 2019-07-25 21:12-0500\n"
+"POT-Creation-Date: 2019-07-31 16:30-0500\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -253,7 +253,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c
#: shared-module/_pew/PewPew.c
msgid "All timers in use"
@@ -326,7 +326,7 @@ msgstr ""
msgid "Buffer incorrect size. Should be %d bytes."
msgstr ""
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
msgstr ""
@@ -703,6 +703,10 @@ msgstr ""
msgid "Function requires lock"
msgstr ""
+#: shared-bindings/displayio/Display.c
+msgid "Group already used"
+msgstr ""
+
#: shared-module/displayio/Group.c
msgid "Group full"
msgstr ""
@@ -937,7 +941,7 @@ msgid "Not connected"
msgstr ""
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
-#: shared-bindings/audiopwmio/AudioOut.c
+#: shared-bindings/audiopwmio/PWMAudioOut.c
msgid "Not playing"
msgstr ""
@@ -1063,7 +1067,7 @@ msgid "Sample rate must be positive"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr ""
diff --git a/locale/en_x_pirate.po b/locale/en_x_pirate.po
index d412aabe9..bf603384f 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: 2019-07-25 21:12-0500\n"
+"POT-Creation-Date: 2019-07-31 16:30-0500\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: \n"
"Language-Team: @sommersoft, @MrCertainly\n"
@@ -255,7 +255,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c
#: shared-module/_pew/PewPew.c
msgid "All timers in use"
@@ -330,7 +330,7 @@ msgstr ""
msgid "Buffer incorrect size. Should be %d bytes."
msgstr ""
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
msgstr ""
@@ -707,6 +707,10 @@ msgstr ""
msgid "Function requires lock"
msgstr ""
+#: shared-bindings/displayio/Display.c
+msgid "Group already used"
+msgstr ""
+
#: shared-module/displayio/Group.c
msgid "Group full"
msgstr ""
@@ -941,7 +945,7 @@ msgid "Not connected"
msgstr ""
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
-#: shared-bindings/audiopwmio/AudioOut.c
+#: shared-bindings/audiopwmio/PWMAudioOut.c
msgid "Not playing"
msgstr ""
@@ -1067,7 +1071,7 @@ msgid "Sample rate must be positive"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr ""
diff --git a/locale/es.po b/locale/es.po
index 62677ae0d..0e24fc835 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: 2019-07-25 21:12-0500\n"
+"POT-Creation-Date: 2019-07-31 16:30-0500\n"
"PO-Revision-Date: 2018-08-24 22:56-0500\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -257,7 +257,7 @@ msgstr "Todos los timers para este pin están siendo utilizados"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c
#: shared-module/_pew/PewPew.c
msgid "All timers in use"
@@ -334,7 +334,7 @@ msgstr "El brillo no se puede ajustar"
msgid "Buffer incorrect size. Should be %d bytes."
msgstr "Tamaño de buffer incorrecto. Debe ser de %d bytes."
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
msgstr ""
@@ -712,6 +712,10 @@ msgstr "Frecuencia capturada por encima de la capacidad. Captura en pausa."
msgid "Function requires lock"
msgstr "La función requiere lock"
+#: shared-bindings/displayio/Display.c
+msgid "Group already used"
+msgstr ""
+
#: shared-module/displayio/Group.c
msgid "Group full"
msgstr "Group lleno"
@@ -952,7 +956,7 @@ msgid "Not connected"
msgstr "No conectado"
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
-#: shared-bindings/audiopwmio/AudioOut.c
+#: shared-bindings/audiopwmio/PWMAudioOut.c
msgid "Not playing"
msgstr "No reproduciendo"
@@ -1091,7 +1095,7 @@ msgid "Sample rate must be positive"
msgstr "Sample rate debe ser positivo"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr "Frecuencia de muestreo demasiado alta. Debe ser menor a %d"
diff --git a/locale/fil.po b/locale/fil.po
index c258fd6d1..ac010aee6 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: 2019-07-25 21:12-0500\n"
+"POT-Creation-Date: 2019-07-31 16:30-0500\n"
"PO-Revision-Date: 2018-12-20 22:15-0800\n"
"Last-Translator: Timothy <me@timothygarcia.ca>\n"
"Language-Team: fil\n"
@@ -257,7 +257,7 @@ msgstr "Lahat ng timers para sa pin na ito ay ginagamit"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c
#: shared-module/_pew/PewPew.c
msgid "All timers in use"
@@ -332,7 +332,7 @@ msgstr ""
msgid "Buffer incorrect size. Should be %d bytes."
msgstr "Mali ang size ng buffer. Dapat %d bytes."
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
msgstr ""
@@ -721,6 +721,10 @@ msgstr ""
msgid "Function requires lock"
msgstr "Function nangangailangan ng lock"
+#: shared-bindings/displayio/Display.c
+msgid "Group already used"
+msgstr ""
+
#: shared-module/displayio/Group.c
msgid "Group full"
msgstr "Puno ang group"
@@ -962,7 +966,7 @@ msgid "Not connected"
msgstr "Hindi maka connect sa AP"
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
-#: shared-bindings/audiopwmio/AudioOut.c
+#: shared-bindings/audiopwmio/PWMAudioOut.c
msgid "Not playing"
msgstr "Hindi playing"
@@ -1096,7 +1100,7 @@ msgid "Sample rate must be positive"
msgstr "Sample rate ay dapat positibo"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr "Sample rate ay masyadong mataas. Ito ay dapat hindi hiigit sa %d"
diff --git a/locale/fr.po b/locale/fr.po
index 77110d8b2..1a2bb90b3 100644
--- a/locale/fr.po
+++ b/locale/fr.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-07-25 21:12-0500\n"
+"POT-Creation-Date: 2019-07-31 16:30-0500\n"
"PO-Revision-Date: 2019-04-14 20:05+0100\n"
"Last-Translator: Pierrick Couturier <arofarn@arofarn.info>\n"
"Language-Team: fr\n"
@@ -260,7 +260,7 @@ msgstr "Tous les timers pour cette broche sont utilisés"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c
#: shared-module/_pew/PewPew.c
msgid "All timers in use"
@@ -337,7 +337,7 @@ msgstr "Luminosité non-ajustable"
msgid "Buffer incorrect size. Should be %d bytes."
msgstr "Tampon de taille incorrect. Devrait être de %d octets."
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
msgstr ""
@@ -726,6 +726,10 @@ msgstr "La fréquence capturée est au delà des capacités. Capture en pause."
msgid "Function requires lock"
msgstr "La fonction nécessite un verrou"
+#: shared-bindings/displayio/Display.c
+msgid "Group already used"
+msgstr ""
+
#: shared-module/displayio/Group.c
msgid "Group full"
msgstr "Groupe plein"
@@ -971,7 +975,7 @@ msgid "Not connected"
msgstr "Non connecté"
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
-#: shared-bindings/audiopwmio/AudioOut.c
+#: shared-bindings/audiopwmio/PWMAudioOut.c
msgid "Not playing"
msgstr "Ne joue pas"
@@ -1113,7 +1117,7 @@ msgid "Sample rate must be positive"
msgstr "Le taux d'échantillonage doit être positif"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr "Taux d'échantillonage trop élevé. Doit être inf. à %d"
diff --git a/locale/it_IT.po b/locale/it_IT.po
index 1e844265f..ccf395846 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: 2019-07-25 21:12-0500\n"
+"POT-Creation-Date: 2019-07-31 16:30-0500\n"
"PO-Revision-Date: 2018-10-02 16:27+0200\n"
"Last-Translator: Enrico Paganin <enrico.paganin@mail.com>\n"
"Language-Team: \n"
@@ -256,7 +256,7 @@ msgstr "Tutti i timer per questo pin sono in uso"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c
#: shared-module/_pew/PewPew.c
msgid "All timers in use"
@@ -332,7 +332,7 @@ msgstr "Illiminazione non è regolabile"
msgid "Buffer incorrect size. Should be %d bytes."
msgstr "Buffer di lunghezza non valida. Dovrebbe essere di %d bytes."
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
msgstr ""
@@ -720,6 +720,10 @@ msgstr ""
msgid "Function requires lock"
msgstr ""
+#: shared-bindings/displayio/Display.c
+msgid "Group already used"
+msgstr ""
+
#: shared-module/displayio/Group.c
msgid "Group full"
msgstr "Gruppo pieno"
@@ -961,7 +965,7 @@ msgid "Not connected"
msgstr "Impossible connettersi all'AP"
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
-#: shared-bindings/audiopwmio/AudioOut.c
+#: shared-bindings/audiopwmio/PWMAudioOut.c
msgid "Not playing"
msgstr "In pausa"
@@ -1101,7 +1105,7 @@ msgid "Sample rate must be positive"
msgstr "STA deve essere attiva"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr ""
diff --git a/locale/pl.po b/locale/pl.po
index 8be7652bb..3a8b7c530 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: 2019-07-25 21:12-0500\n"
+"POT-Creation-Date: 2019-07-31 16:30-0500\n"
"PO-Revision-Date: 2019-03-19 18:37-0700\n"
"Last-Translator: Radomir Dopieralski <circuitpython@sheep.art.pl>\n"
"Language-Team: pl\n"
@@ -254,7 +254,7 @@ msgstr "Wszystkie timery tej nóżki w użyciu"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c
#: shared-module/_pew/PewPew.c
msgid "All timers in use"
@@ -329,7 +329,7 @@ msgstr "Jasność nie jest regulowana"
msgid "Buffer incorrect size. Should be %d bytes."
msgstr "Zła wielkość bufora. Powinno być %d bajtów."
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
msgstr ""
@@ -706,6 +706,10 @@ msgstr "Uzyskana częstotliwość jest niemożliwa. Spauzowano."
msgid "Function requires lock"
msgstr "Funkcja wymaga blokady"
+#: shared-bindings/displayio/Display.c
+msgid "Group already used"
+msgstr ""
+
#: shared-module/displayio/Group.c
msgid "Group full"
msgstr "Grupa pełna"
@@ -947,7 +951,7 @@ msgid "Not connected"
msgstr "Nie podłączono"
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
-#: shared-bindings/audiopwmio/AudioOut.c
+#: shared-bindings/audiopwmio/PWMAudioOut.c
msgid "Not playing"
msgstr "Nic nie jest odtwarzane"
@@ -1073,7 +1077,7 @@ msgid "Sample rate must be positive"
msgstr "Częstotliwość próbkowania musi być dodatnia"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr "Zbyt wysoka częstotliwość próbkowania. Musi być mniejsza niż %d"
diff --git a/locale/pt_BR.po b/locale/pt_BR.po
index 7ad1504b6..0bc5d0613 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: 2019-07-25 21:12-0500\n"
+"POT-Creation-Date: 2019-07-31 16:30-0500\n"
"PO-Revision-Date: 2018-10-02 21:14-0000\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -256,7 +256,7 @@ msgstr "Todos os temporizadores para este pino estão em uso"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c
#: shared-module/_pew/PewPew.c
msgid "All timers in use"
@@ -329,7 +329,7 @@ msgstr ""
msgid "Buffer incorrect size. Should be %d bytes."
msgstr "Buffer de tamanho incorreto. Deve ser %d bytes."
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
msgstr ""
@@ -715,6 +715,10 @@ msgstr ""
msgid "Function requires lock"
msgstr ""
+#: shared-bindings/displayio/Display.c
+msgid "Group already used"
+msgstr ""
+
#: shared-module/displayio/Group.c
msgid "Group full"
msgstr "Grupo cheio"
@@ -953,7 +957,7 @@ msgid "Not connected"
msgstr "Não é possível conectar-se ao AP"
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
-#: shared-bindings/audiopwmio/AudioOut.c
+#: shared-bindings/audiopwmio/PWMAudioOut.c
msgid "Not playing"
msgstr ""
@@ -1083,7 +1087,7 @@ msgid "Sample rate must be positive"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr "Taxa de amostragem muito alta. Deve ser menor que %d"
diff --git a/locale/zh_Latn_pinyin.po b/locale/zh_Latn_pinyin.po
index 627259272..74eed5231 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: 2019-07-25 21:12-0500\n"
+"POT-Creation-Date: 2019-07-31 16:30-0500\n"
"PO-Revision-Date: 2019-04-13 10:10-0700\n"
"Last-Translator: hexthat\n"
"Language-Team: Chinese Hanyu Pinyin\n"
@@ -255,7 +255,7 @@ msgstr "Cǐ yǐn jiǎo de suǒyǒu jìshí qì zhèngzài shǐyòng"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c
#: shared-module/_pew/PewPew.c
msgid "All timers in use"
@@ -330,7 +330,7 @@ msgstr "Liàngdù wúfǎ tiáozhěng"
msgid "Buffer incorrect size. Should be %d bytes."
msgstr "Huǎnchōng qū dàxiǎo bù zhèngquè. Yīnggāi shì %d zì jié."
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
msgstr ""
@@ -355,7 +355,7 @@ msgstr "Zì jié bìxū jiè yú 0 dào 255 zhī jiān."
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
-msgstr ""
+msgstr "Zài fǎngwèn běn jī wùjiàn zhīqián diàoyòng super().__init__()"
#: shared-bindings/_pixelbuf/PixelBuf.c
#, c-format
@@ -364,7 +364,7 @@ msgstr "Wúfǎ yǔ dotstar yīqǐ shǐyòng %s"
#: ports/nrf/common-hal/bleio/Characteristic.c
msgid "Can't set CCCD for local Characteristic"
-msgstr ""
+msgstr "Wúfǎ wéi běndì tèzhēng shèzhì CCCD"
#: shared-bindings/displayio/Bitmap.c shared-bindings/pulseio/PulseIn.c
msgid "Cannot delete values"
@@ -449,7 +449,7 @@ msgstr "Liè tiáomù bìxū shì digitalio.DigitalInOut"
#: shared-bindings/displayio/I2CDisplay.c
msgid "Command must be 0-255"
-msgstr ""
+msgstr "Mìnglìng bìxū wèi 0-255"
#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c
msgid "Command must be an int between 0 and 255"
@@ -457,11 +457,11 @@ msgstr "Mìnglìng bìxū shì 0 dào 255 zhī jiān de int"
#: py/persistentcode.c
msgid "Corrupt .mpy file"
-msgstr ""
+msgstr "Fǔbài de .mpy wénjiàn"
#: py/emitglue.c
msgid "Corrupt raw code"
-msgstr ""
+msgstr "Sǔnhuài de yuánshǐ dàimǎ"
#: ports/nrf/common-hal/bleio/UUID.c
#, c-format
@@ -540,7 +540,7 @@ msgstr "Yùqí UUID"
#: shared-bindings/bleio/Central.c
msgid "Expected an Address"
-msgstr ""
+msgstr "Qídài yīgè dìzhǐ"
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
@@ -549,7 +549,7 @@ msgstr "Qīwàng de chángdù wèi %d de yuán zǔ, dédào %d"
#: shared-bindings/ps2io/Ps2.c
msgid "Failed sending command."
-msgstr ""
+msgstr "Fāsòng mìnglìng shībài."
#: ports/nrf/sd_mutex.c
#, c-format
@@ -583,11 +583,11 @@ msgstr "Gēnggǎi ruǎn shèbèi zhuàngtài shībài"
#: ports/nrf/common-hal/bleio/Peripheral.c
#, c-format
msgid "Failed to configure advertising, err 0x%04x"
-msgstr ""
+msgstr "Wúfǎ pèizhì guǎnggào, cuòwù 0x%04x"
#: ports/nrf/common-hal/bleio/Central.c
msgid "Failed to connect: timeout"
-msgstr ""
+msgstr "Liánjiē shībài: Chāoshí"
#: ports/nrf/common-hal/bleio/Scanner.c
#, c-format
@@ -639,7 +639,7 @@ msgstr "Wúfǎ shìfàng mutex, err 0x%04x"
#: ports/nrf/common-hal/bleio/Peripheral.c
#, c-format
msgid "Failed to set device name, err 0x%04x"
-msgstr ""
+msgstr "Wúfǎ shèzhì shèbèi míngchēng, cuòwù 0x%04x"
#: ports/nrf/common-hal/bleio/Peripheral.c
#, c-format
@@ -649,7 +649,7 @@ msgstr "Qǐdòng guǎnggào shībài, err 0x%04x"
#: ports/nrf/common-hal/bleio/Central.c
#, c-format
msgid "Failed to start connecting, error 0x%04x"
-msgstr ""
+msgstr "Wúfǎ kāishǐ liánjiē, cuòwù 0x%04x"
#: ports/nrf/common-hal/bleio/Scanner.c
#, c-format
@@ -664,7 +664,7 @@ msgstr "Wúfǎ tíngzhǐ guǎnggào, err 0x%04x"
#: ports/nrf/common-hal/bleio/Characteristic.c
#, c-format
msgid "Failed to write CCCD, err 0x%04x"
-msgstr ""
+msgstr "Wúfǎ xiě rù CCCD, cuòwù 0x%04x"
#: ports/nrf/common-hal/bleio/Characteristic.c
#, c-format
@@ -707,6 +707,10 @@ msgstr "Pínlǜ bǔhuò gāo yú nénglì. Bǔhuò zàntíng."
msgid "Function requires lock"
msgstr "Hánshù xūyào suǒdìng"
+#: shared-bindings/displayio/Display.c
+msgid "Group already used"
+msgstr ""
+
#: shared-module/displayio/Group.c
msgid "Group full"
msgstr "Fēnzǔ yǐ mǎn"
@@ -947,7 +951,7 @@ msgid "Not connected"
msgstr "Wèi liánjiē"
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c
-#: shared-bindings/audiopwmio/AudioOut.c
+#: shared-bindings/audiopwmio/PWMAudioOut.c
msgid "Not playing"
msgstr "Wèi bòfàng"
@@ -1019,7 +1023,7 @@ msgstr "Zài wénjiàn xìtǒng shàng tiānjiā rènhé mókuài\n"
#: shared-bindings/ps2io/Ps2.c
msgid "Pop from an empty Ps2 buffer"
-msgstr ""
+msgstr "Cóng kōng de Ps2 huǎnchōng qū dànchū"
#: main.c
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
@@ -1078,7 +1082,7 @@ msgid "Sample rate must be positive"
msgstr "Cǎiyàng lǜ bìxū wèi zhèng shù"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
-#: ports/nrf/common-hal/audiopwmio/AudioOut.c
+#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr "Cǎiyàng lǜ tài gāo. Tā bìxū xiǎoyú %d"
@@ -1133,6 +1137,8 @@ msgid ""
"The `microcontroller` module was used to boot into safe mode. Press reset to "
"exit safe mode.\n"
msgstr ""
+"“Wēi kòngzhì qì” mókuài yòng yú qǐdòng ānquán móshì. Àn chóng zhì kě tuìchū "
+"ānquán móshì.\n"
#: supervisor/shared/safe_mode.c
msgid ""
@@ -1216,7 +1222,7 @@ msgstr "USB Cuòwù"
#: shared-bindings/bleio/UUID.c
msgid "UUID integer value must be 0-0xffff"
-msgstr ""
+msgstr "UUID zhěngshù zhí bìxū wèi 0-0xffff"
#: shared-bindings/bleio/UUID.c
msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'"
@@ -1234,7 +1240,7 @@ msgstr "Wúfǎ fēnpèi huǎnchōng qū yòng yú qiānmíng zhuǎnhuàn"
#: shared-module/displayio/I2CDisplay.c
#, c-format
msgid "Unable to find I2C Display at %x"
-msgstr ""
+msgstr "Wúfǎ zài%x zhǎodào I2C xiǎnshìqì"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
@@ -1922,7 +1928,7 @@ msgstr "xūyào zhěngshù"
#: shared-bindings/bleio/Peripheral.c shared-bindings/bleio/Scanner.c
#, c-format
msgid "interval must be in range %s-%s"
-msgstr ""
+msgstr "Jiàngé bìxū zài %s-%s fànwéi nèi"
#: extmod/machine_i2c.c
msgid "invalid I2C peripheral"
@@ -2615,7 +2621,7 @@ msgstr "bù zhīchí de lèixíng wèi %q: '%s', '%s'"
#: py/objint.c
#, c-format
msgid "value must fit in %d byte(s)"
-msgstr ""
+msgstr "Zhí bìxū fúhé %d zì jié"
#: shared-bindings/displayio/Bitmap.c
msgid "value_count must be > 0"
@@ -2623,7 +2629,7 @@ msgstr "zhí jìshù bìxū wèi > 0"
#: shared-bindings/bleio/Scanner.c
msgid "window must be <= interval"
-msgstr ""
+msgstr "Chuāngkǒu bìxū shì <= jiàngé"
#: shared-bindings/_pixelbuf/PixelBuf.c
msgid "write_args must be a list, tuple, or None"
diff --git a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk
index 33229044b..e34d06962 100644
--- a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk
@@ -11,3 +11,6 @@ SPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICE_COUNT = 1
EXTERNAL_FLASH_DEVICES = "S25FL064L"
LONGINT_IMPL = MPZ
+
+CFLAGS_INLINE_LIMIT = 60
+SUPEROPT_GC = 0
diff --git a/ports/atmel-samd/boards/hallowing_m0_express/board.c b/ports/atmel-samd/boards/hallowing_m0_express/board.c
index be1741c87..c12431f8b 100644
--- a/ports/atmel-samd/boards/hallowing_m0_express/board.c
+++ b/ports/atmel-samd/boards/hallowing_m0_express/board.c
@@ -93,6 +93,8 @@ void board_init(void) {
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
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command
diff --git a/ports/atmel-samd/boards/pybadge/board.c b/ports/atmel-samd/boards/pybadge/board.c
index c9dca0329..e30b901b0 100644
--- a/ports/atmel-samd/boards/pybadge/board.c
+++ b/ports/atmel-samd/boards/pybadge/board.c
@@ -95,6 +95,8 @@ void board_init(void) {
16, // Color depth
false, // grayscale
false, // pixels in byte share 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
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command
diff --git a/ports/atmel-samd/boards/pybadge_airlift/board.c b/ports/atmel-samd/boards/pybadge_airlift/board.c
index eeab3f2b2..38fb33886 100644
--- a/ports/atmel-samd/boards/pybadge_airlift/board.c
+++ b/ports/atmel-samd/boards/pybadge_airlift/board.c
@@ -73,6 +73,8 @@ void board_init(void) {
16, // Color depth
false, // grayscale
false, // pixels in byte share 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
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command
diff --git a/ports/atmel-samd/boards/pygamer/board.c b/ports/atmel-samd/boards/pygamer/board.c
index d413c8e34..5ccf3fc50 100644
--- a/ports/atmel-samd/boards/pygamer/board.c
+++ b/ports/atmel-samd/boards/pygamer/board.c
@@ -95,6 +95,8 @@ void board_init(void) {
16, // Color depth
false, // Grayscale
false, // pixels in a byte share a row. Only valid for depths < 8
+ 1, // bytes per cell. Only valid for depths < 8
+ false, // reverse_pixels_in_byte. Only valid for depths < 8
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command
diff --git a/ports/atmel-samd/boards/pygamer_advance/board.c b/ports/atmel-samd/boards/pygamer_advance/board.c
index 498a29db2..72d4dda8d 100644
--- a/ports/atmel-samd/boards/pygamer_advance/board.c
+++ b/ports/atmel-samd/boards/pygamer_advance/board.c
@@ -73,6 +73,8 @@ void board_init(void) {
16, // Color depth
false, // Grayscale
false, // pixels in a byte share a row. Only valid for depths < 8
+ 1, // bytes per cell. Only valid for depths < 8
+ false, // reverse_pixels_in_byte. Only valid for depths < 8
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command
diff --git a/ports/atmel-samd/boards/pyportal/board.c b/ports/atmel-samd/boards/pyportal/board.c
index 938072158..a5de1d145 100644
--- a/ports/atmel-samd/boards/pyportal/board.c
+++ b/ports/atmel-samd/boards/pyportal/board.c
@@ -85,6 +85,8 @@ void board_init(void) {
16, // Color depth
false, // grayscale
false, // pixels_in_byte_share_row (unused for depths > 8)
+ 1, // bytes per cell. Only valid for depths < 8
+ false, // reverse_pixels_in_byte. Only valid for depths < 8
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command
diff --git a/ports/atmel-samd/boards/robohatmm1/pins.c b/ports/atmel-samd/boards/robohatmm1/pins.c
deleted file mode 100644
index fc3db7a30..000000000
--- a/ports/atmel-samd/boards/robohatmm1/pins.c
+++ /dev/null
@@ -1,88 +0,0 @@
-#include "shared-bindings/board/__init__.h"
-
-STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
- // SERVO Pins
- { MP_ROM_QSTR(MP_QSTR_SERVO1), MP_ROM_PTR(&pin_PA16) },
- { MP_ROM_QSTR(MP_QSTR_SERVO2), MP_ROM_PTR(&pin_PA17) },
- { MP_ROM_QSTR(MP_QSTR_SERVO3), MP_ROM_PTR(&pin_PA18) },
- { MP_ROM_QSTR(MP_QSTR_SERVO4), MP_ROM_PTR(&pin_PA19) },
- { MP_ROM_QSTR(MP_QSTR_SERVO5), MP_ROM_PTR(&pin_PA11) },
- { MP_ROM_QSTR(MP_QSTR_SERVO6), MP_ROM_PTR(&pin_PA10) },
- { MP_ROM_QSTR(MP_QSTR_SERVO7), MP_ROM_PTR(&pin_PA09) },
- { MP_ROM_QSTR(MP_QSTR_SERVO8), MP_ROM_PTR(&pin_PA08) },
-
- // RC_CH Pins
- { MP_ROM_QSTR(MP_QSTR_RCH1), MP_ROM_PTR(&pin_PA07) },
- { MP_ROM_QSTR(MP_QSTR_RCH2), MP_ROM_PTR(&pin_PA06) },
- { MP_ROM_QSTR(MP_QSTR_RCH3), MP_ROM_PTR(&pin_PA05) },
- { MP_ROM_QSTR(MP_QSTR_RCH4), MP_ROM_PTR(&pin_PA04) },
-
- // Special Function
- { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PA02) },
- { MP_ROM_QSTR(MP_QSTR_POWER_OFF), MP_ROM_PTR(&pin_PA03) },
- { MP_ROM_QSTR(MP_QSTR_POWER_ENABLE), MP_ROM_PTR(&pin_PA28) },
-
- { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_PA20) },
- { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_PA21) },
- { 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_TX), MP_ROM_PTR(&pin_PB22) },
- { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB23) },
-
- // UART on SERCOM0
- { MP_ROM_QSTR(MP_QSTR_UART_TX), MP_ROM_PTR(&pin_PA04) },
- { MP_ROM_QSTR(MP_QSTR_UART_RX), MP_ROM_PTR(&pin_PA05) },
- { MP_ROM_QSTR(MP_QSTR_UART_CTS), MP_ROM_PTR(&pin_PA06) },
- { MP_ROM_QSTR(MP_QSTR_UART_RTS), MP_ROM_PTR(&pin_PA07) },
-
- // SPI Flash on SERCOM2
- { MP_ROM_QSTR(MP_QSTR_FLASH_SCK), MP_ROM_PTR(&pin_PA13) },
- { MP_ROM_QSTR(MP_QSTR_FLASH_MISO), MP_ROM_PTR(&pin_PA14) },
- { MP_ROM_QSTR(MP_QSTR_FLASH_MOSI), MP_ROM_PTR(&pin_PA12) },
- { MP_ROM_QSTR(MP_QSTR_FLASH_CS), MP_ROM_PTR(&pin_PA15) },
-
- // I2C on SERCOM3
- { MP_ROM_QSTR(MP_QSTR_I2C_SDA), MP_ROM_PTR(&pin_PA00) },
- { MP_ROM_QSTR(MP_QSTR_I2C_SCL), MP_ROM_PTR(&pin_PA01) },
-
- // SPI on SERCOM4
- { MP_ROM_QSTR(MP_QSTR_SPI_SCK), MP_ROM_PTR(&pin_PB11) },
- { MP_ROM_QSTR(MP_QSTR_SPI_MISO), MP_ROM_PTR(&pin_PB08) },
- { MP_ROM_QSTR(MP_QSTR_SPI_MOSI), MP_ROM_PTR(&pin_PB10) },
- { MP_ROM_QSTR(MP_QSTR_SPI_SS), MP_ROM_PTR(&pin_PB09) },
-
- // GPS on SERCOM5
- { MP_ROM_QSTR(MP_QSTR_GPS_TX), MP_ROM_PTR(&pin_PB02) },
- { MP_ROM_QSTR(MP_QSTR_GPS_RX), MP_ROM_PTR(&pin_PB03) },
- { MP_ROM_QSTR(MP_QSTR_GPS_SDA), MP_ROM_PTR(&pin_PA00) },
- { MP_ROM_QSTR(MP_QSTR_GPS_SCL), MP_ROM_PTR(&pin_PA01) },
-
- // Raspberry Pi
- { MP_ROM_QSTR(MP_QSTR_PI_GP25), MP_ROM_PTR(&pin_PA30) },
- { MP_ROM_QSTR(MP_QSTR_PI_GP24), MP_ROM_PTR(&pin_PA31) },
- { MP_ROM_QSTR(MP_QSTR_PI_GP5), MP_ROM_PTR(&pin_PA27) },
- { MP_ROM_QSTR(MP_QSTR_PI_RX), MP_ROM_PTR(&pin_PB22) },
- { MP_ROM_QSTR(MP_QSTR_PI_TX), MP_ROM_PTR(&pin_PB23) },
-
- // SIGNAL / Digital pins (for reference)
- { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PB23) },
- { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PB22) },
- { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PB02) },
- { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PB03) },
- { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PA00) },
- { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA01) },
- { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA28) },
- { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PA03) },
- { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PA20) },
- { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PB11) },
- { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PB09) },
- { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PB10) },
- { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PB08) },
- { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PA21) },
- { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_PA03) },
-
- { 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/robohatmm1/board.c b/ports/atmel-samd/boards/robohatmm1_m0/board.c
index c8e20206a..c8e20206a 100644
--- a/ports/atmel-samd/boards/robohatmm1/board.c
+++ b/ports/atmel-samd/boards/robohatmm1_m0/board.c
diff --git a/ports/atmel-samd/boards/robohatmm1/mpconfigboard.h b/ports/atmel-samd/boards/robohatmm1_m0/mpconfigboard.h
index dd31e912a..dc122b6fa 100644
--- a/ports/atmel-samd/boards/robohatmm1/mpconfigboard.h
+++ b/ports/atmel-samd/boards/robohatmm1_m0/mpconfigboard.h
@@ -1,7 +1,7 @@
#define MICROPY_HW_BOARD_NAME "Robo HAT MM1"
#define MICROPY_HW_MCU_NAME "samd21g18"
-#define MICROPY_HW_LED_STATUS (&pin_PA21)
+#define MICROPY_HW_LED_STATUS (&pin_PB22)
// Salae reads 12mhz which is the limit even though we set it to the safer 8mhz.
#define SPI_FLASH_BAUDRATE (8000000)
@@ -24,23 +24,19 @@
#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE)
-//#define BOARD_HAS_CRYSTAL 0
#define CALIBRATE_CRYSTALLESS 1
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
-#define DEFAULT_SPI_BUS_SCK (&pin_PB11)
-#define DEFAULT_SPI_BUS_MOSI (&pin_PB10)
-#define DEFAULT_SPI_BUS_MISO (&pin_PB08)
+#define DEFAULT_SPI_BUS_SCK (&pin_PB10)
+#define DEFAULT_SPI_BUS_MOSI (&pin_PB08)
+#define DEFAULT_SPI_BUS_MISO (&pin_PB11)
-#define DEFAULT_UART_BUS_RX (&pin_PB23)
-#define DEFAULT_UART_BUS_TX (&pin_PB22)
+#define DEFAULT_UART_BUS_RX (&pin_PB03)
+#define DEFAULT_UART_BUS_TX (&pin_PB02)
// USB is always used internally so skip the pin objects for it.
#define IGNORE_PIN_PA24 1
#define IGNORE_PIN_PA25 1
-//#define CIRCUITPY_I2CSLAVE
-//#define CIRCUITPY_DISPLAYIO (0)
-
diff --git a/ports/atmel-samd/boards/robohatmm1/mpconfigboard.mk b/ports/atmel-samd/boards/robohatmm1_m0/mpconfigboard.mk
index 9523984b7..e4f688f1e 100644
--- a/ports/atmel-samd/boards/robohatmm1/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/robohatmm1_m0/mpconfigboard.mk
@@ -7,27 +7,23 @@ USB_MANUFACTURER = "Robotics Masters"
CHIP_VARIANT = SAMD21G18A
CHIP_FAMILY = samd21
-# Non-Flash Edition
-#INTERNAL_FLASH_FILESYSTEM = 1
-#LONGINT_IMPL = NONE
-#SUPEROPT_GC = 0
-
-# SPI-Flash Edition
SPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICE_COUNT = 1
EXTERNAL_FLASH_DEVICES = "W25Q64JV_IQ"
LONGINT_IMPL = MPZ
-# Make room for frozen Libraries
+
+# Non-Flash Edition
+#INTERNAL_FLASH_FILESYSTEM = 1
+#LONGINT_IMPL = NONE
+
CIRCUITPY_DISPLAYIO = 0
CIRCUITPY_FREQUENCYIO = 0
-CFLAGS_INLINE_LIMIT = 55
+CFLAGS_INLINE_LIMIT = 60
+SUPEROPT_GC = 0
# Include these Python libraries in firmware.
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
+FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel
#FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_INA219
#FROZEN_MPY_DIRS += $(TOP)/frozen/RoboticsMasters_CircuitPython_MPU9250
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel
-#FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Crickit
-#FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Motor
-#FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_seesaw
diff --git a/ports/atmel-samd/boards/robohatmm1_m0/pins.c b/ports/atmel-samd/boards/robohatmm1_m0/pins.c
new file mode 100644
index 000000000..f50e8d15a
--- /dev/null
+++ b/ports/atmel-samd/boards/robohatmm1_m0/pins.c
@@ -0,0 +1,88 @@
+#include "shared-bindings/board/__init__.h"
+
+STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
+ // SERVO Pins
+ { MP_ROM_QSTR(MP_QSTR_SERVO1), MP_ROM_PTR(&pin_PA18) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO2), MP_ROM_PTR(&pin_PA19) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO3), MP_ROM_PTR(&pin_PA20) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO4), MP_ROM_PTR(&pin_PA21) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO5), MP_ROM_PTR(&pin_PA11) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO6), MP_ROM_PTR(&pin_PA10) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO7), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO8), MP_ROM_PTR(&pin_PA08) },
+
+ // RCC Pins
+ { MP_ROM_QSTR(MP_QSTR_RCC1), MP_ROM_PTR(&pin_PA07) },
+ { MP_ROM_QSTR(MP_QSTR_RCC2), MP_ROM_PTR(&pin_PA06) },
+ { MP_ROM_QSTR(MP_QSTR_RCC3), MP_ROM_PTR(&pin_PA05) },
+ { MP_ROM_QSTR(MP_QSTR_RCC4), MP_ROM_PTR(&pin_PA04) },
+
+ // Special Function
+ { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_PA02) },
+ { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PA02) },
+ { MP_ROM_QSTR(MP_QSTR_POWER_OFF), MP_ROM_PTR(&pin_PA03) },
+ { MP_ROM_QSTR(MP_QSTR_POWER_DISABLE), MP_ROM_PTR(&pin_PA03) },
+ { MP_ROM_QSTR(MP_QSTR_POWER_ON), MP_ROM_PTR(&pin_PA27) },
+ { MP_ROM_QSTR(MP_QSTR_POWER_ENABLE), MP_ROM_PTR(&pin_PA27) },
+ { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_PA27) },
+
+ { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_PB23) },
+ { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_PB22) },
+ { 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_TX), MP_ROM_PTR(&pin_PB02) },
+ { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB03) },
+
+ // GROVE on SERCOM0
+ { MP_ROM_QSTR(MP_QSTR_GROVE_SCL), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_SDA), MP_ROM_PTR(&pin_PA08) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_RX), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_TX), MP_ROM_PTR(&pin_PA08) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_D1), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_D0), MP_ROM_PTR(&pin_PA08) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_A1), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_A0), MP_ROM_PTR(&pin_PA08) },
+
+ // UART on SERCOM0
+ { MP_ROM_QSTR(MP_QSTR_UART_TX), MP_ROM_PTR(&pin_PA04) },
+ { MP_ROM_QSTR(MP_QSTR_UART_RX), MP_ROM_PTR(&pin_PA05) },
+ { MP_ROM_QSTR(MP_QSTR_UART_CTS), MP_ROM_PTR(&pin_PA06) },
+ { MP_ROM_QSTR(MP_QSTR_UART_RTS), MP_ROM_PTR(&pin_PA07) },
+
+ // SPI Flash on SERCOM2
+ { MP_ROM_QSTR(MP_QSTR_FLASH_SCK), MP_ROM_PTR(&pin_PA13) },
+ { MP_ROM_QSTR(MP_QSTR_FLASH_MISO), MP_ROM_PTR(&pin_PA14) },
+ { MP_ROM_QSTR(MP_QSTR_FLASH_MOSI), MP_ROM_PTR(&pin_PA12) },
+ { MP_ROM_QSTR(MP_QSTR_FLASH_CS), MP_ROM_PTR(&pin_PA15) },
+
+ // I2C on SERCOM3
+ { MP_ROM_QSTR(MP_QSTR_SDA1), MP_ROM_PTR(&pin_PA00) },
+ { MP_ROM_QSTR(MP_QSTR_SCL1), MP_ROM_PTR(&pin_PA01) },
+
+ // SPI on SERCOM4
+ { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PB08) },
+ { MP_ROM_QSTR(MP_QSTR_SS), MP_ROM_PTR(&pin_PB09) },
+ { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PB10) },
+ { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PB11) },
+
+ // GPS on SERCOM5
+ { MP_ROM_QSTR(MP_QSTR_GPS_TX), MP_ROM_PTR(&pin_PB02) },
+ { MP_ROM_QSTR(MP_QSTR_GPS_RX), MP_ROM_PTR(&pin_PB03) },
+ { MP_ROM_QSTR(MP_QSTR_GPS_SDA), MP_ROM_PTR(&pin_PA00) },
+ { MP_ROM_QSTR(MP_QSTR_GPS_SCL), MP_ROM_PTR(&pin_PA01) },
+
+ // Raspberry Pi
+ { MP_ROM_QSTR(MP_QSTR_PI_GP25), MP_ROM_PTR(&pin_PA30) },
+ { MP_ROM_QSTR(MP_QSTR_SWCLK), MP_ROM_PTR(&pin_PA30) },
+ { MP_ROM_QSTR(MP_QSTR_PI_GP24), MP_ROM_PTR(&pin_PA31) },
+ { MP_ROM_QSTR(MP_QSTR_SWDIO), MP_ROM_PTR(&pin_PA31) },
+ { MP_ROM_QSTR(MP_QSTR_TX1), MP_ROM_PTR(&pin_PA16) },
+ { MP_ROM_QSTR(MP_QSTR_PI_TX), MP_ROM_PTR(&pin_PA16) },
+ { MP_ROM_QSTR(MP_QSTR_RX1), MP_ROM_PTR(&pin_PA17) },
+ { MP_ROM_QSTR(MP_QSTR_PI_RX), 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/robohatmm1_m4/board.c b/ports/atmel-samd/boards/robohatmm1_m4/board.c
new file mode 100644
index 000000000..0f60736a2
--- /dev/null
+++ b/ports/atmel-samd/boards/robohatmm1_m4/board.c
@@ -0,0 +1,39 @@
+/*
+ * 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 "hal/include/hal_gpio.h"
+
+void board_init(void) {
+}
+
+bool board_requests_safe_mode(void) {
+ return false;
+}
+
+void reset_board(void) {
+}
diff --git a/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.h b/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.h
new file mode 100644
index 000000000..ac3a3a0dd
--- /dev/null
+++ b/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.h
@@ -0,0 +1,44 @@
+#define MICROPY_HW_BOARD_NAME "Robo HAT MM1"
+#define MICROPY_HW_MCU_NAME "samd51g19"
+
+#define CIRCUITPY_MCU_FAMILY samd51
+
+#define MICROPY_HW_LED_STATUS (&pin_PB22)
+
+// Salae reads 12mhz which is the limit even though we set it to the safer 8mhz.
+#define SPI_FLASH_BAUDRATE (8000000)
+
+// On-board flash
+#define SPI_FLASH_MOSI_PIN &pin_PA12
+#define SPI_FLASH_MISO_PIN &pin_PA14
+#define SPI_FLASH_SCK_PIN &pin_PA13
+#define SPI_FLASH_CS_PIN &pin_PA15
+
+// These are pins not to reset.
+// SPI Data pins
+#define MICROPY_PORT_A (0)
+#define MICROPY_PORT_B (0)
+#define MICROPY_PORT_C (0)
+#define MICROPY_PORT_D (0)
+
+#define AUTORESET_DELAY_MS 500
+
+// If you change this, then make sure to update the linker scripts as well to
+// make sure you don't overwrite code
+#define CIRCUITPY_INTERNAL_NVM_SIZE 8192
+
+#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
+
+#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
+#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
+
+#define DEFAULT_SPI_BUS_SCK (&pin_PB10)
+#define DEFAULT_SPI_BUS_MOSI (&pin_PB08)
+#define DEFAULT_SPI_BUS_MISO (&pin_PB11)
+
+#define DEFAULT_UART_BUS_RX (&pin_PB03)
+#define DEFAULT_UART_BUS_TX (&pin_PB02)
+
+// 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/robohatmm1_m4/mpconfigboard.mk b/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk
new file mode 100644
index 000000000..afd15ad0a
--- /dev/null
+++ b/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk
@@ -0,0 +1,31 @@
+LD_FILE = boards/samd51x19-bootloader-external-flash.ld
+USB_VID = 0x1209
+USB_PID = 0x4D43
+USB_PRODUCT = "Robo HAT MM1"
+USB_MANUFACTURER = "Robotics Masters"
+
+CHIP_VARIANT = SAMD51G19A
+CHIP_FAMILY = samd51
+
+#QSPI_FLASH_FILESYSTEM = 0
+
+SPI_FLASH_FILESYSTEM = 1
+EXTERNAL_FLASH_DEVICE_COUNT = 1
+EXTERNAL_FLASH_DEVICES = "W25Q64JV_IQ"
+LONGINT_IMPL = MPZ
+
+CIRCUITPY_PS2IO = 1
+# No I2S on SAMD51G
+CIRCUITPY_AUDIOBUSIO = 0
+# No touch on SAMD51 yet
+CIRCUITPY_TOUCHIO = 0
+# Make room for more stuff
+CIRCUITPY_DISPLAYIO = 0
+CIRCUITPY_FREQUENCYIO = 0
+
+# Include these Python libraries in firmware.
+FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
+FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel
+#FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_INA219
+#FROZEN_MPY_DIRS += $(TOP)/frozen/RoboticsMasters_CircuitPython_MPU9250
+
diff --git a/ports/atmel-samd/boards/robohatmm1_m4/pins.c b/ports/atmel-samd/boards/robohatmm1_m4/pins.c
new file mode 100644
index 000000000..e1204e343
--- /dev/null
+++ b/ports/atmel-samd/boards/robohatmm1_m4/pins.c
@@ -0,0 +1,89 @@
+#include "shared-bindings/board/__init__.h"
+
+STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
+ // SERVO Pins
+ { MP_ROM_QSTR(MP_QSTR_SERVO1), MP_ROM_PTR(&pin_PA18) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO2), MP_ROM_PTR(&pin_PA19) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO3), MP_ROM_PTR(&pin_PA20) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO4), MP_ROM_PTR(&pin_PA21) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO5), MP_ROM_PTR(&pin_PA11) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO6), MP_ROM_PTR(&pin_PA10) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO7), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_SERVO8), MP_ROM_PTR(&pin_PA08) },
+
+ // RCC Pins
+ { MP_ROM_QSTR(MP_QSTR_RCC1), MP_ROM_PTR(&pin_PA07) },
+ { MP_ROM_QSTR(MP_QSTR_RCC2), MP_ROM_PTR(&pin_PA06) },
+ { MP_ROM_QSTR(MP_QSTR_RCC3), MP_ROM_PTR(&pin_PA05) },
+ { MP_ROM_QSTR(MP_QSTR_RCC4), MP_ROM_PTR(&pin_PA04) },
+
+ // Special Function
+ { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_PA02) },
+ { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PA02) },
+ { MP_ROM_QSTR(MP_QSTR_POWER_OFF), MP_ROM_PTR(&pin_PA03) },
+ { MP_ROM_QSTR(MP_QSTR_POWER_DISABLE), MP_ROM_PTR(&pin_PA03) },
+ { MP_ROM_QSTR(MP_QSTR_POWER_ON), MP_ROM_PTR(&pin_PA27) },
+ { MP_ROM_QSTR(MP_QSTR_POWER_ENABLE), MP_ROM_PTR(&pin_PA27) },
+ { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_PA27) },
+
+ { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_PB23) },
+ { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_PB22) },
+ { 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_TX), MP_ROM_PTR(&pin_PB02) },
+ { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB03) },
+
+ // GROVE on SERCOM0
+ { MP_ROM_QSTR(MP_QSTR_GROVE_SCL), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_SDA), MP_ROM_PTR(&pin_PA08) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_RX), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_TX), MP_ROM_PTR(&pin_PA08) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_D1), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_D0), MP_ROM_PTR(&pin_PA08) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_A1), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_GROVE_A0), MP_ROM_PTR(&pin_PA08) },
+
+ // UART on SERCOM0
+ { MP_ROM_QSTR(MP_QSTR_UART_TX), MP_ROM_PTR(&pin_PA04) },
+ { MP_ROM_QSTR(MP_QSTR_UART_RX), MP_ROM_PTR(&pin_PA05) },
+ { MP_ROM_QSTR(MP_QSTR_UART_CTS), MP_ROM_PTR(&pin_PA06) },
+ { MP_ROM_QSTR(MP_QSTR_UART_RTS), MP_ROM_PTR(&pin_PA07) },
+
+ // SPI Flash on SERCOM2
+ { MP_ROM_QSTR(MP_QSTR_FLASH_SCK), MP_ROM_PTR(&pin_PA13) },
+ { MP_ROM_QSTR(MP_QSTR_FLASH_MISO), MP_ROM_PTR(&pin_PA14) },
+ { MP_ROM_QSTR(MP_QSTR_FLASH_MOSI), MP_ROM_PTR(&pin_PA12) },
+ { MP_ROM_QSTR(MP_QSTR_FLASH_CS), MP_ROM_PTR(&pin_PA15) },
+
+ // I2C on SERCOM3
+ { MP_ROM_QSTR(MP_QSTR_SDA1), MP_ROM_PTR(&pin_PA00) },
+ { MP_ROM_QSTR(MP_QSTR_SCL1), MP_ROM_PTR(&pin_PA01) },
+
+ // SPI on SERCOM4
+ { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PB08) },
+ { MP_ROM_QSTR(MP_QSTR_SS), MP_ROM_PTR(&pin_PB09) },
+ { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PB10) },
+ { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PB11) },
+
+ // GPS on SERCOM5
+ { MP_ROM_QSTR(MP_QSTR_GPS_TX), MP_ROM_PTR(&pin_PB02) },
+ { MP_ROM_QSTR(MP_QSTR_GPS_RX), MP_ROM_PTR(&pin_PB03) },
+ { MP_ROM_QSTR(MP_QSTR_GPS_SDA), MP_ROM_PTR(&pin_PA00) },
+ { MP_ROM_QSTR(MP_QSTR_GPS_SCL), MP_ROM_PTR(&pin_PA01) },
+
+ // Raspberry Pi
+ { MP_ROM_QSTR(MP_QSTR_PI_GP25), MP_ROM_PTR(&pin_PA30) },
+ { MP_ROM_QSTR(MP_QSTR_SWCLK), MP_ROM_PTR(&pin_PA30) },
+ { MP_ROM_QSTR(MP_QSTR_PI_GP24), MP_ROM_PTR(&pin_PA31) },
+ { MP_ROM_QSTR(MP_QSTR_SWDIO), MP_ROM_PTR(&pin_PA31) },
+ { MP_ROM_QSTR(MP_QSTR_TX1), MP_ROM_PTR(&pin_PA16) },
+ { MP_ROM_QSTR(MP_QSTR_PI_TX), MP_ROM_PTR(&pin_PA16) },
+ { MP_ROM_QSTR(MP_QSTR_RX1), MP_ROM_PTR(&pin_PA17) },
+ { MP_ROM_QSTR(MP_QSTR_PI_RX), 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/trinket_m0_haxpress/mpconfigboard.mk b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk
index b9d36a741..76c33a333 100644
--- a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk
@@ -11,3 +11,5 @@ SPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICE_COUNT = 1
EXTERNAL_FLASH_DEVICES = W25Q32BV
LONGINT_IMPL = MPZ
+
+SUPEROPT_GC = 0
diff --git a/ports/atmel-samd/boards/ugame10/board.c b/ports/atmel-samd/boards/ugame10/board.c
index 15e22a72c..72b0ed577 100644
--- a/ports/atmel-samd/boards/ugame10/board.c
+++ b/ports/atmel-samd/boards/ugame10/board.c
@@ -93,6 +93,8 @@ void board_init(void) {
16, // Color depth
false, // grayscale
false, // pixels in byte share row. Only used with depth < 8
+ 1, // bytes per cell. Only valid for depths < 8
+ false, // reverse_pixels_in_byte. Only valid for depths < 8
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command
diff --git a/shared-bindings/bleio/Peripheral.c b/shared-bindings/bleio/Peripheral.c
index 1302c9652..570896d27 100644
--- a/shared-bindings/bleio/Peripheral.c
+++ b/shared-bindings/bleio/Peripheral.c
@@ -72,7 +72,7 @@ static const char default_name[] = "CIRCUITPY";
//| serv = bleio.Service(bleio.UUID(0x180f), [chara])
//|
//| # Create a peripheral and start it up.
-//| periph = bleio.Peripheral([service])
+//| periph = bleio.Peripheral([serv])
//| adv = ServerAdvertisement(periph)
//| periph.start_advertising(adv.advertising_data_bytes, adv.scan_response_bytes)
//|
diff --git a/shared-bindings/displayio/Display.c b/shared-bindings/displayio/Display.c
index 361a37ece..9cb4d6e74 100644
--- a/shared-bindings/displayio/Display.c
+++ b/shared-bindings/displayio/Display.c
@@ -51,7 +51,7 @@
//| Most people should not use this class directly. Use a specific display driver instead that will
//| contain the initialization sequence at minimum.
//|
-//| .. class:: Display(display_bus, init_sequence, *, width, height, colstart=0, rowstart=0, rotation=0, color_depth=16, grayscale=False, pixels_in_byte_share_row=True, set_column_command=0x2a, set_row_command=0x2b, write_ram_command=0x2c, set_vertical_scroll=0, backlight_pin=None, brightness_command=None, brightness=1.0, auto_brightness=False, single_byte_bounds=False, data_as_commands=False)
+//| .. class:: Display(display_bus, init_sequence, *, width, height, colstart=0, rowstart=0, rotation=0, color_depth=16, grayscale=False, pixels_in_byte_share_row=True, bytes_per_cell=1, reverse_pixels_in_byte=False, set_column_command=0x2a, set_row_command=0x2b, write_ram_command=0x2c, set_vertical_scroll=0, backlight_pin=None, brightness_command=None, brightness=1.0, auto_brightness=False, single_byte_bounds=False, data_as_commands=False)
//|
//| Create a Display object on the given display bus (`displayio.FourWire` or `displayio.ParallelBus`).
//|
@@ -90,6 +90,8 @@
//| support 18 bit but 16 is easier to transmit. The last bit is extrapolated.)
//| :param bool grayscale: True if the display only shows a single color.
//| :param bool pixels_in_byte_share_row: True when pixels are less than a byte and a byte includes pixels from the same row of the display. When False, pixels share a column.
+//| :param int bytes_per_cell: Number of bytes per addressable memory location when color_depth < 8. When greater than one, bytes share a row or column according to pixels_in_byte_share_row.
+//| :param bool reverse_pixels_in_byte: Reverses the pixel order within each byte when color_depth < 8. Does not apply across multiple bytes even if there is more than one byte per cell (bytes_per_cell.)
//| :param int set_column_command: Command used to set the start and end columns to update
//| :param int set_row_command: Command used so set the start and end rows to update
//| :param int write_ram_command: Command used to write pixels values into the update region. Ignored if data_as_commands is set.
@@ -102,7 +104,7 @@
//| :param bool data_as_commands: Treat all init and boundary data as SPI commands. Certain displays require this.
//|
STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
- enum { ARG_display_bus, ARG_init_sequence, ARG_width, ARG_height, ARG_colstart, ARG_rowstart, ARG_rotation, ARG_color_depth, ARG_grayscale, ARG_pixels_in_byte_share_row, ARG_set_column_command, ARG_set_row_command, ARG_write_ram_command, ARG_set_vertical_scroll, ARG_backlight_pin, ARG_brightness_command, ARG_brightness, ARG_auto_brightness, ARG_single_byte_bounds, ARG_data_as_commands };
+ enum { ARG_display_bus, ARG_init_sequence, ARG_width, ARG_height, ARG_colstart, ARG_rowstart, ARG_rotation, ARG_color_depth, ARG_grayscale, ARG_pixels_in_byte_share_row, ARG_bytes_per_cell, ARG_reverse_pixels_in_byte, ARG_set_column_command, ARG_set_row_command, ARG_write_ram_command, ARG_set_vertical_scroll, ARG_backlight_pin, ARG_brightness_command, ARG_brightness, ARG_auto_brightness, ARG_single_byte_bounds, ARG_data_as_commands };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_display_bus, MP_ARG_REQUIRED | MP_ARG_OBJ },
{ MP_QSTR_init_sequence, MP_ARG_REQUIRED | MP_ARG_OBJ },
@@ -114,6 +116,8 @@ STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_a
{ MP_QSTR_color_depth, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 16} },
{ MP_QSTR_grayscale, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} },
{ MP_QSTR_pixels_in_byte_share_row, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = true} },
+ { MP_QSTR_bytes_per_cell, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} },
+ { MP_QSTR_reverse_pixels_in_byte, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} },
{ MP_QSTR_set_column_command, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x2a} },
{ MP_QSTR_set_row_command, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x2b} },
{ MP_QSTR_write_ram_command, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x2c} },
@@ -163,7 +167,8 @@ STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_a
common_hal_displayio_display_construct(
self,
display_bus, args[ARG_width].u_int, args[ARG_height].u_int, args[ARG_colstart].u_int, args[ARG_rowstart].u_int, rotation,
- args[ARG_color_depth].u_int, args[ARG_grayscale].u_bool, args[ARG_pixels_in_byte_share_row].u_bool,
+ args[ARG_color_depth].u_int, args[ARG_grayscale].u_bool,
+ args[ARG_pixels_in_byte_share_row].u_bool, args[ARG_bytes_per_cell].u_bool, args[ARG_reverse_pixels_in_byte].u_bool,
args[ARG_set_column_command].u_int, args[ARG_set_row_command].u_int,
args[ARG_write_ram_command].u_int,
args[ARG_set_vertical_scroll].u_int,
@@ -199,7 +204,10 @@ STATIC mp_obj_t displayio_display_obj_show(mp_obj_t self_in, mp_obj_t group_in)
group = MP_OBJ_TO_PTR(native_group(group_in));
}
- common_hal_displayio_display_show(self, group);
+ bool ok = common_hal_displayio_display_show(self, group);
+ if (!ok) {
+ mp_raise_ValueError(translate("Group already used"));
+ }
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(displayio_display_show_obj, displayio_display_obj_show);
diff --git a/shared-bindings/displayio/Display.h b/shared-bindings/displayio/Display.h
index e765e6f25..a8938bbcd 100644
--- a/shared-bindings/displayio/Display.h
+++ b/shared-bindings/displayio/Display.h
@@ -40,7 +40,8 @@ extern const mp_obj_type_t displayio_display_type;
void common_hal_displayio_display_construct(displayio_display_obj_t* self,
mp_obj_t bus, uint16_t width, uint16_t height,
- int16_t colstart, int16_t rowstart, uint16_t rotation, uint16_t color_depth, bool grayscale, bool pixels_in_byte_share_row,
+ int16_t colstart, int16_t rowstart, uint16_t rotation, uint16_t color_depth, bool grayscale,
+ bool pixels_in_byte_share_row, uint8_t bytes_per_cell, bool reverse_pixels_in_byte,
uint8_t set_column_command, uint8_t set_row_command, uint8_t write_ram_command, uint8_t set_vertical_scroll,
uint8_t* init_sequence, uint16_t init_sequence_len, const mcu_pin_obj_t* backlight_pin, uint16_t brightness_command,
mp_float_t brightness, bool auto_brightness,
@@ -48,7 +49,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self,
int32_t common_hal_displayio_display_wait_for_frame(displayio_display_obj_t* self);
-void common_hal_displayio_display_show(displayio_display_obj_t* self, displayio_group_t* root_group);
+bool common_hal_displayio_display_show(displayio_display_obj_t* self, displayio_group_t* root_group);
void common_hal_displayio_display_refresh_soon(displayio_display_obj_t* self);
diff --git a/shared-bindings/index.rst b/shared-bindings/index.rst
index 7152f506e..cbffdb614 100644
--- a/shared-bindings/index.rst
+++ b/shared-bindings/index.rst
@@ -1,11 +1,11 @@
Core Modules
========================================
-These core modules are intended on being consistent across ports. Currently
-they are only implemented in the SAMD21 and ESP8266 ports. A module may not exist
-in a port if no underlying hardware support is present or if flash space is
-limited. For example, a microcontroller without analog features will not have
-`analogio`.
+These core modules are intended on being consistent across ports and boards.
+A module may not exist on a port/board if no underlying hardware support is
+present or if flash space is limited. For example, a microcontroller without
+analog features will not have `analogio`. See the `support_matrix` page for
+a list of modules supported on each board.
Modules
---------
@@ -14,57 +14,6 @@ Modules
:glob:
:maxdepth: 3
+ support_matrix
*/__init__
help
-
-.. _module-support-matrix:
-
-Support Matrix
----------------
-NOTE 1: **All Supported** means the following ports are supported: SAMD21, SAMD21 Express,
-SAMD51, SAMD51 Express, and ESP8266.
-
-NOTE 2: **SAMD** and/or **SAMD Express** without additional numbers, means both SAMD21 & SAMD51 versions
-are supported.
-
-NOTE 3: The `pIRkey SAMD21 board <https://www.adafruit.com/product/3364>`_ is specialized and may not
-have modules as listed below.
-
-================= ==============================
-Module Supported Ports
-================= ==============================
-`analogio` **All Supported**
-`audiobusio` **SAMD/SAMD Express**
-`audiocore` **All with audioio, audiobusio or audiopwmio**
-`audioio` **SAMD Express**
-`audiopwmio` **nRF**
-`binascii` **ESP8266**
-`bitbangio` **SAMD Express, ESP8266**
-`board` **All Supported**
-`bleio` **nRF**
-`busio` **All Supported**
-`digitalio` **All Supported**
-`frequencyio` **SAMD51**
-`gamepad` **SAMD Express, nRF**
-`hashlib` **ESP8266**
-`i2cslave` **SAMD Express**
-`math` **All Supported**
-`microcontroller` **All Supported**
-`multiterminal` **ESP8266**
-`neopixel_write` **All Supported**
-`nvm` **SAMD Express**
-`os` **All Supported**
-`pulseio` **SAMD/SAMD Express**
-`ps2io` **SAMD/SAMD Express**
-`random` **All Supported**
-`rotaryio` **SAMD51, SAMD Express**
-`storage` **All Supported**
-`struct` **All Supported**
-`supervisor` **SAMD/SAMD Express**
-`time` **All Supported**
-`touchio` **SAMD/SAMD Express**
-`uheap` **Debug (All)**
-`usb_hid` **SAMD/SAMD Express**
-`_pixelbuf` **SAMD Express**
-`_stage` **SAMD/SAMD Express**
-================= ==============================
diff --git a/shared-bindings/support_matrix.rst b/shared-bindings/support_matrix.rst
new file mode 100644
index 000000000..124f3a810
--- /dev/null
+++ b/shared-bindings/support_matrix.rst
@@ -0,0 +1,16 @@
+.. _module-support-matrix:
+
+Support Matrix
+===============
+
+The following table lists the available built-in modules for each CircuitPython
+capable board.
+
+.. csv-table::
+ :header-rows: 1
+ :widths: 7, 50
+
+ "Board", "Modules Available"
+ {% for key, value in support_matrix|dictsort -%}
+ "{{ key }}", "{{ '`' ~ value|join("`, `") ~ '`' }}"
+ {% endfor -%}
diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c
index a8515b9e5..51c6f292a 100644
--- a/shared-module/displayio/Display.c
+++ b/shared-module/displayio/Display.c
@@ -44,7 +44,7 @@
void common_hal_displayio_display_construct(displayio_display_obj_t* self,
mp_obj_t bus, uint16_t width, uint16_t height, int16_t colstart, int16_t rowstart, uint16_t rotation,
- uint16_t color_depth, bool grayscale, bool pixels_in_byte_share_row,
+ uint16_t color_depth, bool grayscale, bool pixels_in_byte_share_row, uint8_t bytes_per_cell, bool reverse_pixels_in_byte,
uint8_t set_column_command, uint8_t set_row_command,
uint8_t write_ram_command, uint8_t set_vertical_scroll, uint8_t* init_sequence, uint16_t init_sequence_len,
const mcu_pin_obj_t* backlight_pin, uint16_t brightness_command, mp_float_t brightness, bool auto_brightness,
@@ -52,6 +52,8 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self,
self->colorspace.depth = color_depth;
self->colorspace.grayscale = grayscale;
self->colorspace.pixels_in_byte_share_row = pixels_in_byte_share_row;
+ self->colorspace.bytes_per_cell = bytes_per_cell;
+ self->colorspace.reverse_pixels_in_byte = reverse_pixels_in_byte;
self->set_column_command = set_column_command;
self->set_row_command = set_row_command;
self->write_ram_command = write_ram_command;
@@ -195,17 +197,25 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self,
common_hal_displayio_display_show(self, &circuitpython_splash);
}
-void common_hal_displayio_display_show(displayio_display_obj_t* self, displayio_group_t* root_group) {
+bool common_hal_displayio_display_show(displayio_display_obj_t* self, displayio_group_t* root_group) {
if (root_group == NULL) {
root_group = &circuitpython_splash;
}
if (root_group == self->current_group) {
- return;
+ return true;
+ }
+ if (root_group->in_group) {
+ return false;
+ }
+ if (self->current_group != NULL) {
+ self->current_group->in_group = false;
}
displayio_group_update_transform(root_group, &self->transform);
+ root_group->in_group = true;
self->current_group = root_group;
self->full_refresh = true;
common_hal_displayio_display_refresh_soon(self);
+ return true;
}
void common_hal_displayio_display_refresh_soon(displayio_display_obj_t* self) {
@@ -299,11 +309,11 @@ void displayio_display_set_region_to_update(displayio_display_obj_t* self, displ
if (self->colorspace.depth < 8) {
uint8_t pixels_per_byte = 8 / self->colorspace.depth;
if (self->colorspace.pixels_in_byte_share_row) {
- x1 /= pixels_per_byte;
- x2 /= pixels_per_byte;
+ x1 /= pixels_per_byte * self->colorspace.bytes_per_cell;
+ x2 /= pixels_per_byte * self->colorspace.bytes_per_cell;
} else {
- y1 /= pixels_per_byte;
- y2 /= pixels_per_byte;
+ y1 /= pixels_per_byte * self->colorspace.bytes_per_cell;
+ y2 /= pixels_per_byte * self->colorspace.bytes_per_cell;
}
}
@@ -318,7 +328,6 @@ void displayio_display_set_region_to_update(displayio_display_obj_t* self, displ
if (self->single_byte_bounds) {
data[data_length++] = x1 + self->colstart;
data[data_length++] = x2 - 1 + self->colstart;
- data_length += 2;
} else {
x1 += self->colstart;
x2 += self->colstart - 1;
@@ -413,7 +422,7 @@ bool displayio_display_clip_area(displayio_display_obj_t *self, const displayio_
// Expand the area if we have multiple pixels per byte and we need to byte
// align the bounds.
if (self->colorspace.depth < 8) {
- uint8_t pixels_per_byte = 8 / self->colorspace.depth;
+ uint8_t pixels_per_byte = 8 / self->colorspace.depth * self->colorspace.bytes_per_cell;
if (self->colorspace.pixels_in_byte_share_row) {
if (clipped->x1 % pixels_per_byte != 0) {
clipped->x1 -= clipped->x1 % pixels_per_byte;
diff --git a/shared-module/displayio/Palette.h b/shared-module/displayio/Palette.h
index 19c05baf5..a917e2432 100644
--- a/shared-module/displayio/Palette.h
+++ b/shared-module/displayio/Palette.h
@@ -36,6 +36,8 @@ typedef struct {
uint8_t depth;
bool grayscale;
bool pixels_in_byte_share_row;
+ uint8_t bytes_per_cell;
+ bool reverse_pixels_in_byte;
uint8_t hue;
} _displayio_colorspace_t;
diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c
index 88873d3a9..fee2ae978 100644
--- a/shared-module/displayio/TileGrid.c
+++ b/shared-module/displayio/TileGrid.c
@@ -436,7 +436,11 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, const _displayio_c
// asm("bkpt");
// }
}
- ((uint8_t*)buffer)[offset / pixels_per_byte] |= pixel << ((offset % pixels_per_byte) * colorspace->depth);
+ uint8_t shift = (offset % pixels_per_byte) * colorspace->depth;
+ if (colorspace->reverse_pixels_in_byte) {
+ shift = (pixels_per_byte - 1) * colorspace->depth - shift;
+ }
+ ((uint8_t*)buffer)[offset / pixels_per_byte] |= pixel << shift;
}
}
}
diff --git a/shared-module/displayio/__init__.c b/shared-module/displayio/__init__.c
index 97060aaeb..8f6e650a1 100644
--- a/shared-module/displayio/__init__.c
+++ b/shared-module/displayio/__init__.c
@@ -209,35 +209,35 @@ void reset_displays(void) {
}
}
} else if (displays[i].i2cdisplay_bus.base.type == &displayio_i2cdisplay_type) {
- displayio_i2cdisplay_obj_t* i2c = &displays[i].i2cdisplay_bus;
- if (((uint32_t) i2c->bus) < ((uint32_t) &displays) ||
- ((uint32_t) i2c->bus) > ((uint32_t) &displays + CIRCUITPY_DISPLAY_LIMIT)) {
- busio_i2c_obj_t* original_i2c = i2c->bus;
- #if BOARD_I2C
- // We don't need to move original_i2c if it is the board.SPI object because it is
- // statically allocated already. (Doing so would also make it impossible to reference in
- // a subsequent VM run.)
- if (original_i2c == common_hal_board_get_i2c()) {
- continue;
- }
- #endif
- memcpy(&i2c->inline_bus, original_i2c, sizeof(busio_i2c_obj_t));
- i2c->bus = &i2c->inline_bus;
- // Check for other displays that use the same i2c bus and swap them too.
- for (uint8_t j = i + 1; j < CIRCUITPY_DISPLAY_LIMIT; j++) {
- if (displays[i].i2cdisplay_bus.base.type == &displayio_i2cdisplay_type &&
- displays[i].i2cdisplay_bus.bus == original_i2c) {
- displays[i].i2cdisplay_bus.bus = &i2c->inline_bus;
- }
+ displayio_i2cdisplay_obj_t* i2c = &displays[i].i2cdisplay_bus;
+ if (((uint32_t) i2c->bus) < ((uint32_t) &displays) ||
+ ((uint32_t) i2c->bus) > ((uint32_t) &displays + CIRCUITPY_DISPLAY_LIMIT)) {
+ busio_i2c_obj_t* original_i2c = i2c->bus;
+ #if BOARD_I2C
+ // We don't need to move original_i2c if it is the board.SPI object because it is
+ // statically allocated already. (Doing so would also make it impossible to reference in
+ // a subsequent VM run.)
+ if (original_i2c == common_hal_board_get_i2c()) {
+ continue;
+ }
+ #endif
+ memcpy(&i2c->inline_bus, original_i2c, sizeof(busio_i2c_obj_t));
+ i2c->bus = &i2c->inline_bus;
+ // Check for other displays that use the same i2c bus and swap them too.
+ for (uint8_t j = i + 1; j < CIRCUITPY_DISPLAY_LIMIT; j++) {
+ if (displays[i].i2cdisplay_bus.base.type == &displayio_i2cdisplay_type &&
+ displays[i].i2cdisplay_bus.bus == original_i2c) {
+ displays[i].i2cdisplay_bus.bus = &i2c->inline_bus;
}
}
}
- }
-
- for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) {
- if (displays[i].display.base.type == NULL) {
+ } else {
+ // Not an active display.
continue;
}
+
+ // Reset the displayed group. Only the first will get the terminal but
+ // that's ok.
displayio_display_obj_t* display = &displays[i].display;
display->auto_brightness = true;
common_hal_displayio_display_show(display, &circuitpython_splash);
diff --git a/supervisor/shared/display.c b/supervisor/shared/display.c
index 6a39cbe8e..fd51e2c07 100644
--- a/supervisor/shared/display.c
+++ b/supervisor/shared/display.c
@@ -229,5 +229,6 @@ displayio_group_t circuitpython_splash = {
.size = 2,
.max_size = 2,
.children = splash_children,
- .item_removed = false
+ .item_removed = false,
+ .in_group = false
};
diff --git a/tools/travis_new_boards_check.py b/tools/travis_new_boards_check.py
new file mode 100644
index 000000000..5ae05aec4
--- /dev/null
+++ b/tools/travis_new_boards_check.py
@@ -0,0 +1,51 @@
+#! /usr/bin/env python3
+
+import sys
+import os
+import json
+
+import build_board_info
+
+# Get boards in json format
+boards_info_json = build_board_info.get_board_mapping()
+
+# Get all the boards out of the json format
+info_boards = [board for board in boards_info_json.keys() if not boards_info_json[board].get("alias", False)]
+
+# We need to know the path of the .travis.yml file
+base_path = os.path.dirname(__file__)
+travis_path = os.path.abspath(os.path.join(base_path, '..', '.travis.yml'))
+
+# Loading board list based on TRAVIS_BOARDS env variable on .travis.yml
+travis_boards = []
+with open(travis_path, 'r') as travis:
+
+ # Get all lines that contain the substring 'TRAVIS_BOARDS'
+ for line in travis:
+
+ # Get the lines with TRAVIS_BOARDS= in it
+ if line.find('TRAVIS_BOARDS=') is not -1:
+ # Store all the boards names into travis_boards
+ begin_of_names = line.find('TRAVIS_BOARDS=') + len('TRAVIS_BOARDS=') + 1
+ end_of_names = line.rfind('"')
+ boards = line[begin_of_names:end_of_names]
+ boards = boards.split(' ')
+ travis_boards.extend(boards)
+
+ # We've reached the end of the env: section
+ elif 'addons' in line:
+ break
+ else:
+ pass
+
+# All the travis_boards elements must be on info_boards
+info_boards.sort()
+travis_boards.sort()
+
+missing_boards = set(info_boards) - set(travis_boards)
+
+if missing_boards:
+ print('Boards missing in TRAVIS_BOARDS:')
+ for board in missing_boards:
+ print(board)
+ sys.exit(1)