/** * a basic function fo AnalogOpen, open analog power * @param DeviceType analog part power * @return status_t */ status_t AudioPlatformDevice::AnalogOpen(AudioAnalogType::DEVICE_TYPE DeviceType) { ALOGD("AudioPlatformDevice AnalogOpen DeviceType = %s ", kAudioAnalogDeviceTypeName[DeviceType]); uint32 ulFreq, dlFreq; mLock.lock(); if (mBlockAttribute[DeviceType].mEnable == true) { ALOGW("AudioPlatformDevice AnalogOpen bypass with DeviceType = %d", DeviceType); mLock.unlock(); return NO_ERROR;; } mBlockAttribute[DeviceType].mEnable = true; // here to open pmic digital part ulFreq = GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]); dlFreq = GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]); switch (DeviceType) { case AudioAnalogType::DEVICE_OUT_EARPIECER: case AudioAnalogType::DEVICE_OUT_EARPIECEL: #if 0 mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100); // AUD 26M clock power down release mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1 , GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0x000f); mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG0 , GetDLNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]) << 12, 0xf000); TopCtlChangeTrigger(); mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON5 , 0x28, 0x003f); //Use Default SDM Gain 0x28/0x3f = 0.63 mAudioAnalogReg->SetAnalogReg(ABB_AFE_TOP_CON0 , 0, 0xffff); //Use Normal Path mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON2 , 0, 0xffff); //Use Normal Path mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0 , 1, 0x0001); //Enable DL path TopCtlChangeTrigger(); #else mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100); // AUD 26M clock power down release mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG0, GetDLNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]) << 12 | 0x330, 0xffff); // config up8x_rxif mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1, dlFreq, 0x000f); // DL sampling rate TopCtlChangeTrigger(); mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0, 0x0001, 0x0001); // turn on DL #endif break; case AudioAnalogType::DEVICE_OUT_HEADSETR: case AudioAnalogType::DEVICE_OUT_HEADSETL: #if 0 mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100); // AUD 26M clock power down release mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1 , GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0x000f); mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG0 , GetDLNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]) << 12, 0xf000); TopCtlChangeTrigger(); mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON5 , 0x28, 0x003f); //Use Default SDM Gain 0x28/0x3f = 0.63 mAudioAnalogReg->SetAnalogReg(ABB_AFE_TOP_CON0 , 0, 0xffff); //Use Normal Path mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON2 , 0, 0xffff); //Use Normal Path mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0 , 1, 0x0001); //Enable DL path TopCtlChangeTrigger(); #else mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100); // AUD 26M clock power down release mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG0, GetDLNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]) << 12 | 0x330, 0xffff); // config up8x_rxif mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1, dlFreq, 0x000f); // DL sampling rate //DC compensation setting ALOGD("AnalogOpen mHpRightDcCalibration [0x%x] mHpLeftDcCalibration [0x%x]", mHpRightDcCalibration, mHpLeftDcCalibration); mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON3, mHpLeftDcCalibration, 0xffff); // LCH cpmpensation value mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON4, mHpRightDcCalibration, 0xffff); // RCH cpmpensation value mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON10, 0x0001, 0x0001); // enable DC cpmpensation DCChangeTrigger();//Trigger DC compensation TopCtlChangeTrigger(); mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0, 0x0001, 0x0001); // turn on DL #endif break; case AudioAnalogType::DEVICE_OUT_SPEAKERR: case AudioAnalogType::DEVICE_OUT_SPEAKERL: #ifdef USING_EXTAMP_HP mLock.unlock(); AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR); mLock.lock(); #else mLock.unlock(); AnalogOpen(AudioAnalogType::DEVICE_OUT_EARPIECER); mLock.lock(); #endif break; case AudioAnalogType::DEVICE_OUT_SPEAKER_HEADSET_R: case AudioAnalogType::DEVICE_OUT_SPEAKER_HEADSET_L: mLock.unlock(); AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR); mLock.lock(); break; case AudioAnalogType::DEVICE_IN_ADC1: case AudioAnalogType::DEVICE_IN_ADC2: ALOGD("AudioPlatformDevice::DEVICE_IN_ADC2:"); #if 0 mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100); // AUD 26M clock power down release mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1 , GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 4, 0x0010); mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG2, 0x302F | (GetULNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 10), 0xffff); // config UL up8x_rxif adc voice mode TopCtlChangeTrigger(); mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0 , 0x02, 0x0002); //Enable UL path TopCtlChangeTrigger(); #else mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100); // AUD 26M clock power down release mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG2, 0x302F | (GetULNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 10), 0xffff); // config UL up8x_rxif adc voice mode mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1, GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 4, 0x0010); // UL sampling rate TopCtlChangeTrigger(); mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0, 0x0002, 0x0002); // turn on UL #endif break; case AudioAnalogType::DEVICE_IN_DIGITAL_MIC: #if 0 mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100); // AUD 26M clock power down release mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1 , GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]), 0x0010); mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG2, 0x302F | (GetULNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 10), 0xffff); // config UL up8x_rxif adc voice mode TopCtlChangeTrigger(); mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON9 , 0x0011, 0x0011); // enable digital mic, 3.25M clock rate mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0 , 0x02, 0x0002); //Enable UL path TopCtlChangeTrigger(); #else mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100); // AUD 26M clock power down release mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG2, 0x302F | (GetULNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 10), 0xffff); // config UL up8x_rxif adc voice mode mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1, GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 4, 0x0010); // UL sampling rate TopCtlChangeTrigger(); mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON9, 0x0011, 0x0011); // enable digital mic, 3.25M clock rate mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0, 0x0002, 0x0002); // turn on UL #endif break; case AudioAnalogType::DEVICE_2IN1_SPK: if (IsAudioSupportFeature(AUDIO_SUPPORT_2IN1_SPEAKER)) { mLock.unlock(); AnalogOpen(AudioAnalogType::DEVICE_OUT_EARPIECER); mLock.lock(); } break; } mLock.unlock(); return NO_ERROR; }
/** * a basic function fo AnalogOpen, open analog power * @param DeviceType analog part power * @return status_t */ status_t AudioPlatformDevice::AnalogOpen(AudioAnalogType::DEVICE_TYPE DeviceType) { ALOGD("AudioPlatformDevice DeviceType = %s", kAudioAnalogDeviceTypeName[DeviceType]); mLock.lock (); if(mBlockAttribute[DeviceType].mEnable == true) { ALOGW("AudioPlatformDevice AnalogOpen with DeviceType = %d",DeviceType); mLock.unlock (); return NO_ERROR;; } mBlockAttribute[DeviceType].mEnable = true; switch(DeviceType) { case AudioAnalogType::DEVICE_OUT_EARPIECER: case AudioAnalogType::DEVICE_OUT_EARPIECEL: mAudioAnalogReg->SetAnalogReg(0x0106 ,0x0003,0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 ,0x0006,0xffff); mAudioAnalogReg->SetAnalogReg(0x4034 ,0xc3a1,0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 ,0x0003,0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 ,0x000b,0xffff); mAudioAnalogReg->SetAnalogReg(0x400C , 0x001e, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4002 , 0x0300 | GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0xffff); mAudioAnalogReg->SetAnalogReg(0x4000 , 0x007f, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4004 , 0x1801, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4006 , 0x0000, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4012 , 0x00e1, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4024 , 0x0000, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4022 , 0x004f, 0xffff); break; case AudioAnalogType::DEVICE_OUT_HEADSETR: case AudioAnalogType::DEVICE_OUT_HEADSETL: mAudioAnalogReg->SetAnalogReg(0x0106 , 0x0003, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0006, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4034 , 0xc3a1, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0003, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 , 0x000b, 0xffff); mAudioAnalogReg->SetAnalogReg(0x400C , 0x001e, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4002 , 0x0300 | GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0x0ffff); mAudioAnalogReg->SetAnalogReg(0x4000 , 0x007f, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4004 , 0x1801, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4006 , 0x0000, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4012 , 0x00e1, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4024 , 0x0000, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4022 , 0x004f, 0xffff); break; case AudioAnalogType::DEVICE_OUT_SPEAKERR: case AudioAnalogType::DEVICE_OUT_SPEAKERL: #ifdef USING_EXTAMP_HP mLock.unlock (); AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR); mLock.lock (); #else mAudioAnalogReg->SetAnalogReg(0x0106 , 0x0607, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0006, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4034 , 0xc3a1, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0003, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 , 0x000b, 0xffff); mAudioAnalogReg->SetAnalogReg(0x400C , 0x001e, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4002 , 0x0300 | GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0x0ffff); mAudioAnalogReg->SetAnalogReg(0x4000 , 0x007f, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4004 , 0x1801, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4006 , 0x0000, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4012 , 0x00e1, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4024 , 0x0000, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4022 , 0x004f, 0xffff); #endif break; case AudioAnalogType::DEVICE_OUT_SPEAKER_HEADSET_R: case AudioAnalogType::DEVICE_OUT_SPEAKER_HEADSET_L: mAudioAnalogReg->SetAnalogReg(0x0106 , 0x0607, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0006, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4034 , 0xc3a1, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0003, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 , 0x000b, 0xffff); mAudioAnalogReg->SetAnalogReg(0x400C , 0x001e, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4002 , 0x0300 | GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0x0ffff); mAudioAnalogReg->SetAnalogReg(0x4000 , 0x007f, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4004 , 0x1801, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4006 , 0x0000, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4012 , 0x00e1, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4024 , 0x0000, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4022 , 0x004f, 0xffff); break; case AudioAnalogType::DEVICE_IN_ADC1: case AudioAnalogType::DEVICE_IN_ADC2: ALOGD("AudioPlatformDevice::DEVICE_IN_ADC2:"); mAudioAnalogReg->SetAnalogReg(0x0106 ,0x0003,0xffff); mAudioAnalogReg->SetAnalogReg(0x0712 ,0x0000,0x0002); mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0000,0xffff); mAudioAnalogReg->SetAnalogReg(0x0712 ,0x0002,0x0002); mAudioAnalogReg->SetAnalogReg(0x4026 ,0x0000,0xffff); mAudioAnalogReg->SetAnalogReg(0x400e ,0x0000|GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]),0xffff); mAudioAnalogReg->SetAnalogReg(0x4000 ,0x007f,0xffff); #ifdef MTK_AUDIO_HD_REC_SUPPORT mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0201,0xffff); #else mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0601,0xffff); #endif mAudioAnalogReg->SetAnalogReg(0x4020 ,0x004f,0xffff); usleep(600); mAudioAnalogReg->SetAnalogReg(0x400e ,0x0000,0xffff); usleep(600); mAudioAnalogReg->SetAnalogReg(0x400e ,0x0000|GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]),0xffff); usleep(600); mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0000,0xffff); usleep(600); #ifdef MTK_AUDIO_HD_REC_SUPPORT mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0201,0xffff); #else mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0601,0xffff); #endif break; case AudioAnalogType::DEVICE_IN_DIGITAL_MIC: mAudioAnalogReg->SetAnalogReg(0x0106 ,0x0003,0xffff); mAudioAnalogReg->SetAnalogReg(0x0712 ,0x0000,0x0002); mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0000,0xffff); mAudioAnalogReg->SetAnalogReg(0x4026 ,0x0000,0xffff); mAudioAnalogReg->SetAnalogReg(0x400e ,0x00e0|GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]),0xffff); mAudioAnalogReg->SetAnalogReg(0x4000 , 0x007f, 0xffff); #ifdef MTK_AUDIO_HD_REC_SUPPORT mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0023,0xffff); #else mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0423,0xffff); #endif mAudioAnalogReg->SetAnalogReg(0x4020 ,0x004f,0xffff); // reset to default samplerate usleep(600); mAudioAnalogReg->SetAnalogReg(0x400e ,0x00e0,0xffff); usleep(600); mAudioAnalogReg->SetAnalogReg(0x400e ,0x00e0|GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]),0xffff); usleep(600); break; case AudioAnalogType::DEVICE_2IN1_SPK: mAudioAnalogReg->SetAnalogReg(0x0106 , 0x0607, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0006, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4034 , 0xc3a1, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0003, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4038 , 0x000b, 0xffff); mAudioAnalogReg->SetAnalogReg(0x400C , 0x001e, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4002 , 0x0300 | GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0x0ffff); mAudioAnalogReg->SetAnalogReg(0x4000 , 0x007f, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4004 , 0x1801, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4006 , 0x0000, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4012 , 0x00e1, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4024 , 0x0000, 0xffff); mAudioAnalogReg->SetAnalogReg(0x4022 , 0x004f, 0xffff); break; } mLock.unlock (); return NO_ERROR; }