aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/ymu831/mcdriver.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs/ymu831/mcdriver.c')
-rw-r--r--sound/soc/codecs/ymu831/mcdriver.c6309
1 files changed, 6309 insertions, 0 deletions
diff --git a/sound/soc/codecs/ymu831/mcdriver.c b/sound/soc/codecs/ymu831/mcdriver.c
new file mode 100644
index 0000000..47ddddb
--- /dev/null
+++ b/sound/soc/codecs/ymu831/mcdriver.c
@@ -0,0 +1,6309 @@
+/****************************************************************************
+ *
+ * Copyright(c) 2012-2013 Yamaha Corporation. All rights reserved.
+ *
+ * Module : mcdriver.c
+ *
+ * Description : MC Driver
+ *
+ * Version : 1.0.6 2013.02.04
+ *
+ * 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 "mcdriver.h"
+#include "mcservice.h"
+#include "mcdevif.h"
+#include "mcresctrl.h"
+#include "mcparser.h"
+#include "mcdefs.h"
+#include "mcdevprof.h"
+#include "mcmachdep.h"
+#include "mcbdspdrv.h"
+#include "mccdspdrv.h"
+#include "mcedspdrv.h"
+#include "mcfdspdrv.h"
+#if MCDRV_DEBUG_LEVEL
+#include "mcdebuglog.h"
+#endif
+
+
+
+
+#define MCDRV_MAX_WAIT_TIME (268435455UL)
+#define MCDRV_LDO_WAIT_TIME (1000UL)
+#define MCDRV_DAC_MUTE_WAIT_TIME (20000UL)
+#define MCDRV_VREF_WAIT_TIME_ES1 (2000UL)
+#define MCDRV_VREF_WAIT_TIME (30000UL)
+#define MCDRV_MB4_WAIT_TIME (8000UL)
+#define MCDRV_SP_WAIT_TIME (200UL)
+
+#define T_CPMODE_IMPSENSE_BEFORE (0)
+#define T_CPMODE_IMPSENSE_AFTER (2)
+
+static const struct MCDRV_PATH_INFO gsPathInfoAllOff = {
+ {{0x00AAAAAA}, {0x00AAAAAA} }, /* asMusicOut */
+ {{0x00AAAAAA}, {0x00AAAAAA} }, /* asExtOut */
+ {{0x00AAAAAA} }, /* asHifiOut */
+ {{0x00AAAAAA}, {0x00AAAAAA},
+ {0x00AAAAAA}, {0x00AAAAAA} }, /* asVboxMixIn */
+ {{0x00AAAAAA}, {0x00AAAAAA} }, /* asAe0 */
+ {{0x00AAAAAA}, {0x00AAAAAA} }, /* asAe1 */
+ {{0x00AAAAAA}, {0x00AAAAAA} }, /* asAe2 */
+ {{0x00AAAAAA}, {0x00AAAAAA} }, /* asAe3 */
+ {{0x00AAAAAA}, {0x00AAAAAA} }, /* asDac0 */
+ {{0x00AAAAAA}, {0x00AAAAAA} }, /* asDac1 */
+ {{0x00AAAAAA} }, /* asVoiceOut */
+ {{0x00AAAAAA} }, /* asVboxIoIn */
+ {{0x00AAAAAA} }, /* asVboxHostIn */
+ {{0x00AAAAAA} }, /* asHostOut */
+ {{0x00AAAAAA}, {0x00AAAAAA} }, /* asAdif0 */
+ {{0x00AAAAAA}, {0x00AAAAAA} }, /* asAdif1 */
+ {{0x00AAAAAA}, {0x00AAAAAA} }, /* asAdif2 */
+ {{0x002AAAAA}, {0x002AAAAA} }, /* asAdc0 */
+ {{0x002AAAAA} }, /* asAdc1 */
+ {{0x002AAAAA}, {0x002AAAAA} }, /* asSp */
+ {{0x002AAAAA}, {0x002AAAAA} }, /* asHp */
+ {{0x002AAAAA} }, /* asRc */
+ {{0x002AAAAA}, {0x002AAAAA} }, /* asLout1 */
+ {{0x002AAAAA}, {0x002AAAAA} }, /* asLout2 */
+ {{0x002AAAAA}, {0x002AAAAA},
+ {0x002AAAAA}, {0x002AAAAA} } /* asBias */
+};
+
+static const struct MCDRV_PATH_INFO gsPathInfoAllZero = {
+ {{0x00000000}, {0x00000000} }, /* asMusicOut */
+ {{0x00000000}, {0x00000000} }, /* asExtOut */
+ {{0x00000000} }, /* asHifiOut */
+ {{0x00000000}, {0x00000000},
+ {0x00000000}, {0x00000000} }, /* asVboxMixIn */
+ {{0x00000000}, {0x00000000} }, /* asAe0 */
+ {{0x00000000}, {0x00000000} }, /* asAe1 */
+ {{0x00000000}, {0x00000000} }, /* asAe2 */
+ {{0x00000000}, {0x00000000} }, /* asAe3 */
+ {{0x00000000}, {0x00000000} }, /* asDac0 */
+ {{0x00000000}, {0x00000000} }, /* asDac1 */
+ {{0x00000000} }, /* asVoiceOut */
+ {{0x00000000} }, /* asVboxIoIn */
+ {{0x00000000} }, /* asVboxHostIn */
+ {{0x00000000} }, /* asHostOut */
+ {{0x00000000}, {0x00000000} }, /* asAdif0 */
+ {{0x00000000}, {0x00000000} }, /* asAdif1 */
+ {{0x00000000}, {0x00000000} }, /* asAdif2 */
+ {{0x00000000}, {0x00000000} }, /* asAdc0 */
+ {{0x00000000} }, /* asAdc1 */
+ {{0x00000000}, {0x00000000} }, /* asSp */
+ {{0x00000000}, {0x00000000} }, /* asHp */
+ {{0x00000000} }, /* asRc */
+ {{0x00000000}, {0x00000000} }, /* asLout1 */
+ {{0x00000000}, {0x00000000} }, /* asLout2 */
+ {{0x00000000}, {0x00000000},
+ {0x00000000}, {0x00000000} } /* asBias */
+};
+
+static SINT32 init(const struct MCDRV_INIT_INFO *psInitInfo,
+ const struct MCDRV_INIT2_INFO *psInit2Info);
+static SINT32 term(void);
+
+static SINT32 read_reg(struct MCDRV_REG_INFO *psRegInfo);
+static SINT32 write_reg(const struct MCDRV_REG_INFO *psRegInfo);
+
+static SINT32 get_clocksw(struct MCDRV_CLOCKSW_INFO *psClockSwInfo);
+static SINT32 set_clocksw(const struct MCDRV_CLOCKSW_INFO *psClockSwInfo);
+
+static SINT32 get_path(struct MCDRV_PATH_INFO *psPathInfo);
+static SINT32 set_path(const struct MCDRV_PATH_INFO *psPathInfo);
+
+static SINT32 get_volume(struct MCDRV_VOL_INFO *psVolInfo);
+static SINT32 set_volume(const struct MCDRV_VOL_INFO *psVolInfo);
+
+static SINT32 get_digitalio(struct MCDRV_DIO_INFO *psDioInfo);
+static SINT32 set_digitalio(const struct MCDRV_DIO_INFO *psDioInfo,
+ UINT32 dUpdateInfo);
+
+static SINT32 get_digitalio_path(struct MCDRV_DIOPATH_INFO *psDioPathInfo);
+static SINT32 set_digitalio_path(
+ const struct MCDRV_DIOPATH_INFO *psDioPathInfo,
+ UINT32 dUpdateInfo);
+
+static SINT32 get_swap(struct MCDRV_SWAP_INFO *psSwapInfo);
+static SINT32 set_swap(const struct MCDRV_SWAP_INFO *psSwapInfo,
+ UINT32 dUpdateInfo);
+
+static UINT8 IsPathAllOff(void);
+static SINT32 set_dsp(const UINT8 *pbPrm, UINT32 dSize);
+static SINT32 get_dsp(struct MCDRV_DSP_PARAM *psDspParam,
+ void *pvData,
+ UINT32 dSize);
+static SINT32 get_dsp_data(UINT8 *pbData, UINT32 dSize);
+static SINT32 set_dsp_data(const UINT8 *pbData, UINT32 dSize);
+static SINT32 register_dsp_cb(SINT32 (*pcbfunc)(SINT32, UINT32, UINT32));
+static SINT32 get_dsp_transition(UINT32 dDspType);
+
+static SINT32 get_hsdet(struct MCDRV_HSDET_INFO *psHSDet,
+ struct MCDRV_HSDET2_INFO *psHSDet2);
+static SINT32 set_hsdet(const struct MCDRV_HSDET_INFO *psHSDet,
+ const struct MCDRV_HSDET2_INFO *psHSDet2,
+ UINT32 dUpdateInfo);
+static SINT32 config_gp(const struct MCDRV_GP_MODE *psGpMode);
+static SINT32 mask_gp(UINT8 *pbMask, UINT32 dPadNo);
+static SINT32 getset_gp(UINT8 *pbGpio, UINT32 dPadNo);
+
+static SINT32 irq_proc(void);
+static SINT32 BeginImpSense(UINT8 *bOP_DAC);
+
+static UINT8 IsLDOAOn(void);
+static UINT8 IsValidInitParam(const struct MCDRV_INIT_INFO *psInitInfo,
+ const struct MCDRV_INIT2_INFO *psInit2Info);
+static UINT8 IsValidClockSwParam(
+ const struct MCDRV_CLOCKSW_INFO *psClockSwInfo);
+static UINT8 IsValidReadRegParam(const struct MCDRV_REG_INFO *psRegInfo);
+static UINT8 IsValidWriteRegParam(const struct MCDRV_REG_INFO *psRegInfo);
+static void MaskIrregularPath(struct MCDRV_PATH_INFO *psPathInfo);
+static UINT8 IsValidDioParam(const struct MCDRV_DIO_INFO *psDioInfo,
+ UINT32 dUpdateInfo);
+static UINT8 IsValidDioPathParam(
+ const struct MCDRV_DIOPATH_INFO *psDioPathInfo,
+ UINT32 dUpdateInfo);
+static UINT8 IsValidSwapParam(const struct MCDRV_SWAP_INFO *psSwapInfo,
+ UINT32 dUpdateInfo);
+static UINT8 IsValidDspParam(const struct MCDRV_AEC_INFO *psAECInfo);
+static UINT8 IsValidHSDetParam(const struct MCDRV_HSDET_INFO *psHSDetInfo,
+ const struct MCDRV_HSDET2_INFO *psHSDet2Info,
+ UINT32 dUpdateInfo);
+static UINT8 IsValidGpParam(const struct MCDRV_GP_MODE *psGpMode);
+static UINT8 IsValidMaskGp(UINT8 bMask, UINT32 dPadNo);
+
+static UINT8 CheckDIOCommon(const struct MCDRV_DIO_INFO *psDioInfo,
+ UINT8 bPort);
+static UINT8 CheckDaFormat(const struct MCDRV_DA_FORMAT *psDaFormat);
+static UINT8 CheckPcmFormat(const struct MCDRV_PCM_FORMAT *psPcmFormat);
+static UINT8 CheckDIODIR(const struct MCDRV_DIO_INFO *psDioInfo,
+ UINT8 bPort);
+static UINT8 CheckDIODIT(const struct MCDRV_DIO_INFO *psDioInfo,
+ UINT8 bPort);
+
+static SINT32 SetVol(UINT32 dUpdate,
+ enum MCDRV_VOLUPDATE_MODE eMode,
+ UINT32 *pdSVolDoneParam);
+static void GetMuteParam(UINT8 *pbDIRMuteParam,
+ UINT8 *pbADCMuteParam,
+ UINT8 *pbDITMuteParam,
+ UINT8 *pbDACMuteParam);
+static SINT32 SavePower(void);
+
+/****************************************************************************
+ * init
+ *
+ * Description:
+ * Initialize.
+ * Arguments:
+ * psInitInfo initialize information
+ * psInit2Info initialize information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 init
+(
+ const struct MCDRV_INIT_INFO *psInitInfo,
+ const struct MCDRV_INIT2_INFO *psInit2Info
+)
+{
+ SINT32 sdRet;
+ UINT8 abData[4];
+ UINT8 bHwId_dig,
+ bHwId_ana = 0;
+ UINT8 bAP = MCI_AP_DEF;
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+ struct MCDRV_POWER_INFO sPowerInfo;
+ struct MCDRV_POWER_UPDATE sPowerUpdate;
+
+ if (NULL == psInitInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY == eState)
+ return MCDRV_ERROR_STATE;
+
+ McSrv_SystemInit();
+ McSrv_Lock();
+ McResCtrl_Init();
+
+ machdep_PreLDODStart();
+
+ if (bHwId_ana == 0) {
+ abData[0] = MCI_ANA_REG_A<<1;
+ abData[1] = MCI_ANA_ID;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_ANA, abData, 2);
+ bHwId_ana = McSrv_ReadReg(MCDRV_SLAVEADDR_ANA,
+ (UINT32)MCI_ANA_REG_D);
+ if ((bHwId_ana&MCDRV_DEVID_MASK) == MCDRV_DEVID_ANA) {
+ abData[0] = MCI_ANA_REG_A<<1;
+ abData[1] = MCI_ANA_RST;
+ abData[2] = MCI_ANA_REG_D<<1;
+ abData[3] = MCI_ANA_RST_DEF;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_ANA, abData, 4);
+ abData[3] = 0;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_ANA, abData, 4);
+
+ if ((bHwId_ana&MCDRV_VERID_MASK) == 0) {
+ abData[1] = MCI_AP;
+ abData[3] = MCI_AP_DEF;
+ abData[3] &=
+ (UINT8)~MCB_AP_VR;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_ANA, abData, 4);
+ McSrv_Sleep(MCDRV_VREF_WAIT_TIME_ES1);
+ abData[3] &=
+ (UINT8)~(MCB_AP_LDOA|MCB_AP_BGR);
+ McSrv_WriteReg(MCDRV_SLAVEADDR_ANA, abData, 4);
+ McSrv_Sleep(MCDRV_LDO_WAIT_TIME);
+ bAP = abData[3];
+ } else {
+ abData[1] = MCI_HIZ;
+ abData[3] = 0;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_ANA, abData, 4);
+ abData[1] = MCI_LO_HIZ;
+ abData[3] = 0;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_ANA, abData, 4);
+ abData[1] = MCI_AP;
+ bAP &= (UINT8)~(MCB_AP_LDOA|MCB_AP_BGR);
+ abData[3] = bAP;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_ANA, abData, 4);
+ McSrv_Sleep(MCDRV_LDO_WAIT_TIME);
+ abData[1] = 62;
+ abData[3] = 0x20;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_ANA, abData, 4);
+ abData[1] = MCI_AP;
+ bAP &= (UINT8)~MCB_AP_VR;
+ abData[3] = bAP;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_ANA, abData, 4);
+ McSrv_Sleep(MCDRV_VREF_WAIT_TIME);
+ abData[1] = 62;
+ abData[3] = 0;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_ANA, abData, 4);
+ }
+ }
+ }
+ if ((bHwId_ana&MCDRV_DEVID_MASK) == MCDRV_DEVID_ANA) {
+ if ((bHwId_ana&MCDRV_VERID_MASK) == 0)
+ bHwId_dig = 0x80;
+ else
+ bHwId_dig = 0x81;
+ sdRet = McResCtrl_SetHwId(bHwId_dig, bHwId_ana);
+ if (sdRet == MCDRV_SUCCESS) {
+ if (IsValidInitParam(psInitInfo, psInit2Info) == 0)
+ sdRet = MCDRV_ERROR_ARGUMENT;
+ McResCtrl_SetRegVal(MCDRV_PACKET_REGTYPE_ANA, MCI_AP,
+ bAP);
+ }
+ if (sdRet == MCDRV_SUCCESS) {
+ McResCtrl_SetInitInfo(psInitInfo, psInit2Info);
+ sdRet = McDevIf_AllocPacketBuf();
+ }
+ if (sdRet == MCDRV_SUCCESS)
+ sdRet = McPacket_AddInit();
+
+ if (sdRet == MCDRV_SUCCESS)
+ sdRet = McDevIf_ExecutePacket();
+
+ if (sdRet == MCDRV_SUCCESS) {
+ if (psInitInfo->bPowerMode == MCDRV_POWMODE_CDSPDEBUG) {
+ McResCtrl_GetPowerInfo(&sPowerInfo);
+ /* used path power up */
+ sPowerUpdate.bDigital = MCDRV_POWUPDATE_D_ALL;
+ sPowerUpdate.abAnalog[0] = MCB_AP_LDOD;
+ sPowerUpdate.abAnalog[1] =
+ sPowerUpdate.abAnalog[2] =
+ sPowerUpdate.abAnalog[3] =
+ sPowerUpdate.abAnalog[4] = 0;
+ sdRet =
+ McPacket_AddPowerUp(&sPowerInfo, &sPowerUpdate);
+ } else {
+ if ((psInit2Info != NULL)
+ && (psInit2Info->bOption[19] == 1)) {
+ /* LDOD always on */
+ McResCtrl_GetPowerInfo(&sPowerInfo);
+ sPowerInfo.bDigital &=
+ (UINT8)~MCDRV_POWINFO_D_PLL_PD;
+ sPowerInfo.abAnalog[0] &=
+ (UINT8)~MCB_AP_LDOD;
+ /* used path power up */
+ sPowerUpdate.bDigital =
+ MCDRV_POWUPDATE_D_ALL;
+ sPowerUpdate.abAnalog[0] =
+ MCB_AP_LDOD;
+ sPowerUpdate.abAnalog[1] =
+ sPowerUpdate.abAnalog[2] =
+ sPowerUpdate.abAnalog[3] =
+ sPowerUpdate.abAnalog[4] = 0;
+ sdRet =
+ McPacket_AddPowerUp(&sPowerInfo,
+ &sPowerUpdate);
+ } else {
+ abData[0] = MCI_ANA_REG_A<<1;
+ abData[1] = MCI_AP;
+ abData[2] = MCI_ANA_REG_D<<1;
+ bAP &= (UINT8)~MCB_AP_LDOD;
+ abData[3] = bAP;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_ANA,
+ abData, 4);
+ McResCtrl_SetRegVal(
+ MCDRV_PACKET_REGTYPE_ANA,
+ MCI_AP, bAP);
+ abData[0] = MCI_RST_A<<1;
+ abData[1] = MCI_RST_A_DEF;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_DIG,
+ abData, 2);
+ abData[1] =
+ MCI_RST_A_DEF&~MCB_RST_A;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_DIG,
+ abData, 2);
+ }
+ }
+ }
+
+ if (sdRet == MCDRV_SUCCESS)
+ sdRet = McDevIf_ExecutePacket();
+
+ if (sdRet == MCDRV_SUCCESS) {
+ abData[0] = MCI_A_REG_A<<1;
+ abData[1] = MCI_A_DEV_ID;
+ McSrv_WriteReg(MCDRV_SLAVEADDR_DIG, abData, 2);
+ abData[3] = McSrv_ReadReg(MCDRV_SLAVEADDR_DIG,
+ (UINT32)MCI_A_REG_D);
+ if (abData[3] != bHwId_dig)
+ sdRet = MCDRV_ERROR_INIT;
+ }
+
+ if (sdRet == MCDRV_SUCCESS) {
+ McResCtrl_UpdateState(eMCDRV_STATE_READY);
+ SavePower();
+ } else
+ McDevIf_ReleasePacketBuf();
+ } else
+ sdRet = MCDRV_ERROR_INIT;
+
+ bAP = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA, MCI_AP);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+
+ McSrv_Unlock();
+
+ if (sdRet != MCDRV_SUCCESS)
+ McSrv_SystemTerm();
+
+ return sdRet;
+}
+
+/****************************************************************************
+ * term
+ *
+ * Description:
+ * Terminate.
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 term
+(
+ void
+)
+{
+ SINT32 sdRet = MCDRV_SUCCESS;
+ struct MCDRV_INIT_INFO sInitInfo;
+ struct MCDRV_POWER_INFO sPowerInfo;
+ struct MCDRV_POWER_UPDATE sPowerUpdate;
+ UINT32 dUpdateFlg;
+ struct MCDRV_HSDET_INFO sHSDet;
+ UINT8 bAP;
+
+ if (eMCDRV_STATE_READY != McResCtrl_GetState())
+ return MCDRV_ERROR_STATE;
+
+ McSrv_Lock();
+
+ bAP = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA, MCI_AP);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PreLDODStart();
+ }
+
+ McResCtrl_GetInitInfo(&sInitInfo, NULL);
+ sInitInfo.bPowerMode = MCDRV_POWMODE_FULL;
+ McResCtrl_SetInitInfo(&sInitInfo, NULL);
+
+ sdRet = set_path(&gsPathInfoAllOff);
+ if (sdRet == MCDRV_SUCCESS) {
+ sPowerInfo.bDigital = 0xFF;
+ sPowerInfo.abAnalog[0] =
+ sPowerInfo.abAnalog[1] =
+ sPowerInfo.abAnalog[2] =
+ sPowerInfo.abAnalog[3] =
+ sPowerInfo.abAnalog[4] = (UINT8)0xFF;
+ sPowerUpdate.bDigital = MCDRV_POWUPDATE_D_ALL;
+ sPowerUpdate.abAnalog[0] =
+ (UINT8)MCDRV_POWUPDATE_AP;
+ sPowerUpdate.abAnalog[1] =
+ (UINT8)MCDRV_POWUPDATE_AP_OUT0;
+ sPowerUpdate.abAnalog[2] =
+ (UINT8)MCDRV_POWUPDATE_AP_OUT1;
+ sPowerUpdate.abAnalog[3] =
+ (UINT8)MCDRV_POWUPDATE_AP_MC;
+ sPowerUpdate.abAnalog[4] =
+ (UINT8)MCDRV_POWUPDATE_AP_IN;
+ sdRet = McPacket_AddPowerDown(&sPowerInfo, &sPowerUpdate);
+ if (sdRet == MCDRV_SUCCESS)
+ sdRet = McDevIf_ExecutePacket();
+ }
+
+ sHSDet.bEnPlugDet = MCDRV_PLUGDET_DISABLE;
+ sHSDet.bEnPlugDetDb = MCDRV_PLUGDETDB_DISABLE;
+ sHSDet.bEnDlyKeyOff = MCDRV_KEYEN_D_D_D;
+ sHSDet.bEnDlyKeyOn = MCDRV_KEYEN_D_D_D;
+ sHSDet.bEnMicDet = MCDRV_MICDET_DISABLE;
+ sHSDet.bEnKeyOff = MCDRV_KEYEN_D_D_D;
+ sHSDet.bEnKeyOn = MCDRV_KEYEN_D_D_D;
+ dUpdateFlg = MCDRV_ENPLUGDET_UPDATE_FLAG
+ |MCDRV_ENPLUGDETDB_UPDATE_FLAG
+ |MCDRV_ENDLYKEYOFF_UPDATE_FLAG
+ |MCDRV_ENDLYKEYON_UPDATE_FLAG
+ |MCDRV_ENMICDET_UPDATE_FLAG
+ |MCDRV_ENKEYOFF_UPDATE_FLAG
+ |MCDRV_ENKEYON_UPDATE_FLAG;
+ sdRet = set_hsdet(&sHSDet, NULL, dUpdateFlg);
+
+ McDevIf_ReleasePacketBuf();
+
+ McResCtrl_UpdateState(eMCDRV_STATE_NOTINIT);
+
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+ McSrv_Unlock();
+
+ McSrv_SystemTerm();
+
+ return sdRet;
+}
+
+/****************************************************************************
+ * read_reg
+ *
+ * Description:
+ * read register.
+ * Arguments:
+ * psRegInfo register information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+static SINT32 read_reg
+(
+ struct MCDRV_REG_INFO *psRegInfo
+)
+{
+ SINT32 sdRet = MCDRV_SUCCESS;
+ UINT8 bSlaveAddr;
+ UINT8 bAddr;
+ UINT8 abData[2];
+ struct MCDRV_POWER_INFO sPowerInfo;
+ struct MCDRV_POWER_INFO sCurPowerInfo;
+ struct MCDRV_POWER_UPDATE sPowerUpdate;
+
+ if (NULL == psRegInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != McResCtrl_GetState())
+ return MCDRV_ERROR_STATE;
+
+ if (IsValidReadRegParam(psRegInfo) == 0)
+ return MCDRV_ERROR_ARGUMENT;
+
+ /* get current power info */
+ McResCtrl_GetCurPowerInfo(&sCurPowerInfo);
+
+ /* power up */
+ McResCtrl_GetPowerInfoRegAccess(psRegInfo, &sPowerInfo);
+ sPowerUpdate.bDigital = MCDRV_POWUPDATE_D_ALL;
+ sPowerUpdate.abAnalog[0] = (UINT8)MCDRV_POWUPDATE_AP;
+ sPowerUpdate.abAnalog[1] = (UINT8)MCDRV_POWUPDATE_AP_OUT0;
+ sPowerUpdate.abAnalog[2] = (UINT8)MCDRV_POWUPDATE_AP_OUT1;
+ sPowerUpdate.abAnalog[3] = (UINT8)MCDRV_POWUPDATE_AP_MC;
+ sPowerUpdate.abAnalog[4] = (UINT8)MCDRV_POWUPDATE_AP_IN;
+ sdRet = McPacket_AddPowerUp(&sPowerInfo, &sPowerUpdate);
+ if (MCDRV_SUCCESS != sdRet)
+ return sdRet;
+ sdRet = McDevIf_ExecutePacket();
+ if (MCDRV_SUCCESS != sdRet)
+ return sdRet;
+
+ bAddr = psRegInfo->bAddress;
+
+ if (psRegInfo->bRegType == MCDRV_REGTYPE_IF) {
+ if ((psRegInfo->bAddress == MCI_ANA_REG_A)
+ || (psRegInfo->bAddress == MCI_ANA_REG_D))
+ bSlaveAddr =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_ANA);
+ else
+ bSlaveAddr =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG);
+ } else {
+ switch (psRegInfo->bRegType) {
+ case MCDRV_REGTYPE_A:
+ bSlaveAddr =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG);
+ abData[0] = MCI_A_REG_A<<1;
+ abData[1] = bAddr;
+ McSrv_WriteReg(bSlaveAddr, abData, 2);
+ bAddr = MCI_A_REG_D;
+ break;
+
+ case MCDRV_REGTYPE_MA:
+ bSlaveAddr =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG);
+ abData[0] = MCI_MA_REG_A<<1;
+ abData[1] = bAddr;
+ McSrv_WriteReg(bSlaveAddr, abData, 2);
+ bAddr = MCI_MA_REG_D;
+ break;
+
+ case MCDRV_REGTYPE_MB:
+ bSlaveAddr =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG);
+ abData[0] = MCI_MB_REG_A<<1;
+ abData[1] = bAddr;
+ McSrv_WriteReg(bSlaveAddr, abData, 2);
+ bAddr = MCI_MB_REG_D;
+ break;
+
+ case MCDRV_REGTYPE_B:
+ bSlaveAddr =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG);
+ abData[0] = MCI_B_REG_A<<1;
+ abData[1] = bAddr;
+ McSrv_WriteReg(bSlaveAddr, abData, 2);
+ bAddr = MCI_B_REG_D;
+ break;
+
+ case MCDRV_REGTYPE_E:
+ bSlaveAddr =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG);
+ abData[0] = MCI_E_REG_A<<1;
+ abData[1] = bAddr;
+ McSrv_WriteReg(bSlaveAddr, abData, 2);
+ bAddr = MCI_E_REG_D;
+ break;
+
+ case MCDRV_REGTYPE_C:
+ bSlaveAddr =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG);
+ abData[0] = MCI_C_REG_A<<1;
+ abData[1] = bAddr;
+ McSrv_WriteReg(bSlaveAddr, abData, 2);
+ bAddr = MCI_C_REG_D;
+ break;
+
+ case MCDRV_REGTYPE_F:
+ bSlaveAddr =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG);
+ abData[0] = MCI_F_REG_A<<1;
+ abData[1] = bAddr;
+ McSrv_WriteReg(bSlaveAddr, abData, 2);
+ bAddr = MCI_F_REG_D;
+ break;
+
+ case MCDRV_REGTYPE_ANA:
+ bSlaveAddr =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_ANA);
+ abData[0] = MCI_ANA_REG_A<<1;
+ abData[1] = bAddr;
+ McSrv_WriteReg(bSlaveAddr, abData, 2);
+ bAddr = MCI_ANA_REG_D;
+ break;
+
+ case MCDRV_REGTYPE_CD:
+ bSlaveAddr =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_ANA);
+ abData[0] = MCI_CD_REG_A<<1;
+ abData[1] = bAddr;
+ McSrv_WriteReg(bSlaveAddr, abData, 2);
+ bAddr = MCI_CD_REG_D;
+ break;
+
+ default:
+ return MCDRV_ERROR_ARGUMENT;
+ }
+ }
+
+ /* read register */
+ psRegInfo->bData = McSrv_ReadReg(bSlaveAddr, bAddr);
+
+ /* restore power */
+ sdRet = McPacket_AddPowerDown(&sCurPowerInfo, &sPowerUpdate);
+ if (MCDRV_SUCCESS != sdRet)
+ return sdRet;
+ return McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * write_reg
+ *
+ * Description:
+ * Write register.
+ * Arguments:
+ * psWR register information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ * MCDRV_ERROR_ARGUMENT
+ * MCDRV_ERROR_RESOURCEOVER
+ *
+ ****************************************************************************/
+static SINT32 write_reg
+(
+ const struct MCDRV_REG_INFO *psRegInfo
+)
+{
+ SINT32 sdRet = MCDRV_SUCCESS;
+ struct MCDRV_POWER_INFO sPowerInfo;
+ struct MCDRV_POWER_INFO sCurPowerInfo;
+ struct MCDRV_POWER_UPDATE sPowerUpdate;
+ UINT8 abData[2];
+
+ if (NULL == psRegInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != McResCtrl_GetState())
+ return MCDRV_ERROR_STATE;
+
+ if (IsValidWriteRegParam(psRegInfo) == 0)
+ return MCDRV_ERROR_ARGUMENT;
+
+ /* get current power info */
+ McResCtrl_GetCurPowerInfo(&sCurPowerInfo);
+
+ /* power up */
+ McResCtrl_GetPowerInfoRegAccess(psRegInfo, &sPowerInfo);
+ sPowerUpdate.bDigital = MCDRV_POWUPDATE_D_ALL;
+ sPowerUpdate.abAnalog[0] = (UINT8)MCDRV_POWUPDATE_AP;
+ sPowerUpdate.abAnalog[1] = (UINT8)MCDRV_POWUPDATE_AP_OUT0;
+ sPowerUpdate.abAnalog[2] = (UINT8)MCDRV_POWUPDATE_AP_OUT1;
+ sPowerUpdate.abAnalog[3] = (UINT8)MCDRV_POWUPDATE_AP_MC;
+ sPowerUpdate.abAnalog[4] = (UINT8)MCDRV_POWUPDATE_AP_IN;
+ sdRet = McPacket_AddPowerUp(&sPowerInfo, &sPowerUpdate);
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ switch (psRegInfo->bRegType) {
+ case MCDRV_REGTYPE_IF:
+ if ((psRegInfo->bAddress == MCI_ANA_REG_A)
+ || (psRegInfo->bAddress == MCI_ANA_REG_D)
+ || (psRegInfo->bAddress == MCI_CD_REG_A)
+ || (psRegInfo->bAddress == MCI_CD_REG_D)) {
+ abData[0] = psRegInfo->bAddress<<1;
+ abData[1] = psRegInfo->bData;
+ McSrv_WriteReg(
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_ANA),
+ abData, 2);
+ } else {
+ ;
+ McDevIf_AddPacket(
+ (MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | psRegInfo->bAddress),
+ psRegInfo->bData);
+ }
+ break;
+
+ case MCDRV_REGTYPE_A:
+ McDevIf_AddPacket(
+ (MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_A
+ | psRegInfo->bAddress),
+ psRegInfo->bData);
+ break;
+
+ case MCDRV_REGTYPE_MA:
+ McDevIf_AddPacket(
+ (MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_MA
+ | psRegInfo->bAddress),
+ psRegInfo->bData);
+ break;
+
+ case MCDRV_REGTYPE_MB:
+ McDevIf_AddPacket(
+ (MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_MB
+ | psRegInfo->bAddress),
+ psRegInfo->bData);
+ break;
+
+ case MCDRV_REGTYPE_B:
+ McDevIf_AddPacket(
+ (MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_B
+ | psRegInfo->bAddress),
+ psRegInfo->bData);
+ break;
+
+ case MCDRV_REGTYPE_E:
+ McDevIf_AddPacket(
+ (MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | psRegInfo->bAddress),
+ psRegInfo->bData);
+ break;
+
+ case MCDRV_REGTYPE_C:
+ McDevIf_AddPacket(
+ (MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_C
+ | psRegInfo->bAddress),
+ psRegInfo->bData);
+ break;
+
+ case MCDRV_REGTYPE_F:
+ McDevIf_AddPacket(
+ (MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_F
+ | psRegInfo->bAddress),
+ psRegInfo->bData);
+ break;
+
+ case MCDRV_REGTYPE_ANA:
+ McDevIf_AddPacket(
+ (MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | psRegInfo->bAddress),
+ psRegInfo->bData);
+ break;
+
+ case MCDRV_REGTYPE_CD:
+ McDevIf_AddPacket(
+ (MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_CD
+ | psRegInfo->bAddress),
+ psRegInfo->bData);
+ break;
+
+ default:
+ return MCDRV_ERROR_ARGUMENT;
+ }
+
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ /* restore power */
+ switch (psRegInfo->bRegType) {
+ case MCDRV_REGTYPE_A:
+ sCurPowerInfo.bDigital &= ~MCDRV_POWINFO_D_PLL_PD;
+ if (psRegInfo->bAddress == MCI_PD) {
+ if (((psRegInfo->bData&MCB_PE_CLK_PD) == 0)
+ && (sCurPowerInfo.bDigital&MCDRV_POWINFO_D_PM_CLK_PD)
+ == 0)
+ sCurPowerInfo.bDigital
+ &= ~MCDRV_POWINFO_D_PE_CLK_PD;
+ if (((psRegInfo->bData&MCB_PB_CLK_PD) == 0)
+ && (sCurPowerInfo.bDigital&MCDRV_POWINFO_D_PM_CLK_PD)
+ == 0)
+ sCurPowerInfo.bDigital
+ &= ~MCDRV_POWINFO_D_PB_CLK_PD;
+ }
+ break;
+ case MCDRV_REGTYPE_IF:
+ if (psRegInfo->bAddress == MCI_RST) {
+ if ((psRegInfo->bData&MCB_PSW_M) == 0)
+ sCurPowerInfo.bDigital
+ &= ~MCDRV_POWINFO_D_PM_CLK_PD;
+ if ((psRegInfo->bData&MCB_PSW_F) == 0)
+ sCurPowerInfo.bDigital
+ &= ~MCDRV_POWINFO_D_PF_CLK_PD;
+ if ((psRegInfo->bData&MCB_PSW_C) == 0)
+ sCurPowerInfo.bDigital
+ &= ~MCDRV_POWINFO_D_PC_CLK_PD;
+ }
+ break;
+
+ case MCDRV_REGTYPE_ANA:
+ if (psRegInfo->bAddress == MCI_AP)
+ sCurPowerInfo.abAnalog[0] = psRegInfo->bData;
+ else if (psRegInfo->bAddress == MCI_AP_DA0)
+ sCurPowerInfo.abAnalog[1] = psRegInfo->bData;
+ else if (psRegInfo->bAddress == MCI_AP_DA1)
+ sCurPowerInfo.abAnalog[2] = psRegInfo->bData;
+ else if (psRegInfo->bAddress == MCI_AP_MIC)
+ sCurPowerInfo.abAnalog[3] = psRegInfo->bData;
+ else if (psRegInfo->bAddress == MCI_AP_AD)
+ sCurPowerInfo.abAnalog[4] = psRegInfo->bData;
+ break;
+
+ default:
+ break;
+ }
+ sdRet = McPacket_AddPowerDown(&sCurPowerInfo, &sPowerUpdate);
+ if (MCDRV_SUCCESS == sdRet)
+ return sdRet;
+ return McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * get_clocksw
+ *
+ * Description:
+ * Get clock switch setting.
+ * Arguments:
+ * psClockSwInfo clock switch information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 get_clocksw
+(
+ struct MCDRV_CLOCKSW_INFO *psClockSwInfo
+)
+{
+ if (NULL == psClockSwInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != McResCtrl_GetState())
+ return MCDRV_ERROR_STATE;
+
+ McResCtrl_GetClockSwInfo(psClockSwInfo);
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * set_clocksw
+ *
+ * Description:
+ * Set clock switch.
+ * Arguments:
+ * psClockSwInfo clock switch information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 set_clocksw
+(
+ const struct MCDRV_CLOCKSW_INFO *psClockSwInfo
+)
+{
+ struct MCDRV_CLOCKSW_INFO sCurClockSwInfo;
+
+ if (NULL == psClockSwInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != McResCtrl_GetState())
+ return MCDRV_ERROR_STATE;
+
+ if (IsValidClockSwParam(psClockSwInfo) == 0)
+ return MCDRV_ERROR_ARGUMENT;
+
+ McResCtrl_GetClockSwInfo(&sCurClockSwInfo);
+ if (sCurClockSwInfo.bClkSrc == psClockSwInfo->bClkSrc)
+ return MCDRV_SUCCESS;
+
+ McResCtrl_SetClockSwInfo(psClockSwInfo);
+ McPacket_AddClockSw();
+ return McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * get_path
+ *
+ * Description:
+ * Get current path setting.
+ * Arguments:
+ * psPathInfo path information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 get_path
+(
+ struct MCDRV_PATH_INFO *psPathInfo
+)
+{
+ if (NULL == psPathInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != McResCtrl_GetState())
+ return MCDRV_ERROR_STATE;
+
+ McResCtrl_GetPathInfoVirtual(psPathInfo);
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * set_path
+ *
+ * Description:
+ * Set path.
+ * Arguments:
+ * psPathInfo path information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 set_path
+(
+ const struct MCDRV_PATH_INFO *psPathInfo
+)
+{
+ SINT32 sdRet = MCDRV_SUCCESS;
+ UINT32 dSVolDoneParam = 0;
+ UINT8 bDIRMuteParam = 0;
+ UINT8 bADCMuteParam = 0;
+ UINT8 bDITMuteParam = 0;
+ UINT8 bDACMuteParam = 0;
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+ struct MCDRV_PATH_INFO sPathInfo;
+ struct MCDRV_POWER_INFO sPowerInfo;
+ struct MCDRV_POWER_UPDATE sPowerUpdate;
+ UINT8 bDSPStarted = McResCtrl_GetDspStart();
+ UINT8 bHPVolL, bHPVolR;
+ UINT8 bSPVolL, bSPVolR;
+ UINT8 bReg;
+
+ if (NULL == psPathInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ sPathInfo = *psPathInfo;
+ MaskIrregularPath(&sPathInfo);
+
+ sdRet = McResCtrl_SetPathInfo(&sPathInfo);
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ bHPVolL = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA, MCI_HPVOL_L);
+ bHPVolL &= (UINT8)~MCB_ALAT_HP;
+ bHPVolR = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA, MCI_HPVOL_R);
+ bSPVolL = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA, MCI_SPVOL_L);
+ bSPVolL &= (UINT8)~MCB_ALAT_SP;
+ bSPVolR = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA, MCI_SPVOL_R);
+
+ /* unused analog out volume mute */
+ sdRet = SetVol(MCDRV_VOLUPDATE_ANA_OUT,
+ eMCDRV_VOLUPDATE_MUTE,
+ &dSVolDoneParam);
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ if (dSVolDoneParam != 0UL)
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_SVOL_DONE
+ | dSVolDoneParam,
+ 0);
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ if ((bSPVolL != 0)
+ || (bSPVolR != 0)) {
+ bSPVolL = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA,
+ MCI_SPVOL_L);
+ bSPVolL &= (UINT8)~MCB_ALAT_SP;
+ bSPVolR = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA,
+ MCI_SPVOL_R);
+ if ((bSPVolL == 0)
+ && (bSPVolR == 0)) {
+ ;
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_TIMWAIT
+ | MCDRV_SP_WAIT_TIME, 0);
+ }
+ }
+
+ GetMuteParam(&bDIRMuteParam,
+ &bADCMuteParam,
+ &bDITMuteParam,
+ &bDACMuteParam);
+
+ /* unused volume mute */
+ sdRet = SetVol(MCDRV_VOLUPDATE_DIG,
+ eMCDRV_VOLUPDATE_MUTE,
+ NULL);
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ /* set volume */
+ sdRet = SetVol(MCDRV_VOLUPDATE_ANA_IN,
+ eMCDRV_VOLUPDATE_ALL,
+ NULL);
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ /* wait VFLAG */
+ if (bDIRMuteParam != 0)
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_DIRMUTE
+ | bDIRMuteParam,
+ 0);
+
+ if (bADCMuteParam != 0)
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_ADCMUTE
+ | bADCMuteParam,
+ 0);
+
+ if (bDITMuteParam != 0)
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_DITMUTE
+ | bDITMuteParam,
+ 0);
+
+ if (bDACMuteParam != 0)
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_DACMUTE
+ | bDACMuteParam,
+ 0);
+
+ /* F-DSP stop */
+ McPacket_AddFDSPStop(bDSPStarted);
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ /* stop unused path */
+ McPacket_AddStop();
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ McResCtrl_GetPowerInfo(&sPowerInfo);
+
+ /* unused analog out path power down */
+ sPowerUpdate.bDigital = 0;
+ sPowerUpdate.abAnalog[0] = (UINT8)0;
+ sPowerUpdate.abAnalog[1] = (UINT8)MCDRV_POWUPDATE_AP_OUT0;
+ sPowerUpdate.abAnalog[2] = (UINT8)MCDRV_POWUPDATE_AP_OUT1;
+ sPowerUpdate.abAnalog[3] = (UINT8)0;
+ sPowerUpdate.abAnalog[4] = (UINT8)0;
+ sdRet = McPacket_AddPowerDown(&sPowerInfo, &sPowerUpdate);
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ /* used path power up */
+ sPowerUpdate.bDigital = MCDRV_POWUPDATE_D_ALL;
+ sPowerUpdate.abAnalog[0] = (UINT8)MCDRV_POWUPDATE_AP;
+ sPowerUpdate.abAnalog[1] = (UINT8)MCDRV_POWUPDATE_AP_OUT0;
+ sPowerUpdate.abAnalog[2] = (UINT8)MCDRV_POWUPDATE_AP_OUT1;
+ sPowerUpdate.abAnalog[3] = (UINT8)MCDRV_POWUPDATE_AP_MC;
+ sPowerUpdate.abAnalog[4] = (UINT8)MCDRV_POWUPDATE_AP_IN;
+ sdRet = McPacket_AddPowerUp(&sPowerInfo, &sPowerUpdate);
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ /* set mixer */
+ McPacket_AddPathSet();
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ /* DSP start */
+ McPacket_AddDSPStartStop(bDSPStarted);
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ if ((bHPVolL != 0)
+ || (bHPVolR != 0)) {
+ if ((bHPVolL == 0)
+ || ((dSVolDoneParam&(MCB_HPL_BUSY<<8)) != 0)) {
+ if ((bHPVolR == 0)
+ || ((dSVolDoneParam&(MCB_HPR_BUSY<<8)) != 0)) {
+ if ((sPowerInfo.abAnalog[3] & MCB_MB4) != 0) {
+ bReg = McResCtrl_GetRegVal(
+ MCDRV_PACKET_REGTYPE_ANA,
+ MCI_AP_MIC);
+ if ((bReg&MCB_MB4) == 0) {
+ ;
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_TIMWAIT
+ | MCDRV_MB4_WAIT_TIME,
+ 0);
+ }
+ }
+ }
+ }
+ }
+
+ /* unused path power down */
+ sPowerUpdate.bDigital = MCDRV_POWUPDATE_D_ALL;
+ sPowerUpdate.abAnalog[0] = (UINT8)MCDRV_POWUPDATE_AP;
+ sPowerUpdate.abAnalog[1] = (UINT8)MCDRV_POWUPDATE_AP_OUT0;
+ sPowerUpdate.abAnalog[2] = (UINT8)MCDRV_POWUPDATE_AP_OUT1;
+ sPowerUpdate.abAnalog[3] = (UINT8)MCDRV_POWUPDATE_AP_MC;
+ sPowerUpdate.abAnalog[4] = (UINT8)MCDRV_POWUPDATE_AP_IN;
+ sdRet = McPacket_AddPowerDown(&sPowerInfo, &sPowerUpdate);
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ /* start */
+ McPacket_AddStart();
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ /* set volume */
+ sdRet = SetVol(MCDRV_VOLUPDATE_DIG,
+ eMCDRV_VOLUPDATE_ALL,
+ NULL);
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+ sdRet = SetVol(MCDRV_VOLUPDATE_ANA_OUT,
+ eMCDRV_VOLUPDATE_ALL,
+ &dSVolDoneParam);
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ return sdRet;
+}
+
+/****************************************************************************
+ * get_volume
+ *
+ * Description:
+ * Get current volume setting.
+ * Arguments:
+ * psVolInfo volume information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+static SINT32 get_volume
+(
+ struct MCDRV_VOL_INFO *psVolInfo
+)
+{
+ if (NULL == psVolInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != McResCtrl_GetState())
+ return MCDRV_ERROR_STATE;
+
+ McResCtrl_GetVolInfo(psVolInfo);
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * set_volume
+ *
+ * Description:
+ * Set volume.
+ * Arguments:
+ * psVolInfo volume update information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ *
+ ****************************************************************************/
+static SINT32 set_volume
+(
+ const struct MCDRV_VOL_INFO *psVolInfo
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+ struct MCDRV_PATH_INFO sPathInfo;
+
+ if (NULL == psVolInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ McResCtrl_SetVolInfo(psVolInfo);
+
+ McResCtrl_GetPathInfoVirtual(&sPathInfo);
+ return set_path(&sPathInfo);
+}
+
+/****************************************************************************
+ * get_digitalio
+ *
+ * Description:
+ * Get current digital IO setting.
+ * Arguments:
+ * psDioInfo digital IO information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 get_digitalio
+(
+ struct MCDRV_DIO_INFO *psDioInfo
+)
+{
+ if (NULL == psDioInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != McResCtrl_GetState())
+ return MCDRV_ERROR_STATE;
+
+ McResCtrl_GetDioInfo(psDioInfo);
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * set_digitalio
+ *
+ * Description:
+ * Update digital IO configuration.
+ * Arguments:
+ * psDioInfo digital IO configuration
+ * dUpdateInfo update information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 set_digitalio
+(
+ const struct MCDRV_DIO_INFO *psDioInfo,
+ UINT32 dUpdateInfo
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+
+ if (NULL == psDioInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (IsValidDioParam(psDioInfo, dUpdateInfo) == 0)
+ return MCDRV_ERROR_ARGUMENT;
+
+ McResCtrl_SetDioInfo(psDioInfo, dUpdateInfo);
+
+ McPacket_AddDigitalIO(dUpdateInfo);
+ return McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * get_digitalio_path
+ *
+ * Description:
+ * Get current digital IO path setting.
+ * Arguments:
+ * psDioInfoPath digital IO path information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 get_digitalio_path
+(
+ struct MCDRV_DIOPATH_INFO *psDioPathInfo
+)
+{
+ if (NULL == psDioPathInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != McResCtrl_GetState())
+ return MCDRV_ERROR_STATE;
+
+ McResCtrl_GetDioPathInfo(psDioPathInfo);
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * set_digitalio_path
+ *
+ * Description:
+ * Update digital IO path configuration.
+ * Arguments:
+ * psDioInfoPath digital IO path configuration
+ * dUpdateInfo update information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 set_digitalio_path
+(
+ const struct MCDRV_DIOPATH_INFO *psDioPathInfo,
+ UINT32 dUpdateInfo
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+
+ if (NULL == psDioPathInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (IsValidDioPathParam(psDioPathInfo, dUpdateInfo) == 0)
+ return MCDRV_ERROR_ARGUMENT;
+
+ McResCtrl_SetDioPathInfo(psDioPathInfo, dUpdateInfo);
+
+ McPacket_AddDigitalIOPath();
+ return McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * get_swap
+ *
+ * Description:
+ * Get Swap setting.
+ * Arguments:
+ * psSwapInfo pointer to MCDRV_SWAP_INFO struct
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ * MCDRV_ERROR_ARGUMENT
+*
+ ****************************************************************************/
+static SINT32 get_swap
+(
+ struct MCDRV_SWAP_INFO *psSwapInfo
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (NULL == psSwapInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ McResCtrl_GetSwap(psSwapInfo);
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * set_swap
+ *
+ * Description:
+ * Set Swap setting.
+ * Arguments:
+ * psSwapInfo pointer to MCDRV_SWAP_INFO struct
+ * dUpdateInfo update information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ * MCDRV_ERROR_ARGUMENT
+*
+ ****************************************************************************/
+static SINT32 set_swap
+(
+ const struct MCDRV_SWAP_INFO *psSwapInfo,
+ UINT32 dUpdateInfo
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (NULL == psSwapInfo)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (IsValidSwapParam(psSwapInfo, dUpdateInfo) == 0)
+ return MCDRV_ERROR_ARGUMENT;
+
+ McResCtrl_SetSwap(psSwapInfo, dUpdateInfo);
+ McPacket_AddSwap(dUpdateInfo);
+ return McDevIf_ExecutePacket();
+}
+
+
+/****************************************************************************
+ * IsPathAllOff
+ *
+ * Description:
+ * Is Path All Off.
+ * Arguments:
+ * none
+ * Return:
+ * 0:not All Off, 1:All Off
+ *
+ ****************************************************************************/
+static UINT8 IsPathAllOff
+(
+ void
+)
+{
+ UINT8 bRet = 1;
+ struct MCDRV_PATH_INFO sCurPathInfo;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("IsPathAllOff");
+#endif
+ McResCtrl_GetPathInfoVirtual(&sCurPathInfo);
+ if ((sCurPathInfo.asMusicOut[0].dSrcOnOff
+ != gsPathInfoAllOff.asMusicOut[0].dSrcOnOff)
+ || (sCurPathInfo.asMusicOut[1].dSrcOnOff
+ != gsPathInfoAllOff.asMusicOut[1].dSrcOnOff)
+ || (sCurPathInfo.asExtOut[0].dSrcOnOff
+ != gsPathInfoAllOff.asExtOut[0].dSrcOnOff)
+ || (sCurPathInfo.asExtOut[1].dSrcOnOff
+ != gsPathInfoAllOff.asExtOut[1].dSrcOnOff)
+ || (sCurPathInfo.asHifiOut[0].dSrcOnOff
+ != gsPathInfoAllOff.asHifiOut[0].dSrcOnOff)
+ || (sCurPathInfo.asVboxMixIn[0].dSrcOnOff
+ != gsPathInfoAllOff.asVboxMixIn[0].dSrcOnOff)
+ || (sCurPathInfo.asVboxMixIn[1].dSrcOnOff
+ != gsPathInfoAllOff.asVboxMixIn[1].dSrcOnOff)
+ || (sCurPathInfo.asVboxMixIn[2].dSrcOnOff
+ != gsPathInfoAllOff.asVboxMixIn[2].dSrcOnOff)
+ || (sCurPathInfo.asVboxMixIn[3].dSrcOnOff
+ != gsPathInfoAllOff.asVboxMixIn[3].dSrcOnOff)
+ || (sCurPathInfo.asAe0[0].dSrcOnOff
+ != gsPathInfoAllOff.asAe0[0].dSrcOnOff)
+ || (sCurPathInfo.asAe0[1].dSrcOnOff
+ != gsPathInfoAllOff.asAe0[1].dSrcOnOff)
+ || (sCurPathInfo.asAe1[0].dSrcOnOff
+ != gsPathInfoAllOff.asAe1[0].dSrcOnOff)
+ || (sCurPathInfo.asAe1[1].dSrcOnOff
+ != gsPathInfoAllOff.asAe1[1].dSrcOnOff)
+ || (sCurPathInfo.asAe2[0].dSrcOnOff
+ != gsPathInfoAllOff.asAe2[0].dSrcOnOff)
+ || (sCurPathInfo.asAe2[1].dSrcOnOff
+ != gsPathInfoAllOff.asAe2[1].dSrcOnOff)
+ || (sCurPathInfo.asAe3[0].dSrcOnOff
+ != gsPathInfoAllOff.asAe3[0].dSrcOnOff)
+ || (sCurPathInfo.asAe3[1].dSrcOnOff
+ != gsPathInfoAllOff.asAe3[1].dSrcOnOff)
+ || (sCurPathInfo.asDac0[0].dSrcOnOff
+ != gsPathInfoAllOff.asDac0[0].dSrcOnOff)
+ || (sCurPathInfo.asDac0[1].dSrcOnOff
+ != gsPathInfoAllOff.asDac0[1].dSrcOnOff)
+ || (sCurPathInfo.asDac1[0].dSrcOnOff
+ != gsPathInfoAllOff.asDac1[0].dSrcOnOff)
+ || (sCurPathInfo.asDac1[1].dSrcOnOff
+ != gsPathInfoAllOff.asDac1[1].dSrcOnOff)
+ || (sCurPathInfo.asVoiceOut[0].dSrcOnOff
+ != gsPathInfoAllOff.asVoiceOut[0].dSrcOnOff)
+ || (sCurPathInfo.asVboxIoIn[0].dSrcOnOff
+ != gsPathInfoAllOff.asVboxIoIn[0].dSrcOnOff)
+ || (sCurPathInfo.asVboxHostIn[0].dSrcOnOff
+ != gsPathInfoAllOff.asVboxHostIn[0].dSrcOnOff)
+ || (sCurPathInfo.asHostOut[0].dSrcOnOff
+ != gsPathInfoAllOff.asHostOut[0].dSrcOnOff)
+ || (sCurPathInfo.asAdif0[0].dSrcOnOff
+ != gsPathInfoAllOff.asAdif0[0].dSrcOnOff)
+ || (sCurPathInfo.asAdif0[1].dSrcOnOff
+ != gsPathInfoAllOff.asAdif0[1].dSrcOnOff)
+ || (sCurPathInfo.asAdif1[0].dSrcOnOff
+ != gsPathInfoAllOff.asAdif1[0].dSrcOnOff)
+ || (sCurPathInfo.asAdif1[1].dSrcOnOff
+ != gsPathInfoAllOff.asAdif1[1].dSrcOnOff)
+ || (sCurPathInfo.asAdif2[0].dSrcOnOff
+ != gsPathInfoAllOff.asAdif2[0].dSrcOnOff)
+ || (sCurPathInfo.asAdif2[1].dSrcOnOff
+ != gsPathInfoAllOff.asAdif2[1].dSrcOnOff)
+ || (sCurPathInfo.asAdc0[0].dSrcOnOff
+ != gsPathInfoAllOff.asAdc0[0].dSrcOnOff)
+ || (sCurPathInfo.asAdc0[1].dSrcOnOff
+ != gsPathInfoAllOff.asAdc0[1].dSrcOnOff)
+ || (sCurPathInfo.asAdc1[0].dSrcOnOff
+ != gsPathInfoAllOff.asAdc1[0].dSrcOnOff)
+ || (sCurPathInfo.asSp[0].dSrcOnOff
+ != gsPathInfoAllOff.asSp[0].dSrcOnOff)
+ || (sCurPathInfo.asSp[1].dSrcOnOff
+ != gsPathInfoAllOff.asSp[1].dSrcOnOff)
+ || (sCurPathInfo.asHp[0].dSrcOnOff
+ != gsPathInfoAllOff.asHp[0].dSrcOnOff)
+ || (sCurPathInfo.asHp[1].dSrcOnOff
+ != gsPathInfoAllOff.asHp[1].dSrcOnOff)
+ || (sCurPathInfo.asRc[0].dSrcOnOff
+ != gsPathInfoAllOff.asRc[0].dSrcOnOff)
+ || (sCurPathInfo.asLout1[0].dSrcOnOff
+ != gsPathInfoAllOff.asLout1[0].dSrcOnOff)
+ || (sCurPathInfo.asLout1[1].dSrcOnOff
+ != gsPathInfoAllOff.asLout1[1].dSrcOnOff)
+ || (sCurPathInfo.asLout2[0].dSrcOnOff
+ != gsPathInfoAllOff.asLout2[0].dSrcOnOff)
+ || (sCurPathInfo.asLout2[1].dSrcOnOff
+ != gsPathInfoAllOff.asLout2[1].dSrcOnOff)
+ || (sCurPathInfo.asBias[0].dSrcOnOff
+ != gsPathInfoAllOff.asBias[0].dSrcOnOff)
+ || (sCurPathInfo.asBias[1].dSrcOnOff
+ != gsPathInfoAllOff.asBias[1].dSrcOnOff)
+ || (sCurPathInfo.asBias[2].dSrcOnOff
+ != gsPathInfoAllOff.asBias[2].dSrcOnOff)
+ || (sCurPathInfo.asBias[3].dSrcOnOff
+ != gsPathInfoAllOff.asBias[3].dSrcOnOff)
+ )
+ bRet = 0;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsPathAllOff", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * set_dsp
+ *
+ * Description:
+ * Set DSP parameter.
+ * Arguments:
+ * pbPrm pointer to AEC parameter
+ * dSize data byte size.
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ * MCDRV_ERROR_ARGUMENT
+*
+ ****************************************************************************/
+static SINT32 set_dsp
+(
+ const UINT8 *pbPrm,
+ UINT32 dSize
+)
+{
+ SINT32 sdRet = MCDRV_SUCCESS;
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+ struct MCDRV_AEC_D7_INFO sD7Info;
+ struct MCDRV_AEC_INFO sAECInfo, sCurAECInfo;
+ struct MCDRV_POWER_INFO sPowerInfo;
+ struct MCDRV_POWER_UPDATE sPowerUpdate;
+ static struct MCDRV_PATH_INFO sPathInfo;
+ static UINT8 bLP2_START, bSRC3_START;
+ UINT32 dSVolDoneParam = 0;
+ UINT32 dMuteFlg;
+ UINT8 bReg;
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (NULL == pbPrm)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (dSize == 0)
+ return MCDRV_SUCCESS;
+
+ McResCtrl_GetAecInfo(&sAECInfo);
+ sCurAECInfo = sAECInfo;
+
+ sdRet = McParser_GetD7Chunk(pbPrm, dSize, &sD7Info);
+ if (sdRet < MCDRV_SUCCESS)
+ return sdRet;
+
+ sdRet = McParser_AnalyzeD7Chunk(&sD7Info, &sAECInfo);
+ if (sdRet < MCDRV_SUCCESS)
+ return sdRet;
+
+ if (IsValidDspParam(&sAECInfo) == 0) {
+ sdRet = MCDRV_ERROR_ARGUMENT;
+ return sdRet;
+ }
+
+ McResCtrl_SetAecInfo(&sAECInfo);
+ McResCtrl_GetAecInfo(&sAECInfo);
+
+ sAECInfo.sAecVBox.bCDspFuncAOnOff &= 0x01;
+ sAECInfo.sAecVBox.bCDspFuncBOnOff &= 0x01;
+ if (sAECInfo.sControl.bCommand == 1) {
+ if (sAECInfo.sControl.bParam[0] == 0) {
+ if (IsPathAllOff() == 0) {
+ McResCtrl_GetPathInfoVirtual(&sPathInfo);
+ sdRet = set_path(&gsPathInfoAllOff);
+ if (sdRet != MCDRV_SUCCESS) {
+ ;
+ goto exit;
+ }
+ }
+ }
+ } else if (sAECInfo.sControl.bCommand == 2) {
+ if (sAECInfo.sControl.bParam[0] == 0) {
+ bLP2_START =
+ McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MB,
+ MCI_LP2_START);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_MB
+ | (UINT32)MCI_LP2_START,
+ 0);
+ bSRC3_START =
+ McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MB,
+ MCI_SRC3_START);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_MB
+ | (UINT32)MCI_SRC3_START,
+ 0);
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ }
+ } else if (sAECInfo.sControl.bCommand == 3) {
+ if (McDevProf_GetDevId() != eMCDRV_DEV_ID_80_90H) {
+ McPacket_AddDOutMute();
+ dMuteFlg = MCB_DIFO3_VFLAG1
+ | MCB_DIFO3_VFLAG0
+ | MCB_DIFO2_VFLAG1
+ | MCB_DIFO2_VFLAG0
+ | MCB_DIFO1_VFLAG1
+ | MCB_DIFO1_VFLAG0
+ | MCB_DIFO0_VFLAG1
+ | MCB_DIFO0_VFLAG0;
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_DITMUTE
+ | dMuteFlg,
+ 0);
+ dMuteFlg = MCB_DAO1_VFLAG1
+ | MCB_DAO1_VFLAG0
+ | MCB_DAO0_VFLAG1
+ | MCB_DAO0_VFLAG0;
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_DACMUTE
+ | dMuteFlg,
+ 0);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_MA
+ | (UINT32)MCI_CLK_SEL,
+ sAECInfo.sControl.bParam[0]);
+ McResCtrl_SetClkSel(sAECInfo.sControl.bParam[0]);
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ sdRet = SetVol(MCDRV_VOLUPDATE_DOUT,
+ eMCDRV_VOLUPDATE_ALL,
+ NULL);
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ }
+ } else if (sAECInfo.sControl.bCommand == 4) {
+ if (McDevProf_GetDevId() != eMCDRV_DEV_ID_80_90H) {
+ McPacket_AddDac0Mute();
+ McPacket_AddDac1Mute();
+ McPacket_AddAdifMute();
+ McPacket_AddDPathDAMute();
+ dMuteFlg = MCB_ADI2_VFLAG1
+ | MCB_ADI2_VFLAG0
+ | MCB_ADI1_VFLAG1
+ | MCB_ADI1_VFLAG0
+ | MCB_ADI0_VFLAG1
+ | MCB_ADI0_VFLAG0;
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_ADCMUTE
+ | dMuteFlg,
+ 0);
+ dMuteFlg = MCB_SPR_BUSY<<8
+ | MCB_SPL_BUSY<<8
+ | MCB_HPR_BUSY<<8
+ | MCB_HPL_BUSY<<8
+ | MCB_LO2R_BUSY
+ | MCB_LO2L_BUSY
+ | MCB_LO1R_BUSY
+ | MCB_LO1L_BUSY
+ | MCB_RC_BUSY;
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_EVTWAIT
+ | MCDRV_EVT_SVOL_DONE
+ | dMuteFlg,
+ 0);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | (UINT32)MCI_ECLK_SEL,
+ sAECInfo.sControl.bParam[0]);
+ McResCtrl_SetEClkSel(sAECInfo.sControl.bParam[0]);
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ sdRet = SetVol(MCDRV_VOLUPDATE_ANA_OUT
+ | MCDRV_VOLUPDATE_ADIF0
+ | MCDRV_VOLUPDATE_ADIF1
+ | MCDRV_VOLUPDATE_ADIF2
+ | MCDRV_VOLUPDATE_DPATHDA,
+ eMCDRV_VOLUPDATE_ALL,
+ &dSVolDoneParam);
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ }
+ } else if (sAECInfo.sControl.bCommand == 5) {
+ bReg = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_A,
+ MCI_FREQ73M);
+ if ((sAECInfo.sControl.bParam[0] != 0xFF)) {
+ bReg &= 0xF8;
+ bReg |= sAECInfo.sControl.bParam[0];
+ McResCtrl_SetCClkSel(sAECInfo.sControl.bParam[0]);
+ }
+ if ((sAECInfo.sControl.bParam[1] != 0xFF)) {
+ bReg &= 0x3F;
+ bReg |= (sAECInfo.sControl.bParam[1]<<6);
+ McResCtrl_SetFClkSel(sAECInfo.sControl.bParam[1]);
+ }
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_A
+ | (UINT32)MCI_FREQ73M,
+ bReg);
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ }
+
+ sdRet = McBdsp_SetDSPCheck(&sAECInfo);
+ if (sdRet < MCDRV_SUCCESS)
+ goto exit;
+ sdRet = McCdsp_SetDSPCheck(&sAECInfo);
+ if (sdRet < MCDRV_SUCCESS)
+ goto exit;
+ sdRet = McEdsp_SetDSPCheck(&sAECInfo);
+ if (sdRet < MCDRV_SUCCESS)
+ goto exit;
+ sdRet = McFdsp_SetDSPCheck(&sAECInfo);
+ if (sdRet < MCDRV_SUCCESS)
+ goto exit;
+
+ McResCtrl_GetPowerInfo(&sPowerInfo);
+ sPowerUpdate.bDigital = MCDRV_POWUPDATE_D_ALL;
+ sPowerUpdate.abAnalog[0] = (UINT8)MCDRV_POWUPDATE_AP;
+ sPowerUpdate.abAnalog[1] = (UINT8)MCDRV_POWUPDATE_AP_OUT0;
+ sPowerUpdate.abAnalog[2] = (UINT8)MCDRV_POWUPDATE_AP_OUT1;
+ sPowerUpdate.abAnalog[3] = (UINT8)MCDRV_POWUPDATE_AP_MC;
+ sPowerUpdate.abAnalog[4] = (UINT8)MCDRV_POWUPDATE_AP_IN;
+ sdRet = McPacket_AddPowerUp(&sPowerInfo, &sPowerUpdate);
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+
+ McPacket_AddAEC();
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+
+ sdRet = McBdsp_SetDSP(&sAECInfo);
+ if (sdRet < MCDRV_SUCCESS)
+ goto exit;
+ sdRet = McCdsp_SetDSP(&sAECInfo);
+ if (sdRet < MCDRV_SUCCESS)
+ goto exit;
+ sdRet = McEdsp_SetDSP(&sAECInfo);
+ if (sdRet < MCDRV_SUCCESS)
+ goto exit;
+ sdRet = McFdsp_SetDSP(&sAECInfo);
+ if (sdRet < MCDRV_SUCCESS)
+ goto exit;
+
+ if (sAECInfo.sControl.bCommand == 1) {
+ if (sAECInfo.sControl.bParam[0] == 1) {
+ sdRet = set_path(&sPathInfo);
+ sPathInfo = gsPathInfoAllZero;
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ }
+ } else if (sAECInfo.sControl.bCommand == 2) {
+ if (sAECInfo.sControl.bParam[0] == 1) {
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_MB
+ | (UINT32)MCI_LP2_START,
+ bLP2_START);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_MB
+ | (UINT32)MCI_SRC3_START,
+ bSRC3_START);
+ }
+ }
+
+ McResCtrl_GetPowerInfo(&sPowerInfo);
+ sdRet = McPacket_AddPowerDown(&sPowerInfo, &sPowerUpdate);
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet == MCDRV_SUCCESS)
+ return sdRet;
+
+exit:
+ McResCtrl_ReplaceAecInfo(&sCurAECInfo);
+ SavePower();
+ return sdRet;
+}
+
+/****************************************************************************
+ * get_dsp
+ *
+ * Description:
+ * Get DSP parameter.
+ * Arguments:
+ * psDspParam pointer to parameter
+ * pvData pointer to read data buffer
+ * dSize data buffer size
+ * Return:
+ * 0<= Get data size
+ * MCDRV_ERROR_STATE
+ * MCDRV_ERROR_ARGUMENT
+*
+ ****************************************************************************/
+static SINT32 get_dsp
+(
+ struct MCDRV_DSP_PARAM *psDspParam,
+ void *pvData,
+ UINT32 dSize
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (NULL == psDspParam)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (NULL == pvData)
+ return MCDRV_ERROR_ARGUMENT;
+
+ switch (psDspParam->dType) {
+ case MCDRV_DSP_PARAM_CDSP_INPOS:
+ return McCdsp_GetDSP(CDSP_INPOS, pvData, dSize);
+ case MCDRV_DSP_PARAM_CDSP_OUTPOS:
+ return McCdsp_GetDSP(CDSP_OUTPOS, pvData, dSize);
+ case MCDRV_DSP_PARAM_CDSP_DFIFO_REMAIN:
+ return McCdsp_GetDSP(CDSP_DFIFO_REMAIN, pvData, dSize);
+ case MCDRV_DSP_PARAM_CDSP_RFIFO_REMAIN:
+ return McCdsp_GetDSP(CDSP_RFIFO_REMAIN, pvData, dSize);
+ case MCDRV_DSP_PARAM_FDSP_DXRAM:
+ return McFdsp_GetDSP(FDSP_AE_FW_DXRAM, psDspParam->dInfo,
+ (UINT8 *)pvData, dSize);
+ case MCDRV_DSP_PARAM_FDSP_DYRAM:
+ return McFdsp_GetDSP(FDSP_AE_FW_DYRAM, psDspParam->dInfo,
+ (UINT8 *)pvData, dSize);
+ case MCDRV_DSP_PARAM_FDSP_IRAM:
+ return McFdsp_GetDSP(FDSP_AE_FW_IRAM, psDspParam->dInfo,
+ (UINT8 *)pvData, dSize);
+ case MCDRV_DSP_PARAM_EDSP_E2RES:
+ return McEdsp_GetDSP((UINT8 *)pvData);
+ default:
+ return MCDRV_ERROR_ARGUMENT;
+ }
+}
+
+/****************************************************************************
+ * get_dsp_data
+ *
+ * Description:
+ * Get DSP data.
+ * Arguments:
+ * pbData pointer to data
+ * dSize data byte size
+ * Return:
+ * 0<= size of got data
+ * MCDRV_ERROR_STATE
+ * MCDRV_ERROR_ARGUMENT
+*
+ ****************************************************************************/
+static SINT32 get_dsp_data
+(
+ UINT8 *pbData,
+ UINT32 dSize
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (NULL == pbData)
+ return MCDRV_ERROR_ARGUMENT;
+
+ return McCdsp_ReadData(pbData, dSize);
+}
+
+/****************************************************************************
+ * set_dsp_data
+ *
+ * Description:
+ * Write data to DSP.
+ * Arguments:
+ * pbData pointer to data
+ * dSize data byte size
+ * Return:
+ * 0<= size of write data
+ * MCDRV_ERROR_STATE
+ * MCDRV_ERROR_ARGUMENT
+*
+ ****************************************************************************/
+static SINT32 set_dsp_data
+(
+ const UINT8 *pbData,
+ UINT32 dSize
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (NULL == pbData)
+ return MCDRV_ERROR_ARGUMENT;
+
+ return McCdsp_WriteData(pbData, dSize);
+}
+
+/****************************************************************************
+ * register_dsp_cb
+ *
+ * Description:
+ * Callback function setting
+ * Arguments:
+ * pcbfunc Pointer to Callback function
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 register_dsp_cb
+(
+ SINT32 (*pcbfunc)(SINT32, UINT32, UINT32)
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ McResCtrl_SetDSPCBFunc(pcbfunc);
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * get_dsp_transition
+ *
+ * Description:
+ * It judges while processing the DSP control
+ * Arguments:
+ * dDspType DSP type
+ * Return:
+ * 0 has processed
+ * 1<= processing
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 get_dsp_transition
+(
+ UINT32 dDspType
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (dDspType == MCDRV_DSPTYPE_FDSP) {
+ ;
+ return McFdsp_GetTransition();
+ } else if (dDspType == MCDRV_DSPTYPE_BDSP) {
+ return McBdsp_GetTransition();
+ }
+
+ return MCDRV_ERROR_ARGUMENT;
+}
+
+/****************************************************************************
+ * get_hsdet
+ *
+ * Description:
+ * Get Headset Det.
+ * Arguments:
+ * psHSDet pointer to MCDRV_HSDET_INFO struct
+ * psHSDet pointer to MCDRV_HSDET2_INFO struct
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ * MCDRV_ERROR_ARGUMENT
+*
+ ****************************************************************************/
+static SINT32 get_hsdet
+(
+ struct MCDRV_HSDET_INFO *psHSDet,
+ struct MCDRV_HSDET2_INFO *psHSDet2
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (NULL == psHSDet)
+ return MCDRV_ERROR_ARGUMENT;
+
+ McResCtrl_GetHSDet(psHSDet, psHSDet2);
+ psHSDet->bDlyIrqStop = 0;
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * set_hsdet
+ *
+ * Description:
+ * Set Headset Det.
+ * Arguments:
+ * psHSDet pointer to MCDRV_HSDET_INFO struct
+ * psHSDet pointer to MCDRV_HSDET2_INFO struct
+ * dUpdateInfo update information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ * MCDRV_ERROR_ARGUMENT
+*
+ ****************************************************************************/
+static SINT32 set_hsdet
+(
+ const struct MCDRV_HSDET_INFO *psHSDet,
+ const struct MCDRV_HSDET2_INFO *psHSDet2,
+ UINT32 dUpdateInfo
+)
+{
+ SINT32 sdRet = MCDRV_SUCCESS;
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+ struct MCDRV_HSDET_INFO sHSDetInfo;
+ UINT8 bReg;
+ struct MCDRV_PATH_INFO sCurPathInfo, sTmpPathInfo;
+ struct MCDRV_HSDET_RES sHSDetRes;
+ UINT8 bSlaveAddrA;
+ UINT8 abData[2];
+ UINT8 bPlugDetDB;
+ struct MCDRV_HSDET_INFO sHSDet;
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (NULL == psHSDet)
+ return MCDRV_ERROR_ARGUMENT;
+
+ sHSDet = *psHSDet;
+ if (IsValidHSDetParam(&sHSDet, psHSDet2, dUpdateInfo) == 0) {
+ ;
+ return MCDRV_ERROR_ARGUMENT;
+ }
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ ;
+ sHSDet.bDetInInv &= 1;
+ }
+
+ McResCtrl_SetHSDet(&sHSDet, psHSDet2, dUpdateInfo);
+ McPacket_AddHSDet();
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+
+ McResCtrl_GetHSDet(&sHSDetInfo, NULL);
+ if ((sHSDetInfo.bEnPlugDetDb != MCDRV_PLUGDETDB_DISABLE)
+ || (sHSDetInfo.bEnDlyKeyOff != MCDRV_KEYEN_D_D_D)
+ || (sHSDetInfo.bEnDlyKeyOn != MCDRV_KEYEN_D_D_D)
+ || (sHSDetInfo.bEnMicDet != MCDRV_MICDET_DISABLE)
+ || (sHSDetInfo.bEnKeyOff != MCDRV_KEYEN_D_D_D)
+ || (sHSDetInfo.bEnKeyOn != MCDRV_KEYEN_D_D_D)) {
+ bPlugDetDB = McResCtrl_GetPlugDetDB();
+ bReg = McResCtrl_GetRegVal(
+ MCDRV_PACKET_REGTYPE_CD,
+ MCI_HSDETEN);
+ if ((bReg&MCB_MKDETEN) == 0) {
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_CD
+ | (UINT32)MCI_HSDETEN,
+ (UINT8)(MCB_HSDETEN | sHSDetInfo.bHsDetDbnc));
+
+ if (((bPlugDetDB&MCB_RPLUGDET_DB) != 0)
+ && ((sHSDetInfo.bEnDlyKeyOff != MCDRV_KEYEN_D_D_D)
+ || (sHSDetInfo.bEnDlyKeyOn != MCDRV_KEYEN_D_D_D)
+ || (sHSDetInfo.bEnMicDet != MCDRV_MICDET_DISABLE)
+ || (sHSDetInfo.bEnKeyOff != MCDRV_KEYEN_D_D_D)
+ || (sHSDetInfo.bEnKeyOn != MCDRV_KEYEN_D_D_D))) {
+ if (IsLDOAOn() != 0) {
+ McResCtrl_GetPathInfoVirtual(
+ &sCurPathInfo);
+ sTmpPathInfo = sCurPathInfo;
+ sTmpPathInfo.asAdc0[0].dSrcOnOff
+ = 0x00AAAAAA;
+ sTmpPathInfo.asAdc0[1].dSrcOnOff
+ = 0x00AAAAAA;
+
+ sTmpPathInfo.asAdc1[0].dSrcOnOff
+ = 0x00AAAAAA;
+
+ sTmpPathInfo.asSp[0].dSrcOnOff
+ = 0x002AAAAA;
+ sTmpPathInfo.asSp[1].dSrcOnOff
+ = 0x002AAAAA;
+ sTmpPathInfo.asHp[0].dSrcOnOff
+ = 0x002AAAAA;
+ sTmpPathInfo.asHp[1].dSrcOnOff
+ = 0x002AAAAA;
+ sTmpPathInfo.asRc[0].dSrcOnOff
+ = 0x002AAAAA;
+ sTmpPathInfo.asLout1[0].dSrcOnOff
+ = 0x002AAAAA;
+ sTmpPathInfo.asLout1[1].dSrcOnOff
+ = 0x002AAAAA;
+ sTmpPathInfo.asLout2[0].dSrcOnOff
+ = 0x002AAAAA;
+ sTmpPathInfo.asLout2[1].dSrcOnOff
+ = 0x002AAAAA;
+
+ sTmpPathInfo.asBias[0].dSrcOnOff
+ = 0x002AAAAA;
+ sTmpPathInfo.asBias[1].dSrcOnOff
+ = 0x002AAAAA;
+ sTmpPathInfo.asBias[2].dSrcOnOff
+ = 0x002AAAAA;
+ sTmpPathInfo.asBias[3].dSrcOnOff
+ = 0x002AAAAA;
+ sdRet = set_path(&sTmpPathInfo);
+ if (sdRet != MCDRV_SUCCESS)
+ return sdRet;
+ McPacket_AddMKDetEnable(1);
+ sdRet = set_path(&sCurPathInfo);
+ } else {
+ McPacket_AddMKDetEnable(1);
+ }
+ }
+ } else {
+ bReg = (UINT8)(MCB_HSDETEN | sHSDetInfo.bHsDetDbnc);
+ if ((sHSDetInfo.bEnDlyKeyOff != MCDRV_KEYEN_D_D_D)
+ || (sHSDetInfo.bEnDlyKeyOn != MCDRV_KEYEN_D_D_D)
+ || (sHSDetInfo.bEnMicDet != MCDRV_MICDET_DISABLE)
+ || (sHSDetInfo.bEnKeyOff != MCDRV_KEYEN_D_D_D)
+ || (sHSDetInfo.bEnKeyOn != MCDRV_KEYEN_D_D_D)) {
+ if ((bPlugDetDB&MCB_RPLUGDET_DB) != 0) {
+ ;
+ bReg |= MCB_MKDETEN;
+ }
+ }
+
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_CD
+ | (UINT32)MCI_HSDETEN,
+ bReg);
+
+ if ((bReg&MCB_MKDETEN) == 0) {
+ bReg =
+ McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA,
+ MCI_KDSET);
+ bReg &= (UINT8)~(MCB_KDSET2|MCB_KDSET1);
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)MCI_KDSET,
+ bReg);
+ }
+ }
+ }
+ if (sdRet == MCDRV_SUCCESS)
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet == MCDRV_SUCCESS) {
+ if (((dUpdateInfo & MCDRV_ENPLUGDETDB_UPDATE_FLAG) != 0)
+ && ((sHSDetInfo.bEnPlugDetDb & MCDRV_PLUGDETDB_UNDET_ENABLE)
+ != 0)
+ && (sHSDetInfo.cbfunc != 0)) {
+ bSlaveAddrA =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_ANA);
+#if 0
+ McSrv_Sleep(sHSDetInfo.bHsDetDbnc*1000);
+ abData[0] = MCI_CD_REG_A<<1;
+ abData[1] = MCI_PLUGDET_DB;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ if ((bReg & MCB_PLUGUNDET_DB) != 0) {
+#else
+ abData[0] = MCI_CD_REG_A<<1;
+ abData[1] = MCI_PLUGDET;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ if ((bReg & MCB_PLUGDET) == 0) {
+#endif
+ McSrv_Unlock();
+ sHSDetRes.bKeyCnt0 = 0;
+ sHSDetRes.bKeyCnt1 = 0;
+ sHSDetRes.bKeyCnt2 = 0;
+ (*sHSDetInfo.cbfunc)(
+ MCDRV_HSDET_EVT_PLUGUNDET_DB_FLAG,
+ &sHSDetRes);
+ McSrv_Lock();
+ }
+ }
+ sdRet = SavePower();
+ }
+ return sdRet;
+}
+
+/****************************************************************************
+ * config_gp
+ *
+ * Description:
+ * Set GPIO mode.
+ * Arguments:
+ * psGpMode GPIO mode information
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ * MCDRV_ERROR_STATE
+*
+ ****************************************************************************/
+static SINT32 config_gp
+(
+ const struct MCDRV_GP_MODE *psGpMode
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+
+ if (NULL == psGpMode)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (IsValidGpParam(psGpMode) == 0)
+ return MCDRV_ERROR_ARGUMENT;
+
+ McResCtrl_SetGPMode(psGpMode);
+
+ McPacket_AddGPMode();
+ return McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * mask_gp
+ *
+ * Description:
+ * Set GPIO input mask.
+ * Arguments:
+ * pbMask mask setting
+ * dPadNo PAD number
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ * MCDRV_ERROR_STATE
+ * MCDRV_ERROR
+*
+ ****************************************************************************/
+static SINT32 mask_gp
+(
+ UINT8 *pbMask,
+ UINT32 dPadNo
+)
+{
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+ struct MCDRV_INIT_INFO sInitInfo;
+
+ if (NULL == pbMask)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ if (IsValidMaskGp(*pbMask, dPadNo) == 0)
+ return MCDRV_ERROR_ARGUMENT;
+
+ McResCtrl_GetInitInfo(&sInitInfo, NULL);
+ if (((dPadNo == 0) && (sInitInfo.bPa0Func != MCDRV_PA_GPIO))
+ || ((dPadNo == 1) && (sInitInfo.bPa1Func != MCDRV_PA_GPIO))
+ || ((dPadNo == 2) && (sInitInfo.bPa2Func != MCDRV_PA_GPIO)))
+ return MCDRV_SUCCESS;
+
+ McResCtrl_SetGPMask(*pbMask, dPadNo);
+
+ McPacket_AddGPMask(dPadNo);
+ return McDevIf_ExecutePacket();
+}
+
+/****************************************************************************
+ * getset_gp
+ *
+ * Description:
+ * Set or get state of GPIO pin.
+ * Arguments:
+ * pbGpio pin state
+ * dPadNo PAD number
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+*
+ ****************************************************************************/
+static SINT32 getset_gp
+(
+ UINT8 *pbGpio,
+ UINT32 dPadNo
+)
+{
+ UINT8 bSlaveAddr;
+ UINT8 abData[2];
+ UINT8 bRegData;
+ enum MCDRV_STATE eState = McResCtrl_GetState();
+ struct MCDRV_INIT_INFO sInitInfo;
+ struct MCDRV_GP_MODE sGPMode;
+
+ if (NULL == pbGpio)
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (eMCDRV_STATE_READY != eState)
+ return MCDRV_ERROR_STATE;
+
+ McResCtrl_GetInitInfo(&sInitInfo, NULL);
+ McResCtrl_GetGPMode(&sGPMode);
+
+ if ((dPadNo != MCDRV_GP_PAD0)
+ && (dPadNo != MCDRV_GP_PAD1)
+ && (dPadNo != MCDRV_GP_PAD2))
+ return MCDRV_ERROR_ARGUMENT;
+
+ if (((dPadNo == MCDRV_GP_PAD0)
+ && (sInitInfo.bPa0Func != MCDRV_PA_GPIO))
+ || ((dPadNo == MCDRV_GP_PAD1)
+ && (sInitInfo.bPa1Func != MCDRV_PA_GPIO))
+ || ((dPadNo == MCDRV_GP_PAD2)
+ && (sInitInfo.bPa2Func != MCDRV_PA_GPIO)))
+ return MCDRV_ERROR;
+
+ if (sGPMode.abGpDdr[dPadNo] == MCDRV_GPDDR_IN) {
+ bSlaveAddr =
+ McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG);
+ abData[0] = MCI_A_REG_A<<1;
+ abData[1] = (UINT8)(MCI_PA0+dPadNo);
+ McSrv_WriteReg(bSlaveAddr, abData, 2);
+ bRegData = McSrv_ReadReg(bSlaveAddr, MCI_A_REG_D);
+ *pbGpio = (UINT8)((bRegData & MCB_PA0_DATA) >> 4);
+ } else {
+ if (sGPMode.abGpHost[dPadNo] != MCDRV_GPHOST_CDSP) {
+ if ((*pbGpio != MCDRV_GP_LOW)
+ && (*pbGpio != MCDRV_GP_HIGH))
+ return MCDRV_ERROR_ARGUMENT;
+
+ McResCtrl_SetGPPad(*pbGpio, dPadNo);
+ McPacket_AddGPSet(dPadNo);
+ return McDevIf_ExecutePacket();
+ }
+ }
+
+ return MCDRV_SUCCESS;
+}
+
+/****************************************************************************
+ * irq_proc
+ *
+ * Description:
+ * Clear interrupt flag.
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+static SINT32 irq_proc
+(
+ void
+)
+{
+ SINT32 sdRet = MCDRV_SUCCESS;
+ UINT8 bEIRQ = 0;
+ UINT8 bSlaveAddrD, bSlaveAddrA;
+ UINT8 bReg, bSPlugDet, bPlugDet;
+ struct MCDRV_HSDET_INFO sHSDetInfo;
+ UINT8 abData[4];
+ UINT32 dFlg_DET = 0;
+ UINT8 bFlg_DLYKEY = 0,
+ bFlg_KEY = 0;
+ struct MCDRV_HSDET_RES sHSDetRes;
+ UINT8 bSENSEFIN;
+ struct MCDRV_AEC_INFO sAecInfo;
+ struct MCDRV_PATH_INFO sCurPathInfo;
+ static UINT8 bOP_DAC;
+ static UINT8 bHpDet;
+ UINT32 dCycles, dInterval, dTimeOut;
+ UINT8 bAP;
+
+ bSlaveAddrD = McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG);
+ bSlaveAddrA = McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_ANA);
+
+ McResCtrl_GetHSDet(&sHSDetInfo, NULL);
+
+ bEIRQ = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_IF, MCI_IRQ);
+ bReg = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_CD, MCI_EIRQSENSE);
+ if ((bReg & MCB_EIRQSENSE) == 0) {
+ McSrv_Lock();
+ bAP = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA, MCI_AP);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PreLDODStart();
+ }
+ } else {/* Sensing */
+ /* Disable */
+ bAP = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA, MCI_AP);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PreLDODStart();
+ }
+ abData[0] = MCI_IRQR<<1;
+ abData[1] = 0;
+ McSrv_WriteReg(bSlaveAddrD, abData, 2);
+
+ abData[0] = MCI_CD_REG_A<<1;
+ abData[1] = MCI_SSENSEFIN;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bSENSEFIN = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ if ((bSENSEFIN&MCB_SSENSEFIN) != 0) {
+ abData[1] = MCI_EIRQSENSE;
+ abData[2] = MCI_CD_REG_D<<1;
+ abData[3] = 0;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+ McResCtrl_SetRegVal(MCDRV_PACKET_REGTYPE_CD,
+ MCI_EIRQSENSE, 0);
+ abData[1] = MCI_SSENSEFIN;
+ abData[3] = bReg;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+ } else {
+ /* Enable */
+ abData[0] = MCI_IRQR<<1;
+ abData[1] = MCB_EIRQR;
+ McSrv_WriteReg(bSlaveAddrD, abData, 2);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+ return MCDRV_SUCCESS;
+ }
+
+ /* PLUGDET, PLUGUNDETDB, PLUGDETDB */
+ abData[0] = MCI_CD_REG_A<<1;
+ abData[1] = MCI_PLUGDET;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ dFlg_DET = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ /* clear */
+ abData[2] = MCI_CD_REG_D<<1;
+ abData[3] = (UINT8)dFlg_DET;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+
+ /* set reference */
+ abData[1] = MCI_PLUGDET_DB;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ McResCtrl_SetPlugDetDB(bReg);
+ abData[1] = MCI_RPLUGDET;
+ abData[3] = ((UINT8)dFlg_DET&MCB_PLUGDET) | bReg;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+ dFlg_DET = abData[3];
+
+ abData[1] = MCI_MICDET;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ bFlg_KEY = bReg &
+ (sHSDetInfo.bEnMicDet == MCDRV_MICDET_ENABLE ?
+ MCB_MICDET : 0);
+ abData[1] = MCI_RMICDET;
+ abData[3] = bReg;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+
+ abData[1] = MCI_SMICDET;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ abData[3] = bReg;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+
+ sHSDetRes.bKeyCnt0 = 0;
+ sHSDetRes.bKeyCnt1 = 0;
+ sHSDetRes.bKeyCnt2 = 0;
+
+ abData[0] = MCI_E_REG_A<<1;
+ abData[1] = MCI_PLUG_REV;
+ McSrv_WriteReg(bSlaveAddrD, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrD, MCI_E_REG_D);
+ sHSDetRes.bPlugRev = bReg>>7;
+ sHSDetRes.bHpImpClass = bReg&0x07;
+ abData[1] = MCI_HPIMP_15_8;
+ McSrv_WriteReg(bSlaveAddrD, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrD, MCI_E_REG_D);
+ sHSDetRes.wHpImp = bReg<<8;
+ abData[1] = MCI_HPIMP_7_0;
+ McSrv_WriteReg(bSlaveAddrD, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrD, MCI_E_REG_D);
+ sHSDetRes.wHpImp |= bReg;
+
+ bReg = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_E,
+ MCI_LPF_THR);
+ bReg &= (MCB_OSF1_MN|MCB_OSF0_MN|MCB_OSF1_ENB|MCB_OSF0_ENB);
+ McResCtrl_GetAecInfo(&sAecInfo);
+ bReg |= (UINT8)(sAecInfo.sOutput.bLpf_Post_Thru[1]<<7);
+ bReg |= (UINT8)(sAecInfo.sOutput.bLpf_Post_Thru[0]<<6);
+ bReg |= (UINT8)(sAecInfo.sOutput.bLpf_Pre_Thru[1]<<5);
+ bReg |= (UINT8)(sAecInfo.sOutput.bLpf_Pre_Thru[0]<<4);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | (UINT32)MCI_LPF_THR,
+ bReg);
+ bReg = (UINT8)(sAecInfo.sOutput.bDcl_OnOff[1]<<7)
+ | (UINT8)(sAecInfo.sOutput.bDcl_Gain[1]<<4)
+ | (UINT8)(sAecInfo.sOutput.bDcl_OnOff[0]<<3)
+ | sAecInfo.sOutput.bDcl_Gain[0];
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | (UINT32)MCI_DCL_GAIN,/*18*/
+ bReg);
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)19,
+ bOP_DAC);
+ }
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)MCI_HPDETVOL,
+ bHpDet);
+ bReg = (sAecInfo.sE2.bE2_Da_Sel<<3)
+ | sAecInfo.sE2.bE2_Ad_Sel;
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | (UINT32)MCI_E2_SEL,
+ bReg);
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)78,
+ T_CPMODE_IMPSENSE_AFTER);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)87,
+ 0);
+ abData[0] = MCI_ANA_REG_A<<1;
+ abData[1] = 78;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrA, MCI_ANA_REG_D);
+ } else {
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)87,
+ 0);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)31,
+ 0);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)30,
+ 0);
+ }
+
+ McResCtrl_GetPathInfoVirtual(&sCurPathInfo);
+ sdRet = set_path(&sCurPathInfo);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+ McSrv_Unlock();
+ if (sHSDetInfo.cbfunc != NULL) {
+ if ((dFlg_DET & MCB_SPLUGUNDET_DB) != 0) {
+ ;
+ dFlg_DET = MCB_PLUGUNDET_DB;
+ } else {
+ dFlg_DET |=
+ MCDRV_HSDET_EVT_SENSEFIN_FLAG;
+ }
+ (*sHSDetInfo.cbfunc)(dFlg_DET
+ |((UINT32)bFlg_KEY<<16),
+ &sHSDetRes);
+ }
+ /* Enable IRQ */
+ McSrv_Lock();
+ bAP = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA,
+ MCI_AP);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PreLDODStart();
+ }
+ abData[0] = MCI_CD_REG_A<<1;
+ abData[1] = MCI_IRQHS;
+ abData[2] = MCI_CD_REG_D<<1;
+ abData[3] = MCB_EIRQHS;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+ McResCtrl_SetRegVal(MCDRV_PACKET_REGTYPE_CD,
+ MCI_IRQHS, MCB_EIRQHS);
+ abData[0] = MCI_IRQR<<1;
+ abData[1] = MCB_EIRQR;
+ McSrv_WriteReg(bSlaveAddrD, abData, 2);
+ bReg = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_IF,
+ MCI_RST_A);
+ if (bReg == 0) {
+ abData[0] = MCI_IRQ<<1;
+ abData[1] = MCB_EIRQ;
+ McSrv_WriteReg(bSlaveAddrD, abData, 2);
+ McResCtrl_SetRegVal(MCDRV_PACKET_REGTYPE_IF,
+ MCI_IRQ, MCB_EIRQ);
+ }
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+ McSrv_Unlock();
+ return MCDRV_SUCCESS;
+ }
+
+ if (eMCDRV_STATE_READY != McResCtrl_GetState()) {
+ sdRet = MCDRV_ERROR_STATE;
+ goto exit;
+ }
+
+ if ((bEIRQ&MCB_EIRQ) != 0) {
+ bReg = McSrv_ReadReg(bSlaveAddrD, MCI_EDSP);
+ if (bReg != 0) {
+ /* Disable IRQ */
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_EEDSP,
+ 0);
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+
+ if ((bReg & MCB_E2DSP_STA) != 0) {
+ ;
+ McEdsp_IrqProc();
+ }
+ /* Clear IRQ */
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_EDSP,
+ bReg);
+ /* Enable IRQ */
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_EEDSP,
+ MCB_EE2DSP);
+ }
+
+ bReg = McSrv_ReadReg(bSlaveAddrD, MCI_CDSP);
+ if (bReg != 0) {
+ /* Disable IRQ */
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_ECDSP,
+ 0);
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ McCdsp_IrqProc();
+ /* Clear IRQ */
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_CDSP,
+ bReg);
+ /* Enable IRQ */
+ bReg = MCB_ECDSP
+ | MCB_EFFIFO
+ | MCB_ERFIFO
+ | MCB_EEFIFO
+ | MCB_EOFIFO
+ | MCB_EDFIFO
+ | MCB_EENC
+ | MCB_EDEC;
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_ECDSP,
+ bReg);
+ }
+
+ bReg = McSrv_ReadReg(bSlaveAddrD, MCI_IRSERR);
+ if (bReg != 0) {
+ /* Disable IRQ */
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IESERR,
+ 0);
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ McFdsp_IrqProc();
+ /* Clear IRQ */
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IRSERR,
+ bReg);
+ /* Enable IRQ */
+ bReg = MCB_IESERR
+ | MCB_IEAMTBEG
+ | MCB_IEAMTEND
+ | MCB_IEFW;
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IESERR,
+ bReg);
+ }
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ }
+
+ abData[0] = MCI_CD_REG_A<<1;
+ abData[1] = MCI_IRQHS;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ if (bReg == (MCB_EIRQHS|MCB_IRQHS)) {
+ /* Disable EIRQHS */
+ abData[2] = MCI_CD_REG_D<<1;
+ abData[3] = 0;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+ McResCtrl_SetRegVal(MCDRV_PACKET_REGTYPE_CD,
+ MCI_IRQHS, 0);
+
+ /* PLUGDET, SPLUGUNDETDB, SPLUGDETDB */
+ abData[1] = MCI_PLUGDET;/*10*/
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bSPlugDet = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ dFlg_DET = (bSPlugDet&MCB_PLUGDET);
+
+ abData[1] = MCI_PLUGDET_DB;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bPlugDet = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ dFlg_DET |= bPlugDet;
+
+ if ((dFlg_DET&MCB_PLUGUNDET_DB) != 0) {
+ ;
+ McResCtrl_SetPlugDetDB(0);
+ }
+ if ((sHSDetInfo.bEnPlugDetDb & MCDRV_PLUGDETDB_DET_ENABLE) != 0
+ ) {
+ if (McDevProf_GetDevId() != eMCDRV_DEV_ID_80_90H) {
+ abData[1] = MCI_RPLUGDET;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bReg = (UINT8)~McSrv_ReadReg(bSlaveAddrA,
+ MCI_CD_REG_D);
+ bReg &= bPlugDet;
+ } else {
+ bReg = bSPlugDet;
+ }
+ if ((bReg & MCB_SPLUGDET_DB) != 0) {
+ McResCtrl_SetPlugDetDB(bReg);
+ if (McDevProf_GetDevId() !=
+ eMCDRV_DEV_ID_81_92H) {
+ bReg = McResCtrl_GetRegVal(
+ MCDRV_PACKET_REGTYPE_ANA,
+ MCI_AP);
+ bReg &= (UINT8)~MCB_AP_BGR;
+ McDevIf_AddPacket(
+ MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)MCI_AP,
+ bReg);
+ }
+ bReg = McResCtrl_GetRegVal(
+ MCDRV_PACKET_REGTYPE_ANA,
+ MCI_HIZ);
+ bReg |= (MCB_HPR_HIZ|MCB_HPL_HIZ);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)MCI_HIZ,
+ bReg);
+ McResCtrl_GetPathInfoVirtual(&sCurPathInfo);
+ sCurPathInfo.asBias[3].dSrcOnOff |=
+ MCDRV_ASRC_MIC4_ON;
+ sdRet = set_path(&sCurPathInfo);
+ if (sdRet != MCDRV_SUCCESS) {
+ /* Enable IRQ */
+ abData[1] = MCI_IRQHS;
+ abData[3] = MCB_EIRQHS;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+ McResCtrl_SetRegVal(
+ MCDRV_PACKET_REGTYPE_CD,
+ MCI_IRQHS, MCB_EIRQHS);
+ goto exit;
+ }
+ if ((sHSDetInfo.bEnDlyKeyOff !=
+ MCDRV_KEYEN_D_D_D)
+ || (sHSDetInfo.bEnDlyKeyOn !=
+ MCDRV_KEYEN_D_D_D)
+ || (sHSDetInfo.bEnMicDet !=
+ MCDRV_MICDET_DISABLE)
+ || (sHSDetInfo.bEnKeyOff !=
+ MCDRV_KEYEN_D_D_D)
+ || (sHSDetInfo.bEnKeyOn !=
+ MCDRV_KEYEN_D_D_D)) {
+ ;
+ McPacket_AddMKDetEnable(0);
+ }
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS) {
+ /* Enable IRQ */
+ abData[1] = MCI_IRQHS;
+ abData[3] = MCB_EIRQHS;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+ McResCtrl_SetRegVal(
+ MCDRV_PACKET_REGTYPE_CD,
+ MCI_IRQHS, MCB_EIRQHS);
+ goto exit;
+ }
+ if (sHSDetInfo.bSgnlNum != MCDRV_SGNLNUM_NONE
+ ) {
+ bHpDet = McResCtrl_GetRegVal(
+ MCDRV_PACKET_REGTYPE_ANA,
+ MCI_HPDETVOL);
+ sdRet = BeginImpSense(&bOP_DAC);
+ if (sdRet == MCDRV_SUCCESS) {
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+ return sdRet;
+ } else {
+ /* Enable IRQ */
+ abData[1] = MCI_IRQHS;
+ abData[3] = MCB_EIRQHS;
+ McSrv_WriteReg(bSlaveAddrA,
+ abData, 4);
+ McResCtrl_SetRegVal(
+ MCDRV_PACKET_REGTYPE_CD,
+ MCI_IRQHS, MCB_EIRQHS);
+ goto exit;
+ }
+ }
+ }
+ }
+
+ /* clear */
+ abData[1] = MCI_PLUGDET;/*10*/
+ abData[3] = bSPlugDet;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+
+ /* set reference */
+ abData[1] = MCI_RPLUGDET;
+ abData[3] = (UINT8)dFlg_DET;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+
+ /* DLYKEYON, DLYKEYOFF */
+ abData[1] = MCI_SDLYKEY;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ bFlg_DLYKEY = bReg;
+ /* clear */
+ abData[1] = MCI_SDLYKEY;
+ abData[3] = bReg;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+
+ /* MICDET, KEYON, KEYOFF */
+ abData[1] = MCI_SMICDET;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ bFlg_KEY = bReg & (UINT8)~MCB_SMICDET;
+ /* clear */
+ abData[1] = MCI_SMICDET;
+ abData[3] = bReg;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+
+ /* set reference */
+ abData[1] = MCI_MICDET;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ if (sHSDetInfo.bSgnlNum == MCDRV_SGNLNUM_NONE) {
+ if ((dFlg_DET & MCB_PLUGDET_DB) != 0) {
+ dCycles = 0;
+ switch (sHSDetInfo.bSperiod) {
+ default:
+ case MCDRV_SPERIOD_244:
+ dInterval = 244;
+ break;
+ case MCDRV_SPERIOD_488:
+ dInterval = 488;
+ break;
+ case MCDRV_SPERIOD_977:
+ dInterval = 977;
+ break;
+ case MCDRV_SPERIOD_1953:
+ dInterval = 1953;
+ break;
+ case MCDRV_SPERIOD_3906:
+ dInterval = 3906;
+ break;
+ case MCDRV_SPERIOD_7813:
+ dInterval = 7813;
+ break;
+ case MCDRV_SPERIOD_15625:
+ dInterval = 15625;
+ break;
+ case MCDRV_SPERIOD_31250:
+ dInterval = 31250;
+ break;
+ }
+ switch (sHSDetInfo.bDbncNumMic) {
+ default:
+ case MCDRV_DBNC_NUM_2:
+ dTimeOut = 1;
+ break;
+ case MCDRV_DBNC_NUM_3:
+ dTimeOut = 4;
+ break;
+ case MCDRV_DBNC_NUM_4:
+ dTimeOut = 5;
+ break;
+ case MCDRV_DBNC_NUM_7:
+ dTimeOut = 8;
+ break;
+ }
+
+ while (dCycles < dTimeOut) {
+ bReg = McSrv_ReadReg(bSlaveAddrA,
+ MCI_CD_REG_D);
+ if ((bReg & (MCB_MICDET|0x07)) != 0) {
+ ;
+ break;
+ }
+ McSrv_Sleep(dInterval);
+ dCycles++;
+ }
+ }
+ } else {
+ bReg = McSrv_ReadReg(bSlaveAddrA, MCI_CD_REG_D);
+ }
+ bFlg_KEY |= bReg &
+ (sHSDetInfo.bEnMicDet == MCDRV_MICDET_ENABLE ?
+ MCB_MICDET : 0);
+ abData[1] = MCI_RMICDET;
+ abData[3] = bReg;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+
+ if (sHSDetInfo.cbfunc != NULL) {
+ /* KeyCnt0 */
+ abData[1] = MCI_KEYCNTCLR0;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ sHSDetRes.bKeyCnt0 = McSrv_ReadReg(bSlaveAddrA,
+ MCI_CD_REG_D);
+ abData[1] = MCI_KEYCNTCLR0;
+ abData[3] = MCB_KEYCNTCLR0;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+
+ /* KeyCnt1 */
+ abData[1] = MCI_KEYCNTCLR1;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ sHSDetRes.bKeyCnt1 = McSrv_ReadReg(bSlaveAddrA,
+ MCI_CD_REG_D);
+ abData[1] = MCI_KEYCNTCLR1;
+ abData[3] = MCB_KEYCNTCLR1;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+
+ /* KeyCnt2 */
+ abData[1] = MCI_KEYCNTCLR2;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ sHSDetRes.bKeyCnt2 = McSrv_ReadReg(bSlaveAddrA,
+ MCI_CD_REG_D);
+ abData[1] = MCI_KEYCNTCLR2;
+ abData[3] = MCB_KEYCNTCLR2;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+
+ abData[0] = MCI_IRQ<<1;
+ abData[1] = 0;
+ McSrv_WriteReg(bSlaveAddrD, abData, 2);
+ McResCtrl_SetRegVal(MCDRV_PACKET_REGTYPE_IF, MCI_IRQ,
+ 0);
+ abData[0] = MCI_IRQR<<1;
+ abData[1] = 0;
+ McSrv_WriteReg(bSlaveAddrD, abData, 2);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+ McSrv_Unlock();
+ (*sHSDetInfo.cbfunc)(
+ dFlg_DET
+ |((UINT32)bFlg_DLYKEY<<8)
+ |((UINT32)bFlg_KEY<<16),
+ &sHSDetRes);
+ McSrv_Lock();
+ bAP = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA,
+ MCI_AP);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PreLDODStart();
+ }
+ abData[0] = MCI_IRQR<<1;
+ abData[1] = MCB_EIRQR;
+ McSrv_WriteReg(bSlaveAddrD, abData, 2);
+ }
+ /* Enable IRQ */
+ abData[0] = MCI_CD_REG_A<<1;
+ abData[1] = MCI_IRQHS;
+ abData[2] = MCI_CD_REG_D<<1;
+ abData[3] = MCB_EIRQHS;
+ McSrv_WriteReg(bSlaveAddrA, abData, 4);
+ McResCtrl_SetRegVal(MCDRV_PACKET_REGTYPE_CD,
+ MCI_IRQHS, MCB_EIRQHS);
+ }
+
+exit:
+ bReg = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_IF, MCI_RST_A);
+ if (bReg == 0) {
+ bReg = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_IF,
+ MCI_IRQ);
+ if (bReg != MCB_EIRQ) {
+ abData[0] = MCI_IRQ<<1;
+ abData[1] = MCB_EIRQ;
+ McSrv_WriteReg(bSlaveAddrD, abData, 2);
+ McResCtrl_SetRegVal(MCDRV_PACKET_REGTYPE_IF, MCI_IRQ,
+ MCB_EIRQ);
+ }
+ }
+
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+ McSrv_Unlock();
+ return sdRet;
+}
+
+#ifndef MCDRV_SKIP_IMPSENSE
+/****************************************************************************
+ * BeginImpSense
+ *
+ * Description:
+ * Begin Imp Sensing.
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_RESOURCEOVER
+ * MCDRV_ERROR_TIMEOUT
+ *
+ ****************************************************************************/
+static SINT32 BeginImpSense
+(
+ UINT8 *bOP_DAC
+)
+{
+ SINT32 sdRet = MCDRV_SUCCESS;
+ UINT8 bReg;
+ struct MCDRV_POWER_INFO sPowerInfo;
+ struct MCDRV_POWER_UPDATE sPowerUpdate;
+ struct MCDRV_HSDET_INFO sHSDetInfo;
+ struct MCDRV_INIT_INFO sInitInfo;
+ struct MCDRV_INIT2_INFO sInit2Info;
+ UINT8 bSlaveAddrA;
+ UINT8 abData[2];
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ McDebugLog_FuncIn("BeginImpSense");
+#endif
+
+ bSlaveAddrA = McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_ANA);
+ McResCtrl_GetCurPowerInfo(&sPowerInfo);
+ sPowerInfo.bDigital &= ~(MCDRV_POWINFO_D_PM_CLK_PD
+ |MCDRV_POWINFO_D_PE_CLK_PD
+ |MCDRV_POWINFO_D_PLL_PD);
+ sPowerInfo.abAnalog[0] &=
+ (UINT8)~(MCB_AP_LDOA|MCB_AP_LDOD|MCB_AP_BGR|MCB_AP_VR);
+
+ /* power up */
+ sPowerUpdate.bDigital = MCDRV_POWUPDATE_D_ALL;
+ sPowerUpdate.abAnalog[0] = (UINT8)MCDRV_POWUPDATE_AP;
+ sPowerUpdate.abAnalog[1] = 0;
+ sPowerUpdate.abAnalog[2] = 0;
+ sPowerUpdate.abAnalog[3] = 0;
+ sPowerUpdate.abAnalog[4] = 0;
+ sdRet = McPacket_AddPowerUp(&sPowerInfo, &sPowerUpdate);
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IRQ,
+ 0);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_CD
+ | (UINT32)MCI_IRQHS,
+ 0);
+
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | (UINT32)MCI_E1DSP_CTRL),
+ (UINT8)0x00);
+
+ McPacket_AddDac0Mute();
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_MA
+ | (UINT32)MCI_DAO0_VOL0),
+ MCDRV_REG_MUTE);
+ McDevIf_AddPacket((MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_MA
+ | (UINT32)MCI_DAO0_VOL1),
+ MCDRV_REG_MUTE);
+
+ bReg = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_E,
+ MCI_LPF_THR);
+ bReg |= (MCB_OSF0_ENB|MCB_LPF0_PST_THR|MCB_LPF0_PRE_THR);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | (UINT32)MCI_LPF_THR,
+ bReg);
+
+ bReg = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_CD, MCI_DP);
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ bReg &= (UINT8)~(MCB_DP_ADC|MCB_DP_DAC0|
+ MCB_DP_PDMCK|MCB_DP_PDMADC|MCB_DP_PDMDAC);
+ } else {
+ bReg &= (UINT8)~(MCB_DP_ADC|MCB_DP_DAC1|MCB_DP_DAC0|
+ MCB_DP_PDMCK|MCB_DP_PDMADC|MCB_DP_PDMDAC);
+ }
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_CD
+ | (UINT32)MCI_DP,
+ bReg);
+
+ bReg = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_E,
+ MCI_DCL_GAIN);
+ bReg |= MCB_DCL0_OFF;
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | (UINT32)MCI_DCL_GAIN,
+ bReg);
+
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ bReg = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_E,
+ MCI_DSF0_FLT_TYPE);
+ bReg |= MCB_DSF0ENB;
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | (UINT32)MCI_DSF0_FLT_TYPE,
+ bReg);
+ } else {
+ bReg = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_E,
+ MCI_DSF2_FLT_TYPE);
+ bReg |= MCB_DSF2ENB;
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | (UINT32)MCI_DSF2_FLT_TYPE,
+ bReg);
+ }
+
+ McResCtrl_GetHSDet(&sHSDetInfo, NULL);
+ bReg = (sHSDetInfo.bSgnlPeak<<4)
+ | (sHSDetInfo.bSgnlNum<<2)
+ | sHSDetInfo.bSgnlPeriod;
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | (UINT32)MCI_IMPSEL,
+ bReg);
+
+ bReg = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_E, MCI_E2_SEL);
+ bReg &= (UINT8)~0x0C;
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | (UINT32)MCI_E2_SEL,
+ 0);
+
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)MCI_IRQR,
+ MCB_EIRQR);
+
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_CD
+ | (UINT32)MCI_EIRQSENSE,
+ MCB_EIRQSENSE);
+
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ *bOP_DAC = McResCtrl_GetRegVal(
+ MCDRV_PACKET_REGTYPE_ANA, 19);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)19,
+ 0);
+ }
+
+ McResCtrl_GetInitInfo(&sInitInfo, &sInit2Info);
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ ;
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)MCI_HPDETVOL,
+ 0x70);
+ } else if (McDevProf_GetDevId() == eMCDRV_DEV_ID_81_91H) {
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)MCI_HPDETVOL,
+ 0x6B);
+ } else {
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)MCI_HPDETVOL,
+ sInit2Info.bOption[9]);
+ }
+
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)78,
+ T_CPMODE_IMPSENSE_BEFORE);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)87,
+ 0x11);
+ } else {
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)31,
+ 0xB5);
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_IF
+ | (UINT32)30,
+ 0xD6);
+
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_ANA
+ | (UINT32)87,
+ sInit2Info.bOption[10]);
+ }
+ sdRet = McDevIf_ExecutePacket();
+ if (sdRet != MCDRV_SUCCESS)
+ goto exit;
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ abData[0] = MCI_ANA_REG_A<<1;
+ abData[1] = 78;
+ McSrv_WriteReg(bSlaveAddrA, abData, 2);
+ bReg = McSrv_ReadReg(bSlaveAddrA, MCI_ANA_REG_D);
+ if (bReg != T_CPMODE_IMPSENSE_BEFORE) {
+ sdRet = MCDRV_ERROR;
+ goto exit;
+ }
+ }
+
+ bReg = E1COMMAND_IMP_SENSE;
+ if (sInitInfo.bGndDet == MCDRV_GNDDET_ON)
+ bReg |= E1COMMAND_GND_DET;
+ if ((McResCtrl_IsASrcUsed(MCDRV_ASRC_DAC1_L_ON) != 0)
+ || (McResCtrl_IsASrcUsed(MCDRV_ASRC_DAC1_R_ON) != 0)
+ || (McResCtrl_IsD2SrcUsed(MCDRV_D2SRC_ADC0_L_ON) != 0)
+ || (McResCtrl_IsD2SrcUsed(MCDRV_D2SRC_ADC0_R_ON) != 0)
+ || (McResCtrl_IsD2SrcUsed(MCDRV_D2SRC_ADC1_ON) != 0)
+ || (McResCtrl_IsD2SrcUsed(MCDRV_D2SRC_PDM0_L_ON) != 0)
+ || (McResCtrl_IsD2SrcUsed(MCDRV_D2SRC_PDM0_R_ON) != 0)
+ || (McResCtrl_IsD2SrcUsed(MCDRV_D2SRC_PDM1_L_ON) != 0)
+ || (McResCtrl_IsD2SrcUsed(MCDRV_D2SRC_PDM1_R_ON) != 0))
+ bReg |= E1COMMAND_ADDITIONAL;
+ else if ((McResCtrl_IsASrcUsed(MCDRV_ASRC_DAC0_L_ON) != 0)
+ || (McResCtrl_IsASrcUsed(MCDRV_ASRC_DAC0_R_ON) != 0))
+ bReg |= (E1COMMAND_ADDITIONAL|E1COMMAND_PD);
+
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_TIMWAIT
+ | MCDRV_DAC_MUTE_WAIT_TIME,
+ 0);
+ } else {
+ bReg |= E1COMMAND_WAIT;
+ }
+ McDevIf_AddPacket(MCDRV_PACKET_TYPE_FORCE_WRITE
+ | MCDRV_PACKET_REGTYPE_E
+ | (UINT32)MCI_E1COMMAND,
+ bReg);
+
+ sdRet = McDevIf_ExecutePacket();
+
+exit:
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ McDebugLog_FuncOut("BeginImpSense", &sdRet);
+#endif
+ return sdRet;
+}
+#endif
+
+/****************************************************************************
+ * IsLDOAOn
+ *
+ * Description:
+ * Is LDOA used.
+ * Arguments:
+ * none
+ * Return:
+ * 0:unused, 1:used
+ *
+ ****************************************************************************/
+static UINT8 IsLDOAOn
+(
+ void
+)
+{
+ UINT8 bRet = 0;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("IsLDOAOn");
+#endif
+ if ((McResCtrl_HasSrc(eMCDRV_DST_ADC0, eMCDRV_DST_CH0) != 0)
+ || (McResCtrl_HasSrc(eMCDRV_DST_ADC0, eMCDRV_DST_CH1) != 0)
+ || (McResCtrl_HasSrc(eMCDRV_DST_ADC1, eMCDRV_DST_CH0) != 0)
+ || (McResCtrl_HasSrc(eMCDRV_DST_BIAS, eMCDRV_DST_CH0) != 0)
+ || (McResCtrl_HasSrc(eMCDRV_DST_BIAS, eMCDRV_DST_CH1) != 0)
+ || (McResCtrl_HasSrc(eMCDRV_DST_BIAS, eMCDRV_DST_CH2) != 0)
+ || (McResCtrl_HasSrc(eMCDRV_DST_BIAS, eMCDRV_DST_CH3) != 0)
+ || (McResCtrl_IsASrcUsed(MCDRV_ASRC_DAC0_L_ON) != 0)
+ || (McResCtrl_IsASrcUsed(MCDRV_ASRC_DAC0_R_ON) != 0)
+ || (McResCtrl_IsASrcUsed(MCDRV_ASRC_DAC1_L_ON) != 0)
+ || (McResCtrl_IsASrcUsed(MCDRV_ASRC_DAC1_R_ON) != 0))
+ bRet = 1;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsLDOAOn", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * IsValidInitParam
+ *
+ * Description:
+ * check init parameters.
+ * Arguments:
+ * psInitInfo initialize information
+ * psInit2Info initialize information
+ * Return:
+ * 0:Invalid
+ * othre:Valid
+ *
+ ****************************************************************************/
+static UINT8 IsValidInitParam
+(
+ const struct MCDRV_INIT_INFO *psInitInfo,
+ const struct MCDRV_INIT2_INFO *psInit2Info
+)
+{
+ UINT8 bRet = 1;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("IsValidInitParam");
+#endif
+
+
+ if ((MCDRV_CKSEL_CMOS_CMOS != psInitInfo->bCkSel)
+ && (MCDRV_CKSEL_TCXO_TCXO != psInitInfo->bCkSel)
+ && (MCDRV_CKSEL_CMOS_TCXO != psInitInfo->bCkSel)
+ && (MCDRV_CKSEL_TCXO_CMOS != psInitInfo->bCkSel))
+ bRet = 0;
+
+ if ((MCDRV_CKINPUT_CLKI0_CLKI1 != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_CLKI0_RTCK != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_CLKI0_SBCK != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_CLKI1_CLKI0 != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_CLKI1_RTCK != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_CLKI1_SBCK != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_RTC_CLKI0 != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_RTC_CLKI1 != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_RTC_SBCK != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_SBCK_CLKI0 != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_SBCK_CLKI1 != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_SBCK_RTC != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_CLKI0_CLKI0 != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_CLKI1_CLKI1 != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_RTC_RTC != psInitInfo->bCkInput)
+ && (MCDRV_CKINPUT_SBCK_SBCK != psInitInfo->bCkInput))
+ bRet = 0;
+
+ if (psInitInfo->bPllModeA > 7)
+ bRet = 0;
+
+ if (psInitInfo->bPllPrevDivA > 0x3F)
+ bRet = 0;
+
+ if (psInitInfo->wPllFbDivA > 0x3FFF)
+ bRet = 0;
+
+ if ((psInitInfo->bPllFreqA != MCDRV_PLLFREQ_73)
+ && (psInitInfo->bPllFreqA != MCDRV_PLLFREQ_147))
+ bRet = 0;
+
+ if (psInitInfo->bPllModeB > 7)
+ bRet = 0;
+
+ if (psInitInfo->bPllPrevDivB > 0x3F)
+ bRet = 0;
+
+ if (psInitInfo->wPllFbDivB > 0x3FFF)
+ bRet = 0;
+
+ if ((psInitInfo->bPllFreqB != MCDRV_PLLFREQ_73)
+ && (psInitInfo->bPllFreqB != MCDRV_PLLFREQ_147))
+ bRet = 0;
+
+ if ((psInitInfo->bHsdetClk != MCDRV_HSDETCLK_RTC)
+ && (psInitInfo->bHsdetClk != MCDRV_HSDETCLK_OSC))
+ bRet = 0;
+
+ if (((MCDRV_DAHIZ_LOW != psInitInfo->bDio0SdoHiz)
+ && (MCDRV_DAHIZ_HIZ != psInitInfo->bDio0SdoHiz))
+ || ((MCDRV_DAHIZ_LOW != psInitInfo->bDio1SdoHiz)
+ && (MCDRV_DAHIZ_HIZ != psInitInfo->bDio1SdoHiz))
+ || ((MCDRV_DAHIZ_LOW != psInitInfo->bDio2SdoHiz)
+ && (MCDRV_DAHIZ_HIZ != psInitInfo->bDio2SdoHiz)))
+ bRet = 0;
+
+ if (((MCDRV_DAHIZ_LOW != psInitInfo->bDio0ClkHiz)
+ && (MCDRV_DAHIZ_HIZ != psInitInfo->bDio0ClkHiz))
+ || ((MCDRV_DAHIZ_LOW != psInitInfo->bDio1ClkHiz)
+ && (MCDRV_DAHIZ_HIZ != psInitInfo->bDio1ClkHiz))
+ || ((MCDRV_DAHIZ_LOW != psInitInfo->bDio2ClkHiz)
+ && (MCDRV_DAHIZ_HIZ != psInitInfo->bDio2ClkHiz)))
+ bRet = 0;
+
+ if (((MCDRV_PCMHIZ_LOW != psInitInfo->bDio0PcmHiz)
+ && (MCDRV_PCMHIZ_HIZ != psInitInfo->bDio0PcmHiz))
+ || ((MCDRV_PCMHIZ_LOW != psInitInfo->bDio1PcmHiz)
+ && (MCDRV_PCMHIZ_HIZ != psInitInfo->bDio1PcmHiz))
+ || ((MCDRV_PCMHIZ_LOW != psInitInfo->bDio2PcmHiz)
+ && (MCDRV_PCMHIZ_HIZ != psInitInfo->bDio2PcmHiz)))
+ bRet = 0;
+
+ if ((MCDRV_PA_GPIO != psInitInfo->bPa0Func)
+ && (MCDRV_PA_PDMCK != psInitInfo->bPa0Func))
+ bRet = 0;
+
+ if ((MCDRV_PA_GPIO != psInitInfo->bPa1Func)
+ && (MCDRV_PA_PDMDI != psInitInfo->bPa1Func))
+ bRet = 0;
+
+ if ((MCDRV_PA_GPIO != psInitInfo->bPa2Func)
+ && (MCDRV_PA_PDMDI != psInitInfo->bPa2Func))
+ bRet = 0;
+
+ if ((MCDRV_POWMODE_FULL != psInitInfo->bPowerMode)
+ && (MCDRV_POWMODE_CDSPDEBUG != psInitInfo->bPowerMode))
+ bRet = 0;
+
+ if ((psInitInfo->bMbSel1 != MCDRV_MBSEL_20)
+ && (psInitInfo->bMbSel1 != MCDRV_MBSEL_21)
+ && (psInitInfo->bMbSel1 != MCDRV_MBSEL_22)
+ && (psInitInfo->bMbSel1 != MCDRV_MBSEL_23))
+ bRet = 0;
+ if ((psInitInfo->bMbSel2 != MCDRV_MBSEL_20)
+ && (psInitInfo->bMbSel2 != MCDRV_MBSEL_21)
+ && (psInitInfo->bMbSel2 != MCDRV_MBSEL_22)
+ && (psInitInfo->bMbSel2 != MCDRV_MBSEL_23))
+ bRet = 0;
+ if ((psInitInfo->bMbSel3 != MCDRV_MBSEL_20)
+ && (psInitInfo->bMbSel3 != MCDRV_MBSEL_21)
+ && (psInitInfo->bMbSel3 != MCDRV_MBSEL_22)
+ && (psInitInfo->bMbSel3 != MCDRV_MBSEL_23))
+ bRet = 0;
+ if ((psInitInfo->bMbSel4 != MCDRV_MBSEL_20)
+ && (psInitInfo->bMbSel4 != MCDRV_MBSEL_21)
+ && (psInitInfo->bMbSel4 != MCDRV_MBSEL_22)
+ && (psInitInfo->bMbSel4 != MCDRV_MBSEL_23))
+ bRet = 0;
+
+ if ((psInitInfo->bMbsDisch != MCDRV_MBSDISCH_0000)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_0001)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_0010)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_0011)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_0100)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_0101)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_0110)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_0111)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_1000)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_1001)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_1010)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_1011)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_1100)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_1101)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_1110)
+ && (psInitInfo->bMbsDisch != MCDRV_MBSDISCH_1111))
+ bRet = 0;
+
+ if ((psInitInfo->bNonClip != MCDRV_NONCLIP_OFF)
+ && (psInitInfo->bNonClip != MCDRV_NONCLIP_ON))
+ bRet = 0;
+
+ if ((psInitInfo->bLineIn1Dif != MCDRV_LINE_STEREO)
+ && (psInitInfo->bLineIn1Dif != MCDRV_LINE_DIF))
+ bRet = 0;
+
+ if ((psInitInfo->bLineOut1Dif != MCDRV_LINE_STEREO)
+ && (psInitInfo->bLineOut1Dif != MCDRV_LINE_DIF))
+ bRet = 0;
+
+ if ((psInitInfo->bLineOut2Dif != MCDRV_LINE_STEREO)
+ && (psInitInfo->bLineOut2Dif != MCDRV_LINE_DIF))
+ bRet = 0;
+
+ if ((psInitInfo->bMic1Sng != MCDRV_MIC_DIF)
+ && (psInitInfo->bMic1Sng != MCDRV_MIC_SINGLE))
+ bRet = 0;
+ if ((psInitInfo->bMic2Sng != MCDRV_MIC_DIF)
+ && (psInitInfo->bMic2Sng != MCDRV_MIC_SINGLE))
+ bRet = 0;
+ if ((psInitInfo->bMic3Sng != MCDRV_MIC_DIF)
+ && (psInitInfo->bMic3Sng != MCDRV_MIC_SINGLE))
+ bRet = 0;
+ if ((psInitInfo->bMic4Sng != MCDRV_MIC_DIF)
+ && (psInitInfo->bMic4Sng != MCDRV_MIC_SINGLE))
+ bRet = 0;
+
+ if ((psInitInfo->bZcLineOut1 != MCDRV_ZC_ON)
+ && (psInitInfo->bZcLineOut1 != MCDRV_ZC_OFF))
+ bRet = 0;
+
+ if ((psInitInfo->bZcLineOut2 != MCDRV_ZC_ON)
+ && (psInitInfo->bZcLineOut2 != MCDRV_ZC_OFF))
+ bRet = 0;
+
+ if ((psInitInfo->bZcRc != MCDRV_ZC_ON)
+ && (psInitInfo->bZcRc != MCDRV_ZC_OFF))
+ bRet = 0;
+
+ if ((psInitInfo->bZcSp != MCDRV_ZC_ON)
+ && (psInitInfo->bZcSp != MCDRV_ZC_OFF))
+ bRet = 0;
+
+ if ((psInitInfo->bZcHp != MCDRV_ZC_ON)
+ && (psInitInfo->bZcHp != MCDRV_ZC_OFF))
+ bRet = 0;
+
+ if ((psInitInfo->bSvolLineOut1 != MCDRV_SVOL_OFF)
+ && (psInitInfo->bSvolLineOut1 != MCDRV_SVOL_ON))
+ bRet = 0;
+
+ if ((psInitInfo->bSvolLineOut2 != MCDRV_SVOL_OFF)
+ && (psInitInfo->bSvolLineOut2 != MCDRV_SVOL_ON))
+ bRet = 0;
+
+ if ((psInitInfo->bSvolRc != MCDRV_SVOL_OFF)
+ && (psInitInfo->bSvolRc != MCDRV_SVOL_ON))
+ bRet = 0;
+
+ if ((psInitInfo->bSvolSp != MCDRV_SVOL_OFF)
+ && (psInitInfo->bSvolSp != MCDRV_SVOL_ON))
+ bRet = 0;
+
+ if ((psInitInfo->bSvolHp != MCDRV_SVOL_OFF)
+ && (psInitInfo->bSvolHp != MCDRV_SVOL_ON))
+ bRet = 0;
+
+ if ((psInitInfo->bRcHiz != MCDRV_RCIMP_FIXLOW)
+ && (psInitInfo->bRcHiz != MCDRV_RCIMP_WL))
+ bRet = 0;
+
+ if ((psInitInfo->bSpHiz != MCDRV_WL_LOFF_ROFF)
+ && (psInitInfo->bSpHiz != MCDRV_WL_LON_ROFF)
+ && (psInitInfo->bSpHiz != MCDRV_WL_LOFF_RON)
+ && (psInitInfo->bSpHiz != MCDRV_WL_LON_RON))
+ bRet = 0;
+
+ if ((psInitInfo->bHpHiz != MCDRV_IMP_LFIXLOW_RFIXLOW)
+ && (psInitInfo->bHpHiz != MCDRV_IMP_LWL_RFIXLOW)
+ && (psInitInfo->bHpHiz != MCDRV_IMP_LFIXLOW_RWL)
+ && (psInitInfo->bHpHiz != MCDRV_IMP_LWL_RWL))
+ bRet = 0;
+
+ if ((psInitInfo->bLineOut1Hiz != MCDRV_IMP_LFIXLOW_RFIXLOW)
+ && (psInitInfo->bLineOut1Hiz != MCDRV_IMP_LWL_RFIXLOW)
+ && (psInitInfo->bLineOut1Hiz != MCDRV_IMP_LFIXLOW_RWL)
+ && (psInitInfo->bLineOut1Hiz != MCDRV_IMP_LWL_RWL))
+ bRet = 0;
+
+ if ((psInitInfo->bLineOut2Hiz != MCDRV_IMP_LFIXLOW_RFIXLOW)
+ && (psInitInfo->bLineOut2Hiz != MCDRV_IMP_LWL_RFIXLOW)
+ && (psInitInfo->bLineOut2Hiz != MCDRV_IMP_LFIXLOW_RWL)
+ && (psInitInfo->bLineOut2Hiz != MCDRV_IMP_LWL_RWL))
+ bRet = 0;
+
+ if ((psInitInfo->bCpMod != MCDRV_CPMOD_HI)
+ && (psInitInfo->bCpMod != MCDRV_CPMOD_MID))
+ bRet = 0;
+
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ if ((psInitInfo->bRbSel != MCDRV_RBSEL_2_2K)
+ && (psInitInfo->bRbSel != MCDRV_RBSEL_50))
+ bRet = 0;
+ }
+
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ if ((psInitInfo->bPlugSel != MCDRV_PLUG_LRGM)
+ && (psInitInfo->bPlugSel != MCDRV_PLUG_LRMG))
+ bRet = 0;
+ }
+
+ if ((psInitInfo->bGndDet != MCDRV_GNDDET_OFF)
+ && (psInitInfo->bGndDet != MCDRV_GNDDET_ON))
+ bRet = 0;
+
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ if ((psInitInfo->bPpdRc != MCDRV_PPD_OFF)
+ && (psInitInfo->bPpdRc != MCDRV_PPD_ON))
+ bRet = 0;
+ }
+
+ if ((psInitInfo->bPpdSp != MCDRV_PPD_OFF)
+ && (psInitInfo->bPpdSp != MCDRV_PPD_ON))
+ bRet = 0;
+
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ if ((psInitInfo->bPpdHp != MCDRV_PPD_OFF)
+ && (psInitInfo->bPpdHp != MCDRV_PPD_ON))
+ bRet = 0;
+
+ if ((psInitInfo->bPpdLineOut1 != MCDRV_PPD_OFF)
+ && (psInitInfo->bPpdLineOut1 != MCDRV_PPD_ON))
+ bRet = 0;
+
+ if ((psInitInfo->bPpdLineOut2 != MCDRV_PPD_OFF)
+ && (psInitInfo->bPpdLineOut2 != MCDRV_PPD_ON))
+ bRet = 0;
+ }
+
+ if ((psInitInfo->sWaitTime.dWaitTime[0] > MCDRV_MAX_WAIT_TIME)
+ || (psInitInfo->sWaitTime.dWaitTime[1] > MCDRV_MAX_WAIT_TIME)
+ || (psInitInfo->sWaitTime.dWaitTime[2] > MCDRV_MAX_WAIT_TIME)
+ || (psInitInfo->sWaitTime.dWaitTime[3] > MCDRV_MAX_WAIT_TIME)
+ || (psInitInfo->sWaitTime.dWaitTime[4] > MCDRV_MAX_WAIT_TIME))
+ bRet = 0;
+
+ if ((McDevProf_GetDevId() != eMCDRV_DEV_ID_80_90H)
+ && (psInit2Info != NULL)) {
+ if ((psInit2Info->bOption[0] != MCDRV_DOA_DRV_LOW)
+ && (psInit2Info->bOption[0] != MCDRV_DOA_DRV_HIGH)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psInit2Info->bOption[1] != MCDRV_SCKMSK_OFF)
+ && (psInit2Info->bOption[1] != MCDRV_SCKMSK_ON)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psInit2Info->bOption[2] != MCDRV_SPMN_8_9_10)
+ && (psInit2Info->bOption[2] != MCDRV_SPMN_5_6_7)
+ && (psInit2Info->bOption[2] != MCDRV_SPMN_4_5_6)
+ && (psInit2Info->bOption[2] != MCDRV_SPMN_OFF_9)
+ && (psInit2Info->bOption[2] != MCDRV_SPMN_OFF_6)) {
+ bRet = 0;
+ goto exit;
+ }
+ if (psInit2Info->bOption[3] > 0x0F) {
+ bRet = 0;
+ goto exit;
+ }
+ if (psInit2Info->bOption[4] > 0xF8) {
+ bRet = 0;
+ goto exit;
+ }
+ if (psInit2Info->bOption[5] > 0xF8) {
+ bRet = 0;
+ goto exit;
+ }
+ if (psInit2Info->bOption[6] > 0x31) {
+ bRet = 0;
+ goto exit;
+ }
+ if (psInit2Info->bOption[7] > 0x7F) {
+ bRet = 0;
+ goto exit;
+ }
+ if (psInit2Info->bOption[9] > 0x7F) {
+ bRet = 0;
+ goto exit;
+ }
+ if (psInit2Info->bOption[10] > 0x11) {
+ bRet = 0;
+ goto exit;
+ }
+ if (psInit2Info->bOption[11] > 0xF3) {
+ bRet = 0;
+ goto exit;
+ }
+ if (psInit2Info->bOption[12] > 0x07) {
+ bRet = 0;
+ goto exit;
+ }
+ }
+exit:
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsValidInitParam", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * IsValidReadRegParam
+ *
+ * Description:
+ * check read reg parameter.
+ * Arguments:
+ * psRegInfo register information
+ * Return:
+ * 0:Invalid
+ * other:Valid
+ *
+ ****************************************************************************/
+static UINT8 IsValidReadRegParam
+(
+ const struct MCDRV_REG_INFO *psRegInfo
+)
+{
+ UINT8 bRet = 1;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("IsValidReadRegParam");
+#endif
+
+
+ if ((McResCtrl_GetRegAccess(psRegInfo) & eMCDRV_CAN_READ) ==
+ eMCDRV_ACCESS_DENY) {
+ bRet = 0;
+ }
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsValidReadRegParam", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * IsValidWriteRegParam
+ *
+ * Description:
+ * check write reg parameter.
+ * Arguments:
+ * psRegInfo register information
+ * Return:
+ * 0:Invalid
+ * other:Valid
+ *
+ ****************************************************************************/
+static UINT8 IsValidWriteRegParam
+(
+ const struct MCDRV_REG_INFO *psRegInfo
+)
+{
+ UINT8 bRet = 1;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("IsValidWriteRegParam");
+#endif
+
+
+ if ((McResCtrl_GetRegAccess(psRegInfo) & eMCDRV_CAN_WRITE) ==
+ eMCDRV_ACCESS_DENY) {
+ bRet = 0;
+ }
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsValidWriteRegParam", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * IsValidClockSwParam
+ *
+ * Description:
+ * check clock parameters.
+ * Arguments:
+ * psClockSwInfo clock switch information
+ * Return:
+ * 0:Invalid
+ * other:Valid
+ *
+ ****************************************************************************/
+static UINT8 IsValidClockSwParam
+(
+ const struct MCDRV_CLOCKSW_INFO *psClockSwInfo
+)
+{
+ UINT8 bRet = 1;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("IsValidClockSwParam");
+#endif
+
+
+ if ((MCDRV_CLKSW_CLKA != psClockSwInfo->bClkSrc)
+ && (MCDRV_CLKSW_CLKB != psClockSwInfo->bClkSrc)) {
+ bRet = 0;
+ }
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsValidClockSwParam", &sdRet);
+#endif
+
+ return bRet;
+}
+
+/****************************************************************************
+ * MaskIrregularPath
+ *
+ * Description:
+ * mask irregular path parameters.
+ * Arguments:
+ * psPathInfo path information
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void MaskIrregularPath
+(
+ struct MCDRV_PATH_INFO *psPathInfo
+)
+{
+ UINT8 bCh;
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ McDebugLog_FuncIn("MaskIrregularPath");
+#endif
+
+ for (bCh = 0; bCh < MUSICOUT_PATH_CHANNELS; bCh++)
+ psPathInfo->asMusicOut[bCh].dSrcOnOff &=
+ ~MCDRV_D1SRC_HIFIIN_ON;
+
+ for (bCh = 0; bCh < EXTOUT_PATH_CHANNELS; bCh++)
+ psPathInfo->asExtOut[bCh].dSrcOnOff &=
+ ~MCDRV_D1SRC_HIFIIN_ON;
+
+ for (bCh = 0; bCh < HIFIOUT_PATH_CHANNELS; bCh++)
+ psPathInfo->asHifiOut[bCh].dSrcOnOff &=
+ (MCDRV_D1SRC_ADIF0_ON
+ |MCDRV_D1SRC_ADIF0_OFF);
+
+ for (bCh = 0; bCh < VBOXMIXIN_PATH_CHANNELS; bCh++)
+ psPathInfo->asVboxMixIn[bCh].dSrcOnOff &=
+ ~MCDRV_D1SRC_HIFIIN_ON;
+
+ for (bCh = 0; bCh < AE_PATH_CHANNELS; bCh++) {
+ psPathInfo->asAe0[bCh].dSrcOnOff &=
+ ~MCDRV_D1SRC_HIFIIN_ON;
+ psPathInfo->asAe1[bCh].dSrcOnOff &=
+ ~MCDRV_D1SRC_HIFIIN_ON;
+ psPathInfo->asAe2[bCh].dSrcOnOff &=
+ ~MCDRV_D1SRC_HIFIIN_ON;
+ psPathInfo->asAe3[bCh].dSrcOnOff &=
+ ~MCDRV_D1SRC_HIFIIN_ON;
+ }
+
+ for (bCh = 0; bCh < VOICEOUT_PATH_CHANNELS; bCh++)
+ psPathInfo->asVoiceOut[bCh].dSrcOnOff &=
+ (MCDRV_D2SRC_VBOXIOOUT_ON|MCDRV_D2SRC_VBOXIOOUT_OFF);
+
+ for (bCh = 0; bCh < VBOXIOIN_PATH_CHANNELS; bCh++)
+ psPathInfo->asVboxIoIn[bCh].dSrcOnOff &=
+ (MCDRV_D2SRC_VOICEIN_ON|MCDRV_D2SRC_VOICEIN_OFF);
+
+ for (bCh = 0; bCh < VBOXHOSTIN_PATH_CHANNELS; bCh++)
+ psPathInfo->asVboxHostIn[bCh].dSrcOnOff &=
+ (MCDRV_D2SRC_VOICEIN_ON|MCDRV_D2SRC_VOICEIN_OFF);
+
+ for (bCh = 0; bCh < HOSTOUT_PATH_CHANNELS; bCh++)
+ psPathInfo->asHostOut[bCh].dSrcOnOff &=
+ (MCDRV_D2SRC_VBOXHOSTOUT_ON
+ |MCDRV_D2SRC_VBOXHOSTOUT_OFF);
+
+ for (bCh = 0; bCh < ADIF0_PATH_CHANNELS; bCh++)
+ psPathInfo->asAdif0[bCh].dSrcOnOff &=
+ (MCDRV_D2SRC_ADC0_L_ON
+ |MCDRV_D2SRC_ADC0_L_OFF
+ |MCDRV_D2SRC_ADC0_R_ON
+ |MCDRV_D2SRC_ADC0_R_OFF
+ |MCDRV_D2SRC_ADC1_ON
+ |MCDRV_D2SRC_ADC1_OFF
+ |MCDRV_D2SRC_PDM0_L_ON
+ |MCDRV_D2SRC_PDM0_L_OFF
+ |MCDRV_D2SRC_PDM0_R_ON
+ |MCDRV_D2SRC_PDM0_R_OFF
+ |MCDRV_D2SRC_PDM1_L_ON
+ |MCDRV_D2SRC_PDM1_L_OFF
+ |MCDRV_D2SRC_PDM1_R_ON
+ |MCDRV_D2SRC_PDM1_R_OFF);
+
+ for (bCh = 0; bCh < ADIF1_PATH_CHANNELS; bCh++)
+ psPathInfo->asAdif1[bCh].dSrcOnOff &=
+ (MCDRV_D2SRC_ADC0_L_ON
+ |MCDRV_D2SRC_ADC0_L_OFF
+ |MCDRV_D2SRC_ADC0_R_ON
+ |MCDRV_D2SRC_ADC0_R_OFF
+ |MCDRV_D2SRC_ADC1_ON
+ |MCDRV_D2SRC_ADC1_OFF
+ |MCDRV_D2SRC_PDM0_L_ON
+ |MCDRV_D2SRC_PDM0_L_OFF
+ |MCDRV_D2SRC_PDM0_R_ON
+ |MCDRV_D2SRC_PDM0_R_OFF
+ |MCDRV_D2SRC_PDM1_L_ON
+ |MCDRV_D2SRC_PDM1_L_OFF
+ |MCDRV_D2SRC_PDM1_R_ON
+ |MCDRV_D2SRC_PDM1_R_OFF);
+
+ for (bCh = 0; bCh < ADIF2_PATH_CHANNELS; bCh++)
+ psPathInfo->asAdif2[bCh].dSrcOnOff &=
+ (MCDRV_D2SRC_ADC0_L_ON
+ |MCDRV_D2SRC_ADC0_L_OFF
+ |MCDRV_D2SRC_ADC0_R_ON
+ |MCDRV_D2SRC_ADC0_R_OFF
+ |MCDRV_D2SRC_ADC1_ON
+ |MCDRV_D2SRC_ADC1_OFF
+ |MCDRV_D2SRC_PDM0_L_ON
+ |MCDRV_D2SRC_PDM0_L_OFF
+ |MCDRV_D2SRC_PDM0_R_ON
+ |MCDRV_D2SRC_PDM0_R_OFF
+ |MCDRV_D2SRC_PDM1_L_ON
+ |MCDRV_D2SRC_PDM1_L_OFF
+ |MCDRV_D2SRC_PDM1_R_ON
+ |MCDRV_D2SRC_PDM1_R_OFF
+ |MCDRV_D2SRC_DAC0REF_ON
+ |MCDRV_D2SRC_DAC0REF_OFF
+ |MCDRV_D2SRC_DAC1REF_ON
+ |MCDRV_D2SRC_DAC1REF_OFF);
+
+ psPathInfo->asAdc0[0].dSrcOnOff &=
+ ~(MCDRV_ASRC_DAC0_L_ON|MCDRV_ASRC_DAC0_R_ON
+ |MCDRV_ASRC_DAC1_L_ON|MCDRV_ASRC_DAC1_R_ON
+ |MCDRV_ASRC_LINEIN1_R_ON);
+ psPathInfo->asAdc0[1].dSrcOnOff &=
+ ~(MCDRV_ASRC_DAC0_L_ON|MCDRV_ASRC_DAC0_R_ON
+ |MCDRV_ASRC_DAC1_L_ON|MCDRV_ASRC_DAC1_R_ON
+ |MCDRV_ASRC_LINEIN1_L_ON);
+
+ for (bCh = 0; bCh < ADC1_PATH_CHANNELS; bCh++)
+ psPathInfo->asAdc1[bCh].dSrcOnOff &=
+ ~(MCDRV_ASRC_DAC0_L_ON|MCDRV_ASRC_DAC0_R_ON
+ |MCDRV_ASRC_DAC1_L_ON|MCDRV_ASRC_DAC1_R_ON
+ |MCDRV_ASRC_LINEIN1_L_ON|MCDRV_ASRC_LINEIN1_R_ON);
+
+ psPathInfo->asSp[0].dSrcOnOff &=
+ (MCDRV_ASRC_DAC1_L_ON
+ |MCDRV_ASRC_DAC1_L_OFF);
+ psPathInfo->asSp[1].dSrcOnOff &=
+ (MCDRV_ASRC_DAC1_R_ON
+ |MCDRV_ASRC_DAC1_R_OFF);
+
+ psPathInfo->asHp[0].dSrcOnOff &=
+ (MCDRV_ASRC_DAC0_L_ON
+ |MCDRV_ASRC_DAC0_L_OFF);
+ psPathInfo->asHp[1].dSrcOnOff &=
+ (MCDRV_ASRC_DAC0_R_ON
+ |MCDRV_ASRC_DAC0_R_OFF);
+
+ psPathInfo->asRc[0].dSrcOnOff &=
+ (MCDRV_ASRC_DAC0_L_ON
+ |MCDRV_ASRC_DAC0_L_OFF);
+
+ psPathInfo->asLout1[0].dSrcOnOff &=
+ (MCDRV_ASRC_DAC0_L_ON
+ |MCDRV_ASRC_DAC0_L_OFF);
+ psPathInfo->asLout1[1].dSrcOnOff &=
+ (MCDRV_ASRC_DAC0_R_ON
+ |MCDRV_ASRC_DAC0_R_OFF);
+
+ psPathInfo->asLout2[0].dSrcOnOff &=
+ (MCDRV_ASRC_DAC1_L_ON
+ |MCDRV_ASRC_DAC1_L_OFF);
+ psPathInfo->asLout2[1].dSrcOnOff &=
+ (MCDRV_ASRC_DAC1_R_ON
+ |MCDRV_ASRC_DAC1_R_OFF);
+
+ psPathInfo->asBias[0].dSrcOnOff &=
+ (MCDRV_ASRC_MIC1_ON
+ |MCDRV_ASRC_MIC1_OFF);
+ psPathInfo->asBias[1].dSrcOnOff &=
+ (MCDRV_ASRC_MIC2_ON
+ |MCDRV_ASRC_MIC2_OFF);
+ psPathInfo->asBias[2].dSrcOnOff &=
+ (MCDRV_ASRC_MIC3_ON
+ |MCDRV_ASRC_MIC3_OFF);
+ psPathInfo->asBias[3].dSrcOnOff &=
+ (MCDRV_ASRC_MIC4_ON
+ |MCDRV_ASRC_MIC4_OFF);
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ McDebugLog_FuncOut("MaskIrregularPath", NULL);
+#endif
+}
+
+/****************************************************************************
+ * IsValidDioParam
+ *
+ * Description:
+ * validate digital IO parameters.
+ * Arguments:
+ * psDioInfo digital IO information
+ * dUpdateInfo update information
+ * Return:
+ * 0:Invalid
+ * other:Valid
+ *
+ ****************************************************************************/
+static UINT8 IsValidDioParam
+(
+ const struct MCDRV_DIO_INFO *psDioInfo,
+ UINT32 dUpdateInfo
+)
+{
+ UINT8 bRet = 1;
+ struct MCDRV_DIO_INFO sDioInfo;
+ UINT8 bRegVal;
+ UINT8 bLPR0_start = 0,
+ bLPT0_start = 0,
+ bLPR1_start = 0,
+ bLPT1_start = 0,
+ bLPR2_start = 0,
+ bLPT2_start = 0,
+ bLPR3_start = 0,
+ bLPT3_start = 0;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet = MCDRV_SUCCESS;
+ McDebugLog_FuncIn("IsValidDioParam");
+#endif
+
+
+ McResCtrl_GetDioInfo(&sDioInfo);
+
+ bRegVal = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MB, MCI_LP0_START);
+ if ((bRegVal & MCB_LPR0_START) != 0) {
+ ;
+ bLPR0_start = 1;
+ }
+ if ((bRegVal & MCB_LPT0_START) != 0) {
+ ;
+ bLPT0_start = 1;
+ }
+ bRegVal = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MB, MCI_LP1_START);
+ if ((bRegVal & MCB_LPR1_START) != 0) {
+ ;
+ bLPR1_start = 1;
+ }
+ if ((bRegVal & MCB_LPT1_START) != 0) {
+ ;
+ bLPT1_start = 1;
+ }
+ bRegVal = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MB, MCI_LP2_START);
+ if ((bRegVal & MCB_LPR2_START) != 0) {
+ ;
+ bLPR2_start = 1;
+ }
+ if ((bRegVal & MCB_LPT2_START) != 0) {
+ ;
+ bLPT2_start = 1;
+ }
+ bRegVal = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MB, MCI_LP3_START);
+ if ((bRegVal & MCB_LPR3_START) != 0) {
+ ;
+ bLPR3_start = 1;
+ }
+ if ((bRegVal & MCB_LPT3_START) != 0) {
+ ;
+ bLPT3_start = 1;
+ }
+
+ if (((dUpdateInfo & MCDRV_MUSIC_COM_UPDATE_FLAG) != 0UL)
+ || ((dUpdateInfo & MCDRV_MUSIC_DIR_UPDATE_FLAG) != 0UL)) {
+ if (bLPR0_start != 0) {
+ ;
+ bRet = 0;
+ }
+ }
+ if (((dUpdateInfo & MCDRV_MUSIC_COM_UPDATE_FLAG) != 0UL)
+ || ((dUpdateInfo & MCDRV_MUSIC_DIT_UPDATE_FLAG) != 0UL)) {
+ if (bLPT0_start != 0) {
+ ;
+ bRet = 0;
+ }
+ }
+ if (((dUpdateInfo & MCDRV_EXT_COM_UPDATE_FLAG) != 0UL)
+ || ((dUpdateInfo & MCDRV_EXT_DIR_UPDATE_FLAG) != 0UL)) {
+ if (bLPR1_start != 0) {
+ ;
+ bRet = 0;
+ }
+ }
+ if (((dUpdateInfo & MCDRV_EXT_COM_UPDATE_FLAG) != 0UL)
+ || ((dUpdateInfo & MCDRV_EXT_DIT_UPDATE_FLAG) != 0UL)) {
+ if (bLPT1_start != 0) {
+ ;
+ bRet = 0;
+ }
+ }
+ if (((dUpdateInfo & MCDRV_VOICE_COM_UPDATE_FLAG) != 0UL)
+ || ((dUpdateInfo & MCDRV_VOICE_DIR_UPDATE_FLAG) != 0UL)) {
+ if (bLPR2_start != 0) {
+ ;
+ bRet = 0;
+ }
+ }
+ if (((dUpdateInfo & MCDRV_VOICE_COM_UPDATE_FLAG) != 0UL)
+ || ((dUpdateInfo & MCDRV_VOICE_DIT_UPDATE_FLAG) != 0UL)) {
+ if (bLPT2_start != 0) {
+ ;
+ bRet = 0;
+ }
+ }
+ if (((dUpdateInfo & MCDRV_HIFI_COM_UPDATE_FLAG) != 0UL)
+ || ((dUpdateInfo & MCDRV_HIFI_DIR_UPDATE_FLAG) != 0UL)) {
+ if (bLPR3_start != 0) {
+ ;
+ bRet = 0;
+ }
+ }
+ if (((dUpdateInfo & MCDRV_HIFI_COM_UPDATE_FLAG) != 0UL)
+ || ((dUpdateInfo & MCDRV_HIFI_DIT_UPDATE_FLAG) != 0UL)) {
+ if (bLPT3_start != 0) {
+ ;
+ bRet = 0;
+ }
+ }
+
+
+ if ((bRet != 0)
+ && ((dUpdateInfo & MCDRV_MUSIC_COM_UPDATE_FLAG) != 0UL)) {
+ bRet = CheckDIOCommon(psDioInfo, 0);
+ if (bRet != 0) {
+ ;
+ sDioInfo.asPortInfo[0].sDioCommon.bInterface =
+ psDioInfo->asPortInfo[0].sDioCommon.bInterface;
+ }
+ }
+ if ((bRet != 0)
+ && ((dUpdateInfo & MCDRV_EXT_COM_UPDATE_FLAG) != 0UL)) {
+ bRet = CheckDIOCommon(psDioInfo, 1);
+ if (bRet != 0) {
+ ;
+ sDioInfo.asPortInfo[1].sDioCommon.bInterface =
+ psDioInfo->asPortInfo[1].sDioCommon.bInterface;
+ }
+ }
+ if ((bRet != 0)
+ && ((dUpdateInfo & MCDRV_VOICE_COM_UPDATE_FLAG) != 0UL)) {
+ bRet = CheckDIOCommon(psDioInfo, 2);
+ if (bRet != 0) {
+ ;
+ sDioInfo.asPortInfo[2].sDioCommon.bInterface =
+ psDioInfo->asPortInfo[2].sDioCommon.bInterface;
+ }
+ }
+ if ((bRet != 0)
+ && ((dUpdateInfo & MCDRV_HIFI_COM_UPDATE_FLAG) != 0UL)) {
+ bRet = CheckDIOCommon(psDioInfo, 3);
+ if (bRet != 0) {
+ ;
+ sDioInfo.asPortInfo[3].sDioCommon.bInterface =
+ psDioInfo->asPortInfo[3].sDioCommon.bInterface;
+ }
+ }
+
+ if ((bRet != 0)
+ && ((dUpdateInfo & MCDRV_MUSIC_DIR_UPDATE_FLAG) != 0UL)) {
+ ;
+ bRet = CheckDIODIR(psDioInfo, 0);
+ }
+ if ((bRet != 0)
+ && ((dUpdateInfo & MCDRV_EXT_DIR_UPDATE_FLAG) != 0UL)) {
+ ;
+ bRet = CheckDIODIR(psDioInfo, 1);
+ }
+ if ((bRet != 0)
+ && ((dUpdateInfo & MCDRV_VOICE_DIR_UPDATE_FLAG) != 0UL)) {
+ ;
+ bRet = CheckDIODIR(psDioInfo, 2);
+ }
+
+ if ((bRet != 0)
+ && ((dUpdateInfo & MCDRV_MUSIC_DIT_UPDATE_FLAG) != 0UL)) {
+ ;
+ bRet = CheckDIODIT(psDioInfo, 0);
+ }
+ if ((bRet != 0)
+ && ((dUpdateInfo & MCDRV_EXT_DIT_UPDATE_FLAG) != 0UL)) {
+ ;
+ bRet = CheckDIODIT(psDioInfo, 1);
+ }
+ if ((bRet != 0)
+ && ((dUpdateInfo & MCDRV_VOICE_DIT_UPDATE_FLAG) != 0UL)) {
+ ;
+ bRet = CheckDIODIT(psDioInfo, 2);
+ }
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsValidDioParam", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * IsValidDioPathParam
+ *
+ * Description:
+ * validate digital IO path parameters.
+ * Arguments:
+ * psDioPathInfo digital IO path information
+ * dUpdateInfo update information
+ * Return:
+ * 0:Invalid
+ * other:Valid
+ *
+ ****************************************************************************/
+static UINT8 IsValidDioPathParam
+(
+ const struct MCDRV_DIOPATH_INFO *psDioPathInfo,
+ UINT32 dUpdateInfo
+)
+{
+ UINT8 bRet = 1;
+ UINT8 bRegVal;
+ struct MCDRV_DIOPATH_INFO sDioPathInfo;
+ UINT8 bLP0_start = 0,
+ bLP1_start = 0,
+ bLP2_start = 0,
+ bLP3_start = 0;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet = MCDRV_SUCCESS;
+ McDebugLog_FuncIn("IsValidDioPathParam");
+#endif
+
+
+ bRegVal = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MB, MCI_LP0_START);
+ if ((bRegVal & MCB_LPR0_START) != 0)
+ bLP0_start = 1;
+ else if ((bRegVal & MCB_LPT0_START) != 0)
+ bLP0_start = 1;
+
+ bRegVal = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MB, MCI_LP1_START);
+ if ((bRegVal & MCB_LPR1_START) != 0)
+ bLP1_start = 1;
+ else if ((bRegVal & MCB_LPT1_START) != 0)
+ bLP1_start = 1;
+
+ bRegVal = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MB, MCI_LP2_START);
+ if ((bRegVal & MCB_LPR2_START) != 0)
+ bLP2_start = 1;
+ else if ((bRegVal & MCB_LPT2_START) != 0)
+ bLP2_start = 1;
+
+ bRegVal = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MB, MCI_LP3_START);
+ if ((bRegVal & MCB_LPR3_START) != 0)
+ bLP3_start = 1;
+ else if ((bRegVal & MCB_LPT3_START) != 0)
+ bLP3_start = 1;
+
+ McResCtrl_GetDioPathInfo(&sDioPathInfo);
+
+ if ((dUpdateInfo & MCDRV_MUSICNUM_UPDATE_FLAG) != 0UL) {
+ if ((psDioPathInfo->bMusicCh != MCDRV_MUSIC_2CH)
+ && (psDioPathInfo->bMusicCh != MCDRV_MUSIC_4CH)
+ && (psDioPathInfo->bMusicCh != MCDRV_MUSIC_6CH)) {
+ bRet = 0;
+ goto exit;
+ } else if (psDioPathInfo->bMusicCh != sDioPathInfo.bMusicCh) {
+ if ((psDioPathInfo->bMusicCh == MCDRV_MUSIC_6CH)
+ || (sDioPathInfo.bMusicCh == MCDRV_MUSIC_6CH)) {
+ if (bLP2_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+ } else {
+ if (bLP0_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+#if 0
+ if (bLP1_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+#endif
+ }
+ }
+ }
+ if ((dUpdateInfo & MCDRV_PHYS0_UPDATE_FLAG) != 0UL) {
+ if ((psDioPathInfo->abPhysPort[0] != MCDRV_PHYSPORT_DIO0)
+ && (psDioPathInfo->abPhysPort[0] != MCDRV_PHYSPORT_DIO1)
+ && (psDioPathInfo->abPhysPort[0] != MCDRV_PHYSPORT_DIO2)
+ && (psDioPathInfo->abPhysPort[0] != MCDRV_PHYSPORT_NONE)
+ && (psDioPathInfo->abPhysPort[0] != MCDRV_PHYSPORT_SLIM0)
+ && (psDioPathInfo->abPhysPort[0] != MCDRV_PHYSPORT_SLIM1)
+ && (psDioPathInfo->abPhysPort[0] != MCDRV_PHYSPORT_SLIM2)) {
+ bRet = 0;
+ goto exit;
+ } else if (psDioPathInfo->abPhysPort[0] !=
+ sDioPathInfo.abPhysPort[0]) {
+ if (bLP0_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+ }
+ }
+ if ((dUpdateInfo & MCDRV_PHYS1_UPDATE_FLAG) != 0UL) {
+ if ((psDioPathInfo->abPhysPort[1] != MCDRV_PHYSPORT_DIO0)
+ && (psDioPathInfo->abPhysPort[1] != MCDRV_PHYSPORT_DIO1)
+ && (psDioPathInfo->abPhysPort[1] != MCDRV_PHYSPORT_DIO2)
+ && (psDioPathInfo->abPhysPort[1] != MCDRV_PHYSPORT_NONE)
+ && (psDioPathInfo->abPhysPort[1] != MCDRV_PHYSPORT_SLIM0)
+ && (psDioPathInfo->abPhysPort[1] != MCDRV_PHYSPORT_SLIM1)
+ && (psDioPathInfo->abPhysPort[1] != MCDRV_PHYSPORT_SLIM2)) {
+ bRet = 0;
+ goto exit;
+ } else if (psDioPathInfo->abPhysPort[1] !=
+ sDioPathInfo.abPhysPort[1]) {
+ if (bLP1_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+ }
+ }
+ if ((dUpdateInfo & MCDRV_PHYS2_UPDATE_FLAG) != 0UL) {
+ if ((psDioPathInfo->abPhysPort[2] != MCDRV_PHYSPORT_DIO0)
+ && (psDioPathInfo->abPhysPort[2] != MCDRV_PHYSPORT_DIO1)
+ && (psDioPathInfo->abPhysPort[2] != MCDRV_PHYSPORT_DIO2)
+ && (psDioPathInfo->abPhysPort[2] != MCDRV_PHYSPORT_NONE)
+ && (psDioPathInfo->abPhysPort[2] != MCDRV_PHYSPORT_SLIM0)
+ && (psDioPathInfo->abPhysPort[2] != MCDRV_PHYSPORT_SLIM1)
+ && (psDioPathInfo->abPhysPort[2] != MCDRV_PHYSPORT_SLIM2)) {
+ bRet = 0;
+ goto exit;
+ } else if (psDioPathInfo->abPhysPort[2] !=
+ sDioPathInfo.abPhysPort[2]) {
+ if (bLP2_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+ }
+ }
+
+ if ((dUpdateInfo & MCDRV_PHYS3_UPDATE_FLAG) != 0UL) {
+ if ((psDioPathInfo->abPhysPort[3] != MCDRV_PHYSPORT_DIO0)
+ && (psDioPathInfo->abPhysPort[3] != MCDRV_PHYSPORT_DIO1)
+ && (psDioPathInfo->abPhysPort[3] != MCDRV_PHYSPORT_DIO2)
+ && (psDioPathInfo->abPhysPort[3] != MCDRV_PHYSPORT_NONE)
+ && (psDioPathInfo->abPhysPort[3] != MCDRV_PHYSPORT_SLIM0)
+ && (psDioPathInfo->abPhysPort[3] != MCDRV_PHYSPORT_SLIM1)
+ && (psDioPathInfo->abPhysPort[3] != MCDRV_PHYSPORT_SLIM2)) {
+ bRet = 0;
+ goto exit;
+ } else if (psDioPathInfo->abPhysPort[3] !=
+ sDioPathInfo.abPhysPort[3]) {
+ if (bLP3_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+ }
+ }
+ if ((dUpdateInfo & MCDRV_DIR0SLOT_UPDATE_FLAG) != 0UL) {
+ if ((psDioPathInfo->abMusicRSlot[0] != 0)
+ && (psDioPathInfo->abMusicRSlot[0] != 1)
+ && (psDioPathInfo->abMusicRSlot[0] != 2)
+ && (psDioPathInfo->abMusicRSlot[0] != 3)) {
+ bRet = 0;
+ goto exit;
+ } else if (psDioPathInfo->abMusicRSlot[0] !=
+ sDioPathInfo.abMusicRSlot[0]) {
+ if (bLP0_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+ }
+ }
+ if ((dUpdateInfo & MCDRV_DIR1SLOT_UPDATE_FLAG) != 0UL) {
+ if ((psDioPathInfo->abMusicRSlot[1] != 0)
+ && (psDioPathInfo->abMusicRSlot[1] != 1)
+ && (psDioPathInfo->abMusicRSlot[1] != 2)
+ && (psDioPathInfo->abMusicRSlot[1] != 3)) {
+ bRet = 0;
+ } else if (psDioPathInfo->abMusicRSlot[1] !=
+ sDioPathInfo.abMusicRSlot[1]) {
+ if (bLP0_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+ /*if (bLP1_start != 0) {
+ bRet = 0;
+ }*/
+ }
+ }
+ if ((dUpdateInfo & MCDRV_DIR2SLOT_UPDATE_FLAG) != 0UL) {
+ if ((psDioPathInfo->abMusicRSlot[2] != 0)
+ && (psDioPathInfo->abMusicRSlot[2] != 1)
+ && (psDioPathInfo->abMusicRSlot[2] != 2)
+ && (psDioPathInfo->abMusicRSlot[2] != 3)) {
+ bRet = 0;
+ } else if (psDioPathInfo->abMusicRSlot[2] !=
+ sDioPathInfo.abMusicRSlot[2]) {
+ if (bLP0_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+ /*if (bLP2_start != 0) {
+ bRet = 0;
+ }*/
+ }
+ }
+
+ if ((dUpdateInfo & MCDRV_DIT0SLOT_UPDATE_FLAG) != 0UL) {
+ if ((psDioPathInfo->abMusicTSlot[0] != 0)
+ && (psDioPathInfo->abMusicTSlot[0] != 1)
+ && (psDioPathInfo->abMusicTSlot[0] != 2)
+ && (psDioPathInfo->abMusicTSlot[0] != 3)) {
+ bRet = 0;
+ } else if (psDioPathInfo->abMusicTSlot[0] !=
+ sDioPathInfo.abMusicTSlot[0]) {
+ if (bLP0_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+ /*if (bLP0_start != 0) {
+ bRet = 0;
+ }*/
+ }
+ }
+ if ((dUpdateInfo & MCDRV_DIT1SLOT_UPDATE_FLAG) != 0UL) {
+ if ((psDioPathInfo->abMusicTSlot[1] != 0)
+ && (psDioPathInfo->abMusicTSlot[1] != 1)
+ && (psDioPathInfo->abMusicTSlot[1] != 2)
+ && (psDioPathInfo->abMusicTSlot[1] != 3)) {
+ bRet = 0;
+ } else if (psDioPathInfo->abMusicTSlot[1] !=
+ sDioPathInfo.abMusicTSlot[1]) {
+ if (bLP0_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+ /*if (bLP1_start != 0) {
+ bRet = 0;
+ }*/
+ }
+ }
+ if ((dUpdateInfo & MCDRV_DIT2SLOT_UPDATE_FLAG) != 0UL) {
+ if ((psDioPathInfo->abMusicTSlot[2] != 0)
+ && (psDioPathInfo->abMusicTSlot[2] != 1)
+ && (psDioPathInfo->abMusicTSlot[2] != 2)
+ && (psDioPathInfo->abMusicTSlot[2] != 3)) {
+ bRet = 0;
+ } else if (psDioPathInfo->abMusicTSlot[2] !=
+ sDioPathInfo.abMusicTSlot[2]) {
+ if (bLP0_start != 0) {
+ bRet = 0;
+ goto exit;
+ }
+ /*if (bLP2_start != 0) {
+ bRet = 0;
+ }*/
+ }
+ }
+
+exit:
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsValidDioPathParam", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * IsValidSwapParam
+ *
+ * Description:
+ * check Swap parameters.
+ * Arguments:
+ * psSwapInfo Swap information
+ * dUpdateInfo update information
+ * Return:
+ * 0:Invalid
+ * other:Valid
+ *
+ ****************************************************************************/
+static UINT8 IsValidSwapParam
+(
+ const struct MCDRV_SWAP_INFO *psSwapInfo,
+ UINT32 dUpdateInfo
+)
+{
+ UINT8 bRet = 1;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("IsValidSwapParam");
+#endif
+
+
+ if ((dUpdateInfo & MCDRV_SWAP_ADIF0_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bAdif0 != MCDRV_SWAP_NORMAL)
+ && (psSwapInfo->bAdif0 != MCDRV_SWAP_SWAP)
+ && (psSwapInfo->bAdif0 != MCDRV_SWAP_MUTE)
+ && (psSwapInfo->bAdif0 != MCDRV_SWAP_CENTER)
+ && (psSwapInfo->bAdif0 != MCDRV_SWAP_MIX)
+ && (psSwapInfo->bAdif0 != MCDRV_SWAP_MONOMIX)
+ && (psSwapInfo->bAdif0 != MCDRV_SWAP_BOTHL)
+ && (psSwapInfo->bAdif0 != MCDRV_SWAP_BOTHR))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_ADIF1_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bAdif1 != MCDRV_SWAP_NORMAL)
+ && (psSwapInfo->bAdif1 != MCDRV_SWAP_SWAP)
+ && (psSwapInfo->bAdif1 != MCDRV_SWAP_MUTE)
+ && (psSwapInfo->bAdif1 != MCDRV_SWAP_CENTER)
+ && (psSwapInfo->bAdif1 != MCDRV_SWAP_MIX)
+ && (psSwapInfo->bAdif1 != MCDRV_SWAP_MONOMIX)
+ && (psSwapInfo->bAdif1 != MCDRV_SWAP_BOTHL)
+ && (psSwapInfo->bAdif1 != MCDRV_SWAP_BOTHR))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_ADIF2_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bAdif2 != MCDRV_SWAP_NORMAL)
+ && (psSwapInfo->bAdif2 != MCDRV_SWAP_SWAP)
+ && (psSwapInfo->bAdif2 != MCDRV_SWAP_MUTE)
+ && (psSwapInfo->bAdif2 != MCDRV_SWAP_CENTER)
+ && (psSwapInfo->bAdif2 != MCDRV_SWAP_MIX)
+ && (psSwapInfo->bAdif2 != MCDRV_SWAP_MONOMIX)
+ && (psSwapInfo->bAdif2 != MCDRV_SWAP_BOTHL)
+ && (psSwapInfo->bAdif2 != MCDRV_SWAP_BOTHR))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_DAC0_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bDac0 != MCDRV_SWAP_NORMAL)
+ && (psSwapInfo->bDac0 != MCDRV_SWAP_SWAP)
+ && (psSwapInfo->bDac0 != MCDRV_SWAP_MUTE)
+ && (psSwapInfo->bDac0 != MCDRV_SWAP_CENTER)
+ && (psSwapInfo->bDac0 != MCDRV_SWAP_MIX)
+ && (psSwapInfo->bDac0 != MCDRV_SWAP_MONOMIX)
+ && (psSwapInfo->bDac0 != MCDRV_SWAP_BOTHL)
+ && (psSwapInfo->bDac0 != MCDRV_SWAP_BOTHR))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_DAC1_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bDac1 != MCDRV_SWAP_NORMAL)
+ && (psSwapInfo->bDac1 != MCDRV_SWAP_SWAP)
+ && (psSwapInfo->bDac1 != MCDRV_SWAP_MUTE)
+ && (psSwapInfo->bDac1 != MCDRV_SWAP_CENTER)
+ && (psSwapInfo->bDac1 != MCDRV_SWAP_MIX)
+ && (psSwapInfo->bDac1 != MCDRV_SWAP_MONOMIX)
+ && (psSwapInfo->bDac1 != MCDRV_SWAP_BOTHL)
+ && (psSwapInfo->bDac1 != MCDRV_SWAP_BOTHR))
+ bRet = 0;
+ }
+
+ if ((dUpdateInfo & MCDRV_SWAP_MUSICIN0_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bMusicIn0 != MCDRV_SWSWAP_NORMAL)
+ && (psSwapInfo->bMusicIn0 != MCDRV_SWSWAP_BOTH1)
+ && (psSwapInfo->bMusicIn0 != MCDRV_SWSWAP_BOTH0)
+ && (psSwapInfo->bMusicIn0 != MCDRV_SWSWAP_SWAP))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_MUSICIN1_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bMusicIn1 != MCDRV_SWSWAP_NORMAL)
+ && (psSwapInfo->bMusicIn1 != MCDRV_SWSWAP_BOTH1)
+ && (psSwapInfo->bMusicIn1 != MCDRV_SWSWAP_BOTH0)
+ && (psSwapInfo->bMusicIn1 != MCDRV_SWSWAP_SWAP))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_MUSICIN2_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bMusicIn2 != MCDRV_SWSWAP_NORMAL)
+ && (psSwapInfo->bMusicIn2 != MCDRV_SWSWAP_BOTH1)
+ && (psSwapInfo->bMusicIn2 != MCDRV_SWSWAP_BOTH0)
+ && (psSwapInfo->bMusicIn2 != MCDRV_SWSWAP_SWAP))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_EXTIN_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bExtIn != MCDRV_SWSWAP_NORMAL)
+ && (psSwapInfo->bExtIn != MCDRV_SWSWAP_BOTH1)
+ && (psSwapInfo->bExtIn != MCDRV_SWSWAP_BOTH0)
+ && (psSwapInfo->bExtIn != MCDRV_SWSWAP_SWAP))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_VOICEIN_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bVoiceIn != MCDRV_SWSWAP_NORMAL)
+ && (psSwapInfo->bVoiceIn != MCDRV_SWSWAP_BOTH1)
+ && (psSwapInfo->bVoiceIn != MCDRV_SWSWAP_BOTH0)
+ && (psSwapInfo->bVoiceIn != MCDRV_SWSWAP_SWAP))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_HIFIIN_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bHifiIn != MCDRV_SWSWAP_NORMAL)
+ && (psSwapInfo->bHifiIn != MCDRV_SWSWAP_BOTH1)
+ && (psSwapInfo->bHifiIn != MCDRV_SWSWAP_BOTH0)
+ && (psSwapInfo->bHifiIn != MCDRV_SWSWAP_SWAP))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_MUSICOUT0_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bMusicOut0 != MCDRV_SWAP_NORMAL)
+ && (psSwapInfo->bMusicOut0 != MCDRV_SWAP_SWAP)
+ && (psSwapInfo->bMusicOut0 != MCDRV_SWAP_MUTE)
+ && (psSwapInfo->bMusicOut0 != MCDRV_SWAP_CENTER)
+ && (psSwapInfo->bMusicOut0 != MCDRV_SWAP_MIX)
+ && (psSwapInfo->bMusicOut0 != MCDRV_SWAP_MONOMIX)
+ && (psSwapInfo->bMusicOut0 != MCDRV_SWAP_BOTHL)
+ && (psSwapInfo->bMusicOut0 != MCDRV_SWAP_BOTHR))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_MUSICOUT1_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bMusicOut1 != MCDRV_SWSWAP_NORMAL)
+ && (psSwapInfo->bMusicOut1 != MCDRV_SWSWAP_BOTH1)
+ && (psSwapInfo->bMusicOut1 != MCDRV_SWSWAP_BOTH0)
+ && (psSwapInfo->bMusicOut1 != MCDRV_SWSWAP_SWAP))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_MUSICOUT2_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bMusicOut2 != MCDRV_SWSWAP_NORMAL)
+ && (psSwapInfo->bMusicOut2 != MCDRV_SWSWAP_BOTH1)
+ && (psSwapInfo->bMusicOut2 != MCDRV_SWSWAP_BOTH0)
+ && (psSwapInfo->bMusicOut2 != MCDRV_SWSWAP_SWAP))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_EXTOUT_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bExtOut != MCDRV_SWSWAP_NORMAL)
+ && (psSwapInfo->bExtOut != MCDRV_SWSWAP_BOTH1)
+ && (psSwapInfo->bExtOut != MCDRV_SWSWAP_BOTH0)
+ && (psSwapInfo->bExtOut != MCDRV_SWSWAP_SWAP))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_VOICEOUT_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bVoiceOut != MCDRV_SWSWAP_NORMAL)
+ && (psSwapInfo->bVoiceOut != MCDRV_SWSWAP_BOTH1)
+ && (psSwapInfo->bVoiceOut != MCDRV_SWSWAP_BOTH0)
+ && (psSwapInfo->bVoiceOut != MCDRV_SWSWAP_SWAP))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SWAP_HIFIOUT_UPDATE_FLAG) != 0UL) {
+ if ((psSwapInfo->bHifiOut != MCDRV_SWSWAP_NORMAL)
+ && (psSwapInfo->bHifiOut != MCDRV_SWSWAP_BOTH1)
+ && (psSwapInfo->bHifiOut != MCDRV_SWSWAP_BOTH0)
+ && (psSwapInfo->bHifiOut != MCDRV_SWSWAP_SWAP))
+ bRet = 0;
+ }
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsValidSwapParam", &sdRet);
+#endif
+
+ return bRet;
+}
+
+/****************************************************************************
+ * IsValidDspParam
+ *
+ * Description:
+ * validate DSP parameters.
+ * Arguments:
+ * psAECInfo AEC information
+ * Return:
+ * 0:Invalid
+ * other:Valid
+ *
+ ****************************************************************************/
+static UINT8 IsValidDspParam
+(
+ const struct MCDRV_AEC_INFO *psAECInfo
+)
+{
+ UINT8 bRet = 1;
+ UINT8 bBdspUsed = 0,
+ bCdspUsed = 0,
+ bFdspUsed = 0;
+ struct MCDRV_AEC_INFO sCurAECInfo;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("IsValidDspParam");
+#endif
+
+
+ McResCtrl_GetAecInfo(&sCurAECInfo);
+
+ if (McResCtrl_IsD1SrcUsed(MCDRV_D1SRC_AE0_ON
+ |MCDRV_D1SRC_AE1_ON
+ |MCDRV_D1SRC_AE2_ON
+ |MCDRV_D1SRC_AE3_ON) != 0) {
+ bBdspUsed = 1;
+ if (sCurAECInfo.sAecConfig.bFDspLocate == 0)
+ bFdspUsed = 1;
+ }
+ if ((McResCtrl_HasSrc(eMCDRV_DST_VBOXMIXIN, eMCDRV_DST_CH0) != 0)
+ || (McResCtrl_HasSrc(eMCDRV_DST_VBOXMIXIN, eMCDRV_DST_CH1) != 0)
+ || (McResCtrl_HasSrc(eMCDRV_DST_VBOXMIXIN, eMCDRV_DST_CH2) != 0)
+ || (McResCtrl_HasSrc(eMCDRV_DST_VBOXMIXIN, eMCDRV_DST_CH3) != 0)
+ || (McResCtrl_HasSrc(eMCDRV_DST_VBOXHOSTIN, eMCDRV_DST_CH0) != 0)) {
+ bCdspUsed = 1;
+ if (sCurAECInfo.sAecConfig.bFDspLocate == 1)
+ bFdspUsed = 1;
+ }
+
+ if ((bBdspUsed != 0)
+ || (bCdspUsed != 0)
+ || (bFdspUsed != 0))
+ if (psAECInfo->sAecConfig.bFDspLocate != 0xFF)
+ if (sCurAECInfo.sAecConfig.bFDspLocate !=
+ psAECInfo->sAecConfig.bFDspLocate) {
+ bRet = 0;
+ goto exit;
+ }
+
+ if ((bBdspUsed != 0)
+ || (bFdspUsed != 0))
+ if (psAECInfo->sAecAudioengine.bEnable != 0) {
+ if ((psAECInfo->sAecAudioengine.bBDspAE0Src != 2)
+ && (psAECInfo->sAecAudioengine.bBDspAE0Src !=
+ sCurAECInfo.sAecAudioengine.bBDspAE0Src)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecAudioengine.bBDspAE1Src != 2)
+ && (psAECInfo->sAecAudioengine.bBDspAE1Src !=
+ sCurAECInfo.sAecAudioengine.bBDspAE1Src)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecAudioengine.bMixerIn0Src != 2)
+ && (psAECInfo->sAecAudioengine.bMixerIn0Src !=
+ sCurAECInfo.sAecAudioengine.bMixerIn0Src)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecAudioengine.bMixerIn1Src != 2)
+ && (psAECInfo->sAecAudioengine.bMixerIn1Src !=
+ sCurAECInfo.sAecAudioengine.bMixerIn1Src)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecAudioengine.bMixerIn2Src != 2)
+ && (psAECInfo->sAecAudioengine.bMixerIn2Src !=
+ sCurAECInfo.sAecAudioengine.bMixerIn2Src)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecAudioengine.bMixerIn3Src != 2)
+ && (psAECInfo->sAecAudioengine.bMixerIn3Src !=
+ sCurAECInfo.sAecAudioengine.bMixerIn3Src)) {
+ bRet = 0;
+ goto exit;
+ }
+ }
+
+ if ((bCdspUsed != 0)
+ || (bFdspUsed != 0))
+ if (psAECInfo->sAecVBox.bEnable != 0) {
+ if ((psAECInfo->sAecVBox.bFdsp_Po_Source != 0xFF)
+ && (psAECInfo->sAecVBox.bFdsp_Po_Source !=
+ sCurAECInfo.sAecVBox.bFdsp_Po_Source)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecVBox.bISrc2_VSource != 0xFF)
+ && (psAECInfo->sAecVBox.bISrc2_VSource !=
+ sCurAECInfo.sAecVBox.bISrc2_VSource)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecVBox.bISrc2_Ch1_VSource != 0xFF)
+ && (psAECInfo->sAecVBox.bISrc2_Ch1_VSource !=
+ sCurAECInfo.sAecVBox.bISrc2_Ch1_VSource)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecVBox.bISrc3_VSource != 0xFF)
+ && (psAECInfo->sAecVBox.bISrc3_VSource !=
+ sCurAECInfo.sAecVBox.bISrc3_VSource)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecVBox.bLPt2_VSource != 0xFF)
+ && (psAECInfo->sAecVBox.bLPt2_VSource !=
+ sCurAECInfo.sAecVBox.bLPt2_VSource)) {
+ bRet = 0;
+ goto exit;
+ }
+ }
+
+ if (bCdspUsed != 0)
+ if (psAECInfo->sAecVBox.bEnable != 0) {
+ if ((psAECInfo->sAecVBox.bSrc3_Ctrl != 0xFF)
+ && (psAECInfo->sAecVBox.bSrc3_Ctrl !=
+ sCurAECInfo.sAecVBox.bSrc3_Ctrl)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecVBox.bSrc2_Fs != 0xFF)
+ && (psAECInfo->sAecVBox.bSrc2_Fs !=
+ sCurAECInfo.sAecVBox.bSrc2_Fs)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecVBox.bSrc2_Thru != 0xFF)
+ && (psAECInfo->sAecVBox.bSrc2_Thru !=
+ sCurAECInfo.sAecVBox.bSrc2_Thru)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecVBox.bSrc3_Fs != 0xFF)
+ && (psAECInfo->sAecVBox.bSrc3_Fs !=
+ sCurAECInfo.sAecVBox.bSrc3_Fs)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sAecVBox.bSrc3_Thru != 0xFF)
+ && (psAECInfo->sAecVBox.bSrc3_Thru !=
+ sCurAECInfo.sAecVBox.bSrc3_Thru)) {
+ bRet = 0;
+ goto exit;
+ }
+ }
+
+ if (psAECInfo->sControl.bCommand == 1) {
+ if ((psAECInfo->sControl.bParam[0] != 0)
+ && (psAECInfo->sControl.bParam[0] != 1)) {
+ bRet = 0;
+ goto exit;
+ }
+ } else if (psAECInfo->sControl.bCommand == 2) {
+ if ((psAECInfo->sControl.bParam[0] != 0)
+ && (psAECInfo->sControl.bParam[0] != 1)) {
+ bRet = 0;
+ goto exit;
+ }
+ } else if (psAECInfo->sControl.bCommand == 3) {
+ if ((psAECInfo->sControl.bParam[0] != 0)
+ && (psAECInfo->sControl.bParam[0] != 1)
+ && (psAECInfo->sControl.bParam[0] != 2)) {
+ bRet = 0;
+ goto exit;
+ }
+ } else if (psAECInfo->sControl.bCommand == 4) {
+ if ((psAECInfo->sControl.bParam[0] != 0)
+ && (psAECInfo->sControl.bParam[0] != 1)
+ && (psAECInfo->sControl.bParam[0] != 3)) {
+ bRet = 0;
+ goto exit;
+ }
+ } else if (psAECInfo->sControl.bCommand == 5) {
+ if ((psAECInfo->sControl.bParam[0] > 6)
+ && (psAECInfo->sControl.bParam[0] < 0xFF)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psAECInfo->sControl.bParam[1] > 3)
+ && (psAECInfo->sControl.bParam[1] < 0xFF)) {
+ bRet = 0;
+ goto exit;
+ }
+ }
+
+exit:
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsValidDspParam", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * IsValidHSDetParam
+ *
+ * Description:
+ * validate HSDet parameters.
+ * Arguments:
+ * psHSDetInfo HSDet information
+ * psHSDet2Info HSDet2 information
+ * dUpdateInfo update information
+ * Return:
+ * 0:Invalid
+ * other:Valid
+ *
+ ****************************************************************************/
+static UINT8 IsValidHSDetParam
+(
+ const struct MCDRV_HSDET_INFO *psHSDetInfo,
+ const struct MCDRV_HSDET2_INFO *psHSDet2Info,
+ UINT32 dUpdateInfo
+)
+{
+ UINT8 bRet = 1;
+ struct MCDRV_HSDET_INFO sHSDetInfo;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("IsValidHSDetParam");
+#endif
+
+
+ McResCtrl_GetHSDet(&sHSDetInfo, NULL);
+
+ if ((dUpdateInfo & MCDRV_ENPLUGDET_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bEnPlugDet != MCDRV_PLUGDET_DISABLE)
+ && (psHSDetInfo->bEnPlugDet != MCDRV_PLUGDET_ENABLE))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_ENPLUGDET_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bEnPlugDetDb != MCDRV_PLUGDETDB_DISABLE)
+ && (psHSDetInfo->bEnPlugDetDb != MCDRV_PLUGDETDB_DET_ENABLE)
+ && (psHSDetInfo->bEnPlugDetDb != MCDRV_PLUGDETDB_UNDET_ENABLE)
+ && (psHSDetInfo->bEnPlugDetDb != MCDRV_PLUGDETDB_BOTH_ENABLE))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_ENDLYKEYOFF_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bEnDlyKeyOff != MCDRV_KEYEN_D_D_D)
+ && (psHSDetInfo->bEnDlyKeyOff != MCDRV_KEYEN_D_D_E)
+ && (psHSDetInfo->bEnDlyKeyOff != MCDRV_KEYEN_D_E_D)
+ && (psHSDetInfo->bEnDlyKeyOff != MCDRV_KEYEN_D_E_E)
+ && (psHSDetInfo->bEnDlyKeyOff != MCDRV_KEYEN_E_D_D)
+ && (psHSDetInfo->bEnDlyKeyOff != MCDRV_KEYEN_E_D_E)
+ && (psHSDetInfo->bEnDlyKeyOff != MCDRV_KEYEN_E_E_D)
+ && (psHSDetInfo->bEnDlyKeyOff != MCDRV_KEYEN_E_E_E))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_ENDLYKEYON_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bEnDlyKeyOn != MCDRV_KEYEN_D_D_D)
+ && (psHSDetInfo->bEnDlyKeyOn != MCDRV_KEYEN_D_D_E)
+ && (psHSDetInfo->bEnDlyKeyOn != MCDRV_KEYEN_D_E_D)
+ && (psHSDetInfo->bEnDlyKeyOn != MCDRV_KEYEN_D_E_E)
+ && (psHSDetInfo->bEnDlyKeyOn != MCDRV_KEYEN_E_D_D)
+ && (psHSDetInfo->bEnDlyKeyOn != MCDRV_KEYEN_E_D_E)
+ && (psHSDetInfo->bEnDlyKeyOn != MCDRV_KEYEN_E_E_D)
+ && (psHSDetInfo->bEnDlyKeyOn != MCDRV_KEYEN_E_E_E))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_ENMICDET_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bEnMicDet != MCDRV_MICDET_DISABLE)
+ && (psHSDetInfo->bEnMicDet != MCDRV_MICDET_ENABLE))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_ENKEYOFF_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bEnKeyOff != MCDRV_KEYEN_D_D_D)
+ && (psHSDetInfo->bEnKeyOff != MCDRV_KEYEN_D_D_E)
+ && (psHSDetInfo->bEnKeyOff != MCDRV_KEYEN_D_E_D)
+ && (psHSDetInfo->bEnKeyOff != MCDRV_KEYEN_D_E_E)
+ && (psHSDetInfo->bEnKeyOff != MCDRV_KEYEN_E_D_D)
+ && (psHSDetInfo->bEnKeyOff != MCDRV_KEYEN_E_D_E)
+ && (psHSDetInfo->bEnKeyOff != MCDRV_KEYEN_E_E_D)
+ && (psHSDetInfo->bEnKeyOff != MCDRV_KEYEN_E_E_E))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_ENKEYON_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bEnKeyOn != MCDRV_KEYEN_D_D_D)
+ && (psHSDetInfo->bEnKeyOn != MCDRV_KEYEN_D_D_E)
+ && (psHSDetInfo->bEnKeyOn != MCDRV_KEYEN_D_E_D)
+ && (psHSDetInfo->bEnKeyOn != MCDRV_KEYEN_D_E_E)
+ && (psHSDetInfo->bEnKeyOn != MCDRV_KEYEN_E_D_D)
+ && (psHSDetInfo->bEnKeyOn != MCDRV_KEYEN_E_D_E)
+ && (psHSDetInfo->bEnKeyOn != MCDRV_KEYEN_E_E_D)
+ && (psHSDetInfo->bEnKeyOn != MCDRV_KEYEN_E_E_E))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_HSDETDBNC_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bHsDetDbnc != MCDRV_DETDBNC_27)
+ && (psHSDetInfo->bHsDetDbnc != MCDRV_DETDBNC_55)
+ && (psHSDetInfo->bHsDetDbnc != MCDRV_DETDBNC_109)
+ && (psHSDetInfo->bHsDetDbnc != MCDRV_DETDBNC_219)
+ && (psHSDetInfo->bHsDetDbnc != MCDRV_DETDBNC_438)
+ && (psHSDetInfo->bHsDetDbnc != MCDRV_DETDBNC_875)
+ && (psHSDetInfo->bHsDetDbnc != MCDRV_DETDBNC_1313)
+ && (psHSDetInfo->bHsDetDbnc != MCDRV_DETDBNC_1750))
+ bRet = 0;
+ }
+
+ if ((dUpdateInfo & MCDRV_KEYOFFMTIM_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bKeyOffMtim == MCDRV_KEYOFF_MTIM_63)
+ || (psHSDetInfo->bKeyOffMtim == MCDRV_KEYOFF_MTIM_16))
+ sHSDetInfo.bKeyOffMtim = psHSDetInfo->bKeyOffMtim;
+ else
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_KEYONMTIM_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bKeyOnMtim == MCDRV_KEYON_MTIM_63)
+ || (psHSDetInfo->bKeyOnMtim == MCDRV_KEYON_MTIM_250))
+ sHSDetInfo.bKeyOnMtim = psHSDetInfo->bKeyOnMtim;
+ else
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_KEY0OFFDLYTIM_UPDATE_FLAG) != 0UL) {
+ if (psHSDetInfo->bKey0OffDlyTim > MC_DRV_KEYOFFDLYTIM_MAX)
+ bRet = 0;
+ else if (sHSDetInfo.bKeyOffMtim == MCDRV_KEYOFF_MTIM_63) {
+ if (psHSDetInfo->bKey0OffDlyTim == 1)
+ bRet = 0;
+ }
+ }
+ if ((dUpdateInfo & MCDRV_KEY1OFFDLYTIM_UPDATE_FLAG) != 0UL) {
+ if (psHSDetInfo->bKey1OffDlyTim > MC_DRV_KEYOFFDLYTIM_MAX)
+ bRet = 0;
+ else if (sHSDetInfo.bKeyOffMtim == MCDRV_KEYOFF_MTIM_63) {
+ if (psHSDetInfo->bKey1OffDlyTim == 1)
+ bRet = 0;
+ }
+ }
+ if ((dUpdateInfo & MCDRV_KEY2OFFDLYTIM_UPDATE_FLAG) != 0UL) {
+ if (psHSDetInfo->bKey2OffDlyTim > MC_DRV_KEYOFFDLYTIM_MAX)
+ bRet = 0;
+ else if (sHSDetInfo.bKeyOffMtim == MCDRV_KEYOFF_MTIM_63) {
+ if (psHSDetInfo->bKey2OffDlyTim == 1)
+ bRet = 0;
+ }
+ }
+ if ((dUpdateInfo & MCDRV_KEY0ONDLYTIM_UPDATE_FLAG) != 0UL) {
+ if (psHSDetInfo->bKey0OnDlyTim > MC_DRV_KEYONDLYTIM_MAX)
+ bRet = 0;
+ else if (sHSDetInfo.bKeyOnMtim == MCDRV_KEYON_MTIM_250) {
+ if ((psHSDetInfo->bKey0OnDlyTim == 1)
+ || (psHSDetInfo->bKey0OnDlyTim == 2)
+ || (psHSDetInfo->bKey0OnDlyTim == 3))
+ bRet = 0;
+ }
+ }
+ if ((dUpdateInfo & MCDRV_KEY1ONDLYTIM_UPDATE_FLAG) != 0UL) {
+ if (psHSDetInfo->bKey1OnDlyTim > MC_DRV_KEYONDLYTIM_MAX)
+ bRet = 0;
+ else if (sHSDetInfo.bKeyOnMtim == MCDRV_KEYON_MTIM_250) {
+ if ((psHSDetInfo->bKey1OnDlyTim == 1)
+ || (psHSDetInfo->bKey1OnDlyTim == 2)
+ || (psHSDetInfo->bKey1OnDlyTim == 3))
+ bRet = 0;
+ }
+ }
+ if ((dUpdateInfo & MCDRV_KEY2ONDLYTIM_UPDATE_FLAG) != 0UL) {
+ if (psHSDetInfo->bKey2OnDlyTim > MC_DRV_KEYONDLYTIM_MAX)
+ bRet = 0;
+ else if (sHSDetInfo.bKeyOnMtim == MCDRV_KEYON_MTIM_250) {
+ if ((psHSDetInfo->bKey2OnDlyTim == 1)
+ || (psHSDetInfo->bKey2OnDlyTim == 2)
+ || (psHSDetInfo->bKey2OnDlyTim == 3))
+ bRet = 0;
+ }
+ }
+ if ((dUpdateInfo & MCDRV_KEY0ONDLYTIM2_UPDATE_FLAG) != 0UL) {
+ if (psHSDetInfo->bKey0OnDlyTim2 > MC_DRV_KEYONDLYTIM2_MAX)
+ bRet = 0;
+ else if (sHSDetInfo.bKeyOnMtim == MCDRV_KEYON_MTIM_250) {
+ if ((psHSDetInfo->bKey0OnDlyTim2 == 1)
+ || (psHSDetInfo->bKey0OnDlyTim2 == 2)
+ || (psHSDetInfo->bKey0OnDlyTim2 == 3))
+ bRet = 0;
+ }
+ }
+ if ((dUpdateInfo & MCDRV_KEY1ONDLYTIM2_UPDATE_FLAG) != 0UL) {
+ if (psHSDetInfo->bKey1OnDlyTim2 > MC_DRV_KEYONDLYTIM2_MAX)
+ bRet = 0;
+ else if (sHSDetInfo.bKeyOnMtim == MCDRV_KEYON_MTIM_250) {
+ if ((psHSDetInfo->bKey1OnDlyTim2 == 1)
+ || (psHSDetInfo->bKey1OnDlyTim2 == 2)
+ || (psHSDetInfo->bKey1OnDlyTim2 == 3))
+ bRet = 0;
+ }
+ }
+ if ((dUpdateInfo & MCDRV_KEY2ONDLYTIM2_UPDATE_FLAG) != 0UL) {
+ if (psHSDetInfo->bKey2OnDlyTim2 > MC_DRV_KEYONDLYTIM2_MAX)
+ bRet = 0;
+ else if (sHSDetInfo.bKeyOnMtim == MCDRV_KEYON_MTIM_250) {
+ if ((psHSDetInfo->bKey2OnDlyTim2 == 1)
+ || (psHSDetInfo->bKey2OnDlyTim2 == 2)
+ || (psHSDetInfo->bKey2OnDlyTim2 == 3))
+ bRet = 0;
+ }
+ }
+
+ if ((dUpdateInfo & MCDRV_IRQTYPE_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bIrqType != MCDRV_IRQTYPE_NORMAL)
+ && (psHSDetInfo->bIrqType != MCDRV_IRQTYPE_REF)
+ && (psHSDetInfo->bIrqType != MCDRV_IRQTYPE_EX)) {
+ bRet = 0;
+ goto exit;
+ } else if (psHSDetInfo->bIrqType == MCDRV_IRQTYPE_EX) {
+ if (psHSDet2Info != NULL) {
+ if ((psHSDet2Info->bPlugDetDbIrqType !=
+ MCDRV_IRQTYPE_NORMAL)
+ && (psHSDet2Info->bPlugDetDbIrqType !=
+ MCDRV_IRQTYPE_REF)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psHSDet2Info->bPlugUndetDbIrqType !=
+ MCDRV_IRQTYPE_NORMAL)
+ && (psHSDet2Info->bPlugUndetDbIrqType !=
+ MCDRV_IRQTYPE_REF)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psHSDet2Info->bMicDetIrqType !=
+ MCDRV_IRQTYPE_NORMAL)
+ && (psHSDet2Info->bMicDetIrqType !=
+ MCDRV_IRQTYPE_REF)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psHSDet2Info->bPlugDetIrqType !=
+ MCDRV_IRQTYPE_NORMAL)
+ && (psHSDet2Info->bPlugDetIrqType !=
+ MCDRV_IRQTYPE_REF)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psHSDet2Info->bKey0OnIrqType !=
+ MCDRV_IRQTYPE_NORMAL)
+ && (psHSDet2Info->bKey0OnIrqType !=
+ MCDRV_IRQTYPE_REF)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psHSDet2Info->bKey1OnIrqType !=
+ MCDRV_IRQTYPE_NORMAL)
+ && (psHSDet2Info->bKey1OnIrqType !=
+ MCDRV_IRQTYPE_REF)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psHSDet2Info->bKey2OnIrqType !=
+ MCDRV_IRQTYPE_NORMAL)
+ && (psHSDet2Info->bKey2OnIrqType !=
+ MCDRV_IRQTYPE_REF)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psHSDet2Info->bKey0OffIrqType !=
+ MCDRV_IRQTYPE_NORMAL)
+ && (psHSDet2Info->bKey0OffIrqType !=
+ MCDRV_IRQTYPE_REF)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psHSDet2Info->bKey1OffIrqType !=
+ MCDRV_IRQTYPE_NORMAL)
+ && (psHSDet2Info->bKey1OffIrqType !=
+ MCDRV_IRQTYPE_REF)) {
+ bRet = 0;
+ goto exit;
+ }
+ if ((psHSDet2Info->bKey2OffIrqType !=
+ MCDRV_IRQTYPE_NORMAL)
+ && (psHSDet2Info->bKey2OffIrqType !=
+ MCDRV_IRQTYPE_REF)) {
+ bRet = 0;
+ goto exit;
+ }
+ }
+ }
+ }
+ if ((dUpdateInfo & MCDRV_DETINV_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bDetInInv != MCDRV_DET_IN_NORMAL)
+ && (psHSDetInfo->bDetInInv != MCDRV_DET_IN_INV)
+ && (psHSDetInfo->bDetInInv !=
+ MCDRV_DET_IN_NORMAL_NORMAL)
+ && (psHSDetInfo->bDetInInv != MCDRV_DET_IN_INV_NORMAL)
+ && (psHSDetInfo->bDetInInv != MCDRV_DET_IN_NORMAL_INV)
+ && (psHSDetInfo->bDetInInv != MCDRV_DET_IN_INV_INV))
+ bRet = 0;
+ }
+
+ if ((dUpdateInfo & MCDRV_HSDETMODE_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bHsDetMode != MCDRV_HSDET_MODE_DETIN_A)
+ && (psHSDetInfo->bHsDetMode != MCDRV_HSDET_MODE_DETIN_B))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_SPERIOD_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bSperiod != MCDRV_SPERIOD_244)
+ && (psHSDetInfo->bSperiod != MCDRV_SPERIOD_488)
+ && (psHSDetInfo->bSperiod != MCDRV_SPERIOD_977)
+ && (psHSDetInfo->bSperiod != MCDRV_SPERIOD_1953)
+ && (psHSDetInfo->bSperiod != MCDRV_SPERIOD_3906)
+ && (psHSDetInfo->bSperiod != MCDRV_SPERIOD_7813)
+ && (psHSDetInfo->bSperiod != MCDRV_SPERIOD_15625)
+ && (psHSDetInfo->bSperiod != MCDRV_SPERIOD_31250))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_LPERIOD_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bLperiod != MCDRV_LPERIOD_3906)
+ && (psHSDetInfo->bLperiod != MCDRV_LPERIOD_62500)
+ && (psHSDetInfo->bLperiod != MCDRV_LPERIOD_125000)
+ && (psHSDetInfo->bLperiod != MCDRV_LPERIOD_250000))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_DBNCNUMPLUG_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bDbncNumPlug != MCDRV_DBNC_NUM_2)
+ && (psHSDetInfo->bDbncNumPlug != MCDRV_DBNC_NUM_3)
+ && (psHSDetInfo->bDbncNumPlug != MCDRV_DBNC_NUM_4)
+ && (psHSDetInfo->bDbncNumPlug != MCDRV_DBNC_NUM_7))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_DBNCNUMMIC_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bDbncNumMic != MCDRV_DBNC_NUM_2)
+ && (psHSDetInfo->bDbncNumMic != MCDRV_DBNC_NUM_3)
+ && (psHSDetInfo->bDbncNumMic != MCDRV_DBNC_NUM_4)
+ && (psHSDetInfo->bDbncNumMic != MCDRV_DBNC_NUM_7))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_DBNCNUMKEY_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bDbncNumKey != MCDRV_DBNC_NUM_2)
+ && (psHSDetInfo->bDbncNumKey != MCDRV_DBNC_NUM_3)
+ && (psHSDetInfo->bDbncNumKey != MCDRV_DBNC_NUM_4)
+ && (psHSDetInfo->bDbncNumKey != MCDRV_DBNC_NUM_7))
+ bRet = 0;
+ }
+
+ if ((dUpdateInfo & MCDRV_SGNL_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bSgnlPeriod != MCDRV_SGNLPERIOD_61)
+ && (psHSDetInfo->bSgnlPeriod != MCDRV_SGNLPERIOD_79)
+ && (psHSDetInfo->bSgnlPeriod != MCDRV_SGNLPERIOD_97)
+ && (psHSDetInfo->bSgnlPeriod != MCDRV_SGNLPERIOD_151))
+ bRet = 0;
+ if ((psHSDetInfo->bSgnlNum != MCDRV_SGNLNUM_1)
+ && (psHSDetInfo->bSgnlNum != MCDRV_SGNLNUM_4)
+ && (psHSDetInfo->bSgnlNum != MCDRV_SGNLNUM_6)
+ && (psHSDetInfo->bSgnlNum != MCDRV_SGNLNUM_8)
+ && (psHSDetInfo->bSgnlNum != MCDRV_SGNLNUM_NONE))
+ bRet = 0;
+ if ((psHSDetInfo->bSgnlPeak != MCDRV_SGNLPEAK_500)
+ && (psHSDetInfo->bSgnlPeak != MCDRV_SGNLPEAK_730)
+ && (psHSDetInfo->bSgnlPeak != MCDRV_SGNLPEAK_960)
+ && (psHSDetInfo->bSgnlPeak != MCDRV_SGNLPEAK_1182))
+ bRet = 0;
+ }
+ if ((dUpdateInfo & MCDRV_IMPSEL_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bImpSel != 0)
+ && (psHSDetInfo->bImpSel != 1))
+ bRet = 0;
+ }
+
+ if ((dUpdateInfo & MCDRV_DLYIRQSTOP_UPDATE_FLAG) != 0UL) {
+ if ((psHSDetInfo->bDlyIrqStop != MCDRV_DLYIRQ_DONTCARE)
+ && (psHSDetInfo->bDlyIrqStop != MCDRV_DLYIRQ_STOP))
+ bRet = 0;
+ }
+
+exit:
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsValidHSDetParam", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * IsValidGpParam
+ *
+ * Description:
+ * validate GP parameters.
+ * Arguments:
+ * psGpInfo GP information
+ * Return:
+ * 0:Invalid
+ * other:Valid
+ *
+ ****************************************************************************/
+static UINT8 IsValidGpParam
+(
+ const struct MCDRV_GP_MODE *psGpMode
+)
+{
+ UINT8 bRet = 1;
+ UINT8 bPad;
+ struct MCDRV_INIT_INFO sInitInfo;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("IsValidGpParam");
+#endif
+
+ McResCtrl_GetInitInfo(&sInitInfo, NULL);
+
+ for (bPad = 0; (bPad < 3) && (bRet == 1); bPad++) {
+ if (((bPad == 0) && (sInitInfo.bPa0Func != MCDRV_PA_GPIO))
+ || ((bPad == 1) && (sInitInfo.bPa1Func != MCDRV_PA_GPIO))
+ || ((bPad == 2) && (sInitInfo.bPa2Func != MCDRV_PA_GPIO)))
+ continue;
+ if ((psGpMode->abGpDdr[bPad] != MCDRV_GPDDR_IN)
+ && (psGpMode->abGpDdr[bPad] != MCDRV_GPDDR_OUT)) {
+ bRet = 0;
+ continue;
+ }
+ if ((psGpMode->abGpHost[bPad] != MCDRV_GPHOST_CPU)
+ && (psGpMode->abGpHost[bPad] != MCDRV_GPHOST_CDSP)) {
+ bRet = 0;
+ continue;
+ }
+ if ((psGpMode->abGpInvert[bPad] != MCDRV_GPINV_NORMAL)
+ && (psGpMode->abGpInvert[bPad] != MCDRV_GPINV_INVERT))
+ bRet = 0;
+ }
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsValidGpParam", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * IsValidMaskGp
+ *
+ * Description:
+ * validate GP parameters.
+ * Arguments:
+ * bMask MaskGP information
+ * dPadNo PAD number
+ * Return:
+ * 0:Invalid
+ * other:Valid
+ *
+ ****************************************************************************/
+static UINT8 IsValidMaskGp
+(
+ UINT8 bMask,
+ UINT32 dPadNo
+)
+{
+ UINT8 bRet = 1;
+ struct MCDRV_INIT_INFO sInitInfo;
+ struct MCDRV_GP_MODE sGPMode;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet = MCDRV_SUCCESS;
+ McDebugLog_FuncIn("IsValidMaskGp");
+#endif
+
+ McResCtrl_GetInitInfo(&sInitInfo, NULL);
+ McResCtrl_GetGPMode(&sGPMode);
+
+ if ((dPadNo != 0)
+ && (dPadNo != 1)
+ && (dPadNo != 2))
+ bRet = 0;
+ else if (((dPadNo == 0) && (sInitInfo.bPa0Func != MCDRV_PA_GPIO))
+ || ((dPadNo == 1) && (sInitInfo.bPa1Func != MCDRV_PA_GPIO))
+ || ((dPadNo == 2) && (sInitInfo.bPa2Func != MCDRV_PA_GPIO))) {
+ ;
+ } else {
+ if (sGPMode.abGpDdr[dPadNo] == MCDRV_GPDDR_OUT)
+ bRet = 0;
+ if ((bMask != MCDRV_GPMASK_ON) && (bMask != MCDRV_GPMASK_OFF))
+ bRet = 0;
+ }
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("IsValidMaskGp", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * CheckDIOCommon
+ *
+ * Description:
+ * check Digital IO Common parameters.
+ * Arguments:
+ * psDioInfo digital IO information
+ * bPort port number
+ * Return:
+ * 0:error
+ * other:no error
+ *
+ ****************************************************************************/
+static UINT8 CheckDIOCommon
+(
+ const struct MCDRV_DIO_INFO *psDioInfo,
+ UINT8 bPort
+)
+{
+ UINT8 bRet = 1;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet = MCDRV_SUCCESS;
+ McDebugLog_FuncIn("CheckDIOCommon");
+#endif
+
+
+ if (bPort == 3) {
+ if ((psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_48000)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_192000)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_96000))
+ bRet = 0;
+ else if ((psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_64)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_48)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_32))
+ bRet = 0;
+ else if ((psDioInfo->asPortInfo[bPort].sDioCommon.bBckInvert
+ != MCDRV_BCLK_NORMAL)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckInvert
+ != MCDRV_BCLK_INVERT))
+ bRet = 0;
+ goto exit;
+ }
+
+ if ((psDioInfo->asPortInfo[bPort].sDioCommon.bMasterSlave
+ != MCDRV_DIO_SLAVE)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bMasterSlave
+ != MCDRV_DIO_MASTER))
+ bRet = 0;
+ else if ((psDioInfo->asPortInfo[bPort].sDioCommon.bAutoFs
+ != MCDRV_AUTOFS_OFF)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bAutoFs
+ != MCDRV_AUTOFS_ON))
+ bRet = 0;
+ else if ((psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_48000)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_44100)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_32000)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_24000)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_22050)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_16000)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_12000)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_11025)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_8000)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_192000)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_96000))
+ bRet = 0;
+ else if ((psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_64)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_48)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_32)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_512)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_256)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_192)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_128)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_96)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_24)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_16)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_8)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_SLAVE))
+ bRet = 0;
+ else if ((psDioInfo->asPortInfo[bPort].sDioCommon.bInterface
+ != MCDRV_DIO_DA)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bInterface
+ != MCDRV_DIO_PCM))
+ bRet = 0;
+ else if ((psDioInfo->asPortInfo[bPort].sDioCommon.bBckInvert
+ != MCDRV_BCLK_NORMAL)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckInvert
+ != MCDRV_BCLK_INVERT))
+ bRet = 0;
+ else if ((psDioInfo->asPortInfo[bPort].sDioCommon.bSrcThru
+ != MCDRV_SRC_NOT_THRU)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bSrcThru
+ != MCDRV_SRC_THRU)) {
+ if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) {
+ ;
+ bRet = 0;
+ }
+ } else {
+ if ((psDioInfo->asPortInfo[bPort].sDioCommon.bPcmHizTim
+ != MCDRV_PCMHIZTIM_FALLING)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bPcmHizTim
+ != MCDRV_PCMHIZTIM_RISING))
+ bRet = 0;
+ else if ((psDioInfo->asPortInfo[bPort].sDioCommon.bPcmFrame
+ != MCDRV_PCM_SHORTFRAME)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bPcmFrame
+ != MCDRV_PCM_LONGFRAME))
+ bRet = 0;
+ else if (psDioInfo->asPortInfo[bPort].sDioCommon.bPcmHighPeriod
+ > 31)
+ bRet = 0;
+ }
+
+ if (psDioInfo->asPortInfo[bPort].sDioCommon.bInterface
+ == MCDRV_DIO_PCM) {
+ if ((psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_8000)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_16000))
+ bRet = 0;
+
+ if (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ == MCDRV_BCKFS_512) {
+ if (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_8000)
+ bRet = 0;
+ }
+ if (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ == MCDRV_BCKFS_256) {
+ if ((psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_8000)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ != MCDRV_FS_16000))
+ bRet = 0;
+ }
+ if (psDioInfo->asPortInfo[bPort].sDioCommon.bMasterSlave
+ == MCDRV_DIO_MASTER) {
+ if (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ == MCDRV_BCKFS_SLAVE)
+ bRet = 0;
+ }
+ } else {
+ if ((bPort == 0)
+ || (bPort == 1)) {
+ if ((psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ == MCDRV_FS_192000)
+ || (psDioInfo->asPortInfo[bPort].sDioCommon.bFs
+ == MCDRV_FS_96000))
+ bRet = 0;
+ }
+ if ((psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_64)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_48)
+ && (psDioInfo->asPortInfo[bPort].sDioCommon.bBckFs
+ != MCDRV_BCKFS_32)) {
+ bRet = 0;
+ }
+ }
+
+exit:
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("CheckDIOCommon", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * CheckDaFormat
+ *
+ * Description:
+ * check sDaFormat parameters.
+ * Arguments:
+ * psDaFormat MCDRV_DA_FORMAT information
+ * Return:
+ * 0:error
+ * other:no error
+ *
+ ****************************************************************************/
+static UINT8 CheckDaFormat
+(
+ const struct MCDRV_DA_FORMAT *psDaFormat
+)
+{
+ UINT8 bRet = 1;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("CheckDaFormat");
+#endif
+
+
+ if ((psDaFormat->bBitSel != MCDRV_BITSEL_16)
+ && (psDaFormat->bBitSel != MCDRV_BITSEL_20)
+ && (psDaFormat->bBitSel != MCDRV_BITSEL_24)
+ && (psDaFormat->bBitSel != MCDRV_BITSEL_32)) {
+ bRet = 0;
+ } else if ((psDaFormat->bMode != MCDRV_DAMODE_HEADALIGN)
+ && (psDaFormat->bMode != MCDRV_DAMODE_I2S)
+ && (psDaFormat->bMode != MCDRV_DAMODE_TAILALIGN)) {
+ bRet = 0;
+ }
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("CheckDaFormat", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * CheckPcmFormat
+ *
+ * Description:
+ * check sPcmFormat parameters.
+ * Arguments:
+ * psPcmFormat MCDRV_PCM_FORMAT information
+ * Return:
+ * 0:error
+ * other:no error
+ *
+ ****************************************************************************/
+static UINT8 CheckPcmFormat
+(
+ const struct MCDRV_PCM_FORMAT *psPcmFormat
+)
+{
+ UINT8 bRet = 1;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("CheckPcmFormat");
+#endif
+
+
+ if ((psPcmFormat->bMono != MCDRV_PCM_STEREO)
+ && (psPcmFormat->bMono != MCDRV_PCM_MONO)) {
+ ;
+ bRet = 0;
+ } else if ((psPcmFormat->bOrder != MCDRV_PCM_MSB_FIRST)
+ && (psPcmFormat->bOrder != MCDRV_PCM_LSB_FIRST)) {
+ ;
+ bRet = 0;
+ } else if ((psPcmFormat->bLaw != MCDRV_PCM_LINEAR)
+ && (psPcmFormat->bLaw != MCDRV_PCM_ALAW)
+ && (psPcmFormat->bLaw != MCDRV_PCM_MULAW)) {
+ ;
+ bRet = 0;
+ } else if ((psPcmFormat->bBitSel != MCDRV_PCM_BITSEL_8)
+ && (psPcmFormat->bBitSel != MCDRV_PCM_BITSEL_16)
+ && (psPcmFormat->bBitSel != MCDRV_PCM_BITSEL_24)) {
+ ;
+ bRet = 0;
+ } else {
+ if ((psPcmFormat->bLaw == MCDRV_PCM_ALAW)
+ || (psPcmFormat->bLaw == MCDRV_PCM_MULAW)) {
+ if (psPcmFormat->bBitSel != MCDRV_PCM_BITSEL_8) {
+ ;
+ bRet = 0;
+ }
+ }
+ }
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("CheckPcmFormat", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * CheckDIODIR
+ *
+ * Description:
+ * validate Digital IO DIR parameters.
+ * Arguments:
+ * psDioInfo digital IO information
+ * bPort port number
+ * Return:
+ * 0:error
+ * other:no error
+ *
+ ****************************************************************************/
+static UINT8 CheckDIODIR
+(
+ const struct MCDRV_DIO_INFO *psDioInfo,
+ UINT8 bPort
+)
+{
+ UINT8 bRet = 1;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("CheckDIODIR");
+#endif
+
+
+ bRet = CheckPcmFormat(
+ &psDioInfo->asPortInfo[bPort].sDir.sPcmFormat);
+ if (bRet != 0) {
+ bRet = CheckDaFormat(
+ &psDioInfo->asPortInfo[bPort].sDir.sDaFormat);
+ if (psDioInfo->asPortInfo[bPort].sDir.sDaFormat.bBitSel
+ == MCDRV_BITSEL_32)
+ bRet = 0;
+ }
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("CheckDIODIR", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * CheckDIODIT
+ *
+ * Description:
+ * validate Digital IO DIT parameters.
+ * Arguments:
+ * psDioInfo digital IO information
+ * bPort port number
+ * Return:
+ * 0:error
+ * other:no error
+ *
+ ****************************************************************************/
+static UINT8 CheckDIODIT
+(
+ const struct MCDRV_DIO_INFO *psDioInfo,
+ UINT8 bPort
+)
+{
+ UINT8 bRet = 1;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ SINT32 sdRet;
+ McDebugLog_FuncIn("CheckDIODIT");
+#endif
+
+
+ if ((psDioInfo->asPortInfo[bPort].sDit.bStMode != MCDRV_STMODE_ZERO)
+ && (psDioInfo->asPortInfo[bPort].sDit.bStMode != MCDRV_STMODE_HOLD))
+ bRet = 0;
+ else if ((psDioInfo->asPortInfo[bPort].sDit.bEdge != MCDRV_SDOUT_NORMAL)
+ && (psDioInfo->asPortInfo[bPort].sDit.bEdge != MCDRV_SDOUT_AHEAD))
+ bRet = 0;
+ else {
+ bRet = CheckPcmFormat(
+ &psDioInfo->asPortInfo[bPort].sDit.sPcmFormat);
+ if (bRet != 0) {
+ bRet = CheckDaFormat(
+ &psDioInfo->asPortInfo[bPort].sDit.sDaFormat);
+ if (psDioInfo->asPortInfo[bPort].sDit.sDaFormat.bBitSel
+ == MCDRV_BITSEL_32)
+ if (bPort != 2)
+ bRet = 0;
+ }
+ }
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ sdRet = bRet;
+ McDebugLog_FuncOut("CheckDIODIT", &sdRet);
+#endif
+ return bRet;
+}
+
+/****************************************************************************
+ * SetVol
+ *
+ * Description:
+ * set volume.
+ * Arguments:
+ * dUpdate target volume items
+ * eMode update mode
+ * pdSVolDoneParam wait soft volume complete flag
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_RESOURCEOVER
+ *
+ ****************************************************************************/
+static SINT32 SetVol
+(
+ UINT32 dUpdate,
+ enum MCDRV_VOLUPDATE_MODE eMode,
+ UINT32 *pdSVolDoneParam
+)
+{
+ SINT32 sdRet = MCDRV_SUCCESS;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ McDebugLog_FuncIn("SetVol");
+#endif
+
+ McPacket_AddVol(dUpdate, eMode, pdSVolDoneParam);
+ sdRet = McDevIf_ExecutePacket();
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ McDebugLog_FuncOut("SetVol", &sdRet);
+#endif
+
+ return sdRet;
+}
+
+/****************************************************************************
+ * GetMuteParam
+ *
+ * Description:
+ * Get mute complete flag.
+ * Arguments:
+ * pbDIRMuteParam wait DIR mute complete flag
+ * pbADCMuteParam wait ADC mute complete flag
+ * pbDITMuteParam wait DIT mute complete flag
+ * pbDACMuteParam wait DAC mute complete flag
+ * Return:
+ * none
+ *
+ ****************************************************************************/
+static void GetMuteParam
+(
+ UINT8 *pbDIRMuteParam,
+ UINT8 *pbADCMuteParam,
+ UINT8 *pbDITMuteParam,
+ UINT8 *pbDACMuteParam
+)
+{
+ UINT8 bVol;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ McDebugLog_FuncIn("GetMuteParam");
+#endif
+
+ *pbDIRMuteParam = 0;
+ *pbADCMuteParam = 0;
+ *pbDITMuteParam = 0;
+ *pbDACMuteParam = 0;
+
+ if (McResCtrl_IsD1SrcUsed(MCDRV_D1SRC_MUSICIN_ON) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFI0_VOL0);
+ if ((bVol & (UINT8)~MCB_DIFI0_VSEP) != 0)
+ *pbDIRMuteParam |= MCB_DIFI0_VFLAG0;
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFI0_VOL1);
+ if (bVol != 0)
+ *pbDIRMuteParam |= MCB_DIFI0_VFLAG1;
+ }
+ if (McResCtrl_IsD1SrcUsed(MCDRV_D1SRC_EXTIN_ON) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFI1_VOL0);
+ if ((bVol & (UINT8)~MCB_DIFI1_VSEP) != 0)
+ *pbDIRMuteParam |= MCB_DIFI1_VFLAG0;
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFI1_VOL1);
+ if (bVol != 0)
+ *pbDIRMuteParam |= MCB_DIFI1_VFLAG1;
+ }
+ if (McResCtrl_IsD1SrcUsed(MCDRV_D1SRC_VBOXOUT_ON) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFI2_VOL0);
+ if ((bVol & (UINT8)~MCB_DIFI2_VSEP) != 0)
+ *pbDIRMuteParam |= MCB_DIFI2_VFLAG0;
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFI2_VOL1);
+ if (bVol != 0)
+ *pbDIRMuteParam |= MCB_DIFI2_VFLAG1;
+ }
+ if (McResCtrl_IsD1SrcUsed(MCDRV_D1SRC_VBOXREFOUT_ON) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFI3_VOL0);
+ if ((bVol & (UINT8)~MCB_DIFI3_VSEP) != 0)
+ *pbDIRMuteParam |= MCB_DIFI3_VFLAG0;
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFI3_VOL1);
+ if (bVol != 0)
+ *pbDIRMuteParam |= MCB_DIFI3_VFLAG1;
+ }
+ if (McResCtrl_HasSrc(eMCDRV_DST_DAC0, eMCDRV_DST_CH0) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DAO0_VOL0);
+ if ((bVol & (UINT8)~MCB_DAO0_VSEP) != 0)
+ *pbDACMuteParam |= MCB_DAO0_VFLAG0;
+ }
+ if (McResCtrl_HasSrc(eMCDRV_DST_DAC0, eMCDRV_DST_CH1) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DAO0_VOL1);
+ if (bVol != 0)
+ *pbDACMuteParam |= MCB_DAO0_VFLAG1;
+ }
+ if (McResCtrl_HasSrc(eMCDRV_DST_DAC1, eMCDRV_DST_CH0) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DAO1_VOL0);
+ if ((bVol & (UINT8)~MCB_DAO1_VSEP) != 0)
+ *pbDACMuteParam |= MCB_DAO1_VFLAG0;
+ }
+ if (McResCtrl_HasSrc(eMCDRV_DST_DAC1, eMCDRV_DST_CH1) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DAO1_VOL1);
+ if (bVol != 0)
+ *pbDACMuteParam |= MCB_DAO1_VFLAG1;
+ }
+
+ if (McResCtrl_HasSrc(eMCDRV_DST_MUSICOUT, eMCDRV_DST_CH0) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFO0_VOL0);
+ if ((bVol & (UINT8)~MCB_DIFO0_VSEP) != 0)
+ *pbDITMuteParam |= MCB_DIFO0_VFLAG0;
+ }
+ if (McResCtrl_HasSrc(eMCDRV_DST_MUSICOUT, eMCDRV_DST_CH1) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFO0_VOL1);
+ if (bVol != 0)
+ *pbDITMuteParam |= MCB_DIFO0_VFLAG1;
+
+ }
+ if (McResCtrl_HasSrc(eMCDRV_DST_EXTOUT, eMCDRV_DST_CH0) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFO1_VOL0);
+ if ((bVol & (UINT8)~MCB_DIFO1_VSEP) != 0)
+ *pbDITMuteParam |= MCB_DIFO1_VFLAG0;
+ }
+ if (McResCtrl_HasSrc(eMCDRV_DST_EXTOUT, eMCDRV_DST_CH1) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFO1_VOL1);
+ if (bVol != 0)
+ *pbDITMuteParam |= MCB_DIFO1_VFLAG1;
+ }
+
+ if (McResCtrl_HasSrc(eMCDRV_DST_VBOXMIXIN, eMCDRV_DST_CH0) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFO2_VOL0);
+ if ((bVol & (UINT8)~MCB_DIFO2_VSEP) != 0)
+ *pbDITMuteParam |= MCB_DIFO2_VFLAG0;
+ }
+ if (McResCtrl_HasSrc(eMCDRV_DST_VBOXMIXIN, eMCDRV_DST_CH1) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFO2_VOL1);
+ if (bVol != 0)
+ *pbDITMuteParam |= MCB_DIFO2_VFLAG1;
+ }
+ if (McResCtrl_HasSrc(eMCDRV_DST_VBOXMIXIN, eMCDRV_DST_CH2) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFO3_VOL0);
+ if ((bVol & (UINT8)~MCB_DIFO2_VSEP) != 0)
+ *pbDITMuteParam |= MCB_DIFO3_VFLAG0;
+ }
+ if (McResCtrl_HasSrc(eMCDRV_DST_VBOXMIXIN, eMCDRV_DST_CH3) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_DIFO3_VOL1);
+ if (bVol != 0)
+ *pbDITMuteParam |= MCB_DIFO3_VFLAG1;
+ }
+
+ if (McResCtrl_IsD1SrcUsed(MCDRV_D1SRC_ADIF0_ON) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_ADI0_VOL0);
+ if ((bVol & (UINT8)~MCB_ADI0_VSEP) != 0)
+ *pbADCMuteParam |= MCB_ADI0_VFLAG0;
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_ADI0_VOL1);
+ if (bVol != 0)
+ *pbADCMuteParam |= MCB_ADI0_VFLAG1;
+ }
+ if (McResCtrl_IsD1SrcUsed(MCDRV_D1SRC_ADIF1_ON) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_ADI1_VOL1);
+ if ((bVol & (UINT8)~MCB_ADI1_VSEP) != 0)
+ *pbADCMuteParam |= MCB_ADI1_VFLAG0;
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_ADI1_VOL1);
+ if (bVol != 0)
+ *pbADCMuteParam |= MCB_ADI1_VFLAG1;
+ }
+ if (McResCtrl_IsD1SrcUsed(MCDRV_D1SRC_ADIF2_ON) == 0) {
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_ADI2_VOL1);
+ if ((bVol & (UINT8)~MCB_ADI2_VSEP) != 0)
+ *pbADCMuteParam |= MCB_ADI2_VFLAG0;
+ bVol = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_MA,
+ MCI_ADI2_VOL1);
+ if (bVol != 0)
+ *pbADCMuteParam |= MCB_ADI2_VFLAG1;
+ }
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ McDebugLog_FuncOut("GetMuteParam", NULL);
+#endif
+}
+
+/****************************************************************************
+ * SavePower
+ *
+ * Description:
+ * Save power.
+ * Arguments:
+ * none
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_RESOURCEOVER
+ * MCDRV_ERROR_TIMEOUT
+ *
+ ****************************************************************************/
+static SINT32 SavePower
+(
+ void
+)
+{
+ SINT32 sdRet = MCDRV_SUCCESS;
+ struct MCDRV_POWER_INFO sPowerInfo;
+ struct MCDRV_POWER_UPDATE sPowerUpdate;
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ McDebugLog_FuncIn("SavePower");
+#endif
+
+ /* unused path power down */
+ McResCtrl_GetPowerInfo(&sPowerInfo);
+ sPowerUpdate.bDigital = MCDRV_POWUPDATE_D_ALL;
+ sPowerUpdate.abAnalog[0] = (UINT8)MCDRV_POWUPDATE_AP;
+ sPowerUpdate.abAnalog[1] = (UINT8)MCDRV_POWUPDATE_AP_OUT0;
+ sPowerUpdate.abAnalog[2] = (UINT8)MCDRV_POWUPDATE_AP_OUT1;
+ sPowerUpdate.abAnalog[3] = (UINT8)MCDRV_POWUPDATE_AP_MC;
+ sPowerUpdate.abAnalog[4] = (UINT8)MCDRV_POWUPDATE_AP_IN;
+ sdRet = McPacket_AddPowerDown(&sPowerInfo, &sPowerUpdate);
+ if (sdRet == MCDRV_SUCCESS)
+ sdRet = McDevIf_ExecutePacket();
+
+#if (MCDRV_DEBUG_LEVEL >= 4)
+ McDebugLog_FuncOut("SavePower", &sdRet);
+#endif
+ return sdRet;
+}
+
+/****************************************************************************
+ * McDrv_Ctrl
+ *
+ * Description:
+ * MC Driver I/F function.
+ * Arguments:
+ * dCmd command #
+ * pvPrm1 parameter1
+ * pvPrm2 parameter2
+ * dPrm update info
+ * Return:
+ * MCDRV_SUCCESS
+ * MCDRV_ERROR_ARGUMENT
+ * MCDRV_ERROR_RESOURCEOVER
+ * MCDRV_ERROR_STATE
+ *
+ ****************************************************************************/
+SINT32 McDrv_Ctrl(
+ UINT32 dCmd,
+ void *pvPrm1,
+ void *pvPrm2,
+ UINT32 dPrm
+)
+{
+ SINT32 sdRet = MCDRV_ERROR;
+ UINT8 bAP;
+
+#if MCDRV_DEBUG_LEVEL
+ McDebugLog_CmdIn(dCmd, pvPrm1, pvPrm2, dPrm);
+#endif
+
+ (void)pvPrm2;
+
+ if ((UINT32)MCDRV_INIT == dCmd) {
+ sdRet = init((struct MCDRV_INIT_INFO *)pvPrm1,
+ (struct MCDRV_INIT2_INFO *)pvPrm2);
+ } else if ((UINT32)MCDRV_TERM == dCmd) {
+ sdRet = term();
+ } else if ((UINT32)MCDRV_IRQ == dCmd) {
+ sdRet = irq_proc();
+ } else {
+ McSrv_Lock();
+
+ bAP = McResCtrl_GetRegVal(MCDRV_PACKET_REGTYPE_ANA, MCI_AP);
+
+ switch (dCmd) {
+ case MCDRV_GET_CLOCKSW:
+ sdRet = get_clocksw(
+ (struct MCDRV_CLOCKSW_INFO *)pvPrm1);
+ break;
+ case MCDRV_SET_CLOCKSW:
+ sdRet = set_clocksw(
+ (struct MCDRV_CLOCKSW_INFO *)pvPrm1);
+ break;
+
+ case MCDRV_GET_PATH:
+ sdRet = get_path((struct MCDRV_PATH_INFO *)pvPrm1);
+ break;
+ case MCDRV_SET_PATH:
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PreLDODStart();
+ }
+ sdRet = set_path((struct MCDRV_PATH_INFO *)pvPrm1);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+ break;
+
+ case MCDRV_GET_VOLUME:
+ sdRet = get_volume((struct MCDRV_VOL_INFO *)pvPrm1);
+ break;
+ case MCDRV_SET_VOLUME:
+ sdRet = set_volume((struct MCDRV_VOL_INFO *)pvPrm1);
+ break;
+
+ case MCDRV_GET_DIGITALIO:
+ sdRet = get_digitalio(
+ (struct MCDRV_DIO_INFO *)pvPrm1);
+ break;
+ case MCDRV_SET_DIGITALIO:
+ sdRet = set_digitalio(
+ (struct MCDRV_DIO_INFO *)pvPrm1, dPrm);
+ break;
+
+ case MCDRV_GET_DIGITALIO_PATH:
+ sdRet = get_digitalio_path(
+ (struct MCDRV_DIOPATH_INFO *)pvPrm1);
+ break;
+ case MCDRV_SET_DIGITALIO_PATH:
+ sdRet = set_digitalio_path(
+ (struct MCDRV_DIOPATH_INFO *)pvPrm1,
+ dPrm);
+ break;
+
+ case MCDRV_GET_SWAP:
+ sdRet = get_swap((struct MCDRV_SWAP_INFO *)pvPrm1);
+ break;
+ case MCDRV_SET_SWAP:
+ sdRet = set_swap((struct MCDRV_SWAP_INFO *)pvPrm1,
+ dPrm);
+ break;
+
+ case MCDRV_SET_DSP:
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PreLDODStart();
+ }
+ sdRet = set_dsp((UINT8 *)pvPrm1, dPrm);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+ break;
+ case MCDRV_GET_DSP:
+ sdRet = get_dsp((struct MCDRV_DSP_PARAM *)pvPrm1,
+ pvPrm2, dPrm);
+ break;
+ case MCDRV_GET_DSP_DATA:
+ sdRet = get_dsp_data((UINT8 *)pvPrm1, dPrm);
+ break;
+ case MCDRV_SET_DSP_DATA:
+ sdRet = set_dsp_data((const UINT8 *)pvPrm1, dPrm);
+ break;
+ case MCDRV_REGISTER_DSP_CB:
+ sdRet = register_dsp_cb(
+ (SINT32 (*)(SINT32, UINT32, UINT32))
+ pvPrm1);
+ break;
+ case MCDRV_GET_DSP_TRANSITION:
+ sdRet = get_dsp_transition(dPrm);
+ break;
+
+ case MCDRV_GET_HSDET:
+ sdRet = get_hsdet((struct MCDRV_HSDET_INFO *)pvPrm1,
+ (struct MCDRV_HSDET2_INFO *)pvPrm2);
+ break;
+ case MCDRV_SET_HSDET:
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PreLDODStart();
+ }
+ sdRet = set_hsdet((struct MCDRV_HSDET_INFO *)pvPrm1,
+ (struct MCDRV_HSDET2_INFO *)pvPrm2,
+ dPrm);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+ break;
+
+ case MCDRV_CONFIG_GP:
+ sdRet = config_gp((struct MCDRV_GP_MODE *)pvPrm1);
+ break;
+ case MCDRV_MASK_GP:
+ sdRet = mask_gp((UINT8 *)pvPrm1, dPrm);
+ break;
+ case MCDRV_GETSET_GP:
+ sdRet = getset_gp((UINT8 *)pvPrm1, dPrm);
+ break;
+
+ case MCDRV_READ_REG:
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PreLDODStart();
+ }
+ sdRet = read_reg((struct MCDRV_REG_INFO *)pvPrm1);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+ break;
+ case MCDRV_WRITE_REG:
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PreLDODStart();
+ }
+ sdRet = write_reg((struct MCDRV_REG_INFO *)pvPrm1);
+ if ((bAP&MCB_AP_LDOD) != 0) {
+ ;
+ machdep_PostLDODStart();
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ McSrv_Unlock();
+ }
+
+#if MCDRV_DEBUG_LEVEL
+ McDebugLog_CmdOut(dCmd, &sdRet, pvPrm1, pvPrm2, dPrm);
+#endif
+#if !defined(CONFIG_MACH_J_CHN_CTC) && !defined(CONFIG_MACH_J_CHN_CU)
+ if(sdRet < 0) {
+ printk("\n!!!McDrv_Ctrl failed\n\n");
+ }
+#endif
+ return sdRet;
+}
+