| Index: embios/trunk/target/ipodnano4g/interrupt.c | 
| — | — | @@ -51,8 +51,22 @@ | 
| 52 | 52 |  default_interrupt(INT_IRQ13);
 | 
| 53 | 53 |  default_interrupt(INT_IRQ14);
 | 
| 54 | 54 |  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);
 | 
| 57 | 71 |  default_interrupt(INT_IRQ18);
 | 
| 58 | 72 |  default_interrupt(INT_USB_FUNC);
 | 
| 59 | 73 |  default_interrupt(INT_IRQ20);
 | 
| — | — | @@ -127,11 +141,45 @@ | 
| 128 | 142 |      if (THCON & 0x00038000) timervector[7]();
 | 
| 129 | 143 |  }
 | 
| 130 | 144 |  
 | 
|   | 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 | +
 | 
| 131 | 179 |  static void (* irqvector[])(void) IDATA_ATTR =
 | 
| 132 | 180 |  {
 | 
| 133 | 181 |      INT_IRQ0,INT_IRQ1,INT_IRQ2,INT_IRQ3,INT_IRQ4,INT_IRQ5,INT_IRQ6,INT_IRQ7,
 | 
| 134 | 182 |      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,
 | 
| 136 | 184 |      INT_IRQ24,INT_IRQ25,INT_IRQ26,INT_IRQ27,INT_IRQ28,INT_IRQ29,INT_IRQ30,INT_IRQ31,
 | 
| 137 | 185 |      INT_IRQ32,INT_IRQ33,INT_IRQ34,INT_IRQ35,INT_IRQ36,INT_IRQ37,INT_IRQ38,INT_IRQ39,
 | 
| 138 | 186 |      INT_IRQ40,INT_IRQ41,INT_IRQ42,INT_IRQ43,INT_IRQ55,INT_IRQ56,INT_IRQ57,INT_IRQ58,
 | 
| — | — | @@ -175,13 +223,13 @@ | 
| 176 | 224 |  
 | 
| 177 | 225 |  void int_dma_set_handler(int channel, void* handler)
 | 
| 178 | 226 |  {
 | 
| 179 |   | -    (void)channel;
 | 
| 180 |   | -    (void)handler;
 | 
|   | 227 | +    if (handler) dmavector[channel] = handler;
 | 
|   | 228 | +    else dmavector[channel] = unhandled_irq;
 | 
| 181 | 229 |  }
 | 
| 182 | 230 |  
 | 
| 183 | 231 |  void interrupt_init(void)
 | 
| 184 | 232 |  {
 | 
| 185 |   | -    VIC0INTENABLE = 1 << IRQ_TIMER;
 | 
|   | 233 | +    VIC0INTENABLE = (1 << IRQ_TIMER) || (1 << IRQ_DMAC0) || (1 << IRQ_DMAC1);
 | 
| 186 | 234 |  }
 | 
| 187 | 235 |  
 | 
| 188 | 236 |  void interrupt_shutdown(void)
 |