int AtMaudMode(brcm_alsa_chip_t *pChip, Int32 ParamCount, Int32 *Params) { AUDIO_SOURCE_Enum_t mic = AUDIO_SOURCE_ANALOG_MAIN; AUDIO_SINK_Enum_t spk = AUDIO_SINK_HANDSET; AudioMode_t mode = AUDIO_SINK_HANDSET; AudioApp_t app = AUDIO_APP_VOICE_CALL, currapp; int rtn = 0; /* 0 means Ok */ static UInt8 loopback_status = 0, loopback_input = 0, loopback_output = 0, sidetone_mode = 0; static UInt8 loopback_api_input, loopback_api_output; Int32 pCurSel[2]; aTrace(LOG_AUDIO_DRIVER, "%s P1-P6=%ld %ld %ld %ld %ld %ld cnt=%ld\n", __func__, Params[0], Params[1], Params[2], Params[3], Params[4], Params[5], ParamCount); csl_caph_ControlHWClock(TRUE); switch (Params[0]) { case 0: /* at*maudmode 0 */ break; case 1: /* at*maudmode 1 mode */ break; case 8: /* at*maudmode=8 */ Params[0] = loopback_status; aTrace(LOG_AUDIO_DRIVER, " %s loopback status is %d\n", __func__, loopback_status); DEBUG(" %s loopback status is %d\n", __func__, loopback_status); break; case 9: /* at*maudmode=9,x. x = 0 --> disable; x =1 enable */ loopback_status = Params[1]; if (loopback_status > 1) loopback_status = 1; aTrace(LOG_AUDIO_DRIVER, " %s set loopback status %d (1:ena 0:dis)\n", __func__, loopback_status); break; case 10: /* at*maudmode=10 --> get loopback path */ /* Per PCG request if (loopback_output > 2) loopback_output = 2; */ Params[0] = loopback_input; Params[1] = loopback_output; aTrace(LOG_AUDIO_DRIVER, "%s loopback path is from src %d to sink %d\n", __func__, loopback_input, loopback_output); break; /* at*maudmode=11,x,y --> set loopback path. */ /* mic: 0 = default mic, 1 = main mic */ /* spk: 0 = handset, 1 = headset, 2 = loud speaker */ case 11: loopback_input = loopback_api_input = Params[1]; loopback_output = loopback_api_output = Params[2]; sidetone_mode = Params[3]; if (((loopback_input > 6) && (loopback_input != 11)) || ((loopback_output > 2) && (loopback_output != 9) && (loopback_output != 4))) { aError( "%s srr/sink exceeds its range.\n", __func__); rtn = -1; break; } if (loopback_output == 2) /* use IHF */ loopback_api_output = 4; if (loopback_input == 0) /* default mic: use main mic */ loopback_api_input = 1; loopback_status = 1; /* enable the HW loopback without DSP. */ AUDCTRL_SetAudioLoopback(TRUE, loopback_api_input, loopback_api_output, sidetone_mode); aTrace(LOG_AUDIO_DRIVER, "%s ena lpback: src %d sink %d sidetone %d\n", __func__, loopback_api_input, loopback_api_output, sidetone_mode); break; case 12: /* at*maudmode=12 --> disable loopback path */ loopback_status = 0; AUDCTRL_SetAudioLoopback(FALSE, loopback_api_input, loopback_api_output, sidetone_mode); aTrace(LOG_AUDIO_DRIVER, "%s dis lpback: src %d sink %d sidetone %d\n", __func__, loopback_api_input, loopback_api_output, sidetone_mode); break; case 13: /* at*maudmode=13 --> Get call ID */ aError( "%s get call ID is not supported\n", __func__); rtn = -1; break; /* at*maudmode=14 --> read current mode and app */ case 14: Params[0] = AUDCTRL_GetAudioApp(); Params[1] = AUDCTRL_GetAudioMode(); aTrace(LOG_AUDIO_DRIVER, "%s app %ld mode %ld\n", __func__, Params[0], Params[1]); break; /* at*maudmode=15 --> set current mode and app */ case 15: app = Params[1]; mode = Params[2]; AUDCTRL_GetSrcSinkByMode(mode, &mic, &spk); pCurSel[0] = pChip->streamCtl[CTL_STREAM_PANEL_VOICECALL - 1].iLineSelect[0]; /* save current setting */ pCurSel[1] = pChip-> streamCtl[CTL_STREAM_PANEL_VOICECALL - 1].iLineSelect[1]; /* Update 'VC-SEL' -- */ pChip->streamCtl[CTL_STREAM_PANEL_VOICECALL - 1]. iLineSelect[0] = mic; pChip->streamCtl[CTL_STREAM_PANEL_VOICECALL - 1]. iLineSelect[1] = spk; #ifdef CONFIG_BCM_MODEM RPC_SetProperty(RPC_PROP_AUDIO_MODE, (UInt32)(app * AUDIO_MODE_NUMBER + mode)); #endif /* for PCG to set new app */ currapp = AUDCTRL_GetAudioApp(); if (currapp != app) { /* Remove the current app before setting the new app */ AUDCTRL_RemoveAudioApp(currapp); AUDCTRL_SaveAudioApp(app); } if (app == AUDIO_APP_VOICE_CALL || app == AUDIO_APP_VOICE_CALL_WB || app == AUDIO_APP_VT_CALL || app == AUDIO_APP_VT_CALL_WB) { AUDCTRL_SetTelephonyMicSpkr(mic, spk, false); AUDCTRL_SetAudioMode(mode, app); } else if (app == AUDIO_APP_MUSIC) { if (AUDCTRL_InVoiceCall() == FALSE) { AUDCTRL_SwitchPlaySpk_forTuning(mode); AUDCTRL_SaveAudioMode(mode); AUDCTRL_SaveAudioApp(app); } } else { /* Handling all other apps cases */ /* For PCG to set new Mode */ AUDCTRL_SetAudioMode(mode, app); } aTrace(LOG_AUDIO_DRIVER, "%s mic %d spk %d mode %ld app %ld\n", __func__, mic, spk, Params[2], Params[1]); break; /* read back AUDIO_APP_NUMBER and AUDIO_APP_MM_NUMBER */ /* needs to match to enum AudioTuneCommand_t in at_audtune.c */ case 16: Params[0] = AUDIO_APP_NUMBER; Params[1] = AUDIO_APP_MM_NUMBER; break; case 99: /* at*maudmode=99 --> stop tuning */ break; /* at*maudmode=100 --> set external audio amplifer gain in PMU */ /* PCG and loadcal currently use Q13p2 gain format */ case 100: { short gain; gain = (short)Params[3]; if (Params[1] == 3) { aTrace(LOG_AUDIO_DRIVER, "Params[2] = %d, " "Params[3] %d, audio mode %d\n", (int)Params[2], (int)Params[3], AUDCTRL_GetAudioMode()); if ((Params[2] == PARAM_PMU_SPEAKER_PGA_LEFT_CHANNEL) || (Params[2] == PARAM_PMU_SPEAKER_PGA_RIGHT_CHANNEL)) { if (AUDCTRL_GetAudioMode() == AUDIO_MODE_HEADSET || AUDCTRL_GetAudioMode() == AUDIO_MODE_TTY) { aTrace(LOG_AUDIO_DRIVER, "%s ext headset " "speaker gain = %d\n", __func__, gain); if (Params[2] == PARAM_PMU_SPEAKER_PGA_LEFT_CHANNEL) extern_hs_set_gain(gain*25, AUDIO_HS_LEFT); else if (Params[2] == PARAM_PMU_SPEAKER_PGA_RIGHT_CHANNEL) extern_hs_set_gain(gain*25, AUDIO_HS_RIGHT); } else if (AUDCTRL_GetAudioMode() == AUDIO_MODE_SPEAKERPHONE) { aTrace(LOG_AUDIO_DRIVER, "%s ext IHF " "speaker gain = %d\n", __func__, gain); extern_ihf_set_gain(gain*25); } } /* Params[2] checking */ aTrace(LOG_AUDIO_DRIVER, "Params[2] = %d, Params[3] %d," " audio mode %d\n", (int)Params[2], (int)Params[3], AUDCTRL_GetAudioMode()); if (Params[2] == PARAM_PMU_HIGH_GAIN_MODE_FLAG) { if (AUDCTRL_GetAudioMode() == AUDIO_MODE_SPEAKERPHONE) { aTrace(LOG_AUDIO_DRIVER, "ext IHF high gain " "mode = %d\n", (int)Params[3]); extern_ihf_en_hi_gain_mode( (int)Params[3]); } else if (AUDCTRL_GetAudioMode() == AUDIO_MODE_HEADSET || AUDCTRL_GetAudioMode() == AUDIO_MODE_TTY) { aTrace(LOG_AUDIO_DRIVER, "ext HS high gain " "mode = %d\n", (int)Params[3]); extern_hs_en_hi_gain_mode( (int)Params[3]); } } } /* if (Params[1] == 3) */ } /* case 100 */ break; default: aWarn("%s Unsupported cmd %ld\n", __func__, Params[0]); rtn = -1; break; } return rtn; }
static int HandleControlCommand(void) { AUDCTRL_SPEAKER_t spkr; switch(sgBrcm_auddrv_TestValues[1]) { case 1:// Initialize the audio controller { DEBUG(" Audio Controller Init\n"); AUDCTRL_Init (); DEBUG(" Audio Controller Init Complete\n"); } break; case 2:// Start Hw loopback { DEBUG(" Audio Loopback start\n"); spkr = sgBrcm_auddrv_TestValues[2]; AUDCTRL_SetAudioLoopback(1,AUDCTRL_MIC_MAIN,spkr); DEBUG(" Audio loopback started\n"); } break; case 3:// Dump registers { DEBUG(" Dump registers\n"); dump_audio_registers(); DEBUG(" Dump registers done \n"); } break; case 4:// Enable telephony { DEBUG(" Enable telephony\n"); AUDCTRL_EnableTelephony(AUDIO_HW_VOICE_IN,AUDIO_HW_VOICE_OUT,AUDCTRL_MIC_MAIN,AUDCTRL_SPK_HANDSET); DEBUG(" Telephony enabled \n"); } break; case 5:// Disable telephony { DEBUG(" Disable telephony\n"); AUDCTRL_DisableTelephony(AUDIO_HW_VOICE_IN,AUDIO_HW_VOICE_OUT,AUDCTRL_MIC_MAIN,AUDCTRL_SPK_HANDSET); DEBUG(" Telephony disabled \n"); } break; case 6:// switch to EP { UInt8* ahb_au_base; ahb_au_base = (UInt8*)ahb_audio_base; DEBUG(" switch to EP\n"); *((volatile UInt16 *)(ahb_au_base+DSP_AUDIO_MIXER_INPUT_SEL_R_OFFSET)) = 0x0000; *((volatile UInt16 *)(ahb_au_base+DSP_AUDIO_MIXER_INPUT_SEL_R_OFFSET)) = 0x4003; *((volatile UInt32 *) (SYSCFG_BASE_ADDR+SYSCFG_ANACR0_OFFSET)) = 0x000060ca; DEBUG(" switch to EP done \n"); } break; case 7:// switch to speaker { UInt8* ahb_au_base; ahb_au_base = (UInt8*)ahb_audio_base; DEBUG(" switch to SP\n"); *((volatile UInt16 *)(ahb_au_base+DSP_AUDIO_MIXER_INPUT_SEL_R_OFFSET)) = 0x4000; *((volatile UInt16 *)(ahb_au_base+DSP_AUDIO_MIXER_INPUT_SEL_R_OFFSET)) = 0x0003; *((volatile UInt32 *) (SYSCFG_BASE_ADDR+SYSCFG_ANACR0_OFFSET)) = 0x000060d4; DEBUG(" switch to SP done \n"); } break; default: DEBUG(" Invalid Control Command\n"); } return 0; }