From 47c9fc1f356ccf75850d3b983efe1363b3c8a562 Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Mon, 14 Apr 2025 20:04:58 -0500 Subject: [PATCH 01/29] Always update `echo_buffer_len` during `recalculate_delay`. --- shared-module/audiodelays/Echo.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/shared-module/audiodelays/Echo.c b/shared-module/audiodelays/Echo.c index 968c3bbddb693..2a0eee2ca7b0c 100644 --- a/shared-module/audiodelays/Echo.c +++ b/shared-module/audiodelays/Echo.c @@ -136,16 +136,12 @@ void recalculate_delay(audiodelays_echo_obj_t *self, mp_float_t f_delay_ms) { // Calculate the current echo buffer length in bytes uint32_t new_echo_buffer_len = (uint32_t)(self->base.sample_rate / MICROPY_FLOAT_CONST(1000.0) * f_delay_ms) * (self->base.channel_count * sizeof(uint16_t)); - // Check if our new echo is too long for our maximum buffer + // Limit to valid range if (new_echo_buffer_len > self->max_echo_buffer_len) { - return; - } else if (new_echo_buffer_len < 0.0) { // or too short! - return; - } - - // If the echo buffer is larger then our audio buffer weird things happen - if (new_echo_buffer_len < self->buffer_len) { - return; + new_echo_buffer_len = self->max_echo_buffer_len; + } else if (new_echo_buffer_len < self->buffer_len) { + // If the echo buffer is smaller than our audio buffer, weird things happen + new_echo_buffer_len = self->buffer_len; } self->echo_buffer_len = new_echo_buffer_len; From 57391fa44b4ff2070eabed9245af18393a928611 Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Mon, 14 Apr 2025 20:09:35 -0500 Subject: [PATCH 02/29] Unify `echo_buffer_pos` regardless of `freq_shift`, remove redundant `echo_buffer_write_pos`, and split buffer for stereo output when `freq_shift=True`. --- shared-module/audiodelays/Echo.c | 87 +++++++++++++++----------------- shared-module/audiodelays/Echo.h | 7 +-- 2 files changed, 43 insertions(+), 51 deletions(-) diff --git a/shared-module/audiodelays/Echo.c b/shared-module/audiodelays/Echo.c index 2a0eee2ca7b0c..f69b65316a9cc 100644 --- a/shared-module/audiodelays/Echo.c +++ b/shared-module/audiodelays/Echo.c @@ -98,11 +98,10 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_ // read is where we read previous echo from delay_ms ago to play back now // write is where the store the latest playing sample to echo back later - self->echo_buffer_read_pos = self->buffer_len / sizeof(uint16_t); - self->echo_buffer_write_pos = 0; + self->echo_buffer_pos = 0; - // where we read the previous echo from delay_ms ago to play back now (for freq shift) - self->echo_buffer_left_pos = self->echo_buffer_right_pos = 0; + // use a separate buffer position for the right channel when using freq_shift + self->echo_buffer_right_pos = 0; } void common_hal_audiodelays_echo_deinit(audiodelays_echo_obj_t *self) { @@ -131,7 +130,8 @@ void recalculate_delay(audiodelays_echo_obj_t *self, mp_float_t f_delay_ms) { if (self->freq_shift) { // Calculate the rate of iteration over the echo buffer with 8 sub-bits self->echo_buffer_rate = (uint32_t)MAX(self->max_delay_ms / f_delay_ms * MICROPY_FLOAT_CONST(256.0), MICROPY_FLOAT_CONST(1.0)); - self->echo_buffer_len = self->max_echo_buffer_len; + // Only use half of the buffer per channel if stereo + self->echo_buffer_len = self->max_echo_buffer_len >> (self->base.channel_count - 1); } else { // Calculate the current echo buffer length in bytes uint32_t new_echo_buffer_len = (uint32_t)(self->base.sample_rate / MICROPY_FLOAT_CONST(1000.0) * f_delay_ms) * (self->base.channel_count * sizeof(uint16_t)); @@ -174,6 +174,12 @@ bool common_hal_audiodelays_echo_get_freq_shift(audiodelays_echo_obj_t *self) { } void common_hal_audiodelays_echo_set_freq_shift(audiodelays_echo_obj_t *self, bool freq_shift) { + // Clear the echo buffer and reset buffer position if changing freq_shift modes + if (self->freq_shift != freq_shift) { + memset(self->echo_buffer, 0, self->max_echo_buffer_len); + self->echo_buffer_pos = 0; + self->echo_buffer_right_pos = 0; + } self->freq_shift = freq_shift; uint32_t delay_ms = (uint32_t)synthio_block_slot_get(&self->delay_ms); recalculate_delay(self, delay_ms); @@ -275,12 +281,9 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * uint32_t echo_buf_len = self->echo_buffer_len / sizeof(uint16_t); // Set our echo buffer position accounting for stereo - uint32_t echo_buffer_pos = 0; - if (self->freq_shift) { - echo_buffer_pos = self->echo_buffer_left_pos; - if (channel == 1) { - echo_buffer_pos = self->echo_buffer_right_pos; - } + uint32_t echo_buffer_pos = self->echo_buffer_pos; + if (self->freq_shift && channel == 1) { + echo_buffer_pos = self->echo_buffer_right_pos; } // If we have no sample keep the echo echoing @@ -304,19 +307,20 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * for (uint32_t i = 0; i < length; i++) { int16_t echo, word = 0; uint32_t next_buffer_pos = 0; + uint32_t echo_buffer_offset = echo_buf_len * (self->freq_shift && (channel == 1 || (i % self->base.channel_count) == 1)); if (self->freq_shift) { - echo = echo_buffer[echo_buffer_pos >> 8]; + echo = echo_buffer[(echo_buffer_pos >> 8) + echo_buffer_offset]; next_buffer_pos = echo_buffer_pos + self->echo_buffer_rate; for (uint32_t j = echo_buffer_pos >> 8; j < next_buffer_pos >> 8; j++) { - word = (int16_t)(echo_buffer[j % echo_buf_len] * decay); - echo_buffer[j % echo_buf_len] = word; + word = (int16_t)(echo_buffer[(j % echo_buf_len) + echo_buffer_offset] * decay); + echo_buffer[(j % echo_buf_len) + echo_buffer_offset] = word; } } else { - echo = echo_buffer[self->echo_buffer_read_pos++]; + echo = echo_buffer[echo_buffer_pos]; word = (int16_t)(echo * decay); - echo_buffer[self->echo_buffer_write_pos++] = word; + echo_buffer[echo_buffer_pos++] = word; } word = (int16_t)(echo * mix); @@ -333,15 +337,10 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * } } - if (self->freq_shift) { + if (self->freq_shift && (single_channel_output || echo_buffer_offset)) { echo_buffer_pos = next_buffer_pos % (echo_buf_len << 8); - } else { - if (self->echo_buffer_read_pos >= echo_buf_len) { - self->echo_buffer_read_pos = 0; - } - if (self->echo_buffer_write_pos >= echo_buf_len) { - self->echo_buffer_write_pos = 0; - } + } else if (!self->freq_shift && echo_buffer_pos >= echo_buf_len) { + echo_buffer_pos = 0; } } } @@ -376,37 +375,39 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * int32_t echo, word = 0; uint32_t next_buffer_pos = 0; + uint32_t echo_buffer_offset = echo_buf_len * (self->freq_shift && (channel == 1 || (i % self->base.channel_count) == 1)); + if (self->freq_shift) { - echo = echo_buffer[echo_buffer_pos >> 8]; + echo = echo_buffer[(echo_buffer_pos >> 8) + echo_buffer_offset]; next_buffer_pos = echo_buffer_pos + self->echo_buffer_rate; } else { - echo = echo_buffer[self->echo_buffer_read_pos++]; + echo = echo_buffer[echo_buffer_pos]; word = (int32_t)(echo * decay + sample_word); } if (MP_LIKELY(self->base.bits_per_sample == 16)) { if (self->freq_shift) { for (uint32_t j = echo_buffer_pos >> 8; j < next_buffer_pos >> 8; j++) { - word = (int32_t)(echo_buffer[j % echo_buf_len] * decay + sample_word); + word = (int32_t)(echo_buffer[(j % echo_buf_len) + echo_buffer_offset] * decay + sample_word); word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2)); - echo_buffer[j % echo_buf_len] = (int16_t)word; + echo_buffer[(j % echo_buf_len) + echo_buffer_offset] = (int16_t)word; } } else { word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2)); - echo_buffer[self->echo_buffer_write_pos++] = (int16_t)word; + echo_buffer[echo_buffer_pos++] = (int16_t)word; } } else { if (self->freq_shift) { for (uint32_t j = echo_buffer_pos >> 8; j < next_buffer_pos >> 8; j++) { - word = (int32_t)(echo_buffer[j % echo_buf_len] * decay + sample_word); + word = (int32_t)(echo_buffer[(j % echo_buf_len) + echo_buffer_offset] * decay + sample_word); // Do not have mix_down for 8 bit so just hard cap samples into 1 byte word = MIN(MAX(word, -128), 127); - echo_buffer[j % echo_buf_len] = (int8_t)word; + echo_buffer[(j % echo_buf_len) + echo_buffer_offset] = (int8_t)word; } } else { // Do not have mix_down for 8 bit so just hard cap samples into 1 byte word = MIN(MAX(word, -128), 127); - echo_buffer[self->echo_buffer_write_pos++] = (int8_t)word; + echo_buffer[echo_buffer_pos++] = (int8_t)word; } } @@ -427,15 +428,10 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * } } - if (self->freq_shift) { + if (self->freq_shift && (single_channel_output || echo_buffer_offset)) { echo_buffer_pos = next_buffer_pos % (echo_buf_len << 8); - } else { - if (self->echo_buffer_read_pos >= echo_buf_len) { - self->echo_buffer_read_pos = 0; - } - if (self->echo_buffer_write_pos >= echo_buf_len) { - self->echo_buffer_write_pos = 0; - } + } else if (!self->freq_shift && echo_buffer_pos >= echo_buf_len) { + echo_buffer_pos = 0; } } } @@ -448,12 +444,11 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * self->sample_buffer_length -= n; } - if (self->freq_shift) { - if (channel == 0) { - self->echo_buffer_left_pos = echo_buffer_pos; - } else if (channel == 1) { - self->echo_buffer_right_pos = echo_buffer_pos; - } + // Update buffer position + if (self->freq_shift && channel == 1) { + self->echo_buffer_right_pos = echo_buffer_pos; + } else { + self->echo_buffer_pos = echo_buffer_pos; } } diff --git a/shared-module/audiodelays/Echo.h b/shared-module/audiodelays/Echo.h index 7f5dbb69f090a..247a27ce5f23c 100644 --- a/shared-module/audiodelays/Echo.h +++ b/shared-module/audiodelays/Echo.h @@ -37,12 +37,9 @@ typedef struct { uint32_t echo_buffer_len; // bytes uint32_t max_echo_buffer_len; // bytes - uint32_t echo_buffer_read_pos; // words - uint32_t echo_buffer_write_pos; // words - - uint32_t echo_buffer_rate; // words << 8 - uint32_t echo_buffer_left_pos; // words << 8 + uint32_t echo_buffer_pos; // words (<< 8 when freq_shift=True) uint32_t echo_buffer_right_pos; // words << 8 + uint32_t echo_buffer_rate; // words << 8 mp_obj_t sample; } audiodelays_echo_obj_t; From feee74a5e2279e3cfd6d17bccf89233ebc50c6ad Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Mon, 21 Apr 2025 17:31:58 -0500 Subject: [PATCH 03/29] Improve right channel logic. --- shared-module/audiodelays/Echo.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shared-module/audiodelays/Echo.c b/shared-module/audiodelays/Echo.c index f69b65316a9cc..4acb00cfc3baf 100644 --- a/shared-module/audiodelays/Echo.c +++ b/shared-module/audiodelays/Echo.c @@ -307,7 +307,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * for (uint32_t i = 0; i < length; i++) { int16_t echo, word = 0; uint32_t next_buffer_pos = 0; - uint32_t echo_buffer_offset = echo_buf_len * (self->freq_shift && (channel == 1 || (i % self->base.channel_count) == 1)); + uint32_t echo_buffer_offset = echo_buf_len * (self->freq_shift && ((single_channel_output && channel == 1) || (!single_channel_output && (i % self->base.channel_count) == 1))); if (self->freq_shift) { echo = echo_buffer[(echo_buffer_pos >> 8) + echo_buffer_offset]; @@ -337,7 +337,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * } } - if (self->freq_shift && (single_channel_output || echo_buffer_offset)) { + if (self->freq_shift && (self->base.channel_count == 1 || single_channel_output || (!single_channel_output && (i % self->base.channel_count) == 1))) { echo_buffer_pos = next_buffer_pos % (echo_buf_len << 8); } else if (!self->freq_shift && echo_buffer_pos >= echo_buf_len) { echo_buffer_pos = 0; @@ -375,7 +375,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * int32_t echo, word = 0; uint32_t next_buffer_pos = 0; - uint32_t echo_buffer_offset = echo_buf_len * (self->freq_shift && (channel == 1 || (i % self->base.channel_count) == 1)); + uint32_t echo_buffer_offset = echo_buf_len * (self->freq_shift && ((single_channel_output && channel == 1) || (!single_channel_output && (i % self->base.channel_count) == 1))); if (self->freq_shift) { echo = echo_buffer[(echo_buffer_pos >> 8) + echo_buffer_offset]; @@ -428,7 +428,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * } } - if (self->freq_shift && (single_channel_output || echo_buffer_offset)) { + if (self->freq_shift && (self->base.channel_count == 1 || single_channel_output || (!single_channel_output && (i % self->base.channel_count) == 1))) { echo_buffer_pos = next_buffer_pos % (echo_buf_len << 8); } else if (!self->freq_shift && echo_buffer_pos >= echo_buf_len) { echo_buffer_pos = 0; From 7d0e72e5ca03d64bf648a1b65841727f36e56ece Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Mon, 21 Apr 2025 17:42:39 -0500 Subject: [PATCH 04/29] Unify echo buffer channel splitting. --- shared-module/audiodelays/Echo.c | 73 +++++++++++++++++++------------- shared-module/audiodelays/Echo.h | 4 +- 2 files changed, 45 insertions(+), 32 deletions(-) diff --git a/shared-module/audiodelays/Echo.c b/shared-module/audiodelays/Echo.c index 4acb00cfc3baf..35b3556db35b2 100644 --- a/shared-module/audiodelays/Echo.c +++ b/shared-module/audiodelays/Echo.c @@ -98,9 +98,9 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_ // read is where we read previous echo from delay_ms ago to play back now // write is where the store the latest playing sample to echo back later - self->echo_buffer_pos = 0; + self->echo_buffer_left_pos = 0; - // use a separate buffer position for the right channel when using freq_shift + // use a separate buffer position for the right channel self->echo_buffer_right_pos = 0; } @@ -127,18 +127,21 @@ void recalculate_delay(audiodelays_echo_obj_t *self, mp_float_t f_delay_ms) { // Require that delay is at least 1 sample long f_delay_ms = MAX(f_delay_ms, self->sample_ms); + // Calculate the maximum buffer size per channel in bytes + uint32_t max_echo_buffer_len = self->max_echo_buffer_len >> (self->base.channel_count - 1); + if (self->freq_shift) { // Calculate the rate of iteration over the echo buffer with 8 sub-bits self->echo_buffer_rate = (uint32_t)MAX(self->max_delay_ms / f_delay_ms * MICROPY_FLOAT_CONST(256.0), MICROPY_FLOAT_CONST(1.0)); // Only use half of the buffer per channel if stereo - self->echo_buffer_len = self->max_echo_buffer_len >> (self->base.channel_count - 1); + self->echo_buffer_len = max_echo_buffer_len; } else { // Calculate the current echo buffer length in bytes - uint32_t new_echo_buffer_len = (uint32_t)(self->base.sample_rate / MICROPY_FLOAT_CONST(1000.0) * f_delay_ms) * (self->base.channel_count * sizeof(uint16_t)); + uint32_t new_echo_buffer_len = (uint32_t)(self->base.sample_rate / MICROPY_FLOAT_CONST(1000.0) * f_delay_ms) * sizeof(uint16_t); // Limit to valid range - if (new_echo_buffer_len > self->max_echo_buffer_len) { - new_echo_buffer_len = self->max_echo_buffer_len; + if (new_echo_buffer_len > max_echo_buffer_len) { + new_echo_buffer_len = max_echo_buffer_len; } else if (new_echo_buffer_len < self->buffer_len) { // If the echo buffer is smaller than our audio buffer, weird things happen new_echo_buffer_len = self->buffer_len; @@ -147,7 +150,9 @@ void recalculate_delay(audiodelays_echo_obj_t *self, mp_float_t f_delay_ms) { self->echo_buffer_len = new_echo_buffer_len; // Clear the now unused part of the buffer or some weird artifacts appear - memset(self->echo_buffer + self->echo_buffer_len, 0, self->max_echo_buffer_len - self->echo_buffer_len); + for (uint32_t i = 0; i < self->base.channel_count; i++) { + memset(self->echo_buffer + (i * max_echo_buffer_len) + self->echo_buffer_len, 0, max_echo_buffer_len - self->echo_buffer_len); + } } self->current_delay_ms = f_delay_ms; @@ -177,7 +182,7 @@ void common_hal_audiodelays_echo_set_freq_shift(audiodelays_echo_obj_t *self, bo // Clear the echo buffer and reset buffer position if changing freq_shift modes if (self->freq_shift != freq_shift) { memset(self->echo_buffer, 0, self->max_echo_buffer_len); - self->echo_buffer_pos = 0; + self->echo_buffer_left_pos = 0; self->echo_buffer_right_pos = 0; } self->freq_shift = freq_shift; @@ -279,12 +284,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * } uint32_t echo_buf_len = self->echo_buffer_len / sizeof(uint16_t); - - // Set our echo buffer position accounting for stereo - uint32_t echo_buffer_pos = self->echo_buffer_pos; - if (self->freq_shift && channel == 1) { - echo_buffer_pos = self->echo_buffer_right_pos; - } + uint32_t max_echo_buf_len = (self->max_echo_buffer_len >> (self->base.channel_count - 1)) / sizeof(uint16_t); // If we have no sample keep the echo echoing if (self->sample == NULL) { @@ -307,7 +307,10 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * for (uint32_t i = 0; i < length; i++) { int16_t echo, word = 0; uint32_t next_buffer_pos = 0; - uint32_t echo_buffer_offset = echo_buf_len * (self->freq_shift && ((single_channel_output && channel == 1) || (!single_channel_output && (i % self->base.channel_count) == 1))); + + // Get our echo buffer position and offset depending on current channel + uint32_t echo_buffer_offset = max_echo_buf_len * ((single_channel_output && channel == 1) || (!single_channel_output && (i % self->base.channel_count) == 1)); + uint32_t echo_buffer_pos = echo_buffer_offset ? self->echo_buffer_right_pos : self->echo_buffer_left_pos; if (self->freq_shift) { echo = echo_buffer[(echo_buffer_pos >> 8) + echo_buffer_offset]; @@ -318,9 +321,9 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * echo_buffer[(j % echo_buf_len) + echo_buffer_offset] = word; } } else { - echo = echo_buffer[echo_buffer_pos]; + echo = echo_buffer[echo_buffer_pos + echo_buffer_offset]; word = (int16_t)(echo * decay); - echo_buffer[echo_buffer_pos++] = word; + echo_buffer[echo_buffer_pos++ + echo_buffer_offset] = word; } word = (int16_t)(echo * mix); @@ -337,11 +340,18 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * } } - if (self->freq_shift && (self->base.channel_count == 1 || single_channel_output || (!single_channel_output && (i % self->base.channel_count) == 1))) { + if (self->freq_shift) { echo_buffer_pos = next_buffer_pos % (echo_buf_len << 8); } else if (!self->freq_shift && echo_buffer_pos >= echo_buf_len) { echo_buffer_pos = 0; } + + // Update buffer position + if (echo_buffer_offset) { + self->echo_buffer_right_pos = echo_buffer_pos; + } else { + self->echo_buffer_left_pos = echo_buffer_pos; + } } } @@ -375,13 +385,16 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * int32_t echo, word = 0; uint32_t next_buffer_pos = 0; - uint32_t echo_buffer_offset = echo_buf_len * (self->freq_shift && ((single_channel_output && channel == 1) || (!single_channel_output && (i % self->base.channel_count) == 1))); + + // Get our echo buffer position and offset depending on current channel + uint32_t echo_buffer_offset = max_echo_buf_len * ((single_channel_output && channel == 1) || (!single_channel_output && (i % self->base.channel_count) == 1)); + uint32_t echo_buffer_pos = echo_buffer_offset ? self->echo_buffer_right_pos : self->echo_buffer_left_pos; if (self->freq_shift) { echo = echo_buffer[(echo_buffer_pos >> 8) + echo_buffer_offset]; next_buffer_pos = echo_buffer_pos + self->echo_buffer_rate; } else { - echo = echo_buffer[echo_buffer_pos]; + echo = echo_buffer[echo_buffer_pos + echo_buffer_offset]; word = (int32_t)(echo * decay + sample_word); } @@ -394,7 +407,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * } } else { word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2)); - echo_buffer[echo_buffer_pos++] = (int16_t)word; + echo_buffer[echo_buffer_pos++ + echo_buffer_offset] = (int16_t)word; } } else { if (self->freq_shift) { @@ -407,7 +420,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * } else { // Do not have mix_down for 8 bit so just hard cap samples into 1 byte word = MIN(MAX(word, -128), 127); - echo_buffer[echo_buffer_pos++] = (int8_t)word; + echo_buffer[echo_buffer_pos++ + echo_buffer_offset] = (int8_t)word; } } @@ -428,11 +441,18 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * } } - if (self->freq_shift && (self->base.channel_count == 1 || single_channel_output || (!single_channel_output && (i % self->base.channel_count) == 1))) { + if (self->freq_shift) { echo_buffer_pos = next_buffer_pos % (echo_buf_len << 8); } else if (!self->freq_shift && echo_buffer_pos >= echo_buf_len) { echo_buffer_pos = 0; } + + // Update buffer position + if (echo_buffer_offset) { + self->echo_buffer_right_pos = echo_buffer_pos; + } else { + self->echo_buffer_left_pos = echo_buffer_pos; + } } } @@ -443,13 +463,6 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t * self->sample_remaining_buffer += (n * (self->base.bits_per_sample / 8)); self->sample_buffer_length -= n; } - - // Update buffer position - if (self->freq_shift && channel == 1) { - self->echo_buffer_right_pos = echo_buffer_pos; - } else { - self->echo_buffer_pos = echo_buffer_pos; - } } // Finally pass our buffer and length to the calling audio function diff --git a/shared-module/audiodelays/Echo.h b/shared-module/audiodelays/Echo.h index 247a27ce5f23c..cc37f7030be0e 100644 --- a/shared-module/audiodelays/Echo.h +++ b/shared-module/audiodelays/Echo.h @@ -37,8 +37,8 @@ typedef struct { uint32_t echo_buffer_len; // bytes uint32_t max_echo_buffer_len; // bytes - uint32_t echo_buffer_pos; // words (<< 8 when freq_shift=True) - uint32_t echo_buffer_right_pos; // words << 8 + uint32_t echo_buffer_left_pos; // words (<< 8 when freq_shift=True) + uint32_t echo_buffer_right_pos; // words (<< 8 when freq_shift=True) uint32_t echo_buffer_rate; // words << 8 mp_obj_t sample; From db14b3b7ac34afc9b81bf8141c7ab7138db2d9a6 Mon Sep 17 00:00:00 2001 From: Bernhard Bablok Date: Tue, 22 Apr 2025 18:00:23 +0200 Subject: [PATCH 05/29] fixed I2C pins --- .../boards/pimoroni_inky_frame_5_7/mpconfigboard.h | 4 ++-- .../boards/pimoroni_inky_frame_7_3/mpconfigboard.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/mpconfigboard.h b/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/mpconfigboard.h index d2547cc161568..a8c404c422501 100644 --- a/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/mpconfigboard.h +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/mpconfigboard.h @@ -14,8 +14,8 @@ #define MICROPY_HW_LED_STATUS (&pin_GPIO6) -#define DEFAULT_I2C_BUS_SCL (&pin_GPIO4) -#define DEFAULT_I2C_BUS_SDA (&pin_GPIO5) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO4) +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO5) #define DEFAULT_UART_BUS_TX (&pin_GPIO0) #define DEFAULT_UART_BUS_RX (&pin_GPIO1) diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.h b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.h index 42cb1196a5475..32477b12c299f 100644 --- a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.h +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/mpconfigboard.h @@ -14,8 +14,8 @@ #define MICROPY_HW_LED_STATUS (&pin_GPIO6) -#define DEFAULT_I2C_BUS_SCL (&pin_GPIO4) -#define DEFAULT_I2C_BUS_SDA (&pin_GPIO5) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO4) +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO5) #define DEFAULT_UART_BUS_TX (&pin_GPIO0) #define DEFAULT_UART_BUS_RX (&pin_GPIO1) From 66d0f753b152f4cdc958f529d4c7a6de8b89e572 Mon Sep 17 00:00:00 2001 From: Bernhard Bablok Date: Wed, 23 Apr 2025 08:03:17 +0200 Subject: [PATCH 06/29] fix memory corruption caused by pre-loading --- ports/espressif/common-hal/audiobusio/__init__.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ports/espressif/common-hal/audiobusio/__init__.c b/ports/espressif/common-hal/audiobusio/__init__.c index 226e371c5b0b0..d07a0b521ba9b 100644 --- a/ports/espressif/common-hal/audiobusio/__init__.c +++ b/ports/espressif/common-hal/audiobusio/__init__.c @@ -184,7 +184,7 @@ void port_i2s_play(i2s_t *self, mp_obj_t sample, bool loop) { self->next_buffer_size = sizeof(starting_frame); i2s_fill_buffer(self); i2s_channel_preload_data(self->handle, &starting_frame, sizeof(uint32_t), &bytes_loaded); - preloaded += 1; + preloaded += bytes_loaded; } // enable the channel From 28ee20abcbf0d5b0e8d8b5e202bf592e2fb9f173 Mon Sep 17 00:00:00 2001 From: Bernhard Bablok Date: Tue, 6 May 2025 19:20:16 +0200 Subject: [PATCH 07/29] implement spectra6 support --- ports/atmel-samd/boards/openbook_m4/board.c | 1 + .../adafruit_magtag_2.9_grayscale/board.c | 1 + .../elecrow_crowpanel_4_2_epaper/board.c | 1 + .../boards/heltec_vision_master_e290/board.c | 1 + .../boards/heltec_wireless_paper/board.c | 1 + .../espressif/boards/m5stack_m5paper/board.c | 1 + ports/espressif/boards/sqfmi_watchy/board.c | 1 + .../bradanlanestudio_explorer_rp2040/board.c | 2 + .../boards/pimoroni_badger2040/board.c | 1 + .../boards/pimoroni_badger2040w/board.c | 1 + .../boards/pimoroni_inky_frame_5_7/board.c | 1 + .../boards/pimoroni_inky_frame_7_3/board.c | 1 + shared-bindings/epaperdisplay/EPaperDisplay.c | 7 +++- shared-bindings/epaperdisplay/EPaperDisplay.h | 2 +- shared-module/displayio/ColorConverter.c | 38 ++++++++++++++++++- shared-module/displayio/ColorConverter.h | 1 + shared-module/displayio/Palette.h | 1 + shared-module/epaperdisplay/EPaperDisplay.c | 9 +++-- 18 files changed, 63 insertions(+), 8 deletions(-) diff --git a/ports/atmel-samd/boards/openbook_m4/board.c b/ports/atmel-samd/boards/openbook_m4/board.c index 032ebe9f628a7..3ad2e162ecf3c 100644 --- a/ports/atmel-samd/boards/openbook_m4/board.c +++ b/ports/atmel-samd/boards/openbook_m4/board.c @@ -85,6 +85,7 @@ void board_init(void) { false, // chip_select (don't always toggle chip select) false, // grayscale false, // acep + false, // spectra6 false, // two_byte_sequence_length false); // address_little_endian } diff --git a/ports/espressif/boards/adafruit_magtag_2.9_grayscale/board.c b/ports/espressif/boards/adafruit_magtag_2.9_grayscale/board.c index 321a5a1f2c7a0..430079a94dad2 100644 --- a/ports/espressif/boards/adafruit_magtag_2.9_grayscale/board.c +++ b/ports/espressif/boards/adafruit_magtag_2.9_grayscale/board.c @@ -141,6 +141,7 @@ void board_init(void) { false, // always_toggle_chip_select true, // grayscale false, // acep + false, // spectra6 false, // two_byte_sequence_length false); // address_little_endian } diff --git a/ports/espressif/boards/elecrow_crowpanel_4_2_epaper/board.c b/ports/espressif/boards/elecrow_crowpanel_4_2_epaper/board.c index 4567e2c595627..88150dd401b97 100644 --- a/ports/espressif/boards/elecrow_crowpanel_4_2_epaper/board.c +++ b/ports/espressif/boards/elecrow_crowpanel_4_2_epaper/board.c @@ -96,6 +96,7 @@ void board_init(void) { false, // always_toggle_chip_select false, // grayscale false, // acep + false, // spectra6 false, // two_byte_sequence_length false); // address_little_endian } diff --git a/ports/espressif/boards/heltec_vision_master_e290/board.c b/ports/espressif/boards/heltec_vision_master_e290/board.c index cc8afe226be95..e392f65a76432 100644 --- a/ports/espressif/boards/heltec_vision_master_e290/board.c +++ b/ports/espressif/boards/heltec_vision_master_e290/board.c @@ -94,6 +94,7 @@ void board_init(void) { false, // always_toggle_chip_select false, // grayscale false, // acep + false, // spectra6 false, // two_byte_sequence_length true); // address_little_endian } diff --git a/ports/espressif/boards/heltec_wireless_paper/board.c b/ports/espressif/boards/heltec_wireless_paper/board.c index 2807f2d1a2012..28fb6ae41b9a1 100644 --- a/ports/espressif/boards/heltec_wireless_paper/board.c +++ b/ports/espressif/boards/heltec_wireless_paper/board.c @@ -134,6 +134,7 @@ void board_init(void) { false, // always_toggle_chip_select false, // grayscale false, // acep + false, // spectra6 false, // two_byte_sequence_length false); // address_little_endian } diff --git a/ports/espressif/boards/m5stack_m5paper/board.c b/ports/espressif/boards/m5stack_m5paper/board.c index fbf66fa5ccdf9..db68df79c4291 100644 --- a/ports/espressif/boards/m5stack_m5paper/board.c +++ b/ports/espressif/boards/m5stack_m5paper/board.c @@ -74,6 +74,7 @@ void board_init(void) { // false, // always_toggle_chip_select // false, // grayscale // true, // acep + // false, // spectra6 // false, // two_byte_sequence_length // false // address_little_endian // ); diff --git a/ports/espressif/boards/sqfmi_watchy/board.c b/ports/espressif/boards/sqfmi_watchy/board.c index 25a7be4613c6e..393b8b759028a 100644 --- a/ports/espressif/boards/sqfmi_watchy/board.c +++ b/ports/espressif/boards/sqfmi_watchy/board.c @@ -190,6 +190,7 @@ void board_init(void) { false, // always_toggle_chip_select false, // grayscale false, // acep + false, // spectra6 false, // two_byte_sequence_length true // address_little_endian ); diff --git a/ports/raspberrypi/boards/bradanlanestudio_explorer_rp2040/board.c b/ports/raspberrypi/boards/bradanlanestudio_explorer_rp2040/board.c index a20b16473174c..19e18bd544bee 100644 --- a/ports/raspberrypi/boards/bradanlanestudio_explorer_rp2040/board.c +++ b/ports/raspberrypi/boards/bradanlanestudio_explorer_rp2040/board.c @@ -281,6 +281,7 @@ void board_init(void) { true, // always_toggle_chip_select false, // not grayscale false, // not acep + false, // not spectra6 false, // not two_byte_sequence_length true); // address_little_endian } else if (vid_setting == 2) { // Explorer SSD1608 BW @@ -314,6 +315,7 @@ void board_init(void) { true, // always_toggle_chip_select false, // not grayscale false, // not acep + false, // not spectra6 false, // not two_byte_sequence_length true); // address_little_endian } else { diff --git a/ports/raspberrypi/boards/pimoroni_badger2040/board.c b/ports/raspberrypi/boards/pimoroni_badger2040/board.c index 457bff33b4433..5950d11da8a11 100644 --- a/ports/raspberrypi/boards/pimoroni_badger2040/board.c +++ b/ports/raspberrypi/boards/pimoroni_badger2040/board.c @@ -303,6 +303,7 @@ void board_init(void) { false, // always_toggle_chip_select false, // grayscale false, // acep + false, // spectra6 false, // two_byte_sequence_length false); // address_little_endian } diff --git a/ports/raspberrypi/boards/pimoroni_badger2040w/board.c b/ports/raspberrypi/boards/pimoroni_badger2040w/board.c index 30c05273b9478..7dc11af01eca3 100644 --- a/ports/raspberrypi/boards/pimoroni_badger2040w/board.c +++ b/ports/raspberrypi/boards/pimoroni_badger2040w/board.c @@ -303,6 +303,7 @@ void board_init(void) { false, // always_toggle_chip_select false, // grayscale false, // acep + false, // spectra6 false, // two_byte_sequence_length false); // address_little_endian } diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/board.c b/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/board.c index 650d307711e8e..7969143ec6621 100644 --- a/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/board.c +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_5_7/board.c @@ -97,6 +97,7 @@ void board_init(void) { false, // always_toggle_chip_select false, // grayscale true, // acep + false, // spectra6 false, // two_byte_sequence_length false); // address_little_endian } diff --git a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c index a24c91e546da9..7c71e03b4281d 100644 --- a/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c +++ b/ports/raspberrypi/boards/pimoroni_inky_frame_7_3/board.c @@ -156,6 +156,7 @@ void board_init(void) { false, // always_toggle_chip_select false, // grayscale true, // acep + false, // spectra6 false, // two_byte_sequence_length false); // address_little_endian } diff --git a/shared-bindings/epaperdisplay/EPaperDisplay.c b/shared-bindings/epaperdisplay/EPaperDisplay.c index 0d558a1319616..4b125370219f6 100644 --- a/shared-bindings/epaperdisplay/EPaperDisplay.c +++ b/shared-bindings/epaperdisplay/EPaperDisplay.c @@ -62,6 +62,7 @@ //| always_toggle_chip_select: bool = False, //| grayscale: bool = False, //| advanced_color_epaper: bool = False, +//| spectra6: bool = False, //| two_byte_sequence_length: bool = False, //| start_up_time: float = 0, //| address_little_endian: bool = False, @@ -104,6 +105,7 @@ //| :param bool always_toggle_chip_select: When True, chip select is toggled every byte //| :param bool grayscale: When true, the color ram is the low bit of 2-bit grayscale //| :param bool advanced_color_epaper: When true, the display is a 7-color advanced color epaper (ACeP) +//| :param bool spectra6: When true, the display is a 6-color spectra6 epaper //| :param bool two_byte_sequence_length: When true, use two bytes to define sequence length //| :param float start_up_time: Time to wait after reset before sending commands //| :param bool address_little_endian: Send the least significant byte (not bit) of multi-byte addresses first. Ignored when ram is addressed with one byte @@ -117,7 +119,7 @@ static mp_obj_t epaperdisplay_epaperdisplay_make_new(const mp_obj_type_t *type, ARG_set_current_row_command, ARG_write_black_ram_command, ARG_black_bits_inverted, ARG_write_color_ram_command, ARG_color_bits_inverted, ARG_highlight_color, ARG_refresh_display_command, ARG_refresh_time, ARG_busy_pin, ARG_busy_state, - ARG_seconds_per_frame, ARG_always_toggle_chip_select, ARG_grayscale, ARG_advanced_color_epaper, + ARG_seconds_per_frame, ARG_always_toggle_chip_select, ARG_grayscale, ARG_advanced_color_epaper, ARG_spectra6, ARG_two_byte_sequence_length, ARG_start_up_time, ARG_address_little_endian }; static const mp_arg_t allowed_args[] = { { MP_QSTR_display_bus, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -147,6 +149,7 @@ static mp_obj_t epaperdisplay_epaperdisplay_make_new(const mp_obj_type_t *type, { MP_QSTR_always_toggle_chip_select, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, { MP_QSTR_grayscale, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, { MP_QSTR_advanced_color_epaper, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, + { MP_QSTR_spectra6, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, { MP_QSTR_two_byte_sequence_length, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, { MP_QSTR_start_up_time, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NEW_SMALL_INT(0)} }, { MP_QSTR_address_little_endian, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, @@ -215,7 +218,7 @@ static mp_obj_t epaperdisplay_epaperdisplay_make_new(const mp_obj_type_t *type, args[ARG_write_black_ram_command].u_int, args[ARG_black_bits_inverted].u_bool, write_color_ram_command, args[ARG_color_bits_inverted].u_bool, highlight_color, refresh_buf, refresh_buf_len, refresh_time, busy_pin, args[ARG_busy_state].u_bool, seconds_per_frame, - args[ARG_always_toggle_chip_select].u_bool, args[ARG_grayscale].u_bool, args[ARG_advanced_color_epaper].u_bool, + args[ARG_always_toggle_chip_select].u_bool, args[ARG_grayscale].u_bool, args[ARG_advanced_color_epaper].u_bool,args[ARG_spectra6].u_bool, two_byte_sequence_length, args[ARG_address_little_endian].u_bool ); diff --git a/shared-bindings/epaperdisplay/EPaperDisplay.h b/shared-bindings/epaperdisplay/EPaperDisplay.h index d4475e0a6aa43..016a07f1490c5 100644 --- a/shared-bindings/epaperdisplay/EPaperDisplay.h +++ b/shared-bindings/epaperdisplay/EPaperDisplay.h @@ -26,7 +26,7 @@ void common_hal_epaperdisplay_epaperdisplay_construct(epaperdisplay_epaperdispla uint16_t write_color_ram_command, bool color_bits_inverted, uint32_t highlight_color, const uint8_t *refresh_sequence, uint16_t refresh_sequence_len, mp_float_t refresh_time, const mcu_pin_obj_t *busy_pin, bool busy_state, mp_float_t seconds_per_frame, - bool always_toggle_chip_select, bool grayscale, bool acep, bool two_byte_sequence_length, + bool always_toggle_chip_select, bool grayscale, bool acep, bool spectra6, bool two_byte_sequence_length, bool address_little_endian); bool common_hal_epaperdisplay_epaperdisplay_refresh(epaperdisplay_epaperdisplay_obj_t *self); diff --git a/shared-module/displayio/ColorConverter.c b/shared-module/displayio/ColorConverter.c index cf5136f4e6bb6..ae7d3f02d5127 100644 --- a/shared-module/displayio/ColorConverter.c +++ b/shared-module/displayio/ColorConverter.c @@ -91,6 +91,40 @@ uint8_t displayio_colorconverter_compute_hue(uint32_t color_rgb888) { return hue; } +uint8_t displayio_colorconverter_compute_sixcolor(uint32_t color_rgb888) { + // This is DDX=1, the default for the displays. + uint8_t chroma = displayio_colorconverter_compute_chroma(color_rgb888); + if (chroma >= 64) { + uint8_t hue = displayio_colorconverter_compute_hue(color_rgb888); + // Red 0 + if (hue < 10) { + return 0x3; + } + // Yellow 42 + if (hue < 42 + 21) { + return 0x2; + } + // Green 85 + if (hue < 85 + 42) { + return 0x6; + } + // Blue 170 + if (hue < 170 + 42) { + return 0x5; + } + + // The rest is red to 255 + return 0x3; + } else { + uint8_t luma = displayio_colorconverter_compute_luma(color_rgb888); + if (luma >= 128) { + return 0x1; // White + } else { + return 0x0; // Black + } + } +} + uint8_t displayio_colorconverter_compute_sevencolor(uint32_t color_rgb888) { // This is DDX=1, the default for the displays. uint8_t chroma = displayio_colorconverter_compute_chroma(color_rgb888); @@ -309,7 +343,9 @@ void displayio_convert_color(const _displayio_colorspace_t *colorspace, bool dit return; } else if (colorspace->depth == 4) { uint8_t packed; - if (colorspace->sevencolor) { + if (colorspace->sixcolor) { + packed = displayio_colorconverter_compute_sixcolor(pixel); + } else if (colorspace->sevencolor) { packed = displayio_colorconverter_compute_sevencolor(pixel); } else { packed = displayio_colorconverter_compute_rgbd(pixel); diff --git a/shared-module/displayio/ColorConverter.h b/shared-module/displayio/ColorConverter.h index 60efc132f9ae5..d3dbedfe160ab 100644 --- a/shared-module/displayio/ColorConverter.h +++ b/shared-module/displayio/ColorConverter.h @@ -41,5 +41,6 @@ uint8_t displayio_colorconverter_compute_rgbd(uint32_t color_rgb888); uint8_t displayio_colorconverter_compute_luma(uint32_t color_rgb888); uint8_t displayio_colorconverter_compute_chroma(uint32_t color_rgb888); uint8_t displayio_colorconverter_compute_hue(uint32_t color_rgb888); +uint8_t displayio_colorconverter_compute_sixcolor(uint32_t color_rgb888); uint8_t displayio_colorconverter_compute_sevencolor(uint32_t color_rgb888); void displayio_colorconverter_compute_tricolor(const _displayio_colorspace_t *colorspace, uint8_t pixel_hue, uint32_t *color); diff --git a/shared-module/displayio/Palette.h b/shared-module/displayio/Palette.h index 092b934b66a24..bb87a93d98133 100644 --- a/shared-module/displayio/Palette.h +++ b/shared-module/displayio/Palette.h @@ -19,6 +19,7 @@ typedef struct { uint8_t grayscale_bit; // The lowest grayscale bit. Normally 8 - depth. bool grayscale; bool tricolor; + bool sixcolor; // Spectra6 e-ink screens. bool sevencolor; // Acep e-ink screens. bool pixels_in_byte_share_row; bool reverse_pixels_in_byte; diff --git a/shared-module/epaperdisplay/EPaperDisplay.c b/shared-module/epaperdisplay/EPaperDisplay.c index 14fbc3341b5ff..748297cc638de 100644 --- a/shared-module/epaperdisplay/EPaperDisplay.c +++ b/shared-module/epaperdisplay/EPaperDisplay.c @@ -36,7 +36,7 @@ void common_hal_epaperdisplay_epaperdisplay_construct(epaperdisplay_epaperdispla uint16_t write_color_ram_command, bool color_bits_inverted, uint32_t highlight_color, const uint8_t *refresh_sequence, uint16_t refresh_sequence_len, mp_float_t refresh_time, const mcu_pin_obj_t *busy_pin, bool busy_state, mp_float_t seconds_per_frame, - bool chip_select, bool grayscale, bool acep, bool two_byte_sequence_length, bool address_little_endian) { + bool chip_select, bool grayscale, bool acep, bool spectra6, bool two_byte_sequence_length, bool address_little_endian) { uint16_t color_depth = 1; bool core_grayscale = true; if (highlight_color != 0x000000) { @@ -46,9 +46,10 @@ void common_hal_epaperdisplay_epaperdisplay_construct(epaperdisplay_epaperdispla } else { self->core.colorspace.tricolor = false; } - self->acep = acep; + self->acep = acep || spectra6; + self->core.colorspace.sixcolor = spectra6; self->core.colorspace.sevencolor = acep; - if (acep) { + if (self->acep) { color_depth = 4; // bits. 7 colors + clean grayscale = false; core_grayscale = false; @@ -338,7 +339,7 @@ static bool epaperdisplay_epaperdisplay_refresh_area(epaperdisplay_epaperdisplay } else if (self->core.colorspace.tricolor) { self->core.colorspace.grayscale = false; displayio_display_core_fill_area(&self->core, &subrectangle, mask, buffer); - } else if (self->core.colorspace.sevencolor) { + } else if (self->core.colorspace.sixcolor || self->core.colorspace.sevencolor) { displayio_display_core_fill_area(&self->core, &subrectangle, mask, buffer); } } else { From f54b0d738445457e84e2ca272bacd7e34d6ba875 Mon Sep 17 00:00:00 2001 From: Bernhard Bablok Date: Wed, 7 May 2025 08:31:58 +0200 Subject: [PATCH 08/29] added whitespace --- shared-bindings/epaperdisplay/EPaperDisplay.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/epaperdisplay/EPaperDisplay.c b/shared-bindings/epaperdisplay/EPaperDisplay.c index 4b125370219f6..40a217a65bd1c 100644 --- a/shared-bindings/epaperdisplay/EPaperDisplay.c +++ b/shared-bindings/epaperdisplay/EPaperDisplay.c @@ -218,7 +218,7 @@ static mp_obj_t epaperdisplay_epaperdisplay_make_new(const mp_obj_type_t *type, args[ARG_write_black_ram_command].u_int, args[ARG_black_bits_inverted].u_bool, write_color_ram_command, args[ARG_color_bits_inverted].u_bool, highlight_color, refresh_buf, refresh_buf_len, refresh_time, busy_pin, args[ARG_busy_state].u_bool, seconds_per_frame, - args[ARG_always_toggle_chip_select].u_bool, args[ARG_grayscale].u_bool, args[ARG_advanced_color_epaper].u_bool,args[ARG_spectra6].u_bool, + args[ARG_always_toggle_chip_select].u_bool, args[ARG_grayscale].u_bool, args[ARG_advanced_color_epaper].u_bool, args[ARG_spectra6].u_bool, two_byte_sequence_length, args[ARG_address_little_endian].u_bool ); From 0726b1e4730bfe1cef1fd57c3cab578a30f41346 Mon Sep 17 00:00:00 2001 From: Petr Sedlacek Date: Fri, 9 May 2025 16:00:36 +0200 Subject: [PATCH 09/29] Update 42. Keebs Frood to version 9 --- ports/raspberrypi/boards/42keebs_frood/pins.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ports/raspberrypi/boards/42keebs_frood/pins.c b/ports/raspberrypi/boards/42keebs_frood/pins.c index 4543625051869..2e7ac22475b22 100644 --- a/ports/raspberrypi/boards/42keebs_frood/pins.c +++ b/ports/raspberrypi/boards/42keebs_frood/pins.c @@ -49,6 +49,9 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO15) }, { MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO17) }, { MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_GPIO17) }, { MP_ROM_QSTR(MP_QSTR_VBUS_SENSE), MP_ROM_PTR(&pin_GPIO19) }, From 0b7ab1ef8568804aa0cfb6700e1597c3292ade5f Mon Sep 17 00:00:00 2001 From: Neradoc Date: Tue, 20 May 2025 14:59:29 +0200 Subject: [PATCH 10/29] enable USB host on teensy 4.0 (bottom pads) --- ports/mimxrt10xx/boards/teensy40/mpconfigboard.h | 3 +++ ports/mimxrt10xx/boards/teensy40/mpconfigboard.mk | 1 + ports/mimxrt10xx/boards/teensy40/pins.c | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/ports/mimxrt10xx/boards/teensy40/mpconfigboard.h b/ports/mimxrt10xx/boards/teensy40/mpconfigboard.h index e7565d64438f6..e6931752e3e58 100644 --- a/ports/mimxrt10xx/boards/teensy40/mpconfigboard.h +++ b/ports/mimxrt10xx/boards/teensy40/mpconfigboard.h @@ -25,3 +25,6 @@ #define DEFAULT_UART_BUS_RX (&pin_GPIO_AD_B0_03) #define DEFAULT_UART_BUS_TX (&pin_GPIO_AD_B0_02) + +#define CIRCUITPY_USB_DEVICE_INSTANCE 0 +#define CIRCUITPY_USB_HOST_INSTANCE 1 diff --git a/ports/mimxrt10xx/boards/teensy40/mpconfigboard.mk b/ports/mimxrt10xx/boards/teensy40/mpconfigboard.mk index 9cb1e636b6f33..f26f8dbd72b79 100644 --- a/ports/mimxrt10xx/boards/teensy40/mpconfigboard.mk +++ b/ports/mimxrt10xx/boards/teensy40/mpconfigboard.mk @@ -7,4 +7,5 @@ CHIP_VARIANT = MIMXRT1062DVJ6A CHIP_FAMILY = MIMXRT1062 FLASH = W25Q16JV CIRCUITPY__EVE = 1 +CIRCUITPY_USB_HOST = 1 CIRCUITPY_SETTABLE_PROCESSOR_FREQUENCY = 1 diff --git a/ports/mimxrt10xx/boards/teensy40/pins.c b/ports/mimxrt10xx/boards/teensy40/pins.c index 7aacdf95e15ff..dc8b07605b256 100644 --- a/ports/mimxrt10xx/boards/teensy40/pins.c +++ b/ports/mimxrt10xx/boards/teensy40/pins.c @@ -120,6 +120,10 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { {MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj)}, {MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj)}, + // USB Host (pads) + {MP_ROM_QSTR(MP_QSTR_USB_HOST_DP), MP_ROM_PTR(&pin_USB_OTG2_DP)}, + {MP_ROM_QSTR(MP_QSTR_USB_HOST_DM), MP_ROM_PTR(&pin_USB_OTG2_DN)}, + // other i2c ports defined {MP_OBJ_NEW_QSTR(MP_QSTR_SDA1), MP_ROM_PTR(&pin_GPIO_AD_B1_06)}, {MP_OBJ_NEW_QSTR(MP_QSTR_SCL1), MP_ROM_PTR(&pin_GPIO_AD_B1_07)}, From eb3698e3a5ce8188ef3bf689e1beb428632da135 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Tue, 20 May 2025 11:19:06 -0500 Subject: [PATCH 11/29] change pin to IR on sparkle motion stick --- ports/espressif/boards/adafruit_sparkle_motion_stick/pins.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ports/espressif/boards/adafruit_sparkle_motion_stick/pins.c b/ports/espressif/boards/adafruit_sparkle_motion_stick/pins.c index a73c0e63f2ef6..a5fdadac1e0f7 100644 --- a/ports/espressif/boards/adafruit_sparkle_motion_stick/pins.c +++ b/ports/espressif/boards/adafruit_sparkle_motion_stick/pins.c @@ -13,7 +13,7 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO0) }, { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO0) }, - { MP_ROM_QSTR(MP_QSTR_IR_RX), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_IR), MP_ROM_PTR(&pin_GPIO10) }, { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) }, { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO12) }, { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO13) }, From 7d3dd30a6bf05220c154c3c691eee4df94c8fea3 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Tue, 20 May 2025 18:18:59 -0400 Subject: [PATCH 12/29] i2ctarget: Add deinit() to I2CTargetRequest; remove close() --- shared-bindings/i2ctarget/I2CTarget.c | 69 ++++++++++++++++++--------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/shared-bindings/i2ctarget/I2CTarget.c b/shared-bindings/i2ctarget/I2CTarget.c index 728d9f60e2712..7c477cd5afe1d 100644 --- a/shared-bindings/i2ctarget/I2CTarget.c +++ b/shared-bindings/i2ctarget/I2CTarget.c @@ -21,7 +21,7 @@ static mp_obj_t mp_obj_new_i2ctarget_i2c_target_request(i2ctarget_i2c_target_obj_t *target, uint8_t address, bool is_read, bool is_restart) { i2ctarget_i2c_target_request_obj_t *self = - mp_obj_malloc(i2ctarget_i2c_target_request_obj_t, &i2ctarget_i2c_target_request_type); + mp_obj_malloc_with_finaliser(i2ctarget_i2c_target_request_obj_t, &i2ctarget_i2c_target_request_type); self->target = target; self->address = address; self->is_read = is_read; @@ -200,7 +200,7 @@ static MP_DEFINE_CONST_DICT(i2ctarget_i2c_target_locals_dict, i2ctarget_i2c_targ MP_DEFINE_CONST_OBJ_TYPE( i2ctarget_i2c_target_type, MP_QSTR_I2CTarget, - MP_TYPE_FLAG_NONE, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, make_new, i2ctarget_i2c_target_make_new, locals_dict, &i2ctarget_i2c_target_locals_dict ); @@ -222,23 +222,31 @@ static mp_obj_t i2ctarget_i2c_target_request_make_new(const mp_obj_type_t *type, return mp_obj_new_i2ctarget_i2c_target_request(args[0], mp_obj_get_int(args[1]), mp_obj_is_true(args[2]), mp_obj_is_true(args[3])); } -//| def __enter__(self) -> I2CTargetRequest: -//| """No-op used in Context Managers.""" +//| def deinit(self) -> None: +//| """Disconnects from parent `I2CTarget`. +//| Called by `__exit__()` to indicate the `I2CTargetRequest` is no longer useful.""" //| ... //| -// Provided by context manager helper. +static mp_obj_t i2ctarget_i2c_target_request_deinit(mp_obj_t self_in) { + i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); + self->target = NULL; -//| def __exit__(self) -> None: -//| """Close the request.""" -//| ... -//| -// Provided by context manager helper. + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(i2ctarget_i2c_target_request_deinit_obj, i2ctarget_i2c_target_request_deinit); + +static void target_request_check_for_deinit(i2ctarget_i2c_target_request_obj_t *self) { + if (self->target == NULL) { + raise_deinited_error(); + } + check_for_deinit(self->target); +} //| address: int //| """The I2C address of the request.""" static mp_obj_t i2ctarget_i2c_target_request_get_address(mp_obj_t self_in) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); - check_for_deinit(self->target); + target_request_check_for_deinit(self); return mp_obj_new_int(self->address); } @@ -248,7 +256,7 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_address_obj, i2ctarget_i2c //| """The I2C main controller is reading from this target.""" static mp_obj_t i2ctarget_i2c_target_request_get_is_read(mp_obj_t self_in) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); - check_for_deinit(self->target); + target_request_check_for_deinit(self); return mp_obj_new_bool(self->is_read); } @@ -259,7 +267,7 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_is_read_obj, i2ctarget_i2c //| static mp_obj_t i2ctarget_i2c_target_request_get_is_restart(mp_obj_t self_in) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); - check_for_deinit(self->target); + target_request_check_for_deinit(self); return mp_obj_new_bool(self->is_restart); } @@ -276,7 +284,7 @@ MP_DEFINE_CONST_PROP_GET(i2ctarget_i2c_target_request_is_restart_obj, i2ctarget_ //| static mp_obj_t i2ctarget_i2c_target_request_read(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); - check_for_deinit(self->target); + target_request_check_for_deinit(self); enum { ARG_n, ARG_ack }; static const mp_arg_t allowed_args[] = { @@ -335,7 +343,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(i2ctarget_i2c_target_request_read_obj, 1, i2ctarget_i //| static mp_obj_t i2ctarget_i2c_target_request_write(mp_obj_t self_in, mp_obj_t buf_in) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); - check_for_deinit(self->target); + target_request_check_for_deinit(self); if (!self->is_read) { mp_raise_OSError(MP_EACCES); @@ -370,7 +378,7 @@ static MP_DEFINE_CONST_FUN_OBJ_2(i2ctarget_i2c_target_request_write_obj, i2ctarg //| static mp_obj_t i2ctarget_i2c_target_request_ack(uint n_args, const mp_obj_t *args) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(args[0]); - check_for_deinit(self->target); + target_request_check_for_deinit(self); bool ack = (n_args == 1) ? true : mp_obj_is_true(args[1]); @@ -383,25 +391,40 @@ static mp_obj_t i2ctarget_i2c_target_request_ack(uint n_args, const mp_obj_t *ar } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(i2ctarget_i2c_target_request_ack_obj, 1, 2, i2ctarget_i2c_target_request_ack); -static mp_obj_t i2ctarget_i2c_target_request_close(mp_obj_t self_in) { - i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); - check_for_deinit(self->target); +//| def __enter__(self) -> I2CTargetRequest: +//| """No-op used in Context Managers.""" +//| ... +//| +// Provided by context manager helper. - common_hal_i2ctarget_i2c_target_close(self->target); +//| def __exit__(self) -> None: +//| """Close and deinit the request.""" +//| ... +//| +static mp_obj_t i2ctarget_i2c_target_request__exit__(size_t n_args, const mp_obj_t *args) { + i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(args[0]); + target_request_check_for_deinit(self); + + i2ctarget_i2c_target_obj_t *target = self->target; + // Deinit target request first in case _close() fails. + i2ctarget_i2c_target_request_deinit(args[0]); + + common_hal_i2ctarget_i2c_target_close(target); return mp_const_none; } -static MP_DEFINE_CONST_FUN_OBJ_1(i2ctarget_i2c_target_request_close_obj, i2ctarget_i2c_target_request_close); +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(i2ctarget_i2c_target_request___exit___obj, 4, 4, i2ctarget_i2c_target_request__exit__); static const mp_rom_map_elem_t i2ctarget_i2c_target_request_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, - { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&default___exit___obj) }, + { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&i2ctarget_i2c_target_request___exit___obj) }, + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&i2ctarget_i2c_target_request_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR__del__), MP_ROM_PTR(&i2ctarget_i2c_target_request_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&i2ctarget_i2c_target_request_address_obj) }, { MP_ROM_QSTR(MP_QSTR_is_read), MP_ROM_PTR(&i2ctarget_i2c_target_request_is_read_obj) }, { MP_ROM_QSTR(MP_QSTR_is_restart), MP_ROM_PTR(&i2ctarget_i2c_target_request_is_restart_obj) }, { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&i2ctarget_i2c_target_request_read_obj) }, { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&i2ctarget_i2c_target_request_write_obj) }, { MP_ROM_QSTR(MP_QSTR_ack), MP_ROM_PTR(&i2ctarget_i2c_target_request_ack_obj) }, - { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&i2ctarget_i2c_target_request_close_obj) }, }; static MP_DEFINE_CONST_DICT(i2ctarget_i2c_target_request_locals_dict, i2ctarget_i2c_target_request_locals_dict_table); From 8da8e3115eb011c6831ccb8356c482b6d94e1337 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Wed, 21 May 2025 16:44:31 -0400 Subject: [PATCH 13/29] I2CTargetRequest: do close in deinit --- shared-bindings/i2ctarget/I2CTarget.c | 36 ++++++++++++--------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/shared-bindings/i2ctarget/I2CTarget.c b/shared-bindings/i2ctarget/I2CTarget.c index 7c477cd5afe1d..8586d1843cc77 100644 --- a/shared-bindings/i2ctarget/I2CTarget.c +++ b/shared-bindings/i2ctarget/I2CTarget.c @@ -222,6 +222,13 @@ static mp_obj_t i2ctarget_i2c_target_request_make_new(const mp_obj_type_t *type, return mp_obj_new_i2ctarget_i2c_target_request(args[0], mp_obj_get_int(args[1]), mp_obj_is_true(args[2]), mp_obj_is_true(args[3])); } +static void target_request_check_for_deinit(i2ctarget_i2c_target_request_obj_t *self) { + if (self->target == NULL) { + raise_deinited_error(); + } + check_for_deinit(self->target); +} + //| def deinit(self) -> None: //| """Disconnects from parent `I2CTarget`. //| Called by `__exit__()` to indicate the `I2CTargetRequest` is no longer useful.""" @@ -229,19 +236,19 @@ static mp_obj_t i2ctarget_i2c_target_request_make_new(const mp_obj_type_t *type, //| static mp_obj_t i2ctarget_i2c_target_request_deinit(mp_obj_t self_in) { i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(self_in); + target_request_check_for_deinit(self); + + i2ctarget_i2c_target_obj_t *target = self->target; + + // Deinit I2CTargetRequest first in case _close() fails. self->target = NULL; + common_hal_i2ctarget_i2c_target_close(target); + return mp_const_none; } MP_DEFINE_CONST_FUN_OBJ_1(i2ctarget_i2c_target_request_deinit_obj, i2ctarget_i2c_target_request_deinit); -static void target_request_check_for_deinit(i2ctarget_i2c_target_request_obj_t *self) { - if (self->target == NULL) { - raise_deinited_error(); - } - check_for_deinit(self->target); -} - //| address: int //| """The I2C address of the request.""" static mp_obj_t i2ctarget_i2c_target_request_get_address(mp_obj_t self_in) { @@ -401,22 +408,11 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(i2ctarget_i2c_target_request_ack_obj, 1, 2, //| """Close and deinit the request.""" //| ... //| -static mp_obj_t i2ctarget_i2c_target_request__exit__(size_t n_args, const mp_obj_t *args) { - i2ctarget_i2c_target_request_obj_t *self = MP_OBJ_TO_PTR(args[0]); - target_request_check_for_deinit(self); - - i2ctarget_i2c_target_obj_t *target = self->target; - // Deinit target request first in case _close() fails. - i2ctarget_i2c_target_request_deinit(args[0]); - - common_hal_i2ctarget_i2c_target_close(target); - return mp_const_none; -} -static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(i2ctarget_i2c_target_request___exit___obj, 4, 4, i2ctarget_i2c_target_request__exit__); +// Provided by context manager helper. static const mp_rom_map_elem_t i2ctarget_i2c_target_request_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, - { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&i2ctarget_i2c_target_request___exit___obj) }, + { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&default___exit___obj) }, { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&i2ctarget_i2c_target_request_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR__del__), MP_ROM_PTR(&i2ctarget_i2c_target_request_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&i2ctarget_i2c_target_request_address_obj) }, From f219aada1f8b1ec74d2dc95ca8cece234d4a90f9 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Fri, 23 May 2025 10:26:21 -0400 Subject: [PATCH 14/29] shrink some builds --- .../boards/adafruit_magtag_2.9_grayscale/mpconfigboard.mk | 1 + ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk | 1 + .../espressif/boards/makergo_esp32c3_supermini/mpconfigboard.mk | 2 ++ 3 files changed, 4 insertions(+) diff --git a/ports/espressif/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.mk b/ports/espressif/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.mk index 01b9ec73e9c34..5ab8c995e331c 100644 --- a/ports/espressif/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.mk @@ -10,6 +10,7 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_ESPCAMERA = 0 +CIRCUITPY_PARALLELDISPLAYBUS = 0 # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_ConnectionManager diff --git a/ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk b/ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk index 1f47795002df9..076c3184e93f2 100644 --- a/ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk @@ -16,3 +16,4 @@ CIRCUITPY_CODEOP = 0 # Not enough pins. CIRCUITPY_PARALLELDISPLAYBUS = 0 +CIRCUITPY_RGBMATRIX = 0 diff --git a/ports/espressif/boards/makergo_esp32c3_supermini/mpconfigboard.mk b/ports/espressif/boards/makergo_esp32c3_supermini/mpconfigboard.mk index 37c27203af31c..69576369d5faf 100644 --- a/ports/espressif/boards/makergo_esp32c3_supermini/mpconfigboard.mk +++ b/ports/espressif/boards/makergo_esp32c3_supermini/mpconfigboard.mk @@ -7,6 +7,8 @@ CIRCUITPY_ESP_FLASH_MODE=dio CIRCUITPY_ESP_FLASH_FREQ=80m CIRCUITPY_ESP_FLASH_SIZE=4MB +CIRCUITPY_CODEOP = 0 + CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 From 953694d56c93d8129d4992cb70740a8fab0e25ab Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Sat, 24 May 2025 20:00:00 +0200 Subject: [PATCH 15/29] Fix -Wold-style-definion errors in the raspberrypi port This mostly means changing `void foo()` to `void foo(void)` at the function definition site. This was previously only an error if the declaration site didn't have `(void)`, but the unix coverage build enables the more strict warning and there's little difficulty in resolving these diagnostics. .. other ports can be done too, if desired. --- devices/ble_hci/common-hal/_bleio/__init__.c | 4 ++-- main.c | 2 +- ports/raspberrypi/Makefile | 7 +++++-- ports/raspberrypi/bindings/cyw43/__init__.c | 4 ++-- ports/raspberrypi/common-hal/alarm/pin/PinAlarm.c | 2 +- ports/raspberrypi/supervisor/port.c | 2 +- shared-module/touchio/TouchIn.c | 2 +- supervisor/shared/background_callback.c | 8 ++++---- supervisor/shared/reload.c | 12 ++++++------ supervisor/shared/status_leds.c | 4 ++-- supervisor/shared/tick.c | 4 ++-- 11 files changed, 27 insertions(+), 24 deletions(-) diff --git a/devices/ble_hci/common-hal/_bleio/__init__.c b/devices/ble_hci/common-hal/_bleio/__init__.c index 9663e70699807..6376f6f10c8c9 100644 --- a/devices/ble_hci/common-hal/_bleio/__init__.c +++ b/devices/ble_hci/common-hal/_bleio/__init__.c @@ -40,13 +40,13 @@ bool vm_used_ble; void common_hal_bleio_init(void) { } -void bleio_user_reset() { +void bleio_user_reset(void) { // HCI doesn't support the BLE workflow so just do a full reset. bleio_reset(); } // Turn off BLE on a reset or reload. -void bleio_reset() { +void bleio_reset(void) { // Create a UUID object for all CCCD's. cccd_uuid.base.type = &bleio_uuid_type; common_hal_bleio_uuid_construct(&cccd_uuid, BLE_UUID_CCCD, NULL); diff --git a/main.c b/main.c index 45b7af2725435..7250ba5f31cdf 100644 --- a/main.c +++ b/main.c @@ -1180,7 +1180,7 @@ void gc_collect(void) { } // Ports may provide an implementation of this function if it is needed -MP_WEAK void port_gc_collect() { +MP_WEAK void port_gc_collect(void) { } size_t gc_get_max_new_split(void) { diff --git a/ports/raspberrypi/Makefile b/ports/raspberrypi/Makefile index 582c04282734c..6565af79bf3e1 100644 --- a/ports/raspberrypi/Makefile +++ b/ports/raspberrypi/Makefile @@ -223,7 +223,7 @@ endif DISABLE_WARNINGS = -Wno-cast-align -CFLAGS += $(INC) -Wtype-limits -Wall -Werror -std=gnu11 -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) $(DISABLE_WARNINGS) -Werror=missing-prototypes +CFLAGS += $(INC) -Wtype-limits -Wall -Werror -std=gnu11 -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) $(DISABLE_WARNINGS) -Werror=missing-prototypes -Wold-style-definition PICO_LDFLAGS = --specs=nosys.specs --specs=nano.specs @@ -562,12 +562,15 @@ SRC_C += \ common-hal/picodvi/Framebuffer_$(CHIP_VARIANT).c \ ifeq ($(CHIP_VARIANT),RP2040) -SRC_C += \ +SRC_PICODVI := \ lib/PicoDVI/software/libdvi/dvi.c \ lib/PicoDVI/software/libdvi/dvi_serialiser.c \ lib/PicoDVI/software/libdvi/dvi_timing.c \ lib/PicoDVI/software/libdvi/tmds_encode.c \ +SRC_C += $(SRC_PICODVI) +$(patsubst %.c,$(BUILD)/%.o,$(SRC_PICODVI))): CFLAGS += -Wno-old-style-definition + endif endif diff --git a/ports/raspberrypi/bindings/cyw43/__init__.c b/ports/raspberrypi/bindings/cyw43/__init__.c index a699a5e91ebba..93755d6ce1e04 100644 --- a/ports/raspberrypi/bindings/cyw43/__init__.c +++ b/ports/raspberrypi/bindings/cyw43/__init__.c @@ -43,7 +43,7 @@ MP_DEFINE_CONST_OBJ_TYPE( print, shared_bindings_microcontroller_pin_print ); -uint32_t cyw43_get_power_management_value() { +uint32_t cyw43_get_power_management_value(void) { return power_management_value; } @@ -103,7 +103,7 @@ static MP_DEFINE_CONST_FUN_OBJ_1(cyw43_set_power_management_obj, cyw43_set_power //| """Retrieve the power management register""" //| //| -static mp_obj_t cyw43_get_power_management() { +static mp_obj_t cyw43_get_power_management(void) { return mp_obj_new_int(power_management_value); } static MP_DEFINE_CONST_FUN_OBJ_0(cyw43_get_power_management_obj, cyw43_get_power_management); diff --git a/ports/raspberrypi/common-hal/alarm/pin/PinAlarm.c b/ports/raspberrypi/common-hal/alarm/pin/PinAlarm.c index ecebb072775ed..350306390eefb 100644 --- a/ports/raspberrypi/common-hal/alarm/pin/PinAlarm.c +++ b/ports/raspberrypi/common-hal/alarm/pin/PinAlarm.c @@ -39,7 +39,7 @@ static void gpio_callback(uint gpio, uint32_t events) { } } -void alarm_pin_pinalarm_entering_deep_sleep() { +void alarm_pin_pinalarm_entering_deep_sleep(void) { _not_yet_deep_sleeping = false; } diff --git a/ports/raspberrypi/supervisor/port.c b/ports/raspberrypi/supervisor/port.c index f5bc67332af4b..4be42380491cb 100644 --- a/ports/raspberrypi/supervisor/port.c +++ b/ports/raspberrypi/supervisor/port.c @@ -584,7 +584,7 @@ __attribute__((used)) void __not_in_flash_func(isr_hardfault)(void) { } } -void port_yield() { +void port_yield(void) { #if CIRCUITPY_CYW43 cyw43_arch_poll(); #endif diff --git a/shared-module/touchio/TouchIn.c b/shared-module/touchio/TouchIn.c index b81b52b44415f..268055d14bf53 100644 --- a/shared-module/touchio/TouchIn.c +++ b/shared-module/touchio/TouchIn.c @@ -86,7 +86,7 @@ void common_hal_touchio_touchin_deinit(touchio_touchin_obj_t *self) { self->digitalinout = MP_OBJ_NULL; } -void touchin_reset() { +void touchin_reset(void) { } bool common_hal_touchio_touchin_get_value(touchio_touchin_obj_t *self) { diff --git a/supervisor/shared/background_callback.c b/supervisor/shared/background_callback.c index 309210b7a12ae..ffeb78bbb8371 100644 --- a/supervisor/shared/background_callback.c +++ b/supervisor/shared/background_callback.c @@ -58,7 +58,7 @@ inline bool background_callback_pending(void) { static int background_prevention_count; -void PLACE_IN_ITCM(background_callback_run_all)() { +void PLACE_IN_ITCM(background_callback_run_all)(void) { port_background_task(); if (!background_callback_pending()) { return; @@ -89,13 +89,13 @@ void PLACE_IN_ITCM(background_callback_run_all)() { CALLBACK_CRITICAL_END; } -void background_callback_prevent() { +void background_callback_prevent(void) { CALLBACK_CRITICAL_BEGIN; ++background_prevention_count; CALLBACK_CRITICAL_END; } -void background_callback_allow() { +void background_callback_allow(void) { CALLBACK_CRITICAL_BEGIN; --background_prevention_count; CALLBACK_CRITICAL_END; @@ -103,7 +103,7 @@ void background_callback_allow() { // Filter out queued callbacks if they are allocated on the heap. -void background_callback_reset() { +void background_callback_reset(void) { background_callback_t *new_head = NULL; background_callback_t **previous_next = &new_head; background_callback_t *new_tail = NULL; diff --git a/supervisor/shared/reload.c b/supervisor/shared/reload.c index fb7ff0403c259..862c4ccebc7aa 100644 --- a/supervisor/shared/reload.c +++ b/supervisor/shared/reload.c @@ -35,16 +35,16 @@ void reload_initiate(supervisor_run_reason_t run_reason) { port_wake_main_task(); } -void autoreload_reset() { +void autoreload_reset(void) { last_autoreload_trigger = 0; } -void autoreload_enable() { +void autoreload_enable(void) { autoreload_enabled = true; last_autoreload_trigger = 0; } -void autoreload_disable() { +void autoreload_disable(void) { autoreload_enabled = false; } @@ -56,11 +56,11 @@ void autoreload_resume(uint32_t suspend_reason_mask) { autoreload_suspended &= ~suspend_reason_mask; } -inline bool autoreload_is_enabled() { +inline bool autoreload_is_enabled(void) { return autoreload_enabled; } -void autoreload_trigger() { +void autoreload_trigger(void) { if (!autoreload_enabled || autoreload_suspended != 0) { return; } @@ -78,7 +78,7 @@ void autoreload_trigger() { } } -bool autoreload_ready() { +bool autoreload_ready(void) { if (last_autoreload_trigger == 0 || autoreload_suspended != 0) { return false; } diff --git a/supervisor/shared/status_leds.c b/supervisor/shared/status_leds.c index 0742b6485ebfd..ffe8b46b20b7c 100644 --- a/supervisor/shared/status_leds.c +++ b/supervisor/shared/status_leds.c @@ -112,7 +112,7 @@ static uint32_t current_status_color = 0; #endif static bool status_led_init_in_progress = false; -void status_led_init() { +void status_led_init(void) { if (status_led_init_in_progress) { // Avoid recursion. return; @@ -186,7 +186,7 @@ void status_led_init() { status_led_init_in_progress = false; } -void status_led_deinit() { +void status_led_deinit(void) { #ifdef MICROPY_HW_NEOPIXEL // Make sure the pin stays low for the reset period. The pin reset may pull // it up and stop the reset period. diff --git a/supervisor/shared/tick.c b/supervisor/shared/tick.c index e19b7c4e68134..346ef9a93c4c5 100644 --- a/supervisor/shared/tick.c +++ b/supervisor/shared/tick.c @@ -92,14 +92,14 @@ static uint64_t _get_raw_subticks(void) { return (ticks << 5) | subticks; } -uint64_t supervisor_ticks_ms64() { +uint64_t supervisor_ticks_ms64(void) { uint64_t result; result = port_get_raw_ticks(NULL); result = result * 1000 / 1024; return result; } -uint32_t supervisor_ticks_ms32() { +uint32_t supervisor_ticks_ms32(void) { return supervisor_ticks_ms64(); } From 837cfa0d2c7507cbb2ee4724eb49c26b37f5ef4c Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 26 May 2025 21:28:08 +0200 Subject: [PATCH 16/29] Enable old-style-definition diagnostic on atmel-samd --- ports/atmel-samd/Makefile | 2 +- ports/atmel-samd/audio_dma.c | 2 +- ports/atmel-samd/common-hal/_pew/PewPew.c | 4 ++-- ports/atmel-samd/common-hal/analogio/AnalogIn.c | 2 +- ports/atmel-samd/common-hal/touchio/TouchIn.c | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile index 888729c7b7f3d..9582eff212d60 100644 --- a/ports/atmel-samd/Makefile +++ b/ports/atmel-samd/Makefile @@ -107,7 +107,7 @@ else endif endif -CFLAGS += $(INC) -Wall -Werror -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes +CFLAGS += $(INC) -Wall -Werror -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes -Werror=old-style-definition ifeq ($(CHIP_FAMILY), samd21) CFLAGS += \ diff --git a/ports/atmel-samd/audio_dma.c b/ports/atmel-samd/audio_dma.c index d5f841f371dd9..e25b74d9a2893 100644 --- a/ports/atmel-samd/audio_dma.c +++ b/ports/atmel-samd/audio_dma.c @@ -30,7 +30,7 @@ static audio_dma_t *audio_dma_state[AUDIO_DMA_CHANNEL_COUNT]; // This cannot be in audio_dma_state because it's volatile. static volatile bool audio_dma_pending[AUDIO_DMA_CHANNEL_COUNT]; -uint8_t find_sync_event_channel_raise() { +uint8_t find_sync_event_channel_raise(void) { uint8_t event_channel = find_sync_event_channel(); if (event_channel >= EVSYS_SYNCH_NUM) { mp_raise_RuntimeError(MP_ERROR_TEXT("All sync event channels in use")); diff --git a/ports/atmel-samd/common-hal/_pew/PewPew.c b/ports/atmel-samd/common-hal/_pew/PewPew.c index 84ff7bc16c734..c3f9330faaef9 100644 --- a/ports/atmel-samd/common-hal/_pew/PewPew.c +++ b/ports/atmel-samd/common-hal/_pew/PewPew.c @@ -38,7 +38,7 @@ void pewpew_interrupt_handler(uint8_t index) { tc->COUNT16.INTFLAG.reg = TC_INTFLAG_MC0; } -void pew_init() { +void pew_init(void) { pew_obj_t *pew = MP_STATE_VM(pew_singleton); common_hal_digitalio_digitalinout_switch_to_input(pew->buttons, PULL_UP); @@ -105,6 +105,6 @@ void pew_reset(void) { MP_STATE_VM(pew_singleton) = NULL; } -uint16_t pew_get_ticks() { +uint16_t pew_get_ticks(void) { return pewpew_ticks; } diff --git a/ports/atmel-samd/common-hal/analogio/AnalogIn.c b/ports/atmel-samd/common-hal/analogio/AnalogIn.c index c633cf44b678c..801ab18f7fd6d 100644 --- a/ports/atmel-samd/common-hal/analogio/AnalogIn.c +++ b/ports/atmel-samd/common-hal/analogio/AnalogIn.c @@ -64,7 +64,7 @@ void common_hal_analogio_analogin_deinit(analogio_analogin_obj_t *self) { self->pin = NULL; } -void analogin_reset() { +void analogin_reset(void) { } uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) { diff --git a/ports/atmel-samd/common-hal/touchio/TouchIn.c b/ports/atmel-samd/common-hal/touchio/TouchIn.c index dc31bfe634be5..822d614a60298 100644 --- a/ports/atmel-samd/common-hal/touchio/TouchIn.c +++ b/ports/atmel-samd/common-hal/touchio/TouchIn.c @@ -91,7 +91,7 @@ void common_hal_touchio_touchin_deinit(touchio_touchin_obj_t *self) { self->config.pin = NO_PIN; } -void touchin_reset() { +void touchin_reset(void) { Ptc *ptc = ((Ptc *)PTC); if (ptc->CTRLA.bit.ENABLE == 1) { ptc->CTRLA.bit.ENABLE = 0; From 5cbecaeda85e1d256ea011ee29c12bb9babdf833 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Tue, 27 May 2025 07:58:07 +0200 Subject: [PATCH 17/29] Enable -Werror=old-style-definition against more ports --- ports/broadcom/Makefile | 2 +- ports/cxd56/common-hal/camera/Camera.c | 4 ++-- ports/espressif/Makefile | 2 +- ports/espressif/common-hal/_bleio/__init__.c | 4 ++-- ports/espressif/common-hal/sdioio/SDCard.c | 2 +- ports/espressif/supervisor/port.c | 6 +++--- ports/litex/Makefile | 2 +- ports/mimxrt10xx/Makefile | 2 +- ports/mimxrt10xx/common-hal/audiobusio/__init__.c | 2 +- ports/nordic/Makefile | 2 +- ports/nordic/common-hal/_bleio/__init__.c | 4 ++-- ports/nordic/common-hal/audiopwmio/PWMAudioOut.c | 2 +- ports/nordic/common-hal/microcontroller/__init__.c | 4 ++-- ports/renode/Makefile | 2 +- ports/renode/supervisor/port.c | 2 +- ports/silabs/boards/devkit_xg24_brd2601b/sensor.c | 2 +- ports/silabs/common-hal/_bleio/CharacteristicBuffer.c | 2 +- ports/silabs/common-hal/_bleio/PacketBuffer.c | 2 +- ports/silabs/common-hal/_bleio/Service.c | 2 +- ports/silabs/common-hal/_bleio/__init__.c | 4 ++-- ports/stm/Makefile | 2 +- ports/stm/common-hal/sdioio/SDCard.c | 2 +- ports/stm/supervisor/port.c | 2 +- 23 files changed, 30 insertions(+), 30 deletions(-) diff --git a/ports/broadcom/Makefile b/ports/broadcom/Makefile index 240362e3de7f6..f60ebbf045e1f 100644 --- a/ports/broadcom/Makefile +++ b/ports/broadcom/Makefile @@ -95,7 +95,7 @@ else endif -CFLAGS += $(INC) -Wall -Werror -std=gnu11 $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) $(DISABLE_WARNINGS) +CFLAGS += $(INC) -Wall -Werror -std=gnu11 $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) $(DISABLE_WARNINGS) -Werror=old-style-definition $(BUILD)/lib/tlsf/tlsf.o: CFLAGS += -Wno-cast-align diff --git a/ports/cxd56/common-hal/camera/Camera.c b/ports/cxd56/common-hal/camera/Camera.c index c3c935a168d42..b9fa2787ef767 100644 --- a/ports/cxd56/common-hal/camera/Camera.c +++ b/ports/cxd56/common-hal/camera/Camera.c @@ -44,7 +44,7 @@ static const image_size_t isx019_image_size_table[] = { { VIDEO_HSIZE_QUADVGA, VIDEO_VSIZE_QUADVGA }, }; -static const char *get_imgsensor_name() { +static const char *get_imgsensor_name(void) { static struct v4l2_capability cap; ioctl(camera_dev.fd, VIDIOC_QUERYCAP, (unsigned long)&cap); @@ -113,7 +113,7 @@ static void camera_start_streaming(enum v4l2_buf_type type) { ioctl(camera_dev.fd, VIDIOC_STREAMON, (unsigned long)&type); } -static void camera_start_preview() { +static void camera_start_preview(void) { camera_set_format(V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_PIX_FMT_UYVY, VIDEO_HSIZE_QVGA, VIDEO_VSIZE_QVGA); v4l2_buffer_t buf; diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index 542083188e556..09522ea795050 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -191,7 +191,7 @@ endif # option to override compiler optimization level, set in boards/$(BOARD)/mpconfigboard.mk CFLAGS += $(OPTIMIZATION_FLAGS) -CFLAGS += $(INC) -Werror -Wall -std=gnu11 -Wl,--gc-sections $(BASE_CFLAGS) $(C_DEFS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes +CFLAGS += $(INC) -Werror -Wall -std=gnu11 -Wl,--gc-sections $(BASE_CFLAGS) $(C_DEFS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes -Werror=old-style-definition # Most current ESPs have nano versions of newlib in ROM so we use them. ifneq ($(IDF_TARGET),esp32c6) diff --git a/ports/espressif/common-hal/_bleio/__init__.c b/ports/espressif/common-hal/_bleio/__init__.c index f3637a8fddb99..119fe55921e8a 100644 --- a/ports/espressif/common-hal/_bleio/__init__.c +++ b/ports/espressif/common-hal/_bleio/__init__.c @@ -31,7 +31,7 @@ static uint64_t _timeout_start_time; background_callback_t bleio_background_callback; -void bleio_user_reset() { +void bleio_user_reset(void) { // Stop any user scanning or advertising. common_hal_bleio_adapter_stop_scan(&common_hal_bleio_adapter_obj); common_hal_bleio_adapter_stop_advertising(&common_hal_bleio_adapter_obj); @@ -43,7 +43,7 @@ void bleio_user_reset() { } // Turn off BLE on a reset or reload. -void bleio_reset() { +void bleio_reset(void) { // Set this explicitly to save data. if (!common_hal_bleio_adapter_get_enabled(&common_hal_bleio_adapter_obj)) { return; diff --git a/ports/espressif/common-hal/sdioio/SDCard.c b/ports/espressif/common-hal/sdioio/SDCard.c index 6fd27c289459c..87ba32f802095 100644 --- a/ports/espressif/common-hal/sdioio/SDCard.c +++ b/ports/espressif/common-hal/sdioio/SDCard.c @@ -245,7 +245,7 @@ void common_hal_sdioio_sdcard_never_reset(sdioio_sdcard_obj_t *self) { } } -void sdioio_reset() { +void sdioio_reset(void) { for (size_t i = 0; i < MP_ARRAY_SIZE(slot_in_use); i++) { if (!never_reset_sdio[i]) { slot_in_use[i] = false; diff --git a/ports/espressif/supervisor/port.c b/ports/espressif/supervisor/port.c index e72eab7e32a56..121335245dc33 100644 --- a/ports/espressif/supervisor/port.c +++ b/ports/espressif/supervisor/port.c @@ -461,11 +461,11 @@ void port_disable_tick(void) { esp_timer_stop(_tick_timer); } -void port_wake_main_task() { +void port_wake_main_task(void) { xTaskNotifyGive(circuitpython_task); } -void port_wake_main_task_from_isr() { +void port_wake_main_task_from_isr(void) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; vTaskNotifyGiveFromISR(circuitpython_task, &xHigherPriorityTaskWoken); if (xHigherPriorityTaskWoken == pdTRUE) { @@ -473,7 +473,7 @@ void port_wake_main_task_from_isr() { } } -void port_yield() { +void port_yield(void) { vTaskDelay(4); } diff --git a/ports/litex/Makefile b/ports/litex/Makefile index bb1d88e755201..98abe985699cf 100644 --- a/ports/litex/Makefile +++ b/ports/litex/Makefile @@ -38,7 +38,7 @@ endif # option to override compiler optimization level, set in boards/$(BOARD)/mpconfigboard.mk CFLAGS += $(OPTIMIZATION_FLAGS) -CFLAGS += $(INC) -Werror -Wall -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(C_DEFS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes +CFLAGS += $(INC) -Werror -Wall -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(C_DEFS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes -Werror=old-style-definition # TODO: check this CFLAGS += -D__START=main -DFOMU diff --git a/ports/mimxrt10xx/Makefile b/ports/mimxrt10xx/Makefile index 57a8beb069129..e6928eead619d 100644 --- a/ports/mimxrt10xx/Makefile +++ b/ports/mimxrt10xx/Makefile @@ -45,7 +45,7 @@ ifeq ($(DEBUG), 1) CFLAGS += -fno-ipa-sra endif -CFLAGS += $(INC) -ggdb -Wall -Werror -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes +CFLAGS += $(INC) -ggdb -Wall -Werror -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes -Werror=old-style-definition # TODO: add these when -Werror is applied # Disable some warnings, as do most ports. NXP SDK causes undef, tinyusb causes cast-align diff --git a/ports/mimxrt10xx/common-hal/audiobusio/__init__.c b/ports/mimxrt10xx/common-hal/audiobusio/__init__.c index 196e52dbf0369..f1030bfcd848c 100644 --- a/ports/mimxrt10xx/common-hal/audiobusio/__init__.c +++ b/ports/mimxrt10xx/common-hal/audiobusio/__init__.c @@ -439,6 +439,6 @@ void port_i2s_resume(i2s_t *self) { self->paused = false; } -void i2s_reset() { +void i2s_reset(void) { // this port relies on object finalizers for reset } diff --git a/ports/nordic/Makefile b/ports/nordic/Makefile index e60b4072a8d48..aa614e097ba3c 100755 --- a/ports/nordic/Makefile +++ b/ports/nordic/Makefile @@ -47,7 +47,7 @@ endif # option to override compiler optimization level, set in boards/$(BOARD)/mpconfigboard.mk CFLAGS += $(OPTIMIZATION_FLAGS) -CFLAGS += $(INC) -Wall -Werror -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes +CFLAGS += $(INC) -Wall -Werror -std=gnu11 -nostdlib -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) -Werror=missing-prototypes -Werror=old-style-definition # Nordic Softdevice SDK header files contains inline assembler that has # broken constraints. As a result the IPA-modref pass, introduced in gcc-11, diff --git a/ports/nordic/common-hal/_bleio/__init__.c b/ports/nordic/common-hal/_bleio/__init__.c index 095723194cfbf..454937dcd354a 100644 --- a/ports/nordic/common-hal/_bleio/__init__.c +++ b/ports/nordic/common-hal/_bleio/__init__.c @@ -80,7 +80,7 @@ void check_sec_status(uint8_t sec_status) { void common_hal_bleio_init(void) { } -void bleio_user_reset() { +void bleio_user_reset(void) { if (common_hal_bleio_adapter_get_enabled(&common_hal_bleio_adapter_obj)) { // Stop any user scanning or advertising. common_hal_bleio_adapter_stop_scan(&common_hal_bleio_adapter_obj); @@ -94,7 +94,7 @@ void bleio_user_reset() { } // Turn off BLE on a reset or reload. -void bleio_reset() { +void bleio_reset(void) { // Set this explicitly to save data. common_hal_bleio_adapter_obj.base.type = &bleio_adapter_type; if (!common_hal_bleio_adapter_get_enabled(&common_hal_bleio_adapter_obj)) { diff --git a/ports/nordic/common-hal/audiopwmio/PWMAudioOut.c b/ports/nordic/common-hal/audiopwmio/PWMAudioOut.c index 53be11bcd7485..b48a03e09c601 100644 --- a/ports/nordic/common-hal/audiopwmio/PWMAudioOut.c +++ b/ports/nordic/common-hal/audiopwmio/PWMAudioOut.c @@ -136,7 +136,7 @@ static void audiopwmout_background_obj(audiopwmio_pwmaudioout_obj_t *self) { } } -void audiopwmout_background() { +void audiopwmout_background(void) { // Check the NVIC first because it is part of the CPU and fast to read. if (!NVIC_GetPendingIRQ(PWM0_IRQn) && !NVIC_GetPendingIRQ(PWM1_IRQn) && diff --git a/ports/nordic/common-hal/microcontroller/__init__.c b/ports/nordic/common-hal/microcontroller/__init__.c index 38a3b1ee60938..fbb40afe0449d 100644 --- a/ports/nordic/common-hal/microcontroller/__init__.c +++ b/ports/nordic/common-hal/microcontroller/__init__.c @@ -35,7 +35,7 @@ void common_hal_mcu_delay_us(uint32_t delay) { static volatile uint32_t nesting_count = 0; static uint8_t is_nested_critical_region; -void common_hal_mcu_disable_interrupts() { +void common_hal_mcu_disable_interrupts(void) { if (nesting_count == 0) { // Unlike __disable_irq(), this should only be called the first time // "is_nested_critical_region" is sd's equivalent of our nesting count @@ -51,7 +51,7 @@ void common_hal_mcu_disable_interrupts() { nesting_count++; } -void common_hal_mcu_enable_interrupts() { +void common_hal_mcu_enable_interrupts(void) { if (nesting_count == 0) { // This is very very bad because it means there was mismatched disable/enables. reset_into_safe_mode(SAFE_MODE_INTERRUPT_ERROR); diff --git a/ports/renode/Makefile b/ports/renode/Makefile index 22e32f9d2fb6e..92541c03e77b9 100644 --- a/ports/renode/Makefile +++ b/ports/renode/Makefile @@ -21,7 +21,7 @@ INC += \ CFLAGS += -ggdb3 -Os DISABLE_WARNINGS = -Wno-cast-align -CFLAGS += $(INC) -Wall -Werror -std=gnu11 -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) $(DISABLE_WARNINGS) -Werror=missing-prototypes +CFLAGS += $(INC) -Wall -Werror -std=gnu11 -fshort-enums $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) $(DISABLE_WARNINGS) -Werror=missing-prototypes -Werror=old-style-definition CFLAGS += \ -march=armv6-m \ diff --git a/ports/renode/supervisor/port.c b/ports/renode/supervisor/port.c index dae32b7bb8f2d..d12ebd2efddb9 100644 --- a/ports/renode/supervisor/port.c +++ b/ports/renode/supervisor/port.c @@ -210,7 +210,7 @@ __attribute__((used)) void HardFault_Handler(void) { } } -void port_yield() { +void port_yield(void) { } void port_boot_info(void) { diff --git a/ports/silabs/boards/devkit_xg24_brd2601b/sensor.c b/ports/silabs/boards/devkit_xg24_brd2601b/sensor.c index aaf698a6cb27f..1c991a4caafc7 100644 --- a/ports/silabs/boards/devkit_xg24_brd2601b/sensor.c +++ b/ports/silabs/boards/devkit_xg24_brd2601b/sensor.c @@ -75,7 +75,7 @@ static mp_obj_t sensor_init(mp_obj_t i2c_in) { return mp_const_true; } -static mp_obj_t sensor_deinit() { +static mp_obj_t sensor_deinit(void) { sl_sensor_hall_deinit(); sl_sensor_lux_deinit(); diff --git a/ports/silabs/common-hal/_bleio/CharacteristicBuffer.c b/ports/silabs/common-hal/_bleio/CharacteristicBuffer.c index d6a64db3a2e95..d08fa765c4f71 100644 --- a/ports/silabs/common-hal/_bleio/CharacteristicBuffer.c +++ b/ports/silabs/common-hal/_bleio/CharacteristicBuffer.c @@ -156,7 +156,7 @@ bool common_hal_bleio_characteristic_buffer_connected( common_hal_bleio_connection_get_connected(self->characteristic->service->connection))); } -void reset_characteristic_buffer_list() { +void reset_characteristic_buffer_list(void) { // Remove characteristic_buffer list memset(bleio_characteristic_buffer_list.data, 0, sizeof(bleio_characteristic_buffer_list.data)); diff --git a/ports/silabs/common-hal/_bleio/PacketBuffer.c b/ports/silabs/common-hal/_bleio/PacketBuffer.c index 1d2b140f7efef..dec833fe62f85 100644 --- a/ports/silabs/common-hal/_bleio/PacketBuffer.c +++ b/ports/silabs/common-hal/_bleio/PacketBuffer.c @@ -391,7 +391,7 @@ void common_hal_bleio_packet_buffer_deinit(bleio_packet_buffer_obj_t *self) { } // Remove packet_buffer list when reload -void reset_packet_buffer_list() { +void reset_packet_buffer_list(void) { // Remove packet_buffer list memset(bleio_packet_buffer_list.data, 0, sizeof(bleio_packet_buffer_list.data)); diff --git a/ports/silabs/common-hal/_bleio/Service.c b/ports/silabs/common-hal/_bleio/Service.c index 694841e66284f..abc8ffe74edff 100644 --- a/ports/silabs/common-hal/_bleio/Service.c +++ b/ports/silabs/common-hal/_bleio/Service.c @@ -230,7 +230,7 @@ void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, } // Remove dynamic service when reload -void reset_dynamic_service() { +void reset_dynamic_service(void) { uint16_t gattdb_session; uint8_t svc_index; diff --git a/ports/silabs/common-hal/_bleio/__init__.c b/ports/silabs/common-hal/_bleio/__init__.c index a9ad7b32c36ba..c6ae8a0b606c8 100644 --- a/ports/silabs/common-hal/_bleio/__init__.c +++ b/ports/silabs/common-hal/_bleio/__init__.c @@ -54,7 +54,7 @@ const osMutexAttr_t bluetooth_connection_mutex_attr = { void common_hal_bleio_init(void) { } -void bleio_user_reset() { +void bleio_user_reset(void) { // Stop any user scanning or advertising. common_hal_bleio_adapter_stop_scan(&common_hal_bleio_adapter_obj); common_hal_bleio_adapter_stop_advertising(&common_hal_bleio_adapter_obj); @@ -63,7 +63,7 @@ void bleio_user_reset() { supervisor_bluetooth_background(); } -void bleio_reset() { +void bleio_reset(void) { reset_dynamic_service(); reset_packet_buffer_list(); reset_characteristic_buffer_list(); diff --git a/ports/stm/Makefile b/ports/stm/Makefile index baea6893a33d9..9db283767e0ec 100755 --- a/ports/stm/Makefile +++ b/ports/stm/Makefile @@ -51,7 +51,7 @@ CFLAGS += -ftree-vrp # STM32 MCU series must be defined. See supervisor/linker.h C_DEFS = -D$(MCU_PACKAGE) -DUSE_HAL_DRIVER -DUSE_FULL_LL_DRIVER -D$(MCU_VARIANT) -DSTM32$(MCU_SERIES) -CFLAGS += $(INC) -Werror -Wall -std=gnu11 -fshort-enums $(BASE_CFLAGS) $(C_DEFS) $(CFLAGS_MOD) $(COPT) -nostdlib -nostartfiles +CFLAGS += $(INC) -Werror -Wall -std=gnu11 -fshort-enums $(BASE_CFLAGS) $(C_DEFS) $(CFLAGS_MOD) $(COPT) -nostdlib -nostartfiles -Werror=old-style-definition # Undo some warnings. # STM32 HAL uses undefined preprocessor variables, shadowed variables, casts that change alignment reqs diff --git a/ports/stm/common-hal/sdioio/SDCard.c b/ports/stm/common-hal/sdioio/SDCard.c index a5c8b0404a0fb..92e552c2e8984 100644 --- a/ports/stm/common-hal/sdioio/SDCard.c +++ b/ports/stm/common-hal/sdioio/SDCard.c @@ -338,7 +338,7 @@ void common_hal_sdioio_sdcard_never_reset(sdioio_sdcard_obj_t *self) { } } -void sdioio_reset() { +void sdioio_reset(void) { for (size_t i = 0; i < MP_ARRAY_SIZE(reserved_sdio); i++) { if (!never_reset_sdio[i]) { reserved_sdio[i] = false; diff --git a/ports/stm/supervisor/port.c b/ports/stm/supervisor/port.c index 4aa8c044122ce..c5a1685a7fddc 100644 --- a/ports/stm/supervisor/port.c +++ b/ports/stm/supervisor/port.c @@ -285,7 +285,7 @@ void HAL_Delay(uint32_t delay_ms) { } } -uint32_t HAL_GetTick() { +uint32_t HAL_GetTick(void) { if (SysTick->CTRL != 0) { return systick_ms; } else { From a4158a3cb2f77316c478f5f5765cad4b70877f7a Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Tue, 27 May 2025 08:20:38 +0200 Subject: [PATCH 18/29] Fix old-style function definition --- shared-module/usb_cdc/__init__.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared-module/usb_cdc/__init__.c b/shared-module/usb_cdc/__init__.c index 0248c0f180fdb..9a9f158f28cfb 100644 --- a/shared-module/usb_cdc/__init__.c +++ b/shared-module/usb_cdc/__init__.c @@ -356,10 +356,10 @@ size_t usb_vendor_descriptor_length(void) { static uint8_t *ms_os_20_descriptor = NULL; -size_t vendor_ms_os_20_descriptor_length() { +size_t vendor_ms_os_20_descriptor_length(void) { return ms_os_20_descriptor != NULL ? sizeof(ms_os_20_descriptor_template) : 0; } -uint8_t const *vendor_ms_os_20_descriptor() { +uint8_t const *vendor_ms_os_20_descriptor(void) { return ms_os_20_descriptor; } From cb1fcf3d50d0c2cab2e09bf7d6b9f32f92bc52ee Mon Sep 17 00:00:00 2001 From: Bernhard Bablok Date: Wed, 28 May 2025 11:06:22 +0200 Subject: [PATCH 19/29] fix deque implementation from upstream --- py/objdeque.c | 2 +- tests/basics/deque2.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/py/objdeque.c b/py/objdeque.c index 583537017fdb2..89c57668e45d5 100644 --- a/py/objdeque.c +++ b/py/objdeque.c @@ -208,7 +208,7 @@ static mp_obj_t deque_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) { size_t offset = mp_get_index(self->base.type, deque_len(self), index, false); size_t index_val = self->i_get + offset; - if (index_val > self->alloc) { + if (index_val >= self->alloc) { index_val -= self->alloc; } diff --git a/tests/basics/deque2.py b/tests/basics/deque2.py index 3552d5be37abe..ebc0872c7b4e0 100644 --- a/tests/basics/deque2.py +++ b/tests/basics/deque2.py @@ -31,6 +31,16 @@ d[3] = 5 print(d[3]) +# Access the last element via index, when the last element is at various locations +d = deque((), 2) +for i in range(4): + d.append(i) + print(i, d[-1]) + +# Write the last element then access all elements from the end +d[-1] = 4 +print(d[-2], d[-1]) + # Accessing indices out of bounds raises IndexError try: d[4] From fda497cd12bb4f478589b7723c8a686d56c85496 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Wed, 28 May 2025 12:30:57 -0400 Subject: [PATCH 20/29] nordic: Fix BLE HID to work after deep sleep --- main.c | 4 ++-- .../boards/circuitplayground_bluefruit/mpconfigboard.h | 4 ++++ ports/nordic/common-hal/alarm/__init__.h | 7 ++++--- supervisor/shared/bluetooth/bluetooth.c | 1 + 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/main.c b/main.c index 45b7af2725435..1d812bcf215ac 100644 --- a/main.c +++ b/main.c @@ -582,8 +582,8 @@ static bool __attribute__((noinline)) run_code_py(safe_mode_t safe_mode, bool *s size_t total_time = blink_time + LED_SLEEP_TIME_MS; #endif - // This loop is waits after code completes. It waits for fake sleeps to - // finish, user input or autoreloads. + // This loop is run after code completes. It waits for fake sleeps to + // finish, waits for user input, or waits for an autoreload. #if CIRCUITPY_ALARM bool fake_sleeping = false; #endif diff --git a/ports/nordic/boards/circuitplayground_bluefruit/mpconfigboard.h b/ports/nordic/boards/circuitplayground_bluefruit/mpconfigboard.h index 91cf68095d27d..d63a9ccd5d8d5 100644 --- a/ports/nordic/boards/circuitplayground_bluefruit/mpconfigboard.h +++ b/ports/nordic/boards/circuitplayground_bluefruit/mpconfigboard.h @@ -50,3 +50,7 @@ #define DEFAULT_UART_BUS_TX (&pin_P0_14) #define SPEAKER_ENABLE_PIN (&pin_P1_04) + +// Uncomment to allow debugging over console UART +// #define CIRCUITPY_CONSOLE_UART_TX (&pin_P0_14) +// #define CIRCUITPY_CONSOLE_UART_RX (&pin_P0_30) diff --git a/ports/nordic/common-hal/alarm/__init__.h b/ports/nordic/common-hal/alarm/__init__.h index 91d717ccce273..336447689ff4e 100644 --- a/ports/nordic/common-hal/alarm/__init__.h +++ b/ports/nordic/common-hal/alarm/__init__.h @@ -13,7 +13,7 @@ #include "common-hal/alarm/touch/TouchAlarm.h" typedef enum { - NRF_SLEEP_WAKEUP_UNDEFINED, + NRF_SLEEP_WAKEUP_UNDEFINED = 0, NRF_SLEEP_WAKEUP_GPIO, NRF_SLEEP_WAKEUP_TIMER, NRF_SLEEP_WAKEUP_TOUCHPAD, @@ -33,8 +33,9 @@ extern const alarm_sleep_memory_obj_t alarm_sleep_memory_obj; enum { SLEEPMEM_WAKEUP_BY_NONE = 0, - SLEEPMEM_WAKEUP_BY_PIN = 1, - SLEEPMEM_WAKEUP_BY_TIMER = 2, + SLEEPMEM_WAKEUP_BY_PIN, + SLEEPMEM_WAKEUP_BY_TIMER, + SLEEPMEM_WAKEUP_BY_TOUCH, }; #define WAKEUP_PIN_UNDEF 0xFF extern uint8_t sleepmem_wakeup_event; diff --git a/supervisor/shared/bluetooth/bluetooth.c b/supervisor/shared/bluetooth/bluetooth.c index 73c05139eeea3..055a5cdf1fdfd 100644 --- a/supervisor/shared/bluetooth/bluetooth.c +++ b/supervisor/shared/bluetooth/bluetooth.c @@ -189,6 +189,7 @@ void supervisor_bluetooth_init(void) { boot_in_discovery_mode = false; if (reset_reason != RESET_REASON_POWER_ON && reset_reason != RESET_REASON_RESET_PIN && + reset_reason != RESET_REASON_DEEP_SLEEP_ALARM && reset_reason != RESET_REASON_UNKNOWN && reset_reason != RESET_REASON_SOFTWARE) { return; From 7f1beb6c97916ebb8b323f01530368cff51601a8 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Wed, 28 May 2025 16:01:39 -0400 Subject: [PATCH 21/29] improve keypad doc re RP2350 E-9 erratum --- shared-bindings/keypad/KeyMatrix.c | 8 ++++++++ shared-bindings/keypad/Keys.c | 6 ++++++ shared-bindings/keypad/__init__.c | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/shared-bindings/keypad/KeyMatrix.c b/shared-bindings/keypad/KeyMatrix.c index 8303645f20183..edb32c2c5c700 100644 --- a/shared-bindings/keypad/KeyMatrix.c +++ b/shared-bindings/keypad/KeyMatrix.c @@ -67,6 +67,14 @@ //| in the respective state for ``debounce_threshold`` times on average. //| Successive measurements are spaced apart by ``interval`` seconds. //| The default is 1, which resolves immediately. The maximum is 127. +//| +//| .. warning:: On Raspberry Pi RP2350, using ``columns_to_anodes=False`` +//| normally depends on the internal pull-down resistors. +//| This will not work, due to an RP2350 issue. +//| The easiest fix is simply to swap the ``row_pins`` and ```column_pins`` and to set +//| ``columns_to_anodes=True``. This requires no external components. +//| An alternative is to add external pull-downs of 8.2 kohms or less, but that will draw more current. +//| See the Warning in `digitalio` for more information. //| """ //| ... //| diff --git a/shared-bindings/keypad/Keys.c b/shared-bindings/keypad/Keys.c index 10ac81cf1fb63..64e8e51a67ded 100644 --- a/shared-bindings/keypad/Keys.c +++ b/shared-bindings/keypad/Keys.c @@ -69,6 +69,12 @@ //| in the respective state for ``debounce_threshold`` times on average. //| Successive measurements are spaced apart by ``interval`` seconds. //| The default is 1, which resolves immediately. The maximum is 127. +//| +//| .. warning:: On Raspberry Pi RP2350, using ``value_when_pressed=True`` and ``pull=True``, +//| to enable using the internal pull-down resistor, will not work, due to an RP2350 +//| hardware issue. Instead, wire the switch to be ``value_when_pressed=False``, or add +//| an external pull-down resistor of 8.2 kohms or less. +//| See the Warning in `digitalio` for more information. //| """ //| ... //| diff --git a/shared-bindings/keypad/__init__.c b/shared-bindings/keypad/__init__.c index b29de197262f4..b182e977829d1 100644 --- a/shared-bindings/keypad/__init__.c +++ b/shared-bindings/keypad/__init__.c @@ -65,7 +65,7 @@ MP_PROPERTY_GETTER(keypad_generic_events_obj, //| due to a GPIO hardware issue that causes excessive leakage current (~120uA). //| A pin can read as high even when driven or pulled low, if the input signal is high //| impedance or if an attached pull-down resistor is too weak (has too high a value). -//| See the warning in `digitalio` for more information. +//| See the warnings in `keypad.Keys`, `keypad.KeyMatrix`, and `digitalio` for workarounds and more information. //| //| .. jinja //| """ From 7a99affc6338f5bc429d401ff7048c89a14e1a75 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Thu, 29 May 2025 16:49:14 -0400 Subject: [PATCH 22/29] switch to gcc 14.2Rel1 --- .github/actions/deps/external/action.yml | 2 +- .github/actions/deps/ports/broadcom/action.yml | 4 ++-- .github/workflows/build.yml | 6 +++--- ports/broadcom/mpconfigport.mk | 4 ++-- py/circuitpy_mpconfig.h | 2 +- py/circuitpy_mpconfig.mk | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/actions/deps/external/action.yml b/.github/actions/deps/external/action.yml index 0b1444a820da2..10aace1134ec5 100644 --- a/.github/actions/deps/external/action.yml +++ b/.github/actions/deps/external/action.yml @@ -27,7 +27,7 @@ runs: uses: carlosperate/arm-none-eabi-gcc-action@v1 with: # When changing this update what Windows grabs too! - release: '13.2.Rel1' + release: '14.2.Rel1' # espressif - name: Get espressif toolchain diff --git a/.github/actions/deps/ports/broadcom/action.yml b/.github/actions/deps/ports/broadcom/action.yml index f936f8e7edfde..9ad0e361bda1b 100644 --- a/.github/actions/deps/ports/broadcom/action.yml +++ b/.github/actions/deps/ports/broadcom/action.yml @@ -5,8 +5,8 @@ runs: steps: - name: Get broadcom toolchain run: | - wget --no-verbose https://adafruit-circuit-python.s3.amazonaws.com/arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-elf.tar.xz - sudo tar -C /usr --strip-components=1 -xaf arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-elf.tar.xz + wget --no-verbose https://adafruit-circuit-python.s3.amazonaws.com/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf.tar.xz + sudo tar -C /usr --strip-components=1 -xaf arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf.tar.xz sudo apt-get update sudo apt-get install -y mtools shell: bash diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eb6a9a0c26325..0f837d793bddc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -261,9 +261,9 @@ jobs: python3 -c "import sys, locale; print(sys.getdefaultencoding(), locale.getpreferredencoding(False))" - name: Install dependencies run: | - wget --no-verbose -O gcc-arm.zip https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-mingw-w64-i686-arm-none-eabi.zip - unzip -q -d /tmp gcc-arm.zip - tar -C /tmp/arm-gnu-toolchain* -cf - . | tar -C /usr/local -xf - + wget --no-verbose -O gcc-arm.zip https://developer.arm.com/-/media/Files/downloads/gnu/14.2.rel1/binrel/arm-gnu-toolchain-14.2.rel1-mingw-w64-i686-arm-none-eabi.zip + unzip -q -d /tmp/arm-gnu-toolchain gcc-arm.zip + tar -C /tmp/arm-gnu-toolchain -cf - . | tar -C /usr/local -xf - # We could use a venv instead, but that requires entering the venv on each run step # that runs in its own shell. There are some actions that help with that, but not for msys2 # that I can find. (dhalbert) diff --git a/ports/broadcom/mpconfigport.mk b/ports/broadcom/mpconfigport.mk index b4b3e2ebf8192..d906b5d2aa467 100644 --- a/ports/broadcom/mpconfigport.mk +++ b/ports/broadcom/mpconfigport.mk @@ -27,7 +27,7 @@ USB_HIGHSPEED = 1 CIRCUITPY_BUILD_EXTENSIONS ?= disk.img.zip,kernel8.img ifeq ($(CHIP_VARIANT), "bcm2711") -CIRCUITPY_MIN_GCC_VERSION ?= 10 +CIRCUITPY_MIN_GCC_VERSION ?= 14 else ifeq ($(CHIP_VARIANT), "bcm2837") -CIRCUITPY_MIN_GCC_VERSION ?= 10 +CIRCUITPY_MIN_GCC_VERSION ?= 14 endif diff --git a/py/circuitpy_mpconfig.h b/py/circuitpy_mpconfig.h index d6658867b7d1d..bc894e98606eb 100644 --- a/py/circuitpy_mpconfig.h +++ b/py/circuitpy_mpconfig.h @@ -639,7 +639,7 @@ void background_callback_run_all(void); #define MICROPY_PY_BUILTINS_COMPILE (1) #ifndef CIRCUITPY_MIN_GCC_VERSION -#define CIRCUITPY_MIN_GCC_VERSION 13 +#define CIRCUITPY_MIN_GCC_VERSION 14 #endif #ifndef CIRCUITPY_SAVES_PARTITION_SIZE diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk index b081e0f52dbde..6ddac5eeccd8c 100644 --- a/py/circuitpy_mpconfig.mk +++ b/py/circuitpy_mpconfig.mk @@ -719,7 +719,7 @@ CIRCUITPY_SWO_TRACE ?= 0 CFLAGS += -DCIRCUITPY_SWO_TRACE=$(CIRCUITPY_SWO_TRACE) # Check for a minimum GCC version during build (set to 0 to disable) -CIRCUITPY_MIN_GCC_VERSION ?= 13 +CIRCUITPY_MIN_GCC_VERSION ?= 14 CFLAGS += -DCIRCUITPY_MIN_GCC_VERSION=$(CIRCUITPY_MIN_GCC_VERSION) # Define an equivalent for MICROPY_LONGINT_IMPL, to pass to $(MPY-TOOL) in py/mkrules.mk From ee7ed33c7041e2fb2e1a46db57b44b7a6122d3fd Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Fri, 30 May 2025 08:14:50 -0400 Subject: [PATCH 23/29] restore mpy-cross STATIC_BUILD checking --- mpy-cross/Makefile | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mpy-cross/Makefile b/mpy-cross/Makefile index 9962e9bcbb246..bd9e0fb1f54d4 100644 --- a/mpy-cross/Makefile +++ b/mpy-cross/Makefile @@ -25,6 +25,12 @@ CFLAGS += -fdata-sections -ffunction-sections -fno-asynchronous-unwind-tables # CIRCUITPY-CHANGE CFLAGS += -DCIRCUITPY +# Build a static executable. +# Useful for builds that must run on multiple operating system versions. Used for published mpy-cross versions. +ifdef STATIC_BUILD +CFLAGS += -static -static-libgcc -static-libstdc++ +endif + # Debugging/Optimization ifdef DEBUG CFLAGS += -g @@ -47,6 +53,10 @@ LDFLAGS_ARCH = -Wl,-Map=$@.map,--cref -Wl,--gc-sections endif LDFLAGS += $(LDFLAGS_MOD) $(LDFLAGS_ARCH) -lm $(LDFLAGS_EXTRA) +ifdef STATIC_BUILD +LDFLAGS += -static -static-libgcc -static-libstdc++ +endif + # source files # CIRCUITPY-CHANGE: extra files SRC_C = \ From 84a73bf6806403dcad7490f143153a2f2774618e Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Fri, 30 May 2025 10:33:09 -0400 Subject: [PATCH 24/29] .devcontainer/cortex-m-toolchain.sh: update to gcc14 --- .devcontainer/cortex-m-toolchain.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/cortex-m-toolchain.sh b/.devcontainer/cortex-m-toolchain.sh index de1ccde62742a..782b472fec2e2 100755 --- a/.devcontainer/cortex-m-toolchain.sh +++ b/.devcontainer/cortex-m-toolchain.sh @@ -14,10 +14,10 @@ echo -e "[cortex-m-toolchain.sh] downloading and installing gcc-arm-non-eabi too cd /workspaces wget -qO gcc-arm-none-eabi.tar.xz \ - https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz + https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi.tar.xz tar -xJf gcc-arm-none-eabi.tar.xz -ln -s arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi gcc-arm-none-eabi +ln -s arm-gnu-toolchain-14.2.Rel1-x86_64-arm-none-eabi gcc-arm-none-eabi rm -f gcc-arm-none-eabi.tar.xz echo -e "[cortex-m-toolchain.sh] update PATH in environment" From e68a511c030ef92d96ff732458c490687e63a393 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Sat, 31 May 2025 12:18:41 -0400 Subject: [PATCH 25/29] Update ping action version --- .github/workflows/notify-on-issue-label.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/notify-on-issue-label.yml b/.github/workflows/notify-on-issue-label.yml index da1ac0a18e28a..2b229156811f8 100644 --- a/.github/workflows/notify-on-issue-label.yml +++ b/.github/workflows/notify-on-issue-label.yml @@ -10,7 +10,7 @@ jobs: permissions: issues: write steps: - - uses: tekktrik/issue-labeled-ping@v1 + - uses: tekktrik/issue-labeled-ping@v2 with: github-token: ${{ secrets.GITHUB_TOKEN }} user: v923z From 8c4639b5ba718017bcc3fe869e5fee6edfbef897 Mon Sep 17 00:00:00 2001 From: hexthat Date: Fri, 30 May 2025 21:42:15 +0200 Subject: [PATCH 26/29] Translated using Weblate (Chinese (Hanyu Pinyin)) Currently translated at 100.0% (1015 of 1015 strings) Translation: CircuitPython/main Translate-URL: https://hosted.weblate.org/projects/circuitpython/main/zh_Latn/ --- locale/zh_Latn_pinyin.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/zh_Latn_pinyin.po b/locale/zh_Latn_pinyin.po index 85eb703d4db01..5d7afdc3438f2 100644 --- a/locale/zh_Latn_pinyin.po +++ b/locale/zh_Latn_pinyin.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: circuitpython-cn\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2025-04-25 15:04+0000\n" +"PO-Revision-Date: 2025-05-31 20:05+0000\n" "Last-Translator: hexthat \n" "Language-Team: Chinese Hanyu Pinyin\n" "Language: zh_Latn_pinyin\n" @@ -2116,7 +2116,7 @@ msgstr "Píng pū kuāndù bìxū huàfēn wèi tú kuāndù" #: shared-module/tilepalettemapper/TilePaletteMapper.c msgid "TilePaletteMapper may only be bound to a TileGrid once" -msgstr "" +msgstr "TilePaletteMapper zhǐnéng bǎngdìng dào yígè TileGrid shàngyícì" #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." @@ -2411,7 +2411,7 @@ msgstr "Wi-Fi: " #: ports/raspberrypi/common-hal/wifi/Radio.c #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "WiFi is not enabled" -msgstr "" +msgstr "WiFi wèi qǐyòng" #: main.c msgid "Woken up by alarm.\n" From 5a30fe849c91c55ca9c14435585a324e54cfb8c3 Mon Sep 17 00:00:00 2001 From: Timeline8 Date: Sat, 31 May 2025 18:57:05 -0400 Subject: [PATCH 27/29] Update pins.c The waveshare_esp32_s3_zero/mpconfigboard.h file does not have SPI nor IC2 defined. I suspect this board was built off another board and while the SPI and IC2 definitions were correctly removed from the mpconfigboard.h file, they were accidentally left in the pins.c file. So if you call a board.I2C or board.SPI you get an error even though they show up in 'dir (board)'. The board does not have any silkscreen for these busses nor are the specifically called out in the schematic. https://www.waveshare.com/wiki/ESP32-S3-Zero --- ports/espressif/boards/waveshare_esp32_s3_zero/pins.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ports/espressif/boards/waveshare_esp32_s3_zero/pins.c b/ports/espressif/boards/waveshare_esp32_s3_zero/pins.c index 868c26be20140..15225b1c57c5d 100644 --- a/ports/espressif/boards/waveshare_esp32_s3_zero/pins.c +++ b/ports/espressif/boards/waveshare_esp32_s3_zero/pins.c @@ -152,8 +152,7 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO21) }, { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO21) }, - { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, - { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + // UART - using TX RX on silkscreen { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) } }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); From 6108958ed49a6aa018d59419846015b440a108b1 Mon Sep 17 00:00:00 2001 From: Andi Chandler Date: Tue, 3 Jun 2025 15:14:47 +0200 Subject: [PATCH 28/29] Translated using Weblate (English (United Kingdom)) Currently translated at 100.0% (1015 of 1015 strings) Translation: CircuitPython/main Translate-URL: https://hosted.weblate.org/projects/circuitpython/main/en_GB/ --- locale/en_GB.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/en_GB.po b/locale/en_GB.po index f62a09e1db378..1f540603b7d83 100644 --- a/locale/en_GB.po +++ b/locale/en_GB.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-04-25 15:04+0000\n" +"PO-Revision-Date: 2025-06-04 14:01+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: none\n" "Language: en_GB\n" @@ -2098,7 +2098,7 @@ msgstr "Tile width must exactly divide bitmap width" #: shared-module/tilepalettemapper/TilePaletteMapper.c msgid "TilePaletteMapper may only be bound to a TileGrid once" -msgstr "" +msgstr "TilePaletteMapper may only be bound to a TileGrid once" #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." @@ -2393,7 +2393,7 @@ msgstr "Wi-Fi: " #: ports/raspberrypi/common-hal/wifi/Radio.c #: ports/zephyr-cp/common-hal/wifi/Radio.c msgid "WiFi is not enabled" -msgstr "" +msgstr "WiFi is not enabled" #: main.c msgid "Woken up by alarm.\n" From 0697ffc5c37a39dc828fe07667aa4ab38dfa83ba Mon Sep 17 00:00:00 2001 From: Bernhard Bablok Date: Thu, 5 Jun 2025 14:17:57 +0200 Subject: [PATCH 29/29] fixed URL (has 14.2 twice in the url) --- .devcontainer/cortex-m-toolchain.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/cortex-m-toolchain.sh b/.devcontainer/cortex-m-toolchain.sh index 782b472fec2e2..38ecdb72a7b96 100755 --- a/.devcontainer/cortex-m-toolchain.sh +++ b/.devcontainer/cortex-m-toolchain.sh @@ -14,7 +14,7 @@ echo -e "[cortex-m-toolchain.sh] downloading and installing gcc-arm-non-eabi too cd /workspaces wget -qO gcc-arm-none-eabi.tar.xz \ - https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi.tar.xz + https://developer.arm.com/-/media/Files/downloads/gnu/14.2.rel1/binrel/arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi.tar.xz tar -xJf gcc-arm-none-eabi.tar.xz ln -s arm-gnu-toolchain-14.2.Rel1-x86_64-arm-none-eabi gcc-arm-none-eabi