Merge remote-tracking branch 'adafruit/master' into bleio-rev

This commit is contained in:
Dan Halbert 2018-12-13 16:33:15 -05:00
commit bfa66861ef
84 changed files with 1873 additions and 914 deletions

2
.gitmodules vendored
View File

@ -78,7 +78,7 @@
url = https://github.com/adafruit/nrfx.git
[submodule "lib/tinyusb"]
path = lib/tinyusb
url = https://github.com/tannewt/tinyusb.git
url = https://github.com/hathach/tinyusb.git
branch = develop
[submodule "tools/huffman"]
path = tools/huffman

View File

@ -21,10 +21,10 @@ 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="feather_huzzah circuitplayground_express mini_sam_m4 grandcentral_m4_express pca10056 pca10059 feather_nrf52832 feather_nrf52840_express makerdiary_nrf52840_mdk particle_boron particle_argon particle_xenon" TRAVIS_SDK=arm:nrf:esp8266
- TRAVIS_TESTS="unix docs translations website" TRAVIS_BOARDS="feather_huzzah circuitplayground_express mini_sam_m4 grandcentral_m4_express pca10056 pca10059 feather_nrf52832 feather_nrf52840_express makerdiary_nrf52840_mdk particle_boron particle_argon particle_xenon sparkfun_nrf52840_mini" TRAVIS_SDK=arm:nrf:esp8266
- TRAVIS_BOARDS="metro_m0_express metro_m4_express pirkey_m0 trellis_m4_express trinket_m0" TRAVIS_SDK=arm
- TRAVIS_BOARDS="feather_radiofruit_zigbee gemma_m0 hallowing_m0_express itsybitsy_m0_express itsybitsy_m4_express meowmeow" TRAVIS_SDK=arm
- TRAVIS_BOARDS="feather_m0_express_crickit feather_m0_rfm69 feather_m0_rfm9x feather_m4_express arduino_zero arduino_mkr1300" TRAVIS_SDK=arm
- TRAVIS_BOARDS="feather_m0_express_crickit feather_m0_rfm69 feather_m0_rfm9x feather_m4_express arduino_zero arduino_mkr1300 arduino_mkrzero" TRAVIS_SDK=arm
- TRAVIS_BOARDS="circuitplayground_express_crickit feather_m0_adalogger feather_m0_basic feather_m0_express catwan_usbstick" TRAVIS_SDK=arm
addons:
@ -37,8 +37,8 @@ deploy:
provider: releases
api_key:
secure: "jdqVFw6itRY4qwQF4ReXo0uaymT+Mob6RhYX0lw8KWFNqBgHnLVuKmKKcGMEuRvBVMPkvxF7bMuOQzSBOunqwlHFse3oMzdWvQODv1zwV7pSRXGwTdIvTPbBjKWxnBG9uSNRf2R5AMflJFUxy2CbtBpgvNzr+4VLREZDrrjEu8C1iTtXGpSm5AQ5iIp2fkMAWD85FP7CQPpkqRoxhSIFZmTdurfYRmenq1OZ/4SeD5TESKcyvqJNzVT9z210B3cg3eAkP6ukvelW4qE2zgIANqUkGqvDEnAvEII9M89kuwhCMAekdfwnUSPrry+g77i1dUZHoRN1+MFj+waYtPaqxdYo2G1sysa6enxlu4jHMR5MfMk9eKHgaNgL3PiyANusYSS44amh8QIiVaX5nw82myZDCpQOZW7YqJKE6WX70Lbs4mS+wIs+ig4KIXO1B0p9kMb0OeVjHRl+KcXsWGRu/ECG/ExpqlVIssSPU407LohMXT2cJ37CY/R/EeK2XSDsQ2M3L3EAGUjCJdBGuwsOJ+2lG+HQpAVu9vAB4kq5jy9Ye+MG+8Xlkly3XZZ5+FkXyYxKnXb26/QVv0e5sIG5OmdJCPYFaH2J1QdKo7CdhEcBtrf6DMPWaimGMldShFqzLjOz3b3qLysRxFF0aGb7ipKPa57vawNzYHoPAViOcXQ="
file:
- $(ls -d1 bin/*/* | tr "\n" ":")
file_glob: true
file: "$TRAVIS_BUILD_DIR/bin/*/*"
skip_cleanup: true
draft: true
on:

View File

@ -60,6 +60,9 @@ Other
supported using the `Adafruit CircuitPython SD
library <https://github.com/adafruit/Adafruit_CircuitPython_SD>`__)
- `Arduino Zero <https://www.arduino.cc/en/Main/ArduinoBoardZero>`__
- `Arduino MKR Zero <https://store.arduino.cc/arduino-mkrzero>`__ (MicroSD card
supported using the `Adafruit CircuitPython SD
library <https://github.com/adafruit/Adafruit_CircuitPython_SD>`__)
"Third-party" or "non-Adafruit" boards
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -67,7 +70,6 @@ Other
- `Electronic Cats Meow Meow <https://electroniccats.com/gomeow/>`__
- `Electronic Cats CatWAN USB Stick <https://electroniccats.com/producto/catwan_usb_stick/>`__
Download
--------
@ -207,7 +209,7 @@ amongst ports including CircuitPython:
- ``extmod`` Shared C code used in multiple ports' modules.
- ``lib`` Shared core C code including externally developed libraries
such as FATFS.
- ``logo`` The MicroPython logo.
- ``logo`` The CircuitPython logo.
- ``mpy-cross`` A cross compiler that converts Python files to byte
code prior to being run in MicroPython. Useful for reducing library
size.
@ -262,7 +264,7 @@ project.
`⬆ back to top <#adafruit-circuitpython>`__
.. |Build Status| image:: https://travis-ci.org/adafruit/circuitpython.svg?branch=master
.. |Build Status| image:: https://travis-ci.com/adafruit/circuitpython.svg?branch=master
:target: https://travis-ci.org/adafruit/circuitpython
.. |Doc Status| image:: https://readthedocs.org/projects/circuitpython/badge/?version=latest
:target: http://circuitpython.readthedocs.io/

