This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 1530b0f risc-v/esp32c3: Fix overwriting of registered-but-disabled
interrupts
1530b0f is described below
commit 1530b0f639ed58ffb412a1a2f1f48c2258a0ba02
Author: Gustavo Henrique Nihei <[email protected]>
AuthorDate: Mon May 31 09:05:05 2021 -0300
risc-v/esp32c3: Fix overwriting of registered-but-disabled interrupts
---
arch/risc-v/src/esp32c3/esp32c3_irq.c | 25 +++++++++++--------------
1 file changed, 11 insertions(+), 14 deletions(-)
diff --git a/arch/risc-v/src/esp32c3/esp32c3_irq.c
b/arch/risc-v/src/esp32c3/esp32c3_irq.c
index 4252299..03b8be4 100644
--- a/arch/risc-v/src/esp32c3/esp32c3_irq.c
+++ b/arch/risc-v/src/esp32c3/esp32c3_irq.c
@@ -163,6 +163,8 @@ void up_enable_irq(int cpuint)
{
irqstate_t irqstate;
+ irqinfo("cpuint=%d\n", cpuint);
+
DEBUGASSERT(cpuint >= ESP32C3_CPUINT_MIN && cpuint <= ESP32C3_CPUINT_MAX);
irqstate = enter_critical_section();
@@ -182,6 +184,8 @@ void up_disable_irq(int cpuint)
{
irqstate_t irqstate;
+ irqinfo("cpuint=%d\n", cpuint);
+
DEBUGASSERT(cpuint >= ESP32C3_CPUINT_MIN && cpuint <= ESP32C3_CPUINT_MAX);
irqstate = enter_critical_section();
@@ -252,7 +256,6 @@ void esp32c3_bind_irq(uint8_t cpuint, uint8_t periphid,
uint8_t prio,
int esp32c3_request_irq(uint8_t periphid, uint8_t prio, uint32_t flags)
{
int ret;
- uint32_t regval;
int cpuint;
irqstate_t irqstate;
@@ -262,33 +265,27 @@ int esp32c3_request_irq(uint8_t periphid, uint8_t prio,
uint32_t flags)
irqstate = enter_critical_section();
- /* Skip over enabled interrupts. NOTE: bit 0 is reserved. */
-
- regval = getreg32(INTERRUPT_CPU_INT_ENABLE_REG);
-
- /* Skip over reserved CPU interrupts */
-
- regval |= CPUINT_RESERVED_MAPS;
+ /* Skip over already registered interrupts.
+ * NOTE: bit 0 is reserved.
+ */
for (cpuint = 1; cpuint <= ESP32C3_CPUINT_MAX; cpuint++)
{
- if (!(regval & (1 << cpuint)))
+ if (g_cpuint_map[cpuint] == CPUINT_UNASSIGNED)
{
break;
}
}
- irqinfo("INFO: cpuint=%d\n", cpuint);
+ irqinfo("periphid:%" PRIu8 " cpuint=%d\n", periphid, cpuint);
if (cpuint <= ESP32C3_CPUINT_MAX)
{
- DEBUGASSERT(g_cpuint_map[cpuint] == CPUINT_UNASSIGNED);
-
- /* We have a free CPU interrupt. We can continue with mapping the
+ /* We have a free CPU interrupt. We can continue with mapping the
* peripheral.
*/
- /* Save the CPU interrupt ID. We will return this value. */
+ /* Save the CPU interrupt ID. We will return this value. */
ret = cpuint;