aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/ymu831/mcfdspdrv.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs/ymu831/mcfdspdrv.c')
-rw-r--r--sound/soc/codecs/ymu831/mcfdspdrv.c3337
1 files changed, 3337 insertions, 0 deletions
diff --git a/sound/soc/codecs/ymu831/mcfdspdrv.c b/sound/soc/codecs/ymu831/mcfdspdrv.c
new file mode 100644
index 0000000..593175f
--- /dev/null
+++ b/sound/soc/codecs/ymu831/mcfdspdrv.c
@@ -0,0 +1,3337 @@
+/****************************************************************************
+ *
+ * Copyright(c) 2012 Yamaha Corporation. All rights reserved.
+ *
+ * Module : mcfdspdrv.c
+ *
+ * Description : MC Fdsp 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 "mcfdspdrv.h"
+
+
+/* inside definition */
+
+#define IRQ_NO_ERROR (0)
+#define IRQ_ERROR (1)
+
+#define FDSP_STATUS_IDLE (0)
+#define FDSP_STATUS_INITED (1)
+
+#define CHUNK_SIZE (8)
+
+#define AEC_FULL_FW (1)
+#define AEC_APP_FW (2)
+#define AEC_APP_COEF_FW (3)
+#define AEC_APP_REG_FW (4)
+
+#define COEF_DMA_TRANS (0)
+#define COEF_DSP_TRANS (1)
+#define COEF_DSP_TRANS_MAX (512)
+
+#define AEC_FDSP_TAG_FWCTRL (0x00000100)
+#define FWCTRL_SIZE (27)
+#define AEC_FDSP_TAG_CHSEL (0x00000200)
+#define CHSEL_SIZE (33)
+#define AEC_FDSP_TAG_TOP_ENV (0x00000300)
+#define TOP_ENV_SIZE (29)
+#define AEC_FDSP_TAG_TOP_COEF (0x00000400)
+#define TOP_COEF_FIX_SIZE (8)
+#define AEC_FDSP_TAG_TOP_INS (0x00000500)
+#define TOP_INS_FIX_SIZE (8)
+#define AEC_FDSP_TAG_APP_MASK (0xFFFFFF00)
+#define AEC_FDSP_TAG_APPNO_MASK (0xFF)
+#define AEC_FDSP_TAG_APP_ENV (0x00000600)
+#define APP_ENV_FIX_SIZE (38)
+#define AEC_FDSP_TAG_APP_COEF (0x00000700)
+#define APP_COEF_FIX_SIZE (9)
+#define AEC_FDSP_TAG_APP_CONST (0x00000800)
+#define AEC_FDSP_TAG_APP_INS (0x00000900)
+#define APP_INS_FIX_SIZE (8)
+#define AEC_FDSP_TAG_APP_REG (0x00000A00)
+#define APP_REG_FIX_SIZE (8)
+#define AEC_FDSP_TAG_EX_INFO_1 (0x00000B00)
+#define EX_INFO_1_SIZE (4)
+
+#define FWCTL_FWMOD (0)
+#define FWCTL_FS (1)
+#define FWCTL_APPEXEC (2)
+#define FWCTL_FADECODE (26)
+
+#define CHSEL_BYPASS (0)
+#define CHSEL_INFDSPSRC (1)
+#define CHSEL_OUTAUDIOSRC (17)
+
+#define TOP_ENV_ID (0)
+#define TOP_ENV_INSTBASE (1)
+#define TOP_ENV_MBLKSIZE (5)
+#define TOP_ENV_MBUFSIZE (6)
+#define TOP_ENV_MOCHCNFG (7)
+#define TOP_ENV_MICHCNFG (8)
+#define TOP_ENV_SSTARTCH (9)
+#define TOP_ENV_SNUMOFOCH (10)
+#define TOP_ENV_SNUMOFICH (11)
+#define TOP_ENV_SAVEBUFSIZE1 (12)
+#define TOP_ENV_SAVEBUFSIZE0 (16)
+#define TOP_ENV_LIMITWORKSIZE (20)
+#define TOP_ENV_WORKBASE (24)
+#define TOP_ENV_TOPBASE0 (28)
+
+#define TOP_COEF_ADR (0)
+#define TOP_COEF_SIZE (4)
+#define TOP_COEF_DATA (8)
+
+#define TOP_INST_ADR (0)
+#define TOP_INST_SIZE (4)
+#define TOP_INST_DATA (8)
+
+#define APP_ENV_ID (0)
+#define APP_ENV_EXCECPROCESS (1)
+#define APP_ENV_INSTBASE (2)
+#define APP_ENV_REGBASE (6)
+#define APP_ENV_EXECFS (10)
+#define APP_ENV_EXECCH (14)
+#define APP_ENV_WORKBASE (18)
+#define APP_ENV_APPBASE0 (22)
+#define APP_ENV_APPBASE1 (26)
+#define APP_ENV_APPBASE2 (30)
+#define APP_ENV_APPBASE3 (34)
+#define APP_ENV_APPFADE (38)
+#define APP_ENV_APPIRQ (39)
+
+#define APP_COEF_ADR (0)
+#define APP_COEF_SIZE (5)
+#define APP_COEF_DATA (9)
+
+#define APP_INST_ADR (0)
+#define APP_INST_SIZE (4)
+#define APP_INST_DATA (8)
+
+#define APP_REG_ADR (0)
+#define APP_REG_SIZE (4)
+#define APP_REG_DATA (8)
+
+#define APP_PARAM_ON (1)
+
+#define FDSP_FREQ_MIN (1)
+#define FDSP_FREQ_MAX (5)
+
+#define MULTI_CHUNK_TOP_COEF (1)
+#define MULTI_CHUNK_APP_COEF (2)
+#define MULTI_CHUNK_APP_REG (3)
+
+#define RAM_UNIT_SIZE (4UL)
+#define DXRAM_RANGE_MIN (0x0UL)
+#define DXRAM_RANGE_MAX_1 (0x07FFFUL)
+#define DXRAM_RANGE_MAX_2 (0x08FFFUL)
+#define DYRAM_RANGE_MIN (0x0UL)
+#define DYRAM_RANGE_MAX (0x017FFUL)
+#define IRAM_RANGE_MIN (0x10000UL)
+#define IRAM_RANGE_MAX_1 (0x13FFFUL)
+#define IRAM_RANGE_MAX_2 (0x12FFFUL)
+
+#define STOP_KIND_NONE (0x00)
+#define STOP_KIND_FDSP (0x01)
+#define STOP_KIND_APP_EXEC (0x02)
+#define STOP_KIND_APP (0x04)
+#define STOP_KIND_WAIT (0x08)
+
+#define RESTART_OFF (0)
+#define RESTART_ON (1)
+#define RESTART_BYPASS (2)
+
+#define APP_VOL_ID (0x07)
+#define FIX_APP_VOL_FREE (0)
+#define FIX_APP_VOL_EXIST (1)
+#define FIX_APP_VOL_NO (22)
+#define FIX_APP_VOL_ACT MCI_APPACT0
+#define FIX_APP_VOL_BIT MCB_APPACT22
+#define FIX_APP_VOL_APPEXEC (0x400000)
+#define FIX_APP_VOL_REG_BASE (0x4F)
+#define FIX_APP_VOL_REG_FADE_CTRL (FIX_APP_VOL_REG_BASE + 1)
+#define FIX_APP_VOL_REG_FADE_CTRL_BIT (0x01)
+#define FIX_APP_VOL_REG_FADE_STE (FIX_APP_VOL_REG_BASE + 2)
+#define FIX_APP_VOL_REG_FADE_STE_BIT (0x01)
+#define FIX_APP_FADE_WAIT_TIME_US (10000)
+
+#define DEF_FDSP_STOP_WAIT_TIME_US (15000)
+
+struct MCDRV_FDSP_INFO {
+ /* state */
+ UINT32 dStatus;
+ /* info */
+ struct MCDRV_FDSP_INIT sInit;
+ SINT32(*cbfunc)(SINT32, UINT32, UINT32);
+ UINT32 dAppStop;
+ UINT32 dAppIEnb;
+ UINT32 dAppFade;
+ UINT8 bDSPBypass;
+ UINT8 bFixAppVol;
+ /* register */
+ UINT8 bADIMute0;
+ UINT8 bADIMute1;
+ UINT8 bADOMute0;
+ UINT8 bADOMute1;
+ UINT8 bDSPCtl;
+ UINT8 bAppExec0;
+ UINT8 bAppExec1;
+ UINT8 bAppExec2;
+ UINT8 bAppIEnb0;
+ UINT8 bAppIEnb1;
+ UINT8 bAppIEnb2;
+};
+
+struct MCDRV_FDSP_AEC_FDSP_INFO {
+ UINT8 *pbChunkData;
+ UINT32 dwSize;
+ UINT8 bMustStop;
+ UINT8 *pbFwctrl;
+ UINT8 *pbChSel;
+ UINT8 *pbTopEnv;
+ UINT32 dTopCoefCnt;
+ UINT8 *pbTopInst;
+ UINT32 dTargetApp;
+ UINT32 dAppEnvCnt;
+ UINT8 *apbAppEnv[FDSP_APP_NUM];
+ UINT8 bCoefTrans;
+ UINT32 dAppCoefCnt;
+ UINT32 dAppCnstCnt;
+ UINT32 dAppMaxCoefCnstNum;
+ UINT32 dAppInstCnt;
+ UINT8 *apbAppInst[FDSP_APP_NUM];
+ UINT32 dAppRegCnt;
+ UINT8 *pbExInfo1;
+ UINT32 dAppExec;
+};
+
+struct MCDRV_FDSP_EXEC_INFO {
+ UINT32 dAppExec;
+ UINT8 bRestart;
+};
+
+static struct MCDRV_FDSP_INFO gsFdspInfo = {
+ FDSP_STATUS_IDLE,
+ {
+ {0},
+ {0},
+ DEF_FDSP_STOP_WAIT_TIME_US
+ },
+ NULL,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+};
+
+/****************************************************************************
+ * GetAppAct
+ *
+ * Description:
+ * APP operation state acquisition
+ * Arguments:
+ * none
+ * Return:
+ * APP State
+ *
+ ****************************************************************************/
+static UINT32 GetAppAct(void)
+{
+ UINT32 dAppAct;
+ UINT8 bData;
+
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPACT0), &bData, 1);
+ dAppAct = ((UINT32)bData << 16);
+
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPACT1), &bData, 1);
+ dAppAct |= ((UINT32)bData << 8);
+
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPACT2), &bData, 1);
+ dAppAct |= (UINT32)bData;
+
+ return dAppAct;
+}
+
+/****************************************************************************
+ * GetChMute
+ *
+ * Description:
+ * Specified channel Mute information acquisition
+ * Arguments:
+ * bADMute mute information
+ * bChMuteBit Specified channel
+ * Return:
+ * Mute ON/OFF information
+ *
+ ****************************************************************************/
+static UINT8 GetChMute(UINT8 bADMute, UINT8 bChMuteBit)
+{
+ if ((bADMute & bChMuteBit) == bChMuteBit)
+ return FDSP_MUTE_OFF;
+
+ return FDSP_MUTE_ON;
+}
+
+/****************************************************************************
+ * CreateMuteReg
+ *
+ * Description:
+ * Mute register value making
+ * Arguments:
+ * bADMute mute register value
+ * bMute mute specification
+ * bChMuteBit specified channel
+ * Return:
+ * mute register value
+ *
+ ****************************************************************************/
+static UINT8 CreateMuteReg(UINT8 bADMute, UINT8 bMute, UINT8 bChMuteBit)
+{
+ switch (bMute) {
+ case FDSP_MUTE_ON:
+ bADMute &= (UINT8)~bChMuteBit;
+ break;
+
+ case FDSP_MUTE_OFF:
+ bADMute |= bChMuteBit;
+ break;
+
+ default:
+ break;
+ }
+
+ return bADMute;
+}
+
+/****************************************************************************
+ * 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;
+}
+
+/****************************************************************************
+ * SetAudioIF
+ *
+ * Description:
+ * Setting of Audio I/F
+ * Arguments:
+ * psFdspInit MCDRV_FDSP_AUDIO_INIT structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void SetAudioIF(struct MCDRV_FDSP_INIT *psFdspInit)
+{
+ /* ADIDFmt0 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADIDFMT0),
+ (UINT8)(psFdspInit->sInput.wADDFmt & 0xFF));
+ /* ADIDFmt1 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADIDFMT1),
+ (UINT8)((psFdspInit->sInput.wADDFmt >> 8) & 0xFF));
+
+
+ /* ADODFmt0 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADODFMT0),
+ (UINT8)(psFdspInit->sOutput.wADDFmt & 0xFF));
+ /* ADODFmt1 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADODFMT1),
+ (UINT8)((psFdspInit->sOutput.wADDFmt >> 8) & 0xFF));
+
+ McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * InitCore
+ *
+ * Description:
+ * Init F-DSP
+ * Arguments:
+ * none
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void InitCore(void)
+{
+ gsFdspInfo.dAppStop = 0UL;
+ gsFdspInfo.dAppIEnb = 0UL;
+ gsFdspInfo.dAppFade = 0UL;
+ gsFdspInfo.bDSPBypass = 0UL;
+ gsFdspInfo.bFixAppVol = FIX_APP_VOL_FREE;
+
+ gsFdspInfo.bDSPCtl = MCI_DSPCTRL_DEF;
+ gsFdspInfo.bAppExec0 = MCI_APPEXEC0_DEF;
+ gsFdspInfo.bAppExec1 = MCI_APPEXEC1_DEF;
+ gsFdspInfo.bAppExec2 = MCI_APPEXEC2_DEF;
+ gsFdspInfo.bAppIEnb0 = MCI_APPIENB0_DEF;
+ gsFdspInfo.bAppIEnb1 = MCI_APPIENB1_DEF;
+ gsFdspInfo.bAppIEnb2 = MCI_APPIENB2_DEF;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_DSPCTRL),
+ gsFdspInfo.bDSPCtl);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPEXEC0),
+ gsFdspInfo.bAppExec0);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPEXEC1),
+ gsFdspInfo.bAppExec1);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPEXEC2),
+ gsFdspInfo.bAppExec2);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPIENB0),
+ gsFdspInfo.bAppIEnb0);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPIENB1),
+ gsFdspInfo.bAppIEnb1);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPIENB2),
+ gsFdspInfo.bAppIEnb2);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADIMUTE0),
+ gsFdspInfo.bADIMute0);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADIMUTE1),
+ gsFdspInfo.bADIMute1);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADIMUTE2),
+ MCB_ADIMTSET);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOMUTE0),
+ gsFdspInfo.bADOMute0);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOMUTE1),
+ gsFdspInfo.bADOMute1);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOMUTE2),
+ MCB_ADOMTSET);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPFADE0),
+ 0x00);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPFADE1),
+ 0x00);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPFADE2),
+ 0x00);
+ McDevIf_ExecutePacket();
+
+ SetAudioIF(&gsFdspInfo.sInit);
+}
+
+/****************************************************************************
+ * GetFDSPChunk
+ *
+ * Description:
+ * Get FDSP chunk
+ * Arguments:
+ * psPrm MCDRV_AEC_INFO structure pointer
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+static SINT32 GetFDSPChunk(struct MCDRV_AEC_INFO *psPrm,
+ struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo)
+{
+ psFdspInfo->pbChunkData = NULL;
+ psFdspInfo->dwSize = 0;
+
+ switch (psPrm->sAecConfig.bFDspLocate) {
+ case FDSP_LOCATE_AUDIOENGINE:
+ if (psPrm->sAecAudioengine.bEnable == AEC_AUDIOENGINE_ENABLE) {
+
+ if (psPrm->sAecAudioengine.bFDspOnOff == FDSP_OFF)
+ return MCDRV_SUCCESS;
+
+ psFdspInfo->pbChunkData =
+ psPrm->sAecAudioengine.sAecFDsp.pbChunkData;
+ psFdspInfo->dwSize =
+ psPrm->sAecAudioengine.sAecFDsp.dwSize;
+ }
+ break;
+
+ case FDSP_LOCATE_V_BOX:
+ if (psPrm->sAecVBox.bEnable == AEC_AUDIOENGINE_ENABLE) {
+
+ if (psPrm->sAecVBox.bFDspOnOff == FDSP_OFF)
+ return MCDRV_SUCCESS;
+
+ psFdspInfo->pbChunkData =
+ psPrm->sAecVBox.sAecFDsp.pbChunkData;
+ psFdspInfo->dwSize =
+ psPrm->sAecVBox.sAecFDsp.dwSize;
+ }
+ break;
+
+ default:
+ return MCDRV_ERROR_ARGUMENT;
+ }
+
+ if (psFdspInfo->pbChunkData != NULL)
+ psFdspInfo->pbChunkData = &psFdspInfo->pbChunkData[CHUNK_SIZE];
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * FwctrlChunkAnalyze
+ *
+ * Description:
+ * FWCTRL chunk analysis
+ * Arguments:
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * pbPrm FWCTRL chunk pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+static SINT32 FwctrlChunkAnalyze(struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo,
+ UINT8 *pbPrm)
+{
+ UINT32 i;
+
+ if (pbPrm[FWCTL_FWMOD] != 0x00)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if ((pbPrm[FWCTL_FS] != 0xFF) || (pbPrm[FWCTL_FADECODE] != 0xFF))
+ psFdspInfo->bMustStop |= STOP_KIND_FDSP;
+
+ for (i = 0; i < (UINT32)FDSP_APP_NUM; ++i)
+ if ((pbPrm[FWCTL_APPEXEC + i] != FDSP_APP_EXEC_DONTCARE) &&
+ (i != FIX_APP_VOL_NO)) {
+ psFdspInfo->bMustStop |= STOP_KIND_APP_EXEC;
+ break;
+ }
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * FixAppCheck
+ *
+ * Description:
+ * Check Fix APP
+ * Arguments:
+ * dAppNo App No
+ * pbAppEnv App Env pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+static SINT32 FixAppCheck(UINT32 dAppNo, UINT8 *pbAppEnv)
+{
+ if (dAppNo != FIX_APP_VOL_NO)
+ return MCDRV_SUCCESS;
+
+ if (pbAppEnv[APP_ENV_ID] == 0x00)
+ return MCDRV_SUCCESS;
+
+ if (pbAppEnv[APP_ENV_ID] != APP_VOL_ID)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if ((UINT8)(pbAppEnv[APP_ENV_REGBASE + 3] & 0x7F) !=
+ FIX_APP_VOL_REG_BASE)
+ return MCDRV_ERROR_ARGUMENT;
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * AppChunkAnalyze
+ *
+ * Description:
+ * APP chunk analysis
+ * Arguments:
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * dChunkId chunk id
+ * dChunkSize chunk size
+ * dChunkTop chunk top position
+ * pbPrm chunk pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+static SINT32 AppChunkAnalyze(struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo,
+ UINT32 dChunkId, UINT32 dChunkSize,
+ UINT32 dChunkTop, UINT8 *pbPrm)
+{
+ UINT32 dAppNo;
+ UINT32 dTemp;
+
+ switch ((dChunkId & (UINT32)AEC_FDSP_TAG_APP_MASK)) {
+ case AEC_FDSP_TAG_APP_ENV:
+ dAppNo = (dChunkId & (UINT32)AEC_FDSP_TAG_APPNO_MASK);
+ if (dAppNo < (UINT32)FDSP_APP_NUM) {
+ if (dChunkSize < (UINT32)APP_ENV_FIX_SIZE)
+ return MCDRV_ERROR_ARGUMENT;
+ if (psFdspInfo->apbAppEnv[dAppNo] != NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (FixAppCheck(dAppNo, &pbPrm[dChunkTop])
+ != MCDRV_SUCCESS)
+ return MCDRV_ERROR_ARGUMENT;
+
+ psFdspInfo->apbAppEnv[dAppNo] = &pbPrm[dChunkTop];
+ ++(psFdspInfo->dAppEnvCnt);
+ psFdspInfo->dTargetApp |= (0x01UL << dAppNo);
+ psFdspInfo->bCoefTrans = COEF_DMA_TRANS;
+
+ psFdspInfo->bMustStop |= STOP_KIND_APP;
+ }
+ break;
+
+ case AEC_FDSP_TAG_APP_COEF:
+ case AEC_FDSP_TAG_APP_CONST:
+ dAppNo = (dChunkId & (UINT32)AEC_FDSP_TAG_APPNO_MASK);
+ if (dAppNo < (UINT32)FDSP_APP_NUM) {
+ 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)
+ break;
+ if ((dTemp & 0x03UL) != 0UL)
+ return MCDRV_ERROR_ARGUMENT;
+ if (dChunkSize < (dTemp + (UINT32)APP_COEF_FIX_SIZE))
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (COEF_DSP_TRANS != pbPrm[dChunkTop + 4UL]) {
+ psFdspInfo->bCoefTrans = COEF_DMA_TRANS;
+ psFdspInfo->bMustStop |= STOP_KIND_APP;
+ }
+
+ if ((UINT32)AEC_FDSP_TAG_APP_COEF ==
+ (dChunkId & (UINT32)AEC_FDSP_TAG_APP_MASK))
+ ++(psFdspInfo->dAppCoefCnt);
+ else
+ ++(psFdspInfo->dAppCnstCnt);
+
+ psFdspInfo->dTargetApp |= (0x01UL << dAppNo);
+ if (psFdspInfo->dAppMaxCoefCnstNum < dTemp)
+ psFdspInfo->dAppMaxCoefCnstNum = dTemp;
+
+ psFdspInfo->bMustStop |= STOP_KIND_WAIT;
+ }
+ break;
+
+ case AEC_FDSP_TAG_APP_INS:
+ dAppNo = (dChunkId & (UINT32)AEC_FDSP_TAG_APPNO_MASK);
+ if (dAppNo < (UINT32)FDSP_APP_NUM) {
+ if (dChunkSize < (UINT32)APP_INS_FIX_SIZE)
+ return MCDRV_ERROR_ARGUMENT;
+ if (psFdspInfo->apbAppInst[dAppNo] != NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ dTemp = CreateUINT32(pbPrm[dChunkTop + 4UL],
+ pbPrm[dChunkTop + 5UL],
+ pbPrm[dChunkTop + 6UL],
+ pbPrm[dChunkTop + 7UL]);
+ if (dTemp == 0UL)
+ break;
+ if ((dTemp & 0x03UL) != 0UL)
+ return MCDRV_ERROR_ARGUMENT;
+ if (dChunkSize < (dTemp + (UINT32)APP_INS_FIX_SIZE))
+ return MCDRV_ERROR_ARGUMENT;
+
+ psFdspInfo->apbAppInst[dAppNo] = &pbPrm[dChunkTop];
+ ++(psFdspInfo->dAppInstCnt);
+ psFdspInfo->dTargetApp |= (0x01UL << dAppNo);
+ psFdspInfo->bCoefTrans = COEF_DMA_TRANS;
+
+ psFdspInfo->bMustStop |= STOP_KIND_APP;
+ }
+ break;
+
+ case AEC_FDSP_TAG_APP_REG:
+ dAppNo = (dChunkId & (UINT32)AEC_FDSP_TAG_APPNO_MASK);
+ if (dAppNo < (UINT32)FDSP_APP_NUM) {
+ if (dChunkSize < (UINT32)APP_REG_FIX_SIZE)
+ return MCDRV_ERROR_ARGUMENT;
+ dTemp = CreateUINT32(pbPrm[dChunkTop + 4UL],
+ pbPrm[dChunkTop + 5UL],
+ pbPrm[dChunkTop + 6UL],
+ pbPrm[dChunkTop + 7UL]);
+ if (dTemp == 0UL)
+ break;
+ if (dChunkSize < (dTemp + (UINT32)APP_REG_FIX_SIZE))
+ return MCDRV_ERROR_ARGUMENT;
+ ++(psFdspInfo->dAppRegCnt);
+
+ psFdspInfo->bMustStop |= STOP_KIND_WAIT;
+ }
+ break;
+
+ default:
+ /* unknown */
+ break;
+ }
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * CoefTransCheck
+ *
+ * Description:
+ * Coefficient transfer check
+ * Arguments:
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void CoefTransCheck(struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo)
+{
+ if (psFdspInfo->bCoefTrans != COEF_DSP_TRANS)
+ return;
+
+ if ((psFdspInfo->dAppCoefCnt == 0UL) &&
+ (psFdspInfo->dAppCnstCnt == 0UL))
+ return;
+
+ if (((UINT32)COEF_DSP_TRANS_MAX < psFdspInfo->dAppMaxCoefCnstNum) ||
+ (1UL < (psFdspInfo->dAppCoefCnt + psFdspInfo->dAppCnstCnt)))
+ psFdspInfo->bCoefTrans = COEF_DMA_TRANS;
+
+ if (psFdspInfo->bCoefTrans == COEF_DMA_TRANS)
+ psFdspInfo->bMustStop |= STOP_KIND_APP;
+}
+
+/****************************************************************************
+ * FdspChunkAnalyze
+ *
+ * Description:
+ * FDSP chunk analysis
+ * Arguments:
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+static SINT32 FdspChunkAnalyze(struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo)
+{
+ UINT32 dChunkTop;
+ UINT32 dChunkId;
+ UINT32 dChunkSize;
+ UINT8 *pbPrm;
+ UINT32 dSize;
+ UINT32 dTemp;
+ UINT32 i;
+
+ psFdspInfo->bMustStop = STOP_KIND_NONE;
+ psFdspInfo->pbFwctrl = NULL;
+ psFdspInfo->pbChSel = NULL;
+ psFdspInfo->pbTopEnv = NULL;
+ psFdspInfo->dTopCoefCnt = 0UL;
+ psFdspInfo->pbTopInst = NULL;
+ psFdspInfo->dTargetApp = 0UL;
+ psFdspInfo->dAppEnvCnt = 0UL;
+ psFdspInfo->bCoefTrans = COEF_DSP_TRANS;
+ psFdspInfo->dAppCoefCnt = 0UL;
+ psFdspInfo->dAppCnstCnt = 0UL;
+ psFdspInfo->dAppMaxCoefCnstNum = 0UL;
+ psFdspInfo->dAppInstCnt = 0UL;
+ psFdspInfo->dAppRegCnt = 0UL;
+ psFdspInfo->pbExInfo1 = NULL;
+ for (i = 0UL; i < (UINT32)FDSP_APP_NUM; ++i) {
+ psFdspInfo->apbAppEnv[i] = NULL;
+ psFdspInfo->apbAppInst[i] = NULL;
+ }
+
+ if ((psFdspInfo->pbChunkData == NULL) || (psFdspInfo->dwSize == 0))
+ return MCDRV_SUCCESS;
+
+ pbPrm = psFdspInfo->pbChunkData;
+ dSize = psFdspInfo->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_FDSP_TAG_FWCTRL:
+ if (dChunkSize < (UINT32)FWCTRL_SIZE)
+ return MCDRV_ERROR_ARGUMENT;
+ if (psFdspInfo->pbFwctrl != NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (FwctrlChunkAnalyze(psFdspInfo,
+ &pbPrm[dChunkTop]) != MCDRV_SUCCESS)
+ return MCDRV_ERROR_ARGUMENT;
+
+ psFdspInfo->pbFwctrl = &pbPrm[dChunkTop];
+ break;
+
+ case AEC_FDSP_TAG_CHSEL:
+ if (dChunkSize < (UINT32)CHSEL_SIZE)
+ return MCDRV_ERROR_ARGUMENT;
+ if (psFdspInfo->pbChSel != NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ psFdspInfo->pbChSel = &pbPrm[dChunkTop];
+ psFdspInfo->bMustStop |= STOP_KIND_FDSP;
+ break;
+
+ case AEC_FDSP_TAG_TOP_ENV:
+ if (dChunkSize < (UINT32)TOP_ENV_SIZE)
+ return MCDRV_ERROR_ARGUMENT;
+ if (psFdspInfo->pbTopEnv != NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ psFdspInfo->pbTopEnv = &pbPrm[dChunkTop];
+ psFdspInfo->bMustStop |= STOP_KIND_FDSP;
+ break;
+
+ case AEC_FDSP_TAG_TOP_COEF:
+ if (dChunkSize < (UINT32)TOP_COEF_FIX_SIZE)
+ return MCDRV_ERROR_ARGUMENT;
+ dTemp = CreateUINT32(pbPrm[dChunkTop + 4UL],
+ pbPrm[dChunkTop + 5UL],
+ pbPrm[dChunkTop + 6UL],
+ pbPrm[dChunkTop + 7UL]);
+ if ((dTemp & 0x03UL) != 0UL)
+ return MCDRV_ERROR_ARGUMENT;
+ if (dChunkSize < (dTemp + (UINT32)TOP_COEF_FIX_SIZE))
+ return MCDRV_ERROR_ARGUMENT;
+
+ ++(psFdspInfo->dTopCoefCnt);
+ psFdspInfo->bMustStop |= STOP_KIND_FDSP;
+ break;
+
+ case AEC_FDSP_TAG_TOP_INS:
+ if (dChunkSize < (UINT32)TOP_INS_FIX_SIZE)
+ return MCDRV_ERROR_ARGUMENT;
+ if (psFdspInfo->pbTopInst != NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ dTemp = CreateUINT32(pbPrm[dChunkTop + 4UL],
+ pbPrm[dChunkTop + 5UL],
+ pbPrm[dChunkTop + 6UL],
+ pbPrm[dChunkTop + 7UL]);
+ if (dTemp == 0UL)
+ break;
+ if ((dTemp & 0x03UL) != 0UL)
+ return MCDRV_ERROR_ARGUMENT;
+ if (dChunkSize < (dTemp + (UINT32)TOP_INS_FIX_SIZE))
+ return MCDRV_ERROR_ARGUMENT;
+ psFdspInfo->pbTopInst = &pbPrm[dChunkTop];
+ psFdspInfo->bMustStop |= STOP_KIND_FDSP;
+ break;
+
+ default:
+ if (AppChunkAnalyze(psFdspInfo,
+ dChunkId, dChunkSize, dChunkTop, pbPrm)
+ != MCDRV_SUCCESS)
+ return MCDRV_ERROR_ARGUMENT;
+ }
+ dChunkTop += dChunkSize;
+ }
+
+ CoefTransCheck(psFdspInfo);
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * SetAppIrq
+ *
+ * Description:
+ * App interrupt setting
+ * Arguments:
+ * dAppIEnb interrupt setting
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void SetAppIrq(UINT32 dAppIEnb)
+{
+ UINT8 bAppIEnb0;
+ UINT8 bAppIEnb1;
+ UINT8 bAppIEnb2;
+ UINT8 bData;
+
+ bAppIEnb0 = (UINT8)((dAppIEnb >> 16) & 0xFFUL);
+ bAppIEnb1 = (UINT8)((dAppIEnb >> 8) & 0xFFUL);
+ bAppIEnb2 = (UINT8)(dAppIEnb & 0xFFUL);
+
+ if (gsFdspInfo.bAppIEnb0 != bAppIEnb0) {
+ bData = (UINT8)(bAppIEnb0 & (UINT8)~gsFdspInfo.bAppIEnb0);
+ if (bData != 0x00)
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP0),
+ bData);
+
+ gsFdspInfo.bAppIEnb0 = bAppIEnb0;
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPIENB0),
+ gsFdspInfo.bAppIEnb0);
+
+ McDevIf_ExecutePacket();
+ }
+
+ if (gsFdspInfo.bAppIEnb1 != bAppIEnb1) {
+ bData = (UINT8)(bAppIEnb1 & (UINT8)~gsFdspInfo.bAppIEnb1);
+ if (bData != 0x00)
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP1),
+ bData);
+
+ gsFdspInfo.bAppIEnb1 = bAppIEnb1;
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPIENB1),
+ gsFdspInfo.bAppIEnb1);
+
+ McDevIf_ExecutePacket();
+ }
+
+ if (gsFdspInfo.bAppIEnb2 != bAppIEnb2) {
+ bData = (UINT8)(bAppIEnb2 & (UINT8)~gsFdspInfo.bAppIEnb2);
+ if (bData != 0x00)
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP2),
+ bData);
+
+ gsFdspInfo.bAppIEnb2 = bAppIEnb2;
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPIENB2),
+ gsFdspInfo.bAppIEnb2);
+
+ McDevIf_ExecutePacket();
+ }
+}
+
+/****************************************************************************
+ * DisableIrq
+ *
+ * Description:
+ * Interrupt disable setting
+ * Arguments:
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void DisableIrq(struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo)
+{
+ if ((psFdspInfo->bMustStop & STOP_KIND_FDSP) != 0) {
+ /* IEnb */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IESERR),
+ MCI_IESERR_DEF);
+
+ /* TopIEnb */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_TOPIENB),
+ MCI_TOPIENB_DEF);
+
+ McDevIf_ExecutePacket();
+
+ SetAppIrq(0x00);
+
+ } else if ((psFdspInfo->bMustStop & STOP_KIND_APP) != 0)
+ SetAppIrq((gsFdspInfo.dAppIEnb & ~psFdspInfo->dTargetApp));
+}
+
+/****************************************************************************
+ * FixAppVolFadeOut
+ *
+ * Description:
+ * Fixed VOL fadeout
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_TIMEOUT
+ *
+ ****************************************************************************/
+static SINT32 FixAppVolFadeOut(void)
+{
+ UINT8 bAct;
+
+ if (gsFdspInfo.bFixAppVol != FIX_APP_VOL_EXIST)
+ return MCDRV_SUCCESS;
+
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)FIX_APP_VOL_ACT), &bAct, 1);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP0),
+ MCB_IRAPP22);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)FIX_APP_VOL_REG_FADE_CTRL),
+ 0x00);
+
+ McDevIf_ExecutePacket();
+
+ if ((bAct & FIX_APP_VOL_BIT) == 0)
+ return MCDRV_SUCCESS;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_TIMWAIT
+ | (UINT32)FIX_APP_FADE_WAIT_TIME_US),
+ 0x00);
+
+ McDevIf_ExecutePacket();
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * DSPTransWait
+ *
+ * Description:
+ * DSP forwarding waiting
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_TIMEOUT
+ *
+ ****************************************************************************/
+static SINT32 DSPTransWait(void)
+{
+ SINT32 sdResult;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_IF_REG_FLAG_RESET
+ | (((UINT32)MCI_FDSPTREQ) << 8)
+ | (UINT32)MCB_FDSPTREQ),
+ 0);
+
+ sdResult = McDevIf_ExecutePacket();
+
+ return sdResult;
+}
+
+/****************************************************************************
+ * SetFdspCtrl
+ *
+ * Description:
+ * Execution and stop settings of F-DSP
+ * Arguments:
+ * bDSPCtl DSPCtl register value
+ * Return:
+ * MCDRV_SUCCESS
+ * FDSP_DRV_SUCCESS_STOPED
+ *
+ ****************************************************************************/
+static SINT32 SetFdspCtrl(UINT8 bDSPCtl)
+{
+ UINT8 bData;
+ SINT32 sdResult;
+
+ sdResult = MCDRV_SUCCESS;
+
+ if ((bDSPCtl & MCB_DSPSTART) != MCB_DSPSTART) {
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_DSPSTATE),
+ &bData, 1);
+ if ((bData & MCB_DSPACT) != MCB_DSPACT)
+ sdResult = FDSP_DRV_SUCCESS_STOPED;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FDSPTREQ),
+ MCI_FDSPTREQ_DEF);
+ }
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_DSPCTRL),
+ bDSPCtl);
+
+ McDevIf_ExecutePacket();
+
+ gsFdspInfo.bDSPCtl = bDSPCtl;
+
+ return sdResult;
+}
+
+/****************************************************************************
+ * FdspStop
+ *
+ * Description:
+ * Stop F-DSP
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ * FDSP_DRV_SUCCESS_STOPED
+ * MCDRV_ERROR_TIMEOUT
+ *
+ ****************************************************************************/
+static SINT32 FdspStop(void)
+{
+ SINT32 sdResult;
+
+ sdResult = SetFdspCtrl(MCI_DSPCTRL_DEF);
+ if (sdResult != (SINT32)FDSP_DRV_SUCCESS_STOPED) {
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_TIMWAIT
+ | gsFdspInfo.sInit.dWaitTime),
+ 0x00);
+
+ McDevIf_ExecutePacket();
+
+ if (gsFdspInfo.cbfunc != NULL) {
+ gsFdspInfo.cbfunc(0, FDSP_CB_RESET, 0);
+ InitCore();
+ }
+ }
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * AppFade
+ *
+ * Description:
+ * APP Fade setting
+ * Arguments:
+ * none
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void AppFade(void)
+{
+ UINT8 bFade0;
+ UINT8 bFade1;
+ UINT8 bFade2;
+
+ bFade0 = (UINT8)((gsFdspInfo.dAppFade >> 16) & 0xFFUL);
+ bFade1 = (UINT8)((gsFdspInfo.dAppFade >> 8) & 0xFFUL);
+ bFade2 = (UINT8)(gsFdspInfo.dAppFade & 0xFFUL);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPFADE0), bFade0);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPFADE1), bFade1);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPFADE2), bFade2);
+
+ McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * SetAppExec
+ *
+ * Description:
+ * APP execution setting
+ * Arguments:
+ * bAppExec0 App23-16
+ * bAppExec1 App15-8
+ * bAppExec2 App7-0
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void SetAppExec(UINT8 bAppExec0, UINT8 bAppExec1, UINT8 bAppExec2)
+{
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPEXEC0),
+ bAppExec0);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPEXEC1),
+ bAppExec1);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPEXEC2),
+ bAppExec2);
+ McDevIf_ExecutePacket();
+
+ gsFdspInfo.bAppExec0 = bAppExec0;
+ gsFdspInfo.bAppExec1 = bAppExec1;
+ gsFdspInfo.bAppExec2 = bAppExec2;
+}
+
+/****************************************************************************
+ * AppStop
+ *
+ * Description:
+ * APP Stop
+ * Arguments:
+ * dAppStop Stopping APP
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_TIMEOUT
+ *
+ ****************************************************************************/
+static SINT32 AppStop(UINT32 dAppStop)
+{
+ UINT8 bAppStop0;
+ UINT8 bAppStop1;
+ UINT8 bAppStop2;
+ UINT8 bAppStop0Org;
+ UINT8 bAppStop1Org;
+ UINT8 bAppStop2Org;
+ UINT8 bAppExec0;
+ UINT8 bAppExec1;
+ UINT8 bAppExec2;
+ SINT32 sdResult;
+
+ sdResult = (SINT32)MCDRV_SUCCESS;
+
+ if (dAppStop == 0UL)
+ return sdResult;
+
+ bAppStop0 = (UINT8)((dAppStop >> 16) & (UINT32)MCB_APPEXEC0);
+ bAppStop1 = (UINT8)((dAppStop >> 8) & (UINT32)MCB_APPEXEC1);
+ bAppStop2 = (UINT8)(dAppStop & (UINT32)MCB_APPEXEC2);
+ bAppStop0Org = bAppStop0;
+ bAppStop1Org = bAppStop1;
+ bAppStop2Org = bAppStop2;
+
+ bAppStop0 = (UINT8)(gsFdspInfo.bAppExec0 & bAppStop0);
+ bAppStop1 = (UINT8)(gsFdspInfo.bAppExec1 & bAppStop1);
+ bAppStop2 = (UINT8)(gsFdspInfo.bAppExec2 & bAppStop2);
+
+ bAppExec0 = (UINT8)(gsFdspInfo.bAppExec0 & (UINT8)~bAppStop0);
+ bAppExec1 = (UINT8)(gsFdspInfo.bAppExec1 & (UINT8)~bAppStop1);
+ bAppExec2 = (UINT8)(gsFdspInfo.bAppExec2 & (UINT8)~bAppStop2);
+ SetAppExec(bAppExec0, bAppExec1, bAppExec2);
+
+ if (bAppStop0Org != 0) {
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_F_REG_FLAG_RESET
+ | (((UINT32)MCI_APPACT0) << 8)
+ | (UINT32)bAppStop0Org), 0);
+
+ sdResult = McDevIf_ExecutePacket();
+ if (sdResult < MCDRV_SUCCESS)
+ return sdResult;
+ }
+ if (bAppStop1Org != 0) {
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_F_REG_FLAG_RESET
+ | (((UINT32)MCI_APPACT1) << 8)
+ | (UINT32)bAppStop1Org), 0);
+
+ sdResult = McDevIf_ExecutePacket();
+ if (sdResult < MCDRV_SUCCESS)
+ return sdResult;
+ }
+ if (bAppStop2Org != 0) {
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_F_REG_FLAG_RESET
+ | (((UINT32)MCI_APPACT2) << 8)
+ | (UINT32)bAppStop2Org), 0);
+
+ sdResult = McDevIf_ExecutePacket();
+ if (sdResult < MCDRV_SUCCESS)
+ return sdResult;
+ }
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP0), bAppStop0Org);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP1), bAppStop1Org);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP2), bAppStop2Org);
+
+ McDevIf_ExecutePacket();
+
+ return sdResult;
+}
+
+/****************************************************************************
+ * Stop
+ *
+ * Description:
+ * Stop of F-DSP and APP
+ * Arguments:
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_TIMEOUT
+ *
+ ****************************************************************************/
+static SINT32 Stop(struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo)
+{
+ SINT32 sdResult;
+
+ sdResult = (SINT32)MCDRV_SUCCESS;
+
+ if ((psFdspInfo->bMustStop & STOP_KIND_FDSP) != 0) {
+ if ((gsFdspInfo.bDSPCtl & (UINT8)MCB_DSPSTART) != 0) {
+ sdResult = FixAppVolFadeOut();
+ if (sdResult < MCDRV_SUCCESS)
+ return sdResult;
+
+ sdResult = DSPTransWait();
+ if (sdResult < MCDRV_SUCCESS)
+ return sdResult;
+
+ }
+ sdResult = FdspStop();
+ } else if ((psFdspInfo->bMustStop & STOP_KIND_APP) != 0) {
+ sdResult = DSPTransWait();
+ if (sdResult < MCDRV_SUCCESS)
+ return sdResult;
+
+ AppFade();
+ sdResult = AppStop(psFdspInfo->dTargetApp);
+
+ } else if ((psFdspInfo->bMustStop & STOP_KIND_WAIT) != 0)
+ sdResult = DSPTransWait();
+
+ return sdResult;
+}
+
+/****************************************************************************
+ * FwCtlDL
+ *
+ * Description:
+ * FWCTL Setting
+ * Arguments:
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void FwCtlDL(struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo)
+{
+ UINT8 bData;
+ UINT8 *pbFwCtl;
+ UINT32 i;
+
+ pbFwCtl = psFdspInfo->pbFwctrl;
+
+ /* AppExec */
+ for (i = 0; i < (UINT32)FDSP_APP_NUM; ++i) {
+ if (i != FIX_APP_VOL_NO) {
+ switch (pbFwCtl[FWCTL_APPEXEC + i]) {
+ case FDSP_APP_EXEC_STOP:
+ psFdspInfo->dAppExec &= ~(0x01UL << i);
+ break;
+
+ case FDSP_APP_EXEC_START:
+ psFdspInfo->dAppExec |= (0x01UL << i);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ if ((psFdspInfo->bMustStop & STOP_KIND_FDSP) == 0)
+ return;
+
+ /* FWMod */
+ bData = (UINT8)((pbFwCtl[FWCTL_FWMOD] << 4) & MCB_FWMOD);
+ /* Fs */
+ if (pbFwCtl[FWCTL_FS] != 0xFF) {
+ bData |= (UINT8)(pbFwCtl[FWCTL_FS] & MCB_FS);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_FWMOD),
+ bData);
+ }
+
+ /* FadeCode */
+ if (pbFwCtl[FWCTL_FADECODE] != 0xFF) {
+ bData = (pbFwCtl[FWCTL_FADECODE] & MCB_FADECODE);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_FADECODE),
+ bData);
+ }
+
+ McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * ChSelDL
+ *
+ * Description:
+ * CHSEL Setting
+ * Arguments:
+ * pbChSel CHSEL chunk pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void ChSelDL(UINT8 *pbChSel)
+{
+ UINT8 bData;
+
+ /* Bypass */
+ gsFdspInfo.bDSPBypass =
+ (UINT8)((pbChSel[CHSEL_BYPASS] << 7) & MCB_DSPBYPASS);
+
+ /* InFdspSrc */
+ bData = (UINT8)((pbChSel[CHSEL_INFDSPSRC + 1] << 4) & MCB_ADI01CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_INFDSPSRC + 0] & MCB_ADI00CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADICSEL0),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_INFDSPSRC + 3] << 4) & MCB_ADI03CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_INFDSPSRC + 2] & MCB_ADI02CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADICSEL1),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_INFDSPSRC + 5] << 4) & MCB_ADI05CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_INFDSPSRC + 4] & MCB_ADI04CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADICSEL2),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_INFDSPSRC + 7] << 4) & MCB_ADI07CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_INFDSPSRC + 6] & MCB_ADI06CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADICSEL3),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_INFDSPSRC + 9] << 4) & MCB_ADI09CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_INFDSPSRC + 8] & MCB_ADI08CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADICSEL4),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_INFDSPSRC + 11] << 4) & MCB_ADI11CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_INFDSPSRC + 10] & MCB_ADI10CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADICSEL5),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_INFDSPSRC + 13] << 4) & MCB_ADI13CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_INFDSPSRC + 12] & MCB_ADI12CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADICSEL6),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_INFDSPSRC + 15] << 4) & MCB_ADI15CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_INFDSPSRC + 14] & MCB_ADI14CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADICSEL7),
+ bData);
+
+ /* OutAudioSrc */
+ bData = (UINT8)((pbChSel[CHSEL_OUTAUDIOSRC + 1] << 4) & MCB_ADO01CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_OUTAUDIOSRC + 0] & MCB_ADO00CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOCSEL0),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_OUTAUDIOSRC + 3] << 4) & MCB_ADO03CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_OUTAUDIOSRC + 2] & MCB_ADO02CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOCSEL1),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_OUTAUDIOSRC + 5] << 4) & MCB_ADO05CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_OUTAUDIOSRC + 4] & MCB_ADO04CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOCSEL2),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_OUTAUDIOSRC + 7] << 4) & MCB_ADO07CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_OUTAUDIOSRC + 6] & MCB_ADO06CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOCSEL3),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_OUTAUDIOSRC + 9] << 4) & MCB_ADO09CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_OUTAUDIOSRC + 8] & MCB_ADO08CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOCSEL4),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_OUTAUDIOSRC + 11] << 4)
+ & MCB_ADO11CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_OUTAUDIOSRC + 10] & MCB_ADO10CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOCSEL5),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_OUTAUDIOSRC + 13] << 4)
+ & MCB_ADO13CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_OUTAUDIOSRC + 12] & MCB_ADO12CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOCSEL6),
+ bData);
+
+ bData = (UINT8)((pbChSel[CHSEL_OUTAUDIOSRC + 15] << 4)
+ & MCB_ADO15CSEL);
+ bData |= (UINT8)(pbChSel[CHSEL_OUTAUDIOSRC + 14] & MCB_ADO14CSEL);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOCSEL7),
+ bData);
+
+ McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * TopEnvDL
+ *
+ * Description:
+ * TOP environmental setting
+ * Arguments:
+ * pbTopEnv TOP environmental chunk pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void TopEnvDL(UINT8 *pbTopEnv)
+{
+ UINT8 bData;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_19_16),
+ 0x00);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_15_8),
+ 0x00);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_7_0),
+ 0x08);
+
+ /* OMACtl */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FDSPTINI), MCI_FDSPTINI_DEF);
+ McDevIf_ExecutePacket();
+
+ /* 0x00008 */
+ /* ID */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_ID]);
+ /* InstBase */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbTopEnv[TOP_ENV_INSTBASE + 1] & 0x1F));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_INSTBASE + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_INSTBASE + 3]);
+
+ /* 0x00009 */
+ /* MBlkSize */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbTopEnv[TOP_ENV_MBLKSIZE] & 0x1F));
+ /* MBufSize */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbTopEnv[TOP_ENV_MBUFSIZE] & 0x1F));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ /* MOChCnfg */
+ bData = ((pbTopEnv[TOP_ENV_MOCHCNFG] << 4) & 0xF0);
+ /* MIChCnfg */
+ bData |= (pbTopEnv[TOP_ENV_MICHCNFG] & 0x0F);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ bData);
+
+ /* 0x0000A */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ /* SStartCh */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbTopEnv[TOP_ENV_SSTARTCH] & 0x0F));
+ /* SNumOfOCh */
+ bData = ((pbTopEnv[TOP_ENV_SNUMOFOCH] << 4) & 0xF0);
+ /* SNumOfICh */
+ bData |= (pbTopEnv[TOP_ENV_SNUMOFICH] & 0x0F);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ bData);
+
+ /* 0x0000B */
+ /* SaveBufSize1 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_SAVEBUFSIZE1 + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_SAVEBUFSIZE1 + 3]);
+ /* SaveBufSize0 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_SAVEBUFSIZE0 + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_SAVEBUFSIZE0 + 3]);
+
+ /* 0x0000C */
+ /* LimitWorkSize */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbTopEnv[TOP_ENV_LIMITWORKSIZE + 1] & 0x0F));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_LIMITWORKSIZE + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_LIMITWORKSIZE + 3]);
+
+ /* 0x0000D */
+ /* WorkBase */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbTopEnv[TOP_ENV_WORKBASE + 1] & 0x0F));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_WORKBASE + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_WORKBASE + 3]);
+
+ /* 0x0000E */
+ /* TopBase0 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbTopEnv[TOP_ENV_TOPBASE0 + 1] & 0x1F));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_TOPBASE0 + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopEnv[TOP_ENV_TOPBASE0 + 3]);
+
+ McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * TopCoefDL
+ *
+ * Description:
+ * TOP coefficient setting
+ * Arguments:
+ * pbTopCoef TOP coefficient chunk pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void TopCoefDL(UINT8 *pbTopCoef)
+{
+ UINT32 dSize;
+ UINT32 i;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_19_16),
+ (UINT8)(pbTopCoef[TOP_COEF_ADR + 1] & MCB_FMAA_19_16));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_15_8),
+ (UINT8)(pbTopCoef[TOP_COEF_ADR + 2] & MCB_FMAA_15_8));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_7_0),
+ (UINT8)(pbTopCoef[TOP_COEF_ADR + 3] & MCB_FMAA_7_0));
+
+ /* OMACtl */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FDSPTINI),
+ MCI_FDSPTINI_DEF);
+
+ McDevIf_ExecutePacket();
+
+ dSize = CreateUINT32(pbTopCoef[TOP_COEF_SIZE + 0],
+ pbTopCoef[TOP_COEF_SIZE + 1],
+ pbTopCoef[TOP_COEF_SIZE + 2],
+ pbTopCoef[TOP_COEF_SIZE + 3]);
+
+ for (i = 0; i < dSize; i++)
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopCoef[TOP_COEF_DATA + i]);
+
+ McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * AppCoefDL
+ *
+ * Description:
+ * APP coefficient setting
+ * Arguments:
+ * pbAppCoef APP coefficient chunk pointer
+ * bCoefTrans
+ * 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_FMAA_19_16),
+ (UINT8)(pbAppCoef[APP_COEF_ADR + 1] & MCB_FMAA_19_16));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_15_8),
+ (UINT8)(pbAppCoef[APP_COEF_ADR + 2] & MCB_FMAA_15_8));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_7_0),
+ (UINT8)(pbAppCoef[APP_COEF_ADR + 3] & MCB_FMAA_7_0));
+
+ /* OMACtl */
+ if (bCoefTrans == COEF_DSP_TRANS)
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FDSPTINI),
+ (UINT8)(MCB_DSPTINI | MCB_FMAMOD_DSP));
+ else
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FDSPTINI),
+ MCI_FDSPTINI_DEF);
+
+ 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_FMAD),
+ pbAppCoef[APP_COEF_DATA + i]);
+ McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * AppRegDL
+ *
+ * Description:
+ * APP register setting
+ * Arguments:
+ * pbAppReg APP register chunk pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void AppRegDL(UINT8 *pbAppReg)
+{
+ UINT32 dSize;
+ UINT32 i;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_F_REG_A),
+ (UINT8)(pbAppReg[APP_REG_ADR + 3] | MCB_F_REG_AINC));
+
+ McDevIf_ExecutePacket();
+
+ dSize = CreateUINT32(pbAppReg[APP_REG_SIZE + 0],
+ pbAppReg[APP_REG_SIZE + 1],
+ pbAppReg[APP_REG_SIZE + 2],
+ pbAppReg[APP_REG_SIZE + 3]);
+
+ for (i = 0; i < dSize; i++)
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_F_REG_D),
+ pbAppReg[APP_REG_DATA + i]);
+ McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * MultiChunkDL
+ *
+ * Description:
+ * Download of multidata input possible chunk
+ * Arguments:
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * dTargetChunk target chunk
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void MultiChunkDL(struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo,
+ UINT32 dTargetChunk)
+{
+ UINT32 dChunkTop;
+ UINT32 dChunkId;
+ UINT32 dChunkSize;
+ UINT32 dAppNo;
+ UINT8 *pbPrm;
+ UINT32 dSize;
+
+ pbPrm = psFdspInfo->pbChunkData;
+ dSize = psFdspInfo->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_FDSP_TAG_APPNO_MASK);
+ switch ((dChunkId & (UINT32)AEC_FDSP_TAG_APP_MASK)) {
+ case AEC_FDSP_TAG_APP_COEF:
+ case AEC_FDSP_TAG_APP_CONST:
+ if (dTargetChunk == (UINT32)MULTI_CHUNK_APP_COEF)
+ if (dAppNo < (UINT32)FDSP_APP_NUM)
+ AppCoefDL(&pbPrm[dChunkTop],
+ psFdspInfo->bCoefTrans);
+ break;
+
+ case AEC_FDSP_TAG_APP_REG:
+ if (dTargetChunk == (UINT32)MULTI_CHUNK_APP_REG)
+ if (dAppNo < (UINT32)FDSP_APP_NUM)
+ AppRegDL(&pbPrm[dChunkTop]);
+ break;
+
+ default:
+ if ((dChunkId == AEC_FDSP_TAG_TOP_COEF) &&
+ (dTargetChunk ==
+ (UINT32)MULTI_CHUNK_TOP_COEF))
+ TopCoefDL(&pbPrm[dChunkTop]);
+ break;
+ }
+ dChunkTop += dChunkSize;
+ }
+}
+
+/****************************************************************************
+ * TopInstDL
+ *
+ * Description:
+ * TOP instruction setting
+ * Arguments:
+ * pbTopInst TOP instruction chunk pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void TopInstDL(UINT8 *pbTopInst)
+{
+ UINT32 dSize;
+ UINT32 i;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_19_16),
+ (UINT8)(pbTopInst[TOP_INST_ADR + 1] & MCB_FMAA_19_16));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_15_8),
+ (UINT8)(pbTopInst[TOP_INST_ADR + 2] & MCB_FMAA_15_8));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_7_0),
+ (UINT8)(pbTopInst[TOP_INST_ADR + 3] & MCB_FMAA_7_0));
+
+ /* OMACtl */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FDSPTINI),
+ MCB_FMABUS_I);
+
+ McDevIf_ExecutePacket();
+
+ dSize = CreateUINT32(pbTopInst[TOP_INST_SIZE + 0],
+ pbTopInst[TOP_INST_SIZE + 1],
+ pbTopInst[TOP_INST_SIZE + 2],
+ pbTopInst[TOP_INST_SIZE + 3]);
+
+ for (i = 0; i < dSize; i++)
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbTopInst[TOP_INST_DATA + i]);
+ McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * FixAppEnvDL
+ *
+ * Description:
+ * Fix APP setting
+ * Arguments:
+ * dAppNo APP number
+ * pbAppEnv APP environmental chunk pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void SetFixApp(UINT32 dAppNo, UINT8 *pbAppEnv)
+{
+ if (dAppNo != FIX_APP_VOL_NO)
+ return;
+
+ if (pbAppEnv[APP_ENV_ID] == APP_VOL_ID)
+ gsFdspInfo.bFixAppVol = FIX_APP_VOL_EXIST;
+ else
+ gsFdspInfo.bFixAppVol = FIX_APP_VOL_FREE;
+}
+
+/****************************************************************************
+ * AppEnvDL
+ *
+ * Description:
+ * APP environmental setting
+ * Arguments:
+ * dAppNo APP number
+ * pbAppEnv APP environmental chunk pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void AppEnvDL(UINT32 dAppNo, UINT8 *pbAppEnv)
+{
+ UINT32 dBase;
+ UINT8 bData;
+
+ dBase = 0x00010UL + (dAppNo * 8UL);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_19_16),
+ (UINT8)((dBase >> 16)
+ & (UINT32)MCB_FMAA_19_16));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_15_8),
+ (UINT8)((dBase >> 8) & (UINT32)MCB_FMAA_15_8));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_7_0),
+ (UINT8)(dBase & (UINT32)MCB_FMAA_7_0));
+
+ /* OMACtl */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FDSPTINI),
+ MCI_FDSPTINI_DEF);
+
+ /* Base + 0x00000 */
+ /* ID */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_ID]);
+ /* ExcecProcess */
+ bData = ((pbAppEnv[APP_ENV_EXCECPROCESS] << 7) & 0x80);
+ /* InstBase */
+ bData |= (pbAppEnv[APP_ENV_INSTBASE + 1] & 0x1F);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ bData);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_INSTBASE + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_INSTBASE + 3]);
+
+ /* Base + 0x00001 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ /* RegBase */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbAppEnv[APP_ENV_REGBASE + 3] & 0x7F));
+ /* ExecFs */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbAppEnv[APP_ENV_EXECFS + 2] & 0x7F));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_EXECFS + 3]);
+
+ /* Base + 0x00002 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ /* ExecCh */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_EXECCH + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_EXECCH + 3]);
+
+ /* Base + 0x00003 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ /* WorkBase */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbAppEnv[APP_ENV_WORKBASE + 1] & 0x1F));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_WORKBASE + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_WORKBASE + 3]);
+
+ /* Base + 0x00004 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ /* AppBase0 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbAppEnv[APP_ENV_APPBASE0 + 1] & 0x1F));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_APPBASE0 + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_APPBASE0 + 3]);
+
+ /* Base + 0x00005 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ /* AppBase1 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbAppEnv[APP_ENV_APPBASE1 + 1] & 0x1F));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_APPBASE1 + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_APPBASE1 + 3]);
+
+ /* Base + 0x00006 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ /* AppBase2 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbAppEnv[APP_ENV_APPBASE2 + 1] & 0x1F));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_APPBASE2 + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_APPBASE2 + 3]);
+
+ /* Base + 0x00007 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ 0x00);
+ /* AppBase3 */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ (UINT8)(pbAppEnv[APP_ENV_APPBASE3 + 1] & 0x1F));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_APPBASE3 + 2]);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppEnv[APP_ENV_APPBASE3 + 3]);
+
+ McDevIf_ExecutePacket();
+
+ /* register */
+ /* Fade */
+ if ((pbAppEnv[APP_ENV_APPFADE] & APP_PARAM_ON) == APP_PARAM_ON)
+ gsFdspInfo.dAppFade |= (UINT32)(0x01UL << dAppNo);
+ else
+ gsFdspInfo.dAppFade &= (UINT32)~(0x01UL << dAppNo);
+
+ /* irq */
+ if ((pbAppEnv[APP_ENV_APPIRQ] & APP_PARAM_ON) == APP_PARAM_ON)
+ gsFdspInfo.dAppIEnb |= (UINT32)(0x01UL << dAppNo);
+ else
+ gsFdspInfo.dAppIEnb &= (UINT32)~(0x01UL << dAppNo);
+}
+
+/****************************************************************************
+ * AppInstDL
+ *
+ * Description:
+ * APP instruction setting
+ * Arguments:
+ * pbAppInst APP instruction chunk pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void AppInstDL(UINT8 *pbAppInst)
+{
+ UINT32 dSize;
+ UINT32 i;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_19_16),
+ (UINT8)(pbAppInst[APP_INST_ADR + 1] & MCB_FMAA_19_16));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_15_8),
+ (UINT8)(pbAppInst[APP_INST_ADR + 2] & MCB_FMAA_15_8));
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_7_0),
+ (UINT8)(pbAppInst[APP_INST_ADR + 3] & MCB_FMAA_7_0));
+
+ /* OMACtl */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FDSPTINI), MCB_FMABUS_I);
+
+ McDevIf_ExecutePacket();
+
+ dSize = CreateUINT32(pbAppInst[APP_INST_SIZE + 0],
+ pbAppInst[APP_INST_SIZE + 1],
+ pbAppInst[APP_INST_SIZE + 2],
+ pbAppInst[APP_INST_SIZE + 3]);
+
+ for (i = 0; i < dSize; i++)
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAD),
+ pbAppInst[APP_INST_DATA + i]);
+ McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * Download
+ *
+ * Description:
+ * Download of FW and coefficient to F-DSP
+ * Arguments:
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void Download(struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo)
+{
+ UINT32 i;
+
+ if (psFdspInfo->pbFwctrl != NULL)
+ FwCtlDL(psFdspInfo);
+
+ if (psFdspInfo->pbChSel != NULL)
+ ChSelDL(psFdspInfo->pbChSel);
+
+ if (psFdspInfo->pbTopEnv != NULL)
+ TopEnvDL(psFdspInfo->pbTopEnv);
+
+ if (psFdspInfo->dTopCoefCnt != 0UL)
+ MultiChunkDL(psFdspInfo, MULTI_CHUNK_TOP_COEF);
+
+ if (psFdspInfo->pbTopInst != NULL)
+ TopInstDL(psFdspInfo->pbTopInst);
+
+ if (psFdspInfo->dTargetApp != 0UL)
+ for (i = 0; i < (UINT32)FDSP_APP_NUM; ++i)
+ if (psFdspInfo->apbAppEnv[i] != NULL) {
+ SetFixApp(i, psFdspInfo->apbAppEnv[i]);
+ AppEnvDL(i, psFdspInfo->apbAppEnv[i]);
+ }
+
+ if ((psFdspInfo->dAppCoefCnt != 0UL) ||
+ (psFdspInfo->dAppCnstCnt != 0UL)) {
+ MultiChunkDL(psFdspInfo, MULTI_CHUNK_APP_COEF);
+
+ if (psFdspInfo->bCoefTrans == COEF_DSP_TRANS) {
+ /* DSPTReq */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FDSPTREQ),
+ MCB_FDSPTREQ);
+ McDevIf_ExecutePacket();
+ }
+ }
+
+ if (psFdspInfo->dAppInstCnt != 0UL)
+ for (i = 0UL; i < (UINT32)FDSP_APP_NUM; ++i)
+ if (psFdspInfo->apbAppInst[i] != NULL)
+ AppInstDL(psFdspInfo->apbAppInst[i]);
+
+ if (psFdspInfo->dAppRegCnt != 0UL)
+ MultiChunkDL(psFdspInfo, MULTI_CHUNK_APP_REG);
+}
+
+/****************************************************************************
+ * EnableIrq
+ *
+ * Description:
+ * Interrupt enable setting
+ * Arguments:
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * psExecInfo MCDRV_FDSP_EXEC_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void EnableIrq(struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo,
+ struct MCDRV_FDSP_EXEC_INFO *psExecInfo)
+{
+ if ((psFdspInfo->bMustStop & STOP_KIND_FDSP) != 0) {
+ /* IReqTop */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQTOP), MCB_IREQTOP);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IRSERR),
+ (UINT8)(MCB_IRSERR | MCB_IRFW));
+
+ McDevIf_ExecutePacket();
+
+ SetAppIrq((gsFdspInfo.dAppIEnb & psExecInfo->dAppExec));
+
+ /* TopIEnb */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_TOPIENB), MCB_TOPIENB);
+
+ /* IEnb */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IESERR),
+ (UINT8)(MCB_IESERR | MCB_IEFW));
+
+ McDevIf_ExecutePacket();
+
+ } else if ((psFdspInfo->bMustStop & STOP_KIND_APP_EXEC) != 0) {
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IRSERR),
+ MCB_IRFW_DSP);
+
+ McDevIf_ExecutePacket();
+
+ SetAppIrq(gsFdspInfo.dAppIEnb & psExecInfo->dAppExec);
+
+ } else if ((psFdspInfo->bMustStop & STOP_KIND_APP) != 0) {
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IRSERR),
+ MCB_IRFW_DSP);
+
+ McDevIf_ExecutePacket();
+
+ SetAppIrq(gsFdspInfo.dAppIEnb & psExecInfo->dAppExec);
+
+ } else if ((psFdspInfo->bMustStop & STOP_KIND_WAIT) != 0) {
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IRSERR),
+ MCB_IRFW_DSP);
+
+ McDevIf_ExecutePacket();
+ }
+}
+
+/****************************************************************************
+ * FixAppVolFadeIn
+ *
+ * Description:
+ * Fixed VOL fadein
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_TIMEOUT
+ *
+ ****************************************************************************/
+static void FixAppVolFadeIn(void)
+{
+ if (gsFdspInfo.bFixAppVol != FIX_APP_VOL_EXIST)
+ return;
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)FIX_APP_VOL_REG_FADE_CTRL),
+ FIX_APP_VOL_REG_FADE_CTRL_BIT);
+ McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * ReStart
+ *
+ * Description:
+ * re-execution of stop F-DSP and APP
+ * Arguments:
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * psExecInfo MCDRV_FDSP_EXEC_INFO
+ * structure pointer
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void ReStart(struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo,
+ struct MCDRV_FDSP_EXEC_INFO *psExecInfo)
+{
+ UINT8 bAppExec0;
+ UINT8 bAppExec1;
+ UINT8 bAppExec2;
+ UINT32 dAppStop;
+ UINT32 dAppAct;
+
+ bAppExec0 = (UINT8)((psExecInfo->dAppExec >> 16)
+ & (UINT32)MCB_APPEXEC0);
+ bAppExec1 = (UINT8)((psExecInfo->dAppExec >> 8)
+ & (UINT32)MCB_APPEXEC1);
+ bAppExec2 = (UINT8)(psExecInfo->dAppExec & (UINT32)MCB_APPEXEC2);
+
+ if ((psFdspInfo->bMustStop & STOP_KIND_FDSP) != 0) {
+ SetAppExec(bAppExec0, bAppExec1, bAppExec2);
+ if (psExecInfo->bRestart == RESTART_ON) {
+ gsFdspInfo.dAppStop = 0UL;
+ if ((gsFdspInfo.bDSPBypass & MCB_DSPBYPASS) != 0)
+ SetFdspCtrl(MCB_DSPBYPASS);
+ else {
+ SetFdspCtrl(MCB_DSPSTART);
+ FixAppVolFadeIn();
+ }
+ }
+ } else if ((psFdspInfo->bMustStop & STOP_KIND_APP_EXEC) != 0) {
+ dAppStop = ((UINT32)(gsFdspInfo.bAppExec0 & ~bAppExec0)) << 16;
+ dAppStop |= ((UINT32)(gsFdspInfo.bAppExec1 & ~bAppExec1)) << 8;
+ dAppStop |= ((UINT32)(gsFdspInfo.bAppExec2 & ~bAppExec2));
+
+ AppFade();
+ SetAppExec(bAppExec0, bAppExec1, bAppExec2);
+ FixAppVolFadeIn();
+
+ dAppAct = GetAppAct();
+ if ((dAppStop & dAppAct) != dAppStop)
+ dAppStop &= dAppAct;
+
+ gsFdspInfo.dAppStop |= dAppStop;
+ } else if ((psFdspInfo->bMustStop & STOP_KIND_APP) != 0) {
+ AppFade();
+ SetAppExec(bAppExec0, bAppExec1, bAppExec2);
+ FixAppVolFadeIn();
+ }
+}
+
+/****************************************************************************
+ * SetAudioEngine
+ *
+ * Description:
+ * FW and the coefficient setting are set to F-DSP
+ * Arguments:
+ * psFdspInfo MCDRV_FDSP_AEC_FDSP_INFO
+ * structure pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ * MCDRV_ERROR_TIMEOUT
+ *
+ ****************************************************************************/
+static SINT32 SetAudioEngine(struct MCDRV_FDSP_AEC_FDSP_INFO *psFdspInfo)
+{
+ UINT8 bData;
+ SINT32 sdResult;
+ struct MCDRV_FDSP_EXEC_INFO sExecInfo;
+
+ psFdspInfo->dAppExec = CreateUINT32(0x00, gsFdspInfo.bAppExec0,
+ gsFdspInfo.bAppExec1, gsFdspInfo.bAppExec2);
+
+ if (gsFdspInfo.bDSPCtl != MCI_DSPCTRL_DEF)
+ sExecInfo.bRestart = RESTART_ON;
+ else
+ sExecInfo.bRestart = RESTART_OFF;
+
+ if ((gsFdspInfo.bDSPCtl & (UINT8)MCB_DSPBYPASS) != 0)
+ psFdspInfo->bMustStop |= STOP_KIND_FDSP;
+ else if ((gsFdspInfo.bDSPCtl & (UINT8)MCB_DSPSTART) == 0) {
+ psFdspInfo->bMustStop |= STOP_KIND_FDSP;
+ psFdspInfo->bCoefTrans = COEF_DMA_TRANS;
+ } else {
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_DSPSTATE),
+ &bData, 1);
+ if ((bData & MCB_DSPACT) != MCB_DSPACT)
+ psFdspInfo->bCoefTrans = COEF_DMA_TRANS;
+ }
+
+ DisableIrq(psFdspInfo);
+
+ sdResult = Stop(psFdspInfo);
+ if (sdResult < (SINT32)MCDRV_SUCCESS)
+ return sdResult;
+
+ if ((psFdspInfo->bMustStop & STOP_KIND_FDSP) != 0) {
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPFADE0),
+ 0x00);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPFADE1),
+ 0x00);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPFADE2),
+ 0x00);
+ }
+
+ Download(psFdspInfo);
+
+ sExecInfo.dAppExec = psFdspInfo->dAppExec;
+ if (gsFdspInfo.bFixAppVol == FIX_APP_VOL_EXIST)
+ sExecInfo.dAppExec |= FIX_APP_VOL_APPEXEC;
+ else
+ sExecInfo.dAppExec &= ~FIX_APP_VOL_APPEXEC;
+
+ EnableIrq(psFdspInfo, &sExecInfo);
+
+ ReStart(psFdspInfo, &sExecInfo);
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * McFdsp_Init
+ *
+ * Description:
+ * Initialize
+ * Arguments:
+ * psPrm MCDRV_FDSP_INIT structure pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+SINT32 McFdsp_Init(struct MCDRV_FDSP_INIT *psPrm)
+{
+ if (gsFdspInfo.dStatus != (UINT32)FDSP_STATUS_IDLE)
+ return MCDRV_ERROR;
+
+ if (psPrm == NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ gsFdspInfo.sInit.sInput.wADDFmt = psPrm->sInput.wADDFmt;
+ gsFdspInfo.sInit.sOutput.wADDFmt = psPrm->sOutput.wADDFmt;
+
+ if (psPrm->dWaitTime != 0)
+ gsFdspInfo.sInit.dWaitTime = psPrm->dWaitTime;
+ else
+ gsFdspInfo.sInit.dWaitTime = DEF_FDSP_STOP_WAIT_TIME_US;
+
+ gsFdspInfo.cbfunc = NULL;
+ gsFdspInfo.bADIMute0 = MCI_ADIMUTE0_DEF;
+ gsFdspInfo.bADIMute1 = MCI_ADIMUTE1_DEF;
+ gsFdspInfo.bADOMute0 = MCI_ADOMUTE0_DEF;
+ gsFdspInfo.bADOMute1 = MCI_ADOMUTE1_DEF;
+
+ InitCore();
+
+ gsFdspInfo.dStatus = (UINT32)FDSP_STATUS_INITED;
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * McFdsp_Term
+ *
+ * Description:
+ * Terminate
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ *
+ ****************************************************************************/
+SINT32 McFdsp_Term(void)
+{
+ if (gsFdspInfo.dStatus == (UINT32)FDSP_STATUS_IDLE)
+ return MCDRV_SUCCESS;
+
+ /* IEnb */
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IESERR),
+ MCI_IESERR_DEF);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IRSERR),
+ (UINT8)(MCB_IRSERR | MCB_IRFW));
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_DSPCTRL),
+ MCI_DSPCTRL_DEF);
+
+ McDevIf_ExecutePacket();
+
+ gsFdspInfo.cbfunc = NULL;
+ gsFdspInfo.dStatus = (UINT32)FDSP_STATUS_IDLE;
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * McFdsp_IrqProc
+ *
+ * Description:
+ * Interrupt from F-DSP is processed
+ * Arguments:
+ * none
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+void McFdsp_IrqProc(void)
+{
+ UINT8 bErr;
+ UINT8 bIReq;
+ UINT8 bIReqTop;
+ UINT8 bIReqApp0;
+ UINT8 bIReqApp1;
+ UINT8 bIReqApp2;
+ UINT32 dAppStop;
+ UINT32 dData;
+
+ bErr = IRQ_NO_ERROR;
+ bIReqTop = 0;
+ bIReqApp0 = 0;
+ bIReqApp1 = 0;
+ bIReqApp2 = 0;
+ dAppStop = 0;
+
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IRSERR),
+ &bIReq, 1);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IRSERR),
+ bIReq);
+
+ McDevIf_ExecutePacket();
+
+ if (((bIReq & MCB_IRSERR) == MCB_IRSERR) ||
+ ((bIReq & MCB_IRFW_STRT) == MCB_IRFW_STRT))
+ bErr = IRQ_ERROR;
+
+ if ((bIReq & MCB_IRFW_TOP) == MCB_IRFW_TOP) {
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQTOP),
+ &bIReqTop, 1);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQTOP),
+ bIReqTop);
+
+ McDevIf_ExecutePacket();
+
+ if (((bIReqTop & MCB_IREQTOP3) == MCB_IREQTOP3) ||
+ ((bIReqTop & MCB_IREQTOP2) == MCB_IREQTOP2))
+ bErr = IRQ_ERROR;
+ }
+
+ if ((bIReq & MCB_IRFW_APP) == MCB_IRFW_APP) {
+ if (gsFdspInfo.bAppIEnb0 != 0) {
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP0),
+ &bIReqApp0, 1);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP0),
+ bIReqApp0);
+
+ McDevIf_ExecutePacket();
+
+ bIReqApp0 = (UINT8)(bIReqApp0 & gsFdspInfo.bAppIEnb0);
+ }
+ if (gsFdspInfo.bAppIEnb1 != 0) {
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP1),
+ &bIReqApp1, 1);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP1),
+ bIReqApp1);
+
+ McDevIf_ExecutePacket();
+
+ bIReqApp2 = (UINT8)(bIReqApp1 & gsFdspInfo.bAppIEnb1);
+ }
+ if (gsFdspInfo.bAppIEnb2 != 0) {
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP2),
+ &bIReqApp2, 1);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_IREQAPP2),
+ bIReqApp2);
+
+ McDevIf_ExecutePacket();
+ bIReqApp2 = (UINT8)(bIReqApp2 & gsFdspInfo.bAppIEnb2);
+ }
+ }
+
+ if ((bIReqTop & MCB_IREQTOP0) == MCB_IREQTOP0) {
+ dData = GetAppAct();
+ dAppStop = (gsFdspInfo.dAppStop & ~dData);
+ gsFdspInfo.dAppStop &= ~dAppStop;
+ }
+
+ if (gsFdspInfo.cbfunc != NULL) {
+ if (bErr == IRQ_ERROR)
+ gsFdspInfo.cbfunc(0, FDSP_CB_ERR, 0);
+
+ if ((bIReq & MCB_IRFW_DSP) == MCB_IRFW_DSP)
+ gsFdspInfo.cbfunc(0, FDSP_CB_COEF_DONE, 0);
+
+ dData = CreateUINT32(0x00, bIReqApp0, bIReqApp1, bIReqApp2);
+ dData &= ~0x400000;
+ if (dData != 0UL)
+ gsFdspInfo.cbfunc(0, FDSP_CB_APP_REQ, dData);
+
+ if (dAppStop != 0UL)
+ gsFdspInfo.cbfunc(0, FDSP_CB_APP_STOP, dAppStop);
+
+ if ((bIReqTop & MCB_IREQTOP1) == MCB_IREQTOP1)
+ gsFdspInfo.cbfunc(0, FDSP_CB_FDSP_STOP, 0);
+ }
+}
+
+/****************************************************************************
+ * McFdsp_SetCBFunc
+ *
+ * Description:
+ * Callback function setting
+ * Arguments:
+ * cbfunc Callback function
+ * Return:
+ * MCDRV_SUCCESS
+ *
+ ****************************************************************************/
+SINT32 McFdsp_SetCBFunc(SINT32 (*cbfunc)(SINT32, UINT32, UINT32))
+{
+ gsFdspInfo.cbfunc = cbfunc;
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * McFdsp_GetTransition
+ *
+ * Description:
+ * It judges while processing the F-DSP control
+ * Arguments:
+ * none
+ * Return:
+ * 0 has processed
+ * 1<= processing
+ *
+ ****************************************************************************/
+SINT32 McFdsp_GetTransition(void)
+{
+ SINT32 sdResult;
+ UINT32 dApp;
+ UINT8 bData;
+
+ sdResult = 0;
+
+ if (gsFdspInfo.dStatus == (UINT32)FDSP_STATUS_IDLE)
+ return sdResult;
+
+ /* DSPSTART,DSPACT */
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_DSPSTATE), &bData, 1);
+ if ((gsFdspInfo.bDSPCtl & MCB_DSPSTART) == 0) {
+ if ((bData & MCB_DSPACT) == MCB_DSPACT)
+ sdResult += (SINT32)FDSP_PRC_FDSP_STOP;
+ else
+ return sdResult;
+ }
+
+ /* DSP Coef Trance */
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FDSPTREQ), &bData, 1);
+ if ((bData & MCB_FDSPTREQ) == MCB_FDSPTREQ)
+ sdResult += (SINT32)FDSP_PRC_COEF_TRS;
+
+ /* APPEXEC,APPACT */
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPACT0), &bData, 1);
+ dApp = (UINT32)(bData & (UINT8)~gsFdspInfo.bAppExec0);
+ dApp = (dApp << 8);
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPACT1), &bData, 1);
+ dApp |= (UINT32)(bData & (UINT8)~gsFdspInfo.bAppExec1);
+ dApp = (dApp << 8);
+ McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_APPACT2), &bData, 1);
+ dApp |= (UINT32)(bData & (UINT8)~gsFdspInfo.bAppExec2);
+ sdResult += (SINT32)dApp;
+
+ return sdResult;
+}
+
+/****************************************************************************
+ * McFdsp_GetDSP
+ *
+ * Description:
+ * FW and the coefficient setting are acquired from F-DSP
+ * Arguments:
+ * psPrm MCDRV_FDSP_AE_FW structure pointer
+ * Return:
+ * 0<= Get data size
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+SINT32 McFdsp_GetDSP(UINT32 dTarget, UINT32 dAddress,
+ UINT8 *pbData, UINT32 dSize)
+{
+ UINT8 bOMACtl;
+ UINT8 bAdr0;
+ UINT8 bAdr1;
+ UINT8 bAdr2;
+ UINT8 bHwId;
+ UINT32 i;
+ UINT32 dDxramMax;
+ UINT32 dIramMax;
+
+ if (pbData == NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ bHwId = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_A, MCI_A_DEV_ID);
+ if ((bHwId & 0x07) == 0) {
+ dDxramMax = DXRAM_RANGE_MAX_1;
+ dIramMax = IRAM_RANGE_MAX_1;
+ } else {
+ dDxramMax = DXRAM_RANGE_MAX_2;
+ dIramMax = IRAM_RANGE_MAX_2;
+ }
+
+ dSize = (dSize / RAM_UNIT_SIZE);
+
+ bOMACtl = MCB_FMADIR_UL;
+ switch (dTarget) {
+ case FDSP_AE_FW_DXRAM:
+ if (dDxramMax < dAddress)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if ((dDxramMax + 1) < dSize)
+ dSize = dDxramMax + 1;
+
+ if ((dDxramMax + 1) < (dAddress + dSize))
+ dSize -= ((dAddress + dSize)
+ - (dDxramMax + 1));
+ bOMACtl |= MCB_FMABUS_X;
+ break;
+
+ case FDSP_AE_FW_DYRAM:
+ if (DYRAM_RANGE_MAX < dAddress)
+ return MCDRV_ERROR_ARGUMENT;
+
+ 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));
+ bOMACtl |= MCB_FMABUS_Y;
+ break;
+
+ case FDSP_AE_FW_IRAM:
+ if ((dAddress < IRAM_RANGE_MIN) ||
+ (dIramMax < dAddress))
+ return MCDRV_ERROR_ARGUMENT;
+
+ if ((dIramMax - IRAM_RANGE_MIN + 1) < dSize)
+ dSize = (dIramMax - IRAM_RANGE_MIN + 1);
+
+ if ((dIramMax + 1) < (dAddress + dSize))
+ dSize -= ((dAddress + dSize)
+ - (dIramMax + 1));
+ bOMACtl |= MCB_FMABUS_I;
+ break;
+
+ default:
+ return MCDRV_ERROR_ARGUMENT;
+ }
+
+ if (dSize == 0)
+ return 0;
+
+ if (gsFdspInfo.dStatus == (UINT32)FDSP_STATUS_IDLE)
+ return 0;
+
+ bAdr0 = (UINT8)((dAddress >> 16) & (UINT32)MCB_FMAA_19_16);
+ bAdr1 = (UINT8)((dAddress >> 8) & (UINT32)MCB_FMAA_15_8);
+ bAdr2 = (UINT8)(dAddress & (UINT32)MCB_FMAA_7_0);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_19_16),
+ bAdr0);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_15_8),
+ bAdr1);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FMAA_7_0),
+ bAdr2);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_FDSPTINI),
+ bOMACtl);
+
+ McDevIf_ExecutePacket();
+
+ dSize *= RAM_UNIT_SIZE;
+ for (i = 0; i < dSize; ++i)
+ McDevIf_ReadDirect(
+ (MCDRV_PACKET_REGTYPE_IF | (UINT32)MCI_FMAD),
+ &pbData[i], 1);
+
+ return (SINT32)dSize;
+}
+
+/****************************************************************************
+ * McFdsp_SetDSPCheck
+ *
+ * Description:
+ * Check AEC info
+ * Arguments:
+ * psPrm MCDRV_AEC_INFO structure pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+SINT32 McFdsp_SetDSPCheck(struct MCDRV_AEC_INFO *psPrm)
+{
+ SINT32 sdResult;
+ struct MCDRV_FDSP_AEC_FDSP_INFO sFdspInfo;
+
+ if (psPrm == NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ sdResult = GetFDSPChunk(psPrm, &sFdspInfo) ;
+ if (sdResult < (SINT32)MCDRV_SUCCESS)
+ return MCDRV_ERROR_ARGUMENT;
+
+ sdResult = FdspChunkAnalyze(&sFdspInfo);
+ if (sdResult < (SINT32)MCDRV_SUCCESS)
+ return sdResult;
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * McFdsp_SetDSP
+ *
+ * Description:
+ * FW and the coefficient setting are set to F-DSP
+ * Arguments:
+ * psPrm MCDRV_AEC_INFO structure pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_PROCESSING
+ * MCDRV_ERROR
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+SINT32 McFdsp_SetDSP(struct MCDRV_AEC_INFO *psPrm)
+{
+ SINT32 sdResult;
+ struct MCDRV_FDSP_AEC_FDSP_INFO sFdspInfo;
+
+ if (psPrm == NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ sdResult = GetFDSPChunk(psPrm, &sFdspInfo) ;
+ if (sdResult < (SINT32)MCDRV_SUCCESS)
+ return MCDRV_ERROR_ARGUMENT;
+
+ sdResult = FdspChunkAnalyze(&sFdspInfo);
+ if (sdResult < (SINT32)MCDRV_SUCCESS)
+ return sdResult;
+
+ if ((sFdspInfo.pbChunkData == NULL) ||
+ (sFdspInfo.dwSize == 0))
+ return MCDRV_SUCCESS;
+
+ if (gsFdspInfo.dStatus == (UINT32)FDSP_STATUS_IDLE)
+ return MCDRV_ERROR;
+
+ sdResult = SetAudioEngine(&sFdspInfo);
+
+ return sdResult;
+}
+
+/****************************************************************************
+ * McFdsp_Start
+ *
+ * Function:
+ * F-DSP start
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ *
+ ****************************************************************************/
+SINT32 McFdsp_Start(void)
+{
+ SINT32 sdResult = MCDRV_SUCCESS;
+
+ if (gsFdspInfo.dStatus == (UINT32)FDSP_STATUS_IDLE)
+ return MCDRV_ERROR;
+
+ if ((gsFdspInfo.bDSPBypass & MCB_DSPBYPASS) != 0) {
+ gsFdspInfo.dAppStop = 0UL;
+ sdResult = SetFdspCtrl(MCB_DSPBYPASS);
+ } else {
+ if ((gsFdspInfo.bDSPCtl & (UINT8)MCB_DSPSTART) == 0) {
+ gsFdspInfo.dAppStop = 0UL;
+ sdResult = SetFdspCtrl(MCB_DSPSTART);
+ FixAppVolFadeIn();
+ }
+ }
+
+ return sdResult;
+}
+
+/****************************************************************************
+ * McFdsp_Stop
+ *
+ * Function:
+ * F-DSP stop
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_PROCESSING
+ *
+ ****************************************************************************/
+SINT32 McFdsp_Stop(void)
+{
+ SINT32 sdResult;
+
+ if (gsFdspInfo.dStatus == (UINT32)FDSP_STATUS_IDLE)
+ return MCDRV_SUCCESS;
+
+ if ((gsFdspInfo.bDSPCtl & (UINT8)MCB_DSPSTART) != 0)
+ FixAppVolFadeOut();
+
+ sdResult = SetFdspCtrl(MCI_DSPCTRL_DEF);
+ if (sdResult == FDSP_DRV_SUCCESS_STOPED)
+ sdResult = MCDRV_SUCCESS;
+ else
+ sdResult = MCDRV_PROCESSING;
+
+ return sdResult;
+}
+
+/****************************************************************************
+ * McFdsp_GetMute
+ *
+ * Description:
+ * Get Mute Setting
+ * Arguments:
+ * psPrm MCDRV_FDSP_MUTE structure pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+SINT32 McFdsp_GetMute(struct MCDRV_FDSP_MUTE *psPrm)
+{
+ if (psPrm == NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (gsFdspInfo.dStatus == (UINT32)FDSP_STATUS_IDLE)
+ return MCDRV_ERROR;
+
+ /* get Mute */
+ psPrm->abInMute[0] = GetChMute(gsFdspInfo.bADIMute0,
+ (UINT8)(MCB_ADI01MTN | MCB_ADI00MTN));
+ psPrm->abInMute[1] = GetChMute(gsFdspInfo.bADIMute0,
+ (UINT8)(MCB_ADI03MTN | MCB_ADI02MTN));
+ psPrm->abInMute[2] = GetChMute(gsFdspInfo.bADIMute0,
+ (UINT8)(MCB_ADI05MTN | MCB_ADI04MTN));
+ psPrm->abInMute[3] = GetChMute(gsFdspInfo.bADIMute0,
+ (UINT8)(MCB_ADI07MTN | MCB_ADI06MTN));
+ psPrm->abInMute[4] = GetChMute(gsFdspInfo.bADIMute1,
+ (UINT8)(MCB_ADI09MTN | MCB_ADI08MTN));
+ psPrm->abInMute[5] = GetChMute(gsFdspInfo.bADIMute1,
+ (UINT8)(MCB_ADI11MTN | MCB_ADI10MTN));
+ psPrm->abInMute[6] = GetChMute(gsFdspInfo.bADIMute1,
+ (UINT8)(MCB_ADI13MTN | MCB_ADI12MTN));
+ psPrm->abInMute[7] = GetChMute(gsFdspInfo.bADIMute1,
+ (UINT8)(MCB_ADI15MTN | MCB_ADI14MTN));
+
+ psPrm->abOutMute[0] = GetChMute(gsFdspInfo.bADOMute0,
+ (UINT8)(MCB_ADO01MTN | MCB_ADO00MTN));
+ psPrm->abOutMute[1] = GetChMute(gsFdspInfo.bADOMute0,
+ (UINT8)(MCB_ADO03MTN | MCB_ADO02MTN));
+ psPrm->abOutMute[2] = GetChMute(gsFdspInfo.bADOMute0,
+ (UINT8)(MCB_ADO05MTN | MCB_ADO04MTN));
+ psPrm->abOutMute[3] = GetChMute(gsFdspInfo.bADOMute0,
+ (UINT8)(MCB_ADO07MTN | MCB_ADO06MTN));
+ psPrm->abOutMute[4] = GetChMute(gsFdspInfo.bADOMute1,
+ (UINT8)(MCB_ADO09MTN | MCB_ADO08MTN));
+ psPrm->abOutMute[5] = GetChMute(gsFdspInfo.bADOMute1,
+ (UINT8)(MCB_ADO11MTN | MCB_ADO10MTN));
+ psPrm->abOutMute[6] = GetChMute(gsFdspInfo.bADOMute1,
+ (UINT8)(MCB_ADO13MTN | MCB_ADO12MTN));
+ psPrm->abOutMute[7] = GetChMute(gsFdspInfo.bADOMute1,
+ (UINT8)(MCB_ADO15MTN | MCB_ADO14MTN));
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * McFdsp_SetMute
+ *
+ * Description:
+ * Set Mute
+ * Arguments:
+ * psPrm MCDRV_FDSP_MUTE structure pointer
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+SINT32 McFdsp_SetMute(struct MCDRV_FDSP_MUTE *psPrm)
+{
+ UINT8 bADIMute0;
+ UINT8 bADIMute1;
+ UINT8 bADOMute0;
+ UINT8 bADOMute1;
+ UINT32 i;
+
+ if (psPrm == NULL)
+ return MCDRV_ERROR_ARGUMENT;
+
+ for (i = 0UL; i < (UINT32)FDSP_MUTE_NUM; ++i)
+ if ((FDSP_MUTE_OFF < psPrm->abInMute[i]) ||
+ (FDSP_MUTE_OFF < psPrm->abOutMute[i]))
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (gsFdspInfo.dStatus == (UINT32)FDSP_STATUS_IDLE)
+ return MCDRV_ERROR;
+
+ /* set Mute */
+ bADIMute0 = gsFdspInfo.bADIMute0;
+ bADIMute0 = CreateMuteReg(bADIMute0, psPrm->abInMute[0],
+ (UINT8)(MCB_ADI01MTN | MCB_ADI00MTN));
+ bADIMute0 = CreateMuteReg(bADIMute0, psPrm->abInMute[1],
+ (UINT8)(MCB_ADI03MTN | MCB_ADI02MTN));
+ bADIMute0 = CreateMuteReg(bADIMute0, psPrm->abInMute[2],
+ (UINT8)(MCB_ADI05MTN | MCB_ADI04MTN));
+ bADIMute0 = CreateMuteReg(bADIMute0, psPrm->abInMute[3],
+ (UINT8)(MCB_ADI07MTN | MCB_ADI06MTN));
+ bADIMute1 = gsFdspInfo.bADIMute1;
+ bADIMute1 = CreateMuteReg(bADIMute1, psPrm->abInMute[4],
+ (UINT8)(MCB_ADI09MTN | MCB_ADI08MTN));
+ bADIMute1 = CreateMuteReg(bADIMute1, psPrm->abInMute[5],
+ (UINT8)(MCB_ADI11MTN | MCB_ADI10MTN));
+ bADIMute1 = CreateMuteReg(bADIMute1, psPrm->abInMute[6],
+ (UINT8)(MCB_ADI13MTN | MCB_ADI12MTN));
+ bADIMute1 = CreateMuteReg(bADIMute1, psPrm->abInMute[7],
+ (UINT8)(MCB_ADI15MTN | MCB_ADI14MTN));
+
+ bADOMute0 = gsFdspInfo.bADOMute0;
+ bADOMute0 = CreateMuteReg(bADOMute0, psPrm->abOutMute[0],
+ (UINT8)(MCB_ADO01MTN | MCB_ADO00MTN));
+ bADOMute0 = CreateMuteReg(bADOMute0, psPrm->abOutMute[1],
+ (UINT8)(MCB_ADO03MTN | MCB_ADO02MTN));
+ bADOMute0 = CreateMuteReg(bADOMute0, psPrm->abOutMute[2],
+ (UINT8)(MCB_ADO05MTN | MCB_ADO04MTN));
+ bADOMute0 = CreateMuteReg(bADOMute0, psPrm->abOutMute[3],
+ (UINT8)(MCB_ADO07MTN | MCB_ADO06MTN));
+ bADOMute1 = gsFdspInfo.bADOMute1;
+ bADOMute1 = CreateMuteReg(bADOMute1, psPrm->abOutMute[4],
+ (UINT8)(MCB_ADO09MTN | MCB_ADO08MTN));
+ bADOMute1 = CreateMuteReg(bADOMute1, psPrm->abOutMute[5],
+ (UINT8)(MCB_ADO11MTN | MCB_ADO10MTN));
+ bADOMute1 = CreateMuteReg(bADOMute1, psPrm->abOutMute[6],
+ (UINT8)(MCB_ADO13MTN | MCB_ADO12MTN));
+ bADOMute1 = CreateMuteReg(bADOMute1, psPrm->abOutMute[7],
+ (UINT8)(MCB_ADO15MTN | MCB_ADO14MTN));
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADIMUTE0),
+ bADIMute0);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADIMUTE1),
+ bADIMute1);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADIMUTE2),
+ MCB_ADIMTSET);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOMUTE0),
+ bADOMute0);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOMUTE1),
+ bADOMute1);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | (UINT32)MCI_ADOMUTE2),
+ MCB_ADOMTSET);
+
+ McDevIf_ExecutePacket();
+
+ gsFdspInfo.bADIMute0 = bADIMute0;
+ gsFdspInfo.bADIMute1 = bADIMute1;
+ gsFdspInfo.bADOMute0 = bADOMute0;
+ gsFdspInfo.bADOMute1 = bADOMute1;
+
+ return MCDRV_SUCCESS;
+}
+