@ -1 +1 @@
Subproject commit 47fabe42edaae4a5da6aa0d48c664a9184578753
Subproject commit 3bb53273cd3770328f55ba317af3df0cce4333c1

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-04 16:17-0500\n"
"POT-Creation-Date: 2018-12-06 17:04-0800\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"
@ -151,70 +151,37 @@ msgstr ""
msgid "script compilation not supported"
msgstr ""
#: main.c:155
#: main.c:150
msgid " output:\n"
msgstr ""
#: main.c:169 main.c:242
#: main.c:164 main.c:237
msgid ""
"Auto-reload is on. Simply save files over USB to run them or enter REPL to "
"disable.\n"
msgstr ""
#: main.c:171
#: main.c:166
msgid "Running in safe mode! Auto-reload is off.\n"
msgstr ""
#: main.c:173 main.c:244
#: main.c:168 main.c:239
msgid "Auto-reload is off.\n"
msgstr ""
#: main.c:187
#: main.c:182
msgid "Running in safe mode! Not running saved code.\n"
msgstr ""
#: main.c:203
#: main.c:198
msgid "WARNING: Your code filename has two extensions\n"
msgstr ""
#: main.c:251
msgid "You requested starting safe mode by "
msgstr ""
#: main.c:254
msgid "To exit, please reset the board without "
msgstr ""
#: main.c:261
msgid ""
"You are running in safe mode which means something really bad happened.\n"
msgstr ""
#: main.c:263
msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
msgstr ""
#: main.c:264
msgid "Please file an issue here with the contents of your CIRCUITPY drive:\n"
msgstr ""
#: main.c:267
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
msgstr ""
#: main.c:268
msgid ""
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
#: main.c:272
#: main.c:244
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
msgstr ""
#: main.c:430
#: main.c:407
msgid "soft reboot\n"
msgstr ""
@ -443,7 +410,7 @@ msgid "pop from an empty PulseIn"
msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:420
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422
msgid "index out of range"
msgstr ""
@ -1349,116 +1316,116 @@ msgstr ""
msgid "Invalid argument"
msgstr ""
#: py/obj.c:90
#: py/obj.c:92
msgid "Traceback (most recent call last):\n"
msgstr ""
#: py/obj.c:94
#: py/obj.c:96
msgid " File \"%q\", line %d"
msgstr ""
#: py/obj.c:96
#: py/obj.c:98
msgid " File \"%q\""
msgstr ""
#: py/obj.c:100
#: py/obj.c:102
msgid ", in %q\n"
msgstr ""
#: py/obj.c:257
#: py/obj.c:259
msgid "can't convert to int"
msgstr ""
#: py/obj.c:260
#: py/obj.c:262
#, c-format
msgid "can't convert %s to int"
msgstr ""
#: py/obj.c:320
#: py/obj.c:322
msgid "can't convert to float"
msgstr ""
#: py/obj.c:323
#: py/obj.c:325
#, c-format
msgid "can't convert %s to float"
msgstr ""
#: py/obj.c:353
#: py/obj.c:355
msgid "can't convert to complex"
msgstr ""
#: py/obj.c:356
#: py/obj.c:358
#, c-format
msgid "can't convert %s to complex"
msgstr ""
#: py/obj.c:371
#: py/obj.c:373
msgid "expected tuple/list"
msgstr ""
#: py/obj.c:374
#: py/obj.c:376
#, c-format
msgid "object '%s' is not a tuple or list"
msgstr ""
#: py/obj.c:385
#: py/obj.c:387
msgid "tuple/list has wrong length"
msgstr ""
#: py/obj.c:387
#: py/obj.c:389
#, c-format
msgid "requested length %d but object has length %d"
msgstr ""
#: py/obj.c:400
#: py/obj.c:402
msgid "indices must be integers"
msgstr ""
#: py/obj.c:403
#: py/obj.c:405
msgid "%q indices must be integers, not %s"
msgstr ""
#: py/obj.c:423
#: py/obj.c:425
msgid "%q index out of range"
msgstr ""
#: py/obj.c:455
#: py/obj.c:457
msgid "object has no len"
msgstr ""
#: py/obj.c:458
#: py/obj.c:460
#, c-format
msgid "object of type '%s' has no len()"
msgstr ""
#: py/obj.c:496
#: py/obj.c:500
msgid "object does not support item deletion"
msgstr ""
#: py/obj.c:499
#: py/obj.c:503
#, c-format
msgid "'%s' object does not support item deletion"
msgstr ""
#: py/obj.c:503
#: py/obj.c:507
msgid "object is not subscriptable"
msgstr ""
#: py/obj.c:506
#: py/obj.c:510
#, c-format
msgid "'%s' object is not subscriptable"
msgstr ""
#: py/obj.c:510
#: py/obj.c:514
msgid "object does not support item assignment"
msgstr ""
#: py/obj.c:513
#: py/obj.c:517
#, c-format
msgid "'%s' object does not support item assignment"
msgstr ""
#: py/obj.c:544
#: py/obj.c:548
msgid "object with buffer protocol required"
msgstr ""
@ -2524,3 +2491,58 @@ msgstr ""
#: shared-module/usb_hid/Device.c:59
msgid "USB Error"
msgstr ""
#: supervisor/shared/safe_mode.c:97
msgid "You requested starting safe mode by "
msgstr ""
#: supervisor/shared/safe_mode.c:100
msgid "To exit, please reset the board without "
msgstr ""
#: supervisor/shared/safe_mode.c:107
msgid ""
"You are running in safe mode which means something unanticipated happened.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:109
msgid ""
"Looks like our core CircuitPython code crashed hard. Whoops!\n"
"Please file an issue at https://github.com/adafruit/circuitpython/issues\n"
" with the contents of your CIRCUITPY drive and this message:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:111
msgid "Crash into the HardFault_Handler.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:113
msgid "MicroPython NLR jump failed. Likely memory corruption.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:115
msgid "MicroPython fatal error.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:118
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
#: supervisor/shared/safe_mode.c:120
msgid ""
"The CircuitPython heap was corrupted because the stack was too small.\n"
"Please increase stack size limits and press reset (after ejecting "
"CIRCUITPY).\n"
"If you didn't change the stack, then file an issue here with the contents of "
"your CIRCUITPY drive:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:123
msgid ""
"The reset button was pressed while booting CircuitPython. Press again to "
"exit safe mode.\n"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-04 16:17-0500\n"
"POT-Creation-Date: 2018-12-06 17:04-0800\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: Sebastian Plamauer\n"
"Language-Team: \n"
@ -151,11 +151,11 @@ msgstr "ungültige argumente"
msgid "script compilation not supported"
msgstr "kompilieren von Skripten ist nicht unterstützt"
#: main.c:155
#: main.c:150
msgid " output:\n"
msgstr " Ausgabe:\n"
#: main.c:169 main.c:242
#: main.c:164 main.c:237
msgid ""
"Auto-reload is on. Simply save files over USB to run them or enter REPL to "
"disable.\n"
@ -163,67 +163,29 @@ msgstr ""
"Automatisches Neuladen ist aktiv. Speichere Dateien über USB um sie "
"auszuführen oder verbinde dich mit der REPL um zu deaktivieren.\n"
#: main.c:171
#: main.c:166
msgid "Running in safe mode! Auto-reload is off.\n"
msgstr "Sicherheitsmodus aktiv! Automatisches Neuladen ist deaktiviert.\n"
#: main.c:173 main.c:244
#: main.c:168 main.c:239
msgid "Auto-reload is off.\n"
msgstr "Automatisches Neuladen ist deaktiviert.\n"
#: main.c:187
#: main.c:182
msgid "Running in safe mode! Not running saved code.\n"
msgstr "Sicherheitsmodus aktiv! Gespeicherter Code wird nicht ausgeführt\n"
#: main.c:203
#: main.c:198
msgid "WARNING: Your code filename has two extensions\n"
msgstr "WARNUNG: Der Dateiname deines codes hat zwei Dateityperweiterungen\n"
#: main.c:251
msgid "You requested starting safe mode by "
msgstr "Du hast das Starten im Sicherheitsmodus ausgelöst durch "
#: main.c:254
msgid "To exit, please reset the board without "
msgstr "Zum beenden bitte resette das board ohne "
#: main.c:261
msgid ""
"You are running in safe mode which means something really bad happened.\n"
msgstr "Sicherheitsmodus aktiv, etwas wirklich schlechtes ist passiert.\n"
#: main.c:263
msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
msgstr "CircuitPython ist abgestürzt. Ups!\n"
#: main.c:264
msgid "Please file an issue here with the contents of your CIRCUITPY drive:\n"
msgstr ""
"Bitte erstelle ein issue hier mit dem Inhalt deines CIRCUITPY-speichers:\n"
#: main.c:267
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
msgstr ""
"Die Stromversorgung des Mikrocontrollers ist eingebrochen. Stelle sicher,"
"dass deine Stromversorgung\n"
#: main.c:268
msgid ""
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
"genug Strom für den ganzen Schaltkreis liefert und drücke reset (nach dem "
"sicheren Auswerfen von CIRCUITPY.)\n"
#: main.c:272
#: main.c:244
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
msgstr ""
"Drücke eine Taste um dich mit der REPL zu verbinden. Drücke Strg-D zum neu "
"laden"
#: main.c:430
#: main.c:407
msgid "soft reboot\n"
msgstr "soft reboot\n"
@ -452,7 +414,7 @@ msgid "pop from an empty PulseIn"
msgstr "pop von einem leeren PulseIn"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:420
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422
msgid "index out of range"
msgstr "index außerhalb der Reichweite"
@ -1369,116 +1331,116 @@ msgstr ""
msgid "Invalid argument"
msgstr ""
#: py/obj.c:90
#: py/obj.c:92
msgid "Traceback (most recent call last):\n"
msgstr ""
#: py/obj.c:94
#: py/obj.c:96
msgid " File \"%q\", line %d"
msgstr ""
#: py/obj.c:96
#: py/obj.c:98
msgid " File \"%q\""
msgstr ""
#: py/obj.c:100
#: py/obj.c:102
msgid ", in %q\n"
msgstr ""
#: py/obj.c:257
#: py/obj.c:259
msgid "can't convert to int"
msgstr ""
#: py/obj.c:260
#: py/obj.c:262
#, c-format
msgid "can't convert %s to int"
msgstr ""
#: py/obj.c:320
#: py/obj.c:322
msgid "can't convert to float"
msgstr ""
#: py/obj.c:323
#: py/obj.c:325
#, c-format
msgid "can't convert %s to float"
msgstr ""
#: py/obj.c:353
#: py/obj.c:355
msgid "can't convert to complex"
msgstr ""
#: py/obj.c:356
#: py/obj.c:358
#, c-format
msgid "can't convert %s to complex"
msgstr ""
#: py/obj.c:371
#: py/obj.c:373
msgid "expected tuple/list"
msgstr ""
#: py/obj.c:374
#: py/obj.c:376
#, c-format
msgid "object '%s' is not a tuple or list"
msgstr ""
#: py/obj.c:385
#: py/obj.c:387
msgid "tuple/list has wrong length"
msgstr ""
#: py/obj.c:387
#: py/obj.c:389
#, c-format
msgid "requested length %d but object has length %d"
msgstr ""
#: py/obj.c:400
#: py/obj.c:402
msgid "indices must be integers"
msgstr ""
#: py/obj.c:403
#: py/obj.c:405
msgid "%q indices must be integers, not %s"
msgstr ""
#: py/obj.c:423
#: py/obj.c:425
msgid "%q index out of range"
msgstr ""
#: py/obj.c:455
#: py/obj.c:457
msgid "object has no len"
msgstr ""
#: py/obj.c:458
#: py/obj.c:460
#, c-format
msgid "object of type '%s' has no len()"
msgstr ""
#: py/obj.c:496
#: py/obj.c:500
msgid "object does not support item deletion"
msgstr ""
#: py/obj.c:499
#: py/obj.c:503
#, c-format
msgid "'%s' object does not support item deletion"
msgstr ""
#: py/obj.c:503
#: py/obj.c:507
msgid "object is not subscriptable"
msgstr ""
#: py/obj.c:506
#: py/obj.c:510
#, c-format
msgid "'%s' object is not subscriptable"
msgstr ""
#: py/obj.c:510
#: py/obj.c:514
msgid "object does not support item assignment"
msgstr ""
#: py/obj.c:513
#: py/obj.c:517
#, c-format
msgid "'%s' object does not support item assignment"
msgstr ""
#: py/obj.c:544
#: py/obj.c:548
msgid "object with buffer protocol required"
msgstr ""
@ -2550,32 +2512,106 @@ msgstr "USB beschäftigt"
msgid "USB Error"
msgstr "USB Fehler"
#~ msgid "Invalid Service type"
#~ msgstr "Ungültiger Diensttyp"
#: supervisor/shared/safe_mode.c:97
msgid "You requested starting safe mode by "
msgstr "Du hast das Starten im Sicherheitsmodus ausgelöst durch "
#~ msgid "Can not query for the device address."
#~ msgstr "Kann nicht nach der Geräteadresse suchen."
#: supervisor/shared/safe_mode.c:100
msgid "To exit, please reset the board without "
msgstr "Zum beenden bitte resette das board ohne "
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Kann PPCP Parameter nicht setzen."
#: supervisor/shared/safe_mode.c:107
#, fuzzy
msgid ""
"You are running in safe mode which means something unanticipated happened.\n"
msgstr "Sicherheitsmodus aktiv, etwas wirklich schlechtes ist passiert.\n"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Kann GAP Parameter nicht anwenden."
#: supervisor/shared/safe_mode.c:109
msgid ""
"Looks like our core CircuitPython code crashed hard. Whoops!\n"
"Please file an issue at https://github.com/adafruit/circuitpython/issues\n"
" with the contents of your CIRCUITPY drive and this message:\n"
msgstr ""
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "Kann UUID nicht kodieren, um die Länge zu überprüfen."
#: supervisor/shared/safe_mode.c:111
msgid "Crash into the HardFault_Handler.\n"
msgstr ""
#~ msgid "Can encode UUID into the advertisement packet."
#~ msgstr "Kann UUID in das advertisement packet kodieren."
#: supervisor/shared/safe_mode.c:113
msgid "MicroPython NLR jump failed. Likely memory corruption.\n"
msgstr ""
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Der Gerätename kann nicht im Stack verwendet werden."
#: supervisor/shared/safe_mode.c:115
msgid "MicroPython fatal error.\n"
msgstr ""
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Kann advertisement data nicht anwenden. Status: 0x%02x"
#: supervisor/shared/safe_mode.c:118
#, fuzzy
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
"Die Stromversorgung des Mikrocontrollers ist eingebrochen. Stelle sicher,"
"dass deine Stromversorgung\n"
#: supervisor/shared/safe_mode.c:120
msgid ""
"The CircuitPython heap was corrupted because the stack was too small.\n"
"Please increase stack size limits and press reset (after ejecting "
"CIRCUITPY).\n"
"If you didn't change the stack, then file an issue here with the contents of "
"your CIRCUITPY drive:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:123
msgid ""
"The reset button was pressed while booting CircuitPython. Press again to "
"exit safe mode.\n"
msgstr ""
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr "CircuitPython ist abgestürzt. Ups!\n"
#~ msgid ""
#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n"
#~ msgstr ""
#~ "Bitte erstelle ein issue hier mit dem Inhalt deines CIRCUITPY-speichers:\n"
#~ msgid "Can not add Service."
#~ msgstr "Kann den Dienst nicht hinzufügen."
#~ msgid "Can encode UUID into the advertisement packet."
#~ msgstr "Kann UUID in das advertisement packet kodieren."
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "Kann UUID nicht kodieren, um die Länge zu überprüfen."
#~ msgid "Can not add Characteristic."
#~ msgstr "Kann das Merkmal nicht hinzufügen."
#~ msgid "Can not query for the device address."
#~ msgstr "Kann nicht nach der Geräteadresse suchen."
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
#~ "CIRCUITPY).\n"
#~ msgstr ""
#~ "genug Strom für den ganzen Schaltkreis liefert und drücke reset (nach dem "
#~ "sicheren Auswerfen von CIRCUITPY.)\n"
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Kann PPCP Parameter nicht setzen."
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Der Gerätename kann nicht im Stack verwendet werden."
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Kann GAP Parameter nicht anwenden."
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Kann advertisement data nicht anwenden. Status: 0x%02x"
#~ msgid "Invalid Service type"
#~ msgstr "Ungültiger Diensttyp"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-04 16:17-0500\n"
"POT-Creation-Date: 2018-12-06 17:04-0800\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -151,70 +151,37 @@ msgstr ""
msgid "script compilation not supported"
msgstr ""
#: main.c:155
#: main.c:150
msgid " output:\n"
msgstr ""
#: main.c:169 main.c:242
#: main.c:164 main.c:237
msgid ""
"Auto-reload is on. Simply save files over USB to run them or enter REPL to "
"disable.\n"
msgstr ""
#: main.c:171
#: main.c:166
msgid "Running in safe mode! Auto-reload is off.\n"
msgstr ""
#: main.c:173 main.c:244
#: main.c:168 main.c:239
msgid "Auto-reload is off.\n"
msgstr ""
#: main.c:187
#: main.c:182
msgid "Running in safe mode! Not running saved code.\n"
msgstr ""
#: main.c:203
#: main.c:198
msgid "WARNING: Your code filename has two extensions\n"
msgstr ""
#: main.c:251
msgid "You requested starting safe mode by "
msgstr ""
#: main.c:254
msgid "To exit, please reset the board without "
msgstr ""
#: main.c:261
msgid ""
"You are running in safe mode which means something really bad happened.\n"
msgstr ""
#: main.c:263
msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
msgstr ""
#: main.c:264
msgid "Please file an issue here with the contents of your CIRCUITPY drive:\n"
msgstr ""
#: main.c:267
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
msgstr ""
#: main.c:268
msgid ""
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
#: main.c:272
#: main.c:244
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
msgstr ""
#: main.c:430
#: main.c:407
msgid "soft reboot\n"
msgstr ""
@ -443,7 +410,7 @@ msgid "pop from an empty PulseIn"
msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:420
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422
msgid "index out of range"
msgstr ""
@ -1349,116 +1316,116 @@ msgstr ""
msgid "Invalid argument"
msgstr ""
#: py/obj.c:90
#: py/obj.c:92
msgid "Traceback (most recent call last):\n"
msgstr ""
#: py/obj.c:94
#: py/obj.c:96
msgid " File \"%q\", line %d"
msgstr ""
#: py/obj.c:96
#: py/obj.c:98
msgid " File \"%q\""
msgstr ""
#: py/obj.c:100
#: py/obj.c:102
msgid ", in %q\n"
msgstr ""
#: py/obj.c:257
#: py/obj.c:259
msgid "can't convert to int"
msgstr ""
#: py/obj.c:260
#: py/obj.c:262
#, c-format
msgid "can't convert %s to int"
msgstr ""
#: py/obj.c:320
#: py/obj.c:322
msgid "can't convert to float"
msgstr ""
#: py/obj.c:323
#: py/obj.c:325
#, c-format
msgid "can't convert %s to float"
msgstr ""
#: py/obj.c:353
#: py/obj.c:355
msgid "can't convert to complex"
msgstr ""
#: py/obj.c:356
#: py/obj.c:358
#, c-format
msgid "can't convert %s to complex"
msgstr ""
#: py/obj.c:371
#: py/obj.c:373
msgid "expected tuple/list"
msgstr ""
#: py/obj.c:374
#: py/obj.c:376
#, c-format
msgid "object '%s' is not a tuple or list"
msgstr ""
#: py/obj.c:385
#: py/obj.c:387
msgid "tuple/list has wrong length"
msgstr ""
#: py/obj.c:387
#: py/obj.c:389
#, c-format
msgid "requested length %d but object has length %d"
msgstr ""
#: py/obj.c:400
#: py/obj.c:402
msgid "indices must be integers"
msgstr ""
#: py/obj.c:403
#: py/obj.c:405
msgid "%q indices must be integers, not %s"
msgstr ""
#: py/obj.c:423
#: py/obj.c:425
msgid "%q index out of range"
msgstr ""
#: py/obj.c:455
#: py/obj.c:457
msgid "object has no len"
msgstr ""
#: py/obj.c:458
#: py/obj.c:460
#, c-format
msgid "object of type '%s' has no len()"
msgstr ""
#: py/obj.c:496
#: py/obj.c:500
msgid "object does not support item deletion"
msgstr ""
#: py/obj.c:499
#: py/obj.c:503
#, c-format
msgid "'%s' object does not support item deletion"
msgstr ""
#: py/obj.c:503
#: py/obj.c:507
msgid "object is not subscriptable"
msgstr ""
#: py/obj.c:506
#: py/obj.c:510
#, c-format
msgid "'%s' object is not subscriptable"
msgstr ""
#: py/obj.c:510
#: py/obj.c:514
msgid "object does not support item assignment"
msgstr ""
#: py/obj.c:513
#: py/obj.c:517
#, c-format
msgid "'%s' object does not support item assignment"
msgstr ""
#: py/obj.c:544
#: py/obj.c:548
msgid "object with buffer protocol required"
msgstr ""
@ -2524,3 +2491,58 @@ msgstr ""
#: shared-module/usb_hid/Device.c:59
msgid "USB Error"
msgstr ""
#: supervisor/shared/safe_mode.c:97
msgid "You requested starting safe mode by "
msgstr ""
#: supervisor/shared/safe_mode.c:100
msgid "To exit, please reset the board without "
msgstr ""
#: supervisor/shared/safe_mode.c:107
msgid ""
"You are running in safe mode which means something unanticipated happened.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:109
msgid ""
"Looks like our core CircuitPython code crashed hard. Whoops!\n"
"Please file an issue at https://github.com/adafruit/circuitpython/issues\n"
" with the contents of your CIRCUITPY drive and this message:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:111
msgid "Crash into the HardFault_Handler.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:113
msgid "MicroPython NLR jump failed. Likely memory corruption.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:115
msgid "MicroPython fatal error.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:118
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
#: supervisor/shared/safe_mode.c:120
msgid ""
"The CircuitPython heap was corrupted because the stack was too small.\n"
"Please increase stack size limits and press reset (after ejecting "
"CIRCUITPY).\n"
"If you didn't change the stack, then file an issue here with the contents of "
"your CIRCUITPY drive:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:123
msgid ""
"The reset button was pressed while booting CircuitPython. Press again to "
"exit safe mode.\n"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-04 16:17-0500\n"
"POT-Creation-Date: 2018-12-06 17:04-0800\n"
"PO-Revision-Date: 2018-08-24 22:56-0500\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -152,11 +152,11 @@ msgstr "argumentos inválidos"
msgid "script compilation not supported"
msgstr "script de compilación no soportado"
#: main.c:155
#: main.c:150
msgid " output:\n"
msgstr " salida:\n"
#: main.c:169 main.c:242
#: main.c:164 main.c:237
msgid ""
"Auto-reload is on. Simply save files over USB to run them or enter REPL to "
"disable.\n"
@ -164,70 +164,28 @@ msgstr ""
"Auto-reload habilitado. Simplemente guarda los archivos via USB para "
"ejecutarlos o entra al REPL para desabilitarlos.\n"
#: main.c:171
#: main.c:166
msgid "Running in safe mode! Auto-reload is off.\n"
msgstr "Ejecutando en modo seguro! La auto-recarga esta deshabilitada.\n"
#: main.c:173 main.c:244
#: main.c:168 main.c:239
msgid "Auto-reload is off.\n"
msgstr "Auto-recarga deshabilitada.\n"
#: main.c:187
#: main.c:182
msgid "Running in safe mode! Not running saved code.\n"
msgstr "Ejecutando en modo seguro! No se esta ejecutando el código guardado.\n"
#: main.c:203
#: main.c:198
msgid "WARNING: Your code filename has two extensions\n"
msgstr "ADVERTENCIA: El nombre de archivo de tu código tiene dos extensiones\n"
#: main.c:251
msgid "You requested starting safe mode by "
msgstr "Solicitaste iniciar en modo seguro por "
#: main.c:254
msgid "To exit, please reset the board without "
msgstr "Para salir, por favor reinicia la tarjeta sin "
#: main.c:261
msgid ""
"You are running in safe mode which means something really bad happened.\n"
msgstr ""
"Estás ejecutando en modo seguro, lo cual significa que algo realmente malo "
"ha sucedido.\n"
#: main.c:263
msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
msgstr "Parece que nuestro código CircuitPython dejó de funcionar. Whoops!\n"
#: main.c:264
#, fuzzy
msgid "Please file an issue here with the contents of your CIRCUITPY drive:\n"
msgstr ""
"Por favor registra un issue en la siguiente URL con el contenidos de tu "
"unidad de almacenamiento CIRCUITPY:\n"
#: main.c:267
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
msgstr ""
"La alimentación del microcontrolador cayó. Por favor asegurate de que tu "
"fuente de alimentación provee\n"
#: main.c:268
msgid ""
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
"suficiente poder para todo el circuito y presiona reset (después de expulsar "
"CIRCUITPY).\n"
#: main.c:272
#: main.c:244
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
msgstr ""
"Presiona cualquier tecla para entrar al REPL. Usa CTRL-D para recargar."
#: main.c:430
#: main.c:407
msgid "soft reboot\n"
msgstr "reinicio suave\n"
@ -458,7 +416,7 @@ msgid "pop from an empty PulseIn"
msgstr "pop de un PulseIn vacío"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:420
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422
msgid "index out of range"
msgstr "index fuera de rango"
@ -1378,116 +1336,116 @@ msgstr "Operación no soportada"
msgid "Invalid argument"
msgstr "Argumento inválido"
#: py/obj.c:90
#: py/obj.c:92
msgid "Traceback (most recent call last):\n"
msgstr ""
#: py/obj.c:94
#: py/obj.c:96
msgid " File \"%q\", line %d"
msgstr " Archivo \"%q\", línea %d"
#: py/obj.c:96
#: py/obj.c:98
msgid " File \"%q\""
msgstr " Archivo \"%q\""
#: py/obj.c:100
#: py/obj.c:102
msgid ", in %q\n"
msgstr ", en %q\n"
#: py/obj.c:257
#: py/obj.c:259
msgid "can't convert to int"
msgstr "no se puede convertir a int"
#: py/obj.c:260
#: py/obj.c:262
#, c-format
msgid "can't convert %s to int"
msgstr "no se puede convertir %s a int"
#: py/obj.c:320
#: py/obj.c:322
msgid "can't convert to float"
msgstr "no se puede convertir a float"
#: py/obj.c:323
#: py/obj.c:325
#, c-format
msgid "can't convert %s to float"
msgstr "no se puede convertir %s a float"
#: py/obj.c:353
#: py/obj.c:355
msgid "can't convert to complex"
msgstr "no se puede convertir a complejo"
#: py/obj.c:356
#: py/obj.c:358
#, c-format
msgid "can't convert %s to complex"
msgstr "no se puede convertir %s a complejo"
#: py/obj.c:371
#: py/obj.c:373
msgid "expected tuple/list"
msgstr "tupla/lista esperada"
#: py/obj.c:374
#: py/obj.c:376
#, c-format
msgid "object '%s' is not a tuple or list"
msgstr "el objeto '%s' no es una tupla o lista"
#: py/obj.c:385
#: py/obj.c:387
msgid "tuple/list has wrong length"
msgstr "tupla/lista tiene una longitud incorrecta"
#: py/obj.c:387
#: py/obj.c:389
#, c-format
msgid "requested length %d but object has length %d"
msgstr "longitud solicitada %d pero el objeto tiene longitud %d"
#: py/obj.c:400
#: py/obj.c:402
msgid "indices must be integers"
msgstr "indices deben ser enteros"
#: py/obj.c:403
#: py/obj.c:405
msgid "%q indices must be integers, not %s"
msgstr "%q indices deben ser enteros, no %s"
#: py/obj.c:423
#: py/obj.c:425
msgid "%q index out of range"
msgstr "%w indice fuera de rango"
#: py/obj.c:455
#: py/obj.c:457
msgid "object has no len"
msgstr "el objeto no tiene longitud"
#: py/obj.c:458
#: py/obj.c:460
#, c-format
msgid "object of type '%s' has no len()"
msgstr "el objeto de tipo '%s' no tiene len()"
#: py/obj.c:496
#: py/obj.c:500
msgid "object does not support item deletion"
msgstr "object no soporta la eliminación de elementos"
#: py/obj.c:499
#: py/obj.c:503
#, c-format
msgid "'%s' object does not support item deletion"
msgstr "objeto '%s' no soporta la eliminación de elementos"
#: py/obj.c:503
#: py/obj.c:507
msgid "object is not subscriptable"
msgstr ""
#: py/obj.c:506
#: py/obj.c:510
#, c-format
msgid "'%s' object is not subscriptable"
msgstr ""
#: py/obj.c:510
#: py/obj.c:514
msgid "object does not support item assignment"
msgstr "el objeto no soporta la asignación de elementos"
#: py/obj.c:513
#: py/obj.c:517
#, c-format
msgid "'%s' object does not support item assignment"
msgstr "el objeto '%s' no soporta la asignación de elementos"
#: py/obj.c:544
#: py/obj.c:548
msgid "object with buffer protocol required"
msgstr "objeto con protocolo de buffer requerido"
@ -2566,9 +2524,100 @@ msgstr "USB ocupado"
msgid "USB Error"
msgstr "Error USB"
#: supervisor/shared/safe_mode.c:97
msgid "You requested starting safe mode by "
msgstr "Solicitaste iniciar en modo seguro por "
#: supervisor/shared/safe_mode.c:100
msgid "To exit, please reset the board without "
msgstr "Para salir, por favor reinicia la tarjeta sin "
#: supervisor/shared/safe_mode.c:107
#, fuzzy
msgid ""
"You are running in safe mode which means something unanticipated happened.\n"
msgstr ""
"Estás ejecutando en modo seguro, lo cual significa que algo realmente malo "
"ha sucedido.\n"
#: supervisor/shared/safe_mode.c:109
msgid ""
"Looks like our core CircuitPython code crashed hard. Whoops!\n"
"Please file an issue at https://github.com/adafruit/circuitpython/issues\n"
" with the contents of your CIRCUITPY drive and this message:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:111
msgid "Crash into the HardFault_Handler.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:113
msgid "MicroPython NLR jump failed. Likely memory corruption.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:115
msgid "MicroPython fatal error.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:118
#, fuzzy
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
"La alimentación del microcontrolador cayó. Por favor asegurate de que tu "
"fuente de alimentación provee\n"
#: supervisor/shared/safe_mode.c:120
msgid ""
"The CircuitPython heap was corrupted because the stack was too small.\n"
"Please increase stack size limits and press reset (after ejecting "
"CIRCUITPY).\n"
"If you didn't change the stack, then file an issue here with the contents of "
"your CIRCUITPY drive:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:123
msgid ""
"The reset button was pressed while booting CircuitPython. Press again to "
"exit safe mode.\n"
msgstr ""
#, fuzzy
#~ msgid ""
#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n"
#~ msgstr ""
#~ "Por favor registra un issue en la siguiente URL con el contenidos de tu "
#~ "unidad de almacenamiento CIRCUITPY:\n"
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Parece que nuestro código CircuitPython dejó de funcionar. Whoops!\n"
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
#~ "CIRCUITPY).\n"
#~ msgstr ""
#~ "suficiente poder para todo el circuito y presiona reset (después de "
#~ "expulsar CIRCUITPY).\n"
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "No se pueden establecer los parámetros PPCP."
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "No se puede aplicar los datos de anuncio. status: 0x%02x"
#~ msgid "Baud rate too high for this SPI peripheral"
#~ msgstr "Baud rate demasiado alto para este periférico SPI"
#~ msgid "Can not query for the device address."
#~ msgstr "No se puede consultar la dirección del dispositivo."
#~ msgid "Can not add Service."
#~ msgstr "No se puede agregar el Servicio."
#~ msgid "Invalid Service type"
#~ msgstr "Tipo de Servicio inválido"
@ -2578,12 +2627,6 @@ msgstr "Error USB"
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "No se puede codificar el UUID, para revisar la longitud."
#~ msgid "Can not query for the device address."
#~ msgstr "No se puede consultar la dirección del dispositivo."
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "No se puede aplicar los datos de anuncio. status: 0x%02x"
#~ msgid "Can not apply device name in the stack."
#~ msgstr "No se puede aplicar el nombre del dispositivo en el stack."
@ -2592,9 +2635,3 @@ msgstr "Error USB"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "No se pueden aplicar los parámetros GAP."
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "No se pueden establecer los parámetros PPCP."
#~ msgid "Can not add Service."
#~ msgstr "No se puede agregar el Servicio."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-04 16:17-0500\n"
"POT-Creation-Date: 2018-12-06 17:04-0800\n"
"PO-Revision-Date: 2018-08-30 23:04-0700\n"
"Last-Translator: Timothy <me@timothygarcia.ca>\n"
"Language-Team: fil\n"
@ -151,11 +151,11 @@ msgstr "mali ang mga argumento"
msgid "script compilation not supported"
msgstr "script kompilasyon hindi supportado"
#: main.c:155
#: main.c:150
msgid " output:\n"
msgstr " output:\n"
#: main.c:169 main.c:242
#: main.c:164 main.c:237
msgid ""
"Auto-reload is on. Simply save files over USB to run them or enter REPL to "
"disable.\n"
@ -163,70 +163,29 @@ msgstr ""
"Ang awtomatikong pag re-reload ay ON. i-save lamang ang mga files sa USB "
"para patakbuhin sila o pasukin ang REPL para i-disable ito.\n"
#: main.c:171
#: main.c:166
msgid "Running in safe mode! Auto-reload is off.\n"
msgstr "Tumatakbo sa safe mode! Awtomatikong pag re-reload ay OFF.\n"
#: main.c:173 main.c:244
#: main.c:168 main.c:239
msgid "Auto-reload is off.\n"
msgstr "Awtomatikong pag re-reload ay OFF.\n"
#: main.c:187
#: main.c:182
msgid "Running in safe mode! Not running saved code.\n"
msgstr "Tumatakbo sa safe mode! Hindi tumatakbo ang nai-save na code.\n"
#: main.c:203
#: main.c:198
msgid "WARNING: Your code filename has two extensions\n"
msgstr "BABALA: Ang pangalan ng file ay may dalawang extension\n"
#: main.c:251
msgid "You requested starting safe mode by "
msgstr "Ikaw ang humiling sa safe mode sa pamamagitan ng "
#: main.c:254
msgid "To exit, please reset the board without "
msgstr "Para lumabas, paki-reset ang board na wala ang "
#: main.c:261
msgid ""
"You are running in safe mode which means something really bad happened.\n"
msgstr ""
"Ikaw ay tumatakbo sa safe mode, ang ibig sabihin nito ay may masamang "
"nangyari.\n"
#: main.c:263
msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
msgstr "Mukhang ang core CircuitPython code ay nag-crash ng malakas. Aray!\n"
#: main.c:264
msgid "Please file an issue here with the contents of your CIRCUITPY drive:\n"
msgstr ""
"Mag-file ng isang isyu dito gamit ang mga nilalaman ng iyong CIRCUITPY "
"drive:\n"
#: main.c:267
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
msgstr ""
"Ang kapangyarihan ng mikrokontroller ay bumaba. Mangyaring suriin ang power "
"supply \n"
#: main.c:268
msgid ""
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
"ay nagbibigay ng sapat na power para sa buong circuit at i-press ang reset "
"(pagkatapos i-eject ang CIRCUITPY).\n"
#: main.c:272
#: main.c:244
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
msgstr ""
"Pindutin ang anumang key upang ipasok ang REPL. Gamitin ang CTRL-D upang i-"
"reload."
#: main.c:430
#: main.c:407
msgid "soft reboot\n"
msgstr "malambot na reboot\n"
@ -455,7 +414,7 @@ msgid "pop from an empty PulseIn"
msgstr "pop mula sa walang laman na PulseIn"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:420
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422
msgid "index out of range"
msgstr "index wala sa sakop"
@ -1380,116 +1339,116 @@ msgstr "Hindi sinusuportahang operasyon"
msgid "Invalid argument"
msgstr "Maling argumento"
#: py/obj.c:90
#: py/obj.c:92
msgid "Traceback (most recent call last):\n"
msgstr "Traceback (pinakahuling huling tawag): \n"
#: py/obj.c:94
#: py/obj.c:96
msgid " File \"%q\", line %d"
msgstr " File \"%q\", line %d"
#: py/obj.c:96
#: py/obj.c:98
msgid " File \"%q\""
msgstr " File \"%q\""
#: py/obj.c:100
#: py/obj.c:102
msgid ", in %q\n"
msgstr ", sa %q\n"
#: py/obj.c:257
#: py/obj.c:259
msgid "can't convert to int"
msgstr "hindi ma-convert sa int"
#: py/obj.c:260
#: py/obj.c:262
#, c-format
msgid "can't convert %s to int"
msgstr "hindi ma-convert %s sa int"
#: py/obj.c:320
#: py/obj.c:322
msgid "can't convert to float"
msgstr "hindi ma-convert sa float"
#: py/obj.c:323
#: py/obj.c:325
#, c-format
msgid "can't convert %s to float"
msgstr "hindi ma-convert %s sa int"
#: py/obj.c:353
#: py/obj.c:355
msgid "can't convert to complex"
msgstr "hindi ma-convert sa complex"
#: py/obj.c:356
#: py/obj.c:358
#, c-format
msgid "can't convert %s to complex"
msgstr "hindi ma-convert %s sa complex"
#: py/obj.c:371
#: py/obj.c:373
msgid "expected tuple/list"
msgstr "umaasa ng tuple/list"
#: py/obj.c:374
#: py/obj.c:376
#, c-format
msgid "object '%s' is not a tuple or list"
msgstr "object '%s' ay hindi tuple o list"
#: py/obj.c:385
#: py/obj.c:387
msgid "tuple/list has wrong length"
msgstr "mali ang haba ng tuple/list"
#: py/obj.c:387
#: py/obj.c:389
#, c-format
msgid "requested length %d but object has length %d"
msgstr "hiniling ang haba %d ngunit may haba ang object na %d"
#: py/obj.c:400
#: py/obj.c:402
msgid "indices must be integers"
msgstr "ang mga indeks ay dapat na integer"
#: py/obj.c:403
#: py/obj.c:405
msgid "%q indices must be integers, not %s"
msgstr "%q indeks ay dapat integers, hindi %s"
#: py/obj.c:423
#: py/obj.c:425
msgid "%q index out of range"
msgstr "%q indeks wala sa sakop"
#: py/obj.c:455
#: py/obj.c:457
msgid "object has no len"
msgstr "object walang len"
#: py/obj.c:458
#: py/obj.c:460
#, c-format
msgid "object of type '%s' has no len()"
msgstr "object na type '%s' walang len()"
#: py/obj.c:496
#: py/obj.c:500
msgid "object does not support item deletion"
msgstr "ang object ay hindi sumusuporta sa pagbura ng item"
#: py/obj.c:499
#: py/obj.c:503
#, c-format
msgid "'%s' object does not support item deletion"
msgstr "'%s' object ay hindi sumusuporta sa pagtanggal ng item"
#: py/obj.c:503
#: py/obj.c:507
msgid "object is not subscriptable"
msgstr "ang bagay ay hindi maaaring ma-subscript"
#: py/obj.c:506
#: py/obj.c:510
#, c-format
msgid "'%s' object is not subscriptable"
msgstr "'%s' object ay hindi maaaring i-subscript"
#: py/obj.c:510
#: py/obj.c:514
msgid "object does not support item assignment"
msgstr "ang object na '%s' ay hindi maaaring i-subscript"
#: py/obj.c:513
#: py/obj.c:517
#, c-format
msgid "'%s' object does not support item assignment"
msgstr "'%s' object hindi sumusuporta ng item assignment"
#: py/obj.c:544
#: py/obj.c:548
msgid "object with buffer protocol required"
msgstr "object na may buffer protocol kinakailangan"
@ -2598,10 +2557,100 @@ msgstr "Busy ang USB"
msgid "USB Error"
msgstr "May pagkakamali ang USB"
#: supervisor/shared/safe_mode.c:97
msgid "You requested starting safe mode by "
msgstr "Ikaw ang humiling sa safe mode sa pamamagitan ng "
#: supervisor/shared/safe_mode.c:100
msgid "To exit, please reset the board without "
msgstr "Para lumabas, paki-reset ang board na wala ang "
#: supervisor/shared/safe_mode.c:107
#, fuzzy
msgid ""
"You are running in safe mode which means something unanticipated happened.\n"
msgstr ""
"Ikaw ay tumatakbo sa safe mode, ang ibig sabihin nito ay may masamang "
"nangyari.\n"
#: supervisor/shared/safe_mode.c:109
msgid ""
"Looks like our core CircuitPython code crashed hard. Whoops!\n"
"Please file an issue at https://github.com/adafruit/circuitpython/issues\n"
" with the contents of your CIRCUITPY drive and this message:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:111
msgid "Crash into the HardFault_Handler.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:113
msgid "MicroPython NLR jump failed. Likely memory corruption.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:115
msgid "MicroPython fatal error.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:118
#, fuzzy
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
"Ang kapangyarihan ng mikrokontroller ay bumaba. Mangyaring suriin ang power "
"supply \n"
#: supervisor/shared/safe_mode.c:120
msgid ""
"The CircuitPython heap was corrupted because the stack was too small.\n"
"Please increase stack size limits and press reset (after ejecting "
"CIRCUITPY).\n"
"If you didn't change the stack, then file an issue here with the contents of "
"your CIRCUITPY drive:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:123
msgid ""
"The reset button was pressed while booting CircuitPython. Press again to "
"exit safe mode.\n"
msgstr ""
#~ msgid ""
#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n"
#~ msgstr ""
#~ "Mag-file ng isang isyu dito gamit ang mga nilalaman ng iyong CIRCUITPY "
#~ "drive:\n"
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Mukhang ang core CircuitPython code ay nag-crash ng malakas. Aray!\n"
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
#~ "CIRCUITPY).\n"
#~ msgstr ""
#~ "ay nagbibigay ng sapat na power para sa buong circuit at i-press ang "
#~ "reset (pagkatapos i-eject ang CIRCUITPY).\n"
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Hindi ma-set ang PPCP parameters."
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Hindi ma i-apply ang advertisement data. status: 0x%02x"
#, fuzzy
#~ msgid "palette must be displayio.Palette"
#~ msgstr "ang palette ay dapat 32 bytes ang haba"
#~ msgid "Can not query for the device address."
#~ msgstr "Hindi maaaring mag-query para sa address ng device."
#~ msgid "Can not add Service."
#~ msgstr "Hindi maidaragdag ang serbisyo."
#~ msgid "Invalid Service type"
#~ msgstr "Mali ang tipo ng serbisyo"
@ -2611,12 +2660,6 @@ msgstr "May pagkakamali ang USB"
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "Hindi ma-encode UUID, para suriin ang haba."
#~ msgid "Can not query for the device address."
#~ msgstr "Hindi maaaring mag-query para sa address ng device."
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Hindi ma i-apply ang advertisement data. status: 0x%02x"
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Hindi maaaring ma-aplay ang device name sa stack."
@ -2625,9 +2668,3 @@ msgstr "May pagkakamali ang USB"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Hindi ma-apply ang GAP parameters."
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Hindi ma-set ang PPCP parameters."
#~ msgid "Can not add Service."
#~ msgstr "Hindi maidaragdag ang serbisyo."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-04 16:17-0500\n"
"POT-Creation-Date: 2018-12-06 17:04-0800\n"
"PO-Revision-Date: 2018-08-14 11:01+0200\n"
"Last-Translator: Pierrick Couturier <arofarn@arofarn.info>\n"
"Language-Team: fr\n"
@ -150,11 +150,11 @@ msgstr "arguments invalides"
msgid "script compilation not supported"
msgstr "compilation du script non supporté"
#: main.c:155
#: main.c:150
msgid " output:\n"
msgstr " sortie:\n"
#: main.c:169 main.c:242
#: main.c:164 main.c:237
msgid ""
"Auto-reload is on. Simply save files over USB to run them or enter REPL to "
"disable.\n"
@ -162,66 +162,27 @@ msgstr ""
"Auto-chargement activé. Copiez simplement les fichiers en USB pour les "
"lancer ou entrez sur REPL pour le désactiver.\n"
#: main.c:171
#: main.c:166
msgid "Running in safe mode! Auto-reload is off.\n"
msgstr "Mode sans-échec. Auto-rechargement désactivé.\n"
#: main.c:173 main.c:244
#: main.c:168 main.c:239
msgid "Auto-reload is off.\n"
msgstr "Auto-rechargement désactivé.\n"
#: main.c:187
#: main.c:182
msgid "Running in safe mode! Not running saved code.\n"
msgstr "Mode sans-échec! Le code sauvegardé ne s'éxecute pas.\n"
#: main.c:203
#: main.c:198
msgid "WARNING: Your code filename has two extensions\n"
msgstr "ATTENTION: le nom de fichier de votre code a deux extensions\n"
#: main.c:251
msgid "You requested starting safe mode by "
msgstr "Vous avez demandé à démarrer en mode sans-échec par "
#: main.c:254
msgid "To exit, please reset the board without "
msgstr "Pour quitter, redémarrez la carte SVP sans "
#: main.c:261
msgid ""
"You are running in safe mode which means something really bad happened.\n"
msgstr ""
"Vous êtes en mode sans-échec ce qui signifie que quelque chose demauvais est "
"arrivé.\n"
#: main.c:263
msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
msgstr "Il semblerait que votre code CircuitPython a durement planté. Oups!\n"
#: main.c:264
msgid "Please file an issue here with the contents of your CIRCUITPY drive:\n"
msgstr "SVP, remontez le problème là avec le contenu du lecteur CIRCUITPY:\n"
#: main.c:267
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
msgstr ""
"L'alimentation du microcontroleur a chuté. Merci de vérifier que votre "
"alimentation fournit\n"
#: main.c:268
msgid ""
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
"assez de puissance pour l'ensemble du circuit et appuyez sur 'reset' (après "
"avoir éjecter CIRCUITPY).\n"
#: main.c:272
#: main.c:244
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
msgstr "Appuyez sur une touche pour entrer sur REPL ou CTRL-D pour recharger."
#: main.c:430
#: main.c:407
msgid "soft reboot\n"
msgstr "redémarrage logiciel\n"
@ -451,7 +412,7 @@ msgid "pop from an empty PulseIn"
msgstr "'pop' d'une entrée PulseIn vide"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:420
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422
msgid "index out of range"
msgstr "index hors gamme"
@ -1370,116 +1331,116 @@ msgstr "Opération non supportée"
msgid "Invalid argument"
msgstr "Argument invalide"
#: py/obj.c:90
#: py/obj.c:92
msgid "Traceback (most recent call last):\n"
msgstr "Trace (appels les plus récents en dernier):\n"
#: py/obj.c:94
#: py/obj.c:96
msgid " File \"%q\", line %d"
msgstr " Fichier \"%q\", ligne %d"
#: py/obj.c:96
#: py/obj.c:98
msgid " File \"%q\""
msgstr " Fichier \"%q\""
#: py/obj.c:100
#: py/obj.c:102
msgid ", in %q\n"
msgstr ", dans %q\n"
#: py/obj.c:257
#: py/obj.c:259
msgid "can't convert to int"
msgstr "ne peut convertir en entier int"
#: py/obj.c:260
#: py/obj.c:262
#, c-format
msgid "can't convert %s to int"
msgstr "ne peut convertir %s en entier int"
#: py/obj.c:320
#: py/obj.c:322
msgid "can't convert to float"
msgstr "ne peut convertir en nombre à virgule flottante (float)"
#: py/obj.c:323
#: py/obj.c:325
#, c-format
msgid "can't convert %s to float"
msgstr "ne peut convertir %s en nombre à virgule flottante (float)"
#: py/obj.c:353
#: py/obj.c:355
msgid "can't convert to complex"
msgstr "ne peut convertir en nombre complexe"
#: py/obj.c:356
#: py/obj.c:358
#, c-format
msgid "can't convert %s to complex"
msgstr "ne peut convertir %s en nombre complexe"
#: py/obj.c:371
#: py/obj.c:373
msgid "expected tuple/list"
msgstr "un tuple ou une liste est attendu"
#: py/obj.c:374
#: py/obj.c:376
#, c-format
msgid "object '%s' is not a tuple or list"
msgstr "l'objet '%s' n'est pas un tuple ou une liste"
#: py/obj.c:385
#: py/obj.c:387
msgid "tuple/list has wrong length"
msgstr "tuple/liste a une mauvaise longueur"
#: py/obj.c:387
#: py/obj.c:389
#, c-format
msgid "requested length %d but object has length %d"
msgstr "la longueur requise est %d mais l'objet est long de %d"
#: py/obj.c:400
#: py/obj.c:402
msgid "indices must be integers"
msgstr "les indices doivent être des entiers"
#: py/obj.c:403
#: py/obj.c:405
msgid "%q indices must be integers, not %s"
msgstr "les indices %q doivent être des entiers, pas %s"
#: py/obj.c:423
#: py/obj.c:425
msgid "%q index out of range"
msgstr "index %q hors gamme"
#: py/obj.c:455
#: py/obj.c:457
msgid "object has no len"
msgstr "l'objet n'a pas de len"
#: py/obj.c:458
#: py/obj.c:460
#, c-format
msgid "object of type '%s' has no len()"
msgstr "l'objet de type '%s' n'a pas de len()"
#: py/obj.c:496
#: py/obj.c:500
msgid "object does not support item deletion"
msgstr "l'objet ne supporte pas la suppression d'éléments"
#: py/obj.c:499
#: py/obj.c:503
#, c-format
msgid "'%s' object does not support item deletion"
msgstr "l'objet '%s' ne supporte pas la suppression d'éléments"
#: py/obj.c:503
#: py/obj.c:507
msgid "object is not subscriptable"
msgstr "l'objet n'est pas sous-scriptable"
#: py/obj.c:506
#: py/obj.c:510
#, c-format
msgid "'%s' object is not subscriptable"
msgstr "l'objet '%s' n'est pas sous-scriptable"
#: py/obj.c:510
#: py/obj.c:514
msgid "object does not support item assignment"
msgstr "l'objet ne supporte pas l'assignation d'éléments"
#: py/obj.c:513
#: py/obj.c:517
#, c-format
msgid "'%s' object does not support item assignment"
msgstr "l'objet '%s' ne supporte pas l'assignation d'éléments"
#: py/obj.c:544
#: py/obj.c:548
msgid "object with buffer protocol required"
msgstr "un objet avec un protocol de tampon est nécessaire"
@ -2596,34 +2557,111 @@ msgstr "USB occupé"
msgid "USB Error"
msgstr "Erreur USB"
#: supervisor/shared/safe_mode.c:97
msgid "You requested starting safe mode by "
msgstr "Vous avez demandé à démarrer en mode sans-échec par "
#: supervisor/shared/safe_mode.c:100
msgid "To exit, please reset the board without "
msgstr "Pour quitter, redémarrez la carte SVP sans "
#: supervisor/shared/safe_mode.c:107
#, fuzzy
#~ msgid "palette must be displayio.Palette"
#~ msgstr "palettre doit être displayio.Palette"
msgid ""
"You are running in safe mode which means something unanticipated happened.\n"
msgstr ""
"Vous êtes en mode sans-échec ce qui signifie que quelque chose demauvais est "
"arrivé.\n"
#~ msgid "Can not query for the device address."
#~ msgstr "Impossible d'obtenir l'adresse du périphérique"
#: supervisor/shared/safe_mode.c:109
msgid ""
"Looks like our core CircuitPython code crashed hard. Whoops!\n"
"Please file an issue at https://github.com/adafruit/circuitpython/issues\n"
" with the contents of your CIRCUITPY drive and this message:\n"
msgstr ""
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Impossible d'appliquer les paramètres PPCP"
#: supervisor/shared/safe_mode.c:111
msgid "Crash into the HardFault_Handler.\n"
msgstr ""
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Impossible d'appliquer les paramètres GAP"
#: supervisor/shared/safe_mode.c:113
msgid "MicroPython NLR jump failed. Likely memory corruption.\n"
msgstr ""
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "Impossible d'encoder l'UUID pour vérifier la longueur."
#: supervisor/shared/safe_mode.c:115
msgid "MicroPython fatal error.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:118
#, fuzzy
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
"L'alimentation du microcontroleur a chuté. Merci de vérifier que votre "
"alimentation fournit\n"
#: supervisor/shared/safe_mode.c:120
msgid ""
"The CircuitPython heap was corrupted because the stack was too small.\n"
"Please increase stack size limits and press reset (after ejecting "
"CIRCUITPY).\n"
"If you didn't change the stack, then file an issue here with the contents of "
"your CIRCUITPY drive:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:123
msgid ""
"The reset button was pressed while booting CircuitPython. Press again to "
"exit safe mode.\n"
msgstr ""
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Il semblerait que votre code CircuitPython a durement planté. Oups!\n"
#~ msgid ""
#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n"
#~ msgstr ""
#~ "SVP, remontez le problème là avec le contenu du lecteur CIRCUITPY:\n"
#~ msgid "Can not add Service."
#~ msgstr "Impossible d'ajouter le Service"
#~ msgid "Invalid Service type"
#~ msgstr "Type de service invalide"
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "Impossible d'encoder l'UUID pour vérifier la longueur."
#~ msgid "Can not add Characteristic."
#~ msgstr "Impossible d'ajouter la Characteristic."
#~ msgid "Can not query for the device address."
#~ msgstr "Impossible d'obtenir l'adresse du périphérique"
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
#~ "CIRCUITPY).\n"
#~ msgstr ""
#~ "assez de puissance pour l'ensemble du circuit et appuyez sur "
#~ "'reset' (après avoir éjecter CIRCUITPY).\n"
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Impossible d'appliquer les paramètres PPCP"
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Impossible d'appliquer le nom de périphérique dans la pile"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Impossible d'appliquer les paramètres GAP"
#, fuzzy
#~ msgid "value_size must be power of two"
#~ msgstr "value_size est une puissance de deux"
#~ msgid "Can not add Service."
#~ msgstr "Impossible d'ajouter le Service"
#~ msgid "Can not add Characteristic."
#~ msgstr "Impossible d'ajouter la Characteristic."
#, fuzzy
#~ msgid "palette must be displayio.Palette"
#~ msgstr "palettre doit être displayio.Palette"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-04 16:17-0500\n"
"POT-Creation-Date: 2018-12-06 17:04-0800\n"
"PO-Revision-Date: 2018-10-02 16:27+0200\n"
"Last-Translator: Enrico Paganin <enrico.paganin@mail.com>\n"
"Language-Team: \n"
@ -151,11 +151,11 @@ msgstr "argomenti non validi"
msgid "script compilation not supported"
msgstr "compilazione dello scrip non suportata"
#: main.c:155
#: main.c:150
msgid " output:\n"
msgstr " output:\n"
#: main.c:169 main.c:242
#: main.c:164 main.c:237
msgid ""
"Auto-reload is on. Simply save files over USB to run them or enter REPL to "
"disable.\n"
@ -163,71 +163,28 @@ msgstr ""
"L'auto-reload è attivo. Salva i file su USB per eseguirli o entra nel REPL "
"per disabilitarlo.\n"
#: main.c:171
#: main.c:166
msgid "Running in safe mode! Auto-reload is off.\n"
msgstr "Modalità sicura in esecuzione! Auto-reload disattivato.\n"
#: main.c:173 main.c:244
#: main.c:168 main.c:239
msgid "Auto-reload is off.\n"
msgstr "Auto-reload disattivato.\n"
#: main.c:187
#: main.c:182
msgid "Running in safe mode! Not running saved code.\n"
msgstr "Modalità sicura in esecuzione! Codice salvato non in esecuzione.\n"
#: main.c:203
#: main.c:198
msgid "WARNING: Your code filename has two extensions\n"
msgstr "ATTENZIONE: Il nome del sorgente ha due estensioni\n"
#: main.c:251
msgid "You requested starting safe mode by "
msgstr "È stato richiesto l'avvio in modalità sicura da "
#: main.c:254
msgid "To exit, please reset the board without "
msgstr "Per uscire resettare la scheda senza "
#: main.c:261
msgid ""
"You are running in safe mode which means something really bad happened.\n"
msgstr ""
"Sei nella modalità sicura che significa che qualcosa di molto brutto è "
"successo.\n"
#: main.c:263
msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
msgstr ""
"Sembra che il codice del core di CircuitPython sia crashato malamente. "
"Whoops!\n"
#: main.c:264
msgid "Please file an issue here with the contents of your CIRCUITPY drive:\n"
msgstr ""
"Ti preghiamo di compilare una issue con il contenuto del tuo drie "
"CIRCUITPY:\n"
#: main.c:267
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
msgstr ""
"La potenza del microcontrollore è calata. Assicurati che l'alimentazione sia "
"attaccata correttamente\n"
#: main.c:268
msgid ""
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
"abbastanza potenza per l'intero circuito e premere reset (dopo aver espulso "
"CIRCUITPY).\n"
#: main.c:272
#: main.c:244
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
msgstr ""
"Premi un qualunque tasto per entrare nel REPL. Usa CTRL-D per ricaricare."
#: main.c:430
#: main.c:407
msgid "soft reboot\n"
msgstr "soft reboot\n"
@ -459,7 +416,7 @@ msgid "pop from an empty PulseIn"
msgstr "pop sun un PulseIn vuoto"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:420
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422
msgid "index out of range"
msgstr "indice fuori intervallo"
@ -1379,116 +1336,116 @@ msgstr "Operazione non supportata"
msgid "Invalid argument"
msgstr "Argomento non valido"
#: py/obj.c:90
#: py/obj.c:92
msgid "Traceback (most recent call last):\n"
msgstr "Traceback (chiamata più recente per ultima):\n"
#: py/obj.c:94
#: py/obj.c:96
msgid " File \"%q\", line %d"
msgstr " File \"%q\", riga %d"
#: py/obj.c:96
#: py/obj.c:98
msgid " File \"%q\""
msgstr " File \"%q\""
#: py/obj.c:100
#: py/obj.c:102
msgid ", in %q\n"
msgstr ", in %q\n"
#: py/obj.c:257
#: py/obj.c:259
msgid "can't convert to int"
msgstr "non è possibile convertire a int"
#: py/obj.c:260
#: py/obj.c:262
#, c-format
msgid "can't convert %s to int"
msgstr "non è possibile convertire %s a int"
#: py/obj.c:320
#: py/obj.c:322
msgid "can't convert to float"
msgstr "non è possibile convertire a float"
#: py/obj.c:323
#: py/obj.c:325
#, c-format
msgid "can't convert %s to float"
msgstr "non è possibile convertire %s a float"
#: py/obj.c:353
#: py/obj.c:355
msgid "can't convert to complex"
msgstr "non è possibile convertire a complex"
#: py/obj.c:356
#: py/obj.c:358
#, c-format
msgid "can't convert %s to complex"
msgstr "non è possibile convertire a complex"
#: py/obj.c:371
#: py/obj.c:373
msgid "expected tuple/list"
msgstr "lista/tupla prevista"
#: py/obj.c:374
#: py/obj.c:376
#, c-format
msgid "object '%s' is not a tuple or list"
msgstr "oggetto '%s' non è una tupla o una lista"
#: py/obj.c:385
#: py/obj.c:387
msgid "tuple/list has wrong length"
msgstr "tupla/lista ha la lunghezza sbagliata"
#: py/obj.c:387
#: py/obj.c:389
#, c-format
msgid "requested length %d but object has length %d"
msgstr "lunghezza %d richiesta ma l'oggetto ha lunghezza %d"
#: py/obj.c:400
#: py/obj.c:402
msgid "indices must be integers"
msgstr "gli indici devono essere interi"
#: py/obj.c:403
#: py/obj.c:405
msgid "%q indices must be integers, not %s"
msgstr "gli indici %q devono essere interi, non %s"
#: py/obj.c:423
#: py/obj.c:425
msgid "%q index out of range"
msgstr "indice %q fuori intervallo"
#: py/obj.c:455
#: py/obj.c:457
msgid "object has no len"
msgstr "l'oggetto non ha lunghezza"
#: py/obj.c:458
#: py/obj.c:460
#, c-format
msgid "object of type '%s' has no len()"
msgstr "l'oggetto di tipo '%s' non implementa len()"
#: py/obj.c:496
#: py/obj.c:500
msgid "object does not support item deletion"
msgstr ""
#: py/obj.c:499
#: py/obj.c:503
#, c-format
msgid "'%s' object does not support item deletion"
msgstr ""
#: py/obj.c:503
#: py/obj.c:507
msgid "object is not subscriptable"
msgstr ""
#: py/obj.c:506
#: py/obj.c:510
#, c-format
msgid "'%s' object is not subscriptable"
msgstr ""
#: py/obj.c:510
#: py/obj.c:514
msgid "object does not support item assignment"
msgstr ""
#: py/obj.c:513
#: py/obj.c:517
#, c-format
msgid "'%s' object does not support item assignment"
msgstr ""
#: py/obj.c:544
#: py/obj.c:548
msgid "object with buffer protocol required"
msgstr ""
@ -2583,32 +2540,111 @@ msgstr "USB occupata"
msgid "USB Error"
msgstr "Errore USB"
#~ msgid "Invalid Service type"
#~ msgstr "Tipo di servizio non valido"
#: supervisor/shared/safe_mode.c:97
msgid "You requested starting safe mode by "
msgstr "È stato richiesto l'avvio in modalità sicura da "
#~ msgid "Can not query for the device address."
#~ msgstr "Non è possibile trovare l'indirizzo del dispositivo."
#: supervisor/shared/safe_mode.c:100
msgid "To exit, please reset the board without "
msgstr "Per uscire resettare la scheda senza "
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Impossibile impostare i parametri PPCP."
#: supervisor/shared/safe_mode.c:107
#, fuzzy
msgid ""
"You are running in safe mode which means something unanticipated happened.\n"
msgstr ""
"Sei nella modalità sicura che significa che qualcosa di molto brutto è "
"successo.\n"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Impossibile applicare i parametri GAP."
#: supervisor/shared/safe_mode.c:109
msgid ""
"Looks like our core CircuitPython code crashed hard. Whoops!\n"
"Please file an issue at https://github.com/adafruit/circuitpython/issues\n"
" with the contents of your CIRCUITPY drive and this message:\n"
msgstr ""
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "Non è possibile codificare l'UUID, lunghezza da controllare."
#: supervisor/shared/safe_mode.c:111
msgid "Crash into the HardFault_Handler.\n"
msgstr ""
#~ msgid "Can encode UUID into the advertisement packet."
#~ msgstr "È possibile codificare l'UUID nel pacchetto di advertisement."
#: supervisor/shared/safe_mode.c:113
msgid "MicroPython NLR jump failed. Likely memory corruption.\n"
msgstr ""
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Non è possibile inserire il nome del dipositivo nella lista."
#: supervisor/shared/safe_mode.c:115
msgid "MicroPython fatal error.\n"
msgstr ""
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Impossible inserire dati advertisement. status: 0x%02x"
#: supervisor/shared/safe_mode.c:118
#, fuzzy
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
"La potenza del microcontrollore è calata. Assicurati che l'alimentazione sia "
"attaccata correttamente\n"
#: supervisor/shared/safe_mode.c:120
msgid ""
"The CircuitPython heap was corrupted because the stack was too small.\n"
"Please increase stack size limits and press reset (after ejecting "
"CIRCUITPY).\n"
"If you didn't change the stack, then file an issue here with the contents of "
"your CIRCUITPY drive:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:123
msgid ""
"The reset button was pressed while booting CircuitPython. Press again to "
"exit safe mode.\n"
msgstr ""
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Sembra che il codice del core di CircuitPython sia crashato malamente. "
#~ "Whoops!\n"
#~ msgid ""
#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n"
#~ msgstr ""
#~ "Ti preghiamo di compilare una issue con il contenuto del tuo drie "
#~ "CIRCUITPY:\n"
#~ msgid "Can not add Service."
#~ msgstr "Non è possibile aggiungere Service."
#~ msgid "Can encode UUID into the advertisement packet."
#~ msgstr "È possibile codificare l'UUID nel pacchetto di advertisement."
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "Non è possibile codificare l'UUID, lunghezza da controllare."
#~ msgid "Can not add Characteristic."
#~ msgstr "Non è possibile aggiungere Characteristic."
#~ msgid "Can not query for the device address."
#~ msgstr "Non è possibile trovare l'indirizzo del dispositivo."
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
#~ "CIRCUITPY).\n"
#~ msgstr ""
#~ "abbastanza potenza per l'intero circuito e premere reset (dopo aver "
#~ "espulso CIRCUITPY).\n"
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Impossibile impostare i parametri PPCP."
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Non è possibile inserire il nome del dipositivo nella lista."
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Impossibile applicare i parametri GAP."
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Impossible inserire dati advertisement. status: 0x%02x"
#~ msgid "Invalid Service type"
#~ msgstr "Tipo di servizio non valido"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-04 16:17-0500\n"
"POT-Creation-Date: 2018-12-06 17:04-0800\n"
"PO-Revision-Date: 2018-10-02 21:14-0000\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -151,70 +151,37 @@ msgstr "argumentos inválidos"
msgid "script compilation not supported"
msgstr "compilação de script não suportada"
#: main.c:155
#: main.c:150
msgid " output:\n"
msgstr " saída:\n"
#: main.c:169 main.c:242
#: main.c:164 main.c:237
msgid ""
"Auto-reload is on. Simply save files over USB to run them or enter REPL to "
"disable.\n"
msgstr ""
#: main.c:171
#: main.c:166
msgid "Running in safe mode! Auto-reload is off.\n"
msgstr "Rodando em modo seguro! Atualização automática está desligada.\n"
#: main.c:173 main.c:244
#: main.c:168 main.c:239
msgid "Auto-reload is off.\n"
msgstr "A atualização automática está desligada.\n"
#: main.c:187
#: main.c:182
msgid "Running in safe mode! Not running saved code.\n"
msgstr "Rodando em modo seguro! Não está executando o código salvo.\n"
#: main.c:203
#: main.c:198
msgid "WARNING: Your code filename has two extensions\n"
msgstr "AVISO: Seu arquivo de código tem duas extensões\n"
#: main.c:251
msgid "You requested starting safe mode by "
msgstr "Você solicitou o início do modo de segurança"
#: main.c:254
msgid "To exit, please reset the board without "
msgstr "Para sair, por favor, reinicie a placa sem "
#: main.c:261
msgid ""
"You are running in safe mode which means something really bad happened.\n"
msgstr ""
#: main.c:263
msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
msgstr ""
#: main.c:264
msgid "Please file an issue here with the contents of your CIRCUITPY drive:\n"
msgstr ""
#: main.c:267
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
msgstr ""
#: main.c:268
msgid ""
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
#: main.c:272
#: main.c:244
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
msgstr ""
#: main.c:430
#: main.c:407
msgid "soft reboot\n"
msgstr ""
@ -443,7 +410,7 @@ msgid "pop from an empty PulseIn"
msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:420
#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422
msgid "index out of range"
msgstr "Índice fora do intervalo"
@ -1355,116 +1322,116 @@ msgstr ""
msgid "Invalid argument"
msgstr "Argumento inválido"
#: py/obj.c:90
#: py/obj.c:92
msgid "Traceback (most recent call last):\n"
msgstr ""
#: py/obj.c:94
#: py/obj.c:96
msgid " File \"%q\", line %d"
msgstr " Arquivo \"%q\", linha %d"
#: py/obj.c:96
#: py/obj.c:98
msgid " File \"%q\""
msgstr " Arquivo \"%q\""
#: py/obj.c:100
#: py/obj.c:102
msgid ", in %q\n"
msgstr ""
#: py/obj.c:257
#: py/obj.c:259
msgid "can't convert to int"
msgstr ""
#: py/obj.c:260
#: py/obj.c:262
#, c-format
msgid "can't convert %s to int"
msgstr ""
#: py/obj.c:320
#: py/obj.c:322
msgid "can't convert to float"
msgstr ""
#: py/obj.c:323
#: py/obj.c:325
#, c-format
msgid "can't convert %s to float"
msgstr ""
#: py/obj.c:353
#: py/obj.c:355
msgid "can't convert to complex"
msgstr ""
#: py/obj.c:356
#: py/obj.c:358
#, c-format
msgid "can't convert %s to complex"
msgstr ""
#: py/obj.c:371
#: py/obj.c:373
msgid "expected tuple/list"
msgstr ""
#: py/obj.c:374
#: py/obj.c:376
#, c-format
msgid "object '%s' is not a tuple or list"
msgstr ""
#: py/obj.c:385
#: py/obj.c:387
msgid "tuple/list has wrong length"
msgstr ""
#: py/obj.c:387
#: py/obj.c:389
#, c-format
msgid "requested length %d but object has length %d"
msgstr ""
#: py/obj.c:400
#: py/obj.c:402
msgid "indices must be integers"
msgstr ""
#: py/obj.c:403
#: py/obj.c:405
msgid "%q indices must be integers, not %s"
msgstr ""
#: py/obj.c:423
#: py/obj.c:425
msgid "%q index out of range"
msgstr ""
#: py/obj.c:455
#: py/obj.c:457
msgid "object has no len"
msgstr ""
#: py/obj.c:458
#: py/obj.c:460
#, c-format
msgid "object of type '%s' has no len()"
msgstr ""
#: py/obj.c:496
#: py/obj.c:500
msgid "object does not support item deletion"
msgstr ""
#: py/obj.c:499
#: py/obj.c:503
#, c-format
msgid "'%s' object does not support item deletion"
msgstr ""
#: py/obj.c:503
#: py/obj.c:507
msgid "object is not subscriptable"
msgstr ""
#: py/obj.c:506
#: py/obj.c:510
#, c-format
msgid "'%s' object is not subscriptable"
msgstr ""
#: py/obj.c:510
#: py/obj.c:514
msgid "object does not support item assignment"
msgstr ""
#: py/obj.c:513
#: py/obj.c:517
#, c-format
msgid "'%s' object does not support item assignment"
msgstr ""
#: py/obj.c:544
#: py/obj.c:548
msgid "object with buffer protocol required"
msgstr ""
@ -2535,6 +2502,67 @@ msgstr "USB ocupada"
msgid "USB Error"
msgstr "Erro na USB"
#: supervisor/shared/safe_mode.c:97
msgid "You requested starting safe mode by "
msgstr "Você solicitou o início do modo de segurança"
#: supervisor/shared/safe_mode.c:100
msgid "To exit, please reset the board without "
msgstr "Para sair, por favor, reinicie a placa sem "
#: supervisor/shared/safe_mode.c:107
msgid ""
"You are running in safe mode which means something unanticipated happened.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:109
msgid ""
"Looks like our core CircuitPython code crashed hard. Whoops!\n"
"Please file an issue at https://github.com/adafruit/circuitpython/issues\n"
" with the contents of your CIRCUITPY drive and this message:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:111
msgid "Crash into the HardFault_Handler.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:113
msgid "MicroPython NLR jump failed. Likely memory corruption.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:115
msgid "MicroPython fatal error.\n"
msgstr ""
#: supervisor/shared/safe_mode.c:118
msgid ""
"The microcontroller's power dipped. Please make sure your power supply "
"provides\n"
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
#: supervisor/shared/safe_mode.c:120
msgid ""
"The CircuitPython heap was corrupted because the stack was too small.\n"
"Please increase stack size limits and press reset (after ejecting "
"CIRCUITPY).\n"
"If you didn't change the stack, then file an issue here with the contents of "
"your CIRCUITPY drive:\n"
msgstr ""
#: supervisor/shared/safe_mode.c:123
msgid ""
"The reset button was pressed while booting CircuitPython. Press again to "
"exit safe mode.\n"
msgstr ""
#~ msgid "Can not add Service."
#~ msgstr "Não é possível adicionar o serviço."
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Não é possível aplicar dados de anúncio. status: 0x%02x"
#~ msgid "Baud rate too high for this SPI peripheral"
#~ msgstr "Taxa de transmissão muito alta para esse periférico SPI"
@ -2547,20 +2575,14 @@ msgstr "Erro na USB"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Não é possível aplicar parâmetros GAP."
#~ msgid "Can encode UUID into the advertisement packet."
#~ msgstr "Pode codificar o UUID no pacote de anúncios."
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Não é possível aplicar dados de anúncio. status: 0x%02x"
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Não é possível aplicar o nome do dispositivo na pilha."
#~ msgid "Invalid Service type"
#~ msgstr "Tipo de serviço inválido"
#~ msgid "Can not add Service."
#~ msgstr "Não é possível adicionar o serviço."
#~ msgid "Can encode UUID into the advertisement packet."
#~ msgstr "Pode codificar o UUID no pacote de anúncios."
#~ msgid "Can not add Characteristic."
#~ msgstr "Não é possível adicionar Característica."
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Não é possível aplicar o nome do dispositivo na pilha."

