📄 main.c
字号:
Uint32 frameLen = vcpParameters->frameLen;
Uint32 constLen = vcpParameters->constLen;
Uint32 rate = vcpParameters->rate;
Uint32 symx = vcpParameters->bmBuffLen;
Uint32 symr = vcpParameters->decBuffLen;
Uint32 decision = vcpParameters->decision;
Uint32 traceBack = vcpParameters->traceBack;
Uint32 numBm, length, elCount, numFrames;
Uint32 *decAddr;
/* Completely reset the EDMA */
EDMA_resetAll();
/* Configure CPU interrupts */
intConfig();
/* Allocate transfer completion code */
tcc = EDMA_intAlloc(-1);
/* Calculate the VCP IC values */
VCP_genIc(vcpParameters, &configIc);
/* Open handles to the EDMA channels */
hEdmaRevt = EDMA_open(EDMA_CHA_VCPREVT, EDMA_OPEN_RESET);
hEdmaXevt = EDMA_open(EDMA_CHA_VCPXEVT, EDMA_OPEN_RESET);
EDMA_allocTableEx(1, &hEdmaBrMet);
EDMA_allocTableEx(1, &hEdmaOutPar);
EDMA_allocTableEx(1, &hEdmaNull);
EDMA_reset(hEdmaNull);
/* Configure channel parameters for IC registers */
edmaConfig.opt = EDMA_OPT_RMK(EDMA_OPT_PRI_LOW, EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO, EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_NO, EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_NO, EDMA_OPT_TCC_DEFAULT,
EDMA_OPT_TCCM_DEFAULT, EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE,
EDMA_OPT_PDTD_DISABLE, EDMA_OPT_LINK_YES,
EDMA_OPT_FS_YES);
edmaConfig.src = (Uint32)&configIc;
edmaConfig.cnt = (Uint32)NB_32BITWORD_INPUT_PARAMS;
edmaConfig.dst = (Uint32)VCP_ICMEM_ADDR;
edmaConfig.idx = 0;
edmaConfig.rld = 0;
EDMA_config(hEdmaXevt, &edmaConfig);
EDMA_link(hEdmaXevt, hEdmaBrMet);
/* Configure channel parameters for branch metrics data */
numBm = 1 << (rate - 1); /* number of Branch Metrics */
length = frameLen + constLen - 1; /* calculate the frame length */
numFrames = VCP_normalCeil(length, 4 * symx);/* number of sub frames */
length = VCP_ceil(length, 2)<<2; /* Find frame length used */
if (symx < length) elCount = symx * numBm; /* Select the smaller count*/
else elCount = length * numBm; /* symbols per evt or framelen*/
edmaConfig.opt = EDMA_OPT_RMK(EDMA_OPT_PRI_LOW, EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO, EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_NO, EDMA_OPT_DUM_NONE,
EDMA_OPT_TCINT_NO, EDMA_OPT_TCC_DEFAULT,
EDMA_OPT_TCCM_DEFAULT, EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE,
EDMA_OPT_PDTD_DISABLE, EDMA_OPT_LINK_YES,
EDMA_OPT_FS_YES);
edmaConfig.src = (Uint32)userData;
edmaConfig.cnt = EDMA_CNT_RMK(numFrames - 1, elCount);
edmaConfig.dst = (Uint32)VCP_BMMEM_ADDR;
EDMA_config(hEdmaBrMet, &edmaConfig);
EDMA_link(hEdmaBrMet, hEdmaNull);
/* Configure channel parameters for decision data */
if ((decision == VCP_DECISION_HARD) && (traceBack == VCP_TRACEBACK_TAILED)){
edmaConfig.opt = EDMA_OPT_RMK(EDMA_OPT_PRI_LOW, EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO, EDMA_OPT_SUM_NONE,
EDMA_OPT_2DD_NO, EDMA_OPT_DUM_DEC,
EDMA_OPT_TCINT_NO, EDMA_OPT_TCC_DEFAULT,
EDMA_OPT_TCCM_DEFAULT, EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE,
EDMA_OPT_PDTD_DISABLE, EDMA_OPT_LINK_YES,
EDMA_OPT_FS_YES);
if (64 * symr < frameLen) elCount = 64 * symr;
else elCount = frameLen;
elCount = 2 * VCP_ceil(elCount, 6);
numFrames = VCP_normalCeil(frameLen, 64 * symr);
} /* end if Hard decisions */
else if ((decision == VCP_DECISION_HARD) && !(traceBack == VCP_TRACEBACK_TAILED)){
edmaConfig.opt = EDMA_OPT_RMK(EDMA_OPT_PRI_LOW, EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO, EDMA_OPT_SUM_NONE,
EDMA_OPT_2DD_NO, EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_NO, EDMA_OPT_TCC_DEFAULT,
EDMA_OPT_TCCM_DEFAULT, EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE,
EDMA_OPT_PDTD_DISABLE, EDMA_OPT_LINK_YES,
EDMA_OPT_FS_YES);
if (64 * symr < frameLen) elCount = 64 * symr;
else elCount = frameLen;
elCount = 2 * VCP_ceil(elCount, 6);
numFrames = VCP_normalCeil(frameLen, 64 * symr);
} /* end if Hard decisions */
else if (traceBack == VCP_TRACEBACK_TAILED) { /* Soft Dec and Tailed TB */
edmaConfig.opt = EDMA_OPT_RMK(EDMA_OPT_PRI_LOW, EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO, EDMA_OPT_SUM_NONE,
EDMA_OPT_2DD_NO, EDMA_OPT_DUM_DEC,
EDMA_OPT_TCINT_NO, EDMA_OPT_TCC_DEFAULT,
EDMA_OPT_TCCM_DEFAULT, EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE,
EDMA_OPT_PDTD_DISABLE, EDMA_OPT_LINK_YES,
EDMA_OPT_FS_YES);
if (symr < frameLen) elCount = 4 * symr;
else elCount = frameLen;
elCount = 2 * VCP_ceil(elCount, 2);
numFrames = VCP_normalCeil(frameLen, 4 * symr);
} /* end if Soft decisions and tailed traceback mode */
else { /* Soft Dec and either convergent or mixed traceback */
edmaConfig.opt = EDMA_OPT_RMK(EDMA_OPT_PRI_LOW, EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO, EDMA_OPT_SUM_NONE,
EDMA_OPT_2DD_NO, EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_NO, EDMA_OPT_TCC_DEFAULT,
EDMA_OPT_TCCM_DEFAULT, EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE,
EDMA_OPT_PDTD_DISABLE, EDMA_OPT_LINK_YES,
EDMA_OPT_FS_YES);
elCount = 2 * symr;
numFrames = VCP_normalCeil(frameLen, 4 * symr);
} /* end else if Soft decisions and convergent or mixed traceback */
*numDec = numFrames * elCount;
*decisions = (Uint32 *)memalign(2 * sizeof(Uint32), *numDec * sizeof(Uint32));
decAddr = *decisions;
if (traceBack == VCP_TRACEBACK_TAILED){
decAddr = &decAddr[*numDec - 1];
if((decision == VCP_DECISION_HARD) && (frameLen > 1024)) {
*decisions = decAddr - ((VCP_ceil(frameLen, 6)) << 1) + 1;
} /* end if VCP_DECISION_HARD */
else if ((decision == VCP_DECISION_SOFT) && (frameLen > 64)) {
*decisions = decAddr - ((VCP_ceil(frameLen, 2)) << 1) + 1;
} /* end if VCP_DECISION_SOFT */
} /* end if VCP_TRACEBACK_TAILED) */
edmaConfig.src = (Uint32)VCP_HDMEM_ADDR;
edmaConfig.cnt = EDMA_CNT_RMK(numFrames - 1, elCount);
edmaConfig.dst = (Uint32)decAddr;
EDMA_config(hEdmaRevt, &edmaConfig);
EDMA_link(hEdmaRevt, hEdmaOutPar);
/* Configure channel parameters for VCP output parameters */
*outParms = (Uint32 *)memalign(2 * sizeof(Uint32),
NB_32BITWORD_OUTPUT_PARAMS * sizeof(Uint32));
edmaConfig.opt = EDMA_OPT_RMK(EDMA_OPT_PRI_LOW, EDMA_OPT_ESIZE_32BIT,
EDMA_OPT_2DS_NO, EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_NO, EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_YES, EDMA_OPT_TCC_OF(tcc),
EDMA_OPT_TCCM_DEFAULT, EDMA_OPT_ATCINT_NO,
EDMA_OPT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE,
EDMA_OPT_PDTD_DISABLE, EDMA_OPT_LINK_YES,
EDMA_OPT_FS_YES);
edmaConfig.src = (Uint32)VCP_OPMEM_ADDR;
edmaConfig.cnt = (Uint32)NB_32BITWORD_OUTPUT_PARAMS;
edmaConfig.dst = (Uint32)*outParms;
EDMA_config(hEdmaOutPar, &edmaConfig);
EDMA_link(hEdmaOutPar, hEdmaNull);
/* Enable the TCC to generate a CPU interrupt */
EDMA_intEnable(tcc);
/* Enable the transmit and receive channels */
EDMA_enableChannel(hEdmaRevt);
EDMA_enableChannel(hEdmaXevt);
} /* end submitEdma() */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -