Merge branch 'main' into main

This commit is contained in:
大汉子民 2022-05-20 10:04:02 +08:00 committed by GitHub
commit 525262cd9a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
94 changed files with 1317 additions and 225 deletions

5
.gitmodules vendored
View File

@ -286,6 +286,9 @@
[submodule "frozen/Adafruit_CircuitPython_FakeRequests"]
path = frozen/Adafruit_CircuitPython_FakeRequests
url = https://github.com/adafruit/Adafruit_CircuitPython_FakeRequests.git
[submodule "frozen/pew-pewpew-lcd"]
path = frozen/pew-pewpew-lcd
url = https://github.com/pypewpew/pew-pewpew-lcd.git
[submodule "ports/espressif/boards/mixgo_ce_udisk/cp_lib"]
path = ports/espressif/boards/mixgo_ce_udisk/cp_lib
url = https://github.com/dahanzimin/circuitpython_lib.git
url = https://github.com/dahanzimin/circuitpython_lib.git

View File

@ -9,16 +9,15 @@
version: 2
build:
os: ubuntu-20.04
tools:
python: "3"
submodules:
include:
- extmod/ulab
os: ubuntu-20.04
tools:
python: "3"
jobs:
post_install:
- python tools/ci_fetch_deps.py docs HEAD
formats:
- pdf
- pdf
python:
install:

View File

@ -61,6 +61,7 @@ TRANSLATE_SOURCES_EXC = -path "ports/*/build-*" \
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " fetch-submodules to fetch dependencies from submodules, run this right after you clone the repo"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"

View File

