summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x.travis.yml34
-rw-r--r--README.rst12
m---------frozen/Adafruit_CircuitPython_BusDevice0
m---------frozen/Adafruit_CircuitPython_CircuitPlayground0
m---------frozen/Adafruit_CircuitPython_Crickit0
m---------frozen/Adafruit_CircuitPython_DotStar0
m---------frozen/Adafruit_CircuitPython_HID0
m---------frozen/Adafruit_CircuitPython_IRRemote0
m---------frozen/Adafruit_CircuitPython_LIS3DH0
m---------frozen/Adafruit_CircuitPython_Motor0
m---------frozen/Adafruit_CircuitPython_NeoPixel0
m---------frozen/Adafruit_CircuitPython_Thermistor0
m---------frozen/Adafruit_CircuitPython_seesaw0
-rw-r--r--locale/circuitpython.pot57
-rw-r--r--locale/de_DE.po132
-rw-r--r--locale/en_US.po57
-rw-r--r--locale/es.po315
-rw-r--r--locale/fil.po57
-rw-r--r--locale/fr.po65
-rw-r--r--locale/it_IT.po57
-rw-r--r--locale/pt_BR.po57
-rw-r--r--ports/atmel-samd/boards/feather_m0_adalogger/pins.c1
-rw-r--r--ports/atmel-samd/boards/feather_m0_basic/pins.c1
-rw-r--r--ports/atmel-samd/boards/feather_m0_express/pins.c1
-rw-r--r--ports/atmel-samd/boards/feather_m0_express_crickit/pins.c1
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm69/pins.c1
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm9x/pins.c1
-rw-r--r--ports/atmel-samd/boards/feather_m0_supersized/pins.c1
-rw-r--r--ports/atmel-samd/boards/feather_m4_express/pins.c1
-rw-r--r--ports/atmel-samd/boards/meowmeow/board.c38
-rw-r--r--ports/atmel-samd/boards/meowmeow/mpconfigboard.h36
-rw-r--r--ports/atmel-samd/boards/meowmeow/mpconfigboard.mk11
-rw-r--r--ports/atmel-samd/boards/meowmeow/pins.c43
-rw-r--r--ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.h4
-rw-r--r--ports/atmel-samd/boards/trellis_m4_express/pins.c3
-rw-r--r--ports/atmel-samd/common-hal/analogio/AnalogOut.c13
-rw-r--r--ports/atmel-samd/common-hal/audioio/AudioOut.c87
-rw-r--r--ports/atmel-samd/common-hal/audioio/AudioOut.h1
-rw-r--r--ports/atmel-samd/mpconfigport.h62
-rw-r--r--ports/atmel-samd/supervisor/port.c2
-rwxr-xr-xports/nrf/Makefile18
-rw-r--r--ports/nrf/README.md2
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_mdk/README.md102
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_mdk/board.c40
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h64
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk16
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_mdk/pins.c63
-rw-r--r--ports/nrf/common-hal/analogio/AnalogOut.c2
-rw-r--r--ports/nrf/common-hal/board/__init__.c2
-rw-r--r--ports/nrf/common-hal/busio/I2C.c1
-rw-r--r--ports/nrf/common-hal/busio/UART.c4
-rw-r--r--ports/nrf/common-hal/pulseio/PWMOut.c4
-rw-r--r--ports/nrf/common-hal/pulseio/PulseOut.c123
-rw-r--r--ports/nrf/common-hal/pulseio/PulseOut.h6
-rw-r--r--ports/nrf/nrfx_config.h24
-rw-r--r--ports/nrf/peripherals/nrf/pins.h2
-rw-r--r--ports/nrf/peripherals/nrf/timers.c88
-rw-r--r--ports/nrf/peripherals/nrf/timers.h32
-rw-r--r--ports/nrf/supervisor/port.c19
-rw-r--r--[-rwxr-xr-x]py/builtinimport.c10
-rw-r--r--py/mkenv.mk2
-rw-r--r--py/mkrules.mk2
-rw-r--r--py/modsys.c2
-rw-r--r--py/obj.h1
-rw-r--r--py/objboundmeth.c3
-rw-r--r--py/objexcept.c162
-rw-r--r--shared-bindings/audioio/AudioOut.c9
-rw-r--r--shared-bindings/audioio/AudioOut.h2
-rw-r--r--shared-bindings/pulseio/PulseOut.c7
-rw-r--r--shared-bindings/time/__init__.c15
-rwxr-xr-xtools/build_adafruit_bins.sh7
-rwxr-xr-xtools/mpy-tool.py70
72 files changed, 1538 insertions, 517 deletions
diff --git a/.travis.yml b/.travis.yml
index 78fc863aa..654a3d9cb 100755
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,18 +4,26 @@ language: c
compiler:
- gcc
git:
- depth: 1
-
-# Put a representative board from each port or sub-port near the top
-# to determine more quickly whether that port is going to build or not.
+ depth: 6
+
+# Each item under 'env' is a separate Travis job to execute.
+# They run in separate environments, so each one must take the time
+# to clone the repository and submodules; to download and install SDKs,
+# pip packages, and so forth. By gathering activities together in optimal
+# ways, the "run time" and "total time" of the travis jobs can be minimized.
+#
+# Since at the time of writing Travis generally starts 5 or 6 jobs, the
+# builds have been organized into 5 groups of *approximately* equal durations.
+# Additionally, the jobs that need extra SDKs are also organized together.
+#
+# When adding new boards, take a look on the travis CI page
+# https://travis-ci.org/adafruit/circuitpython to which build that installs
+# 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"
- - TRAVIS_BOARDS="feather_huzzah circuitplayground_express pca10056" TRAVIS_SDK=arm:nrf:esp8266
- # Group nrf builds together..
- - TRAVIS_BOARDS="pca10056 pca10059 feather_nrf52832 feather_nrf52840_express" TRAVIS_SDK=arm:nrf
- # The rest of the M0/M4 boards, in arbitrary order.
+ - TRAVIS_TESTS="unix docs translations" TRAVIS_BOARDS="feather_huzzah circuitplayground_express pca10056 pca10059 feather_nrf52832 feather_nrf52840_express makerdiary_nrf52840_mdk" 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" 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" TRAVIS_SDK=arm
- TRAVIS_BOARDS="circuitplayground_express_crickit feather_m0_adalogger feather_m0_basic feather_m0_express" TRAVIS_SDK=arm
@@ -45,8 +53,8 @@ before_script:
- (! var_search "${TRAVIS_SDK-}" nrf || sudo ports/nrf/drivers/bluetooth/download_ble_stack.sh)
# For huzzah builds
- - (! var_search "${TRAVIS_SDK-}" esp8266 || (wget https://github.com/jepler/esp-open-sdk/releases/download/2018-06-10/xtensa-lx106-elf-standalone.tar.gz && tar xavf xtensa-lx106-elf-standalone.tar.gz))
- - if var_search "${TRAVIS_SDK-}" esp8266 ; then PATH=$(readlink -f xtensa-lx106-elf/bin):$PATH; fi
+ - (! var_search "${TRAVIS_SDK-}" esp8266 || (wget https://github.com/jepler/esp-open-sdk/releases/download/2018-06-10/xtensa-lx106-elf-standalone.tar.gz && tar -C .. -xavf xtensa-lx106-elf-standalone.tar.gz))
+ - if var_search "${TRAVIS_SDK-}" esp8266 ; then PATH=$(readlink -f ../xtensa-lx106-elf/bin):$PATH; fi
# For coverage testing (upgrade is used to get latest urllib3 version)
- ([[ -z "$TRAVIS_TESTS" ]] || sudo apt-get install -y python3-pip)
@@ -54,7 +62,7 @@ before_script:
- (! var_search "${TRAVIS_TESTS-}" docs || sudo pip install 'Sphinx<1.8.0' sphinx-rtd-theme recommonmark)
- (! var_search "${TRAVIS_TESTS-}" translations || sudo pip3 install polib)
- # report some good version numbers to the buil
+ # report some good version numbers to the build
- gcc --version
- (! var_search "${TRAVIS_SDK-}" elf || arm-none-eabi-gcc --version)
- (! var_search "${TRAVIS_SDK-}" esp8266 || xtensa-lx106-elf-gcc --version)
diff --git a/README.rst b/README.rst
index ac74f10d6..e89543fe5 100644
--- a/README.rst
+++ b/README.rst
@@ -30,13 +30,21 @@ Supported Boards
Designed for CircuitPython
~~~~~~~~~~~~~~~~~~~~~~~~~~
+**M0 Boards**
+
- `Adafruit CircuitPlayground Express <https://www.adafruit.com/product/3333>`__ (`CircuitPython Guide <https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-quickstart>`__)
- `Adafruit Feather M0 Express <https://www.adafruit.com/product/3403>`__ (`CircuitPython Guide <https://learn.adafruit.com/adafruit-feather-m0-express-designed-for-circuit-python-circuitpython/kattni-circuitpython>`__)
-- `Adafruit Metro M0 Express <https://www.adafruit.com/product/3505>`_ (`CircuitPython Guide <https://learn.adafruit.com/adafruit-metro-m0-express-designed-for-circuitpython/circuitpython>`__)
- `Adafruit Gemma M0 <https://www.adafruit.com/product/3501>`__ (`CircuitPython Guide <https://learn.adafruit.com/adafruit-gemma-m0/circuitpython>`__)
+- `Adafruit Hallowing M0 Express <https://www.adafruit.com/product/3900>`__ (`CircuitPython Guide <https://learn.adafruit.com/adafruit-hallowing/circuitpython>`__)
- `Adafruit ItsyBitsy M0 Express <https://www.adafruit.com/product/3727>`_ (`CircuitPython Guide <https://learn.adafruit.com/introducing-itsy-bitsy-m0/circuitpython>`__)
+- `Adafruit Metro M0 Express <https://www.adafruit.com/product/3505>`_ (`CircuitPython Guide <https://learn.adafruit.com/adafruit-metro-m0-express-designed-for-circuitpython/circuitpython>`__)
- `Adafruit Trinket M0 <https://www.adafruit.com/product/3500>`__ (`CircuitPython Guide <https://learn.adafruit.com/adafruit-trinket-m0-circuitpython-arduino/circuitpython>`__)
-- `Adafruit Metro M4 <https://www.adafruit.com/product/3382>`__ (`CircuitPython Guide <https://learn.adafruit.com/adafruit-metro-m4-express-featuring-atsamd51/overview>`__)
+
+**M4 Boards**
+
+- `Adafruit Feather M4 Express <https://www.adafruit.com/product/3857>`__ (`CircuitPython Guide <https://learn.adafruit.com/adafruit-feather-m4-express-atsamd51/circuitpython>`__)
+- `Adafruit ItsyBitsy M4 Express <https://www.adafruit.com/product/3800>`__ (`CircuitPython Guide <https://learn.adafruit.com/introducing-adafruit-itsybitsy-m4/circuitpython>`__)
+- `Adafruit Metro M4 Express <https://www.adafruit.com/product/3382>`__ (`CircuitPython Guide <https://learn.adafruit.com/adafruit-metro-m4-express-featuring-atsamd51/circuitpython>`__)
Other
~~~~~
diff --git a/frozen/Adafruit_CircuitPython_BusDevice b/frozen/Adafruit_CircuitPython_BusDevice
-Subproject 07919641470edb602585c6a91f7b8eacf17e664
+Subproject 97d4129b8117d177df2675839ec4081b3570838
diff --git a/frozen/Adafruit_CircuitPython_CircuitPlayground b/frozen/Adafruit_CircuitPython_CircuitPlayground
-Subproject d0aa6dc56d66decfae92daced7384c1e3518a66
+Subproject 36ec7b371f1751961de6d2c910533618d931f10
diff --git a/frozen/Adafruit_CircuitPython_Crickit b/frozen/Adafruit_CircuitPython_Crickit
-Subproject 44f52c5dacd9fc605565e5794e95c9a785aaf69
+Subproject bbf2d897ae116531bfa15af3bcb32b0123acc43
diff --git a/frozen/Adafruit_CircuitPython_DotStar b/frozen/Adafruit_CircuitPython_DotStar
-Subproject af25424ee7dbebea3e5d77390c017018ffa52d3
+Subproject 03c24157d46672c723021686f7a838cfeb2db2b
diff --git a/frozen/Adafruit_CircuitPython_HID b/frozen/Adafruit_CircuitPython_HID
-Subproject 5c2f6ef1ed80f24b6a3878067d40350d3725e19
+Subproject 99c71a6c1ea00bc14f0a4507116ff216beafafb
diff --git a/frozen/Adafruit_CircuitPython_IRRemote b/frozen/Adafruit_CircuitPython_IRRemote
-Subproject c29e10b590efbdf06163897b49cd0c2bea82ad6
+Subproject ec11164ec6682094a48d0f9848d2c4c89c08f3b
diff --git a/frozen/Adafruit_CircuitPython_LIS3DH b/frozen/Adafruit_CircuitPython_LIS3DH
-Subproject c4152a0d87a04903ae0e612eb381af440c9e28b
+Subproject 377910d5a9bfbf833dfd3064f80c5b2ae0c78c9
diff --git a/frozen/Adafruit_CircuitPython_Motor b/frozen/Adafruit_CircuitPython_Motor
-Subproject e0b709f1710555da67705360870ba0d14ced7e0
+Subproject 00326214fc2ece8b31c07a654b192797e6a0804
diff --git a/frozen/Adafruit_CircuitPython_NeoPixel b/frozen/Adafruit_CircuitPython_NeoPixel
-Subproject e9f50cb6678a1684591ee021b95a3c4b51786fe
+Subproject 4b9563d6a74c6089d0ef5466975d11ef52851bc
diff --git a/frozen/Adafruit_CircuitPython_Thermistor b/frozen/Adafruit_CircuitPython_Thermistor
-Subproject 00f4ebca6c740b76c1c464f83d514ac20b0600e
+Subproject 1570b23f7a6d62e169d2fd15969e507a1da0537
diff --git a/frozen/Adafruit_CircuitPython_seesaw b/frozen/Adafruit_CircuitPython_seesaw
-Subproject 340cd17fad0c29d3a70d6e298a30ecc753df054
+Subproject e3e3021d8578fde450511b47a085d9d56ab4674
diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot
index 8fc817849..a75f2169b 100644
--- a/locale/circuitpython.pot
+++ b/locale/circuitpython.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-11 22:08+1100\n"
+"POT-Creation-Date: 2018-10-25 12:20+1100\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"
@@ -147,7 +147,7 @@ msgstr ""
msgid "invalid arguments"
msgstr ""
-#: lib/utils/pyexec.c:97 py/builtinimport.c:253
+#: lib/utils/pyexec.c:97 py/builtinimport.c:251
msgid "script compilation not supported"
msgstr ""
@@ -291,12 +291,12 @@ msgid "Too many channels in sample."
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:339
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417
msgid "No DMA channel found"
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:341
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419
msgid "Unable to allocate buffers for signed conversion"
msgstr ""
@@ -312,43 +312,44 @@ msgstr ""
msgid "sampling rate out of range"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:69
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132
msgid "DAC already in use"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:73
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136
msgid "Right channel unsupported"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:76
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116
#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65
msgid "Invalid pin"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:84
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147
msgid "Invalid pin for left channel"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:88
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151
msgid "Invalid pin for right channel"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:91
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154
msgid "Cannot output both channels on the same pin"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:176
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110
+#: ports/nrf/common-hal/pulseio/PulseOut.c:107
msgid "All timers in use"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:218
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285
msgid "All event channels in use"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:297
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr ""
@@ -361,7 +362,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/busio/SPI.c:132
#: ports/atmel-samd/common-hal/busio/UART.c:119
#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45
-#: ports/nrf/common-hal/busio/I2C.c:81
+#: ports/nrf/common-hal/busio/I2C.c:82
msgid "Invalid pins"
msgstr ""
@@ -413,7 +414,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369
-#: ports/nrf/common-hal/pulseio/PWMOut.c:120
+#: ports/nrf/common-hal/pulseio/PWMOut.c:119
#: ports/nrf/common-hal/pulseio/PWMOut.c:233
msgid "Invalid PWM frequency"
msgstr ""
@@ -695,7 +696,7 @@ msgstr ""
msgid "AnalogOut functionality not supported"
msgstr ""
-#: ports/nrf/common-hal/busio/I2C.c:95
+#: ports/nrf/common-hal/busio/I2C.c:96
msgid "All I2C peripherals are in use"
msgstr ""
@@ -729,7 +730,7 @@ msgstr ""
msgid "Can not get temperature. status: 0x%02x"
msgstr ""
-#: ports/nrf/common-hal/pulseio/PWMOut.c:162
+#: ports/nrf/common-hal/pulseio/PWMOut.c:161
msgid "All PWM peripherals are in use"
msgstr ""
@@ -935,19 +936,19 @@ msgstr ""
msgid "bad compile mode"
msgstr ""
-#: py/builtinimport.c:338
+#: py/builtinimport.c:336
msgid "cannot perform relative import"
msgstr ""
-#: py/builtinimport.c:422 py/builtinimport.c:534
+#: py/builtinimport.c:420 py/builtinimport.c:532
msgid "module not found"
msgstr ""
-#: py/builtinimport.c:425 py/builtinimport.c:537
+#: py/builtinimport.c:423 py/builtinimport.c:535
msgid "no module named '%q'"
msgstr ""
-#: py/builtinimport.c:512
+#: py/builtinimport.c:510
msgid "relative import"
msgstr ""
@@ -1994,7 +1995,7 @@ msgid "AnalogOut is only 16 bits. Value must be less than 65536."
msgstr ""
#: shared-bindings/audiobusio/I2SOut.c:225
-#: shared-bindings/audioio/AudioOut.c:223
+#: shared-bindings/audioio/AudioOut.c:226
msgid "Not playing"
msgstr ""
@@ -2201,7 +2202,7 @@ msgstr ""
#: shared-bindings/microcontroller/Pin.c:89
#: shared-bindings/neopixel_write/__init__.c:67
-#: shared-bindings/pulseio/PulseOut.c:75
+#: shared-bindings/pulseio/PulseOut.c:76
msgid "Expected a %q"
msgstr ""
@@ -2263,7 +2264,7 @@ msgstr ""
msgid "Read-only"
msgstr ""
-#: shared-bindings/pulseio/PulseOut.c:134
+#: shared-bindings/pulseio/PulseOut.c:135
msgid "Array must contain halfwords (type 'H')"
msgstr ""
@@ -2292,7 +2293,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr ""
-#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:64
+#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81
msgid "no available NIC"
msgstr ""
@@ -2320,15 +2321,15 @@ msgstr ""
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
-#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:250
+#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:264
msgid "Tuple or struct_time argument required"
msgstr ""
-#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:255
+#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:269
msgid "function takes exactly 9 arguments"
msgstr ""
-#: shared-bindings/time/__init__.c:226 shared-bindings/time/__init__.c:259
+#: shared-bindings/time/__init__.c:240 shared-bindings/time/__init__.c:273
msgid "timestamp out of range for platform time_t"
msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 3f7b22702..11cac7110 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-11 22:08+1100\n"
+"POT-Creation-Date: 2018-10-25 12:20+1100\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: Sebastian Plamauer\n"
"Language-Team: \n"
@@ -93,7 +93,7 @@ msgstr "struct: index außerhalb gültigen Bereichs"
#: extmod/moduheapq.c:38
msgid "heap must be a list"
-msgstr "heap muss eine list sein"
+msgstr "heap muss eine Liste sein"
#: extmod/moduheapq.c:86 extmod/modutimeq.c:147 extmod/modutimeq.c:172
msgid "empty heap"
@@ -147,7 +147,7 @@ msgstr "abort() wurde aufgerufen"
msgid "invalid arguments"
msgstr "ungültige argumente"
-#: lib/utils/pyexec.c:97 py/builtinimport.c:253
+#: lib/utils/pyexec.c:97 py/builtinimport.c:251
msgid "script compilation not supported"
msgstr "kompilieren von Skripten ist nicht unterstützt"
@@ -185,12 +185,12 @@ msgstr "Du hast das Starten im Sicherheitsmodus ausgelöst durch "
#: main.c:252
msgid "To exit, please reset the board without "
-msgstr "Zum beenden bitte resete das board ohne "
+msgstr "Zum beenden bitte resette das board ohne "
#: main.c:259
msgid ""
"You are running in safe mode which means something really bad happened.\n"
-msgstr "Sicherheitsmodus aktive, etwas wirklich schlechtes ist passiert.\n"
+msgstr "Sicherheitsmodus aktiv, etwas wirklich schlechtes ist passiert.\n"
#: main.c:261
msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
@@ -214,8 +214,8 @@ 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 "
-"demsicheren Auswerfen von CIRCUITPY.)\n"
+"genug Strom für den ganzen Schaltkreis liefert und drücke reset (nach dem "
+"sicheren Auswerfen von CIRCUITPY.)\n"
#: main.c:270
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
@@ -225,7 +225,7 @@ msgstr ""
#: main.c:426
msgid "soft reboot\n"
-msgstr "weicher reboot\n"
+msgstr "soft reboot\n"
#: ports/atmel-samd/audio_dma.c:209
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:361
@@ -268,7 +268,7 @@ msgstr "AnalogOut ist an diesem Pin nicht unterstützt"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:147
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:150
msgid "Invalid bit clock pin"
-msgstr "Ungülgites bit clock pin"
+msgstr "Ungültiges bit clock pin"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:153
msgid "Bit clock and word select must share a clock unit"
@@ -284,7 +284,7 @@ msgstr "Ungültiger data pin"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:145
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:150
msgid "Serializer in use"
-msgstr "Serilaizer wird benutzt"
+msgstr "Serializer wird benutzt"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:230
msgid "Clock unit in use"
@@ -300,12 +300,12 @@ msgid "Too many channels in sample."
msgstr "Zu viele Kanäle im sample"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:339
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417
msgid "No DMA channel found"
msgstr "Kein DMA Kanal gefunden"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:341
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419
msgid "Unable to allocate buffers for signed conversion"
msgstr "Konnte keine Buffer für Vorzeichenumwandlung allozieren"
@@ -321,43 +321,44 @@ msgstr "Nur 8 oder 16 bit mono mit "
msgid "sampling rate out of range"
msgstr "Abtastrate außerhalb der Reichweite"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:69
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132
msgid "DAC already in use"
msgstr "DAC wird schon benutzt"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:73
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136
msgid "Right channel unsupported"
msgstr "Rechter Kanal wird nicht unterstützt"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:76
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116
#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65
msgid "Invalid pin"
msgstr "Ungültiger Pin"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:84
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147
msgid "Invalid pin for left channel"
msgstr "Ungültiger Pin für linken Kanal"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:88
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151
msgid "Invalid pin for right channel"
msgstr "Ungültiger Pin für rechten Kanal"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:91
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154
msgid "Cannot output both channels on the same pin"
msgstr "Kann nicht beite Kanäle auf dem gleichen Pin ausgeben"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:176
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110
+#: ports/nrf/common-hal/pulseio/PulseOut.c:107
msgid "All timers in use"
msgstr "Alle timer werden benutzt"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:218
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285
msgid "All event channels in use"
-msgstr "Alle event Kanälre werden benutzt"
+msgstr "Alle event Kanäle werden benutzt"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:297
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr ""
@@ -370,7 +371,7 @@ msgstr "Nicht genug Pins vorhanden"
#: ports/atmel-samd/common-hal/busio/SPI.c:132
#: ports/atmel-samd/common-hal/busio/UART.c:119
#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45
-#: ports/nrf/common-hal/busio/I2C.c:81
+#: ports/nrf/common-hal/busio/I2C.c:82
msgid "Invalid pins"
msgstr "Ungültige Pins"
@@ -380,7 +381,7 @@ msgstr "SDA oder SCL brauchen pull up"
#: ports/atmel-samd/common-hal/busio/I2C.c:121
msgid "Unsupported baudrate"
-msgstr "Baudrate wird nicht unterstütz"
+msgstr "Baudrate wird nicht unterstützt"
#: ports/atmel-samd/common-hal/busio/UART.c:66
msgid "bytes > 8 bits not supported"
@@ -422,7 +423,7 @@ msgstr "Reset zum bootloader nicht möglich da bootloader nicht vorhanden"
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369
-#: ports/nrf/common-hal/pulseio/PWMOut.c:120
+#: ports/nrf/common-hal/pulseio/PWMOut.c:119
#: ports/nrf/common-hal/pulseio/PWMOut.c:233
msgid "Invalid PWM frequency"
msgstr "Ungültige PWM Frequenz"
@@ -546,23 +547,25 @@ msgstr "Minimale PWM Frequenz ist %dHz"
#, c-format
msgid "Multiple PWM frequencies not supported. PWM already set to %dhz."
msgstr ""
+"Mehrere PWM Frequenzen nicht unterstützt. PWM bereits auf %dHz gesetzt."
#: ports/esp8266/common-hal/pulseio/PWMOut.c:77 ports/esp8266/machine_pwm.c:70
#, c-format
msgid "PWM not supported on pin %d"
-msgstr ""
+msgstr "PWM nicht unterstützt an Pin %d"
#: ports/esp8266/common-hal/pulseio/PulseIn.c:78
msgid "No PulseIn support for %q"
-msgstr ""
+msgstr "Keine PulseIn Unterstützung für %q"
#: ports/esp8266/common-hal/storage/__init__.c:34
msgid "Unable to remount filesystem"
-msgstr ""
+msgstr "Dateisystem kann nicht wieder gemounted werden."
#: ports/esp8266/common-hal/storage/__init__.c:38
msgid "Use esptool to erase flash and re-upload Python instead"
msgstr ""
+"Benutze esptool um den flash zu löschen und stattdessen Python hochzuladen"
#: ports/esp8266/esp_mphal.c:154
msgid "C-level assert"
@@ -571,102 +574,103 @@ msgstr ""
#: ports/esp8266/machine_adc.c:57
#, c-format
msgid "not a valid ADC Channel: %d"
-msgstr ""
+msgstr "Kein gültiger ADC Kanal: %d"
#: ports/esp8266/machine_hspi.c:131 ports/esp8266/machine_hspi.c:137
msgid "impossible baudrate"
-msgstr ""
+msgstr "Unmögliche Baudrate"
#: ports/esp8266/machine_pin.c:129
msgid "expecting a pin"
-msgstr ""
+msgstr "Ein Pin wird erwartet"
#: ports/esp8266/machine_pin.c:284
msgid "Pin(16) doesn't support pull"
-msgstr ""
+msgstr "Pin(16) unterstützt kein pull"
#: ports/esp8266/machine_pin.c:323
msgid "invalid pin"
-msgstr ""
+msgstr "Ungültiger Pin"
#: ports/esp8266/machine_pin.c:389
msgid "pin does not have IRQ capabilities"
-msgstr ""
+msgstr "Pin hat keine IRQ Fähigkeiten"
#: ports/esp8266/machine_rtc.c:185
msgid "buffer too long"
-msgstr ""
+msgstr "Buffer zu lang"
#: ports/esp8266/machine_rtc.c:209 ports/esp8266/machine_rtc.c:223
#: ports/esp8266/machine_rtc.c:246
msgid "invalid alarm"
-msgstr ""
+msgstr "Ungültiger Alarm"
#: ports/esp8266/machine_uart.c:169
#, c-format
msgid "UART(%d) does not exist"
-msgstr ""
+msgstr "UART(%d) existiert nicht"
#: ports/esp8266/machine_uart.c:219
msgid "UART(1) can't read"
-msgstr ""
+msgstr "UART(1) kann nicht lesen"
#: ports/esp8266/modesp.c:119
msgid "len must be multiple of 4"
-msgstr ""
+msgstr "len muss ein vielfaches von 4 sein"
#: ports/esp8266/modesp.c:274
#, c-format
msgid "memory allocation failed, allocating %u bytes for native code"
msgstr ""
+"Speicherallozierung fehlgeschlagen, alloziere %u Bytes für nativen Code"
#: ports/esp8266/modesp.c:317
msgid "flash location must be below 1MByte"
-msgstr ""
+msgstr "flash location muss unter 1MByte sein"
#: ports/esp8266/modmachine.c:63
msgid "frequency can only be either 80Mhz or 160MHz"
-msgstr ""
+msgstr "Die Frequenz kann nur 80Mhz oder 160Mhz sein"
#: ports/esp8266/modnetwork.c:61
msgid "AP required"
-msgstr ""
+msgstr "AP erforderlich"
#: ports/esp8266/modnetwork.c:61
msgid "STA required"
-msgstr ""
+msgstr "STA erforderlich"
#: ports/esp8266/modnetwork.c:87
msgid "Cannot update i/f status"
-msgstr ""
+msgstr "Kann i/f Status nicht updaten"
#: ports/esp8266/modnetwork.c:142
msgid "Cannot set STA config"
-msgstr ""
+msgstr "Kann STA Konfiguration nicht setzen"
#: ports/esp8266/modnetwork.c:144
msgid "Cannot connect to AP"
-msgstr ""
+msgstr "Kann nicht zu AP verbinden"
#: ports/esp8266/modnetwork.c:152
msgid "Cannot disconnect from AP"
-msgstr ""
+msgstr "Kann nicht trennen von AP"
#: ports/esp8266/modnetwork.c:173
msgid "unknown status param"
-msgstr ""
+msgstr "Unbekannter Statusparameter"
#: ports/esp8266/modnetwork.c:222
msgid "STA must be active"
-msgstr ""
+msgstr "STA muss aktiv sein"
#: ports/esp8266/modnetwork.c:239
msgid "scan failed"
-msgstr ""
+msgstr "Scan fehlgeschlagen"
#: ports/esp8266/modnetwork.c:306
msgid "wifi_set_ip_info() failed"
-msgstr ""
+msgstr "wifi_set_ip_info() fehlgeschlagen"
#: ports/esp8266/modnetwork.c:319
msgid "either pos or kw args are allowed"
@@ -704,7 +708,7 @@ msgstr ""
msgid "AnalogOut functionality not supported"
msgstr ""
-#: ports/nrf/common-hal/busio/I2C.c:95
+#: ports/nrf/common-hal/busio/I2C.c:96
#, fuzzy
msgid "All I2C peripherals are in use"
msgstr "Alle timer werden benutzt"
@@ -742,7 +746,7 @@ msgstr ""
msgid "Can not get temperature. status: 0x%02x"
msgstr ""
-#: ports/nrf/common-hal/pulseio/PWMOut.c:162
+#: ports/nrf/common-hal/pulseio/PWMOut.c:161
#, fuzzy
msgid "All PWM peripherals are in use"
msgstr "Alle timer werden benutzt"
@@ -949,19 +953,19 @@ msgstr ""
msgid "bad compile mode"
msgstr ""
-#: py/builtinimport.c:338
+#: py/builtinimport.c:336
msgid "cannot perform relative import"
msgstr ""
-#: py/builtinimport.c:422 py/builtinimport.c:534
+#: py/builtinimport.c:420 py/builtinimport.c:532
msgid "module not found"
msgstr ""
-#: py/builtinimport.c:425 py/builtinimport.c:537
+#: py/builtinimport.c:423 py/builtinimport.c:535
msgid "no module named '%q'"
msgstr ""
-#: py/builtinimport.c:512
+#: py/builtinimport.c:510
msgid "relative import"
msgstr ""
@@ -2009,7 +2013,7 @@ msgid "AnalogOut is only 16 bits. Value must be less than 65536."
msgstr ""
#: shared-bindings/audiobusio/I2SOut.c:225
-#: shared-bindings/audioio/AudioOut.c:223
+#: shared-bindings/audioio/AudioOut.c:226
msgid "Not playing"
msgstr ""
@@ -2220,7 +2224,7 @@ msgstr ""
#: shared-bindings/microcontroller/Pin.c:89
#: shared-bindings/neopixel_write/__init__.c:67
-#: shared-bindings/pulseio/PulseOut.c:75
+#: shared-bindings/pulseio/PulseOut.c:76
msgid "Expected a %q"
msgstr ""
@@ -2282,7 +2286,7 @@ msgstr ""
msgid "Read-only"
msgstr ""
-#: shared-bindings/pulseio/PulseOut.c:134
+#: shared-bindings/pulseio/PulseOut.c:135
msgid "Array must contain halfwords (type 'H')"
msgstr ""
@@ -2311,7 +2315,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr ""
-#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:64
+#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81
msgid "no available NIC"
msgstr ""
@@ -2339,15 +2343,15 @@ msgstr ""
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
-#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:250
+#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:264
msgid "Tuple or struct_time argument required"
msgstr ""
-#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:255
+#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:269
msgid "function takes exactly 9 arguments"
msgstr ""
-#: shared-bindings/time/__init__.c:226 shared-bindings/time/__init__.c:259
+#: shared-bindings/time/__init__.c:240 shared-bindings/time/__init__.c:273
msgid "timestamp out of range for platform time_t"
msgstr ""
diff --git a/locale/en_US.po b/locale/en_US.po
index 8bc73ad5c..db06a23ff 100644
--- a/locale/en_US.po
+++ b/locale/en_US.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-11 22:08+1100\n"
+"POT-Creation-Date: 2018-10-25 12:20+1100\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -147,7 +147,7 @@ msgstr ""
msgid "invalid arguments"
msgstr ""
-#: lib/utils/pyexec.c:97 py/builtinimport.c:253
+#: lib/utils/pyexec.c:97 py/builtinimport.c:251
msgid "script compilation not supported"
msgstr ""
@@ -291,12 +291,12 @@ msgid "Too many channels in sample."
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:339
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417
msgid "No DMA channel found"
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:341
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419
msgid "Unable to allocate buffers for signed conversion"
msgstr ""
@@ -312,43 +312,44 @@ msgstr ""
msgid "sampling rate out of range"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:69
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132
msgid "DAC already in use"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:73
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136
msgid "Right channel unsupported"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:76
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116
#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65
msgid "Invalid pin"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:84
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147
msgid "Invalid pin for left channel"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:88
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151
msgid "Invalid pin for right channel"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:91
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154
msgid "Cannot output both channels on the same pin"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:176
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110
+#: ports/nrf/common-hal/pulseio/PulseOut.c:107
msgid "All timers in use"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:218
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285
msgid "All event channels in use"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:297
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr ""
@@ -361,7 +362,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/busio/SPI.c:132
#: ports/atmel-samd/common-hal/busio/UART.c:119
#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45
-#: ports/nrf/common-hal/busio/I2C.c:81
+#: ports/nrf/common-hal/busio/I2C.c:82
msgid "Invalid pins"
msgstr ""
@@ -413,7 +414,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369
-#: ports/nrf/common-hal/pulseio/PWMOut.c:120
+#: ports/nrf/common-hal/pulseio/PWMOut.c:119
#: ports/nrf/common-hal/pulseio/PWMOut.c:233
msgid "Invalid PWM frequency"
msgstr ""
@@ -695,7 +696,7 @@ msgstr ""
msgid "AnalogOut functionality not supported"
msgstr ""
-#: ports/nrf/common-hal/busio/I2C.c:95
+#: ports/nrf/common-hal/busio/I2C.c:96
msgid "All I2C peripherals are in use"
msgstr ""
@@ -729,7 +730,7 @@ msgstr ""
msgid "Can not get temperature. status: 0x%02x"
msgstr ""
-#: ports/nrf/common-hal/pulseio/PWMOut.c:162
+#: ports/nrf/common-hal/pulseio/PWMOut.c:161
msgid "All PWM peripherals are in use"
msgstr ""
@@ -935,19 +936,19 @@ msgstr ""
msgid "bad compile mode"
msgstr ""
-#: py/builtinimport.c:338
+#: py/builtinimport.c:336
msgid "cannot perform relative import"
msgstr ""
-#: py/builtinimport.c:422 py/builtinimport.c:534
+#: py/builtinimport.c:420 py/builtinimport.c:532
msgid "module not found"
msgstr ""
-#: py/builtinimport.c:425 py/builtinimport.c:537
+#: py/builtinimport.c:423 py/builtinimport.c:535
msgid "no module named '%q'"
msgstr ""
-#: py/builtinimport.c:512
+#: py/builtinimport.c:510
msgid "relative import"
msgstr ""
@@ -1994,7 +1995,7 @@ msgid "AnalogOut is only 16 bits. Value must be less than 65536."
msgstr ""
#: shared-bindings/audiobusio/I2SOut.c:225
-#: shared-bindings/audioio/AudioOut.c:223
+#: shared-bindings/audioio/AudioOut.c:226
msgid "Not playing"
msgstr ""
@@ -2201,7 +2202,7 @@ msgstr ""
#: shared-bindings/microcontroller/Pin.c:89
#: shared-bindings/neopixel_write/__init__.c:67
-#: shared-bindings/pulseio/PulseOut.c:75
+#: shared-bindings/pulseio/PulseOut.c:76
msgid "Expected a %q"
msgstr ""
@@ -2263,7 +2264,7 @@ msgstr ""
msgid "Read-only"
msgstr ""
-#: shared-bindings/pulseio/PulseOut.c:134
+#: shared-bindings/pulseio/PulseOut.c:135
msgid "Array must contain halfwords (type 'H')"
msgstr ""
@@ -2292,7 +2293,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr ""
-#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:64
+#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81
msgid "no available NIC"
msgstr ""
@@ -2320,15 +2321,15 @@ msgstr ""
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
-#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:250
+#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:264
msgid "Tuple or struct_time argument required"
msgstr ""
-#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:255
+#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:269
msgid "function takes exactly 9 arguments"
msgstr ""
-#: shared-bindings/time/__init__.c:226 shared-bindings/time/__init__.c:259
+#: shared-bindings/time/__init__.c:240 shared-bindings/time/__init__.c:273
msgid "timestamp out of range for platform time_t"
msgstr ""
diff --git a/locale/es.po b/locale/es.po
index ee97a192c..fd92071c0 100644
--- a/locale/es.po
+++ b/locale/es.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-11 22:08+1100\n"
+"POT-Creation-Date: 2018-10-25 12:20+1100\n"
"PO-Revision-Date: 2018-08-24 22:56-0500\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -65,7 +65,7 @@ msgstr "string de longitud impar"
#: extmod/modubinascii.c:101
msgid "non-hex digit found"
-msgstr "se encontró un digito no hexadecimal"
+msgstr "se encontró un digito non-hex"
#: extmod/modubinascii.c:169
msgid "incorrect padding"
@@ -81,7 +81,7 @@ msgstr "No se puede obtener inequívocamente sizeof escalar"
#: extmod/moductypes.c:397
msgid "struct: no fields"
-msgstr "struct: no fields"
+msgstr "struct: sin campos"
#: extmod/moductypes.c:530
msgid "struct: cannot index"
@@ -121,7 +121,7 @@ msgstr "certificado inválido"
#: extmod/modutimeq.c:131
msgid "queue overflow"
-msgstr "desborde de queue"
+msgstr "desbordamiento de queue"
#: extmod/moduzlib.c:98
msgid "compression header"
@@ -132,16 +132,14 @@ msgid "invalid dupterm index"
msgstr "index dupterm inválido"
#: extmod/vfs_fat.c:426 py/moduerrno.c:150
-#, fuzzy
msgid "Read-only filesystem"
-msgstr "sistema de archivos de Solo-Lectura"
+msgstr "Sistema de archivos de solo-Lectura"
#: extmod/vfs_posix_file.c:48 ports/unix/file.c:50 py/objstringio.c:43
msgid "I/O operation on closed file"
msgstr "Operación I/O en archivo cerrado"
#: lib/embed/abort_.c:8
-#, fuzzy
msgid "abort() called"
msgstr "se llamó abort()"
@@ -149,7 +147,7 @@ msgstr "se llamó abort()"
msgid "invalid arguments"
msgstr "argumentos inválidos"
-#: lib/utils/pyexec.c:97 py/builtinimport.c:253
+#: lib/utils/pyexec.c:97 py/builtinimport.c:251
msgid "script compilation not supported"
msgstr "script de compilación no soportado"
@@ -158,21 +156,20 @@ msgid " output:\n"
msgstr " salida:\n"
#: main.c:167 main.c:240
-#, fuzzy
msgid ""
"Auto-reload is on. Simply save files over USB to run them or enter REPL to "
"disable.\n"
msgstr ""
"Auto-reload habilitado. Simplemente guarda los archivos via USB para "
-"ejecutarlos o entra REPL para desabilitarlos.\n"
+"ejecutarlos o entra al REPL para desabilitarlos.\n"
#: main.c:169
msgid "Running in safe mode! Auto-reload is off.\n"
-msgstr "Ejecutando en modo seguro! Auto-recarga esta deshabilitado.\n"
+msgstr "Ejecutando en modo seguro! La auto-recarga esta deshabilitada.\n"
#: main.c:171 main.c:242
msgid "Auto-reload is off.\n"
-msgstr "Auto-reload deshabilitado.\n"
+msgstr "Auto-recarga deshabilitada.\n"
#: main.c:185
msgid "Running in safe mode! Not running saved code.\n"
@@ -184,7 +181,7 @@ msgstr "ADVERTENCIA: El nombre de archivo de tu código tiene dos extensiones\n"
#: main.c:249
msgid "You requested starting safe mode by "
-msgstr "Solicitaste iniciar en modo seguro con "
+msgstr "Solicitaste iniciar en modo seguro por "
#: main.c:252
msgid "To exit, please reset the board without "
@@ -199,29 +196,29 @@ msgstr ""
#: main.c:261
msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
-msgstr ""
-"Parece que nuestro código del núcleo CircuitPython dejó de funcionar. "
-"Whoops!\n"
+msgstr "Parece que nuestro código CircuitPython dejó de funcionar. Whoops!\n"
#: main.c:262
#, fuzzy
msgid "Please file an issue here with the contents of your CIRCUITPY drive:\n"
msgstr ""
-"Por favor registra un problema aquí con los contenidos de tu unidad de "
-"almacenamiento CIRCUITPY:\n"
+"Por favor registra un issue en el siguiente URL con los contenidos de tu "
+"unidad de almacenamiento CIRCUITPY:\n"
#: main.c:265
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:266
msgid ""
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
-"suficiente poder para todo el circuito y pulsa reset (después de expulsar "
+"suficiente poder para todo el circuito y presiona reset (después de expulsar "
"CIRCUITPY).\n"
#: main.c:270
@@ -261,7 +258,7 @@ msgstr "Sin bus UART por default"
#: ports/atmel-samd/common-hal/analogio/AnalogIn.c:63
#: ports/nrf/common-hal/analogio/AnalogIn.c:39
msgid "Pin does not have ADC capabilities"
-msgstr "pin no tiene capacidades ADC"
+msgstr "Pin no tiene capacidad ADC"
#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:49
msgid "No DAC on chip"
@@ -278,7 +275,7 @@ msgstr "Pin bit clock inválido"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:153
msgid "Bit clock and word select must share a clock unit"
-msgstr "Bit clock y Word select deben compartir la unidad de reloj"
+msgstr "Bit clock y word select deben compartir una unidad de reloj"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:156
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:130
@@ -299,19 +296,19 @@ msgstr "Clock unit está siendo utilizado"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:240
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:172
msgid "Unable to find free GCLK"
-msgstr "No se pudo encontrar un GCLK disponible"
+msgstr "No se pudo encontrar un GCLK libre"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:254
msgid "Too many channels in sample."
-msgstr "Demasiados canales en sample"
+msgstr "Demasiados canales en sample."
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:339
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417
msgid "No DMA channel found"
msgstr "No se encontró el canal DMA"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:341
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419
msgid "Unable to allocate buffers for signed conversion"
msgstr "No se pudieron asignar buffers para la conversión con signo"
@@ -321,52 +318,53 @@ msgstr "Pin clock inválido"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:134
msgid "Only 8 or 16 bit mono with "
-msgstr "Solo mono de 8 o 16 bit con"
+msgstr "Solo mono de 8 o 16 bit con "
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:167
msgid "sampling rate out of range"
-msgstr "velocidad de muestreo fuera de rango"
+msgstr "frecuencia de muestreo fuera de rango"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:69
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132
msgid "DAC already in use"
msgstr "DAC ya está siendo utilizado"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:73
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136
msgid "Right channel unsupported"
-msgstr "El canal derecho no tiene soporte"
+msgstr "Canal derecho no soportado"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:76
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116
#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65
msgid "Invalid pin"
-msgstr "pin inválido"
+msgstr "Pin inválido"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:84
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147
msgid "Invalid pin for left channel"
msgstr "Pin inválido para canal izquierdo"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:88
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151
msgid "Invalid pin for right channel"
msgstr "Pin inválido para canal derecho"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:91
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154
msgid "Cannot output both channels on the same pin"
-msgstr "No es posible utilizar el mismo pin para ambos canales"
+msgstr "No se puede tener ambos canales en el mismo pin"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:176
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110
+#: ports/nrf/common-hal/pulseio/PulseOut.c:107
msgid "All timers in use"
-msgstr "Todos los timers están siendo utilizados"
+msgstr "Todos los timers en uso"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:218
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285
msgid "All event channels in use"
-msgstr "Todos los canales de eventos están siendo utilizados"
+msgstr "Todos los event channels en uso"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:297
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375
#, c-format
msgid "Sample rate too high. It must be less than %d"
-msgstr "Frecuencia de muestreo demasiado alta. Debe ser menor que %d"
+msgstr "Frecuencia de muestreo demasiado alta. Debe ser menor a %d"
#: ports/atmel-samd/common-hal/busio/I2C.c:71
msgid "Not enough pins available"
@@ -376,7 +374,7 @@ msgstr "No hay suficientes pines disponibles"
#: ports/atmel-samd/common-hal/busio/SPI.c:132
#: ports/atmel-samd/common-hal/busio/UART.c:119
#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45
-#: ports/nrf/common-hal/busio/I2C.c:81
+#: ports/nrf/common-hal/busio/I2C.c:82
msgid "Invalid pins"
msgstr "pines inválidos"
@@ -386,25 +384,25 @@ msgstr "SDA o SCL necesitan una pull up"
#: ports/atmel-samd/common-hal/busio/I2C.c:121
msgid "Unsupported baudrate"
-msgstr "Baudrate sin soporte"
+msgstr "Baudrate no soportado"
#: ports/atmel-samd/common-hal/busio/UART.c:66
msgid "bytes > 8 bits not supported"
-msgstr "bytes > 8 bits no son soportados"
+msgstr "bytes > 8 bits no soportados"
#: ports/atmel-samd/common-hal/busio/UART.c:72
#: ports/nrf/common-hal/busio/UART.c:82
msgid "tx and rx cannot both be None"
-msgstr "tx y rx no pueden ser ambos None"
+msgstr "Ambos tx y rx no pueden ser None"
#: ports/atmel-samd/common-hal/busio/UART.c:145
#: ports/nrf/common-hal/busio/UART.c:115
msgid "Failed to allocate RX buffer"
-msgstr "Fallo la asignación del buffer RX"
+msgstr "Ha fallado la asignación del buffer RX"
#: ports/atmel-samd/common-hal/busio/UART.c:153
msgid "Could not initialize UART"
-msgstr "No se pudo inicializar la UART"
+msgstr "No se puede inicializar la UART"
#: ports/atmel-samd/common-hal/busio/UART.c:240
#: ports/nrf/common-hal/busio/UART.c:149
@@ -419,16 +417,16 @@ msgstr "Sin pin TX"
#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c:170
#: ports/nrf/common-hal/digitalio/DigitalInOut.c:142
msgid "Cannot get pull while in output mode"
-msgstr "No se puede obtener pull mientras en modo de salida"
+msgstr "No puede ser pull mientras este en modo de salida"
#: ports/atmel-samd/common-hal/microcontroller/__init__.c:74
#: ports/esp8266/common-hal/microcontroller/__init__.c:64
msgid "Cannot reset into bootloader because no bootloader is present."
-msgstr "No se puede reiniciar en bootloader porque no hay bootloader presente."
+msgstr "No se puede reiniciar a bootloader porque no hay bootloader presente."
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369
-#: ports/nrf/common-hal/pulseio/PWMOut.c:120
+#: ports/nrf/common-hal/pulseio/PWMOut.c:119
#: ports/nrf/common-hal/pulseio/PWMOut.c:233
msgid "Invalid PWM frequency"
msgstr "Frecuencia PWM inválida"
@@ -439,7 +437,7 @@ msgstr "Todos los timers para este pin están siendo utilizados"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:110
msgid "No hardware support on pin"
-msgstr "pin no tiene soporte en hardware"
+msgstr "Sin soporte de hardware en pin"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:113
msgid "EXTINT channel already in use"
@@ -449,12 +447,12 @@ msgstr "El canal EXTINT ya está siendo utilizado"
#: ports/esp8266/common-hal/pulseio/PulseIn.c:86
#, c-format
msgid "Failed to allocate RX buffer of %d bytes"
-msgstr "Fallo la asignación del buffer RX de %d bytes"
+msgstr "Falló la asignación del buffer RX de %d bytes"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205
#: ports/esp8266/common-hal/pulseio/PulseIn.c:151
msgid "pop from an empty PulseIn"
-msgstr "pop en un PulseIn vacío"
+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
@@ -475,7 +473,7 @@ msgstr "El canal EXTINT ya está siendo utilizado"
#: ports/atmel-samd/common-hal/rtc/RTC.c:101
msgid "calibration value out of range +/-127"
-msgstr "Valor de calibración fuera de rango +/-127"
+msgstr "Valor de calibración fuera del rango +/-127"
#: ports/atmel-samd/common-hal/storage/__init__.c:48
msgid "Cannot remount '/' when USB is active."
@@ -503,11 +501,11 @@ msgstr "Error USB"
#: ports/esp8266/common-hal/analogio/AnalogIn.c:43
msgid "Pin %q does not have ADC capabilities"
-msgstr "Pin %q no tiene capacidades ADC"
+msgstr "Pin %q no tiene capacidades de ADC"
#: ports/esp8266/common-hal/analogio/AnalogOut.c:39
msgid "No hardware support for analog out."
-msgstr "Sin soporte de hardware para salida análoga"
+msgstr "Sin soporte de hardware para analog out"
#: ports/esp8266/common-hal/busio/SPI.c:72
msgid "Pins not valid for SPI"
@@ -527,21 +525,21 @@ msgstr "stop bits inválidos"
#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:200
msgid "ESP8266 does not support pull down."
-msgstr "ESP8266 no tiene soporte para pull down"
+msgstr "ESP8266 no soporta pull down."
#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:210
msgid "GPIO16 does not support pull up."
-msgstr "GPIO16 no tiene soporte para pull up."
+msgstr "GPIO16 no soporta pull up."
#: ports/esp8266/common-hal/microcontroller/__init__.c:66
msgid "ESP8226 does not support safe mode."
-msgstr "ESP8226 no tiene soporte para modo seguro"
+msgstr "ESP8226 no soporta modo seguro."
#: ports/esp8266/common-hal/pulseio/PWMOut.c:54
#: ports/esp8266/common-hal/pulseio/PWMOut.c:113
#, c-format
msgid "Maximum PWM frequency is %dhz."
-msgstr "La frecuencia máxima del PWM es %dhz"
+msgstr "La frecuencia máxima del PWM es %dhz."
#: ports/esp8266/common-hal/pulseio/PWMOut.c:57
#: ports/esp8266/common-hal/pulseio/PWMOut.c:116
@@ -552,7 +550,7 @@ msgstr "La frecuencia mínima del PWM es 1hz"
#, c-format
msgid "Multiple PWM frequencies not supported. PWM already set to %dhz."
msgstr ""
-"PWM de múltiples frecuencias no tiene soporte. El PWM ya se estableció a %dhz"
+"PWM de múltiples frecuencias no soportado. El PWM ya se estableció a %dhz"
#: ports/esp8266/common-hal/pulseio/PWMOut.c:77 ports/esp8266/machine_pwm.c:70
#, c-format
@@ -561,11 +559,11 @@ msgstr "El pin %d no soporta PWM"
#: ports/esp8266/common-hal/pulseio/PulseIn.c:78
msgid "No PulseIn support for %q"
-msgstr "%q no tiene soporte para PulseIn"
+msgstr "Sin soporte PulseIn para %q"
#: ports/esp8266/common-hal/storage/__init__.c:34
msgid "Unable to remount filesystem"
-msgstr "No se pudo montar de nuevo el sistema de archivos"
+msgstr "Incapaz de montar de nuevo el sistema de archivos"
#: ports/esp8266/common-hal/storage/__init__.c:38
msgid "Use esptool to erase flash and re-upload Python instead"
@@ -590,7 +588,7 @@ msgstr "esperando un pin"
#: ports/esp8266/machine_pin.c:284
msgid "Pin(16) doesn't support pull"
-msgstr "Pin(16) no tiene soporte para pull"
+msgstr "Pin(16) no soporta para pull"
#: ports/esp8266/machine_pin.c:323
msgid "invalid pin"
@@ -598,7 +596,7 @@ msgstr "pin inválido"
#: ports/esp8266/machine_pin.c:389
msgid "pin does not have IRQ capabilities"
-msgstr "pin no tiene capacidades IRQ"
+msgstr "pin sin capacidades IRQ"
#: ports/esp8266/machine_rtc.c:185
msgid "buffer too long"
@@ -625,8 +623,7 @@ msgstr "len debe de ser múltiple de 4"
#: ports/esp8266/modesp.c:274
#, c-format
msgid "memory allocation failed, allocating %u bytes for native code"
-msgstr ""
-"la asignación de memoria ha fallado, asignando %u bytes para código nativo"
+msgstr "falló la asignación de memoria, asignando %u bytes para código nativo"
#: ports/esp8266/modesp.c:317
msgid "flash location must be below 1MByte"
@@ -638,11 +635,11 @@ msgstr "la frecuencia solo puede ser 80MHz o 160MHz"
#: ports/esp8266/modnetwork.c:61
msgid "AP required"
-msgstr "AP necesario"
+msgstr "AP requerido"
#: ports/esp8266/modnetwork.c:61
msgid "STA required"
-msgstr "STA necesario"
+msgstr "STA requerido"
#: ports/esp8266/modnetwork.c:87
msgid "Cannot update i/f status"
@@ -712,13 +709,13 @@ msgstr "parámetro config desconocido"
msgid "AnalogOut functionality not supported"
msgstr "Funcionalidad AnalogOut no soportada"
-#: ports/nrf/common-hal/busio/I2C.c:95
+#: ports/nrf/common-hal/busio/I2C.c:96
msgid "All I2C peripherals are in use"
-msgstr "Todos los timers están siendo utilizados"
+msgstr "Todos los timers están siendo usados"
#: ports/nrf/common-hal/busio/SPI.c:115
msgid "All SPI peripherals are in use"
-msgstr "Todos los timers están siendo utilizados"
+msgstr "Todos los timers están siendo usados"
#: ports/nrf/common-hal/busio/UART.c:48
#, c-format
@@ -746,10 +743,9 @@ msgstr "busio.UART no disponible"
msgid "Can not get temperature. status: 0x%02x"
msgstr "No se puede obtener la temperatura. status: 0x%02x"
-#: ports/nrf/common-hal/pulseio/PWMOut.c:162
-#, fuzzy
+#: ports/nrf/common-hal/pulseio/PWMOut.c:161
msgid "All PWM peripherals are in use"
-msgstr "Todos los timers están siendo utilizados"
+msgstr "Todos los periféricos PWM en uso"
#: ports/nrf/drivers/bluetooth/ble_drv.c:199
msgid "Cannot apply GAP parameters."
@@ -765,16 +761,16 @@ msgstr "No se puede consultar la dirección del dispositivo."
#: ports/nrf/drivers/bluetooth/ble_drv.c:264
msgid "Can not add Vendor Specific 128-bit UUID."
-msgstr "No se puede agregar el UUID de 128-bits Especifico del Vendedor."
+msgstr "No se puede agregar el Vendor Specific 128-bit UUID."
#: ports/nrf/drivers/bluetooth/ble_drv.c:284
#: ports/nrf/drivers/bluetooth/ble_drv.c:298
msgid "Can not add Service."
-msgstr "No se puede agregar el Servicio"
+msgstr "No se puede agregar el Servicio."
#: ports/nrf/drivers/bluetooth/ble_drv.c:373
msgid "Can not add Characteristic."
-msgstr "No se puede agregar la Característica"
+msgstr "No se puede agregar la Característica."
#: ports/nrf/drivers/bluetooth/ble_drv.c:400
msgid "Can not apply device name in the stack."
@@ -854,15 +850,15 @@ msgstr "Longitud de string UUID inválida"
#: ports/unix/modffi.c:138
msgid "Unknown type"
-msgstr ""
+msgstr "Tipo desconocido"
#: ports/unix/modffi.c:207 ports/unix/modffi.c:265
msgid "Error in ffi_prep_cif"
-msgstr ""
+msgstr "Error en ffi_prep_cif"
#: ports/unix/modffi.c:270
msgid "ffi_prep_closure_loc"
-msgstr ""
+msgstr "ffi_prep_closure_loc"
#: ports/unix/modffi.c:413
msgid "Don't know how to pass object to native function"
@@ -871,30 +867,30 @@ msgstr ""
#: ports/unix/modusocket.c:474
#, c-format
msgid "[addrinfo error %d]"
-msgstr ""
+msgstr "[addrinfo error %d]"
#: py/argcheck.c:44
msgid "function does not take keyword arguments"
-msgstr ""
+msgstr "la función no tiene argumentos por palabra clave"
#: py/argcheck.c:54 py/bc.c:85 py/objnamedtuple.c:104
#, c-format
msgid "function takes %d positional arguments but %d were given"
-msgstr ""
+msgstr "la función toma %d argumentos posicionales pero le fueron dados %d"
#: py/argcheck.c:64
#, c-format
msgid "function missing %d required positional arguments"
-msgstr ""
+msgstr "a la función le hacen falta %d argumentos posicionales requeridos"
#: py/argcheck.c:72
#, c-format
msgid "function expected at most %d arguments, got %d"
-msgstr ""
+msgstr "la función esperaba a lo sumo %d argumentos, tiene %d"
#: py/argcheck.c:97
msgid "'%q' argument required"
-msgstr ""
+msgstr "argumento '%q' requerido"
#: py/argcheck.c:122
msgid "extra positional arguments given"
@@ -918,11 +914,11 @@ msgstr ""
#: py/bc.c:197 py/bc.c:215
msgid "unexpected keyword argument"
-msgstr ""
+msgstr "argumento por palabra clave inesperado"
#: py/bc.c:199
msgid "keywords must be strings"
-msgstr ""
+msgstr "palabras clave deben ser strings"
#: py/bc.c:206 py/objnamedtuple.c:138
msgid "function got multiple values for argument '%q'"
@@ -953,19 +949,19 @@ msgstr ""
msgid "bad compile mode"
msgstr ""
-#: py/builtinimport.c:338
+#: py/builtinimport.c:336
msgid "cannot perform relative import"
msgstr ""
-#: py/builtinimport.c:422 py/builtinimport.c:534
+#: py/builtinimport.c:420 py/builtinimport.c:532
msgid "module not found"
msgstr "módulo no encontrado"
-#: py/builtinimport.c:425 py/builtinimport.c:537
+#: py/builtinimport.c:423 py/builtinimport.c:535
msgid "no module named '%q'"
msgstr "ningún módulo se llama '%q'"
-#: py/builtinimport.c:512
+#: py/builtinimport.c:510
msgid "relative import"
msgstr "import relativo"
@@ -1134,7 +1130,7 @@ msgid "'%s' expects a register"
msgstr ""
#: py/emitinlinethumb.c:211
-#, fuzzy, c-format
+#, c-format
msgid "'%s' expects a special register"
msgstr "ord espera un carácter"
@@ -1178,7 +1174,6 @@ msgid "unsupported Thumb instruction '%s' with %d arguments"
msgstr ""
#: py/emitinlinethumb.c:810
-#, fuzzy
msgid "branch not in range"
msgstr "El argumento de chr() no esta en el rango(256)"
@@ -1345,14 +1340,12 @@ msgid "File exists"
msgstr ""
#: py/moduerrno.c:148
-#, fuzzy
msgid "Unsupported operation"
-msgstr "El pin %d no soporta PWM"
+msgstr "Operacion no soportada"
#: py/moduerrno.c:149
-#, fuzzy
msgid "Invalid argument"
-msgstr "argumentos inválidos"
+msgstr "Argumento inválido"
#: py/obj.c:90
msgid "Traceback (most recent call last):\n"
@@ -1424,9 +1417,8 @@ msgid "%q indices must be integers, not %s"
msgstr ""
#: py/obj.c:423
-#, fuzzy
msgid "%q index out of range"
-msgstr "struct: index fuera de rango"
+msgstr "%w index fuera de rango"
#: py/obj.c:455
msgid "object has no len"
@@ -1438,9 +1430,8 @@ msgid "object of type '%s' has no len()"
msgstr ""
#: py/obj.c:496
-#, fuzzy
msgid "object does not support item deletion"
-msgstr "ESP8226 no soporta modo seguro"
+msgstr "object no soporta supresión de item"
#: py/obj.c:499
#, c-format
@@ -1499,9 +1490,8 @@ msgid "full"
msgstr ""
#: py/objdeque.c:127
-#, fuzzy
msgid "empty"
-msgstr "heap vacío"
+msgstr "vacío"
#: py/objdict.c:314
msgid "popitem(): dictionary is empty"
@@ -1512,9 +1502,8 @@ msgid "dict update sequence has wrong length"
msgstr ""
#: py/objfloat.c:308 py/parsenum.c:331
-#, fuzzy
msgid "complex values not supported"
-msgstr "script de compilación no soportado"
+msgstr "valores complejos no soportados"
#: py/objgenerator.c:108
msgid "can't send non-None value to a just-started generator"
@@ -1545,9 +1534,8 @@ msgid "float too big"
msgstr ""
#: py/objint.c:328
-#, fuzzy
msgid "long int not supported in this build"
-msgstr "AnalogOut no es soportado por el pin dado"
+msgstr "long int no soportado en esta compilación"
#: py/objint.c:334 py/objint.c:340 py/objint.c:350 py/objint.c:358
msgid "small int overflow"
@@ -1586,9 +1574,8 @@ msgid "can't set attribute"
msgstr ""
#: py/objobject.c:55
-#, fuzzy
msgid "__new__ arg must be a user-type"
-msgstr "heap debe ser una lista"
+msgstr "__new__ arg debe ser un user-type"
#: py/objrange.c:110
msgid "zero step"
@@ -1599,9 +1586,8 @@ msgid "pop from an empty set"
msgstr ""
#: py/objslice.c:66
-#, fuzzy
msgid "Length must be an int"
-msgstr "heap debe ser una lista"
+msgstr "Length debe ser un int"
#: py/objslice.c:71
msgid "Length must be non-negative"
@@ -1616,9 +1602,8 @@ msgid "Cannot subclass slice"
msgstr ""
#: py/objstr.c:261
-#, fuzzy
msgid "bytes value out of range"
-msgstr "Valor de calibración fuera de rango +/-127"
+msgstr "valor de bytes fuera de rango"
#: py/objstr.c:270
msgid "wrong number of arguments"
@@ -1629,18 +1614,16 @@ msgid "join expects a list of str/bytes objects consistent with self object"
msgstr ""
#: py/objstr.c:542 py/objstr.c:647 py/objstr.c:1744
-#, fuzzy
msgid "empty separator"
-msgstr "heap vacío"
+msgstr "separator vacío"
#: py/objstr.c:641
msgid "rsplit(None,n)"
msgstr ""
#: py/objstr.c:713
-#, fuzzy
msgid "substring not found"
-msgstr "módulo no encontrado"
+msgstr "substring no encontrado"
#: py/objstr.c:770
msgid "start/end indices"
@@ -1681,14 +1664,12 @@ msgid ""
msgstr ""
#: py/objstr.c:1055 py/objstr.c:1083
-#, fuzzy
msgid "tuple index out of range"
-msgstr "struct: index fuera de rango"
+msgstr "tuple index fuera de rango"
#: py/objstr.c:1071
-#, fuzzy
msgid "attributes not supported yet"
-msgstr "bytes > 8 bits no soportados"
+msgstr "atributos aún no soportados"
#: py/objstr.c:1079
msgid ""
@@ -1696,9 +1677,8 @@ msgid ""
msgstr ""
#: py/objstr.c:1171
-#, fuzzy
msgid "invalid format specifier"
-msgstr "formato inválido"
+msgstr "especificador de formato inválido"
#: py/objstr.c:1192
msgid "sign not allowed in string format specifier"
@@ -1736,9 +1716,8 @@ msgid "incomplete format key"
msgstr ""
#: py/objstr.c:1482
-#, fuzzy
msgid "incomplete format"
-msgstr "formato inválido"
+msgstr "formato incompleto"
#: py/objstr.c:1490
msgid "not enough arguments for format string"
@@ -1776,9 +1755,8 @@ msgid "string indices must be integers, not %s"
msgstr ""
#: py/objstrunicode.c:145 py/objstrunicode.c:164
-#, fuzzy
msgid "string index out of range"
-msgstr "struct: index fuera de rango"
+msgstr "string index fuera de rango"
#: py/objtype.c:358
msgid "__init__() should return None"
@@ -1827,9 +1805,8 @@ msgid "type '%q' is not an acceptable base type"
msgstr ""
#: py/objtype.c:1137
-#, fuzzy
msgid "multiple inheritance not supported"
-msgstr "operación I2C no soportada"
+msgstr "herencia multiple no soportada"
#: py/objtype.c:1164
msgid "multiple bases have instance lay-out conflict"
@@ -1848,14 +1825,12 @@ msgid "issubclass() arg 1 must be a class"
msgstr ""
#: py/parse.c:726
-#, fuzzy
msgid "constant must be an integer"
-msgstr "heap debe ser una lista"
+msgstr "constant debe ser un entero"
#: py/parse.c:868
-#, fuzzy
msgid "Unable to init parser"
-msgstr "No se pudo encontrar un GCLK disponible"
+msgstr "Incapaz de inicializar el parser"
#: py/parse.c:1170
msgid "unexpected indent"
@@ -1871,7 +1846,7 @@ msgstr ""
#: py/parsenum.c:151
msgid "invalid syntax for integer"
-msgstr "formato inválido"
+msgstr "sintaxis inválido para entero"
#: py/parsenum.c:155
#, c-format
@@ -1880,11 +1855,11 @@ msgstr ""
#: py/parsenum.c:339
msgid "invalid syntax for number"
-msgstr "argumentos inválidos"
+msgstr "sintaxis inválido para número"
#: py/parsenum.c:342
msgid "decimal numbers not supported"
-msgstr "bytes > 8 bits no son soportados"
+msgstr "números decimales no soportados"
#: py/persistentcode.c:223
msgid ""
@@ -1898,7 +1873,7 @@ msgstr ""
#: py/runtime.c:206
msgid "name not defined"
-msgstr "módulo no encontrado"
+msgstr "name no definido"
#: py/runtime.c:209
msgid "name '%q' is not defined"
@@ -1973,9 +1948,8 @@ msgid "exceptions must derive from BaseException"
msgstr ""
#: py/runtime.c:1430
-#, fuzzy
msgid "cannot import name %q"
-msgstr "ningún módulo se llama '%q'"
+msgstr "no se puede importar name '%q'"
#: py/runtime.c:1535
msgid "memory allocation failed, heap is locked"
@@ -1995,9 +1969,8 @@ msgid "object not in sequence"
msgstr ""
#: py/stream.c:96
-#, fuzzy
msgid "stream operation not supported"
-msgstr "operación I2C no soportada"
+msgstr "operación stream no soportada"
#: py/vm.c:255
msgid "local variable referenced before assignment"
@@ -2036,7 +2009,7 @@ msgid "AnalogOut is only 16 bits. Value must be less than 65536."
msgstr ""
#: shared-bindings/audiobusio/I2SOut.c:225
-#: shared-bindings/audioio/AudioOut.c:223
+#: shared-bindings/audioio/AudioOut.c:226
msgid "Not playing"
msgstr ""
@@ -2074,34 +2047,32 @@ msgid ""
msgstr ""
#: shared-bindings/audioio/Mixer.c:94
-#, fuzzy
msgid "Invalid voice count"
-msgstr "Dirección inválida."
+msgstr "Cuenta de voces inválida"
#: shared-bindings/audioio/Mixer.c:99
-#, fuzzy
msgid "Invalid channel count"
-msgstr "argumentos inválidos"
+msgstr "Cuenta de canales inválida"
#: shared-bindings/audioio/Mixer.c:103
-#, fuzzy
msgid "Sample rate must be positive"
-msgstr "STA debe estar activo"
+msgstr "Sample rate debe ser positivo"
#: shared-bindings/audioio/Mixer.c:107
-#, fuzzy
msgid "bits_per_sample must be 8 or 16"
-msgstr "bits debe ser 8"
+msgstr "bits_per_sample debe ser 8 o 16"
#: shared-bindings/audioio/RawSample.c:98
msgid ""
"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or "
"'B'"
msgstr ""
+"sample_source buffer debe ser un bytearray o un array de tipo 'h', 'H', 'b' "
+"o'B'"
#: shared-bindings/audioio/RawSample.c:104
msgid "buffer must be a bytes-like object"
-msgstr ""
+msgstr "buffer debe de ser un objeto bytes-like"
#: shared-bindings/audioio/WaveFile.c:78
#: shared-bindings/displayio/OnDiskBitmap.c:85
@@ -2146,7 +2117,6 @@ msgid "stop must be 1 or 2"
msgstr ""
#: shared-bindings/digitalio/DigitalInOut.c:211
-#, fuzzy
msgid "Invalid direction."
msgstr "Dirección inválida."
@@ -2248,7 +2218,7 @@ msgstr ""
#: shared-bindings/microcontroller/Pin.c:89
#: shared-bindings/neopixel_write/__init__.c:67
-#: shared-bindings/pulseio/PulseOut.c:75
+#: shared-bindings/pulseio/PulseOut.c:76
msgid "Expected a %q"
msgstr ""
@@ -2307,11 +2277,10 @@ msgid "index must be int"
msgstr ""
#: shared-bindings/pulseio/PulseIn.c:293
-#, fuzzy
msgid "Read-only"
-msgstr "Solo lectura"
+msgstr "Solo-lectura"
-#: shared-bindings/pulseio/PulseOut.c:134
+#: shared-bindings/pulseio/PulseOut.c:135
msgid "Array must contain halfwords (type 'H')"
msgstr ""
@@ -2340,7 +2309,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr ""
-#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:64
+#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81
msgid "no available NIC"
msgstr ""
@@ -2368,15 +2337,15 @@ msgstr ""
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
-#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:250
+#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:264
msgid "Tuple or struct_time argument required"
msgstr ""
-#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:255
+#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:269
msgid "function takes exactly 9 arguments"
msgstr ""
-#: shared-bindings/time/__init__.c:226 shared-bindings/time/__init__.c:259
+#: shared-bindings/time/__init__.c:240 shared-bindings/time/__init__.c:273
msgid "timestamp out of range for platform time_t"
msgstr ""
@@ -2391,31 +2360,31 @@ msgstr ""
#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117
msgid "Couldn't allocate first buffer"
-msgstr ""
+msgstr "No se pudo asignar el primer buffer"
#: shared-module/audioio/Mixer.c:53 shared-module/audioio/WaveFile.c:123
msgid "Couldn't allocate second buffer"
-msgstr ""
+msgstr "No se pudo asignar el segundo buffer"
#: shared-module/audioio/Mixer.c:82
msgid "Voice index too high"
-msgstr ""
+msgstr "Index de voz demasiado alto"
#: shared-module/audioio/Mixer.c:85
msgid "The sample's sample rate does not match the mixer's"
-msgstr ""
+msgstr "El sample rate del sample no iguala al del mixer"
#: shared-module/audioio/Mixer.c:88
msgid "The sample's channel count does not match the mixer's"
-msgstr ""
+msgstr "La cuenta de canales del sample no iguala a las del mixer"
#: shared-module/audioio/Mixer.c:91
msgid "The sample's bits_per_sample does not match the mixer's"
-msgstr ""
+msgstr "Los bits_per_sample del sample no igualan a los del mixer"
#: shared-module/audioio/Mixer.c:100
msgid "The sample's signedness does not match the mixer's"
-msgstr ""
+msgstr "El signo del sample no iguala al del mixer"
#: shared-module/audioio/WaveFile.c:61
msgid "Invalid wave file"
@@ -2478,14 +2447,12 @@ msgid "Group full"
msgstr ""
#: shared-module/displayio/Group.c:48
-#, fuzzy
msgid "Group empty"
-msgstr "heap vacío"
+msgstr "Group vacío"
#: shared-module/displayio/OnDiskBitmap.c:49
-#, fuzzy
msgid "Invalid BMP file"
-msgstr "pin inválido"
+msgstr "Archivo BMP inválido"
#: shared-module/displayio/OnDiskBitmap.c:59
#, c-format
diff --git a/locale/fil.po b/locale/fil.po
index e432da717..d0ba55cdb 100644
--- a/locale/fil.po
+++ b/locale/fil.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-11 22:08+1100\n"
+"POT-Creation-Date: 2018-10-25 12:20+1100\n"
"PO-Revision-Date: 2018-08-30 23:04-0700\n"
"Last-Translator: Timothy <me@timothygarcia.ca>\n"
"Language-Team: fil\n"
@@ -147,7 +147,7 @@ msgstr "abort() tinawag"
msgid "invalid arguments"
msgstr "mali ang mga argumento"
-#: lib/utils/pyexec.c:97 py/builtinimport.c:253
+#: lib/utils/pyexec.c:97 py/builtinimport.c:251
msgid "script compilation not supported"
msgstr "script kompilasyon hindi supportado"
@@ -303,12 +303,12 @@ msgid "Too many channels in sample."
msgstr "Sobra ang channels sa sample."
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:339
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417
msgid "No DMA channel found"
msgstr "Walang DMA channel na mahanap"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:341
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419
msgid "Unable to allocate buffers for signed conversion"
msgstr "Hindi ma-allocate ang buffers para sa naka-sign na conversion"
@@ -324,43 +324,44 @@ msgstr "Tanging 8 o 16 na bit mono na may "
msgid "sampling rate out of range"
msgstr "pagpili ng rate wala sa sakop"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:69
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132
msgid "DAC already in use"
msgstr "Ginagamit na ang DAC"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:73
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136
msgid "Right channel unsupported"
msgstr "Hindi supportado ang kanang channel"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:76
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116
#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65
msgid "Invalid pin"
msgstr "Mali ang pin"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:84
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147
msgid "Invalid pin for left channel"
msgstr "Mali ang pin para sa kaliwang channel"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:88
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151
msgid "Invalid pin for right channel"
msgstr "Mali ang pin para sa kanang channel"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:91
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154
msgid "Cannot output both channels on the same pin"
msgstr "Hindi maaaring output ang mga parehong channel sa parehong pin"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:176
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110
+#: ports/nrf/common-hal/pulseio/PulseOut.c:107
msgid "All timers in use"
msgstr "Lahat ng timer ginagamit"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:218
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285
msgid "All event channels in use"
msgstr "Lahat ng event channels ginagamit"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:297
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr ""
@@ -373,7 +374,7 @@ msgstr "Hindi sapat ang magagamit na pins"
#: ports/atmel-samd/common-hal/busio/SPI.c:132
#: ports/atmel-samd/common-hal/busio/UART.c:119
#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45
-#: ports/nrf/common-hal/busio/I2C.c:81
+#: ports/nrf/common-hal/busio/I2C.c:82
msgid "Invalid pins"
msgstr "Mali ang pins"
@@ -425,7 +426,7 @@ msgstr "Hindi ma-reset sa bootloader dahil walang bootloader."
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369
-#: ports/nrf/common-hal/pulseio/PWMOut.c:120
+#: ports/nrf/common-hal/pulseio/PWMOut.c:119
#: ports/nrf/common-hal/pulseio/PWMOut.c:233
msgid "Invalid PWM frequency"
msgstr "Mali ang PWM frequency"
@@ -710,7 +711,7 @@ msgstr "hindi alam na config param"
msgid "AnalogOut functionality not supported"
msgstr "Hindi supportado ang AnalogOut"
-#: ports/nrf/common-hal/busio/I2C.c:95
+#: ports/nrf/common-hal/busio/I2C.c:96
#, fuzzy
msgid "All I2C peripherals are in use"
msgstr "Lahat ng timer ginagamit"
@@ -748,7 +749,7 @@ msgstr ""
msgid "Can not get temperature. status: 0x%02x"
msgstr "Hindi makuha ang temperatura. status 0x%02x"
-#: ports/nrf/common-hal/pulseio/PWMOut.c:162
+#: ports/nrf/common-hal/pulseio/PWMOut.c:161
#, fuzzy
msgid "All PWM peripherals are in use"
msgstr "Lahat ng timer ginagamit"
@@ -959,19 +960,19 @@ msgstr "masamang typecode"
msgid "bad compile mode"
msgstr "masamang mode ng compile"
-#: py/builtinimport.c:338
+#: py/builtinimport.c:336
msgid "cannot perform relative import"
msgstr "hindi maaring isagawa ang relative import"
-#: py/builtinimport.c:422 py/builtinimport.c:534
+#: py/builtinimport.c:420 py/builtinimport.c:532
msgid "module not found"
msgstr "module hindi nakita"
-#: py/builtinimport.c:425 py/builtinimport.c:537
+#: py/builtinimport.c:423 py/builtinimport.c:535
msgid "no module named '%q'"
msgstr "walang module na '%q'"
-#: py/builtinimport.c:512
+#: py/builtinimport.c:510
msgid "relative import"
msgstr "relative import"
@@ -2033,7 +2034,7 @@ msgid "AnalogOut is only 16 bits. Value must be less than 65536."
msgstr "AnalogOut ay 16 bits. Value ay dapat hindi hihigit pa sa 65536."
#: shared-bindings/audiobusio/I2SOut.c:225
-#: shared-bindings/audioio/AudioOut.c:223
+#: shared-bindings/audioio/AudioOut.c:226
msgid "Not playing"
msgstr "Hindi playing"
@@ -2265,7 +2266,7 @@ msgstr "walang laman ang address"
#: shared-bindings/microcontroller/Pin.c:89
#: shared-bindings/neopixel_write/__init__.c:67
-#: shared-bindings/pulseio/PulseOut.c:75
+#: shared-bindings/pulseio/PulseOut.c:76
msgid "Expected a %q"
msgstr "Umasa ng %q"
@@ -2329,7 +2330,7 @@ msgstr "index ay dapat int"
msgid "Read-only"
msgstr "Basahin-lamang"
-#: shared-bindings/pulseio/PulseOut.c:134
+#: shared-bindings/pulseio/PulseOut.c:135
msgid "Array must contain halfwords (type 'H')"
msgstr "May halfwords (type 'H') dapat ang array"
@@ -2358,7 +2359,7 @@ msgstr "Hindi supportado ang RTC sa board na ito"
msgid "RTC calibration is not supported on this board"
msgstr "RTC calibration ay hindi supportado ng board na ito"
-#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:64
+#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81
msgid "no available NIC"
msgstr ""
@@ -2386,15 +2387,15 @@ msgstr "time.struct_time() kumukuha ng 1 argument"
msgid "time.struct_time() takes a 9-sequence"
msgstr "time.struct_time() kumukuha ng 9-sequence"
-#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:250
+#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:264
msgid "Tuple or struct_time argument required"
msgstr "Tuple o struct_time argument kailangan"
-#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:255
+#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:269
msgid "function takes exactly 9 arguments"
msgstr "function kumukuha ng 9 arguments"
-#: shared-bindings/time/__init__.c:226 shared-bindings/time/__init__.c:259
+#: shared-bindings/time/__init__.c:240 shared-bindings/time/__init__.c:273
msgid "timestamp out of range for platform time_t"
msgstr "wala sa sakop ng timestamp ang platform time_t"
diff --git a/locale/fr.po b/locale/fr.po
index 51d999a2c..95aeef5e2 100644
--- a/locale/fr.po
+++ b/locale/fr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-11 22:08+1100\n"
+"POT-Creation-Date: 2018-10-25 12:20+1100\n"
"PO-Revision-Date: 2018-08-14 11:01+0200\n"
"Last-Translator: Pierrick Couturier <arofarn@arofarn.info>\n"
"Language-Team: fr\n"
@@ -146,7 +146,7 @@ msgstr "abort() appelé"
msgid "invalid arguments"
msgstr "arguments invalides"
-#: lib/utils/pyexec.c:97 py/builtinimport.c:253
+#: lib/utils/pyexec.c:97 py/builtinimport.c:251
msgid "script compilation not supported"
msgstr "compilation du script non supporté"
@@ -298,12 +298,12 @@ msgid "Too many channels in sample."
msgstr "Trop de canaux dans l'échantillon."
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:339
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417
msgid "No DMA channel found"
msgstr "Aucun canal DMA trouvé"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:341
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419
msgid "Unable to allocate buffers for signed conversion"
msgstr "Impossible d'allouer des tampons pour une conversion signée"
@@ -319,43 +319,44 @@ msgstr "Uniquement 8 ou 16 bit mono avec "
msgid "sampling rate out of range"
msgstr "taux d'échantillonage hors gamme"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:69
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132
msgid "DAC already in use"
msgstr "DAC déjà utilisé"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:73
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136
msgid "Right channel unsupported"
msgstr "Canal droit non supporté"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:76
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116
#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65
msgid "Invalid pin"
msgstr "Broche invalide"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:84
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147
msgid "Invalid pin for left channel"
msgstr "Broche invalide pour le canal gauche"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:88
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151
msgid "Invalid pin for right channel"
msgstr "Broche invalide pour le canal droit"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:91
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154
msgid "Cannot output both channels on the same pin"
msgstr "On ne peut mettre les deux canaux sur la même broche"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:176
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110
+#: ports/nrf/common-hal/pulseio/PulseOut.c:107
msgid "All timers in use"
msgstr "Tous les timers sont utilisés"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:218
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285
msgid "All event channels in use"
msgstr "Tous les canaux d'événements sont utilisés"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:297
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr ""
@@ -368,7 +369,7 @@ msgstr "Pas assez de broches disponibles"
#: ports/atmel-samd/common-hal/busio/SPI.c:132
#: ports/atmel-samd/common-hal/busio/UART.c:119
#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45
-#: ports/nrf/common-hal/busio/I2C.c:81
+#: ports/nrf/common-hal/busio/I2C.c:82
msgid "Invalid pins"
msgstr "Broche invalide"
@@ -421,7 +422,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369
-#: ports/nrf/common-hal/pulseio/PWMOut.c:120
+#: ports/nrf/common-hal/pulseio/PWMOut.c:119
#: ports/nrf/common-hal/pulseio/PWMOut.c:233
msgid "Invalid PWM frequency"
msgstr "Fréquence de PWM invalide"
@@ -706,7 +707,7 @@ msgstr "paramètre de config. inconnu"
msgid "AnalogOut functionality not supported"
msgstr "AnalogOut non supporté"
-#: ports/nrf/common-hal/busio/I2C.c:95
+#: ports/nrf/common-hal/busio/I2C.c:96
#, fuzzy
msgid "All I2C peripherals are in use"
msgstr "Tous les timers sont utilisés"
@@ -745,7 +746,7 @@ msgstr "busio.UART n'est pas disponible"
msgid "Can not get temperature. status: 0x%02x"
msgstr "Impossible de lire la température. status: 0x%02x"
-#: ports/nrf/common-hal/pulseio/PWMOut.c:162
+#: ports/nrf/common-hal/pulseio/PWMOut.c:161
#, fuzzy
msgid "All PWM peripherals are in use"
msgstr "Tous les timers sont utilisés"
@@ -953,19 +954,19 @@ msgstr "mauvais code type"
msgid "bad compile mode"
msgstr "mauvais mode de compilation"
-#: py/builtinimport.c:338
+#: py/builtinimport.c:336
msgid "cannot perform relative import"
msgstr "ne peut pas réaliser un import relatif"
-#: py/builtinimport.c:422 py/builtinimport.c:534
+#: py/builtinimport.c:420 py/builtinimport.c:532
msgid "module not found"
msgstr "module introuvable"
-#: py/builtinimport.c:425 py/builtinimport.c:537
+#: py/builtinimport.c:423 py/builtinimport.c:535
msgid "no module named '%q'"
msgstr "pas de module '%q'"
-#: py/builtinimport.c:512
+#: py/builtinimport.c:510
msgid "relative import"
msgstr "import relatif"
@@ -2027,7 +2028,7 @@ msgstr ""
"65536."
#: shared-bindings/audiobusio/I2SOut.c:225
-#: shared-bindings/audioio/AudioOut.c:223
+#: shared-bindings/audioio/AudioOut.c:226
msgid "Not playing"
msgstr "En pause"
@@ -2258,7 +2259,7 @@ msgstr ""
#: shared-bindings/microcontroller/Pin.c:89
#: shared-bindings/neopixel_write/__init__.c:67
-#: shared-bindings/pulseio/PulseOut.c:75
+#: shared-bindings/pulseio/PulseOut.c:76
msgid "Expected a %q"
msgstr "Attendu : %q"
@@ -2325,7 +2326,7 @@ msgstr "l'index doit être un entier"
msgid "Read-only"
msgstr "Lecture seule"
-#: shared-bindings/pulseio/PulseOut.c:134
+#: shared-bindings/pulseio/PulseOut.c:135
msgid "Array must contain halfwords (type 'H')"
msgstr "Le tableau doit contenir des halfwords (type 'H')"
@@ -2354,7 +2355,7 @@ msgstr "RTC non supportée sur cette carte"
msgid "RTC calibration is not supported on this board"
msgstr "calibration de la RTC non supportée sur cette carte"
-#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:64
+#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81
#, fuzzy
msgid "no available NIC"
msgstr "busio.UART n'est pas disponible"
@@ -2383,15 +2384,15 @@ msgstr "time.struct_time() prend exactement 1 argument"
msgid "time.struct_time() takes a 9-sequence"
msgstr "time.struct_time() prend une séquence de longueur 9"
-#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:250
+#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:264
msgid "Tuple or struct_time argument required"
msgstr "Argument de type tuple ou struct_time nécessaire"
-#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:255
+#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:269
msgid "function takes exactly 9 arguments"
msgstr "la fonction prend exactement 9 arguments"
-#: shared-bindings/time/__init__.c:226 shared-bindings/time/__init__.c:259
+#: shared-bindings/time/__init__.c:240 shared-bindings/time/__init__.c:273
msgid "timestamp out of range for platform time_t"
msgstr "timestamp hors gamme pour la plateforme time_t"
@@ -2523,9 +2524,9 @@ msgid "too many arguments provided with the given format"
msgstr "trop d'arguments fournis avec ce format"
#, fuzzy
-#~ msgid "value_size must be power of two"
-#~ msgstr "'len' doit être un multiple de 4"
-
-#, fuzzy
#~ msgid "palette must be displayio.Palette"
#~ msgstr "la palette doit être longue de 32 octets"
+
+#, fuzzy
+#~ msgid "value_size must be power of two"
+#~ msgstr "'len' doit être un multiple de 4"
diff --git a/locale/it_IT.po b/locale/it_IT.po
index b093a949a..637dbe0f3 100644
--- a/locale/it_IT.po
+++ b/locale/it_IT.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-11 22:08+1100\n"
+"POT-Creation-Date: 2018-10-25 12:20+1100\n"
"PO-Revision-Date: 2018-10-02 16:27+0200\n"
"Last-Translator: Enrico Paganin <enrico.paganin@mail.com>\n"
"Language-Team: \n"
@@ -147,7 +147,7 @@ msgstr "abort() chiamato"
msgid "invalid arguments"
msgstr "argomenti non validi"
-#: lib/utils/pyexec.c:97 py/builtinimport.c:253
+#: lib/utils/pyexec.c:97 py/builtinimport.c:251
msgid "script compilation not supported"
msgstr "compilazione dello scrip non suportata"
@@ -305,12 +305,12 @@ msgid "Too many channels in sample."
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:339
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417
msgid "No DMA channel found"
msgstr "Nessun canale DMA trovato"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:341
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419
msgid "Unable to allocate buffers for signed conversion"
msgstr "Ipossibilitato ad allocare buffer per la conversione con segno"
@@ -326,43 +326,44 @@ msgstr ""
msgid "sampling rate out of range"
msgstr "frequenza di campionamento fuori intervallo"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:69
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132
msgid "DAC already in use"
msgstr "DAC già in uso"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:73
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136
msgid "Right channel unsupported"
msgstr "Canale destro non supportato"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:76
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116
#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65
msgid "Invalid pin"
msgstr "Pin non valido"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:84
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147
msgid "Invalid pin for left channel"
msgstr "Pin non valido per il canale sinistro"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:88
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151
msgid "Invalid pin for right channel"
msgstr "Pin non valido per il canale destro"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:91
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154
msgid "Cannot output both channels on the same pin"
msgstr "Impossibile dare in output entrambi i canal sullo stesso pin"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:176
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110
+#: ports/nrf/common-hal/pulseio/PulseOut.c:107
msgid "All timers in use"
msgstr "Tutti i timer utilizzati"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:218
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285
msgid "All event channels in use"
msgstr "Tutti i canali eventi utilizati"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:297
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr ""
@@ -376,7 +377,7 @@ msgstr "Non sono presenti abbastanza pin"
#: ports/atmel-samd/common-hal/busio/SPI.c:132
#: ports/atmel-samd/common-hal/busio/UART.c:119
#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45
-#: ports/nrf/common-hal/busio/I2C.c:81
+#: ports/nrf/common-hal/busio/I2C.c:82
msgid "Invalid pins"
msgstr "Pin non validi"
@@ -429,7 +430,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369
-#: ports/nrf/common-hal/pulseio/PWMOut.c:120
+#: ports/nrf/common-hal/pulseio/PWMOut.c:119
#: ports/nrf/common-hal/pulseio/PWMOut.c:233
msgid "Invalid PWM frequency"
msgstr "Frequenza PWM non valida"
@@ -712,7 +713,7 @@ msgstr "parametro di configurazione sconosciuto"
msgid "AnalogOut functionality not supported"
msgstr "funzionalità AnalogOut non supportata"
-#: ports/nrf/common-hal/busio/I2C.c:95
+#: ports/nrf/common-hal/busio/I2C.c:96
msgid "All I2C peripherals are in use"
msgstr "Tutte le periferiche I2C sono in uso"
@@ -749,7 +750,7 @@ msgstr "busio.UART non ancora implementato"
msgid "Can not get temperature. status: 0x%02x"
msgstr "Impossibile leggere la temperatura. status: 0x%02x"
-#: ports/nrf/common-hal/pulseio/PWMOut.c:162
+#: ports/nrf/common-hal/pulseio/PWMOut.c:161
#, fuzzy
msgid "All PWM peripherals are in use"
msgstr "Tutte le periferiche SPI sono in uso"
@@ -959,19 +960,19 @@ msgstr ""
msgid "bad compile mode"
msgstr ""
-#: py/builtinimport.c:338
+#: py/builtinimport.c:336
msgid "cannot perform relative import"
msgstr "impossibile effettuare l'importazione relativa"
-#: py/builtinimport.c:422 py/builtinimport.c:534
+#: py/builtinimport.c:420 py/builtinimport.c:532
msgid "module not found"
msgstr "modulo non trovato"
-#: py/builtinimport.c:425 py/builtinimport.c:537
+#: py/builtinimport.c:423 py/builtinimport.c:535
msgid "no module named '%q'"
msgstr "nessun modulo chiamato '%q'"
-#: py/builtinimport.c:512
+#: py/builtinimport.c:510
msgid "relative import"
msgstr "importazione relativa"
@@ -2029,7 +2030,7 @@ msgid "AnalogOut is only 16 bits. Value must be less than 65536."
msgstr "AnalogOut ha solo 16 bit. Il valore deve essere meno di 65536."
#: shared-bindings/audiobusio/I2SOut.c:225
-#: shared-bindings/audioio/AudioOut.c:223
+#: shared-bindings/audioio/AudioOut.c:226
msgid "Not playing"
msgstr "In pausa"
@@ -2248,7 +2249,7 @@ msgstr "gli indirizzi sono vuoti"
#: shared-bindings/microcontroller/Pin.c:89
#: shared-bindings/neopixel_write/__init__.c:67
-#: shared-bindings/pulseio/PulseOut.c:75
+#: shared-bindings/pulseio/PulseOut.c:76
msgid "Expected a %q"
msgstr "Atteso un %q"
@@ -2315,7 +2316,7 @@ msgstr "l'indice deve essere int"
msgid "Read-only"
msgstr "Sola lettura"
-#: shared-bindings/pulseio/PulseOut.c:134
+#: shared-bindings/pulseio/PulseOut.c:135
msgid "Array must contain halfwords (type 'H')"
msgstr ""
@@ -2344,7 +2345,7 @@ msgstr "RTC non supportato su questa scheda"
msgid "RTC calibration is not supported on this board"
msgstr "calibrazione RTC non supportata su questa scheda"
-#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:64
+#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81
#, fuzzy
msgid "no available NIC"
msgstr "busio.UART non ancora implementato"
@@ -2373,15 +2374,15 @@ msgstr "time.struct_time() prende esattamente un argomento"
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
-#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:250
+#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:264
msgid "Tuple or struct_time argument required"
msgstr "Tupla o struct_time richiesto come argomento"
-#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:255
+#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:269
msgid "function takes exactly 9 arguments"
msgstr "la funzione prende esattamente 9 argomenti"
-#: shared-bindings/time/__init__.c:226 shared-bindings/time/__init__.c:259
+#: shared-bindings/time/__init__.c:240 shared-bindings/time/__init__.c:273
msgid "timestamp out of range for platform time_t"
msgstr "timestamp è fuori intervallo per il time_t della piattaforma"
diff --git a/locale/pt_BR.po b/locale/pt_BR.po
index c54983951..a8eb2dd51 100644
--- a/locale/pt_BR.po
+++ b/locale/pt_BR.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-11 22:08+1100\n"
+"POT-Creation-Date: 2018-10-25 12:20+1100\n"
"PO-Revision-Date: 2018-10-02 21:14-0000\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -147,7 +147,7 @@ msgstr "abort() chamado"
msgid "invalid arguments"
msgstr "argumentos inválidos"
-#: lib/utils/pyexec.c:97 py/builtinimport.c:253
+#: lib/utils/pyexec.c:97 py/builtinimport.c:251
msgid "script compilation not supported"
msgstr "compilação de script não suportada"
@@ -291,12 +291,12 @@ msgid "Too many channels in sample."
msgstr "Muitos canais na amostra."
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:339
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417
msgid "No DMA channel found"
msgstr "Nenhum canal DMA encontrado"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:341
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419
msgid "Unable to allocate buffers for signed conversion"
msgstr "Não é possível alocar buffers para conversão assinada"
@@ -312,43 +312,44 @@ msgstr ""
msgid "sampling rate out of range"
msgstr "Taxa de amostragem fora do intervalo"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:69
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132
msgid "DAC already in use"
msgstr "DAC em uso"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:73
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136
msgid "Right channel unsupported"
msgstr "Canal direito não suportado"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:76
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116
#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65
msgid "Invalid pin"
msgstr "Pino inválido"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:84
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147
msgid "Invalid pin for left channel"
msgstr "Pino inválido para canal esquerdo"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:88
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151
msgid "Invalid pin for right channel"
msgstr "Pino inválido para canal direito"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:91
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154
msgid "Cannot output both channels on the same pin"
msgstr ""
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:176
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110
+#: ports/nrf/common-hal/pulseio/PulseOut.c:107
msgid "All timers in use"
msgstr "Todos os temporizadores em uso"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:218
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285
msgid "All event channels in use"
msgstr "Todos os canais de eventos em uso"
-#: ports/atmel-samd/common-hal/audioio/AudioOut.c:297
+#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375
#, c-format
msgid "Sample rate too high. It must be less than %d"
msgstr "Taxa de amostragem muito alta. Deve ser menor que %d"
@@ -361,7 +362,7 @@ msgstr "Não há pinos suficientes disponíveis"
#: ports/atmel-samd/common-hal/busio/SPI.c:132
#: ports/atmel-samd/common-hal/busio/UART.c:119
#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45
-#: ports/nrf/common-hal/busio/I2C.c:81
+#: ports/nrf/common-hal/busio/I2C.c:82
msgid "Invalid pins"
msgstr "Pinos inválidos"
@@ -413,7 +414,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120
#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369
-#: ports/nrf/common-hal/pulseio/PWMOut.c:120
+#: ports/nrf/common-hal/pulseio/PWMOut.c:119
#: ports/nrf/common-hal/pulseio/PWMOut.c:233
msgid "Invalid PWM frequency"
msgstr "Frequência PWM inválida"
@@ -695,7 +696,7 @@ msgstr "parâmetro configuração desconhecido"
msgid "AnalogOut functionality not supported"
msgstr "Funcionalidade AnalogOut não suportada"
-#: ports/nrf/common-hal/busio/I2C.c:95
+#: ports/nrf/common-hal/busio/I2C.c:96
msgid "All I2C peripherals are in use"
msgstr "Todos os periféricos I2C estão em uso"
@@ -731,7 +732,7 @@ msgstr "busio.UART não disponível"
msgid "Can not get temperature. status: 0x%02x"
msgstr "Não pode obter a temperatura. status: 0x%02x"
-#: ports/nrf/common-hal/pulseio/PWMOut.c:162
+#: ports/nrf/common-hal/pulseio/PWMOut.c:161
#, fuzzy
msgid "All PWM peripherals are in use"
msgstr "Todos os temporizadores em uso"
@@ -938,19 +939,19 @@ msgstr ""
msgid "bad compile mode"
msgstr ""
-#: py/builtinimport.c:338
+#: py/builtinimport.c:336
msgid "cannot perform relative import"
msgstr ""
-#: py/builtinimport.c:422 py/builtinimport.c:534
+#: py/builtinimport.c:420 py/builtinimport.c:532
msgid "module not found"
msgstr ""
-#: py/builtinimport.c:425 py/builtinimport.c:537
+#: py/builtinimport.c:423 py/builtinimport.c:535
msgid "no module named '%q'"
msgstr ""
-#: py/builtinimport.c:512
+#: py/builtinimport.c:510
msgid "relative import"
msgstr ""
@@ -1998,7 +1999,7 @@ msgid "AnalogOut is only 16 bits. Value must be less than 65536."
msgstr ""
#: shared-bindings/audiobusio/I2SOut.c:225
-#: shared-bindings/audioio/AudioOut.c:223
+#: shared-bindings/audioio/AudioOut.c:226
msgid "Not playing"
msgstr ""
@@ -2208,7 +2209,7 @@ msgstr ""
#: shared-bindings/microcontroller/Pin.c:89
#: shared-bindings/neopixel_write/__init__.c:67
-#: shared-bindings/pulseio/PulseOut.c:75
+#: shared-bindings/pulseio/PulseOut.c:76
msgid "Expected a %q"
msgstr "Esperado um"
@@ -2270,7 +2271,7 @@ msgstr "index deve ser int"
msgid "Read-only"
msgstr "Somente leitura"
-#: shared-bindings/pulseio/PulseOut.c:134
+#: shared-bindings/pulseio/PulseOut.c:135
msgid "Array must contain halfwords (type 'H')"
msgstr "Array deve conter meias palavras (tipo 'H')"
@@ -2299,7 +2300,7 @@ msgstr "O RTC não é suportado nesta placa"
msgid "RTC calibration is not supported on this board"
msgstr "A calibração RTC não é suportada nesta placa"
-#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:64
+#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81
msgid "no available NIC"
msgstr ""
@@ -2327,15 +2328,15 @@ msgstr ""
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
-#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:250
+#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:264
msgid "Tuple or struct_time argument required"
msgstr "Tuple or struct_time argument required"
-#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:255
+#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:269
msgid "function takes exactly 9 arguments"
msgstr "função leva exatamente 9 argumentos"
-#: shared-bindings/time/__init__.c:226 shared-bindings/time/__init__.c:259
+#: shared-bindings/time/__init__.c:240 shared-bindings/time/__init__.c:273
msgid "timestamp out of range for platform time_t"
msgstr "timestamp fora do intervalo para a plataforma time_t"
diff --git a/ports/atmel-samd/boards/feather_m0_adalogger/pins.c b/ports/atmel-samd/boards/feather_m0_adalogger/pins.c
index da97bd253..0029bba1a 100644
--- a/ports/atmel-samd/boards/feather_m0_adalogger/pins.c
+++ b/ports/atmel-samd/boards/feather_m0_adalogger/pins.c
@@ -28,6 +28,7 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_GREEN_LED), MP_ROM_PTR(&pin_PA06) },
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_PA07) },
+ { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) },
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA16) },
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA19) },
diff --git a/ports/atmel-samd/boards/feather_m0_basic/pins.c b/ports/atmel-samd/boards/feather_m0_basic/pins.c
index b5bd45a2f..4400a253d 100644
--- a/ports/atmel-samd/boards/feather_m0_basic/pins.c
+++ b/ports/atmel-samd/boards/feather_m0_basic/pins.c
@@ -22,6 +22,7 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA20) },
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_PA07) },
+ { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) },
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA16) },
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA19) },
diff --git a/ports/atmel-samd/boards/feather_m0_express/pins.c b/ports/atmel-samd/boards/feather_m0_express/pins.c
index 1a6aad45b..cd6c351d4 100644
--- a/ports/atmel-samd/boards/feather_m0_express/pins.c
+++ b/ports/atmel-samd/boards/feather_m0_express/pins.c
@@ -22,6 +22,7 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA20) },
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_PA07) },
+ { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) },
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA16) },
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA19) },
diff --git a/ports/atmel-samd/boards/feather_m0_express_crickit/pins.c b/ports/atmel-samd/boards/feather_m0_express_crickit/pins.c
index 1a6aad45b..cd6c351d4 100644
--- a/ports/atmel-samd/boards/feather_m0_express_crickit/pins.c
+++ b/ports/atmel-samd/boards/feather_m0_express_crickit/pins.c
@@ -22,6 +22,7 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA20) },
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_PA07) },
+ { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) },
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA16) },
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA19) },
diff --git a/ports/atmel-samd/boards/feather_m0_rfm69/pins.c b/ports/atmel-samd/boards/feather_m0_rfm69/pins.c
index 072eb4f88..7e14b3f25 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm69/pins.c
+++ b/ports/atmel-samd/boards/feather_m0_rfm69/pins.c
@@ -22,6 +22,7 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA20) },
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_PA07) },
+ { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) },
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA16) },
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA19) },
diff --git a/ports/atmel-samd/boards/feather_m0_rfm9x/pins.c b/ports/atmel-samd/boards/feather_m0_rfm9x/pins.c
index 696d2239d..4e77b7fb9 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm9x/pins.c
+++ b/ports/atmel-samd/boards/feather_m0_rfm9x/pins.c
@@ -22,6 +22,7 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA20) },
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_PA07) },
+ { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) },
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA16) },
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA19) },
diff --git a/ports/atmel-samd/boards/feather_m0_supersized/pins.c b/ports/atmel-samd/boards/feather_m0_supersized/pins.c
index 1a6aad45b..cd6c351d4 100644
--- a/ports/atmel-samd/boards/feather_m0_supersized/pins.c
+++ b/ports/atmel-samd/boards/feather_m0_supersized/pins.c
@@ -22,6 +22,7 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA20) },
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_PA07) },
+ { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PA07) },
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) },
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA16) },
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA19) },
diff --git a/ports/atmel-samd/boards/feather_m4_express/pins.c b/ports/atmel-samd/boards/feather_m4_express/pins.c
index b9b04e0ac..5004254c5 100644
--- a/ports/atmel-samd/boards/feather_m4_express/pins.c
+++ b/ports/atmel-samd/boards/feather_m4_express/pins.c
@@ -28,6 +28,7 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PA23) },
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_PB03) },
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_PB01) },
+ { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PB01) },
{ 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) },
diff --git a/ports/atmel-samd/boards/meowmeow/board.c b/ports/atmel-samd/boards/meowmeow/board.c
new file mode 100644
index 000000000..881e15e0c
--- /dev/null
+++ b/ports/atmel-samd/boards/meowmeow/board.c
@@ -0,0 +1,38 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2017 Andrés Sabas for Electronic Cats
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "boards/board.h"
+
+void board_init(void)
+{
+}
+
+bool board_requests_safe_mode(void) {
+ return false;
+}
+
+void reset_board(void) {
+}
diff --git a/ports/atmel-samd/boards/meowmeow/mpconfigboard.h b/ports/atmel-samd/boards/meowmeow/mpconfigboard.h
new file mode 100644
index 000000000..3ce00b04f
--- /dev/null
+++ b/ports/atmel-samd/boards/meowmeow/mpconfigboard.h
@@ -0,0 +1,36 @@
+#define MICROPY_HW_BOARD_NAME "Meow Meow"
+#define MICROPY_HW_MCU_NAME "samd21g18"
+
+
+// These are pins not to reset.
+// PA24 and PA25 are USB.
+#define MICROPY_PORT_A (PORT_PA24 | PORT_PA25)
+#define MICROPY_PORT_B (0)
+#define MICROPY_PORT_C (0)
+
+#include "internal_flash.h"
+
+// If you change this, then make sure to update the linker scripts as well to
+// make sure you don't overwrite code.
+#define CIRCUITPY_INTERNAL_NVM_SIZE 0
+
+#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000)
+
+#define CALIBRATE_CRYSTALLESS 1
+
+// Explanation of how a user got into safe mode.
+#define BOARD_USER_SAFE_MODE_ACTION "pressing both buttons at start up"
+
+#define DEFAULT_I2C_BUS_SCL (&pin_PA01)
+#define DEFAULT_I2C_BUS_SDA (&pin_PA00)
+
+#define DEFAULT_SPI_BUS_SCK (&pin_PA15)
+#define DEFAULT_SPI_BUS_MOSI (&pin_PA14)
+#define DEFAULT_SPI_BUS_MISO (&pin_PA12)
+
+#define DEFAULT_UART_BUS_RX (&pin_PA11)
+#define DEFAULT_UART_BUS_TX (&pin_PA10)
+
+// USB is always used internally so skip the pin objects for it.
+#define IGNORE_PIN_PA24 1
+#define IGNORE_PIN_PA25 1
diff --git a/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk b/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk
new file mode 100644
index 000000000..31015ad17
--- /dev/null
+++ b/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk
@@ -0,0 +1,11 @@
+LD_FILE = boards/samd21x18-bootloader.ld
+USB_VID = 0xBAB1
+USB_PID = 0x1209
+USB_PRODUCT = "Meow Meow"
+USB_MANUFACTURER = "Electronic Cats"
+
+INTERNAL_FLASH_FILESYSTEM = 1
+LONGINT_IMPL = NONE
+
+CHIP_VARIANT = SAMD21G18A
+CHIP_FAMILY = samd21 \ No newline at end of file
diff --git a/ports/atmel-samd/boards/meowmeow/pins.c b/ports/atmel-samd/boards/meowmeow/pins.c
new file mode 100644
index 000000000..59c51f4eb
--- /dev/null
+++ b/ports/atmel-samd/boards/meowmeow/pins.c
@@ -0,0 +1,43 @@
+#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_PA03) },
+ { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PA04) },
+ { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA05) },
+ { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA06) },
+ { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PA07) },
+ { MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_PB02) },
+ { MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_PB03) },
+ { MP_ROM_QSTR(MP_QSTR_A8), MP_ROM_PTR(&pin_PB08) },
+ { MP_ROM_QSTR(MP_QSTR_A9), MP_ROM_PTR(&pin_PB09) },
+ { MP_ROM_QSTR(MP_QSTR_A10), MP_ROM_PTR(&pin_PA11) },
+ { MP_ROM_QSTR(MP_QSTR_A11), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA11) },
+ { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA11) },
+ { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA10) },
+ { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA10) },
+ { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PB02) },
+ { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PB03) },
+ { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PA14) },
+ { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA05) },
+ { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA15) },
+ { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PB22) },
+ { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PA06) },
+ { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) },
+ { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA30) },
+ { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA31) },
+ { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA02) },
+ { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PB23) },
+ { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA00) },
+ { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA01) },
+ { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA15) },
+ { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PA14) },
+ { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA12) },
+ { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
+ { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
+ { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
+};
+MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table);
diff --git a/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.h
index fbc5300e2..05f2be0bc 100644
--- a/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.h
@@ -3,7 +3,7 @@
#define CIRCUITPY_MCU_FAMILY samd51
-// This is for a purple prototype which is Rev C
+// This is for Rev D
#define MICROPY_HW_APA102_MOSI (&pin_PA01)
#define MICROPY_HW_APA102_SCK (&pin_PA00)
@@ -28,7 +28,7 @@
#include "external_flash/devices.h"
#define EXTERNAL_FLASH_DEVICE_COUNT 1
-#define EXTERNAL_FLASH_DEVICES W25Q128JV_SQ
+#define EXTERNAL_FLASH_DEVICES GD25Q64C
#include "external_flash/external_flash.h"
diff --git a/ports/atmel-samd/boards/trellis_m4_express/pins.c b/ports/atmel-samd/boards/trellis_m4_express/pins.c
index 57abfeba4..44ffc6eaf 100644
--- a/ports/atmel-samd/boards/trellis_m4_express/pins.c
+++ b/ports/atmel-samd/boards/trellis_m4_express/pins.c
@@ -15,6 +15,9 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PB08) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PB09) },
+ { MP_OBJ_NEW_QSTR(MP_QSTR_ACCELEROMETER_SDA), MP_ROM_PTR(&pin_PA12) },
+ { MP_OBJ_NEW_QSTR(MP_QSTR_ACCELEROMETER_SCL), MP_ROM_PTR(&pin_PA13) },
+
// Key Grid columns
{ MP_OBJ_NEW_QSTR(MP_QSTR_COL0), MP_ROM_PTR(&pin_PA14) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_COL1), MP_ROM_PTR(&pin_PA15) },
diff --git a/ports/atmel-samd/common-hal/analogio/AnalogOut.c b/ports/atmel-samd/common-hal/analogio/AnalogOut.c
index 2e42abdd4..19475e00b 100644
--- a/ports/atmel-samd/common-hal/analogio/AnalogOut.c
+++ b/ports/atmel-samd/common-hal/analogio/AnalogOut.c
@@ -138,16 +138,5 @@ void common_hal_analogio_analogout_set_value(analogio_analogout_obj_t *self,
}
void analogout_reset(void) {
- #if defined(SAMD21) && !defined(PIN_PA02)
- return;
- #endif
- #ifdef SAMD21
- while (DAC->STATUS.reg & DAC_STATUS_SYNCBUSY) {}
- #endif
- #ifdef SAMD51
- while (DAC->SYNCBUSY.reg & DAC_SYNCBUSY_SWRST) {}
- #endif
- DAC->CTRLA.reg |= DAC_CTRLA_SWRST;
-
- // TODO(tannewt): Turn off the DAC clocks to save power.
+ // AudioOut resets the DAC in case its been used for audio which requires special handling.
}
diff --git a/ports/atmel-samd/common-hal/audioio/AudioOut.c b/ports/atmel-samd/common-hal/audioio/AudioOut.c
index 0592775a5..596f3214a 100644
--- a/ports/atmel-samd/common-hal/audioio/AudioOut.c
+++ b/ports/atmel-samd/common-hal/audioio/AudioOut.c
@@ -33,6 +33,7 @@
#include "py/runtime.h"
#include "common-hal/audioio/AudioOut.h"
#include "shared-bindings/audioio/AudioOut.h"
+#include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/microcontroller/Pin.h"
#include "supervisor/shared/translate.h"
@@ -52,11 +53,73 @@
#include "samd/pins.h"
#include "samd/timers.h"
+#ifdef SAMD21
+static void ramp_value(uint16_t start, uint16_t end) {
+ start = DAC->DATA.reg;
+ int32_t diff = (int32_t) end - start;
+ int32_t step = 49;
+ int32_t steps = diff / step;
+ if (diff < 0) {
+ steps = -steps;
+ step = -step;
+ }
+ for (int32_t i = 0; i < steps; i++) {
+ uint32_t value = start + step * i;
+ DAC->DATA.reg = value;
+ DAC->DATABUF.reg = value;
+ common_hal_mcu_delay_us(50);
+ #ifdef MICROPY_VM_HOOK_LOOP
+ MICROPY_VM_HOOK_LOOP
+ #endif
+ }
+}
+#endif
+
+#ifdef SAMD51
+static void ramp_value(uint16_t start, uint16_t end) {
+ int32_t diff = (int32_t) end - start;
+ int32_t step = 49;
+ int32_t steps = diff / step;
+ if (diff < 0) {
+ steps = -steps;
+ step = -step;
+ }
+
+ for (int32_t i = 0; i < steps; i++) {
+ uint16_t value = start + step * i;
+ DAC->DATA[0].reg = value;
+ DAC->DATABUF[0].reg = value;
+ DAC->DATA[1].reg = value;
+ DAC->DATABUF[1].reg = value;
+
+ common_hal_mcu_delay_us(50);
+ #ifdef MICROPY_VM_HOOK_LOOP
+ MICROPY_VM_HOOK_LOOP
+ #endif
+ }
+}
+#endif
+
void audioout_reset(void) {
+ #if defined(SAMD21) && !defined(PIN_PA02)
+ return;
+ #endif
+ #ifdef SAMD21
+ while (DAC->STATUS.reg & DAC_STATUS_SYNCBUSY) {}
+ #endif
+ #ifdef SAMD51
+ while (DAC->SYNCBUSY.reg & DAC_SYNCBUSY_SWRST) {}
+ #endif
+ if (DAC->CTRLA.bit.ENABLE) {
+ ramp_value(0x8000, 0);
+ }
+ DAC->CTRLA.reg |= DAC_CTRLA_SWRST;
+
+ // TODO(tannewt): Turn off the DAC clocks to save power.
}
void common_hal_audioio_audioout_construct(audioio_audioout_obj_t* self,
- const mcu_pin_obj_t* left_channel, const mcu_pin_obj_t* right_channel) {
+ const mcu_pin_obj_t* left_channel, const mcu_pin_obj_t* right_channel, uint16_t quiescent_value) {
#ifdef SAMD51
bool dac_clock_enabled = hri_mclk_get_APBDMASK_DAC_bit(MCLK);
#endif
@@ -94,12 +157,10 @@ void common_hal_audioio_audioout_construct(audioio_audioout_obj_t* self,
if (right_channel != NULL) {
claim_pin(right_channel);
self->right_channel = right_channel;
- gpio_set_pin_function(self->right_channel->number, GPIO_PIN_FUNCTION_B);
audio_dma_init(&self->right_dma);
}
#endif
self->left_channel = left_channel;
- gpio_set_pin_function(self->left_channel->number, GPIO_PIN_FUNCTION_B);
audio_dma_init(&self->left_dma);
#ifdef SAMD51
@@ -118,6 +179,10 @@ void common_hal_audioio_audioout_construct(audioio_audioout_obj_t* self,
DAC->CTRLA.bit.SWRST = 1;
while (DAC->CTRLA.bit.SWRST == 1) {}
+ // Make sure there are no outstanding access errors. (Reading DATA can cause this.)
+ #ifdef SAMD51
+ PAC->INTFLAGD.reg = PAC_INTFLAGD_DAC;
+ #endif
bool channel0_enabled = true;
#ifdef SAMD51
@@ -159,6 +224,8 @@ void common_hal_audioio_audioout_construct(audioio_audioout_obj_t* self,
#endif
#ifdef SAMD51
while (DAC->SYNCBUSY.bit.ENABLE == 1) {}
+ while (channel0_enabled && DAC->STATUS.bit.READY0 == 0) {}
+ while (channel1_enabled && DAC->STATUS.bit.READY1 == 0) {}
#endif
// Use a timer to coordinate when DAC conversions occur.
@@ -220,13 +287,21 @@ void common_hal_audioio_audioout_construct(audioio_audioout_obj_t* self,
#ifdef SAMD51
connect_event_user_to_channel(EVSYS_ID_USER_DAC_START_1, channel);
+ if (right_channel != NULL) {
+ gpio_set_pin_function(self->right_channel->number, GPIO_PIN_FUNCTION_B);
+ }
#define EVSYS_ID_USER_DAC_START EVSYS_ID_USER_DAC_START_0
#endif
connect_event_user_to_channel(EVSYS_ID_USER_DAC_START, channel);
+ gpio_set_pin_function(self->left_channel->number, GPIO_PIN_FUNCTION_B);
init_async_event_channel(channel, tc_gen_id);
self->tc_to_dac_event_channel = channel;
+ // Ramp the DAC up.
+ self->quiescent_value = quiescent_value;
+ ramp_value(0, quiescent_value);
+
// Leave the DMA setup to playback.
}
@@ -239,6 +314,9 @@ void common_hal_audioio_audioout_deinit(audioio_audioout_obj_t* self) {
return;
}
+ // Ramp the DAC down.
+ ramp_value(self->quiescent_value, 0);
+
DAC->CTRLA.bit.ENABLE = 0;
#ifdef SAMD21
while (DAC->STATUS.bit.SYNCBUSY == 1) {}
@@ -381,6 +459,9 @@ void common_hal_audioio_audioout_stop(audioio_audioout_obj_t* self) {
#ifdef SAMD51
audio_dma_stop(&self->right_dma);
#endif
+ // Ramp the DAC to default. The start is ignored when the current value can be readback.
+ // Otherwise, we just set it immediately.
+ ramp_value(self->quiescent_value, self->quiescent_value);
}
bool common_hal_audioio_audioout_get_playing(audioio_audioout_obj_t* self) {
diff --git a/ports/atmel-samd/common-hal/audioio/AudioOut.h b/ports/atmel-samd/common-hal/audioio/AudioOut.h
index efbfe2a1d..56b6b75c8 100644
--- a/ports/atmel-samd/common-hal/audioio/AudioOut.h
+++ b/ports/atmel-samd/common-hal/audioio/AudioOut.h
@@ -44,6 +44,7 @@ typedef struct {
uint8_t tc_to_dac_event_channel;
bool playing;
+ uint16_t quiescent_value;
} audioio_audioout_obj_t;
void audioout_reset(void);
diff --git a/ports/atmel-samd/mpconfigport.h b/ports/atmel-samd/mpconfigport.h
index a6351cef6..a4c763d05 100644
--- a/ports/atmel-samd/mpconfigport.h
+++ b/ports/atmel-samd/mpconfigport.h
@@ -20,8 +20,6 @@
#define MICROPY_COMP_CONST (1)
#define MICROPY_COMP_DOUBLE_TUPLE_ASSIGN (1)
#define MICROPY_COMP_TRIPLE_TUPLE_ASSIGN (1)
-// Turn off for consistency
-#define MICROPY_CPYTHON_COMPAT (0)
#define MICROPY_MEM_STATS (0)
#define MICROPY_DEBUG_PRINTERS (0)
#define MICROPY_ENABLE_GC (1)
@@ -57,7 +55,6 @@
#define MICROPY_PY_DESCRIPTORS (1)
#define MICROPY_PY_MATH (0)
#define MICROPY_PY_CMATH (0)
-#define MICROPY_PY_IO (0)
#define MICROPY_PY_URANDOM (0)
#define MICROPY_PY_URANDOM_EXTRA_FUNCS (0)
#define MICROPY_PY_STRUCT (0)
@@ -96,7 +93,6 @@
#define MICROPY_VFS (1)
#define MICROPY_VFS_FAT (1)
#define MICROPY_PY_MACHINE (1)
-#define MICROPY_MODULE_WEAK_LINKS (0)
#define MICROPY_REPL_AUTO_INDENT (1)
#define MICROPY_HW_ENABLE_DAC (1)
#define MICROPY_ENABLE_FINALISER (1)
@@ -155,15 +151,33 @@ typedef long mp_off_t;
#include "include/sam.h"
#ifdef SAMD21
-#define CIRCUITPY_MCU_FAMILY samd21
+#define CIRCUITPY_MCU_FAMILY samd21
#define MICROPY_PY_SYS_PLATFORM "Atmel SAMD21"
-#define PORT_HEAP_SIZE (16384 + 4096)
+#define PORT_HEAP_SIZE (16384 + 4096)
+#define CIRCUITPY_DEFAULT_STACK_SIZE 4096
+#define MICROPY_CPYTHON_COMPAT (0)
+#define MICROPY_MODULE_WEAK_LINKS (0)
+#define MICROPY_PY_BUILTINS_NOTIMPLEMENTED (0)
+#define MICROPY_PY_COLLECTIONS_ORDEREDDICT (0)
+#define MICROPY_PY_FUNCTION_ATTRS (0)
+#define MICROPY_PY_IO (0)
+#define MICROPY_PY_REVERSE_SPECIAL_METHODS (0)
+#define MICROPY_PY_SYS_EXC_INFO (0)
#endif
#ifdef SAMD51
-#define CIRCUITPY_MCU_FAMILY samd51
+#define CIRCUITPY_MCU_FAMILY samd51
#define MICROPY_PY_SYS_PLATFORM "MicroChip SAMD51"
-#define PORT_HEAP_SIZE (0x20000) // 128KiB
+#define PORT_HEAP_SIZE (0x20000) // 128KiB
+#define CIRCUITPY_DEFAULT_STACK_SIZE 8192
+#define MICROPY_CPYTHON_COMPAT (1)
+#define MICROPY_MODULE_WEAK_LINKS (1)
+#define MICROPY_PY_BUILTINS_NOTIMPLEMENTED (1)
+#define MICROPY_PY_COLLECTIONS_ORDEREDDICT (1)
+#define MICROPY_PY_FUNCTION_ATTRS (1)
+#define MICROPY_PY_IO (1)
+#define MICROPY_PY_REVERSE_SPECIAL_METHODS (1)
+#define MICROPY_PY_SYS_EXC_INFO (1)
#endif
#ifdef LONGINT_IMPL_NONE
@@ -326,6 +340,34 @@ extern const struct _mp_obj_module_t wiznet_module;
{ MP_OBJ_NEW_QSTR(MP_QSTR_supervisor), (mp_obj_t)&supervisor_module }, \
{ MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, \
{ MP_OBJ_NEW_QSTR(MP_QSTR_usb_hid),(mp_obj_t)&usb_hid_module },
+#elif MICROPY_MODULE_WEAK_LINKS
+#define MICROPY_PORT_BUILTIN_MODULES \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_board), (mp_obj_t)&board_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_busio), (mp_obj_t)&busio_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_digitalio), (mp_obj_t)&digitalio_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_microcontroller), (mp_obj_t)&microcontroller_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_neopixel_write),(mp_obj_t)&neopixel_write_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR__os), (mp_obj_t)&os_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_pulseio), (mp_obj_t)&pulseio_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_random), (mp_obj_t)&random_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_rtc), (mp_obj_t)&rtc_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_samd),(mp_obj_t)&samd_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_storage), (mp_obj_t)&storage_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_struct), (mp_obj_t)&struct_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_supervisor), (mp_obj_t)&supervisor_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_math), (mp_obj_t)&math_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR__time), (mp_obj_t)&time_module }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_usb_hid),(mp_obj_t)&usb_hid_module }, \
+ TOUCHIO_MODULE \
+ EXTRA_BUILTIN_MODULES
+
+#define MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS \
+ { MP_ROM_QSTR(MP_QSTR_errno), MP_ROM_PTR(&mp_module_uerrno) }, \
+ { MP_ROM_QSTR(MP_QSTR_io), MP_ROM_PTR(&mp_module_io) }, \
+ { MP_ROM_QSTR(MP_QSTR_os), MP_ROM_PTR(&os_module) }, \
+ { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, \
+
#else
#define MICROPY_PORT_BUILTIN_MODULES \
{ MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module }, \
@@ -403,8 +445,4 @@ void run_background_tasks(void);
#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
#define CIRCUITPY_BOOT_OUTPUT_FILE "/boot_out.txt"
-// TODO(tannewt): Make this 6k+ for any non-express M4 boards because they cache sectors on the
-// stack.
-#define CIRCUITPY_DEFAULT_STACK_SIZE 4096
-
#endif // __INCLUDED_MPCONFIGPORT_H
diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c
index 2349a7418..45b8ed1a4 100644
--- a/ports/atmel-samd/supervisor/port.c
+++ b/ports/atmel-samd/supervisor/port.c
@@ -249,11 +249,11 @@ void reset_port(void) {
}
#if defined(EXPRESS_BOARD) && !defined(__SAMR21G18A__)
+ audio_dma_reset();
audioout_reset();
#if !defined(__SAMD51G19A__) && !defined(__SAMD51G18A__)
i2sout_reset();
#endif
- audio_dma_reset();
//pdmin_reset();
#endif
#ifdef SAMD21
diff --git a/ports/nrf/Makefile b/ports/nrf/Makefile
index 93ca78376..a1a6a4d35 100755
--- a/ports/nrf/Makefile
+++ b/ports/nrf/Makefile
@@ -90,6 +90,7 @@ LIBS += -L $(dir $(LIBGCC_FILE_NAME)) -lgcc
SRC_NRFX = $(addprefix nrfx/,\
drivers/src/nrfx_power.c \
drivers/src/nrfx_spim.c \
+ drivers/src/nrfx_timer.c \
drivers/src/nrfx_twim.c \
drivers/src/nrfx_uarte.c \
)
@@ -123,6 +124,7 @@ SRC_C += \
peripherals/nrf/clocks.c \
peripherals/nrf/$(MCU_CHIP)/pins.c \
peripherals/nrf/$(MCU_CHIP)/power.c \
+ peripherals/nrf/timers.c \
supervisor/shared/memory.c
DRIVERS_SRC_C += $(addprefix modules/,\
@@ -298,16 +300,16 @@ sd: $(BUILD)/$(OUTPUT_FILENAME).hex
else ifeq ($(FLASHER), pyocd)
flash: $(BUILD)/$(OUTPUT_FILENAME).hex
- pyocd-flashtool -t $(MCU_SUB_VARIANT) $< --sector_erase
- pyocd-tool -t $(MCU_SUB_VARIANT) erase $(BOOT_SETTING_ADDR)
- pyocd-tool -t $(MCU_SUB_VARIANT) write32 $(BOOT_SETTING_ADDR) 0x00000001
- pyocd-tool -t $(MCU_SUB_VARIANT) reset
+ pyocd-flashtool -t $(MCU_VARIANT) $< --sector_erase
+ #pyocd-tool -t $(MCU_VARIANT) erase $(BOOT_SETTING_ADDR)
+ pyocd-tool -t $(MCU_VARIANT) write32 $(BOOT_SETTING_ADDR) 0x00000001
+ pyocd-tool -t $(MCU_VARIANT) reset
sd: $(BUILD)/$(OUTPUT_FILENAME).hex
- pyocd-flashtool -t $(MCU_SUB_VARIANT) --chip_erase
- pyocd-flashtool -t $(MCU_SUB_VARIANT) $(SOFTDEV_HEX)
- pyocd-flashtool -t $(MCU_SUB_VARIANT) $< --sector_erase
- pyocd-tool -t $(MCU_SUB_VARIANT) reset $(BOOT_SETTING_ADDR)
+ pyocd-flashtool -t $(MCU_VARIANT) --chip_erase
+ pyocd-flashtool -t $(MCU_VARIANT) $(SOFTDEV_HEX)
+ pyocd-flashtool -t $(MCU_VARIANT) $< --sector_erase
+ pyocd-tool -t $(MCU_VARIANT) reset $(BOOT_SETTING_ADDR)
endif
diff --git a/ports/nrf/README.md b/ports/nrf/README.md
index c21bd5d63..4bd865400 100644
--- a/ports/nrf/README.md
+++ b/ports/nrf/README.md
@@ -39,6 +39,7 @@ the following links:
* Adafruit [Feather nRF52](boards/feather_nrf52832/README.md): 512KB Flash, 64KB SRAM
* Adafruit [Feather nRF52840](boards/feather_nrf52840_express/README.md): 1MB Flash, 256KB SRAM
* Nordic PCA10056 see [Feather nRF52840](boards/pca10056/README.md)
+* MakerDiary NRF52840 MDK see [its README](boards/makerdiary_nrf52840_mdk/README.md)
For all other board targets, see the generic notes below.
@@ -80,6 +81,7 @@ pca10040 | s132 | Peripheral and Scanner | [S
pca10056 | s140 | Peripheral and Scanner | [Segger](#segger-targets)
feather_nrf52832 | s132 | Peripheral and Scanner | [UART DFU](#dfu-targets)
feather_nrf52840_express | s140 | Peripheral and Scanner | UF2 bootloader
+makerdiary_nrf52840_mdk | s140 | Peripheral and Scanner | pyocd or ARM mbed DAPLink
## Segger Targets
diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk/README.md b/ports/nrf/boards/makerdiary_nrf52840_mdk/README.md
new file mode 100644
index 000000000..f1ba8151a
--- /dev/null
+++ b/ports/nrf/boards/makerdiary_nrf52840_mdk/README.md
@@ -0,0 +1,102 @@
+# MakerDiary NRF52840 MDK
+
+Refer to https://github.com/makerdiary/nrf52840-mdk or
+https://wiki.makerdiary.com/nrf52840-mdk/ for more details about the device.
+
+Notably, CircuitPython does not currently support QSPI external flash on NRF
+devices, so neither does this port - the 64Mb flash device is not used for
+anything. Also, don't confuse this with the 64MiB drive that shows up on your
+computer - it's actually part of the MSC driver provided by the DAPLink
+debugger, and is inaccessible at all from Python land (this drive is where you
+can copy `firmware.hex` if you'd prefer to flash that way as opposed to with
+`pyocd`. You'll still have access to 256KB of the onboard flash, however, for
+storing your Python files, cat pictures, or whatever.
+
+It's also interesting to note that all three LEDs and the "user button" on this
+device are wired through sinks, not sources, so flip your boolean expectations
+when dealing with `digitalio.DigitalInOut` on this device - `my_led.value =
+True` turns the LED off! Likewise, the user button will read `False` when
+pressed.
+
+## Installing CircuitPython submodules
+
+Before you can build, you will need to run the following commands once, which
+will install the submodules that are part of the CircuitPython ecosystem, and
+build the `mpy-cross` tool:
+
+```
+$ cd circuitpython
+$ git submodule update --init
+$ make -C mpy-cross
+```
+
+You then need to download the SD and Nordic SDK files via:
+
+> This script relies on `wget`, which must be available from the command line.
+
+```
+$ cd ports/nrf
+$ ./drivers/bluetooth/download_ble_stack.sh
+```
+
+## Note about bootloaders
+
+While most Adafruit devices come with (or can easily be flashed with) an
+Adafruit-provided bootloader (supporting niceties like UF2 flashing), this
+board comes with DAPLink which (apparently?) handles everything from debugging
+to programming the device, as well as the boot sequence. What's particularly
+awesome about this board is that there is no physical interaction with the board
+required to flash new code (read: CircuitPython builds) - the device is _always_
+listening for new firmware uploads (via `pyocd-flashtool`), even if userspace
+code is running.
+
+## Building and Flashing CircuitPython
+
+You'll need to have [pyocd](https://github.com/mbedmicro/pyOCD) installed as
+appropriate for your system.
+
+```sh
+make BOARD=makerdiary_nrf52840_mdk FLASHER=pyocd SD=s140 flash
+```
+
+This should give you the following (or very similar) output, and you will see
+a DFU blinky pattern on one of the board LEDs:
+
+```
+$ make BOARD=makerdiary_nrf52840_mdk FLASHER=pyocd SD=s140 flash
+Use make V=1, make V=2 or set BUILD_VERBOSE similarly in your environment to increase build verbosity.
+pyocd-flashtool -t nrf52 build-makerdiary_nrf52840_mdk-s140/firmware.hex --sector_erase
+INFO:root:DAP SWD MODE initialised
+INFO:root:ROM table #0 @ 0xe00ff000 cidr=b105100d pidr=2002c4008
+INFO:root:[0]<e000e000:SCS-M4 cidr=b105e00d, pidr=4000bb00c, class=14>
+WARNING:root:Invalid coresight component, cidr=0x0
+INFO:root:[1]<e0001000: cidr=0, pidr=0, component invalid>
+INFO:root:[2]<e0002000:FPB cidr=b105e00d, pidr=4002bb003, class=14>
+WARNING:root:Invalid coresight component, cidr=0x1010101
+INFO:root:[3]<e0000000: cidr=1010101, pidr=101010101010101, component invalid>
+WARNING:root:Invalid coresight component, cidr=0x0
+INFO:root:[4]<e0040000: cidr=0, pidr=0, component invalid>
+INFO:root:[5]<e0041000:ETM-M4 cidr=b105900d, pidr=4000bb925, class=9, devtype=13, devid=0>
+INFO:root:CPU core is Cortex-M4
+INFO:root:FPU present
+INFO:root:6 hardware breakpoints, 4 literal comparators
+INFO:root:4 hardware watchpoints
+[====================] 100%
+INFO:root:Programmed 237568 bytes (58 pages) at 14.28 kB/s
+#pyocd-tool -t nrf52 erase 0xFF000
+pyocd-tool -t nrf52 write32 0xFF000 0x00000001
+WARNING:root:Invalid coresight component, cidr=0x0
+WARNING:root:Invalid coresight component, cidr=0x1010101
+WARNING:root:Invalid coresight component, cidr=0x0
+pyocd-tool -t nrf52 reset
+WARNING:root:Invalid coresight component, cidr=0x0
+WARNING:root:Invalid coresight component, cidr=0x1010101
+WARNING:root:Invalid coresight component, cidr=0x0
+Resetting target
+```
+
+Alternatively (and untested by me), it's apparently possible to copy
+`firmware.hex` to the MSC device provided by DAPLink and flash that way. Refer
+to [the upstream
+documentation](https://wiki.makerdiary.com/nrf52840-mdk/getting-started/#drag-n-drop-programming)
+for details.
diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk/board.c b/ports/nrf/boards/makerdiary_nrf52840_mdk/board.c
new file mode 100644
index 000000000..a6d050fce
--- /dev/null
+++ b/ports/nrf/boards/makerdiary_nrf52840_mdk/board.c
@@ -0,0 +1,40 @@
+/*
+ * 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 "usb.h"
+
+void board_init(void) {
+ usb_init();
+}
+
+bool board_requests_safe_mode(void) {
+ return false;
+}
+
+void reset_board(void) {
+
+}
diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h b/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h
new file mode 100644
index 000000000..b33fb2dd6
--- /dev/null
+++ b/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h
@@ -0,0 +1,64 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2016 Glenn Ruben Bakke
+ * Copyright (c) 2018 Dan Halbert for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#define MAKERDIARYNRF52840MDK
+
+#define MICROPY_HW_BOARD_NAME "MakerDiary nRF52840 MDK"
+#define MICROPY_HW_MCU_NAME "nRF52840"
+#define MICROPY_PY_SYS_PLATFORM "MakerDiary52840MDK"
+
+#define MICROPY_QSPI_DATA0 (&pin_P1_05)
+#define MICROPY_QSPI_DATA1 (&pin_P1_04)
+#define MICROPY_QSPI_DATA2 (&pin_P1_02)
+#define MICROPY_QSPI_DATA3 (&pin_P1_01)
+#define MICROPY_QSPI_SCK (&pin_P1_03)
+#define MICROPY_QSPI_CS (&pin_P1_06)
+
+#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
+
+// If you change this, then make sure to update the linker scripts as well to
+// make sure you don't overwrite code
+#define PORT_HEAP_SIZE (128 * 1024)
+// TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192
+
+#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
+
+// TODO #include "external_flash/devices.h"
+
+#define EXTERNAL_FLASH_DEVICE_COUNT 1
+// Datasheet for when this is implemented:
+// http://www.mxic.com.tw/Lists/Datasheet/Attachments/7428/MX25R6435F,%20Wide%20Range,%2064Mb,%20v1.4.pdf
+#define EXTERNAL_FLASH_DEVICES MX25R6435F
+
+#define EXTERNAL_FLASH_QSPI_DUAL
+
+// TODO include "external_flash/external_flash.h"
+
+#define BOARD_HAS_CRYSTAL 0
+
+#define DEFAULT_UART_BUS_RX (&pin_P0_19)
+#define DEFAULT_UART_BUS_TX (&pin_P0_20)
diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk b/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk
new file mode 100644
index 000000000..caf580ec4
--- /dev/null
+++ b/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk
@@ -0,0 +1,16 @@
+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
diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk/pins.c b/ports/nrf/boards/makerdiary_nrf52840_mdk/pins.c
new file mode 100644
index 000000000..27f0c6797
--- /dev/null
+++ b/ports/nrf/boards/makerdiary_nrf52840_mdk/pins.c
@@ -0,0 +1,63 @@
+#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_AIN0), MP_ROM_PTR(&pin_P0_02) },
+ { MP_ROM_QSTR(MP_QSTR_AIN1), MP_ROM_PTR(&pin_P0_03) },
+ { MP_ROM_QSTR(MP_QSTR_AIN2), MP_ROM_PTR(&pin_P0_04) },
+ { MP_ROM_QSTR(MP_QSTR_AIN3), MP_ROM_PTR(&pin_P0_05) },
+ { MP_ROM_QSTR(MP_QSTR_AIN4), MP_ROM_PTR(&pin_P0_28) },
+ { MP_ROM_QSTR(MP_QSTR_AIN5), MP_ROM_PTR(&pin_P0_29) },
+ { MP_ROM_QSTR(MP_QSTR_AIN6), MP_ROM_PTR(&pin_P0_30) },
+ { MP_ROM_QSTR(MP_QSTR_AIN7), MP_ROM_PTR(&pin_P0_31) },
+
+ { MP_ROM_QSTR(MP_QSTR_AREF), MP_ROM_PTR(&pin_P0_04) },
+ { MP_ROM_QSTR(MP_QSTR_VDIV), MP_ROM_PTR(&pin_P0_05) },
+
+ { MP_ROM_QSTR(MP_QSTR_NFC1), MP_ROM_PTR(&pin_P0_09) },
+ { MP_ROM_QSTR(MP_QSTR_NFC2), MP_ROM_PTR(&pin_P0_10) },
+
+ { MP_ROM_QSTR(MP_QSTR_P2), MP_ROM_PTR(&pin_P0_02) },
+ { MP_ROM_QSTR(MP_QSTR_P3), MP_ROM_PTR(&pin_P0_03) },
+ { MP_ROM_QSTR(MP_QSTR_P4), MP_ROM_PTR(&pin_P0_04) },
+ { MP_ROM_QSTR(MP_QSTR_P5), MP_ROM_PTR(&pin_P0_05) },
+ { MP_ROM_QSTR(MP_QSTR_P6), MP_ROM_PTR(&pin_P0_06) },
+ { MP_ROM_QSTR(MP_QSTR_P7), MP_ROM_PTR(&pin_P0_07) },
+ { MP_ROM_QSTR(MP_QSTR_P8), MP_ROM_PTR(&pin_P0_08) },
+ { MP_ROM_QSTR(MP_QSTR_P9), MP_ROM_PTR(&pin_P0_09) },
+ { MP_ROM_QSTR(MP_QSTR_P10), MP_ROM_PTR(&pin_P0_10) },
+ { MP_ROM_QSTR(MP_QSTR_P11), MP_ROM_PTR(&pin_P0_11) },
+ { MP_ROM_QSTR(MP_QSTR_P12), MP_ROM_PTR(&pin_P0_12) },
+ { MP_ROM_QSTR(MP_QSTR_P13), MP_ROM_PTR(&pin_P0_13) },
+ { MP_ROM_QSTR(MP_QSTR_P14), MP_ROM_PTR(&pin_P0_14) },
+ { MP_ROM_QSTR(MP_QSTR_P15), MP_ROM_PTR(&pin_P0_15) },
+ { MP_ROM_QSTR(MP_QSTR_P16), MP_ROM_PTR(&pin_P0_16) },
+ { MP_ROM_QSTR(MP_QSTR_P17), MP_ROM_PTR(&pin_P0_17) },
+ { MP_ROM_QSTR(MP_QSTR_P21), MP_ROM_PTR(&pin_P0_21) },
+ { MP_ROM_QSTR(MP_QSTR_P25), MP_ROM_PTR(&pin_P0_25) },
+ { MP_ROM_QSTR(MP_QSTR_P26), MP_ROM_PTR(&pin_P0_26) },
+ { MP_ROM_QSTR(MP_QSTR_P27), MP_ROM_PTR(&pin_P0_27) },
+ { MP_ROM_QSTR(MP_QSTR_P28), MP_ROM_PTR(&pin_P0_28) },
+ { MP_ROM_QSTR(MP_QSTR_P29), MP_ROM_PTR(&pin_P0_29) },
+ { MP_ROM_QSTR(MP_QSTR_P30), MP_ROM_PTR(&pin_P0_30) },
+ { MP_ROM_QSTR(MP_QSTR_P31), MP_ROM_PTR(&pin_P0_31) },
+
+ { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_P1_03) },
+ { MP_ROM_QSTR(MP_QSTR_CSN), MP_ROM_PTR(&pin_P1_06) },
+ { MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_P1_05) },
+ { MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_P1_04) },
+ { MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_P1_02) },
+ { MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_P1_01) },
+
+ { MP_ROM_QSTR(MP_QSTR_TXD), MP_ROM_PTR(&pin_P0_20) },
+ { MP_ROM_QSTR(MP_QSTR_RXD), MP_ROM_PTR(&pin_P0_19) },
+
+ { MP_ROM_QSTR(MP_QSTR_LED_RED), MP_ROM_PTR(&pin_P0_23) },
+ { MP_ROM_QSTR(MP_QSTR_LED_GREEN), MP_ROM_PTR(&pin_P0_22) },
+ { MP_ROM_QSTR(MP_QSTR_LED_BLUE), MP_ROM_PTR(&pin_P0_24) },
+
+ { MP_ROM_QSTR(MP_QSTR_USR_BTN), MP_ROM_PTR(&pin_P1_00) },
+};
+
+MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
diff --git a/ports/nrf/common-hal/analogio/AnalogOut.c b/ports/nrf/common-hal/analogio/AnalogOut.c
index dc0f53740..adafa15d5 100644
--- a/ports/nrf/common-hal/analogio/AnalogOut.c
+++ b/ports/nrf/common-hal/analogio/AnalogOut.c
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2013, 2014 Damien P. George
+ * Copyright (c) 2018 Dan Halbert for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
diff --git a/ports/nrf/common-hal/board/__init__.c b/ports/nrf/common-hal/board/__init__.c
index 287f546d5..350f2eea5 100644
--- a/ports/nrf/common-hal/board/__init__.c
+++ b/ports/nrf/common-hal/board/__init__.c
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2013, 2014 Damien P. George
+ * Copyright (c) 2018 Dan Halbert for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
diff --git a/ports/nrf/common-hal/busio/I2C.c b/ports/nrf/common-hal/busio/I2C.c
index c2a6cab70..4c42e58cd 100644
--- a/ports/nrf/common-hal/busio/I2C.c
+++ b/ports/nrf/common-hal/busio/I2C.c
@@ -56,6 +56,7 @@ STATIC twim_peripheral_t twim_peripherals[] = {
void i2c_reset(void) {
for (size_t i = 0 ; i < MP_ARRAY_SIZE(twim_peripherals); i++) {
+ nrf_twim_disable(twim_peripherals[i].twim.p_twim);
twim_peripherals[i].in_use = false;
}
}
diff --git a/ports/nrf/common-hal/busio/UART.c b/ports/nrf/common-hal/busio/UART.c
index b2dbb56a1..b9e79381a 100644
--- a/ports/nrf/common-hal/busio/UART.c
+++ b/ports/nrf/common-hal/busio/UART.c
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2016 Damien P. George
+ * Copyright (c) 2018 Ha Thach 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
@@ -179,7 +179,7 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t
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;
diff --git a/ports/nrf/common-hal/pulseio/PWMOut.c b/ports/nrf/common-hal/pulseio/PWMOut.c
index 5d94bab79..f321f848d 100644
--- a/ports/nrf/common-hal/pulseio/PWMOut.c
+++ b/ports/nrf/common-hal/pulseio/PWMOut.c
@@ -3,8 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
- * Copyright (c) 2016 Damien P. George
+ * Copyright (c) 2018 Dan Halbert for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -168,6 +167,7 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self,
self->frequency = frequency;
self->variable_frequency = variable_frequency;
+ // Note this is standard, not strong drive.
nrf_gpio_cfg_output(self->pin_number);
// disable before mapping pin channel
diff --git a/ports/nrf/common-hal/pulseio/PulseOut.c b/ports/nrf/common-hal/pulseio/PulseOut.c
index 3495f38f7..044c4d3a8 100644
--- a/ports/nrf/common-hal/pulseio/PulseOut.c
+++ b/ports/nrf/common-hal/pulseio/PulseOut.c
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2016 Damien P. George
+ * Copyright (c) 2018 Dan Halbert for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -29,31 +29,136 @@
#include <stdint.h>
#include "mpconfigport.h"
+#include "nrf/pins.h"
+#include "nrf/timers.h"
#include "py/gc.h"
#include "py/runtime.h"
-
#include "shared-bindings/pulseio/PulseOut.h"
+#include "shared-bindings/pulseio/PWMOut.h"
+#include "supervisor/shared/translate.h"
-//void pulse_finish(struct tc_module *const module) {
-//
-//}
+// A single timer is shared amongst all PulseOut objects under the assumption that
+// the code is single threaded.
+static uint8_t refcount = 0;
-void pulseout_reset() {
+static nrfx_timer_t *timer = NULL;
+
+static uint16_t *pulse_array = NULL;
+static volatile uint16_t pulse_array_index = 0;
+static uint16_t pulse_array_length;
+
+static void turn_on(pulseio_pulseout_obj_t *pulseout) {
+ pulseout->pwmout->pwm->PSEL.OUT[0] = pulseout->pwmout->pin_number;
+}
+
+static void turn_off(pulseio_pulseout_obj_t *pulseout) {
+ // Disconnect pin from PWM.
+ pulseout->pwmout->pwm->PSEL.OUT[0] = 0xffffffff;
+ // Make sure pin is low.
+ nrf_gpio_pin_clear(pulseout->pwmout->pin_number);
+}
+
+static void start_timer(void) {
+ nrfx_timer_clear(timer);
+ // true enables interrupt.
+ nrfx_timer_compare(timer, NRF_TIMER_CC_CHANNEL0, pulse_array[pulse_array_index], true);
+ nrfx_timer_resume(timer);
+}
+
+static void pulseout_event_handler(nrf_timer_event_t event_type, void *p_context) {
+ pulseio_pulseout_obj_t *pulseout = (pulseio_pulseout_obj_t*) p_context;
+ if (event_type != NRF_TIMER_EVENT_COMPARE0) {
+ // Spurious event.
+ return;
+ }
+ nrfx_timer_pause(timer);
+
+ pulse_array_index++;
+ // No more pulses. Turn off output and don't restart.
+ if (pulse_array_index >= pulse_array_length) {
+ turn_off(pulseout);
+ return;
+ }
+
+ // Alternate on and off, starting with on.
+ if (pulse_array_index % 2 == 0) {
+ turn_on(pulseout);
+ } else {
+ turn_off(pulseout);
+ }
+
+ // Count up to the next given value.
+ start_timer();
}
-void common_hal_pulseio_pulseout_construct(pulseio_pulseout_obj_t* self, const pulseio_pwmout_obj_t* carrier) {
- mp_raise_NotImplementedError(NULL);
+void pulseout_reset() {
+ if (timer != NULL) {
+ nrf_peripherals_free_timer(timer);
+ }
+ refcount = 0;
+}
+
+void common_hal_pulseio_pulseout_construct(pulseio_pulseout_obj_t* self,
+ const pulseio_pwmout_obj_t* carrier) {
+ if (refcount == 0) {
+ timer = nrf_peripherals_allocate_timer();
+ if (timer == NULL) {
+ mp_raise_RuntimeError(translate("All timers in use"));
+ }
+ }
+ refcount++;
+
+ nrfx_timer_config_t timer_config = {
+ // PulseOut durations are in microseconds, so this is convenient.
+ .frequency = NRF_TIMER_FREQ_1MHz,
+ .mode = NRF_TIMER_MODE_TIMER,
+ .bit_width = NRF_TIMER_BIT_WIDTH_32,
+ .interrupt_priority = NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY,
+ .p_context = self,
+ };
+
+ self->pwmout = carrier;
+
+ nrfx_timer_init(timer, &timer_config, &pulseout_event_handler);
+ turn_off(self);
}
bool common_hal_pulseio_pulseout_deinited(pulseio_pulseout_obj_t* self) {
- return 1;
+ return self->pwmout == NULL;
}
void common_hal_pulseio_pulseout_deinit(pulseio_pulseout_obj_t* self) {
+ if (common_hal_pulseio_pulseout_deinited(self)) {
+ return;
+ }
+ turn_on(self);
+ self->pwmout = NULL;
+ refcount--;
+ if (refcount == 0) {
+ nrf_peripherals_free_timer(timer);
+ }
}
void common_hal_pulseio_pulseout_send(pulseio_pulseout_obj_t* self, uint16_t* pulses, uint16_t length) {
+ pulse_array = pulses;
+ pulse_array_index = 0;
+ pulse_array_length = length;
+
+ nrfx_timer_enable(timer);
+
+ turn_on(self);
+ // Count up to the next given value.
+ start_timer();
+
+ while(pulse_array_index < length) {
+ // Do other things while we wait. The interrupts will handle sending the
+ // signal.
+ #ifdef MICROPY_VM_HOOK_LOOP
+ MICROPY_VM_HOOK_LOOP
+ #endif
+ }
+ nrfx_timer_disable(timer);
}
diff --git a/ports/nrf/common-hal/pulseio/PulseOut.h b/ports/nrf/common-hal/pulseio/PulseOut.h
index 9a764e302..42ec52e30 100644
--- a/ports/nrf/common-hal/pulseio/PulseOut.h
+++ b/ports/nrf/common-hal/pulseio/PulseOut.h
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
+ * Copyright (c) 2018 Dan Halbert for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -28,13 +28,13 @@
#define MICROPY_INCLUDED_NRF_COMMON_HAL_PULSEIO_PULSEOUT_H
#include "common-hal/microcontroller/Pin.h"
+#include "common-hal/pulseio/PWMOut.h"
#include "py/obj.h"
typedef struct {
mp_obj_base_t base;
-// __IO PORT_PINCFG_Type *pincfg;
- uint8_t pin;
+ const pulseio_pwmout_obj_t *pwmout;
} pulseio_pulseout_obj_t;
void pulseout_reset(void);
diff --git a/ports/nrf/nrfx_config.h b/ports/nrf/nrfx_config.h
index f217cb053..69b8e6a0c 100644
--- a/ports/nrf/nrfx_config.h
+++ b/ports/nrf/nrfx_config.h
@@ -27,8 +27,10 @@
// Enable SPIM2 and SPIM3 (if available)
#define NRFX_SPIM2_ENABLED 1
-#ifdef NRF52840_XXAA
+#ifdef NRF_SPIM3
#define NRFX_SPIM3_ENABLED 1
+#else
+ #define NRFX_SPIM3_ENABLED 0
#endif
@@ -59,4 +61,24 @@
#define NRFX_PWM3_ENABLED 0
#endif
+// TIMERS
+#define NRFX_TIMER_ENABLED 1
+// Don't enable TIMER0: it's used by the SoftDevice.
+#define NRFX_TIMER1_ENABLED 1
+#define NRFX_TIMER2_ENABLED 1
+
+#ifdef NRFX_TIMER3
+#define NRFX_TIMER3_ENABLED 1
+#else
+#define NRFX_TIMER3_ENABLED 0
+#endif
+
+#ifdef NRFX_TIMER4
+#define NRFX_TIMER4_ENABLED 1
+#else
+#define NRFX_TIMER4_ENABLED 0
+#endif
+
+#define NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY 7
+
#endif // NRFX_CONFIG_H__
diff --git a/ports/nrf/peripherals/nrf/pins.h b/ports/nrf/peripherals/nrf/pins.h
index 01aa9e956..33462d711 100644
--- a/ports/nrf/peripherals/nrf/pins.h
+++ b/ports/nrf/peripherals/nrf/pins.h
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2013, 2014 Damien P. George
+ * Copyright (c) 2018 Dan Halbert for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
diff --git a/ports/nrf/peripherals/nrf/timers.c b/ports/nrf/peripherals/nrf/timers.c
new file mode 100644
index 000000000..0027d526f
--- /dev/null
+++ b/ports/nrf/peripherals/nrf/timers.c
@@ -0,0 +1,88 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 Dan Halbert for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "common-hal/pulseio/PulseOut.h"
+
+#include <stdint.h>
+
+#include "nrfx.h"
+#include "nrfx_timer.h"
+
+#include "mpconfigport.h"
+#include "py/runtime.h"
+
+STATIC nrfx_timer_t nrfx_timers[] = {
+#if NRFX_CHECK(NRFX_TIMER0_ENABLED)
+ // Note that TIMER0 is reserved for use by the SoftDevice, so it should not usually be enabled.
+ NRFX_TIMER_INSTANCE(0),
+#endif
+#if NRFX_CHECK(NRFX_TIMER1_ENABLED)
+ NRFX_TIMER_INSTANCE(1),
+#endif
+#if NRFX_CHECK(NRFX_TIMER2_ENABLED)
+ NRFX_TIMER_INSTANCE(2),
+#endif
+#if NRFX_CHECK(NRFX_TIMER3_ENABLED)
+ NRFX_TIMER_INSTANCE(3),
+#endif
+#if NRFX_CHECK(NRFX_TIMER4_ENABLED)
+ NRFX_TIMER_INSTANCE(4),
+#endif
+};
+
+static bool nrfx_timer_allocated[ARRAY_SIZE(nrfx_timers)];
+
+void timers_reset(void) {
+ for (size_t i = 0; i < ARRAY_SIZE(nrfx_timers); i ++) {
+ nrfx_timer_uninit(&nrfx_timers[i]);
+ nrfx_timer_allocated[i] = false;
+ }
+}
+
+// Returns a free nrfx_timer instance, and marks it as allocated.
+// The caller should init as with the desired config.
+// Returns NULL if no timer is available.
+nrfx_timer_t* nrf_peripherals_allocate_timer(void) {
+ for (size_t i = 0; i < ARRAY_SIZE(nrfx_timers); i ++) {
+ if (!nrfx_timer_allocated[i]) {
+ nrfx_timer_allocated[i] = true;
+ return &nrfx_timers[i];
+ }
+ }
+ return NULL;
+}
+
+// Free a timer, which may or may not have been initialized.
+void nrf_peripherals_free_timer(nrfx_timer_t* timer) {
+ for (size_t i = 0; i < ARRAY_SIZE(nrfx_timers); i ++) {
+ if (timer == &nrfx_timers[i]) {
+ nrfx_timer_allocated[i] = false;
+ // Safe to call even if not initialized.
+ nrfx_timer_uninit(timer);
+ return;
+ }
+ }
+}
diff --git a/ports/nrf/peripherals/nrf/timers.h b/ports/nrf/peripherals/nrf/timers.h
new file mode 100644
index 000000000..7d3815579
--- /dev/null
+++ b/ports/nrf/peripherals/nrf/timers.h
@@ -0,0 +1,32 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 Dan Halbert for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "nrfx.h"
+#include "nrfx_timer.h"
+
+void timers_reset(void);
+nrfx_timer_t* nrf_peripherals_allocate_timer(void);
+void nrf_peripherals_free_timer(nrfx_timer_t* timer);
diff --git a/ports/nrf/supervisor/port.c b/ports/nrf/supervisor/port.c
index c858a3648..f98b05f5a 100644
--- a/ports/nrf/supervisor/port.c
+++ b/ports/nrf/supervisor/port.c
@@ -31,12 +31,14 @@
#include "nrf/cache.h"
#include "nrf/clocks.h"
#include "nrf/power.h"
+#include "nrf/timers.h"
#include "shared-module/gamepad/__init__.h"
#include "common-hal/microcontroller/Pin.h"
#include "common-hal/busio/I2C.h"
#include "common-hal/busio/SPI.h"
#include "common-hal/pulseio/PWMOut.h"
+#include "common-hal/pulseio/PulseOut.h"
#include "tick.h"
safe_mode_t port_init(void) {
@@ -81,6 +83,8 @@ void reset_port(void) {
i2c_reset();
spi_reset();
pwmout_reset();
+ pulseout_reset();
+ timers_reset();
reset_all_pins();
}
@@ -88,16 +92,7 @@ void reset_port(void) {
void HardFault_Handler(void)
{
-// static volatile uint32_t reg;
-// static volatile uint32_t reg2;
-// static volatile uint32_t bfar;
-// reg = SCB->HFSR;
-// reg2 = SCB->CFSR;
-// bfar = SCB->BFAR;
-// for (int i = 0; i < 0; i++)
-// {
-// (void)reg;
-// (void)reg2;
-// (void)bfar;
-// }
+ while (true) {
+ asm("");
+ }
}
diff --git a/py/builtinimport.c b/py/builtinimport.c
index fee875b60..6ed0a7594 100755..100644
--- a/py/builtinimport.c
+++ b/py/builtinimport.c
@@ -155,11 +155,9 @@ STATIC void do_load_from_lexer(mp_obj_t module_obj, mp_lexer_t *lex) {
#endif
#if MICROPY_PERSISTENT_CODE_LOAD || MICROPY_MODULE_FROZEN_MPY
-STATIC void do_execute_raw_code(mp_obj_t module_obj, mp_raw_code_t *raw_code) {
+STATIC void do_execute_raw_code(mp_obj_t module_obj, mp_raw_code_t *raw_code, const char *filename) {
#if MICROPY_PY___FILE__
- // TODO
- //qstr source_name = lex->source_name;
- //mp_store_attr(module_obj, MP_QSTR___file__, MP_OBJ_NEW_QSTR(source_name));
+ mp_store_attr(module_obj, MP_QSTR___file__, MP_OBJ_NEW_QSTR(qstr_from_str(filename)));
#endif
// execute the module in its context
@@ -222,7 +220,7 @@ STATIC void do_load(mp_obj_t module_obj, vstr_t *file) {
// its data) in the list of frozen files, execute it.
#if MICROPY_MODULE_FROZEN_MPY
if (frozen_type == MP_FROZEN_MPY) {
- do_execute_raw_code(module_obj, modref);
+ do_execute_raw_code(module_obj, modref, file_str);
return;
}
#endif
@@ -235,7 +233,7 @@ STATIC void do_load(mp_obj_t module_obj, vstr_t *file) {
#if MICROPY_PERSISTENT_CODE_LOAD
if (file_str[file->len - 3] == 'm') {
mp_raw_code_t *raw_code = mp_raw_code_load_file(file_str);
- do_execute_raw_code(module_obj, raw_code);
+ do_execute_raw_code(module_obj, raw_code, file_str);
return;
}
#endif
diff --git a/py/mkenv.mk b/py/mkenv.mk
index facb8a3c2..b76dd60f8 100644
--- a/py/mkenv.mk
+++ b/py/mkenv.mk
@@ -72,7 +72,7 @@ endif
MAKE_FROZEN = $(PYTHON) $(TOP)/tools/make-frozen.py
MPY_CROSS = $(TOP)/mpy-cross/mpy-cross
-MPY_TOOL = $(PYTHON) $(TOP)/tools/mpy-tool.py
+MPY_TOOL = $(PYTHON3) $(TOP)/tools/mpy-tool.py
PREPROCESS_FROZEN_MODULES = PYTHONPATH=$(TOP)/tools/python-semver $(TOP)/tools/preprocess_frozen_modules.py
all:
diff --git a/py/mkrules.mk b/py/mkrules.mk
index e619f2bdd..aa94ba412 100644
--- a/py/mkrules.mk
+++ b/py/mkrules.mk
@@ -130,7 +130,7 @@ xargs -n1 "$(abspath $(MPY_CROSS))" $(MPY_CROSS_FLAGS)
# to build frozen_mpy.c from all .mpy files
# You need to define MPY_TOOL_LONGINT_IMPL in mpconfigport.mk
# if the default will not work (mpz is the default).
-$(BUILD)/frozen_mpy.c: $(BUILD)/frozen_mpy $(BUILD)/genhdr/qstrdefs.generated.h
+$(BUILD)/frozen_mpy.c: $(BUILD)/frozen_mpy $(BUILD)/genhdr/qstrdefs.generated.h $(TOP)/tools/mpy-tool.py
$(STEPECHO) "Creating $@"
$(Q)$(MPY_TOOL) $(MPY_TOOL_LONGINT_IMPL) -f -q $(BUILD)/genhdr/qstrdefs.preprocessed.h $(shell $(FIND) -L $(BUILD)/frozen_mpy -type f -name '*.mpy') > $@
endif
diff --git a/py/modsys.c b/py/modsys.c
index e32841923..68e048d91 100644
--- a/py/modsys.c
+++ b/py/modsys.c
@@ -135,7 +135,7 @@ STATIC mp_obj_t mp_sys_exc_info(void) {
t->items[0] = MP_OBJ_FROM_PTR(mp_obj_get_type(cur_exc));
t->items[1] = cur_exc;
- t->items[2] = mp_const_none;
+ t->items[2] = mp_obj_exception_get_traceback_obj(cur_exc);
return MP_OBJ_FROM_PTR(t);
}
MP_DEFINE_CONST_FUN_OBJ_0(mp_sys_exc_info_obj, mp_sys_exc_info);
diff --git a/py/obj.h b/py/obj.h
index 59cce0836..8b6772873 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -717,6 +717,7 @@ bool mp_obj_exception_match(mp_obj_t exc, mp_const_obj_t exc_type);
void mp_obj_exception_clear_traceback(mp_obj_t self_in);
void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, size_t line, qstr block);
void mp_obj_exception_get_traceback(mp_obj_t self_in, size_t *n, size_t **values);
+mp_obj_t mp_obj_exception_get_traceback_obj(mp_obj_t self_in);
mp_obj_t mp_obj_exception_get_value(mp_obj_t self_in);
mp_obj_t mp_obj_exception_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args);
mp_obj_t mp_alloc_emergency_exception_buf(mp_obj_t size_in);
diff --git a/py/objboundmeth.c b/py/objboundmeth.c
index b0df6a68a..a05680d41 100644
--- a/py/objboundmeth.c
+++ b/py/objboundmeth.c
@@ -92,6 +92,9 @@ STATIC void bound_meth_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
if (attr == MP_QSTR___name__) {
mp_obj_bound_meth_t *o = MP_OBJ_TO_PTR(self_in);
dest[0] = MP_OBJ_NEW_QSTR(mp_obj_fun_get_name(o->meth));
+ } else if (attr == MP_QSTR___func__) {
+ mp_obj_bound_meth_t *o = MP_OBJ_TO_PTR(self_in);
+ dest[0] = o->meth;
}
}
#endif
diff --git a/py/objexcept.c b/py/objexcept.c
index 8bd6245a4..1ddc2174e 100644
--- a/py/objexcept.c
+++ b/py/objexcept.c
@@ -30,6 +30,7 @@
#include <stdio.h>
#include "py/objlist.h"
+#include "py/objnamedtuple.h"
#include "py/objstr.h"
#include "py/objtuple.h"
#include "py/objtype.h"
@@ -531,3 +532,164 @@ void mp_obj_exception_get_traceback(mp_obj_t self_in, size_t *n, size_t **values
*values = self->traceback_data;
}
}
+
+#if MICROPY_PY_SYS_EXC_INFO
+STATIC const mp_obj_namedtuple_type_t code_type_obj = {
+ .base = {
+ .base = {
+ .type = &mp_type_type
+ },
+ .name = MP_QSTR_code,
+ .print = namedtuple_print,
+ .make_new = namedtuple_make_new,
+ .unary_op = mp_obj_tuple_unary_op,
+ .binary_op = mp_obj_tuple_binary_op,
+ .attr = namedtuple_attr,
+ .subscr = mp_obj_tuple_subscr,
+ .getiter = mp_obj_tuple_getiter,
+ .parent = &mp_type_tuple,
+ },
+ .n_fields = 15,
+ .fields = {
+ MP_QSTR_co_argcount,
+ MP_QSTR_co_kwonlyargcount,
+ MP_QSTR_co_nlocals,
+ MP_QSTR_co_stacksize,
+ MP_QSTR_co_flags,
+ MP_QSTR_co_code,
+ MP_QSTR_co_consts,
+ MP_QSTR_co_names,
+ MP_QSTR_co_varnames,
+ MP_QSTR_co_freevars,
+ MP_QSTR_co_cellvars,
+ MP_QSTR_co_filename,
+ MP_QSTR_co_name,
+ MP_QSTR_co_firstlineno,
+ MP_QSTR_co_lnotab,
+ },
+};
+
+STATIC mp_obj_t code_make_new(qstr file, qstr block) {
+ mp_obj_t elems[15] = {
+ mp_obj_new_int(0), // co_argcount
+ mp_obj_new_int(0), // co_kwonlyargcount
+ mp_obj_new_int(0), // co_nlocals
+ mp_obj_new_int(0), // co_stacksize
+ mp_obj_new_int(0), // co_flags
+ mp_obj_new_bytearray(0, NULL), // co_code
+ mp_obj_new_tuple(0, NULL), // co_consts
+ mp_obj_new_tuple(0, NULL), // co_names
+ mp_obj_new_tuple(0, NULL), // co_varnames
+ mp_obj_new_tuple(0, NULL), // co_freevars
+ mp_obj_new_tuple(0, NULL), // co_cellvars
+ MP_OBJ_NEW_QSTR(file), // co_filename
+ MP_OBJ_NEW_QSTR(block), // co_name
+ mp_obj_new_int(1), // co_firstlineno
+ mp_obj_new_bytearray(0, NULL), // co_lnotab
+ };
+
+ return namedtuple_make_new((const mp_obj_type_t*)&code_type_obj, 15, 0, elems);
+}
+
+STATIC const mp_obj_namedtuple_type_t frame_type_obj = {
+ .base = {
+ .base = {
+ .type = &mp_type_type
+ },
+ .name = MP_QSTR_frame,
+ .print = namedtuple_print,
+ .make_new = namedtuple_make_new,
+ .unary_op = mp_obj_tuple_unary_op,
+ .binary_op = mp_obj_tuple_binary_op,
+ .attr = namedtuple_attr,
+ .subscr = mp_obj_tuple_subscr,
+ .getiter = mp_obj_tuple_getiter,
+ .parent = &mp_type_tuple,
+ },
+ .n_fields = 8,
+ .fields = {
+ MP_QSTR_f_back,
+ MP_QSTR_f_builtins,
+ MP_QSTR_f_code,
+ MP_QSTR_f_globals,
+ MP_QSTR_f_lasti,
+ MP_QSTR_f_lineno,
+ MP_QSTR_f_locals,
+ MP_QSTR_f_trace,
+ },
+};
+
+STATIC mp_obj_t frame_make_new(mp_obj_t f_code, int f_lineno) {
+ mp_obj_t elems[8] = {
+ mp_const_none, // f_back
+ mp_obj_new_dict(0), // f_builtins
+ f_code, // f_code
+ mp_obj_new_dict(0), // f_globals
+ mp_obj_new_int(0), // f_lasti
+ mp_obj_new_int(f_lineno), // f_lineno
+ mp_obj_new_dict(0), // f_locals
+ mp_const_none, // f_trace
+ };
+
+ return namedtuple_make_new((const mp_obj_type_t*)&frame_type_obj, 8, 0, elems);
+}
+
+STATIC const mp_obj_namedtuple_type_t traceback_type_obj = {
+ .base = {
+ .base = {
+ .type = &mp_type_type
+ },
+ .name = MP_QSTR_traceback,
+ .print = namedtuple_print,
+ .make_new = namedtuple_make_new,
+ .unary_op = mp_obj_tuple_unary_op,
+ .binary_op = mp_obj_tuple_binary_op,
+ .attr = namedtuple_attr,
+ .subscr = mp_obj_tuple_subscr,
+ .getiter = mp_obj_tuple_getiter,
+ .parent = &mp_type_tuple,
+ },
+ .n_fields = 4,
+ .fields = {
+ MP_QSTR_tb_frame,
+ MP_QSTR_tb_lasti,
+ MP_QSTR_tb_lineno,
+ MP_QSTR_tb_next,
+ },
+};
+
+STATIC mp_obj_t traceback_from_values(size_t *values, mp_obj_t tb_next) {
+ int lineno = values[1];
+
+ mp_obj_t elems[4] = {
+ frame_make_new(code_make_new(values[0], values[2]), lineno),
+ mp_obj_new_int(0),
+ mp_obj_new_int(lineno),
+ tb_next,
+ };
+
+ return namedtuple_make_new((const mp_obj_type_t*)&traceback_type_obj, 4, 0, elems);
+};
+
+mp_obj_t mp_obj_exception_get_traceback_obj(mp_obj_t self_in) {
+ mp_obj_exception_t *self = MP_OBJ_TO_PTR(self_in);
+
+ if (!mp_obj_is_exception_instance(self)) {
+ return mp_const_none;
+ }
+
+ size_t n, *values;
+ mp_obj_exception_get_traceback(self, &n, &values);
+ if (n == 0) {
+ return mp_const_none;
+ }
+
+ mp_obj_t tb_next = mp_const_none;
+
+ for (size_t i = 0; i < n; i += 3) {
+ tb_next = traceback_from_values(&values[i], tb_next);
+ }
+
+ return tb_next;
+}
+#endif
diff --git a/shared-bindings/audioio/AudioOut.c b/shared-bindings/audioio/AudioOut.c
index db5b371e2..18d908eef 100644
--- a/shared-bindings/audioio/AudioOut.c
+++ b/shared-bindings/audioio/AudioOut.c
@@ -43,13 +43,15 @@
//|
//| AudioOut can be used to output an analog audio signal on a given pin.
//|
-//| .. class:: AudioOut(left_channel, right_channel=None)
+//| .. class:: AudioOut(left_channel, *, right_channel=None, quiescent_value=0x8000)
//|
//| Create a AudioOut object associated with the given pin(s). This allows you to
//| play audio signals out on the given pin(s).
//|
//| :param ~microcontroller.Pin left_channel: The pin to output the left channel to
//| :param ~microcontroller.Pin right_channel: The pin to output the right channel to
+//| :param int quiescent_value: The output value when no signal is present. Samples should start
+//| and end with this value to prevent audible popping.
//|
//| Simple 8ksps 440 Hz sin wave::
//|
@@ -95,10 +97,11 @@ STATIC mp_obj_t audioio_audioout_make_new(const mp_obj_type_t *type, size_t n_ar
mp_arg_check_num(n_args, n_kw, 1, 2, true);
mp_map_t kw_args;
mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args);
- enum { ARG_left_channel, ARG_right_channel };
+ enum { ARG_left_channel, ARG_right_channel, ARG_quiescent_value };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_left_channel, MP_ARG_OBJ | MP_ARG_REQUIRED },
{ MP_QSTR_right_channel, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = mp_const_none} },
+ { MP_QSTR_quiescent_value, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_int = 0x8000} },
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
@@ -117,7 +120,7 @@ STATIC mp_obj_t audioio_audioout_make_new(const mp_obj_type_t *type, size_t n_ar
// create AudioOut object from the given pin
audioio_audioout_obj_t *self = m_new_obj(audioio_audioout_obj_t);
self->base.type = &audioio_audioout_type;
- common_hal_audioio_audioout_construct(self, left_channel_pin, right_channel_pin);
+ common_hal_audioio_audioout_construct(self, left_channel_pin, right_channel_pin, args[ARG_quiescent_value].u_int);
return MP_OBJ_FROM_PTR(self);
}
diff --git a/shared-bindings/audioio/AudioOut.h b/shared-bindings/audioio/AudioOut.h
index 751473605..d09a5c9ca 100644
--- a/shared-bindings/audioio/AudioOut.h
+++ b/shared-bindings/audioio/AudioOut.h
@@ -35,7 +35,7 @@ extern const mp_obj_type_t audioio_audioout_type;
// left_channel will always be non-NULL but right_channel may be for mono output.
void common_hal_audioio_audioout_construct(audioio_audioout_obj_t* self,
- const mcu_pin_obj_t* left_channel, const mcu_pin_obj_t* right_channel);
+ const mcu_pin_obj_t* left_channel, const mcu_pin_obj_t* right_channel, uint16_t default_value);
void common_hal_audioio_audioout_deinit(audioio_audioout_obj_t* self);
bool common_hal_audioio_audioout_deinited(audioio_audioout_obj_t* self);
diff --git a/shared-bindings/pulseio/PulseOut.c b/shared-bindings/pulseio/PulseOut.c
index 1c97c37c3..e9834c12a 100644
--- a/shared-bindings/pulseio/PulseOut.c
+++ b/shared-bindings/pulseio/PulseOut.c
@@ -47,7 +47,7 @@
//|
//| .. class:: PulseOut(carrier)
//|
-//| Create a PulseOut object associated with the given PWM out experience.
+//| Create a PulseOut object associated with the given PWMout object.
//|
//| :param ~pulseio.PWMOut carrier: PWMOut that is set to output on the desired pin.
//|
@@ -57,9 +57,10 @@
//| import pulseio
//| import board
//|
-//| pwm = pulseio.PWMOut(board.D13, duty_cycle=2 ** 15)
+//| # 50% duty cycle at 38kHz.
+//| pwm = pulseio.PWMOut(board.D13, frequency=38000, duty_cycle=32768)
//| pulse = pulseio.PulseOut(pwm)
-//| # on off on off on
+//| # on off on off on
//| pulses = array.array('H', [65000, 1000, 65000, 65000, 1000])
//| pulse.send(pulses)
//|
diff --git a/shared-bindings/time/__init__.c b/shared-bindings/time/__init__.c
index 4d9554569..8a5e16c5e 100644
--- a/shared-bindings/time/__init__.c
+++ b/shared-bindings/time/__init__.c
@@ -206,6 +206,20 @@ STATIC mp_obj_t time_time(void) {
}
MP_DEFINE_CONST_FUN_OBJ_0(time_time_obj, time_time);
+//| .. method:: monotonic_ns(clk_id)
+//|
+//| Return the time of the specified clock clk_id in nanoseconds. Refer to
+//| Clock ID Constants for a list of accepted values for clk_id.
+//|
+//| :return: the current time
+//| :rtype: int
+//|
+STATIC mp_obj_t time_monotonic_ns(void) {
+ uint64_t time64 = common_hal_time_monotonic() * 1000000llu;
+ return mp_obj_new_int_from_ll((long long) time64);
+}
+MP_DEFINE_CONST_FUN_OBJ_0(time_monotonic_ns_obj, time_monotonic_ns);
+
//| .. method:: localtime([secs])
//|
//| Convert a time expressed in seconds since Jan 1, 1970 to a struct_time in
@@ -280,6 +294,7 @@ STATIC const mp_rom_map_elem_t time_module_globals_table[] = {
#endif // MICROPY_PY_COLLECTIONS
#if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE
{ MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&time_time_obj) },
+ { MP_ROM_QSTR(MP_QSTR_monotonic_ns), MP_ROM_PTR(&time_monotonic_ns_obj) },
#endif
};
diff --git a/tools/build_adafruit_bins.sh b/tools/build_adafruit_bins.sh
index 595d5ba5d..51a8778cc 100755
--- a/tools/build_adafruit_bins.sh
+++ b/tools/build_adafruit_bins.sh
@@ -25,8 +25,10 @@ grandcentral_m4_express \
hallowing_m0_express \
itsybitsy_m0_express \
itsybitsy_m4_express \
+makerdiary_nrf52840_mdk \
metro_m0_express \
metro_m4_express \
+meowmeow \
pca10056 \
pca10059 \
pirkey_m0 \
@@ -81,6 +83,11 @@ for board in $boards; do
(( exit_status = exit_status || $? ))
temp_filename=ports/nrf/build-$board-s140/firmware.uf2
extension=uf2
+ elif [[ $board == "makerdiary_nrf52840_mdk" ]]; then
+ make $PARALLEL -C ports/nrf TRANSLATION=$language BOARD=$board SD=s140
+ (( exit_status = exit_status || $? ))
+ temp_filename=ports/nrf/build-$board-s140/firmware.hex
+ extension=hex
else
time make $PARALLEL -C ports/atmel-samd TRANSLATION=$language BOARD=$board
(( exit_status = exit_status || $? ))
diff --git a/tools/mpy-tool.py b/tools/mpy-tool.py
index 7deb76a8d..5ce24061b 100755
--- a/tools/mpy-tool.py
+++ b/tools/mpy-tool.py
@@ -78,6 +78,18 @@ MP_BC_LOAD_GLOBAL = 0x1d
MP_BC_LOAD_ATTR = 0x1e
MP_BC_STORE_ATTR = 0x26
+# load opcode names
+opcode_names = {}
+with open("../../py/bc0.h") as f:
+ for line in f.readlines():
+ if line.startswith("#define"):
+ s = line.split(maxsplit=3)
+ if len(s) < 3:
+ continue
+ _, name, value = s[:3]
+ opcode = int(value.strip("()"), 0)
+ opcode_names[opcode] = name
+
def make_opcode_format():
def OC4(a, b, c, d):
return a | (b << 2) | (c << 4) | (d << 6)
@@ -252,35 +264,50 @@ class RawCode:
i += 1
RawCode.escaped_names.add(self.escaped_name)
+ sizes = {"bytecode": 0, "strings": 0, "raw_code_overhead": 0, "const_table_overhead": 0, "string_overhead": 0, "number_overhead": 0}
# emit children first
for rc in self.raw_codes:
- rc.freeze(self.escaped_name + '_')
+ subsize = rc.freeze(self.escaped_name + '_')
+ for k in sizes:
+ sizes[k] += subsize[k]
+
# generate bytecode data
print()
print('// frozen bytecode for file %s, scope %s%s' % (self.source_file.str, parent_name, self.simple_name.str))
+ print("// bytecode size", len(self.bytecode))
print('STATIC ', end='')
if not config.MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE:
print('const ', end='')
print('byte bytecode_data_%s[%u] = {' % (self.escaped_name, len(self.bytecode)))
+ sizes["bytecode"] += len(self.bytecode)
print(' ', end='')
for i in range(self.ip2):
print(' 0x%02x,' % self.bytecode[i], end='')
print()
+ print(" // simple name")
print(' ', self.simple_name.qstr_id, '& 0xff,', self.simple_name.qstr_id, '>> 8,')
+ print(" // source file")
print(' ', self.source_file.qstr_id, '& 0xff,', self.source_file.qstr_id, '>> 8,')
+ print(" // code info")
print(' ', end='')
for i in range(self.ip2 + 4, self.ip):
print(' 0x%02x,' % self.bytecode[i], end='')
print()
+ print(" // bytecode")
ip = self.ip
while ip < len(self.bytecode):
f, sz = mp_opcode_format(self.bytecode, ip)
+ opcode = self.bytecode[ip]
+ if opcode in opcode_names:
+ opcode = opcode_names[opcode]
+ else:
+ opcode = '0x%02x' % opcode
if f == 1:
qst = self._unpack_qstr(ip + 1).qstr_id
- print(' ', '0x%02x,' % self.bytecode[ip], qst, '& 0xff,', qst, '>> 8,')
+ print(' {}, {} & 0xff, {} >> 8,'.format(opcode, qst, qst))
else:
- print(' ', ''.join('0x%02x, ' % self.bytecode[ip + i] for i in range(sz)))
+ print(' {},{}'.format(opcode, ''.join(' 0x%02x,' % self.bytecode[ip + i] for i in range(1, sz))))
ip += sz
print('};')
@@ -295,9 +322,12 @@ class RawCode:
obj_type = 'mp_type_str'
else:
obj_type = 'mp_type_bytes'
- print('STATIC const mp_obj_str_t %s = {{&%s}, %u, %u, (const byte*)"%s"};'
+ print('STATIC const mp_obj_str_t %s = {{&%s}, %u, %u, (const byte*)"%s"}; // %s'
% (obj_name, obj_type, qstrutil.compute_hash(obj, config.MICROPY_QSTR_BYTES_IN_HASH),
- len(obj), ''.join(('\\x%02x' % b) for b in obj)))
+ len(obj), ''.join(('\\x%02x' % b) for b in obj), obj))
+ sizes["strings"] += len(obj)
+ sizes["string_overhead"] += 16
+
elif is_int_type(obj):
if config.MICROPY_LONGINT_IMPL == config.MICROPY_LONGINT_IMPL_NONE:
# TODO check if we can actually fit this long-int into a small-int
@@ -321,14 +351,17 @@ class RawCode:
print('STATIC const mp_obj_int_t %s = {{&mp_type_int}, '
'{.neg=%u, .fixed_dig=1, .alloc=%u, .len=%u, .dig=(uint%u_t[]){%s}}};'
% (obj_name, neg, ndigs, ndigs, bits_per_dig, digs))
+ sizes["number_overhead"] += 16
elif type(obj) is float:
print('#if MICROPY_OBJ_REPR == MICROPY_OBJ_REPR_A || MICROPY_OBJ_REPR == MICROPY_OBJ_REPR_B')
print('STATIC const mp_obj_float_t %s = {{&mp_type_float}, %.16g};'
% (obj_name, obj))
print('#endif')
+ sizes["number_overhead"] += 8
elif type(obj) is complex:
print('STATIC const mp_obj_complex_t %s = {{&mp_type_complex}, %.16g, %.16g};'
% (obj_name, obj.real, obj.imag))
+ sizes["number_overhead"] += 12
else:
raise FreezeError(self, 'freezing of object %r is not implemented' % (obj,))
@@ -338,8 +371,10 @@ class RawCode:
print('STATIC const mp_rom_obj_t const_table_data_%s[%u] = {'
% (self.escaped_name, const_table_len))
for qst in self.qstrs:
+ sizes["const_table_overhead"] += 4
print(' MP_ROM_QSTR(%s),' % global_qstrs[qst].qstr_id)
for i in range(len(self.objs)):
+ sizes["const_table_overhead"] += 4
if type(self.objs[i]) is float:
print('#if MICROPY_OBJ_REPR == MICROPY_OBJ_REPR_A || MICROPY_OBJ_REPR == MICROPY_OBJ_REPR_B')
print(' MP_ROM_PTR(&const_obj_%s_%u),' % (self.escaped_name, i))
@@ -353,6 +388,7 @@ class RawCode:
else:
print(' MP_ROM_PTR(&const_obj_%s_%u),' % (self.escaped_name, i))
for rc in self.raw_codes:
+ sizes["const_table_overhead"] += 4
print(' MP_ROM_PTR(&raw_code_%s),' % rc.escaped_name)
print('};')
@@ -376,6 +412,9 @@ class RawCode:
print(' #endif')
print(' },')
print('};')
+ sizes["raw_code_overhead"] += 16
+
+ return sizes
def read_uint(f):
i = 0
@@ -467,6 +506,7 @@ def freeze_mpy(base_qstrs, raw_codes):
new[q.qstr_esc] = (len(new), q.qstr_esc, q.str)
new = sorted(new.values(), key=lambda x: x[0])
+ print('#include "py/bc0.h"')
print('#include "py/mpconfig.h"')
print('#include "py/objint.h"')
print('#include "py/objstr.h"')
@@ -523,27 +563,45 @@ def freeze_mpy(base_qstrs, raw_codes):
print(' %u, // allocated entries' % len(new))
print(' %u, // used entries' % len(new))
print(' {')
+ qstr_size = {"metadata": 0, "data": 0}
for _, _, qstr in new:
+ qstr_size["metadata"] += config.MICROPY_QSTR_BYTES_IN_LEN + config.MICROPY_QSTR_BYTES_IN_HASH
+ qstr_size["data"] += len(qstr)
print(' %s,'
% qstrutil.make_bytes(config.MICROPY_QSTR_BYTES_IN_LEN, config.MICROPY_QSTR_BYTES_IN_HASH, qstr))
print(' },')
print('};')
+ sizes = {}
for rc in raw_codes:
- rc.freeze(rc.source_file.str.replace('/', '_')[:-3] + '_')
+ sizes[rc.source_file.str] = rc.freeze(rc.source_file.str.replace('/', '_')[:-3] + '_')
print()
print('const char mp_frozen_mpy_names[] = {')
+ qstr_size["filenames"] = 1
for rc in raw_codes:
module_name = rc.source_file.str
print('"%s\\0"' % module_name)
+ qstr_size["filenames"] += len(module_name) + 1
print('"\\0"};')
print('const mp_raw_code_t *const mp_frozen_mpy_content[] = {')
for rc in raw_codes:
print(' &raw_code_%s,' % rc.escaped_name)
+ size = sizes[rc.source_file.str]
+ print(' // Total size:', sum(size.values()))
+ for k in size:
+ print(" // {} {}".format(k, size[k]))
print('};')
+ print()
+ print('// Total size:', sum([sum(x.values()) for x in sizes.values()]) + sum(qstr_size.values()))
+ for k in size:
+ total = sum([x[k] for x in sizes.values()])
+ print("// {} {}".format(k, total))
+ for k in qstr_size:
+ print("// qstr {} {}".format(k, qstr_size[k]))
+
def main():
import argparse
cmd_parser = argparse.ArgumentParser(description='A tool to work with MicroPython .mpy files.')