59
main.c
View File

@ -51,6 +51,7 @@
#include "supervisor/shared/autoreload.h"
#include "supervisor/shared/translate.h"
#include "supervisor/shared/rgb_led_status.h"
#include "supervisor/shared/safe_mode.h"
#include "supervisor/shared/status_leds.h"
#include "supervisor/shared/stack.h"
#include "supervisor/serial.h"
@ -140,12 +141,6 @@ const char* first_existing_file_in_list(const char ** filenames) {
return NULL;
}
void write_compressed(const compressed_string_t* compressed) {
char decompressed[compressed->length];
decompress(compressed, decompressed);
serial_write(decompressed);
}
bool maybe_run_list(const char ** filenames, pyexec_result_t* exec_result) {
const char* filename = first_existing_file_in_list(filenames);
if (filename == NULL) {
@ -166,11 +161,11 @@ bool run_code_py(safe_mode_t safe_mode) {
if (serial_connected_at_start) {
serial_write("\n");
if (autoreload_is_enabled()) {
write_compressed(translate("Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.\n"));
serial_write_compressed(translate("Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.\n"));
} else if (safe_mode != NO_SAFE_MODE) {
write_compressed(translate("Running in safe mode! Auto-reload is off.\n"));
serial_write_compressed(translate("Running in safe mode! Auto-reload is off.\n"));
} else if (!autoreload_is_enabled()) {
write_compressed(translate("Auto-reload is off.\n"));
serial_write_compressed(translate("Auto-reload is off.\n"));
}
}
#endif
@ -184,7 +179,7 @@ bool run_code_py(safe_mode_t safe_mode) {
bool found_main = false;
if (safe_mode != NO_SAFE_MODE) {
write_compressed(translate("Running in safe mode! Not running saved code.\n"));
serial_write_compressed(translate("Running in safe mode! Not running saved code.\n"));
} else {
new_status_color(MAIN_RUNNING);
@ -200,7 +195,7 @@ bool run_code_py(safe_mode_t safe_mode) {
if (!found_main){
found_main = maybe_run_list(double_extension_filenames, &result);
if (found_main) {
write_compressed(translate("WARNING: Your code filename has two extensions\n"));
serial_write_compressed(translate("WARNING: Your code filename has two extensions\n"));
}
}
stop_mp();
@ -239,37 +234,14 @@ bool run_code_py(safe_mode_t safe_mode) {
if (!serial_connected_at_start) {
if (autoreload_is_enabled()) {
write_compressed(translate("Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.\n"));
serial_write_compressed(translate("Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.\n"));
} else {
write_compressed(translate("Auto-reload is off.\n"));
serial_write_compressed(translate("Auto-reload is off.\n"));
}
}
// Output a user safe mode string if its set.
#ifdef BOARD_USER_SAFE_MODE
if (safe_mode == USER_SAFE_MODE) {
print_safe_mode_message(safe_mode);
serial_write("\n");
write_compressed(translate("You requested starting safe mode by "));
serial_write(BOARD_USER_SAFE_MODE_ACTION);
serial_write("\n");
write_compressed(translate("To exit, please reset the board without "));
serial_write(BOARD_USER_SAFE_MODE_ACTION);
serial_write("\n");
} else
#endif
if (safe_mode != NO_SAFE_MODE) {
serial_write("\n");
write_compressed(translate("You are running in safe mode which means something really bad happened.\n"));
if (safe_mode == HARD_CRASH) {
write_compressed(translate("Looks like our core CircuitPython code crashed hard. Whoops!\n"));
write_compressed(translate("Please file an issue here with the contents of your CIRCUITPY drive:\n"));
serial_write("https://github.com/adafruit/circuitpython/issues\n");
} else if (safe_mode == BROWNOUT) {
write_compressed(translate("The microcontroller's power dipped. Please make sure your power supply provides\n"));
write_compressed(translate("enough power for the whole circuit and press reset (after ejecting CIRCUITPY).\n"));
}
}
serial_write("\n");
write_compressed(translate("Press any key to enter the REPL. Use CTRL-D to reload."));
serial_write_compressed(translate("Press any key to enter the REPL. Use CTRL-D to reload."));
}
if (serial_connected_before_animation && !serial_connected()) {
serial_connected_at_start = false;
@ -394,6 +366,11 @@ int __attribute__((used)) main(void) {
init_status_leds();
rgb_led_status_init();
// Wait briefly to give a reset window where we'll enter safe mode after the reset.
if (safe_mode == NO_SAFE_MODE) {
safe_mode = wait_for_safe_mode_reset();
}
stack_init();
// Create a new filesystem only if we're not in a safe mode.
@ -427,7 +404,7 @@ int __attribute__((used)) main(void) {
}
if (exit_code == PYEXEC_FORCED_EXIT) {
if (!first_run) {
write_compressed(translate("soft reboot\n"));
serial_write_compressed(translate("soft reboot\n"));
}
first_run = false;
skip_repl = run_code_py(safe_mode);
@ -455,12 +432,12 @@ void gc_collect(void) {
}
void NORETURN nlr_jump_fail(void *val) {
HardFault_Handler();
reset_into_safe_mode(MICROPY_NLR_JUMP_FAIL);
while (true) {}
}
void NORETURN __fatal_error(const char *msg) {
HardFault_Handler();
reset_into_safe_mode(MICROPY_FATAL_ERROR);
while (true) {}
}

View File

@ -78,6 +78,7 @@ endif
SRC_C = \
main.c \
gccollect.c \
supervisor/stub/stack.c \
supervisor/shared/translate.c
# Add fmode when compiling with mingw gcc

View File

@ -2,9 +2,16 @@ SAMD21x18
=========
This port brings MicroPython to SAMD21x18 based development boards under the name
CircuitPython. Supported boards include the Adafruit CircuitPlayground Express,
Adafruit Feather M0 Express, Adafruit Metro M0 Express, Arduino Zero, Adafruit
Feather M0 Basic and Adafruit M0 Bluefruit LE.
CircuitPython. Supported boards include:
- Adafruit CircuitPlayground Express
- Adafruit Feather M0 Basic
- Adafruit Feather M0 Express
- Adafruit Metro M0 Express
- Adafruit M0 Bluefruit LE
- Arduino Zero
- Arduino MKR Zero
Pinout
------
@ -15,51 +22,51 @@ different names. The table below matches the pin order in
and omits the pins only available on the largest package because all supported
boards use smaller version.
===================== =============== =========================== ====================== ================ ================== ========================= ================ ================
===================== =================== =============== =========================== ====================== ================ ================== ========================= ================ ================
`microcontroller.pin` `board`
--------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Datasheet arduino_zero circuitplayground_express feather_m0_adalogger feather_m0_basic feather_m0_express gemma_m0 metro_m0_express trinket_m0
===================== =============== =========================== ====================== ================ ================== ========================= ================ ================
--------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Datasheet arduino_mkrzero arduino_zero circuitplayground_express feather_m0_adalogger feather_m0_basic feather_m0_express gemma_m0 metro_m0_express trinket_m0
===================== =================== =============== =========================== ====================== ================ ================== ========================= ================ ================
PA00 ``ACCELEROMETER_SDA`` ``APA102_MOSI`` ``APA102_MOSI``
PA01 ``ACCELEROMETER_SCL`` ``APA102_SCK`` ``APA102_SCK``
PA02 ``A0`` ``A0`` / ``SPEAKER`` ``A0`` ``A0`` ``A0`` ``A0`` / ``D1`` ``A0`` ``D1`` / ``A0``
PA02 ``A0`` ``A0`` ``A0`` / ``SPEAKER`` ``A0`` ``A0`` ``A0`` ``A0`` / ``D1`` ``A0`` ``D1`` / ``A0``
PA03
PB08 ``A1`` ``A7`` / ``TX`` ``A1`` ``A1`` ``A1`` ``A1``
PB09 ``A2`` ``A6`` / ``RX`` ``A2`` ``A2`` ``A2`` ``A2``
PA04 ``A3`` ``IR_PROXIMITY`` ``A3`` ``A3`` ``A3`` ``D0`` / ``TX`` / ``SDA`` ``A3``
PA05 ``A4`` ``A1`` ``A4`` ``A4`` ``A4`` ``D2`` / ``RX`` / ``SCL`` ``A4``
PA06 ``D8`` ``A2`` ``D8`` / ``GREEN_LED`` ``NEOPIXEL`` ``D8`` ``D4`` / ``TX``
PA07 ``D9`` ``A3`` ``D9`` ``D9`` ``D9`` ``D9`` ``D3`` / ``RX``
PA08 ``D4`` ``MICROPHONE_DO`` ``D4`` / ``SD_CS`` ``D4`` ``D0`` / ``SDA``
PA09 ``D3`` ``TEMPERATURE`` / ``A9`` ``D3`` ``D2`` / ``SCL``
PA10 ``D1`` / ``TX`` ``MICROPHONE_SCK`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D13``
PA11 ``D0`` / ``RX`` ``LIGHT`` / ``A8`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX``
PB10 ``MOSI`` ``MOSI`` ``MOSI`` ``MOSI`` ``MOSI``
PB11 ``SCK`` ``SCK`` ``SCK`` ``SCK`` ``SCK``
PA12 ``MISO`` ``REMOTEIN`` / ``IR_RX`` ``MISO`` ``MISO`` ``MISO`` ``MISO``
PA13 ``ACCELEROMETER_INTERRUPT`` ``FLASH_CS``
PA14 ``D2`` ``BUTTON_B`` / ``D5`` ``D2``
PA15 ``D5`` ``SLIDE_SWITCH`` / ``D7`` ``D5`` ``D5`` ``D5`` ``D5``
PA16 ``D11`` ``MISO`` ``D11`` ``D11`` ``D11`` ``D11``
PA17 ``D13`` ``D13`` ``D13`` / ``RED_LED`` ``D13`` ``D13`` ``D13``
PB08 ``L`` ``A1`` ``A7`` / ``TX`` ``A1`` ``A1`` ``A1`` ``A1``
PB09 ``BATTERY`` ``A2`` ``A6`` / ``RX`` ``A2`` ``A2`` ``A2`` ``A2``
PA04 ``A3`` ``A3`` ``IR_PROXIMITY`` ``A3`` ``A3`` ``A3`` ``D0`` / ``TX`` / ``SDA`` ``A3``
PA05 ``A4`` ``A4`` ``A1`` ``A4`` ``A4`` ``A4`` ``D2`` / ``RX`` / ``SCL`` ``A4``
PA06 ``A5`` ``D8`` ``A2`` ``D8`` / ``GREEN_LED`` ``NEOPIXEL`` ``D8`` ``D4`` / ``TX``
PA07 ``A6`` ``D9`` ``A3`` ``D9`` ``D9`` ``D9`` ``D9`` ``D3`` / ``RX``
PA08 ``D11`` / ``SDA`` ``D4`` ``MICROPHONE_DO`` ``D4`` / ``SD_CS`` ``D4`` ``D0`` / ``SDA``
PA09 ``D12`` / ``SCL`` ``D3`` ``TEMPERATURE`` / ``A9`` ``D3`` ``D2`` / ``SCL``
PA10 ``D2`` ``D1`` / ``TX`` ``MICROPHONE_SCK`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D13``
PA11 ``D3`` ``D0`` / ``RX`` ``LIGHT`` / ``A8`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX``
PB10 ``D4`` ``MOSI`` ``MOSI`` ``MOSI`` ``MOSI`` ``MOSI``
PB11 ``D5`` ``SCK`` ``SCK`` ``SCK`` ``SCK`` ``SCK``
PA12 ``SD_MOSI`` ``MISO`` ``REMOTEIN`` / ``IR_RX`` ``MISO`` ``MISO`` ``MISO`` ``MISO``
PA13 ``SD_SCK`` ``ACCELEROMETER_INTERRUPT`` ``FLASH_CS``
PA14 ``SD_CS`` ``D2`` ``BUTTON_B`` / ``D5`` ``D2``
PA15 ``SD_MISO`` ``D5`` ``SLIDE_SWITCH`` / ``D7`` ``D5`` ``D5`` ``D5`` ``D5``
PA16 ``D8`` / ``MOSI`` ``D11`` ``MISO`` ``D11`` ``D11`` ``D11`` ``D11``
PA17 ``D9`` / ``SCK`` ``D13`` ``D13`` ``D13`` / ``RED_LED`` ``D13`` ``D13`` ``D13``
PA18 ``D10`` ``D10`` ``D10`` ``D10`` ``D10``
PA19 ``D12`` ``D12`` ``D12`` ``D12`` ``D12``
PA20 ``D6`` ``MOSI`` ``D6`` ``D6`` ``D6`` ``D6``
PA21 ``D7`` ``SCK`` ``D7`` / ``SD_CD`` ``D7``
PA22 ``SDA`` ``SDA`` ``SDA`` ``SDA`` ``SDA``
PA23 ``SCL`` ``REMOTEOUT`` / ``IR_TX`` ``SCL`` ``SCL`` ``SCL`` ``L`` / ``D13`` ``SCL``
PA19 ``D10`` / ``MISO`` ``D12`` ``D12`` ``D12`` ``D12`` ``D12``
PA20 ``D6`` ``D6`` ``MOSI`` ``D6`` ``D6`` ``D6`` ``D6``
PA21 ``D7`` ``D7`` ``SCK`` ``D7`` / ``SD_CD`` ``D7``
PA22 ``D0`` ``SDA`` ``SDA`` ``SDA`` ``SDA`` ``SDA``
PA23 ``D1`` ``SCL`` ``REMOTEOUT`` / ``IR_TX`` ``SCL`` ``SCL`` ``SCL`` ``L`` / ``D13`` ``SCL``
PA24
PA25
PB22 ``FLASH_CS``
PB23 ``NEOPIXEL`` / ``D8``
PA27
PB22 ``D14`` / ``TX`` ``FLASH_CS``
PB23 ``D13`` / ``RX`` ``NEOPIXEL`` / ``D8``
PA27 ``SD_CD``
PA28 ``BUTTON_A`` / ``D4``
PA29
PA30 ``SPEAKER_ENABLE`` ``NEOPIXEL``
PA31
PB02 ``A5`` ``A5`` / ``SDA`` ``A5`` ``A5`` ``A5`` ``A5``
PB03 ``A4`` / ``SCL``
===================== =============== =========================== ====================== ================ ================== ========================= ================ ================
PB02 ``A1`` ``A5`` ``A5`` / ``SDA`` ``A5`` ``A5`` ``A5`` ``A5``
PB03 ``A2`` ``A4`` / ``SCL``
===================== =================== =============== =========================== ====================== ================ ================== ========================= ================ ================
Here is a table about which pins can do what in CircuitPython terms. However,
just because something is listed, doesn't mean it will always work. Existing use

View File

@ -29,22 +29,29 @@
#include "tick.h"
#include "supervisor/usb.h"
#include "py/runtime.h"
#include "shared-module/displayio/__init__.h"
#include "shared-module/network/__init__.h"
#include "supervisor/shared/stack.h"
volatile uint64_t last_finished_tick = 0;
bool stack_ok_so_far = true;
void run_background_tasks(void) {
assert_heap_ok();
#if (defined(SAMD21) && defined(PIN_PA02)) || defined(SAMD51)
audio_dma_background();
#endif
#ifdef CIRCUITPY_DISPLAYIO
displayio_refresh_display();
#endif
#if MICROPY_PY_NETWORK
network_module_background();
#endif
usb_background();
assert_heap_ok();
last_finished_tick = ticks_ms;
}

View File

@ -30,6 +30,7 @@
#include <stdbool.h>
void run_background_tasks(void);
void run_background_vm_tasks(void);
bool background_tasks_ok(void);
#endif // MICROPY_INCLUDED_ATMEL_SAMD_BACKGROUND_H

View File

@ -5,6 +5,8 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
#define MICROPY_HW_LED_STATUS (&pin_PB23)
#define CIRCUITPY_INTERNAL_NVM_SIZE 0
#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000)

View File

@ -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) {
}

View File

@ -0,0 +1,24 @@
#define MICROPY_HW_BOARD_NAME "Arduino MKR Zero"
#define MICROPY_HW_MCU_NAME "samd21g18"
#define MICROPY_PORT_A (0)
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
#define CIRCUITPY_INTERNAL_NVM_SIZE 0
#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000)
#define DEFAULT_I2C_BUS_SCL (&pin_PA09)
#define DEFAULT_I2C_BUS_SDA (&pin_PA08)
#define DEFAULT_SPI_BUS_SCK (&pin_PA17)
#define DEFAULT_SPI_BUS_MOSI (&pin_PA16)
#define DEFAULT_SPI_BUS_MISO (&pin_PA19)
#define DEFAULT_UART_BUS_RX (&pin_PB23)
#define DEFAULT_UART_BUS_TX (&pin_PB22)
// USB is always used internally so skip the pin objects for it.
#define IGNORE_PIN_PA24 1
#define IGNORE_PIN_PA25 1

View File

@ -0,0 +1,11 @@
LD_FILE = boards/samd21x18-bootloader.ld
USB_VID = 0x239A
USB_PID = 0x8035
USB_PRODUCT = "Arduino MKRZero"
USB_MANUFACTURER = "Arduino"
INTERNAL_FLASH_FILESYSTEM = 1
LONGINT_IMPL = NONE
CHIP_VARIANT = SAMD21G18A
CHIP_FAMILY = samd21

View File

@ -0,0 +1,47 @@
#include "shared-bindings/board/__init__.h"
#include "board_busses.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) },
{ MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PB02) },
{ MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB03) },
{ MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA04) },
{ MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA05) },
{ MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PA06) },
{ MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA22) },
{ MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA23) },
{ MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PA10) },
{ MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PA11) },
{ MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PB10) },
{ MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PB11) },
{ MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA20) },
{ MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PA21) },
{ MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PA16) },
{ MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PA16) },
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA17) },
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA17) },
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA19) },
{ MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA19) },
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA08) },
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA08) },
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA09) },
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA09) },
{ MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PB23) },
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB23) },
{ MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_PB22) },
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PB22) },
{ MP_ROM_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_PA13) },
{ MP_ROM_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_PA12) },
{ MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_PA15) },
{ MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_PA14) },
{ MP_ROM_QSTR(MP_QSTR_SD_CD), MP_ROM_PTR(&pin_PA27) },
{ MP_ROM_QSTR(MP_QSTR_L), MP_ROM_PTR(&pin_PB08) },
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_PB09) },
{ MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PB09) },
{ 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);

