FreeCalypso > hg > freecalypso-sw
view gsm-fw/L1/audio_cfile/l1audio_stereo.c @ 1020:fab048ff04b8
doc/Freerunner-Howto: update for voice calls working with the FR codec
author | Mychaela Falconia <falcon@ivan.Harhan.ORG> |
---|---|
date | Sat, 23 Apr 2016 05:17:15 +0000 |
parents | 262fcce10859 |
children |
line wrap: on
line source
/* * l1audio_stereo.c * * Control audio * * Filename l1audio_stereo.c * Copyright 2003 (C) Texas Instruments * * */ #include "l1_macro.h" #include "l1_confg.h" #define _L1AUDIO_STEREO_C_ #if (AUDIO_TASK == 1) #include "l1_types.h" #include "sys_types.h" #if (CODE_VERSION == SIMULATION) && (AUDIO_SIMULATION) #include <stdlib.h> #include <string.h> #include "iq.h" // Debug / Init hardware ("eva3.lib") #include "l1_ver.h" #include "l1_const.h" #include "l1_signa.h" #if TESTMODE #include "l1tm_defty.h" #endif #include "l1audio_const.h" #include "l1audio_cust.h" #include "l1audio_signa.h" #include "l1audio_defty.h" #include "l1audio_msgty.h" #if (L1_GTT == 1) #include "l1gtt_const.h" #include "l1gtt_defty.h" #endif //added here from e-sample for AAC #if (L1_DYN_DSP_DWNLD == 1) #include "l1_dyn_dwl_const.h" #include "l1_dyn_dwl_defty.h" #endif #if (L1_MP3 == 1) #include "l1mp3_defty.h" #endif #if (L1_MIDI == 1) #include "l1midi_defty.h" #endif //added here from e-sample for AAC #if (L1_AAC == 1) #include "l1aac_defty.h" #endif #include "l1_defty.h" #include "cust_os.h" #include "l1_msgty.h" #include "l1_varex.h" #include "l1_mftab.h" #include "l1_tabs.h" #include "l1_ctl.h" #include "l1_time.h" #include "l1_scen.h" #if (L1_STEREOPATH == 1) #include "sys_dma.h" #include "sys_inth.h" #include "abb.h" #if TESTMODE #include "l1tm_msgty.h" #endif #include "l1audio_stereo.h" #endif #else // Layer1 and debug include files. #include <ctype.h> #include <math.h> #include "l1_ver.h" #include "l1_const.h" #include "l1_signa.h" #if TESTMODE #include "l1tm_defty.h" #endif #include "l1audio_const.h" #include "l1audio_cust.h" #include "l1audio_signa.h" #include "l1audio_defty.h" #include "l1audio_msgty.h" #if (L1_GTT == 1) #include "l1gtt_const.h" #include "l1gtt_defty.h" #endif //added here from e-sample for AAC #if (L1_DYN_DSP_DWNLD == 1) #include "l1_dyn_dwl_const.h" #include "l1_dyn_dwl_defty.h" #endif #if (L1_MP3 == 1) #include "l1mp3_defty.h" #endif #if (L1_MIDI == 1) #include "l1midi_defty.h" #endif //added here from e-sample for AAC #if (L1_AAC == 1) #include "l1aac_defty.h" #endif #include "l1_defty.h" #include "cust_os.h" #include "l1_msgty.h" #include "tpudrv.h" // TPU drivers. ("eva3.lib") #include "l1_varex.h" #include "l1_proto.h" #include "l1_mftab.h" #include "l1_tabs.h" #include "mem.h" #include "armio.h" #include "timer.h" #include "timer1.h" #include "dma.h" #include "inth.h" #include "ulpd.h" #include "rhea_arm.h" #include "clkm.h" // Clockm ("eva3.lib") #include "l1_ctl.h" #include "l1_time.h" #if L2_L3_SIMUL #include "l1_scen.h" #endif #if (L1_STEREOPATH == 1) #include "sys_dma.h" #include "sys_inth.h" #include "abb.h" #if TESTMODE #include "l1tm_msgty.h" #endif #include "l1audio_stereo.h" #endif #include "l1audio_abb.h" #endif #include "l1audio_macro.h" //add the extern reference of abb_write_done #if (ANALOG == 11) #include "bspTwl3029_I2c.h" #include "bspTwl3029_Aud_Map.h" #endif #if (ANALOG == 11) Bsp_Twl3029_I2cTransReqArray l1audio_i2cTransArray; #endif #if (L1_STEREOPATH == 1) && (CODE_VERSION == NOT_SIMULATION) #if (ANALOG == 11) #include "bspTwl3029_Int_Map.h" //Add the call back function of the stereo path. void l1s_stereopath_callback(UWORD8 cbvalue) { BspTwl3029_ReturnCode returnVal = BSP_TWL3029_RETURN_CODE_FAILURE; UWORD16 count = 0; UINT8 triton_classD = 0; /* callback function info pointer */ BspTwl3029_I2C_Callback i2c_callback; BspTwl3029_I2C_CallbackPtr callbackPtr= &i2c_callback; /* I2C array */ Bsp_Twl3029_I2cTransReqArray i2cTransArray; Bsp_Twl3029_I2cTransReqArrayPtr i2cTransArrayPtr= &i2cTransArray; /* twl3029 I2C reg info struct */ BspTwl3029_I2C_RegisterInfo regInfo[10] ; BspTwl3029_I2C_RegisterInfo* regInfoPtr = regInfo; BspTwl3029_I2C_RegData tmpAudioHFTest1RegData=0; BspTwl3029_I2C_RegData tmpCtrl3RegData=0; bspTwl3029_Audio_getClassD_mode(&triton_classD); //Set the valud of abb_write_done to 1 l1s.abb_write_done = 1; switch(cbvalue) { case L1S_TWL3029_STEROPATH_START: { l1a_l1s_com.outen_cfg_task.command_commited = l1a_l1s_com.outen_cfg_task.command_requested; returnVal = BspTwl3029_I2c_shadowRegRead(BSP_TWL3029_I2C_AUD, BSP_TWL_3029_MAP_AUDIO_CTRL3_OFFSET, &tmpCtrl3RegData); returnVal = BspTwl3029_I2c_shadowRegRead(BSP_TWL3029_I2C_AUD, BSP_TWL_3029_MAP_AUDIO_HFTEST1_OFFSET, &tmpAudioHFTest1RegData); returnVal = BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD,BSP_TWL_3029_MAP_AUDIO_OUTEN1_OFFSET, l1a_l1s_com.outen_cfg_task.outen1, regInfoPtr++); count++; returnVal = BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD,BSP_TWL_3029_MAP_AUDIO_OUTEN2_OFFSET, l1a_l1s_com.outen_cfg_task.outen2, regInfoPtr++); count++; if(l1a_l1s_com.outen_cfg_task.classD == 0x01) // User wants to configure classD { if(triton_classD == 0x00) // User wants to switch on and Triton not configured for classD { returnVal= BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD, BSP_TWL_3029_MAP_CKG_TESTUNLOCK_OFFSET, 0xb6, regInfoPtr++); count++; returnVal= BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD,BSP_TWL_3029_MAP_AUDIO_OUTEN3_OFFSET, l1a_l1s_com.outen_cfg_task.outen3, regInfoPtr++); count++; tmpCtrl3RegData |= 0x80; // AUDIO_CTRL3_SPKDIGON tmpAudioHFTest1RegData = 0x01; // AUDIO_HFTEST1_SPKALLZB BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD, BSP_TWL_3029_MAP_AUDIO_CTRL3_OFFSET, tmpCtrl3RegData, regInfoPtr++); count++; BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD, BSP_TWL_3029_MAP_AUDIO_HFTEST1_OFFSET, tmpAudioHFTest1RegData, regInfoPtr++); count++; } } else if(l1a_l1s_com.outen_cfg_task.classD == 0x00) { if(triton_classD != 0x00) // User wants no to classD and Triton configured for classD { tmpCtrl3RegData &= 0x7F; // AUDIO_CTRL3_SPKDIGON tmpAudioHFTest1RegData = 0x00; // AUDIO_HFTEST1_SPKALLZB BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD, BSP_TWL_3029_MAP_AUDIO_HFTEST1_OFFSET, tmpAudioHFTest1RegData, regInfoPtr++); count++; BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD, BSP_TWL_3029_MAP_AUDIO_CTRL3_OFFSET, tmpCtrl3RegData, regInfoPtr++); count++; returnVal= BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD,BSP_TWL_3029_MAP_AUDIO_OUTEN3_OFFSET, l1a_l1s_com.outen_cfg_task.outen3, regInfoPtr++); count++; BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD, BSP_TWL_3029_MAP_CKG_TESTUNLOCK_OFFSET, 0x00, regInfoPtr++); count++; } else // User no classD & Triton also no classD { returnVal= BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD,BSP_TWL_3029_MAP_AUDIO_OUTEN3_OFFSET, l1a_l1s_com.outen_cfg_task.outen3, regInfoPtr++); count++; returnVal = BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD,BSP_TWL_3029_MAP_AUDIO_OUTEN2_OFFSET, l1a_l1s_com.outen_cfg_task.outen2, regInfoPtr++); count++; returnVal= BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD,BSP_TWL_3029_MAP_AUDIO_OUTEN3_OFFSET, l1a_l1s_com.outen_cfg_task.outen3, regInfoPtr++); count++; } } /*Switch OFF all pop modes unconditionally , it is turned on before turning on STON*/ returnVal=BspTwl3029_I2c_regQueWrite(BSP_TWL3029_I2C_AUD,BSP_TWL_3029_MAP_AUDIO_POPMAN_OFFSET, 0x00,regInfoPtr++); count++; callbackPtr->callbackFunc = l1s_stereopath_callback; callbackPtr->callbackVal = L1S_TWL3029_STEROPATH_OUTEN_CONFIG; if (returnVal != BSP_TWL3029_RETURN_CODE_FAILURE) { regInfoPtr = regInfo; /* now request to I2C manager to write to Triton registers */ returnVal = BspTwl3029_I2c_regInfoSend(regInfo,count,callbackPtr, (BspI2c_TransactionRequest*)i2cTransArrayPtr); } break; } case L1S_TWL3029_STEROPATH_CONFIG: case L1S_TWL3029_STEROPATH_OUTEN_CONFIG: case L1S_TWL3029_STEROPATH_STOP: break; default: break; }/* end switch */ } /* end function l1s_stereopath_callback */ #endif /*-------------------------------------------------------*/ /* l1s_stereopath_drv_config_ABB() */ /*-------------------------------------------------------*/ /* */ /* Parameters : mono_stereo: indicates if buffer is made */ /* of mono or stereo samples */ /* sampling_frequency: sampling freq */ /* */ /* Return : none */ /* */ /* Description : ABB configuration function */ /* */ /*-------------------------------------------------------*/ void l1s_stereopath_drv_config_ABB(UWORD8 mono_stereo,UWORD8 sampling_frequency) { #if (ANALOG == 3) UWORD16 regist; // Get the VAUDCTRL register regist = l1s_dsp_com.dsp_ndb_ptr->d_vaud_cfg >> 6; // reset sampling frequency and stereo/mono conversion regist &= 0x319; // stereo/mono conversion ? if (mono_stereo == AUDIO_SP_MONO_OUTPUT) regist |= 6; // apply the request sampling frequency regist |= (sampling_frequency << 5); // update DSP API l1s_dsp_com.dsp_ndb_ptr->d_vaud_cfg = ABB_L1_WRITE(VAUDCTRL, regist); // Get the VBCTRL2 register regist = l1s_dsp_com.dsp_ndb_ptr->d_vbctrl2 >> 6; // activate HSOVMID and VMIDFBYP regist |= 0x90; l1s_dsp_com.dsp_ndb_ptr->d_vbctrl2 = ABB_L1_WRITE(VBCTRL2, regist); // Get the VAUDPLL register regist = l1s_dsp_com.dsp_ndb_ptr->d_vaud_pll >> 6; // reset PLL regist &= 0x3fd; // switch PLL on regist |= 0x2; // update DSP API l1s_dsp_com.dsp_ndb_ptr->d_vaud_pll = ABB_L1_WRITE(VAUDPLL, regist); // Get the VBPOP register regist = l1s_dsp_com.dsp_ndb_ptr->d_vbpop >> 6; // deactivate vbpop for HSO regist &= 0x3F8; // update DSP API l1s_dsp_com.dsp_ndb_ptr->d_vbpop = ABB_L1_WRITE(VBPOP, regist); #endif #if (ANALOG == 11) // Call to the Triton API which would configure the Audio path. UWORD8 monostereo; UWORD8 pll; //Call back function BspTwl3029_I2C_Callback stereo_callbackFunc; //Switch on the Stereo path PLL - Set the STPLLON to 1 pll = 0x02; //Check if stereo2mono is required if (mono_stereo == AUDIO_SP_MONO_OUTPUT) monostereo = 0x03; else monostereo = 0x00; //Set the call back function to be called after the Audio configuration stereo_callbackFunc.callbackFunc = l1s_stereopath_callback ; //stereo_callbackFunc.callbackVal = L1S_TWL3029_STEROPATH_CONFIG; stereo_callbackFunc.callbackVal = L1S_TWL3029_STEROPATH_START; stereo_callbackFunc.i2cTransArrayPtr = &l1audio_i2cTransArray; //Call the Triton audio path configuration function if(BSP_TWL3029_RETURN_CODE_SUCCESS == bspTwl3029_Audio_Configure_Stereopath(&stereo_callbackFunc, pll, monostereo, sampling_frequency )) { //Set the valud of abb_write_done to 1 l1s.abb_write_done = 1; } #endif } /*-------------------------------------------------------*/ /* l1s_stereopath_drv_start_ABB() */ /*-------------------------------------------------------*/ /* */ /* Parameters : none */ /* */ /* Return : none */ /* */ /* Description : ABB start function */ /* */ /*-------------------------------------------------------*/ void l1s_stereopath_drv_start_ABB(void) { #if (ANALOG == 3) // Get VAUDPLL register UWORD16 regist = l1s_dsp_com.dsp_ndb_ptr->d_vaud_pll >> 6; // Reset I2S regist &= 0x2ff; // I2S on regist |= 0x100; // update DSP API l1s_dsp_com.dsp_ndb_ptr->d_vaud_pll = ABB_L1_WRITE(VAUDPLL, regist); // Set AUDON bit of the PWRDNRG register regist = 0x100; // update DSP API l1s_dsp_com.dsp_ndb_ptr->d_togbr2 = ABB_L1_WRITE(TOGBR2, regist); #endif #if (ANALOG == 11) //Call back function BspTwl3029_I2C_Callback stereo_callbackFunc; //Set the call back function to be called after the Audio start stereo_callbackFunc.callbackFunc = l1s_stereopath_callback ; stereo_callbackFunc.callbackVal = L1S_TWL3029_STEROPATH_CONFIG; stereo_callbackFunc.i2cTransArrayPtr = &l1audio_i2cTransArray; //call the Triton audio path start function if (BSP_TWL3029_RETURN_CODE_SUCCESS == bspTwl3029_Audio_Start_Stereopath(&stereo_callbackFunc)) { l1s.abb_write_done = 1; }; #endif } /*-------------------------------------------------------*/ /* l1s_stereopath_drv_stop_ABB() */ /*-------------------------------------------------------*/ /* */ /* Parameters : none */ /* */ /* Return : none */ /* */ /* Description : ABB stop function */ /* */ /*-------------------------------------------------------*/ void l1s_stereopath_drv_stop_ABB(void) { #if (ANALOG == 3) UWORD16 regist; // Reset AUDON bit of the PWRDNRG register regist = 0x80; // update DSP API l1s_dsp_com.dsp_ndb_ptr->d_togbr2 = ABB_L1_WRITE(TOGBR2, regist); // Get VAUDPLL register regist = l1s_dsp_com.dsp_ndb_ptr->d_vaud_pll >> 6; // PLL/I2S off regist &= 0x2fd; ABB_Write_Register_on_page(PAGE1, VAUDPLL, regist); // update DSP API l1s_dsp_com.dsp_ndb_ptr->d_vaud_pll = ABB_L1_WRITE(VAUDPLL, regist); #endif #if (ANALOG == 11) //Call back function BspTwl3029_I2C_Callback stereo_callbackFunc; UWORD8 dl_control = 1; // OUTEN_DISABLE // Set the call back function to be called after the Audio start stereo_callbackFunc.callbackFunc = l1s_stereopath_callback ; stereo_callbackFunc.callbackVal = L1S_TWL3029_STEROPATH_STOP; stereo_callbackFunc.i2cTransArrayPtr = &l1audio_i2cTransArray; if( (l1s.audio_state[L1S_AUDIO_DL_ONOFF_STATE] == L1_AUDIO_DL_ON) || (l1s.audio_state[L1S_AUDIO_DL_ONOFF_STATE] == L1_AUDIO_DL_SWITCHON_STARTED)) { dl_control = 0; // OUTEN_ENABLE } //call the Triton audio path start function if (BSP_TWL3029_RETURN_CODE_SUCCESS == bspTwl3029_Audio_Stop_Stereopath(&stereo_callbackFunc, dl_control)) { l1s.abb_write_done = 1; }; #endif } /*-------------------------------------------------------*/ /* l1s_stereopath_drv_start_DMA() */ /*-------------------------------------------------------*/ /* */ /* Parameters : d_dma_channel_parameter: DMA parameters */ /* DMA_allocation: allocation of the DMA */ /* (MCU/DSP) */ /* */ /* Return : none */ /* */ /* Description : DMA config and start function */ /* */ /*-------------------------------------------------------*/ void l1s_stereopath_drv_start_DMA(T_DMA_TYPE_CHANNEL_PARAMETER d_dma_channel_parameter,UWORD8 DMA_allocation) { #if ((CHIPSET == 12) || (CHIPSET == 15)) #if (L1_MP3_SIX_BUFFER == 1) // allocate the DMA to the MCU f_dma_channel_allocation_set(d_dma_channel_parameter.d_dma_channel_number, C_DMA_CHANNEL_ARM); // set parameters f_dma_channel_parameter_set((T_DMA_TYPE_CHANNEL_PARAMETER *)&d_dma_channel_parameter); #else // set parameters f_dma_channel_parameter_set((T_DMA_TYPE_CHANNEL_PARAMETER *)&d_dma_channel_parameter); // allocate the DMA to the MCU f_dma_channel_allocation_set(d_dma_channel_parameter.d_dma_channel_number, C_DMA_CHANNEL_ARM); #endif // Enable the DMA channel f_dma_channel_enable(d_dma_channel_parameter.d_dma_channel_number); // DMA allocation ? if (DMA_allocation == AUDIO_SP_DMA_ALLOC_MCU) { // DMA is allocate to MCU, just unmask DMA IT F_INTH_ENABLE_ONE_IT(C_INTH_DMA_IT); } else { // DMA is allocate to DSP, unmask API IT F_INTH_ENABLE_ONE_IT(C_INTH_API_IT); // Re-allocate DMA to the DSP f_dma_channel_allocation_set(d_dma_channel_parameter.d_dma_channel_number, C_DMA_CHANNEL_DSP); } #endif } /*-------------------------------------------------------*/ /* l1s_stereopath_drv_reset_DMA() */ /*-------------------------------------------------------*/ /* */ /* Parameters : d_dma_channel_parameter: DMA parameters */ /* */ /* Return : none */ /* */ /* Description : DMA reset function */ /* */ /*-------------------------------------------------------*/ void l1s_stereopath_drv_reset_DMA(T_DMA_TYPE_CHANNEL_PARAMETER d_dma_channel_parameter) { #if ((CHIPSET == 12) || (CHIPSET == 15)) // Allocate DMA to MCU f_dma_channel_allocation_set(d_dma_channel_parameter.d_dma_channel_number, C_DMA_CHANNEL_ARM); // Disable DMA channel f_dma_channel_disable(d_dma_channel_parameter.d_dma_channel_number); // Reset DMA channel f_dma_channel_soft_reset(d_dma_channel_parameter.d_dma_channel_number); #endif } /*-------------------------------------------------------*/ /* l1s_stereopath_drv_reset_CPORT() */ /*-------------------------------------------------------*/ /* */ /* Parameters : none */ /* */ /* Return : none */ /* */ /* Description : Cport reset function */ /* */ /*-------------------------------------------------------*/ void l1s_stereopath_drv_reset_CPORT(void) { #if ((CHIPSET == 12) || (CHIPSET == 15)) // init = 1 --> write ctrl register l1s_dsp_com.dsp_ndb_ptr->d_cport_init = (API) 0x0001; // set SW_RESET field to 1 to generate a software reset l1s_dsp_com.dsp_ndb_ptr->d_cport_ctrl = (API) 0x0FFD; #endif } /*-------------------------------------------------------*/ /* l1s_stereopath_drv_stop_CPORT() */ /*-------------------------------------------------------*/ /* */ /* Parameters : none */ /* */ /* Return : none */ /* */ /* Description : Cport stop function */ /* */ /*-------------------------------------------------------*/ void l1s_stereopath_drv_stop_CPORT(void) { #if (CHIPSET == 12) || (CHIPSET == 15) // init = 1 --> write ctrl register l1s_dsp_com.dsp_ndb_ptr->d_cport_init = (API) 0x0001; // Set EXT_MCLK_EN field to 1 to enable external clock l1s_dsp_com.dsp_ndb_ptr->d_cport_ctrl = (API) 0x0000; #endif } /*-------------------------------------------------------*/ /* l1s_stereopath_drv_config_CPORT() */ /*-------------------------------------------------------*/ /* */ /* Parameters : none */ /* */ /* Return : none */ /* */ /* Description : Cport config function */ /* */ /*-------------------------------------------------------*/ void l1s_stereopath_drv_config_CPORT(void) { #if (CHIPSET == 12) || (CHIPSET == 15) // init = 0x281F --> write cfr1,2,3,4 and ctrl register l1s_dsp_com.dsp_ndb_ptr->d_cport_init = (API) 0x281F; // 2 timeslots per frame, I2S mode // 20 CLK_BIT cycles, 16 data bits per time slot l1s_dsp_com.dsp_ndb_ptr->a_cport_cfr[0] = (API) 0x0C0B; // one cycle delay, enable data serial output // CSYNC signal generate with the negative edge of CSCLK // clk direction set to input // l1s_dsp_com.dsp_ndb_ptr->a_cport_cfr[1] = (API) 0xEB00; l1s_dsp_com.dsp_ndb_ptr->a_cport_cfr[1] = (API) 0xFB00; // L1_DSP-SPR-18866 // mask receive/transmit interrupt request // Set threshold to 2 (nb of elements = 2) l1s_dsp_com.dsp_ndb_ptr->d_cport_ctrl = (API) 0x012C; #endif } /*-------------------------------------------------------*/ /* l1s_stereopath_drv_start_CPORT() */ /*-------------------------------------------------------*/ /* */ /* Parameters : none */ /* */ /* Return : none */ /* */ /* Description : Cport start function */ /* */ /*-------------------------------------------------------*/ void l1s_stereopath_drv_start_CPORT(void) { #if (CHIPSET == 12) || (CHIPSET == 15) // init = 0x20 --> write tcl_tadt register l1s_dsp_com.dsp_ndb_ptr->d_cport_init = (API) 0x0020; // CPEN = 1 --> cport enable l1s_dsp_com.dsp_ndb_ptr->d_cport_tcl_tadt = (API) 0x0800; #endif } #endif // L1_STEREOPATH && CODE_VERSION #endif // AUDIO_TASK