summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Shawcroft <scott@adafruit.com>2020-12-28 11:51:26 -0800
committerGitHub <noreply@github.com>2020-12-28 11:51:26 -0800
commitf9d9c031a9449105b264bee58c0893511b9a6f14 (patch)
treeb84d25c0fe58e5e500691cbc5fe954661e6d04a4
parentc3396e4b4938d28a4dcbe32b59df35826cb181aa (diff)
parent2f95cc95a494395658eefed6130b9a8732117482 (diff)
Merge pull request #3878 from xobs/fomu-fixes-6.0.0
Fomu fixes for 6.0.0
-rw-r--r--ports/litex/boards/fomu/fomu-spi.ld5
-rw-r--r--ports/litex/common-hal/microcontroller/__init__.c7
-rw-r--r--ports/litex/mphalport.c15
-rw-r--r--ports/litex/supervisor/port.c6
4 files changed, 29 insertions, 4 deletions
diff --git a/ports/litex/boards/fomu/fomu-spi.ld b/ports/litex/boards/fomu/fomu-spi.ld
index 9b6443c67..e7db25b0c 100644
--- a/ports/litex/boards/fomu/fomu-spi.ld
+++ b/ports/litex/boards/fomu/fomu-spi.ld
@@ -51,6 +51,11 @@ SECTIONS
*(.text.tu_edpt_dir)
*(.text.tu_fifo_empty)
*(.text.usbd_edpt_busy)
+ *(.text.usb_irq_handler)
+ *(.text.supervisor_tick)
+ *(.text.port_get_raw_ticks)
+ *(.text.__modsi3)
+ *(.text.__udivsi3)
*(.text.irq_getmask)
*(.text.irq_setmask)
*(.text.irq_pending)
diff --git a/ports/litex/common-hal/microcontroller/__init__.c b/ports/litex/common-hal/microcontroller/__init__.c
index 3c9166114..522a41e2e 100644
--- a/ports/litex/common-hal/microcontroller/__init__.c
+++ b/ports/litex/common-hal/microcontroller/__init__.c
@@ -59,12 +59,15 @@ void common_hal_mcu_delay_us(uint32_t delay) {
volatile uint32_t nesting_count = 0;
+__attribute__((section(".ramtext")))
void common_hal_mcu_disable_interrupts(void) {
- irq_setie(0);
- // __DMB();
+ if (nesting_count == 0) {
+ irq_setie(0);
+ }
nesting_count++;
}
+__attribute__((section(".ramtext")))
void common_hal_mcu_enable_interrupts(void) {
if (nesting_count == 0) {
// This is very very bad because it means there was mismatched disable/enables so we
diff --git a/ports/litex/mphalport.c b/ports/litex/mphalport.c
index 862f16393..c7369dc05 100644
--- a/ports/litex/mphalport.c
+++ b/ports/litex/mphalport.c
@@ -44,16 +44,31 @@ void mp_hal_delay_us(mp_uint_t delay) {
extern void SysTick_Handler(void);
+// This value contains the number of times "common_hal_mcu_disable_interrupts()"
+// has been called without calling "common_hal_mcu_enable_interrupts()". Since
+// this is the interrupt handler, that means we're handling an interrupt, so
+// this value should be `0`.
+//
+// Interrupts should already be disabled when this handler is running, which means
+// this value is logically already `1`. If we didn't do this, then interrupts would
+// be prematurely enabled by interrupt handlers that enable and disable interrupts.
+extern volatile uint32_t nesting_count;
+
__attribute__((section(".ramtext")))
void isr(void) {
uint8_t irqs = irq_pending() & irq_getmask();
+ // Increase the "nesting count". Note: This should be going from 0 -> 1.
+ nesting_count += 1;
#ifdef CFG_TUSB_MCU
if (irqs & (1 << USB_INTERRUPT))
usb_irq_handler();
#endif
if (irqs & (1 << TIMER0_INTERRUPT))
SysTick_Handler();
+
+ // Decrease the "nesting count". Note: This should be going from 1 -> 0.
+ nesting_count -= 1;
}
mp_uint_t cpu_get_regs_and_sp(mp_uint_t *regs) {
diff --git a/ports/litex/supervisor/port.c b/ports/litex/supervisor/port.c
index 4dea02065..04ff1c09b 100644
--- a/ports/litex/supervisor/port.c
+++ b/ports/litex/supervisor/port.c
@@ -32,6 +32,8 @@
#include "irq.h"
#include "csr.h"
+#include "shared-bindings/microcontroller/__init__.h"
+
// Global millisecond tick count. 1024 per second because most RTCs are clocked with 32.768khz
// crystals.
volatile uint64_t raw_ticks = 0;
@@ -129,9 +131,9 @@ uint32_t port_get_saved_word(void) {
uint64_t port_get_raw_ticks(uint8_t* subticks) {
// Reading 64 bits may take two loads, so turn of interrupts while we do it.
- irq_setie(false);
+ common_hal_mcu_disable_interrupts();
uint64_t raw_tick_snapshot = raw_ticks;
- irq_setie(true);
+ common_hal_mcu_enable_interrupts();
return raw_tick_snapshot;
}