freemyipod r266 - Code Review

Jump to: navigation, search
Repository:freemyipod
Revision:r265‎ | r266 | r267 >
Date:16:23, 22 November 2010
Author:theseven
Status:new
Tags:
Comment:
emBIOS: DMA interrupt handling for iPod Nano 4G
Modified paths:
  • /embios/trunk/target/ipodnano4g/interrupt.c (modified) (history)

Diff [purge]

Index: embios/trunk/target/ipodnano4g/interrupt.c
@@ -51,8 +51,22 @@
5252 default_interrupt(INT_IRQ13);
5353 default_interrupt(INT_IRQ14);
5454 default_interrupt(INT_IRQ15);
55 -default_interrupt(INT_IRQ16);
56 -default_interrupt(INT_IRQ17);
 55+default_interrupt(INT_DMAC0C0);
 56+default_interrupt(INT_DMAC0C1);
 57+default_interrupt(INT_DMAC0C2);
 58+default_interrupt(INT_DMAC0C3);
 59+default_interrupt(INT_DMAC0C4);
 60+default_interrupt(INT_DMAC0C5);
 61+default_interrupt(INT_DMAC0C6);
 62+default_interrupt(INT_DMAC0C7);
 63+default_interrupt(INT_DMAC1C0);
 64+default_interrupt(INT_DMAC1C1);
 65+default_interrupt(INT_DMAC1C2);
 66+default_interrupt(INT_DMAC1C3);
 67+default_interrupt(INT_DMAC1C4);
 68+default_interrupt(INT_DMAC1C5);
 69+default_interrupt(INT_DMAC1C6);
 70+default_interrupt(INT_DMAC1C7);
5771 default_interrupt(INT_IRQ18);
5872 default_interrupt(INT_USB_FUNC);
5973 default_interrupt(INT_IRQ20);
@@ -127,11 +141,45 @@
128142 if (THCON & 0x00038000) timervector[7]();
129143 }
130144
 145+static void (* dmavector[])(void) IDATA_ATTR =
 146+{
 147+ INT_DMAC0C0,INT_DMAC0C1,INT_DMAC0C2,INT_DMAC0C3,INT_DMAC0C4,INT_DMAC0C5,INT_DMAC0C6,INT_DMAC0C7,
 148+ INT_DMAC1C0,INT_DMAC1C1,INT_DMAC1C2,INT_DMAC1C3,INT_DMAC1C4,INT_DMAC1C5,INT_DMAC1C6,INT_DMAC1C7
 149+};
 150+
 151+void INT_DMAC0(void) ICODE_ATTR;
 152+void INT_DMAC0()
 153+{
 154+ uint32_t intsts = DMAC0INTSTS;
 155+ if (intsts & 1) dmavector[0]();
 156+ if (intsts & 2) dmavector[1]();
 157+ if (intsts & 4) dmavector[2]();
 158+ if (intsts & 8) dmavector[3]();
 159+ if (intsts & 0x10) dmavector[4]();
 160+ if (intsts & 0x20) dmavector[5]();
 161+ if (intsts & 0x40) dmavector[6]();
 162+ if (intsts & 0x80) dmavector[7]();
 163+}
 164+
 165+void INT_DMAC1(void) ICODE_ATTR;
 166+void INT_DMAC1()
 167+{
 168+ uint32_t intsts = DMAC1INTSTS;
 169+ if (intsts & 1) dmavector[8]();
 170+ if (intsts & 2) dmavector[9]();
 171+ if (intsts & 4) dmavector[10]();
 172+ if (intsts & 8) dmavector[11]();
 173+ if (intsts & 0x10) dmavector[12]();
 174+ if (intsts & 0x20) dmavector[13]();
 175+ if (intsts & 0x40) dmavector[14]();
 176+ if (intsts & 0x80) dmavector[15]();
 177+}
 178+
131179 static void (* irqvector[])(void) IDATA_ATTR =
132180 {
133181 INT_IRQ0,INT_IRQ1,INT_IRQ2,INT_IRQ3,INT_IRQ4,INT_IRQ5,INT_IRQ6,INT_IRQ7,
134182 INT_TIMER,INT_IRQ9,INT_IRQ10,INT_IRQ11,INT_IRQ12,INT_IRQ13,INT_IRQ14,INT_IRQ15,
135 - INT_IRQ16,INT_IRQ17,INT_IRQ18,INT_USB_FUNC,INT_IRQ20,INT_IRQ21,INT_IRQ22,INT_IRQ23,
 183+ INT_DMAC0,INT_DMAC1,INT_IRQ18,INT_USB_FUNC,INT_IRQ20,INT_IRQ21,INT_IRQ22,INT_IRQ23,
136184 INT_IRQ24,INT_IRQ25,INT_IRQ26,INT_IRQ27,INT_IRQ28,INT_IRQ29,INT_IRQ30,INT_IRQ31,
137185 INT_IRQ32,INT_IRQ33,INT_IRQ34,INT_IRQ35,INT_IRQ36,INT_IRQ37,INT_IRQ38,INT_IRQ39,
138186 INT_IRQ40,INT_IRQ41,INT_IRQ42,INT_IRQ43,INT_IRQ55,INT_IRQ56,INT_IRQ57,INT_IRQ58,
@@ -175,13 +223,13 @@
176224
177225 void int_dma_set_handler(int channel, void* handler)
178226 {
179 - (void)channel;
180 - (void)handler;
 227+ if (handler) dmavector[channel] = handler;
 228+ else dmavector[channel] = unhandled_irq;
181229 }
182230
183231 void interrupt_init(void)
184232 {
185 - VIC0INTENABLE = 1 << IRQ_TIMER;
 233+ VIC0INTENABLE = (1 << IRQ_TIMER) || (1 << IRQ_DMAC0) || (1 << IRQ_DMAC1);
186234 }
187235
188236 void interrupt_shutdown(void)