View File

@ -1,7 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Arduino Zero"
#define MICROPY_HW_MCU_NAME "samd21g18"
// #define MICROPY_HW_LED_MSC &pin_PA17 // red
#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_LED_TX &pin_PA27
#define MICROPY_HW_LED_RX &pin_PB03

View File

@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit CircuitPlayground Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
#define MICROPY_HW_LED_STATUS (&pin_PA17)
// Don't allow touch on A0 (PA02), because it's connected to the speaker.
#define PA02_NO_TOUCH (true)

View File

@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit CircuitPlayground Express with Crickit libraries"
#define MICROPY_HW_MCU_NAME "samd21g18"
#define MICROPY_HW_LED_STATUS (&pin_PA17)
// No framebuf on CRICKit version to save space.
#define MICROPY_PY_FRAMEBUF (0)

View File

@ -1,5 +1,6 @@
// LEDs
//#define MICROPY_HW_LED_MSC PIN_PA17 // red
#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 Adalogger"
#define MICROPY_HW_MCU_NAME "samd21g18"

View File

@ -1,5 +1,5 @@
// LEDs
//#define MICROPY_HW_LED_MSC PIN_PA17 // red
#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 Basic"
#define MICROPY_HW_MCU_NAME "samd21g18"

View File

@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_NEOPIXEL (&pin_PA06)
#define SPI_FLASH_MOSI_PIN &pin_PA08

