aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/ymu831/mcbdspdrv.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs/ymu831/mcbdspdrv.c')
-rw-r--r--sound/soc/codecs/ymu831/mcbdspdrv.c1965
1 files changed, 1965 insertions, 0 deletions
diff --git a/sound/soc/codecs/ymu831/mcbdspdrv.c b/sound/soc/codecs/ymu831/mcbdspdrv.c
new file mode 100644
index 0000000..e362dd6
--- /dev/null
+++ b/sound/soc/codecs/ymu831/mcbdspdrv.c
@@ -0,0 +1,1965 @@
+/****************************************************************************
+ *
+ * Copyright(c) 2012 Yamaha Corporation. All rights reserved.
+ *
+ * Module : mcbdspdrv.c
+ *
+ * Description : MC Bdsp Driver
+ *
+ * Version : 1.0.0 2012.12.13
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ ****************************************************************************/
+#include "mctypedef.h"
+#include "mcdevif.h"
+#include "mcdefs.h"
+#include "mcresctrl.h"
+#include "mcbdspdrv.h"
+#include "mcservice.h"
+
+
+/* inside definition */
+#define BDSP_STATUS_IDLE (0)
+#define BDSP_STATUS_INITED (1)
+
+#define CHUNK_SIZE (8)
+
+#define AEC_BDSP_TAG_FWCTRL_B (0x00000C00)
+#define FWCTRL_B_SIZE (14)
+#define AEC_BDSP_TAG_APP_COEF (0x00000700)
+#define APP_COEF_FIX_SIZE (9)
+#define AEC_BDSP_TAG_APP_REG (0x00000A00)
+#define APP_REG_FIX_SIZE (8)
+#define AEC_BDSP_TAG_APP_MASK (0xFFFFFF00)
+#define AEC_BDSP_TAG_APPNO_MASK (0x000000FF)
+
+#define FWCTRL_B_BYPASS (0)
+#define FWCTRL_B_AE0_BYP (1)
+#define FWCTRL_B_AE1_BYP (2)
+#define FWCTRL_B_WIDE (3)
+#define FWCTRL_B_HEX (4)
+#define FWCTRL_B_EQ3_0A (5)
+#define FWCTRL_B_DRC3 (6)
+#define FWCTRL_B_DRC_0 (7)
+#define FWCTRL_B_EQ3_0B (8)
+#define FWCTRL_B_GEN (9)
+#define FWCTRL_B_EQ3_1A (10)
+#define FWCTRL_B_AGC (11)
+#define FWCTRL_B_DRC_1 (12)
+#define FWCTRL_B_EQ3_1B (13)
+
+#define APP_NO_GEN 0
+#define APP_NO_SWAP_0 1
+#define APP_NO_WIDE 2
+#define APP_NO_HEX 3
+#define APP_NO_EQ3_0A 4
+#define APP_NO_DRC3 5
+#define APP_NO_DRC_0 6
+#define APP_NO_EQ3_0B 7
+#define APP_NO_MIX_0 8
+#define APP_NO_SWAP_1 9
+#define APP_NO_EQ3_1A 10
+#define APP_NO_AGC 11
+#define APP_NO_DRC_1 12
+#define APP_NO_EQ3_1B 13
+#define APP_NO_MIX_1 14
+
+#define APP_COEF_ADR (0)
+#define APP_COEF_SIZE (5)
+#define APP_COEF_DATA (9)
+
+#define APP_REG_FLG (0)
+#define APP_REG_FLG_FWCTL0 (0x01)
+#define APP_REG_FLG_FWCTL1 (0x02)
+#define APP_REG_FLG_FWCTL2 (0x04)
+#define APP_REG_FLG_FWCTL3 (0x08)
+#define APP_REG_FLG_FWCTL4 (0x10)
+#define APP_REG_FLG_FWCTL5 (0x20)
+#define APP_REG_FLG_FWCTL6 (0x40)
+#define APP_REG_FWCTL0 (1)
+#define APP_REG_FWCTL1 (2)
+#define APP_REG_FWCTL2 (3)
+#define APP_REG_FWCTL3 (4)
+#define APP_REG_FWCTL4 (5)
+#define APP_REG_FWCTL5 (6)
+#define APP_REG_FWCTL6 (7)
+
+#define COEF_DMA_TRANS (0)
+#define COEF_DSP_TRANS (1)
+#define COEF_DSP_TRANS_MAX (40)
+
+#define TARGET_NONE (0x00000000)
+#define TARGET_AE0_MASK (0x00003F00)
+#define TARGET_AE0_EQ3_0B (0x00002000)
+#define TARGET_AE0_DRC_0 (0x00001000)
+#define TARGET_AE0_DRC3 (0x00000800)
+#define TARGET_AE0_EQ3_0A (0x00000400)
+#define TARGET_AE0_HEX (0x00000200)
+#define TARGET_AE0_WIDE (0x00000100)
+#define TARGET_AE1_MASK (0x0000003C)
+#define TARGET_AE1_EQ3_1B (0x00000020)
+#define TARGET_AE1_DRC_1 (0x00000010)
+#define TARGET_AE1_AGC (0x00000008)
+#define TARGET_AE1_EQ3_1A (0x00000004)
+#define TARGET_GEN_MASK (0x00008000)
+#define TARGET_GEN_GEN (0x00008000)
+#define TARGET_BASE_MASK (0xF0000000)
+#define TARGET_BASE_SWAP_0 (0x10000000)
+#define TARGET_BASE_SWAP_1 (0x20000000)
+#define TARGET_BASE_MIX_0 (0x40000000)
+#define TARGET_BASE_MIX_1 (0x80000000)
+
+#define REG_APP_NO_STOP (0)
+#define REG_APP_STOP (1)
+
+#define MULTI_CHUNK_APP_COEF (1)
+#define MULTI_CHUNK_APP_REG (2)
+
+#define RAM_UNIT_SIZE_32 (4UL)
+#define RAM_UNIT_SIZE_64 (8UL)
+#define DXRAM_RANGE_MIN (0x0UL)
+#define DXRAM_RANGE_MAX (0x017FUL)
+#define DYRAM_RANGE_MIN (0x0UL)
+#define DYRAM_RANGE_MAX (0x01FFUL)
+
+#define WAIT_NONE (0x00)
+#define CROSS_FADE_WAIT (0x01)
+#define SIN_OUT_WAIT (0x02)
+
+#define BDSP_PATH_NORMAL (0)
+#define BDSP_PATH_BYPASS (1)
+#define BDSP_PATH_DONTCARE (2)
+
+#define BDSP_BYPASS_FADE_TIME (10000)
+
+#define BDSP_SIN_CTRL_REG (0)
+#define BDSP_SIN_CTRL_GPIO (1)
+
+#define GEN_SIN_CTL_SEL_ADD (0x001D9)
+
+/* inside Struct */
+
+struct MCDRV_BDSP_AEC_BDSP_INFO {
+ UINT8 bBDspOnOff;
+ UINT8 *pbChunkData;
+ UINT32 dwSize;
+ UINT8 *pbFwctrlB;
+ UINT8 bAe0AppOnOff;
+ UINT8 bAe1AppOnOff;
+ UINT8 bAppGen;
+ UINT32 dAppCoefCnt;
+ UINT8 bCoefTrans;
+ UINT32 dCoefTarget;
+ UINT8 bSinCtrlSel;
+ UINT32 dAppRegCnt;
+ UINT32 dRegAppStopTarget;
+ UINT8 bStoppedAppExec0;
+ UINT8 bStoppedAppExec1;
+ UINT8 bStoppedSinOut;
+ UINT8 bStoppedBypass;
+};
+
+struct MCDRV_BDSP_INFO {
+ /* state */
+ UINT32 dStatus;
+ UINT8 bDSPBypass;
+ UINT8 bSinCtrlSel;
+ /* register */
+ UINT8 bDSPCtl;
+ UINT8 bAppExec0;
+ UINT8 bAppExec1;
+ UINT8 bAEBypass;
+};
+
+static struct MCDRV_BDSP_INFO gsBdspInfo = {
+ BDSP_STATUS_IDLE,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00
+};
+
+/****************************************************************************
+ * CreateUINT32
+ *
+ * Description:
+ * Create UINT32 Value
+ * Arguments:
+ * b0 31-24bit value
+ * b1 23-16bit value
+ * b2 15-8bit value
+ * b3 7-0bit value
+ * Return:
+ * UINT32 Value
+ *
+ ****************************************************************************/
+static UINT32 CreateUINT32(UINT8 b0, UINT8 b1, UINT8 b2, UINT8 b3)
+{
+ return ((UINT32)b0 << 24) | ((UINT32)b1 << 16)
+ | ((UINT32)b2 << 8) | (UINT32)b3;
+}
+
+/***************************************************************************
+ * GetBDSPChunk
+ *
+ * Function:
+ * Get BDSP chunk
+ * Arguments:
+ * pbPrm MCDRV_AEC_INFO structure pointer
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void GetBDSPChunk(struct MCDRV_AEC_INFO *psPrm,
+ struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ psBdspInfo->bBDspOnOff = BDSP_OFF;
+ psBdspInfo->pbChunkData = NULL;
+ psBdspInfo->dwSize = 0;
+
+ if (psPrm->sAecAudioengine.bEnable == AEC_AUDIOENGINE_ENABLE) {
+ psBdspInfo->bBDspOnOff = psPrm->sAecAudioengine.bAEOnOff;
+
+ if (psBdspInfo->bBDspOnOff == BDSP_OFF)
+ return;
+
+ psBdspInfo->pbChunkData =
+ psPrm->sAecAudioengine.sAecBDsp.pbChunkData;
+ psBdspInfo->dwSize =
+ psPrm->sAecAudioengine.sAecBDsp.dwSize;
+ }
+
+ if (psBdspInfo->pbChunkData != NULL)
+ psBdspInfo->pbChunkData = &psBdspInfo->pbChunkData[CHUNK_SIZE];
+}
+
+/***************************************************************************
+ * AppOnOff
+ *
+ * Function:
+ * change decision App On/Off
+ * Arguments:
+ * bOnOff On/Off
+ * bApp App bit
+ * bAppExec App exec value
+ * Return:
+ * App bit
+ *
+ ****************************************************************************/
+static UINT8 AppOnOff(UINT8 bOnOff, UINT8 bApp, UINT8 bAppExec)
+{
+ switch (bOnOff) {
+ case BDSP_APP_EXEC_STOP:
+ if ((bAppExec & bApp) == 0)
+ bApp = 0x00;
+ break;
+
+ case BDSP_APP_EXEC_START:
+ if ((bAppExec & bApp) != 0)
+ bApp = 0x00;
+ break;
+
+ case BDSP_APP_EXEC_DONTCARE:
+ default:
+ bApp = 0x00;
+ break;
+ }
+
+ return bApp;
+}
+
+/***************************************************************************
+ * CheckAppOnOff
+ *
+ * Function:
+ *
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * Target Number
+ *
+ ****************************************************************************/
+static void CheckAppOnOff(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ UINT8 *pbPrm;
+
+ pbPrm = psBdspInfo->pbFwctrlB;
+
+ psBdspInfo->bAe0AppOnOff |= AppOnOff(pbPrm[FWCTRL_B_WIDE],
+ MCB_AEEXEC0_WIDE, gsBdspInfo.bAppExec0);
+ psBdspInfo->bAe0AppOnOff |= AppOnOff(pbPrm[FWCTRL_B_HEX],
+ MCB_AEEXEC0_HEX, gsBdspInfo.bAppExec0);
+ psBdspInfo->bAe0AppOnOff |= AppOnOff(pbPrm[FWCTRL_B_EQ3_0A],
+ MCB_AEEXEC0_EQ3_0A, gsBdspInfo.bAppExec0);
+ psBdspInfo->bAe0AppOnOff |= AppOnOff(pbPrm[FWCTRL_B_DRC3],
+ MCB_AEEXEC0_DRC3, gsBdspInfo.bAppExec0);
+ psBdspInfo->bAe0AppOnOff |= AppOnOff(pbPrm[FWCTRL_B_DRC_0],
+ MCB_AEEXEC0_DRC_0, gsBdspInfo.bAppExec0);
+ psBdspInfo->bAe0AppOnOff |= AppOnOff(pbPrm[FWCTRL_B_EQ3_0B],
+ MCB_AEEXEC0_EQ3_0B, gsBdspInfo.bAppExec0);
+
+ psBdspInfo->bAe1AppOnOff |= AppOnOff(pbPrm[FWCTRL_B_EQ3_1A],
+ MCB_AEEXEC1_EQ3_1A, gsBdspInfo.bAppExec1);
+ psBdspInfo->bAe1AppOnOff |= AppOnOff(pbPrm[FWCTRL_B_AGC],
+ MCB_AEEXEC1_AGC, gsBdspInfo.bAppExec1);
+ psBdspInfo->bAe1AppOnOff |= AppOnOff(pbPrm[FWCTRL_B_DRC_1],
+ MCB_AEEXEC1_DRC_1, gsBdspInfo.bAppExec1);
+ psBdspInfo->bAe1AppOnOff |= AppOnOff(pbPrm[FWCTRL_B_EQ3_1B],
+ MCB_AEEXEC1_EQ3_1B, gsBdspInfo.bAppExec1);
+
+ if ((BDSP_APP_EXEC_STOP == pbPrm[FWCTRL_B_GEN]) &&
+ (gsBdspInfo.bAppExec0 & MCB_AEEXEC0_GEN) != 0)
+ psBdspInfo->bAppGen |= MCB_AEEXEC0_GEN;
+}
+
+/***************************************************************************
+ * GetAppNoTarget
+ *
+ * Function:
+ * Get app target
+ * Arguments:
+ * dAppNo App Number
+ * Return:
+ * Target Number
+ *
+ ****************************************************************************/
+static UINT32 GetAppNoTarget(UINT32 dAppNo)
+{
+ switch (dAppNo) {
+ case APP_NO_GEN:
+ return TARGET_GEN_GEN;
+ case APP_NO_SWAP_0:
+ return TARGET_BASE_SWAP_0;
+ case APP_NO_WIDE:
+ return TARGET_AE0_WIDE;
+ case APP_NO_HEX:
+ return TARGET_AE0_HEX;
+ case APP_NO_EQ3_0A:
+ return TARGET_AE0_EQ3_0A;
+ case APP_NO_DRC3:
+ return TARGET_AE0_DRC3;
+ case APP_NO_DRC_0:
+ return TARGET_AE0_DRC_0;
+ case APP_NO_EQ3_0B:
+ return TARGET_AE0_EQ3_0B;
+ case APP_NO_MIX_0:
+ return TARGET_BASE_MIX_0;
+ case APP_NO_SWAP_1:
+ return TARGET_BASE_SWAP_1;
+ case APP_NO_EQ3_1A:
+ return TARGET_AE1_EQ3_1A;
+ case APP_NO_AGC:
+ return TARGET_AE1_AGC;
+ case APP_NO_DRC_1:
+ return TARGET_AE1_DRC_1;
+ case APP_NO_EQ3_1B:
+ return TARGET_AE1_EQ3_1B;
+ case APP_NO_MIX_1:
+ return TARGET_BASE_MIX_1;
+ default:
+ break;
+ }
+
+ return TARGET_NONE;
+}
+
+/***************************************************************************
+ * CheckSinCtrlSel
+ *
+ * Function:
+ * check sin control
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * pbPrm chunk data pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void CheckSinCtrlSel(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo,
+ UINT8 *pbPrm)
+{
+ UINT32 dAdd;
+ UINT32 dSize;
+
+ dAdd = CreateUINT32(pbPrm[0UL], pbPrm[1UL], pbPrm[2UL], pbPrm[3UL]);
+ dSize = CreateUINT32(pbPrm[5UL], pbPrm[6UL], pbPrm[7UL], pbPrm[8UL]);
+ pbPrm = &pbPrm[9UL];
+
+ if (GEN_SIN_CTL_SEL_ADD < dAdd)
+ return;
+
+ if ((dAdd + (dSize / 4UL)) < GEN_SIN_CTL_SEL_ADD)
+ return;
+
+ dAdd = GEN_SIN_CTL_SEL_ADD - dAdd;
+
+ if ((pbPrm[(dAdd * 4) + 3] & BDSP_SIN_CTRL_GPIO) != 0)
+ psBdspInfo->bSinCtrlSel = BDSP_SIN_CTRL_GPIO;
+ else
+ psBdspInfo->bSinCtrlSel = BDSP_SIN_CTRL_REG;
+}
+
+/***************************************************************************
+ * AppChunkAnalyze
+ *
+ * Function:
+ * App analysis chunk
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * dChunkId chunk id
+ * dChunkSize chunk size
+ * dChunkTop chunk positon
+ * pbPrm chunk data pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+static SINT32 AppChunkAnalyze(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo,
+ UINT32 dChunkId, UINT32 dChunkSize,
+ UINT32 dChunkTop, UINT8 *pbPrm)
+{
+ UINT32 dTag;
+ UINT32 dAppNo;
+ UINT32 dTarget;
+ UINT32 dTemp;
+
+ dTag = (dChunkId & (UINT32)AEC_BDSP_TAG_APP_MASK);
+ if ((dTag != AEC_BDSP_TAG_APP_COEF) && (dTag != AEC_BDSP_TAG_APP_REG))
+ return MCDRV_SUCCESS;
+
+ dAppNo = (dChunkId & (UINT32)AEC_BDSP_TAG_APPNO_MASK);
+ dTarget = GetAppNoTarget(dAppNo);
+
+ if (dTag == AEC_BDSP_TAG_APP_COEF) {
+ if (dChunkSize < (UINT32)APP_COEF_FIX_SIZE)
+ return MCDRV_ERROR_ARGUMENT;
+ dTemp = CreateUINT32(pbPrm[dChunkTop + 5UL],
+ pbPrm[dChunkTop + 6UL],
+ pbPrm[dChunkTop + 7UL],
+ pbPrm[dChunkTop + 8UL]);
+ if (dTemp == 0UL)
+ return MCDRV_SUCCESS;
+ if ((dTemp & 0x03UL) != 0UL)
+ return MCDRV_ERROR_ARGUMENT;
+ if (dChunkSize < (dTemp + (UINT32)APP_COEF_FIX_SIZE))
+ return MCDRV_ERROR_ARGUMENT;
+
+ ++(psBdspInfo->dAppCoefCnt);
+
+ if ((COEF_DSP_TRANS != pbPrm[dChunkTop + 4UL]) ||
+ ((UINT32)COEF_DSP_TRANS_MAX < dTemp) ||
+ (1UL < psBdspInfo->dAppCoefCnt))
+ psBdspInfo->bCoefTrans = COEF_DMA_TRANS;
+
+ psBdspInfo->dCoefTarget |= dTarget;
+
+ if (dTarget == TARGET_GEN_GEN)
+ CheckSinCtrlSel(psBdspInfo, &pbPrm[dChunkTop]);
+ } else {
+ if (dChunkSize < (UINT32)APP_REG_FIX_SIZE)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (TARGET_GEN_GEN != dTarget)
+ return MCDRV_SUCCESS;
+
+ ++(psBdspInfo->dAppRegCnt);
+
+ if ((pbPrm[dChunkTop + APP_REG_FLG] & APP_REG_FLG_FWCTL4) != 0)
+ psBdspInfo->dRegAppStopTarget |= TARGET_GEN_GEN;
+ }
+
+ return MCDRV_SUCCESS;
+}
+
+/***************************************************************************
+ * BdspChunkAnalyze
+ *
+ * Function:
+ * Bdsp analysis chunk
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+static SINT32 BdspChunkAnalyze(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ UINT32 dChunkTop;
+ UINT32 dChunkId;
+ UINT32 dChunkSize;
+ UINT8 *pbPrm;
+ UINT32 dSize;
+
+ psBdspInfo->pbFwctrlB = NULL;
+ psBdspInfo->dAppCoefCnt = 0UL;
+ psBdspInfo->bCoefTrans = COEF_DSP_TRANS;
+ psBdspInfo->bAe0AppOnOff = 0;
+ psBdspInfo->bAe1AppOnOff = 0;
+ psBdspInfo->bAppGen = 0;
+ psBdspInfo->dCoefTarget = TARGET_NONE;
+ psBdspInfo->bSinCtrlSel = gsBdspInfo.bSinCtrlSel;
+ psBdspInfo->dAppRegCnt = 0UL;
+ psBdspInfo->dRegAppStopTarget = TARGET_NONE;
+ psBdspInfo->bStoppedAppExec0 = 0;
+ psBdspInfo->bStoppedAppExec1 = 0;
+ psBdspInfo->bStoppedSinOut = 0;
+ psBdspInfo->bStoppedBypass = 0;
+
+ if ((psBdspInfo->pbChunkData == NULL) || (psBdspInfo->dwSize == 0))
+ return MCDRV_SUCCESS;
+
+ pbPrm = psBdspInfo->pbChunkData;
+ dSize = psBdspInfo->dwSize;
+ dChunkTop = 0UL;
+ while (dChunkTop < dSize) {
+ if (dSize < (dChunkTop + (UINT32)CHUNK_SIZE))
+ return MCDRV_ERROR_ARGUMENT;
+
+ dChunkId = CreateUINT32(pbPrm[dChunkTop + 0UL],
+ pbPrm[dChunkTop + 1UL],
+ pbPrm[dChunkTop + 2UL],
+ pbPrm[dChunkTop + 3UL]);
+ dChunkSize = CreateUINT32(pbPrm[dChunkTop + 4UL],
+ pbPrm[dChunkTop + 5UL],
+ pbPrm[dChunkTop + 6UL],
+ pbPrm[dChunkTop + 7UL]);
+ if (dSize < (dChunkTop + (UINT32)CHUNK_SIZE + dChunkSize))
+ return MCDRV_ERROR_ARGUMENT;
+
+ dChunkTop += (UINT32)CHUNK_SIZE;
+ switch (dChunkId) {
+ case AEC_BDSP_TAG_FWCTRL_B:
+ if (dChunkSize < (UINT32)FWCTRL_B_SIZE)
+ return MCDRV_ERROR_ARGUMENT;
+ if (psBdspInfo->pbFwctrlB != NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ psBdspInfo->pbFwctrlB = &pbPrm[dChunkTop];
+
+ CheckAppOnOff(psBdspInfo);
+ break;
+
+ default:
+ if (AppChunkAnalyze(psBdspInfo,
+ dChunkId, dChunkSize, dChunkTop, pbPrm)
+ != MCDRV_SUCCESS)
+ return MCDRV_ERROR_ARGUMENT;
+ }
+ dChunkTop += dChunkSize;
+ }
+
+ return MCDRV_SUCCESS;
+}
+
+/***************************************************************************
+ * DSPTransWait
+ *
+ * Function:
+ * Wait for DSP transfer
+ * Arguments:
+ * none
+ * Return:
+ * 0 SUCCESS
+ * < 0 ERROR
+ *
+ ****************************************************************************/
+static SINT32 DSPTransWait(void)
+{
+ SINT32 sdResult;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_IF_REG_FLAG_RESET
+ | (((UINT32)MCI_BDSPTREQ) << 8)
+ | (UINT32)MCB_BDSPTREQ),
+ 0);
+
+ sdResult = McDevIf_ExecutePacket();
+
+ return sdResult;
+}
+
+/***************************************************************************
+ * CrossFadeWait
+ *
+ * Function:
+ * Cross fade wait
+ * Arguments:
+ * none
+ * Return:
+ * 0 SUCCESS
+ * < 0 ERROR
+ *
+ ****************************************************************************/
+static SINT32 CrossFadeWait(void)
+{
+ SINT32 sdResult;
+
+ McSrv_Sleep(BDSP_BYPASS_FADE_TIME);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_B_REG_FLAG_RESET
+ | (((UINT32)MCI_AEFADE) << 8)
+ | (UINT32)(MCB_AEFADE_AE1 | MCB_AEFADE_AE0)),
+ 0);
+
+ sdResult = McDevIf_ExecutePacket();
+
+ return sdResult;
+}
+
+/***************************************************************************
+ * SinOutWait
+ *
+ * Function:
+ * Sin out wait
+ * Arguments:
+ * none
+ * Return:
+ * 0 SUCCESS
+ * < 0 ERROR
+ *
+ ****************************************************************************/
+static SINT32 SinOutWait(void)
+{
+ SINT32 sdResult;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_B_REG_FLAG_RESET
+ | (((UINT32)MCI_SINOUTFLG) << 8)
+ | (UINT32)(MCB_SINOFLG)),
+ 0);
+
+ sdResult = McDevIf_ExecutePacket();
+
+ return sdResult;
+}
+
+/***************************************************************************
+ * BypassPath
+ *
+ * Function:
+ * Bypass configuration path
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * Wait info
+ *
+ ****************************************************************************/
+static UINT32 BypassPath(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ UINT8 bData;
+ UINT8 bStopped;
+ UINT32 dWait;
+
+ bData = gsBdspInfo.bAEBypass;
+ bStopped = 0;
+ dWait = WAIT_NONE;
+
+ if (psBdspInfo->bAe0AppOnOff != 0) {
+ bData |= MCB_AEBYPASS_AE0;
+ bStopped |= MCB_AEBYPASS_AE0;
+ }
+
+ if (psBdspInfo->bAe1AppOnOff != 0) {
+ bData |= MCB_AEBYPASS_AE1;
+ bStopped |= MCB_AEBYPASS_AE1;
+ }
+
+ if (psBdspInfo->bCoefTrans == COEF_DMA_TRANS) {
+ if ((psBdspInfo->dCoefTarget & TARGET_AE0_MASK) != 0) {
+ bData |= MCB_AEBYPASS_AE0;
+ bStopped |= MCB_AEBYPASS_AE0;
+ }
+
+ if ((psBdspInfo->dCoefTarget & TARGET_AE1_MASK) != 0) {
+ bData |= MCB_AEBYPASS_AE1;
+ bStopped |= MCB_AEBYPASS_AE1;
+ }
+ }
+
+ if (bData != gsBdspInfo.bAEBypass) {
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEBYPASS),
+ bData);
+ McDevIf_ExecutePacket();
+
+ dWait = CROSS_FADE_WAIT;
+ psBdspInfo->bStoppedBypass = bStopped;
+ gsBdspInfo.bAEBypass = bData;
+ }
+
+ return dWait;
+}
+
+/***************************************************************************
+ * SinStop
+ *
+ * Function:
+ * Sin stop
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * Wait info
+ *
+ ****************************************************************************/
+static UINT32 SinStop(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ UINT8 bData;
+ UINT32 dWait;
+
+ dWait = WAIT_NONE;
+
+ if (gsBdspInfo.bSinCtrlSel == BDSP_SIN_CTRL_GPIO)
+ return dWait;
+
+ if ((gsBdspInfo.bAppExec0 & MCB_AEEXEC0_GEN) == 0)
+ return dWait;
+
+ if (((psBdspInfo->bAppGen != 0) ||
+ (psBdspInfo->dRegAppStopTarget & TARGET_GEN_MASK) != 0) ||
+ ((psBdspInfo->bCoefTrans == COEF_DMA_TRANS) &&
+ ((psBdspInfo->dCoefTarget & TARGET_GEN_MASK) != 0))) {
+
+ dWait = SIN_OUT_WAIT;
+
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_SINOUT),
+ &bData, 1);
+ if ((bData & MCB_SINOUT) != 0) {
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_SINOUT),
+ MCI_SINOUT_DEF);
+ McDevIf_ExecutePacket();
+
+ psBdspInfo->bStoppedSinOut = MCB_SINOUT;
+ }
+ }
+
+ return dWait;
+}
+
+/***************************************************************************
+ * AppStop
+ *
+ * Function:
+ * App stop
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void AppStop(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ UINT8 bAppExec0;
+ UINT8 bAppExec1;
+ UINT8 bStoppedAppExec0;
+ UINT8 bStoppedAppExec1;
+
+ bAppExec0 = gsBdspInfo.bAppExec0;
+ bAppExec1 = gsBdspInfo.bAppExec1;
+ bStoppedAppExec0 = 0;
+ bStoppedAppExec1 = 0;
+
+ if (psBdspInfo->bCoefTrans == COEF_DMA_TRANS) {
+ if (((psBdspInfo->dCoefTarget & TARGET_AE0_EQ3_0B) != 0) &&
+ ((bAppExec0 & MCB_AEEXEC0_EQ3_0B) != 0)) {
+ bAppExec0 &= ~MCB_AEEXEC0_EQ3_0B;
+ bStoppedAppExec0 |= MCB_AEEXEC0_EQ3_0B;
+ }
+ if (((psBdspInfo->dCoefTarget & TARGET_AE0_DRC_0) != 0) &&
+ ((bAppExec0 & MCB_AEEXEC0_DRC_0) != 0)) {
+ bAppExec0 &= ~MCB_AEEXEC0_DRC_0;
+ bStoppedAppExec0 |= MCB_AEEXEC0_DRC_0;
+ }
+ if (((psBdspInfo->dCoefTarget & TARGET_AE0_DRC3) != 0) &&
+ ((bAppExec0 & MCB_AEEXEC0_DRC3) != 0)) {
+ bAppExec0 &= ~MCB_AEEXEC0_DRC3;
+ bStoppedAppExec0 |= MCB_AEEXEC0_DRC3;
+ }
+ if (((psBdspInfo->dCoefTarget & TARGET_AE0_EQ3_0A) != 0) &&
+ ((bAppExec0 & MCB_AEEXEC0_EQ3_0A) != 0)) {
+ bAppExec0 &= ~MCB_AEEXEC0_EQ3_0A;
+ bStoppedAppExec0 |= MCB_AEEXEC0_EQ3_0A;
+ }
+ if (((psBdspInfo->dCoefTarget & TARGET_AE0_HEX) != 0) &&
+ ((bAppExec0 & MCB_AEEXEC0_HEX) != 0)) {
+ bAppExec0 &= ~MCB_AEEXEC0_HEX;
+ bStoppedAppExec0 |= MCB_AEEXEC0_HEX;
+ }
+ if (((psBdspInfo->dCoefTarget & TARGET_AE0_WIDE) != 0) &&
+ ((bAppExec0 & MCB_AEEXEC0_WIDE) != 0)) {
+ bAppExec0 &= ~MCB_AEEXEC0_WIDE;
+ bStoppedAppExec0 |= MCB_AEEXEC0_WIDE;
+ }
+
+ if (((psBdspInfo->dCoefTarget & TARGET_AE1_EQ3_1B) != 0) &&
+ ((bAppExec1 & MCB_AEEXEC1_EQ3_1B) != 0)) {
+ bAppExec1 &= ~MCB_AEEXEC1_EQ3_1B;
+ bStoppedAppExec1 |= MCB_AEEXEC1_EQ3_1B;
+ }
+ if (((psBdspInfo->dCoefTarget & TARGET_AE1_DRC_1) != 0) &&
+ ((bAppExec1 & MCB_AEEXEC1_DRC_1) != 0)) {
+ bAppExec1 &= ~MCB_AEEXEC1_DRC_1;
+ bStoppedAppExec1 |= MCB_AEEXEC1_DRC_1;
+ }
+ if (((psBdspInfo->dCoefTarget & TARGET_AE1_AGC) != 0) &&
+ ((bAppExec1 & MCB_AEEXEC1_AGC) != 0)) {
+ bAppExec1 &= ~MCB_AEEXEC1_AGC;
+ bStoppedAppExec1 |= MCB_AEEXEC1_AGC;
+ }
+ if (((psBdspInfo->dCoefTarget & TARGET_AE1_EQ3_1A) != 0) &&
+ ((bAppExec1 & MCB_AEEXEC1_EQ3_1A) != 0)) {
+ bAppExec1 &= ~MCB_AEEXEC1_EQ3_1A;
+ bStoppedAppExec1 |= MCB_AEEXEC1_EQ3_1A;
+ }
+
+ if (((psBdspInfo->dCoefTarget & TARGET_GEN_GEN) != 0) &&
+ ((bAppExec0 & MCB_AEEXEC0_GEN) != 0)) {
+ bAppExec0 &= ~MCB_AEEXEC0_GEN;
+ bStoppedAppExec0 |= MCB_AEEXEC0_GEN;
+ }
+ }
+
+ if (((psBdspInfo->dRegAppStopTarget & TARGET_GEN_GEN) != 0) &&
+ ((bAppExec0 & MCB_AEEXEC0_GEN) != 0)) {
+ bAppExec0 &= ~MCB_AEEXEC0_GEN;
+ bStoppedAppExec0 |= MCB_AEEXEC0_GEN;
+ }
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEEXEC0),
+ bAppExec0);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEEXEC1),
+ bAppExec1);
+
+ psBdspInfo->bStoppedAppExec0 = bStoppedAppExec0;
+ psBdspInfo->bStoppedAppExec1 = bStoppedAppExec1;
+
+ gsBdspInfo.bAppExec0 = bAppExec0;
+ gsBdspInfo.bAppExec1 = bAppExec1;
+}
+
+/***************************************************************************
+ * Stop
+ *
+ * Function:
+ * Stop
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * 0 SUCCESS
+ * < 0 ERROR
+ *
+ ****************************************************************************/
+static SINT32 Stop(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ SINT32 sdResult;
+ UINT32 dWait;
+
+ dWait = WAIT_NONE;
+
+ sdResult = DSPTransWait();
+ if (sdResult < (SINT32)MCDRV_SUCCESS)
+ return sdResult;
+
+ dWait |= BypassPath(psBdspInfo);
+
+ dWait |= SinStop(psBdspInfo);
+
+ if ((dWait & CROSS_FADE_WAIT) != 0) {
+ sdResult = CrossFadeWait();
+ if (sdResult < (SINT32)MCDRV_SUCCESS)
+ return sdResult;
+ }
+ if ((dWait & SIN_OUT_WAIT) != 0) {
+ sdResult = SinOutWait();
+ if (sdResult < (SINT32)MCDRV_SUCCESS)
+ return sdResult;
+ }
+
+ /* APP Stop */
+ AppStop(psBdspInfo);
+
+ return MCDRV_SUCCESS;
+}
+
+/***************************************************************************
+ * EnableAppNo
+ *
+ * Function:
+ * Number determination App
+ * Arguments:
+ * dAppNo App Number
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR
+ *
+ ****************************************************************************/
+static SINT32 EnableAppNo(UINT32 dAppNo)
+{
+ switch (dAppNo) {
+ case APP_NO_GEN:
+ case APP_NO_SWAP_0:
+ case APP_NO_WIDE:
+ case APP_NO_HEX:
+ case APP_NO_EQ3_0A:
+ case APP_NO_DRC3:
+ case APP_NO_DRC_0:
+ case APP_NO_EQ3_0B:
+ case APP_NO_MIX_0:
+ case APP_NO_SWAP_1:
+ case APP_NO_EQ3_1A:
+ case APP_NO_AGC:
+ case APP_NO_DRC_1:
+ case APP_NO_EQ3_1B:
+ case APP_NO_MIX_1:
+ return MCDRV_SUCCESS;
+
+ default:
+ break;
+ }
+
+ return MCDRV_ERROR;
+}
+
+/***************************************************************************
+ * AppCoefDL
+ *
+ * Function:
+ * Download App coefficient
+ * Arguments:
+ * pbAppCoef Coefficient data pointer
+ * bCoefTrans Transmission mode
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void AppCoefDL(UINT8 *pbAppCoef, UINT8 bCoefTrans)
+{
+ UINT32 dSize;
+ UINT32 i;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMAA0),
+ (UINT8)(pbAppCoef[APP_COEF_ADR + 1] & MCB_BMAA0));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMAA1),
+ (UINT8)(pbAppCoef[APP_COEF_ADR + 2] & MCB_BMAA1));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMAA2),
+ (UINT8)(pbAppCoef[APP_COEF_ADR + 3] & MCB_BMAA2));
+
+ /* BMACtl */
+ if (bCoefTrans == COEF_DSP_TRANS)
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMACTL),
+ (UINT8)(MCB_BDSPTINI | MCB_BMAMOD_DSP
+ | MCB_BMABUS_Y));
+ else
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMACTL),
+ MCB_BMABUS_Y);
+
+ McDevIf_ExecutePacket();
+
+ dSize = CreateUINT32(pbAppCoef[APP_COEF_SIZE + 0],
+ pbAppCoef[APP_COEF_SIZE + 1],
+ pbAppCoef[APP_COEF_SIZE + 2],
+ pbAppCoef[APP_COEF_SIZE + 3]);
+
+ for (i = 0; i < dSize; i++)
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMAD),
+ pbAppCoef[APP_COEF_DATA + i]);
+ McDevIf_ExecutePacket();
+}
+
+/***************************************************************************
+ * AppRegDL
+ *
+ * Function:
+ * Download App register
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * dTarget Target
+ * pbAppReg Register data pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void AppRegDL(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo,
+ UINT32 dTarget, UINT8 *pbAppReg)
+{
+ switch (dTarget) {
+ case TARGET_GEN_GEN:
+ if ((pbAppReg[APP_REG_FLG] & APP_REG_FLG_FWCTL4) != 0)
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_F01SEL),
+ pbAppReg[APP_REG_FWCTL4]);
+
+ if ((pbAppReg[APP_REG_FLG] & APP_REG_FLG_FWCTL5) != 0) {
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_SINOUT),
+ pbAppReg[APP_REG_FWCTL5]);
+ if ((pbAppReg[APP_REG_FWCTL5] & MCB_SINOUT) == 0)
+ psBdspInfo->bStoppedSinOut = 0;
+ }
+ McDevIf_ExecutePacket();
+ break;
+
+ default:
+ break;
+ }
+}
+
+/***************************************************************************
+ * MultiChunkDL
+ *
+ * Function:
+ * Download multiple chunks
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * dTargetChunk Target chunk
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void MultiChunkDL(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo,
+ UINT32 dTargetChunk)
+{
+ UINT32 dChunkTop;
+ UINT32 dChunkId;
+ UINT32 dChunkSize;
+ UINT32 dAppNo;
+ UINT8 *pbPrm;
+ UINT32 dSize;
+
+ pbPrm = psBdspInfo->pbChunkData;
+ dSize = psBdspInfo->dwSize;
+
+ dChunkTop = 0;
+ while (dChunkTop < dSize) {
+ dChunkId = CreateUINT32(pbPrm[dChunkTop + 0UL],
+ pbPrm[dChunkTop + 1UL],
+ pbPrm[dChunkTop + 2UL],
+ pbPrm[dChunkTop + 3UL]);
+ dChunkSize = CreateUINT32(pbPrm[dChunkTop + 4UL],
+ pbPrm[dChunkTop + 5UL],
+ pbPrm[dChunkTop + 6UL],
+ pbPrm[dChunkTop + 7UL]);
+
+ dChunkTop += (UINT32)CHUNK_SIZE;
+
+ dAppNo = (dChunkId & (UINT32)AEC_BDSP_TAG_APPNO_MASK);
+ switch ((dChunkId & (UINT32)AEC_BDSP_TAG_APP_MASK)) {
+ case AEC_BDSP_TAG_APP_COEF:
+ if (dTargetChunk == (UINT32)MULTI_CHUNK_APP_COEF) {
+ if (EnableAppNo(dAppNo) == MCDRV_SUCCESS)
+ AppCoefDL(&pbPrm[dChunkTop],
+ psBdspInfo->bCoefTrans);
+
+ if (dAppNo == APP_NO_GEN)
+ gsBdspInfo.bSinCtrlSel =
+ psBdspInfo->bSinCtrlSel;
+ }
+ break;
+
+ case AEC_BDSP_TAG_APP_REG:
+ if (dTargetChunk == (UINT32)MULTI_CHUNK_APP_REG)
+ AppRegDL(psBdspInfo, GetAppNoTarget(dAppNo),
+ &pbPrm[dChunkTop]);
+ break;
+
+ default:
+ /* unknown */
+ break;
+ }
+ dChunkTop += dChunkSize;
+ }
+}
+
+/***************************************************************************
+ * Download
+ *
+ * Function:
+ * Download
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void Download(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ if (psBdspInfo->dAppCoefCnt != 0UL) {
+ MultiChunkDL(psBdspInfo, MULTI_CHUNK_APP_COEF);
+
+ if (psBdspInfo->bCoefTrans == COEF_DSP_TRANS) {
+ /* DSPTReq */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BDSPTREQ),
+ MCB_BDSPTREQ);
+ McDevIf_ExecutePacket();
+ }
+ }
+
+ if (psBdspInfo->dAppRegCnt != 0UL)
+ MultiChunkDL(psBdspInfo, MULTI_CHUNK_APP_REG);
+}
+
+/***************************************************************************
+ * CreateAppExec
+ *
+ * Function:
+ * Create App Exec
+ * Arguments:
+ * bOnOff On/Off
+ * bApp App bit
+ * bAppExec App exec value
+ * Return:
+ * App Exec
+ *
+ ****************************************************************************/
+static UINT8 CreateAppExec(UINT8 bOnOff, UINT8 bApp, UINT8 bAppExec)
+{
+ switch (bOnOff) {
+ case BDSP_APP_EXEC_STOP:
+ bAppExec &= ~bApp;
+ break;
+
+ case BDSP_APP_EXEC_START:
+ bAppExec |= bApp;
+ break;
+
+ case BDSP_APP_EXEC_DONTCARE:
+ default:
+ break;
+ }
+
+ return bAppExec;
+}
+
+/***************************************************************************
+ * NewAppOn
+ *
+ * Function:
+ * Settings App On/Off
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void NewAppOn(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ UINT8 bAppExec0;
+ UINT8 bAppExec1;
+ UINT8 *pbPrm;
+
+ pbPrm = psBdspInfo->pbFwctrlB;
+
+ bAppExec0 = gsBdspInfo.bAppExec0;
+ bAppExec1 = gsBdspInfo.bAppExec1;
+
+ bAppExec0 |= psBdspInfo->bStoppedAppExec0;
+ bAppExec1 |= psBdspInfo->bStoppedAppExec1;
+
+ bAppExec0 = CreateAppExec(pbPrm[FWCTRL_B_WIDE],
+ MCB_AEEXEC0_WIDE, bAppExec0);
+ bAppExec0 = CreateAppExec(pbPrm[FWCTRL_B_HEX],
+ MCB_AEEXEC0_HEX, bAppExec0);
+ bAppExec0 = CreateAppExec(pbPrm[FWCTRL_B_EQ3_0A],
+ MCB_AEEXEC0_EQ3_0A, bAppExec0);
+ bAppExec0 = CreateAppExec(pbPrm[FWCTRL_B_DRC3],
+ MCB_AEEXEC0_DRC3, bAppExec0);
+ bAppExec0 = CreateAppExec(pbPrm[FWCTRL_B_DRC_0],
+ MCB_AEEXEC0_DRC_0, bAppExec0);
+ bAppExec0 = CreateAppExec(pbPrm[FWCTRL_B_EQ3_0B],
+ MCB_AEEXEC0_EQ3_0B, bAppExec0);
+
+ bAppExec0 = CreateAppExec(pbPrm[FWCTRL_B_GEN],
+ MCB_AEEXEC0_GEN, bAppExec0);
+
+ bAppExec1 = CreateAppExec(pbPrm[FWCTRL_B_EQ3_1A],
+ MCB_AEEXEC1_EQ3_1A, bAppExec1);
+ bAppExec1 = CreateAppExec(pbPrm[FWCTRL_B_AGC],
+ MCB_AEEXEC1_AGC, bAppExec1);
+ bAppExec1 = CreateAppExec(pbPrm[FWCTRL_B_DRC_1],
+ MCB_AEEXEC1_DRC_1, bAppExec1);
+ bAppExec1 = CreateAppExec(pbPrm[FWCTRL_B_EQ3_1B],
+ MCB_AEEXEC1_EQ3_1B, bAppExec1);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEEXEC0),
+ bAppExec0);
+
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEEXEC1),
+ bAppExec1);
+
+ McDevIf_ExecutePacket();
+
+ gsBdspInfo.bAppExec0 = bAppExec0;
+ gsBdspInfo.bAppExec1 = bAppExec1;
+}
+
+/***************************************************************************
+ * SinStart
+ *
+ * Function:
+ * Sin start
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void SinStart(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ if (psBdspInfo->bStoppedSinOut == MCB_SINOUT) {
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_SINOUT),
+ MCB_SINOUT);
+ McDevIf_ExecutePacket();
+ }
+}
+
+/***************************************************************************
+ * NewPath
+ *
+ * Function:
+ * Path setting
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void NewPath(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ UINT8 bAEBypass;
+ UINT8 *pbPrm;
+
+ pbPrm = psBdspInfo->pbFwctrlB;
+ if (pbPrm == NULL)
+ return;
+
+ bAEBypass = gsBdspInfo.bAEBypass;
+
+ switch (pbPrm[FWCTRL_B_AE0_BYP]) {
+ case BDSP_PATH_NORMAL:
+ bAEBypass &= ~MCB_AEBYPASS_AE0;
+ break;
+
+ case BDSP_PATH_BYPASS:
+ bAEBypass |= MCB_AEBYPASS_AE0;
+ break;
+
+ case BDSP_PATH_DONTCARE:
+ default:
+ break;
+ }
+
+ switch (pbPrm[FWCTRL_B_AE1_BYP]) {
+ case BDSP_PATH_NORMAL:
+ bAEBypass &= ~MCB_AEBYPASS_AE1;
+ break;
+
+ case BDSP_PATH_BYPASS:
+ bAEBypass |= MCB_AEBYPASS_AE1;
+ break;
+
+ case BDSP_PATH_DONTCARE:
+ default:
+ break;
+ }
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEBYPASS),
+ bAEBypass);
+
+ McDevIf_ExecutePacket();
+
+ gsBdspInfo.bAEBypass = bAEBypass;
+}
+
+/***************************************************************************
+ * AudioIFPath
+ *
+ * Function:
+ * Audio IF path set
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void AudioIFPath(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ UINT8 bDSPCtl;
+
+ switch (psBdspInfo->pbFwctrlB[FWCTRL_B_BYPASS]) {
+ case BDSP_PATH_NORMAL:
+ case BDSP_PATH_BYPASS:
+ gsBdspInfo.bDSPBypass =
+ (UINT8)((psBdspInfo->pbFwctrlB[FWCTRL_B_BYPASS] << 7)
+ & MCB_BDSPBYPASS);
+ break;
+
+ case BDSP_PATH_DONTCARE:
+ default:
+ break;
+ };
+
+ bDSPCtl = gsBdspInfo.bDSPCtl;
+ switch (gsBdspInfo.bDSPBypass & MCB_BDSPBYPASS) {
+ case MCB_BDSPBYPASS:
+ if ((bDSPCtl & (UINT8)MCB_BDSPSTART) != 0)
+ bDSPCtl = MCB_BDSPBYPASS;
+ break;
+
+ /*case MCI_BDSPCTRL_DEF:*/
+ default:
+ if ((bDSPCtl & (UINT8)MCB_BDSPBYPASS) != 0)
+ bDSPCtl = MCB_BDSPSTART;
+ break;
+ }
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_BDSPCTRL),
+ bDSPCtl);
+
+ McDevIf_ExecutePacket();
+
+ gsBdspInfo.bDSPCtl = bDSPCtl;
+}
+
+/***************************************************************************
+ * ResumeAppOn
+ *
+ * Function:
+ * Resume App On
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void ResumeAppOn(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ UINT8 bAppExec0;
+ UINT8 bAppExec1;
+
+ bAppExec0 = gsBdspInfo.bAppExec0;
+ bAppExec1 = gsBdspInfo.bAppExec1;
+
+ bAppExec0 |= psBdspInfo->bStoppedAppExec0;
+ bAppExec1 |= psBdspInfo->bStoppedAppExec1;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEEXEC0),
+ bAppExec0);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEEXEC1),
+ bAppExec1);
+
+ McDevIf_ExecutePacket();
+
+ gsBdspInfo.bAppExec0 = bAppExec0;
+ gsBdspInfo.bAppExec1 = bAppExec1;
+}
+
+/***************************************************************************
+ * ResumePath
+ *
+ * Function:
+ * Resume path
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void ResumePath(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ UINT8 bData;
+
+ bData = gsBdspInfo.bAEBypass;
+ bData &= ~psBdspInfo->bStoppedBypass;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEBYPASS),
+ bData);
+
+ McDevIf_ExecutePacket();
+
+ gsBdspInfo.bAEBypass = bData;
+}
+
+/***************************************************************************
+ * ReStart
+ *
+ * Function:
+ * Restart
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void ReStart(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ if (psBdspInfo->pbFwctrlB != NULL) {
+ NewAppOn(psBdspInfo);
+
+ SinStart(psBdspInfo);
+
+ NewPath(psBdspInfo);
+
+ AudioIFPath(psBdspInfo);
+ } else {
+ ResumeAppOn(psBdspInfo);
+
+ SinStart(psBdspInfo);
+
+ ResumePath(psBdspInfo);
+ }
+}
+
+/***************************************************************************
+ * SetAudioEngine
+ *
+ * Function:
+ * AudioEngine setting
+ * Arguments:
+ * psBdspInfo MCDRV_BDSP_AEC_BDSP_INFO
+ * structure pointer
+ * Return:
+ * 0 SUCCESS
+ * < 0 ERROR
+ *
+ ****************************************************************************/
+static SINT32 SetAudioEngine(struct MCDRV_BDSP_AEC_BDSP_INFO *psBdspInfo)
+{
+ SINT32 sdResult;
+
+ if ((gsBdspInfo.bDSPCtl & (UINT8)MCB_BDSPSTART) == 0) {
+ psBdspInfo->bAe0AppOnOff = 0;
+ psBdspInfo->bAe1AppOnOff = 0;
+ psBdspInfo->bAppGen = 0;
+ psBdspInfo->dCoefTarget = TARGET_NONE;
+ psBdspInfo->bCoefTrans = COEF_DMA_TRANS;
+ psBdspInfo->dRegAppStopTarget = TARGET_NONE;
+ }
+
+ sdResult = Stop(psBdspInfo);
+ if (sdResult < (SINT32)MCDRV_SUCCESS)
+ return sdResult;
+
+ Download(psBdspInfo);
+
+ ReStart(psBdspInfo);
+
+ return MCDRV_SUCCESS;
+}
+
+/***************************************************************************
+ * Upload
+ *
+ * Function:
+ * upload
+ * Arguments:
+ * bAdr0 address0
+ * dAddress address
+ * bBMACtl control register value
+ * dSize size
+ * dUnitSize unit size
+ * pbData Pointer to the data get area
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void Upload(UINT8 bAdr0, UINT32 dAddress, UINT8 bBMACtl,
+ UINT32 dSize, UINT32 dUnitSize, UINT8 *pbData)
+{
+ UINT8 bAdr1;
+ UINT8 bAdr2;
+ UINT32 i;
+
+ bAdr1 = (UINT8)((dAddress >> 8) & (UINT32)MCB_BMAA1);
+ bAdr2 = (UINT8)(dAddress & (UINT32)MCB_BMAA2);
+
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMAA0),
+ bAdr0);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMAA1),
+ bAdr1);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMAA2),
+ bAdr2);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMACTL),
+ bBMACtl);
+
+ McDevIf_ExecutePacket();
+
+ for (i = 0; i < dSize; i++) {
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMAD),
+ &pbData[(i * dUnitSize) + 0],
+ 1);
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMAD),
+ &pbData[(i * dUnitSize) + 1],
+ 1);
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMAD),
+ &pbData[(i * dUnitSize) + 2],
+ 1);
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMAD),
+ &pbData[(i * dUnitSize) + 3],
+ 1);
+ }
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BMAA0),
+ MCI_BMAA0_DEF);
+ McDevIf_ExecutePacket();
+}
+
+/***************************************************************************
+ * McBdsp_Init
+ *
+ * Function:
+ * initialize
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR
+ *
+ ****************************************************************************/
+SINT32 McBdsp_Init(void)
+{
+ static UINT8 abFaderCoef[17] = {
+ 0x00, 0x00, 0x00, 0x00, /* address */
+ 0x00,
+ 0x00, 0x00, 0x00, 0x08, /* size 8 (4 * 2)*/
+ 0xF8, 0x44, 0x41, 0x78, /* CFADE_0 10ms */
+ 0xF8, 0x44, 0x41, 0x78 /* CFADE_1 10ms */
+ };
+
+ if (gsBdspInfo.dStatus != (UINT32)BDSP_STATUS_IDLE)
+ return MCDRV_ERROR;
+
+ gsBdspInfo.bDSPBypass = MCB_BDSPBYPASS;
+ gsBdspInfo.bSinCtrlSel = BDSP_SIN_CTRL_REG;
+
+ gsBdspInfo.bDSPCtl = MCI_BDSPCTRL_DEF;
+ gsBdspInfo.bAppExec0 = MCI_AEEXEC0_DEF;
+ gsBdspInfo.bAppExec1 = MCI_AEEXEC1_DEF;
+ gsBdspInfo.bAEBypass = MCI_AEBYPASS_DEF;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_BDSPCTRL),
+ gsBdspInfo.bDSPCtl);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEEXEC0),
+ gsBdspInfo.bAppExec0);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEEXEC1),
+ gsBdspInfo.bAppExec1);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEBYPASS),
+ gsBdspInfo.bAEBypass);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_AEFADE),
+ MCI_AEFADE_DEF);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_F01SEL),
+ MCI_F01SEL_DEF);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_SINOUT),
+ MCI_SINOUT_DEF);
+
+ McDevIf_ExecutePacket();
+
+ gsBdspInfo.dStatus = (UINT32)BDSP_STATUS_INITED;
+
+ AppCoefDL(abFaderCoef, COEF_DMA_TRANS);
+
+ return MCDRV_SUCCESS;
+}
+
+/***************************************************************************
+ * McBdsp_Term
+ *
+ * Function:
+ * terminate
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ *
+ ****************************************************************************/
+SINT32 McBdsp_Term(void)
+{
+ if (gsBdspInfo.dStatus == (UINT32)BDSP_STATUS_IDLE)
+ return MCDRV_SUCCESS;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_BDSPCTRL),
+ MCI_BDSPCTRL_DEF);
+
+ McDevIf_ExecutePacket();
+
+ gsBdspInfo.dStatus = (UINT32)BDSP_STATUS_IDLE;
+
+ return MCDRV_SUCCESS;
+}
+
+/***************************************************************************
+ * McBdsp_GetTransition
+ *
+ * Function:
+ * Get control state
+ * Arguments:
+ * none
+ * Return:
+ * state
+ *
+ ****************************************************************************/
+SINT32 McBdsp_GetTransition(void)
+{
+ SINT32 sdResult;
+ UINT8 bData;
+
+ sdResult = 0;
+
+ if (gsBdspInfo.dStatus == (UINT32)BDSP_STATUS_IDLE)
+ return sdResult;
+
+ /* AE1FADE,AE0FADE */
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_B | (UINT32)MCI_AEFADE),
+ &bData, 1);
+
+ if ((bData & MCB_AEFADE_AE0) != 0)
+ sdResult |= (SINT32)BDSP_PRC_FADE_AE0;
+ if ((bData & MCB_AEFADE_AE1) != 0)
+ sdResult |= (SINT32)BDSP_PRC_FADE_AE1;
+
+ /* SINOFLG */
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_B | (UINT32)MCI_SINOUTFLG),
+ &bData, 1);
+ if ((bData & MCB_SINOFLG) != 0)
+ sdResult |= (SINT32)BDSP_PRC_SINOUT;
+
+ /* DSP Coef Trance */
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BDSPTREQ),
+ &bData, 1);
+ if ((bData & MCB_BDSPTREQ) != 0)
+ sdResult += (SINT32)BDSP_PRC_COEF_TRS;
+
+ return sdResult;
+}
+
+/***************************************************************************
+ * McBdsp_GetDSP
+ *
+ * Function:
+ * Get dsp data
+ * Arguments:
+ * dTarget target
+ * dAddress address
+ * pbData Pointer to the data get area
+ * dSize data size
+ * Return:
+ *
+ *
+ ****************************************************************************/
+SINT32 McBdsp_GetDSP(UINT32 dTarget, UINT32 dAddress,
+ UINT8 *pbData, UINT32 dSize)
+{
+ UINT8 bBMACtl;
+ UINT32 dUnitSize;
+
+ if (pbData == NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ bBMACtl = MCB_BMADIR_UL;
+ dUnitSize = 0;
+
+ switch (dTarget) {
+ case BDSP_AE_FW_DXRAM:
+ if (DXRAM_RANGE_MAX < dAddress)
+ return MCDRV_ERROR_ARGUMENT;
+
+ dUnitSize = RAM_UNIT_SIZE_64;
+ dSize = (dSize / dUnitSize);
+
+ if ((DXRAM_RANGE_MAX + 1) < dSize)
+ dSize = DXRAM_RANGE_MAX + 1;
+
+ if ((DXRAM_RANGE_MAX + 1) < (dAddress + dSize))
+ dSize -= ((dAddress + dSize)
+ - (DXRAM_RANGE_MAX + 1));
+ bBMACtl |= MCB_BMABUS_X;
+ break;
+
+ case BDSP_AE_FW_DYRAM:
+ if (DYRAM_RANGE_MAX < dAddress)
+ return MCDRV_ERROR_ARGUMENT;
+
+ dUnitSize = RAM_UNIT_SIZE_32;
+ dSize = (dSize / dUnitSize);
+
+ if ((DYRAM_RANGE_MAX + 1) < dSize)
+ dSize = (DYRAM_RANGE_MAX + 1);
+
+ if ((DYRAM_RANGE_MAX + 1) < (dAddress + dSize))
+ dSize -= ((dAddress + dSize)
+ - (DYRAM_RANGE_MAX + 1));
+
+ bBMACtl |= MCB_BMABUS_Y;
+ break;
+
+ default:
+ return MCDRV_ERROR_ARGUMENT;
+ }
+
+ if (dSize == 0)
+ return 0;
+
+ if (gsBdspInfo.dStatus == (UINT32)BDSP_STATUS_IDLE)
+ return 0;
+
+ if (dTarget == BDSP_AE_FW_DXRAM) {
+ Upload(MCB_BMAA0, dAddress, bBMACtl, dSize, dUnitSize, pbData);
+
+ Upload(MCI_BMAA0_DEF, dAddress, bBMACtl, dSize, dUnitSize,
+ &pbData[4]);
+
+ } else
+ Upload(MCI_BMAA0_DEF, dAddress, bBMACtl, dSize, dUnitSize,
+ pbData);
+
+ return (SINT32)(dSize * dUnitSize);
+}
+
+/***************************************************************************
+ * McBdsp_SetDSPCheck
+ *
+ * Function:
+ * DSP configuration check
+ * Arguments:
+ * psPrm MCDRV_AEC_INFO structure pointer
+ * Return:
+ * 0 SUCCESS
+ * < 0 ERROR
+ *
+ ****************************************************************************/
+SINT32 McBdsp_SetDSPCheck(struct MCDRV_AEC_INFO *psPrm)
+{
+ SINT32 sdResult;
+ struct MCDRV_BDSP_AEC_BDSP_INFO sBdspInfo;
+
+ if (psPrm == NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ GetBDSPChunk(psPrm, &sBdspInfo);
+
+ sdResult = BdspChunkAnalyze(&sBdspInfo);
+ if (sdResult < (SINT32)MCDRV_SUCCESS)
+ return sdResult;
+
+ return MCDRV_SUCCESS;
+}
+
+/***************************************************************************
+ * McBdsp_SetDSP
+ *
+ * Function:
+ * DSP settings
+ * Arguments:
+ * psPrm MCDRV_AEC_INFO structure pointer
+ * Return:
+ * 0 SUCCESS
+ * < 0 ERROR
+ *
+ ****************************************************************************/
+SINT32 McBdsp_SetDSP(struct MCDRV_AEC_INFO *psPrm)
+{
+ SINT32 sdResult;
+ struct MCDRV_BDSP_AEC_BDSP_INFO sBdspInfo;
+
+ if (psPrm == NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ GetBDSPChunk(psPrm, &sBdspInfo);
+
+ sdResult = BdspChunkAnalyze(&sBdspInfo);
+ if (sdResult < (SINT32)MCDRV_SUCCESS)
+ return sdResult;
+
+ if ((sBdspInfo.pbChunkData == NULL) || (sBdspInfo.dwSize == 0))
+ return MCDRV_SUCCESS;
+
+ if (gsBdspInfo.dStatus == (UINT32)BDSP_STATUS_IDLE)
+ return MCDRV_ERROR;
+
+ sdResult = SetAudioEngine(&sBdspInfo);
+
+ return sdResult;
+}
+
+/***************************************************************************
+ * McBdsp_Start
+ *
+ * Function:
+ * Dsp start
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR
+ *
+ ****************************************************************************/
+SINT32 McBdsp_Start(void)
+{
+ if (gsBdspInfo.dStatus == (UINT32)BDSP_STATUS_IDLE)
+ return MCDRV_ERROR;
+
+ if ((gsBdspInfo.bDSPBypass & MCB_BDSPBYPASS) != 0)
+ gsBdspInfo.bDSPCtl = (UINT8)MCB_BDSPBYPASS;
+ else
+ gsBdspInfo.bDSPCtl = (UINT8)MCB_BDSPSTART;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_BDSPCTRL),
+ gsBdspInfo.bDSPCtl);
+
+ McDevIf_ExecutePacket();
+
+ return MCDRV_SUCCESS;
+}
+
+/***************************************************************************
+ * McBdsp_Stop
+ *
+ * Function:
+ * Dsp stop
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ *
+ ****************************************************************************/
+SINT32 McBdsp_Stop(void)
+{
+ if (gsBdspInfo.dStatus == (UINT32)BDSP_STATUS_IDLE)
+ return MCDRV_SUCCESS;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_BDSPTREQ),
+ MCI_BDSPTREQ_DEF);
+
+ gsBdspInfo.bDSPCtl = (UINT8)MCI_BDSPCTRL_DEF;
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | (UINT32)MCI_BDSPCTRL),
+ gsBdspInfo.bDSPCtl);
+
+ McDevIf_ExecutePacket();
+
+ return MCDRV_SUCCESS;
+}
+