/* Audio Recording*/ MV_STATUS mvAudioRecordControlSet(int unit, MV_AUDIO_RECORD_CTRL *ctrl) { MV_AUDIO_DEC_WIN audioWin; MV_CPU_DEC_WIN cpuWin; MV_ADDR_WIN bufAddrWin; MV_U32 target; MV_U32 reg; if (ctrl->monoChannel > AUDIO_REC_RIGHT_MONO) { mvOsPrintf("mvAudioRecordControlSet: Error ,illegal monoChannel %x\n", ctrl->monoChannel ); return MV_FAIL; } if ((ctrl->burst != AUDIO_32BYTE_BURST) && (ctrl->burst != AUDIO_128BYTE_BURST)) { mvOsPrintf("mvAudioRecordControlSet: Error ,illegal burst %x\n", ctrl->burst ); return MV_FAIL; } if (ctrl->bufferPhyBase & (MV_AUDIO_BUFFER_MIN_ALIGN - 1)) { mvOsPrintf("mvAudioRecordControlSet: Error ,bufferPhyBase is not"\ "\n aligned to 0x%x bytes\n",MV_AUDIO_BUFFER_MIN_ALIGN ); return MV_FAIL; } if ((ctrl->bufferSize <= audioBurstBytesNumGet(ctrl->burst))|| (ctrl->bufferSize & (audioBurstBytesNumGet(ctrl->burst) - 1))|| (ctrl->bufferSize > AUDIO_REG_TO_SIZE(APBBCR_SIZE_MAX)) ) { mvOsPrintf("mvAudioRecordControlSet: Error, bufferSize smaller"\ "\nthan or not multiple of 0x%x bytes or larger than"\ "\n 0x%x", audioBurstBytesNumGet(ctrl->burst), AUDIO_REG_TO_SIZE(APBBCR_SIZE_MAX)); return MV_FAIL; } reg = MV_REG_READ(MV_AUDIO_RECORD_CTRL_REG(unit)); reg &= ~(ARCR_RECORD_BURST_SIZE_MASK|ARCR_RECORDED_MONO_CHNL_MASK| ARCR_RECORD_SAMPLE_SIZE_MASK); switch (ctrl->sampleSize) { case SAMPLE_16BIT: case SAMPLE_16BIT_NON_COMPACT: case SAMPLE_20BIT: case SAMPLE_24BIT: case SAMPLE_32BIT: reg |= ctrl->sampleSize << ARCR_RECORD_SAMPLE_SIZE_OFFS; break; default: mvOsPrintf("mvAudioRecordControlSet: Error ,illegal sampleSize %x\n", ctrl->sampleSize ); return MV_FAIL; } reg |= ctrl->burst << ARCR_RECORD_BURST_SIZE_OFFS; reg |= ctrl->monoChannel << ARCR_RECORDED_MONO_CHNL_OFFS; MV_REG_WRITE(MV_AUDIO_RECORD_CTRL_REG(unit), reg); if (ctrl->mono) { MV_REG_BIT_SET (MV_AUDIO_RECORD_CTRL_REG(unit), ARCR_RECORD_MONO_MASK); } else { MV_REG_BIT_RESET (MV_AUDIO_RECORD_CTRL_REG(unit), ARCR_RECORD_MONO_MASK); } /* Get the details of the Record address window*/ if( mvAudioWinGet( MV_AUDIO_RECORD_WIN_NUM, &audioWin ) != MV_OK ) { mvOsPrintf("mvAudioRecordControlSet: Error calling mvAudioWinGet on win %d\n", MV_AUDIO_RECORD_WIN_NUM); return MV_FAIL; } bufAddrWin.baseHigh = 0; bufAddrWin.baseLow = ctrl->bufferPhyBase; bufAddrWin.size = ctrl->bufferSize; /* If Record window is not enabled or buffer address is not within window boundries then try to set a new value to the Record window by Geting the target of where the buffer exist, if the buffer is within the window of the new target then set the Record window to that target else return Fail */ if((audioWin.enable != MV_TRUE) || (MV_TRUE != ctrlWinWithinWinTest(&bufAddrWin, &audioWin.addrWin))) { /* Get the target of the buffer that user require*/ target = mvCpuIfTargetOfBaseAddressGet(ctrl->bufferPhyBase); if (MAX_TARGETS == target) { mvOsPrintf("mvAudioRecordControlSet: Error calling mvAudioWinGet on address 0x%x\n", ctrl->bufferPhyBase); return MV_FAIL; } /* Get the window details of this target*/ if (MV_OK != mvCpuIfTargetWinGet(target, &cpuWin)) { mvOsPrintf("mvAudioRecordControlSet: Error calling mvCpuIfTargetWinGet on target %d\n", target); return MV_FAIL; } /* if the address window of the target is enabled and te user buffer is within that target address window then set the palyback\recording window to the target window */ if((cpuWin.enable == MV_TRUE) && (MV_TRUE == ctrlWinWithinWinTest(&bufAddrWin, &cpuWin.addrWin))) { audioWin.addrWin.baseHigh = cpuWin.addrWin.baseHigh; audioWin.addrWin.baseLow = cpuWin.addrWin.baseLow; audioWin.addrWin.size = cpuWin.addrWin.size; audioWin.enable = cpuWin.enable; audioWin.target = target; if( mvAudioWinSet( MV_AUDIO_RECORD_WIN_NUM, &audioWin ) != MV_OK ) { mvOsPrintf("mvAudioRecordControlSet: Error calling mvAudioWinGet on win %d\n", MV_AUDIO_RECORD_WIN_NUM); return MV_FAIL; } } else { mvOsPrintf("mvAudioRecordControlSet: Error buffer is not within a valid target\n"); return MV_FAIL; } } /* Set the interrupt byte count. */ reg = ctrl->intByteCount & ARBCI_BYTE_COUNT_MASK; MV_REG_WRITE(MV_AUDIO_RECORD_BYTE_CNTR_INT_REG(unit), reg); MV_REG_WRITE(MV_AUDIO_RECORD_START_ADDR_REG(unit), ctrl->bufferPhyBase); MV_REG_WRITE(MV_AUDIO_RECORD_BUFF_SIZE_REG(unit), AUDIO_SIZE_TO_REG(ctrl->bufferSize)); return MV_OK; }
/******************************************************************************* * mvAudioPlaybackControlSet - Set Playback general parameters * * DESCRIPTION: * * INPUT: * ctrl: pointer to MV_AUDIO_PLAYBACK_CTRL structure * OUTPUT: * None * RETURN: * MV_OK on success , MV_FAIL on fail * *******************************************************************************/ MV_STATUS mvAudioPlaybackControlSet(int unit, MV_AUDIO_PLAYBACK_CTRL *ctrl) { MV_U32 reg; if (ctrl->monoMode >= AUDIO_PLAY_OTHER_MONO) { mvOsPrintf("mvAudioPlaybackControlSet: Error ,illegal monoMode %x\n", ctrl->monoMode ); return MV_FAIL; } if ((ctrl->burst != AUDIO_32BYTE_BURST) && (ctrl->burst != AUDIO_128BYTE_BURST)) { mvOsPrintf("mvAudioPlaybackControlSet: Error ,illegal burst %x\n", ctrl->burst ); return MV_FAIL; } if (ctrl->bufferPhyBase & (MV_AUDIO_BUFFER_MIN_ALIGN - 1)) { mvOsPrintf("mvAudioPlaybackControlSet: Error ,bufferPhyBase is not"\ "\n aligned to 0x%x bytes\n",MV_AUDIO_BUFFER_MIN_ALIGN ); return MV_FAIL; } if ((ctrl->bufferSize <= audioBurstBytesNumGet(ctrl->burst))|| (ctrl->bufferSize & (audioBurstBytesNumGet(ctrl->burst) - 1))|| (ctrl->bufferSize > AUDIO_REG_TO_SIZE(APBBCR_SIZE_MAX)) ) { mvOsPrintf("mvAudioPlaybackControlSet: Error, bufferSize smaller"\ "\nthan or not multiple of 0x%x bytes or larger than"\ "\n 0x%x", audioBurstBytesNumGet(ctrl->burst), AUDIO_REG_TO_SIZE(APBBCR_SIZE_MAX)); return MV_FAIL; } reg = MV_REG_READ(MV_AUDIO_PLAYBACK_CTRL_REG(unit)); reg &= ~(APCR_PLAY_BURST_SIZE_MASK|APCR_LOOPBACK_MASK|APCR_PLAY_MONO_MASK | APCR_PLAY_SAMPLE_SIZE_MASK | APCR_PLAY_PAUSE_MASK | APCR_PLAY_SPDIF_MUTE_MASK | APCR_PLAY_I2S_MUTE_MASK); reg |= ctrl->burst << APCR_PLAY_BURST_SIZE_OFFS; reg |= ctrl->loopBack << APCR_LOOPBACK_OFFS; reg |= ctrl->monoMode << APCR_PLAY_MONO_OFFS; reg |= ctrl->sampleSize << APCR_PLAY_SAMPLE_SIZE_OFFS; MV_REG_WRITE(MV_AUDIO_PLAYBACK_CTRL_REG(unit), reg); #ifndef MV_AUDIO_SKIP_WIN_DECODING if(mvAudioReplaceAddrWin(unit, MV_AUDIO_PLAYBACK_WIN_NUM, ctrl->bufferPhyBase, ctrl->bufferSize) != MV_OK) { mvOsPrintf("mvAudioRecordControlSet: Failed to replace address decoding window.\n"); return MV_FAIL; } #endif /* Set the interrupt byte count. */ reg = ctrl->intByteCount & APBCI_BYTE_COUNT_MASK; MV_REG_WRITE(MV_AUDIO_PLAYBACK_BYTE_CNTR_INT_REG(unit), reg); MV_REG_WRITE(MV_AUDIO_PLAYBACK_BUFF_START_REG(unit), ctrl->bufferPhyBase); MV_REG_WRITE(MV_AUDIO_PLAYBACK_BUFF_SIZE_REG(unit), AUDIO_SIZE_TO_REG(ctrl->bufferSize)); return MV_OK; }
/* Audio Recording*/ MV_STATUS mvAudioRecordControlSet(int unit, MV_AUDIO_RECORD_CTRL *ctrl) { MV_U32 reg; if (ctrl->monoChannel > AUDIO_REC_RIGHT_MONO) { mvOsPrintf("mvAudioRecordControlSet: Error ,illegal monoChannel %x\n", ctrl->monoChannel ); return MV_FAIL; } if ((ctrl->burst != AUDIO_32BYTE_BURST) && (ctrl->burst != AUDIO_128BYTE_BURST)) { mvOsPrintf("mvAudioRecordControlSet: Error ,illegal burst %x\n", ctrl->burst ); return MV_FAIL; } if (ctrl->bufferPhyBase & (MV_AUDIO_BUFFER_MIN_ALIGN - 1)) { mvOsPrintf("mvAudioRecordControlSet: Error ,bufferPhyBase is not"\ "\n aligned to 0x%x bytes\n",MV_AUDIO_BUFFER_MIN_ALIGN ); return MV_FAIL; } if ((ctrl->bufferSize <= audioBurstBytesNumGet(ctrl->burst))|| (ctrl->bufferSize & (audioBurstBytesNumGet(ctrl->burst) - 1))|| (ctrl->bufferSize > AUDIO_REG_TO_SIZE(APBBCR_SIZE_MAX)) ) { mvOsPrintf("mvAudioRecordControlSet: Error, bufferSize smaller"\ "\nthan or not multiple of 0x%x bytes or larger than"\ "\n 0x%x", audioBurstBytesNumGet(ctrl->burst), AUDIO_REG_TO_SIZE(APBBCR_SIZE_MAX)); return MV_FAIL; } reg = MV_REG_READ(MV_AUDIO_RECORD_CTRL_REG(unit)); reg &= ~(ARCR_RECORD_BURST_SIZE_MASK|ARCR_RECORDED_MONO_CHNL_MASK| ARCR_RECORD_SAMPLE_SIZE_MASK); switch (ctrl->sampleSize) { case SAMPLE_16BIT: case SAMPLE_16BIT_NON_COMPACT: case SAMPLE_20BIT: case SAMPLE_24BIT: case SAMPLE_32BIT: reg |= ctrl->sampleSize << ARCR_RECORD_SAMPLE_SIZE_OFFS; break; default: mvOsPrintf("mvAudioRecordControlSet: Error ,illegal sampleSize %x\n", ctrl->sampleSize ); return MV_FAIL; } reg |= ctrl->burst << ARCR_RECORD_BURST_SIZE_OFFS; reg |= ctrl->monoChannel << ARCR_RECORDED_MONO_CHNL_OFFS; MV_REG_WRITE(MV_AUDIO_RECORD_CTRL_REG(unit), reg); if (ctrl->mono) { MV_REG_BIT_SET (MV_AUDIO_RECORD_CTRL_REG(unit), ARCR_RECORD_MONO_MASK); } else { MV_REG_BIT_RESET (MV_AUDIO_RECORD_CTRL_REG(unit), ARCR_RECORD_MONO_MASK); } #ifndef MV_AUDIO_SKIP_WIN_DECODING if(mvAudioReplaceAddrWin(unit, MV_AUDIO_RECORD_WIN_NUM, ctrl->bufferPhyBase, ctrl->bufferSize) != MV_OK) { mvOsPrintf("mvAudioRecordControlSet: Failed to replace address decoding window.\n"); return MV_FAIL; } #endif /* Set the interrupt byte count. */ reg = ctrl->intByteCount & ARBCI_BYTE_COUNT_MASK; MV_REG_WRITE(MV_AUDIO_RECORD_BYTE_CNTR_INT_REG(unit), reg); MV_REG_WRITE(MV_AUDIO_RECORD_START_ADDR_REG(unit), ctrl->bufferPhyBase); MV_REG_WRITE(MV_AUDIO_RECORD_BUFF_SIZE_REG(unit), AUDIO_SIZE_TO_REG(ctrl->bufferSize)); return MV_OK; }
/******************************************************************************* * mvAudioPlaybackControlSet - Set Playback general parameters * * DESCRIPTION: * * INPUT: * ctrl: pointer to MV_AUDIO_PLAYBACK_CTRL structure * OUTPUT: * None * RETURN: * MV_OK on success , MV_FAIL on fail * *******************************************************************************/ MV_STATUS mvAudioPlaybackControlSet(MV_AUDIO_PLAYBACK_CTRL *ctrl) { MV_AUDIO_DEC_WIN audioWin; MV_CPU_DEC_WIN cpuWin; MV_ADDR_WIN bufAddrWin; MV_U32 target; MV_U32 reg; if (ctrl->monoMode >= AUDIO_PLAY_OTHER_MONO) { mvOsPrintf("mvAudioPlaybackControlSet: Error ,illegal monoMode %x\n", ctrl->monoMode ); return MV_FAIL; } if ((ctrl->burst != AUDIO_32BYTE_BURST) && (ctrl->burst != AUDIO_128BYTE_BURST)) { mvOsPrintf("mvAudioPlaybackControlSet: Error ,illegal burst %x\n", ctrl->burst ); return MV_FAIL; } if (ctrl->bufferPhyBase & (MV_AUDIO_BUFFER_MIN_ALIGN - 1)) { mvOsPrintf("mvAudioPlaybackControlSet: Error ,bufferPhyBase is not"\ "\n aligned to 0x%x bytes\n",MV_AUDIO_BUFFER_MIN_ALIGN ); return MV_FAIL; } if ((ctrl->bufferSize <= audioBurstBytesNumGet(ctrl->burst))|| (ctrl->bufferSize & (audioBurstBytesNumGet(ctrl->burst) - 1))|| (ctrl->bufferSize > AUDIO_REG_TO_SIZE(APBBCR_SIZE_MAX)) ) { mvOsPrintf("mvAudioPlaybackControlSet: Error, bufferSize smaller"\ "\nthan or not multiple of 0x%x bytes or larger than"\ "\n 0x%x", audioBurstBytesNumGet(ctrl->burst), AUDIO_REG_TO_SIZE(APBBCR_SIZE_MAX)); return MV_FAIL; } reg = MV_REG_READ(MV_AUDIO_PLAYBACK_CTRL_REG); reg &= ~(APCR_PLAY_BURST_SIZE_MASK|APCR_LOOPBACK_MASK|APCR_PLAY_MONO_MASK | APCR_PLAY_SAMPLE_SIZE_MASK); reg |= ctrl->burst << APCR_PLAY_BURST_SIZE_OFFS; reg |= ctrl->loopBack << APCR_LOOPBACK_OFFS; reg |= ctrl->monoMode << APCR_PLAY_MONO_OFFS; reg |= ctrl->sampleSize << APCR_PLAY_SAMPLE_SIZE_OFFS; MV_REG_WRITE(MV_AUDIO_PLAYBACK_CTRL_REG, reg); /* Get the details of the Playback address window*/ if( mvAudioWinGet( MV_AUDIO_PLAYBACK_WIN_NUM, &audioWin ) != MV_OK ) { mvOsPrintf("mvAudioPlaybackControlSet: Error calling mvAudioWinGet on win %d\n", MV_AUDIO_PLAYBACK_WIN_NUM); return MV_FAIL; } bufAddrWin.baseHigh = 0; bufAddrWin.baseLow = ctrl->bufferPhyBase; bufAddrWin.size = ctrl->bufferSize; /* If Playback window is not enabled or buffer address is not within window boundries then try to set a new value to the Playback window by Geting the target of where the buffer exist, if the buffer is within the window of the new target then set the Playback window to that target else return Fail */ if((audioWin.enable != MV_TRUE) || (MV_TRUE != ctrlWinWithinWinTest(&bufAddrWin, &audioWin.addrWin))) { /* Get the target of the buffer that user require*/ target = mvCpuIfTargetOfBaseAddressGet(ctrl->bufferPhyBase); if (MAX_TARGETS == target) { mvOsPrintf("mvCpuIfTargetOfBaseAddressGet: Error calling mvAudioWinGet on address 0x%x\n", ctrl->bufferPhyBase); return MV_FAIL; } /* Get the window details of this target*/ if (MV_OK != mvCpuIfTargetWinGet(target, &cpuWin)) { mvOsPrintf("mvAudioPlaybackControlSet: Error calling mvCpuIfTargetWinGet on target %d\n", target); return MV_FAIL; } /* if the address window of the target is enabled and te user buffer is within that target address window then set the palyback\recording window to the target window */ if((cpuWin.enable == MV_TRUE) && (MV_TRUE == ctrlWinWithinWinTest(&bufAddrWin, &cpuWin.addrWin))) { audioWin.addrWin.baseHigh = cpuWin.addrWin.baseHigh; audioWin.addrWin.baseLow = cpuWin.addrWin.baseLow; audioWin.addrWin.size = cpuWin.addrWin.size; audioWin.enable = cpuWin.enable; audioWin.target = target; if( mvAudioWinSet( MV_AUDIO_PLAYBACK_WIN_NUM, &audioWin ) != MV_OK ) { mvOsPrintf("mvAudioPlaybackControlSet: Error calling mvAudioWinGet on win %d\n", MV_AUDIO_PLAYBACK_WIN_NUM); return MV_FAIL; } } else { mvOsPrintf("mvAudioPlaybackControlSet: Error buffer is not within a valid target\n"); return MV_FAIL; } } /* Set the interrupt byte count. */ reg = ctrl->intByteCount & APBCI_BYTE_COUNT_MASK; MV_REG_WRITE(MV_AUDIO_PLAYBACK_BYTE_CNTR_INT_REG, reg); MV_REG_WRITE(MV_AUDIO_PLAYBACK_BUFF_START_REG, ctrl->bufferPhyBase); MV_REG_WRITE(MV_AUDIO_PLAYBACK_BUFF_SIZE_REG, AUDIO_SIZE_TO_REG(ctrl->bufferSize)); return MV_OK; }