View File

@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 Express with Crickit libraries"
#define MICROPY_HW_MCU_NAME "samd21g18"
#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_NEOPIXEL (&pin_PA06)
#define SPI_FLASH_MOSI_PIN &pin_PA08

View File

@ -1,5 +1,5 @@
// LEDs
//#define MICROPY_HW_LED_MSC PIN_PA17 // red
#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 RFM69"
#define MICROPY_HW_MCU_NAME "samd21g18"

View File

@ -1,5 +1,5 @@
// LEDs
//#define MICROPY_HW_LED_MSC PIN_PA17 // red
#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 RFM9x"
#define MICROPY_HW_MCU_NAME "samd21g18"

View File

@ -3,6 +3,8 @@
#define MICROPY_HW_BOARD_NAME "Hacked Feather M0 Express with 8Mbyte SPI flash"
#define MICROPY_HW_MCU_NAME "samd21g18"
#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_NEOPIXEL (&pin_PA06)
#define SPI_FLASH_MOSI_PIN &pin_PA08

View File

@ -5,6 +5,7 @@
// Rev E
#define MICROPY_HW_LED_STATUS (&pin_PA23)
#define MICROPY_HW_NEOPIXEL (&pin_PB03)
// These are pins not to reset.

View File

@ -1,6 +1,7 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Feather RadioFruit Zigbee"
#define MICROPY_HW_MCU_NAME "samr21g18"
#define MICROPY_HW_LED_STATUS (&pin_PA27)
#define MICROPY_HW_NEOPIXEL (&pin_PA22)
#define SPI_FLASH_MOSI_PIN &pin_PA31

