⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vportcap.c

📁 基于DM642
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
		capChaAOverrun++;
		VP_FSETH(vpCaptureHandle, VPIS, COVRA,VP_VPIS_COVRA_CLEAR);
	}
	if(vpis & _VP_VPIS_SERRA_MASK) /* synchronization error */
	{
		capChaASyncError++;
		VP_FSETH(vpCaptureHandle, VPIS, SERRA,VP_VPIS_SERRA_CLEAR);
	}
	if(vpis & _VP_VPIS_SFDA_MASK) /* short field detect */
	{
		capChaAShortFieldDetect++;
		VP_FSETH(vpCaptureHandle, VPIS, SFDA, VP_VPIS_SFDA_CLEAR);
	}
	if(vpis & _VP_VPIS_LFDA_MASK) /* long field detect */
	{
		capChaALongFieldDetect++;
		VP_FSETH(vpCaptureHandle, VPIS, LFDA, VP_VPIS_LFDA_CLEAR);
	}
}



interrupt void cap2(void)
{
    if(WV==0)
    {
    Uint32 vpis = 0;   
	/* Get video port status register value */
	vpis = VP_RGETH(vpCaptureHandle, VPIS);
	if(vpis & _VP_VPIS_CCMPA_MASK) /* capture complete */
	{
		/* Clear frame complete bit in VCX_CTL to continue capture in non-continuous mode*/
		VP_FSETH(vpCaptureHandle, VCASTAT, FRMC,VP_VCASTAT_FRMC_CLEAR);
		/* Clear CCMPA to enable next frame complete interrupts*/
		VP_FSETH(vpCaptureHandle, VPIS, CCMPA,VP_VPIS_CCMPA_CLEAR);
		capChaAFrameCount++; /* increment captured frame count */
		capNewFrame2 = 1;
	}
	if(vpis & _VP_VPIS_COVRA_MASK) /* overrun error */
	{
		capChaAOverrun++;
		VP_FSETH(vpCaptureHandle, VPIS, COVRA,VP_VPIS_COVRA_CLEAR);
	}
	if(vpis & _VP_VPIS_SERRA_MASK) /* synchronization error */
	{
		capChaASyncError++;
		VP_FSETH(vpCaptureHandle, VPIS, SERRA,VP_VPIS_SERRA_CLEAR);
	}
	if(vpis & _VP_VPIS_SFDA_MASK) /* short field detect */
	{
		capChaAShortFieldDetect++;
		VP_FSETH(vpCaptureHandle, VPIS, SFDA, VP_VPIS_SFDA_CLEAR);
	}
	if(vpis & _VP_VPIS_LFDA_MASK) /* long field detect */
	{
		capChaALongFieldDetect++;
		VP_FSETH(vpCaptureHandle, VPIS, LFDA, VP_VPIS_LFDA_CLEAR);
	}
	}
	if(WV==1)
	{
	Uint32 vpis = 0;
	/* Get video port status register value */
	vpis = VP_RGETH(vpCaptureHandle, VPIS);
	if(vpis & _VP_VPIS_CCMPB_MASK) /* capture complete */
	{
		/* Clear frame complete bit in VCX_CTL to continue capture in non-continuous mode*/
		VP_FSETH(vpCaptureHandle, VCBSTAT, FRMC,VP_VCBSTAT_FRMC_CLEAR);
		/* Clear CCMPA to enable next frame complete interrupts*/
		VP_FSETH(vpCaptureHandle, VPIS, CCMPB,VP_VPIS_CCMPA_CLEAR);
		capChaAFrameCount++; /* increment captured frame count */
		capNewFrame3 = 1;
	}
	if(vpis & _VP_VPIS_COVRB_MASK) /* overrun error */
	{
		capChaAOverrun++;
		VP_FSETH(vpCaptureHandle, VPIS, COVRB,VP_VPIS_COVRB_CLEAR);
	}
	if(vpis & _VP_VPIS_SERRA_MASK) /* synchronization error */
	{
		capChaASyncError++;
		VP_FSETH(vpCaptureHandle, VPIS, SERRB,VP_VPIS_SERRB_CLEAR);
	}
	if(vpis & _VP_VPIS_SFDA_MASK) /* short field detect */
	{
		capChaAShortFieldDetect++;
		VP_FSETH(vpCaptureHandle, VPIS, SFDB, VP_VPIS_SFDB_CLEAR);
	}
	if(vpis & _VP_VPIS_LFDA_MASK) /* long field detect */
	{
		capChaALongFieldDetect++;
		VP_FSETH(vpCaptureHandle, VPIS, LFDB, VP_VPIS_LFDB_CLEAR);
	}
	}
}





