diff options
Diffstat (limited to 'sound/soc/codecs/ymu831/mcfdspdrv.c')
-rw-r--r-- | sound/soc/codecs/ymu831/mcfdspdrv.c | 3400 |
1 files changed, 3400 insertions, 0 deletions
diff --git a/sound/soc/codecs/ymu831/mcfdspdrv.c b/sound/soc/codecs/ymu831/mcfdspdrv.c new file mode 100644 index 000000000000..052c47a4697b --- /dev/null +++ b/sound/soc/codecs/ymu831/mcfdspdrv.c @@ -0,0 +1,3400 @@ +/**************************************************************************** + * + * Copyright(c) 2012-2013 Yamaha Corporation. All rights reserved. + * + * Module : mcfdspdrv.c + * + * Description : MC Fdsp Driver + * + * Version : 2.0.0 2013.04.01 + * + * 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) + +#define FWCTL_SAVE_REG_START (0x4F) +#define FWCTL_SAVE_REG_END (0x76) +#define FWCTL_SAVE_REG_NUM \ + (FWCTL_SAVE_REG_END - FWCTL_SAVE_REG_START + 1) + +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; + UINT8 abFwctl[FWCTL_SAVE_REG_NUM]; +}; + +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, + { /* abFwctl 0x4F-0x76 */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }, +}; + +/**************************************************************************** + * LoadCtlReg + * + * Description: + * Set FWControl Register + * Arguments: + * none + * Return: + * none + * + ****************************************************************************/ +static void LoadCtlReg(void) +{ + UINT32 i; + + for (i = FWCTL_SAVE_REG_START; i <= FWCTL_SAVE_REG_END; ++i) + McDevIf_AddPacket((MCDRV_PACKET_TYPE_FORCE_WRITE + | MCDRV_PACKET_REGTYPE_F + | i), + gsFdspInfo.abFwctl[i - FWCTL_SAVE_REG_START]); + + McDevIf_ExecutePacket(); +} + +/**************************************************************************** + * SaveCtlReg + * + * Description: + * Save FWControl Register + * Arguments: + * none + * Return: + * none + * + ****************************************************************************/ +static void SaveCtlReg(void) +{ + UINT32 i; + + for (i = FWCTL_SAVE_REG_START; i <= FWCTL_SAVE_REG_END; ++i) + McDevIf_ReadDirect((MCDRV_PACKET_REGTYPE_F + | i), + &gsFdspInfo.abFwctl[i - FWCTL_SAVE_REG_START], + 1); +} + +/**************************************************************************** + * 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(); + + LoadCtlReg(); + + 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(); + + SaveCtlReg(); + + 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; +} + |