summaryrefslogtreecommitdiff
path: root/ports
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2020-05-18 16:46:41 -0700
committerScott Shawcroft <scott@tannewt.org>2020-05-18 16:46:41 -0700
commitcf690bd390bf5e970bdc0712063c8ea32d3b6b5a (patch)
tree6f6e8d7a98d65ce54322c06c7d5d665f001bcb90 /ports
parenta57da6b808b53e1a23aff327710a0e365ecc6acc (diff)
parent32617d5f2fb051d3adf55bf0f4f00f10cc5d74aa (diff)
Merge remote-tracking branch 'adafruit/master' into esp32s2
Diffstat (limited to 'ports')
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk3
-rw-r--r--ports/mimxrt10xx/common-hal/busio/SPI.c2
-rw-r--r--ports/mimxrt10xx/common-hal/microcontroller/Processor.c2
-rw-r--r--ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/clocks.c4
-rw-r--r--ports/nrf/boards/common.template.ld15
-rw-r--r--ports/nrf/common-hal/rtc/RTC.c29
-rw-r--r--ports/nrf/common-hal/rtc/RTC.h1
-rw-r--r--ports/nrf/supervisor/port.c21
8 files changed, 63 insertions, 14 deletions
diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
index c5ef958c9..46a245e60 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
@@ -17,10 +17,11 @@ CIRCUITPY_DISPLAYIO = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_I2CSLAVE = 0
CIRCUITPY_PIXELBUF = 1
+CIRCUITPY_ROTARYIO = 0
CIRCUITPY_RTC = 0
SUPEROPT_GC = 0
-CFLAGS_INLINE_LIMIT = 55
+CFLAGS_INLINE_LIMIT = 50
# Include these Python libraries in firmware.
diff --git a/ports/mimxrt10xx/common-hal/busio/SPI.c b/ports/mimxrt10xx/common-hal/busio/SPI.c
index cc19ba354..15c320140 100644
--- a/ports/mimxrt10xx/common-hal/busio/SPI.c
+++ b/ports/mimxrt10xx/common-hal/busio/SPI.c
@@ -58,7 +58,7 @@ STATIC void config_periph_pin(const mcu_periph_obj_t *periph) {
| IOMUXC_SW_PAD_CTL_PAD_SRE(0));
}
-#define LPSPI_MASTER_CLK_FREQ (CLOCK_GetFreq(kCLOCK_Usb1PllPfd0Clk) / (CLOCK_GetDiv(kCLOCK_LpspiDiv)))
+#define LPSPI_MASTER_CLK_FREQ (CLOCK_GetFreq(kCLOCK_Usb1PllPfd0Clk) / (CLOCK_GetDiv(kCLOCK_LpspiDiv) + 1))
void spi_reset(void) {
for (int i = 0; i < MAX_SPI; i++) {
diff --git a/ports/mimxrt10xx/common-hal/microcontroller/Processor.c b/ports/mimxrt10xx/common-hal/microcontroller/Processor.c
index 0c8131ef4..f3a578014 100644
--- a/ports/mimxrt10xx/common-hal/microcontroller/Processor.c
+++ b/ports/mimxrt10xx/common-hal/microcontroller/Processor.c
@@ -37,11 +37,13 @@ float common_hal_mcu_processor_get_temperature(void) {
tempmon_config_t config;
TEMPMON_GetDefaultConfig(&config);
+ OCOTP_Init(OCOTP, CLOCK_GetFreq(kCLOCK_IpgClk));
TEMPMON_Init(TEMPMON, &config);
TEMPMON_StartMeasure(TEMPMON);
const float temp = TEMPMON_GetCurrentTemperature(TEMPMON);
TEMPMON_Deinit(TEMPMON);
+ OCOTP_Deinit(OCOTP);
return temp;
}
diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/clocks.c b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/clocks.c
index 854ae4dee..61888fcaa 100644
--- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/clocks.c
+++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/clocks.c
@@ -55,7 +55,7 @@
#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ 62500000UL
#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT 125000000UL
#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT 60000000UL
-#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT 105600000UL
+#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT 130900000UL
#define BOARD_BOOTCLOCKRUN_MQS_MCLK 63529411UL
#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT 62500000UL
#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT 63529411UL
@@ -137,7 +137,7 @@ void clocks_init(void) {
CLOCK_DisableClock(kCLOCK_Lpspi1);
CLOCK_DisableClock(kCLOCK_Lpspi2);
/* Set LPSPI_PODF. */
- CLOCK_SetDiv(kCLOCK_LpspiDiv, 7);
+ CLOCK_SetDiv(kCLOCK_LpspiDiv, 2);
/* Set Lpspi clock source. */
CLOCK_SetMux(kCLOCK_LpspiMux, 1);
/* Disable TRACE clock gate. */
diff --git a/ports/nrf/boards/common.template.ld b/ports/nrf/boards/common.template.ld
index a2bbf0ec8..9a7df69a4 100644
--- a/ports/nrf/boards/common.template.ld
+++ b/ports/nrf/boards/common.template.ld
@@ -103,7 +103,7 @@ SECTIONS
_edata = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
} >RAM
- /* Uninitialized data section */
+ /* Zero-initialized data section */
.bss :
{
. = ALIGN(4);
@@ -116,6 +116,19 @@ SECTIONS
_ebss = .; /* define a global symbol at bss end; used by startup code and GC */
} >RAM
+ /* Uninitialized data section
+ Data placed into this section will remain unchanged across reboots. */
+ .uninitialized (NOLOAD) :
+ {
+ . = ALIGN(4);
+ _suninitialized = .; /* define a global symbol at uninitialized start; currently unused */
+ *(.uninitialized)
+ *(.uninitialized*)
+
+ . = ALIGN(4);
+ _euninitialized = .; /* define a global symbol at uninitialized end; currently unused */
+ } >RAM
+
/* this is to define the start of the heap, and make sure we have a minimum size */
.heap :
{
diff --git a/ports/nrf/common-hal/rtc/RTC.c b/ports/nrf/common-hal/rtc/RTC.c
index 9f56f2f0d..06345f589 100644
--- a/ports/nrf/common-hal/rtc/RTC.c
+++ b/ports/nrf/common-hal/rtc/RTC.c
@@ -34,11 +34,28 @@
#include "supervisor/shared/translate.h"
// This is the time in seconds since 2000 that the RTC was started.
-static uint32_t rtc_offset = 0;
+__attribute__((section(".uninitialized"))) static uint32_t rtc_offset[3];
+
+// These values are placed before and after the current RTC count. They are
+// used to determine if the RTC count is valid. These randomly-generated values
+// will be set when the RTC value is set in order to mark the RTC as valid. If
+// the system crashes or reboots, these values will remain undisturbed and the
+// RTC offset will remain valid.
+//
+// If Circuit Python is updated or these symbols shift around, the prefix and
+// suffix will no longer match, and the time will no longer be valid.
+#define RTC_OFFSET_CHECK_PREFIX 0x25ea7e2a
+#define RTC_OFFSET_CHECK_SUFFIX 0x2b80b69e
+
+void common_hal_rtc_init(void) {
+ // If the prefix and suffix are not valid, zero-initialize the RTC offset.
+ if ((rtc_offset[0] != RTC_OFFSET_CHECK_PREFIX) || (rtc_offset[2] != RTC_OFFSET_CHECK_SUFFIX))
+ rtc_offset[1] = 0;
+}
void common_hal_rtc_get_time(timeutils_struct_time_t *tm) {
uint64_t ticks_s = port_get_raw_ticks(NULL) / 1024;
- timeutils_seconds_since_2000_to_struct_time(rtc_offset + ticks_s, tm);
+ timeutils_seconds_since_2000_to_struct_time(rtc_offset[1] + ticks_s, tm);
}
void common_hal_rtc_set_time(timeutils_struct_time_t *tm) {
@@ -46,7 +63,13 @@ void common_hal_rtc_set_time(timeutils_struct_time_t *tm) {
uint32_t epoch_s = timeutils_seconds_since_2000(
tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec
);
- rtc_offset = epoch_s - ticks_s;
+ rtc_offset[1] = epoch_s - ticks_s;
+
+ // Set the prefix and suffix in order to indicate the time is valid. This
+ // must be done after the offset is updated, in case there is a crash or
+ // power failure.
+ rtc_offset[0] = RTC_OFFSET_CHECK_PREFIX;
+ rtc_offset[2] = RTC_OFFSET_CHECK_SUFFIX;
}
int common_hal_rtc_get_calibration(void) {
diff --git a/ports/nrf/common-hal/rtc/RTC.h b/ports/nrf/common-hal/rtc/RTC.h
index 0207c8338..e51f1f784 100644
--- a/ports/nrf/common-hal/rtc/RTC.h
+++ b/ports/nrf/common-hal/rtc/RTC.h
@@ -29,5 +29,6 @@
extern void rtc_init(void);
extern void rtc_reset(void);
+extern void common_hal_rtc_init(void);
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_RTC_RTC_H
diff --git a/ports/nrf/supervisor/port.c b/ports/nrf/supervisor/port.c
index 87632fa4d..ce5be5424 100644
--- a/ports/nrf/supervisor/port.c
+++ b/ports/nrf/supervisor/port.c
@@ -120,6 +120,10 @@ safe_mode_t port_init(void) {
// Configure millisecond timer initialization.
tick_init();
+#if CIRCUITPY_RTC
+ common_hal_rtc_init();
+#endif
+
#if CIRCUITPY_ANALOGIO
analogin_init();
#endif
@@ -177,8 +181,13 @@ void reset_cpu(void) {
NVIC_SystemReset();
}
+// The uninitialized data section is placed directly after BSS, under the theory
+// that Circuit Python has a lot more .data and .bss than the bootloader. As a
+// result, this section is less likely to be tampered with by the bootloader.
+extern uint32_t _euninitialized;
+
uint32_t *port_heap_get_bottom(void) {
- return port_stack_get_limit();
+ return &_euninitialized;
}
uint32_t *port_heap_get_top(void) {
@@ -190,21 +199,21 @@ supervisor_allocation* port_fixed_stack(void) {
}
uint32_t *port_stack_get_limit(void) {
- return &_ebss;
+ return &_euninitialized;
}
uint32_t *port_stack_get_top(void) {
return &_estack;
}
-extern uint32_t _ebss;
-// Place the word to save just after our BSS section that gets blanked.
+// Place the word in the uninitialized section so it won't get overwritten.
+__attribute__((section(".uninitialized"))) uint32_t _saved_word;
void port_set_saved_word(uint32_t value) {
- _ebss = value;
+ _saved_word = value;
}
uint32_t port_get_saved_word(void) {
- return _ebss;
+ return _saved_word;
}
uint64_t port_get_raw_ticks(uint8_t* subticks) {