@ -53,9 +53,13 @@ subprocess.check_output(["make", "stubs"])
modules_support_matrix = shared_bindings_matrix.support_matrix_by_board()
modules_support_matrix_reverse = defaultdict(list)
for board, modules in modules_support_matrix.items():
for module in modules:
for module in modules[0]:
modules_support_matrix_reverse[module].append(board)
modules_support_matrix_reverse = dict((module, sorted(boards)) for module, boards in modules_support_matrix_reverse.items())
modules_support_matrix_reverse = dict(
(module, sorted(boards))
for module, boards in modules_support_matrix_reverse.items()
)
html_context = {
'support_matrix': modules_support_matrix,

View File

@ -57,6 +57,11 @@ bool vm_used_ble;
// }
// }
void bleio_user_reset() {
// HCI doesn't support the BLE workflow so just do a full reset.
bleio_reset();
}
// Turn off BLE on a reset or reload.
void bleio_reset() {
// Create a UUID object for all CCCD's.

View File

@ -4,11 +4,18 @@
All builtin functions and exceptions are described here. They are also
available via ``builtins`` module.
For more information about built-ins, see the following CPython documentation:
* `Builtin CPython Functions <https://docs.python.org/3/library/functions.html>`_
* `Builtin CPython Exceptions <https://docs.python.org/3/library/exceptions.html>`_
* `Builtin CPython Constants <https://docs.python.org/3/library/constants.html>`_
.. note:: Not all of these functions, types, exceptions, and constants are turned
on in all CircuitPython ports, for space reasons.
Functions and types
-------------------
Not all of these functions and types are turned on in all CircuitPython ports, for space reasons.
.. function:: abs()
.. function:: all()
@ -160,46 +167,77 @@ Not all of these functions and types are turned on in all CircuitPython ports, f
Exceptions
----------
.. exception:: ArithmeticError
.. exception:: AssertionError
.. exception:: AttributeError
.. exception:: BaseException
.. exception:: BrokenPipeError
.. exception:: ConnectionError
.. exception:: EOFError
.. exception:: Exception
.. exception:: ImportError
.. exception:: IndentationError
.. exception:: IndexError
.. exception:: KeyboardInterrupt
.. exception:: KeyError
.. exception:: LookupError
.. exception:: MemoryError
.. exception:: MpyError
Not a part of the CPython standard library
.. exception:: NameError
.. exception:: NotImplementedError
.. exception:: OSError
.. exception:: OverflowError
.. exception:: RuntimeError
.. exception:: ReloadException
`ReloadException` is used internally to deal with soft restarts.
Not a part of the CPython standard library
.. exception:: StopAsyncIteration
.. exception:: StopIteration
.. exception:: SyntaxError
.. exception:: SystemExit
|see_cpython| :py:class:`cpython:SystemExit`.
.. exception:: TimeoutError
.. exception:: TypeError
|see_cpython| :py:class:`cpython:TypeError`.
.. exception:: UnicodeError
.. exception:: ValueError
.. exception:: ZeroDivisionError
Constants
---------
.. data:: Ellipsis
.. data:: NotImplemented

View File

@ -62,9 +62,17 @@ additional_modules = {
"fontio": "CIRCUITPY_DISPLAYIO",
"terminalio": "CIRCUITPY_DISPLAYIO",
"adafruit_bus_device": "CIRCUITPY_BUSDEVICE",
"adafruit_pixelbuf": "CIRCUITPY_PIXELBUF"
"adafruit_pixelbuf": "CIRCUITPY_PIXELBUF",
"usb": "CIRCUITPY_USB_HOST",
}
frozen_excludes = ["examples", "docs", "tests", "utils", "conf.py", "setup.py"]
"""Files and dirs at the root of a frozen directory that should be ignored.
This is the same list as in the preprocess_frozen_modules script."""
repository_urls = {}
"""Cache of repository URLs for frozen modules."""
def get_circuitpython_root_dir():
""" The path to the root './circuitpython' directory
"""
@ -162,6 +170,63 @@ def get_settings_from_makefile(port_dir, board_name):
return settings
def get_repository_url(directory):
if directory in repository_urls:
return repository_urls[directory]
readme = None
for readme_path in (
os.path.join(directory, "README.rst"),
os.path.join(os.path.dirname(directory), "README.rst")
):
if os.path.exists(readme_path):
readme = readme_path
break
path = None
if readme:
with open(readme, "r") as fp:
for line in fp.readlines():
if m := re.match("\s+:target:\s+(http\S+(docs.circuitpython|readthedocs)\S+)\s*", line):
path = m.group(1)
break
if m := re.search("<(http[^>]+)>", line):
path = m.group(1)
break
if path is None:
contents = subprocess.run(
["git", "remote", "get-url", "origin"],
encoding="utf-8",
errors="replace",
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
cwd=directory
)
path = contents.stdout.strip()
repository_urls[directory] = path
return path
def frozen_modules_from_dirs(frozen_mpy_dirs):
"""
Go through the list of frozen directories and extract the python modules.
Paths are of the type:
$(TOP)/frozen/Adafruit_CircuitPython_CircuitPlayground
$(TOP)/frozen/circuitpython-stage/meowbit
Python modules are at the root of the path, and are python files or directories
containing python files. Except the ones in the frozen_excludes list.
"""
frozen_modules = []
for frozen_path in filter(lambda x: x, frozen_mpy_dirs.split(" ")):
source_dir = get_circuitpython_root_dir() / frozen_path[7:]
url_repository = get_repository_url(source_dir)
for sub in source_dir.glob("*"):
if sub.name in frozen_excludes:
continue
if sub.name.endswith(".py"):
frozen_modules.append((sub.name[:-3], url_repository))
continue
if next(sub.glob("**/*.py"), None): # tests if not empty
frozen_modules.append((sub.name, url_repository))
return frozen_modules
def lookup_setting(settings, key, default=''):
while True:
value = settings.get(key, default)
@ -207,8 +272,14 @@ def support_matrix_by_board(use_branded_name=True):
board_modules.append(base[module]['name'])
board_modules.sort()
frozen_modules = []
if "FROZEN_MPY_DIRS" in settings:
frozen_modules = frozen_modules_from_dirs(settings["FROZEN_MPY_DIRS"])
if frozen_modules:
frozen_modules.sort()
# generate alias boards too
board_matrix = [(board_name, board_modules)]
board_matrix = [(board_name, (board_modules, frozen_modules))]
if entry.name in aliases_by_board:
for alias in aliases_by_board[entry.name]:
if use_branded_name:
@ -216,7 +287,7 @@ def support_matrix_by_board(use_branded_name=True):
alias = aliases_brand_names[alias]
else:
alias = alias.replace("_"," ").title()
board_matrix.append( (alias, board_modules) )
board_matrix.append( (alias, (board_modules, frozen_modules)) )
return board_matrix # this is now a list of (board,modules)
@ -225,7 +296,6 @@ def support_matrix_by_board(use_branded_name=True):
# flatmap with comprehensions
boards = dict(sorted([board for matrix in mapped_exec for board in matrix]))
# print(json.dumps(boards, indent=2))
return boards
if __name__ == '__main__':

View File

@ -7,8 +7,21 @@
right: 10px;
top: 4px;
}
.support-matrix-table .this_module code,
.support-matrix-table .this_module span {
.support-matrix-table .reference.external {
box-sizing: border-box;
font-weight: 700;
color: #404040;
font-family: "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace;
padding: 2px 5px;
background: white;
border: 1px solid #e1e4e5;
font-size: 75%;
}
.support-matrix-table .this_module,
.support-matrix-table .this_module.reference.external,
.support-matrix-table .this_module * {
background: black;
color: white;
}

View File

@ -44,14 +44,14 @@ $(() => {
var nvisible = 0;
$(".support-matrix-table tbody tr").each( (index,item) => {
var name = $(item).find("td:first-child p").html();
var modules = $(item).find("a.reference.internal");
var modules = $(item).find("code, a.reference.external");
var matching_all = true;
//
list_search.forEach((sstring) => {
var matching = (sstring[0] == "-");
for(var modi = 0; modi < modules.length; ++modi) {
module = modules[modi];
var mod_name = module.firstChild.firstChild.textContent;
var mod_name = module.firstChild.textContent;
if(sstring[0] == "-") {
if(mod_name.match(sstring.substr(1))) {
matching = false;

@ -1 +1 @@
Subproject commit 2dfd61a0d5ffc8048e72d24e5ecdac9a74bb2bc3
Subproject commit 3d1aab0daf63c3b4476f73cba39cf5da49e1e4aa

@ -1 +1 @@
Subproject commit 742ac7c8fb52bb85d9fd367b60a7f80475d7ed14
Subproject commit 2d8310f19d1bdce817df13e807b409b5b057fc21

@ -1 +1 @@
Subproject commit 5fdd62ab69fda70407644acc6f9b45681da9ef68
Subproject commit 850c3dc512f7feae1eaad20bdc1c5e4c63c92f08

1
frozen/pew-pewpew-lcd Submodule

@ -0,0 +1 @@
Subproject commit 837f3e5f16accae5b3677954921b5ddd517f0799

View File

@ -113,6 +113,10 @@ msgstr "%q panjang harus >= 1"
msgid "%q must be %d-%d"
msgstr "%q harus %d-%d"
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr "%q harus <= %d"
@ -1768,6 +1772,10 @@ msgstr "Tidak ada pull-down pada pin; 1Mohm direkomendasikan"
msgid "No space left on device"
msgstr "Tidak ada ruang yang tersisa di perangkat"
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "Tidak ada file/direktori"
@ -1880,6 +1888,10 @@ msgstr ""
msgid "Only one color can be transparent at a time"
msgstr ""
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2556,10 +2568,6 @@ msgstr "Tipe bus tampilan tidak didukung"
msgid "Unsupported format"
msgstr "Format tidak didukung"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "Operasi yang tidak didukung"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr ""
@ -4676,6 +4684,9 @@ msgstr "zi harus berjenis float"
msgid "zi must be of shape (n_section, 2)"
msgstr "Zi harus berbentuk (n_section, 2)"
#~ msgid "Unsupported operation"
#~ msgstr "Operasi yang tidak didukung"
#~ msgid ""
#~ "\n"
#~ "Code stopped by auto-reload.\n"

View File

@ -107,6 +107,10 @@ msgstr ""
msgid "%q must be %d-%d"
msgstr ""
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr ""
@ -1749,6 +1753,10 @@ msgstr ""
msgid "No space left on device"
msgstr ""
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr ""
@ -1856,6 +1864,10 @@ msgstr ""
msgid "Only one color can be transparent at a time"
msgstr ""
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2521,10 +2533,6 @@ msgstr ""
msgid "Unsupported format"
msgstr ""
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr ""
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr ""

View File

@ -112,6 +112,10 @@ msgstr "%q délka musí být >= 1"
msgid "%q must be %d-%d"
msgstr "%q musí být %d-%d"
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr "%q musí být <= %d"
@ -1756,6 +1760,10 @@ msgstr ""
msgid "No space left on device"
msgstr ""
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr ""
@ -1863,6 +1871,10 @@ msgstr ""
msgid "Only one color can be transparent at a time"
msgstr ""
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2530,10 +2542,6 @@ msgstr ""
msgid "Unsupported format"
msgstr ""
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr ""
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr ""

View File

@ -115,6 +115,10 @@ msgstr "%q Länge muss >= 1 sein"
msgid "%q must be %d-%d"
msgstr "%q muss %d-%d sein"
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr "%q muss <= %d sein"
@ -1776,6 +1780,10 @@ msgstr "Kein Pulldown-Widerstand am Pin; 1 MOhm wird vorgeschlagen"
msgid "No space left on device"
msgstr "Kein Speicherplatz mehr verfügbar auf dem Gerät"
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "Keine solche Datei/Verzeichnis"
@ -1889,6 +1897,10 @@ msgstr "Nur eine alarm-time kann gesetzt werden."
msgid "Only one color can be transparent at a time"
msgstr "Nur eine Farbe kann transparent sein zu einer Zeit"
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr "Vorgang oder Funktion wird nicht unterstützt"
@ -2577,10 +2589,6 @@ msgstr "Nicht unterstützter display bus type"
msgid "Unsupported format"
msgstr "Nicht unterstütztes Format"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "Nicht unterstützte Operation"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr "Update fehlgeschlagen"
@ -4738,6 +4746,9 @@ msgstr "zi muss eine Gleitkommazahl sein"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi muss die Form (n_section, 2) haben"
#~ msgid "Unsupported operation"
#~ msgstr "Nicht unterstützte Operation"
#~ msgid "divisor must be 4"
#~ msgstr "Teiler muss 4 sein"

View File

@ -107,6 +107,10 @@ msgstr ""
msgid "%q must be %d-%d"
msgstr ""
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr ""
@ -1749,6 +1753,10 @@ msgstr ""
msgid "No space left on device"
msgstr ""
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr ""
@ -1856,6 +1864,10 @@ msgstr ""
msgid "Only one color can be transparent at a time"
msgstr ""
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2521,10 +2533,6 @@ msgstr ""
msgid "Unsupported format"
msgstr ""
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr ""
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr ""

View File

@ -114,6 +114,10 @@ msgstr "%q length must be >= 1"
msgid "%q must be %d-%d"
msgstr "%q must be %d-%d"
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr ""
@ -1762,6 +1766,10 @@ msgstr "No pulldown on pin; 1Mohm recommended"
msgid "No space left on device"
msgstr "No space left on device"
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "No such file/directory"
@ -1873,6 +1881,10 @@ msgstr "Only one alarm.time alarm can be set."
msgid "Only one color can be transparent at a time"
msgstr "Only one colour can be transparent at a time"
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr "Operation or feature not supported"
@ -2552,10 +2564,6 @@ msgstr "Unsupported display bus type"
msgid "Unsupported format"
msgstr "Unsupported format"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "Unsupported operation"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr "Update failed"
@ -4677,6 +4685,9 @@ msgstr "zi must be of float type"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi must be of shape (n_section, 2)"
#~ msgid "Unsupported operation"
#~ msgstr "Unsupported operation"
#~ msgid ""
#~ "\n"
#~ "Code stopped by auto-reload.\n"

View File

@ -116,6 +116,10 @@ msgstr ""
msgid "%q must be %d-%d"
msgstr "%q debe ser %d-%d"
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr ""
@ -1784,6 +1788,10 @@ msgstr "No hay pulldown en el pin; 1Mohm recomendado"
msgid "No space left on device"
msgstr "No queda espacio en el dispositivo"
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "No existe el archivo/directorio"
@ -1897,6 +1905,10 @@ msgstr "Solamente una alarm.time puede ser configurada."
msgid "Only one color can be transparent at a time"
msgstr "Solo un color puede ser transparente a la vez"
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr "Operación no característica no soportada"
@ -2583,10 +2595,6 @@ msgstr "Sin capacidad de bus tipo display"
msgid "Unsupported format"
msgstr "Formato no soportado"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "Operación no soportada"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr "La actualización fallo"
@ -4724,6 +4732,9 @@ msgstr "zi debe ser de tipo flotante"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi debe ser una forma (n_section,2)"
#~ msgid "Unsupported operation"
#~ msgstr "Operación no soportada"
#~ msgid ""
#~ "\n"
#~ "Code stopped by auto-reload.\n"

View File

@ -108,6 +108,10 @@ msgstr ""
msgid "%q must be %d-%d"
msgstr ""
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr ""
@ -1764,6 +1768,10 @@ msgstr ""
msgid "No space left on device"
msgstr ""
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "Walang file/directory"
@ -1874,6 +1882,10 @@ msgstr ""
msgid "Only one color can be transparent at a time"
msgstr ""
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2543,10 +2555,6 @@ msgstr "Hindi supportadong tipo ng bitmap"
msgid "Unsupported format"
msgstr "Hindi supportadong format"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "Hindi sinusuportahang operasyon"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr ""
@ -4687,6 +4695,9 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)"
msgstr ""
#~ msgid "Unsupported operation"
#~ msgstr "Hindi sinusuportahang operasyon"
#~ msgid "Brightness must be between 0 and 255"
#~ msgstr "Ang liwanag ay dapat sa gitna ng 0 o 255"

View File

@ -116,6 +116,10 @@ msgstr "La longueur de %q doit être >= 1"
msgid "%q must be %d-%d"
msgstr "%q doit être %d-%d"
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr "%q doit être <= %d"
@ -1795,6 +1799,10 @@ msgstr "Pas de pulldown sur la broche ; 1Mohm recommandé"
msgid "No space left on device"
msgstr "Aucun espace libre sur le dispositif"
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "Fichier/répertoire introuvable"
@ -1908,6 +1916,10 @@ msgstr "Seulement une alarme alarm.time peut être réglée."
msgid "Only one color can be transparent at a time"
msgstr "Une seule couleur peut être transparente à la fois"
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr "Opération ou fonction non supportée"
@ -2600,10 +2612,6 @@ msgstr "Type de bus d'affichage non supporté"
msgid "Unsupported format"
msgstr "Format non supporté"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "Opération non supportée"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr "Mise-à-jour échouée"
@ -4755,6 +4763,9 @@ msgstr "zi doit être de type float"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi doit être de forme (n_section, 2)"
#~ msgid "Unsupported operation"
#~ msgstr "Opération non supportée"
#~ msgid "divisor must be 4"
#~ msgstr "le diviseur doit être 4"

View File

@ -107,6 +107,10 @@ msgstr ""
msgid "%q must be %d-%d"
msgstr ""
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr ""
@ -1749,6 +1753,10 @@ msgstr ""
msgid "No space left on device"
msgstr ""
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr ""
@ -1856,6 +1864,10 @@ msgstr ""
msgid "Only one color can be transparent at a time"
msgstr ""
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2521,10 +2533,6 @@ msgstr ""
msgid "Unsupported format"
msgstr ""
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr ""
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr ""

View File

@ -114,6 +114,10 @@ msgstr ""
msgid "%q must be %d-%d"
msgstr ""
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr ""
@ -1773,6 +1777,10 @@ msgstr ""
msgid "No space left on device"
msgstr "Non che spazio sul dispositivo"
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "Nessun file/directory esistente"
@ -1884,6 +1892,10 @@ msgstr ""
msgid "Only one color can be transparent at a time"
msgstr ""
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2560,10 +2572,6 @@ msgstr "tipo di bitmap non supportato"
msgid "Unsupported format"
msgstr "Formato non supportato"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "Operazione non supportata"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr ""
@ -4707,6 +4715,9 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)"
msgstr ""
#~ msgid "Unsupported operation"
#~ msgstr "Operazione non supportata"
#~ msgid ""
#~ "\n"
#~ "Code stopped by auto-reload.\n"

View File

@ -112,6 +112,10 @@ msgstr ""
msgid "%q must be %d-%d"
msgstr ""
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr ""
@ -1760,6 +1764,10 @@ msgstr "ピンにプルダウンがありません。1Mオーム推奨"
msgid "No space left on device"
msgstr "デバイスに空き容量が残っていません"
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "指定されたファイル/ディレクトリはありません"
@ -1869,6 +1877,10 @@ msgstr ""
msgid "Only one color can be transparent at a time"
msgstr ""
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2536,10 +2548,6 @@ msgstr ""
msgid "Unsupported format"
msgstr "非対応の形式"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "非対応の操作"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr ""
@ -4663,6 +4671,9 @@ msgstr "ziはfloat値でなければなりません"
msgid "zi must be of shape (n_section, 2)"
msgstr ""
#~ msgid "Unsupported operation"
#~ msgstr "非対応の操作"
#~ msgid "Brightness must be between 0 and 255"
#~ msgstr "Brightnessは0から255の間でなければなりません"

View File

@ -108,6 +108,10 @@ msgstr ""
msgid "%q must be %d-%d"
msgstr ""
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr ""
@ -1752,6 +1756,10 @@ msgstr ""
msgid "No space left on device"
msgstr ""
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr ""
@ -1859,6 +1867,10 @@ msgstr ""
msgid "Only one color can be transparent at a time"
msgstr ""
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2525,10 +2537,6 @@ msgstr ""
msgid "Unsupported format"
msgstr ""
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr ""
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr ""

View File

@ -110,6 +110,10 @@ msgstr ""
msgid "%q must be %d-%d"
msgstr ""
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr ""
@ -1761,6 +1765,10 @@ msgstr "Geen pulldown op pin; 1MOhm aangeraden"
msgid "No space left on device"
msgstr "Geen ruimte meer beschikbaar op apparaat"
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "Bestand/map bestaat niet"
@ -1874,6 +1882,10 @@ msgstr "Slechts één alarm.time alarm kan worden ingesteld."
msgid "Only one color can be transparent at a time"
msgstr "Er kan maar één kleur per keer transparant zijn"
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2549,10 +2561,6 @@ msgstr "Niet-ondersteund beeldscherm bus type"
msgid "Unsupported format"
msgstr "Niet-ondersteunde format"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "Niet-ondersteunde operatie"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr "Update Mislukt"
@ -4683,6 +4691,9 @@ msgstr "zi moet van type float zijn"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi moet vorm (n_section, 2) hebben"
#~ msgid "Unsupported operation"
#~ msgstr "Niet-ondersteunde operatie"
#~ msgid "Brightness must be between 0 and 255"
#~ msgstr "Helderheid moet tussen de 0 en 255 liggen"

View File

@ -112,6 +112,10 @@ msgstr ""
msgid "%q must be %d-%d"
msgstr ""
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr ""
@ -1760,6 +1764,10 @@ msgstr ""
msgid "No space left on device"
msgstr "Brak miejsca"
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "Brak pliku/katalogu"
@ -1867,6 +1875,10 @@ msgstr ""
msgid "Only one color can be transparent at a time"
msgstr "W danym momencie przezroczysty może być tylko jeden kolor"
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2532,10 +2544,6 @@ msgstr "Zły typ magistrali wyświetlaczy"
msgid "Unsupported format"
msgstr "Zły format"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "Zła operacja"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr ""
@ -4654,6 +4662,9 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)"
msgstr ""
#~ msgid "Unsupported operation"
#~ msgstr "Zła operacja"
#~ msgid "Brightness must be between 0 and 255"
#~ msgstr "Jasność musi być pomiędzy 0 a 255"

View File

@ -6,7 +6,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-04 12:55-0600\n"
"PO-Revision-Date: 2022-05-08 16:37+0000\n"
"PO-Revision-Date: 2022-05-14 12:35+0000\n"
"Last-Translator: Wellington Terumi Uemura <wellingtonuemura@gmail.com>\n"
"Language-Team: \n"
"Language: pt_BR\n"
@ -14,7 +14,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.12.1\n"
"X-Generator: Weblate 4.13-dev\n"
#: main.c
msgid ""
@ -116,6 +116,10 @@ msgstr "o comprimento %q deve ser >=1"
msgid "%q must be %d-%d"
msgstr "o %q deve ser %d-%d"
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr "%q deve ser 1 quando %q for verdadeiro"
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr "%q deve ser <= %d"
@ -1790,6 +1794,10 @@ msgstr "Não há pulldown no pino; É recomendável utilizar um resistor de 1M o
msgid "No space left on device"
msgstr "Não resta espaço no dispositivo"
#: py/moduerrno.c
msgid "No such device"
msgstr "Não existe tal dispositivo"
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "Este arquivo/diretório não existe"
@ -1902,6 +1910,10 @@ msgstr "Apenas um alarme alarm.time pode ser definido."
msgid "Only one color can be transparent at a time"
msgstr "Apenas uma cor pode ser transparente de cada vez"
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr "A operação não é permitida"
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr "A operação ou o recurso não é suportado"
@ -2596,10 +2608,6 @@ msgstr "Não há suporte para o tipo do display bus"
msgid "Unsupported format"
msgstr "Formato não suportado"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "Operação não suportada"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr "A atualização falou"
@ -4748,6 +4756,9 @@ msgstr "zi deve ser de um tipo float"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi deve estar na forma (n_section, 2)"
#~ msgid "Unsupported operation"
#~ msgstr "Operação não suportada"
#~ msgid "divisor must be 4"
#~ msgstr "o divisor deve ser 4"

View File

@ -115,6 +115,10 @@ msgstr "Длинна %q должна быть >= 1"
msgid "%q must be %d-%d"
msgstr "%q должен быть %d-%d"
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr "%q должен быть <= %d"
@ -1787,6 +1791,10 @@ msgstr "Отсутствует подтяжка к земле на пине; Р
msgid "No space left on device"
msgstr "На устройстве не осталось свободного места"
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "Файл/директория не существует"
@ -1898,6 +1906,10 @@ msgstr ""
msgid "Only one color can be transparent at a time"
msgstr ""
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2570,10 +2582,6 @@ msgstr ""
msgid "Unsupported format"
msgstr ""
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr ""
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr ""

View File

@ -6,7 +6,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-04 12:55-0600\n"
"PO-Revision-Date: 2022-04-26 15:40+0000\n"
"PO-Revision-Date: 2022-05-14 12:35+0000\n"
"Last-Translator: Jonny Bergdahl <jonny@bergdahl.it>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: sv\n"
@ -14,7 +14,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.12.1-dev\n"
"X-Generator: Weblate 4.13-dev\n"
#: main.c
msgid ""
@ -115,6 +115,10 @@ msgstr "längden på %q måste vara >= 1"
msgid "%q must be %d-%d"
msgstr "%q måste vara %d-%d"
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr "%q måste vara 1 när %q är sann"
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr "%q måste vara <= %d"
@ -1564,7 +1568,7 @@ msgstr "Datastorlek matchar inte"
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
msgid "Mismatched swap flag"
msgstr ""
msgstr "Felaktig swapflagga"
#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/stm/common-hal/busio/SPI.c
msgid "Missing MISO or MOSI Pin"
@ -1771,6 +1775,10 @@ msgstr "Ingen pulldown på pinnen; 1Mohm rekommenderas"
msgid "No space left on device"
msgstr "Inget utrymme kvar på enheten"
#: py/moduerrno.c
msgid "No such device"
msgstr "Ingen sådan enhet"
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "Ingen sådan fil/katalog"
@ -1883,6 +1891,10 @@ msgstr "Endast ett alarm.time kan ställas in."
msgid "Only one color can be transparent at a time"
msgstr "Bara en färg kan vara genomskinlig i taget"
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr "Åtgärden inte tillåten"
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr "Operation eller funktion stöds inte"
@ -2567,10 +2579,6 @@ msgstr "Busstyp för display stöds inte"
msgid "Unsupported format"
msgstr "Formatet stöds inte"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "Åtgärd som inte stöds"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr "Uppdateringen misslyckades"
@ -4705,6 +4713,9 @@ msgstr "zi måste vara av typ float"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi måste vara i formen (n_section, 2)"
#~ msgid "Unsupported operation"
#~ msgstr "Åtgärd som inte stöds"
#~ msgid "divisor must be 4"
#~ msgstr "divisor måste vara 4"

View File

@ -119,6 +119,10 @@ msgstr "%q boyutu >=1 olmalıdır"
msgid "%q must be %d-%d"
msgstr "%q, %d-%d olmalıdır"
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr "%q <= %d olmalıdır"
@ -1766,6 +1770,10 @@ msgstr ""
msgid "No space left on device"
msgstr ""
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr ""
@ -1873,6 +1881,10 @@ msgstr ""
msgid "Only one color can be transparent at a time"
msgstr ""
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr ""
@ -2541,10 +2553,6 @@ msgstr ""
msgid "Unsupported format"
msgstr ""
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr ""
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr ""

View File

@ -118,6 +118,10 @@ msgstr "%q cháng dù bì xū >= 1"
msgid "%q must be %d-%d"
msgstr "%q bì xū wéi %d-%d"
#: shared-bindings/displayio/Display.c
msgid "%q must be 1 when %q is True"
msgstr ""
#: py/argcheck.c shared-bindings/gifio/GifWriter.c
msgid "%q must be <= %d"
msgstr "%q bì xū <= %d"
@ -1784,6 +1788,10 @@ msgstr "Yǐn jiǎo shàng méiyǒu xiàlā; 1Mohm tuījiàn"
msgid "No space left on device"
msgstr "Shèbèi shàng méiyǒu kònggé"
#: py/moduerrno.c
msgid "No such device"
msgstr ""
#: py/moduerrno.c
msgid "No such file/directory"
msgstr "Méiyǒu cǐ lèi wénjiàn/mùlù"
@ -1896,6 +1904,10 @@ msgstr "zhǐ néng shè zhì yí gè bào jǐng."
msgid "Only one color can be transparent at a time"
msgstr "Yīcì zhǐ néng yǒuyī zhǒng yánsè shì tòumíng de"
#: py/moduerrno.c
msgid "Operation not permitted"
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "Operation or feature not supported"
msgstr "bù zhī chí cāo zuò huò gōng néng"
@ -2578,10 +2590,6 @@ msgstr "Bù zhīchí de gōnggòng qìchē lèixíng"
msgid "Unsupported format"
msgstr "Bù zhīchí de géshì"
#: py/moduerrno.c
msgid "Unsupported operation"
msgstr "Bù zhīchí de cāozuò"
#: ports/espressif/common-hal/dualbank/__init__.c
msgid "Update Failed"
msgstr "gēng xīn shī bài"
@ -4717,6 +4725,9 @@ msgstr "zi bìxū wèi fú diǎn xíng"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi bìxū jùyǒu xíngzhuàng (n_section,2)"
#~ msgid "Unsupported operation"
#~ msgstr "Bù zhīchí de cāozuò"
#~ msgid "divisor must be 4"
#~ msgstr "èr chóng zòu bì xū shì 4"

21
main.c
View File

@ -277,10 +277,10 @@ STATIC void cleanup_after_vm(supervisor_allocation *heap, mp_obj_t exception) {
memorymonitor_reset();
#endif
filesystem_flush();
stop_mp();
free_memory(heap);
supervisor_move_memory();
// Disable user related BLE state that uses the micropython heap.
#if CIRCUITPY_BLEIO
bleio_user_reset();
#endif
#if CIRCUITPY_CANIO
common_hal_canio_reset();
@ -297,6 +297,12 @@ STATIC void cleanup_after_vm(supervisor_allocation *heap, mp_obj_t exception) {
#endif
reset_port();
reset_board();
// Free the heap last because other modules may reference heap memory and need to shut down.
filesystem_flush();
stop_mp();
free_memory(heap);
supervisor_move_memory();
}
STATIC void print_code_py_status_message(safe_mode_t safe_mode) {
@ -645,6 +651,12 @@ STATIC bool run_code_py(safe_mode_t safe_mode, bool first_run, bool *simulate_re
// Done waiting, start the board back up.
// We delay resetting BLE until after the wait in case we're transferring
// more files over.
#if CIRCUITPY_BLEIO
bleio_reset();
#endif
// free code allocation if unused
if ((next_code_options & next_code_stickiness_situation) == 0) {
free_memory(next_code_allocation);
@ -888,6 +900,7 @@ int __attribute__((used)) main(void) {
serial_init();
#if CIRCUITPY_BLEIO
bleio_reset();
supervisor_bluetooth_enable_workflow();
supervisor_start_bluetooth();
#endif

View File

@ -12,6 +12,7 @@ EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C"
# Turn off features and optimizations for displayio build to make room for additional frozen libs.
LONGINT_IMPL = NONE
CIRCUITPY_KEYPAD = 0
CIRCUITPY_ONEWIREIO = 0
CIRCUITPY_PIXELBUF = 0
CIRCUITPY_ROTARYIO = 0
CIRCUITPY_RTC = 0

View File

@ -0,0 +1,104 @@
/*
* 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 "supervisor/board.h"
#include "shared-bindings/board/__init__.h"
#include "shared-bindings/displayio/FourWire.h"
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
#include "shared-bindings/busio/SPI.h"
displayio_fourwire_obj_t board_display_obj;
#define DELAY 0x80
uint8_t display_init_sequence[] = {
0xe2, 0, // reset
0x2f, 0, // power on
0x80, 0, // contrast 0
0xa4, 0, // display normal
0xaf, 0, // display on
0x40, 0, // start line 0
};
void board_init(void) {
busio_spi_obj_t *spi = &displays[0].fourwire_bus.inline_bus;
common_hal_busio_spi_construct(spi, &pin_PA23, &pin_PA22, NULL, false);
common_hal_busio_spi_never_reset(spi);
displayio_fourwire_obj_t *bus = &displays[0].fourwire_bus;
bus->base.type = &displayio_fourwire_type;
common_hal_displayio_fourwire_construct(bus,
spi,
NULL, // Command or data
&pin_PA19, // Chip select
&pin_PA18, // Reset
40000000LL, // Baudrate
0, // Polarity
0); // Phase
displayio_display_obj_t *display = &displays[0].display;
display->base.type = &displayio_display_type;
common_hal_displayio_display_construct(display,
bus,
96, // Width
68, // Height
0, // column start
0, // row start
180, // rotation
1, // Color depth
true, // 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
false, // reverse_pixels_in_word
0, // Set column command
0, // Set row command
0, // Write memory command
display_init_sequence,
sizeof(display_init_sequence),
NULL, // &pin_PA17, // brightness pin
NO_BRIGHTNESS_COMMAND,
0.0f, // brightness
false, // auto_brightness
false, // single_byte_bounds
true, // data as commands
true, // auto_refresh
2, // native_frames_per_second
true, // backlight_on_high
true); // SH1107_addressing
}
bool board_requests_safe_mode(void) {
return false;
}
void reset_board(void) {
}
void board_deinit(void) {
}

View File

@ -0,0 +1,16 @@
#define MICROPY_HW_BOARD_NAME "PewPew LCD"
#define MICROPY_HW_MCU_NAME "samd21e18"
#define MICROPY_PORT_A (0)
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
#define CIRCUITPY_INTERNAL_NVM_SIZE 0
#define CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE (48 * 1024)
// USB is always used internally so skip the pin objects for it.
#define IGNORE_PIN_PA24 1
#define IGNORE_PIN_PA25 1
#define SAMD21_BOD33_LEVEL (6)
#define CIRCUITPY_REPL_LOGO (0)

View File

@ -0,0 +1,57 @@
USB_VID = 0x1209
USB_PID = 0xD1B5
USB_PRODUCT = "PewPew LCD"
USB_MANUFACTURER = "Radomir Dopieralski"
CHIP_VARIANT = SAMD21E18A
CHIP_FAMILY = samd21
INTERNAL_FLASH_FILESYSTEM = 1
LONGINT_IMPL = NONE
CIRCUITPY_FULL_BUILD = 0
CIRCUITPY_DISPLAYIO = 1
CIRCUITPY_TOUCHIO = 1
CIRCUITPY_PWMIO = 1
CIRCUITPY_MATH = 0
CIRCUITPY_ANALOGIO = 0
CIRCUITPY_AUDIOBUSIO = 0
CIRCUITPY_AUDIOBUSIO_I2SOUT = 0
CIRCUITPY_AUDIOCORE = 0
CIRCUITPY_AUDIOIO = 0
CIRCUITPY_AUDIOMIXER = 0
CIRCUITPY_AUDIOMP3 = 0
CIRCUITPY_AUDIOPWMIO = 0
CIRCUITPY_BITBANG_APA102 = 0
CIRCUITPY_BITBANGIO = 0
CIRCUITPY_BITBANGIO = 0
CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_BLEIO = 0
CIRCUITPY_BUSDEVICE = 0
CIRCUITPY_FRAMEBUFFERIO = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_MSGPACK = 0
CIRCUITPY_NEOPIXEL_WRITE = 0
CIRCUITPY_NVM = 0
CIRCUITPY_PIXELBUF = 0
CIRCUITPY_PS2IO = 0
CIRCUITPY_PULSEIO = 0
CIRCUITPY_RGBMATRIX = 0
CIRCUITPY_ROTARYIO = 0
CIRCUITPY_ROTARYIO = 0
CIRCUITPY_RTC = 0
CIRCUITPY_SAMD = 0
CIRCUITPY_ULAB = 0
CIRCUITPY_USB_HID = 0
CIRCUITPY_USB_MIDI = 0
CIRCUITPY_USB_VENDOR = 0
CIRCUITPY_VECTORIO = 0
CIRCUITPY_RAINBOWIO = 0
CIRCUITPY_DISPLAY_FONT = $(TOP)/ports/atmel-samd/boards/ugame10/brutalist-6.bdf
OPTIMIZATION_FLAGS = -Os
FROZEN_MPY_DIRS += $(TOP)/frozen/pew-pewpew-lcd

View File

@ -0,0 +1,28 @@
#include "shared-bindings/board/__init__.h"
#include "shared-module/displayio/__init__.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR__SCK), MP_ROM_PTR(&pin_PA23) },
{ MP_ROM_QSTR(MP_QSTR__MOSI), MP_ROM_PTR(&pin_PA22) },
{ MP_ROM_QSTR(MP_QSTR__CS), MP_ROM_PTR(&pin_PA19) },
{ MP_ROM_QSTR(MP_QSTR__RST), MP_ROM_PTR(&pin_PA18) },
{ MP_ROM_QSTR(MP_QSTR__BL), MP_ROM_PTR(&pin_PA17) },
{ MP_ROM_QSTR(MP_QSTR__UP), MP_ROM_PTR(&pin_PA03) },
{ MP_ROM_QSTR(MP_QSTR__DOWN), MP_ROM_PTR(&pin_PA05) },
{ MP_ROM_QSTR(MP_QSTR__LEFT), MP_ROM_PTR(&pin_PA04) },
{ MP_ROM_QSTR(MP_QSTR__RIGHT), MP_ROM_PTR(&pin_PA02) },
{ MP_ROM_QSTR(MP_QSTR__O), MP_ROM_PTR(&pin_PA06) },
{ MP_ROM_QSTR(MP_QSTR__X), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_P1), MP_ROM_PTR(&pin_PA30) },
{ MP_ROM_QSTR(MP_QSTR_P2), MP_ROM_PTR(&pin_PA31) },
{ MP_ROM_QSTR(MP_QSTR_P3), MP_ROM_PTR(&pin_PA08) },
{ MP_ROM_QSTR(MP_QSTR_P4), MP_ROM_PTR(&pin_PA09) },
{ MP_ROM_QSTR(MP_QSTR_P5), MP_ROM_PTR(&pin_PA10) },
{ MP_ROM_QSTR(MP_QSTR_P6), MP_ROM_PTR(&pin_PA11) },
{ MP_ROM_QSTR(MP_QSTR_P7), MP_ROM_PTR(&pin_PA14) },
{ MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)}
};
MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table);

View File

@ -37,7 +37,7 @@
{.scl = &pin_GPIO40, .sda = &pin_GPIO41}}
#define CIRCUITPY_BOARD_SPI (1)
#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO35, .mosi = &pin_GPIO34, .miso = &pin_GPIO36}}
#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO36, .mosi = &pin_GPIO35, .miso = &pin_GPIO37}}
#define CIRCUITPY_BOARD_UART (1)
#define CIRCUITPY_BOARD_UART_PIN {{.tx = &pin_GPIO5, .rx = &pin_GPIO16}}

View File

@ -36,15 +36,15 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_GPIO16) },
{ MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_GPIO16) },
{ MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO34) },
{ MP_ROM_QSTR(MP_QSTR_D34), MP_ROM_PTR(&pin_GPIO34) },
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO35) },
{ MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO35) },
{ MP_ROM_QSTR(MP_QSTR_D35), MP_ROM_PTR(&pin_GPIO35) },
{ MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO36) },
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO36) },
{ MP_ROM_QSTR(MP_QSTR_D36), MP_ROM_PTR(&pin_GPIO36) },
{ MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO37) },
{ MP_ROM_QSTR(MP_QSTR_D37), MP_ROM_PTR(&pin_GPIO37) },
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL_POWER), MP_ROM_PTR(&pin_GPIO38) },
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO39) },

View File

@ -0,0 +1,49 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2022 Wai Weng for Cytron Technologies
*
* 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 "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
#include "components/driver/include/driver/gpio.h"
#include "components/hal/include/hal/gpio_hal.h"
#include "common-hal/microcontroller/Pin.h"
void board_init(void) {
reset_board();
}
bool board_requests_safe_mode(void) {
return false;
}
void reset_board(void) {
// Turn on VP by default.
gpio_set_direction(38, GPIO_MODE_DEF_OUTPUT);
gpio_set_level(38, true);
}
void board_deinit(void) {
}

View File

@ -0,0 +1,45 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2019 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.
*/
// Micropython setup
#define MICROPY_HW_BOARD_NAME "Cytron Maker Feather AIoT S3"
#define MICROPY_HW_MCU_NAME "ESP32S3"
#define MICROPY_HW_NEOPIXEL (&pin_GPIO46)
#define CIRCUITPY_STATUS_LED_POWER (&pin_GPIO13)
#define DEFAULT_I2C_BUS_SCL (&pin_GPIO41)
#define DEFAULT_I2C_BUS_SDA (&pin_GPIO42)
#define DEFAULT_SPI_BUS_SCK (&pin_GPIO6)
#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO10)
#define DEFAULT_SPI_BUS_MISO (&pin_GPIO5)
#define DEFAULT_UART_BUS_RX (&pin_GPIO11)
#define DEFAULT_UART_BUS_TX (&pin_GPIO4)
#define DOUBLE_TAP_PIN (&pin_GPIO17)

View File

@ -0,0 +1,20 @@
USB_VID = 0x303A
USB_PID = 0x80F9
USB_PRODUCT = "Cytron Maker Feather AIoT S3"
USB_MANUFACTURER = "Cytron"
IDF_TARGET = esp32s3
INTERNAL_FLASH_FILESYSTEM = 1
LONGINT_IMPL = MPZ
# The default queue depth of 16 overflows on release builds,
# so increase it to 32.
CFLAGS += -DCFG_TUD_TASK_QUEUE_SZ=32
CIRCUITPY_ESP_FLASH_MODE=dio
CIRCUITPY_ESP_FLASH_FREQ=80m
CIRCUITPY_ESP_FLASH_SIZE=8MB
# Include these Python libraries in firmware.
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel

View File

@ -0,0 +1,90 @@
#include "shared-bindings/board/__init__.h"
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS
{ MP_ROM_QSTR(MP_QSTR_BOOT0), MP_ROM_PTR(&pin_GPIO0) },
{ MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO0) },
{ MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO2) },
{ MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO2) },
{ MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO3) },
{ MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_GPIO3) },
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO4) },
{ MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO4) },
{ MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO5) },
{ MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) },
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO6) },
{ MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) },
{ MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO7) },
{ MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO7) },
{ MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO8) },
{ MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO8) },
{ MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO9) },
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) },
{ MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO10) },
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) },
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO11) },
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11) },
{ MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO12) },
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO12) },
{ MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO13) },
{ MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO13) },
{ MP_ROM_QSTR(MP_QSTR_L), MP_ROM_PTR(&pin_GPIO13) },
{ MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO14) },
{ MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO14) },
{ MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO15) },
{ MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_GPIO16) },
{ MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_GPIO17) },
{ MP_ROM_QSTR(MP_QSTR_VIN), MP_ROM_PTR(&pin_GPIO18) },
{ MP_ROM_QSTR(MP_QSTR_VBATT), MP_ROM_PTR(&pin_GPIO18) },
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO18) },
{ MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_GPIO18) },
{ MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO21) },
{ MP_ROM_QSTR(MP_QSTR_D33), MP_ROM_PTR(&pin_GPIO33) },
{ MP_ROM_QSTR(MP_QSTR_D34), MP_ROM_PTR(&pin_GPIO34) },
{ MP_ROM_QSTR(MP_QSTR_D35), MP_ROM_PTR(&pin_GPIO35) },
{ MP_ROM_QSTR(MP_QSTR_D36), MP_ROM_PTR(&pin_GPIO36) },
{ MP_ROM_QSTR(MP_QSTR_D37), MP_ROM_PTR(&pin_GPIO37) },
{ MP_ROM_QSTR(MP_QSTR_VP_EN), MP_ROM_PTR(&pin_GPIO38) },
{ MP_ROM_QSTR(MP_QSTR_D38), MP_ROM_PTR(&pin_GPIO38) },
{ MP_ROM_QSTR(MP_QSTR_BUZZER), MP_ROM_PTR(&pin_GPIO39) },
{ MP_ROM_QSTR(MP_QSTR_D39), MP_ROM_PTR(&pin_GPIO39) },
{ MP_ROM_QSTR(MP_QSTR_D40), MP_ROM_PTR(&pin_GPIO40) },
{ MP_ROM_QSTR(MP_QSTR_D41), MP_ROM_PTR(&pin_GPIO41) },
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO41) },
{ MP_ROM_QSTR(MP_QSTR_D42), MP_ROM_PTR(&pin_GPIO42) },
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO42) },
{ MP_ROM_QSTR(MP_QSTR_D45), MP_ROM_PTR(&pin_GPIO45) },
{ MP_ROM_QSTR(MP_QSTR_RGB), MP_ROM_PTR(&pin_GPIO46) },
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO46) },
{ MP_ROM_QSTR(MP_QSTR_D46), MP_ROM_PTR(&pin_GPIO46) },
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
{ MP_ROM_QSTR(MP_QSTR_STEMMA_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_module_globals_table);

View File

@ -0,0 +1,34 @@
CONFIG_ESP32S3_SPIRAM_SUPPORT=y
#
# SPI RAM config
#
# CONFIG_SPIRAM_MODE_QUAD is not set
CONFIG_SPIRAM_MODE_OCT=y
# CONFIG_SPIRAM_TYPE_AUTO is not set
CONFIG_SPIRAM_TYPE_ESPPSRAM64=y
CONFIG_SPIRAM_SIZE=8388608
# end of SPI RAM config
CONFIG_DEFAULT_PSRAM_CLK_IO=30
#
# PSRAM Clock and CS IO for ESP32S3
#
CONFIG_DEFAULT_PSRAM_CS_IO=26
# end of PSRAM Clock and CS IO for ESP32S3
# CONFIG_SPIRAM_FETCH_INSTRUCTIONS is not set
# CONFIG_SPIRAM_RODATA is not set
CONFIG_SPIRAM_SPEED_80M=y
# CONFIG_SPIRAM_SPEED_40M is not set
CONFIG_SPIRAM=y
CONFIG_SPIRAM_BOOT_INIT=y
# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set
CONFIG_SPIRAM_USE_MEMMAP=y
# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set
# CONFIG_SPIRAM_USE_MALLOC is not set
CONFIG_SPIRAM_MEMTEST=y
#
# LWIP
#
CONFIG_LWIP_LOCAL_HOSTNAME="espressif-esp32s3"
# end of LWIP

View File

@ -0,0 +1,17 @@
#include "shared-bindings/microcontroller/Pin.h"
#include "supervisor/board.h"
#include "components/driver/include/driver/gpio.h"
void board_init(void) {
}
bool board_requests_safe_mode(void) {
return false;
}
void reset_board(void) {
}
void board_deinit(void) {
}

View File

@ -0,0 +1,13 @@
// Define board
#define MICROPY_HW_BOARD_NAME "LILYGO TTGO T-OI PLUS"
#define MICROPY_HW_MCU_NAME "ESP32-C3"
#define MICROPY_HW_LED_STATUS (&pin_GPIO3)
// I2C
#define CIRCUITPY_BOARD_I2C (1)
#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO18, .sda = &pin_GPIO19}}
// UART
#define CIRCUITPY_BOARD_UART (1)
#define CIRCUITPY_BOARD_UART_PIN {{.tx = &pin_GPIO21, .rx = &pin_GPIO20}}

View File

@ -0,0 +1,10 @@
CIRCUITPY_CREATOR_ID = 0xC3C30000
CIRCUITPY_CREATION_ID = 0x00C30002
IDF_TARGET = esp32c3
INTERNAL_FLASH_FILESYSTEM = 1
CIRCUITPY_ESP_FLASH_MODE = dio
CIRCUITPY_ESP_FLASH_FREQ = 80m
CIRCUITPY_ESP_FLASH_SIZE = 4MB

View File

@ -0,0 +1,29 @@
#include "shared-bindings/board/__init__.h"
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS
{ MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_GPIO2) },
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO2) },
{ MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) },
{ MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) },
{ MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9) },
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO20) },
{ MP_ROM_QSTR(MP_QSTR_IO20), MP_ROM_PTR(&pin_GPIO20) },
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO21) },
{ MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21) },
{ MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO3) },
{ MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) },
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO19) },
{ MP_ROM_QSTR(MP_QSTR_IO19), MP_ROM_PTR(&pin_GPIO19) },
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO18) },
{ MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) },
{ MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) },
{ MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) },
{ MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) },
{ MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) },
{ MP_ROM_QSTR(MP_QSTR_IO10), MP_ROM_PTR(&pin_GPIO10) },
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
{ MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) },
};
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);

