This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

error in mcbsp_ConfigTDMTxChannels() in mcbsp driver??

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;