View File

@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Gemma M0"
#define MICROPY_HW_MCU_NAME "samd21e18"
#define MICROPY_HW_LED_STATUS (&pin_PA23)
#define MICROPY_HW_APA102_MOSI (&pin_PA00)
#define MICROPY_HW_APA102_SCK (&pin_PA01)

View File

@ -5,6 +5,8 @@
// This is for Rev B which is green and has the SD card slot at the edge of the board.
#define MICROPY_HW_LED_STATUS (&pin_PB01)
#define MICROPY_HW_LED_TX &(pin_PC30)
#define MICROPY_HW_LED_RX &(pin_PC31)

View File

@ -1,6 +1,7 @@
#define MICROPY_HW_BOARD_NAME "HalloWing M0 Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
#define MICROPY_HW_LED_STATUS (&pin_PA23)
#define MICROPY_HW_NEOPIXEL (&pin_PA12)
#define SPI_FLASH_MOSI_PIN &pin_PB10

View File

@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit ItsyBitsy M0 Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define CIRCUITPY_BITBANG_APA102
#define MICROPY_HW_APA102_MOSI (&pin_PA01)
#define MICROPY_HW_APA102_SCK (&pin_PA00)

View File

@ -4,6 +4,8 @@
#define CIRCUITPY_MCU_FAMILY samd51
// This is for Rev B
#define MICROPY_HW_LED_STATUS (&pin_PA22)
#define MICROPY_HW_APA102_MOSI (&pin_PB03)
#define MICROPY_HW_APA102_SCK (&pin_PB02)

View File

@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Meow Meow"
#define MICROPY_HW_MCU_NAME "samd21g18"
#define MICROPY_HW_LED_STATUS (&pin_PB23)
// These are pins not to reset.
#define MICROPY_PORT_A (0)
#define MICROPY_PORT_B (0)

View File

@ -1,6 +1,7 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Metro M0 Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_LED_TX &pin_PA27
// Comment this out if you have trouble connecting over SWD. It's one of the SWD pins.
#define MICROPY_HW_LED_RX &pin_PA31

View File

@ -8,6 +8,8 @@
#define MICROPY_HW_LED_TX (&pin_PA27)
#define MICROPY_HW_LED_RX (&pin_PB06)
#define MICROPY_HW_LED_STATUS (&pin_PA16)
#define MICROPY_HW_NEOPIXEL (&pin_PB22)
// These are pins not to reset.

View File

@ -3,6 +3,8 @@
#define CIRCUITPY_MCU_FAMILY samd51
#define MICROPY_HW_LED_STATUS (&pin_PA15)
// RGB Status LED Pins
#define MICROPY_HW_APA102_MOSI (&pin_PB03)
#define MICROPY_HW_APA102_SCK (&pin_PB02)

View File

@ -2,6 +2,8 @@
#define MICROPY_HW_MCU_NAME "samd21e18"
// Rev B - Black
#define MICROPY_HW_LED_STATUS (&pin_PA10)
#define MICROPY_HW_APA102_MOSI (&pin_PA00)
#define MICROPY_HW_APA102_SCK (&pin_PA01)

View File

@ -2,6 +2,7 @@
#define MICROPY_HW_MCU_NAME "samd21e18"
// Rev B - Black
#define MICROPY_HW_LED_STATUS (&pin_PA10)
// #define MICROPY_HW_APA102_MOSI (&pin_PA00)
// #define MICROPY_HW_APA102_SCK (&pin_PA01)

View File

@ -28,6 +28,8 @@
#include "hal_flash.h"
#include "supervisor/shared/stack.h"
#include <stdint.h>
#include <string.h>
@ -42,6 +44,7 @@ bool common_hal_nvm_bytearray_set_bytes(nvm_bytearray_obj_t *self,
struct flash_descriptor desc;
desc.dev.hw = NVMCTRL;
flash_write(&desc, (uint32_t) self->start_address + start_index, values, len);
assert_heap_ok();
return true;
}

View File

@ -182,7 +182,7 @@ typedef long mp_off_t;
#define MICROPY_PY_SYS_PLATFORM "MicroChip SAMD51"
#define PORT_HEAP_SIZE (0x20000) // 128KiB
#define SPI_FLASH_MAX_BAUDRATE 24000000
#define CIRCUITPY_DEFAULT_STACK_SIZE 8192
#define CIRCUITPY_DEFAULT_STACK_SIZE 0x6000
#define MICROPY_CPYTHON_COMPAT (1)
#define MICROPY_MODULE_WEAK_LINKS (1)
#define MICROPY_PY_BUILTINS_NOTIMPLEMENTED (1)
@ -432,10 +432,6 @@ extern const struct _mp_obj_module_t wiznet_module;
#define MP_STATE_PORT MP_STATE_VM
void run_background_tasks(void);
#define MICROPY_VM_HOOK_LOOP run_background_tasks();
#define MICROPY_VM_HOOK_RETURN run_background_tasks();
#include "peripherals/samd/dma.h"
#include "supervisor/flash_root_pointers.h"
@ -454,6 +450,9 @@ void run_background_tasks(void);
mp_obj_t gamepad_singleton; \
NETWORK_ROOT_POINTERS \
void run_background_tasks(void);
#define MICROPY_VM_HOOK_LOOP run_background_tasks();
#define MICROPY_VM_HOOK_RETURN run_background_tasks();
#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
#define CIRCUITPY_BOOT_OUTPUT_FILE "/boot_out.txt"

View File