/*................................................................ */
/* Function : setupVPCapChaAEDMA(Int32 portNumber) */
/* Input(s) : portNumber, video port number i.e. 0, 1 or 2. */
/* Description : Sets up EDMA channels for Y, U, V events for */
/* channel A capture. */
/*功能描述:将为Y,U,V建立EDMA的通路*/
/*................................................................ */
void setupVPCapChaAEDMA0(int portNumber)//初始化VP0视频口的B通路对应的DMA通道
{
	Int32 YEvent, UEvent, VEvent;
	/* get channelA Y, U, V EDMA event numbers,选择触发事件 */
	switch(portNumber)
	{
		/*确定相应的DMA通路*/
		case VP_DEV0: 
			YEvent = EDMA_CHA_VP0EVTYA;
			UEvent = EDMA_CHA_VP0EVTUA;
			VEvent = EDMA_CHA_VP0EVTVA;
			break;
		case VP_DEV1: 
			YEvent = EDMA_CHA_VP1EVTYA;
			UEvent = EDMA_CHA_VP1EVTUA;
			VEvent = EDMA_CHA_VP1EVTVA;
			break;
		case VP_DEV2: 
			YEvent = EDMA_CHA_VP2EVTYA;
			UEvent = EDMA_CHA_VP2EVTUA;
			VEvent = EDMA_CHA_VP2EVTVA;
			break;
	}
	/* Configure Y EDMA channel to move data from YSRCA */
	/* (FIFO) to Y.data buffer, capChaAYSpace */
	configVPCapEDMAChannel( &hEdmaVPCapChaAY, YEvent,
							&edmaCapChaAYTccNum,
							vpCaptureHandle->ysrcaAddr,
							(Uint32)capChaAYSpace,
							VCA_Y_EDMA_FRMCNT,
							VCA_Y_EDMA_ELECNT);
	/* Configure Cb EDMA channel to move data from CbSRCA */
	/* (FIFO) to Cb.data buffer, capChaACbSpace */
	configVPCapEDMAChannel( &hEdmaVPCapChaACb, UEvent,
							&edmaCapChaACbTccNum,
							vpCaptureHandle->cbsrcaAddr,
							(Uint32)capChaACbSpace,
							VCA_Y_EDMA_FRMCNT,
							VCA_Y_EDMA_ELECNT/2); /* (1/2) of Y.samples */
	/* Configure Cr EDMA channel to move data from CrSRCA */
	/* (FIFO) to Cr.data buffer, capChaACrSpace */
	configVPCapEDMAChannel( &hEdmaVPCapChaACr, VEvent,
							&edmaCapChaACrTccNum,
							vpCaptureHandle->crsrcaAddr,
							(Uint32)capChaACrSpace,
							VCA_Y_EDMA_FRMCNT,
							VCA_Y_EDMA_ELECNT/2); /* (1/2) of Y.samples */
	/* Enable three EDMA channels */
	EDMA_enableChannel(hEdmaVPCapChaAY);
	EDMA_enableChannel(hEdmaVPCapChaACb);
	EDMA_enableChannel(hEdmaVPCapChaACr);
}
void setupVPCapChaAEDMA1(int portNumber)//初始化VP1视频口的B通路对应的DMA通道
{
	Int32 YEvent, UEvent, VEvent;
	/* get channelA Y, U, V EDMA event numbers,选择触发事件 */
	switch(portNumber)
	{
		/*确定相应的DMA通路*/
		case VP_DEV0: 
			YEvent = EDMA_CHA_VP0EVTYA;
			UEvent = EDMA_CHA_VP0EVTUA;
			VEvent = EDMA_CHA_VP0EVTVA;
			break;
		case VP_DEV1: 
			YEvent = EDMA_CHA_VP1EVTYA;
			UEvent = EDMA_CHA_VP1EVTUA;
			VEvent = EDMA_CHA_VP1EVTVA;
			break;
		case VP_DEV2: 
			YEvent = EDMA_CHA_VP2EVTYA;
			UEvent = EDMA_CHA_VP2EVTUA;
			VEvent = EDMA_CHA_VP2EVTVA;
			break;
	}
	/* Configure Y EDMA channel to move data from YSRCA */
	/* (FIFO) to Y.data buffer, capChaAYSpace */
	configVPCapEDMAChannel( &hEdmaVPCapChaAY1, YEvent,
							&edmaCapChaAYTccNum,
							vpCaptureHandle->ysrcaAddr,
							(Uint32)capChaAYSpace,
							VCA_Y_EDMA_FRMCNT,
							VCA_Y_EDMA_ELECNT);
	/* Configure Cb EDMA channel to move data from CbSRCA */
	/* (FIFO) to Cb.data buffer, capChaACbSpace */
	configVPCapEDMAChannel( &hEdmaVPCapChaACb1, UEvent,
							&edmaCapChaACbTccNum,
							vpCaptureHandle->cbsrcaAddr,
							(Uint32)capChaACbSpace,
							VCA_Y_EDMA_FRMCNT,
							VCA_Y_EDMA_ELECNT/2); /* (1/2) of Y.samples */
	/* Configure Cr EDMA channel to move data from CrSRCA */
	/* (FIFO) to Cr.data buffer, capChaACrSpace */
	configVPCapEDMAChannel( &hEdmaVPCapChaACr1, VEvent,
							&edmaCapChaACrTccNum,
							vpCaptureHandle->crsrcaAddr,
							(Uint32)capChaACrSpace,
							VCA_Y_EDMA_FRMCNT,
							VCA_Y_EDMA_ELECNT/2); /* (1/2) of Y.samples */
	/* Enable three EDMA channels */
	EDMA_enableChannel(hEdmaVPCapChaAY1);
	EDMA_enableChannel(hEdmaVPCapChaACb1);
	EDMA_enableChannel(hEdmaVPCapChaACr1);
}


