Subversion Repositories freemyipod

Rev

Rev 15 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 15 Rev 85
Line 76... Line 76...
76
void unhandled_irq(void)
76
void unhandled_irq(void)
77
{
77
{
78
    panicf(PANIC_FATAL, "Unhandled IRQ %d!", INTOFFSET);
78
    panicf(PANIC_FATAL, "Unhandled IRQ %d!", INTOFFSET);
79
}
79
}
80
 
80
 
81
static void (* const timervector[])(void) IDATA_ATTR =
81
static void (* timervector[])(void) IDATA_ATTR =
82
{
82
{
83
    INT_TIMERA,INT_TIMERB,INT_TIMERC,INT_TIMERD
83
    INT_TIMERA,INT_TIMERB,INT_TIMERC,INT_TIMERD
84
};
84
};
85
 
85
 
86
void INT_TIMER(void) ICODE_ATTR;
86
void INT_TIMER(void) ICODE_ATTR;
Line 111... Line 111...
111
    if (dmaallst2 & (DMACON6 >> 8) & 0x300) dmavector[6]();
111
    if (dmaallst2 & (DMACON6 >> 8) & 0x300) dmavector[6]();
112
    if (dmaallst2 & (DMACON7 >> 4) & 0x3000) dmavector[7]();
112
    if (dmaallst2 & (DMACON7 >> 4) & 0x3000) dmavector[7]();
113
    if (dmaallst2 & DMACON8 & 0x30000) dmavector[8]();
113
    if (dmaallst2 & DMACON8 & 0x30000) dmavector[8]();
114
}
114
}
115
 
115
 
116
static void (* const irqvector[])(void) IDATA_ATTR =
116
static void (* irqvector[])(void) IDATA_ATTR =
117
{
117
{
118
    EXT0,EXT1,EXT2,EINT_VBUS,EINTG,INT_TIMER,INT_WDT,INT_UNK1,
118
    EXT0,EXT1,EXT2,EINT_VBUS,EINTG,INT_TIMER,INT_WDT,INT_UNK1,
119
    INT_UNK2,INT_UNK3,INT_DMA,INT_ALARM_RTC,INT_PRI_RTC,RESERVED1,INT_UART,INT_USB_HOST,
119
    INT_UNK2,INT_UNK3,INT_DMA,INT_ALARM_RTC,INT_PRI_RTC,RESERVED1,INT_UART,INT_USB_HOST,
120
    INT_USB_FUNC,INT_LCDC_0,INT_LCDC_1,INT_CALM,INT_ATA,INT_UART0,INT_SPDIF_OUT,INT_ECC,
120
    INT_USB_FUNC,INT_LCDC_0,INT_LCDC_1,INT_CALM,INT_ATA,INT_UART0,INT_SPDIF_OUT,INT_ECC,
121
    INT_SDCI,INT_LCD,INT_SPI,INT_IIC,RESERVED2,INT_MSTICK,INT_ADC_WAKEUP,INT_ADC
121
    INT_SDCI,INT_LCD,INT_SPI,INT_IIC,RESERVED2,INT_MSTICK,INT_ADC_WAKEUP,INT_ADC
Line 127... Line 127...
127
    irqvector[irq_no]();
127
    irqvector[irq_no]();
128
    SRCPND = (1 << irq_no);
128
    SRCPND = (1 << irq_no);
129
    INTPND = INTPND;
129
    INTPND = INTPND;
130
}
130
}
131
 
131
 
-
 
132
void interrupt_enable(int irq, bool state)
-
 
133
{
-
 
134
	if (state) INTMSK |= 1 << irq;
-
 
135
	else INTMSK &= ~(1 << irq);
-
 
136
}
-
 
137
 
-
 
138
void interrupt_set_handler(int irq, void* handler)
-
 
139
{
-
 
140
	if (handler) irqvector[irq] = handler;
-
 
141
	else irqvector[irq] = unhandled_irq;
-
 
142
}
-
 
143
 
-
 
144
void int_timer_set_handler(int timer, void* handler)
-
 
145
{
-
 
146
	if (handler) timervector[timer] = handler;
-
 
147
	else timervector[timer] = unhandled_irq;
-
 
148
}
-
 
149
 
132
void interrupt_init(void)
150
void interrupt_init(void)
133
{
151
{
134
    INTMSK = INTMSK_TIMER | INTMSK_DMA;
152
    INTMSK = (1 << IRQ_TIMER) | (1 << IRQ_DMA);
135
}
153
}