View File

@ -0,0 +1,5 @@
#
# LWIP
#
CONFIG_LWIP_LOCAL_HOSTNAME="LILYGO TTGO T-OI PLUS"
# end of LWIP

View File

@ -574,6 +574,9 @@ void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool
}
void common_hal_bleio_adapter_stop_advertising(bleio_adapter_obj_t *self) {
if (!common_hal_bleio_adapter_get_advertising(self)) {
return;
}
int err_code = ble_gap_ext_adv_stop(0);
self->user_advertising = false;

View File

@ -42,6 +42,17 @@
// #include "common-hal/_bleio/bonding.h"
#include "common-hal/_bleio/ble_events.h"
void bleio_user_reset() {
// Stop any user scanning or advertising.
common_hal_bleio_adapter_stop_scan(&common_hal_bleio_adapter_obj);
common_hal_bleio_adapter_stop_advertising(&common_hal_bleio_adapter_obj);
ble_event_remove_heap_handlers();
// Maybe start advertising the BLE workflow.
supervisor_bluetooth_background();
}
// Turn off BLE on a reset or reload.
void bleio_reset() {
// Set this explicitly to save data.

View File

@ -31,6 +31,7 @@
#include <stdbool.h>
#include <stdio.h>
#include "py/gc.h"
#include "py/misc.h"
#include "py/mpstate.h"
#include "py/runtime.h"
@ -44,6 +45,17 @@ void ble_event_reset(void) {
MP_STATE_VM(ble_event_handler_entries) = NULL;
}
void ble_event_remove_heap_handlers(void) {
ble_event_handler_entry_t *it = MP_STATE_VM(ble_event_handler_entries);
while (it != NULL) {
// If the param is on the heap, then delete the handler.
if (HEAP_PTR(it->param)) {
ble_event_remove_handler(it->func, it->param);
}
it = it->next;
}
}
void ble_event_add_handler_entry(ble_event_handler_entry_t *entry,
ble_gap_event_fn *func, void *param) {
ble_event_handler_entry_t *it = MP_STATE_VM(ble_event_handler_entries);

View File

@ -40,6 +40,7 @@ typedef struct ble_event_handler_entry {
} ble_event_handler_entry_t;
void ble_event_reset(void);
void ble_event_remove_heap_handlers(void);
void ble_event_add_handler(ble_gap_event_fn *func, void *param);
void ble_event_remove_handler(ble_gap_event_fn *func, void *param);

View File

@ -283,10 +283,6 @@ void reset_port(void) {
watchdog_reset();
#endif
#if CIRCUITPY_BLEIO
bleio_reset();
#endif
#if CIRCUITPY_WIFI
wifi_reset();
#endif

View File

@ -35,6 +35,7 @@
#include "nrf_sdm.h"
#include "nrf_soc.h"
#include "nrfx_power.h"
#include "py/gc.h"
#include "py/misc.h"
#include "py/mpstate.h"
@ -56,6 +57,17 @@ void ble_drv_reset() {
sd_flash_operation_status = SD_FLASH_OPERATION_DONE;
}
void ble_drv_remove_heap_handlers(void) {
ble_drv_evt_handler_entry_t *it = MP_STATE_VM(ble_drv_evt_handler_entries);
while (it != NULL) {
// If the param is on the heap, then delete the handler.
if (HEAP_PTR(it->param)) {
ble_drv_remove_event_handler(it->func, it->param);
}
it = it->next;
}
}
void ble_drv_add_event_handler_entry(ble_drv_evt_handler_entry_t *entry, ble_drv_evt_handler_t func, void *param) {
ble_drv_evt_handler_entry_t *it = MP_STATE_VM(ble_drv_evt_handler_entries);
while (it != NULL) {

View File

@ -67,6 +67,7 @@ typedef struct ble_drv_evt_handler_entry {
} ble_drv_evt_handler_entry_t;
void ble_drv_reset(void);
void ble_drv_remove_heap_handlers(void);
void ble_drv_add_event_handler(ble_drv_evt_handler_t func, void *param);
void ble_drv_remove_event_handler(ble_drv_evt_handler_t func, void *param);

View File

@ -380,9 +380,11 @@ mp_int_t common_hal_bleio_packet_buffer_write(bleio_packet_buffer_obj_t *self, c
!mp_hal_is_interrupted()) {
RUN_BACKGROUND_TASKS;
}
if (mp_hal_is_interrupted()) {
return -1;
}
}
if (self->conn_handle == BLE_CONN_HANDLE_INVALID ||
mp_hal_is_interrupted()) {
if (self->conn_handle == BLE_CONN_HANDLE_INVALID) {
return -1;
}

View File

@ -94,6 +94,17 @@ void check_sec_status(uint8_t sec_status) {
}
}
void bleio_user_reset() {
// Stop any user scanning or advertising.
common_hal_bleio_adapter_stop_scan(&common_hal_bleio_adapter_obj);
common_hal_bleio_adapter_stop_advertising(&common_hal_bleio_adapter_obj);
ble_drv_remove_heap_handlers();
// Maybe start advertising the BLE workflow.
supervisor_bluetooth_background();
}
// Turn off BLE on a reset or reload.
void bleio_reset() {
// Set this explicitly to save data.

View File

@ -246,10 +246,6 @@ void reset_port(void) {
timers_reset();
#if CIRCUITPY_BLEIO
bleio_reset();
#endif
#if CIRCUITPY_WATCHDOG
watchdog_reset();
#endif

View File

@ -30,7 +30,14 @@
#include "bindings/rp2pio/StateMachine.h"
#include "bindings/rp2pio/__init__.h"
//| """Hardware interface to RP2 series' programmable IO (PIO) peripheral."""
//| """Hardware interface to RP2 series' programmable IO (PIO) peripheral.
//|
//| .. note:: This module is intended to be used with the `adafruit_pioasm library
//| <https://github.com/adafruit/Adafruit_CircuitPython_PIOASM>`_. For an
//| introduction and guide to working with PIO in CircuitPython, see `this
//| Learn guide <https://learn.adafruit.com/intro-to-rp2040-pio-with-circuitpython>`_.
//|
//| """
//|
//| def pins_are_sequential(pins: List[microcontroller.Pin]) -> bool:

View File

@ -0,0 +1,45 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2021 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 "supervisor/board.h"
#include "shared-bindings/microcontroller/Pin.h"
#include "src/rp2_common/hardware_gpio/include/hardware/gpio.h"
#include "supervisor/shared/board.h"
void board_init(void) {
}
bool board_requests_safe_mode(void) {
return false;
}
void reset_board(void) {
// turn off any left over LED
board_reset_user_neopixels(&pin_GPIO25, 62);
}
void board_deinit(void) {
}

View File

@ -0,0 +1,4 @@
#define MICROPY_HW_BOARD_NAME "RP2.65-F"
#define MICROPY_HW_MCU_NAME "rp2040"
#define MICROPY_HW_NEOPIXEL (&pin_GPIO25)

View File

@ -0,0 +1,17 @@
# pid.codes ZR
USB_VID = 0x1209
USB_PID = 0x5a52
USB_PRODUCT = "RP2.65-F"
USB_MANUFACTURER = "ZRichard"
CHIP_VARIANT = RP2040
CHIP_FAMILY = rp2
EXTERNAL_FLASH_DEVICES = "W25Q64JVxQ,W25Q128JVxQ"
CIRCUITPY__EVE = 1
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_MIDI

View File

@ -0,0 +1,4 @@
// Put board-specific pico-sdk definitions here. This file must exist.
// Allow extra time for xosc to start.
#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64

View File

@ -0,0 +1,32 @@
#include "shared-bindings/board/__init__.h"
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS
{ MP_ROM_QSTR(MP_QSTR_ROW0), MP_ROM_PTR(&pin_GPIO0) },
{ MP_ROM_QSTR(MP_QSTR_COL0), MP_ROM_PTR(&pin_GPIO1) },
{ MP_ROM_QSTR(MP_QSTR_ROW1), MP_ROM_PTR(&pin_GPIO2) },
{ MP_ROM_QSTR(MP_QSTR_COL1), MP_ROM_PTR(&pin_GPIO3) },
{ MP_ROM_QSTR(MP_QSTR_ROW2), MP_ROM_PTR(&pin_GPIO4) },
{ MP_ROM_QSTR(MP_QSTR_COL2), MP_ROM_PTR(&pin_GPIO5) },
{ MP_ROM_QSTR(MP_QSTR_ROW3), MP_ROM_PTR(&pin_GPIO6) },
{ MP_ROM_QSTR(MP_QSTR_COL3), MP_ROM_PTR(&pin_GPIO7) },
{ MP_ROM_QSTR(MP_QSTR_ROW4), MP_ROM_PTR(&pin_GPIO8) },
{ MP_ROM_QSTR(MP_QSTR_COL4), MP_ROM_PTR(&pin_GPIO9) },
{ MP_ROM_QSTR(MP_QSTR_ROW5), MP_ROM_PTR(&pin_GPIO10) },
{ MP_ROM_QSTR(MP_QSTR_COL5), MP_ROM_PTR(&pin_GPIO11) },
{ MP_ROM_QSTR(MP_QSTR_ROW6), MP_ROM_PTR(&pin_GPIO12) },
{ MP_ROM_QSTR(MP_QSTR_COL6), MP_ROM_PTR(&pin_GPIO13) },
{ MP_ROM_QSTR(MP_QSTR_ROW7), MP_ROM_PTR(&pin_GPIO14) },
{ MP_ROM_QSTR(MP_QSTR_COL7), MP_ROM_PTR(&pin_GPIO15) },
{ MP_ROM_QSTR(MP_QSTR_ROW8), MP_ROM_PTR(&pin_GPIO16) },
{ MP_ROM_QSTR(MP_QSTR_ROW9), MP_ROM_PTR(&pin_GPIO17) },
{ MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO25) },
{ MP_ROM_QSTR(MP_QSTR_RV1), MP_ROM_PTR(&pin_GPIO27) },
{ MP_ROM_QSTR(MP_QSTR_RV2), MP_ROM_PTR(&pin_GPIO28) },
{ MP_ROM_QSTR(MP_QSTR_RV3), MP_ROM_PTR(&pin_GPIO29) },
};
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);

View File

@ -14,6 +14,7 @@ EXTERNAL_FLASH_DEVICES = GD25Q16C
CIRCUITPY_NVM = 1
CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_BLEIO_HCI = 0
CIRCUITPY_ONEWIREIO = 0
CIRCUITPY_ZLIB = 0
MCU_SERIES = F4

View File

@ -35,11 +35,16 @@
#define WORDS_PER_BLOCK ((MICROPY_BYTES_PER_GC_BLOCK) / MP_BYTES_PER_OBJ_WORD)
#define BYTES_PER_BLOCK (MICROPY_BYTES_PER_GC_BLOCK)
#define HEAP_PTR(ptr) ( \
MP_STATE_MEM(gc_pool_start) != 0 /* Not on the heap if it isn't inited */ \
&& ptr >= (void *)MP_STATE_MEM(gc_pool_start) /* must be above start of pool */ \
&& ptr < (void *)MP_STATE_MEM(gc_pool_end) /* must be below end of pool */ \
)
// ptr should be of type void*
#define VERIFY_PTR(ptr) ( \
((uintptr_t)(ptr) & (BYTES_PER_BLOCK - 1)) == 0 /* must be aligned on a block */ \
&& ptr >= (void *)MP_STATE_MEM(gc_pool_start) /* must be above start of pool */ \
&& ptr < (void *)MP_STATE_MEM(gc_pool_end) /* must be below end of pool */ \
&& HEAP_PTR(ptr) \
)
void gc_init(void *start, void *end);

View File

@ -140,7 +140,7 @@ const char *mp_common_errno_to_str(mp_obj_t errno_val, char *buf, size_t len) {
const compressed_string_t *desc = NULL;
switch (MP_OBJ_SMALL_INT_VALUE(errno_val)) {
case EPERM:
desc = MP_ERROR_TEXT("Permission denied");
desc = MP_ERROR_TEXT("Operation not permitted");
break;
case ENOENT:
desc = MP_ERROR_TEXT("No such file/directory");
@ -155,7 +155,7 @@ const char *mp_common_errno_to_str(mp_obj_t errno_val, char *buf, size_t len) {
desc = MP_ERROR_TEXT("File exists");
break;
case ENODEV:
desc = MP_ERROR_TEXT("Unsupported operation");
desc = MP_ERROR_TEXT("No such device");
break;
case EINVAL:
desc = MP_ERROR_TEXT("Invalid argument");

View File

@ -54,6 +54,11 @@ extern const mp_obj_type_t mp_type_bleio_BluetoothError;
extern const mp_obj_type_t mp_type_bleio_RoleError;
extern const mp_obj_type_t mp_type_bleio_SecurityError;
// Resets all user created BLE state in preparation for the heap disappearing.
// It will maintain BLE workflow and connections.
void bleio_user_reset(void);
// Completely resets the BLE stack including BLE connections.
void bleio_reset(void);
extern mp_obj_t bleio_set_adapter(mp_obj_t adapter_obj);

View File

@ -55,6 +55,9 @@
//|
//| For both light sleep and deep sleep, if CircuitPython is connected to a host computer,
//| maintaining the connection takes priority and power consumption may not be reduced.
//|
//| For more information about working with alarms and light/deep sleep in CircuitPython,
//| see `this Learn guide <https://learn.adafruit.com/deep-sleep-with-circuitpython>`_.
//| """
//| sleep_memory: SleepMemory

View File

@ -59,12 +59,11 @@
//| :py:meth:`~analogio.AnalogIn.deinit` the hardware. The last step is optional
//| because CircuitPython will do it automatically after the program finishes.
//|
//| For the essentials of `analogio`, see the CircuitPython Essentials
//| Learn guide:
//| https://learn.adafruit.com/circuitpython-essentials/circuitpython-analog-in
//| For the essentials of `analogio`, see the `CircuitPython Essentials
//| Learn guide <https://learn.adafruit.com/circuitpython-essentials/circuitpython-analog-in>`_
//|
//| For more information on using `analogio`, see this additional Learn guide:
//| https://learn.adafruit.com/circuitpython-basics-analog-inputs-and-outputs
//| For more information on using `analogio`, see `this additional Learn guide
//| <https://learn.adafruit.com/circuitpython-basics-analog-inputs-and-outputs>`_
//| """
//|

View File

@ -31,7 +31,12 @@
#include "shared-bindings/audiomp3/MP3Decoder.h"
//| """Support for MP3-compressed audio files"""
//| """Support for MP3-compressed audio files
//|
//| For more infomration about working with MP3 files in CircuitPython,
//| see `this CircuitPython Essentials Learn guide page
//| <https://learn.adafruit.com/circuitpython-essentials/circuitpython-mp3-audio>`_.
//| """
//|
STATIC const mp_rom_map_elem_t audiomp3_module_globals_table[] = {

View File

@ -43,7 +43,13 @@
#include "extmod/vfs_posix.h"
#endif
//| """Collection of bitmap manipulation tools"""
//| """Collection of bitmap manipulation tools
//|
//| .. note:: If you're looking for information about displaying bitmaps on
//| screens in CircuitPython, see `this Learn guide
//| <https://learn.adafruit.com/circuitpython-display-support-using-displayio>`_
//| for information about using the :py:mod:`displayio` module.
//| """
//|
STATIC int16_t validate_point(mp_obj_t point, int16_t default_value) {

View File

@ -47,9 +47,9 @@
//| the default pins and settings. For more information about serial communcication
//| in CircuitPython, see the :mod:`busio`.
//|
//| For more information regarding the typical usage of :py:mod:`board`, refer to the CircuitPython
//| Essentials Learn guide:
//| https://learn.adafruit.com/circuitpython-essentials/circuitpython-pins-and-modules
//| For more information regarding the typical usage of :py:mod:`board`, refer to the `CircuitPython
//| Essentials Learn guide
//| <https://learn.adafruit.com/circuitpython-essentials/circuitpython-pins-and-modules>`_
//|
//| .. warning:: The board module varies by board. The APIs documented here may or may not be
//| available on a specific board."""

View File

@ -73,12 +73,11 @@
//| led.value = False
//| time.sleep(0.1)
//|
//| For the essentials of `digitalio`, see the CircuitPython Essentials
//| Learn guide:
//| https://learn.adafruit.com/circuitpython-essentials/circuitpython-digital-in-out
//| For the essentials of `digitalio`, see the `CircuitPython Essentials
//| Learn guide <https://learn.adafruit.com/circuitpython-essentials/circuitpython-digital-in-out>`_
//|
//| For more information on using `digitalio`, see this additional Learn guide:
//| https://learn.adafruit.com/circuitpython-digital-inputs-and-outputs
//| For more information on using `digitalio`, see `this additional Learn guide
//| <https://learn.adafruit.com/circuitpython-digital-inputs-and-outputs>`_
//| """
STATIC const mp_rom_map_elem_t digitalio_module_globals_table[] = {

View File

@ -170,14 +170,20 @@ STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_a
mp_raise_ValueError(translate("Display rotation must be in 90 degree increments"));
}
const bool sh1107_addressing = args[ARG_SH1107_addressing].u_bool;
const mp_int_t color_depth = args[ARG_color_depth].u_int;
if (sh1107_addressing && color_depth != 1) {
mp_raise_ValueError_varg(translate("%q must be 1 when %q is True"), MP_QSTR_color_depth, MP_QSTR_SH1107_addressing);
}
primary_display_t *disp = allocate_display_or_raise();
displayio_display_obj_t *self = &disp->display;
;
self->base.type = &displayio_display_type;
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,
color_depth, 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,
@ -194,7 +200,7 @@ STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_a
args[ARG_auto_refresh].u_bool,
args[ARG_native_frames_per_second].u_int,
args[ARG_backlight_on_high].u_bool,
args[ARG_SH1107_addressing].u_bool
sh1107_addressing
);
return self;

View File

@ -51,9 +51,9 @@
//| The `displayio` module contains classes to manage display output
//| including synchronizing with refresh rates and partial updating.
//|
//| For more a more thorugh explanation and guide for using `displayio`, please
//| refer to this Learn guide:
//| https://learn.adafruit.com/circuitpython-display-support-using-displayio
//| For more a more thorough explanation and guide for using `displayio`, please
//| refer to `this Learn guide
//| <https://learn.adafruit.com/circuitpython-display-support-using-displayio>`_.
//| """
//|

View File

@ -33,7 +33,15 @@
#include "shared-bindings/fontio/BuiltinFont.h"
#include "shared-bindings/fontio/Glyph.h"
//| """Core font related data structures"""
//| """Core font related data structures
//|
//| .. note:: This module is intended only for low-level usage. For working with
//| fonts in CircuitPython see the `adafruit_bitmap_font library
//| <https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font>`_.
//| For information on creating custom fonts for use in CircuitPython, see
//| `this Learn guide <https://learn.adafruit.com/custom-fonts-for-pyportal-circuitpython-display>`_
//|
//| """
//|
STATIC const mp_rom_map_elem_t fontio_module_globals_table[] = {

View File

@ -43,8 +43,9 @@
//| """Pin references and cpu functionality
//|
//| The `microcontroller` module defines the pins from the perspective of the
//| microcontroller. See :py:mod:`board` for board-specific pin mappings."""
//| The `microcontroller` module defines the pins and other bare-metal hardware
//| from the perspective of the microcontroller. See :py:mod:`board` for
//| board-specific pin mappings."""
//|
//| from nvm import ByteArray
//| from watchdog import WatchDogTimer

View File

@ -95,13 +95,13 @@ STATIC void check_for_deinit(digitalio_digitalinout_obj_t *self) {
//|
//| .. note::
//|
//| This library is typically not used by user level code.
//| This module is typically not used by user level code.
//|
//| For more information on actually using NeoPixels, refer to the CircuitPython
//| Essentials Learn guide: https://learn.adafruit.com/circuitpython-essentials/circuitpython-neopixel
//| For more information on actually using NeoPixels, refer to the `CircuitPython
//| Essentials Learn guide <https://learn.adafruit.com/circuitpython-essentials/circuitpython-neopixel>`_
//|
//| For a much more thorough guide about using NeoPixels, refer to the Adadfruit NeoPixel Überguide:
//| https://learn.adafruit.com/adafruit-neopixel-uberguide
//| For a much more thorough guide about using NeoPixels, refer to the `Adafruit NeoPixel Überguide
//| <https://learn.adafruit.com/adafruit-neopixel-uberguide>`_.
//|
//| """
//|

View File

@ -59,9 +59,8 @@
//| hardware after program completion. Use ``deinit()`` or a ``with`` statement
//| to do it yourself.
//|
//| For the essentials of `pwmio`, see the CircuitPython Essentials
//| Learn guide:
//| https://learn.adafruit.com/circuitpython-essentials/circuitpython-pwm
//| For the essentials of `pwmio`, see the `CircuitPython Essentials
//| Learn guide <https://learn.adafruit.com/circuitpython-essentials/circuitpython-pwm>`_.
//| """
//|

View File

@ -31,9 +31,15 @@
#include "py/obj.h"
#include "py/enum.h"
//| """`qrio` module.
//| """Low-level QR code decoding
//|
//| Provides the `QRDecoder` object."""
//| Provides the `QRDecoder` object used for decoding QR codes. For more
//| information about working with QR codes, see
//| `this Learn guide <https://learn.adafruit.com/scan-qr-codes-with-circuitpython>`_.
//|
//| .. note:: This module only handles decoding QR codes. If you are looking
//| to generate a QR code, use the
//| `adafruit_miniqr library <https://github.com/adafruit/Adafruit_CircuitPython_miniQR>`_"""
//|
STATIC const mp_rom_map_elem_t qrio_module_globals_table[] = {

View File

@ -42,9 +42,9 @@
//| CircuitPython does not have an OS, so this module provides this functionality
//| directly.
//| For more information regarding using the `storage` module, refer to the CircuitPython
//| Essentials Learn guide:
//| https://learn.adafruit.com/circuitpython-essentials/circuitpython-storage
//| For more information regarding using the `storage` module, refer to the `CircuitPython
//| Essentials Learn guide
//| <https://learn.adafruit.com/circuitpython-essentials/circuitpython-storage>`_.
//| """
//|

View File

@ -4,7 +4,7 @@ Module Support Matrix - Which Modules Are Available on Which Boards
===================================================================
The following table lists the available built-in modules for each CircuitPython
capable board.
capable board, as well as each :term:`frozen module` included on it.
.. raw:: html
@ -21,6 +21,14 @@ capable board.
{% for key, value in support_matrix|dictsort %}
{{ '.. _' ~ key|replace(" ", "-") ~ ':' }}
* - {{ key }}
- {{ ':py:mod:`' ~ value|join("`, :py:mod:`") ~ '`' }}
- {{ ':py:mod:`' ~ value[0]|join("`, :py:mod:`") ~ '`' }}
{% for module in value[1] %}\
{% if loop.index == 1 %}**Frozen Modules:** {% endif %}\
{% if loop.index > 1 %}, {% endif %}\
{% if module[1] %}{{ '`' ~ module[0] ~ ' <' ~ module[1] ~ '>`__' }}\
{% else %}{{ '`' ~ module[0] ~ ' <#>`__' }}\
{% endif %}\
{% endfor %}
{% endfor %}

View File

@ -38,7 +38,12 @@
//| """Displays text in a TileGrid
//|
//| The `terminalio` module contains classes to display a character stream on a display. The built
//| in font is available as ``terminalio.FONT``."""
//| in font is available as ``terminalio.FONT``.
//|
//| .. note:: This module does not give access to the
//| `REPL <https://learn.adafruit.com/welcome-to-circuitpython/interacting-with-the-serial-console>`_.
//|
//| """
//|
//| FONT: fontio.BuiltinFont
//| """The built in font"""

View File

@ -78,6 +78,7 @@ vectorio_draw_protocol_impl_t vectorio_vector_shape_draw_protocol_impl = {
.draw_update_transform = (draw_update_transform_fun)vectorio_vector_shape_update_transform,
.draw_finish_refresh = (draw_finish_refresh_fun)vectorio_vector_shape_finish_refresh,
.draw_get_refresh_areas = (draw_get_refresh_areas_fun)vectorio_vector_shape_get_refresh_areas,
.draw_set_dirty = (draw_set_dirty_fun)common_hal_vectorio_vector_shape_set_dirty,
};
// Stub checker does not approve of these shared properties.

View File

@ -17,6 +17,7 @@ typedef bool (*draw_fill_area_fun)(mp_obj_t draw_protocol_self, const _displayio
typedef bool (*draw_get_dirty_area_fun)(mp_obj_t draw_protocol_self, displayio_area_t *current_dirty_area);
typedef void (*draw_update_transform_fun)(mp_obj_t draw_protocol_self, displayio_buffer_transform_t *group_transform);
typedef void (*draw_finish_refresh_fun)(mp_obj_t draw_protocol_self);
typedef void (*draw_set_dirty_fun)(mp_obj_t draw_protocol_self);
typedef displayio_area_t *(*draw_get_refresh_areas_fun)(mp_obj_t draw_protocol_self, displayio_area_t *tail);
typedef struct _vectorio_draw_protocol_impl_t {
@ -25,6 +26,7 @@ typedef struct _vectorio_draw_protocol_impl_t {
draw_update_transform_fun draw_update_transform;
draw_finish_refresh_fun draw_finish_refresh;
draw_get_refresh_areas_fun draw_get_refresh_areas;
draw_set_dirty_fun draw_set_dirty;
} vectorio_draw_protocol_impl_t;
// Draw protocol

View File

@ -74,7 +74,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t *self,
self->first_manual_refresh = !auto_refresh;
self->data_as_commands = data_as_commands;
self->backlight_on_high = backlight_on_high;
self->SH1107_addressing = SH1107_addressing;
self->SH1107_addressing = SH1107_addressing && color_depth == 1;
self->native_frames_per_second = native_frames_per_second;
self->native_ms_per_frame = 1000 / native_frames_per_second;

View File

@ -66,6 +66,14 @@ void common_hal_displayio_group_set_hidden(displayio_group_t *self, bool hidden)
displayio_group_set_hidden_by_parent(layer, hidden);
continue;
}
#if CIRCUITPY_VECTORIO
const vectorio_draw_protocol_t *draw_protocol = mp_proto_get(MP_QSTR_protocol_draw, self->members->items[i]);
if (draw_protocol != NULL) {
layer = draw_protocol->draw_get_protocol_self(self->members->items[i]);
draw_protocol->draw_protocol_impl->draw_set_dirty(layer);
continue;
}
#endif
}
}
@ -92,6 +100,14 @@ void displayio_group_set_hidden_by_parent(displayio_group_t *self, bool hidden)
displayio_group_set_hidden_by_parent(layer, hidden);
continue;
}
#if CIRCUITPY_VECTORIO
const vectorio_draw_protocol_t *draw_protocol = mp_proto_get(MP_QSTR_protocol_draw, self->members->items[i]);
if (draw_protocol != NULL) {
layer = draw_protocol->draw_get_protocol_self(self->members->items[i]);
draw_protocol->draw_protocol_impl->draw_set_dirty(layer);
continue;
}
#endif
}
}
@ -358,33 +374,35 @@ void displayio_group_construct(displayio_group_t *self, mp_obj_list_t *members,
bool displayio_group_fill_area(displayio_group_t *self, const _displayio_colorspace_t *colorspace, const displayio_area_t *area, uint32_t *mask, uint32_t *buffer) {
// Track if any of the layers finishes filling in the given area. We can ignore any remaining
// layers at that point.
for (int32_t i = self->members->len - 1; i >= 0; i--) {
mp_obj_t layer;
#if CIRCUITPY_VECTORIO
const vectorio_draw_protocol_t *draw_protocol = mp_proto_get(MP_QSTR_protocol_draw, self->members->items[i]);
if (draw_protocol != NULL) {
layer = draw_protocol->draw_get_protocol_self(self->members->items[i]);
if (draw_protocol->draw_protocol_impl->draw_fill_area(layer, colorspace, area, mask, buffer)) {
return true;
if (self->hidden == false) {
for (int32_t i = self->members->len - 1; i >= 0; i--) {
mp_obj_t layer;
#if CIRCUITPY_VECTORIO
const vectorio_draw_protocol_t *draw_protocol = mp_proto_get(MP_QSTR_protocol_draw, self->members->items[i]);
if (draw_protocol != NULL) {
layer = draw_protocol->draw_get_protocol_self(self->members->items[i]);
if (draw_protocol->draw_protocol_impl->draw_fill_area(layer, colorspace, area, mask, buffer)) {
return true;
}
continue;
}
continue;
}
#endif
layer = mp_obj_cast_to_native_base(
self->members->items[i], &displayio_tilegrid_type);
if (layer != MP_OBJ_NULL) {
if (displayio_tilegrid_fill_area(layer, colorspace, area, mask, buffer)) {
return true;
#endif
layer = mp_obj_cast_to_native_base(
self->members->items[i], &displayio_tilegrid_type);
if (layer != MP_OBJ_NULL) {
if (displayio_tilegrid_fill_area(layer, colorspace, area, mask, buffer)) {
return true;
}
continue;
}
continue;
}
layer = mp_obj_cast_to_native_base(
self->members->items[i], &displayio_group_type);
if (layer != MP_OBJ_NULL) {
if (displayio_group_fill_area(layer, colorspace, area, mask, buffer)) {
return true;
layer = mp_obj_cast_to_native_base(
self->members->items[i], &displayio_group_type);
if (layer != MP_OBJ_NULL) {
if (displayio_group_fill_area(layer, colorspace, area, mask, buffer)) {
return true;
}
continue;
}
continue;
}
}
return false;

View File

@ -325,7 +325,6 @@ STATIC uint8_t _process_write(const uint8_t *raw_buf, size_t command_len) {
if (chunk_size == 0) {
// Don't reload until everything is written out of the packet buffer.
common_hal_bleio_packet_buffer_flush(&_transfer_packet_buffer);
autoreload_trigger();
return ANY_COMMAND;
}
@ -382,7 +381,6 @@ STATIC uint8_t _process_write_data(const uint8_t *raw_buf, size_t command_len) {
#endif
// Don't reload until everything is written out of the packet buffer.
common_hal_bleio_packet_buffer_flush(&_transfer_packet_buffer);
autoreload_trigger();
return ANY_COMMAND;
}
return WRITE_DATA;
@ -463,7 +461,6 @@ STATIC uint8_t _process_delete(const uint8_t *raw_buf, size_t command_len) {
if (result == FR_OK) {
// Don't reload until everything is written out of the packet buffer.
common_hal_bleio_packet_buffer_flush(&_transfer_packet_buffer);
autoreload_trigger();
}
return ANY_COMMAND;
}
@ -517,7 +514,6 @@ STATIC uint8_t _process_mkdir(const uint8_t *raw_buf, size_t command_len) {
if (result == FR_OK) {
// Don't reload until everything is written out of the packet buffer.
common_hal_bleio_packet_buffer_flush(&_transfer_packet_buffer);
autoreload_trigger();
}
return ANY_COMMAND;
}
@ -664,7 +660,6 @@ STATIC uint8_t _process_move(const uint8_t *raw_buf, size_t command_len) {
if (result == FR_OK) {
// Don't reload until everything is written out of the packet buffer.
common_hal_bleio_packet_buffer_flush(&_transfer_packet_buffer);
autoreload_trigger();
}
return ANY_COMMAND;
}
@ -740,6 +735,14 @@ void supervisor_bluetooth_file_transfer_background(void) {
}
if (next_command == ANY_COMMAND) {
autoreload_resume(AUTORELOAD_SUSPEND_BLE);
// Trigger a reload if the command may have mutated the file system.
if (current_state == WRITE ||
current_state == WRITE_DATA ||
current_state == DELETE ||
current_state == MKDIR ||
current_state == MOVE) {
autoreload_trigger();
}
}
}
running = false;

View File

@ -13,14 +13,15 @@ import base64
from datetime import date
from sh.contrib import git
sys.path.append("../docs")
import shared_bindings_matrix
sys.path.append("adabot")
import adabot.github_requests as github
from shared_bindings_matrix import SUPPORTED_PORTS
from shared_bindings_matrix import aliases_by_board
sys.path.append("../docs")
from shared_bindings_matrix import (
SUPPORTED_PORTS,
aliases_by_board,
support_matrix_by_board,
)
BIN = ("bin",)
UF2 = ("uf2",)
@ -75,6 +76,7 @@ extension_by_board = {
"espressif_esp32c3_devkitm_1_n4": BIN,
"lilygo_ttgo_t-01c3": BIN,
"microdev_micro_c3": BIN,
"lilygo_ttgo_t-oi-plus": BIN,
# broadcom
"raspberrypi_zero": KERNEL_IMG,
"raspberrypi_zero_w": KERNEL_IMG,
@ -124,20 +126,11 @@ def get_board_mapping():
extensions = extension_by_port[port]
extensions = extension_by_board.get(board_path.name, extensions)
aliases = aliases_by_board.get(board_path.name, [])
frozen_libraries = []
with open(os.path.join(board_path, "mpconfigboard.mk")) as mpconfig:
frozen_lines = [
line for line in mpconfig if line.startswith("FROZEN_MPY_DIRS")
]
frozen_libraries.extend(
[line[line.rfind("/") + 1 :].strip() for line in frozen_lines]
)
boards[board_id] = {
"port": port,
"extensions": extensions,
"download_count": 0,
"aliases": aliases,
"frozen_libraries": frozen_libraries,
}
for alias in aliases:
boards[alias] = {
@ -284,7 +277,7 @@ def generate_download_info():
languages = get_languages()
support_matrix = shared_bindings_matrix.support_matrix_by_board(use_branded_name=False)
support_matrix = support_matrix_by_board(use_branded_name=False)
new_stable = "-" not in new_tag
@ -321,10 +314,10 @@ def generate_download_info():
new_version = {
"stable": new_stable,
"version": new_tag,
"modules": support_matrix[alias],
"modules": support_matrix[alias][0],
"languages": languages,
"extensions": board_info["extensions"],
"frozen_libraries": board_info["frozen_libraries"],
"frozen_libraries": [frozen[0] for frozen in support_matrix[alias][1]],
}
current_info[alias]["downloads"] = alias_info["download_count"]
current_info[alias]["versions"].append(new_version)

View File

@ -68,14 +68,15 @@ submodules = []
if target == "test":
submodules = ["extmod/", "lib/", "tools/", "extmod/ulab", "lib/berkeley-db-1.xx"]
elif target == "docs":
submodules = ["extmod/ulab/"]
# used in .readthedocs.yml to generate RTD
submodules = ["extmod/ulab/", "frozen/"]
elif target == "mpy-cross-mac":
submodules = ["tools/"] # for huffman
elif target == "windows":
# This builds one board from a number of ports so fill out a bunch of submodules
submodules = ["extmod/", "lib/", "tools/", "ports/", "data/nvm.toml/"]
elif target == "website":
submodules = ["tools/adabot/"]
submodules = ["tools/adabot/", "frozen/"]
else:
p = list(pathlib.Path(".").glob(f"ports/*/boards/{target}/mpconfigboard.mk"))
if not p: