关于S3C6410的IIS音频驱动问题

时间:2021-05-21 12:22:10
最近在调试音频接口,准备用IIS接口替换原来的AC97接口。

在音频数据时,总是在如下函数里出现错误,导致音频流不能输出。
BOOL
HardwareContext::StartOutputDMA()
{
    ULONG OutputTransferred;

    WAV_MSG((_T("[WAV] StartOutputDMA()\r\n")));

    if((m_bOutputDMARunning == FALSE) && (m_Dx == D0))
    {
        m_bOutputDMARunning = TRUE;
        m_nOutByte[OUTPUT_DMA_BUFFER0] = 0;
        m_nOutByte[OUTPUT_DMA_BUFFER1] = 0;

        m_nOutputBufferInUse = OUTPUT_DMA_BUFFER0;    // Start DMA with Buffer 0
        m_OutputDMAStatus = (DMA_DONEA | DMA_DONEB) & ~DMA_BIU;
        OutputTransferred = TransferOutputBuffer(m_OutputDMAStatus);

        if(OutputTransferred)
        {
            CodecPowerControl();                    // Turn Output Channel
            CodecMuteControl(DMA_CH_OUT, FALSE);    // Unmute Output Channel

            // IIS PCM output enable
            IIS_set_tx_mode_control(IIS_TRANSFER_NOPAUSE);

            // Output DMA Start
            DMA_set_channel_source(&g_OutputDMA, m_OutputDMABufferPhyPage[OUTPUT_DMA_BUFFER0], WORD_UNIT, BURST_1, INCREASE);
            DMA_set_channel_destination(&g_OutputDMA, IIS_get_output_physical_buffer_address(IIS_CH_2), WORD_UNIT, BURST_1, FIXED);
            DMA_set_channel_transfer_size(&g_OutputDMA, AUDIO_DMA_PAGE_SIZE);
            DMA_set_initial_LLI(&g_OutputDMA, 1);
            DMA_channel_start(&g_OutputDMA);

            IIS_set_active_on();
        }
        else
        {
            WAV_ERR((_T("[WAV:ERR] StartOutputDMA() : There is no data to transfer\r\n")));
            m_bOutputDMARunning = FALSE;
        }
    }
    else
    {
     //StopOutputDMA(); //20100703 xiehb
        //WAV_ERR((_T("[WAV:ERR] StartOutputDMA() : Output DMA is already running or m_Dx[%d] is not D0\r\n"), m_Dx));
        WAV_ERR((_T("[WAV:ERR] m_Dx[%d]\r\n"), m_Dx));
        return FALSE;
    }

    return TRUE;
}

这个函数里,发送一次音频数据后,m_bOutputDMARunning = TRUE; 如果没有停止播放,则m_bOutputDMARunning 一直不能=FALSE了,以后的数据都不能发送了。
    由于对IIS驱动不熟悉,不知是何原因造成这样的,这个有谁曾经碰到过呢?

另:6410的IIS驱动中,如何设置本机的IIS驱动为从模式,设备为主模式?这个模式设置一直都没有找到在哪里设置.
我希望将它设置为从模式。

6 个解决方案

#1


 改过IIS的不过没你那么深入,只是吧把原来的通道2改成通道0,因为我管脚接的是通道0,改完后能正常播放声音就不去管了

#2


问题不在m_bOutputDMARunning 这里,问题是在void HardwareContext::InterruptThread()中,你要实现在I2S 传输时的中断,当BUFA传输完成后需要产生中断在void HardwareContext::InterruptThread()函数中去实现BUFA和bufB数据的后续填写。

#3


友情帮顶。

#4


路过学习中。。。

#5


学习中。。。

#6


你的问题搞定了的吧。结贴啊,gate

#1


 改过IIS的不过没你那么深入,只是吧把原来的通道2改成通道0,因为我管脚接的是通道0,改完后能正常播放声音就不去管了

#2


问题不在m_bOutputDMARunning 这里,问题是在void HardwareContext::InterruptThread()中,你要实现在I2S 传输时的中断,当BUFA传输完成后需要产生中断在void HardwareContext::InterruptThread()函数中去实现BUFA和bufB数据的后续填写。

#3


友情帮顶。

#4


路过学习中。。。

#5


学习中。。。

#6


你的问题搞定了的吧。结贴啊,gate