AS3525 : fix interrupts support (but leave them disabled)

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18979 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Rafaël Carré 2008-11-02 17:11:33 +00:00
parent 99d39f5c3a
commit aa061bc192
2 changed files with 60 additions and 15 deletions

View file

@ -195,7 +195,7 @@ CE lines
#define CGU_MEMSTICK (*(volatile unsigned long *)(CGU_BASE + 0x34))
#define CGU_DBOP (*(volatile unsigned long *)(CGU_BASE + 0x38))
#define CGU_VIC_CLOCK_ENABLE ( 1 << 23 ) /* vic */
/* --- are disabled after reset --- */
#define CGU_DMA_CLOCK_ENABLE ( 1 << 22 ) /* dma */
#define CGU_USB_CLOCK_ENABLE ( 1 << 21 ) /* usb */
@ -347,4 +347,45 @@ interface */
#define MPMC_PERIPH_ID2 (*(volatile unsigned long*)(MPMC_BASE+0xFE8))
/* VIC controller (PL190) registers */
#define VIC_IRQ_STATUS (*(volatile unsigned long*)(VIC_BASE+0x00))
#define VIC_FIQ_STATUS (*(volatile unsigned long*)(VIC_BASE+0x04))
#define VIC_RAW_INTR (*(volatile unsigned long*)(VIC_BASE+0x08))
#define VIC_INT_SELECT (*(volatile unsigned long*)(VIC_BASE+0x0C))
#define VIC_INT_ENABLE (*(volatile unsigned long*)(VIC_BASE+0x10))
#define VIC_INT_EN_CLEAR (*(volatile unsigned long*)(VIC_BASE+0x14))
#define VIC_SOFT_INT (*(volatile unsigned long*)(VIC_BASE+0x18))
#define VIC_SOFT_INT_CLEAR (*(volatile unsigned long*)(VIC_BASE+0x1C))
#define VIC_PROTECTION (*(volatile unsigned long*)(VIC_BASE+0x20))
#define VIC_VECT_ADDR (*(volatile unsigned long*)(VIC_BASE+0x30))
#define VIC_DEF_VECT_ADDR (*(volatile unsigned long*)(VIC_BASE+0x34))
/* Interrupts */
#define INTERRUPT_WATCHDOG (1<<0)
#define INTERRUPT_TIMER1 (1<<1)
#define INTERRUPT_TIMER2 (1<<2)
#define INTERRUPT_USB (1<<3)
#define INTERRUPT_DMAC (1<<4)
#define INTERRUPT_NAND (1<<5)
#define INTERRUPT_IDE (1<<6)
#define INTERRUPT_MCI0 (1<<1<<7)
#define INTERRUPT_MCI1 (1<<8)
#define INTERRUPT_AUDIO (1<<9)
#define INTERRUPT_SSP (1<<10)
#define INTERRUPT_I2C_MS (1<<11)
#define INTERRUPT_I2C_AUDIO (1<<12)
#define INTERRUPT_I2SIN (1<<13)
#define INTERRUPT_I2SOUT (1<<14)
#define INTERRUPT_UART (1<<15)
#define INTERRUPT_GPIOD (1<<16)
/* 17 reserved */
#define INTERRUPT_CGU (1<<18)
#define INTERRUPT_MEMORY_STICK (1<<19)
#define INTERRUPT_DBOP (1<<20)
/* 21-28 reserved */
#define INTERRUPT_GPIOA (1<<29)
#define INTERRUPT_GPIOB (1<<30)
#define INTERRUPT_GPIOC (1<<31)
#endif /*__AS3525_H__*/

View file

@ -87,10 +87,12 @@ static const char * const irqname[] =
static void UIRQ(void)
{
/* TODO
unsigned int offset = INTOFFSET;
panicf("Unhandled IRQ %02X: %s", offset, irqname[offset]);
*/
unsigned int irq_no = 0;
int status = VIC_IRQ_STATUS;
while((status >>= 1))
irq_no++;
panicf("Unhandled IRQ %02X: %s", irq_no, irqname[irq_no]);
}
void irq_handler(void)
@ -102,16 +104,12 @@ void irq_handler(void)
asm volatile( "stmfd sp!, {r0-r7, ip, lr} \n" /* Store context */
"sub sp, sp, #8 \n"); /* Reserve stack */
/* TODO */
#if 0
int irq_no = INTOFFSET; /* Read clears the corresponding IRQ status */
#else
int irq_no = 69;
#endif
if ((irq_no & (1<<31)) == 0) /* Ensure invalid flag is not set */
{
unsigned int irq_no = 0;
int status = VIC_IRQ_STATUS;
while((status >>= 1))
irq_no++;
irqvector[irq_no]();
}
asm volatile( "add sp, sp, #8 \n" /* Cleanup stack */
"ldmfd sp!, {r0-r7, ip, lr} \n" /* Restore context */
@ -228,6 +226,12 @@ void system_init(void)
sdram_init();
CGU_PERI |= (5<<2)|0x01; /* pclk = PLLA / 6 = 64 MHz */
#if 0 /* we don't use interrupts at the moment */
/* enable VIC */
CGU_PERI |= CGU_VIC_CLOCK_ENABLE;
VIC_INT_SELECT = 0; /* only IRQ, no FIQ */
#endif
}
void system_reboot(void)