@ -64,6 +64,9 @@
#include "reset.h"
#include "tick.h"
#include "supervisor/shared/safe_mode.h"
#include "supervisor/shared/stack.h"
#include "tusb.h"
#ifdef CIRCUITPY_GAMEPAD_TICKS
@ -80,7 +83,7 @@ extern volatile bool mp_msc_enabled;
#define TRACE_BUFFER_SIZE (1 << (TRACE_BUFFER_MAGNITUDE_PACKETS + 1))
// Size in bytes. 4 bytes per uint32_t.
#define TRACE_BUFFER_SIZE_BYTES (TRACE_BUFFER_SIZE << 2)
__attribute__((__aligned__(TRACE_BUFFER_SIZE_BYTES))) uint32_t mtb[TRACE_BUFFER_SIZE];
__attribute__((__aligned__(TRACE_BUFFER_SIZE_BYTES))) uint32_t mtb[TRACE_BUFFER_SIZE] = {0};
#endif
safe_mode_t port_init(void) {
@ -153,35 +156,6 @@ safe_mode_t port_init(void) {
samd_peripherals_enable_cache();
#endif
// On power on start or external reset, set _ezero to the canary word. If it
// gets killed, we boot in safe mode. _ezero is the boundary between statically
// allocated memory including the fixed MicroPython heap and the stack. If either
// misbehaves, the canary will not be intact after soft reset.
#ifdef CIRCUITPY_CANARY_WORD
#ifdef SAMD21
bool power_on_or_external_reset = hri_pm_get_RCAUSE_POR_bit(PM) || hri_pm_get_RCAUSE_EXT_bit(PM);
bool system_reset = hri_pm_get_RCAUSE_SYST_bit(PM);
#endif
#ifdef SAMD51
bool power_on_or_external_reset = hri_rstc_get_RCAUSE_POR_bit(RSTC) || hri_rstc_get_RCAUSE_EXT_bit(RSTC);
bool system_reset = hri_rstc_get_RCAUSE_SYST_bit(RSTC);
#endif
if (power_on_or_external_reset) {
_ezero = CIRCUITPY_CANARY_WORD;
} else if (system_reset) {
// If we're starting from a system reset we're likely coming from the
// bootloader or hard fault handler. If we're coming from the handler
// the canary will be CIRCUITPY_SAFE_RESTART_WORD and we don't want to
// revive the canary so that a second hard fault won't restart. Resets
// from anywhere else are ok.
if (_ezero == CIRCUITPY_SAFE_RESTART_WORD) {
_ezero = ~CIRCUITPY_CANARY_WORD;
} else {
_ezero = CIRCUITPY_CANARY_WORD;
}
}
#endif
#ifdef SAMD21
hri_nvmctrl_set_CTRLB_RWS_bf(NVMCTRL, 2);
_pm_init();
@ -200,13 +174,6 @@ safe_mode_t port_init(void) {
// Init the board last so everything else is ready
board_init();
#ifdef CIRCUITPY_CANARY_WORD
// Run in safe mode if the canary is corrupt.
if (_ezero != CIRCUITPY_CANARY_WORD) {
return HARD_CRASH;
}
#endif
#ifdef SAMD21
if (PM->RCAUSE.bit.BOD33 == 1 || PM->RCAUSE.bit.BOD12 == 1) {
return BROWNOUT;
@ -280,15 +247,33 @@ void reset_to_bootloader(void) {
reset();
}
void reset_cpu(void) {
reset();
}
extern uint32_t _ebss;
// Place the word to save just after our BSS section that gets blanked.
void port_set_saved_word(uint32_t value) {
_ebss = value;
}
uint32_t port_get_saved_word(void) {
return _ebss;
}
/**
* \brief Default interrupt handler for unused IRQs.
*/
__attribute__((used)) void HardFault_Handler(void)
{
#ifdef ENABLE_MICRO_TRACE_BUFFER
// Turn off the micro trace buffer so we don't fill it up in the infinite
// loop below.
REG_MTB_MASTER = 0x00000000 + 6;
#endif
reset_into_safe_mode(HARD_CRASH);
while (true) {
asm("");
}
for (uint32_t i = 0; i < 100000; i++) {
asm("noop;");
asm("nop;");
}
}

View File

@ -97,6 +97,7 @@ SRC_C = \
posix_helpers.c \
hspi.c \
boards/$(BOARD)/pins.c \
supervisor/stub/stack.c \
supervisor/shared/translate.c \
$(SRC_MOD)

View File

@ -28,8 +28,11 @@
#include "supervisor/usb.h"
#endif
#include "supervisor/shared/stack.h"
void run_background_tasks(void) {
#ifdef NRF52840
usb_background();
#endif
assert_heap_ok();
}

View File

@ -28,6 +28,8 @@
#define MICROPY_HW_MCU_NAME "nRF52832"
#define MICROPY_PY_SYS_PLATFORM "nRF52"
#define MICROPY_HW_LED_STATUS (&pin_P0_17)
#define MICROPY_HW_UART_RX NRF_GPIO_PIN_MAP(0, 8)
#define MICROPY_HW_UART_TX NRF_GPIO_PIN_MAP(0, 6)

View File

@ -35,6 +35,8 @@
#define MICROPY_HW_NEOPIXEL (&pin_P0_16)
#define MICROPY_HW_LED_STATUS (&pin_P1_15)
#ifdef QSPI_FLASH_FILESYSTEM
#define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(0, 17)
#define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(0, 22)

View File

@ -33,6 +33,8 @@
#define MICROPY_HW_MCU_NAME "nRF52840"
#define MICROPY_PY_SYS_PLATFORM "Particle Argon"
#define MICROPY_HW_LED_STATUS (&pin_P1_12)
#define MICROPY_HW_RGB_LED_RED (&pin_P0_13)
#define MICROPY_HW_RGB_LED_GREEN (&pin_P0_14)
#define MICROPY_HW_RGB_LED_BLUE (&pin_P0_15)

View File

@ -33,6 +33,8 @@
#define MICROPY_HW_MCU_NAME "nRF52840"
#define MICROPY_PY_SYS_PLATFORM "Particle Boron"
#define MICROPY_HW_LED_STATUS (&pin_P1_12)
#define MICROPY_HW_RGB_LED_RED (&pin_P0_13)
#define MICROPY_HW_RGB_LED_GREEN (&pin_P0_14)
#define MICROPY_HW_RGB_LED_BLUE (&pin_P0_15)

View File

@ -33,6 +33,8 @@
#define MICROPY_HW_MCU_NAME "nRF52840"
#define MICROPY_PY_SYS_PLATFORM "Particle Xenon"
#define MICROPY_HW_LED_STATUS (&pin_P1_12)
#define MICROPY_HW_RGB_LED_RED (&pin_P0_13)
#define MICROPY_HW_RGB_LED_GREEN (&pin_P0_14)
#define MICROPY_HW_RGB_LED_BLUE (&pin_P0_15)

View File

@ -29,6 +29,8 @@
#define MICROPY_HW_MCU_NAME "nRF52832"
#define MICROPY_PY_SYS_PLATFORM "nRF52-DK"
#define MICROPY_HW_LED_STATUS (&pin_P0_17)
#define MICROPY_HW_UART_RX NRF_GPIO_PIN_MAP(0, 8)
#define MICROPY_HW_UART_TX NRF_GPIO_PIN_MAP(0, 6)
#define MICROPY_HW_UART_HWFC (0)

View File

@ -21,9 +21,13 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_P0_15), MP_ROM_PTR(&pin_P0_15) },
{ MP_ROM_QSTR(MP_QSTR_P0_16), MP_ROM_PTR(&pin_P0_16) },
{ MP_ROM_QSTR(MP_QSTR_P0_17), MP_ROM_PTR(&pin_P0_17) },
{ MP_ROM_QSTR(MP_QSTR_LED1), MP_ROM_PTR(&pin_P0_17) },
{ MP_ROM_QSTR(MP_QSTR_P0_18), MP_ROM_PTR(&pin_P0_18) },
{ MP_ROM_QSTR(MP_QSTR_LED2), MP_ROM_PTR(&pin_P0_18) },
{ MP_ROM_QSTR(MP_QSTR_P0_19), MP_ROM_PTR(&pin_P0_19) },
{ MP_ROM_QSTR(MP_QSTR_LED3), MP_ROM_PTR(&pin_P0_19) },
{ MP_ROM_QSTR(MP_QSTR_P0_20), MP_ROM_PTR(&pin_P0_20) },
{ MP_ROM_QSTR(MP_QSTR_LED4), MP_ROM_PTR(&pin_P0_20) },
{ MP_ROM_QSTR(MP_QSTR_P0_21), MP_ROM_PTR(&pin_P0_21) },
{ MP_ROM_QSTR(MP_QSTR_P0_22), MP_ROM_PTR(&pin_P0_22) },
{ MP_ROM_QSTR(MP_QSTR_P0_23), MP_ROM_PTR(&pin_P0_23) },

View File

@ -33,6 +33,8 @@
#define PORT_HEAP_SIZE (128 * 1024)
#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
#define MICROPY_HW_LED_STATUS (&pin_P0_13)
#define DEFAULT_I2C_BUS_SCL (&pin_P0_27)
#define DEFAULT_I2C_BUS_SDA (&pin_P0_26)

View File

@ -28,5 +28,7 @@
#define MICROPY_HW_MCU_NAME "nRF52840"
#define MICROPY_PY_SYS_PLATFORM "nRF52840-DK"
#define MICROPY_HW_LED_STATUS (&pin_P0_06)
#define PORT_HEAP_SIZE (128 * 1024)
#define CIRCUITPY_AUTORELOAD_DELAY_MS 500

View File

@ -0,0 +1,48 @@
# SparkFun Pro nRF52840 Mini Breakout
The [SparkFun Pro nRF52840 Mini](https://www.sparkfun.com/products/15025) small breakout board for Raytac's MDBT50Q-P1M module, which features an nRF52840. It breaks out as many pins as it can in an Arduino Pro Mini footprint. Also included on the board are a qwiic (I<sup>2</sup>C) connector, LiPo battery charger, and on/off switch.
Note: the SparkFun Pro nRF52840 Mini Breakout does not include a QSPI external flash. Any Python code will need to be stored on the internal flash filesystem.
## CircuitPython Pin Defs
CircuitPython pin definitions try to follow those of the [Arduino Pro Mini](https://www.sparkfun.com/products/11113), which the footprint is based on.
This can be somewhat confusing, especially around the analog pins. Here's a quick pin-map:
<table>
<tr><th>Board pin label</th><th>Digital Pin Reference</th><th>Additional Pin Capabilities</th><th>Pin/Port Reference</th></tr>
<tr><td>17</td><td>D1</td><td>TX</td><td>P0_17</td></tr>
<tr><td>15</td><td>D0</td><td>RX</td><td>P0_15</td></tr>
<tr><td>8</td><td></td><td>SDA</td><td>P0_08</td></tr>
<tr><td>11</td><td></td><td>SCL</td><td>P0_11</td></tr>
<tr><td>19</td><td>D3</td><td></td><td>P0_19</td></tr>
<tr><td>20</td><td>D4</td><td></td><td>P0_20</td></tr>
<tr><td>21</td><td>D5</td><td></td><td>P0_21</td></tr>
<tr><td>22</td><td>D6</td><td></td><td>P0_22</td></tr>
<tr><td>23</td><td>D7</td><td></td><td>P0_23</td></tr>
<tr><td>9</td><td>D8</td><td></td><td>P0_09</td></tr>
<tr><td>10</td><td>D9</td><td></td><td>P0_10</td></tr>
<tr><td>2</td><td>D10</td><td>A0</td><td>P0_02</td></tr>
<tr><td>3</td><td>D11</td><td>MOSI, A1</td><td>P0_03</td></tr>
<tr><td>31</td><td>D12</td><td>MISO, A7</td><td>P0_31</td></tr>
<tr><td>30</td><td>D13</td><td>SCK, A6</td><td>P0_31</td></tr>
<tr><td>29</td><td></td><td>A5</td><td>P0_29</td></tr>
<tr><td>28</td><td></td><td>A4</td><td>P0_28</td></tr>
<tr><td>5</td><td></td><td>A3</td><td>P0_05</td></tr>
<tr><td>4</td><td></td><td>A2</td><td>P0_04</td></tr>
</table>
If a pin isn't defined as D0, D1, etc., standard port/pin references should work -- e.g. `P0_17` is pin 17, `P0_02` is pin 2, etc.
## Bootloader Notes
The nRF52840 Mini ships with a slightly modified (i.e pin defs and USB defs) version of the Adafruit nRF52 bootloader, which supports UF2 and CDC bootloading.
## Hardware Reference
The nRF52840 Mini hardware layout is open source:
* [Schematic](https://cdn.sparkfun.com/assets/learn_tutorials/8/2/0/nrf52840-breakout-mdbt50q-v10.pdf)
* [Eagle Files](https://cdn.sparkfun.com/assets/learn_tutorials/8/2/0/nrf52840-breakout-mdbt50q-v10.zip)
* [Hookup Guide](https://learn.sparkfun.com/tutorials/sparkfun-pro-nrf52840-mini-hookup-guide)

View File

@ -0,0 +1,38 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "boards/board.h"
void board_init(void) {
}
bool board_requests_safe_mode(void) {
return false;
}
void reset_board(void) {
}

View File

@ -0,0 +1,68 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2016 Glenn Ruben Bakke
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "nrfx/hal/nrf_gpio.h"
#define MICROPY_HW_BOARD_NAME "SparkFun Pro nRF52840 Mini"
#define MICROPY_HW_MCU_NAME "nRF52840"
#define MICROPY_PY_SYS_PLATFORM "SFE_NRF52840_Mini"
#define PORT_HEAP_SIZE (128 * 1024)
#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
#define DEFAULT_I2C_BUS_SCL (&pin_P0_11)
#define DEFAULT_I2C_BUS_SDA (&pin_P0_08)
#define DEFAULT_SPI_BUS_SCK (&pin_P0_30)
#define DEFAULT_SPI_BUS_MOSI (&pin_P0_03)
#define DEFAULT_SPI_BUS_MISO (&pin_P0_31)
#define DEFAULT_UART_BUS_RX (&pin_P0_15)
#define DEFAULT_UART_BUS_TX (&pin_P0_17)
/* Note: Flash chip is not provided on SparkFun nRF52840 Mini.
* Leaving this as a reminder for future/similar versions of the board. */
// Flash operation mode is determined by MICROPY_QSPI_DATAn pin configuration.
// A pin config is valid if it is defined and its value is not 0xFF.
// Quad mode: If all DATA0 --> DATA3 are valid
// Dual mode: If DATA0 and DATA1 are valid while either DATA2 and/or DATA3 are invalid
// Single mode: If only DATA0 is valid
/*#ifdef QSPI_FLASH_FILESYSTEM
#define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(0, 20)
#define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(0, 21)
#define MICROPY_QSPI_DATA2 NRF_GPIO_PIN_MAP(0, 22)
#define MICROPY_QSPI_DATA3 NRF_GPIO_PIN_MAP(0, 23)
#define MICROPY_QSPI_SCK NRF_GPIO_PIN_MAP(0, 19)
#define MICROPY_QSPI_CS NRF_GPIO_PIN_MAP(0, 17)
#endif
#ifdef SPI_FLASH_FILESYSTEM
#define SPI_FLASH_MOSI_PIN &pin_P0_20
#define SPI_FLASH_MISO_PIN &pin_P0_21
#define SPI_FLASH_SCK_PIN &pin_P0_19
#define SPI_FLASH_CS_PIN &pin_P0_17
#endif*/

View File

@ -0,0 +1,25 @@
USB_VID = 0x1B4F
USB_PID = 0x5289
USB_PRODUCT = "SFE_nRF52840_Mini"
USB_MANUFACTURER = "SparkFun Electronics"
MCU_SERIES = m4
MCU_VARIANT = nrf52
MCU_SUB_VARIANT = nrf52840
MCU_CHIP = nrf52840
SD ?= s140
SOFTDEV_VERSION ?= 6.1.0
BOOT_SETTING_ADDR = 0xFF000
ifeq ($(SD),)
LD_FILE = boards/nrf52840_1M_256k.ld
else
LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
endif
NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
QSPI_FLASH_FILESYSTEM = 0
EXTERNAL_FLASH_DEVICE_COUNT = 0
EXTERNAL_FLASH_DEVICES =

View File

@ -0,0 +1,55 @@
#include "shared-bindings/board/__init__.h"
#include "board_busses.h"
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_P1_15) }, // D1/TX
{ MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_P0_17) }, // D0/RX
// D2 on qwiic gap
{ MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_P0_19) }, // D3
{ MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_P0_20) }, // D4
{ MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_P0_21) }, // D5
{ MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_P0_22) }, // D6
{ MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_P0_23) }, // D7
{ MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_P0_09) }, // D8
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_P0_10) }, // D9
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_P0_02) }, // D10
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_P0_03) }, // D11
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_P0_31) }, // D12
{ MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_P0_30) }, // D13
{ MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_P0_29) }, // D14
{ MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_P0_28) }, // D15
{ MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_P0_05) }, // D16
{ MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_P0_04) }, // D17
{ MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_P0_02) }, // A0
{ MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_P0_03) }, // A1
{ MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_P0_04) }, // A2
{ MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_P0_05) }, // A3
{ MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_P0_28) }, // A4
{ MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_P0_29) }, // A5
{ MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_P0_30) }, // A6
{ MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_P0_31) }, // A7
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_P0_08) }, // 8 - SDA
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_P0_11) }, // 11 - SCL
{ MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_P0_31) }, // 31 - MISO
{ MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_P0_03) }, // 3 - MOSI
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_P0_30) }, // 30 - SCK
{ MP_ROM_QSTR(MP_QSTR_LED1), MP_ROM_PTR(&pin_P0_07) }, // 7 - Blue LED
{ MP_ROM_QSTR(MP_QSTR_BUTTON1), MP_ROM_PTR(&pin_P0_13) }, // 13 - Button
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_P0_15) }, // 15 - UART RX
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_P0_17) }, // 17 - UART TX
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
{ MP_ROM_QSTR(MP_QSTR_QWIIC), MP_ROM_PTR(&board_i2c_obj) },
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
};
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);

View File

