summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark <56205165+gamblor21@users.noreply.github.com>2021-03-02 19:47:53 -0600
committerGitHub <noreply@github.com>2021-03-02 19:47:53 -0600
commit37ee18349f99ffafd7b60db8a107cd6f1e9e3f92 (patch)
tree5db36911199729499d91d0c317957cfff0b71013
parent4246cc3f6d718e2f28fbeb73fc8c3c39dfb9d7f0 (diff)
parentefc2667b5f087480b1b3233ae00ab1529a442f9f (diff)
Merge branch 'main' into rp2040_countio
m---------lib/protomatter0
m---------lib/tinyusb0
-rw-r--r--locale/ID.po71
-rw-r--r--locale/circuitpython.pot70
-rw-r--r--locale/cs.po71
-rw-r--r--locale/de_DE.po132
-rw-r--r--locale/el.po71
-rw-r--r--locale/es.po98
-rw-r--r--locale/fil.po76
-rw-r--r--locale/fr.po85
-rw-r--r--locale/hi.po71
-rw-r--r--locale/it_IT.po76
-rw-r--r--locale/ja.po76
-rw-r--r--locale/ko.po76
-rw-r--r--locale/nl.po76
-rw-r--r--locale/pl.po76
-rw-r--r--locale/pt_BR.po92
-rw-r--r--locale/sv.po89
-rw-r--r--locale/zh_Latn_pinyin.po105
-rw-r--r--ports/atmel-samd/boards/bdmicro_vina_d21/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk2
-rwxr-xr-xports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/dynossat_edu_eps/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk16
-rw-r--r--ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk16
-rw-r--r--ports/atmel-samd/boards/pycubed/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk11
-rw-r--r--ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/serpente/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/snekboard/mpconfigboard.mk1
-rwxr-xr-xports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk1
-rwxr-xr-xports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/stackrduino_m0_pro/mpconfigboard.mk36
-rw-r--r--ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/ugame10/mpconfigboard.mk10
-rw-r--r--ports/atmel-samd/boards/winterbloom_big_honking_button/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/common-hal/rgbmatrix/RGBMatrix.c2
-rw-r--r--ports/atmel-samd/common-hal/rgbmatrix/RGBMatrix.h4
-rw-r--r--ports/cxd56/Makefile2
-rw-r--r--ports/cxd56/boards/spresense/mpconfigboard.mk2
-rw-r--r--ports/cxd56/common-hal/analogio/AnalogIn.c19
-rw-r--r--ports/cxd56/mpconfigport.mk6
-rw-r--r--ports/esp32s2/boards/unexpectedmaker_feathers2/pins.c10
-rw-r--r--ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.mk3
-rw-r--r--ports/esp32s2/boards/unexpectedmaker_tinys2/pins.c67
-rw-r--r--ports/mimxrt10xx/common-hal/busio/UART.c8
-rw-r--r--ports/nrf/boards/pca10100/mpconfigboard.mk1
-rw-r--r--ports/nrf/boards/simmel/mpconfigboard.mk1
-rw-r--r--ports/nrf/common-hal/busio/UART.c8
-rw-r--r--ports/nrf/common-hal/rgbmatrix/RGBMatrix.c2
-rw-r--r--ports/nrf/common-hal/rgbmatrix/RGBMatrix.h4
-rw-r--r--ports/raspberrypi/Makefile21
-rw-r--r--ports/raspberrypi/audio_dma.c17
-rw-r--r--ports/raspberrypi/bindings/rp2pio/StateMachine.c377
-rw-r--r--ports/raspberrypi/bindings/rp2pio/StateMachine.h38
-rw-r--r--ports/raspberrypi/boards/adafruit_feather_rp2040/board.c4
-rw-r--r--ports/raspberrypi/boards/adafruit_feather_rp2040/mpconfigboard.h4
-rw-r--r--ports/raspberrypi/boards/adafruit_feather_rp2040/pins.c7
-rw-r--r--ports/raspberrypi/boards/qtpy_rp2040/mpconfigboard.h4
-rw-r--r--ports/raspberrypi/boards/raspberry_pi_pico/mpconfigboard.mk2
-rw-r--r--ports/raspberrypi/bs2_default_padded_checksummed.S23
-rw-r--r--ports/raspberrypi/common-hal/audiobusio/I2SOut.c224
-rw-r--r--ports/raspberrypi/common-hal/audiobusio/I2SOut.h47
-rw-r--r--ports/raspberrypi/common-hal/audiobusio/PDMIn.c172
-rw-r--r--ports/raspberrypi/common-hal/audiobusio/PDMIn.h50
-rw-r--r--ports/raspberrypi/common-hal/audiobusio/__init__.c1
-rw-r--r--ports/raspberrypi/common-hal/busio/UART.c527
-rw-r--r--ports/raspberrypi/common-hal/busio/UART.h23
-rw-r--r--ports/raspberrypi/common-hal/digitalio/DigitalInOut.c28
-rw-r--r--ports/raspberrypi/common-hal/neopixel_write/__init__.c22
-rw-r--r--ports/raspberrypi/common-hal/nvm/ByteArray.c102
-rw-r--r--ports/raspberrypi/common-hal/nvm/ByteArray.h38
-rw-r--r--ports/raspberrypi/common-hal/nvm/__init__.c1
-rw-r--r--ports/raspberrypi/common-hal/pwmio/PWMOut.c78
-rw-r--r--ports/raspberrypi/common-hal/pwmio/PWMOut.h5
-rw-r--r--ports/raspberrypi/common-hal/rgbmatrix/RGBMatrix.c70
-rw-r--r--ports/raspberrypi/common-hal/rgbmatrix/RGBMatrix.h37
-rw-r--r--ports/raspberrypi/common-hal/rgbmatrix/__init__.c0
-rw-r--r--ports/raspberrypi/common-hal/rp2pio/StateMachine.c209
-rw-r--r--ports/raspberrypi/common-hal/rp2pio/StateMachine.h7
-rw-r--r--ports/raspberrypi/link.ld2
-rw-r--r--ports/raspberrypi/mpconfigport.h9
-rw-r--r--ports/raspberrypi/mpconfigport.mk6
-rw-r--r--ports/raspberrypi/supervisor/port.c10
-rw-r--r--ports/stm/boards/espruino_pico/mpconfigboard.mk1
-rw-r--r--ports/stm/common-hal/rgbmatrix/RGBMatrix.c2
-rw-r--r--ports/stm/common-hal/rgbmatrix/RGBMatrix.h4
-rw-r--r--py/circuitpy_defns.mk4
-rw-r--r--py/circuitpy_mpconfig.h9
-rw-r--r--py/circuitpy_mpconfig.mk4
-rwxr-xr-xpy/gc.c2
-rw-r--r--py/malloc.c6
-rw-r--r--py/misc.h8
-rw-r--r--py/objlist.c30
-rw-r--r--py/objlist.h2
-rw-r--r--shared-bindings/bitmaptools/__init__.c256
-rw-r--r--shared-bindings/bitmaptools/__init__.h42
-rw-r--r--shared-bindings/busio/SPI.c2
-rw-r--r--shared-bindings/busio/UART.c11
-rw-r--r--shared-bindings/displayio/Group.c25
-rw-r--r--shared-bindings/displayio/Group.h2
-rw-r--r--shared-bindings/pwmio/PWMOut.h2
-rw-r--r--shared-module/_pixelbuf/PixelBuf.c78
-rw-r--r--shared-module/_pixelbuf/PixelBuf.h3
-rw-r--r--shared-module/bitmaptools/__init__.c174
-rw-r--r--shared-module/displayio/Bitmap.c29
-rw-r--r--shared-module/displayio/Group.c235
-rw-r--r--shared-module/displayio/Group.h12
-rw-r--r--shared-module/rgbmatrix/RGBMatrix.c4
-rw-r--r--shared-module/rgbmatrix/RGBMatrix.h1
-rw-r--r--shared-module/usb_hid/Device.c6
-rw-r--r--supervisor/shared/display.c23
-rw-r--r--supervisor/shared/safe_mode.c3
-rw-r--r--supervisor/shared/usb/tusb_config.h2
-rw-r--r--supervisor/shared/usb/usb.c4
-rw-r--r--supervisor/shared/usb/usb_desc.c5
-rw-r--r--tests/circuitpython-manual/audiobusio/i2s_sample_loop.py36
-rw-r--r--tests/circuitpython-manual/audiobusio/pdmin_rms.py44
-rw-r--r--tests/circuitpython-manual/busio/uart_echo.py18
-rwxr-xr-xtools/build_release_files.py5
133 files changed, 3674 insertions, 1250 deletions
diff --git a/lib/protomatter b/lib/protomatter
-Subproject 5e925cea7a55273e375a6129761cb29b4e750d4
+Subproject c2c81ded118484f8925bf81e270b416739cd72d
diff --git a/lib/tinyusb b/lib/tinyusb
-Subproject 045674745afa59028fbeed6dac5cb5a9c4a6033
+Subproject 280297bdb7aec67adf347ec046943a48a71647d
diff --git a/locale/ID.po b/locale/ID.po
index e1aed308a..cfda804b1 100644
--- a/locale/ID.po
+++ b/locale/ID.po
@@ -107,6 +107,7 @@ msgstr "%q harus >= 1"
msgid "%q must be a tuple of length 2"
msgstr "%q harus berupa tuple dengan panjang 2"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr "%q di luar jangkauan"
@@ -337,6 +338,7 @@ msgid "All SPI peripherals are in use"
msgstr "Semua perangkat SPI sedang digunakan"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr "Semua perangkat UART sedang digunakan"
@@ -460,6 +462,10 @@ msgstr ""
msgid "Below minimum frame rate"
msgstr "Di bawah frame rate minimum"
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr "Bit clock dan word harus memiliki kesamaan pada clock unit"
@@ -501,6 +507,10 @@ msgstr "Brightness tidak bisa disesuaikan"
msgid "Buffer + offset too small %d %d %d"
msgstr "Buffer + offset terlalu kecil %d %d %d"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -962,6 +972,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr "Gagal untuk mendapatkan mutex, status: 0x%08lX"
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr "Gagal untuk mengalokasikan buffer RX"
@@ -1093,6 +1104,10 @@ msgstr ""
msgid "IV must be %d bytes long"
msgstr "Panjang IV harus %d byte"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1109,6 +1124,14 @@ msgstr "Ukuran penyangga salah"
msgid "Init program size invalid"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr ""
@@ -1219,7 +1242,8 @@ msgstr "Argumen tidak valid"
msgid "Invalid bits per value"
msgstr "Bit per nilai tidak valid"
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr "Ukuran buffer tidak valid"
@@ -1294,10 +1318,10 @@ msgstr "Pin untuk channel kanan tidak valid"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "Pin-pin tidak valid"
@@ -1346,7 +1370,8 @@ msgstr "Hitungan suara tidak valid"
msgid "Invalid wave file"
msgstr "File wave tidak valid"
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr "Panjang kata/bit tidak valid"
@@ -1473,6 +1498,7 @@ msgstr "Tidak ada DAC (Digital Analog Converter) di dalam chip"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr "tidak ada channel DMA ditemukan"
@@ -1539,6 +1565,14 @@ msgstr "Tidak ada dukungan perangkat keras pada pin clk"
msgid "No hardware support on pin"
msgstr "Tidak ada dukungan hardware untuk pin"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr "Tidak ada kunci yang ditentukan"
@@ -1627,13 +1661,10 @@ msgid "Odd parity is not supported"
msgstr "Parity ganjil tidak didukung"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr "Hanya 8 atau 16 bit mono dengan "
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
@@ -1683,6 +1714,10 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr ""
@@ -1847,7 +1882,7 @@ msgstr "Kesalahan DeInit RNG"
msgid "RNG Init Error"
msgstr "Kesalahan Init RNG"
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr ""
@@ -1884,7 +1919,7 @@ msgstr "Baca-saja"
msgid "Read-only filesystem"
msgstr "sistem file (filesystem) bersifat Read-only"
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
#, fuzzy
msgid "Read-only object"
msgstr "sistem file (filesystem) bersifat Read-only"
@@ -2125,6 +2160,7 @@ msgid "To exit, please reset the board without "
msgstr "Untuk keluar, silahkan reset board tanpa "
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr "Terlalu banyak channel dalam sampel"
@@ -2165,10 +2201,6 @@ msgstr "Kesalahan Init UART"
msgid "UART Re-init error"
msgstr "Kesalahan Re-init UART"
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr ""
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr "Kesalahan penulisan UART"
@@ -2195,6 +2227,7 @@ msgstr "Nilai UUID bukan str, int atau byte buffer"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr "Tidak dapat mengalokasikan buffer untuk signed conversion"
@@ -2505,7 +2538,7 @@ msgid "binary op %q not implemented"
msgstr ""
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
+msgid "bits must be in range 5 to 9"
msgstr ""
#: shared-bindings/audiomixer/Mixer.c
@@ -2734,6 +2767,10 @@ msgstr ""
msgid "circle can only be registered in one parent"
msgstr ""
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr ""
@@ -3734,6 +3771,7 @@ msgstr ""
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr ""
@@ -3811,6 +3849,7 @@ msgid ""
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr "nilai sampling keluar dari jangkauan"
@@ -3882,7 +3921,7 @@ msgstr ""
msgid "sosfilt requires iterable arguments"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr ""
diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot
index 7a9d0ce4b..2e31d5dfc 100644
--- a/locale/circuitpython.pot
+++ b/locale/circuitpython.pot
@@ -102,6 +102,7 @@ msgstr ""
msgid "%q must be a tuple of length 2"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr ""
@@ -332,6 +333,7 @@ msgid "All SPI peripherals are in use"
msgstr ""
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr ""
@@ -453,6 +455,10 @@ msgstr ""
msgid "Below minimum frame rate"
msgstr ""
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr ""
@@ -494,6 +500,10 @@ msgstr ""
msgid "Buffer + offset too small %d %d %d"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -943,6 +953,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr ""
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr ""
@@ -1074,6 +1085,10 @@ msgstr ""
msgid "IV must be %d bytes long"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In-buffer elements must be <= 4 bytes long"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1088,6 +1103,14 @@ msgstr ""
msgid "Init program size invalid"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr ""
@@ -1198,7 +1221,8 @@ msgstr ""
msgid "Invalid bits per value"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr ""
@@ -1273,10 +1297,10 @@ msgstr ""
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr ""
@@ -1325,7 +1349,8 @@ msgstr ""
msgid "Invalid wave file"
msgstr ""
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr ""
@@ -1452,6 +1477,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr ""
@@ -1518,6 +1544,14 @@ msgstr ""
msgid "No hardware support on pin"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
@@ -1604,13 +1638,10 @@ msgid "Odd parity is not supported"
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr ""
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
@@ -1664,6 +1695,10 @@ msgstr ""
msgid "Out of sockets"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out-buffer elements must be <= 4 bytes long"
+msgstr ""
+
#: shared-bindings/bitops/__init__.c
#, c-format
msgid "Output buffer must be at least %d bytes"
@@ -1827,7 +1862,7 @@ msgstr ""
msgid "RNG Init Error"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr ""
@@ -1864,7 +1899,7 @@ msgstr ""
msgid "Read-only filesystem"
msgstr ""
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr ""
@@ -2097,6 +2132,7 @@ msgid "To exit, please reset the board without "
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr ""
@@ -2136,10 +2172,6 @@ msgstr ""
msgid "UART Re-init error"
msgstr ""
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr ""
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr ""
@@ -2166,6 +2198,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr ""
@@ -2467,7 +2500,7 @@ msgid "binary op %q not implemented"
msgstr ""
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
+msgid "bits must be in range 5 to 9"
msgstr ""
#: shared-bindings/audiomixer/Mixer.c
@@ -2695,6 +2728,10 @@ msgstr ""
msgid "circle can only be registered in one parent"
msgstr ""
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr ""
@@ -3772,6 +3809,7 @@ msgid ""
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr ""
@@ -3843,7 +3881,7 @@ msgstr ""
msgid "sosfilt requires iterable arguments"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr ""
diff --git a/locale/cs.po b/locale/cs.po
index c6d537fcc..f6c3ac880 100644
--- a/locale/cs.po
+++ b/locale/cs.po
@@ -105,6 +105,7 @@ msgstr "%q musí být > = 1"
msgid "%q must be a tuple of length 2"
msgstr "%q musí být n-tice délky 2"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr "%q je mimo rozsah"
@@ -335,6 +336,7 @@ msgid "All SPI peripherals are in use"
msgstr ""
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr ""
@@ -456,6 +458,10 @@ msgstr ""
msgid "Below minimum frame rate"
msgstr ""
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr ""
@@ -497,6 +503,10 @@ msgstr ""
msgid "Buffer + offset too small %d %d %d"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -946,6 +956,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr ""
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr ""
@@ -1077,6 +1088,10 @@ msgstr ""
msgid "IV must be %d bytes long"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1091,6 +1106,14 @@ msgstr ""
msgid "Init program size invalid"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr ""
@@ -1201,7 +1224,8 @@ msgstr ""
msgid "Invalid bits per value"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr ""
@@ -1276,10 +1300,10 @@ msgstr ""
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr ""
@@ -1328,7 +1352,8 @@ msgstr ""
msgid "Invalid wave file"
msgstr ""
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr ""
@@ -1455,6 +1480,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr ""
@@ -1521,6 +1547,14 @@ msgstr ""
msgid "No hardware support on pin"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
@@ -1607,13 +1641,10 @@ msgid "Odd parity is not supported"
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr ""
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
@@ -1659,6 +1690,10 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr ""
@@ -1818,7 +1853,7 @@ msgstr ""
msgid "RNG Init Error"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr ""
@@ -1855,7 +1890,7 @@ msgstr ""
msgid "Read-only filesystem"
msgstr ""
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr ""
@@ -2088,6 +2123,7 @@ msgid "To exit, please reset the board without "
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr ""
@@ -2127,10 +2163,6 @@ msgstr ""
msgid "UART Re-init error"
msgstr ""
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr ""
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr ""
@@ -2157,6 +2189,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr ""
@@ -2458,7 +2491,7 @@ msgid "binary op %q not implemented"
msgstr ""
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
+msgid "bits must be in range 5 to 9"
msgstr ""
#: shared-bindings/audiomixer/Mixer.c
@@ -2686,6 +2719,10 @@ msgstr ""
msgid "circle can only be registered in one parent"
msgstr ""
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr ""
@@ -3685,6 +3722,7 @@ msgstr ""
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr ""
@@ -3762,6 +3800,7 @@ msgid ""
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr ""
@@ -3833,7 +3872,7 @@ msgstr ""
msgid "sosfilt requires iterable arguments"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index dfb60ca4e..beb916068 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -6,14 +6,14 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-04 12:55-0600\n"
-"PO-Revision-Date: 2021-02-05 15:41+0000\n"
-"Last-Translator: Jeff Epler <jepler@gmail.com>\n"
+"PO-Revision-Date: 2021-02-25 00:24+0000\n"
+"Last-Translator: Daniel Glocker <mystboy666@gmail.com>\n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.5-dev\n"
+"X-Generator: Weblate 4.5\n"
#: main.c
msgid ""
@@ -28,6 +28,8 @@ msgid ""
"\n"
"Code stopped by auto-reload.\n"
msgstr ""
+"\n"
+"Code durch automatisches neuladen gestoppt\n"
#: supervisor/shared/safe_mode.c
msgid ""
@@ -49,7 +51,7 @@ msgstr " Datei \"%q\", Zeile %d"
#: py/builtinhelp.c
msgid " is of type %q\n"
-msgstr ""
+msgstr " ist vom Type %q\n"
#: main.c
msgid " output:\n"
@@ -65,6 +67,8 @@ msgstr "%%c erwartet int oder char"
msgid ""
"%d address pins, %d rgb pins and %d tiles indicate a height of %d, not %d"
msgstr ""
+"%d Address Pins, %d rgb Pins und %d Tiles indiziert eine Höhe von %d, nicht "
+"%d"
#: ports/atmel-samd/common-hal/sdioio/SDCard.c
msgid "%q failure: %d"
@@ -106,6 +110,7 @@ msgstr "%q muss >= 1 sein"
msgid "%q must be a tuple of length 2"
msgstr "%q muss ein Tupel der Länge 2 sein"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr "%q außerhalb des Bereichs"
@@ -126,7 +131,7 @@ msgstr ""
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
#, c-format
msgid "%s error 0x%x"
-msgstr ""
+msgstr "%s Error 0x%x"
#: py/argcheck.c
msgid "'%q' argument required"
@@ -146,7 +151,7 @@ msgstr "'%q' Objekt unterschützt keine Elementzuweisung"
#: py/obj.c
msgid "'%q' object does not support item deletion"
-msgstr "'%q' objekt unterstützt das "
+msgstr "'%q' Objekt unterstützt löschen von Elementen nicht"
#: py/runtime.c
msgid "'%q' object has no attribute '%q'"
@@ -162,7 +167,7 @@ msgstr "'%q' Objekt ist kein callable"
#: py/runtime.c
msgid "'%q' object is not iterable"
-msgstr ""
+msgstr "'%q' Objekt ist nicht iterierbar"
#: py/obj.c
msgid "'%q' object is not subscriptable"
@@ -292,7 +297,7 @@ msgstr "3-arg pow() wird nicht unterstützt"
#: shared-module/msgpack/__init__.c
msgid "64 bit types"
-msgstr ""
+msgstr "64 bit Typen"
#: ports/atmel-samd/common-hal/countio/Counter.c
#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c
@@ -337,6 +342,7 @@ msgid "All SPI peripherals are in use"
msgstr "Alle SPI-Peripheriegeräte sind in Benutzung"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr "Alle UART-Peripheriegeräte sind in Benutzung"
@@ -346,7 +352,7 @@ msgstr "Alle event Kanäle werden benutzt"
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
msgid "All state machines in use"
-msgstr ""
+msgstr "Alle state machines in verwendung"
#: ports/atmel-samd/audio_dma.c ports/atmel-samd/common-hal/audiobusio/PDMIn.c
msgid "All sync event channels in use"
@@ -455,13 +461,17 @@ msgstr ""
#: ports/esp32s2/common-hal/canio/CAN.c
msgid "Baudrate not supported by peripheral"
-msgstr ""
+msgstr "Baudrate wird von der Peripherie nicht unterstützt"
#: shared-module/displayio/Display.c
#: shared-module/framebufferio/FramebufferDisplay.c
msgid "Below minimum frame rate"
msgstr "Unterhalb der minimalen Frame Rate"
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr "Bit clock und word select müssen eine clock unit teilen"
@@ -469,7 +479,7 @@ msgstr "Bit clock und word select müssen eine clock unit teilen"
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid "Bit depth must be from 1 to 6 inclusive, not %d"
-msgstr ""
+msgstr "Bittiefe muss zwischen 1 und 6 liegen, nicht %d"
#: shared-bindings/audiobusio/PDMIn.c
msgid "Bit depth must be multiple of 8."
@@ -503,6 +513,10 @@ msgstr "Die Helligkeit ist nicht einstellbar"
msgid "Buffer + offset too small %d %d %d"
msgstr "Buffer + Offset zu klein %d %d %d"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -566,7 +580,7 @@ msgstr "CBC-Blöcke müssen ein Vielfaches von 16 Bytes sein"
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "CRC or checksum was invalid"
-msgstr ""
+msgstr "CRC oder Checksumme ungültig"
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
@@ -574,7 +588,7 @@ msgstr "Rufe super().__init__() vor dem Zugriff auf ein natives Objekt auf."
#: ports/esp32s2/common-hal/alarm/pin/PinAlarm.c
msgid "Can only alarm on RTC IO from deep sleep."
-msgstr ""
+msgstr "Alarm der RTC IO kann nur im deep sleep ausgeführt werden."
#: ports/esp32s2/common-hal/alarm/pin/PinAlarm.c
msgid "Can only alarm on one low pin while others alarm high from deep sleep."
@@ -620,7 +634,7 @@ msgstr "Kann nicht beite Kanäle auf dem gleichen Pin ausgeben"
#: ports/esp32s2/common-hal/alarm/pin/PinAlarm.c
msgid "Cannot pull on input-only pin."
-msgstr ""
+msgstr "Kann nicht 'pull' an einem 'input-only' pin."
#: shared-module/bitbangio/SPI.c
msgid "Cannot read without MISO pin."
@@ -642,7 +656,7 @@ msgstr "Reset zum bootloader nicht möglich da bootloader nicht vorhanden."
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Cannot set socket options"
-msgstr ""
+msgstr "Socket Optionen können nicht gesetzt werden"
#: shared-bindings/digitalio/DigitalInOut.c
msgid "Cannot set value when direction is input."
@@ -672,7 +686,7 @@ msgstr ""
#: ports/esp32s2/common-hal/alarm/pin/PinAlarm.c
msgid "Cannot wake on pin edge. Only level."
-msgstr ""
+msgstr "Kann nicht auf Flanke wecken, nur auf Level."
#: shared-module/bitbangio/SPI.c
msgid "Cannot write without MOSI pin."
@@ -830,7 +844,7 @@ msgstr "Data 0 pin muss am Byte ausgerichtet sein"
#: ports/esp32s2/common-hal/displayio/ParallelBus.c
msgid "Data 0 pin must be byte aligned."
-msgstr ""
+msgstr "Data 0 Pin muss Byte aligned sein."
#: shared-module/audiocore/WaveFile.c
msgid "Data chunk must follow fmt chunk"
@@ -888,7 +902,7 @@ msgstr "Fehler in regex"
#: shared-bindings/socketpool/Socket.c shared-bindings/ssl/SSLSocket.c
msgid "Error: Failure to bind"
-msgstr ""
+msgstr "Error: Bind Fehler"
#: ports/raspberrypi/bindings/rp2pio/StateMachine.c py/enum.c
#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c
@@ -926,7 +940,7 @@ msgstr "Erwartet eine Adresse"
#: shared-bindings/alarm/__init__.c
msgid "Expected an alarm"
-msgstr ""
+msgstr "Alarm erwartet"
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
@@ -960,6 +974,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr "Mutex konnte nicht akquiriert werden. Status: 0x%04x"
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr "Konnte keinen RX Buffer allozieren"
@@ -1042,7 +1057,7 @@ msgstr "Die Funktion erwartet, dass der 'lock'-Befehl zuvor ausgeführt wurde"
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Generic Failure"
-msgstr ""
+msgstr "Generischer Fehler"
#: shared-bindings/displayio/Display.c
#: shared-bindings/displayio/EPaperDisplay.c
@@ -1078,7 +1093,7 @@ msgstr "I2C-Init-Fehler"
#: ports/raspberrypi/common-hal/busio/I2C.c
msgid "I2C peripheral in use"
-msgstr ""
+msgstr "I2C Peripherie in Verwendung"
#: shared-bindings/audiobusio/I2SOut.c
msgid "I2SOut not available"
@@ -1093,6 +1108,10 @@ msgstr "IOs 0, 2 & 4 unterstützen keinen internen Pull up im sleep-Modus"
msgid "IV must be %d bytes long"
msgstr "IV muss %d Bytes lang sein"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1107,6 +1126,14 @@ msgstr "Inkorrekte Puffergröße"
#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
msgid "Init program size invalid"
+msgstr "Init Programm Größe ungültig"
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
msgstr ""
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
@@ -1116,11 +1143,11 @@ msgstr "Initialisierung aufgrund von Speichermangel fehlgeschlagen"
#: shared-bindings/bitops/__init__.c
#, c-format
msgid "Input buffer length (%d) must be a multiple of the strand count (%d)"
-msgstr ""
+msgstr "Input buffer länge (%d) muss ein vielfaches vom Strand Count (%d) sein"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
-msgstr ""
+msgstr "Input benötigt zu lange"
#: ports/esp32s2/common-hal/neopixel_write/__init__.c py/moduerrno.c
msgid "Input/output error"
@@ -1129,7 +1156,7 @@ msgstr "Eingabe-/Ausgabefehler"
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#, c-format
msgid "Instruction %d jumps on pin"
-msgstr ""
+msgstr "Instruktion %d springt auf Pin"
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#, c-format
@@ -1208,7 +1235,7 @@ msgstr "Ungültige PWM Frequenz"
#: ports/esp32s2/common-hal/analogio/AnalogIn.c
msgid "Invalid Pin"
-msgstr ""
+msgstr "Ungültiger Pin"
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
#: py/moduerrno.c shared-module/rgbmatrix/RGBMatrix.c
@@ -1219,7 +1246,8 @@ msgstr "Ungültiges Argument"
msgid "Invalid bits per value"
msgstr "Ungültige Bits pro Wert"
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr "Ungültige Puffergröße"
@@ -1294,10 +1322,10 @@ msgstr "Ungültiger Pin für rechten Kanal"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "Ungültige Pins"
@@ -1346,7 +1374,8 @@ msgstr "Ungültige Anzahl von Stimmen"
msgid "Invalid wave file"
msgstr "Ungültige wave Datei"
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr "Ungültige Wort- / Bitlänge"
@@ -1475,6 +1504,7 @@ msgstr "Kein DAC im Chip vorhanden"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr "Kein DMA Kanal gefunden"
@@ -1541,6 +1571,14 @@ msgstr "Keine Hardwareunterstützung am clk Pin"
msgid "No hardware support on pin"
msgstr "Keine Hardwareunterstützung an diesem Pin"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr "Es wurde kein Schlüssel angegeben"
@@ -1629,13 +1667,10 @@ msgid "Odd parity is not supported"
msgstr "Eine ungerade Parität wird nicht unterstützt"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr "Nur 8 oder 16 bit mono mit "
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
@@ -1685,6 +1720,10 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr ""
@@ -1847,7 +1886,7 @@ msgstr "RNG DeInit-Fehler"
msgid "RNG Init Error"
msgstr "RNG Init Fehler"
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr ""
@@ -1884,7 +1923,7 @@ msgstr "Nur lesen möglich, da Schreibgeschützt"
msgid "Read-only filesystem"
msgstr "Schreibgeschützte Dateisystem"
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr "Schreibgeschützte Objekt"
@@ -2129,6 +2168,7 @@ msgid "To exit, please reset the board without "
msgstr "Zum beenden, resette bitte das board ohne "
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr "Zu viele Kanäle im sample."
@@ -2170,10 +2210,6 @@ msgstr "UART Init Fehler"
msgid "UART Re-init error"
msgstr "UART Re-Init-Fehler"
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr ""
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr "UART-Schreibfehler"
@@ -2200,6 +2236,7 @@ msgstr "Der UUID-Wert ist kein str-, int- oder Byte-Puffer"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr "Konnte keine Buffer für Vorzeichenumwandlung allozieren"
@@ -2356,7 +2393,7 @@ msgstr "WatchDogTimer.timeout muss größer als 0 sein"
#: supervisor/shared/safe_mode.c
msgid "Watchdog timer expired."
-msgstr "Watchdog timer abgelaufen "
+msgstr "Watchdog timer abgelaufen."
#: py/builtinhelp.c
#, c-format
@@ -2516,8 +2553,8 @@ msgid "binary op %q not implemented"
msgstr "Der binäre Operator %q ist nicht implementiert"
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
-msgstr "bits muss 7, 8 oder 9 sein"
+msgid "bits must be in range 5 to 9"
+msgstr ""
#: shared-bindings/audiomixer/Mixer.c
msgid "bits_per_sample must be 8 or 16"
@@ -2752,6 +2789,10 @@ msgstr "chr() arg ist nicht in range(256)"
msgid "circle can only be registered in one parent"
msgstr "Kreis kann nur in einem Elternteil registriert werden"
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr ""
@@ -3767,6 +3808,7 @@ msgstr "pow () mit 3 Argumenten erfordert Integer"
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr ""
@@ -3846,6 +3888,7 @@ msgstr ""
"oder 'B' sein"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr "Abtastrate außerhalb der Reichweite"
@@ -3917,7 +3960,7 @@ msgstr ""
msgid "sosfilt requires iterable arguments"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr "Quell-Palette zu groß"
@@ -4284,6 +4327,9 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)"
msgstr ""
+#~ msgid "bits must be 7, 8 or 9"
+#~ msgstr "bits muss 7, 8 oder 9 sein"
+
#~ msgid "SDA or SCL needs a pull up"
#~ msgstr "SDA oder SCL brauchen pull up"
diff --git a/locale/el.po b/locale/el.po
index b088a7645..49f113039 100644
--- a/locale/el.po
+++ b/locale/el.po
@@ -102,6 +102,7 @@ msgstr ""
msgid "%q must be a tuple of length 2"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr ""
@@ -332,6 +333,7 @@ msgid "All SPI peripherals are in use"
msgstr ""
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr ""
@@ -453,6 +455,10 @@ msgstr ""
msgid "Below minimum frame rate"
msgstr ""
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr ""
@@ -494,6 +500,10 @@ msgstr ""
msgid "Buffer + offset too small %d %d %d"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -943,6 +953,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr ""
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr ""
@@ -1074,6 +1085,10 @@ msgstr ""
msgid "IV must be %d bytes long"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1088,6 +1103,14 @@ msgstr ""
msgid "Init program size invalid"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr ""
@@ -1198,7 +1221,8 @@ msgstr ""
msgid "Invalid bits per value"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr ""
@@ -1273,10 +1297,10 @@ msgstr ""
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr ""
@@ -1325,7 +1349,8 @@ msgstr ""
msgid "Invalid wave file"
msgstr ""
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr ""
@@ -1452,6 +1477,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr ""
@@ -1518,6 +1544,14 @@ msgstr ""
msgid "No hardware support on pin"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
@@ -1604,13 +1638,10 @@ msgid "Odd parity is not supported"
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr ""
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
@@ -1656,6 +1687,10 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr ""
@@ -1815,7 +1850,7 @@ msgstr ""
msgid "RNG Init Error"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr ""
@@ -1852,7 +1887,7 @@ msgstr ""
msgid "Read-only filesystem"
msgstr ""
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr ""
@@ -2085,6 +2120,7 @@ msgid "To exit, please reset the board without "
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr ""
@@ -2124,10 +2160,6 @@ msgstr ""
msgid "UART Re-init error"
msgstr ""
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr ""
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr ""
@@ -2154,6 +2186,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr ""
@@ -2455,7 +2488,7 @@ msgid "binary op %q not implemented"
msgstr ""
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
+msgid "bits must be in range 5 to 9"
msgstr ""
#: shared-bindings/audiomixer/Mixer.c
@@ -2683,6 +2716,10 @@ msgstr ""
msgid "circle can only be registered in one parent"
msgstr ""
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr ""
@@ -3682,6 +3719,7 @@ msgstr ""
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr ""
@@ -3759,6 +3797,7 @@ msgid ""
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr ""
@@ -3830,7 +3869,7 @@ msgstr ""
msgid "sosfilt requires iterable arguments"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr ""
diff --git a/locale/es.po b/locale/es.po
index c5e199719..72e569f47 100644
--- a/locale/es.po
+++ b/locale/es.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-04 12:55-0600\n"
-"PO-Revision-Date: 2021-02-21 22:27+0000\n"
+"PO-Revision-Date: 2021-03-02 02:24+0000\n"
"Last-Translator: Jose David M <jquintana202020@gmail.com>\n"
"Language-Team: \n"
"Language: es\n"
@@ -113,6 +113,7 @@ msgstr "%q debe ser >= 1"
msgid "%q must be a tuple of length 2"
msgstr "%q debe ser una tupla de longitud 2"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr "%q fuera de rango"
@@ -343,6 +344,7 @@ msgid "All SPI peripherals are in use"
msgstr "Todos los periféricos SPI están siendo usados"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr "Todos los periféricos UART están siendo usados"
@@ -470,6 +472,10 @@ msgstr "El periférico no maneja el Baudrate"
msgid "Below minimum frame rate"
msgstr "Por debajo de la tasa mínima de refrescamiento"
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr "Le reloj de bit y de selector de palabra deben ser pines secuenciales"
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr "Bit clock y word select deben compartir una unidad de reloj"
@@ -511,6 +517,11 @@ msgstr "El brillo no se puede ajustar"
msgid "Buffer + offset too small %d %d %d"
msgstr "Búfer + compensado muy pequeños %d %d %d"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+"Los elementos del búfer deben de ser de una longitud de 4 bytes o menos"
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -968,6 +979,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr "No se puede adquirir el mutex, error 0x%04x"
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr "Ha fallado la asignación del buffer RX"
@@ -1100,6 +1112,12 @@ msgstr "IOs 0, 2 y 4 no soportan pullup interno durante sleep"
msgid "IV must be %d bytes long"
msgstr "IV debe tener %d bytes de longitud"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+"Los elementos del búfer de entrada deben ser de una longitud de 4 bytes o "
+"menos"
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1116,6 +1134,18 @@ msgstr "Tamaño incorrecto del buffer"
msgid "Init program size invalid"
msgstr "Tamaño del programa Init invalido"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+"La dirección configurada inicial del pin esta en conflicto con la dirección "
+"de salida inicial del pin"
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+"El estado inicial del pin de configuración esta en conflicto con el estado "
+"inicial de salida del pin"
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr "Inicializacion fallida por falta de memoria"
@@ -1228,7 +1258,8 @@ msgstr "Argumento inválido"
msgid "Invalid bits per value"
msgstr "Inválido bits por valor"
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr "Tamaño de buffer inválido"
@@ -1303,10 +1334,10 @@ msgstr "Pin inválido para canal derecho"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "pines inválidos"
@@ -1355,7 +1386,8 @@ msgstr "Cuenta de voces inválida"
msgid "Invalid wave file"
msgstr "Archivo wave inválido"
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr "Tamaño no válido de palabra/bit"
@@ -1486,6 +1518,7 @@ msgstr "El chip no tiene DAC"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr "No se encontró el canal DMA"
@@ -1552,6 +1585,14 @@ msgstr "Sin soporte de hardware en el pin clk"
msgid "No hardware support on pin"
msgstr "Sin soporte de hardware en pin"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr "No hay \"in\" en el programa"
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr "No hay \"in\" o \"out\" en el programa"
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr "No se especificó ninguna llave"
@@ -1640,13 +1681,10 @@ msgid "Odd parity is not supported"
msgstr "Paridad impar no soportada"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr "Solo mono de 8 ó 16 bit con "
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr "Solamente IN/OUT hasta 8 esta soportado"
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr "Solo hay capacidad para direcciones IPv4"
@@ -1696,6 +1734,12 @@ msgstr "Operación no característica no soportada"
msgid "Operation timed out"
msgstr "Tiempo de espera agotado"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+"Los elementos del búfer de salida deben ser de una longitud de 4 bytes o "
+"menos"
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr "Memoria agotada"
@@ -1867,7 +1911,7 @@ msgstr "Error de desinicialización de RNG"
msgid "RNG Init Error"
msgstr "Error de inicialización de RNG"
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr "RS485 no esta soportado todavía en este dispositivo"
@@ -1904,7 +1948,7 @@ msgstr "Solo-lectura"
msgid "Read-only filesystem"
msgstr "Sistema de archivos de solo-Lectura"
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr "Objeto de solo-lectura"
@@ -2150,6 +2194,7 @@ msgid "To exit, please reset the board without "
msgstr "Para salir, por favor reinicia la tarjeta sin "
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr "Demasiados canales en sample."
@@ -2190,10 +2235,6 @@ msgstr "Error de inicialización de UART"
msgid "UART Re-init error"
msgstr "Error de reinicialización de UART"
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr "UART no esta soportado todavia"
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr "Error de escritura UART"
@@ -2220,6 +2261,7 @@ msgstr "UUID valor no es un str, int o byte buffer"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr "No se pudieron asignar buffers para la conversión con signo"
@@ -2532,8 +2574,8 @@ msgid "binary op %q not implemented"
msgstr "operacion binaria %q no implementada"
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
-msgstr "bits deben ser 7, 8 ó 9"
+msgid "bits must be in range 5 to 9"
+msgstr "los bits deben estar en el rango de 5 a 9"
#: shared-bindings/audiomixer/Mixer.c
msgid "bits_per_sample must be 8 or 16"
@@ -2765,6 +2807,10 @@ msgstr "El argumento de chr() no esta en el rango(256)"
msgid "circle can only be registered in one parent"
msgstr "circulo solo puede ser registrado con un pariente"
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr "código fuera del rango 0~127"
@@ -3773,6 +3819,7 @@ msgstr "pow() con 3 argumentos requiere enteros"
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr "presionando botón de arranque al inicio.\n"
@@ -3852,6 +3899,7 @@ msgstr ""
"o'B'"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr "frecuencia de muestreo fuera de rango"
@@ -3923,7 +3971,7 @@ msgstr "sos[:, 3] deberían ser todos unos"
msgid "sosfilt requires iterable arguments"
msgstr "sosfilt requiere argumentos iterables"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr "paleta fuente muy larga"
@@ -4286,6 +4334,20 @@ msgstr "zi debe ser de tipo flotante"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi debe ser una forma (n_section,2)"
+#~ msgid "Initial set pin direcion conflicts with initial out pin direction"
+#~ msgstr ""
+#~ "La dirección inicial del pin de configuración esta en conflicto con la "
+#~ "dirección de salida inicial del pin"
+
+#~ msgid "UART not yet supported"
+#~ msgstr "UART no esta soportado todavia"
+
+#~ msgid "bits must be 7, 8 or 9"
+#~ msgstr "bits deben ser 7, 8 ó 9"
+
+#~ msgid "Only IN/OUT of up to 8 supported"
+#~ msgstr "Solamente IN/OUT hasta 8 esta soportado"
+
#~ msgid "SDA or SCL needs a pull up"
#~ msgstr "SDA o SCL necesitan una pull up"
diff --git a/locale/fil.po b/locale/fil.po
index 1eecc49dc..b2c3d08b8 100644
--- a/locale/fil.po
+++ b/locale/fil.po
@@ -102,6 +102,7 @@ msgstr "aarehas na haba dapat ang buffer slices"
msgid "%q must be a tuple of length 2"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr ""
@@ -334,6 +335,7 @@ msgid "All SPI peripherals are in use"
msgstr "Lahat ng SPI peripherals ay ginagamit"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
#, fuzzy
msgid "All UART peripherals are in use"
msgstr "Lahat ng I2C peripherals ginagamit"
@@ -458,6 +460,10 @@ msgstr ""
msgid "Below minimum frame rate"
msgstr ""
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr "Ang bit clock at word select dapat makibahagi sa isang clock unit"
@@ -499,6 +505,10 @@ msgstr ""
msgid "Buffer + offset too small %d %d %d"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -956,6 +966,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr "Nabigo sa pag kuha ng mutex, status: 0x%08lX"
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr "Nabigong ilaan ang RX buffer"
@@ -1087,6 +1098,10 @@ msgstr ""
msgid "IV must be %d bytes long"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1103,6 +1118,14 @@ msgstr ""
msgid "Init program size invalid"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr ""
@@ -1213,7 +1236,8 @@ msgstr "Maling argumento"
msgid "Invalid bits per value"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr "Mali ang buffer size"
@@ -1288,10 +1312,10 @@ msgstr "Mali ang pin para sa kanang channel"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "Mali ang pins"
@@ -1340,7 +1364,8 @@ msgstr "Maling bilang ng voice"
msgid "Invalid wave file"
msgstr "May hindi tama sa wave file"
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr ""
@@ -1467,6 +1492,7 @@ msgstr "Walang DAC sa chip"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr "Walang DMA channel na mahanap"
@@ -1533,6 +1559,14 @@ msgstr ""
msgid "No hardware support on pin"
msgstr "Walang support sa hardware ang pin"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
@@ -1622,13 +1656,10 @@ msgid "Odd parity is not supported"
msgstr "Odd na parity ay hindi supportado"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr "Tanging 8 o 16 na bit mono na may "
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
@@ -1674,6 +1705,10 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr ""
@@ -1834,7 +1869,7 @@ msgstr ""
msgid "RNG Init Error"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr ""
@@ -1871,7 +1906,7 @@ msgstr "Basahin-lamang"
msgid "Read-only filesystem"
msgstr "Basahin-lamang mode"
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
#, fuzzy
msgid "Read-only object"
msgstr "Basahin-lamang"
@@ -2105,6 +2140,7 @@ msgid "To exit, please reset the board without "
msgstr "Para lumabas, paki-reset ang board na wala ang "
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr "Sobra ang channels sa sample."
@@ -2144,10 +2180,6 @@ msgstr ""
msgid "UART Re-init error"
msgstr ""
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr ""
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr ""
@@ -2174,6 +2206,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr "Hindi ma-allocate ang buffers para sa naka-sign na conversion"
@@ -2485,8 +2518,8 @@ msgid "binary op %q not implemented"
msgstr "binary op %q hindi implemented"
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
-msgstr "bits ay dapat 7, 8 o 9"
+msgid "bits must be in range 5 to 9"
+msgstr ""
#: shared-bindings/audiomixer/Mixer.c
msgid "bits_per_sample must be 8 or 16"
@@ -2720,6 +2753,10 @@ msgstr "chr() arg wala sa sakop ng range(256)"
msgid "circle can only be registered in one parent"
msgstr ""
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr ""
@@ -3731,6 +3768,7 @@ msgstr "pow() na may 3 argumento kailangan ng integers"
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr ""
@@ -3810,6 +3848,7 @@ msgstr ""
"'H', 'b' o'B'"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr "pagpili ng rate wala sa sakop"
@@ -3881,7 +3920,7 @@ msgstr ""
msgid "sosfilt requires iterable arguments"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr ""
@@ -4247,6 +4286,9 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)"
msgstr ""
+#~ msgid "bits must be 7, 8 or 9"
+#~ msgstr "bits ay dapat 7, 8 o 9"
+
#~ msgid "SDA or SCL needs a pull up"
#~ msgstr "Kailangan ng pull up resistors ang SDA o SCL"
diff --git a/locale/fr.po b/locale/fr.po
index a53d8658e..4acd85795 100644
--- a/locale/fr.po
+++ b/locale/fr.po
@@ -113,6 +113,7 @@ msgstr "%q doit être >= 1"
msgid "%q must be a tuple of length 2"
msgstr "%q doit être un tuple de longueur 2"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr "%q est hors de porté"
@@ -343,6 +344,7 @@ msgid "All SPI peripherals are in use"
msgstr "Tous les périphériques SPI sont utilisés"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr "Tous les périphériques UART sont utilisés"
@@ -470,6 +472,10 @@ msgstr "Baudrate non supporté par le périphérique"
msgid "Below minimum frame rate"
msgstr "Au-dessous de la fréquence d'images minimale"
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr "'bit clock' et 'word select' doivent partager une horloge"
@@ -511,6 +517,10 @@ msgstr "Luminosité non-ajustable"
msgid "Buffer + offset too small %d %d %d"
msgstr "Tampon + décalage trop petit %d %d %d"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -976,6 +986,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr "Echec de l'obtention de mutex, err 0x%04x"
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr "Echec de l'allocation du tampon RX"
@@ -1109,6 +1120,10 @@ msgstr "IOs 0, 2 & 4 ne supportent pas l'éleveuse interne en mode someil"
msgid "IV must be %d bytes long"
msgstr "IV doit être de longueur de %d octets"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1125,6 +1140,14 @@ msgstr "Taille de tampon incorrecte"
msgid "Init program size invalid"
msgstr "Taille du programme d'initialisation non valide"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr "Échec d'initialisation par manque de mémoire"
@@ -1241,7 +1264,8 @@ msgstr "Paramètre invalide"
msgid "Invalid bits per value"
msgstr "Bits par valeur invalides"
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr "Longueur de tampon invalide"
@@ -1316,10 +1340,10 @@ msgstr "Broche invalide pour le canal droit"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "Broches invalides"
@@ -1368,7 +1392,8 @@ msgstr "Nombre de voix invalide"
msgid "Invalid wave file"
msgstr "Fichier WAVE invalide"
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr "Longueur de mot / bit invalide"
@@ -1441,7 +1466,8 @@ msgstr "first_in_pin manquant. Instruction %d lit une/des broche(s)"
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#, c-format
msgid "Missing first_in_pin. Instruction %d shifts in from pin(s)"
-msgstr "first_in_pin manquant. Instruction %d est déplacée par la/les broche(s)"
+msgstr ""
+"first_in_pin manquant. Instruction %d est déplacée par la/les broche(s)"
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#, c-format
@@ -1496,6 +1522,7 @@ msgstr "Pas de DAC sur la puce"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr "Aucun canal DMA trouvé"
@@ -1562,6 +1589,14 @@ msgstr "Pas de support matériel sur la broche clk"
msgid "No hardware support on pin"
msgstr "Pas de support matériel pour cette broche"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr "Aucune clé n'a été spécifiée"
@@ -1650,13 +1685,10 @@ msgid "Odd parity is not supported"
msgstr "Parité impaire non supportée"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr "Uniquement 8 ou 16 bit mono avec "
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr "Seulement des IN/OUT jusqu'à 8 est supporté"
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr "Seulement les adresses IPv4 sont supportées"
@@ -1706,6 +1738,10 @@ msgstr "Opération ou fonction non supportée"
msgid "Operation timed out"
msgstr "Timeout de l'opération"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr "Hors de mémoire"
@@ -1879,7 +1915,7 @@ msgstr "Erreur de désinitiation du RNG (RNG DeInit)"
msgid "RNG Init Error"
msgstr "Erreur d'initialisation du RNG (RNG Init)"
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr "RS485 n'est pas encore supporté sur cet appareil"
@@ -1916,7 +1952,7 @@ msgstr "Lecture seule"
msgid "Read-only filesystem"
msgstr "Système de fichier en lecture seule"
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr "Objet en lecture seule"
@@ -2160,6 +2196,7 @@ msgid "To exit, please reset the board without "
msgstr "Pour quitter, SVP redémarrez la carte sans "
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr "Trop de canaux dans l'échantillon."
@@ -2200,10 +2237,6 @@ msgstr "Erreur d'initialisation UART"
msgid "UART Re-init error"
msgstr "Erreur de réinitialisation UART"
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr "UART n'est pas encore supporté"
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr "Erreur d'écriture UART"
@@ -2233,6 +2266,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr "Impossible d'allouer des tampons pour une conversion signée"
@@ -2547,8 +2581,8 @@ msgid "binary op %q not implemented"
msgstr "opération binaire '%q' non implémentée"
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
-msgstr "bits doivent être 7, 8 ou 9"
+msgid "bits must be in range 5 to 9"
+msgstr ""
#: shared-bindings/audiomixer/Mixer.c
msgid "bits_per_sample must be 8 or 16"
@@ -2784,6 +2818,10 @@ msgstr "paramètre de chr() hors les bornes de range(256)"
msgid "circle can only be registered in one parent"
msgstr "le cercle ne peut être enregistré que dans un seul parent"
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr "code hors bornes 0~127"
@@ -3799,6 +3837,7 @@ msgstr "pow() avec 3 arguments nécessite des entiers"
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr "bouton boot appuyé lors du démarrage.\n"
@@ -3878,6 +3917,7 @@ msgstr ""
"'h','H', 'b' ou 'B'"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr "taux d'échantillonage hors bornes"
@@ -3949,7 +3989,7 @@ msgstr "sos[:, 3] doivent tous être à un"
msgid "sosfilt requires iterable arguments"
msgstr "sosfilt nécessite des argument itératifs"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr "la palette source est trop grande"
@@ -4312,6 +4352,15 @@ msgstr "zi doit être de type float"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi doit être de forme (n_section, 2)"
+#~ msgid "UART not yet supported"
+#~ msgstr "UART n'est pas encore supporté"
+
+#~ msgid "bits must be 7, 8 or 9"
+#~ msgstr "bits doivent être 7, 8 ou 9"
+
+#~ msgid "Only IN/OUT of up to 8 supported"
+#~ msgstr "Seulement des IN/OUT jusqu'à 8 est supporté"
+
#~ msgid "SDA or SCL needs a pull up"
#~ msgstr "SDA ou SCL a besoin d'une résistance de tirage ('pull up')"
diff --git a/locale/hi.po b/locale/hi.po
index 3d8100697..c8805ec90 100644
--- a/locale/hi.po
+++ b/locale/hi.po
@@ -102,6 +102,7 @@ msgstr ""
msgid "%q must be a tuple of length 2"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr ""
@@ -332,6 +333,7 @@ msgid "All SPI peripherals are in use"
msgstr ""
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr ""
@@ -453,6 +455,10 @@ msgstr ""
msgid "Below minimum frame rate"
msgstr ""
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr ""
@@ -494,6 +500,10 @@ msgstr ""
msgid "Buffer + offset too small %d %d %d"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -943,6 +953,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr ""
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr ""
@@ -1074,6 +1085,10 @@ msgstr ""
msgid "IV must be %d bytes long"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1088,6 +1103,14 @@ msgstr ""
msgid "Init program size invalid"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr ""
@@ -1198,7 +1221,8 @@ msgstr ""
msgid "Invalid bits per value"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr ""
@@ -1273,10 +1297,10 @@ msgstr ""
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr ""
@@ -1325,7 +1349,8 @@ msgstr ""
msgid "Invalid wave file"
msgstr ""
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr ""
@@ -1452,6 +1477,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr ""
@@ -1518,6 +1544,14 @@ msgstr ""
msgid "No hardware support on pin"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
@@ -1604,13 +1638,10 @@ msgid "Odd parity is not supported"
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr ""
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
@@ -1656,6 +1687,10 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr ""
@@ -1815,7 +1850,7 @@ msgstr ""
msgid "RNG Init Error"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr ""
@@ -1852,7 +1887,7 @@ msgstr ""
msgid "Read-only filesystem"
msgstr ""
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr ""
@@ -2085,6 +2120,7 @@ msgid "To exit, please reset the board without "
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr ""
@@ -2124,10 +2160,6 @@ msgstr ""
msgid "UART Re-init error"
msgstr ""
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr ""
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr ""
@@ -2154,6 +2186,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr ""
@@ -2455,7 +2488,7 @@ msgid "binary op %q not implemented"
msgstr ""
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
+msgid "bits must be in range 5 to 9"
msgstr ""
#: shared-bindings/audiomixer/Mixer.c
@@ -2683,6 +2716,10 @@ msgstr ""
msgid "circle can only be registered in one parent"
msgstr ""
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr ""
@@ -3682,6 +3719,7 @@ msgstr ""
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr ""
@@ -3759,6 +3797,7 @@ msgid ""
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr ""
@@ -3830,7 +3869,7 @@ msgstr ""
msgid "sosfilt requires iterable arguments"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr ""
diff --git a/locale/it_IT.po b/locale/it_IT.po
index 0153dc889..68af6c779 100644
--- a/locale/it_IT.po
+++ b/locale/it_IT.po
@@ -112,6 +112,7 @@ msgstr "slice del buffer devono essere della stessa lunghezza"
msgid "%q must be a tuple of length 2"
msgstr "%q deve essere una tupla di lunghezza 2"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr "%q oltre il limite"
@@ -343,6 +344,7 @@ msgid "All SPI peripherals are in use"
msgstr "Tutte le periferiche SPI sono in uso"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
#, fuzzy
msgid "All UART peripherals are in use"
msgstr "Tutte le periferiche I2C sono in uso"
@@ -467,6 +469,10 @@ msgstr ""
msgid "Below minimum frame rate"
msgstr "Al di sotto del frame rate minimo"
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr ""
@@ -509,6 +515,10 @@ msgstr "Luminosità non è regolabile"
msgid "Buffer + offset too small %d %d %d"
msgstr "Buffer + offset troppo piccolo %d %d %d"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -965,6 +975,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x"
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr "Impossibile allocare buffer RX"
@@ -1096,6 +1107,10 @@ msgstr ""
msgid "IV must be %d bytes long"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1112,6 +1127,14 @@ msgstr ""
msgid "Init program size invalid"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr ""
@@ -1222,7 +1245,8 @@ msgstr "Argomento non valido"
msgid "Invalid bits per value"
msgstr "bits per valore invalido"
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
#, fuzzy
msgid "Invalid buffer size"
msgstr "lunghezza del buffer non valida"
@@ -1299,10 +1323,10 @@ msgstr "Pin non valido per il canale destro"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "Pin non validi"
@@ -1352,7 +1376,8 @@ msgstr "Tipo di servizio non valido"
msgid "Invalid wave file"
msgstr "File wave non valido"
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr ""
@@ -1480,6 +1505,7 @@ msgstr "Nessun DAC sul chip"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr "Nessun canale DMA trovato"
@@ -1546,6 +1572,14 @@ msgstr ""
msgid "No hardware support on pin"
msgstr "Nessun supporto hardware sul pin"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
@@ -1636,13 +1670,10 @@ msgid "Odd parity is not supported"
msgstr "operazione I2C non supportata"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr ""
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
@@ -1688,6 +1719,10 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr ""
@@ -1853,7 +1888,7 @@ msgstr ""
msgid "RNG Init Error"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr ""
@@ -1890,7 +1925,7 @@ msgstr "Sola lettura"
msgid "Read-only filesystem"
msgstr "Filesystem in sola lettura"
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
#, fuzzy
msgid "Read-only object"
msgstr "Sola lettura"
@@ -2126,6 +2161,7 @@ msgid "To exit, please reset the board without "
msgstr "Per uscire resettare la scheda senza "
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr ""
@@ -2165,10 +2201,6 @@ msgstr ""
msgid "UART Re-init error"
msgstr ""
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr ""
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr ""
@@ -2195,6 +2227,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr "Ipossibilitato ad allocare buffer per la conversione con segno"
@@ -2498,8 +2531,8 @@ msgid "binary op %q not implemented"
msgstr "operazione binaria %q non implementata"
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
-msgstr "i bit devono essere 7, 8 o 9"
+msgid "bits must be in range 5 to 9"
+msgstr ""
#: shared-bindings/audiomixer/Mixer.c
#, fuzzy
@@ -2730,6 +2763,10 @@ msgstr "argomento di chr() non è in range(256)"
msgid "circle can only be registered in one parent"
msgstr ""
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr ""
@@ -3748,6 +3785,7 @@ msgstr "pow() con 3 argomenti richiede interi"
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr ""
@@ -3827,6 +3865,7 @@ msgstr ""
"'H', 'b' o 'B'"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr "frequenza di campionamento fuori intervallo"
@@ -3898,7 +3937,7 @@ msgstr ""
msgid "sosfilt requires iterable arguments"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr ""
@@ -4264,6 +4303,9 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)"
msgstr ""
+#~ msgid "bits must be 7, 8 or 9"
+#~ msgstr "i bit devono essere 7, 8 o 9"
+
#~ msgid "SDA or SCL needs a pull up"
#~ msgstr "SDA o SCL necessitano un pull-up"
diff --git a/locale/ja.po b/locale/ja.po
index 2616789f4..017e5583c 100644
--- a/locale/ja.po
+++ b/locale/ja.po
@@ -107,6 +107,7 @@ msgstr "%qは1以上でなければなりません"
msgid "%q must be a tuple of length 2"
msgstr "%qは長さ2のタプルでなければなりません"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr "%q が範囲外"
@@ -337,6 +338,7 @@ msgid "All SPI peripherals are in use"
msgstr "全てのSPI周辺機器が使用中"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr "全てのUART周辺機器が使用中"
@@ -460,6 +462,10 @@ msgstr ""
msgid "Below minimum frame rate"
msgstr "最低のフレームレート未満"
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr "bit clockとword selectはクロックユニットを共有しなければなりません"
@@ -501,6 +507,10 @@ msgstr "Brightnessは調整可能ではありません"
msgid "Buffer + offset too small %d %d %d"
msgstr "buffer + offsetが小さすぎます %d %d %d"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -954,6 +964,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr "ミューテックスの取得に失敗。エラー 0x%04x"
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr "RXバッファの確保に失敗"
@@ -1085,6 +1096,10 @@ msgstr ""
msgid "IV must be %d bytes long"
msgstr "IVは%dバイト長でなければなりません"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1101,6 +1116,14 @@ msgstr "バッファサイズが正しくありません"
msgid "Init program size invalid"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr ""
@@ -1211,7 +1234,8 @@ msgstr "不正な引数"
msgid "Invalid bits per value"
msgstr "不正なbits per value"
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr "不正なバッファサイズ"
@@ -1286,10 +1310,10 @@ msgstr "右チャネルのピンが不正"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "ピンが不正"
@@ -1338,7 +1362,8 @@ msgstr "不正なボイス数"
msgid "Invalid wave file"
msgstr "不正なwaveファイル"
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr "不正なワード/ビット長"
@@ -1465,6 +1490,7 @@ msgstr "チップにDACがありません"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr "DMAチャネルが見つかりません"
@@ -1531,6 +1557,14 @@ msgstr "clkピンにハードウェア対応がありません"
msgid "No hardware support on pin"
msgstr "ピンにハードウェア対応がありません"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr "キーが指定されていません"
@@ -1619,13 +1653,10 @@ msgid "Odd parity is not supported"
msgstr "奇数パリティには対応していません"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr "8または16ビットの "
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
@@ -1671,6 +1702,10 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr ""
@@ -1831,7 +1866,7 @@ msgstr "RNG解体エラー"
msgid "RNG Init Error"
msgstr "乱数生成器の初期化エラー"
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr ""
@@ -1868,7 +1903,7 @@ msgstr "読み込み専用"
msgid "Read-only filesystem"
msgstr "読み込み専用のファイルシステム"
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr "読み込み専用のオブジェクト"
@@ -2107,6 +2142,7 @@ msgid "To exit, please reset the board without "
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr "サンプルのチャンネル数が多すぎます"
@@ -2146,10 +2182,6 @@ msgstr "UARTの初期化エラー"
msgid "UART Re-init error"
msgstr "UARTの再初期化エラー"
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr ""
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr "UART書き込みエラー"
@@ -2177,6 +2209,7 @@ msgstr "UUIDの値がstr, int, bufferのいずれでもありません"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr ""
@@ -2478,8 +2511,8 @@ msgid "binary op %q not implemented"
msgstr ""
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
-msgstr "bitsは7, 8, 9のいずれかでなければなりません"
+msgid "bits must be in range 5 to 9"
+msgstr ""
#: shared-bindings/audiomixer/Mixer.c
msgid "bits_per_sample must be 8 or 16"
@@ -2706,6 +2739,10 @@ msgstr ""
msgid "circle can only be registered in one parent"
msgstr ""
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr ""
@@ -3712,6 +3749,7 @@ msgstr "pow()の第3引数には整数が必要"
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr ""
@@ -3790,6 +3828,7 @@ msgstr ""
"sample_source バッファには bytearray または 'h','H','b','B'型のarrayが必要"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr "サンプリングレートが範囲外"
@@ -3861,7 +3900,7 @@ msgstr ""
msgid "sosfilt requires iterable arguments"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr ""
@@ -4223,6 +4262,9 @@ msgstr "ziはfloat値でなければなりません"
msgid "zi must be of shape (n_section, 2)"
msgstr ""
+#~ msgid "bits must be 7, 8 or 9"
+#~ msgstr "bitsは7, 8, 9のいずれかでなければなりません"
+
#~ msgid "SDA or SCL needs a pull up"
#~ msgstr "SDAとSCLにプルアップが必要"
diff --git a/locale/ko.po b/locale/ko.po
index 26810f87e..4e87dabf9 100644
--- a/locale/ko.po
+++ b/locale/ko.po
@@ -103,6 +103,7 @@ msgstr "%q 는 >=1이어야합니다"
msgid "%q must be a tuple of length 2"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr ""
@@ -333,6 +334,7 @@ msgid "All SPI peripherals are in use"
msgstr "사용중인 모든 SPI주변 기기"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr "사용중인 모든 UART주변 기기"
@@ -456,6 +458,10 @@ msgstr ""
msgid "Below minimum frame rate"
msgstr ""
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr ""
@@ -497,6 +503,10 @@ msgstr "밝기를 조절할 수 없습니다"
msgid "Buffer + offset too small %d %d %d"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -946,6 +956,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr ""
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr ""
@@ -1077,6 +1088,10 @@ msgstr ""
msgid "IV must be %d bytes long"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1091,6 +1106,14 @@ msgstr ""
msgid "Init program size invalid"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr ""
@@ -1201,7 +1224,8 @@ msgstr ""
msgid "Invalid bits per value"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr ""
@@ -1276,10 +1300,10 @@ msgstr "오른쪽 채널 핀이 잘못되었습니다"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "핀이 유효하지 않습니다"
@@ -1328,7 +1352,8 @@ msgstr ""
msgid "Invalid wave file"
msgstr ""
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr ""
@@ -1455,6 +1480,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr ""
@@ -1521,6 +1547,14 @@ msgstr ""
msgid "No hardware support on pin"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
@@ -1607,13 +1641,10 @@ msgid "Odd parity is not supported"
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr ""
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
@@ -1659,6 +1690,10 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr ""
@@ -1818,7 +1853,7 @@ msgstr ""
msgid "RNG Init Error"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr ""
@@ -1855,7 +1890,7 @@ msgstr ""
msgid "Read-only filesystem"
msgstr ""
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr ""
@@ -2088,6 +2123,7 @@ msgid "To exit, please reset the board without "
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr ""
@@ -2127,10 +2163,6 @@ msgstr ""
msgid "UART Re-init error"
msgstr ""
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr ""
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr ""
@@ -2158,6 +2190,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr ""
@@ -2459,8 +2492,8 @@ msgid "binary op %q not implemented"
msgstr ""
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
-msgstr "비트(bits)는 7, 8 또는 9 여야합니다"
+msgid "bits must be in range 5 to 9"
+msgstr ""
#: shared-bindings/audiomixer/Mixer.c
msgid "bits_per_sample must be 8 or 16"
@@ -2687,6 +2720,10 @@ msgstr ""
msgid "circle can only be registered in one parent"
msgstr ""
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr ""
@@ -3686,6 +3723,7 @@ msgstr ""
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr ""
@@ -3763,6 +3801,7 @@ msgid ""
msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr ""
@@ -3834,7 +3873,7 @@ msgstr ""
msgid "sosfilt requires iterable arguments"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr ""
@@ -4196,6 +4235,9 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)"
msgstr ""
+#~ msgid "bits must be 7, 8 or 9"
+#~ msgstr "비트(bits)는 7, 8 또는 9 여야합니다"
+
#~ msgid ""
#~ "\n"
#~ "Code done running. Waiting for reload.\n"
diff --git a/locale/nl.po b/locale/nl.po
index 463a70da2..a26c1d7dd 100644
--- a/locale/nl.po
+++ b/locale/nl.po
@@ -105,6 +105,7 @@ msgstr "%q moet >= 1 zijn"
msgid "%q must be a tuple of length 2"
msgstr "%q moet een tuple van lengte 2 zijn"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr "%q buiten bereik"
@@ -335,6 +336,7 @@ msgid "All SPI peripherals are in use"
msgstr "Alle SPI peripherals zijn in gebruik"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr "Alle UART peripherals zijn in gebruik"
@@ -458,6 +460,10 @@ msgstr "Baudrate wordt niet ondersteund door randapparatuur"
msgid "Below minimum frame rate"
msgstr "Onder de minimum frame rate"
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr "Bit clock en word select moeten een clock eenheid delen"
@@ -499,6 +505,10 @@ msgstr "Helderheid is niet aanpasbaar"
msgid "Buffer + offset too small %d %d %d"
msgstr "Buffer + offset te klein %d %d %d"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -954,6 +964,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr "Fout tijdens verkrijgen mutex, err 0x%04x"
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr "RX buffer alloceren mislukt"
@@ -1086,6 +1097,10 @@ msgstr "IO's 0, 2 en 4 ondersteunen geen interne pullup in slaapstand"
msgid "IV must be %d bytes long"
msgstr "IV %d bytes lang zijn"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1102,6 +1117,14 @@ msgstr "Incorrecte buffer grootte"
msgid "Init program size invalid"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr "De initialisatie is mislukt vanwege een gebrek aan geheugen"
@@ -1212,7 +1235,8 @@ msgstr "Ongeldig argument"
msgid "Invalid bits per value"
msgstr "Ongeldige bits per waarde"
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr "Ongeldige buffer grootte"
@@ -1287,10 +1311,10 @@ msgstr "Ongeldige pin voor rechter kanaal"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "Ongeldige pinnen"
@@ -1339,7 +1363,8 @@ msgstr "Ongeldig stem aantal"
msgid "Invalid wave file"
msgstr "Ongeldig wave bestand"
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr "Ongeldig woord/bit lengte"
@@ -1466,6 +1491,7 @@ msgstr "Geen DAC op de chip"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr "Geen DMA kanaal gevonden"
@@ -1532,6 +1558,14 @@ msgstr "Geen hardware ondersteuning beschikbaar op clk pin"
msgid "No hardware support on pin"
msgstr "Geen hardware ondersteuning op pin"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr "Een sleutel was niet gespecificeerd"
@@ -1620,13 +1654,10 @@ msgid "Odd parity is not supported"
msgstr "Oneven pariteit is niet ondersteund"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr "Alleen 8 of 16 bit mono met "
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr "Alleen IPv4 adressen worden ondersteund"
@@ -1676,6 +1707,10 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr ""
@@ -1847,7 +1882,7 @@ msgstr "RNG DeInit Fout"
msgid "RNG Init Error"
msgstr "RNG Init Fout"
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr ""
@@ -1884,7 +1919,7 @@ msgstr "Alleen-lezen"
msgid "Read-only filesystem"
msgstr "Alleen-lezen bestandssysteem"
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr "Alleen-lezen object"
@@ -2127,6 +2162,7 @@ msgid "To exit, please reset the board without "
msgstr "Om te beëindigen, reset het bord zonder "
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr "Teveel kanalen in sample."
@@ -2166,10 +2202,6 @@ msgstr "UART Init Fout"
msgid "UART Re-init error"
msgstr "UART Re-init Fout"
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr ""
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr "UART schrijf fout"
@@ -2196,6 +2228,7 @@ msgstr "UUID waarde is geen str, int, of byte buffer"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr "Niet in staat buffers voor gesigneerde conversie te alloceren"
@@ -2508,8 +2541,8 @@ msgid "binary op %q not implemented"
msgstr "binaire op %q niet geïmplementeerd"
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
-msgstr "bits moet 7, 8, of 9 zijn"
+msgid "bits must be in range 5 to 9"
+msgstr ""
#: shared-bindings/audiomixer/Mixer.c
msgid "bits_per_sample must be 8 or 16"
@@ -2738,6 +2771,10 @@ msgid "circle can only be registered in one parent"
msgstr ""
"cirkel kan slechts bij één object van een hoger niveau worden geregistreerd"
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr ""
@@ -3744,6 +3781,7 @@ msgstr "pow() met 3 argumenten vereist integers"
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr "druk bootknop in bij opstarten.\n"
@@ -3823,6 +3861,7 @@ msgstr ""
"'B' zijn"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr "bemonsteringssnelheid buiten bereik"
@@ -3894,7 +3933,7 @@ msgstr "sos[:, 3] moeten allemaal 1 zijn"
msgid "sosfilt requires iterable arguments"
msgstr "sosfilt vereist itereerbare argumenten"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr "bronpalet te groot"
@@ -4256,6 +4295,9 @@ msgstr "zi moet van type float zijn"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi moet vorm (n_section, 2) hebben"
+#~ msgid "bits must be 7, 8 or 9"
+#~ msgstr "bits moet 7, 8, of 9 zijn"
+
#~ msgid "SDA or SCL needs a pull up"
#~ msgstr "SDA of SCL hebben een pullup nodig"
diff --git a/locale/pl.po b/locale/pl.po
index bf914aefb..54035a637 100644
--- a/locale/pl.po
+++ b/locale/pl.po
@@ -107,6 +107,7 @@ msgstr "%q musi być >= 1"
msgid "%q must be a tuple of length 2"
msgstr "%q musi być krotką o długości 2"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr "%q poza zakresem"
@@ -337,6 +338,7 @@ msgid "All SPI peripherals are in use"
msgstr "Wszystkie peryferia SPI w użyciu"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr "Wszystkie peryferia UART w użyciu"
@@ -460,6 +462,10 @@ msgstr ""
msgid "Below minimum frame rate"
msgstr ""
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr ""
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr "Zegar bitowy i wybór słowa muszą współdzielić jednostkę zegara"
@@ -501,6 +507,10 @@ msgstr "Jasność nie jest regulowana"
msgid "Buffer + offset too small %d %d %d"
msgstr "Bufor + przesunięcie za małe %d %d %d"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -954,6 +964,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr "Nie udało się uzyskać blokady, błąd 0x%04x"
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr "Nie udała się alokacja bufora RX"
@@ -1085,6 +1096,10 @@ msgstr ""
msgid "IV must be %d bytes long"
msgstr "IV musi mieć długość %d bajtów"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1101,6 +1116,14 @@ msgstr "Niewłaściwa wielkość bufora"
msgid "Init program size invalid"
msgstr ""
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr "Inicjalizacja nie powiodła się z powodu braku pamięci"
@@ -1211,7 +1234,8 @@ msgstr "Zły argument"
msgid "Invalid bits per value"
msgstr "Zła liczba bitów wartości"
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr "Zła wielkość bufora"
@@ -1286,10 +1310,10 @@ msgstr "Zła nóżka dla prawego kanału"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "Złe nóżki"
@@ -1338,7 +1362,8 @@ msgstr "Zła liczba głosów"
msgid "Invalid wave file"
msgstr "Zły plik wave"
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr "Niepoprawna długość słowa/bitu"
@@ -1466,6 +1491,7 @@ msgstr "Brak DAC"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr "Nie znaleziono kanału DMA"
@@ -1532,6 +1558,14 @@ msgstr ""
msgid "No hardware support on pin"
msgstr "Brak sprzętowej obsługi na nóżce"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr ""
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr "Nie określono klucza"
@@ -1618,13 +1652,10 @@ msgid "Odd parity is not supported"
msgstr "Nieparzysta parzystość nie jest wspierana"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr "Tylko 8 lub 16 bitów mono z "
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
@@ -1670,6 +1701,10 @@ msgstr ""
msgid "Operation timed out"
msgstr ""
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr ""
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr "Brak pamięci"
@@ -1829,7 +1864,7 @@ msgstr ""
msgid "RNG Init Error"
msgstr ""
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr ""
@@ -1866,7 +1901,7 @@ msgstr "Tylko do odczytu"
msgid "Read-only filesystem"
msgstr "System plików tylko do odczytu"
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr "Obiekt tylko do odczytu"
@@ -2099,6 +2134,7 @@ msgid "To exit, please reset the board without "
msgstr "By wyjść, proszę zresetować płytkę bez "
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr "Zbyt wiele kanałów."
@@ -2138,10 +2174,6 @@ msgstr ""
msgid "UART Re-init error"
msgstr ""
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr ""
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr "Błąd zapisu UART"
@@ -2168,6 +2200,7 @@ msgstr "UUID nie jest typu str, int lub bytes"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr "Nie udała się alokacja buforów do konwersji ze znakiem"
@@ -2475,8 +2508,8 @@ msgid "binary op %q not implemented"
msgstr "brak dwu-argumentowego operatora %q"
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
-msgstr "bits musi być 7, 8 lub 9"
+msgid "bits must be in range 5 to 9"
+msgstr ""
#: shared-bindings/audiomixer/Mixer.c
msgid "bits_per_sample must be 8 or 16"
@@ -2703,6 +2736,10 @@ msgstr "argument chr() poza zakresem range(256)"
msgid "circle can only be registered in one parent"
msgstr ""
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr ""
@@ -3704,6 +3741,7 @@ msgstr "trzyargumentowe pow() wymaga liczb całkowitych"
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr ""
@@ -3782,6 +3820,7 @@ msgstr ""
"bufor sample_source musi być bytearray lub tablicą typu 'h', 'H', 'b' lub 'B'"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr "częstotliwość próbkowania poza zakresem"
@@ -3853,7 +3892,7 @@ msgstr ""
msgid "sosfilt requires iterable arguments"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr "źródłowa paleta jest zbyt duża"
@@ -4215,6 +4254,9 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)"
msgstr ""
+#~ msgid "bits must be 7, 8 or 9"
+#~ msgstr "bits musi być 7, 8 lub 9"
+
#~ msgid "SDA or SCL needs a pull up"
#~ msgstr "SDA lub SCL wymagają podciągnięcia"
diff --git a/locale/pt_BR.po b/locale/pt_BR.po
index c283cdda8..dfe9a0dd5 100644
--- a/locale/pt_BR.po
+++ b/locale/pt_BR.po
@@ -6,7 +6,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-04 12:55-0600\n"
-"PO-Revision-Date: 2021-02-21 22:27+0000\n"
+"PO-Revision-Date: 2021-03-01 15:19+0000\n"
"Last-Translator: Wellington Terumi Uemura <wellingtonuemura@gmail.com>\n"
"Language-Team: \n"
"Language: pt_BR\n"
@@ -111,6 +111,7 @@ msgstr "%q deve ser >= 1"
msgid "%q must be a tuple of length 2"
msgstr "%q deve ser uma tupla de comprimento 2"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr "%q fora do alcance"
@@ -345,6 +346,7 @@ msgid "All SPI peripherals are in use"
msgstr "Todos os periféricos SPI estão em uso"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr "Todos os periféricos UART estão em uso"
@@ -470,6 +472,10 @@ msgstr "O Baudrate não é suportado pelo periférico"
msgid "Below minimum frame rate"
msgstr "Abaixo da taxa mínima de quadros"
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr "O Bit clock e o word select devem ser pinos sequenciais"
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr ""
@@ -513,6 +519,10 @@ msgstr "Brilho não ajustável"
msgid "Buffer + offset too small %d %d %d"
msgstr "O buffer + desvio é muito pequeno %d %d %d"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr "Os elementos do buffer devem ter 4 bytes de comprimento ou menos"
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -972,6 +982,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr "Houve uma falha na aquisição do mutex, err 0x%04x"
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr "Falha ao alocar buffer RX"
@@ -1104,6 +1115,10 @@ msgstr "IOs 0, 2 e 4 não suportam pullup interno em repouso (sleep)"
msgid "IV must be %d bytes long"
msgstr "O IV deve ter %d bytes de comprimento"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr "No buffer, os elementos devem ter 4 bytes ou menos"
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1120,6 +1135,18 @@ msgstr "O tamanho do buffer está incorreto"
msgid "Init program size invalid"
msgstr "O tamanho do programa Init é inválido"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+"A direção da definição inicial do pino conflita com a direção inicial do "
+"pino de saída"
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+"A definição do estado inicial do pino está em conflito com estado do inicial "
+"do pino"
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr "A inicialização falhou devido à falta de memória"
@@ -1232,7 +1259,8 @@ msgstr "Argumento inválido"
msgid "Invalid bits per value"
msgstr "Os valores por bits são inválidos"
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr "O tamanho do buffer é inválido"
@@ -1307,10 +1335,10 @@ msgstr "Pino inválido para canal direito"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "Pinos inválidos"
@@ -1359,7 +1387,8 @@ msgstr "A contagem da voz é inválida"
msgid "Invalid wave file"
msgstr "Aqruivo de ondas inválido"
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr "O comprimento do bit/palavra são inválidos"
@@ -1486,6 +1515,7 @@ msgstr "Nenhum DAC no chip"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr "Nenhum canal DMA foi encontrado"
@@ -1552,6 +1582,14 @@ msgstr "Sem suporte de hardware no pino de clock"
msgid "No hardware support on pin"
msgstr "Nenhum suporte de hardware no pino"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr "Sem entrada no programa"
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr "Sem entrada ou saída no programa"
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr "Nenhuma chave foi definida"
@@ -1641,13 +1679,10 @@ msgid "Odd parity is not supported"
msgstr "A paridade ímpar não é compatível"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr "Apenas mono com 8 ou 16 bits com "
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr "Somente IN/OUT de até 8 suportados"
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr "Somente os endereços IPv4 são suportados"
@@ -1697,6 +1732,10 @@ msgstr "A operação ou o recurso não é suportado"
msgid "Operation timed out"
msgstr "A operação expirou"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr "Os elementos da saída do buffer devem ter 4 bytes ou menos"
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr "Sem memória"
@@ -1872,7 +1911,7 @@ msgstr "Erro DeInit RNG"
msgid "RNG Init Error"
msgstr "Houve um erro na inicialização do RNG"
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr "Ainda não há suporte para o RS485 neste dispositivo"
@@ -1909,7 +1948,7 @@ msgstr "Somente leitura"
msgid "Read-only filesystem"
msgstr "Sistema de arquivos somente leitura"
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr "Objeto de leitura apenas"
@@ -2156,6 +2195,7 @@ msgid "To exit, please reset the board without "
msgstr "Para sair, por favor, reinicie a placa sem "
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr "Muitos canais na amostra."
@@ -2196,10 +2236,6 @@ msgstr "Houve um erro na inicialização do UART"
msgid "UART Re-init error"
msgstr "Houve um erro na reinicialização do UART"
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr "O UART ainda não é suportado"
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr "Houve um erro na gravação UART"
@@ -2226,6 +2262,7 @@ msgstr "O valor UUID não é um buffer str, int ou byte"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr "Não é possível alocar buffers para conversão assinada"
@@ -2539,8 +2576,8 @@ msgid "binary op %q not implemented"
msgstr "a operação binário %q não foi implementada"
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
-msgstr "os bits devem ser 7, 8 ou 9"
+msgid "bits must be in range 5 to 9"
+msgstr "os bits devem estar na faixa entre 5 a 9"
#: shared-bindings/audiomixer/Mixer.c
msgid "bits_per_sample must be 8 or 16"
@@ -2771,6 +2808,10 @@ msgstr "o arg chr() está fora do intervalo(256)"
msgid "circle can only be registered in one parent"
msgstr "o círculo só pode ser registrado em um pai"
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr "código fora do alcance 0~127"
@@ -3786,6 +3827,7 @@ msgstr "o pow() com 3 argumentos requer números inteiros"
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr "pressionando o botão de boot na inicialização.\n"
@@ -3865,6 +3907,7 @@ msgstr ""
"ou 'B'"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr "Taxa de amostragem fora do intervalo"
@@ -3936,7 +3979,7 @@ msgstr "sos[:, 3] deve ser um em todos"
msgid "sosfilt requires iterable arguments"
msgstr "o sosfilt requer que os argumentos sejam iteráveis"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr "a paleta de origem é muito grande"
@@ -4298,6 +4341,19 @@ msgstr "zi deve ser de um tipo float"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi deve estar na forma (n_section, 2)"
+#~ msgid "Initial set pin direcion conflicts with initial out pin direction"
+#~ msgstr ""
+#~ "A direção do pino inicial está em conflito com a direção inicial do pino"
+
+#~ msgid "UART not yet supported"
+#~ msgstr "O UART ainda não é suportado"
+
+#~ msgid "bits must be 7, 8 or 9"
+#~ msgstr "os bits devem ser 7, 8 ou 9"
+
+#~ msgid "Only IN/OUT of up to 8 supported"
+#~ msgstr "Somente IN/OUT de até 8 suportados"
+
#~ msgid "SDA or SCL needs a pull up"
#~ msgstr "SDA ou SCL precisa de um pull up"
diff --git a/locale/sv.po b/locale/sv.po
index 7b82d7a7f..0f6a8e3ad 100644
--- a/locale/sv.po
+++ b/locale/sv.po
@@ -6,7 +6,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-04 12:55-0600\n"
-"PO-Revision-Date: 2021-02-21 22:27+0000\n"
+"PO-Revision-Date: 2021-03-01 15:19+0000\n"
"Last-Translator: Jonny Bergdahl <jonny@bergdahl.it>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: sv\n"
@@ -110,6 +110,7 @@ msgstr "%q måste vara >= 1"
msgid "%q must be a tuple of length 2"
msgstr "%q måste vara en tuple av längd 2"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr "%q utanför intervallet"
@@ -340,6 +341,7 @@ msgid "All SPI peripherals are in use"
msgstr "All SPI-kringutrustning används"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr "Alla UART-kringutrustning används"
@@ -463,6 +465,10 @@ msgstr "Baudrate stöds inte av kringutrustning"
msgid "Below minimum frame rate"
msgstr "Under minsta bildfrekvens"
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr "Bitklocka och word select måste vara sekventiella pinnar"
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr "Bitklocka och ordval måste dela en klockenhet"
@@ -504,6 +510,10 @@ msgstr "Ljusstyrka kan inte justeras"
msgid "Buffer + offset too small %d %d %d"
msgstr "Buffert + offset för liten %d %d %d"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr "Buffertelement måste vara fyra byte långa eller mindre"
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -960,6 +970,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr "Det gick inte att förvärva mutex, fel 0x%04x"
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr "Det gick inte att tilldela RX-buffert"
@@ -1091,6 +1102,10 @@ msgstr "IO 0, 2 & 4 stöder inte intern pullup för sovläge"
msgid "IV must be %d bytes long"
msgstr "IV måste vara %d byte lång"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr "Inbuffertelement måste vara 4 byte långa eller mindre"
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1107,6 +1122,16 @@ msgstr "Fel buffertstorlek"
msgid "Init program size invalid"
msgstr "Storlek på init-program ogiltigt"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr "Initial pinn-riktning står i konflikt med initial utpinns-riktning"
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+"Initial inställning av pinntillstånd är i konflikt med initialt "
+"utpinntillstånd"
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr "Initieringen misslyckades på grund av minnesbrist"
@@ -1217,7 +1242,8 @@ msgstr "Ogiltigt argument"
msgid "Invalid bits per value"
msgstr "Ogiltigt värde för bitar per värde"
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr "Ogiltig buffertstorlek"
@@ -1292,10 +1318,10 @@ msgstr "Ogiltig pinne för höger kanal"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "Ogiltiga pinnar"
@@ -1344,7 +1370,8 @@ msgstr "Ogiltigt kanalantal"
msgid "Invalid wave file"
msgstr "Ogiltig wave-fil"
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr "Ogiltig word-/bitlängd"
@@ -1472,6 +1499,7 @@ msgstr "Ingen DAC på chipet"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr "Ingen DMA-kanal hittades"
@@ -1538,6 +1566,14 @@ msgstr "Inget hårdvarustöd på clk-pinne"
msgid "No hardware support on pin"
msgstr "Inget hårdvarustöd på pinne"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr "Inget in i programmet"
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr "Inget in eller ut i programmet"
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr "Ingen nyckel angavs"
@@ -1626,13 +1662,10 @@ msgid "Odd parity is not supported"
msgstr "Udda paritet stöds inte"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr "Endast 8 eller 16 bitars mono med "
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr "Endast IN/OUT på upp till 8 stöds"
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr "Endast IPv4-adresser stöds"
@@ -1681,6 +1714,10 @@ msgstr "Operation eller funktion stöds inte"
msgid "Operation timed out"
msgstr "Åtgärden orsakade timeout"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr "Utbuffertelement ska vara max fyra byte långa"
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr "Slut på minne"
@@ -1851,7 +1888,7 @@ msgstr "RNG DeInit-fel"
msgid "RNG Init Error"
msgstr "RNG Init-fel"
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr "RS485 stöds ännu inte på den här enheten"
@@ -1888,7 +1925,7 @@ msgstr "Skrivskyddad"
msgid "Read-only filesystem"
msgstr "Skrivskyddat filsystem"
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr "Skrivskyddat objekt"
@@ -2131,6 +2168,7 @@ msgid "To exit, please reset the board without "
msgstr "För att avsluta, gör reset på kortet utan "
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr "För många kanaler i sampling."
@@ -2170,10 +2208,6 @@ msgstr "UART Init-fel"
msgid "UART Re-init error"
msgstr "UART reinit-fel"
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr "UART stöds ännu inte"
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr "UART skrivfel"
@@ -2200,6 +2234,7 @@ msgstr "UUID-värdet är inte str, int eller byte-buffert"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr "Det går inte att allokera buffert för signerad konvertering"
@@ -2509,8 +2544,8 @@ msgid "binary op %q not implemented"
msgstr "binär op %q är inte implementerad"
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
-msgstr "bits måste vara 7, 8 eller 9"
+msgid "bits must be in range 5 to 9"
+msgstr "bits måste mellan 5 och 9"
#: shared-bindings/audiomixer/Mixer.c
msgid "bits_per_sample must be 8 or 16"
@@ -2739,6 +2774,10 @@ msgstr "chr() arg är inte i intervallet(256)"
msgid "circle can only be registered in one parent"
msgstr "circle kan endast registreras i en förälder"
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr "kod utanför intervallet 0~127"
@@ -3745,6 +3784,7 @@ msgstr "pow() med 3 argument kräver heltal"
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr "trycka på startknappen vid start.\n"
@@ -3824,6 +3864,7 @@ msgstr ""
"'b' eller 'B'"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr "samplingsfrekvens utanför räckvidden"
@@ -3895,7 +3936,7 @@ msgstr "sos[:, 3] måste vara ettor"
msgid "sosfilt requires iterable arguments"
msgstr "sosfilt kräver iterable argument"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr "källpalett för stor"
@@ -4257,6 +4298,18 @@ msgstr "zi måste vara av typ float"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi måste vara i formen (n_section, 2)"
+#~ msgid "Initial set pin direcion conflicts with initial out pin direction"
+#~ msgstr "Initial pinn-riktning står i konflikt med initial utpinn-riktning"
+
+#~ msgid "UART not yet supported"
+#~ msgstr "UART stöds ännu inte"
+
+#~ msgid "bits must be 7, 8 or 9"
+#~ msgstr "bits måste vara 7, 8 eller 9"
+
+#~ msgid "Only IN/OUT of up to 8 supported"
+#~ msgstr "Endast IN/OUT på upp till 8 stöds"
+
#~ msgid "SDA or SCL needs a pull up"
#~ msgstr "SDA eller SCL behöver en pullup"
diff --git a/locale/zh_Latn_pinyin.po b/locale/zh_Latn_pinyin.po
index 5a0838000..694b95b3a 100644
--- a/locale/zh_Latn_pinyin.po
+++ b/locale/zh_Latn_pinyin.po
@@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: circuitpython-cn\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-04 12:55-0600\n"
-"PO-Revision-Date: 2021-02-09 14:03+0000\n"
+"PO-Revision-Date: 2021-03-01 15:19+0000\n"
"Last-Translator: hexthat <hexthat@gmail.com>\n"
"Language-Team: Chinese Hanyu Pinyin\n"
"Language: zh_Latn_pinyin\n"
@@ -15,7 +15,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.5-dev\n"
+"X-Generator: Weblate 4.5\n"
#: main.c
msgid ""
@@ -112,6 +112,7 @@ msgstr "%q bìxū dàyú huò děngyú 1"
msgid "%q must be a tuple of length 2"
msgstr "%q bìxū shì chángdù wèi 2 de yuán zǔ"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/canio/Match.c
msgid "%q out of range"
msgstr "%q chāochū fànwéi"
@@ -342,6 +343,7 @@ msgid "All SPI peripherals are in use"
msgstr "Suǒyǒu SPI wàiwéi qì zhèngzài shǐyòng"
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "All UART peripherals are in use"
msgstr "Suǒyǒu UART wàiwéi zhèngzài shǐyòng"
@@ -465,6 +467,10 @@ msgstr "wài shè bù zhī chí de bō tè lā tè"
msgid "Below minimum frame rate"
msgstr "Dī yú zuìdī zhèng sùlǜ"
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
+msgid "Bit clock and word select must be sequential pins"
+msgstr "wèi shí zhōng hé dān cí xuǎn zé bì xū shì shùn xù yǐn jiǎo"
+
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
msgstr "Bǐtè shízhōng hé dānzì xuǎnzé bìxū gòngxiǎng shízhōng dānwèi"
@@ -506,6 +512,10 @@ msgstr "Liàngdù wúfǎ tiáozhěng"
msgid "Buffer + offset too small %d %d %d"
msgstr "Huǎnchōng qū hé piān yí liàng tài xiǎo %d %d %d"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Buffer elements must be 4 bytes long or less"
+msgstr "huǎn chōng yuán jiàn bì xū wéi 4 zì jié cháng huò gèng shǎo"
+
#: shared-module/usb_hid/Device.c
#, c-format
msgid "Buffer incorrect size. Should be %d bytes."
@@ -959,6 +969,7 @@ msgid "Failed to acquire mutex, err 0x%04x"
msgstr "Wúfǎ huòdé mutex, err 0x%04x"
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Failed to allocate RX buffer"
msgstr "Fēnpèi RX huǎnchōng shībài"
@@ -1090,6 +1101,10 @@ msgstr "IOS 0, 2 + 4 bù zhī chí shuì mián zhōng de nèi bù shàng lā"
msgid "IV must be %d bytes long"
msgstr "IV bì xū wéi %d zì jié cháng"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "In buffer elements must be 4 bytes long or less"
+msgstr "zài huǎn chōng yuán jiàn zhōng bì xū shì 4 zì jié cháng huò gèng shǎo"
+
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@@ -1106,6 +1121,18 @@ msgstr "Huǎnchōng qū dàxiǎo bù zhèngquè"
msgid "Init program size invalid"
msgstr "Init chéng xù dà xiǎo wú xiào"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin direction conflicts with initial out pin direction"
+msgstr ""
+"chū shǐ shè zhì yǐn jiǎo fāng xiàng yǔ chū shǐ chū yǐn jiǎo fāng xiàng chōng "
+"tū"
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "Initial set pin state conflicts with initial out pin state"
+msgstr ""
+"chū shǐ shè zhì yǐn jiǎo zhuàng tài yǔ chū shǐ chū yǐn jiǎo zhuàng tài chōng "
+"tū"
+
#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
msgid "Initialization failed due to lack of memory"
msgstr "yóu yú nèi cún bù zú, chū shǐ huà shī bài"
@@ -1114,6 +1141,7 @@ msgstr "yóu yú nèi cún bù zú, chū shǐ huà shī bài"
#, c-format
msgid "Input buffer length (%d) must be a multiple of the strand count (%d)"
msgstr ""
+"shū rù huǎn chōng qū cháng dù (%d) bì xū shì liàn jì shù de bèi shù (%d)"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
@@ -1216,7 +1244,8 @@ msgstr "Wúxiào de cānshù"
msgid "Invalid bits per value"
msgstr "Měi gè zhí de wèi wúxiào"
-#: ports/nrf/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
+#: ports/stm/common-hal/busio/UART.c
msgid "Invalid buffer size"
msgstr "Wúxiào de huǎnchōng qū dàxiǎo"
@@ -1291,10 +1320,10 @@ msgstr "Yòuxián tōngdào yǐn jiǎo wúxiào"
#: ports/esp32s2/common-hal/busio/I2C.c ports/esp32s2/common-hal/busio/SPI.c
#: ports/esp32s2/common-hal/busio/UART.c ports/esp32s2/common-hal/canio/CAN.c
#: ports/mimxrt10xx/common-hal/busio/I2C.c
-#: ports/mimxrt10xx/common-hal/busio/SPI.c
-#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/I2C.c
+#: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/I2C.c
#: ports/raspberrypi/common-hal/busio/SPI.c
+#: ports/raspberrypi/common-hal/busio/UART.c
msgid "Invalid pins"
msgstr "Wúxiào de yǐn jiǎo"
@@ -1343,7 +1372,8 @@ msgstr "Wúxiào de yǔyīn jìshù"
msgid "Invalid wave file"
msgstr "Wúxiào de làng làngcháo wénjiàn"
-#: ports/stm/common-hal/busio/UART.c
+#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
+#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Invalid word/bit length"
msgstr "Wúxiào de zì/wèi chángdù"
@@ -1471,13 +1501,14 @@ msgstr "Méiyǒu DAC zài xīnpiàn shàng de"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA channel found"
msgstr "Wèi zhǎodào DMA píndào"
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "No DMA pacing timer found"
-msgstr ""
+msgstr "wèi zhǎo dào DMA qǐ bó qì"
#: shared-module/adafruit_bus_device/I2CDevice.c
#, c-format
@@ -1537,6 +1568,14 @@ msgstr "Shízhōng yǐn jiǎo wú yìngjiàn zhīchí"
msgid "No hardware support on pin"
msgstr "Méiyǒu zài yǐn jiǎo shàng de yìngjiàn zhīchí"
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in in program"
+msgstr "chéng xù zhōng méi yǒu"
+
+#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+msgid "No in or out in program"
+msgstr "chéng xù zhōng méi yǒu jìn chū"
+
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr "Wèi zhǐdìng mì yào"
@@ -1624,13 +1663,10 @@ msgid "Odd parity is not supported"
msgstr "Bù zhīchí jīshù"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with "
msgstr "Zhǐyǒu 8 huò 16 wèi dānwèi "
-#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
-msgid "Only IN/OUT of up to 8 supported"
-msgstr "jǐn zhī chí zuì duō 8 gè IN/OUT"
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr "Jǐn zhīchí IPv4 dìzhǐ"
@@ -1680,6 +1716,10 @@ msgstr "bù zhī chí cāo zuò huò gōng néng"
msgid "Operation timed out"
msgstr "cāo zuò yǐ fēn shí"
+#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
+msgid "Out buffer elements must be 4 bytes long or less"
+msgstr "chū huǎn chōng yuán jiàn bì xū shì 4 zì jié cháng huò gèng shǎo"
+
#: ports/esp32s2/bindings/espidf/__init__.c ports/esp32s2/esp_error.c
msgid "Out of memory"
msgstr "nèi cún bù zú"
@@ -1691,7 +1731,7 @@ msgstr "tào jiē zì wài"
#: shared-bindings/bitops/__init__.c
#, c-format
msgid "Output buffer must be at least %d bytes"
-msgstr ""
+msgstr "shū chū huǎn chōng qū bì xū zhì shǎo wéi %d zì jié"
#: shared-bindings/audiobusio/PDMIn.c
msgid "Oversample must be multiple of 8."
@@ -1770,7 +1810,7 @@ msgstr ""
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Pins must share PWM slice"
-msgstr ""
+msgstr "yǐn jiǎo bì xū gòng xiǎng PWM qiē piàn"
#: py/builtinhelp.c
msgid "Plus any modules on the filesystem\n"
@@ -1846,7 +1886,7 @@ msgstr "RNG qǔxiāo chūshǐhuà cuòwù"
msgid "RNG Init Error"
msgstr "RNG chūshǐhuà cuòwù"
-#: ports/nrf/common-hal/busio/UART.c
+#: ports/nrf/common-hal/busio/UART.c ports/raspberrypi/common-hal/busio/UART.c
msgid "RS485 Not yet supported on this device"
msgstr "RS485 cǐ shè bèi shàng bù zhī chí"
@@ -1883,7 +1923,7 @@ msgstr "Zhǐ dú"
msgid "Read-only filesystem"
msgstr "Zhǐ dú wénjiàn xìtǒng"
-#: shared-module/displayio/Bitmap.c
+#: shared-module/bitmaptools/__init__.c shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr "Zhǐ dú duìxiàng"
@@ -2016,11 +2056,11 @@ msgstr "Duīzhàn dàxiǎo bìxū zhìshǎo 256"
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Stereo left must be on PWM channel A"
-msgstr ""
+msgstr "lì tǐ shēng zuǒ bì xū shì zài PWM tōng dào A"
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Stereo right must be on PWM channel B"
-msgstr ""
+msgstr "lì tǐ shēng yòu cè bì xū zài PWM tōng dào B shàng"
#: shared-bindings/multiterminal/__init__.c
msgid "Stream missing readinto() or write() method."
@@ -2125,6 +2165,7 @@ msgid "To exit, please reset the board without "
msgstr "Yào tuìchū, qǐng chóng zhì bǎnkuài ér bùyòng "
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample."
msgstr "Chōuyàng zhōng de píndào tài duō."
@@ -2164,10 +2205,6 @@ msgstr "UART chūshǐhuà cuòwù"
msgid "UART Re-init error"
msgstr "UART chóngxīn chūshǐhuà cuòwù"
-#: ports/raspberrypi/common-hal/busio/UART.c
-msgid "UART not yet supported"
-msgstr "UART shàng wèi shòu zhī chí"
-
#: ports/stm/common-hal/busio/UART.c
msgid "UART write error"
msgstr "UART xiě cuòwù"
@@ -2194,6 +2231,7 @@ msgstr "UUID zhí bùshì str,int huò zì jié huǎnchōng qū"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
+#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Unable to allocate buffers for signed conversion"
msgstr "Wúfǎ fēnpèi huǎnchōng qū yòng yú qiānmíng zhuǎnhuàn"
@@ -2504,8 +2542,8 @@ msgid "binary op %q not implemented"
msgstr "èrjìnzhì bǎn qián bǎn %q wèi zhíxíng"
#: shared-bindings/busio/UART.c
-msgid "bits must be 7, 8 or 9"
-msgstr "bǐtè bìxū shì 7,8 huò 9"
+msgid "bits must be in range 5 to 9"
+msgstr "wèi bì xū zài fàn wéi nèi 5 zhì 9"
#: shared-bindings/audiomixer/Mixer.c
msgid "bits_per_sample must be 8 or 16"
@@ -2733,6 +2771,10 @@ msgstr "chr() cān shǔ bùzài fànwéi (256)"
msgid "circle can only be registered in one parent"
msgstr "quānzi zhǐ néng zài yī wèi jiāzhǎng zhōng zhùcè"
+#: shared-bindings/bitmaptools/__init__.c
+msgid "clip point must be (x,y) tuple"
+msgstr ""
+
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
msgstr "dài mǎ chāo chū fàn wéi 0~127"
@@ -3395,7 +3437,7 @@ msgstr "jìyì tǐ fēnpèi shībài, duī bèi suǒdìng"
#: py/objarray.c
msgid "memoryview: length is not a multiple of itemsize"
-msgstr ""
+msgstr "nèi cún shì tú: cháng dù bú shì xiàng mù huà de bèi shù"
#: py/builtinimport.c
msgid "module not found"
@@ -3738,6 +3780,7 @@ msgstr "pow() yǒu 3 cānshù xūyào zhěngshù"
#: ports/esp32s2/boards/targett_module_clip_wrover/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2/mpconfigboard.h
#: ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
+#: ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.h
msgid "pressing boot button at start up.\n"
msgstr "Zài qǐdòng shí àn qǐdòng ànniǔ.\n"
@@ -3817,6 +3860,7 @@ msgstr ""
"huò 'B' de shùzǔ"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "sampling rate out of range"
msgstr "qǔyàng lǜ chāochū fànwéi"
@@ -3888,7 +3932,7 @@ msgstr "sos [:, 3] yīnggāi quán shì"
msgid "sosfilt requires iterable arguments"
msgstr "sosfilt xūyào diédài cānshù"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "source palette too large"
msgstr "yuán miànbǎn tài dà"
@@ -4176,7 +4220,7 @@ msgstr "kān mén gǒu chāoshí bìxū dàyú 0"
#: shared-bindings/bitops/__init__.c
#, c-format
msgid "width must be from 2 to 8 (inclusive), not %d"
-msgstr ""
+msgstr "kuān dù bì xū cóng 2 dào 8 ( hán ), ér bù shì %d"
#: shared-bindings/rgbmatrix/RGBMatrix.c
msgid "width must be greater than zero"
@@ -4250,6 +4294,15 @@ msgstr "zi bìxū wèi fú diǎn xíng"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi bìxū jùyǒu xíngzhuàng (n_section,2)"
+#~ msgid "UART not yet supported"
+#~ msgstr "UART shàng wèi shòu zhī chí"
+
+#~ msgid "bits must be 7, 8 or 9"
+#~ msgstr "bǐtè bìxū shì 7,8 huò 9"
+
+#~ msgid "Only IN/OUT of up to 8 supported"
+#~ msgstr "jǐn zhī chí zuì duō 8 gè IN/OUT"
+
#~ msgid "SDA or SCL needs a pull up"
#~ msgstr "SDA huò SCL xūyào lādòng"
diff --git a/ports/atmel-samd/boards/bdmicro_vina_d21/mpconfigboard.mk b/ports/atmel-samd/boards/bdmicro_vina_d21/mpconfigboard.mk
index cff5a32d1..9c1d61ec7 100644
--- a/ports/atmel-samd/boards/bdmicro_vina_d21/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/bdmicro_vina_d21/mpconfigboard.mk
@@ -12,6 +12,7 @@ EXTERNAL_FLASH_DEVICES = "MX25L51245G","GD25S512MD"
LONGINT_IMPL = MPZ
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_MSGPACK = 0
diff --git a/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk b/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk
index 892a5371e..b1306f54b 100644
--- a/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk
@@ -11,3 +11,5 @@ LONGINT_IMPL = NONE
CIRCUITPY_FULL_BUILD = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_ROTARYIO = 0
+
+SUPEROPT_GC = 0
diff --git a/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk b/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk
index 2ace30fb5..6ea6a7211 100755
--- a/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk
@@ -12,6 +12,7 @@ EXTERNAL_FLASH_DEVICES = "W25Q32JV_IQ"
LONGINT_IMPL = MPZ
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
diff --git a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk
index 0b150a5fb..e8993d44d 100644
--- a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk
@@ -12,6 +12,7 @@ EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C"
LONGINT_IMPL = MPZ
# Make room for frozen libs.
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_DISPLAYIO = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
index 6d240686d..446d1177f 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
@@ -13,6 +13,7 @@ EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C"
# Turn off features and optimizations for Crickit build to make room for additional frozen libs.
LONGINT_IMPL = NONE
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_DISPLAYIO = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
diff --git a/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk
index 2a97636de..1f9b98bec 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk
@@ -13,6 +13,7 @@ EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C"
# Turn off features and optimizations for Crickit build to make room for additional frozen libs.
LONGINT_IMPL = NONE
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
diff --git a/ports/atmel-samd/boards/dynossat_edu_eps/mpconfigboard.mk b/ports/atmel-samd/boards/dynossat_edu_eps/mpconfigboard.mk
index 303df650e..2d5234f82 100644
--- a/ports/atmel-samd/boards/dynossat_edu_eps/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/dynossat_edu_eps/mpconfigboard.mk
@@ -14,6 +14,7 @@ LONGINT_IMPL = MPZ
CIRCUITPY_FULLBUILD = 0
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_I2CPERIPHERAL = 1
diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk
index d1a6fc7ae..7d034828e 100644
--- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk
@@ -12,6 +12,7 @@ EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C"
LONGINT_IMPL = MPZ
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
@@ -19,20 +20,5 @@ CIRCUITPY_MSGPACK = 0
CIRCUITPY_VECTORIO = 0
CIRCUITPY_BUSDEVICE = 0
-CFLAGS_INLINE_LIMIT = 60
SUPEROPT_GC = 0
-
-CFLAGS_BOARD = --param max-inline-insns-auto=15
-ifeq ($(TRANSLATION), ja)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
-endif
-ifeq ($(TRANSLATION), zh_Latn_pinyin)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
-endif
-ifeq ($(TRANSLATION), de_DE)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
SUPEROPT_VM = 0
-endif
diff --git a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk
index 309563ff4..c3938345d 100644
--- a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk
@@ -13,6 +13,7 @@ LONGINT_IMPL = MPZ
# Make space for frozen libs
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_DISPLAYIO = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
diff --git a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk
index 6ea21ed82..b544a3680 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk
@@ -13,6 +13,7 @@ CIRCUITPY_FULL_BUILD = 0
# A number of modules are removed for RFM69 to make room for frozen libraries.
# Many I/O functions are not available.
CIRCUITPY_ANALOGIO = 1
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_PULSEIO = 0
CIRCUITPY_NEOPIXEL_WRITE = 1
CIRCUITPY_ROTARYIO = 0
diff --git a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk
index 76a6be2e3..e307ab4f6 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk
@@ -14,6 +14,7 @@ CIRCUITPY_FULL_BUILD = 0
# A number of modules are removed for RFM9x to make room for frozen libraries.
# Many I/O functions are not available.
CIRCUITPY_ANALOGIO = 1
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_PULSEIO = 0
CIRCUITPY_NEOPIXEL_WRITE = 1
CIRCUITPY_ROTARYIO = 0
diff --git a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk
index 3078544fc..7a80eea9b 100644
--- a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk
@@ -12,6 +12,7 @@ EXTERNAL_FLASH_DEVICES = "S25FL064L"
LONGINT_IMPL = MPZ
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
diff --git a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk
index 4946788d3..78959dcd0 100644
--- a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk
@@ -12,3 +12,4 @@ EXTERNAL_FLASH_DEVICES = GD25Q16C
LONGINT_IMPL = MPZ
CIRCUITPY_VECTORIO = 1
+CIRCUITPY__EVE = 1
diff --git a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk
index 0c0d6053e..b5d22bbbf 100644
--- a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk
@@ -15,6 +15,7 @@ CIRCUITPY_BITBANG_APA102 = 1
CIRCUITPY_AUDIOBUSIO = 0
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_GAMEPAD = 0
diff --git a/ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.mk b/ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.mk
index 249265151..ea010ed2e 100644
--- a/ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.mk
@@ -12,6 +12,7 @@ LONGINT_IMPL = MPZ
# Not needed.
CIRCUITPY_AUDIOBUSIO = 0
CIRCUITPY_AUDIOMP3 = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_BLEIO_HCI = 0
CIRCUITPY_DISPLAYIO = 0
CIRCUITPY_FRAMEBUFFERIO = 0
diff --git a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk
index 03f633e6d..8b17f15ea 100644
--- a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk
@@ -12,26 +12,12 @@ EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C"
LONGINT_IMPL = MPZ
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_MSGPACK = 0
CIRCUITPY_VECTORIO = 0
CIRCUITPY_BUSDEVICE = 0
-CFLAGS_INLINE_LIMIT = 60
SUPEROPT_GC = 0
-
-CFLAGS_BOARD = --param max-inline-insns-auto=15
-ifeq ($(TRANSLATION), ja)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
-endif
-ifeq ($(TRANSLATION), zh_Latn_pinyin)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
-endif
-ifeq ($(TRANSLATION), de_DE)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
SUPEROPT_VM = 0
-endif
diff --git a/ports/atmel-samd/boards/pycubed/mpconfigboard.mk b/ports/atmel-samd/boards/pycubed/mpconfigboard.mk
index a82362b8d..09aef7d92 100644
--- a/ports/atmel-samd/boards/pycubed/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pycubed/mpconfigboard.mk
@@ -15,6 +15,7 @@ CIRCUITPY_DRIVE_LABEL = "PYCUBED"
# Not needed.
CIRCUITPY_AUDIOBUSIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_DISPLAYIO = 0
CIRCUITPY_FRAMEBUFFERIO = 0
CIRCUITPY_GAMEPAD = 0
diff --git a/ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk b/ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk
index 3bf42d705..46df12c4f 100644
--- a/ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk
@@ -15,6 +15,7 @@ CIRCUITPY_DRIVE_LABEL = "PYCUBED"
# Not needed.
CIRCUITPY_AUDIOBUSIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_DISPLAYIO = 0
CIRCUITPY_FRAMEBUFFERIO = 0
CIRCUITPY_GAMEPAD = 0
diff --git a/ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk b/ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk
index 8773c5771..cf982cb8f 100644
--- a/ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk
@@ -14,20 +14,11 @@ EXTERNAL_FLASH_DEVICES = GD25Q16C
CIRCUITPY_AUDIOBUSIO = 0
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_MSGPACK = 0
SUPEROPT_GC = 0
-
-CFLAGS_BOARD = --param max-inline-insns-auto=15
-ifeq ($(TRANSLATION), zh_Latn_pinyin)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
-endif
-ifeq ($(TRANSLATION), de_DE)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
SUPEROPT_VM = 0
-endif
diff --git a/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk b/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk
index fd6e25f6c..470e4d9dc 100644
--- a/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk
@@ -16,6 +16,7 @@ LONGINT_IMPL = MPZ
# No I2S on SAMD51G
CIRCUITPY_AUDIOBUSIO = 0
# Make room for more stuff
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_DISPLAYIO = 0
CIRCUITPY_FRAMEBUFFERIO = 0
CIRCUITPY_FREQUENCYIO = 0
diff --git a/ports/atmel-samd/boards/serpente/mpconfigboard.mk b/ports/atmel-samd/boards/serpente/mpconfigboard.mk
index 1f2c83316..e024736c9 100644
--- a/ports/atmel-samd/boards/serpente/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/serpente/mpconfigboard.mk
@@ -12,6 +12,7 @@ EXTERNAL_FLASH_DEVICES = GD25Q32C
LONGINT_IMPL = NONE
CIRCUITPY_AUDIOBUSIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_GAMEPAD = 0
CIRCUITPY_BUSDEVICE = 0
diff --git a/ports/atmel-samd/boards/snekboard/mpconfigboard.mk b/ports/atmel-samd/boards/snekboard/mpconfigboard.mk
index 889490450..72c98867e 100644
--- a/ports/atmel-samd/boards/snekboard/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/snekboard/mpconfigboard.mk
@@ -12,6 +12,7 @@ EXTERNAL_FLASH_DEVICES = "W25Q16JV_IQ"
LONGINT_IMPL = MPZ
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_GAMEPAD = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_MSGPACK = 0
diff --git a/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk
index 2e15bc042..29579904a 100755
--- a/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk
@@ -13,6 +13,7 @@ LONGINT_IMPL = MPZ
CIRCUITPY_AUDIOIO = 0
CIRCUITPY_AUDIOBUSIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_VECTORIO = 0
CIRCUITPY_BUSDEVICE = 0
diff --git a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk
index 5b7f93328..6db5596ba 100755
--- a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk
@@ -12,6 +12,7 @@ EXTERNAL_FLASH_DEVICES = "W25Q32FV"
LONGINT_IMPL = MPZ
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_GAMEPAD = 0
CIRCUITPY_I2CPERIPHERAL = 0
diff --git a/ports/atmel-samd/boards/stackrduino_m0_pro/mpconfigboard.mk b/ports/atmel-samd/boards/stackrduino_m0_pro/mpconfigboard.mk
index 734be2d14..12c35d2f9 100644
--- a/ports/atmel-samd/boards/stackrduino_m0_pro/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/stackrduino_m0_pro/mpconfigboard.mk
@@ -13,6 +13,7 @@ LONGINT_IMPL = MPZ
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
@@ -20,40 +21,5 @@ CIRCUITPY_MSGPACK = 0
CIRCUITPY_VECTORIO = 0
CIRCUITPY_BUSDEVICE = 0
-CFLAGS_INLINE_LIMIT = 55
SUPEROPT_GC = 0
-
-CFLAGS_BOARD = --param max-inline-insns-auto=15
-ifeq ($(TRANSLATION), ja)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
-endif
-ifeq ($(TRANSLATION), zh_Latn_pinyin)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
-endif
-ifeq ($(TRANSLATION), de_DE)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
-SUPEROPT_VM = 0
-endif
-ifeq ($(TRANSLATION), pl)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
-SUPEROPT_VM = 0
-endif
-ifeq ($(TRANSLATION), fr)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
-SUPEROPT_VM = 0
-endif
-ifeq ($(TRANSLATION), pt_BR)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
-SUPEROPT_VM = 0
-endif
-ifeq ($(TRANSLATION), es)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 35
SUPEROPT_VM = 0
-endif
diff --git a/ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.mk
index 68031e4a1..0f43ab800 100644
--- a/ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/stringcar_m0_express/mpconfigboard.mk
@@ -16,6 +16,7 @@ CIRCUITPY_BITBANG_APA102 = 1
CIRCUITPY_AUDIOBUSIO = 0
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_GAMEPAD = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_RTC = 0
diff --git a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk
index 7eda151f3..f3afa61a8 100644
--- a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk
@@ -13,6 +13,7 @@ LONGINT_IMPL = MPZ
CIRCUITPY_AUDIOBUSIO = 0
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_RTC = 0
CIRCUITPY_FREQUENCYIO = 0
diff --git a/ports/atmel-samd/boards/ugame10/mpconfigboard.mk b/ports/atmel-samd/boards/ugame10/mpconfigboard.mk
index 640d421e8..d1ada6429 100644
--- a/ports/atmel-samd/boards/ugame10/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/ugame10/mpconfigboard.mk
@@ -18,8 +18,10 @@ CIRCUITPY_ANALOGIO = 1
CIRCUITPY_GAMEPAD = 1
CIRCUITPY_DISPLAYIO = 1
+CIRCUITPY_PULSEIO = 0
CIRCUITPY_AUDIOBUSIO = 0
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_NEOPIXEL_WRITE = 0
@@ -34,10 +36,4 @@ FROZEN_MPY_DIRS += $(TOP)/frozen/circuitpython-stage/ugame10
CIRCUITPY_DISPLAY_FONT = $(TOP)/ports/atmel-samd/boards/ugame10/brutalist-6.bdf
-# Tweak inlining depending on language.
-ifeq ($(TRANSLATION), zh_Latn_pinyin)
-RELEASE_NEEDS_CLEAN_BUILD = 1
-CFLAGS_INLINE_LIMIT = 45
-else
-CFLAGS_INLINE_LIMIT = 70
-endif
+SUPEROPT_GC = 0
diff --git a/ports/atmel-samd/boards/winterbloom_big_honking_button/mpconfigboard.mk b/ports/atmel-samd/boards/winterbloom_big_honking_button/mpconfigboard.mk
index ab2b861c0..5062200e1 100644
--- a/ports/atmel-samd/boards/winterbloom_big_honking_button/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/winterbloom_big_honking_button/mpconfigboard.mk
@@ -17,6 +17,7 @@ CIRCUITPY_AUDIOIO = 1
# Disable modules that are unusable on this special-purpose board.
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_FRAMEBUFFERIO = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_AUDIOBUSIO = 0
diff --git a/ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.mk b/ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.mk
index fcefaee9b..e8f94a290 100644
--- a/ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.mk
@@ -18,6 +18,7 @@ LONGINT_IMPL = MPZ
# Disable modules that are unusable on this special-purpose board.
CIRCUITPY_AUDIOBUSIO = 0
CIRCUITPY_AUDIOIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_BLEIO_HCI = 0
CIRCUITPY_DISPLAYIO = 0
CIRCUITPY_FRAMEBUFFERIO = 0
diff --git a/ports/atmel-samd/common-hal/rgbmatrix/RGBMatrix.c b/ports/atmel-samd/common-hal/rgbmatrix/RGBMatrix.c
index 55b0c2f12..6daf20aea 100644
--- a/ports/atmel-samd/common-hal/rgbmatrix/RGBMatrix.c
+++ b/ports/atmel-samd/common-hal/rgbmatrix/RGBMatrix.c
@@ -31,7 +31,7 @@
#include "samd/timers.h"
#include "timer_handler.h"
-void *common_hal_rgbmatrix_timer_allocate() {
+void *common_hal_rgbmatrix_timer_allocate(rgbmatrix_rgbmatrix_obj_t *self) {
uint8_t timer_index = find_free_timer();
if (timer_index == 0xff) {
return NULL;
diff --git a/ports/atmel-samd/common-hal/rgbmatrix/RGBMatrix.h b/ports/atmel-samd/common-hal/rgbmatrix/RGBMatrix.h
index 48de4dcb2..2378cf173 100644
--- a/ports/atmel-samd/common-hal/rgbmatrix/RGBMatrix.h
+++ b/ports/atmel-samd/common-hal/rgbmatrix/RGBMatrix.h
@@ -27,7 +27,9 @@
#ifndef MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
-void *common_hal_rgbmatrix_timer_allocate(void);
+#include "shared-module/rgbmatrix/RGBMatrix.h"
+
+void *common_hal_rgbmatrix_timer_allocate(rgbmatrix_rgbmatrix_obj_t *self);
void common_hal_rgbmatrix_timer_enable(void*);
void common_hal_rgbmatrix_timer_disable(void*);
void common_hal_rgbmatrix_timer_free(void*);
diff --git a/ports/cxd56/Makefile b/ports/cxd56/Makefile
index 1c48a23ca..15eb5e64c 100644
--- a/ports/cxd56/Makefile
+++ b/ports/cxd56/Makefile
@@ -151,7 +151,7 @@ LDFLAGS = \
--end-group \
-L$(BUILD) \
-CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_CXD56 -DCFG_TUD_MIDI_RX_BUFSIZE=512 -DCFG_TUD_CDC_RX_BUFSIZE=512 -DCFG_TUD_MIDI_TX_BUFSIZE=512 -DCFG_TUD_CDC_TX_BUFSIZE=512 -DCFG_TUD_MSC_BUFSIZE=512 $(CFLAGS_MOD)
+CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_CXD56 -DCFG_TUD_MIDI_RX_BUFSIZE=512 -DCFG_TUD_CDC_RX_BUFSIZE=1024 -DCFG_TUD_MIDI_TX_BUFSIZE=512 -DCFG_TUD_CDC_TX_BUFSIZE=1024 -DCFG_TUD_MSC_BUFSIZE=512 $(CFLAGS_MOD)
SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \
$(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \
diff --git a/ports/cxd56/boards/spresense/mpconfigboard.mk b/ports/cxd56/boards/spresense/mpconfigboard.mk
index 80c6e4b69..966fa023f 100644
--- a/ports/cxd56/boards/spresense/mpconfigboard.mk
+++ b/ports/cxd56/boards/spresense/mpconfigboard.mk
@@ -4,5 +4,5 @@ USB_PRODUCT = "Spresense"
USB_MANUFACTURER = "Sony"
INTERNAL_FLASH_FILESYSTEM = 1
-
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_MSGPACK = 0
diff --git a/ports/cxd56/common-hal/analogio/AnalogIn.c b/ports/cxd56/common-hal/analogio/AnalogIn.c
index cdf37c06a..5c47991eb 100644
--- a/ports/cxd56/common-hal/analogio/AnalogIn.c
+++ b/ports/cxd56/common-hal/analogio/AnalogIn.c
@@ -105,20 +105,27 @@ bool common_hal_analogio_analogin_deinited(analogio_analogin_obj_t *self) {
}
uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) {
- uint16_t value = 0;
+ int16_t value = 0;
read(analogin_dev[self->number].fd, &value, sizeof(value));
- return value;
+ return (uint16_t) 32768 + (uint16_t) value;
}
// Reference voltage is a fixed value which is depending on the board.
// e.g.)
-// - Reference Voltage of A4 and A5 pins on Main Board is 0.7V.
-// - Reference Voltage of A0 ~ A5 pins on External Interface board
-// is selected 3.3V or 5.0V by a IO Volt jumper pin.
+// - Reference Voltage of A2 and A3 pins on Main Board is 0.7V.
+// - Reference Voltage of A0 ~ A5 pins on External Interface board is 5.0V
float common_hal_analogio_analogin_get_reference_voltage(analogio_analogin_obj_t *self) {
- return 0.0f;
+ float voltage;
+
+ if (self->number == 2 || self->number == 3) {
+ voltage = 0.0f;
+ } else {
+ voltage = 5.0f;
+ }
+
+ return voltage;
}
void analogin_reset(void) {
diff --git a/ports/cxd56/mpconfigport.mk b/ports/cxd56/mpconfigport.mk
index 33a993ad9..e767c6326 100644
--- a/ports/cxd56/mpconfigport.mk
+++ b/ports/cxd56/mpconfigport.mk
@@ -10,8 +10,14 @@ USB_MSC_EP_NUM_IN = 4
# Number of USB endpoint pairs.
USB_NUM_EP = 6
+# Define an equivalent for MICROPY_LONGINT_IMPL, to pass to $(MPY-TOOL) in py/mkrules.mk
+# $(MPY-TOOL) needs to know what kind of longint to use (if any) to freeze long integers.
+# This should correspond to the MICROPY_LONGINT_IMPL definition in mpconfigport.h.
MPY_TOOL_LONGINT_IMPL = -mlongint-impl=mpz
+# Longints can be implemented as mpz, as longlong, or not
+LONGINT_IMPL = MPZ
+
CIRCUITPY_AUDIOBUSIO = 0
CIRCUITPY_AUDIOIO = 0
CIRCUITPY_CAMERA = 1
diff --git a/ports/esp32s2/boards/unexpectedmaker_feathers2/pins.c b/ports/esp32s2/boards/unexpectedmaker_feathers2/pins.c
index bef2001ba..a4967992a 100644
--- a/ports/esp32s2/boards/unexpectedmaker_feathers2/pins.c
+++ b/ports/esp32s2/boards/unexpectedmaker_feathers2/pins.c
@@ -1,13 +1,15 @@
#include "shared-bindings/board/__init__.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
- { MP_ROM_QSTR(MP_QSTR_IO17), MP_ROM_PTR(&pin_GPIO17) },
- { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO17) },
- { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO17) },
-
{ MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) },
{ MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO18) },
{ MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO18) },
+ { MP_ROM_QSTR(MP_QSTR_DAC2), MP_ROM_PTR(&pin_GPIO18) },
+
+ { MP_ROM_QSTR(MP_QSTR_IO17), MP_ROM_PTR(&pin_GPIO17) },
+ { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO17) },
+ { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO17) },
+ { MP_ROM_QSTR(MP_QSTR_DAC1), MP_ROM_PTR(&pin_GPIO17) },
{ MP_ROM_QSTR(MP_QSTR_IO14), MP_ROM_PTR(&pin_GPIO14) },
{ MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO14) },
diff --git a/ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.mk b/ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.mk
index aa022e186..0d054c0cb 100644
--- a/ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.mk
+++ b/ports/esp32s2/boards/unexpectedmaker_tinys2/mpconfigboard.mk
@@ -14,10 +14,7 @@ CIRCUITPY_ESP_FLASH_MODE=qio
CIRCUITPY_ESP_FLASH_FREQ=80m
CIRCUITPY_ESP_FLASH_SIZE=4MB
-# CIRCUITPY_MODULE=wroom
-
CIRCUITPY_BITBANG_NEOPIXEL = 1
# Include these Python libraries in firmware.
-# FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Requests
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel
diff --git a/ports/esp32s2/boards/unexpectedmaker_tinys2/pins.c b/ports/esp32s2/boards/unexpectedmaker_tinys2/pins.c
index 8ca7d9864..7b07b8929 100644
--- a/ports/esp32s2/boards/unexpectedmaker_tinys2/pins.c
+++ b/ports/esp32s2/boards/unexpectedmaker_tinys2/pins.c
@@ -1,73 +1,86 @@
#include "shared-bindings/board/__init__.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
-
-
{ MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_GPIO0) },
- // { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO0) },
+ { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO0) },
{ MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) },
- // { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO18) },
- // { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO18) },
+ { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO18) },
+ { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO18) },
+ { MP_ROM_QSTR(MP_QSTR_DAC2), MP_ROM_PTR(&pin_GPIO18) },
{ MP_ROM_QSTR(MP_QSTR_IO17), MP_ROM_PTR(&pin_GPIO17) },
- // { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO17) },
- // { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO17) },
+ { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO17) },
+ { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO17) },
+ { MP_ROM_QSTR(MP_QSTR_DAC1), MP_ROM_PTR(&pin_GPIO17) },
{ MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) },
- // { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO7) },
- // { MP_ROM_QSTR(MP_QSTR_A8), MP_ROM_PTR(&pin_GPIO7) },
+ { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO7) },
+ { MP_ROM_QSTR(MP_QSTR_A8), MP_ROM_PTR(&pin_GPIO7) },
{ MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) },
- // { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO6) },
- // { MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_GPIO6) },
+ { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO6) },
+ { MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_GPIO6) },
{ MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) },
- // { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO5) },
- // { MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_GPIO5) },
+ { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO5) },
+ { MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_GPIO5) },
{ MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) },
-
+ { MP_ROM_QSTR(MP_QSTR_A9), MP_ROM_PTR(&pin_GPIO4) },
+ { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO4) },
{ MP_ROM_QSTR(MP_QSTR_IO36), MP_ROM_PTR(&pin_GPIO36) },
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO36) },
- // { MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_GPIO36) },
+ { MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_GPIO36) },
{ MP_ROM_QSTR(MP_QSTR_IO35), MP_ROM_PTR(&pin_GPIO35) },
{ MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO35) },
- // { MP_ROM_QSTR(MP_QSTR_D24), MP_ROM_PTR(&pin_GPIO35) },
+ { MP_ROM_QSTR(MP_QSTR_SDO), MP_ROM_PTR(&pin_GPIO35) },
+ { MP_ROM_QSTR(MP_QSTR_D24), MP_ROM_PTR(&pin_GPIO35) },
{ MP_ROM_QSTR(MP_QSTR_IO37), MP_ROM_PTR(&pin_GPIO37) },
{ MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO37) },
- // { MP_ROM_QSTR(MP_QSTR_D23), MP_ROM_PTR(&pin_GPIO37) },
+ { MP_ROM_QSTR(MP_QSTR_SDI), MP_ROM_PTR(&pin_GPIO37) },
+ { MP_ROM_QSTR(MP_QSTR_D23), MP_ROM_PTR(&pin_GPIO37) },
- { MP_ROM_QSTR(MP_QSTR_IO34), MP_ROM_PTR(&pin_GPIO34) },
- // { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO37) },
- // { MP_ROM_QSTR(MP_QSTR_D23), MP_ROM_PTR(&pin_GPIO37) },
+ { MP_ROM_QSTR(MP_QSTR_IO14), MP_ROM_PTR(&pin_GPIO14) },
+ { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO14) },
+ { MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_GPIO14) },
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO8) },
{ MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) },
- // { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO8) },
+ { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO8) },
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO9) },
{ MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9) },
- // { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO9) },
-
+ { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO9) },
{ MP_ROM_QSTR(MP_QSTR_IO38), MP_ROM_PTR(&pin_GPIO38) },
- // { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO38) },
+ { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO38) },
{ MP_ROM_QSTR(MP_QSTR_IO33), MP_ROM_PTR(&pin_GPIO33) },
- // { MP_ROM_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_GPIO33) },
+ { MP_ROM_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_GPIO33) },
{ MP_ROM_QSTR(MP_QSTR_IO43), MP_ROM_PTR(&pin_GPIO43) },
- // { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO43) },
+ { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO43) },
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) },
{ MP_ROM_QSTR(MP_QSTR_IO44), MP_ROM_PTR(&pin_GPIO44) },
- // { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO44) },
+ { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO44) },
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) },
+ // Battery voltage sense pin
+ // I really don't know what name to use here. Adafruit use BATTERY & VOLTAGE_MONITOR
+ // I prefer VBAT or VBAT_SENSE
+ { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_GPIO3) },
+ { MP_ROM_QSTR(MP_QSTR_VBAT), MP_ROM_PTR(&pin_GPIO3) },
+ { MP_ROM_QSTR(MP_QSTR_VBAT_SENSE), MP_ROM_PTR(&pin_GPIO3) },
+ { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO3) },
+
+ // 5V present sense pin
+ { MP_ROM_QSTR(MP_QSTR_VBUS), MP_ROM_PTR(&pin_GPIO21) },
+ { MP_ROM_QSTR(MP_QSTR_VBUS_SENSE), MP_ROM_PTR(&pin_GPIO21) },
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL_POWER), MP_ROM_PTR(&pin_GPIO2) },
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO1) },
diff --git a/ports/mimxrt10xx/common-hal/busio/UART.c b/ports/mimxrt10xx/common-hal/busio/UART.c
index 03a6e8f3e..503da14c2 100644
--- a/ports/mimxrt10xx/common-hal/busio/UART.c
+++ b/ports/mimxrt10xx/common-hal/busio/UART.c
@@ -93,6 +93,10 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self,
self->character_bits = bits;
self->timeout_ms = timeout * 1000;
+ if (self->character_bits != 7 && self->character_bits != 8) {
+ mp_raise_ValueError(translate("Invalid word/bit length"));
+ }
+
// We are transmitting one direction if one pin is NULL and the other isn't.
bool is_onedirection = (rx == NULL) != (tx == NULL);
bool uart_taken = false;
@@ -154,10 +158,6 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self,
mp_raise_ValueError(translate("Hardware in use, try alternative pins"));
}
- if(self->rx == NULL && self->tx == NULL) {
- mp_raise_ValueError(translate("Invalid pins"));
- }
-
if (is_onedirection && ((rts != NULL) || (cts != NULL))) {
mp_raise_ValueError(translate("Both RX and TX required for flow control"));
}
diff --git a/ports/nrf/boards/pca10100/mpconfigboard.mk b/ports/nrf/boards/pca10100/mpconfigboard.mk
index fbb9987c2..74080a1ed 100644
--- a/ports/nrf/boards/pca10100/mpconfigboard.mk
+++ b/ports/nrf/boards/pca10100/mpconfigboard.mk
@@ -9,6 +9,7 @@ INTERNAL_FLASH_FILESYSTEM = 1
CIRCUITPY_AUDIOMP3 = 0
CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_BUSIO = 1
CIRCUITPY_COUNTIO = 0
CIRCUITPY_DISPLAYIO = 0
diff --git a/ports/nrf/boards/simmel/mpconfigboard.mk b/ports/nrf/boards/simmel/mpconfigboard.mk
index 52743d340..283e3d169 100644
--- a/ports/nrf/boards/simmel/mpconfigboard.mk
+++ b/ports/nrf/boards/simmel/mpconfigboard.mk
@@ -13,6 +13,7 @@ INTERNAL_FLASH_FILESYSTEM = 1
CIRCUITPY_AESIO = 1
CIRCUITPY_AUDIOMP3 = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_BUSDEVICE = 0
CIRCUITPY_BUSIO = 1
CIRCUITPY_DISPLAYIO = 0
diff --git a/ports/nrf/common-hal/busio/UART.c b/ports/nrf/common-hal/busio/UART.c
index 6ecf7e0ba..491e360e4 100644
--- a/ports/nrf/common-hal/busio/UART.c
+++ b/ports/nrf/common-hal/busio/UART.c
@@ -70,9 +70,9 @@ static uint32_t get_nrf_baud (uint32_t baudrate) {
{ 14400, NRF_UARTE_BAUDRATE_14400 },
{ 19200, NRF_UARTE_BAUDRATE_19200 },
{ 28800, NRF_UARTE_BAUDRATE_28800 },
- { 31250, NRF_UARTE_BAUDRATE_31250 },
+ { 31250, NRF_UARTE_BAUDRATE_31250 },
{ 38400, NRF_UARTE_BAUDRATE_38400 },
- { 56000, NRF_UARTE_BAUDRATE_56000 },
+ { 56000, NRF_UARTE_BAUDRATE_56000 },
{ 57600, NRF_UARTE_BAUDRATE_57600 },
{ 76800, NRF_UARTE_BAUDRATE_76800 },
{ 115200, NRF_UARTE_BAUDRATE_115200 },
@@ -144,6 +144,10 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self,
mp_float_t timeout, uint16_t receiver_buffer_size, byte* receiver_buffer,
bool sigint_enabled) {
+ if (bits != 8) {
+ mp_raise_ValueError(translate("Invalid word/bit length"));
+ }
+
if ((rs485_dir != NULL) || (rs485_invert)) {
mp_raise_ValueError(translate("RS485 Not yet supported on this device"));
}
diff --git a/ports/nrf/common-hal/rgbmatrix/RGBMatrix.c b/ports/nrf/common-hal/rgbmatrix/RGBMatrix.c
index e13b761ab..d8289f56f 100644
--- a/ports/nrf/common-hal/rgbmatrix/RGBMatrix.c
+++ b/ports/nrf/common-hal/rgbmatrix/RGBMatrix.c
@@ -32,7 +32,7 @@
extern void _PM_IRQ_HANDLER(void);
-void *common_hal_rgbmatrix_timer_allocate() {
+void *common_hal_rgbmatrix_timer_allocate(rgbmatrix_rgbmatrix_obj_t *self) {
nrfx_timer_t *timer = nrf_peripherals_allocate_timer_or_throw();
nrf_peripherals_timer_never_reset(timer);
return timer->p_reg;
diff --git a/ports/nrf/common-hal/rgbmatrix/RGBMatrix.h b/ports/nrf/common-hal/rgbmatrix/RGBMatrix.h
index 24d86f177..6cf7354fc 100644
--- a/ports/nrf/common-hal/rgbmatrix/RGBMatrix.h
+++ b/ports/nrf/common-hal/rgbmatrix/RGBMatrix.h
@@ -27,7 +27,9 @@
#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
#define MICROPY_INCLUDED_NRF_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
-void *common_hal_rgbmatrix_timer_allocate(void);
+#include "shared-module/rgbmatrix/RGBMatrix.h"
+
+void *common_hal_rgbmatrix_timer_allocate(rgbmatrix_rgbmatrix_obj_t *self);
void common_hal_rgbmatrix_timer_enable(void*);
void common_hal_rgbmatrix_timer_disable(void*);
void common_hal_rgbmatrix_timer_free(void*);
diff --git a/ports/raspberrypi/Makefile b/ports/raspberrypi/Makefile
index f5e65f256..9d66338c7 100644
--- a/ports/raspberrypi/Makefile
+++ b/ports/raspberrypi/Makefile
@@ -231,8 +231,9 @@ SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE))
SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED))
SRC_S = supervisor/$(CHIP_FAMILY)_cpu.s
-SRC_S_UPPER = bs2_default_padded_checksummed.S \
- sdk/src/rp2_common/hardware_divider/divider.S \
+BOOT2_S_UPPER ?= sdk/src/rp2_common/boot_stage2/boot2_generic_03h.S
+BOOT2_S_CFLAGS ?= -DPICO_FLASH_SPI_CLKDIV=2
+SRC_S_UPPER = sdk/src/rp2_common/hardware_divider/divider.S \
sdk/src/rp2_common/hardware_irq/irq_handler_chain.S \
sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S \
sdk/src/rp2_common/pico_double/double_aeabi.S \
@@ -253,7 +254,23 @@ endif
OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_S_UPPER:.S=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o))
+OBJ += $(BUILD)/boot2_padded_checksummed.o
+$(BUILD)/boot2_padded_checksummed.o: $(BUILD)/boot2_padded_checksummed.S
+ $(STEPECHO) "CC $<"
+ $(Q)$(CC) $(CFLAGS) -c -o $@ $<
+
+$(BUILD)/boot2_padded_checksummed.S: $(BUILD)/boot2.bin
+ $(STEPECHO) "PAD_CHECKSUM $<"
+ $(Q)$(PYTHON3) sdk/src/rp2_common/boot_stage2/pad_checksum -s 0xffffffff $< $@
+
+$(BUILD)/boot2.bin: $(BUILD)/boot2.elf
+ $(STEPECHO) "OBJCOPY $<"
+ $(Q)$(OBJCOPY) -O binary $< $@
+
+$(BUILD)/boot2.elf: $(BOOT2_S_UPPER) | $(BUILD)/
+ $(STEPECHO) "BOOT $<"
+ $(Q)$(CC) $(CFLAGS) $(BOOT2_S_CFLAGS) -Isdk/src/rp2_common/boot_stage2/asminclude --specs=nosys.specs -nostartfiles -Wl,-T,sdk/src/rp2_common/boot_stage2/boot_stage2.ld -o $@ $<
SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED)
diff --git a/ports/raspberrypi/audio_dma.c b/ports/raspberrypi/audio_dma.c
index 96317984d..ccf08b1b4 100644
--- a/ports/raspberrypi/audio_dma.c
+++ b/ports/raspberrypi/audio_dma.c
@@ -39,6 +39,16 @@
#define AUDIO_DMA_CHANNEL_COUNT NUM_DMA_CHANNELS
+void audio_dma_reset(void) {
+ for (size_t channel = 0; channel < AUDIO_DMA_CHANNEL_COUNT; channel++) {
+ if (MP_STATE_PORT(playing_audio)[channel] == NULL) {
+ continue;
+ }
+
+ audio_dma_stop(MP_STATE_PORT(playing_audio)[channel]);
+ }
+}
+
void audio_dma_convert_signed(audio_dma_t* dma, uint8_t* buffer, uint32_t buffer_length,
uint8_t** output_buffer, uint32_t* output_buffer_length) {
if (dma->first_buffer_free) {
@@ -292,9 +302,16 @@ void audio_dma_stop(audio_dma_t* dma) {
for (size_t i = 0; i < 2; i++) {
size_t channel = dma->channel[i];
+ dma_channel_config c = dma_channel_get_default_config(dma->channel[i]);
+ channel_config_set_enable(&c, false);
+ dma_channel_set_config(channel, &c, false /* trigger */);
+
if (dma_channel_is_busy(channel)) {
dma_channel_abort(channel);
}
+ dma_channel_set_read_addr(channel, NULL, false /* trigger */);
+ dma_channel_set_write_addr(channel, NULL, false /* trigger */);
+ dma_channel_set_trans_count(channel, 0, false /* trigger */);
dma_channel_unclaim(channel);
MP_STATE_PORT(playing_audio)[channel] = NULL;
dma->channel[i] = NUM_DMA_CHANNELS;
diff --git a/ports/raspberrypi/bindings/rp2pio/StateMachine.c b/ports/raspberrypi/bindings/rp2pio/StateMachine.c
index 34633949e..444e00ace 100644
--- a/ports/raspberrypi/bindings/rp2pio/StateMachine.c
+++ b/ports/raspberrypi/bindings/rp2pio/StateMachine.c
@@ -36,6 +36,7 @@
#include "lib/utils/buffer_helper.h"
#include "lib/utils/context_manager_helpers.h"
#include "lib/utils/interrupt_char.h"
+#include "py/binary.h"
#include "py/mperrno.h"
#include "py/objproperty.h"
#include "py/runtime.h"
@@ -64,16 +65,23 @@
//| init: Optional[ReadableBuffer] = None,
//| first_out_pin: Optional[microcontroller.Pin] = None,
//| out_pin_count: int = 1,
+//| initial_out_pin_state: int = 0,
+//| initial_out_pin_direction: int = 0xffffffff,
//| first_in_pin: Optional[microcontroller.Pin] = None,
//| in_pin_count: int = 1,
//| first_set_pin: Optional[microcontroller.Pin] = None,
//| set_pin_count: int = 1,
+//| initial_set_pin_state: int = 0,
+//| initial_set_pin_direction: int = 0x1f,
//| first_sideset_pin: Optional[microcontroller.Pin] = None,
//| sideset_pin_count: int = 1,
+//| initial_sideset_pin_state: int = 0,
+//| initial_sideset_pin_direction: int = 0x1f,
//| exclusive_pin_use: bool = True,
//| auto_pull: bool = False,
//| pull_threshold : int = 32,
//| out_shift_right : bool = True,
+//| wait_for_txstall: bool = True,
//| auto_push: bool = False,
//| push_threshold : int = 32,
//| in_shift_right : bool = True) -> None:
@@ -87,12 +95,18 @@
//| is started so instructions may be intermingled
//| :param ~microcontroller.Pin first_out_pin: the first pin to use with the OUT instruction
//| :param int out_pin_count: the count of consecutive pins to use with OUT starting at first_out_pin
+//| :param int initial_out_pin_state: the initial output value for out pins starting at first_out_pin
+//| :param int initial_out_pin_direction: the initial output direction for out pins starting at first_out_pin
//| :param ~microcontroller.Pin first_in_pin: the first pin to use with the IN instruction
//| :param int in_pin_count: the count of consecutive pins to use with IN starting at first_in_pin
//| :param ~microcontroller.Pin first_set_pin: the first pin to use with the SET instruction
//| :param int set_pin_count: the count of consecutive pins to use with SET starting at first_set_pin
+//| :param int initial_set_pin_state: the initial output value for set pins starting at first_set_pin
+//| :param int initial_set_pin_direction: the initial output direction for set pins starting at first_set_pin
//| :param ~microcontroller.Pin first_sideset_pin: the first pin to use with a side set
//| :param int sideset_pin_count: the count of consecutive pins to use with a side set starting at first_sideset_pin
+//| :param int initial_sideset_pin_state: the initial output value for sideset pins starting at first_sideset_pin
+//| :param int initial_sideset_pin_direction: the initial output direction for sideset pins starting at first_sideset_pin
//| :param bool exclusive_pin_use: When True, do not share any pins with other state machines. Pins are never shared with other peripherals
//| :param bool auto_pull: When True, automatically load data from the tx FIFO into the
//| output shift register (OSR) when an OUT instruction shifts more than pull_threshold bits
@@ -100,6 +114,10 @@
//| :param bool out_shift_right: When True, data is shifted out the right side (LSB) of the
//| OSR. It is shifted out the left (MSB) otherwise. NOTE! This impacts data alignment
//| when the number of bytes is not a power of two (1, 2 or 4 bytes).
+//| :param bool wait_for_txstall: When True, writing data out will block until the TX FIFO and OSR are empty
+//| and an instruction is stalled waiting for more data. When False, data writes won't
+//| wait for the OSR to empty (only the TX FIFO) so make sure you give enough time before
+//| deiniting or stopping the state machine.
//| :param bool auto_push: When True, automatically save data from input shift register
//| (ISR) into the rx FIFO when an IN instruction shifts more than push_threshold bits
//| :param int push_threshold: Number of bits to shift before saving the ISR value to the RX FIFO
@@ -113,29 +131,42 @@ STATIC mp_obj_t rp2pio_statemachine_make_new(const mp_obj_type_t *type, size_t n
rp2pio_statemachine_obj_t *self = m_new_obj(rp2pio_statemachine_obj_t);
self->base.type = &rp2pio_statemachine_type;
enum { ARG_program, ARG_frequency, ARG_init,
- ARG_first_out_pin, ARG_out_pin_count,
+ ARG_first_out_pin, ARG_out_pin_count, ARG_initial_out_pin_state, ARG_initial_out_pin_direction,
ARG_first_in_pin, ARG_in_pin_count,
- ARG_first_set_pin, ARG_set_pin_count,
- ARG_first_sideset_pin, ARG_sideset_pin_count,
+ ARG_first_set_pin, ARG_set_pin_count, ARG_initial_set_pin_state, ARG_initial_set_pin_direction,
+ ARG_first_sideset_pin, ARG_sideset_pin_count, ARG_initial_sideset_pin_state, ARG_initial_sideset_pin_direction,
ARG_exclusive_pin_use,
ARG_auto_pull, ARG_pull_threshold, ARG_out_shift_right,
+ ARG_wait_for_txstall,
ARG_auto_push, ARG_push_threshold, ARG_in_shift_right};
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_program, MP_ARG_REQUIRED | MP_ARG_OBJ },
{ MP_QSTR_frequency, MP_ARG_REQUIRED | MP_ARG_INT },
{ MP_QSTR_init, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+
{ MP_QSTR_first_out_pin, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
{ MP_QSTR_out_pin_count, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1} },
+ { MP_QSTR_initial_out_pin_state, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_initial_out_pin_direction, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0xffffffff} },
+
{ MP_QSTR_first_in_pin, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
{ MP_QSTR_in_pin_count, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1} },
+
{ MP_QSTR_first_set_pin, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
{ MP_QSTR_set_pin_count, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1} },
+ { MP_QSTR_initial_set_pin_state, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_initial_set_pin_direction, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0x1f} },
+
{ MP_QSTR_first_sideset_pin, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
{ MP_QSTR_sideset_pin_count, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1} },
+ { MP_QSTR_initial_sideset_pin_state, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_initial_sideset_pin_direction, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0x1f} },
+
{ MP_QSTR_exclusive_pin_use, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
{ MP_QSTR_auto_pull, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
{ MP_QSTR_pull_threshold, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 32} },
{ MP_QSTR_out_shift_right, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
+ { MP_QSTR_wait_for_txstall, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
{ MP_QSTR_auto_push, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
{ MP_QSTR_push_threshold, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 32} },
{ MP_QSTR_in_shift_right, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
@@ -201,12 +232,13 @@ STATIC mp_obj_t rp2pio_statemachine_make_new(const mp_obj_type_t *type, size_t n
bufinfo.buf, bufinfo.len / 2,
args[ARG_frequency].u_int,
init_bufinfo.buf, init_bufinfo.len / 2,
- first_out_pin, args[ARG_out_pin_count].u_int,
+ first_out_pin, args[ARG_out_pin_count].u_int, args[ARG_initial_out_pin_state].u_int, args[ARG_initial_out_pin_direction].u_int,
first_in_pin, args[ARG_in_pin_count].u_int,
- first_set_pin, args[ARG_set_pin_count].u_int,
- first_sideset_pin, args[ARG_sideset_pin_count].u_int,
+ first_set_pin, args[ARG_set_pin_count].u_int, args[ARG_initial_set_pin_state].u_int, args[ARG_initial_set_pin_direction].u_int,
+ first_sideset_pin, args[ARG_sideset_pin_count].u_int, args[ARG_initial_sideset_pin_state].u_int, args[ARG_initial_sideset_pin_direction].u_int,
args[ARG_exclusive_pin_use].u_bool,
args[ARG_auto_pull].u_bool, pull_threshold, args[ARG_out_shift_right].u_bool,
+ args[ARG_wait_for_txstall].u_bool,
args[ARG_auto_push].u_bool, push_threshold, args[ARG_in_shift_right].u_bool);
return MP_OBJ_FROM_PTR(self);
}
@@ -247,11 +279,53 @@ STATIC void check_for_deinit(rp2pio_statemachine_obj_t *self) {
}
}
-// // | def restart(self, *other_state_machines) -> None:
-// // | """Restarts this state machine and any others given. They must share
-// // | an underlying PIO. An exception will be raised otherwise."""
-// // | ...
-// // |
+//| def restart(self) -> None:
+//| """Resets this state machine, runs any init and enables the clock."""
+// TODO: "and any others given. They must share an underlying PIO. An exception will be raised otherwise.""
+//| ...
+//|
+STATIC mp_obj_t rp2pio_statemachine_restart(mp_obj_t self_obj) {
+ rp2pio_statemachine_obj_t *self = MP_OBJ_TO_PTR(self_obj);
+ check_for_deinit(self);
+
+ common_hal_rp2pio_statemachine_restart(self);
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_1(rp2pio_statemachine_restart_obj, rp2pio_statemachine_restart);
+
+
+//| def run(self, instructions: ReadableBuffer) -> None:
+//| """Runs all given instructions. They will likely be interleaved with
+//| in-memory instructions. Make sure this doesn't wait for input!
+//|
+//| This can be used to output internal state to the RX FIFO and then
+//| read with `readinto`."""
+//| ...
+//|
+STATIC mp_obj_t rp2pio_statemachine_run(mp_obj_t self_obj, mp_obj_t instruction_obj) {
+ rp2pio_statemachine_obj_t *self = MP_OBJ_TO_PTR(self_obj);
+ check_for_deinit(self);
+
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(instruction_obj, &bufinfo, MP_BUFFER_READ);
+
+ common_hal_rp2pio_statemachine_run(self, bufinfo.buf, bufinfo.len);
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_2(rp2pio_statemachine_run_obj, rp2pio_statemachine_run);
+
+//| def stop(self) -> None:
+//| """Stops the state machine clock. Use `restart` to enable it."""
+//| ...
+//|
+STATIC mp_obj_t rp2pio_statemachine_stop(mp_obj_t self_obj) {
+ rp2pio_statemachine_obj_t *self = MP_OBJ_TO_PTR(self_obj);
+ check_for_deinit(self);
+
+ common_hal_rp2pio_statemachine_stop(self);
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_1(rp2pio_statemachine_stop_obj, rp2pio_statemachine_stop);
//| def write(self, buffer: ReadableBuffer, *, start: int = 0, end: Optional[int] = None) -> None:
//| """Write the data contained in ``buffer`` to the state machine. If the buffer is empty, nothing happens.
@@ -261,7 +335,6 @@ STATIC void check_for_deinit(rp2pio_statemachine_obj_t *self) {
//| :param int end: End of the slice; this index is not included. Defaults to ``len(buffer)``"""
//| ...
//|
-
STATIC mp_obj_t rp2pio_statemachine_write(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
enum { ARG_buffer, ARG_start, ARG_end };
static const mp_arg_t allowed_args[] = {
@@ -279,12 +352,17 @@ STATIC mp_obj_t rp2pio_statemachine_write(size_t n_args, const mp_obj_t *pos_arg
int32_t start = args[ARG_start].u_int;
size_t length = bufinfo.len;
normalize_buffer_bounds(&start, args[ARG_end].u_int, &length);
-
if (length == 0) {
return mp_const_none;
}
- bool ok = common_hal_rp2pio_statemachine_write(self, ((uint8_t*)bufinfo.buf) + start, length);
+ uint8_t* original_pointer = bufinfo.buf;
+ int stride_in_bytes = mp_binary_get_size('@', bufinfo.typecode, NULL);
+ if (stride_in_bytes > 4) {
+ mp_raise_ValueError(translate("Buffer elements must be 4 bytes long or less"));
+ }
+
+ bool ok = common_hal_rp2pio_statemachine_write(self, ((uint8_t*)bufinfo.buf) + start, length, stride_in_bytes);
if (mp_hal_is_interrupted()) {
return mp_const_none;
}
@@ -296,110 +374,132 @@ STATIC mp_obj_t rp2pio_statemachine_write(size_t n_args, const mp_obj_t *pos_arg
MP_DEFINE_CONST_FUN_OBJ_KW(rp2pio_statemachine_write_obj, 2, rp2pio_statemachine_write);
-// // | def readinto(self, buffer: WriteableBuffer, *, start: int = 0, end: Optional[int] = None) -> None:
-// // | """Read into ``buffer``. If the number of bytes to read is 0, nothing happens.
-// // |
-// // | :param ~_typing.WriteableBuffer buffer: Read data into this buffer
-// // | :param int start: Start of the slice of ``buffer`` to read into: ``buffer[start:end]``
-// // | :param int end: End of the slice; this index is not included. Defaults to ``len(buffer)``
-// // | :param int write_value: Value to write while reading. (Usually ignored.)"""
-// // | ...
-// // |
-
-// STATIC mp_obj_t rp2pio_statemachine_readinto(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
-// enum { ARG_buffer, ARG_start, ARG_end, ARG_write_value };
-// static const mp_arg_t allowed_args[] = {
-// { MP_QSTR_buffer, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
-// { MP_QSTR_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
-// { MP_QSTR_end, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = INT_MAX} },
-// { MP_QSTR_write_value,MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
-// };
-// rp2pio_statemachine_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
-// check_for_deinit(self);
-// check_lock(self);
-// mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
-// mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
-
-// mp_buffer_info_t bufinfo;
-// mp_get_buffer_raise(args[ARG_buffer].u_obj, &bufinfo, MP_BUFFER_WRITE);
-// int32_t start = args[ARG_start].u_int;
-// size_t length = bufinfo.len;
-// normalize_buffer_bounds(&start, args[ARG_end].u_int, &length);
-
-// if (length == 0) {
-// return mp_const_none;
-// }
-
-// bool ok = common_hal_rp2pio_statemachine_read(self, ((uint8_t*)bufinfo.buf) + start, length, args[ARG_write_value].u_int);
-// if (!ok) {
-// mp_raise_OSError(MP_EIO);
-// }
-// return mp_const_none;
-// }
-// MP_DEFINE_CONST_FUN_OBJ_KW(rp2pio_statemachine_readinto_obj, 2, rp2pio_statemachine_readinto);
-
-// //| def write_readinto(self, buffer_out: ReadableBuffer, buffer_in: WriteableBuffer, *, out_start: int = 0, out_end: Optional[int] = None, in_start: int = 0, in_end: Optional[int] = None) -> None:
-// //| """Write out the data in ``buffer_out`` while simultaneously reading data into ``buffer_in``.
-// //| The SPI object must be locked.
-// //| The lengths of the slices defined by ``buffer_out[out_start:out_end]`` and ``buffer_in[in_start:in_end]``
-// //| must be equal.
-// //| If buffer slice lengths are both 0, nothing happens.
-// //|
-// //| :param ~_typing.ReadableBuffer buffer_out: Write out the data in this buffer
-// //| :param ~_typing.WriteableBuffer buffer_in: Read data into this buffer
-// //| :param int out_start: Start of the slice of buffer_out to write out: ``buffer_out[out_start:out_end]``
-// //| :param int out_end: End of the slice; this index is not included. Defaults to ``len(buffer_out)``
-// //| :param int in_start: Start of the slice of ``buffer_in`` to read into: ``buffer_in[in_start:in_end]``
-// //| :param int in_end: End of the slice; this index is not included. Defaults to ``len(buffer_in)``"""
-// //| ...
-// //|
-
-// STATIC mp_obj_t rp2pio_statemachine_write_readinto(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
-// enum { ARG_buffer_out, ARG_buffer_in, ARG_out_start, ARG_out_end, ARG_in_start, ARG_in_end };
-// static const mp_arg_t allowed_args[] = {
-// { MP_QSTR_buffer_out, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
-// { MP_QSTR_buffer_in, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
-// { MP_QSTR_out_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
-// { MP_QSTR_out_end, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = INT_MAX} },
-// { MP_QSTR_in_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
-// { MP_QSTR_in_end, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = INT_MAX} },
-// };
-// rp2pio_statemachine_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
-// check_for_deinit(self);
-// check_lock(self);
-// mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
-// mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
-
-// mp_buffer_info_t buf_out_info;
-// mp_get_buffer_raise(args[ARG_buffer_out].u_obj, &buf_out_info, MP_BUFFER_READ);
-// int32_t out_start = args[ARG_out_start].u_int;
-// size_t out_length = buf_out_info.len;
-// normalize_buffer_bounds(&out_start, args[ARG_out_end].u_int, &out_length);
-
-// mp_buffer_info_t buf_in_info;
-// mp_get_buffer_raise(args[ARG_buffer_in].u_obj, &buf_in_info, MP_BUFFER_WRITE);
-// int32_t in_start = args[ARG_in_start].u_int;
-// size_t in_length = buf_in_info.len;
-// normalize_buffer_bounds(&in_start, args[ARG_in_end].u_int, &in_length);
-
-// if (out_length != in_length) {
-// mp_raise_ValueError(translate("buffer slices must be of equal length"));
-// }
-
-// if (out_length == 0) {
-// return mp_const_none;
-// }
-
-// bool ok = common_hal_rp2pio_statemachine_transfer(self,
-// ((uint8_t*)buf_out_info.buf) + out_start,
-// ((uint8_t*)buf_in_info.buf) + in_start,
-// out_length);
-// if (!ok) {
-// mp_raise_OSError(MP_EIO);
-// }
-// return mp_const_none;
-// }
-// MP_DEFINE_CONST_FUN_OBJ_KW(rp2pio_statemachine_write_readinto_obj, 2, rp2pio_statemachine_write_readinto);
+//| def readinto(self, buffer: WriteableBuffer, *, start: int = 0, end: Optional[int] = None) -> None:
+//| """Read into ``buffer``. If the number of bytes to read is 0, nothing happens. The buffer
+//| include any data added to the fifo even if it was added before this was called.
+//|
+//| :param ~_typing.WriteableBuffer buffer: Read data into this buffer
+//| :param int start: Start of the slice of ``buffer`` to read into: ``buffer[start:end]``
+//| :param int end: End of the slice; this index is not included. Defaults to ``len(buffer)``"""
+//| ...
+//|
+
+STATIC mp_obj_t rp2pio_statemachine_readinto(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ enum { ARG_buffer, ARG_start, ARG_end };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_buffer, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
+ { MP_QSTR_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_end, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = INT_MAX} },
+ };
+ rp2pio_statemachine_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
+ check_for_deinit(self);
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(args[ARG_buffer].u_obj, &bufinfo, MP_BUFFER_WRITE);
+ int32_t start = args[ARG_start].u_int;
+ size_t length = bufinfo.len;
+ normalize_buffer_bounds(&start, args[ARG_end].u_int, &length);
+
+ if (length == 0) {
+ return mp_const_none;
+ }
+
+ uint8_t* original_pointer = bufinfo.buf;
+ int stride_in_bytes = mp_binary_get_size('@', bufinfo.typecode, NULL);
+ if (stride_in_bytes > 4) {
+ mp_raise_ValueError(translate("Buffer elements must be 4 bytes long or less"));
+ }
+
+ bool ok = common_hal_rp2pio_statemachine_readinto(self, ((uint8_t*)bufinfo.buf) + start, length, stride_in_bytes);
+ if (!ok) {
+ mp_raise_OSError(MP_EIO);
+ }
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_KW(rp2pio_statemachine_readinto_obj, 2, rp2pio_statemachine_readinto);
+
+//| def write_readinto(self, buffer_out: ReadableBuffer, buffer_in: WriteableBuffer, *, out_start: int = 0, out_end: Optional[int] = None, in_start: int = 0, in_end: Optional[int] = None) -> None:
+//| """Write out the data in ``buffer_out`` while simultaneously reading data into ``buffer_in``.
+//| The lengths of the slices defined by ``buffer_out[out_start:out_end]`` and ``buffer_in[in_start:in_end]``
+//| may be different. The function will return once both are filled.
+//| If buffer slice lengths are both 0, nothing happens.
+//|
+//| :param ~_typing.ReadableBuffer buffer_out: Write out the data in this buffer
+//| :param ~_typing.WriteableBuffer buffer_in: Read data into this buffer
+//| :param int out_start: Start of the slice of buffer_out to write out: ``buffer_out[out_start:out_end]``
+//| :param int out_end: End of the slice; this index is not included. Defaults to ``len(buffer_out)``
+//| :param int in_start: Start of the slice of ``buffer_in`` to read into: ``buffer_in[in_start:in_end]``
+//| :param int in_end: End of the slice; this index is not included. Defaults to ``len(buffer_in)``"""
+//| ...
+//|
+
+STATIC mp_obj_t rp2pio_statemachine_write_readinto(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ enum { ARG_buffer_out, ARG_buffer_in, ARG_out_start, ARG_out_end, ARG_in_start, ARG_in_end };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_buffer_out, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
+ { MP_QSTR_buffer_in, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
+ { MP_QSTR_out_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_out_end, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = INT_MAX} },
+ { MP_QSTR_in_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_in_end, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = INT_MAX} },
+ };
+ rp2pio_statemachine_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
+ check_for_deinit(self);
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ mp_buffer_info_t buf_out_info;
+ mp_get_buffer_raise(args[ARG_buffer_out].u_obj, &buf_out_info, MP_BUFFER_READ);
+ int32_t out_start = args[ARG_out_start].u_int;
+ size_t out_length = buf_out_info.len;
+ normalize_buffer_bounds(&out_start, args[ARG_out_end].u_int, &out_length);
+
+ mp_buffer_info_t buf_in_info;
+ mp_get_buffer_raise(args[ARG_buffer_in].u_obj, &buf_in_info, MP_BUFFER_WRITE);
+ int32_t in_start = args[ARG_in_start].u_int;
+ size_t in_length = buf_in_info.len;
+ normalize_buffer_bounds(&in_start, args[ARG_in_end].u_int, &in_length);
+
+ if (out_length == 0 && in_length == 0) {
+ return mp_const_none;
+ }
+
+ int in_stride_in_bytes = mp_binary_get_size('@', buf_in_info.typecode, NULL);
+ if (in_stride_in_bytes > 4) {
+ mp_raise_ValueError(translate("In-buffer elements must be <= 4 bytes long"));
+ }
+
+ int out_stride_in_bytes = mp_binary_get_size('@', buf_out_info.typecode, NULL);
+ if (out_stride_in_bytes > 4) {
+ mp_raise_ValueError(translate("Out-buffer elements must be <= 4 bytes long"));
+ }
+
+ bool ok = common_hal_rp2pio_statemachine_write_readinto(self,
+ ((uint8_t*)buf_out_info.buf) + out_start,
+ out_length,
+ out_stride_in_bytes,
+ ((uint8_t*)buf_in_info.buf) + in_start,
+ in_length,
+ in_stride_in_bytes);
+ if (!ok) {
+ mp_raise_OSError(MP_EIO);
+ }
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_KW(rp2pio_statemachine_write_readinto_obj, 2, rp2pio_statemachine_write_readinto);
+
+//| def clear_rxfifo(self) -> None:
+//| """Clears any unread bytes in the rxfifo."""
+//| ...
+//|
+STATIC mp_obj_t rp2pio_statemachine_obj_clear_rxfifo(mp_obj_t self_in) {
+ rp2pio_statemachine_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ common_hal_rp2pio_statemachine_clear_rxfifo(self);
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_1(rp2pio_statemachine_clear_rxfifo_obj, rp2pio_statemachine_obj_clear_rxfifo);
//| frequency: int
//| """The actual state machine frequency. This may not match the frequency requested
@@ -413,9 +513,37 @@ STATIC mp_obj_t rp2pio_statemachine_obj_get_frequency(mp_obj_t self_in) {
}
MP_DEFINE_CONST_FUN_OBJ_1(rp2pio_statemachine_get_frequency_obj, rp2pio_statemachine_obj_get_frequency);
+STATIC mp_obj_t rp2pio_statemachine_obj_set_frequency(mp_obj_t self_in, mp_obj_t frequency) {
+ rp2pio_statemachine_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ check_for_deinit(self);
+
+ common_hal_rp2pio_statemachine_set_frequency(self, mp_obj_get_int(frequency));
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_2(rp2pio_statemachine_set_frequency_obj, rp2pio_statemachine_obj_set_frequency);
+
const mp_obj_property_t rp2pio_statemachine_frequency_obj = {
.base.type = &mp_type_property,
.proxy = {(mp_obj_t)&rp2pio_statemachine_get_frequency_obj,
+ (mp_obj_t)&rp2pio_statemachine_set_frequency_obj,
+ (mp_obj_t)&mp_const_none_obj},
+};
+
+//| rxstall: bool
+//| """True when the state machine has stalled due to a full RX FIFO since the last
+//| `clear_rxfifo` call."""
+//|
+
+STATIC mp_obj_t rp2pio_statemachine_obj_get_rxstall(mp_obj_t self_in) {
+ rp2pio_statemachine_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ check_for_deinit(self);
+ return MP_OBJ_NEW_SMALL_INT(common_hal_rp2pio_statemachine_get_rxstall(self));
+}
+MP_DEFINE_CONST_FUN_OBJ_1(rp2pio_statemachine_get_rxstall_obj, rp2pio_statemachine_obj_get_rxstall);
+
+const mp_obj_property_t rp2pio_statemachine_rxstall_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&rp2pio_statemachine_get_rxstall_obj,
(mp_obj_t)&mp_const_none_obj,
(mp_obj_t)&mp_const_none_obj},
};
@@ -425,12 +553,17 @@ STATIC const mp_rom_map_elem_t rp2pio_statemachine_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) },
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&rp2pio_statemachine_obj___exit___obj) },
-// { MP_ROM_QSTR(MP_QSTR_restart), MP_ROM_PTR(&rp2pio_statemachine_configure_obj) },
+ { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&rp2pio_statemachine_stop_obj) },
+ { MP_ROM_QSTR(MP_QSTR_restart), MP_ROM_PTR(&rp2pio_statemachine_restart_obj) },
+ { MP_ROM_QSTR(MP_QSTR_run), MP_ROM_PTR(&rp2pio_statemachine_run_obj) },
+ { MP_ROM_QSTR(MP_QSTR_clear_rxfifo), MP_ROM_PTR(&rp2pio_statemachine_clear_rxfifo_obj) },
-// { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&rp2pio_statemachine_readinto_obj) },
+ { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&rp2pio_statemachine_readinto_obj) },
{ MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&rp2pio_statemachine_write_obj) },
-// { MP_ROM_QSTR(MP_QSTR_write_readinto), MP_ROM_PTR(&rp2pio_statemachine_write_readinto_obj) },
- { MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&rp2pio_statemachine_frequency_obj) }
+ { MP_ROM_QSTR(MP_QSTR_write_readinto), MP_ROM_PTR(&rp2pio_statemachine_write_readinto_obj) },
+
+ { MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&rp2pio_statemachine_frequency_obj) },
+ { MP_ROM_QSTR(MP_QSTR_rxstall), MP_ROM_PTR(&rp2pio_statemachine_rxstall_obj) }
};
STATIC MP_DEFINE_CONST_DICT(rp2pio_statemachine_locals_dict, rp2pio_statemachine_locals_dict_table);
diff --git a/ports/raspberrypi/bindings/rp2pio/StateMachine.h b/ports/raspberrypi/bindings/rp2pio/StateMachine.h
index 5ff20a75b..36e44f191 100644
--- a/ports/raspberrypi/bindings/rp2pio/StateMachine.h
+++ b/ports/raspberrypi/bindings/rp2pio/StateMachine.h
@@ -36,36 +36,38 @@
extern const mp_obj_type_t rp2pio_statemachine_type;
// Construct an underlying SPI object.
-extern void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
+void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
const uint16_t* program, size_t program_len,
size_t frequency,
const uint16_t* init, size_t init_len,
- const mcu_pin_obj_t * first_out_pin, uint8_t out_pin_count,
+ const mcu_pin_obj_t * first_out_pin, uint8_t out_pin_count, uint32_t initial_out_pin_state, uint32_t initial_out_pin_direction,
const mcu_pin_obj_t * first_in_pin, uint8_t in_pin_count,
- const mcu_pin_obj_t * first_set_pin, uint8_t set_pin_count,
- const mcu_pin_obj_t * first_sideset_pin, uint8_t sideset_pin_count,
+ const mcu_pin_obj_t * first_set_pin, uint8_t set_pin_count, uint32_t initial_set_pin_state, uint32_t initial_set_pin_direction,
+ const mcu_pin_obj_t * first_sideset_pin, uint8_t sideset_pin_count, uint32_t initial_sideset_pin_state, uint32_t initial_sideset_pin_direction,
bool exclusive_pin_use,
bool auto_pull, uint8_t pull_threshold, bool out_shift_right,
+ bool wait_for_txstall,
bool auto_push, uint8_t push_threshold, bool in_shift_right);
-extern void common_hal_rp2pio_statemachine_deinit(rp2pio_statemachine_obj_t *self);
-extern bool common_hal_rp2pio_statemachine_deinited(rp2pio_statemachine_obj_t *self);
+void common_hal_rp2pio_statemachine_deinit(rp2pio_statemachine_obj_t *self);
+bool common_hal_rp2pio_statemachine_deinited(rp2pio_statemachine_obj_t *self);
-// Writes out the given data.
-extern bool common_hal_rp2pio_statemachine_write(rp2pio_statemachine_obj_t *self, const uint8_t *data, size_t len);
-
-// // Reads in len bytes while outputting zeroes.
-// extern bool common_hal_rp2pio_statemachine_read(rp2pio_statemachine_obj_t *self, uint8_t *data, size_t len, uint8_t write_value);
+void common_hal_rp2pio_statemachine_restart(rp2pio_statemachine_obj_t *self);
+void common_hal_rp2pio_statemachine_stop(rp2pio_statemachine_obj_t *self);
+void common_hal_rp2pio_statemachine_run(rp2pio_statemachine_obj_t *self, const uint16_t *instructions, size_t len);
-// // Reads and write len bytes simultaneously.
-// extern bool common_hal_rp2pio_statemachine_transfer(rp2pio_statemachine_obj_t *self,
-// const uint8_t *data_out, size_t out_len,
-// uint8_t *data_in, size_t in_len);
+// Writes out the given data.
+bool common_hal_rp2pio_statemachine_write(rp2pio_statemachine_obj_t *self, const uint8_t *data, size_t len, uint8_t stride_in_bytes);
+bool common_hal_rp2pio_statemachine_readinto(rp2pio_statemachine_obj_t *self, uint8_t *data, size_t len, uint8_t stride_in_bytes);
+bool common_hal_rp2pio_statemachine_write_readinto(rp2pio_statemachine_obj_t *self,
+ const uint8_t *data_out, size_t out_len, uint8_t out_stride_in_bytes,
+ uint8_t *data_in, size_t in_len, uint8_t in_stride_in_bytes);
-// Return actual SPI bus frequency.
+// Return actual state machine frequency.
uint32_t common_hal_rp2pio_statemachine_get_frequency(rp2pio_statemachine_obj_t* self);
+void common_hal_rp2pio_statemachine_set_frequency(rp2pio_statemachine_obj_t* self, uint32_t frequency);
-// This is used by the supervisor to claim SPI devices indefinitely.
-// extern void common_hal_rp2pio_statemachine_never_reset(rp2pio_statemachine_obj_t *self);
+bool common_hal_rp2pio_statemachine_get_rxstall(rp2pio_statemachine_obj_t* self);
+void common_hal_rp2pio_statemachine_clear_rxfifo(rp2pio_statemachine_obj_t *self);
#endif // MICROPY_INCLUDED_RASPBERRYPI_BINDINGS_RP2PIO_STATEMACHINE_H
diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2040/board.c b/ports/raspberrypi/boards/adafruit_feather_rp2040/board.c
index 8686f6d0c..c4021a83e 100644
--- a/ports/raspberrypi/boards/adafruit_feather_rp2040/board.c
+++ b/ports/raspberrypi/boards/adafruit_feather_rp2040/board.c
@@ -30,10 +30,6 @@
#include "src/rp2_common/hardware_gpio/include/hardware/gpio.h"
void board_init(void) {
- common_hal_never_reset_pin(&pin_GPIO17);
- gpio_init(17);
- gpio_set_dir(17, GPIO_OUT);
- gpio_put(17, true);
}
bool board_requests_safe_mode(void) {
diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2040/mpconfigboard.h b/ports/raspberrypi/boards/adafruit_feather_rp2040/mpconfigboard.h
index f491a7769..a3124c7e5 100644
--- a/ports/raspberrypi/boards/adafruit_feather_rp2040/mpconfigboard.h
+++ b/ports/raspberrypi/boards/adafruit_feather_rp2040/mpconfigboard.h
@@ -13,5 +13,5 @@
// #define DEFAULT_UART_BUS_RX (&pin_PA11)
// #define DEFAULT_UART_BUS_TX (&pin_PA10)
-// Flash chip is GD25Q32 connected over QSPI
-#define TOTAL_FLASH_SIZE (4 * 1024 * 1024)
+// Flash chip is GD25Q64 connected over QSPI
+#define TOTAL_FLASH_SIZE (8 * 1024 * 1024)
diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2040/pins.c b/ports/raspberrypi/boards/adafruit_feather_rp2040/pins.c
index 1617ac865..a558d7fe6 100644
--- a/ports/raspberrypi/boards/adafruit_feather_rp2040/pins.c
+++ b/ports/raspberrypi/boards/adafruit_feather_rp2040/pins.c
@@ -14,12 +14,12 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO1) },
{ MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO0) },
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO0) },
- { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO4) },
+ { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO6) },
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO2) },
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO3) },
- { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) },
- { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) },
+ { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO7) },
+ { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO8) },
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) },
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) },
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11) },
@@ -27,7 +27,6 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO13) },
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO16) },
- { MP_ROM_QSTR(MP_QSTR_NEOPIXEL_POWER), MP_ROM_PTR(&pin_GPIO17) },
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
diff --git a/ports/raspberrypi/boards/qtpy_rp2040/mpconfigboard.h b/ports/raspberrypi/boards/qtpy_rp2040/mpconfigboard.h
index 3f4778457..f5734b513 100644
--- a/ports/raspberrypi/boards/qtpy_rp2040/mpconfigboard.h
+++ b/ports/raspberrypi/boards/qtpy_rp2040/mpconfigboard.h
@@ -13,5 +13,5 @@
// #define DEFAULT_UART_BUS_RX (&pin_PA11)
// #define DEFAULT_UART_BUS_TX (&pin_PA10)
-// Flash chip is GD25Q32 connected over QSPI
-#define TOTAL_FLASH_SIZE (4 * 1024 * 1024)
+// Flash chip is GD25Q64 connected over QSPI
+#define TOTAL_FLASH_SIZE (8 * 1024 * 1024)
diff --git a/ports/raspberrypi/boards/raspberry_pi_pico/mpconfigboard.mk b/ports/raspberrypi/boards/raspberry_pi_pico/mpconfigboard.mk
index 54c130660..8d6ca5330 100644
--- a/ports/raspberrypi/boards/raspberry_pi_pico/mpconfigboard.mk
+++ b/ports/raspberrypi/boards/raspberry_pi_pico/mpconfigboard.mk
@@ -9,3 +9,5 @@ CHIP_FAMILY = rp2
INTERNAL_FLASH_FILESYSTEM = 1
CIRCUITPY__EVE = 1
+
+BOOT2_S_UPPER = sdk/src/rp2_common/boot_stage2/boot2_w25q080.S
diff --git a/ports/raspberrypi/bs2_default_padded_checksummed.S b/ports/raspberrypi/bs2_default_padded_checksummed.S
deleted file mode 100644
index 6b7074e3b..000000000
--- a/ports/raspberrypi/bs2_default_padded_checksummed.S
+++ /dev/null
@@ -1,23 +0,0 @@
-// Padded and checksummed version of: /home/pi/pico/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/bs2_default.bin
-
-.cpu cortex-m0plus
-.thumb
-
-.section .boot2, "ax"
-
-.byte 0x00, 0xb5, 0x32, 0x4b, 0x21, 0x20, 0x58, 0x60, 0x98, 0x68, 0x02, 0x21, 0x88, 0x43, 0x98, 0x60
-.byte 0xd8, 0x60, 0x18, 0x61, 0x58, 0x61, 0x2e, 0x4b, 0x00, 0x21, 0x99, 0x60, 0x02, 0x21, 0x59, 0x61
-.byte 0x01, 0x21, 0xf0, 0x22, 0x99, 0x50, 0x2b, 0x49, 0x19, 0x60, 0x01, 0x21, 0x99, 0x60, 0x35, 0x20
-.byte 0x00, 0xf0, 0x44, 0xf8, 0x02, 0x22, 0x90, 0x42, 0x14, 0xd0, 0x06, 0x21, 0x19, 0x66, 0x00, 0xf0
-.byte 0x34, 0xf8, 0x19, 0x6e, 0x01, 0x21, 0x19, 0x66, 0x00, 0x20, 0x18, 0x66, 0x1a, 0x66, 0x00, 0xf0
-.byte 0x2c, 0xf8, 0x19, 0x6e, 0x19, 0x6e, 0x19, 0x6e, 0x05, 0x20, 0x00, 0xf0, 0x2f, 0xf8, 0x01, 0x21
-.byte 0x08, 0x42, 0xf9, 0xd1, 0x00, 0x21, 0x99, 0x60, 0x1b, 0x49, 0x19, 0x60, 0x00, 0x21, 0x59, 0x60
-.byte 0x1a, 0x49, 0x1b, 0x48, 0x01, 0x60, 0x01, 0x21, 0x99, 0x60, 0xeb, 0x21, 0x19, 0x66, 0xa0, 0x21
-.byte 0x19, 0x66, 0x00, 0xf0, 0x12, 0xf8, 0x00, 0x21, 0x99, 0x60, 0x16, 0x49, 0x14, 0x48, 0x01, 0x60
-.byte 0x01, 0x21, 0x99, 0x60, 0x01, 0xbc, 0x00, 0x28, 0x00, 0xd0, 0x00, 0x47, 0x12, 0x48, 0x13, 0x49
-.byte 0x08, 0x60, 0x03, 0xc8, 0x80, 0xf3, 0x08, 0x88, 0x08, 0x47, 0x03, 0xb5, 0x99, 0x6a, 0x04, 0x20
-.byte 0x01, 0x42, 0xfb, 0xd0, 0x01, 0x20, 0x01, 0x42, 0xf8, 0xd1, 0x03, 0xbd, 0x02, 0xb5, 0x18, 0x66
-.byte 0x18, 0x66, 0xff, 0xf7, 0xf2, 0xff, 0x18, 0x6e, 0x18, 0x6e, 0x02, 0xbd, 0x00, 0x00, 0x02, 0x40
-.byte 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x5f, 0x00, 0x21, 0x22, 0x00, 0x00
-.byte 0xf4, 0x00, 0x00, 0x18, 0x22, 0x20, 0x00, 0xa0, 0x00, 0x01, 0x00, 0x10, 0x08, 0xed, 0x00, 0xe0
-.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0xb2, 0x4e, 0x7a
diff --git a/ports/raspberrypi/common-hal/audiobusio/I2SOut.c b/ports/raspberrypi/common-hal/audiobusio/I2SOut.c
new file mode 100644
index 000000000..83a443834
--- /dev/null
+++ b/ports/raspberrypi/common-hal/audiobusio/I2SOut.c
@@ -0,0 +1,224 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <stdint.h>
+#include <string.h>
+
+#include "mpconfigport.h"
+
+#include "py/gc.h"
+#include "py/mperrno.h"
+#include "py/runtime.h"
+#include "common-hal/audiobusio/I2SOut.h"
+#include "shared-bindings/audiobusio/I2SOut.h"
+#include "shared-bindings/microcontroller/Pin.h"
+#include "shared-module/audiocore/__init__.h"
+#include "bindings/rp2pio/StateMachine.h"
+#include "supervisor/shared/translate.h"
+
+const uint16_t i2s_program[] = {
+// ; Load the next set of samples
+// ; /--- LRCLK
+// ; |/-- BCLK
+// ; ||
+// pull noblock side 0b01 ; Loads OSR with the next FIFO value or X
+ 0x8880,
+// mov x osr side 0b01 ; Save the new value in case we need it again
+ 0xa827,
+// set y 14 side 0b01
+ 0xe84e,
+// bitloop1:
+// out pins 1 side 0b00 [2]
+ 0x6201,
+// jmp y-- bitloop1 side 0b01 [2]
+ 0x0a83,
+// out pins 1 side 0b10 [2]
+ 0x7201,
+// set y 14 side 0b11 [2]
+ 0xfa4e,
+// bitloop0:
+// out pins 1 side 0b10 [2]
+ 0x7201,
+// jmp y-- bitloop0 side 0b11 [2]
+ 0x1a87,
+// out pins 1 side 0b00 [2]
+ 0x6201
+};
+
+const uint16_t i2s_program_left_justified[] = {
+// ; Load the next set of samples
+// ; /--- LRCLK
+// ; |/-- BCLK
+// ; ||
+// pull noblock side 0b11 ; Loads OSR with the next FIFO value or X
+ 0x9880,
+// mov x osr side 0b11 ; Save the new value in case we need it again
+ 0xb827,
+// set y 14 side 0b11
+ 0xf84e,
+// bitloop1:
+// out pins 1 side 0b00 [2]
+ 0x6201,
+// jmp y-- bitloop1 side 0b01 [2]
+ 0x0a83,
+// out pins 1 side 0b10 [2]
+ 0x6201,
+// set y 14 side 0b01 [2]
+ 0xea4e,
+// bitloop0:
+// out pins 1 side 0b10 [2]
+ 0x7201,
+// jmp y-- bitloop0 side 0b11 [2]
+ 0x1a87,
+// out pins 1 side 0b10 [2]
+ 0x7201
+};
+
+void i2sout_reset(void) {
+}
+
+// Caller validates that pins are free.
+void common_hal_audiobusio_i2sout_construct(audiobusio_i2sout_obj_t* self,
+ const mcu_pin_obj_t* bit_clock, const mcu_pin_obj_t* word_select,
+ const mcu_pin_obj_t* data, bool left_justified) {
+ if (bit_clock->number != word_select->number - 1) {
+ mp_raise_ValueError(translate("Bit clock and word select must be sequential pins"));
+ }
+
+ const uint16_t* program = i2s_program;
+ size_t program_len = sizeof(i2s_program) / sizeof(i2s_program[0]);
+ if (left_justified) {
+ program = i2s_program_left_justified;
+ program_len = sizeof(i2s_program_left_justified) / sizeof(i2s_program_left_justified[0]);;
+ }
+
+ // Use the state machine to manage pins.
+ common_hal_rp2pio_statemachine_construct(&self->state_machine,
+ program, program_len,
+ 44100 * 32 * 6, // Clock at 44.1 khz to warm the DAC up.
+ NULL, 0,
+ data, 1, 0, 0xffffffff, // out pin
+ NULL, 0, // in pins
+ NULL, 0, 0, 0x1f, // set pins
+ bit_clock, 2, 0, 0x1f, // sideset pins
+ true, // exclusive pin use
+ false, 32, false, // shift out left to start with MSB
+ false, // Wait for txstall
+ false, 32, false); // in settings
+
+ self->playing = false;
+ audio_dma_init(&self->dma);
+}
+
+bool common_hal_audiobusio_i2sout_deinited(audiobusio_i2sout_obj_t* self) {
+ return common_hal_rp2pio_statemachine_deinited(&self->state_machine);
+}
+
+void common_hal_audiobusio_i2sout_deinit(audiobusio_i2sout_obj_t* self) {
+ if (common_hal_audiobusio_i2sout_deinited(self)) {
+ return;
+ }
+
+ common_hal_rp2pio_statemachine_deinit(&self->state_machine);
+}
+
+void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t* self,
+ mp_obj_t sample, bool loop) {
+ if (common_hal_audiobusio_i2sout_get_playing(self)) {
+ common_hal_audiobusio_i2sout_stop(self);
+ }
+ uint8_t bits_per_sample = audiosample_bits_per_sample(sample);
+ // Make sure we transmit a minimum of 16 bits.
+ // TODO: Maybe we need an intermediate object to upsample instead. This is
+ // only needed for some I2S devices that expect at least 8.
+ if (bits_per_sample < 16) {
+ bits_per_sample = 16;
+ }
+ // We always output stereo so output twice as many bits.
+ uint16_t bits_per_sample_output = bits_per_sample * 2;
+ size_t clocks_per_bit = 6;
+ uint32_t frequency = bits_per_sample_output * audiosample_sample_rate(sample);
+ common_hal_rp2pio_statemachine_set_frequency(&self->state_machine, clocks_per_bit * frequency);
+ common_hal_rp2pio_statemachine_restart(&self->state_machine);
+
+ uint8_t channel_count = audiosample_channel_count(sample);
+ if (channel_count > 2) {
+ mp_raise_ValueError(translate("Too many channels in sample."));
+ }
+
+ audio_dma_result result = audio_dma_setup_playback(
+ &self->dma,
+ sample,
+ loop,
+ false, // single channel
+ 0, // audio channel
+ true, // output signed
+ bits_per_sample,
+ (uint32_t) &self->state_machine.pio->txf[self->state_machine.state_machine], // output register
+ self->state_machine.tx_dreq); // data request line
+
+ if (result == AUDIO_DMA_DMA_BUSY) {
+ common_hal_audiobusio_i2sout_stop(self);
+ mp_raise_RuntimeError(translate("No DMA channel found"));
+ } else if (result == AUDIO_DMA_MEMORY_ERROR) {
+ common_hal_audiobusio_i2sout_stop(self);
+ mp_raise_RuntimeError(translate("Unable to allocate buffers for signed conversion"));
+ }
+
+ // Turn on the state machine's clock.
+
+ self->playing = true;
+}
+
+void common_hal_audiobusio_i2sout_pause(audiobusio_i2sout_obj_t* self) {
+ audio_dma_pause(&self->dma);
+}
+
+void common_hal_audiobusio_i2sout_resume(audiobusio_i2sout_obj_t* self) {
+ // Maybe: Clear any overrun/underrun errors
+
+ audio_dma_resume(&self->dma);
+}
+
+bool common_hal_audiobusio_i2sout_get_paused(audiobusio_i2sout_obj_t* self) {
+ return audio_dma_get_paused(&self->dma);
+}
+
+void common_hal_audiobusio_i2sout_stop(audiobusio_i2sout_obj_t* self) {
+ audio_dma_stop(&self->dma);
+
+ common_hal_rp2pio_statemachine_stop(&self->state_machine);
+
+ self->playing = false;
+}
+
+bool common_hal_audiobusio_i2sout_get_playing(audiobusio_i2sout_obj_t* self) {
+ bool playing = audio_dma_get_playing(&self->dma);
+ if (!playing && self->playing) {
+ common_hal_audiobusio_i2sout_stop(self);
+ }
+ return playing;
+}
diff --git a/ports/raspberrypi/common-hal/audiobusio/I2SOut.h b/ports/raspberrypi/common-hal/audiobusio/I2SOut.h
new file mode 100644
index 000000000..851e86c8a
--- /dev/null
+++ b/ports/raspberrypi/common-hal/audiobusio/I2SOut.h
@@ -0,0 +1,47 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_AUDIOBUSIO_I2SOUT_H
+#define MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_AUDIOBUSIO_I2SOUT_H
+
+#include "common-hal/microcontroller/Pin.h"
+#include "common-hal/rp2pio/StateMachine.h"
+
+#include "audio_dma.h"
+#include "py/obj.h"
+
+// We don't bit pack because we'll only have two at most. Its better to save code size instead.
+typedef struct {
+ mp_obj_base_t base;
+ bool left_justified;
+ rp2pio_statemachine_obj_t state_machine;
+ bool playing;
+ audio_dma_t dma;
+} audiobusio_i2sout_obj_t;
+
+void i2sout_reset(void);
+
+#endif // MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_AUDIOBUSIO_I2SOUT_H
diff --git a/ports/raspberrypi/common-hal/audiobusio/PDMIn.c b/ports/raspberrypi/common-hal/audiobusio/PDMIn.c
new file mode 100644
index 000000000..ffe09326f
--- /dev/null
+++ b/ports/raspberrypi/common-hal/audiobusio/PDMIn.c
@@ -0,0 +1,172 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <stdint.h>
+#include <string.h>
+#include <math.h>
+
+#include "py/mperrno.h"
+#include "py/runtime.h"
+#include "shared-bindings/audiobusio/PDMIn.h"
+#include "shared-bindings/microcontroller/Pin.h"
+#include "supervisor/shared/translate.h"
+
+#include "audio_dma.h"
+
+#define OVERSAMPLING 64
+#define SAMPLES_PER_BUFFER 32
+
+// MEMS microphones must be clocked at at least 1MHz.
+#define MIN_MIC_CLOCK 1000000
+
+const uint16_t pdmin[] = {
+ // in pins 1 side 0b1
+ 0x5001,
+ // push iffull side 0b0
+ 0x8040
+};
+
+// Caller validates that pins are free.
+void common_hal_audiobusio_pdmin_construct(audiobusio_pdmin_obj_t* self,
+ const mcu_pin_obj_t* clock_pin,
+ const mcu_pin_obj_t* data_pin,
+ uint32_t sample_rate,
+ uint8_t bit_depth,
+ bool mono,
+ uint8_t oversample) {
+ if (!(bit_depth == 16 || bit_depth == 8) || !mono || oversample != OVERSAMPLING) {
+ mp_raise_NotImplementedError(translate("Only 8 or 16 bit mono with " MP_STRINGIFY(OVERSAMPLING) "x oversampling is supported."));
+ }
+
+ // Use the state machine to manage pins.
+ common_hal_rp2pio_statemachine_construct(&self->state_machine,
+ pdmin, sizeof(pdmin) / sizeof(pdmin[0]),
+ 44100 * 32 * 2, // Clock at 44.1 khz to warm the DAC up.
+ NULL, 0,
+ NULL, 1, 0, 0xffffffff, // out pin
+ data_pin, 1, // in pins
+ NULL, 0, 0, 0x1f, // set pins
+ clock_pin, 1, 0, 0x1f, // sideset pins
+ true, // exclusive pin use
+ false, 32, false, // out settings
+ false, // Wait for txstall
+ false, 32, true); // in settings
+
+ uint32_t actual_frequency = common_hal_rp2pio_statemachine_get_frequency(&self->state_machine);
+ if (actual_frequency < MIN_MIC_CLOCK) {
+ mp_raise_ValueError(translate("sampling rate out of range"));
+ }
+
+ self->sample_rate = actual_frequency / oversample;
+ self->bit_depth = bit_depth;
+}
+
+bool common_hal_audiobusio_pdmin_deinited(audiobusio_pdmin_obj_t* self) {
+ return common_hal_rp2pio_statemachine_deinited(&self->state_machine);
+}
+
+void common_hal_audiobusio_pdmin_deinit(audiobusio_pdmin_obj_t* self) {
+ if (common_hal_audiobusio_pdmin_deinited(self)) {
+ return;
+ }
+}
+
+uint8_t common_hal_audiobusio_pdmin_get_bit_depth(audiobusio_pdmin_obj_t* self) {
+ return self->bit_depth;
+}
+
+uint32_t common_hal_audiobusio_pdmin_get_sample_rate(audiobusio_pdmin_obj_t* self) {
+ return self->sample_rate;
+}
+
+// a windowed sinc filter for 44 khz, 64 samples
+//
+// This filter is good enough to use for lower sample rates as
+// well. It does not increase the noise enough to be a problem.
+//
+// In the long run we could use a fast filter like this to do the
+// decimation and initial filtering in real time, filtering to a
+// higher sample rate than specified. Then after the audio is
+// recorded, a more expensive filter non-real-time filter could be
+// used to down-sample and low-pass.
+const uint16_t sinc_filter [OVERSAMPLING] = {
+ 0, 2, 9, 21, 39, 63, 94, 132,
+ 179, 236, 302, 379, 467, 565, 674, 792,
+ 920, 1055, 1196, 1341, 1487, 1633, 1776, 1913,
+ 2042, 2159, 2263, 2352, 2422, 2474, 2506, 2516,
+ 2506, 2474, 2422, 2352, 2263, 2159, 2042, 1913,
+ 1776, 1633, 1487, 1341, 1196, 1055, 920, 792,
+ 674, 565, 467, 379, 302, 236, 179, 132,
+ 94, 63, 39, 21, 9, 2, 0, 0
+};
+
+#define REPEAT_32_TIMES(X) do { X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X } while(0)
+
+static uint16_t filter_sample(uint32_t pdm_samples[2]) {
+ uint16_t running_sum = 0;
+ const uint16_t *filter_ptr = sinc_filter;
+ for (uint8_t i = 0; i < 2; i++) {
+ uint32_t pdm_sample = pdm_samples[i];
+ REPEAT_32_TIMES( {
+ if (pdm_sample & 0x1) {
+ running_sum += *filter_ptr;
+ }
+ filter_ptr++;
+ pdm_sample >>= 1;
+ }
+ );
+ }
+ return running_sum;
+}
+
+// output_buffer may be a byte buffer or a halfword buffer.
+// output_buffer_length is the number of slots, not the number of bytes.
+uint32_t common_hal_audiobusio_pdmin_record_to_buffer(audiobusio_pdmin_obj_t* self,
+ uint16_t* output_buffer, uint32_t output_buffer_length) {
+ uint32_t samples[2];
+ size_t output_count = 0;
+ common_hal_rp2pio_statemachine_clear_rxfifo(&self->state_machine);
+ // Do one read to get the mic going and throw it away.
+ common_hal_rp2pio_statemachine_readinto(&self->state_machine, (uint8_t*) samples, 2 * sizeof(uint32_t), sizeof(uint32_t));
+ while (output_count < output_buffer_length && !common_hal_rp2pio_statemachine_get_rxstall(&self->state_machine)) {
+ common_hal_rp2pio_statemachine_readinto(&self->state_machine, (uint8_t*) samples, 2 * sizeof(uint32_t), sizeof(uint32_t));
+ // Call filter_sample just one place so it can be inlined.
+ uint16_t value = filter_sample(samples);
+ if (self->bit_depth == 8) {
+ // Truncate to 8 bits.
+ ((uint8_t*) output_buffer)[output_count] = value >> 8;
+ } else {
+ output_buffer[output_count] = value;
+ }
+ output_count++;
+ }
+
+ return output_count;
+}
+
+void common_hal_audiobusio_pdmin_record_to_file(audiobusio_pdmin_obj_t* self, uint8_t* buffer, uint32_t length) {
+
+}
diff --git a/ports/raspberrypi/common-hal/audiobusio/PDMIn.h b/ports/raspberrypi/common-hal/audiobusio/PDMIn.h
new file mode 100644
index 000000000..995ffb5d7
--- /dev/null
+++ b/ports/raspberrypi/common-hal/audiobusio/PDMIn.h
@@ -0,0 +1,50 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_AUDIOBUSIO_AUDIOOUT_H
+#define MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_AUDIOBUSIO_AUDIOOUT_H
+
+#include "common-hal/microcontroller/Pin.h"
+#include "bindings/rp2pio/StateMachine.h"
+
+#include "extmod/vfs_fat.h"
+#include "py/obj.h"
+
+typedef struct {
+ mp_obj_base_t base;
+ uint32_t sample_rate;
+ uint8_t serializer;
+ uint8_t clock_unit;
+ uint8_t bytes_per_sample;
+ uint8_t bit_depth;
+ rp2pio_statemachine_obj_t state_machine;
+} audiobusio_pdmin_obj_t;
+
+void pdmin_reset(void);
+
+void pdmin_background(void);
+
+#endif // MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_AUDIOBUSIO_AUDIOOUT_H
diff --git a/ports/raspberrypi/common-hal/audiobusio/__init__.c b/ports/raspberrypi/common-hal/audiobusio/__init__.c
new file mode 100644
index 000000000..87db40496
--- /dev/null
+++ b/ports/raspberrypi/common-hal/audiobusio/__init__.c
@@ -0,0 +1 @@
+// No audiobusio module functions.
diff --git a/ports/raspberrypi/common-hal/busio/UART.c b/ports/raspberrypi/common-hal/busio/UART.c
index f9a75b499..1bc121177 100644
--- a/ports/raspberrypi/common-hal/busio/UART.c
+++ b/ports/raspberrypi/common-hal/busio/UART.c
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries
+ * Copyright (c) 2021 microDev
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -24,238 +24,184 @@
* THE SOFTWARE.
*/
-#include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/busio/UART.h"
-#include "mpconfigport.h"
-#include "lib/utils/interrupt_char.h"
-#include "py/gc.h"
+#include "py/stream.h"
#include "py/mperrno.h"
#include "py/runtime.h"
-#include "py/stream.h"
-#include "supervisor/shared/translate.h"
#include "supervisor/shared/tick.h"
+#include "lib/utils/interrupt_char.h"
+#include "common-hal/microcontroller/Pin.h"
-#define UART_DEBUG(...) (void)0
-// #define UART_DEBUG(...) mp_printf(&mp_plat_print __VA_OPT__(,) __VA_ARGS__)
-
-// Do-nothing callback needed so that usart_async code will enable rx interrupts.
-// See comment below re usart_async_register_callback()
-// static void usart_async_rxc_callback(const struct usart_async_descriptor *const descr) {
-// // Nothing needs to be done by us.
-// }
+#include "src/rp2_common/hardware_irq/include/hardware/irq.h"
+#include "src/rp2_common/hardware_gpio/include/hardware/gpio.h"
#define NO_PIN 0xff
+#define UART_INST(uart) (((uart) ? uart1 : uart0))
+
+typedef enum {
+ STATUS_FREE = 0,
+ STATUS_BUSY,
+ STATUS_NEVER_RESET
+} uart_status_t;
+
+static uart_status_t uart_status[NUM_UARTS];
+
+void reset_uart(void) {
+ for (uint8_t num = 0; num < NUM_UARTS; num++) {
+ if (uart_status[num] == STATUS_BUSY) {
+ uart_status[num] = STATUS_FREE;
+ uart_deinit(UART_INST(num));
+ }
+ }
+}
+
+void never_reset_uart(uint8_t num) {
+ uart_status[num] = STATUS_NEVER_RESET;
+}
+
+static uint8_t pin_init(const uint8_t uart, const mcu_pin_obj_t * pin, const uint8_t pin_type) {
+ if (pin == NULL) {
+ return NO_PIN;
+ }
+ if (!(((pin->number % 4) == pin_type) && ((((pin->number + 4) / 8) % NUM_UARTS) == uart))) {
+ mp_raise_ValueError(translate("Invalid pins"));
+ }
+ claim_pin(pin);
+ gpio_set_function(pin->number, GPIO_FUNC_UART);
+ return pin->number;
+}
+
+static busio_uart_obj_t* active_uarts[NUM_UARTS];
+
+static void _copy_into_ringbuf(ringbuf_t* r, uart_inst_t* uart) {
+ while (uart_is_readable(uart) && ringbuf_num_empty(r) > 0) {
+ ringbuf_put(r, (uint8_t) uart_get_hw(uart)->dr);
+ }
+}
+
+static void shared_callback(busio_uart_obj_t *self) {
+ _copy_into_ringbuf(&self->ringbuf, self->uart);
+ // We always clear the interrupt so it doesn't continue to fire because we
+ // may not have read everything available.
+ uart_get_hw(self->uart)->icr = UART_UARTICR_RXIC_BITS;
+}
+
+static void uart0_callback(void) {
+ shared_callback(active_uarts[0]);
+}
+
+static void uart1_callback(void) {
+ shared_callback(active_uarts[1]);
+}
+
void common_hal_busio_uart_construct(busio_uart_obj_t *self,
- const mcu_pin_obj_t * tx, const mcu_pin_obj_t * rx,
- const mcu_pin_obj_t * rts, const mcu_pin_obj_t * cts,
- const mcu_pin_obj_t * rs485_dir, bool rs485_invert,
- uint32_t baudrate, uint8_t bits, busio_uart_parity_t parity, uint8_t stop,
- mp_float_t timeout, uint16_t receiver_buffer_size, byte* receiver_buffer,
- bool sigint_enabled) {
- mp_raise_NotImplementedError(translate("UART not yet supported"));
-
-// Sercom* sercom = NULL;
-// uint8_t sercom_index = 255; // Unset index
-// uint32_t rx_pinmux = 0;
-// uint8_t rx_pad = 255; // Unset pad
-// uint32_t tx_pinmux = 0;
-// uint8_t tx_pad = 255; // Unset pad
-
-// if ((rts != NULL) || (cts != NULL) || (rs485_dir != NULL) || (rs485_invert)) {
-// mp_raise_ValueError(translate("RTS/CTS/RS485 Not yet supported on this device"));
-// }
-
-// if (bits > 8) {
-// mp_raise_NotImplementedError(translate("bytes > 8 bits not supported"));
-// }
-
-// bool have_tx = tx != NULL;
-// bool have_rx = rx != NULL;
-// if (!have_tx && !have_rx) {
-// mp_raise_ValueError(translate("tx and rx cannot both be None"));
-// }
-
-// self->baudrate = baudrate;
-// self->character_bits = bits;
-// self->timeout_ms = timeout * 1000;
-
-// // This assignment is only here because the usart_async routines take a *const argument.
-// struct usart_async_descriptor * const usart_desc_p = (struct usart_async_descriptor * const) &self->usart_desc;
-
-// for (int i = 0; i < NUM_SERCOMS_PER_PIN; i++) {
-// Sercom* potential_sercom = NULL;
-// if (have_tx) {
-// sercom_index = tx->sercom[i].index;
-// if (sercom_index >= SERCOM_INST_NUM) {
-// continue;
-// }
-// potential_sercom = sercom_insts[sercom_index];
-// #ifdef SAMD21
-// if (potential_sercom->USART.CTRLA.bit.ENABLE != 0 ||
-// !(tx->sercom[i].pad == 0 ||
-// tx->sercom[i].pad == 2)) {
-// continue;
-// }
-// #endif
-// #ifdef SAM_D5X_E5X
-// if (potential_sercom->USART.CTRLA.bit.ENABLE != 0 ||
-// !(tx->sercom[i].pad == 0)) {
-// continue;
-// }
-// #endif
-// tx_pinmux = PINMUX(tx->number, (i == 0) ? MUX_C : MUX_D);
-// tx_pad = tx->sercom[i].pad;
-// if (rx == NULL) {
-// sercom = potential_sercom;
-// break;
-// }
-// }
-// for (int j = 0; j < NUM_SERCOMS_PER_PIN; j++) {
-// if (((!have_tx && rx->sercom[j].index < SERCOM_INST_NUM &&
-// sercom_insts[rx->sercom[j].index]->USART.CTRLA.bit.ENABLE == 0) ||
-// sercom_index == rx->sercom[j].index) &&
-// rx->sercom[j].pad != tx_pad) {
-// rx_pinmux = PINMUX(rx->number, (j == 0) ? MUX_C : MUX_D);
-// rx_pad = rx->sercom[j].pad;
-// sercom = sercom_insts[rx->sercom[j].index];
-// sercom_index = rx->sercom[j].index;
-// break;
-// }
-// }
-// if (sercom != NULL) {
-// break;
-// }
-// }
-// if (sercom == NULL) {
-// mp_raise_ValueError(translate("Invalid pins"));
-// }
-// if (!have_tx) {
-// tx_pad = 0;
-// if (rx_pad == 0) {
-// tx_pad = 2;
-// }
-// }
-// if (!have_rx) {
-// rx_pad = (tx_pad + 1) % 4;
-// }
-
-// // Set up clocks on SERCOM.
-// samd_peripherals_sercom_clock_init(sercom, sercom_index);
-
-// if (rx && receiver_buffer_size > 0) {
-// self->buffer_length = receiver_buffer_size;
-// // Initially allocate the UART's buffer in the long-lived part of the
-// // heap. UARTs are generally long-lived objects, but the "make long-
-// // lived" machinery is incapable of moving internal pointers like
-// // self->buffer, so do it manually. (However, as long as internal
-// // pointers like this are NOT moved, allocating the buffer
-// // in the long-lived pool is not strictly necessary)
-// self->buffer = (uint8_t *) gc_alloc(self->buffer_length * sizeof(uint8_t), false, true);
-// if (self->buffer == NULL) {
-// common_hal_busio_uart_deinit(self);
-// mp_raise_msg_varg(&mp_type_MemoryError, translate("Failed to allocate RX buffer of %d bytes"), self->buffer_length * sizeof(uint8_t));
-// }
-// } else {
-// self->buffer_length = 0;
-// self->buffer = NULL;
-// }
-
-// if (usart_async_init(usart_desc_p, sercom, self->buffer, self->buffer_length, NULL) != ERR_NONE) {
-// mp_raise_ValueError(translate("Could not initialize UART"));
-// }
-
-// // usart_async_init() sets a number of defaults based on a prototypical SERCOM
-// // which don't necessarily match what we need. After calling it, set the values
-// // specific to this instantiation of UART.
-
-// // Set pads computed for this SERCOM.
-// // TXPO:
-// // 0x0: TX pad 0; no RTS/CTS
-// // 0x1: TX pad 2; no RTS/CTS
-// // 0x2: TX pad 0; RTS: pad 2, CTS: pad 3 (not used by us right now)
-// // So divide by 2 to map pad to value.
-// // RXPO:
-// // 0x0: RX pad 0
-// // 0x1: RX pad 1
-// // 0x2: RX pad 2
-// // 0x3: RX pad 3
-
-// // Doing a group mask and set of the registers saves 60 bytes over setting the bitfields individually.
-
-// sercom->USART.CTRLA.reg &= ~(SERCOM_USART_CTRLA_TXPO_Msk |
-// SERCOM_USART_CTRLA_RXPO_Msk |
-// SERCOM_USART_CTRLA_FORM_Msk);
-// sercom->USART.CTRLA.reg |= SERCOM_USART_CTRLA_TXPO(tx_pad / 2) |
-// SERCOM_USART_CTRLA_RXPO(rx_pad) |
-// (parity == BUSIO_UART_PARITY_NONE ? 0 : SERCOM_USART_CTRLA_FORM(1));
-
-// // Enable tx and/or rx based on whether the pins were specified.
-// // CHSIZE is 0 for 8 bits, 5, 6, 7 for 5, 6, 7 bits. 1 for 9 bits, but we don't support that.
-// sercom->USART.CTRLB.reg &= ~(SERCOM_USART_CTRLB_TXEN |
-// SERCOM_USART_CTRLB_RXEN |
-// SERCOM_USART_CTRLB_PMODE |
-// SERCOM_USART_CTRLB_SBMODE |
-// SERCOM_USART_CTRLB_CHSIZE_Msk);
-// sercom->USART.CTRLB.reg |= (have_tx ? SERCOM_USART_CTRLB_TXEN : 0) |
-// (have_rx ? SERCOM_USART_CTRLB_RXEN : 0) |
-// (parity == BUSIO_UART_PARITY_ODD ? SERCOM_USART_CTRLB_PMODE : 0) |
-// (stop > 1 ? SERCOM_USART_CTRLB_SBMODE : 0) |
-// SERCOM_USART_CTRLB_CHSIZE(bits % 8);
-
-// // Set baud rate
-// common_hal_busio_uart_set_baudrate(self, baudrate);
-
-// // Turn on rx interrupt handling. The UART async driver has its own set of internal callbacks,
-// // which are set up by uart_async_init(). These in turn can call user-specified callbacks.
-// // In fact, the actual interrupts are not enabled unless we set up a user-specified callback.
-// // This is confusing. It's explained in the Atmel START User Guide -> Implementation Description ->
-// // Different read function behavior in some asynchronous drivers. As of this writing:
-// // http://start.atmel.com/static/help/index.html?GUID-79201A5A-226F-4FBB-B0B8-AB0BE0554836
-// // Look at the ASFv4 code example for async USART.
-// usart_async_register_callback(usart_desc_p, USART_ASYNC_RXC_CB, usart_async_rxc_callback);
-
-
-// if (have_tx) {
-// gpio_set_pin_direction(tx->number, GPIO_DIRECTION_OUT);
-// gpio_set_pin_pull_mode(tx->number, GPIO_PULL_OFF);
-// gpio_set_pin_function(tx->number, tx_pinmux);
-// self->tx_pin = tx->number;
-// claim_pin(tx);
-// } else {
-// self->tx_pin = NO_PIN;
-// }
-
-// if (have_rx) {
-// gpio_set_pin_direction(rx->number, GPIO_DIRECTION_IN);
-// gpio_set_pin_pull_mode(rx->number, GPIO_PULL_OFF);
-// gpio_set_pin_function(rx->number, rx_pinmux);
-// self->rx_pin = rx->number;
-// claim_pin(rx);
-// } else {
-// self->rx_pin = NO_PIN;
-// }
-
-// usart_async_enable(usart_desc_p);
+ const mcu_pin_obj_t * tx, const mcu_pin_obj_t * rx,
+ const mcu_pin_obj_t * rts, const mcu_pin_obj_t * cts,
+ const mcu_pin_obj_t * rs485_dir, bool rs485_invert,
+ uint32_t baudrate, uint8_t bits, busio_uart_parity_t parity, uint8_t stop,
+ mp_float_t timeout, uint16_t receiver_buffer_size, byte* receiver_buffer,
+ bool sigint_enabled) {
+
+ if (bits > 8) {
+ mp_raise_ValueError(translate("Invalid word/bit length"));
+ }
+
+ if (receiver_buffer_size == 0) {
+ mp_raise_ValueError(translate("Invalid buffer size"));
+ }
+
+ if ((rs485_dir != NULL) || (rs485_invert)) {
+ mp_raise_NotImplementedError(translate("RS485 Not yet supported on this device"));
+ }
+
+ uint8_t uart_id = ((((tx != NULL) ? tx->number : rx->number) + 4) / 8) % NUM_UARTS;
+
+ if (uart_status[uart_id] != STATUS_FREE) {
+ mp_raise_RuntimeError(translate("All UART peripherals are in use"));
+ } else {
+ uart_status[uart_id] = STATUS_BUSY;
+ }
+
+ self->tx_pin = pin_init(uart_id, tx, 0);
+ self->rx_pin = pin_init(uart_id, rx, 1);
+ self->cts_pin = pin_init(uart_id, cts, 2);
+ self->rts_pin = pin_init(uart_id, rts, 3);
+
+ self->uart = UART_INST(uart_id);
+ self->uart_id = uart_id;
+ self->baudrate = baudrate;
+ self->timeout_ms = timeout * 1000;
+
+ uart_init(self->uart, self->baudrate);
+ uart_set_fifo_enabled(self->uart, true);
+ uart_set_format(self->uart, bits, stop, parity);
+ uart_set_hw_flow(self->uart, (cts != NULL), (rts != NULL));
+
+ if (rx != NULL) {
+ // Initially allocate the UART's buffer in the long-lived part of the
+ // heap. UARTs are generally long-lived objects, but the "make long-
+ // lived" machinery is incapable of moving internal pointers like
+ // self->buffer, so do it manually. (However, as long as internal
+ // pointers like this are NOT moved, allocating the buffer
+ // in the long-lived pool is not strictly necessary)
+ // (This is a macro.)
+ if (!ringbuf_alloc(&self->ringbuf, receiver_buffer_size, true)) {
+ mp_raise_msg(&mp_type_MemoryError, translate("Failed to allocate RX buffer"));
+ }
+ active_uarts[uart_id] = self;
+ if (uart_id == 1) {
+ self->uart_irq_id = UART1_IRQ;
+ irq_set_exclusive_handler(self->uart_irq_id, uart1_callback);
+ } else {
+ self->uart_irq_id = UART0_IRQ;
+ irq_set_exclusive_handler(self->uart_irq_id, uart0_callback);
+ }
+ irq_set_enabled(self->uart_irq_id, true);
+ uart_set_irq_enables(self->uart, true /* rx has data */, false /* tx needs data */);
+ }
}
bool common_hal_busio_uart_deinited(busio_uart_obj_t *self) {
- return self->rx_pin == NO_PIN && self->tx_pin == NO_PIN;
+ return self->tx_pin == NO_PIN && self->rx_pin == NO_PIN;
}
void common_hal_busio_uart_deinit(busio_uart_obj_t *self) {
if (common_hal_busio_uart_deinited(self)) {
return;
}
- // This assignment is only here because the usart_async routines take a *const argument.
- // struct usart_async_descriptor * const usart_desc_p = (struct usart_async_descriptor * const) &self->usart_desc;
- // usart_async_disable(usart_desc_p);
- // usart_async_deinit(usart_desc_p);
- reset_pin_number(self->rx_pin);
+ uart_deinit(self->uart);
+ ringbuf_free(&self->ringbuf);
+ active_uarts[self->uart_id] = NULL;
+ uart_status[self->uart_id] = STATUS_FREE;
reset_pin_number(self->tx_pin);
- self->rx_pin = NO_PIN;
+ reset_pin_number(self->rx_pin);
+ reset_pin_number(self->cts_pin);
+ reset_pin_number(self->rts_pin);
self->tx_pin = NO_PIN;
+ self->rx_pin = NO_PIN;
+ self->cts_pin = NO_PIN;
+ self->rts_pin = NO_PIN;
+}
+
+// Write characters.
+size_t common_hal_busio_uart_write(busio_uart_obj_t *self, const uint8_t *data, size_t len, int *errcode) {
+ if (self->tx_pin == NO_PIN) {
+ mp_raise_ValueError(translate("No TX pin"));
+ }
+
+ while (len > 0) {
+ while (uart_is_writable(self->uart) && len > 0) {
+ // Write and advance.
+ uart_get_hw(self->uart)->dr = *data++;
+ // Decrease how many chars left to write.
+ len--;
+ }
+ RUN_BACKGROUND_TASKS;
+ }
+
+ return len;
}
// Read characters.
@@ -264,87 +210,56 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t
mp_raise_ValueError(translate("No RX pin"));
}
- // This assignment is only here because the usart_async routines take a *const argument.
- // struct usart_async_descriptor * const usart_desc_p = (struct usart_async_descriptor * const) &self->usart_desc;
-
if (len == 0) {
// Nothing to read.
return 0;
}
- // struct io_descriptor *io;
- // usart_async_get_io_descriptor(usart_desc_p, &io);
-
- size_t total_read = 0;
- // uint64_t start_ticks = supervisor_ticks_ms64();
-
- // // Busy-wait until timeout or until we've read enough chars.
- // while (supervisor_ticks_ms64() - start_ticks <= self->timeout_ms) {
- // // Read as many chars as we can right now, up to len.
- // size_t num_read = io_read(io, data, len);
-
- // // Advance pointer in data buffer, and decrease how many chars left to read.
- // data += num_read;
- // len -= num_read;
- // total_read += num_read;
- // if (len == 0) {
- // // Don't need to read any more: data buf is full.
- // break;
- // }
- // if (num_read > 0) {
- // // Reset the timeout on every character read.
- // start_ticks = supervisor_ticks_ms64();
- // }
- // RUN_BACKGROUND_TASKS;
- // // Allow user to break out of a timeout with a KeyboardInterrupt.
- // if (mp_hal_is_interrupted()) {
- // break;
- // }
- // // If we are zero timeout, make sure we don't loop again (in the event
- // // we read in under 1ms)
- // if (self->timeout_ms == 0) {
- // break;
- // }
- // }
-
- // if (total_read == 0) {
- // *errcode = EAGAIN;
- // return MP_STREAM_ERROR;
- // }
+ // Prevent conflict with uart irq.
+ irq_set_enabled(self->uart_irq_id, false);
+
+ // Copy as much received data as available, up to len bytes.
+ size_t total_read = ringbuf_get_n(&self->ringbuf, data, len);
+
+ // Check if we still need to read more data.
+ if (len > total_read) {
+ len-=total_read;
+ uint64_t start_ticks = supervisor_ticks_ms64();
+ // Busy-wait until timeout or until we've read enough chars.
+ while (len > 0 && (supervisor_ticks_ms64() - start_ticks < self->timeout_ms)) {
+ if (uart_is_readable(self->uart)) {
+ // Read and advance.
+ data[total_read] = uart_get_hw(self->uart)->dr;
+
+ // Adjust the counters.
+ len--;
+ total_read++;
+
+ // Reset the timeout on every character read.
+ start_ticks = supervisor_ticks_ms64();
+ }
+ RUN_BACKGROUND_TASKS;
+ // Allow user to break out of a timeout with a KeyboardInterrupt.
+ if (mp_hal_is_interrupted()) {
+ break;
+ }
+ }
+ }
- return total_read;
-}
+ // Now that we've emptied the ringbuf some, fill it up with anything in the
+ // FIFO. This ensures that we'll empty the FIFO as much as possible and
+ // reset the interrupt when we catch up.
+ _copy_into_ringbuf(&self->ringbuf, self->uart);
-// Write characters.
-size_t common_hal_busio_uart_write(busio_uart_obj_t *self, const uint8_t *data, size_t len, int *errcode) {
- if (self->tx_pin == NO_PIN) {
- mp_raise_ValueError(translate("No TX pin"));
- }
+ // Re-enable irq.
+ irq_set_enabled(self->uart_irq_id, true);
- // This assignment is only here because the usart_async routines take a *const argument.
- // struct usart_async_descriptor * const usart_desc_p = (struct usart_async_descriptor * const) &self->usart_desc;
-
- // struct io_descriptor *io;
- // usart_async_get_io_descriptor(usart_desc_p, &io);
-
- // // Start writing characters. This is non-blocking and will
- // // return immediately after setting up the write.
- // if (io_write(io, data, len) < 0) {
- // *errcode = MP_EAGAIN;
- // return MP_STREAM_ERROR;
- // }
-
- // // Busy-wait until all characters transmitted.
- // struct usart_async_status async_status;
- // while (true) {
- // usart_async_get_status(usart_desc_p, &async_status);
- // if (async_status.txcnt >= len) {
- // break;
- // }
- // RUN_BACKGROUND_TASKS;
- // }
+ if (total_read == 0) {
+ *errcode = EAGAIN;
+ return MP_STREAM_ERROR;
+ }
- return len;
+ return total_read;
}
uint32_t common_hal_busio_uart_get_baudrate(busio_uart_obj_t *self) {
@@ -352,18 +267,8 @@ uint32_t common_hal_busio_uart_get_baudrate(busio_uart_obj_t *self) {
}
void common_hal_busio_uart_set_baudrate(busio_uart_obj_t *self, uint32_t baudrate) {
- // This assignment is only here because the usart_async routines take a *const argument.
- // struct usart_async_descriptor * const usart_desc_p = (struct usart_async_descriptor * const) &self->usart_desc;
- // usart_async_set_baud_rate(usart_desc_p,
- // // Samples and ARITHMETIC vs FRACTIONAL must correspond to USART_SAMPR in
- // // hpl_sercom_config.h.
- // _usart_async_calculate_baud_rate(baudrate, // e.g. 9600 baud
- // PROTOTYPE_SERCOM_USART_ASYNC_CLOCK_FREQUENCY,
- // 16, // samples
- // USART_BAUDRATE_ASYNCH_ARITHMETIC,
- // 0 // fraction - not used for ARITHMETIC
- // ));
self->baudrate = baudrate;
+ uart_set_baudrate(self->uart, baudrate);
}
mp_float_t common_hal_busio_uart_get_timeout(busio_uart_obj_t *self) {
@@ -375,30 +280,30 @@ void common_hal_busio_uart_set_timeout(busio_uart_obj_t *self, mp_float_t timeou
}
uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self) {
- // This assignment is only here because the usart_async routines take a *const argument.
- // struct usart_async_descriptor * const usart_desc_p = (struct usart_async_descriptor * const) &self->usart_desc;
- // struct usart_async_status async_status;
- // usart_async_get_status(usart_desc_p, &async_status);
- // return async_status.rxcnt;
- return 0;
+ // Prevent conflict with uart irq.
+ irq_set_enabled(self->uart_irq_id, false);
+ // The UART only interrupts after a threshold so make sure to copy anything
+ // out of its FIFO before measuring how many bytes we've received.
+ _copy_into_ringbuf(&self->ringbuf, self->uart);
+ irq_set_enabled(self->uart_irq_id, false);
+ return ringbuf_num_filled(&self->ringbuf);
}
void common_hal_busio_uart_clear_rx_buffer(busio_uart_obj_t *self) {
- // This assignment is only here because the usart_async routines take a *const argument.
- // struct usart_async_descriptor * const usart_desc_p = (struct usart_async_descriptor * const) &self->usart_desc;
- // usart_async_flush_rx_buffer(usart_desc_p);
+ // Prevent conflict with uart irq.
+ irq_set_enabled(self->uart_irq_id, false);
+ ringbuf_clear(&self->ringbuf);
+ // Throw away the FIFO contents too.
+ while (uart_is_readable(self->uart)) {
+ (void) uart_get_hw(self->uart)->dr;
+ }
+ irq_set_enabled(self->uart_irq_id, true);
}
-// True if there are no characters still to be written.
bool common_hal_busio_uart_ready_to_tx(busio_uart_obj_t *self) {
if (self->tx_pin == NO_PIN) {
return false;
}
- return false;
- // // This assignment is only here because the usart_async routines take a *const argument.
- // struct usart_async_descriptor * const usart_desc_p = (struct usart_async_descriptor * const) &self->usart_desc;
- // struct usart_async_status async_status;
- // usart_async_get_status(usart_desc_p, &async_status);
- // return !(async_status.flags & USART_ASYNC_STATUS_BUSY);
+ return uart_is_writable(self->uart);
}
diff --git a/ports/raspberrypi/common-hal/busio/UART.h b/ports/raspberrypi/common-hal/busio/UART.h
index 43ed9bee0..4c07de240 100644
--- a/ports/raspberrypi/common-hal/busio/UART.h
+++ b/ports/raspberrypi/common-hal/busio/UART.h
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries
+ * Copyright (c) 2021 microDev
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -27,21 +27,26 @@
#ifndef MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_BUSIO_UART_H
#define MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_BUSIO_UART_H
-#include "common-hal/microcontroller/Pin.h"
-
#include "py/obj.h"
+#include "py/ringbuf.h"
+
+#include "src/rp2_common/hardware_uart/include/hardware/uart.h"
typedef struct {
mp_obj_base_t base;
- // struct usart_async_descriptor usart_desc;
- uint8_t rx_pin;
uint8_t tx_pin;
- uint8_t character_bits;
- bool rx_error;
+ uint8_t rx_pin;
+ uint8_t cts_pin;
+ uint8_t rts_pin;
+ uint8_t uart_id;
+ uint8_t uart_irq_id;
uint32_t baudrate;
uint32_t timeout_ms;
- uint32_t buffer_length;
- uint8_t* buffer;
+ uart_inst_t * uart;
+ ringbuf_t ringbuf;
} busio_uart_obj_t;
+extern void reset_uart(void);
+extern void never_reset_uart(uint8_t num);
+
#endif // MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_BUSIO_UART_H
diff --git a/ports/raspberrypi/common-hal/digitalio/DigitalInOut.c b/ports/raspberrypi/common-hal/digitalio/DigitalInOut.c
index b0bc1b96e..a1a23b9ab 100644
--- a/ports/raspberrypi/common-hal/digitalio/DigitalInOut.c
+++ b/ports/raspberrypi/common-hal/digitalio/DigitalInOut.c
@@ -43,6 +43,7 @@ digitalinout_result_t common_hal_digitalio_digitalinout_construct(
self->output = false;
self->open_drain = false;
+ // Set to input. No output value.
gpio_init(pin->number);
return DIGITALINOUT_OK;
}
@@ -75,11 +76,17 @@ digitalinout_result_t common_hal_digitalio_digitalinout_switch_to_output(
digitalio_digitalinout_obj_t* self, bool value,
digitalio_drive_mode_t drive_mode) {
const uint8_t pin = self->pin->number;
- gpio_set_dir(pin, GPIO_OUT);
- // TODO: Turn on "strong" pin driving (more current available).
+ gpio_disable_pulls(pin);
+
+ // Turn on "strong" pin driving (more current available).
+ hw_write_masked(&padsbank0_hw->io[pin],
+ PADS_BANK0_GPIO0_DRIVE_VALUE_12MA << PADS_BANK0_GPIO0_DRIVE_LSB,
+ PADS_BANK0_GPIO0_DRIVE_BITS);
self->output = true;
- common_hal_digitalio_digitalinout_set_drive_mode(self, drive_mode);
+ self->open_drain = drive_mode == DRIVE_MODE_OPEN_DRAIN;
+
+ // Pin direction is ultimately set in set_value. We don't need to do it here.
common_hal_digitalio_digitalinout_set_value(self, value);
return DIGITALINOUT_OK;
}
@@ -92,10 +99,18 @@ digitalio_direction_t common_hal_digitalio_digitalinout_get_direction(
void common_hal_digitalio_digitalinout_set_value(
digitalio_digitalinout_obj_t* self, bool value) {
const uint8_t pin = self->pin->number;
- if (self->open_drain) {
- gpio_set_dir(pin, value ? GPIO_IN : GPIO_OUT);
+ if (self->open_drain && value) {
+ // If true and open-drain, set the direction -before- setting
+ // the pin value, to to avoid a high glitch on the pin before
+ // switching from output to input for open-drain.
+ gpio_set_dir(pin, GPIO_IN);
+ gpio_put(pin, value);
} else {
+ // Otherwise set the direction -after- setting the pin value,
+ // to avoid a glitch which might occur if the old value was
+ // different and the pin was previously set to input.
gpio_put(pin, value);
+ gpio_set_dir(pin, GPIO_OUT);
}
}
@@ -110,9 +125,6 @@ digitalinout_result_t common_hal_digitalio_digitalinout_set_drive_mode(
const uint8_t pin = self->pin->number;
bool value = common_hal_digitalio_digitalinout_get_value(self);
self->open_drain = drive_mode == DRIVE_MODE_OPEN_DRAIN;
- if (self->open_drain) {
- gpio_put(pin, false);
- }
// True is implemented differently between modes so reset the value to make
// sure it's correct for the new mode.
if (value) {
diff --git a/ports/raspberrypi/common-hal/neopixel_write/__init__.c b/ports/raspberrypi/common-hal/neopixel_write/__init__.c
index 561d438e2..1f0b71ca0 100644
--- a/ports/raspberrypi/common-hal/neopixel_write/__init__.c
+++ b/ports/raspberrypi/common-hal/neopixel_write/__init__.c
@@ -54,27 +54,25 @@ const uint16_t neopixel_program[] = {
0xa142
};
-const uint16_t init_program[] = {
- 0xe081
-};
-
void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* digitalinout, uint8_t *pixels, uint32_t num_bytes) {
// Set everything up.
rp2pio_statemachine_obj_t state_machine;
// TODO: Cache the state machine after we create it once. We'll need a way to
// change the pins then though.
- uint8_t pin_number = digitalinout->pin->number;
+ uint32_t pins_we_use = 1 << digitalinout->pin->number;
bool ok = rp2pio_statemachine_construct(&state_machine,
neopixel_program, sizeof(neopixel_program) / sizeof(neopixel_program[0]),
800000 * 6, // 800 khz * 6 cycles per bit
- init_program, 1,
- NULL, 1,
- NULL, 1,
- digitalinout->pin, 1,
- digitalinout->pin, 1,
- 1 << pin_number, true, false,
+ NULL, 0, // init program
+ NULL, 1, // out
+ NULL, 1, // in
+ NULL, 1, // set
+ digitalinout->pin, 1, // sideset
+ 0, pins_we_use, // initial pin state
+ pins_we_use, true, false,
true, 8, false, // TX, auto pull every 8 bits. shift left to output msb first
+ true, // Wait for txstall. If we don't, then we'll deinit too quickly.
false, 32, true, // RX setting we don't use
false); // claim pins
if (!ok) {
@@ -86,7 +84,7 @@ void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* digitalinout,
// two.
while (port_get_raw_ticks(NULL) < next_start_raw_ticks) {}
- common_hal_rp2pio_statemachine_write(&state_machine, pixels, num_bytes);
+ common_hal_rp2pio_statemachine_write(&state_machine, pixels, num_bytes, 1 /* stride in bytes */);
// Use a private deinit of the state machine that doesn't reset the pin.
rp2pio_statemachine_deinit(&state_machine, true);
diff --git a/ports/raspberrypi/common-hal/nvm/ByteArray.c b/ports/raspberrypi/common-hal/nvm/ByteArray.c
new file mode 100644
index 000000000..fdc2c6080
--- /dev/null
+++ b/ports/raspberrypi/common-hal/nvm/ByteArray.c
@@ -0,0 +1,102 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 microDev
+ *
+ * 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/nvm/ByteArray.h"
+
+#include <string.h>
+
+#include "py/runtime.h"
+#include "src/rp2_common/hardware_flash/include/hardware/flash.h"
+
+extern uint32_t __flash_binary_start;
+static const uint32_t flash_binary_start = (uint32_t) &__flash_binary_start;
+
+#define RMV_OFFSET(addr) addr - flash_binary_start
+
+uint32_t common_hal_nvm_bytearray_get_length(nvm_bytearray_obj_t* self) {
+ return self->len;
+}
+
+static void write_page(uint32_t page_addr, uint32_t offset, uint32_t len, uint8_t* bytes) {
+ // Write a whole page to flash, buffering it first and then erasing and rewriting it
+ // since we can only write a whole page at a time.
+ if (offset == 0 && len == FLASH_PAGE_SIZE) {
+ flash_range_program(RMV_OFFSET(page_addr), bytes, FLASH_PAGE_SIZE);
+ } else {
+ uint8_t buffer[FLASH_PAGE_SIZE];
+ memcpy(buffer, (uint8_t*) page_addr, FLASH_PAGE_SIZE);
+ memcpy(buffer + offset, bytes, len);
+ flash_range_program(RMV_OFFSET(page_addr), buffer, FLASH_PAGE_SIZE);
+ }
+}
+
+static void erase_and_write_sector(uint32_t address, uint32_t len, uint8_t* bytes) {
+ // Write a whole sector to flash, buffering it first and then erasing and rewriting it
+ // since we can only erase a whole sector at a time.
+ uint8_t buffer[FLASH_SECTOR_SIZE];
+ memcpy(buffer, (uint8_t*) CIRCUITPY_INTERNAL_NVM_START_ADDR, FLASH_SECTOR_SIZE);
+ memcpy(buffer + address, bytes, len);
+ flash_range_erase(RMV_OFFSET(CIRCUITPY_INTERNAL_NVM_START_ADDR), FLASH_SECTOR_SIZE);
+ flash_range_program(RMV_OFFSET(CIRCUITPY_INTERNAL_NVM_START_ADDR), buffer, FLASH_SECTOR_SIZE);
+}
+
+void common_hal_nvm_bytearray_get_bytes(nvm_bytearray_obj_t* self,
+ uint32_t start_index, uint32_t len, uint8_t* values) {
+ memcpy(values, self->start_address + start_index, len);
+}
+
+bool common_hal_nvm_bytearray_set_bytes(nvm_bytearray_obj_t* self,
+ uint32_t start_index, uint8_t* values, uint32_t len) {
+ uint8_t values_in[len];
+ common_hal_nvm_bytearray_get_bytes(self, start_index, len, values_in);
+
+ bool all_ones = true;
+ for (uint32_t i = 0; i < len; i++) {
+ if (values_in[i] != UINT8_MAX) {
+ all_ones = false;
+ break;
+ }
+ }
+
+ if (all_ones) {
+ uint32_t address = (uint32_t) self->start_address + start_index;
+ uint32_t offset = address % FLASH_PAGE_SIZE;
+ uint32_t page_addr = address - offset;
+
+ while (len) {
+ uint32_t write_len = MIN(len, FLASH_PAGE_SIZE - offset);
+ write_page(page_addr, offset, write_len, values);
+ len -= write_len;
+ values += write_len;
+ page_addr += FLASH_PAGE_SIZE;
+ offset = 0;
+ }
+ } else {
+ erase_and_write_sector(start_index, len, values);
+ }
+
+ return true;
+}
diff --git a/ports/raspberrypi/common-hal/nvm/ByteArray.h b/ports/raspberrypi/common-hal/nvm/ByteArray.h
new file mode 100644
index 000000000..a2a904fea
--- /dev/null
+++ b/ports/raspberrypi/common-hal/nvm/ByteArray.h
@@ -0,0 +1,38 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 microDev
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_NVM_BYTEARRAY_H
+#define MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_NVM_BYTEARRAY_H
+
+#include "py/obj.h"
+
+typedef struct {
+ mp_obj_base_t base;
+ uint8_t * start_address;
+ uint32_t len;
+} nvm_bytearray_obj_t;
+
+#endif // MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_NVM_BYTEARRAY_H
diff --git a/ports/raspberrypi/common-hal/nvm/__init__.c b/ports/raspberrypi/common-hal/nvm/__init__.c
new file mode 100644
index 000000000..1b702a158
--- /dev/null
+++ b/ports/raspberrypi/common-hal/nvm/__init__.c
@@ -0,0 +1 @@
+// No nvm module functions.
diff --git a/ports/raspberrypi/common-hal/pwmio/PWMOut.c b/ports/raspberrypi/common-hal/pwmio/PWMOut.c
index 348d99ebe..4343b9e5c 100644
--- a/ports/raspberrypi/common-hal/pwmio/PWMOut.c
+++ b/ports/raspberrypi/common-hal/pwmio/PWMOut.c
@@ -82,16 +82,23 @@ void pwmio_release_slice_channels(uint8_t slice) {
channel_use &= ~channel_mask;
channel_mask = _mask(slice, 1);
channel_use &= ~channel_mask;
+
+void pwmout_never_reset(uint8_t slice, uint8_t channel) {
+ never_reset_channel |= _mask(slice, channel);
+}
+
+void pwmout_reset_ok(uint8_t slice, uint8_t channel) {
+ never_reset_channel &= ~_mask(slice, channel);
}
void common_hal_pwmio_pwmout_never_reset(pwmio_pwmout_obj_t *self) {
- never_reset_channel |= _mask(self->slice, self->channel);
+ pwmout_never_reset(self->slice, self->channel);
never_reset_pin_number(self->pin->number);
}
void common_hal_pwmio_pwmout_reset_ok(pwmio_pwmout_obj_t *self) {
- never_reset_channel &= ~_mask(self->slice, self->channel);
+ pwmout_reset_ok(self->slice, self->channel);
}
void pwmout_reset(void) {
@@ -115,21 +122,7 @@ void pwmout_reset(void) {
}
}
-pwmout_result_t common_hal_pwmio_pwmout_construct(pwmio_pwmout_obj_t* self,
- const mcu_pin_obj_t* pin,
- uint16_t duty,
- uint32_t frequency,
- bool variable_frequency) {
- self->pin = pin;
- self->variable_frequency = variable_frequency;
- self->duty_cycle = duty;
-
- if (frequency == 0 || frequency > (common_hal_mcu_processor_get_frequency() / 2)) {
- return PWMOUT_INVALID_FREQUENCY;
- }
-
- uint8_t slice = pwm_gpio_to_slice_num(pin->number);
- uint8_t channel = pwm_gpio_to_channel(pin->number);
+pwmout_result_t pwmout_allocate(uint8_t slice, uint8_t channel, bool variable_frequency, uint32_t frequency) {
uint32_t channel_use_mask = _mask(slice, channel);
// Check the channel first.
@@ -151,14 +144,39 @@ pwmout_result_t common_hal_pwmio_pwmout_construct(pwmio_pwmout_obj_t* self,
return PWMOUT_ALL_TIMERS_ON_PIN_IN_USE;
}
}
- self->slice = slice;
- self->channel = channel;
channel_use |= channel_use_mask;
if (variable_frequency) {
slice_variable_frequency |= 1 << slice;
}
+ return PWMOUT_OK;
+}
+
+pwmout_result_t common_hal_pwmio_pwmout_construct(pwmio_pwmout_obj_t* self,
+ const mcu_pin_obj_t* pin,
+ uint16_t duty,
+ uint32_t frequency,
+ bool variable_frequency) {
+ self->pin = pin;
+ self->variable_frequency = variable_frequency;
+ self->duty_cycle = duty;
+
+ if (frequency == 0 || frequency > (common_hal_mcu_processor_get_frequency() / 2)) {
+ return PWMOUT_INVALID_FREQUENCY;
+ }
+
+ uint8_t slice = pwm_gpio_to_slice_num(pin->number);
+ uint8_t channel = pwm_gpio_to_channel(pin->number);
+
+ int r = pwmout_allocate(slice, channel, variable_frequency, frequency);
+ if (r != PWMOUT_OK) {
+ return r;
+ }
+
+ self->slice = slice;
+ self->channel = channel;
+
if (target_slice_frequencies[slice] != frequency) {
// Reset the counter and compare values.
pwm_hw->slice[slice].ctr = PWM_CH0_CTR_RESET;
@@ -166,6 +184,7 @@ pwmout_result_t common_hal_pwmio_pwmout_construct(pwmio_pwmout_obj_t* self,
common_hal_pwmio_pwmout_set_frequency(self, frequency);
pwm_set_enabled(slice, true);
} else {
+ common_hal_pwmio_pwmout_set_frequency(self, frequency);
common_hal_pwmio_pwmout_set_duty_cycle(self, duty);
}
@@ -179,20 +198,23 @@ bool common_hal_pwmio_pwmout_deinited(pwmio_pwmout_obj_t* self) {
return self->pin == NULL;
}
-void common_hal_pwmio_pwmout_deinit(pwmio_pwmout_obj_t* self) {
- if (common_hal_pwmio_pwmout_deinited(self)) {
- return;
- }
- uint32_t channel_mask = _mask(self->slice, self->channel);
+void pwmout_free(uint8_t slice, uint8_t channel) {
+ uint32_t channel_mask = _mask(slice, channel);
channel_use &= ~channel_mask;
never_reset_channel &= ~channel_mask;
- uint32_t slice_mask = ((1 << CHANNELS_PER_SLICE) - 1) << (self->slice * CHANNELS_PER_SLICE + self->channel);
+ uint32_t slice_mask = ((1 << CHANNELS_PER_SLICE) - 1) << (slice * CHANNELS_PER_SLICE);
if ((channel_use & slice_mask) == 0) {
- target_slice_frequencies[self->slice] = 0;
- slice_variable_frequency &= ~(1 << self->slice);
- pwm_set_enabled(self->slice, false);
+ target_slice_frequencies[slice] = 0;
+ slice_variable_frequency &= ~(1 << slice);
+ pwm_set_enabled(slice, false);
}
+}
+void common_hal_pwmio_pwmout_deinit(pwmio_pwmout_obj_t* self) {
+ if (common_hal_pwmio_pwmout_deinited(self)) {
+ return;
+ }
+ pwmout_free(self->slice, self->channel);
reset_pin_number(self->pin->number);
self->pin = NULL;
}
diff --git a/ports/raspberrypi/common-hal/pwmio/PWMOut.h b/ports/raspberrypi/common-hal/pwmio/PWMOut.h
index 6c0dda2db..41da81010 100644
--- a/ports/raspberrypi/common-hal/pwmio/PWMOut.h
+++ b/ports/raspberrypi/common-hal/pwmio/PWMOut.h
@@ -45,6 +45,11 @@ typedef struct {
void pwmout_reset(void);
// Private API for AudioPWMOut.
void pwmio_pwmout_set_top(pwmio_pwmout_obj_t* self, uint16_t top);
+// Private APIs for RGBMatrix
+enum pwmout_result_t pwmout_allocate(uint8_t slice, uint8_t channel, bool variable_frequency, uint32_t frequency);
+void pwmout_free(uint8_t slice, uint8_t channel);
+void pwmout_never_reset(uint8_t slice, uint8_t channel);
+void pwmout_reset_ok(uint8_t slice, uint8_t channel);
// Private API for countio to claim both channels on a slice
bool pwmio_claim_slice_channels(uint8_t slice);
diff --git a/ports/raspberrypi/common-hal/rgbmatrix/RGBMatrix.c b/ports/raspberrypi/common-hal/rgbmatrix/RGBMatrix.c
new file mode 100644
index 000000000..657c7f0a6
--- /dev/null
+++ b/ports/raspberrypi/common-hal/rgbmatrix/RGBMatrix.c
@@ -0,0 +1,70 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Jeff Epler 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 <stddef.h>
+
+#include "py/mphal.h"
+
+#include "common-hal/rgbmatrix/RGBMatrix.h"
+#include "shared-bindings/pwmio/PWMOut.h"
+#include "shared-module/rgbmatrix/RGBMatrix.h"
+
+#include "src/rp2_common/hardware_pwm/include/hardware/pwm.h"
+
+void *common_hal_rgbmatrix_timer_allocate(rgbmatrix_rgbmatrix_obj_t *self) {
+ // Choose a PWM channel based on the first RGB pin
+ uint8_t slice = pwm_gpio_to_slice_num(self->rgb_pins[0]);
+ uint8_t channel = pwm_gpio_to_channel(self->rgb_pins[0]);
+ int result = pwmout_allocate(slice, channel, true, 125000000/3);
+ if (result == PWMOUT_OK) {
+ // return value must be nonzero (but slice and channel can both be
+ // zero), so set bit 16...
+ pwmout_never_reset(slice, channel);
+ return (void*)(intptr_t)(slice | (channel << 8) | 0x10000);
+ }
+ return NULL;
+}
+
+void common_hal_rgbmatrix_timer_enable(void* ptr) {
+ int8_t slice = ((intptr_t)ptr) & 0xff;
+ pwm_set_enabled(slice, false);
+ pwm_clear_irq(slice);
+ pwm_set_enabled(slice, true);
+}
+
+void common_hal_rgbmatrix_timer_disable(void* ptr) {
+ int8_t slice = ((intptr_t)ptr) & 0xff;
+ pwm_set_enabled(slice, false);
+}
+
+void common_hal_rgbmatrix_timer_free(void* ptr) {
+ intptr_t value = (intptr_t)ptr;
+ uint8_t slice = value & 0xff;
+ uint8_t channel = value >> 8;
+ pwm_set_enabled(slice, false);
+ pwmout_free(slice, channel);
+ return;
+}
diff --git a/ports/raspberrypi/common-hal/rgbmatrix/RGBMatrix.h b/ports/raspberrypi/common-hal/rgbmatrix/RGBMatrix.h
new file mode 100644
index 000000000..2378cf173
--- /dev/null
+++ b/ports/raspberrypi/common-hal/rgbmatrix/RGBMatrix.h
@@ -0,0 +1,37 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Jeff Epler for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
+#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
+
+#include "shared-module/rgbmatrix/RGBMatrix.h"
+
+void *common_hal_rgbmatrix_timer_allocate(rgbmatrix_rgbmatrix_obj_t *self);
+void common_hal_rgbmatrix_timer_enable(void*);
+void common_hal_rgbmatrix_timer_disable(void*);
+void common_hal_rgbmatrix_timer_free(void*);
+
+#endif
diff --git a/ports/raspberrypi/common-hal/rgbmatrix/__init__.c b/ports/raspberrypi/common-hal/rgbmatrix/__init__.c
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/ports/raspberrypi/common-hal/rgbmatrix/__init__.c
diff --git a/ports/raspberrypi/common-hal/rp2pio/StateMachine.c b/ports/raspberrypi/common-hal/rp2pio/StateMachine.c
index 90c48130e..54c5220e7 100644
--- a/ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+++ b/ports/raspberrypi/common-hal/rp2pio/StateMachine.c
@@ -54,7 +54,6 @@ STATIC PIO pio_instances[2] = {pio0, pio1};
void _reset_statemachine(PIO pio, uint8_t sm, bool leave_pins) {
uint8_t pio_index = pio_get_index(pio);
- pio_sm_unclaim(pio, sm);
uint32_t program_id = _current_program_id[pio_index][sm];
if (program_id == 0) {
return;
@@ -89,6 +88,7 @@ void _reset_statemachine(PIO pio, uint8_t sm, bool leave_pins) {
}
}
_current_sm_pins[pio_index][sm] = 0;
+ pio_sm_unclaim(pio, sm);
}
void reset_rp2pio_statemachine(void) {
@@ -130,8 +130,10 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
const mcu_pin_obj_t * first_in_pin, uint8_t in_pin_count,
const mcu_pin_obj_t * first_set_pin, uint8_t set_pin_count,
const mcu_pin_obj_t * first_sideset_pin, uint8_t sideset_pin_count,
+ uint32_t initial_pin_state, uint32_t initial_pin_direction,
uint32_t pins_we_use, bool tx_fifo, bool rx_fifo,
bool auto_pull, uint8_t pull_threshold, bool out_shift_right,
+ bool wait_for_txstall,
bool auto_push, uint8_t push_threshold, bool in_shift_right,
bool claim_pins) {
// Create a program id that isn't the pointer so we can store it without storing the original object.
@@ -199,6 +201,11 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
_current_sm_pins[pio_index][state_machine] = pins_we_use;
_current_pins[pio_index] |= pins_we_use;
+ pio_sm_set_pins_with_mask(self->pio, state_machine, initial_pin_state, pins_we_use);
+ pio_sm_set_pindirs_with_mask(self->pio, state_machine, initial_pin_direction, pins_we_use);
+ self->initial_pin_state = initial_pin_state;
+ self->initial_pin_direction = initial_pin_direction;
+
for (size_t pin_number = 0; pin_number < TOTAL_GPIO_COUNT; pin_number++) {
if ((pins_we_use & (1 << pin_number)) == 0) {
continue;
@@ -260,27 +267,38 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
self->out = tx_fifo;
self->out_shift_right = out_shift_right;
self->in_shift_right = in_shift_right;
+ self->wait_for_txstall = wait_for_txstall;
+
+ self->init = init;
+ self->init_len = init_len;
sm_config_set_fifo_join(&c, join);
pio_sm_init(self->pio, self->state_machine, program_offset, &c);
+ common_hal_rp2pio_statemachine_run(self, init, init_len);
+
+ common_hal_rp2pio_statemachine_set_frequency(self, frequency);
pio_sm_set_enabled(self->pio, self->state_machine, true);
- for (size_t i = 0; i < init_len; i++) {
- pio_sm_exec(self->pio, self->state_machine, init[i]);
- }
return true;
}
+static uint32_t mask_and_rotate(const mcu_pin_obj_t* first_pin, uint32_t bit_count, uint32_t value) {
+ value = value & ((1 << bit_count) - 1);
+ uint32_t shift = first_pin->number;
+ return value << shift | value >> (32 - shift);
+}
+
void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
const uint16_t* program, size_t program_len,
size_t frequency,
const uint16_t* init, size_t init_len,
- const mcu_pin_obj_t * first_out_pin, uint8_t out_pin_count,
+ const mcu_pin_obj_t * first_out_pin, uint8_t out_pin_count, uint32_t initial_out_pin_state, uint32_t initial_out_pin_direction,
const mcu_pin_obj_t * first_in_pin, uint8_t in_pin_count,
- const mcu_pin_obj_t * first_set_pin, uint8_t set_pin_count,
- const mcu_pin_obj_t * first_sideset_pin, uint8_t sideset_pin_count,
+ const mcu_pin_obj_t * first_set_pin, uint8_t set_pin_count, uint32_t initial_set_pin_state, uint32_t initial_set_pin_direction,
+ const mcu_pin_obj_t * first_sideset_pin, uint8_t sideset_pin_count, uint32_t initial_sideset_pin_state, uint32_t initial_sideset_pin_direction,
bool exclusive_pin_use,
bool auto_pull, uint8_t pull_threshold, bool out_shift_right,
+ bool wait_for_txstall,
bool auto_push, uint8_t push_threshold, bool in_shift_right) {
// First, check that all pins are free OR already in use by any PIO if exclusive_pin_use is false.
@@ -397,9 +415,26 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
mp_raise_ValueError_varg(translate("Program does OUT without loading OSR"));
}
- if (in_pin_count > 8 || out_pin_count > 8) {
- mp_raise_NotImplementedError(translate("Only IN/OUT of up to 8 supported"));
+ uint32_t initial_pin_state = mask_and_rotate(first_out_pin, out_pin_count, initial_out_pin_state);
+ uint32_t initial_pin_direction = mask_and_rotate(first_out_pin, out_pin_count, initial_out_pin_direction);
+ initial_set_pin_state = mask_and_rotate(first_set_pin, set_pin_count, initial_set_pin_state);
+ initial_set_pin_direction = mask_and_rotate(first_set_pin, set_pin_count, initial_set_pin_direction);
+ uint32_t set_out_overlap = mask_and_rotate(first_out_pin, out_pin_count, 0xffffffff) &
+ mask_and_rotate(first_set_pin, set_pin_count, 0xffffffff);
+ // Check that OUT and SET settings agree because we don't have a way of picking one over the other.
+ if ((initial_pin_state & set_out_overlap) != (initial_set_pin_state & set_out_overlap)) {
+ mp_raise_ValueError(translate("Initial set pin state conflicts with initial out pin state"));
}
+ if ((initial_pin_direction & set_out_overlap) != (initial_set_pin_direction & set_out_overlap)) {
+ mp_raise_ValueError(translate("Initial set pin direction conflicts with initial out pin direction"));
+ }
+ initial_pin_state |= initial_set_pin_state;
+ initial_pin_direction |= initial_set_pin_direction;
+
+ // Sideset overrides OUT or SET so we always use its values.
+ uint32_t sideset_mask = mask_and_rotate(first_sideset_pin, sideset_pin_count, 0x1f);
+ initial_pin_state = (initial_pin_state & ~sideset_mask) | mask_and_rotate(first_sideset_pin, sideset_pin_count, initial_sideset_pin_state);
+ initial_pin_direction = (initial_pin_direction & ~sideset_mask) | mask_and_rotate(first_sideset_pin, sideset_pin_count, initial_sideset_pin_direction);
bool ok = rp2pio_statemachine_construct(self,
program, program_len,
@@ -409,8 +444,10 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
first_in_pin, in_pin_count,
first_set_pin, set_pin_count,
first_sideset_pin, sideset_pin_count,
+ initial_pin_state, initial_pin_direction,
pins_we_use, tx_fifo, rx_fifo,
auto_pull, pull_threshold, out_shift_right,
+ wait_for_txstall,
auto_push, push_threshold, in_shift_right,
true /* claim pins */);
if (!ok) {
@@ -418,10 +455,51 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
}
}
+void common_hal_rp2pio_statemachine_restart(rp2pio_statemachine_obj_t *self) {
+ pio_sm_restart(self->pio, self->state_machine);
+
+ uint8_t pio_index = pio_get_index(self->pio);
+ uint32_t pins_we_use = _current_sm_pins[pio_index][self->state_machine];
+ pio_sm_set_pins_with_mask(self->pio, self->state_machine, self->initial_pin_state, pins_we_use);
+ pio_sm_set_pindirs_with_mask(self->pio, self->state_machine, self->initial_pin_direction, pins_we_use);
+ common_hal_rp2pio_statemachine_run(self, self->init, self->init_len);
+ pio_sm_set_enabled(self->pio, self->state_machine, true);
+}
+
+void common_hal_rp2pio_statemachine_stop(rp2pio_statemachine_obj_t *self) {
+ pio_sm_set_enabled(self->pio, self->state_machine, false);
+}
+
+void common_hal_rp2pio_statemachine_run(rp2pio_statemachine_obj_t *self, const uint16_t *instructions, size_t len) {
+ for (size_t i = 0; i < len; i++) {
+ pio_sm_exec(self->pio, self->state_machine, instructions[i]);
+ }
+}
+
uint32_t common_hal_rp2pio_statemachine_get_frequency(rp2pio_statemachine_obj_t* self) {
return self->actual_frequency;
}
+void common_hal_rp2pio_statemachine_set_frequency(rp2pio_statemachine_obj_t* self, uint32_t frequency) {
+ if (frequency == 0) {
+ frequency = clock_get_hz(clk_sys);
+ }
+ uint64_t frequency256 = ((uint64_t) clock_get_hz(clk_sys)) * 256;
+ uint64_t div256 = frequency256 / frequency;
+ if (frequency256 % div256 > 0) {
+ div256 += 1;
+ }
+ // 0 is interpreted as 0x10000 so it's valid.
+ if (div256 / 256 > 0x10000 || frequency > clock_get_hz(clk_sys)) {
+ mp_raise_ValueError_varg(translate("%q out of range"), MP_QSTR_frequency);
+ }
+ self->actual_frequency = frequency256 / div256;
+
+ pio_sm_set_clkdiv_int_frac(self->pio, self->state_machine, div256 / 256, div256 % 256);
+ // Reset the clkdiv counter in case our new TOP is lower.
+ pio_sm_clkdiv_restart(self->pio, self->state_machine);
+}
+
void rp2pio_statemachine_deinit(rp2pio_statemachine_obj_t *self, bool leave_pins) {
uint8_t sm = self->state_machine;
uint8_t pio_index = pio_get_index(self->pio);
@@ -445,9 +523,21 @@ bool common_hal_rp2pio_statemachine_deinited(rp2pio_statemachine_obj_t *self) {
return self->state_machine == NUM_PIO_STATE_MACHINES;
}
+enum dma_channel_transfer_size _stride_to_dma_size(uint8_t stride) {
+ switch (stride) {
+ case 4:
+ return DMA_SIZE_32;
+ case 2:
+ return DMA_SIZE_16;
+ case 1:
+ default:
+ return DMA_SIZE_8;
+ }
+}
+
static bool _transfer(rp2pio_statemachine_obj_t *self,
- const uint8_t *data_out, size_t out_len,
- uint8_t *data_in, size_t in_len) {
+ const uint8_t *data_out, size_t out_len, uint8_t out_stride_in_bytes,
+ uint8_t *data_in, size_t in_len, uint8_t in_stride_in_bytes) {
// This implementation is based on SPI but varies because the tx and rx buffers
// may be different lengths and occur at different times or speeds.
@@ -472,42 +562,43 @@ static bool _transfer(rp2pio_statemachine_obj_t *self,
if (tx) {
tx_destination = (volatile uint8_t*) &self->pio->txf[self->state_machine];
if (!self->out_shift_right) {
- tx_destination += 3;
+ tx_destination += 4 - out_stride_in_bytes;
}
}
if (rx) {
rx_source = (const volatile uint8_t*) &self->pio->rxf[self->state_machine];
- if (!self->in_shift_right) {
- rx_source += 3;
+ if (self->in_shift_right) {
+ rx_source += 4 - in_stride_in_bytes;
}
}
+ uint32_t stall_mask = 1 << (PIO_FDEBUG_TXSTALL_LSB + self->state_machine);
bool use_dma = (!rx || chan_rx >= 0) && (!tx || chan_tx >= 0);
if (use_dma) {
dma_channel_config c;
uint32_t channel_mask = 0;
if (tx) {
c = dma_channel_get_default_config(chan_tx);
- channel_config_set_transfer_data_size(&c, DMA_SIZE_8);
+ channel_config_set_transfer_data_size(&c, _stride_to_dma_size(out_stride_in_bytes));
channel_config_set_dreq(&c, self->tx_dreq);
channel_config_set_read_increment(&c, true);
channel_config_set_write_increment(&c, false);
dma_channel_configure(chan_tx, &c,
tx_destination,
data_out,
- len,
+ out_len / out_stride_in_bytes,
false);
channel_mask |= 1u << chan_tx;
}
if (rx) {
c = dma_channel_get_default_config(chan_rx);
- channel_config_set_transfer_data_size(&c, DMA_SIZE_8);
+ channel_config_set_transfer_data_size(&c, _stride_to_dma_size(in_stride_in_bytes));
channel_config_set_dreq(&c, self->rx_dreq);
channel_config_set_read_increment(&c, false);
channel_config_set_write_increment(&c, true);
dma_channel_configure(chan_rx, &c,
data_in,
rx_source,
- len,
+ in_len / in_stride_in_bytes,
false);
channel_mask |= 1u << chan_rx;
}
@@ -528,7 +619,7 @@ static bool _transfer(rp2pio_statemachine_obj_t *self,
}
}
// Clear the stall bit so we can detect when the state machine is done transmitting.
- self->pio->fdebug = PIO_FDEBUG_TXSTALL_BITS;
+ self->pio->fdebug = stall_mask;
}
// If we have claimed only one channel successfully, we should release immediately. This also
@@ -542,27 +633,31 @@ static bool _transfer(rp2pio_statemachine_obj_t *self,
if (!use_dma && !mp_hal_is_interrupted()) {
// Use software for small transfers, or if couldn't claim two DMA channels
- size_t rx_remaining = in_len;
- size_t tx_remaining = out_len;
+ size_t rx_remaining = in_len / in_stride_in_bytes;
+ size_t tx_remaining = out_len / out_stride_in_bytes;
while (rx_remaining || tx_remaining) {
- for (int i=0; i<32; i++) {
- bool did_transfer = false;
- if (tx_remaining && !pio_sm_is_tx_fifo_full(self->pio, self->state_machine)) {
+ while (tx_remaining && !pio_sm_is_tx_fifo_full(self->pio, self->state_machine)) {
+ if (out_stride_in_bytes == 1) {
*tx_destination = *data_out;
- data_out++;
- --tx_remaining;
- did_transfer = true;
+ } else if (out_stride_in_bytes == 2) {
+ *((uint16_t*) tx_destination) = *((uint16_t*) data_out);
+ } else if (out_stride_in_bytes == 4) {
+ *((uint32_t*) tx_destination) = *((uint32_t*) data_out);
}
- if (rx_remaining && !pio_sm_is_rx_fifo_empty(self->pio, self->state_machine)) {
+ data_out += out_stride_in_bytes;
+ --tx_remaining;
+ }
+ while (rx_remaining && !pio_sm_is_rx_fifo_empty(self->pio, self->state_machine)) {
+ if (in_stride_in_bytes == 1) {
*data_in = (uint8_t) *rx_source;
- data_in++;
- --rx_remaining;
- did_transfer = true;
- }
- if (!did_transfer) {
- break;
+ } else if (in_stride_in_bytes == 2) {
+ *((uint16_t*) data_in) = *((uint16_t*) rx_source);
+ } else if (in_stride_in_bytes == 4) {
+ *((uint32_t*) data_in) = *((uint32_t*) rx_source);
}
+ data_in += in_stride_in_bytes;
+ --rx_remaining;
}
RUN_BACKGROUND_TASKS;
if (mp_hal_is_interrupted()) {
@@ -570,24 +665,58 @@ static bool _transfer(rp2pio_statemachine_obj_t *self,
}
}
// Clear the stall bit so we can detect when the state machine is done transmitting.
- self->pio->fdebug = PIO_FDEBUG_TXSTALL_BITS;
+ self->pio->fdebug = stall_mask;
}
// Wait for the state machine to finish transmitting the data we've queued
// up.
if (tx) {
while (!pio_sm_is_tx_fifo_empty(self->pio, self->state_machine) ||
- (self->pio->fdebug & PIO_FDEBUG_TXSTALL_BITS) == 0) {
+ (self->wait_for_txstall && (self->pio->fdebug & stall_mask) == 0)) {
RUN_BACKGROUND_TASKS;
+ if (mp_hal_is_interrupted()) {
+ break;
+ }
}
}
return true;
}
-// Writes out the given data.
-bool common_hal_rp2pio_statemachine_write(rp2pio_statemachine_obj_t *self,
- const uint8_t *data, size_t len) {
+// TODO: Provide a way around these checks in case someone wants to use the FIFO
+// with manually run code.
+
+bool common_hal_rp2pio_statemachine_write(rp2pio_statemachine_obj_t *self, const uint8_t *data, size_t len, uint8_t stride_in_bytes) {
if (!self->out) {
mp_raise_RuntimeError(translate("No out in program"));
}
- return _transfer(self, data, len, NULL, 0);
+ return _transfer(self, data, len, stride_in_bytes, NULL, 0, 0);
+}
+
+bool common_hal_rp2pio_statemachine_readinto(rp2pio_statemachine_obj_t *self, uint8_t *data, size_t len, uint8_t stride_in_bytes) {
+ if (!self->in) {
+ mp_raise_RuntimeError(translate("No in in program"));
+ }
+ return _transfer(self, NULL, 0, 0, data, len, stride_in_bytes);
+}
+
+bool common_hal_rp2pio_statemachine_write_readinto(rp2pio_statemachine_obj_t *self,
+ const uint8_t *data_out, size_t out_len, uint8_t out_stride_in_bytes,
+ uint8_t *data_in, size_t in_len, uint8_t in_stride_in_bytes) {
+ if (!self->in || !self->out) {
+ mp_raise_RuntimeError(translate("No in or out in program"));
+ }
+ return _transfer(self, data_out, out_len, out_stride_in_bytes, data_in, in_len, in_stride_in_bytes);
+}
+
+bool common_hal_rp2pio_statemachine_get_rxstall(rp2pio_statemachine_obj_t* self) {
+ uint32_t stall_mask = 1 << (PIO_FDEBUG_RXSTALL_LSB + self->state_machine);
+ return (self->pio->fdebug & stall_mask) != 0;
+}
+
+void common_hal_rp2pio_statemachine_clear_rxfifo(rp2pio_statemachine_obj_t *self) {
+ uint8_t level = pio_sm_get_rx_fifo_level(self->pio, self->state_machine);
+ uint32_t stall_mask = 1 << (PIO_FDEBUG_RXSTALL_LSB + self->state_machine);
+ for (size_t i = 0; i < level; i++) {
+ (void) self->pio->rxf[self->state_machine];
+ }
+ self->pio->fdebug = stall_mask;
}
diff --git a/ports/raspberrypi/common-hal/rp2pio/StateMachine.h b/ports/raspberrypi/common-hal/rp2pio/StateMachine.h
index 6b70b6b5b..f084e0986 100644
--- a/ports/raspberrypi/common-hal/rp2pio/StateMachine.h
+++ b/ports/raspberrypi/common-hal/rp2pio/StateMachine.h
@@ -36,8 +36,13 @@ typedef struct {
uint32_t pins; // Bitmask of what pins this state machine uses.
int state_machine;
PIO pio;
+ const uint16_t* init;
+ size_t init_len;
+ uint32_t initial_pin_state;
+ uint32_t initial_pin_direction;
bool in;
bool out;
+ bool wait_for_txstall;
uint tx_dreq;
uint rx_dreq;
bool out_shift_right;
@@ -56,8 +61,10 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
const mcu_pin_obj_t * first_in_pin, uint8_t in_pin_count,
const mcu_pin_obj_t * first_set_pin, uint8_t set_pin_count,
const mcu_pin_obj_t * first_sideset_pin, uint8_t sideset_pin_count,
+ uint32_t initial_pin_state, uint32_t initial_pin_direction,
uint32_t pins_we_use, bool tx_fifo, bool rx_fifo,
bool auto_pull, uint8_t pull_threshold, bool out_shift_right,
+ bool wait_for_txstall,
bool auto_push, uint8_t push_threshold, bool in_shift_right,
bool claim_pins);
diff --git a/ports/raspberrypi/link.ld b/ports/raspberrypi/link.ld
index b83299dee..653408d4e 100644
--- a/ports/raspberrypi/link.ld
+++ b/ports/raspberrypi/link.ld
@@ -23,7 +23,7 @@
MEMORY
{
- FLASH_FIRMWARE (rx) : ORIGIN = 0x10000000, LENGTH = 1024k
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x10000000, LENGTH = 1020k
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 256k
SCRATCH_X (rwx) : ORIGIN = 0x20040000, LENGTH = 4k
SCRATCH_Y (rwx) : ORIGIN = 0x20041000, LENGTH = 4k
diff --git a/ports/raspberrypi/mpconfigport.h b/ports/raspberrypi/mpconfigport.h
index ccc8e8b03..dba008a94 100644
--- a/ports/raspberrypi/mpconfigport.h
+++ b/ports/raspberrypi/mpconfigport.h
@@ -29,15 +29,16 @@
#include "src/rp2040/hardware_regs/include/hardware/platform_defs.h"
-#define MICROPY_PY_SYS_PLATFORM "RP2040"
+#define MICROPY_PY_SYS_PLATFORM "RP2040"
-#define CIRCUITPY_INTERNAL_NVM_SIZE 0
+#define CIRCUITPY_INTERNAL_NVM_SIZE (4*1024)
+#define CIRCUITPY_INTERNAL_NVM_START_ADDR (0x100FF000)
-#define CIRCUITPY_DEFAULT_STACK_SIZE (24*1024)
+#define CIRCUITPY_DEFAULT_STACK_SIZE (24*1024)
#define MICROPY_USE_INTERNAL_PRINTF (1)
-#define CIRCUITPY_PROCESSOR_COUNT (2)
+#define CIRCUITPY_PROCESSOR_COUNT (2)
// This also includes mpconfigboard.h.
#include "py/circuitpy_mpconfig.h"
diff --git a/ports/raspberrypi/mpconfigport.mk b/ports/raspberrypi/mpconfigport.mk
index dc0c85b68..4c149cb2b 100644
--- a/ports/raspberrypi/mpconfigport.mk
+++ b/ports/raspberrypi/mpconfigport.mk
@@ -23,21 +23,23 @@ else
CIRCUITPY_NEOPIXEL_WRITE = 0
endif
+CIRCUITPY_FRAMEBUFFERIO = 1
CIRCUITPY_FULL_BUILD = 1
CIRCUITPY_BITOPS = 1
CIRCUITPY_PWMIO = 1
+CIRCUITPY_RGBMATRIX = 1
# Things that need to be implemented.
CIRCUITPY_FREQUENCYIO = 0 # Use PWM interally
CIRCUITPY_I2CPERIPHERAL = 0
-CIRCUITPY_NVM = 0
+CIRCUITPY_NVM = 1
CIRCUITPY_PULSEIO = 0 # Use PIO interally
CIRCUITPY_ROTARYIO = 0 # Use PIO interally
CIRCUITPY_WATCHDOG = 1
# Audio via PWM
CIRCUITPY_AUDIOIO = 0
-CIRCUITPY_AUDIOBUSIO ?= 0 # add this later
+CIRCUITPY_AUDIOBUSIO ?= 1
CIRCUITPY_AUDIOCORE ?= 1
CIRCUITPY_AUDIOPWMIO ?= 1
diff --git a/ports/raspberrypi/supervisor/port.c b/ports/raspberrypi/supervisor/port.c
index 36d2e8275..501a0c5ce 100644
--- a/ports/raspberrypi/supervisor/port.c
+++ b/ports/raspberrypi/supervisor/port.c
@@ -39,6 +39,9 @@
#include "shared-bindings/rtc/__init__.h"
#include "shared-bindings/pwmio/PWMOut.h"
+#include "common-hal/rtc/RTC.h"
+#include "common-hal/busio/UART.h"
+
#include "supervisor/shared/safe_mode.h"
#include "supervisor/shared/stack.h"
#include "supervisor/shared/tick.h"
@@ -78,6 +81,9 @@ safe_mode_t port_init(void) {
// Reset everything into a known state before board_init.
reset_port();
+ // Initialize RTC
+ common_hal_rtc_init();
+
// For the tick.
hardware_alarm_claim(0);
hardware_alarm_set_callback(0, _tick_callback);
@@ -95,6 +101,7 @@ void reset_port(void) {
#if CIRCUITPY_BUSIO
reset_i2c();
reset_spi();
+ reset_uart();
#endif
#if CIRCUITPY_PWMIO
@@ -112,6 +119,9 @@ void reset_port(void) {
#if CIRCUITPY_AUDIOPWMIO
audiopwmout_reset();
#endif
+ #if CIRCUITPY_AUDIOCORE
+ audio_dma_reset();
+ #endif
reset_all_pins();
}
diff --git a/ports/stm/boards/espruino_pico/mpconfigboard.mk b/ports/stm/boards/espruino_pico/mpconfigboard.mk
index 6d45769f2..d6118adf8 100644
--- a/ports/stm/boards/espruino_pico/mpconfigboard.mk
+++ b/ports/stm/boards/espruino_pico/mpconfigboard.mk
@@ -21,6 +21,7 @@ LD_FILE = boards/STM32F401xd_fs.ld
# meantime
CIRCUITPY_ULAB = 0
CIRCUITPY_BUSDEVICE = 0
+CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_FRAMEBUFFERIO = 0
SUPEROPT_GC = 0
diff --git a/ports/stm/common-hal/rgbmatrix/RGBMatrix.c b/ports/stm/common-hal/rgbmatrix/RGBMatrix.c
index 2826cf53e..36ed6d018 100644
--- a/ports/stm/common-hal/rgbmatrix/RGBMatrix.c
+++ b/ports/stm/common-hal/rgbmatrix/RGBMatrix.c
@@ -33,7 +33,7 @@
extern void _PM_IRQ_HANDLER(void);
-void *common_hal_rgbmatrix_timer_allocate() {
+void *common_hal_rgbmatrix_timer_allocate(rgbmatrix_rgbmatrix_obj_t *self) {
TIM_TypeDef * timer = stm_peripherals_find_timer();
stm_peripherals_timer_reserve(timer);
stm_peripherals_timer_never_reset(timer);
diff --git a/ports/stm/common-hal/rgbmatrix/RGBMatrix.h b/ports/stm/common-hal/rgbmatrix/RGBMatrix.h
index 323878d20..2debb6a76 100644
--- a/ports/stm/common-hal/rgbmatrix/RGBMatrix.h
+++ b/ports/stm/common-hal/rgbmatrix/RGBMatrix.h
@@ -27,7 +27,9 @@
#ifndef MICROPY_INCLUDED_STM_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
#define MICROPY_INCLUDED_STM_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
-void *common_hal_rgbmatrix_timer_allocate(void);
+#include "shared-module/rgbmatrix/RGBMatrix.h"
+
+void *common_hal_rgbmatrix_timer_allocate(rgbmatrix_rgbmatrix_obj_t *self);
void common_hal_rgbmatrix_timer_enable(void*);
void common_hal_rgbmatrix_timer_disable(void*);
void common_hal_rgbmatrix_timer_free(void*);
diff --git a/py/circuitpy_defns.mk b/py/circuitpy_defns.mk
index 943c99f93..bb177c5d0 100644
--- a/py/circuitpy_defns.mk
+++ b/py/circuitpy_defns.mk
@@ -139,6 +139,9 @@ endif
ifeq ($(CIRCUITPY_BITBANG_APA102),1)
SRC_PATTERNS += bitbangio/SPI%
endif
+ifeq ($(CIRCUITPY_BITMAPTOOLS),1)
+SRC_PATTERNS += bitmaptools/%
+endif
ifeq ($(CIRCUITPY_BITOPS),1)
SRC_PATTERNS += bitops/%
endif
@@ -472,6 +475,7 @@ SRC_SHARED_MODULE_ALL = \
bitbangio/OneWire.c \
bitbangio/SPI.c \
bitbangio/__init__.c \
+ bitmaptools/__init__.c \
bitops/__init__.c \
board/__init__.c \
adafruit_bus_device/__init__.c \
diff --git a/py/circuitpy_mpconfig.h b/py/circuitpy_mpconfig.h
index cbe668289..3eda3b004 100644
--- a/py/circuitpy_mpconfig.h
+++ b/py/circuitpy_mpconfig.h
@@ -306,6 +306,13 @@ extern const struct _mp_obj_module_t bitbangio_module;
#define BITBANGIO_MODULE
#endif
+#if CIRCUITPY_BITMAPTOOLS
+#define BITMAPTOOLS_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_bitmaptools), (mp_obj_t)&bitmaptools_module },
+extern const struct _mp_obj_module_t bitmaptools_module;
+#else
+#define BITMAPTOOLS_MODULE
+#endif
+
#if CIRCUITPY_BITOPS
extern const struct _mp_obj_module_t bitops_module;
#define BITOPS_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_bitops),(mp_obj_t)&bitops_module },
@@ -313,7 +320,6 @@ extern const struct _mp_obj_module_t bitops_module;
#define BITOPS_MODULE
#endif
-
#if CIRCUITPY_BLEIO
#define BLEIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR__bleio), (mp_obj_t)&bleio_module },
extern const struct _mp_obj_module_t bleio_module;
@@ -835,6 +841,7 @@ extern const struct _mp_obj_module_t msgpack_module;
AUDIOPWMIO_MODULE \
BINASCII_MODULE \
BITBANGIO_MODULE \
+ BITMAPTOOLS_MODULE \
BITOPS_MODULE \
BLEIO_MODULE \
BOARD_MODULE \
diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk
index ad6386636..a5b0ed8a4 100644
--- a/py/circuitpy_mpconfig.mk
+++ b/py/circuitpy_mpconfig.mk
@@ -152,11 +152,15 @@ CFLAGS += -DCIRCUITPY_ERRNO=$(CIRCUITPY_ERRNO)
CIRCUITPY_ESPIDF ?= 0
CFLAGS += -DCIRCUITPY_ESPIDF=$(CIRCUITPY_ESPIDF)
+# bitmaptools and framebufferio rely on displayio
ifeq ($(CIRCUITPY_DISPLAYIO),1)
+CIRCUITPY_BITMAPTOOLS ?= $(CIRCUITPY_FULL_BUILD)
CIRCUITPY_FRAMEBUFFERIO ?= $(CIRCUITPY_FULL_BUILD)
else
+CIRCUITPY_BITMAPTOOLS ?= 0
CIRCUITPY_FRAMEBUFFERIO ?= 0
endif
+CFLAGS += -DCIRCUITPY_BITMAPTOOLS=$(CIRCUITPY_BITMAPTOOLS)
CFLAGS += -DCIRCUITPY_FRAMEBUFFERIO=$(CIRCUITPY_FRAMEBUFFERIO)
CIRCUITPY_VECTORIO ?= $(CIRCUITPY_DISPLAYIO)
diff --git a/py/gc.c b/py/gc.c
index 69327060f..2aa2668dc 100755
--- a/py/gc.c
+++ b/py/gc.c
@@ -192,7 +192,7 @@ void gc_init(void *start, void *end) {
}
void gc_deinit(void) {
- // Run any finalizers before we stop using the heap.
+ // Run any finalisers before we stop using the heap.
gc_sweep_all();
MP_STATE_MEM(gc_pool_start) = 0;
diff --git a/py/malloc.c b/py/malloc.c
index 8d5141ee0..c923e89a6 100644
--- a/py/malloc.c
+++ b/py/malloc.c
@@ -57,7 +57,7 @@
#undef free
#undef realloc
#define malloc_ll(b, ll) gc_alloc((b), false, (ll))
-#define malloc_with_finaliser(b) gc_alloc((b), true, false)
+#define malloc_with_finaliser(b, ll) gc_alloc((b), true, (ll))
#define free gc_free
#define realloc(ptr, n) gc_realloc(ptr, n, true)
#define realloc_ext(ptr, n, mv) gc_realloc(ptr, n, mv)
@@ -103,8 +103,8 @@ void *m_malloc_maybe(size_t num_bytes, bool long_lived) {
}
#if MICROPY_ENABLE_FINALISER
-void *m_malloc_with_finaliser(size_t num_bytes) {
- void *ptr = malloc_with_finaliser(num_bytes);
+void *m_malloc_with_finaliser(size_t num_bytes, bool long_lived) {
+ void *ptr = malloc_with_finaliser(num_bytes, long_lived);
if (ptr == NULL && num_bytes != 0) {
m_malloc_fail(num_bytes);
}
diff --git a/py/misc.h b/py/misc.h
index 6ed256e70..0fef7e249 100644
--- a/py/misc.h
+++ b/py/misc.h
@@ -72,11 +72,13 @@ typedef unsigned int uint;
#define m_new_obj_var_maybe(obj_type, var_type, var_num) ((obj_type*)m_malloc_maybe(sizeof(obj_type) + sizeof(var_type) * (var_num), false))
#define m_new_ll_obj_var_maybe(obj_type, var_type, var_num) ((obj_type*)m_malloc_maybe(sizeof(obj_type) + sizeof(var_type) * (var_num), true))
#if MICROPY_ENABLE_FINALISER
-#define m_new_obj_with_finaliser(type) ((type*)(m_malloc_with_finaliser(sizeof(type))))
-#define m_new_obj_var_with_finaliser(type, var_type, var_num) ((type*)m_malloc_with_finaliser(sizeof(type) + sizeof(var_type) * (var_num)))
+#define m_new_obj_with_finaliser(type) ((type*)(m_malloc_with_finaliser(sizeof(type), false)))
+#define m_new_obj_var_with_finaliser(type, var_type, var_num) ((type*)m_malloc_with_finaliser(sizeof(type) + sizeof(var_type) * (var_num), false))
+#define m_new_ll_obj_with_finaliser(type) ((type*)(m_malloc_with_finaliser(sizeof(type), true)))
#else
#define m_new_obj_with_finaliser(type) m_new_obj(type)
#define m_new_obj_var_with_finaliser(type, var_type, var_num) m_new_obj_var(type, var_type, var_num)
+#define m_new_ll_obj_with_finaliser(type) m_new_ll_obj(type)
#endif
#if MICROPY_MALLOC_USES_ALLOCATED_SIZE
#define m_renew(type, ptr, old_num, new_num) ((type*)(m_realloc((ptr), sizeof(type) * (old_num), sizeof(type) * (new_num))))
@@ -93,7 +95,7 @@ typedef unsigned int uint;
void *m_malloc(size_t num_bytes, bool long_lived);
void *m_malloc_maybe(size_t num_bytes, bool long_lived);
-void *m_malloc_with_finaliser(size_t num_bytes);
+void *m_malloc_with_finaliser(size_t num_bytes, bool long_lived);
void *m_malloc0(size_t num_bytes, bool long_lived);
#if MICROPY_MALLOC_USES_ALLOCATED_SIZE
void *m_realloc(void *ptr, size_t old_num_bytes, size_t new_num_bytes);
diff --git a/py/objlist.c b/py/objlist.c
index 51ec920be..7aa4ee89c 100644
--- a/py/objlist.c
+++ b/py/objlist.c
@@ -270,13 +270,10 @@ STATIC mp_obj_t list_extend(mp_obj_t self_in, mp_obj_t arg_in) {
return mp_const_none; // return None, as per CPython
}
-STATIC mp_obj_t list_pop(size_t n_args, const mp_obj_t *args) {
- mp_check_self(MP_OBJ_IS_TYPE(args[0], &mp_type_list));
- mp_obj_list_t *self = mp_instance_cast_to_native_base(args[0], &mp_type_list);
+inline mp_obj_t mp_obj_list_pop(mp_obj_list_t *self, size_t index) {
if (self->len == 0) {
mp_raise_IndexError_varg(translate("pop from empty %q"), MP_QSTR_list);
}
- size_t index = mp_get_index(self->base.type, self->len, n_args == 1 ? MP_OBJ_NEW_SMALL_INT(-1) : args[1], false);
mp_obj_t ret = self->items[index];
self->len -= 1;
memmove(self->items + index, self->items + index + 1, (self->len - index) * sizeof(mp_obj_t));
@@ -289,6 +286,13 @@ STATIC mp_obj_t list_pop(size_t n_args, const mp_obj_t *args) {
return ret;
}
+STATIC mp_obj_t list_pop(size_t n_args, const mp_obj_t *args) {
+ mp_check_self(MP_OBJ_IS_TYPE(args[0], &mp_type_list));
+ mp_obj_list_t *self = mp_instance_cast_to_native_base(args[0], &mp_type_list);
+ size_t index = mp_get_index(self->base.type, self->len, n_args == 1 ? MP_OBJ_NEW_SMALL_INT(-1) : args[1], false);
+ return mp_obj_list_pop(self, index);
+}
+
STATIC void mp_quicksort(mp_obj_t *head, mp_obj_t *tail, mp_obj_t key_fn, mp_obj_t binop_less_result) {
MP_STACK_CHECK();
while (head < tail) {
@@ -371,6 +375,15 @@ STATIC mp_obj_t list_index(size_t n_args, const mp_obj_t *args) {
return mp_seq_index_obj(self->items, self->len, n_args, args);
}
+inline void mp_obj_list_insert(mp_obj_list_t *self, size_t index, mp_obj_t obj) {
+ mp_obj_list_append(MP_OBJ_FROM_PTR(self), mp_const_none);
+
+ for (size_t i = self->len - 1; i > index; --i) {
+ self->items[i] = self->items[i - 1];
+ }
+ self->items[index] = obj;
+}
+
STATIC mp_obj_t list_insert(mp_obj_t self_in, mp_obj_t idx, mp_obj_t obj) {
mp_check_self(MP_OBJ_IS_TYPE(self_in, &mp_type_list));
mp_obj_list_t *self = mp_instance_cast_to_native_base(self_in, &mp_type_list);
@@ -385,14 +398,7 @@ STATIC mp_obj_t list_insert(mp_obj_t self_in, mp_obj_t idx, mp_obj_t obj) {
if ((size_t)index > self->len) {
index = self->len;
}
-
- mp_obj_list_append(self_in, mp_const_none);
-
- for (mp_int_t i = self->len-1; i > index; i--) {
- self->items[i] = self->items[i-1];
- }
- self->items[index] = obj;
-
+ mp_obj_list_insert(self, index, obj);
return mp_const_none;
}
diff --git a/py/objlist.h b/py/objlist.h
index f02030557..eb005e81c 100644
--- a/py/objlist.h
+++ b/py/objlist.h
@@ -36,5 +36,7 @@ typedef struct _mp_obj_list_t {
} mp_obj_list_t;
void mp_obj_list_init(mp_obj_list_t *o, size_t n);
+mp_obj_t mp_obj_list_pop(mp_obj_list_t *self, size_t index);
+void mp_obj_list_insert(mp_obj_list_t *self, size_t index, mp_obj_t obj);
#endif // MICROPY_INCLUDED_PY_OBJLIST_H
diff --git a/shared-bindings/bitmaptools/__init__.c b/shared-bindings/bitmaptools/__init__.c
new file mode 100644
index 000000000..cf48d12dc
--- /dev/null
+++ b/shared-bindings/bitmaptools/__init__.c
@@ -0,0 +1,256 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021 Kevin Matocha
+ *
+ * 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 "shared-bindings/displayio/Bitmap.h"
+#include "shared-bindings/bitmaptools/__init__.h"
+
+#include <stdint.h>
+
+#include "py/obj.h"
+#include "py/runtime.h"
+
+//| """Collection of bitmap manipulation tools"""
+//|
+
+STATIC int16_t validate_point(mp_obj_t point, int16_t default_value) {
+ // Checks if point is None and returns default_value, otherwise decodes integer value
+ if ( point == mp_const_none ) {
+ return default_value;
+ }
+ return mp_obj_get_int(point);
+}
+
+STATIC void extract_tuple(mp_obj_t xy_tuple, int16_t *x, int16_t *y, int16_t x_default, int16_t y_default) {
+ // Helper function for rotozoom
+ // Extract x,y values from a tuple or default if None
+ if ( xy_tuple == mp_const_none ) {
+ *x = x_default;
+ *y = y_default;
+ } else if ( !MP_OBJ_IS_OBJ(xy_tuple) ) {
+ mp_raise_ValueError(translate("clip point must be (x,y) tuple"));
+ } else {
+ mp_obj_t* items;
+ mp_obj_get_array_fixed_n(xy_tuple, 2, &items);
+ *x = mp_obj_get_int(items[0]);
+ *y = mp_obj_get_int(items[1]);
+ }
+}
+
+STATIC void validate_clip_region(displayio_bitmap_t *bitmap, mp_obj_t clip0_tuple, int16_t *clip0_x, int16_t *clip0_y,
+ mp_obj_t clip1_tuple, int16_t *clip1_x, int16_t *clip1_y) {
+ // Helper function for rotozoom
+ // 1. Extract the clip x,y points from the two clip tuples
+ // 2. Rearrange values such that clip0_ < clip1_
+ // 3. Constrain the clip points to within the bitmap
+
+ extract_tuple(clip0_tuple, clip0_x, clip0_y, 0, 0);
+ extract_tuple(clip1_tuple, clip1_x, clip1_y, bitmap->width, bitmap->height);
+
+ // Ensure the value for clip0 is less than clip1 (for both x and y)
+ if ( *clip0_x > *clip1_x ) {
+ int16_t temp_value = *clip0_x; // swap values
+ *clip0_x = *clip1_x;
+ *clip1_x = temp_value;
+ }
+ if ( *clip0_y > *clip1_y ) {
+ int16_t temp_value = *clip0_y; // swap values
+ *clip0_y = *clip1_y;
+ *clip1_y = temp_value;
+ }
+
+ // Constrain the clip window to within the bitmap boundaries
+ if (*clip0_x < 0) {
+ *clip0_x = 0;
+ }
+ if (*clip0_y < 0) {
+ *clip0_y = 0;
+ }
+ if (*clip0_x > bitmap->width) {
+ *clip0_x = bitmap->width;
+ }
+ if (*clip0_y > bitmap->height) {
+ *clip0_y = bitmap->height;
+ }
+ if (*clip1_x < 0) {
+ *clip1_x = 0;
+ }
+ if (*clip1_y < 0) {
+ *clip1_y = 0;
+ }
+ if (*clip1_x > bitmap->width) {
+ *clip1_x = bitmap->width;
+ }
+ if (*clip1_y > bitmap->height) {
+ *clip1_y = bitmap->height;
+ }
+
+}
+
+//|
+//| def rotozoom(
+//| dest_bitmap: displayio.Bitmap, source_bitmap: displayio.Bitmap,
+//| *,
+//| ox: int, oy: int, dest_clip0: Tuple[int, int], dest_clip1: Tuple[int, int],
+//| px: int, py: int, source_clip0: Tuple[int, int], source_clip1: Tuple[int, int],
+//| angle: float, scale: float, skip_index: int) -> None:
+//| """Inserts the source bitmap region into the destination bitmap with rotation
+//| (angle), scale and clipping (both on source and destination bitmaps).
+//|
+//| :param bitmap dest_bitmap: Destination bitmap that will be copied into
+//| :param bitmap source_bitmap: Source bitmap that contains the graphical region to be copied
+//| :param int ox: Horizontal pixel location in destination bitmap where source bitmap
+//| point (px,py) is placed
+//| :param int oy: Vertical pixel location in destination bitmap where source bitmap
+//| point (px,py) is placed
+//| :param Tuple[int,int] dest_clip0: First corner of rectangular destination clipping
+//| region that constrains region of writing into destination bitmap
+//| :param Tuple[int,int] dest_clip1: Second corner of rectangular destination clipping
+//| region that constrains region of writing into destination bitmap
+//| :param int px: Horizontal pixel location in source bitmap that is placed into the
+//| destination bitmap at (ox,oy)
+//| :param int py: Vertical pixel location in source bitmap that is placed into the
+//| destination bitmap at (ox,oy)
+//| :param Tuple[int,int] source_clip0: First corner of rectangular source clipping
+//| region that constrains region of reading from the source bitmap
+//| :param Tuple[int,int] source_clip1: Second corner of rectangular source clipping
+//| region that constrains region of reading from the source bitmap
+//| :param float angle: Angle of rotation, in radians (positive is clockwise direction)
+//| :param float scale: Scaling factor
+//| :param int skip_index: Bitmap palette index in the source that will not be copied,
+//| set to None to copy all pixels"""
+//| ...
+//|
+STATIC mp_obj_t bitmaptools_obj_rotozoom(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args){
+ enum {ARG_dest_bitmap, ARG_source_bitmap,
+ ARG_ox, ARG_oy, ARG_dest_clip0, ARG_dest_clip1,
+ ARG_px, ARG_py, ARG_source_clip0, ARG_source_clip1,
+ ARG_angle, ARG_scale, ARG_skip_index};
+
+ static const mp_arg_t allowed_args[] = {
+ {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
+ {MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
+
+ {MP_QSTR_ox, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, // None convert to destination->width / 2
+ {MP_QSTR_oy, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, // None convert to destination->height / 2
+ {MP_QSTR_dest_clip0, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+ {MP_QSTR_dest_clip1, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+
+ {MP_QSTR_px, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, // None convert to source->width / 2
+ {MP_QSTR_py, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, // None convert to source->height / 2
+ {MP_QSTR_source_clip0, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+ {MP_QSTR_source_clip1, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+
+ {MP_QSTR_angle, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, // None convert to 0.0
+ {MP_QSTR_scale, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, // None convert to 1.0
+ {MP_QSTR_skip_index, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj=mp_const_none} },
+ };
+
+ 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);
+
+ displayio_bitmap_t *destination = MP_OBJ_TO_PTR(args[ARG_dest_bitmap].u_obj); // the destination bitmap
+
+ displayio_bitmap_t *source = MP_OBJ_TO_PTR(args[ARG_source_bitmap].u_obj); // the source bitmap
+
+ // ensure that the destination bitmap has at least as many `bits_per_value` as the source
+ if (destination->bits_per_value < source->bits_per_value) {
+ mp_raise_ValueError(translate("source palette too large"));
+ }
+
+ // Confirm the destination location target (ox,oy); if None, default to bitmap midpoint
+ int16_t ox, oy;
+ ox = validate_point(args[ARG_ox].u_obj, destination->width / 2);
+ oy = validate_point(args[ARG_oy].u_obj, destination->height / 2);
+
+ // Confirm the source location target (px,py); if None, default to bitmap midpoint
+ int16_t px, py;
+ px = validate_point(args[ARG_px].u_obj, source->width / 2);
+ py = validate_point(args[ARG_py].u_obj, source->height / 2);
+
+ // Validate the clipping regions for the destination bitmap
+ int16_t dest_clip0_x, dest_clip0_y, dest_clip1_x, dest_clip1_y;
+
+ validate_clip_region(destination, args[ARG_dest_clip0].u_obj, &dest_clip0_x, &dest_clip0_y,
+ args[ARG_dest_clip1].u_obj, &dest_clip1_x, &dest_clip1_y);
+
+ // Validate the clipping regions for the source bitmap
+ int16_t source_clip0_x, source_clip0_y, source_clip1_x, source_clip1_y;
+
+ validate_clip_region(source, args[ARG_source_clip0].u_obj, &source_clip0_x, &source_clip0_y,
+ args[ARG_source_clip1].u_obj, &source_clip1_x, &source_clip1_y);
+
+ // Confirm the angle value
+ float angle=0.0;
+ if ( args[ARG_angle].u_obj != mp_const_none ) {
+ angle = mp_obj_get_float(args[ARG_angle].u_obj);
+ }
+
+ // Confirm the scale value
+ float scale=1.0;
+ if ( args[ARG_scale].u_obj != mp_const_none ) {
+ scale = mp_obj_get_float(args[ARG_scale].u_obj);
+ }
+ if (scale < 0) { // ensure scale >= 0
+ scale = 1.0;
+ }
+
+ uint32_t skip_index;
+ bool skip_index_none; // Flag whether input skip_value was None
+ if (args[ARG_skip_index].u_obj == mp_const_none ) {
+ skip_index = 0;
+ skip_index_none = true;
+ } else {
+ skip_index = mp_obj_get_int(args[ARG_skip_index].u_obj);
+ skip_index_none = false;
+ }
+
+ common_hal_bitmaptools_rotozoom(destination, ox, oy,
+ dest_clip0_x, dest_clip0_y,
+ dest_clip1_x, dest_clip1_y,
+ source, px, py,
+ source_clip0_x, source_clip0_y,
+ source_clip1_x, source_clip1_y,
+ angle,
+ scale,
+ skip_index, skip_index_none);
+
+ return mp_const_none;
+}
+
+MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_rotozoom_obj, 0, bitmaptools_obj_rotozoom);
+// requires at least 2 arguments (destination bitmap and source bitmap)
+
+
+STATIC const mp_rom_map_elem_t bitmaptools_module_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_rotozoom), MP_ROM_PTR(&bitmaptools_rotozoom_obj) },
+};
+STATIC MP_DEFINE_CONST_DICT(bitmaptools_module_globals, bitmaptools_module_globals_table);
+
+
+const mp_obj_module_t bitmaptools_module = {
+ .base = {&mp_type_module },
+ .globals = (mp_obj_dict_t*)&bitmaptools_module_globals,
+};
diff --git a/shared-bindings/bitmaptools/__init__.h b/shared-bindings/bitmaptools/__init__.h
new file mode 100644
index 000000000..e2bb6938b
--- /dev/null
+++ b/shared-bindings/bitmaptools/__init__.h
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021 Kevin Matocha
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BITMAPTOOLS__INIT__H
+#define MICROPY_INCLUDED_SHARED_BINDINGS_BITMAPTOOLS__INIT__H
+
+#include "py/obj.h"
+
+void common_hal_bitmaptools_rotozoom(displayio_bitmap_t *self, int16_t ox, int16_t oy,
+ int16_t dest_clip0_x, int16_t dest_clip0_y,
+ int16_t dest_clip1_x, int16_t dest_clip1_y,
+ displayio_bitmap_t *source, int16_t px, int16_t py,
+ int16_t source_clip0_x, int16_t source_clip0_y,
+ int16_t source_clip1_x, int16_t source_clip1_y,
+ float angle,
+ float scale,
+ uint32_t skip_index, bool skip_index_none);
+
+#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BITMAPTOOLS__INIT__H
diff --git a/shared-bindings/busio/SPI.c b/shared-bindings/busio/SPI.c
index e47564c8c..cbc6b5c08 100644
--- a/shared-bindings/busio/SPI.c
+++ b/shared-bindings/busio/SPI.c
@@ -57,7 +57,7 @@
//|
//| """Construct an SPI object on the given pins.
//|
-//| ..note:: The SPI peripherals allocated in order of desirability, if possible,
+//| .. note:: The SPI peripherals allocated in order of desirability, if possible,
//| such as highest speed and not shared use first. For instance, on the nRF52840,
//| there is a single 32MHz SPI peripheral, and multiple 8MHz peripherals,
//| some of which may also be used for I2C. The 32MHz SPI peripheral is returned
diff --git a/shared-bindings/busio/UART.c b/shared-bindings/busio/UART.c
index f48109fde..06647e779 100644
--- a/shared-bindings/busio/UART.c
+++ b/shared-bindings/busio/UART.c
@@ -55,7 +55,7 @@
//| :param ~microcontroller.Pin rs485_dir: the output pin for rs485 direction setting, or ``None`` if rs485 not in use.
//| :param bool rs485_invert: rs485_dir pin active high when set. Active low otherwise.
//| :param int baudrate: the transmit and receive speed.
-//| :param int bits: the number of bits per byte, 7, 8 or 9.
+//| :param int bits: the number of bits per byte, 5 to 9.
//| :param Parity parity: the parity used for error checking.
//| :param int stop: the number of stop bits, 1 or 2.
//| :param float timeout: the timeout in seconds to wait for the first character and between subsequent characters when reading. Raises ``ValueError`` if timeout >100 seconds.
@@ -82,7 +82,7 @@ STATIC mp_obj_t busio_uart_make_new(const mp_obj_type_t *type, size_t n_args, co
// This is needed to avoid crashes with certain UART implementations which
// cannot accomodate being moved after creation. (See
// https://github.com/adafruit/circuitpython/issues/1056)
- busio_uart_obj_t *self = m_new_ll_obj(busio_uart_obj_t);
+ busio_uart_obj_t *self = m_new_ll_obj_with_finaliser(busio_uart_obj_t);
self->base.type = &busio_uart_type;
enum { ARG_tx, ARG_rx, ARG_baudrate, ARG_bits, ARG_parity, ARG_stop, ARG_timeout, ARG_receiver_buffer_size,
ARG_rts, ARG_cts, ARG_rs485_dir,ARG_rs485_invert};
@@ -110,10 +110,10 @@ STATIC mp_obj_t busio_uart_make_new(const mp_obj_type_t *type, size_t n_args, co
mp_raise_ValueError(translate("tx and rx cannot both be None"));
}
- uint8_t bits = args[ARG_bits].u_int;
- if (bits < 7 || bits > 9) {
- mp_raise_ValueError(translate("bits must be 7, 8 or 9"));
+ if (args[ARG_bits].u_int < 5 || args[ARG_bits].u_int > 9) {
+ mp_raise_ValueError(translate("bits must be in range 5 to 9"));
}
+ uint8_t bits = args[ARG_bits].u_int;
busio_uart_parity_t parity = BUSIO_UART_PARITY_NONE;
if (args[ARG_parity].u_obj == &busio_uart_parity_even_obj) {
@@ -387,6 +387,7 @@ const mp_obj_type_t busio_uart_parity_type = {
};
STATIC const mp_rom_map_elem_t busio_uart_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&busio_uart_deinit_obj) },
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&busio_uart_deinit_obj) },
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) },
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&busio_uart___exit___obj) },
diff --git a/shared-bindings/displayio/Group.c b/shared-bindings/displayio/Group.c
index 386e270ab..c1c05504d 100644
--- a/shared-bindings/displayio/Group.c
+++ b/shared-bindings/displayio/Group.c
@@ -42,7 +42,7 @@
//| """Create a Group of a given size and scale. Scale is in one dimension. For example, scale=2
//| leads to a layer's pixel being 2x2 pixels when in the group.
//|
-//| :param int max_size: The maximum group size.
+//| :param int max_size: Ignored. Will be removed in 7.x.
//| :param int scale: Scale of layer pixels in one dimension.
//| :param int x: Initial x position within the parent.
//| :param int y: Initial y position within the parent."""
@@ -59,11 +59,6 @@ STATIC mp_obj_t displayio_group_make_new(const mp_obj_type_t *type, size_t n_arg
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);
- mp_int_t max_size = args[ARG_max_size].u_int;
- if (max_size < 1) {
- mp_raise_ValueError_varg(translate("%q must be >= 1"), MP_QSTR_max_size);
- }
-
mp_int_t scale = args[ARG_scale].u_int;
if (scale < 1) {
mp_raise_ValueError_varg(translate("%q must be >= 1"), MP_QSTR_scale);
@@ -71,7 +66,7 @@ STATIC mp_obj_t displayio_group_make_new(const mp_obj_type_t *type, size_t n_arg
displayio_group_t *self = m_new_obj(displayio_group_t);
self->base.type = &displayio_group_type;
- common_hal_displayio_group_construct(self, max_size, scale, args[ARG_x].u_int, args[ARG_y].u_int);
+ common_hal_displayio_group_construct(self, scale, args[ARG_x].u_int, args[ARG_y].u_int);
return MP_OBJ_FROM_PTR(self);
}
@@ -328,6 +323,21 @@ STATIC mp_obj_t group_subscr(mp_obj_t self_in, mp_obj_t index_obj, mp_obj_t valu
return mp_const_none;
}
+//| def sort(self, key: function, reverse: bool) -> None:
+//| """Sort the members of the group."""
+//| ...
+//|
+STATIC mp_obj_t displayio_group_obj_sort(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ displayio_group_t *self = native_group(pos_args[0]);
+ mp_obj_t *args = m_new(mp_obj_t, n_args);
+ for (size_t i = 1; i < n_args; ++i) {
+ args[i] = pos_args[i];
+ }
+ args[0] = MP_OBJ_FROM_PTR(self->members);
+ return mp_obj_list_sort(n_args, pos_args, kw_args);
+}
+MP_DEFINE_CONST_FUN_OBJ_KW(displayio_group_sort_obj, 1, displayio_group_obj_sort);
+
STATIC const mp_rom_map_elem_t displayio_group_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_hidden), MP_ROM_PTR(&displayio_group_hidden_obj) },
{ MP_ROM_QSTR(MP_QSTR_scale), MP_ROM_PTR(&displayio_group_scale_obj) },
@@ -338,6 +348,7 @@ STATIC const mp_rom_map_elem_t displayio_group_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_index), MP_ROM_PTR(&displayio_group_index_obj) },
{ MP_ROM_QSTR(MP_QSTR_pop), MP_ROM_PTR(&displayio_group_pop_obj) },
{ MP_ROM_QSTR(MP_QSTR_remove), MP_ROM_PTR(&displayio_group_remove_obj) },
+ { MP_ROM_QSTR(MP_QSTR_sort), MP_ROM_PTR(&displayio_group_sort_obj) },
};
STATIC MP_DEFINE_CONST_DICT(displayio_group_locals_dict, displayio_group_locals_dict_table);
diff --git a/shared-bindings/displayio/Group.h b/shared-bindings/displayio/Group.h
index 942a207f2..69c73bf4d 100644
--- a/shared-bindings/displayio/Group.h
+++ b/shared-bindings/displayio/Group.h
@@ -33,7 +33,7 @@ extern const mp_obj_type_t displayio_group_type;
displayio_group_t* native_group(mp_obj_t group_obj);
-void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t max_size, uint32_t scale, mp_int_t x, mp_int_t y);
+void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t scale, mp_int_t x, mp_int_t y);
uint32_t common_hal_displayio_group_get_scale(displayio_group_t* self);
void common_hal_displayio_group_set_scale(displayio_group_t* self, uint32_t scale);
bool common_hal_displayio_group_get_hidden(displayio_group_t* self);
diff --git a/shared-bindings/pwmio/PWMOut.h b/shared-bindings/pwmio/PWMOut.h
index 1a99914ea..de2ebd1cf 100644
--- a/shared-bindings/pwmio/PWMOut.h
+++ b/shared-bindings/pwmio/PWMOut.h
@@ -32,7 +32,7 @@
extern const mp_obj_type_t pwmio_pwmout_type;
-typedef enum {
+typedef enum pwmout_result_t {
PWMOUT_OK,
PWMOUT_INVALID_PIN,
PWMOUT_INVALID_FREQUENCY,
diff --git a/shared-module/_pixelbuf/PixelBuf.c b/shared-module/_pixelbuf/PixelBuf.c
index f3e679631..4cbf6dc21 100644
--- a/shared-module/_pixelbuf/PixelBuf.c
+++ b/shared-module/_pixelbuf/PixelBuf.c
@@ -31,6 +31,7 @@
#include "py/runtime.h"
#include "shared-bindings/_pixelbuf/PixelBuf.h"
#include <string.h>
+#include <math.h>
// Helper to ensure we have the native super class instead of a subclass.
static pixelbuf_pixelbuf_obj_t* native_pixelbuf(mp_obj_t pixelbuf_obj) {
@@ -69,6 +70,7 @@ void common_hal__pixelbuf_pixelbuf_construct(pixelbuf_pixelbuf_obj_t *self, size
}
// Call set_brightness so that it can allocate a second buffer if needed.
self->brightness = 1.0;
+ self->scaled_brightness = 0x100;
common_hal__pixelbuf_pixelbuf_set_brightness(MP_OBJ_FROM_PTR(self), brightness);
// Turn on auto_write. We don't want to do it with the above brightness call.
@@ -109,26 +111,32 @@ void common_hal__pixelbuf_pixelbuf_set_brightness(mp_obj_t self_in, mp_float_t b
pixelbuf_pixelbuf_obj_t* self = native_pixelbuf(self_in);
// Skip out if the brightness is already set. The default of self->brightness is 1.0. So, this
// also prevents the pre_brightness_buffer allocation when brightness is set to 1.0 again.
- mp_float_t change = brightness - self->brightness;
- if (-0.001 < change && change < 0.001) {
+ self->brightness = brightness;
+ // Use 256 steps of brightness so that we can do integer math below.
+ uint16_t new_scaled_brightness = (uint16_t)(brightness * 256);
+ if (new_scaled_brightness == self->scaled_brightness) {
return;
}
- self->brightness = brightness;
+ self->scaled_brightness = new_scaled_brightness;
size_t pixel_len = self->pixel_count * self->bytes_per_pixel;
- if (self->pre_brightness_buffer == NULL) {
- self->pre_brightness_buffer = m_malloc(pixel_len, false);
- memcpy(self->pre_brightness_buffer, self->post_brightness_buffer, pixel_len);
- }
- for (size_t i = 0; i < pixel_len; i++) {
- // Don't adjust per-pixel luminance bytes in dotstar mode
- if (self->byteorder.is_dotstar && i % 4 == 0) {
- continue;
+ if (self->scaled_brightness == 0x100 && !self->pre_brightness_buffer) {
+ return;
+ } else {
+ if (self->pre_brightness_buffer == NULL) {
+ self->pre_brightness_buffer = m_malloc(pixel_len, false);
+ memcpy(self->pre_brightness_buffer, self->post_brightness_buffer, pixel_len);
+ }
+ for (size_t i = 0; i < pixel_len; i++) {
+ // Don't adjust per-pixel luminance bytes in dotstar mode
+ if (self->byteorder.is_dotstar && i % 4 == 0) {
+ continue;
+ }
+ self->post_brightness_buffer[i] = (self->pre_brightness_buffer[i] * self->scaled_brightness) / 256;
}
- self->post_brightness_buffer[i] = self->pre_brightness_buffer[i] * self->brightness;
- }
- if (self->auto_write) {
- common_hal__pixelbuf_pixelbuf_show(self_in);
+ if (self->auto_write) {
+ common_hal__pixelbuf_pixelbuf_show(self_in);
+ }
}
}
@@ -197,28 +205,34 @@ void _pixelbuf_set_pixel_color(pixelbuf_pixelbuf_obj_t* self, size_t index, uint
}
pixelbuf_rgbw_t *rgbw_order = &self->byteorder.byteorder;
size_t offset = index * self->bytes_per_pixel;
- if (self->pre_brightness_buffer != NULL) {
- uint8_t* pre_brightness_buffer = self->pre_brightness_buffer + offset;
- if (self->bytes_per_pixel == 4) {
- pre_brightness_buffer[rgbw_order->w] = w;
- }
-
- pre_brightness_buffer[rgbw_order->r] = r;
- pre_brightness_buffer[rgbw_order->g] = g;
- pre_brightness_buffer[rgbw_order->b] = b;
+ uint8_t *scaled_buffer, *unscaled_buffer;
+ if (self->pre_brightness_buffer) {
+ scaled_buffer = self->post_brightness_buffer + offset;
+ unscaled_buffer = self->pre_brightness_buffer + offset;
+ } else {
+ scaled_buffer = NULL;
+ unscaled_buffer = self->post_brightness_buffer + offset;
}
- uint8_t* post_brightness_buffer = self->post_brightness_buffer + offset;
if (self->bytes_per_pixel == 4) {
- // Only apply brightness if w is actually white (aka not DotStar.)
- if (!self->byteorder.is_dotstar) {
- w *= self->brightness;
+ unscaled_buffer[rgbw_order->w] = w;
+ }
+
+ unscaled_buffer[rgbw_order->r] = r;
+ unscaled_buffer[rgbw_order->g] = g;
+ unscaled_buffer[rgbw_order->b] = b;
+
+ if (scaled_buffer) {
+ if (self->bytes_per_pixel == 4) {
+ if (!self->byteorder.is_dotstar) {
+ w = (w * self->scaled_brightness) / 256;
+ }
+ scaled_buffer[rgbw_order->w] = w;
}
- post_brightness_buffer[rgbw_order->w] = w;
+ scaled_buffer[rgbw_order->r] = (r * self->scaled_brightness) / 256;
+ scaled_buffer[rgbw_order->g] = (g * self->scaled_brightness) / 256;
+ scaled_buffer[rgbw_order->b] = (b * self->scaled_brightness) / 256;
}
- post_brightness_buffer[rgbw_order->r] = r * self->brightness;
- post_brightness_buffer[rgbw_order->g] = g * self->brightness;
- post_brightness_buffer[rgbw_order->b] = b * self->brightness;
}
void _pixelbuf_set_pixel(pixelbuf_pixelbuf_obj_t* self, size_t index, mp_obj_t value) {
diff --git a/shared-module/_pixelbuf/PixelBuf.h b/shared-module/_pixelbuf/PixelBuf.h
index a9fbed366..f0c80bcad 100644
--- a/shared-module/_pixelbuf/PixelBuf.h
+++ b/shared-module/_pixelbuf/PixelBuf.h
@@ -49,7 +49,8 @@ typedef struct {
typedef struct {
mp_obj_base_t base;
size_t pixel_count;
- size_t bytes_per_pixel;
+ uint16_t bytes_per_pixel;
+ uint16_t scaled_brightness;
pixelbuf_byteorder_details_t byteorder;
mp_float_t brightness;
mp_obj_t transmit_buffer_obj;
diff --git a/shared-module/bitmaptools/__init__.c b/shared-module/bitmaptools/__init__.c
new file mode 100644
index 000000000..7dc4024ef
--- /dev/null
+++ b/shared-module/bitmaptools/__init__.c
@@ -0,0 +1,174 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021 Kevin Matocha
+ *
+ * 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 "shared-bindings/displayio/Bitmap.h"
+
+#include "py/runtime.h"
+
+#include "math.h"
+
+void common_hal_bitmaptools_rotozoom(displayio_bitmap_t *self, int16_t ox, int16_t oy,
+ int16_t dest_clip0_x, int16_t dest_clip0_y,
+ int16_t dest_clip1_x, int16_t dest_clip1_y,
+ displayio_bitmap_t *source, int16_t px, int16_t py,
+ int16_t source_clip0_x, int16_t source_clip0_y,
+ int16_t source_clip1_x, int16_t source_clip1_y,
+ float angle,
+ float scale,
+ uint32_t skip_index, bool skip_index_none) {
+
+ // Copies region from source to the destination bitmap, including rotation,
+ // scaling and clipping of either the source or destination regions
+ //
+ // *self: destination bitmap
+ // ox: the (ox, oy) destination point where the source (px,py) point is placed
+ // oy:
+ // dest_clip0: (x,y) is the corner of the clip window on the destination bitmap
+ // dest_clip1: (x,y) is the other corner of the clip window of the destination bitmap
+ // *source: the source bitmap
+ // px: the (px, py) point of rotation of the source bitmap
+ // py:
+ // source_clip0: (x,y) is the corner of the clip window on the source bitmap
+ // source_clip1: (x,y) is the other of the clip window on the source bitmap
+ // angle: angle of rotation in radians, positive is clockwise
+ // scale: scale factor
+ // skip_index: color index that should be ignored (and not copied over)
+ // skip_index_none: if skip_index_none is True, then all color indexes should be copied
+ // (that is, no color indexes should be skipped)
+
+
+ // Copy complete "source" bitmap into "self" bitmap at location x,y in the "self"
+ // Add a boolean to determine if all values are copied, or only if non-zero
+ // If skip_value is encountered in the source bitmap, it will not be copied.
+ // If skip_value is `None`, then all pixels are copied.
+
+
+ // # Credit from https://github.com/wernsey/bitmap
+ // # MIT License from
+ // # * Copyright (c) 2017 Werner Stoop <wstoop@gmail.com>
+ // #
+ // # *
+ // # * #### `void bm_rotate_blit(Bitmap *dst, int ox, int oy, Bitmap *src, int px, int py, double angle, double scale);`
+ // # *
+ // # * Rotates a source bitmap `src` around a pivot point `px,py` and blits it onto a destination bitmap `dst`.
+ // # *
+ // # * The bitmap is positioned such that the point `px,py` on the source is at the offset `ox,oy` on the destination.
+ // # *
+ // # * The `angle` is clockwise, in radians. The bitmap is also scaled by the factor `scale`.
+ // #
+ // # void bm_rotate_blit(Bitmap *dst, int ox, int oy, Bitmap *src, int px, int py, double angle, double scale);
+
+
+ // # /*
+ // # Reference:
+ // # "Fast Bitmap Rotation and Scaling" By Steven Mortimer, Dr Dobbs' Journal, July 01, 2001
+ // # http://www.drdobbs.com/architecture-and-design/fast-bitmap-rotation-and-scaling/184416337
+ // # See also http://www.efg2.com/Lab/ImageProcessing/RotateScanline.htm
+ // # */
+
+
+ if (self->read_only) {
+ mp_raise_RuntimeError(translate("Read-only object"));
+ }
+
+ int16_t x,y;
+
+ int16_t minx = dest_clip1_x;
+ int16_t miny = dest_clip1_y;
+ int16_t maxx = dest_clip0_x;
+ int16_t maxy = dest_clip0_y;
+
+ float sinAngle = sinf(angle);
+ float cosAngle = cosf(angle);
+
+ float dx, dy;
+
+ /* Compute the position of where each corner on the source bitmap
+ will be on the destination to get a bounding box for scanning */
+ dx = -cosAngle * px * scale + sinAngle * py * scale + ox;
+ dy = -sinAngle * px * scale - cosAngle * py * scale + oy;
+ if(dx < minx) minx = (int16_t)dx;
+ if(dx > maxx) maxx = (int16_t)dx;
+ if(dy < miny) miny = (int16_t)dy;
+ if(dy > maxy) maxy = (int16_t)dy;
+
+ dx = cosAngle * (source->width - px) * scale + sinAngle * py * scale + ox;
+ dy = sinAngle * (source->width - px) * scale - cosAngle * py * scale + oy;
+ if(dx < minx) minx = (int16_t)dx;
+ if(dx > maxx) maxx = (int16_t)dx;
+ if(dy < miny) miny = (int16_t)dy;
+ if(dy > maxy) maxy = (int16_t)dy;
+
+ dx = cosAngle * (source->width - px) * scale - sinAngle * (source->height - py) * scale + ox;
+ dy = sinAngle * (source->width - px) * scale + cosAngle * (source->height - py) * scale + oy;
+ if(dx < minx) minx = (int16_t)dx;
+ if(dx > maxx) maxx = (int16_t)dx;
+ if(dy < miny) miny = (int16_t)dy;
+ if(dy > maxy) maxy = (int16_t)dy;
+
+ dx = -cosAngle * px * scale - sinAngle * (source->height - py) * scale + ox;
+ dy = -sinAngle * px * scale + cosAngle * (source->height - py) * scale + oy;
+ if(dx < minx) minx = (int16_t)dx;
+ if(dx > maxx) maxx = (int16_t)dx;
+ if(dy < miny) miny = (int16_t)dy;
+ if(dy > maxy) maxy = (int16_t)dy;
+
+ /* Clipping */
+ if(minx < dest_clip0_x) minx = dest_clip0_x;
+ if(maxx > dest_clip1_x - 1) maxx = dest_clip1_x - 1;
+ if(miny < dest_clip0_y) miny = dest_clip0_y;
+ if(maxy > dest_clip1_y - 1) maxy = dest_clip1_y - 1;
+
+ float dvCol = cosAngle / scale;
+ float duCol = sinAngle / scale;
+
+ float duRow = dvCol;
+ float dvRow = -duCol;
+
+ float startu = px - (ox * dvCol + oy * duCol);
+ float startv = py - (ox * dvRow + oy * duRow);
+
+ float rowu = startu + miny * duCol;
+ float rowv = startv + miny * dvCol;
+
+ for(y = miny; y <= maxy; y++) {
+ float u = rowu + minx * duRow;
+ float v = rowv + minx * dvRow;
+ for(x = minx; x <= maxx; x++) {
+ if(u >= source_clip0_x && u < source_clip1_x && v >= source_clip0_y && v < source_clip1_y) {
+ uint32_t c = common_hal_displayio_bitmap_get_pixel(source, u, v);
+ if( (skip_index_none) || (c != skip_index) ) {
+ common_hal_displayio_bitmap_set_pixel(self, x, y, c);
+ }
+ }
+ u += duRow;
+ v += dvRow;
+ }
+ rowu += duCol;
+ rowv += dvCol;
+ }
+}
diff --git a/shared-module/displayio/Bitmap.c b/shared-module/displayio/Bitmap.c
index d1942efc7..c9ea83428 100644
--- a/shared-module/displayio/Bitmap.c
+++ b/shared-module/displayio/Bitmap.c
@@ -116,14 +116,33 @@ void common_hal_displayio_bitmap_blit(displayio_bitmap_t *self, int16_t x, int16
mp_raise_RuntimeError(translate("Read-only object"));
}
+ bool x_reverse = false;
+ bool y_reverse = false;
+
+ // Add reverse direction option to protect blitting of self bitmap back into self bitmap
+ if (x > x1) {
+ x_reverse = true;
+ }
+ if (y > y1) {
+ y_reverse = true;
+ }
+
// simplest version - use internal functions for get/set pixels
- for (int16_t i=0; i < (x2-x1) ; i++) {
- if ( (x+i >= 0) && (x+i < self->width) ) {
+ for (int16_t i=0; i < (x2-x1); i++) {
+
+ const int xs_index = x_reverse ? ( (x2) - i - 1) : x1+i; // x-index into the source bitmap
+ const int xd_index = x_reverse ? ((x + (x2-x1)) - i - 1) : x+i; // x-index into the destination bitmap
+
+ if ( (xd_index >= 0) && (xd_index < self->width) ) {
for (int16_t j=0; j < (y2-y1) ; j++){
- if ((y+j >= 0) && (y+j < self->height) ) {
- uint32_t value = common_hal_displayio_bitmap_get_pixel(source, x1+i, y1+j);
+
+ const int ys_index = y_reverse ? ( (y2 ) - j - 1) : y1+j ; // y-index into the source bitmap
+ const int yd_index = y_reverse ? ((y + (y2-y1)) - j - 1) : y+j ; // y-index into the destination bitmap
+
+ if ((yd_index >= 0) && (yd_index < self->height) ) {
+ uint32_t value = common_hal_displayio_bitmap_get_pixel(source, xs_index, ys_index);
if ( (skip_index_none) || (value != skip_index) ) { // write if skip_value_none is True
- common_hal_displayio_bitmap_set_pixel(self, x+i, y+j, value);
+ common_hal_displayio_bitmap_set_pixel(self, xd_index, yd_index, value);
}
}
}
diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c
index 15cf5b8e4..42efeb18c 100644
--- a/shared-module/displayio/Group.c
+++ b/shared-module/displayio/Group.c
@@ -27,6 +27,7 @@
#include "shared-bindings/displayio/Group.h"
#include "py/runtime.h"
+#include "py/objlist.h"
#include "shared-bindings/displayio/TileGrid.h"
#if CIRCUITPY_VECTORIO
@@ -34,9 +35,9 @@
#endif
-void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t max_size, uint32_t scale, mp_int_t x, mp_int_t y) {
- displayio_group_child_t* children = m_new(displayio_group_child_t, max_size);
- displayio_group_construct(self, children, max_size, scale, x, y);
+void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t scale, mp_int_t x, mp_int_t y) {
+ mp_obj_list_t *members = mp_obj_new_list(0, NULL);
+ displayio_group_construct(self, members, scale, x, y);
}
bool common_hal_displayio_group_get_hidden(displayio_group_t* self) {
@@ -51,12 +52,19 @@ void common_hal_displayio_group_set_hidden(displayio_group_t* self, bool hidden)
if (self->hidden_by_parent) {
return;
}
- for (size_t i = 0; i < self->size; i++) {
- mp_obj_t layer = self->children[i].native;
- if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
+ for (size_t i = 0; i < self->members->len; i++) {
+ mp_obj_t layer;
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_tilegrid_type);
+ if (layer != MP_OBJ_NULL) {
displayio_tilegrid_set_hidden_by_parent(layer, hidden);
- } else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) {
+ continue;
+ }
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_group_type);
+ if (layer != MP_OBJ_NULL) {
displayio_group_set_hidden_by_parent(layer, hidden);
+ continue;
}
}
}
@@ -70,12 +78,19 @@ void displayio_group_set_hidden_by_parent(displayio_group_t *self, bool hidden)
if (self->hidden) {
return;
}
- for (size_t i = 0; i < self->size; i++) {
- mp_obj_t layer = self->children[i].native;
- if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
+ for (size_t i = 0; i < self->members->len; i++) {
+ mp_obj_t layer;
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_tilegrid_type);
+ if (layer != MP_OBJ_NULL) {
displayio_tilegrid_set_hidden_by_parent(layer, hidden);
- } else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) {
+ continue;
+ }
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_group_type);
+ if (layer != MP_OBJ_NULL) {
displayio_group_set_hidden_by_parent(layer, hidden);
+ continue;
}
}
}
@@ -86,16 +101,22 @@ uint32_t common_hal_displayio_group_get_scale(displayio_group_t* self) {
bool displayio_group_get_previous_area(displayio_group_t *self, displayio_area_t* area) {
bool first = true;
- for (size_t i = 0; i < self->size; i++) {
- mp_obj_t layer = self->children[i].native;
+ for (size_t i = 0; i < self->members->len; i++) {
+ mp_obj_t layer;
displayio_area_t layer_area;
- if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_tilegrid_type);
+ if (layer != MP_OBJ_NULL) {
if (!displayio_tilegrid_get_previous_area(layer, &layer_area)) {
continue;
}
- } else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) {
- if (!displayio_group_get_previous_area(layer, &layer_area)) {
- continue;
+ } else {
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_group_type);
+ if (layer != MP_OBJ_NULL) {
+ if (!displayio_group_get_previous_area(layer, &layer_area)) {
+ continue;
+ }
}
}
if (first) {
@@ -120,18 +141,27 @@ static void _update_child_transforms(displayio_group_t* self) {
if (!self->in_group) {
return;
}
- for (size_t i = 0; i < self->size; i++) {
- mp_obj_t layer = self->children[i].native;
+ for (size_t i = 0; i < self->members->len; i++) {
+ mp_obj_t layer;
#if CIRCUITPY_VECTORIO
- if (MP_OBJ_IS_TYPE(layer, &vectorio_vector_shape_type)) {
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &vectorio_vector_shape_type);
+ if (layer != MP_OBJ_NULL) {
vectorio_vector_shape_update_transform(layer, &self->absolute_transform);
+ continue;
}
- else
#endif
- if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_tilegrid_type);
+ if (layer != MP_OBJ_NULL) {
displayio_tilegrid_update_transform(layer, &self->absolute_transform);
- } else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) {
+ continue;
+ }
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_group_type);
+ if (layer != MP_OBJ_NULL) {
displayio_group_update_transform(layer, &self->absolute_transform);
+ continue;
}
}
}
@@ -210,21 +240,17 @@ void common_hal_displayio_group_set_y(displayio_group_t* self, mp_int_t y) {
_update_child_transforms(self);
}
-static mp_obj_t _add_layer(displayio_group_t* self, mp_obj_t layer) {
+static void _add_layer(displayio_group_t* self, mp_obj_t layer) {
mp_obj_t native_layer;
#if CIRCUITPY_VECTORIO
native_layer = mp_instance_cast_to_native_base(layer, &vectorio_vector_shape_type);
if (native_layer != MP_OBJ_NULL) {
vectorio_vector_shape_update_transform(native_layer, &self->absolute_transform);
- return native_layer;
+ return;
}
#endif
- native_layer = mp_instance_cast_to_native_base(layer, &displayio_group_type);
- if (native_layer == MP_OBJ_NULL) {
- native_layer = mp_instance_cast_to_native_base(layer, &displayio_tilegrid_type);
- if (native_layer == MP_OBJ_NULL) {
- mp_raise_ValueError(translate("Layer must be a Group or TileGrid subclass."));
- }
+ native_layer = mp_instance_cast_to_native_base(layer, &displayio_tilegrid_type);
+ if (native_layer != MP_OBJ_NULL) {
displayio_tilegrid_t* tilegrid = native_layer;
if (tilegrid->in_group) {
mp_raise_ValueError(translate("Layer already in a group."));
@@ -232,7 +258,10 @@ static mp_obj_t _add_layer(displayio_group_t* self, mp_obj_t layer) {
tilegrid->in_group = true;
}
displayio_tilegrid_update_transform(tilegrid, &self->absolute_transform);
- } else {
+ return;
+ }
+ native_layer = mp_instance_cast_to_native_base(layer, &displayio_group_type);
+ if (native_layer != MP_OBJ_NULL) {
displayio_group_t* group = native_layer;
if (group->in_group) {
mp_raise_ValueError(translate("Layer already in a group."));
@@ -240,27 +269,34 @@ static mp_obj_t _add_layer(displayio_group_t* self, mp_obj_t layer) {
group->in_group = true;
}
displayio_group_update_transform(group, &self->absolute_transform);
+ return;
}
- return native_layer;
+ mp_raise_ValueError(translate("Layer must be a Group or TileGrid subclass."));
}
static void _remove_layer(displayio_group_t* self, size_t index) {
- mp_obj_t layer = self->children[index].native;
+ mp_obj_t layer;
displayio_area_t layer_area;
bool rendered_last_frame = false;
#if CIRCUITPY_VECTORIO
- if (MP_OBJ_IS_TYPE(layer, &vectorio_vector_shape_type)) {
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[index], &vectorio_vector_shape_type);
+ if (layer != MP_OBJ_NULL) {
bool has_dirty_area = vectorio_vector_shape_get_dirty_area(layer, &layer_area);
rendered_last_frame = has_dirty_area;
vectorio_vector_shape_update_transform(layer, NULL);
}
- else
#endif
- if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[index], &displayio_tilegrid_type);
+ if (layer != MP_OBJ_NULL) {
displayio_tilegrid_t* tilegrid = layer;
rendered_last_frame = displayio_tilegrid_get_previous_area(tilegrid, &layer_area);
displayio_tilegrid_update_transform(tilegrid, NULL);
- } else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) {
+ }
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[index], &displayio_group_type);
+ if (layer != MP_OBJ_NULL) {
displayio_group_t* group = layer;
rendered_last_frame = displayio_group_get_previous_area(group, &layer_area);
displayio_group_update_transform(group, NULL);
@@ -277,62 +313,40 @@ static void _remove_layer(displayio_group_t* self, size_t index) {
}
void common_hal_displayio_group_insert(displayio_group_t* self, size_t index, mp_obj_t layer) {
- if (self->size == self->max_size) {
- mp_raise_RuntimeError(translate("Group full"));
- }
- mp_obj_t native_layer = _add_layer(self, layer);
- // Shift everything right.
- for (size_t i = self->size; i > index; i--) {
- self->children[i] = self->children[i - 1];
- }
- self->children[index].native = native_layer;
- self->children[index].original = layer;
- self->size++;
+ _add_layer(self, layer);
+ mp_obj_list_insert(self->members, index, layer);
}
mp_obj_t common_hal_displayio_group_pop(displayio_group_t* self, size_t index) {
- self->size--;
- mp_obj_t item = self->children[index].original;
_remove_layer(self, index);
-
- // Shift everything left.
- for (size_t i = index; i < self->size; i++) {
- self->children[i] = self->children[i + 1];
- }
- self->children[self->size].native = NULL;
- self->children[self->size].original = NULL;
- return item;
+ return mp_obj_list_pop(self->members, index);
}
mp_int_t common_hal_displayio_group_index(displayio_group_t* self, mp_obj_t layer) {
- for (size_t i = 0; i < self->size; i++) {
- if (self->children[i].original == layer) {
- return i;
- }
- }
- return -1;
+ mp_obj_t args[] = {self->members, layer};
+ mp_obj_t *index = mp_seq_index_obj(
+ self->members->items, self->members->len, 2, args);
+ return MP_OBJ_SMALL_INT_VALUE(index);
}
size_t common_hal_displayio_group_get_len(displayio_group_t* self) {
- return self->size;
+ return self->members->len;
}
mp_obj_t common_hal_displayio_group_get(displayio_group_t* self, size_t index) {
- return self->children[index].original;
+ return self->members->items[index];
}
void common_hal_displayio_group_set(displayio_group_t* self, size_t index, mp_obj_t layer) {
- mp_obj_t native_layer = _add_layer(self, layer);
+ _add_layer(self, layer);
_remove_layer(self, index);
- self->children[index].native = native_layer;
- self->children[index].original = layer;
+ mp_obj_list_store(self, MP_OBJ_NEW_SMALL_INT(index), layer);
}
-void displayio_group_construct(displayio_group_t* self, displayio_group_child_t* child_array, uint32_t max_size, uint32_t scale, mp_int_t x, mp_int_t y) {
+void displayio_group_construct(displayio_group_t* self, mp_obj_list_t* members, uint32_t scale, mp_int_t x, mp_int_t y) {
self->x = x;
self->y = y;
- self->children = child_array;
- self->max_size = max_size;
+ self->members = members;
self->item_removed = false;
self->scale = scale;
self->in_group = false;
@@ -341,47 +355,61 @@ void displayio_group_construct(displayio_group_t* self, displayio_group_child_t*
bool displayio_group_fill_area(displayio_group_t *self, const _displayio_colorspace_t* colorspace, const displayio_area_t* area, uint32_t* mask, uint32_t* buffer) {
// Track if any of the layers finishes filling in the given area. We can ignore any remaining
// layers at that point.
- bool full_coverage = false;
- for (int32_t i = self->size - 1; i >= 0 ; i--) {
- mp_obj_t layer = self->children[i].native;
+ for (int32_t i = self->members->len - 1; i >= 0 ; i--) {
+ mp_obj_t layer;
#if CIRCUITPY_VECTORIO
- if (MP_OBJ_IS_TYPE(layer, &vectorio_vector_shape_type)) {
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &vectorio_vector_shape_type);
+ if (layer != MP_OBJ_NULL) {
if (vectorio_vector_shape_fill_area(layer, colorspace, area, mask, buffer)) {
- full_coverage = true;
- break;
+ return true;
}
+ continue;
}
- else
#endif
- if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_tilegrid_type);
+ if (layer != MP_OBJ_NULL) {
if (displayio_tilegrid_fill_area(layer, colorspace, area, mask, buffer)) {
- full_coverage = true;
- break;
+ return true;
}
- } else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) {
+ continue;
+ }
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_group_type);
+ if (layer != MP_OBJ_NULL) {
if (displayio_group_fill_area(layer, colorspace, area, mask, buffer)) {
- full_coverage = true;
- break;
+ return true;
}
+ continue;
}
}
- return full_coverage;
+ return false;
}
void displayio_group_finish_refresh(displayio_group_t *self) {
self->item_removed = false;
- for (int32_t i = self->size - 1; i >= 0 ; i--) {
- mp_obj_t layer = self->children[i].native;
+ for (int32_t i = self->members->len - 1; i >= 0 ; i--) {
+ mp_obj_t layer;
#if CIRCUITPY_VECTORIO
- if (MP_OBJ_IS_TYPE(layer, &vectorio_vector_shape_type)) {
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &vectorio_vector_shape_type);
+ if (layer != MP_OBJ_NULL) {
vectorio_vector_shape_finish_refresh(layer);
+ continue;
}
- else
#endif
- if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_tilegrid_type);
+ if (layer != MP_OBJ_NULL) {
displayio_tilegrid_finish_refresh(layer);
- } else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) {
+ continue;
+ }
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_group_type);
+ if (layer != MP_OBJ_NULL) {
displayio_group_finish_refresh(layer);
+ continue;
}
}
}
@@ -392,18 +420,27 @@ displayio_area_t* displayio_group_get_refresh_areas(displayio_group_t *self, dis
tail = &self->dirty_area;
}
- for (int32_t i = self->size - 1; i >= 0 ; i--) {
- mp_obj_t layer = self->children[i].native;
+ for (int32_t i = self->members->len - 1; i >= 0 ; i--) {
+ mp_obj_t layer;
#if CIRCUITPY_VECTORIO
- if (MP_OBJ_IS_TYPE(layer, &vectorio_vector_shape_type)) {
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &vectorio_vector_shape_type);
+ if (layer != MP_OBJ_NULL) {
tail = vectorio_vector_shape_get_refresh_areas(layer, tail);
+ continue;
}
- else
#endif
- if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_tilegrid_type);
+ if (layer != MP_OBJ_NULL) {
tail = displayio_tilegrid_get_refresh_areas(layer, tail);
- } else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) {
+ continue;
+ }
+ layer = mp_instance_cast_to_native_base(
+ self->members->items[i], &displayio_group_type);
+ if (layer != MP_OBJ_NULL) {
tail = displayio_group_get_refresh_areas(layer, tail);
+ continue;
}
}
diff --git a/shared-module/displayio/Group.h b/shared-module/displayio/Group.h
index 5afaac1ba..0964e0a0b 100644
--- a/shared-module/displayio/Group.h
+++ b/shared-module/displayio/Group.h
@@ -31,24 +31,18 @@
#include <stdint.h>
#include "py/obj.h"
+#include "py/objlist.h"
#include "shared-module/displayio/area.h"
#include "shared-module/displayio/Palette.h"
typedef struct {
- mp_obj_t native;
- mp_obj_t original;
-} displayio_group_child_t;
-
-typedef struct {
mp_obj_base_t base;
- displayio_group_child_t* children;
+ mp_obj_list_t *members;
displayio_buffer_transform_t absolute_transform;
displayio_area_t dirty_area; // Catch all for changed area
int16_t x;
int16_t y;
uint16_t scale;
- uint16_t size;
- uint16_t max_size;
bool item_removed :1;
bool in_group :1;
bool hidden :1;
@@ -56,7 +50,7 @@ typedef struct {
uint8_t padding :4;
} displayio_group_t;
-void displayio_group_construct(displayio_group_t* self, displayio_group_child_t* child_array, uint32_t max_size, uint32_t scale, mp_int_t x, mp_int_t y);
+void displayio_group_construct(displayio_group_t* self, mp_obj_list_t* members, uint32_t scale, mp_int_t x, mp_int_t y);
void displayio_group_set_hidden_by_parent(displayio_group_t *self, bool hidden);
bool displayio_group_get_previous_area(displayio_group_t *group, displayio_area_t* area);
bool displayio_group_fill_area(displayio_group_t *group, const _displayio_colorspace_t* colorspace, const displayio_area_t* area, uint32_t* mask, uint32_t *buffer);
diff --git a/shared-module/rgbmatrix/RGBMatrix.c b/shared-module/rgbmatrix/RGBMatrix.c
index b8db0d893..a688d7fd6 100644
--- a/shared-module/rgbmatrix/RGBMatrix.c
+++ b/shared-module/rgbmatrix/RGBMatrix.c
@@ -56,7 +56,7 @@ void common_hal_rgbmatrix_rgbmatrix_construct(rgbmatrix_rgbmatrix_obj_t *self, i
self->tile = tile;
self->serpentine = serpentine;
- self->timer = timer ? timer : common_hal_rgbmatrix_timer_allocate();
+ self->timer = timer ? timer : common_hal_rgbmatrix_timer_allocate(self);
if (self->timer == NULL) {
mp_raise_ValueError(translate("No timer available"));
}
@@ -68,6 +68,8 @@ void common_hal_rgbmatrix_rgbmatrix_construct(rgbmatrix_rgbmatrix_obj_t *self, i
}
void common_hal_rgbmatrix_rgbmatrix_reconstruct(rgbmatrix_rgbmatrix_obj_t* self, mp_obj_t framebuffer) {
+ self->paused = 1;
+
common_hal_rgbmatrix_timer_disable(self->timer);
if (framebuffer) {
self->framebuffer = framebuffer;
diff --git a/shared-module/rgbmatrix/RGBMatrix.h b/shared-module/rgbmatrix/RGBMatrix.h
index 4a0e9235e..65bfc9799 100644
--- a/shared-module/rgbmatrix/RGBMatrix.h
+++ b/shared-module/rgbmatrix/RGBMatrix.h
@@ -26,6 +26,7 @@
#pragma once
+#include "py/obj.h"
#include "lib/protomatter/src/core.h"
extern const mp_obj_type_t rgbmatrix_RGBMatrix_type;
diff --git a/shared-module/usb_hid/Device.c b/shared-module/usb_hid/Device.c
index 943c9bfed..2b560c328 100644
--- a/shared-module/usb_hid/Device.c
+++ b/shared-module/usb_hid/Device.c
@@ -73,7 +73,8 @@ static usb_hid_device_obj_t* get_hid_device(uint8_t report_id) {
}
// Callbacks invoked when receive Get_Report request through control endpoint
-uint16_t tud_hid_get_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) {
+uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) {
+ (void) itf;
// only support Input Report
if ( report_type != HID_REPORT_TYPE_INPUT ) return 0;
@@ -83,7 +84,8 @@ uint16_t tud_hid_get_report_cb(uint8_t report_id, hid_report_type_t report_type,
}
// Callbacks invoked when receive Set_Report request through control endpoint
-void tud_hid_set_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) {
+void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) {
+ (void) itf;
if (report_type == HID_REPORT_TYPE_INVALID) {
report_id = buffer[0];
buffer++;
diff --git a/supervisor/shared/display.c b/supervisor/shared/display.c
index 9c9c66cd7..1919cf4a4 100644
--- a/supervisor/shared/display.c
+++ b/supervisor/shared/display.c
@@ -270,15 +270,20 @@ displayio_tilegrid_t blinka_sprite = {
};
#if CIRCUITPY_TERMINALIO
-#define CHILD_COUNT 2
-displayio_group_child_t splash_children[2] = {
- {&blinka_sprite, &blinka_sprite},
- {&supervisor_terminal_text_grid, &supervisor_terminal_text_grid}
+mp_obj_t members[] = { &blinka_sprite, &supervisor_terminal_text_grid, };
+mp_obj_list_t splash_children = {
+ .base = {.type = &mp_type_list },
+ .alloc = 2,
+ .len = 2,
+ .items = members,
};
#else
-#define CHILD_COUNT 1
-displayio_group_child_t splash_children[1] = {
- {&blinka_sprite, &blinka_sprite},
+mp_obj_t members[] = { &blinka_sprite };
+mp_obj_list_t splash_children = {
+ .base = {.type = &mp_type_list },
+ .alloc = 1,
+ .len = 1,
+ .items = members,
};
#endif
@@ -287,9 +292,7 @@ displayio_group_t circuitpython_splash = {
.x = 0,
.y = 0,
.scale = 2,
- .size = CHILD_COUNT,
- .max_size = CHILD_COUNT,
- .children = splash_children,
+ .members = &splash_children,
.item_removed = false,
.in_group = false,
.hidden = false,
diff --git a/supervisor/shared/safe_mode.c b/supervisor/shared/safe_mode.c
index b37b38e08..5d3b416f1 100644
--- a/supervisor/shared/safe_mode.c
+++ b/supervisor/shared/safe_mode.c
@@ -59,7 +59,8 @@ safe_mode_t wait_for_safe_mode_reset(void) {
const mcu_reset_reason_t reset_reason = common_hal_mcu_processor_get_reset_reason();
if (reset_reason != RESET_REASON_POWER_ON &&
- reset_reason != RESET_REASON_RESET_PIN) {
+ reset_reason != RESET_REASON_RESET_PIN &&
+ reset_reason != RESET_REASON_UNKNOWN) {
return NO_SAFE_MODE;
}
port_set_saved_word(SAFE_MODE_DATA_GUARD | (MANUAL_SAFE_MODE << 8));
diff --git a/supervisor/shared/usb/tusb_config.h b/supervisor/shared/usb/tusb_config.h
index bff7bd6b5..676810119 100644
--- a/supervisor/shared/usb/tusb_config.h
+++ b/supervisor/shared/usb/tusb_config.h
@@ -70,7 +70,7 @@
#define CFG_TUD_CDC 1
#endif
-#define CFG_TUD_MSC 1
+#define CFG_TUD_MSC CIRCUITPY_USB_MSC
#define CFG_TUD_HID CIRCUITPY_USB_HID
#define CFG_TUD_MIDI CIRCUITPY_USB_MIDI
#define CFG_TUD_VENDOR CIRCUITPY_USB_VENDOR
diff --git a/supervisor/shared/usb/usb.c b/supervisor/shared/usb/usb.c
index aa35b95e6..614bf85e0 100644
--- a/supervisor/shared/usb/usb.c
+++ b/supervisor/shared/usb/usb.c
@@ -131,12 +131,16 @@ void usb_irq_handler(void) {
// Invoked when device is mounted
void tud_mount_cb(void) {
+#if CIRCUITPY_USB_MSC
usb_msc_mount();
+#endif
}
// Invoked when device is unmounted
void tud_umount_cb(void) {
+#if CIRCUITPY_USB_MSC
usb_msc_umount();
+#endif
}
// Invoked when usb bus is suspended
diff --git a/supervisor/shared/usb/usb_desc.c b/supervisor/shared/usb/usb_desc.c
index 419a70ab3..b08d3b227 100644
--- a/supervisor/shared/usb/usb_desc.c
+++ b/supervisor/shared/usb/usb_desc.c
@@ -47,8 +47,9 @@ uint8_t const * tud_descriptor_configuration_cb(uint8_t index) {
// Invoked when received GET HID REPORT DESCRIPTOR
// Application return pointer to descriptor
// Descriptor contents must exist long enough for transfer to complete
-uint8_t const * tud_hid_descriptor_report_cb(void) {
- return hid_report_descriptor;
+uint8_t const * tud_hid_descriptor_report_cb(uint8_t itf) {
+ (void) itf;
+ return hid_report_descriptor;
}
#endif
diff --git a/tests/circuitpython-manual/audiobusio/i2s_sample_loop.py b/tests/circuitpython-manual/audiobusio/i2s_sample_loop.py
new file mode 100644
index 000000000..c0ee5de31
--- /dev/null
+++ b/tests/circuitpython-manual/audiobusio/i2s_sample_loop.py
@@ -0,0 +1,36 @@
+import audiocore
+import audiobusio
+import board
+import digitalio
+import array
+import time
+import math
+import rp2pio
+import adafruit_pioasm
+
+time.sleep(10)
+
+trigger = digitalio.DigitalInOut(board.D4)
+trigger.switch_to_output(True)
+
+# Generate one period of sine wav.
+length = 8000 // 440
+
+# signed 16 bit
+s16 = array.array("h", [0] * length)
+for i in range(length):
+ s16[i] = int(math.sin(math.pi * 2 * i / length) * (2 ** 15))
+ print(s16[i])
+
+sample = audiocore.RawSample(s16, sample_rate=8000)
+
+dac = audiobusio.I2SOut(bit_clock=board.D10,
+ word_select=board.D11, data=board.D12)
+
+trigger.value = False
+dac.play(sample, loop=True)
+time.sleep(1)
+dac.stop()
+trigger.value = True
+
+print("done")
diff --git a/tests/circuitpython-manual/audiobusio/pdmin_rms.py b/tests/circuitpython-manual/audiobusio/pdmin_rms.py
new file mode 100644
index 000000000..8d1595752
--- /dev/null
+++ b/tests/circuitpython-manual/audiobusio/pdmin_rms.py
@@ -0,0 +1,44 @@
+import audiobusio
+import board
+import digitalio
+import array
+import time
+import math
+
+trigger = digitalio.DigitalInOut(board.D4)
+trigger.switch_to_output(True)
+
+def mean(values):
+ return sum(values) / len(values)
+
+
+def normalized_rms(values):
+ minbuf = int(mean(values))
+ samples_sum = sum(
+ float(sample - minbuf) * (sample - minbuf)
+ for sample in values
+ )
+
+ return math.sqrt(samples_sum / len(values))
+
+# signed 16 bit
+s16 = array.array("H", [0] * 10000)
+
+pdm = audiobusio.PDMIn(clock_pin=board.D11, data_pin=board.D12, sample_rate=24000, bit_depth=16)
+
+print("starting read")
+trigger.value = False
+count = pdm.record(s16, len(s16))
+trigger.value = True
+print("read done")
+print("recorded {} samples".format(count))
+for v in s16[:count]:
+ print(v)
+
+
+magnitude = normalized_rms(s16)
+print("magnitude", magnitude)
+
+print("count", count)
+
+print("done")
diff --git a/tests/circuitpython-manual/busio/uart_echo.py b/tests/circuitpython-manual/busio/uart_echo.py
new file mode 100644
index 000000000..f55d4db9e
--- /dev/null
+++ b/tests/circuitpython-manual/busio/uart_echo.py
@@ -0,0 +1,18 @@
+import busio
+import board
+import time
+
+i = 0
+
+u = busio.UART(tx=board.TX, rx=board.RX)
+
+while True:
+ u.write(str(i).encode("utf-8"))
+ time.sleep(0.1)
+ print(i, u.in_waiting) # should be the number of digits
+ time.sleep(0.1)
+ print(i, u.in_waiting) # should be the number of digits
+ r = u.read(64 + 10)
+ print(i, u.in_waiting) # should be 0
+ print(len(r), r)
+ i += 1
diff --git a/tools/build_release_files.py b/tools/build_release_files.py
index 98e81499e..dc6c094c0 100755
--- a/tools/build_release_files.py
+++ b/tools/build_release_files.py
@@ -27,6 +27,9 @@ if "BOARDS" in os.environ:
sha, version = build_info.get_version_info()
languages = build_info.get_languages()
+language_allow_list = ['ID', 'de_DE', 'en_US', 'en_x_pirate', 'es', 'fil', 'fr', 'it_IT', 'ja', 'nl', 'pl', 'pt_BR', 'sv', 'zh_Latn_pinyin']
+print('Note: Not building languages', set(languages) - set(language_allow_list))
+
exit_status = 0
cores = multiprocessing.cpu_count()
print('building boards with parallelism {}'.format(cores))
@@ -35,7 +38,7 @@ for board in build_boards:
os.makedirs(bin_directory, exist_ok=True)
board_info = all_boards[board]
- for language in languages:
+ for language in language_allow_list:
bin_directory = "../bin/{board}/{language}".format(board=board, language=language)
os.makedirs(bin_directory, exist_ok=True)
start_time = time.monotonic()