static void mask_and_ack_dma_irq(unsigned int irq) { unsigned int intc_irq; if ( irq < (IRQ_DMA_0 + HALF_DMA_NUM) ) /* DMAC Group 0 irq */ intc_irq = IRQ_DMAC0; else if ( irq < (IRQ_DMA_0 + MAX_DMA_NUM) ) /* DMAC Group 1 irq */ intc_irq = IRQ_DMAC1; else { printk("%s, unexpected dma irq #%d\n", __FILE__, irq); return ; } __intc_ack_irq(intc_irq); __dmac_channel_ack_irq(irq-IRQ_DMA_0); /* needed?? add 20080506, Wolfgang */ __dmac_channel_disable_irq(irq - IRQ_DMA_0); }
//////////////////////////////////////////////////// // 功能: 利用DMA播放数据 // 输入: // 输出: // 返回: // 说明: //////////////////////////////////////////////////// static int intr_handler_playback_dma(int arg) { int group,channle; unsigned int stat,dmac; //清除DMA标记 #ifdef KPRINTF_DEF kprintf("play music interrupt happend\n"); #endif channle = arg - IRQ_DMA_0; group = (arg - IRQ_DMA_0) / HALF_DMA_NUM; __dmac_channel_ack_irq( group , channle - group * HALF_DMA_NUM ); stat = INREG32(A_DMA_DCS(channle)); dmac = INREG32(A_DMA_DMAC(group)); #ifdef KPRINTF_DEF if( stat & DCS_AR ) kprintf("dcs addr error\n"); if( stat & DCS_HLT) kprintf("dcs halt error\n"); if( dmac & DMAC_ADDR_ERR ) kprintf("dmac addr error\n"); if( dmac & DMAC_HALT ) kprintf("dmac halt error\n"); #endif if (stat & DCS_TT) { CLRREG32(A_DMA_DMAC(group), (DMAC_ADDR_ERR | DMAC_HALT) ); CLRREG32(A_DMA_DCS(channle), (DCS_AR | DCS_HLT | DCS_CTE | DCS_CT | DCS_TT)); DacClearPcmData(); //清空PCM数据 interrupt_count++; } else kdebug(mod_media, PRINT_INFO, "stat & DCS_TT == 0\n"); return INT_DONE; }