@ -52,21 +52,44 @@
static uint32_t get_nrf_baud (uint32_t baudrate);
static uint16_t ringbuf_count(ringbuf_t *r)
{
volatile int count = r->iput - r->iget;
if ( count < 0 ) {
count += r->size;
}
return (uint16_t) count;
}
static void ringbuf_clear(ringbuf_t *r)
{
r->iput = r->iget = 0;
}
static void uart_callback_irq (const nrfx_uarte_event_t * event, void * context) {
busio_uart_obj_t* self = (busio_uart_obj_t*) context;
switch ( event->type ) {
case NRFX_UARTE_EVT_RX_DONE:
self->rx_count = event->data.rxtx.bytes;
for(uint8_t i=0; i < event->data.rxtx.bytes; i++) {
if ( ringbuf_put(&self->rbuf, event->data.rxtx.p_data[i]) < 0 ) {
// if full overwrite old data
(void) ringbuf_get(&self->rbuf);
ringbuf_put(&self->rbuf, event->data.rxtx.p_data[i]);
}
}
// keep receiving
_VERIFY_ERR(nrfx_uarte_rx(&self->uarte, &self->rx_char, 1));
break;
case NRFX_UARTE_EVT_TX_DONE:
// nothing to do
break;
case NRFX_UARTE_EVT_ERROR:
if ( self->rx_count == -1 ) {
self->rx_count = 0;
}
// Handle error
break;
default:
@ -110,12 +133,15 @@ void common_hal_busio_uart_construct (busio_uart_obj_t *self,
// Init buffer for rx
if ( rx != mp_const_none ) {
self->buffer = (uint8_t *) gc_alloc(receiver_buffer_size, false, false);
if ( !self->buffer ) {
self->rbuf.buf = (uint8_t *) gc_alloc(receiver_buffer_size, false, false);
if ( !self->rbuf.buf ) {
nrfx_uarte_uninit(&self->uarte);
mp_raise_msg(&mp_type_MemoryError, translate("Failed to allocate RX buffer"));
}
self->bufsize = receiver_buffer_size;
self->rbuf.size = receiver_buffer_size;
self->rbuf.iget = self->rbuf.iput = 0;
self->rx_pin_number = rx->number;
claim_pin(rx);
@ -131,9 +157,8 @@ void common_hal_busio_uart_construct (busio_uart_obj_t *self,
self->baudrate = baudrate;
self->timeout_ms = timeout * 1000;
// queue 1-byte transfer for rx_characters_available()
self->rx_count = -1;
_VERIFY_ERR(nrfx_uarte_rx(&self->uarte, self->buffer, 1));
// Initial wait for incoming byte
_VERIFY_ERR(nrfx_uarte_rx(&self->uarte, &self->rx_char, 1));
}
bool common_hal_busio_uart_deinited(busio_uart_obj_t *self) {
@ -147,7 +172,10 @@ void common_hal_busio_uart_deinit(busio_uart_obj_t *self) {
reset_pin_number(self->rx_pin_number);
self->tx_pin_number = NO_PIN;
self->rx_pin_number = NO_PIN;
gc_free(self->buffer);
gc_free(self->rbuf.buf);
self->rbuf.size = 0;
self->rbuf.iput = self->rbuf.iget = 0;
}
}
@ -157,12 +185,11 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t
mp_raise_ValueError(translate("No RX pin"));
}
size_t remain = len;
size_t rx_bytes = 0;
uint64_t start_ticks = ticks_ms;
while ( 1 ) {
// Wait for on-going transfer to complete
while ( (self->rx_count == -1) && (ticks_ms - start_ticks < self->timeout_ms) ) {
// Wait for all bytes received or timeout
while ( (ringbuf_count(&self->rbuf) < len) && (ticks_ms - start_ticks < self->timeout_ms) ) {
#ifdef MICROPY_VM_HOOK_LOOP
MICROPY_VM_HOOK_LOOP ;
// Allow user to break out of a timeout with a KeyboardInterrupt.
@ -172,33 +199,19 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t
#endif
}
// prevent conflict with uart irq
NVIC_DisableIRQ(nrfx_get_irq_number(self->uarte.p_reg));
// copy received data
if ( self->rx_count > 0 ) {
memcpy(data, self->buffer, self->rx_count);
data += self->rx_count;
remain -= self->rx_count;
self->rx_count = 0;
rx_bytes = ringbuf_count(&self->rbuf);
rx_bytes = MIN(rx_bytes, len);
for ( uint16_t i = 0; i < rx_bytes; i++ ) {
data[i] = ringbuf_get(&self->rbuf);
}
// exit if complete or time up
if ( !remain || !(ticks_ms - start_ticks < self->timeout_ms) ) {
break;
}
NVIC_EnableIRQ(nrfx_get_irq_number(self->uarte.p_reg));
// prepare next receiving
const size_t cnt = MIN(self->bufsize, remain);
self->rx_count = -1;
_VERIFY_ERR(nrfx_uarte_rx(&self->uarte, self->buffer, cnt));
}
// queue 1-byte transfer for rx_characters_available()
if ( self->rx_count == 0 ) {
self->rx_count = -1;
_VERIFY_ERR(nrfx_uarte_rx(&self->uarte, self->buffer, 1));
}
return len - remain;
return rx_bytes;
}
// Write characters.
@ -258,15 +271,14 @@ void common_hal_busio_uart_set_baudrate(busio_uart_obj_t *self, uint32_t baudrat
}
uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self) {
return (self->rx_count > 0) ? self->rx_count : 0;
return ringbuf_count(&self->rbuf);
}
void common_hal_busio_uart_clear_rx_buffer(busio_uart_obj_t *self) {
// Discard received byte, and queue 1-byte transfer for rx_characters_available()
if ( self->rx_count > 0 ) {
self->rx_count = -1;
_VERIFY_ERR(nrfx_uarte_rx(&self->uarte, self->buffer, 1));
}
// prevent conflict with uart irq
NVIC_DisableIRQ(nrfx_get_irq_number(self->uarte.p_reg));
ringbuf_clear(&self->rbuf);
NVIC_EnableIRQ(nrfx_get_irq_number(self->uarte.p_reg));
}
bool common_hal_busio_uart_ready_to_tx(busio_uart_obj_t *self) {

View File

@ -41,9 +41,8 @@ typedef struct {
uint32_t baudrate;
uint32_t timeout_ms;
uint8_t* buffer;
uint32_t bufsize;
volatile int32_t rx_count;
ringbuf_t rbuf;
uint8_t rx_char; // EasyDMA buf
uint8_t tx_pin_number;
uint8_t rx_pin_number;

View File

@ -28,6 +28,8 @@
#include "shared-bindings/neopixel_write/__init__.h"
#include "nrf_pwm.h"
#include "tick.h"
// https://github.com/adafruit/Adafruit_NeoPixel/blob/master/Adafruit_NeoPixel.cpp
// [[[Begin of the Neopixel NRF52 EasyDMA implementation
// by the Hackerspace San Salvador]]]
@ -95,6 +97,9 @@ static NRF_PWM_Type* find_free_pwm (void) {
return NULL;
}
uint64_t next_start_tick_ms = 0;
uint32_t next_start_tick_us = 1000;
void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout, uint8_t *pixels, uint32_t numBytes) {
// To support both the SoftDevice + Neopixels we use the EasyDMA
// feature from the NRF25. However this technique implies to
@ -117,7 +122,7 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
// only malloc if there is PWM device available
if ( pwm != NULL ) {
if (numBytes == 4) {
if (pattern_size <= sizeof(one_pixel) * sizeof(uint32_t)) {
pixels_pattern = (uint16_t *) one_pixel;
} else {
pixels_pattern = (uint16_t *) m_malloc_maybe(pattern_size, false);
@ -125,6 +130,9 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
}
}
// Wait to make sure we don't append onto the last transmission.
wait_until(next_start_tick_ms, next_start_tick_us);
// Use the identified device to choose the implementation
// If a PWM device is available use DMA
if ( (pixels_pattern != NULL) && (pwm != NULL) ) {
@ -140,8 +148,8 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
}
// Zero padding to indicate the end of sequence
pixels_pattern[++pos] = 0 | (0x8000); // Seq end
pixels_pattern[++pos] = 0 | (0x8000); // Seq end
pixels_pattern[pos++] = 0 | (0x8000); // Seq end
pixels_pattern[pos++] = 0 | (0x8000); // Seq end
// Set the wave mode to count UP
// Set the PWM to use the 16MHz clock
@ -274,4 +282,13 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
// Enable interrupts again
__enable_irq();
}
// Update the next start.
current_tick(&next_start_tick_ms, &next_start_tick_us);
if (next_start_tick_us < 100) {
next_start_tick_ms += 1;
next_start_tick_us = 100 - next_start_tick_us;
} else {
next_start_tick_us -= 100;
}
}

View File

@ -74,16 +74,16 @@
#define mp_builtin_open_obj mp_vfs_open_obj
#endif
#define MICROPY_CPYTHON_COMPAT (0)
#define MICROPY_CPYTHON_COMPAT (1)
#define MICROPY_STREAMS_NON_BLOCK (1)
#define MICROPY_MODULE_WEAK_LINKS (1)
#define MICROPY_CAN_OVERRIDE_BUILTINS (1)
#define MICROPY_USE_INTERNAL_ERRNO (0)
#define MICROPY_PY_FUNCTION_ATTRS (1)
#define MICROPY_PY_BUILTINS_STR_UNICODE (1)
#define MICROPY_PY_BUILTINS_STR_CENTER (0)
#define MICROPY_PY_BUILTINS_STR_PARTITION (0)
#define MICROPY_PY_BUILTINS_STR_SPLITLINES (0)
#define MICROPY_PY_BUILTINS_STR_CENTER (1)
#define MICROPY_PY_BUILTINS_STR_PARTITION (1)
#define MICROPY_PY_BUILTINS_STR_SPLITLINES (1)
#define MICROPY_PY_BUILTINS_MEMORYVIEW (1)
#define MICROPY_PY_BUILTINS_FROZENSET (1)
#define MICROPY_PY_BUILTINS_EXECFILE (0)
@ -155,6 +155,7 @@ typedef long mp_off_t;
#define MP_PLAT_PRINT_STRN(str, len) mp_hal_stdout_tx_strn_cooked(str, len)
#define mp_type_fileio mp_type_vfs_fat_fileio
#define mp_type_textio mp_type_vfs_fat_textio
// extra built in modules to add to the list of known ones

View File

@ -32,4 +32,7 @@ void nrf_peripherals_clocks_init(void) {
// generalized.
NRF_CLOCK->LFCLKSRC = (uint32_t)((CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos) & CLOCK_LFCLKSRC_SRC_Msk);
NRF_CLOCK->TASKS_LFCLKSTART = 1UL;
// Wait for clocks to start.
while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) {}
}

View File

@ -28,6 +28,9 @@
#include "supervisor/port.h"
#include "boards/board.h"
#include "nrfx/hal/nrf_power.h"
#include "nrfx/drivers/include/nrfx_power.h"
#include "nrf/cache.h"
#include "nrf/clocks.h"
#include "nrf/power.h"
@ -41,37 +44,34 @@
#include "common-hal/pulseio/PulseOut.h"
#include "tick.h"
safe_mode_t port_init(void) {
static void power_warning_handler(void) {
reset_into_safe_mode(BROWNOUT);
}
safe_mode_t port_init(void) {
nrf_peripherals_clocks_init();
// If GPIO voltage is set wrong in UICR, this will fix it, and
// will also do a reset to make the change take effect.
nrf_peripherals_power_init();
nrfx_power_pofwarn_config_t power_failure_config;
power_failure_config.handler = power_warning_handler;
power_failure_config.thr = NRF_POWER_POFTHR_V27;
#if NRF_POWER_HAS_VDDH
power_failure_config.thrvddh = NRF_POWER_POFTHRVDDH_V27;
#endif
nrfx_power_pof_init(&power_failure_config);
nrfx_power_pof_enable(&power_failure_config);
nrf_peripherals_enable_cache();
// Configure millisecond timer initialization.
tick_init();
#if 0
#ifdef CIRCUITPY_CANARY_WORD
// Run in safe mode if the canary is corrupt.
if (_ezero != CIRCUITPY_CANARY_WORD) {
return HARD_CRASH;
}
#endif
#endif
// Will do usb_init() if chip supports USB.
board_init();
#if 0
if (board_requests_safe_mode()) {
return USER_SAFE_MODE;
}
#endif
return NO_SAFE_MODE;
}
@ -93,13 +93,26 @@ void reset_to_bootloader(void) {
enum { DFU_MAGIC_SERIAL = 0x4e };
NRF_POWER->GPREGRET = DFU_MAGIC_SERIAL;
reset_cpu();
}
void reset_cpu(void) {
NVIC_SystemReset();
}
extern uint32_t _ebss;
// Place the word to save just after our BSS section that gets blanked.
void port_set_saved_word(uint32_t value) {
_ebss = value;
}
void HardFault_Handler(void)
{
uint32_t port_get_saved_word(void) {
return _ebss;
}
void HardFault_Handler(void) {
reset_into_safe_mode(HARD_CRASH);
while (true) {
asm("");
asm("nop;");
}
}

View File

@ -149,6 +149,8 @@ SRC_C = \
alloc.c \
coverage.c \
fatfs_port.c \
supervisor/stub/serial.c \
supervisor/stub/stack.c \
supervisor/shared/translate.c \
$(SRC_MOD)

View File

@ -33,10 +33,12 @@
#include "py/objtype.h"
#include "py/objint.h"
#include "py/objstr.h"
#include "py/qstr.h"
#include "py/runtime.h"
#include "py/stackctrl.h"
#include "py/stream.h" // for mp_obj_print
#include "supervisor/shared/stack.h"
#include "supervisor/shared/translate.h"
mp_obj_type_t *mp_obj_get_type(mp_const_obj_t o_in) {
@ -81,7 +83,7 @@ void mp_obj_print(mp_obj_t o_in, mp_print_kind_t kind) {
// helper function to print an exception with traceback
void mp_obj_print_exception(const mp_print_t *print, mp_obj_t exc) {
if (mp_obj_is_exception_instance(exc)) {
if (mp_obj_is_exception_instance(exc) && stack_ok()) {
size_t n, *values;
mp_obj_exception_get_traceback(exc, &n, &values);
if (n > 0) {
@ -486,6 +488,8 @@ mp_obj_t mp_obj_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t value) {
mp_obj_type_t *type = mp_obj_get_type(base);
if (type->subscr != NULL) {
mp_obj_t ret = type->subscr(base, index, value);
// May have called port specific C code. Make sure it didn't mess up the heap.
assert_heap_ok();
if (ret != MP_OBJ_NULL) {
return ret;
}

View File

@ -33,12 +33,7 @@
#error "Please define PORT_HEAP_SIZE to specify heap size in bytes."
#endif
typedef enum {
NO_SAFE_MODE = 0,
BROWNOUT,
HARD_CRASH,
USER_SAFE_MODE,
} safe_mode_t;
#include "supervisor/shared/safe_mode.h"
// Provided by the linker;
extern uint32_t _ezero;
@ -51,7 +46,10 @@ extern uint32_t _ebss;
safe_mode_t port_init(void);
// Reset the microcontroller.
// Reset the microcontroller completely.
void reset_cpu(void);
// Reset the microcontroller state.
void reset_port(void);
// Reset the rest of the board.
@ -60,8 +58,8 @@ void reset_board(void);
// Reset to the bootloader
void reset_to_bootloader(void);
#ifdef NRF52_SERIES
void HardFault_Handler(void);
#endif
// Save and retrieve a word from memory that is preserved over reset. Used for safe mode.
void port_set_saved_word(uint32_t);
uint32_t port_get_saved_word(void);
#endif // MICROPY_INCLUDED_SUPERVISOR_PORT_H

View File

@ -36,6 +36,8 @@
#include "py/mpconfig.h"
#include "rgb_led_colors.h"
#include "supervisor/shared/safe_mode.h"
// Overall, the time module must be implemented.
// To work with a DotStar, one must have MICROPY_HW_APA102_SCK and
// MICROPY_HW_APA102_MOSI defined and bitbangio.SPI or busio.SPI implemented.

View File

@ -0,0 +1,126 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2018 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/shared/safe_mode.h"
#include "mphalport.h"
// #include "py/mpconfig.h"
#include "shared-bindings/digitalio/DigitalInOut.h"
#include "supervisor/serial.h"
#include "supervisor/shared/rgb_led_colors.h"
#include "supervisor/shared/rgb_led_status.h"
#include "supervisor/shared/translate.h"
#define SAFE_MODE_DATA_GUARD 0xad0000af
#define SAFE_MODE_DATA_GUARD_MASK 0xff0000ff
static safe_mode_t current_safe_mode;
safe_mode_t wait_for_safe_mode_reset(void) {
uint32_t reset_state = port_get_saved_word();
safe_mode_t safe_mode = NO_SAFE_MODE;
if ((reset_state & SAFE_MODE_DATA_GUARD_MASK) == SAFE_MODE_DATA_GUARD) {
safe_mode = (reset_state & ~SAFE_MODE_DATA_GUARD_MASK) >> 8;
}
if (safe_mode != NO_SAFE_MODE) {
port_set_saved_word(SAFE_MODE_DATA_GUARD);
current_safe_mode = safe_mode;
return safe_mode;
}
port_set_saved_word(SAFE_MODE_DATA_GUARD | (MANUAL_SAFE_MODE << 8));
// Wait for a while to allow for reset.
temp_status_color(SAFE_MODE);
#ifdef MICROPY_HW_LED_STATUS
digitalio_digitalinout_obj_t status_led;
common_hal_digitalio_digitalinout_construct(&status_led, MICROPY_HW_LED_STATUS);
common_hal_digitalio_digitalinout_switch_to_output(&status_led, true, DRIVE_MODE_PUSH_PULL);
#endif
uint64_t start_ticks = ticks_ms;
uint64_t diff = 0;
while (diff < 700) {
#ifdef MICROPY_HW_LED_STATUS
// Blink on for 100, off for 100, on for 100, off for 100 and on for 200
common_hal_digitalio_digitalinout_set_value(&status_led, diff > 100 && diff / 100 != 2 && diff / 100 != 4);
#endif
diff = ticks_ms - start_ticks;
}
#ifdef MICROPY_HW_LED_STATUS
common_hal_digitalio_digitalinout_deinit(&status_led);
#endif
clear_temp_status();
port_set_saved_word(SAFE_MODE_DATA_GUARD);
return NO_SAFE_MODE;
}
void reset_into_safe_mode(safe_mode_t reason) {
if (current_safe_mode > BROWNOUT && reason > BROWNOUT) {
while (true) {
// This very bad because it means running in safe mode didn't save us. Only ignore brownout
// because it may be due to a switch bouncing.
}
}
port_set_saved_word(SAFE_MODE_DATA_GUARD | (reason << 8));
reset_cpu();
}
void print_safe_mode_message(safe_mode_t reason) {
// Output a user safe mode string if its set.
#ifdef BOARD_USER_SAFE_MODE
if (reason == USER_SAFE_MODE) {
serial_write("\r\n");
serial_write_compressed(translate("You requested starting safe mode by "));
serial_write(BOARD_USER_SAFE_MODE_ACTION);
serial_write("\r\n");
serial_write_compressed(translate("To exit, please reset the board without "));
serial_write(BOARD_USER_SAFE_MODE_ACTION);
serial_write("\r\n");
} else
#endif
if (reason != NO_SAFE_MODE) {
serial_write("\r\n");
serial_write_compressed(translate("You are running in safe mode which means something unanticipated happened.\n"));
if (reason == HARD_CRASH || reason == MICROPY_NLR_JUMP_FAIL || reason == MICROPY_FATAL_ERROR) {
serial_write_compressed(translate("Looks like our core CircuitPython code crashed hard. Whoops!\nPlease file an issue at https://github.com/adafruit/circuitpython/issues\n with the contents of your CIRCUITPY drive and this message:\n"));
if (reason == HARD_CRASH) {
serial_write_compressed(translate("Crash into the HardFault_Handler.\n"));
} else if (reason == MICROPY_NLR_JUMP_FAIL) {
serial_write_compressed(translate("MicroPython NLR jump failed. Likely memory corruption.\n"));
} else if (reason == MICROPY_FATAL_ERROR) {
serial_write_compressed(translate("MicroPython fatal error.\n"));
}
} else if (reason == BROWNOUT) {
serial_write_compressed(translate("The microcontroller's power dipped. Please make sure your power supply provides\nenough power for the whole circuit and press reset (after ejecting CIRCUITPY).\n"));
} else if (reason == HEAP_OVERWRITTEN) {
serial_write_compressed(translate("The CircuitPython heap was corrupted because the stack was too small.\nPlease increase stack size limits and press reset (after ejecting CIRCUITPY).\nIf you didn't change the stack, then file an issue here with the contents of your CIRCUITPY drive:\n"));
serial_write("https://github.com/adafruit/circuitpython/issues\r\n");
} else if (reason == MANUAL_SAFE_MODE) {
serial_write_compressed(translate("The reset button was pressed while booting CircuitPython. Press again to exit safe mode.\n"));
}
}
}

View File

@ -0,0 +1,47 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2018 Scott Shawcroft for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef MICROPY_INCLUDED_SUPERVISOR_SAFE_MODE_H
#define MICROPY_INCLUDED_SUPERVISOR_SAFE_MODE_H
typedef enum {
NO_SAFE_MODE = 0,
BROWNOUT,
HARD_CRASH,
USER_SAFE_MODE,
HEAP_OVERWRITTEN,
MANUAL_SAFE_MODE,
MICROPY_NLR_JUMP_FAIL,
MICROPY_FATAL_ERROR
} safe_mode_t;
safe_mode_t wait_for_safe_mode_reset(void);
void reset_into_safe_mode(safe_mode_t reason);
void print_safe_mode_message(safe_mode_t reason);
#endif // MICROPY_INCLUDED_SUPERVISOR_SAFE_MODE_H

View File

@ -27,7 +27,9 @@
#include "stack.h"
#include "py/mpconfig.h"
#include "py/runtime.h"
#include "supervisor/cpu.h"
#include "supervisor/shared/safe_mode.h"
extern uint32_t _estack;
@ -50,6 +52,17 @@ void allocate_stack(void) {
} else {
current_stack_size = next_stack_size;
}
*stack_alloc->ptr = STACK_CANARY_VALUE;
}
inline bool stack_ok(void) {
return *stack_alloc->ptr == STACK_CANARY_VALUE;
}
inline void assert_heap_ok(void) {
if (!stack_ok()) {
reset_into_safe_mode(HEAP_OVERWRITTEN);
}
}
void stack_init(void) {
@ -58,6 +71,7 @@ void stack_init(void) {
void stack_resize(void) {
if (next_stack_size == current_stack_size) {
*stack_alloc->ptr = STACK_CANARY_VALUE;
return;
}
free_memory(stack_alloc);

View File

@ -37,5 +37,12 @@ void stack_init(void);
void stack_resize(void);
void set_next_stack_size(uint32_t size);
uint32_t get_current_stack_size(void);
bool stack_ok(void);
// Use this after any calls into a library which may use a lot of stack. This will raise a Python
// exception when the stack has likely overwritten a portion of the heap.
void assert_heap_ok(void);
#define STACK_CANARY_VALUE 0x017829ef
#endif // MICROPY_INCLUDED_SUPERVISOR_STACK_H

View File

@ -34,6 +34,14 @@
#include "genhdr/compression.generated.h"
#endif
#include "supervisor/serial.h"
void serial_write_compressed(const compressed_string_t* compressed) {
char decompressed[compressed->length];
decompress(compressed, decompressed);
serial_write(decompressed);
}
char* decompress(const compressed_string_t* compressed, char* decompressed) {
uint8_t this_byte = 0;
uint8_t this_bit = 7;

View File

@ -35,7 +35,7 @@ typedef struct {
} compressed_string_t;
const compressed_string_t* translate(const char* c);
void serial_write_compressed(const compressed_string_t* compressed);
char* decompress(const compressed_string_t* compressed, char* decompressed);
#endif // MICROPY_INCLUDED_SUPERVISOR_TRANSLATE_H

View File

@ -43,4 +43,5 @@ bool serial_bytes_available(void) {
}
void serial_write(const char* text) {
(void) text;
}

48
supervisor/stub/stack.c Normal file
View File

@ -0,0 +1,48 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2018 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/shared/stack.h"
bool stack_ok(void) {
return true;
}
void assert_heap_ok(void) {
}
void stack_init(void) {
}
void stack_resize(void) {
}
void set_next_stack_size(uint32_t size) {
(void) size;
}
uint32_t get_current_stack_size(void) {
return 0;
}

View File

@ -6,6 +6,7 @@ SRC_SUPERVISOR = \
supervisor/shared/flash.c \
supervisor/shared/micropython.c \
supervisor/shared/rgb_led_status.c \
supervisor/shared/safe_mode.c \
supervisor/shared/stack.c \
supervisor/shared/status_leds.c \
supervisor/shared/translate.c

View File

@ -21,21 +21,29 @@ HEX = ('hex',)
# Default extensions
extension_by_port = {
"nrf": BIN,
"nrf": UF2,
"esp8266": BIN,
"atmel-samd": UF2,
}
# Per board overrides
extension_by_board = {
"feather_nrf52832": BIN,
# samd
"arduino_mkr1300": BIN,
"arduino_zero": BIN,
"feather_m0_adalogger": BIN_UF2,
"feather_m0_basic": BIN_UF2,
"feather_m0_rfm69": BIN,
"feather_m0_rfm9x": BIN,
"makerdiary_nrf52840_mdk": HEX
# nrf52832
"feather_nrf52832": BIN,
"pca10040": BIN,
# nRF52840 dev kits that may not have UF2 bootloaders,
"makerdiary_nrf52840_mdk": HEX,
"pca10056": BIN_UF2,
"pca10059": BIN_UF2
}
def get_languages():
@ -62,7 +70,7 @@ def get_version_info():
version = None
sha = git("rev-parse", "--short", "HEAD").stdout.decode("utf-8")
try:
version = git("describe", "--tags", "--exact-match").stdout.decode("utf-8")
version = git("describe", "--tags", "--exact-match").stdout.decode("utf-8").strip()
except sh.ErrorReturnCode_128:
# No exact match
pass
@ -212,7 +220,7 @@ def generate_download_info():
board_path = os.path.join("../ports", port, "boards")
for board_path in os.scandir(board_path):
if board_path.is_dir():
board_files = os.listdir(board_path)
board_files = os.listdir(board_path.path)
board_id = board_path.name
board_info = board_mapping[board_id]
@ -236,8 +244,10 @@ def generate_download_info():
changes["new_languages"] = set(languages) - previous_languages
if changes["new_languages"]:
if changes["new_release"]:
create_pr(changes, current_info, git_info)
else:
print("No new release to update")
if __name__ == "__main__":
if "TRAVIS_TAG" in os.environ and os.environ["TRAVIS_TAG"]: