Oops, logic error! Interrupts enabled != in interrupt mode

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19336 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Maurus Cuelenaere 2008-12-04 21:35:47 +00:00
parent cea285d64e
commit 9f76f23ca5
2 changed files with 16 additions and 9 deletions

View file

@ -27,7 +27,6 @@
#include "system-target.h" #include "system-target.h"
#include <string.h> #include <string.h>
#include "kernel.h" #include "kernel.h"
#include "system.h"
#define NUM_DMA 6 #define NUM_DMA 6
#define NUM_GPIO 128 #define NUM_GPIO 128
@ -323,15 +322,26 @@ static int get_irq_number(void)
return irq; return irq;
} }
static bool intr_mode = false;
bool in_interrupt_mode(void)
{
return intr_mode;
}
void intr_handler(void) void intr_handler(void)
{ {
irq = get_irq_number(); /* irq is defined static at UIRQ() */ int irq = get_irq_number();
if(UNLIKELY(irq < 0)) if(irq < 0)
return; return;
ack_irq(irq); ack_irq(irq);
if(LIKELY(irq > 0)) if(irq > 0)
{
intr_mode = true;
irqvector[irq-1](); irqvector[irq-1]();
intr_mode = false;
}
} }
#define EXC(x,y) if(_cause == (x)) return (y); #define EXC(x,y) if(_cause == (x)) return (y);
@ -368,6 +378,7 @@ void exception_handler(void* stack_ptr, unsigned int cause, unsigned int epc)
static const int FR2n[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32}; static const int FR2n[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32};
static unsigned int iclk; static unsigned int iclk;
static void detect_clock(void) static void detect_clock(void)
{ {
unsigned int cfcr, pllout; unsigned int cfcr, pllout;

View file

@ -56,11 +56,6 @@ static inline void disable_interrupt(void)
clear_c0_status(ST0_IE); clear_c0_status(ST0_IE);
} }
static inline bool in_interrupt_mode(void)
{
return (read_c0_status() & ST0_IE) ? true : false;
}
#define disable_irq() \ #define disable_irq() \
disable_interrupt() disable_interrupt()
@ -106,6 +101,7 @@ void udelay(unsigned int usec);
void mdelay(unsigned int msec); void mdelay(unsigned int msec);
void power_off(void); void power_off(void);
void system_reboot(void); void system_reboot(void);
bool in_interrupt_mode(void);
#define DMA_LCD_CHANNEL 0 #define DMA_LCD_CHANNEL 0
#define DMA_NAND_CHANNEL 1 #define DMA_NAND_CHANNEL 1