/**************************************************************************** * Module: S5H1409 * * Description: Tuner Driver for DTF8640 Main Routines * * Notes: 20041019/hwatk * * TO DO * * ChannelChange() ¿¡ ´ëÇÑ ÀÎÀÚ¸¦ ´Ù½ÃÈ®ÀÎÇÏÀÚ. * ************************************************************************^^*/ //#include "VDL.h" //#include "utility.h" //#include "HiDTV_RTC.h" //#include "HiDTV_GPIO.h" //#include "params.h" //#include "comm.h" //#include "client.h" #include "dsthalcommon.h" #include "S5H1411.h" #include "S5H1411Core.h" extern DS_U32 gdhlExtDbgLvl; /*================================================================== Configuration Section - USE_CODE_SWITCH : 2B / 2C Switch Code »ç¿ë ¿©ºÎ - USE_2B : 2B / 2C »ç¿ë ¿©ºÎ ==================================================================*/ #define USE_CODE_SWITCH 0 typedef struct tag_S5H2C_info { OS_SEMAPHORE_ID Mutex; DS_U32 OrenI2cAddr; /* DS_U16 Tda9885Addr; */ /* DS_U16 TunerAddr; TunerAddrÀº »ç¿ëµÇÁö ¾ÊÀ½. -- OREN DemodulatorÀÇ I2C¿¡ ¹°·ÁÀÖÀ½. */ /* Current FAT channel information. */ DS_U32 FATFreq; TunerDemod CurFATDemod; DS_U8 *pMicroCode; DS_U16 microCodeLen; DS_U32 bInitialized; DS_U8 isNtsc; } *P_S5H_INFO, S5H_INFO; S5H_INFO g_S5H_info; P_S5H_INFO pS5H = &g_S5H_info; int S5H_SetFrequencyDTV( DS_U32 dMHz ); int S5H_GetVersion( DS_U32 *pVersion ) { DS_U32 version; version = 0x00000001; *pVersion = version; return 0; } int S5H_Initialize(void) { DS_BOOL retVal = 0; static int sem_initialized = 0; if ( sem_initialized == 0 ) { pS5H->Mutex = OS_CreateBinarySemaphore( "S5H_Sema4", 0, 1 ); if ( pS5H->Mutex == (OS_SEMAPHORE_ID)0 ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT, "ERROR: OS_CreateMutexSemaphore\n"); retVal = -1; goto done; } pS5H->OrenI2cAddr = 0; sem_initialized = 1; } DHL_SYS_SetGPIO(GPIO_DEMOD_RESETN, 0); OS_mDelay(200); DHL_SYS_SetGPIO(GPIO_DEMOD_RESETN, 1); OS_mDelay(200); retVal = S5H1411x_Initialize(); if (retVal != OK) { DHL_DbgPrintf(0,DHLDBG_EXT, "ERROR: Cannot Initialize S5H1409.Line : %d \n",__LINE__); retVal = -1; } #ifndef SERIAL_TS retVal = S5H1411x_TS_ParallelMode(); #else retVal = S5H1411x_TS_SerialMode(); #endif if (retVal != OK) { DHL_DbgPrintf(0,DHLDBG_EXT, "ERROR: Cannot Initialize S5H1409.Line : %d \n",__LINE__); retVal = -1; } done: return retVal; } /**************************************************************************** S5H_Start() Summary : Start Oren demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int S5H_Start( TunerDemod Demod, int Ntsc, int Cable ) { int retVal = 0; DS_U8 sdmRet; DS_U32 semErr; /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; if (Ntsc) { // // ´Ü¼øÈ÷ Tuner¸¸ Æ©´×ÇÏÀÚ. // sdmRet = S5H1411x_SleepOn(); if (sdmRet) { printf("|%s| ERROR, LINE=%d\n", __FUNCTION__, __LINE__); retVal = -1; goto done; } #if NIMTN_TYPE==NIMTN_DTT7611 retVal = Tuner_DTT7611SendFreq( pS5H->FATFreq, TUNERDTT7611_REF_DIVIDER_RATIO_62_5, TUNERDTT7611_AGC_WIDE_BAND_OFF, 2, TUNERDTT7611_CHARGE_PUMP_60, TUNERDTT7611_AGC_TIME_CONSTANT_2_SEC ); if ( retVal != DTT7611_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, Result = %d\n", __LINE__, retVal ); retVal = -1; } #elif NIMTN_TYPE==NIMTN_U7A06 retVal = Tuner_U7A06_SendFreq( pS5H->FATFreq, Demod ); if ( retVal < 0 ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, Result = %d\n", __LINE__, retVal ); retVal = -1; } #elif NIMTN_TYPE==NIMTN_DTVS205 retVal = TunerDTVS205FH201ASendFreq( pS5H->FATFreq, TUNERDTVS205FH201A_REF_DIVIDER_RATIO_62_5, TUNERDTVS205FH201A_AGC_WIDE_BAND_OFF,0,TUNERDTVS205FH201A_CHARGE_PUMP_100, TUNERDTVS205FH201A_AGC_TIME_CONSTANT_2_SEC ); // retVal = Tuner_DTT7611SendFreq( pS5H->FATFreq, TUNERDTT7611_REF_DIVIDER_RATIO_62_5, TUNERDTT7611_AGC_WIDE_BAND_OFF, 2, TUNERDTT7611_CHARGE_PUMP_60, TUNERDTT7611_AGC_TIME_CONSTANT_2_SEC ); if ( retVal != DTVS205FH201A_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, Result = %d\n", __LINE__, retVal ); retVal = -1; } #elif NIMTN_TYPE==NIMTN_U7A26 retVal = Tuner_U7A26_SendFreq( pS5H->FATFreq, Demod ); if ( retVal < 0 ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, Result = %d\n", __LINE__, retVal ); retVal = -1; } #else #error NIMTN_TYPE shall be defined first. #endif sdmRet = S5H1411x_RepeaterDisable(); if (sdmRet) { printf("|%s| ERROR, LINE=%d\n", __FUNCTION__, __LINE__); retVal = -1; goto done; } sdmRet = S5H1411x_SoftReset(); if (sdmRet) { printf("|%s| ERROR, LINE=%d\n", __FUNCTION__, __LINE__); retVal = -1; goto done; } // Sdm_1409xSetQamInterleave(FALSE); } else { sdmRet = S5H1411x_SleepOff(); if (sdmRet) { printf("|%s| ERROR, LINE=%d\n", __FUNCTION__, __LINE__); retVal = -1; goto done; } if ( Demod == DEMOD_8VSB ) { // sdmRet = Sdm_1409SetScanMode(TRUE); if (sdmRet) { printf("|%s| ERROR, LINE=%d\n", __FUNCTION__, __LINE__); retVal = -1; goto done; } } #if NIMTN_TYPE==NIMTN_DTT7611 retVal = Tuner_DTT7611SendFreq( pS5H->FATFreq, TUNERDTT7611_REF_DIVIDER_RATIO_62_5, TUNERDTT7611_AGC_93, 1, TUNERDTT7611_CHARGE_PUMP_60, TUNERDTT7611_AGC_TIME_CONSTANT_2_SEC ); if ( retVal != DTT7611_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, Result = %d\n", __LINE__, retVal ); retVal = -1; goto done; } #elif NIMTN_TYPE==NIMTN_U7A06 retVal = Tuner_U7A06_SendFreq( pS5H->FATFreq, Demod ); if ( retVal < 0 ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, Result = %d\n", __LINE__, retVal ); retVal = -1; goto done; } #elif NIMTN_TYPE==NIMTN_DTVS205 retVal = TunerDTVS205FH201ASendFreq( pS5H->FATFreq, TUNERDTVS205FH201A_REF_DIVIDER_RATIO_62_5, TUNERDTVS205FH201A_AGC_WIDE_BAND_OFF,0,TUNERDTVS205FH201A_CHARGE_PUMP_100, TUNERDTVS205FH201A_AGC_TIME_CONSTANT_2_SEC ); // retVal = Tuner_DTT7611SendFreq( pS5H->FATFreq, TUNERDTT7611_REF_DIVIDER_RATIO_62_5, TUNERDTT7611_AGC_WIDE_BAND_OFF, 2, TUNERDTT7611_CHARGE_PUMP_60, TUNERDTT7611_AGC_TIME_CONSTANT_2_SEC ); if ( retVal != DTVS205FH201A_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, Result = %d\n", __LINE__, retVal ); retVal = -1; goto done; } #elif NIMTN_TYPE==NIMTN_U7A26 retVal = Tuner_U7A26_SendFreq( pS5H->FATFreq, Demod ); if ( retVal < 0 ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, Result = %d\n", __LINE__, retVal ); retVal = -1; goto done; } #else #error NIMTN_TYPE shall be defined first. #endif switch(Demod) { case DEMOD_8VSB: sdmRet = S5H1411x_VsbMode(); break; case DEMOD_QAM: sdmRet = S5H1411x_QamMode(); break; case DEMOD_64QAM: sdmRet = S5H1411x_64QamMode(); break; case DEMOD_256QAM: sdmRet = S5H1411x_256QamMode(); break; case DEMOD_OFF: break; case DEMOD_ISDBT: case DEMOD_ISDBT_MANUAL: default: printf("|%s| ERROR, LINE=%d\n", __FUNCTION__, __LINE__); goto done; } if (sdmRet) { printf("|%s| ERROR, LINE=%d\n", __FUNCTION__, __LINE__); goto done; } if ( Demod == DEMOD_8VSB ) { // sdmRet = Sdm_1409SetScanMode(FALSE); if (sdmRet) { printf("|%s| ERROR, LINE=%d\n", __FUNCTION__, __LINE__); retVal = -1; goto done; } } } pS5H->CurFATDemod = Demod; DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"dMHz = %ld Mode=%s(%d)\n", pS5H->FATFreq, Demod == DEMOD_8VSB ? "8VSB" : Demod == DEMOD_QAM ? "QAM" : Demod == DEMOD_64QAM ? "64QAM" : Demod == DEMOD_256QAM ? "256QAM" : Demod == DEMOD_NTSC ? "NTSC" : Demod == DEMOD_ISDBT ? "ISDB-T" :"Unknown", Demod); done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; if (!retVal) DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"success.\n"); else DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"failure.\n"); return retVal; } /**************************************************************************** S5H_Stop() Summary : Stop the Oren demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int S5H_Stop(void) { int retVal = 0; DS_U32 semErr; /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; /* DO NOTHING. */ /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** S5H_Close() Summary : Close the Oren demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int S5H_Close(void) { int retVal = 0; DS_U32 semErr; /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; /* DO NOTHING */ goto done; done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** S5H_Reset() Summary : Reset the Oren demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int S5H_Reset(void) { int retVal = 0; DS_U32 semErr; /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** S5H_SetFrequency() Summary : Set Frequency Returns : 0 on success, others on failure. ************************************************************************^^*/ int S5H_SetFrequencyNTSC( DS_U32 dMHz ) { int retVal = 0; DS_U32 semErr; /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; pS5H->FATFreq = dMHz; S5H1411x_SleepOn(); #if NIMTN_TYPE==NIMTN_DTT7611 retVal = Tuner_DTT7611SendFreq( dMHz, TUNERDTT7611_REF_DIVIDER_RATIO_62_5, TUNERDTT7611_AGC_WIDE_BAND_OFF, 2, TUNERDTT7611_CHARGE_PUMP_60, TUNERDTT7611_AGC_TIME_CONSTANT_2_SEC ); if ( retVal != DTT7611_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, Result = %d\n", __LINE__, retVal ); retVal = -1; } #elif NIMTN_TYPE==NIMTN_U7A06 retVal = Tuner_U7A06_SendFreq( dMHz, DEMOD_NTSC ); if ( retVal < 0 ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, Result = %d\n", __LINE__, retVal ); retVal = -1; } #elif NIMTN_TYPE==NIMTN_DTVS205 retVal = TunerDTVS205FH201ASendFreq( dMHz, TUNERDTVS205FH201A_REF_DIVIDER_RATIO_62_5, TUNERDTVS205FH201A_AGC_WIDE_BAND_OFF,0,TUNERDTVS205FH201A_CHARGE_PUMP_100, TUNERDTVS205FH201A_AGC_TIME_CONSTANT_2_SEC ); // retVal = Tuner_DTT7611SendFreq( pS5H->FATFreq, TUNERDTT7611_REF_DIVIDER_RATIO_62_5, TUNERDTT7611_AGC_WIDE_BAND_OFF, 2, TUNERDTT7611_CHARGE_PUMP_60, TUNERDTT7611_AGC_TIME_CONSTANT_2_SEC ); if ( retVal != DTVS205FH201A_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, Result = %d\n", __LINE__, retVal ); retVal = -1; } #elif NIMTN_TYPE==NIMTN_U7A26 retVal = Tuner_U7A26_SendFreq( dMHz, DEMOD_NTSC ); if ( retVal < 0 ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, Result = %d\n", __LINE__, retVal ); retVal = -1; } #else #error NIMTN_TYPE shall be defined first. #endif S5H1411x_RepeaterDisable(); /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } // // Tuner Á¦¾îÇÏÁö ¾Ê°í, ³»ºÎÀûÀ¸·Î TuningÇÒ Á֯ļö¸¦ ¸í½ÃÇÏ´Â ÇÔ¼ö. // ¼³Á¤µÈ Á֯ļö´Â ´ÙÀ½ S5H_Start() È£Ã⠽ÿ¡ Àû¿ëµÊ. // int S5H_SetFrequency( DS_U32 dMHz ) { int retVal = 0; DS_U32 semErr; DS_U32 freq; /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; freq = (DS_U32)dMHz; pS5H->FATFreq = freq; DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"dMHz = %d\n", (int)freq ); /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } DS_U32 S5H_GetFrequency(void) { return pS5H->FATFreq; } /**************************************************************************** S5H_GetLockStatus() Summary : Set Frequency Returns : 0 on success, others on failure. ************************************************************************^^*/ int S5H_GetLockStatus( int *pLockStatus ) { int retVal = 0; DS_U32 semErr; DS_U16 lock; /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; if (pS5H->CurFATDemod != DEMOD_NTSC) { lock = S5H1411x_Vsb_QAM_Master_Lock(); *pLockStatus = lock ? 1 : 0; switch(pS5H->CurFATDemod) { case DEMOD_8VSB: lock = S5H1411x_Vsb_Sync_Lock(); break; case DEMOD_QAM: case DEMOD_256QAM: case DEMOD_64QAM: lock = S5H1411x_QAM_Eq_Lock(); break; case DEMOD_OFF: case DEMOD_ISDBT: case DEMOD_ISDBT_MANUAL: break; default: printf("|%s| ERROR: Invalid demodulation mode=%d\n", __FUNCTION__, pS5H->CurFATDemod); } } else { /* shall be implemented. */ *pLockStatus = 0; } /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } int S5H_GetLockStatusNTSC( int *pLockStatus ) { int retVal = 0; DS_U32 semErr; /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** S5H_GetSignalStrength() Summary : Get signal strength from demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int S5H_GetSignalStrength( int *pSQI ) { #if 0 int retVal = 0; #endif DS_U32 semErr; float SNR = 0; int maxSNR = 30; TunerDemod mode; if ( pS5H->CurFATDemod == DEMOD_NTSC ) { *pSQI = 0; return 0; } /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; if (pS5H->CurFATDemod == DEMOD_QAM){ if(S5H1411x_Get_QAMMode()){ mode = DEMOD_256QAM; }else{ mode = DEMOD_64QAM; } }else{ mode = pS5H->CurFATDemod; } switch(mode) { case DEMOD_8VSB: { maxSNR=30; SNR = S5H1411x_VsbAGCResultCheck(); break; } case DEMOD_64QAM: { SNR = S5H1411x_QamAGCResultCheck(); maxSNR=30; break; } case DEMOD_256QAM: { SNR = S5H1411x_QamAGCResultCheck(); break; } case DEMOD_QAM: { SNR = S5H1411x_QamAGCResultCheck(); maxSNR=30; break; } default: goto done; } done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); #if 0 if ( semErr != 0 ) retVal = -1; SNR = (SNR / 0xffff)*100; SNR = 100 - SNR; #endif *pSQI = SNR; return 0; } int S5H_GetSignalPower( int *pPower ) { int retVal = 0; DS_U32 semErr; /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** S5H_GetSNR Summary : Get signal strength from demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int S5H_GetSNR( float *pSNR ) { int retVal = 0; DS_U32 semErr; double SNR = 0.0; /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; if (pS5H->CurFATDemod == DEMOD_NTSC) { *pSNR = 6; } else { switch(pS5H->CurFATDemod) { case DEMOD_8VSB: SNR = S5H1411x_VsbSnrResultCheck(); break; case DEMOD_QAM: case DEMOD_256QAM: case DEMOD_64QAM: SNR = S5H1411x_QamSnrResultCheck(); break; default: printf("|%s| ERROR: Invalid demodulation mode=%d\n", __FUNCTION__, pS5H->CurFATDemod); } } if ( SNR == 77 ) *pSNR = 0.0; else *pSNR = SNR; /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** S5H_GetModFormat Summary : Get signal strength from demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int S5H_GetModFormat( TunerDemod *mode ) { int retVal = 0; DS_U32 semErr; //TunerDemod qam_mode; semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; if (pS5H->CurFATDemod == DEMOD_QAM) { if(S5H1411x_Get_QAMMode()){ *mode = DEMOD_256QAM; }else{ *mode = DEMOD_64QAM; } //qam_mode = S5H1411x_Get_QAMMode(); //*mode = qam_mode; } else *mode = pS5H->CurFATDemod; /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** S5H_GetErrCount Summary : Get signal strength from demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int S5H_GetErrCount( DS_U32 *pRSErrCnt ) { int retVal = 0; DS_U32 semErr; /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; // *pRSErrCnt = Sdm_1409xGetRSErrCnt(); /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** S5H_GetTDA9885Reg Summary : Returns : 0 on success, others on failure. ************************************************************************^^*/ int S5H_GetTDA9885Reg( DS_U8 *pStatus ) { int retVal = 0; DS_U32 semErr; #if ((NIMTN_TYPE==NIMTN_DTT7611) || (NIMTN_TYPE==NIMTN_U7A06) || (NIMTN_TYPE == NIMTN_U7A26)) DS_U8 data; #endif /* Take Mutex. */ semErr = OS_TakeSemaphore( pS5H->Mutex ); if ( semErr != 0 ) return -1; #if NIMTN_TYPE==NIMTN_DTT7611 data = Tuner_GetTDA9885(); *pStatus = data; #elif NIMTN_TYPE==NIMTN_U7A06 data = Tuner_U7A06GetADC(); *pStatus = data; #elif NIMTN_TYPE==NIMTN_U7A26 data = Tuner_U7A26GetADC(); *pStatus = data; #endif /* Give Mutex. */ semErr = OS_GiveSemaphore( pS5H->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } // // Notes: Standard ÁöÁ¤Çϸé, ´ÙÀ½ Æ©´× ¶§¿¡ Àû¿ëµÊ. // int S5H_SetAudioStandard( DS_U32 AudioStandard) { int err = 0; return err; } int S5H_SetAudioMode( DS_U32 AudioMode ) { int err = 0; return err; } int S5H_GetAudioMode( DS_U32 *pAudioMode ) { int err = 0; return err; } int S5H_GetAudioStandard( DS_U32 *pAudioStandard ) { return 0; }