void setupVPCapChaAEDMA2(int portNumber)//初始化VP2视频口的A通路对应的DMA通道
{
	Int32 YEvent, UEvent, VEvent;
	/* get channelA Y, U, V EDMA event numbers,选择触发事件 */
	switch(portNumber)
	{
		/*确定相应的DMA通路*/
		case VP_DEV0: 
			YEvent = EDMA_CHA_VP0EVTYA;
			UEvent = EDMA_CHA_VP0EVTUA;
			VEvent = EDMA_CHA_VP0EVTVA;
			break;
		case VP_DEV1: 
			YEvent = EDMA_CHA_VP1EVTYA;
			UEvent = EDMA_CHA_VP1EVTUA;
			VEvent = EDMA_CHA_VP1EVTVA;
			break;
		case VP_DEV2: 
			YEvent = EDMA_CHA_VP2EVTYA;
			UEvent = EDMA_CHA_VP2EVTUA;
			VEvent = EDMA_CHA_VP2EVTVA;
			break;
	}
	/* Configure Y EDMA channel to move data from YSRCA */
	/* (FIFO) to Y.data buffer, capChaAYSpace */
	configVPCapEDMAChannel( &hEdmaVPCapChaAY2, YEvent,			//handle,....
							&edmaCapChaAYTccNum,
							vpCaptureHandle->ysrcaAddr,
							(Uint32)capChaAYSpace,
							VCA_Y_EDMA_FRMCNT,
							VCA_Y_EDMA_ELECNT);
	/* Configure Cb EDMA channel to move data from CbSRCA */
	/* (FIFO) to Cb.data buffer, capChaACbSpace */
	configVPCapEDMAChannel( &hEdmaVPCapChaACb2, UEvent,
							&edmaCapChaACbTccNum,
							vpCaptureHandle->cbsrcaAddr,
							(Uint32)capChaACbSpace,
							VCA_Y_EDMA_FRMCNT,
							VCA_Y_EDMA_ELECNT/2); /* (1/2) of Y.samples */
	/* Configure Cr EDMA channel to move data from CrSRCA */
	/* (FIFO) to Cr.data buffer, capChaACrSpace */
	configVPCapEDMAChannel( &hEdmaVPCapChaACr2, VEvent,
							&edmaCapChaACrTccNum,
							vpCaptureHandle->crsrcaAddr,
							(Uint32)capChaACrSpace,
							VCA_Y_EDMA_FRMCNT,
							VCA_Y_EDMA_ELECNT/2); /* (1/2) of Y.samples */
	/* Enable three EDMA channels */
	EDMA_enableChannel(hEdmaVPCapChaAY2);
	EDMA_enableChannel(hEdmaVPCapChaACb2);
	EDMA_enableChannel(hEdmaVPCapChaACr2);
}


