summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavePutz <dwputz@gmail.com>2021-03-14 14:59:26 -0500
committerGitHub <noreply@github.com>2021-03-14 14:59:26 -0500
commit4b567178f1ac13b47846dd124e0ef6cf0a5b4294 (patch)
tree5c4d67eae9a99aa522bc8507dcd0d374e1c3ad49
parentef0ce0df72882555bf6e65580dbab1f15f787f02 (diff)
parentd2563c57dedfa3a8acaf19bfd2f5b98caad41fe9 (diff)
Merge pull request #44 from adafruit/main
Update from adafruit main
-rw-r--r--.github/workflows/build.yml1
-rw-r--r--extmod/vfs_fat_diskio.c6
m---------lib/mp30
-rw-r--r--locale/ID.po2
-rw-r--r--locale/circuitpython.pot2
-rw-r--r--locale/cs.po2
-rw-r--r--locale/de_DE.po2
-rw-r--r--locale/el.po2
-rw-r--r--locale/en_GB.po2
-rw-r--r--locale/es.po19
-rw-r--r--locale/fil.po2
-rw-r--r--locale/fr.po2
-rw-r--r--locale/hi.po2
-rw-r--r--locale/it_IT.po2
-rw-r--r--locale/ja.po2
-rw-r--r--locale/ko.po2
-rw-r--r--locale/nl.po2
-rw-r--r--locale/pl.po2
-rw-r--r--locale/pt_BR.po2
-rw-r--r--locale/sv.po2
-rw-r--r--locale/zh_Latn_pinyin.po2
-rw-r--r--ports/cxd56/common-hal/busio/I2C.c4
-rw-r--r--ports/cxd56/common-hal/busio/SPI.c8
-rw-r--r--ports/esp32s2/common-hal/busio/I2C.c35
-rw-r--r--ports/esp32s2/common-hal/wifi/__init__.c1
m---------ports/esp32s2/esp-idf0
-rw-r--r--ports/nrf/boards/sparkfun_nrf52840_micromod/README.md70
-rw-r--r--ports/nrf/boards/sparkfun_nrf52840_micromod/board.c38
-rw-r--r--ports/nrf/boards/sparkfun_nrf52840_micromod/mpconfigboard.h53
-rw-r--r--ports/nrf/boards/sparkfun_nrf52840_micromod/mpconfigboard.mk10
-rw-r--r--ports/nrf/boards/sparkfun_nrf52840_micromod/pins.c113
-rw-r--r--ports/raspberrypi/Makefile2
-rw-r--r--ports/raspberrypi/common-hal/pulseio/PulseIn.c223
-rw-r--r--ports/raspberrypi/common-hal/pulseio/PulseIn.h50
-rw-r--r--ports/raspberrypi/common-hal/pulseio/PulseOut.c95
-rw-r--r--ports/raspberrypi/common-hal/pulseio/PulseOut.h44
-rw-r--r--ports/raspberrypi/common-hal/pulseio/__init__.c1
-rw-r--r--ports/raspberrypi/common-hal/rp2pio/StateMachine.c2
-rw-r--r--ports/raspberrypi/common-hal/rp2pio/StateMachine.h2
-rw-r--r--ports/raspberrypi/common-hal/rtc/RTC.c14
-rw-r--r--ports/raspberrypi/mpconfigport.mk4
-rw-r--r--ports/stm/boards/feather_stm32f405_express/mpconfigboard.mk2
-rw-r--r--ports/stm/boards/pyboard_v11/mpconfigboard.mk2
-rw-r--r--ports/stm/common-hal/busio/UART.c1
-rw-r--r--ports/stm/mpconfigport.mk3
-rw-r--r--ports/stm/peripherals/stm32f4/stm32f407xx/periph.c227
-rw-r--r--ports/stm/peripherals/stm32f4/stm32f407xx/periph.h52
-rw-r--r--ports/stm/peripherals/stm32f4/stm32f407xx/pins.c205
-rw-r--r--ports/stm/peripherals/stm32f4/stm32f407xx/pins.h201
-rw-r--r--py/circuitpy_mpconfig.mk4
-rw-r--r--shared-bindings/bitmaptools/__init__.c116
-rw-r--r--shared-bindings/bitmaptools/__init__.h10
-rw-r--r--shared-module/bitmaptools/__init__.c164
-rw-r--r--shared-module/board/__init__.c2
-rw-r--r--shared-module/displayio/Bitmap.h2
55 files changed, 1463 insertions, 357 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index d413fd33f..f65618b40 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -314,6 +314,7 @@ jobs:
- "simmel"
- "snekboard"
- "sparkfun_lumidrive"
+ - "sparkfun_nrf52840_micromod"
- "sparkfun_nrf52840_mini"
- "sparkfun_qwiic_micro_no_flash"
- "sparkfun_qwiic_micro_with_flash"
diff --git a/extmod/vfs_fat_diskio.c b/extmod/vfs_fat_diskio.c
index 432c03b7c..127b77d7d 100644
--- a/extmod/vfs_fat_diskio.c
+++ b/extmod/vfs_fat_diskio.c
@@ -34,7 +34,7 @@ STATIC fs_user_mount_t *disk_get_device(void *bdev) {
/*-----------------------------------------------------------------------*/
DRESULT disk_read (
- bdev_t pdrv, /* Physical drive nmuber (0..) */
+ bdev_t pdrv, /* Physical drive */
BYTE *buff, /* Data buffer to store read data */
DWORD sector, /* Sector address (LBA) */
UINT count /* Number of sectors to read (1..128) */
@@ -75,7 +75,7 @@ DRESULT disk_read (
/*-----------------------------------------------------------------------*/
DRESULT disk_write (
- bdev_t pdrv, /* Physical drive nmuber (0..) */
+ bdev_t pdrv, /* Physical drive */
const BYTE *buff, /* Data to be written */
DWORD sector, /* Sector address (LBA) */
UINT count /* Number of sectors to write (1..128) */
@@ -122,7 +122,7 @@ DRESULT disk_write (
/*-----------------------------------------------------------------------*/
DRESULT disk_ioctl (
- bdev_t pdrv, /* Physical drive nmuber (0..) */
+ bdev_t pdrv, /* Physical drive */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
diff --git a/lib/mp3 b/lib/mp3
-Subproject bc58a654964c799e972719a63ff12694998f354
+Subproject 7a5de1ad777e95b0f4fab7bbd35678c7d319b1b
diff --git a/locale/ID.po b/locale/ID.po
index fbcd82940..77a7b3207 100644
--- a/locale/ID.po
+++ b/locale/ID.po
@@ -3695,7 +3695,7 @@ msgstr ""
msgid "out of range of source"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr ""
diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot
index afff80687..2f15d70b1 100644
--- a/locale/circuitpython.pot
+++ b/locale/circuitpython.pot
@@ -3643,7 +3643,7 @@ msgstr ""
msgid "out of range of source"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr ""
diff --git a/locale/cs.po b/locale/cs.po
index 57dd3cd76..d7658965f 100644
--- a/locale/cs.po
+++ b/locale/cs.po
@@ -3646,7 +3646,7 @@ msgstr ""
msgid "out of range of source"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index b000590f7..ff37ab3e4 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -3732,7 +3732,7 @@ msgstr ""
msgid "out of range of source"
msgstr "Außerhalb des Bereichs der Quelle"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr "Außerhalb des Bereichs des Ziels"
diff --git a/locale/el.po b/locale/el.po
index 309d3b86a..3e2e896a0 100644
--- a/locale/el.po
+++ b/locale/el.po
@@ -3643,7 +3643,7 @@ msgstr ""
msgid "out of range of source"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr ""
diff --git a/locale/en_GB.po b/locale/en_GB.po
index 6db894d45..e192b0eaf 100644
--- a/locale/en_GB.po
+++ b/locale/en_GB.po
@@ -3642,7 +3642,7 @@ msgstr ""
msgid "out of range of source"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr ""
diff --git a/locale/es.po b/locale/es.po
index ecd6b0042..529c987da 100644
--- a/locale/es.po
+++ b/locale/es.po
@@ -8,15 +8,15 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-04 12:55-0600\n"
-"PO-Revision-Date: 2021-03-07 15:50+0000\n"
-"Last-Translator: Jose David M <jquintana202020@gmail.com>\n"
+"PO-Revision-Date: 2021-03-12 02:03+0000\n"
+"Last-Translator: Alvaro Figueroa <alvaro@greencore.co.cr>\n"
"Language-Team: \n"
"Language: es\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.1\n"
+"X-Generator: Weblate 4.5.2-dev\n"
#: main.c
msgid ""
@@ -1836,7 +1836,7 @@ msgstr ""
#: ports/raspberrypi/common-hal/rotaryio/IncrementalEncoder.c
msgid "Pins must be sequential"
-msgstr ""
+msgstr "Los pines deben estar en orden secuencial"
#: ports/raspberrypi/common-hal/audiopwmio/PWMAudioOut.c
msgid "Pins must share PWM slice"
@@ -2142,11 +2142,10 @@ msgid ""
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
-"La alimentación del microntrolador cayó. Asegúrate que tu fuente de "
+"La alimentación del microntrolador bajó. Asegúrate que tu fuente de "
"alimentación\n"
"pueda aportar suficiente energía para todo el circuito y presiona reset "
-"(luego de\n"
-"expulsar CIRCUITPY)\n"
+"(luego de expulsar CIRCUITPY)\n"
#: shared-module/audiomixer/MixerVoice.c
msgid "The sample's bits_per_sample does not match the mixer's"
@@ -2818,7 +2817,7 @@ msgstr "circulo solo puede ser registrado con un pariente"
#: shared-bindings/bitmaptools/__init__.c
msgid "clip point must be (x,y) tuple"
-msgstr "El punto clip debe ser una tupla (x, y)"
+msgstr "El punto de recorte debe ser una tupla (x, y)"
#: shared-bindings/msgpack/ExtType.c
msgid "code outside range 0~127"
@@ -3740,7 +3739,7 @@ msgstr "ord() espera un carácter, pero encontró un string de longitud %d"
msgid "out of range of source"
msgstr "fuera de rango de fuente"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr "fuera de rango del objetivo"
@@ -3842,7 +3841,7 @@ msgstr "presionando ambos botones al inicio.\n"
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
msgid "pull masks conflict with direction masks"
-msgstr ""
+msgstr "máscara de pull en conflicto con máscara de dirección"
#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
msgid "pull_threshold must be between 1 and 32"
diff --git a/locale/fil.po b/locale/fil.po
index 046ed0e8f..b49fd072f 100644
--- a/locale/fil.po
+++ b/locale/fil.po
@@ -3691,7 +3691,7 @@ msgstr "ord() umaasa ng character pero string ng %d haba ang nakita"
msgid "out of range of source"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr ""
diff --git a/locale/fr.po b/locale/fr.po
index a32590b68..e0b84990f 100644
--- a/locale/fr.po
+++ b/locale/fr.po
@@ -3760,7 +3760,7 @@ msgstr ""
msgid "out of range of source"
msgstr "dépassement des bornes de source"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr "dépassement des bornes de target"
diff --git a/locale/hi.po b/locale/hi.po
index 0ad1435b7..e20c4a5e2 100644
--- a/locale/hi.po
+++ b/locale/hi.po
@@ -3643,7 +3643,7 @@ msgstr ""
msgid "out of range of source"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr ""
diff --git a/locale/it_IT.po b/locale/it_IT.po
index 235855efd..7e13fa0ef 100644
--- a/locale/it_IT.po
+++ b/locale/it_IT.po
@@ -3707,7 +3707,7 @@ msgstr ""
msgid "out of range of source"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr ""
diff --git a/locale/ja.po b/locale/ja.po
index 8d1fa39e3..755584385 100644
--- a/locale/ja.po
+++ b/locale/ja.po
@@ -3671,7 +3671,7 @@ msgstr "ord()は1文字を要求しますが、長さ %d の文字列が与え
msgid "out of range of source"
msgstr "ソースが範囲外"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr ""
diff --git a/locale/ko.po b/locale/ko.po
index b3137c1b9..77a145dba 100644
--- a/locale/ko.po
+++ b/locale/ko.po
@@ -3647,7 +3647,7 @@ msgstr ""
msgid "out of range of source"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr ""
diff --git a/locale/nl.po b/locale/nl.po
index d47469236..e839699ef 100644
--- a/locale/nl.po
+++ b/locale/nl.po
@@ -3704,7 +3704,7 @@ msgstr "ord() verwacht een teken (char) maar vond een string van lengte %d"
msgid "out of range of source"
msgstr "buiten bereik van bron"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr "buiten bereik van doel"
diff --git a/locale/pl.po b/locale/pl.po
index b51df842f..c4ce7ea7a 100644
--- a/locale/pl.po
+++ b/locale/pl.po
@@ -3664,7 +3664,7 @@ msgstr "ord() oczekuje znaku, a jest łańcuch od długości %d"
msgid "out of range of source"
msgstr ""
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr ""
diff --git a/locale/pt_BR.po b/locale/pt_BR.po
index 3adaa228a..fcc9dc602 100644
--- a/locale/pt_BR.po
+++ b/locale/pt_BR.po
@@ -3749,7 +3749,7 @@ msgstr ""
msgid "out of range of source"
msgstr "fora do alcance da fonte"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr "fora do alcance do alvo"
diff --git a/locale/sv.po b/locale/sv.po
index de7e81769..00d4ce6de 100644
--- a/locale/sv.po
+++ b/locale/sv.po
@@ -3707,7 +3707,7 @@ msgstr "ord() förväntade sig ett tecken, men en sträng med längden %d hittad
msgid "out of range of source"
msgstr "utanför räckvidd för source"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr "utanför räckvidd för target"
diff --git a/locale/zh_Latn_pinyin.po b/locale/zh_Latn_pinyin.po
index bb3e9cd58..4e1d1a12b 100644
--- a/locale/zh_Latn_pinyin.po
+++ b/locale/zh_Latn_pinyin.po
@@ -3704,7 +3704,7 @@ msgstr "ord() yùqí zìfú, dàn chángdù zìfú chuàn %d"
msgid "out of range of source"
msgstr "yuán fàn wéi wài"
-#: shared-bindings/displayio/Bitmap.c
+#: shared-bindings/bitmaptools/__init__.c shared-bindings/displayio/Bitmap.c
msgid "out of range of target"
msgstr "mù biāo fàn wéi wài"
diff --git a/ports/cxd56/common-hal/busio/I2C.c b/ports/cxd56/common-hal/busio/I2C.c
index 127b6e75c..5579bedeb 100644
--- a/ports/cxd56/common-hal/busio/I2C.c
+++ b/ports/cxd56/common-hal/busio/I2C.c
@@ -103,7 +103,7 @@ uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t address, cons
msg.flags = (stop ? 0 : I2C_M_NOSTOP);
msg.buffer = (uint8_t *) data;
msg.length = len;
- return I2C_TRANSFER(self->i2c_dev, &msg, 1);
+ return -I2C_TRANSFER(self->i2c_dev, &msg, 1);
}
uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t address, uint8_t *data, size_t len) {
@@ -114,7 +114,7 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t address, uint8
msg.flags = I2C_M_READ;
msg.buffer = data;
msg.length = len;
- return I2C_TRANSFER(self->i2c_dev, &msg, 1);
+ return -I2C_TRANSFER(self->i2c_dev, &msg, 1);
}
void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) {
diff --git a/ports/cxd56/common-hal/busio/SPI.c b/ports/cxd56/common-hal/busio/SPI.c
index 2d365d482..56ab0758d 100644
--- a/ports/cxd56/common-hal/busio/SPI.c
+++ b/ports/cxd56/common-hal/busio/SPI.c
@@ -35,9 +35,13 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, const mcu_pin_obj_t *
const mcu_pin_obj_t *mosi, const mcu_pin_obj_t *miso) {
int port = -1;
- if (clock->number == PIN_SPI4_SCK && mosi->number == PIN_SPI4_MOSI && miso->number == PIN_SPI4_MISO) {
+ if (clock->number == PIN_SPI4_SCK &&
+ (mosi == NULL || mosi->number == PIN_SPI4_MOSI) &&
+ (miso == NULL || miso->number == PIN_SPI4_MISO)) {
port = 4;
- } else if (clock->number == PIN_EMMC_CLK && mosi->number == PIN_EMMC_DATA0 && miso->number == PIN_EMMC_DATA1) {
+ } else if (clock->number == PIN_EMMC_CLK &&
+ (mosi == NULL || mosi->number == PIN_EMMC_DATA0) &&
+ (miso == NULL || miso->number == PIN_EMMC_DATA1)) {
port = 5;
}
diff --git a/ports/esp32s2/common-hal/busio/I2C.c b/ports/esp32s2/common-hal/busio/I2C.c
index 8372eb8c3..a1d0b8f9c 100644
--- a/ports/esp32s2/common-hal/busio/I2C.c
+++ b/ports/esp32s2/common-hal/busio/I2C.c
@@ -53,7 +53,6 @@ void i2c_reset(void) {
}
}
}
-static bool i2c_inited[I2C_NUM_MAX];
void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda, uint32_t frequency, uint32_t timeout) {
@@ -90,10 +89,9 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
#endif
- if (xSemaphoreCreateBinaryStatic(&self->semaphore) != &self->semaphore) {
+ if (xSemaphoreCreateMutexStatic(&self->semaphore) != &self->semaphore) {
mp_raise_RuntimeError(translate("Unable to create lock"));
}
- xSemaphoreGive(&self->semaphore);
self->sda_pin = sda;
self->scl_pin = scl;
self->i2c_num = I2C_NUM_MAX;
@@ -106,6 +104,10 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
mp_raise_ValueError(translate("All I2C peripherals are in use"));
}
i2c_status[self->i2c_num] = STATUS_IN_USE;
+
+ // Delete any previous driver.
+ i2c_driver_delete(self->i2c_num);
+
i2c_config_t i2c_conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = self->sda_pin->number,
@@ -117,23 +119,16 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
.clk_speed = frequency,
}
};
- esp_err_t result = i2c_param_config(self->i2c_num, &i2c_conf);
- if (result != ESP_OK) {
- mp_raise_ValueError(translate("Invalid pins"));
+ if (i2c_param_config(self->i2c_num, &i2c_conf) != ESP_OK) {
+ mp_raise_ValueError(translate("Invalid frequency"));
}
-
- if (!i2c_inited[self->i2c_num]) {
- result = i2c_driver_install(self->i2c_num,
- I2C_MODE_MASTER,
- 0,
- 0,
- 0);
- if (result != ESP_OK) {
- mp_raise_OSError(MP_EIO);
- }
- i2c_inited[self->i2c_num] = true;
-
+ if (i2c_driver_install(self->i2c_num,
+ I2C_MODE_MASTER,
+ 0,
+ 0,
+ 0) != ESP_OK) {
+ mp_raise_OSError(MP_EIO);
}
claim_pin(sda);
@@ -149,12 +144,14 @@ void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) {
return;
}
- i2c_status[self->i2c_num] = STATUS_FREE;
+ i2c_driver_delete(self->i2c_num);
common_hal_reset_pin(self->sda_pin);
common_hal_reset_pin(self->scl_pin);
self->sda_pin = NULL;
self->scl_pin = NULL;
+
+ i2c_status[self->i2c_num] = STATUS_FREE;
}
bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr) {
diff --git a/ports/esp32s2/common-hal/wifi/__init__.c b/ports/esp32s2/common-hal/wifi/__init__.c
index b8e8f731b..a3927b7c3 100644
--- a/ports/esp32s2/common-hal/wifi/__init__.c
+++ b/ports/esp32s2/common-hal/wifi/__init__.c
@@ -109,6 +109,7 @@ void common_hal_wifi_init(void) {
wifi_radio_obj_t* self = &common_hal_wifi_radio_obj;
self->netif = esp_netif_create_default_wifi_sta();
+ self->started = false;
// Even though we just called esp_netif_create_default_wifi_sta,
// station mode isn't actually ready for use until esp_wifi_set_mode()
diff --git a/ports/esp32s2/esp-idf b/ports/esp32s2/esp-idf
-Subproject ebe7784258d8c10e9cc334ccc00c3fd270746c8
+Subproject f30a865fd1a44d880b909b84112f74741412c2c
diff --git a/ports/nrf/boards/sparkfun_nrf52840_micromod/README.md b/ports/nrf/boards/sparkfun_nrf52840_micromod/README.md
new file mode 100644
index 000000000..094102c27
--- /dev/null
+++ b/ports/nrf/boards/sparkfun_nrf52840_micromod/README.md
@@ -0,0 +1,70 @@
+# SparkFun MicroMod nRF52840 Processor
+
+Featuring the nRF52840 SoC from Nordic Semiconductor, the [SparkFun MicroMod nRF52840 Processor](https://www.sparkfun.com/products/16984) offers a powerful combination of ARM Cortex-M4 CPU and 2.4 GHz Bluetooth transceiver in the MicroMod form-factor with the M.2 MicroMod connector to allow you to plug in a compatible MicroMod Carrier Board with any number of peripherals.
+
+The MicroMod nRF52840 Processor features the same Raytac MDBT50Q-P1M found on our [Pro nRF52840 Mini](https://www.sparkfun.com/products/15025). This module includes an integrated trace antenna, fits the IC to an FCC-approved footprint along with including decoupling and timing mechanisms that would need to be designed into a circuit using the bare nRF52840 IC. The Bluetooth transceiver included on the nRF52840 boasts a BT 5.1 stack and supports Bluetooth 5, Bluetooth mesh, IEEE 802.15.4 (Zigbee & Thread) and 2.4Ghz RF wireless protocols (including Nordic's proprietary RF protocol) allowing you to pick which option works best for your application.
+
+We've also routed two I<sup>2</sup>C buses, 2 SPI buses, eleven GPIO, dedicated digital, analog, PWM & PDM pins along with multiple serial UARTS to cover nearly all of your peripheral needs.
+
+## CircuitPython Pin Defs
+
+CircuitPython pin definitions, while simialr to other boards represent a slight departure from just the typical `A` and `D` pin definitions. The majority of general pins are labled as `G` (or alternatively, `BUS`,) as the MicroMod system they build on uses those names to specify pins that may not be specficially analog or digital.
+
+This can be somewhat confusing, especially around the analog pins. Here's a quick pin-map. This pin map will use the label either on the [SparkFun MicroMod ATP Carrier Board](https://www.sparkfun.com/products/16885), or the pin name on the [graphical datasheet](https://cdn.sparkfun.com/assets/learn_tutorials/1/4/0/1/MicroMod_nRF52840_v1.0_Graphical_Datasheet.pdf). Some of the aditional aliases are just names to make naming consistent (e.g.: RTS/CTS), but they also can refer to additional functionality a pin may have (e.g.: NFC pins)
+
+MicroMod Pin # | ATP Pin Label | Pin Definition | Additional Definitons | Pin/Port Reference | Notes
+:--------------|:--------------|:--------------|:-----------------------|:-------------------|:------
+8 | G11 | | | (Not Connected) |
+10 | D0 | D0 | | P0_27 |
+11 | BOOT | BOOT | BUTTON1 | P0_07 |
+12 | SDA | SDA | | P0_08 |
+13 | RTS1 | RTS | RTS1 | P1_02 |
+14 | SCL | SCL | | P0_11 |
+15 | CTS1 | CTS | CTS1 | P1_09 |
+16 | /I2C INT | I2C_INT | P0_15 |
+17 | TX | TX | TX1 | P1_03 |
+18 | D1 | D1 | CAM_TRIG | P1_08 |
+19 | RX | RX | RX1 | P1_10 |
+20 | RX2 | RX2 | | P1_05 |
+22 | TX2 | TX2 | | P1_07 |
+32 | PWM0 | PWM0 | P0_06 |
+34 | A0 | A0 | ADC0 | P0_04 | Attached to AIN2
+38 | A1 | A1 | ADC1 | P0_05 | Attached to AIN3
+40 | G0 | G0 | BUS0 | P0_29 | Attached to AIN5
+42 | G1 | G1 | BUS1 | P0_03 | Attached to AIN1
+44 | G2 | G2 | BUS2 | P1_13 |
+46 | G3 | G3 | BUS3 | P1_12 |
+47 | PWM1 | PWM1 | P0_16 |
+48 | G4 | G4 | BUS4 | P1_11 |
+49 | BATT_VIN | BATT_VIN3 | | P0_30 | Attached to AIN6, will be battery voltage / 3. |
+50 | PDM_CLK | PDM_CLK | | P0_25 |
+51 | SDA1 | SDA1 | | P1_01 |
+52 | PDM_DATA | PDM_DATA | | P0_26 |
+53 | SCL1 | SCL1 | | P0_24 |
+55 | /CS | CS | | P0_20 |
+57 | SCK | SCK | | P0_28 | Attached to AIN4
+59 | COPI | COPI | MOSI | P0_31 | Attached to AIN7
+61 | CIPO | CIPO | MISO | P0_02 |
+63 | G10 | G10 | NFC2, ADC_DP, CAM_VSYNC | P0_10 | Attached to NFC2
+65 | G9 | G9 | NFC1, ADC_DM, CAM_HSYNC | P0_09 | Attached to NFC1
+67 | G8 | G8 | | P1_14 |
+69 | G7 | G7 | BUS7 | P1_04 |
+71 | G6 | G6 | BUS6 | P1_06 |
+73 | G5 | G5 | BUS5 | P0_15 |
+
+## Peripheral Naming
+
+CircuitPython attempts to stay in line with the naming of the serial peripheral naming in the MicroMod system. The bare UART pins are also named <pin>1. The UART 2 pins are named <pin>2. However, the I2C names on MicroMod are <I2C pin> and <I2C pin>1. Perhaps this will change in the future, but as of [Interface v1](https://cdn.sparkfun.com/assets/learn_tutorials/1/2/0/6/SparkFun_MicroMod_Interface_v1.0_-_Pin_Descriptions.pdf), it may lead to some confusion.
+
+
+## Bootloader Notes
+
+The MicroMod nRF52840 Processor needs to have the [Adafruit nRF52 UF2 bootloader](https://github.com/adafruit/Adafruit_nRF52_Bootloader/pull/194) flashed on it. [[TODO: LINK TO BUILD]]
+
+## Hardware Reference
+
+The MicroMod nRF52840 Processor hardware layout is open source:
+
+* [Schematic](https://cdn.sparkfun.com/assets/f/0/9/9/e/MicroMod_Processor_Board-nRF52840.pdf)
+* [Eagle Files](https://cdn.sparkfun.com/assets/3/0/5/d/a/MicroMod_Processor_Board-nRF52840.zip)
+* [Hookup Guide](https://learn.sparkfun.com/tutorials/micromod-nrf52840-processor-hookup-guide)
diff --git a/ports/nrf/boards/sparkfun_nrf52840_micromod/board.c b/ports/nrf/boards/sparkfun_nrf52840_micromod/board.c
new file mode 100644
index 000000000..781793328
--- /dev/null
+++ b/ports/nrf/boards/sparkfun_nrf52840_micromod/board.c
@@ -0,0 +1,38 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "supervisor/board.h"
+
+void board_init(void) {
+}
+
+bool board_requests_safe_mode(void) {
+ return false;
+}
+
+void reset_board(void) {
+
+}
diff --git a/ports/nrf/boards/sparkfun_nrf52840_micromod/mpconfigboard.h b/ports/nrf/boards/sparkfun_nrf52840_micromod/mpconfigboard.h
new file mode 100644
index 000000000..c53fc45d2
--- /dev/null
+++ b/ports/nrf/boards/sparkfun_nrf52840_micromod/mpconfigboard.h
@@ -0,0 +1,53 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2016 Glenn Ruben Bakke
+ * Copyright (c) 2021 Chris Marc Dailey
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "nrfx/hal/nrf_gpio.h"
+
+#define MICROPY_HW_BOARD_NAME "SparkFun MicroMod nRF52840"
+#define MICROPY_HW_MCU_NAME "nRF52840"
+
+#define DEFAULT_I2C_BUS_SCL (&pin_P0_11)
+#define DEFAULT_I2C_BUS_SDA (&pin_P0_08)
+
+#define DEFAULT_SPI_BUS_SCK (&pin_P0_28)
+#define DEFAULT_SPI_BUS_MOSI (&pin_P0_31)
+#define DEFAULT_SPI_BUS_MISO (&pin_P0_02)
+
+#define DEFAULT_UART_BUS_RX (&pin_P1_10)
+#define DEFAULT_UART_BUS_TX (&pin_P1_03)
+
+#define BOARD_HAS_32KHZ_XTAL (1)
+#define BOARD_HAS_CRYSTAL (1)
+
+#if QSPI_FLASH_FILESYSTEM
+#define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(0, 14) // Labeled 'SPI_COPI1/SDIO_CMD' in schematic.
+#define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(0, 21) // Labeled 'SPI_CIPO1/SDIO_DATA0' in schematic.
+#define MICROPY_QSPI_DATA2 NRF_GPIO_PIN_MAP(0, 23) // Labeled 'SPI_DATA2' in schematic.
+#define MICROPY_QSPI_DATA3 NRF_GPIO_PIN_MAP(1, 0) // Labeled 'SPI_CS1/SDIO_DATA3' in schematic.
+#define MICROPY_QSPI_SCK NRF_GPIO_PIN_MAP(0, 19) // Labeled 'SPI_SCK1/SDIO_CLK' in schematic.
+#define MICROPY_QSPI_CS NRF_GPIO_PIN_MAP(0, 12) // Labeled 'FLASH_CS' in schematic.
+#endif // QSPI_FLASH_FILESYSTEM
diff --git a/ports/nrf/boards/sparkfun_nrf52840_micromod/mpconfigboard.mk b/ports/nrf/boards/sparkfun_nrf52840_micromod/mpconfigboard.mk
new file mode 100644
index 000000000..4c4bcd089
--- /dev/null
+++ b/ports/nrf/boards/sparkfun_nrf52840_micromod/mpconfigboard.mk
@@ -0,0 +1,10 @@
+USB_VID = 0x1B4F
+USB_PID = 0x0021
+USB_PRODUCT = "SFE_nRF52840_MicroMod"
+USB_MANUFACTURER = "SparkFun Electronics"
+
+MCU_CHIP = nrf52840
+
+QSPI_FLASH_FILESYSTEM = 1
+EXTERNAL_FLASH_DEVICE_COUNT = 1
+EXTERNAL_FLASH_DEVICES = "W25Q128JV_PM"
diff --git a/ports/nrf/boards/sparkfun_nrf52840_micromod/pins.c b/ports/nrf/boards/sparkfun_nrf52840_micromod/pins.c
new file mode 100644
index 000000000..65700f24e
--- /dev/null
+++ b/ports/nrf/boards/sparkfun_nrf52840_micromod/pins.c
@@ -0,0 +1,113 @@
+#include "shared-bindings/board/__init__.h"
+
+STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
+ // D pins (D0-D1)
+ { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_P0_27) }, // 0.27 - D0
+ { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_P1_08) }, // 1.08 - D1 | CAM_TRIG
+ { MP_ROM_QSTR(MP_QSTR_CAM_TRIG), MP_ROM_PTR(&pin_P1_08) }, // CAM_TRIG alias
+
+ // A pins (A0-A1)
+ { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_P0_04) }, // 0.04 - A0 | ADC0 (AIN2)
+ { MP_ROM_QSTR(MP_QSTR_ADC0), MP_ROM_PTR(&pin_P0_04) }, // ADC0 alias
+ { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_P0_05) }, // 0.05 - A1 | ADC1 (AIN3)
+ { MP_ROM_QSTR(MP_QSTR_ADC1), MP_ROM_PTR(&pin_P0_05) }, // ADC1 alias
+
+ // G pins (G0-G11, G11 NC)
+ { MP_ROM_QSTR(MP_QSTR_G0), MP_ROM_PTR(&pin_P0_29) }, // 0.29 - G0 | GPIO0 | BUS0 (AIN5)
+ { MP_ROM_QSTR(MP_QSTR_BUS0), MP_ROM_PTR(&pin_P0_29) }, // BUS0 alias
+ { MP_ROM_QSTR(MP_QSTR_G1), MP_ROM_PTR(&pin_P0_03) }, // 0.03 - G1 | GPIO1 | BUS1 (AIN1)
+ { MP_ROM_QSTR(MP_QSTR_BUS1), MP_ROM_PTR(&pin_P0_03) }, // BUS1 alias
+ { MP_ROM_QSTR(MP_QSTR_G2), MP_ROM_PTR(&pin_P1_13) }, // 1.13 - G2 | GPIO2 | BUS2
+ { MP_ROM_QSTR(MP_QSTR_BUS2), MP_ROM_PTR(&pin_P1_13) }, // BUS2 alias
+ { MP_ROM_QSTR(MP_QSTR_G3), MP_ROM_PTR(&pin_P1_12) }, // 1.12 - G3 | GPIO3 | BUS3
+ { MP_ROM_QSTR(MP_QSTR_BUS3), MP_ROM_PTR(&pin_P1_12) }, // BUS3 alias
+ { MP_ROM_QSTR(MP_QSTR_G4), MP_ROM_PTR(&pin_P1_11) }, // 1.11 - G4 | GPIO4 | BUS4
+ { MP_ROM_QSTR(MP_QSTR_BUS4), MP_ROM_PTR(&pin_P1_11) }, // BUS4 alias
+ { MP_ROM_QSTR(MP_QSTR_G5), MP_ROM_PTR(&pin_P0_17) }, // 0.17 - G5 | GPIO5 | BUS5
+ { MP_ROM_QSTR(MP_QSTR_BUS5), MP_ROM_PTR(&pin_P0_17) }, // BUS5 alias
+ { MP_ROM_QSTR(MP_QSTR_G6), MP_ROM_PTR(&pin_P1_06) }, // 1.06 - G6 | GPIO6 | BUS6
+ { MP_ROM_QSTR(MP_QSTR_BUS6), MP_ROM_PTR(&pin_P1_06) }, // BUS6 alias
+ { MP_ROM_QSTR(MP_QSTR_G7), MP_ROM_PTR(&pin_P1_04) }, // 1.04 - G7 | GPIO7 | BUS7
+ { MP_ROM_QSTR(MP_QSTR_BUS7), MP_ROM_PTR(&pin_P1_04) }, // BUS7 alias
+ { MP_ROM_QSTR(MP_QSTR_G8), MP_ROM_PTR(&pin_P1_14) }, // 1.14 - G8 | GPIO8
+ { MP_ROM_QSTR(MP_QSTR_G9), MP_ROM_PTR(&pin_P0_09) }, // 0.09 - G9 | GPIO9/NFC1 | ADC_D- | CAM_HSYNC (NFC1)
+ { MP_ROM_QSTR(MP_QSTR_NFC1), MP_ROM_PTR(&pin_P0_09) }, // NFC1 alias
+ { MP_ROM_QSTR(MP_QSTR_ADC_DM), MP_ROM_PTR(&pin_P0_09) }, // ADC_DM alias
+ { MP_ROM_QSTR(MP_QSTR_CAM_HSYNC), MP_ROM_PTR(&pin_P0_09) }, // CAM_HSYNC alias
+ { MP_ROM_QSTR(MP_QSTR_G10), MP_ROM_PTR(&pin_P0_10) }, // 0.10 - G10 | GPIO10/NFC2 | ADC_D+ | CAM_VSYNC (NFC2)
+ { MP_ROM_QSTR(MP_QSTR_NFC2), MP_ROM_PTR(&pin_P0_10) }, // NFC2 alias
+ { MP_ROM_QSTR(MP_QSTR_ADC_DP), MP_ROM_PTR(&pin_P0_10) }, // ADC_DP alias
+ { MP_ROM_QSTR(MP_QSTR_CAM_VSYNC), MP_ROM_PTR(&pin_P0_10) }, // CAM_VSYNC alias
+ // NC - G11
+
+ // PWM pins (PWM0-PWM1)
+ { MP_ROM_QSTR(MP_QSTR_PWM0), MP_ROM_PTR(&pin_P0_06) }, // 0.06 - PWM0
+ { MP_ROM_QSTR(MP_QSTR_PWM1), MP_ROM_PTR(&pin_P0_16) }, // 0.16 - PWM1
+
+ // PDM
+ { MP_ROM_QSTR(MP_QSTR_PDM_CLK), MP_ROM_PTR(&pin_P0_25) }, // 0.25 - PDM_CLK | AUD_BCLK
+ { MP_ROM_QSTR(MP_QSTR_PDM_DATA), MP_ROM_PTR(&pin_P0_26) }, // 0.26 - PDM_DATA | AUD_LRCLK
+
+ // Battery Voltage Monitor
+ { MP_ROM_QSTR(MP_QSTR_BATT_VIN3), MP_ROM_PTR(&pin_P0_30) }, // 0.30 - BATT_VIN/3 (AIN6)
+
+ // I2C
+ { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_P0_08) }, // 0.08 - SDA
+ { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_P0_11) }, // 0.11 - SCL (TRACEDATA2)
+
+ { MP_ROM_QSTR(MP_QSTR_I2C_INT), MP_ROM_PTR(&pin_P0_15) }, // 0.15 - I2C_INT
+
+ { MP_ROM_QSTR(MP_QSTR_SDA1), MP_ROM_PTR(&pin_P1_01) }, // 1.01 - SDA1
+ { MP_ROM_QSTR(MP_QSTR_SCL1), MP_ROM_PTR(&pin_P0_24) }, // 0.24 - SCL1
+
+ // SPI
+ { MP_ROM_QSTR(MP_QSTR_CIPO), MP_ROM_PTR(&pin_P0_02) }, // 0.02 - CIPO | SPI_CIPO
+ { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_P0_02) }, // MISO alias
+ { MP_ROM_QSTR(MP_QSTR_COPI), MP_ROM_PTR(&pin_P0_31) }, // 0.31 - COPI | SPI_COPI (AIN7)
+ { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_P0_31) }, // MOSI alias
+ { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_P0_28) }, // 0.28 - SCK | SPI_SCK (AIN4)
+ { MP_ROM_QSTR(MP_QSTR_CS), MP_ROM_PTR(&pin_P0_20) }, // 0.20 - /CS | SPI_/CS
+
+ // QSPI, used by flash on this board, but is broken out
+ // on the MicroMod connector, to to the SDIO pins.
+ { MP_ROM_QSTR(MP_QSTR_SDIO_CLK), MP_ROM_PTR(&pin_P0_19) }, // 0.00 - SDIO SCK | Used as: QSPI flash SCK
+ { MP_ROM_QSTR(MP_QSTR_SPI_SCK1), MP_ROM_PTR(&pin_P0_19) }, // SPI_SCK1 alias
+ { MP_ROM_QSTR(MP_QSTR_SDIO_CMD), MP_ROM_PTR(&pin_P0_14) }, // 0.00 - SDIO CMD | Used as: QSPI flash D0 (or SDI)
+ { MP_ROM_QSTR(MP_QSTR_SPI_COPI1), MP_ROM_PTR(&pin_P0_14) }, // SPI_COPI1 alias
+ { MP_ROM_QSTR(MP_QSTR_SDIO_DATA0), MP_ROM_PTR(&pin_P0_21) },// 0.00 - SDIO DATA0 | Used as: QSPI flash D1 (or SDO)
+ { MP_ROM_QSTR(MP_QSTR_SPI_CIPO1), MP_ROM_PTR(&pin_P0_21) }, // SPI_CIPO1 alias
+ { MP_ROM_QSTR(MP_QSTR_SDIO_DATA1), MP_ROM_PTR(&pin_P0_22) },// 0.00 - SDIO DATA1 | Unused for flash.
+ { MP_ROM_QSTR(MP_QSTR_SDIO_DATA2), MP_ROM_PTR(&pin_P0_23) },// 0.00 - SDIO DATA2 | Used as: QSPI flash D2
+ { MP_ROM_QSTR(MP_QSTR_SDIO_DATA3), MP_ROM_PTR(&pin_P1_00) },// 0.00 - SDIO DATA3 | Use das: QSPI flash D3 (or /HOLD)
+ { MP_ROM_QSTR(MP_QSTR_SPI_CS1), MP_ROM_PTR(&pin_P1_00) }, // SPI_CS1 alias
+
+ // Reset Pin
+ { MP_ROM_QSTR(MP_QSTR_RESET), MP_ROM_PTR(&pin_P1_14) }, // 0.18 - /RESET (NRESET)
+
+ // LED
+ { MP_ROM_QSTR(MP_QSTR_LED1), MP_ROM_PTR(&pin_P0_13) }, // 0.13 - LED_BUILTIN | STAT | Blue LED
+
+ // Button
+ { MP_ROM_QSTR(MP_QSTR_BUTTON1), MP_ROM_PTR(&pin_P0_07) }, // 0.07 - /BOOT [Active Low] (TRACECLK) - Is button on carriers.
+ { MP_ROM_QSTR(MP_QSTR_BOOT), MP_ROM_PTR(&pin_P0_07) }, // BOOT alias
+
+ // UART
+ { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_P1_10) }, // 1.10 - UART RX | RX1
+ { MP_ROM_QSTR(MP_QSTR_RX1), MP_ROM_PTR(&pin_P1_10) }, // RX1 alias
+ { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_P1_03) }, // 1.03 - UART TX | TX1
+ { MP_ROM_QSTR(MP_QSTR_TX1), MP_ROM_PTR(&pin_P1_03) }, // TX1 alias
+ { MP_ROM_QSTR(MP_QSTR_CTS), MP_ROM_PTR(&pin_P1_09) }, // 1.09 - UART CTS | CTS1 (TRACEDATA3)
+ { MP_ROM_QSTR(MP_QSTR_CTS1), MP_ROM_PTR(&pin_P1_09) }, // CTS1 alias
+ { MP_ROM_QSTR(MP_QSTR_RTS), MP_ROM_PTR(&pin_P1_02) }, // 1.02 - UART RTS | RTS1
+ { MP_ROM_QSTR(MP_QSTR_RTS1), MP_ROM_PTR(&pin_P1_02) }, // RTS1 alias
+
+ { MP_ROM_QSTR(MP_QSTR_RX2), MP_ROM_PTR(&pin_P1_05) }, // 1.05 - UART RX | RX2
+ { MP_ROM_QSTR(MP_QSTR_TX2), MP_ROM_PTR(&pin_P1_07) }, // 1.07 - UART TX | TX2
+
+ // Board Objects
+ { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
+ { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
+ { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
+};
+
+MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
diff --git a/ports/raspberrypi/Makefile b/ports/raspberrypi/Makefile
index db4bd7958..2c1a13a8b 100644
--- a/ports/raspberrypi/Makefile
+++ b/ports/raspberrypi/Makefile
@@ -234,7 +234,7 @@ SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_
SRC_S = supervisor/$(CHIP_FAMILY)_cpu.s
BOOT2_S_UPPER ?= sdk/src/rp2_common/boot_stage2/boot2_generic_03h.S
-BOOT2_S_CFLAGS ?= -DPICO_FLASH_SPI_CLKDIV=2
+BOOT2_S_CFLAGS ?= -DPICO_FLASH_SPI_CLKDIV=4
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 \
diff --git a/ports/raspberrypi/common-hal/pulseio/PulseIn.c b/ports/raspberrypi/common-hal/pulseio/PulseIn.c
new file mode 100644
index 000000000..e05b35536
--- /dev/null
+++ b/ports/raspberrypi/common-hal/pulseio/PulseIn.c
@@ -0,0 +1,223 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021 Dave Putz 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 "src/rp2_common/hardware_gpio/include/hardware/gpio.h"
+
+#include <stdint.h>
+
+#include "py/runtime.h"
+#include "shared-bindings/microcontroller/__init__.h"
+#include "shared-bindings/pulseio/PulseIn.h"
+#include "shared-bindings/microcontroller/Pin.h"
+#include "supervisor/shared/translate.h"
+#include "bindings/rp2pio/StateMachine.h"
+#include "common-hal/pulseio/PulseIn.h"
+
+pulseio_pulsein_obj_t* save_self;
+
+#define NO_PIN 0xff
+volatile bool last_level;
+volatile uint16_t level_count = 0;
+volatile uint16_t result = 0;
+volatile uint16_t buf_index = 0;
+
+uint16_t pulsein_program[] = {
+ 0x4001, // 1: in pins, 1
+};
+
+void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self,
+ const mcu_pin_obj_t* pin, uint16_t maxlen, bool idle_state) {
+
+ self->buffer = (uint16_t *) m_malloc(maxlen * sizeof(uint16_t), false);
+ if (self->buffer == NULL) {
+ mp_raise_msg_varg(&mp_type_MemoryError, translate("Failed to allocate RX buffer of %d bytes"), maxlen * sizeof(uint16_t));
+ }
+ self->pin = pin->number;
+ self->maxlen = maxlen;
+ self->idle_state = idle_state;
+ self->start = 0;
+ self->len = 0;
+ save_self = self;
+
+ // Set everything up.
+ rp2pio_statemachine_obj_t state_machine;
+
+ bool ok = rp2pio_statemachine_construct(&state_machine,
+ pulsein_program, sizeof(pulsein_program) / sizeof(pulsein_program[0]),
+ 1000000,
+ NULL, 0,
+ NULL, 0,
+ pin, 1,
+ 0,0,
+ NULL, 0,
+ NULL, 0,
+ 1, 0,
+ 1 << self->pin, false, true,
+ false, 8, false, // TX, unused
+ false,
+ true, 32, true, // RX auto-push every 32 bits
+ false); // claim pins
+ pio_sm_set_enabled(state_machine.pio,state_machine.state_machine, false);
+ self->state_machine.pio = state_machine.pio;
+ self->state_machine.state_machine = state_machine.state_machine;
+ self->state_machine.sm_config = state_machine.sm_config;
+ self->state_machine.offset = state_machine.offset;
+ pio_sm_clear_fifos(self->state_machine.pio,self->state_machine.state_machine);
+ last_level = self->idle_state;
+ level_count = 0;
+ result = 0;
+ buf_index = 0;
+
+ pio_sm_set_in_pins(state_machine.pio,state_machine.state_machine,pin->number);
+ common_hal_rp2pio_statemachine_set_interrupt_handler(&state_machine,&common_hal_pulseio_pulsein_interrupt,NULL,PIO_IRQ0_INTE_SM0_RXNEMPTY_BITS);
+
+ // exec a set pindirs to 0 for input
+ pio_sm_exec(state_machine.pio,state_machine.state_machine,0xe080);
+ //exec the appropriate wait for pin
+ if (self->idle_state == true ) {
+ pio_sm_exec(self->state_machine.pio,self->state_machine.state_machine,0x2020);
+ } else {
+ pio_sm_exec(self->state_machine.pio,self->state_machine.state_machine,0x20a0);
+ }
+ pio_sm_set_enabled(state_machine.pio, state_machine.state_machine, true);
+}
+
+bool common_hal_pulseio_pulsein_deinited(pulseio_pulsein_obj_t* self) {
+ return self->pin == NO_PIN;
+}
+
+void common_hal_pulseio_pulsein_deinit(pulseio_pulsein_obj_t* self) {
+ if (common_hal_pulseio_pulsein_deinited(self)) {
+ return;
+ }
+ pio_sm_set_enabled(self->state_machine.pio, self->state_machine.state_machine, false);
+ pio_sm_unclaim (self->state_machine.pio, self->state_machine.state_machine);
+ m_free(self->buffer);
+ self->pin = NO_PIN;
+}
+
+void common_hal_pulseio_pulsein_pause(pulseio_pulsein_obj_t* self) {
+ pio_sm_set_enabled(self->state_machine.pio, self->state_machine.state_machine, false);
+}
+
+void common_hal_pulseio_pulsein_interrupt() {
+
+ pulseio_pulsein_obj_t* self = save_self;
+ uint32_t rxfifo = 0;
+
+ rxfifo = pio_sm_get_blocking(self->state_machine.pio, self->state_machine.state_machine);
+ // translate from fifo to buffer
+ for (uint i = 0; i < 32; i++) {
+ bool level = (rxfifo & (1 << i)) >> i;
+ if (level == last_level ) {
+ level_count ++;
+ } else {
+ result = level_count;
+ last_level = level;
+ level_count = 1;
+ // ignore pulses that are too long and too short
+ if (result < 4000 && result > 10) {
+ self->buffer[buf_index] = result;
+ buf_index++;
+ self->len++;
+ }
+ }
+ }
+// check for a pulse thats too long (4000 us) or maxlen reached, and reset
+ if (( level_count > 4000 ) || (buf_index >= self->maxlen)) {
+ pio_sm_set_enabled(self->state_machine.pio, self->state_machine.state_machine, false);
+ pio_sm_init(self->state_machine.pio, self->state_machine.state_machine, self->state_machine.offset, &self->state_machine.sm_config);
+ pio_sm_restart(self->state_machine.pio,self->state_machine.state_machine);
+ pio_sm_set_enabled(self->state_machine.pio, self->state_machine.state_machine, true);
+ }
+}
+void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t* self,
+ uint16_t trigger_duration) {
+ // exec a wait for the selected pin to change state
+ if (self->idle_state == true ) {
+ pio_sm_exec(self->state_machine.pio,self->state_machine.state_machine,0x2020);
+ } else {
+ pio_sm_exec(self->state_machine.pio,self->state_machine.state_machine,0x20a0);
+ }
+ // Send the trigger pulse.
+ if (trigger_duration > 0) {
+ gpio_set_function(self->pin ,GPIO_FUNC_SIO);
+ gpio_set_dir(self->pin,true);
+ gpio_put(self->pin, !self->idle_state);
+ common_hal_mcu_delay_us((uint32_t)trigger_duration);
+ gpio_set_function(self->pin ,GPIO_FUNC_PIO0);
+ common_hal_mcu_delay_us(225);
+ }
+
+ // Reconfigure the pin for PIO
+ gpio_set_function(self->pin, GPIO_FUNC_PIO0);
+ pio_sm_set_enabled(self->state_machine.pio, self->state_machine.state_machine, true);
+}
+
+void common_hal_pulseio_pulsein_clear(pulseio_pulsein_obj_t* self) {
+ self->start = 0;
+ self->len = 0;
+}
+
+uint16_t common_hal_pulseio_pulsein_popleft(pulseio_pulsein_obj_t* self) {
+ if (self->len == 0) {
+ mp_raise_IndexError_varg(translate("pop from empty %q"), MP_QSTR_PulseIn);
+ }
+ uint16_t value = self->buffer[self->start];
+ self->start = (self->start + 1) % self->maxlen;
+ self->len--;
+ // if we are empty reset buffer pointer and counters
+ if (self->len == 0 ) {
+ self->start = 0;
+ buf_index = 0;
+ level_count = 0;
+ }
+ return value;
+}
+
+uint16_t common_hal_pulseio_pulsein_get_maxlen(pulseio_pulsein_obj_t* self) {
+ return self->maxlen;
+}
+
+uint16_t common_hal_pulseio_pulsein_get_len(pulseio_pulsein_obj_t* self) {
+ return self->len;
+}
+
+bool common_hal_pulseio_pulsein_get_paused(pulseio_pulsein_obj_t* self) {
+ return true;
+}
+
+uint16_t common_hal_pulseio_pulsein_get_item(pulseio_pulsein_obj_t* self,
+ int16_t index) {
+ if (index < 0) {
+ index += self->len;
+ }
+ if (index < 0 || index >= self->len) {
+ mp_raise_IndexError_varg(translate("%q index out of range"), MP_QSTR_PulseIn);
+ }
+ uint16_t value = self->buffer[(self->start + index) % self->maxlen];
+ return value;
+}
diff --git a/ports/raspberrypi/common-hal/pulseio/PulseIn.h b/ports/raspberrypi/common-hal/pulseio/PulseIn.h
new file mode 100644
index 000000000..c83a86fca
--- /dev/null
+++ b/ports/raspberrypi/common-hal/pulseio/PulseIn.h
@@ -0,0 +1,50 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021 Dave Putz 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_PULSEIO_PULSEIN_H
+#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_PULSEIO_PULSEIN_H
+
+#include "common-hal/microcontroller/Pin.h"
+#include "src/rp2_common/hardware_pio/include/hardware/pio.h"
+#include "common-hal/rp2pio/StateMachine.h"
+
+#include "py/obj.h"
+
+typedef struct {
+ mp_obj_base_t base;
+ uint8_t pin;
+ uint16_t* buffer;
+ uint16_t maxlen;
+ bool idle_state;
+ volatile uint16_t start;
+ volatile uint16_t len;
+ rp2pio_statemachine_obj_t state_machine;
+} pulseio_pulsein_obj_t;
+
+void pulsein_reset(void);
+void common_hal_pulseio_pulsein_interrupt();
+
+#endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_PULSEIO_PULSEIN_H
diff --git a/ports/raspberrypi/common-hal/pulseio/PulseOut.c b/ports/raspberrypi/common-hal/pulseio/PulseOut.c
new file mode 100644
index 000000000..e284cd46a
--- /dev/null
+++ b/ports/raspberrypi/common-hal/pulseio/PulseOut.c
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021 Dave Putz for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "common-hal/pulseio/PulseOut.h"
+
+#include <stdint.h>
+
+#include "src/rp2_common/hardware_gpio/include/hardware/gpio.h"
+
+#include "mpconfigport.h"
+#include "py/gc.h"
+#include "py/runtime.h"
+#include "shared-bindings/pulseio/PulseOut.h"
+#include "supervisor/shared/translate.h"
+
+static uint8_t refcount = 0;
+
+
+static uint16_t *pulse_buffer = NULL;
+static volatile uint16_t pulse_index = 0;
+static uint16_t pulse_length;
+static volatile uint32_t current_compare = 0;
+
+void pulse_finish(void) {
+ pulse_index++;
+
+ // Always turn it off.
+ if (pulse_index >= pulse_length) {
+ return;
+ }
+ current_compare = (current_compare + pulse_buffer[pulse_index] * 3 / 4) & 0xffff;
+}
+
+void pulseout_reset() {
+ refcount = 0;
+}
+
+void common_hal_pulseio_pulseout_construct(pulseio_pulseout_obj_t* self,
+ const pwmio_pwmout_obj_t* carrier,
+ const mcu_pin_obj_t* pin,
+ uint32_t frequency,
+ uint16_t duty_cycle) {
+ mp_raise_NotImplementedError(translate("Unsupported operation"));
+
+ refcount++;
+
+ self->pin = carrier->pin->number;
+
+}
+
+bool common_hal_pulseio_pulseout_deinited(pulseio_pulseout_obj_t* self) {
+ return self->pin == NO_PIN;
+}
+
+void common_hal_pulseio_pulseout_deinit(pulseio_pulseout_obj_t* self) {
+ if (common_hal_pulseio_pulseout_deinited(self)) {
+ return;
+ }
+
+
+ refcount--;
+ self->pin = NO_PIN;
+}
+
+void common_hal_pulseio_pulseout_send(pulseio_pulseout_obj_t* self, uint16_t* pulses, uint16_t length) {
+ pulse_buffer = pulses;
+ pulse_index = 0;
+ pulse_length = length;
+
+ current_compare = pulses[0] * 3 / 4;
+
+}
diff --git a/ports/raspberrypi/common-hal/pulseio/PulseOut.h b/ports/raspberrypi/common-hal/pulseio/PulseOut.h
new file mode 100644
index 000000000..4f1bb9fa7
--- /dev/null
+++ b/ports/raspberrypi/common-hal/pulseio/PulseOut.h
@@ -0,0 +1,44 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021 Dave Putz 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_PULSEIO_PULSEOUT_H
+#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_PULSEIO_PULSEOUT_H
+
+#include "common-hal/microcontroller/Pin.h"
+
+#include "py/obj.h"
+
+#define NO_PIN 0xff
+
+typedef struct {
+ mp_obj_base_t base;
+ uint8_t pin;
+} pulseio_pulseout_obj_t;
+
+void pulseout_reset(void);
+void pulseout_interrupt_handler(uint8_t index);
+
+#endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_PULSEIO_PULSEOUT_H
diff --git a/ports/raspberrypi/common-hal/pulseio/__init__.c b/ports/raspberrypi/common-hal/pulseio/__init__.c
new file mode 100644
index 000000000..2bee925bc
--- /dev/null
+++ b/ports/raspberrypi/common-hal/pulseio/__init__.c
@@ -0,0 +1 @@
+// No pulseio module functions.
diff --git a/ports/raspberrypi/common-hal/rp2pio/StateMachine.c b/ports/raspberrypi/common-hal/rp2pio/StateMachine.c
index 672cd4d3c..56a7ab668 100644
--- a/ports/raspberrypi/common-hal/rp2pio/StateMachine.c
+++ b/ports/raspberrypi/common-hal/rp2pio/StateMachine.c
@@ -222,6 +222,7 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
if (program_offset == 32) {
program_offset = pio_add_program(self->pio, &program_struct);
}
+ self->offset = program_offset;
_current_program_id[pio_index][state_machine] = program_id;
_current_program_len[pio_index][state_machine] = program_len;
_current_program_offset[pio_index][state_machine] = program_offset;
@@ -303,6 +304,7 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
self->init_len = init_len;
sm_config_set_fifo_join(&c, join);
+ self->sm_config = c;
pio_sm_init(self->pio, self->state_machine, program_offset, &c);
common_hal_rp2pio_statemachine_run(self, init, init_len);
diff --git a/ports/raspberrypi/common-hal/rp2pio/StateMachine.h b/ports/raspberrypi/common-hal/rp2pio/StateMachine.h
index f40db61ea..15bc2a346 100644
--- a/ports/raspberrypi/common-hal/rp2pio/StateMachine.h
+++ b/ports/raspberrypi/common-hal/rp2pio/StateMachine.h
@@ -51,6 +51,8 @@ typedef struct {
bool out_shift_right;
bool in_shift_right;
uint32_t actual_frequency;
+ pio_sm_config sm_config;
+ uint8_t offset;
} rp2pio_statemachine_obj_t;
void reset_rp2pio_statemachine(void);
diff --git a/ports/raspberrypi/common-hal/rtc/RTC.c b/ports/raspberrypi/common-hal/rtc/RTC.c
index 89c23fc19..e6c5d8871 100644
--- a/ports/raspberrypi/common-hal/rtc/RTC.c
+++ b/ports/raspberrypi/common-hal/rtc/RTC.c
@@ -29,9 +29,23 @@
#include "py/runtime.h"
#include "src/rp2_common/hardware_rtc/include/hardware/rtc.h"
+#include "src/rp2_common/hardware_clocks/include/hardware/clocks.h"
void common_hal_rtc_init(void) {
+ datetime_t t = {
+ .year = 2020,
+ .month = 1,
+ .day = 1,
+ .dotw = 3, // 0 is Sunday, so 3 is Wednesday
+ .hour = 0,
+ .min = 0,
+ .sec = 0
+ };
+
+ // Start the RTC
rtc_init();
+ rtc_set_datetime(&t);
+
}
void common_hal_rtc_get_time(timeutils_struct_time_t *tm) {
diff --git a/ports/raspberrypi/mpconfigport.mk b/ports/raspberrypi/mpconfigport.mk
index 03de6ce5e..bcfe3efd1 100644
--- a/ports/raspberrypi/mpconfigport.mk
+++ b/ports/raspberrypi/mpconfigport.mk
@@ -25,6 +25,7 @@ endif
CIRCUITPY_FRAMEBUFFERIO = 1
CIRCUITPY_FULL_BUILD = 1
+CIRCUITPY_AUDIOMP3 ?= 1
CIRCUITPY_BITOPS = 1
CIRCUITPY_PWMIO = 1
CIRCUITPY_RGBMATRIX = 1
@@ -36,7 +37,7 @@ CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_NVM = 1
# Use PIO interally
-CIRCUITPY_PULSEIO = 0
+CIRCUITPY_PULSEIO = 1
CIRCUITPY_WATCHDOG = 1
# Audio via PWM
@@ -47,7 +48,6 @@ CIRCUITPY_AUDIOPWMIO ?= 1
# These libraries require Cortex M4+ for fancy math instructions.
CIRCUITPY_AUDIOMIXER ?= 0
-CIRCUITPY_AUDIOMP3 ?= 0
INTERNAL_LIBM = 1
diff --git a/ports/stm/boards/feather_stm32f405_express/mpconfigboard.mk b/ports/stm/boards/feather_stm32f405_express/mpconfigboard.mk
index 39bf7dc54..e525ebe1e 100644
--- a/ports/stm/boards/feather_stm32f405_express/mpconfigboard.mk
+++ b/ports/stm/boards/feather_stm32f405_express/mpconfigboard.mk
@@ -15,3 +15,5 @@ LD_DEFAULT = boards/STM32F405_default.ld
# UF2 boot option
LD_BOOT = boards/STM32F405_boot.ld
UF2_OFFSET = 0x8010000
+
+CIRCUITPY_RGBMATRIX ?= 1
diff --git a/ports/stm/boards/pyboard_v11/mpconfigboard.mk b/ports/stm/boards/pyboard_v11/mpconfigboard.mk
index 78b96e55f..4aff25bb0 100644
--- a/ports/stm/boards/pyboard_v11/mpconfigboard.mk
+++ b/ports/stm/boards/pyboard_v11/mpconfigboard.mk
@@ -11,3 +11,5 @@ MCU_PACKAGE = LQFP64
LD_COMMON = boards/common_default.ld
LD_FILE = boards/STM32F405_fs.ld
+
+CIRCUITPY_RGBMATRIX ?= 1
diff --git a/ports/stm/common-hal/busio/UART.c b/ports/stm/common-hal/busio/UART.c
index 0cd906181..b4794a31b 100644
--- a/ports/stm/common-hal/busio/UART.c
+++ b/ports/stm/common-hal/busio/UART.c
@@ -268,6 +268,7 @@ void common_hal_busio_uart_deinit(busio_uart_obj_t *self) {
for (size_t i = 0; i < MP_ARRAY_SIZE(mcu_uart_banks); i++) {
if (mcu_uart_banks[i] == self->handle.Instance) {
+ reserved_uart[i] = false;
never_reset_uart[i] = false;
break;
}
diff --git a/ports/stm/mpconfigport.mk b/ports/stm/mpconfigport.mk
index fe257fc50..4d76d03c9 100644
--- a/ports/stm/mpconfigport.mk
+++ b/ports/stm/mpconfigport.mk
@@ -3,10 +3,9 @@ LONGINT_IMPL ?= MPZ
INTERNAL_LIBM ?= 1
USB_SERIAL_NUMBER_LENGTH ?= 24
-ifeq ($(MCU_VARIANT),STM32F405xx)
+ifeq ($(MCU_VARIANT),$(filter $(MCU_VARIANT),STM32F405xx STM32F407xx))
CIRCUITPY_CANIO = 1
CIRCUITPY_FRAMEBUFFERIO ?= 1
- CIRCUITPY_RGBMATRIX ?= 1
CIRCUITPY_SDIOIO ?= 1
# Number of USB endpoint pairs.
USB_NUM_EP = 4
diff --git a/ports/stm/peripherals/stm32f4/stm32f407xx/periph.c b/ports/stm/peripherals/stm32f4/stm32f407xx/periph.c
index e75f0b206..2f9accbf1 100644
--- a/ports/stm/peripherals/stm32f4/stm32f407xx/periph.c
+++ b/ports/stm/peripherals/stm32f4/stm32f407xx/periph.c
@@ -29,55 +29,57 @@
#include "peripherals/pins.h"
#include "peripherals/periph.h"
-// I2C
+I2C_TypeDef * mcu_i2c_banks[I2C_BANK_ARRAY_LEN] = {I2C1, I2C2, I2C3};
-I2C_TypeDef * mcu_i2c_banks[3] = {I2C1, I2C2, I2C3};
-
-const mcu_periph_obj_t mcu_i2c_sda_list[4] = {
+const mcu_periph_obj_t mcu_i2c_sda_list[I2C_SDA_ARRAY_LEN] = {
PERIPH(1, 4, &pin_PB07),
PERIPH(1, 4, &pin_PB09),
PERIPH(2, 4, &pin_PB11),
PERIPH(3, 4, &pin_PC09),
+ PERIPH(2, 4, &pin_PF00),
+ PERIPH(2, 4, &pin_PH05),
+ PERIPH(3, 4, &pin_PH08),
};
-
-const mcu_periph_obj_t mcu_i2c_scl_list[4] = {
+const mcu_periph_obj_t mcu_i2c_scl_list[I2C_SCL_ARRAY_LEN] = {
+ PERIPH(3, 4, &pin_PA08),
PERIPH(1, 4, &pin_PB06),
PERIPH(1, 4, &pin_PB08),
PERIPH(2, 4, &pin_PB10),
- PERIPH(3, 4, &pin_PA08)
+ PERIPH(2, 4, &pin_PF01),
+ PERIPH(2, 4, &pin_PH04),
+ PERIPH(3, 4, &pin_PH07),
};
-SPI_TypeDef * mcu_spi_banks[3] = {SPI1, SPI2, SPI3};
+SPI_TypeDef * mcu_spi_banks[SPI_BANK_ARRAY_LEN] = {SPI1, SPI2, SPI3};
-const mcu_periph_obj_t mcu_spi_sck_list[7] = {
+const mcu_periph_obj_t mcu_spi_sck_list[SPI_SCK_ARRAY_LEN] = {
PERIPH(1, 5, &pin_PA05),
PERIPH(1, 5, &pin_PB03),
+ PERIPH(3, 6, &pin_PB03),
PERIPH(2, 5, &pin_PB10),
PERIPH(2, 5, &pin_PB13),
- PERIPH(2, 5, &pin_PC07),
- PERIPH(3, 6, &pin_PB03),
PERIPH(3, 6, &pin_PC10),
+ PERIPH(2, 5, &pin_PI01),
};
-
-const mcu_periph_obj_t mcu_spi_mosi_list[6] = {
+const mcu_periph_obj_t mcu_spi_mosi_list[SPI_MOSI_ARRAY_LEN] = {
PERIPH(1, 5, &pin_PA07),
PERIPH(1, 5, &pin_PB05),
+ PERIPH(3, 6, &pin_PB05),
PERIPH(2, 5, &pin_PB15),
PERIPH(2, 5, &pin_PC03),
- PERIPH(3, 6, &pin_PB05),
PERIPH(3, 6, &pin_PC12),
+ PERIPH(2, 5, &pin_PI03),
};
-
-const mcu_periph_obj_t mcu_spi_miso_list[6] = {
+const mcu_periph_obj_t mcu_spi_miso_list[SPI_MISO_ARRAY_LEN] = {
PERIPH(1, 5, &pin_PA06),
PERIPH(1, 5, &pin_PB04),
+ PERIPH(3, 6, &pin_PB04),
PERIPH(2, 5, &pin_PB14),
PERIPH(2, 5, &pin_PC02),
- PERIPH(3, 6, &pin_PB04),
PERIPH(3, 6, &pin_PC11),
+ PERIPH(2, 5, &pin_PI02),
};
-
-const mcu_periph_obj_t mcu_spi_nss_list[6] = {
+const mcu_periph_obj_t mcu_spi_nss_list[SPI_NSS_ARRAY_LEN] = {
PERIPH(1, 5, &pin_PA04),
PERIPH(1, 5, &pin_PA15),
PERIPH(2, 5, &pin_PB09),
@@ -89,7 +91,7 @@ const mcu_periph_obj_t mcu_spi_nss_list[6] = {
USART_TypeDef * mcu_uart_banks[MAX_UART] = {USART1, USART2, USART3, UART4, UART5, USART6};
bool mcu_uart_has_usart[MAX_UART] = {true, true, true, false, false, true};
-const mcu_periph_obj_t mcu_uart_tx_list[12] = {
+const mcu_periph_obj_t mcu_uart_tx_list[UART_TX_ARRAY_LEN] = {
PERIPH(4, 8, &pin_PA00),
PERIPH(2, 7, &pin_PA02),
PERIPH(1, 7, &pin_PA09),
@@ -103,8 +105,7 @@ const mcu_periph_obj_t mcu_uart_tx_list[12] = {
PERIPH(3, 7, &pin_PD08),
PERIPH(6, 8, &pin_PG14),
};
-
-const mcu_periph_obj_t mcu_uart_rx_list[12] = {
+const mcu_periph_obj_t mcu_uart_rx_list[UART_RX_ARRAY_LEN] = {
PERIPH(4, 8, &pin_PA01),
PERIPH(2, 7, &pin_PA03),
PERIPH(1, 7, &pin_PA10),
@@ -121,74 +122,120 @@ const mcu_periph_obj_t mcu_uart_rx_list[12] = {
//Timers
//TIM6 and TIM7 are basic timers that are only used by DAC, and don't have pins
-TIM_TypeDef * mcu_tim_banks[14] = {TIM1, TIM2, TIM3, TIM4, TIM5, NULL, NULL, TIM8, TIM9, TIM10,
+TIM_TypeDef * mcu_tim_banks[TIM_BANK_ARRAY_LEN] = {TIM1, TIM2, TIM3, TIM4, TIM5, NULL, NULL, TIM8, TIM9, TIM10,
TIM11, TIM12, TIM13, TIM14};
-const mcu_tim_pin_obj_t mcu_tim_pin_list[56] = {
- TIM(2,1,1,&pin_PA00),
- TIM(5,2,1,&pin_PA00),
- TIM(2,1,2,&pin_PA01),
- TIM(5,2,2,&pin_PA01),
- TIM(2,1,3,&pin_PA02),
- TIM(5,2,3,&pin_PA02),
- TIM(2,1,4,&pin_PA03),
- TIM(5,2,4,&pin_PA03),
- TIM(9,3,1,&pin_PA02),
- TIM(9,3,2,&pin_PA03),
- TIM(3,2,1,&pin_PA06),
- TIM(13,9,1,&pin_PA06),
- TIM(3,2,2,&pin_PA07),
- TIM(14,9,1,&pin_PA07),
- TIM(1,1,1,&pin_PA08),
- TIM(1,1,2,&pin_PA09),
- TIM(1,1,3,&pin_PA10),
- TIM(1,1,4,&pin_PA11),
- TIM(2,1,1,&pin_PA15),
- TIM(3,2,3,&pin_PB00),
- TIM(3,2,4,&pin_PB01),
- TIM(2,1,2,&pin_PB03),
- TIM(3,2,1,&pin_PB04),
- TIM(3,2,2,&pin_PB05),
- TIM(4,2,1,&pin_PB06),
- TIM(4,2,2,&pin_PB07),
- TIM(4,2,3,&pin_PB08),
- TIM(10,2,1,&pin_PB08),
- TIM(4,2,4,&pin_PB09),
- TIM(11,2,1,&pin_PB09),
- TIM(2,1,3,&pin_PB10),
- TIM(2,1,4,&pin_PB11),
- TIM(12,9,1,&pin_PB14),
- TIM(12,9,2,&pin_PB15),
- TIM(3,2,1,&pin_PC06),
- TIM(3,2,2,&pin_PC07),
- TIM(3,2,3,&pin_PC08),
- TIM(3,2,4,&pin_PC09),
- TIM(8,3,1,&pin_PC06),
- TIM(8,3,2,&pin_PC07),
- TIM(8,3,3,&pin_PC08),
- TIM(8,3,4,&pin_PC09),
- TIM(4,2,1,&pin_PD12),
- TIM(4,2,2,&pin_PD13),
- TIM(4,2,3,&pin_PD14),
- TIM(4,2,4,&pin_PD15),
- TIM(9,3,1,&pin_PE05),
- TIM(9,3,2,&pin_PE06),
- TIM(1,1,1,&pin_PE09),
- TIM(1,1,2,&pin_PE11),
- TIM(1,1,3,&pin_PE13),
- TIM(1,1,4,&pin_PE14),
- TIM(10,3,1,&pin_PF06),
- TIM(11,3,1,&pin_PF07),
- TIM(13,9,1,&pin_PF08),
- TIM(14,9,1,&pin_PF09),
- // TIM(12,9,1,&pin_PH06), //TODO: include these when pin map is expanded
- // TIM(12,9,2,&pin_PH09),
- // TIM(5,2,1,&pin_PH10),
- // TIM(5,2,2,&pin_PH11),
- // TIM(5,2,3,&pin_PH12),
- // TIM(5,2,4,&pin_PI00),
- // TIM(8,3,4,&pin_PI02),
- // TIM(8,3,1,&pin_PI05),
- // TIM(8,3,2,&pin_PI06),
- // TIM(8,3,3,&pin_PI07),
+const mcu_tim_pin_obj_t mcu_tim_pin_list[TIM_PIN_ARRAY_LEN] = {
+ TIM(2, 1, 1, &pin_PA00),
+ TIM(5, 2, 1, &pin_PA00),
+ TIM(2, 1, 2, &pin_PA01),
+ TIM(5, 2, 2, &pin_PA01),
+ TIM(2, 1, 3, &pin_PA02),
+ TIM(5, 2, 3, &pin_PA02),
+ TIM(9, 3, 1, &pin_PA02),
+ TIM(2, 1, 4, &pin_PA03),
+ TIM(5, 2, 4, &pin_PA03),
+ TIM(9, 3, 2, &pin_PA03),
+ TIM(2, 1, 1, &pin_PA05),
+ TIM(3, 2, 1, &pin_PA06),
+ TIM(13, 9, 1, &pin_PA06),
+ TIM(3, 2, 2, &pin_PA07),
+ TIM(14, 9, 1, &pin_PA07),
+ TIM(1, 1, 1, &pin_PA08),
+ TIM(1, 1, 2, &pin_PA09),
+ TIM(1, 1, 3, &pin_PA10),
+ TIM(1, 1, 4, &pin_PA11),
+ TIM(2, 1, 1, &pin_PA15),
+ TIM(3, 2, 3, &pin_PB00),
+ TIM(3, 2, 4, &pin_PB01),
+ TIM(2, 1, 2, &pin_PB03),
+ TIM(3, 2, 1, &pin_PB04),
+ TIM(3, 2, 2, &pin_PB05),
+ TIM(4, 2, 1, &pin_PB06),
+ TIM(4, 2, 2, &pin_PB07),
+ TIM(4, 2, 3, &pin_PB08),
+ TIM(10, 3, 1, &pin_PB08),
+ TIM(4, 2, 4, &pin_PB09),
+ TIM(11, 3, 1, &pin_PB09),
+ TIM(2, 1, 3, &pin_PB10),
+ TIM(2, 1, 4, &pin_PB11),
+ TIM(12, 9, 1, &pin_PB14),
+ TIM(12, 9, 2, &pin_PB15),
+ TIM(3, 2, 1, &pin_PC06),
+ TIM(8, 3, 1, &pin_PC06),
+ TIM(3, 2, 2, &pin_PC07),
+ TIM(8, 3, 2, &pin_PC07),
+ TIM(3, 2, 3, &pin_PC08),
+ TIM(8, 3, 3, &pin_PC08),
+ TIM(3, 2, 4, &pin_PC09),
+ TIM(8, 3, 4, &pin_PC09),
+ TIM(4, 2, 1, &pin_PD12),
+ TIM(4, 2, 2, &pin_PD13),
+ TIM(4, 2, 3, &pin_PD14),
+ TIM(4, 2, 4, &pin_PD15),
+ TIM(9, 3, 1, &pin_PE05),
+ TIM(9, 3, 2, &pin_PE06),
+ TIM(1, 1, 1, &pin_PE09),
+ TIM(1, 1, 2, &pin_PE11),
+ TIM(1, 1, 3, &pin_PE13),
+ TIM(1, 1, 4, &pin_PE14),
+ TIM(10, 3, 1, &pin_PF06),
+ TIM(11, 3, 1, &pin_PF07),
+ TIM(13, 9, 1, &pin_PF08),
+ TIM(14, 9, 1, &pin_PF09),
+ TIM(12, 9, 1, &pin_PH06),
+ TIM(12, 9, 2, &pin_PH09),
+ TIM(5, 2, 1, &pin_PH10),
+ TIM(5, 2, 2, &pin_PH11),
+ TIM(5, 2, 3, &pin_PH12),
+ TIM(5, 2, 4, &pin_PI00),
+ TIM(8, 3, 4, &pin_PI02),
+ TIM(8, 3, 1, &pin_PI05),
+ TIM(8, 3, 2, &pin_PI06),
+ TIM(8, 3, 3, &pin_PI07),
+};
+
+//SDIO
+SDIO_TypeDef * mcu_sdio_banks[1] = {SDIO};
+
+const mcu_periph_obj_t mcu_sdio_clock_list[1] = {
+ PERIPH(1, 12, &pin_PC12),
+};
+const mcu_periph_obj_t mcu_sdio_command_list[1] = {
+ PERIPH(1, 12, &pin_PD02),
+};
+const mcu_periph_obj_t mcu_sdio_data0_list[1] = {
+ PERIPH(1, 12, &pin_PC08),
+};
+const mcu_periph_obj_t mcu_sdio_data1_list[1] = {
+ PERIPH(1, 12, &pin_PC09),
+};
+const mcu_periph_obj_t mcu_sdio_data2_list[1] = {
+ PERIPH(1, 12, &pin_PC10),
+};
+const mcu_periph_obj_t mcu_sdio_data3_list[1] = {
+ PERIPH(1, 12, &pin_PC11),
+};
+
+//CAN
+CAN_TypeDef * mcu_can_banks[2] = {CAN1, CAN2};
+
+const mcu_periph_obj_t mcu_can_tx_list[6] = {
+ PERIPH(1, 9, &pin_PA11),
+ PERIPH(1, 9, &pin_PB08),
+ PERIPH(1, 9, &pin_PD00),
+ PERIPH(1, 9, &pin_PI09),
+
+ PERIPH(2, 9, &pin_PB12),
+ PERIPH(2, 9, &pin_PB05),
+};
+
+const mcu_periph_obj_t mcu_can_rx_list[6] = {
+ PERIPH(1, 9, &pin_PA12),
+ PERIPH(1, 9, &pin_PB09),
+ PERIPH(1, 9, &pin_PD01),
+ PERIPH(1, 9, &pin_PH13),
+
+ PERIPH(2, 9, &pin_PB13),
+ PERIPH(2, 9, &pin_PB06),
};
diff --git a/ports/stm/peripherals/stm32f4/stm32f407xx/periph.h b/ports/stm/peripherals/stm32f4/stm32f407xx/periph.h
index fb6348aba..e6d4526b6 100644
--- a/ports/stm/peripherals/stm32f4/stm32f407xx/periph.h
+++ b/ports/stm/peripherals/stm32f4/stm32f407xx/periph.h
@@ -28,30 +28,54 @@
#define MICROPY_INCLUDED_STM32_PERIPHERALS_STM32F407XX_PERIPH_H
//I2C
-extern I2C_TypeDef * mcu_i2c_banks[3];
-
-extern const mcu_periph_obj_t mcu_i2c_sda_list[4];
-extern const mcu_periph_obj_t mcu_i2c_scl_list[4];
+#define I2C_BANK_ARRAY_LEN 3
+#define I2C_SDA_ARRAY_LEN 7
+#define I2C_SCL_ARRAY_LEN 7
+extern I2C_TypeDef * mcu_i2c_banks[I2C_BANK_ARRAY_LEN];
+extern const mcu_periph_obj_t mcu_i2c_sda_list[I2C_SDA_ARRAY_LEN];
+extern const mcu_periph_obj_t mcu_i2c_scl_list[I2C_SCL_ARRAY_LEN];
//SPI
-extern SPI_TypeDef * mcu_spi_banks[3];
-
-extern const mcu_periph_obj_t mcu_spi_sck_list[7];
-extern const mcu_periph_obj_t mcu_spi_mosi_list[6];
-extern const mcu_periph_obj_t mcu_spi_miso_list[6];
-extern const mcu_periph_obj_t mcu_spi_nss_list[6];
+#define SPI_BANK_ARRAY_LEN 3
+#define SPI_SCK_ARRAY_LEN 7
+#define SPI_MOSI_ARRAY_LEN 7
+#define SPI_MISO_ARRAY_LEN 7
+#define SPI_NSS_ARRAY_LEN 6
+extern SPI_TypeDef * mcu_spi_banks[SPI_BANK_ARRAY_LEN];
+extern const mcu_periph_obj_t mcu_spi_sck_list[SPI_SCK_ARRAY_LEN];
+extern const mcu_periph_obj_t mcu_spi_mosi_list[SPI_MOSI_ARRAY_LEN];
+extern const mcu_periph_obj_t mcu_spi_miso_list[SPI_MISO_ARRAY_LEN];
+extern const mcu_periph_obj_t mcu_spi_nss_list[SPI_NSS_ARRAY_LEN];
//UART
+#define UART_TX_ARRAY_LEN 12
+#define UART_RX_ARRAY_LEN 12
extern USART_TypeDef * mcu_uart_banks[MAX_UART];
extern bool mcu_uart_has_usart[MAX_UART];
-
-extern const mcu_periph_obj_t mcu_uart_tx_list[12];
-extern const mcu_periph_obj_t mcu_uart_rx_list[12];
+extern const mcu_periph_obj_t mcu_uart_tx_list[UART_TX_ARRAY_LEN];
+extern const mcu_periph_obj_t mcu_uart_rx_list[UART_RX_ARRAY_LEN];
//Timers
#define TIM_BANK_ARRAY_LEN 14
-#define TIM_PIN_ARRAY_LEN 56
+#define TIM_PIN_ARRAY_LEN 67
extern TIM_TypeDef * mcu_tim_banks[TIM_BANK_ARRAY_LEN];
extern const mcu_tim_pin_obj_t mcu_tim_pin_list[TIM_PIN_ARRAY_LEN];
+//SDIO
+extern SDIO_TypeDef * mcu_sdio_banks[1];
+
+extern const mcu_periph_obj_t mcu_sdio_clock_list[1];
+extern const mcu_periph_obj_t mcu_sdio_command_list[1];
+extern const mcu_periph_obj_t mcu_sdio_data0_list[1];
+extern const mcu_periph_obj_t mcu_sdio_data1_list[1];
+extern const mcu_periph_obj_t mcu_sdio_data2_list[1];
+extern const mcu_periph_obj_t mcu_sdio_data3_list[1];
+
+// CAN
+extern CAN_TypeDef * mcu_can_banks[2];
+
+extern const mcu_periph_obj_t mcu_can_tx_list[6];
+extern const mcu_periph_obj_t mcu_can_rx_list[6];
+
+
#endif // MICROPY_INCLUDED_STM32_PERIPHERALS_STM32F407XX_PERIPH_H
diff --git a/ports/stm/peripherals/stm32f4/stm32f407xx/pins.c b/ports/stm/peripherals/stm32f4/stm32f407xx/pins.c
index 4282741a8..62acb1955 100644
--- a/ports/stm/peripherals/stm32f4/stm32f407xx/pins.c
+++ b/ports/stm/peripherals/stm32f4/stm32f407xx/pins.c
@@ -28,33 +28,6 @@
#include "py/mphal.h"
#include "peripherals/pins.h"
-const mcu_pin_obj_t pin_PE02 = PIN(4, 2, NO_ADC);
-const mcu_pin_obj_t pin_PE03 = PIN(4, 3, NO_ADC);
-const mcu_pin_obj_t pin_PE04 = PIN(4, 4, NO_ADC);
-const mcu_pin_obj_t pin_PE05 = PIN(4, 5, NO_ADC);
-const mcu_pin_obj_t pin_PE06 = PIN(4, 6, NO_ADC);
-
-const mcu_pin_obj_t pin_PC13 = PIN(2, 13, NO_ADC); //anti-tamp
-const mcu_pin_obj_t pin_PC14 = PIN(2, 14, NO_ADC); //OSC32_IN
-const mcu_pin_obj_t pin_PC15 = PIN(2, 15, NO_ADC); //OSC32_OUT
-
-const mcu_pin_obj_t pin_PF00 = PIN(5, 0, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PF01 = PIN(5, 1, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PF02 = PIN(5, 2, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PF03 = PIN(5, 3, ADC_INPUT(ADC_3,9)); // 144 only
-const mcu_pin_obj_t pin_PF04 = PIN(5, 4, ADC_INPUT(ADC_3,14)); // 144 only
-const mcu_pin_obj_t pin_PF05 = PIN(5, 5, ADC_INPUT(ADC_3,15)); // 144 only
-const mcu_pin_obj_t pin_PF06 = PIN(5, 6, ADC_INPUT(ADC_3,4)); // 144 only
-const mcu_pin_obj_t pin_PF07 = PIN(5, 7, ADC_INPUT(ADC_3,5)); // 144 only
-const mcu_pin_obj_t pin_PF08 = PIN(5, 8, ADC_INPUT(ADC_3,6)); // 144 only
-const mcu_pin_obj_t pin_PF09 = PIN(5, 9, ADC_INPUT(ADC_3,7)); // 144 only
-const mcu_pin_obj_t pin_PF10 = PIN(5, 10, ADC_INPUT(ADC_3,8)); // 144 only
-
-const mcu_pin_obj_t pin_PC00 = PIN(2, 0, ADC_INPUT(ADC_123,10));
-const mcu_pin_obj_t pin_PC01 = PIN(2, 1, ADC_INPUT(ADC_123,11));
-const mcu_pin_obj_t pin_PC02 = PIN(2, 2, ADC_INPUT(ADC_123,12));
-const mcu_pin_obj_t pin_PC03 = PIN(2, 3, ADC_INPUT(ADC_123,13));
-
const mcu_pin_obj_t pin_PA00 = PIN(0, 0, ADC_INPUT(ADC_123,0));
const mcu_pin_obj_t pin_PA01 = PIN(0, 1, ADC_INPUT(ADC_123,1));
const mcu_pin_obj_t pin_PA02 = PIN(0, 2, ADC_INPUT(ADC_123,2));
@@ -63,75 +36,46 @@ const mcu_pin_obj_t pin_PA04 = PIN(0, 4, ADC_INPUT(ADC_12,4));
const mcu_pin_obj_t pin_PA05 = PIN(0, 5, ADC_INPUT(ADC_12,5));
const mcu_pin_obj_t pin_PA06 = PIN(0, 6, ADC_INPUT(ADC_12,6));
const mcu_pin_obj_t pin_PA07 = PIN(0, 7, ADC_INPUT(ADC_12,7));
-
-const mcu_pin_obj_t pin_PC04 = PIN(2, 4, ADC_INPUT(ADC_12,14));
-const mcu_pin_obj_t pin_PC05 = PIN(2, 5, ADC_INPUT(ADC_12,15));
-
+const mcu_pin_obj_t pin_PA08 = PIN(0, 8, NO_ADC);
+const mcu_pin_obj_t pin_PA09 = PIN(0, 9, NO_ADC);
+const mcu_pin_obj_t pin_PA10 = PIN(0, 10, NO_ADC);
+const mcu_pin_obj_t pin_PA11 = PIN(0, 11, NO_ADC);
+const mcu_pin_obj_t pin_PA12 = PIN(0, 12, NO_ADC);
+const mcu_pin_obj_t pin_PA13 = PIN(0, 13, NO_ADC);
+const mcu_pin_obj_t pin_PA14 = PIN(0, 14, NO_ADC);
+const mcu_pin_obj_t pin_PA15 = PIN(0, 15, NO_ADC);
const mcu_pin_obj_t pin_PB00 = PIN(1, 0, ADC_INPUT(ADC_12,8));
const mcu_pin_obj_t pin_PB01 = PIN(1, 1, ADC_INPUT(ADC_12,9));
-const mcu_pin_obj_t pin_PB02 = PIN(1, 2, NO_ADC); //BOOT1
-
-const mcu_pin_obj_t pin_PF11 = PIN(5, 11, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PF12 = PIN(5, 12, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PF13 = PIN(5, 13, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PF14 = PIN(5, 14, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PF15 = PIN(5, 15, NO_ADC); // 144 only
-
-const mcu_pin_obj_t pin_PG00 = PIN(6, 0, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG01 = PIN(6, 1, NO_ADC); // 144 only
-
-const mcu_pin_obj_t pin_PE07 = PIN(4, 7, NO_ADC);
-const mcu_pin_obj_t pin_PE08 = PIN(4, 8, NO_ADC);
-const mcu_pin_obj_t pin_PE09 = PIN(4, 9, NO_ADC);
-const mcu_pin_obj_t pin_PE10 = PIN(4, 10, NO_ADC);
-const mcu_pin_obj_t pin_PE11 = PIN(4, 11, NO_ADC);
-const mcu_pin_obj_t pin_PE12 = PIN(4, 12, NO_ADC);
-const mcu_pin_obj_t pin_PE13 = PIN(4, 13, NO_ADC);
-const mcu_pin_obj_t pin_PE14 = PIN(4, 14, NO_ADC);
-const mcu_pin_obj_t pin_PE15 = PIN(4, 15, NO_ADC);
-
+const mcu_pin_obj_t pin_PB02 = PIN(1, 2, NO_ADC);
+const mcu_pin_obj_t pin_PB03 = PIN(1, 3, NO_ADC);
+const mcu_pin_obj_t pin_PB04 = PIN(1, 4, NO_ADC);
+const mcu_pin_obj_t pin_PB05 = PIN(1, 5, NO_ADC);
+const mcu_pin_obj_t pin_PB06 = PIN(1, 6, NO_ADC);
+const mcu_pin_obj_t pin_PB07 = PIN(1, 7, NO_ADC);
+const mcu_pin_obj_t pin_PB08 = PIN(1, 8, NO_ADC);
+const mcu_pin_obj_t pin_PB09 = PIN(1, 9, NO_ADC);
const mcu_pin_obj_t pin_PB10 = PIN(1, 10, NO_ADC);
const mcu_pin_obj_t pin_PB11 = PIN(1, 11, NO_ADC);
const mcu_pin_obj_t pin_PB12 = PIN(1, 12, NO_ADC);
const mcu_pin_obj_t pin_PB13 = PIN(1, 13, NO_ADC);
const mcu_pin_obj_t pin_PB14 = PIN(1, 14, NO_ADC);
const mcu_pin_obj_t pin_PB15 = PIN(1, 15, NO_ADC);
-
-const mcu_pin_obj_t pin_PD08 = PIN(3, 8, NO_ADC);
-const mcu_pin_obj_t pin_PD09 = PIN(3, 9, NO_ADC);
-const mcu_pin_obj_t pin_PD10 = PIN(3, 10, NO_ADC);
-const mcu_pin_obj_t pin_PD11 = PIN(3, 11, NO_ADC);
-const mcu_pin_obj_t pin_PD12 = PIN(3, 12, NO_ADC);
-const mcu_pin_obj_t pin_PD13 = PIN(3, 13, NO_ADC);
-const mcu_pin_obj_t pin_PD14 = PIN(3, 14, NO_ADC);
-const mcu_pin_obj_t pin_PD15 = PIN(3, 15, NO_ADC);
-
-const mcu_pin_obj_t pin_PG02 = PIN(6, 2, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG03 = PIN(6, 3, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG04 = PIN(6, 4, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG05 = PIN(6, 5, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG06 = PIN(6, 6, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG07 = PIN(6, 7, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG08 = PIN(6, 8, NO_ADC); // 144 only
-
+const mcu_pin_obj_t pin_PC00 = PIN(2, 0, ADC_INPUT(ADC_123,10));
+const mcu_pin_obj_t pin_PC01 = PIN(2, 1, ADC_INPUT(ADC_123,11));
+const mcu_pin_obj_t pin_PC02 = PIN(2, 2, ADC_INPUT(ADC_123,12));
+const mcu_pin_obj_t pin_PC03 = PIN(2, 3, ADC_INPUT(ADC_123,13));
+const mcu_pin_obj_t pin_PC04 = PIN(2, 4, ADC_INPUT(ADC_12,14));
+const mcu_pin_obj_t pin_PC05 = PIN(2, 5, ADC_INPUT(ADC_12,15));
const mcu_pin_obj_t pin_PC06 = PIN(2, 6, NO_ADC);
const mcu_pin_obj_t pin_PC07 = PIN(2, 7, NO_ADC);
const mcu_pin_obj_t pin_PC08 = PIN(2, 8, NO_ADC);
const mcu_pin_obj_t pin_PC09 = PIN(2, 9, NO_ADC);
-
-const mcu_pin_obj_t pin_PA08 = PIN(0, 8, NO_ADC);
-const mcu_pin_obj_t pin_PA09 = PIN(0, 9, NO_ADC);
-const mcu_pin_obj_t pin_PA10 = PIN(0, 10, NO_ADC);
-const mcu_pin_obj_t pin_PA11 = PIN(0, 11, NO_ADC);
-const mcu_pin_obj_t pin_PA12 = PIN(0, 12, NO_ADC);
-const mcu_pin_obj_t pin_PA13 = PIN(0, 13, NO_ADC);
-const mcu_pin_obj_t pin_PA14 = PIN(0, 14, NO_ADC);
-const mcu_pin_obj_t pin_PA15 = PIN(0, 15, NO_ADC);
-
const mcu_pin_obj_t pin_PC10 = PIN(2, 10, NO_ADC);
const mcu_pin_obj_t pin_PC11 = PIN(2, 11, NO_ADC);
const mcu_pin_obj_t pin_PC12 = PIN(2, 12, NO_ADC);
-
+const mcu_pin_obj_t pin_PC13 = PIN(2, 13, NO_ADC);
+const mcu_pin_obj_t pin_PC14 = PIN(2, 14, NO_ADC);
+const mcu_pin_obj_t pin_PC15 = PIN(2, 15, NO_ADC);
const mcu_pin_obj_t pin_PD00 = PIN(3, 0, NO_ADC);
const mcu_pin_obj_t pin_PD01 = PIN(3, 1, NO_ADC);
const mcu_pin_obj_t pin_PD02 = PIN(3, 2, NO_ADC);
@@ -140,22 +84,87 @@ const mcu_pin_obj_t pin_PD04 = PIN(3, 4, NO_ADC);
const mcu_pin_obj_t pin_PD05 = PIN(3, 5, NO_ADC);
const mcu_pin_obj_t pin_PD06 = PIN(3, 6, NO_ADC);
const mcu_pin_obj_t pin_PD07 = PIN(3, 7, NO_ADC);
-
-const mcu_pin_obj_t pin_PG09 = PIN(6, 9, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG10 = PIN(6, 10, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG11 = PIN(6, 11, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG12 = PIN(6, 12, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG13 = PIN(6, 13, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG14 = PIN(6, 14, NO_ADC); // 144 only
-const mcu_pin_obj_t pin_PG15 = PIN(6, 15, NO_ADC); // 144 only
-
-const mcu_pin_obj_t pin_PB03 = PIN(1, 3, NO_ADC);
-const mcu_pin_obj_t pin_PB04 = PIN(1, 4, NO_ADC);
-const mcu_pin_obj_t pin_PB05 = PIN(1, 5, NO_ADC);
-const mcu_pin_obj_t pin_PB06 = PIN(1, 6, NO_ADC);
-const mcu_pin_obj_t pin_PB07 = PIN(1, 7, NO_ADC);
-const mcu_pin_obj_t pin_PB08 = PIN(1, 8, NO_ADC);
-const mcu_pin_obj_t pin_PB09 = PIN(1, 9, NO_ADC);
-
+const mcu_pin_obj_t pin_PD08 = PIN(3, 8, NO_ADC);
+const mcu_pin_obj_t pin_PD09 = PIN(3, 9, NO_ADC);
+const mcu_pin_obj_t pin_PD10 = PIN(3, 10, NO_ADC);
+const mcu_pin_obj_t pin_PD11 = PIN(3, 11, NO_ADC);
+const mcu_pin_obj_t pin_PD12 = PIN(3, 12, NO_ADC);
+const mcu_pin_obj_t pin_PD13 = PIN(3, 13, NO_ADC);
+const mcu_pin_obj_t pin_PD14 = PIN(3, 14, NO_ADC);
+const mcu_pin_obj_t pin_PD15 = PIN(3, 15, NO_ADC);
const mcu_pin_obj_t pin_PE00 = PIN(4, 0, NO_ADC);
const mcu_pin_obj_t pin_PE01 = PIN(4, 1, NO_ADC);
+const mcu_pin_obj_t pin_PE02 = PIN(4, 2, NO_ADC);
+const mcu_pin_obj_t pin_PE03 = PIN(4, 3, NO_ADC);
+const mcu_pin_obj_t pin_PE04 = PIN(4, 4, NO_ADC);
+const mcu_pin_obj_t pin_PE05 = PIN(4, 5, NO_ADC);
+const mcu_pin_obj_t pin_PE06 = PIN(4, 6, NO_ADC);
+const mcu_pin_obj_t pin_PE07 = PIN(4, 7, NO_ADC);
+const mcu_pin_obj_t pin_PE08 = PIN(4, 8, NO_ADC);
+const mcu_pin_obj_t pin_PE09 = PIN(4, 9, NO_ADC);
+const mcu_pin_obj_t pin_PE10 = PIN(4, 10, NO_ADC);
+const mcu_pin_obj_t pin_PE11 = PIN(4, 11, NO_ADC);
+const mcu_pin_obj_t pin_PE12 = PIN(4, 12, NO_ADC);
+const mcu_pin_obj_t pin_PE13 = PIN(4, 13, NO_ADC);
+const mcu_pin_obj_t pin_PE14 = PIN(4, 14, NO_ADC);
+const mcu_pin_obj_t pin_PE15 = PIN(4, 15, NO_ADC);
+const mcu_pin_obj_t pin_PF00 = PIN(5, 0, NO_ADC);
+const mcu_pin_obj_t pin_PF01 = PIN(5, 1, NO_ADC);
+const mcu_pin_obj_t pin_PF02 = PIN(5, 2, NO_ADC);
+const mcu_pin_obj_t pin_PF03 = PIN(5, 3, ADC_INPUT(ADC_3,9));
+const mcu_pin_obj_t pin_PF04 = PIN(5, 4, ADC_INPUT(ADC_3,14));
+const mcu_pin_obj_t pin_PF05 = PIN(5, 5, ADC_INPUT(ADC_3,15));
+const mcu_pin_obj_t pin_PF06 = PIN(5, 6, ADC_INPUT(ADC_3,4));
+const mcu_pin_obj_t pin_PF07 = PIN(5, 7, ADC_INPUT(ADC_3,5));
+const mcu_pin_obj_t pin_PF08 = PIN(5, 8, ADC_INPUT(ADC_3,6));
+const mcu_pin_obj_t pin_PF09 = PIN(5, 9, ADC_INPUT(ADC_3,7));
+const mcu_pin_obj_t pin_PF10 = PIN(5, 10, ADC_INPUT(ADC_3,8));
+const mcu_pin_obj_t pin_PF11 = PIN(5, 11, NO_ADC);
+const mcu_pin_obj_t pin_PF12 = PIN(5, 12, NO_ADC);
+const mcu_pin_obj_t pin_PF13 = PIN(5, 13, NO_ADC);
+const mcu_pin_obj_t pin_PF14 = PIN(5, 14, NO_ADC);
+const mcu_pin_obj_t pin_PF15 = PIN(5, 15, NO_ADC);
+const mcu_pin_obj_t pin_PG00 = PIN(6, 0, NO_ADC);
+const mcu_pin_obj_t pin_PG01 = PIN(6, 1, NO_ADC);
+const mcu_pin_obj_t pin_PG02 = PIN(6, 2, NO_ADC);
+const mcu_pin_obj_t pin_PG03 = PIN(6, 3, NO_ADC);
+const mcu_pin_obj_t pin_PG04 = PIN(6, 4, NO_ADC);
+const mcu_pin_obj_t pin_PG05 = PIN(6, 5, NO_ADC);
+const mcu_pin_obj_t pin_PG06 = PIN(6, 6, NO_ADC);
+const mcu_pin_obj_t pin_PG07 = PIN(6, 7, NO_ADC);
+const mcu_pin_obj_t pin_PG08 = PIN(6, 8, NO_ADC);
+const mcu_pin_obj_t pin_PG09 = PIN(6, 9, NO_ADC);
+const mcu_pin_obj_t pin_PG10 = PIN(6, 10, NO_ADC);
+const mcu_pin_obj_t pin_PG11 = PIN(6, 11, NO_ADC);
+const mcu_pin_obj_t pin_PG12 = PIN(6, 12, NO_ADC);
+const mcu_pin_obj_t pin_PG13 = PIN(6, 13, NO_ADC);
+const mcu_pin_obj_t pin_PG14 = PIN(6, 14, NO_ADC);
+const mcu_pin_obj_t pin_PG15 = PIN(6, 15, NO_ADC);
+const mcu_pin_obj_t pin_PH00 = PIN(7, 0, NO_ADC);
+const mcu_pin_obj_t pin_PH01 = PIN(7, 1, NO_ADC);
+const mcu_pin_obj_t pin_PH02 = PIN(7, 2, NO_ADC);
+const mcu_pin_obj_t pin_PH03 = PIN(7, 3, NO_ADC);
+const mcu_pin_obj_t pin_PH04 = PIN(7, 4, NO_ADC);
+const mcu_pin_obj_t pin_PH05 = PIN(7, 5, NO_ADC);
+const mcu_pin_obj_t pin_PH06 = PIN(7, 6, NO_ADC);
+const mcu_pin_obj_t pin_PH07 = PIN(7, 7, NO_ADC);
+const mcu_pin_obj_t pin_PH08 = PIN(7, 8, NO_ADC);
+const mcu_pin_obj_t pin_PH09 = PIN(7, 9, NO_ADC);
+const mcu_pin_obj_t pin_PH10 = PIN(7, 10, NO_ADC);
+const mcu_pin_obj_t pin_PH11 = PIN(7, 11, NO_ADC);
+const mcu_pin_obj_t pin_PH12 = PIN(7, 12, NO_ADC);
+const mcu_pin_obj_t pin_PH13 = PIN(7, 13, NO_ADC);
+const mcu_pin_obj_t pin_PH14 = PIN(7, 14, NO_ADC);
+const mcu_pin_obj_t pin_PH15 = PIN(7, 15, NO_ADC);
+const mcu_pin_obj_t pin_PI00 = PIN(8, 0, NO_ADC);
+const mcu_pin_obj_t pin_PI01 = PIN(8, 1, NO_ADC);
+const mcu_pin_obj_t pin_PI02 = PIN(8, 2, NO_ADC);
+const mcu_pin_obj_t pin_PI03 = PIN(8, 3, NO_ADC);
+const mcu_pin_obj_t pin_PI04 = PIN(8, 4, NO_ADC);
+const mcu_pin_obj_t pin_PI05 = PIN(8, 5, NO_ADC);
+const mcu_pin_obj_t pin_PI06 = PIN(8, 6, NO_ADC);
+const mcu_pin_obj_t pin_PI07 = PIN(8, 7, NO_ADC);
+const mcu_pin_obj_t pin_PI08 = PIN(8, 8, NO_ADC);
+const mcu_pin_obj_t pin_PI09 = PIN(8, 9, NO_ADC);
+const mcu_pin_obj_t pin_PI10 = PIN(8, 10, NO_ADC);
+const mcu_pin_obj_t pin_PI11 = PIN(8, 11, NO_ADC);
diff --git a/ports/stm/peripherals/stm32f4/stm32f407xx/pins.h b/ports/stm/peripherals/stm32f4/stm32f407xx/pins.h
index a247fe631..74ba8da2a 100644
--- a/ports/stm/peripherals/stm32f4/stm32f407xx/pins.h
+++ b/ports/stm/peripherals/stm32f4/stm32f407xx/pins.h
@@ -27,107 +27,54 @@
#ifndef MICROPY_INCLUDED_STM32_PERIPHERALS_STM32F407XX_PINS_H
#define MICROPY_INCLUDED_STM32_PERIPHERALS_STM32F407XX_PINS_H
-//Pins in datasheet order: DocID028087 Rev 7 page 50. LQFP100 only
-//pg 50
-extern const mcu_pin_obj_t pin_PE02;
-extern const mcu_pin_obj_t pin_PE03;
-extern const mcu_pin_obj_t pin_PE04;
-extern const mcu_pin_obj_t pin_PE05;
-extern const mcu_pin_obj_t pin_PE06;
-extern const mcu_pin_obj_t pin_PC13;
-extern const mcu_pin_obj_t pin_PC14;
-//pg 51
-extern const mcu_pin_obj_t pin_PC15;
-extern const mcu_pin_obj_t pin_PF00; // 144 only
-extern const mcu_pin_obj_t pin_PF01; // 144 only
-extern const mcu_pin_obj_t pin_PF02; // 144 only
-extern const mcu_pin_obj_t pin_PF03; // 144 only
-extern const mcu_pin_obj_t pin_PF04; // 144 only
-extern const mcu_pin_obj_t pin_PF05; // 144 only
-extern const mcu_pin_obj_t pin_PF06; // 144 only
-extern const mcu_pin_obj_t pin_PF07; // 144 only
-extern const mcu_pin_obj_t pin_PF08; // 144 only
-extern const mcu_pin_obj_t pin_PF09; // 144 only
-extern const mcu_pin_obj_t pin_PF10; // 144 only
-//pg 52
-extern const mcu_pin_obj_t pin_PC00;
-extern const mcu_pin_obj_t pin_PC01;
-extern const mcu_pin_obj_t pin_PC02;
-extern const mcu_pin_obj_t pin_PC03;
extern const mcu_pin_obj_t pin_PA00;
extern const mcu_pin_obj_t pin_PA01;
extern const mcu_pin_obj_t pin_PA02;
-//pg 53
extern const mcu_pin_obj_t pin_PA03;
extern const mcu_pin_obj_t pin_PA04;
extern const mcu_pin_obj_t pin_PA05;
extern const mcu_pin_obj_t pin_PA06;
extern const mcu_pin_obj_t pin_PA07;
-extern const mcu_pin_obj_t pin_PC04;
-//pg 54
-extern const mcu_pin_obj_t pin_PC05;
+extern const mcu_pin_obj_t pin_PA08;
+extern const mcu_pin_obj_t pin_PA09;
+extern const mcu_pin_obj_t pin_PA10;
+extern const mcu_pin_obj_t pin_PA11;
+extern const mcu_pin_obj_t pin_PA12;
+extern const mcu_pin_obj_t pin_PA13;
+extern const mcu_pin_obj_t pin_PA14;
+extern const mcu_pin_obj_t pin_PA15;
extern const mcu_pin_obj_t pin_PB00;
extern const mcu_pin_obj_t pin_PB01;
extern const mcu_pin_obj_t pin_PB02;
-extern const mcu_pin_obj_t pin_PF11; // 144 only
-extern const mcu_pin_obj_t pin_PF12; // 144 only
-extern const mcu_pin_obj_t pin_PF13; // 144 only
-extern const mcu_pin_obj_t pin_PF14; // 144 only
-extern const mcu_pin_obj_t pin_PF15; // 144 only
-extern const mcu_pin_obj_t pin_PG00; // 144 only
-extern const mcu_pin_obj_t pin_PG01; // 144 only
-//pg 55
-extern const mcu_pin_obj_t pin_PE07;
-extern const mcu_pin_obj_t pin_PE08;
-extern const mcu_pin_obj_t pin_PE09;
-extern const mcu_pin_obj_t pin_PE10;
-extern const mcu_pin_obj_t pin_PE11;
-extern const mcu_pin_obj_t pin_PE12;
-extern const mcu_pin_obj_t pin_PE13;
-extern const mcu_pin_obj_t pin_PE14;
-//pg 56
-extern const mcu_pin_obj_t pin_PE15;
+extern const mcu_pin_obj_t pin_PB03;
+extern const mcu_pin_obj_t pin_PB04;
+extern const mcu_pin_obj_t pin_PB05;
+extern const mcu_pin_obj_t pin_PB06;
+extern const mcu_pin_obj_t pin_PB07;
+extern const mcu_pin_obj_t pin_PB08;
+extern const mcu_pin_obj_t pin_PB09;
extern const mcu_pin_obj_t pin_PB10;
-extern const mcu_pin_obj_t pin_PB11; // 144 only
+extern const mcu_pin_obj_t pin_PB11;
extern const mcu_pin_obj_t pin_PB12;
extern const mcu_pin_obj_t pin_PB13;
-//pg 57
extern const mcu_pin_obj_t pin_PB14;
extern const mcu_pin_obj_t pin_PB15;
-extern const mcu_pin_obj_t pin_PD08;
-extern const mcu_pin_obj_t pin_PD09;
-extern const mcu_pin_obj_t pin_PD10;
-extern const mcu_pin_obj_t pin_PD11;
-extern const mcu_pin_obj_t pin_PD12;
-//pg 58
-extern const mcu_pin_obj_t pin_PD13;
-extern const mcu_pin_obj_t pin_PD14;
-extern const mcu_pin_obj_t pin_PD15;
-extern const mcu_pin_obj_t pin_PG02; // 144 only
-extern const mcu_pin_obj_t pin_PG03; // 144 only
-extern const mcu_pin_obj_t pin_PG04; // 144 only
-extern const mcu_pin_obj_t pin_PG05; // 144 only
-extern const mcu_pin_obj_t pin_PG06; // 144 only
-extern const mcu_pin_obj_t pin_PG07; // 144 only
-extern const mcu_pin_obj_t pin_PG08; // 144 only
-//pg 59
+extern const mcu_pin_obj_t pin_PC00;
+extern const mcu_pin_obj_t pin_PC01;
+extern const mcu_pin_obj_t pin_PC02;
+extern const mcu_pin_obj_t pin_PC03;
+extern const mcu_pin_obj_t pin_PC04;
+extern const mcu_pin_obj_t pin_PC05;
extern const mcu_pin_obj_t pin_PC06;
extern const mcu_pin_obj_t pin_PC07;
extern const mcu_pin_obj_t pin_PC08;
extern const mcu_pin_obj_t pin_PC09;
-extern const mcu_pin_obj_t pin_PA08;
-extern const mcu_pin_obj_t pin_PA09;
-extern const mcu_pin_obj_t pin_PA10;
-//pg 60
-extern const mcu_pin_obj_t pin_PA11;
-extern const mcu_pin_obj_t pin_PA12;
-extern const mcu_pin_obj_t pin_PA13;
-extern const mcu_pin_obj_t pin_PA14;
-extern const mcu_pin_obj_t pin_PA15;
extern const mcu_pin_obj_t pin_PC10;
extern const mcu_pin_obj_t pin_PC11;
-//pg 61
extern const mcu_pin_obj_t pin_PC12;
+extern const mcu_pin_obj_t pin_PC13;
+extern const mcu_pin_obj_t pin_PC14;
+extern const mcu_pin_obj_t pin_PC15;
extern const mcu_pin_obj_t pin_PD00;
extern const mcu_pin_obj_t pin_PD01;
extern const mcu_pin_obj_t pin_PD02;
@@ -136,23 +83,89 @@ extern const mcu_pin_obj_t pin_PD04;
extern const mcu_pin_obj_t pin_PD05;
extern const mcu_pin_obj_t pin_PD06;
extern const mcu_pin_obj_t pin_PD07;
-//pg 62
-extern const mcu_pin_obj_t pin_PG09; // 144 only
-extern const mcu_pin_obj_t pin_PG10; // 144 only
-extern const mcu_pin_obj_t pin_PG11; // 144 only
-extern const mcu_pin_obj_t pin_PG12; // 144 only
-extern const mcu_pin_obj_t pin_PG13; // 144 only
-extern const mcu_pin_obj_t pin_PG14; // 144 only
-extern const mcu_pin_obj_t pin_PG15; // 144 only
-extern const mcu_pin_obj_t pin_PB03;
-extern const mcu_pin_obj_t pin_PB04;
-//pg 63
-extern const mcu_pin_obj_t pin_PB05;
-extern const mcu_pin_obj_t pin_PB06;
-extern const mcu_pin_obj_t pin_PB07;
-extern const mcu_pin_obj_t pin_PB08;
-extern const mcu_pin_obj_t pin_PB09;
+extern const mcu_pin_obj_t pin_PD08;
+extern const mcu_pin_obj_t pin_PD09;
+extern const mcu_pin_obj_t pin_PD10;
+extern const mcu_pin_obj_t pin_PD11;
+extern const mcu_pin_obj_t pin_PD12;
+extern const mcu_pin_obj_t pin_PD13;
+extern const mcu_pin_obj_t pin_PD14;
+extern const mcu_pin_obj_t pin_PD15;
extern const mcu_pin_obj_t pin_PE00;
extern const mcu_pin_obj_t pin_PE01;
+extern const mcu_pin_obj_t pin_PE02;
+extern const mcu_pin_obj_t pin_PE03;
+extern const mcu_pin_obj_t pin_PE04;
+extern const mcu_pin_obj_t pin_PE05;
+extern const mcu_pin_obj_t pin_PE06;
+extern const mcu_pin_obj_t pin_PE07;
+extern const mcu_pin_obj_t pin_PE08;
+extern const mcu_pin_obj_t pin_PE09;
+extern const mcu_pin_obj_t pin_PE10;
+extern const mcu_pin_obj_t pin_PE11;
+extern const mcu_pin_obj_t pin_PE12;
+extern const mcu_pin_obj_t pin_PE13;
+extern const mcu_pin_obj_t pin_PE14;
+extern const mcu_pin_obj_t pin_PE15;
+extern const mcu_pin_obj_t pin_PF00;
+extern const mcu_pin_obj_t pin_PF01;
+extern const mcu_pin_obj_t pin_PF02;
+extern const mcu_pin_obj_t pin_PF03;
+extern const mcu_pin_obj_t pin_PF04;
+extern const mcu_pin_obj_t pin_PF05;
+extern const mcu_pin_obj_t pin_PF06;
+extern const mcu_pin_obj_t pin_PF07;
+extern const mcu_pin_obj_t pin_PF08;
+extern const mcu_pin_obj_t pin_PF09;
+extern const mcu_pin_obj_t pin_PF10;
+extern const mcu_pin_obj_t pin_PF11;
+extern const mcu_pin_obj_t pin_PF12;
+extern const mcu_pin_obj_t pin_PF13;
+extern const mcu_pin_obj_t pin_PF14;
+extern const mcu_pin_obj_t pin_PF15;
+extern const mcu_pin_obj_t pin_PG00;
+extern const mcu_pin_obj_t pin_PG01;
+extern const mcu_pin_obj_t pin_PG02;
+extern const mcu_pin_obj_t pin_PG03;
+extern const mcu_pin_obj_t pin_PG04;
+extern const mcu_pin_obj_t pin_PG05;
+extern const mcu_pin_obj_t pin_PG06;
+extern const mcu_pin_obj_t pin_PG07;
+extern const mcu_pin_obj_t pin_PG08;
+extern const mcu_pin_obj_t pin_PG09;
+extern const mcu_pin_obj_t pin_PG10;
+extern const mcu_pin_obj_t pin_PG11;
+extern const mcu_pin_obj_t pin_PG12;
+extern const mcu_pin_obj_t pin_PG13;
+extern const mcu_pin_obj_t pin_PG14;
+extern const mcu_pin_obj_t pin_PG15;
+extern const mcu_pin_obj_t pin_PH00;
+extern const mcu_pin_obj_t pin_PH01;
+extern const mcu_pin_obj_t pin_PH02;
+extern const mcu_pin_obj_t pin_PH03;
+extern const mcu_pin_obj_t pin_PH04;
+extern const mcu_pin_obj_t pin_PH05;
+extern const mcu_pin_obj_t pin_PH06;
+extern const mcu_pin_obj_t pin_PH07;
+extern const mcu_pin_obj_t pin_PH08;
+extern const mcu_pin_obj_t pin_PH09;
+extern const mcu_pin_obj_t pin_PH10;
+extern const mcu_pin_obj_t pin_PH11;
+extern const mcu_pin_obj_t pin_PH12;
+extern const mcu_pin_obj_t pin_PH13;
+extern const mcu_pin_obj_t pin_PH14;
+extern const mcu_pin_obj_t pin_PH15;
+extern const mcu_pin_obj_t pin_PI00;
+extern const mcu_pin_obj_t pin_PI01;
+extern const mcu_pin_obj_t pin_PI02;
+extern const mcu_pin_obj_t pin_PI03;
+extern const mcu_pin_obj_t pin_PI04;
+extern const mcu_pin_obj_t pin_PI05;
+extern const mcu_pin_obj_t pin_PI06;
+extern const mcu_pin_obj_t pin_PI07;
+extern const mcu_pin_obj_t pin_PI08;
+extern const mcu_pin_obj_t pin_PI09;
+extern const mcu_pin_obj_t pin_PI10;
+extern const mcu_pin_obj_t pin_PI11;
#endif // MICROPY_INCLUDED_STM32_PERIPHERALS_STM32F407XX_PINS_H
diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk
index 496ce918b..fea1f937e 100644
--- a/py/circuitpy_mpconfig.mk
+++ b/py/circuitpy_mpconfig.mk
@@ -322,8 +322,10 @@ CFLAGS += -DCIRCUITPY_TOUCHIO=$(CIRCUITPY_TOUCHIO)
CIRCUITPY_UHEAP ?= 0
CFLAGS += -DCIRCUITPY_UHEAP=$(CIRCUITPY_UHEAP)
+# Disable by default for now, until we have dynamic enabling.
+CIRCUITPY_USB_CDC ?= 0
# Secondary CDC is usually available if there are at least 8 endpoints.
-CIRCUITPY_USB_CDC ?= $(shell expr $(USB_NUM_EP) '>=' 8)
+#CIRCUITPY_USB_CDC ?= $(shell expr $(USB_NUM_EP) '>=' 8)
CFLAGS += -DCIRCUITPY_USB_CDC=$(CIRCUITPY_USB_CDC)
CIRCUITPY_USB_HID ?= 1
diff --git a/shared-bindings/bitmaptools/__init__.c b/shared-bindings/bitmaptools/__init__.c
index cf48d12dc..118564ff8 100644
--- a/shared-bindings/bitmaptools/__init__.c
+++ b/shared-bindings/bitmaptools/__init__.c
@@ -243,13 +243,127 @@ STATIC mp_obj_t bitmaptools_obj_rotozoom(size_t n_args, const mp_obj_t *pos_args
MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_rotozoom_obj, 0, bitmaptools_obj_rotozoom);
// requires at least 2 arguments (destination bitmap and source bitmap)
+//|
+//| def fill_region(
+//| dest_bitmap: displayio.Bitmap,
+//| x1: int, y1: int,
+//| x2: int, y2: int,
+//| value: int) -> None:
+//| """Draws the color value into the destination bitmap within the
+//| rectangular region bounded by (x1,y1) and (x2,y2), exclusive.
+//|
+//| :param bitmap dest_bitmap: Destination bitmap that will be written into
+//| :param int x1: x-pixel position of the first corner of the rectangular fill region
+//| :param int y1: y-pixel position of the first corner of the rectangular fill region
+//| :param int x2: x-pixel position of the second corner of the rectangular fill region (exclusive)
+//| :param int y2: y-pixel position of the second corner of the rectangular fill region (exclusive)
+//| :param int value: Bitmap palette index that will be written into the rectangular
+//| fill region in the destination bitmap"""
+//| ...
+//|
+STATIC mp_obj_t bitmaptools_obj_fill_region(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args){
+ enum {ARG_dest_bitmap, ARG_x1, ARG_y1, ARG_x2, ARG_y2, ARG_value};
+
+ static const mp_arg_t allowed_args[] = {
+ {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
+ {MP_QSTR_x1, MP_ARG_REQUIRED | MP_ARG_INT},
+ {MP_QSTR_y1, MP_ARG_REQUIRED | MP_ARG_INT},
+ {MP_QSTR_x2, MP_ARG_REQUIRED | MP_ARG_INT},
+ {MP_QSTR_y2, MP_ARG_REQUIRED | MP_ARG_INT},
+ {MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT},
+ };
+ 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
+
+ uint32_t value, color_depth;
+ value = args[ARG_value].u_int;
+ color_depth = (1 << destination->bits_per_value);
+ if (color_depth <= value) {
+ mp_raise_ValueError(translate("out of range of target"));
+ }
+
+ int16_t x1 = args[ARG_x1].u_int;
+ int16_t y1 = args[ARG_y1].u_int;
+ int16_t x2 = args[ARG_x2].u_int;
+ int16_t y2 = args[ARG_y2].u_int;
+
+ common_hal_bitmaptools_fill_region(destination, x1, y1, x2, y2, value);
+
+ return mp_const_none;
+}
+
+MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_fill_region_obj, 0, bitmaptools_obj_fill_region);
+// requires all 6 arguments
+
+//|
+//| def draw_line(
+//| dest_bitmap: displayio.Bitmap,
+//| x1: int, y1: int,
+//| x2: int, y2: int,
+//| value: int) -> None:
+//| """Draws a line into a bitmap specified two endpoints (x1,y1) and (x2,y2).
+//|
+//| :param bitmap dest_bitmap: Destination bitmap that will be written into
+//| :param int x1: x-pixel position of the line's first endpoint
+//| :param int y1: y-pixel position of the line's first endpoint
+//| :param int x2: x-pixel position of the line's second endpoint
+//| :param int y2: y-pixel position of the line's second endpoint
+//| :param int value: Bitmap palette index that will be written into the
+//| line in the destination bitmap"""
+//| ...
+//|
+STATIC mp_obj_t bitmaptools_obj_draw_line(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args){
+ enum {ARG_dest_bitmap, ARG_x1, ARG_y1, ARG_x2, ARG_y2, ARG_value};
+
+ static const mp_arg_t allowed_args[] = {
+ {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
+ {MP_QSTR_x1, MP_ARG_REQUIRED | MP_ARG_INT},
+ {MP_QSTR_y1, MP_ARG_REQUIRED | MP_ARG_INT},
+ {MP_QSTR_x2, MP_ARG_REQUIRED | MP_ARG_INT},
+ {MP_QSTR_y2, MP_ARG_REQUIRED | MP_ARG_INT},
+ {MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT},
+ };
+ 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
+
+ uint32_t value, color_depth;
+ value = args[ARG_value].u_int;
+ color_depth = (1 << destination->bits_per_value);
+ if (color_depth <= value) {
+ mp_raise_ValueError(translate("out of range of target"));
+ }
+
+ int16_t x1 = args[ARG_x1].u_int;
+ int16_t y1 = args[ARG_y1].u_int;
+ int16_t x2 = args[ARG_x2].u_int;
+ int16_t y2 = args[ARG_y2].u_int;
+
+ // verify points are within the bitmap boundary (inclusive)
+ if ( (x1 < 0) || (x2 < 0) || (y1 < 0) || (y2 < 0) ||
+ (x1 >= destination->width) || (x2 >= destination->width) ||
+ (y1 >= destination->height) || (y2 >= destination->height) ) {
+ mp_raise_ValueError(translate("out of range of target"));
+ }
+
+ common_hal_bitmaptools_draw_line(destination, x1, y1, x2, y2, value);
+
+ return mp_const_none;
+}
+
+MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_draw_line_obj, 0, bitmaptools_obj_draw_line);
+// requires all 6 arguments
STATIC const mp_rom_map_elem_t bitmaptools_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_rotozoom), MP_ROM_PTR(&bitmaptools_rotozoom_obj) },
+ { MP_ROM_QSTR(MP_QSTR_fill_region), MP_ROM_PTR(&bitmaptools_fill_region_obj) },
+ { MP_ROM_QSTR(MP_QSTR_draw_line), MP_ROM_PTR(&bitmaptools_draw_line_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
index e2bb6938b..1ab6e4129 100644
--- a/shared-bindings/bitmaptools/__init__.h
+++ b/shared-bindings/bitmaptools/__init__.h
@@ -39,4 +39,14 @@ void common_hal_bitmaptools_rotozoom(displayio_bitmap_t *self, int16_t ox, int16
float scale,
uint32_t skip_index, bool skip_index_none);
+void common_hal_bitmaptools_fill_region(displayio_bitmap_t *destination,
+ int16_t x1, int16_t y1,
+ int16_t x2, int16_t y2,
+ uint32_t value);
+
+void common_hal_bitmaptools_draw_line(displayio_bitmap_t *destination,
+ int16_t x0, int16_t y0,
+ int16_t x1, int16_t y1,
+ uint32_t value);
+
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BITMAPTOOLS__INIT__H
diff --git a/shared-module/bitmaptools/__init__.c b/shared-module/bitmaptools/__init__.c
index 7dc4024ef..6f168b555 100644
--- a/shared-module/bitmaptools/__init__.c
+++ b/shared-module/bitmaptools/__init__.c
@@ -26,10 +26,12 @@
#include "shared-bindings/displayio/Bitmap.h"
+#include "shared-module/displayio/Bitmap.h"
#include "py/runtime.h"
#include "math.h"
+#include "stdlib.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,
@@ -172,3 +174,165 @@ void common_hal_bitmaptools_rotozoom(displayio_bitmap_t *self, int16_t ox, int16
rowv += dvCol;
}
}
+
+int16_t constrain(int16_t input, int16_t min, int16_t max) {
+ // constrain the input between the min and max values
+ if (input < min) {
+ return min;
+ }
+ if (input > max) {
+ return max;
+ }
+ return input;
+}
+
+void common_hal_bitmaptools_fill_region(displayio_bitmap_t *destination,
+ int16_t x1, int16_t y1,
+ int16_t x2, int16_t y2,
+ uint32_t value) {
+ // writes the value (a bitmap color index) into a bitmap in the specified rectangular region
+ //
+ // input checks should ensure that x1 < x2 and y1 < y2 and are within the bitmap region
+
+ if (destination->read_only) {
+ mp_raise_RuntimeError(translate("Read-only object"));
+ }
+
+ // Ensure x1 < x2 and y1 < y2
+ if (x1 > x2) {
+ int16_t temp=x2;
+ x2=x1;
+ x1=temp;
+ }
+ if (y1 > y2) {
+ int16_t temp=y2;
+ y2=y1;
+ y1=temp;
+ }
+
+ // constrain to bitmap dimensions
+ x1 = constrain(x1, 0, destination->width);
+ x2 = constrain(x2, 0, destination->width);
+ y1 = constrain(y1, 0, destination->height);
+ y2 = constrain(y2, 0, destination->height);
+
+ // update the dirty rectangle
+ displayio_bitmap_set_dirty_area(destination, x1, y1, x2, y2);
+
+ int16_t x, y;
+ for (x = x1; x < x2; x++) {
+ for (y = y1; y < y2; y++ ) {
+ displayio_bitmap_write_pixel(destination, x, y, value);
+ }
+ }
+}
+
+void common_hal_bitmaptools_draw_line(displayio_bitmap_t *destination,
+ int16_t x0, int16_t y0,
+ int16_t x1, int16_t y1,
+ uint32_t value) {
+
+ if (destination->read_only) {
+ mp_raise_RuntimeError(translate("Read-only object"));
+ }
+
+ //
+ // adapted from Adafruit_CircuitPython_Display_Shapes.Polygon._line
+ //
+
+ // update the dirty rectangle
+ int16_t xbb0, xbb1, ybb0, ybb1;
+ if (x0 < x1) {
+ xbb0 = x0;
+ xbb1 = x1 + 1;
+ } else {
+ xbb0 = x1;
+ xbb1 = x0 + 1;
+ }
+ if (y0 < y1) {
+ ybb0 = y0;
+ ybb1 = y1 + 1;
+ } else {
+ ybb0 = y1;
+ ybb1 = y0 + 1;
+ }
+
+ xbb0 = constrain(xbb0, 0, destination->width);
+ xbb1 = constrain(xbb1, 0, destination->width);
+ ybb0 = constrain(ybb0, 0, destination->height);
+ ybb1 = constrain(ybb1, 0, destination->height);
+
+ displayio_bitmap_set_dirty_area(destination, xbb0, ybb0, xbb1, ybb1);
+
+ int16_t temp, x, y;
+
+ if (x0 == x1) { // vertical line
+ if (y0 > y1) { // ensure y1 > y0
+ temp = y0;
+ y0 = y1;
+ y1 = temp;
+ }
+ for (y = y0; y < (y1 + 1); y++) { // write a horizontal line
+ displayio_bitmap_write_pixel(destination, x0, y, value);
+ }
+ }
+ else if (y0 == y1) { // horizontal line
+ if (x0 > x1) { // ensure y1 > y0
+ temp = x0;
+ x0 = x1;
+ x1 = temp;
+ }
+ for (x = x0; x < (x1 + 1); x++) { // write a horizontal line
+ displayio_bitmap_write_pixel(destination, x, y0, value);
+ }
+ }
+ else {
+ bool steep;
+ steep = ( abs(y1 - y0) > abs(x1 - x0) );
+
+ if ( steep ) { // flip x0<->y0 and x1<->y1
+ temp = x0;
+ x0 = y0;
+ y0 = temp;
+ temp = x1;
+ x1 = y1;
+ y1 = temp;
+ }
+
+ if (x0 > x1) { // flip x0<->x1 and y0<->y1
+ temp = x0;
+ x0 = x1;
+ x1 = temp;
+ temp = y0;
+ y0 = y1;
+ y1 = temp;
+ }
+
+ int16_t dx, dy, ystep;
+ dx = x1 - x0;
+ dy = abs(y1 - y0);
+
+ float err = dx / 2;
+
+ if (y0 < y1) {
+ ystep = 1;
+ }
+ else {
+ ystep = -1;
+ }
+
+ for (x = x0; x < (x1 + 1); x++) {
+ if (steep) {
+ displayio_bitmap_write_pixel(destination, y0, x, value);
+ }
+ else {
+ displayio_bitmap_write_pixel(destination, x, y0, value);
+ }
+ err -= dy;
+ if (err < 0) {
+ y0 += ystep;
+ err += dx;
+ }
+ }
+ }
+}
diff --git a/shared-module/board/__init__.c b/shared-module/board/__init__.c
index 2f1c34e56..5d45d58b4 100644
--- a/shared-module/board/__init__.c
+++ b/shared-module/board/__init__.c
@@ -60,7 +60,7 @@ mp_obj_t common_hal_board_create_i2c(void) {
busio_i2c_obj_t *self = &i2c_obj;
self->base.type = &busio_i2c_type;
- common_hal_busio_i2c_construct(self, DEFAULT_I2C_BUS_SCL, DEFAULT_I2C_BUS_SDA, 100000, 0);
+ common_hal_busio_i2c_construct(self, DEFAULT_I2C_BUS_SCL, DEFAULT_I2C_BUS_SDA, 100000, 255);
i2c_singleton = (mp_obj_t)self;
return i2c_singleton;
}
diff --git a/shared-module/displayio/Bitmap.h b/shared-module/displayio/Bitmap.h
index f4bd7ce4d..d6aaaa8ba 100644
--- a/shared-module/displayio/Bitmap.h
+++ b/shared-module/displayio/Bitmap.h
@@ -49,5 +49,7 @@ typedef struct {
void displayio_bitmap_finish_refresh(displayio_bitmap_t *self);
displayio_area_t* displayio_bitmap_get_refresh_areas(displayio_bitmap_t *self, displayio_area_t* tail);
+void displayio_bitmap_set_dirty_area(displayio_bitmap_t *self, int16_t x1, int16_t y1, int16_t x2, int16_t y2);
+void displayio_bitmap_write_pixel(displayio_bitmap_t *self, int16_t x, int16_t y, uint32_t value);
#endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_BITMAP_H