Hi, all
I want to transport multichannels audio using mcbsp5 tdm function, and am confused by the following codes in function mcbsp_ConfigTDMTxChannels:
for (nCount= 0; nCount < pDevice->numOfTxChannels; nCount++)
{
switch ((pDevice->requestedTxChannels[nCount]) / MAX_CHANNEL_PER_BLOCK)
{
case kMcBSP_Block0:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block0 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERA);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERA, regVal);
break;
case kMcBSP_Block1:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block1 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERB);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERB, regVal);
break;
case kMcBSP_Block2:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block2 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERC);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERC, regVal);
break;
case kMcBSP_Block3:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block3 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERD);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERD, regVal);
break;
case kMcBSP_Block4:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block4 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERE);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERE, regVal);
break;
case kMcBSP_Block5:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block5 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERF);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERF, regVal);
break;
case kMcBSP_Block6:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block6 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERG);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERG, regVal);
break;
case kMcBSP_Block7:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block7 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERH);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERH, regVal);
break;
default:
DEBUGMSG(ZONE_ERROR, (L"MCP: ERROR: mcbsp_ConfigTDMTxChannels: "
L"Invalid Channel Request\r\n"
));
break;
}
}
As the definition below,
typedef enum
{
kMcBSP_Block0 = 0,
kMcBSP_Block1 = 16,
kMcBSP_Block2 = 32,
kMcBSP_Block3 = 48,
kMcBSP_Block4 = 64,
kMcBSP_Block5 = 80,
kMcBSP_Block6 = 96,
kMcBSP_Block7 = 112,
} McBSPMultiChannelBlock_e;
1,,,,,,,,) I think it is wrong in switch case struction, as it nolonger switch to other cases but kMcBSP_Block0 = 0, am I right?
Maybe, we can write as below:
case kMcBSP_Block0/ kMcBSP_Block1:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block0 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERA);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERA, regVal);
break;
case kMcBSP_Block1/ kMcBSP_Block1:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block1 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERB);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERB, regVal);
break;
case kMcBSP_Block2/ kMcBSP_Block1:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block2 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERC);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERC, regVal);
break;
case kMcBSP_Block3/ kMcBSP_Block1:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block3 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERD);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERD, regVal);
break;
case kMcBSP_Block4/ kMcBSP_Block1:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block4 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERE);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERE, regVal);
break;
case kMcBSP_Block5/ kMcBSP_Block1:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block5 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERF);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERF, regVal);
break;
case kMcBSP_Block6/ kMcBSP_Block1:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block6 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERG);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERG, regVal);
break;
case kMcBSP_Block7/ kMcBSP_Block1:
channelToEnable = pDevice->requestedTxChannels[nCount] %
(kMcBSP_Block7 + MAX_CHANNEL_PER_BLOCK);
regVal = INREG32(&pDevice->pMcbspRegs->XCERH);
regVal |= (1<<channelToEnable);
OUTREG32(&pDevice->pMcbspRegs->XCERH, regVal);
break;
default:
DEBUGMSG(ZONE_ERROR, (L"MCP: ERROR: mcbsp_ConfigTDMTxChannels: "
L"Invalid Channel Request\r\n"
));
break;