void setupVPCapChaAEDMAb(int portNumber)//初始化VP2视频口的B通路对应的DMA通道
{
	
}
/*................................................................ */
/* Function : configVPCapEDMAChannel */
/* */
/* Input(s) : edmaHandle . pointer to EDMA handle. */
/* eventId . EDMA eventId. */
/* tccNum . pointer to transfer complete number. */
/* srcAddr . source address for EDMA transfer. */
/* dstAddr . destination address for EDMA transfer */
/* frameCount . frame count. */
/* elementCount . element count(32.bit element size). */
/* */
/* Output(s): edmaHandle . edma Handle of the given event. */
/* tccNum . transfer complete code for the given */
/* event. */
/* */
/* Description : Configures the given VP capture EDMA channel. */
/* The source address update is fixed address mode */
/* because the captured data is read from the FIFO. */
/* In this example, the destination address mode is */
/* auto.increment. But, in real.time applications */
/* there is lot of flexibility in the way capture */
/* buffers can be managed like ping.pong and round */
/* robin,…etc. */
/*................................................................ */
void configVPCapEDMAChannel(EDMA_Handle *edmaHandle, 
							Int32 eventId,
							Int32 *tccNum, 
							Uint32 srcAddr,
							Uint32 dstAddr, 
							Uint32 frameCount,
							Uint32 elementCount)
{
	Int32 tcc = 0;
	//EDMA_Handle hEdmaTable;
	/* Open Y EVT EDMA channel */
	if(!ED)
	*edmaHandle = EDMA_open(eventId, EDMA_OPEN_RESET);
	
	if(*edmaHandle == EDMA_HINV)			//cause by not use the EDMA_close()?????????when we get more frame
	{
		for(;;){}
	}	
	/* allocate TCC for Y event */
	
	tcc = 5;
	
	/*打开一个新的EDMA链接*/
	//hEdmaTable = EDMA_allocTable(0);
	/* Configure EDMA parameters */
	EDMA_configArgs(
		*edmaHandle,
		EDMA_OPT_RMK(EDMA_OPT_PRI_MEDIUM, /* medium priority 设置优先级为中*/
					 EDMA_OPT_ESIZE_32BIT, /* Element size 32 bits 元素的长度为4个Byte*/
					 EDMA_OPT_2DS_NO, /* 1.dimensional source(FIFO) 源采用固定的方试*/
					 EDMA_OPT_SUM_NONE, /* fixed src address mode(FIFO) 源地址不变*/
					 EDMA_OPT_2DD_YES, /* 2.dimensional destination 目的采用2维空间的组成*/
					 EDMA_OPT_DUM_INC, /* destination increment 目的采用增长的方式*/
					 EDMA_OPT_TCINT_YES, /* Enable transfer complete indication,使能传送结束指示*/
					 EDMA_OPT_TCC_OF(tcc & 0xF),/*设置完成标志CIP0的低位*/
					 EDMA_OPT_TCCM_OF(((tcc & 0x30) >> 4)),/*设置完成标志CIP0的高位*/
					 EDMA_OPT_ATCINT_NO, /* Disable Alternate Transfers 禁止交替传送 */
					 EDMA_OPT_ATCC_OF(0),/* Complete Interrupt 未使用交替完标志 */
					 EDMA_OPT_PDTS_DISABLE, /* disable PDT(peripheral device transfer) mode for source */
					 EDMA_OPT_PDTD_DISABLE, /* disable PDT mode for dest */
					 EDMA_OPT_LINK_NO, /* Disable linking */
					 EDMA_OPT_FS_NO), /* Array synchronization 阵列同步*/
		EDMA_SRC_RMK(srcAddr),/*源地址*/
		EDMA_CNT_RMK(EDMA_CNT_FRMCNT_OF((frameCount-1)),/*陈列的行数*/
					 EDMA_CNT_ELECNT_OF(elementCount)),/*每行的像素数*/
		EDMA_DST_RMK(dstAddr),/*目的地址*/
		EDMA_IDX_RMK(EDMA_IDX_FRMIDX_OF((elementCount * 4)),/*每行的增量*/
		         	 EDMA_IDX_ELEIDX_OF(0)), /* note: 32-bit element size */
		/* no RLD in 2D and no linking */
		EDMA_RLD_RMK(EDMA_RLD_ELERLD_OF(0), EDMA_RLD_LINK_OF(0))
	);
	
	/*连接两个DMA*/
	//EDMA_link(*edmaHandle,hEdmaTable);
	/*使EDMA循环起来*/
	//EDMA_link(hEdmaTable,hEdmaTable);
	*tccNum = tcc;/*返回中断完成标志*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -