Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
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;
}