?? vportcap.c
字號:
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,
&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通道
{
Int32 YEvent, UEvent, VEvent;
/* get channelA Y, U, V EDMA event numbers,選擇觸發事件 */
switch(portNumber)
{
/*確定相應的DMA通路*/
case VP_DEV0:
YEvent = EDMA_CHA_VP0EVTYB;
UEvent = EDMA_CHA_VP0EVTUB;
VEvent = EDMA_CHA_VP0EVTVB;
break;
case VP_DEV1:
YEvent = EDMA_CHA_VP1EVTYB;
UEvent = EDMA_CHA_VP1EVTUB;
VEvent = EDMA_CHA_VP1EVTVB;
break;
case VP_DEV2:
YEvent = EDMA_CHA_VP2EVTYB;
UEvent = EDMA_CHA_VP2EVTUB;
VEvent = EDMA_CHA_VP2EVTVB;
break;
}
/* Configure Y EDMA channel to move data from YSRCA */
/* (FIFO) to Y.data buffer, capChaAYSpace */
configVPCapEDMAChannel( &hEdmaVPCapChaAYb, YEvent,
&edmaCapChaAYTccNum,
vpCaptureHandle->ysrcbAddr,
(Uint32)capChaAYSpace,
VCB_Y_EDMA_FRMCNT,
VCB_Y_EDMA_ELECNT);
/* Configure Cb EDMA channel to move data from CbSRCA */
/* (FIFO) to Cb.data buffer, capChaACbSpace */
configVPCapEDMAChannel( &hEdmaVPCapChaACbb, UEvent,
&edmaCapChaACbTccNum,
vpCaptureHandle->cbsrcbAddr,
(Uint32)capChaACbSpace,
VCB_Y_EDMA_FRMCNT,
VCB_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( &hEdmaVPCapChaACrb, VEvent,
&edmaCapChaACrTccNum,
vpCaptureHandle->crsrcbAddr,
(Uint32)capChaACrSpace,
VCB_Y_EDMA_FRMCNT,
VCB_Y_EDMA_ELECNT/2); /* (1/2) of Y.samples */
/* Enable three EDMA channels */
EDMA_enableChannel(hEdmaVPCapChaAYb);
EDMA_enableChannel(hEdmaVPCapChaACbb);
EDMA_enableChannel(hEdmaVPCapChaACrb);
}
/*................................................................ */
/* 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)
{
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_YES, /* 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))
);
EDMA_configArgs(
hEdmaTable,/*配置表的句柄*/
EDMA_OPT_RMK(0x00, /* medium priority 設置優先級為中*/
0x00, /* Element size 32 bits 元素的長度為4個Byte*/
0x00, /* 1.dimensional source(FIFO) 源采用固定的方試*/
0x00, /* fixed src address mode(FIFO) 源地址不變*/
0x00, /* 2.dimensional destination 目的采用2維空間的組成*/
0x00, /* destination increment 目的采用增長的方式*/
0x00, /* Enable transfer complete indication,使能傳送結束指示*/
0x00,/*設置完成標志CIP0的低位*/
0x00,/*設置完成標志CIP0的高位*/
0x00, /* Disable Alternate Transfers 禁止交替傳送 */
EDMA_OPT_ATCC_OF(0),/* Complete Interrupt 未使用交替完標志 */
0x00, /* disable PDT(peripheral device transfer) mode for source */
0x00, /* disable PDT mode for dest */
0x00, /* Disable linking */
0x00), /* Array synchronization 陣列同步*/
EDMA_SRC_RMK(0x00),/*源地址*/
EDMA_CNT_RMK(EDMA_CNT_FRMCNT_OF((0x00)),/*陳列的行數*/
EDMA_CNT_ELECNT_OF(0x00)),/*每行的像素數*/
EDMA_DST_RMK(0x00),/*目的地址*/
EDMA_IDX_RMK(EDMA_IDX_FRMIDX_OF((0x00)),/*每行的增量*/
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 + -