[Feature][ZXW-452]merge P54U02 version

Only Configure: No
Affected branch: master
Affected module: unknow
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: Yes
Doc Update: No

Change-Id: I17e6795ab66e2b9d1cbbfec4b7c0028d666e177d
diff --git a/cp/ps/driver/src/chipsets/src/audio_base/audio_config/audioRef_cfg.c b/cp/ps/driver/src/chipsets/src/audio_base/audio_config/audioRef_cfg.c
index 1c21e8b..7489d52 100755
--- a/cp/ps/driver/src/chipsets/src/audio_base/audio_config/audioRef_cfg.c
+++ b/cp/ps/driver/src/chipsets/src/audio_base/audio_config/audioRef_cfg.c
@@ -807,6 +807,39 @@
 		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, " zDrvVoiceConfig_Init start  END!\n");

 		//zDrvVolte_LoopStart();

 		//zDrvVp_LoopStart(VP_PATH_SPEAKER);

+		

+#if 1

+        if (audionvflag.isCloseVpBufferBak != 1)

+        {

+            ret = zCatAgt_Audio_Reg(10,VP_INOUT_BAK_BUFFER_SIZE,(UINT32)vpInOutBuffer.p_voiceRxInBuffer);

+            if(ret != DRV_SUCCESS){

+                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvVoiceConfig_Init RXIN register zCatAgt_Audio_Reg err\n");

+            }

+            

+            ret = zCatAgt_Audio_Reg(12,VP_INOUT_BAK_BUFFER_SIZE,(UINT32)vpInOutBuffer.p_voiceTxInBuffer);

+            if(ret != DRV_SUCCESS){

+                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvVoiceConfig_Init TXIN register zCatAgt_Audio_Reg err\n");

+            }

+            

+            ret = zCatAgt_Audio_Reg(13,VP_INOUT_BAK_BUFFER_SIZE,(UINT32)vpInOutBuffer.p_voiceTxOutPutBuffer);

+            if(ret != DRV_SUCCESS){

+                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvVoiceConfig_Init TXOUT register zCatAgt_Audio_Reg err\n");

+            }

+            

+#ifdef _USE_VP_OUTPUT_RXOUT_DATA

+            ret = zCatAgt_Audio_Reg(11, VP_INOUT_BAK_BUFFER_SIZE, (UINT32)vpInOutBuffer.p_voiceRxOutPutBuffer);

+            if(ret != DRV_SUCCESS){

+                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvVoiceConfig_Init RXOUT register zCatAgt_Audio_Reg err\n");

+            }

+

+#else

+            ret = zCatAgt_Audio_Reg(11,VP_INOUT_NOBAK_BUFSIZE,(UINT32)vpInOutBuffer.p_voiceRxOutPutBuffer);

+            if(ret != DRV_SUCCESS){

+                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvVoiceConfig_Init RXOUT register zCatAgt_Audio_Reg err\n");

+            }

+#endif

+#endif

+        }

 

 		return DRV_SUCCESS;

 	}

diff --git a/cp/ps/driver/src/chipsets/src/audio_base/audio_lib/amr/lib/armv7-a/GCC/amr.a b/cp/ps/driver/src/chipsets/src/audio_base/audio_lib/amr/lib/armv7-a/GCC/amr.a
index f84072c..e0cef6a 100755
--- a/cp/ps/driver/src/chipsets/src/audio_base/audio_lib/amr/lib/armv7-a/GCC/amr.a
+++ b/cp/ps/driver/src/chipsets/src/audio_base/audio_lib/amr/lib/armv7-a/GCC/amr.a
Binary files differ
diff --git a/cp/ps/driver/src/chipsets/src/audio_base/voiceprocess/hal_voiceprocess.c b/cp/ps/driver/src/chipsets/src/audio_base/voiceprocess/hal_voiceprocess.c
index 8193de0..efec067 100755
--- a/cp/ps/driver/src/chipsets/src/audio_base/voiceprocess/hal_voiceprocess.c
+++ b/cp/ps/driver/src/chipsets/src/audio_base/voiceprocess/hal_voiceprocess.c
@@ -36,6 +36,7 @@
 #include "hal_audio_data.h"

 //#define TEST_WHITE_NOISE

 

+//#define  VB_DATA_LOSS_TEST

 #ifdef TEST_WHITE_NOISE

 #include "Fs8000_WhiteNoise_Mon.h"

 //#include "Fs8000_Sine_440Hz_Mon.h"

@@ -57,6 +58,10 @@
 

 #define VP_INOUT_BAK_BUFFER_SIZE 0x30000  // 0x60000

 #define VP_INOUT_NOBAK_BUFSIZE  640

+#define VB_MAX_INT	     0x7fffffff

+#define VB_MIN_INT        0 //(0-2<<31)//0x80000000

+

+#define VB_INT_OVERFLOW(x) if((x < VB_MIN_INT)||(x > VB_MAX_INT))  x = 0;

 /****************************************************************************

 * 	                                           Local Types

 ****************************************************************************/

@@ -129,7 +134,7 @@
 	FALSE, //24 rxMuteEn

 	FALSE, //25 firstRegZCATFlag

 #ifdef ECALL_SUPPORT	

-	0 //26 ecallData

+	{0} //26 ecallData

 #endif

 };

 

@@ -260,6 +265,192 @@
 * 	                                          Function Definitions

 ****************************************************************************/

 #ifdef CONFIG_VOICE_BUFFER_DRV  

+#ifdef _VBUFF_IN_MULTI_CORE

+#define RPMSG_CAP_ID 1

+

+ZOSS_TIMER_ID s_voiceTimerId ;

+ZOSS_SEMAPHORE_ID s_voiceRdSema;

+ZOSS_SEMAPHORE_ID s_voiceWrSema;

+

+int timer_cb_count = 0;

+int first_full_flag = 0;

+int first_empty_flag = 0;

+

+int vb_read_count = 0;

+int vb_write_count = 0;

+

+

+void voiceTimerCallBack(SINT32 para)

+{

+	T_ZDrvRpMsg_Msg icp_pMsg = {0}; 

+	

+	UINT8 s = 1;

+	icp_pMsg.actorID = RPMSG_CAP_ID;

+

+	icp_pMsg.chID = channel_41;

+	icp_pMsg.flag |= RPMSG_WRITE_INT;

+	icp_pMsg.buf = (void *)&s;

+	icp_pMsg.len = 1;

+

+

+	zOss_PutSemaphore(s_voiceWrSema);

+	zOss_PutSemaphore(s_voiceRdSema);

+	//zDrvRpMsg_Write(&icp_pMsg); 

+	zDrvRpMsg_Write_Cap(&icp_pMsg); 

+	timer_cb_count++;

+	VB_INT_OVERFLOW(timer_cb_count);

+#ifdef VB_DATA_LOSS_TEST

+

+	if((timer_cb_count%1000 ) == 0){

+		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "%s:timer_cb_count(%d)\n",__func__,timer_cb_count);

+		if(timer_cb_count> 10000000) 

+			timer_cb_count=0;

+	}

+

+#endif

+	

+//	zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "voiceTimerCallBack timer=%u\n", cpu_clock(0)>>10);

+}

+#define MAX_BUF_SIZE	     640

+#define MAX_BUF_NUM        3

+

+

+enum{

+	UP_LINK,

+	DOWN_LINK	

+};

+

+struct voice_ring_buffer {

+	volatile uint read_pos;

+	volatile uint write_pos;

+	volatile char data[];

+

+};

+struct voice_ring_buffer *voice_buff[2] = {NULL,NULL};

+

+

+

+static bool voice_buff_is_full(int read_pos, int write_pos)

+{

+

+

+	if ((write_pos - read_pos) >= 20000000) {

+		write_pos = write_pos - 20000000;

+		//voice_buff[UP_LINK]->write_pos = write_pos;

+		voice_buff[DOWN_LINK]->write_pos = write_pos;

+	}

+	return ((write_pos - read_pos) == MAX_BUF_NUM);

+}

+static bool voice_buff_is_empty(int read_pos, int write_pos)

+{

+	

+	return (write_pos == read_pos);

+}

+static int voice_buffer_write( char *buf, int count)

+{

+	int read_pos, write_pos;	

+

+

+	read_pos = voice_buff[DOWN_LINK]->read_pos;

+	write_pos = voice_buff[DOWN_LINK]->write_pos;	

+	if(vb_write_count == 0){

+		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO,"%s: first read_pos=%d write_pos=%d \n",__func__,read_pos,write_pos);

+	}

+

+	

+	if(voice_buff_is_full(read_pos, write_pos)){

+		//zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "voice_buffer_read readbuffer is full \n");

+   		 first_full_flag++;

+		VB_INT_OVERFLOW(first_full_flag);

+		if(first_full_flag == 1)

+			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "%s: writebuffer is full  read_pos %d,write_pos %d,vb_write_count %d,count %d\n",__func__,read_pos,write_pos,vb_write_count,count);

+		return DRV_ERROR_FULL;

+	}

+	else {

+		vb_write_count++;	

+		

+		VB_INT_OVERFLOW(vb_write_count);

+		first_full_flag = 0;

+		zOss_Memcpy(&(voice_buff[DOWN_LINK]->data[(write_pos%MAX_BUF_NUM)*MAX_BUF_SIZE]), buf, count);

+	

+		write_pos++;

+

+		voice_buff[DOWN_LINK]->write_pos = write_pos;

+

+	}

+	

+	return DRV_SUCCESS;

+}

+static int voice_buffer_read(char *buf, size_t count)

+{

+	int read_pos, write_pos;

+	int* buf_int;

+	int i;

+	

+	read_pos = voice_buff[UP_LINK]->read_pos;

+	write_pos = voice_buff[UP_LINK]->write_pos;

+	if(vb_read_count == 0){

+		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO,"%s: first read_pos=%d write_pos=%d \n",__func__,read_pos,write_pos);

+	}

+

+	if ((count > 0) && (count <= MAX_BUF_SIZE))  {

+		if(voice_buff_is_empty(read_pos, write_pos)){

+			first_empty_flag++;

+			VB_INT_OVERFLOW(first_empty_flag);

+			if(first_empty_flag ==1)

+				zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO,"%s: readbuffer is empty,read_pos %d,write_pos %d,vb_read_count %d,count %d\n",__func__,read_pos,write_pos,vb_read_count,count);

+			//add memset,del return . edit for  far end hear near end repreat voice pcm, FROM MBB TEST

+			

+		#ifndef  VB_DATA_LOSS_TEST

+			zOss_Memset(&(voice_buff[UP_LINK]->data[(read_pos%MAX_BUF_NUM)*MAX_BUF_SIZE]),0, count);

+			zOss_Memset(buf,0, count);

+		#endif			

+			//return DRV_ERROR_EMPTY;

+			

+

+		}

+		else {

+			

+		    vb_read_count++; 			

+			VB_INT_OVERFLOW(vb_read_count);		

+			first_empty_flag = 0;

+			

+			zOss_Memcpy(buf, &(voice_buff[UP_LINK]->data[(read_pos%MAX_BUF_NUM)*MAX_BUF_SIZE]), count);

+			//zOss_Memset(&(voice_buff[UP_LINK]->data[(read_pos%MAX_BUF_NUM)*MAX_BUF_SIZE]),0, count);

+

+#ifdef VB_DATA_LOSS_TEST

+

+			

+			if(vb_read_count < 5){

+				pr_info("ps :count=%d vb_read_count=%d,read_pos=%d,write_pos=%d\n",count,vb_read_count,read_pos,write_pos);

+

+			

+				buf_int =( int*) &voice_buff[UP_LINK]->data[(write_pos%MAX_BUF_NUM)*MAX_BUF_SIZE];

+				

+				for(i=0;i<(count/4);i++){

+				   //*(buf_int+i) = i;

+				   //buf_int[i] = i;

+				 if(i>0x1f)  

+					zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO,"ps: *(buf_int+%d)=%d\n",i,*(buf_int+i));

+				}

+			

+			}

+#endif

+			read_pos++;

+			if(read_pos == 20000000)

+				read_pos = 0;

+			voice_buff[UP_LINK]->read_pos = read_pos;

+		}

+

+

+	}

+		

+	

+	return DRV_SUCCESS;

+}

+

+

+#else

 extern int voicebuffer_ulqueue_read(void *buf, unsigned int size);

 extern int  voicebuffer_dlqueue_write(void  *buf, unsigned int  size);

 extern void voice_inform_to_app(void);

@@ -276,6 +467,10 @@
 //	zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "voiceTimerCallBack timer=%u\n", cpu_clock(0)>>10);

 }

 

+

+

+#endif

+

 SINT32 vp_rxsem_count_Init(void)

 {

 	UINT32 i = 0;

@@ -561,6 +756,7 @@
 	

 	if(g_voiceVar.ecallData.opt.drv_Get_Ecall_State == NULL)

 	{	

+	    zOss_Printf(SUBMDL_HAL, PRINT_LEVEL_NORMAL, "update_ecall_state get__ecall_state fun not register!\n");

 		return DRV_ERR_NOT_SUPPORTED;

 	}

 

@@ -570,7 +766,7 @@
 		{

 			wrsem_count_Init(ECALL_SEM);

 			g_voiceVar.ecallData.ecallRxSta = ECALL_ST_RX_INUSE;

-			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "update_ecall_state rx state change old ecallRxSta = %d\n", g_voiceVar.ecallData.ecallRxSta);

+			//zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "update_ecall_state rx state change old ecallRxSta = %d\n", g_voiceVar.ecallData.ecallRxSta);

 			

 		}

 		else if((dir == DIR_TX)&&(g_voiceVar.ecallData.ecallTxSta != ECALL_ST_TX_INUSE))

@@ -578,13 +774,21 @@
 

 			rdsem_count_Init(ECALL_SEM);			

 			g_voiceVar.ecallData.ecallTxSta = ECALL_ST_TX_INUSE;	

-			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "update_ecall_state tx state change old ecallTxSta = %d\n", g_voiceVar.ecallData.ecallTxSta);

+			//zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "update_ecall_state tx state change old ecallTxSta = %d\n", g_voiceVar.ecallData.ecallTxSta);

 			

 		}

+		else if(dir == DIR_RX)

+		{

+			g_voiceVar.ecallData.ecallRxSta = ECALL_ST_RX_INUSE;

+		}

+		else if(dir == DIR_TX)

+		{

+			g_voiceVar.ecallData.ecallTxSta = ECALL_ST_TX_INUSE;	

+		}		

 		else

 		{

 			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "update_ecall_state return 1,but dir not support dir = %d\n",dir);

-			ret = DRV_ERR_NOT_SUPPORTED;			

+			ret = DRV_ERR_INVALID_PARAM;			

 		}	

 		

 

@@ -604,7 +808,7 @@
 		else

 		{

 			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "update_ecall_state return 0,but dir not support dir = %d\n",dir);

-			ret = DRV_ERR_NOT_SUPPORTED;

+			ret = DRV_ERR_INVALID_PARAM;

 

 		}		

 

@@ -1222,10 +1426,25 @@
 	slic_tw_dtmf_detect_open();

 #endif

 #ifdef CONFIG_VOICE_BUFFER_DRV  

+#ifdef _VBUFF_IN_MULTI_CORE

+

+

+	vp_rxsem_count_Init();

+	vp_txsem_count_Init();

+	voice_buff[UP_LINK]->read_pos = 0;

+	voice_buff[UP_LINK]->write_pos = 0; 

+	voice_buff[DOWN_LINK]->read_pos = 0;

+	voice_buff[DOWN_LINK]->write_pos = 0; 

+	zOss_Memset(&(voice_buff[DOWN_LINK]->data[0]),0, MAX_BUF_NUM*MAX_BUF_SIZE);

+	zOss_Memset(&(voice_buff[UP_LINK]->data[0]),0, MAX_BUF_NUM*MAX_BUF_SIZE);

+

+#else

 //	INIT_COMPLETION(s_voice_copletion);

 	vp_rxsem_count_Init();

 	vp_txsem_count_Init();

 #endif

+#endif

+

 #ifdef ECALL_SUPPORT

 	if(g_voiceVar.audio_ctrlFlag.isUseEcall == 1)

 	{

@@ -1289,6 +1508,16 @@
     dtmf_test.drv_dtmftx_report_cb = drv_dtmftx_report;

     zDrvDtmf_Detect_RegCallbacks(dtmf_test);

 #endif

+#if defined(CONFIG_VOICE_BUFFER_DRV) && defined(_VBUFF_IN_MULTI_CORE)

+

+	timer_cb_count = 0;

+	first_full_flag = 0;

+	first_empty_flag = 0;

+

+	vb_read_count = 0;

+	vb_write_count = 0;	

+	zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_Open  init voice buffer val!\n");

+#endif

 	return DRV_SUCCESS;

 

 }

@@ -1355,8 +1584,11 @@
 

 VOID zDrvVp_Status(UINT32 *sample_rate, UINT32 *voice_status)

 {

-    *sample_rate = g_voiceVar.sample_rate;

-    *voice_status = g_voiceVar.vpI2sStatus;

+    if(NULL != sample_rate)

+        *sample_rate = g_voiceVar.sample_rate;

+

+    if(NULL != voice_status)

+        *voice_status = g_voiceVar.vpI2sStatus;

 }

 

 SINT32 vp_TdmCfgParam(T_ZDrvVp_Cfg *cfgParam)

@@ -1960,6 +2192,10 @@
 	zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_Close,s_vpState.pVpRxOutPutBuffer=%p\n", s_vpState.pVpRxOutPutBuffer);

 	zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_Close,s_vpState.pVpTxOutPutBuffer=%p\n", s_vpState.pVpTxOutPutBuffer);

 	zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_Close,s_vpState.inOutBufSize=%x\n", s_vpState.inOutBufSize);

+#if defined(CONFIG_VOICE_BUFFER_DRV) && defined(_VBUFF_IN_MULTI_CORE)

+

+	zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "%s: timer_cb_count %d,first_full_flag %d,first_empty_flag %d,vb_read_count %d,vb_write_count %d!\n",__func__,timer_cb_count,first_full_flag,first_empty_flag,vb_read_count,vb_write_count);

+#endif

 

 	return DRV_SUCCESS;

 }

@@ -2027,8 +2263,12 @@
 	{

 		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_VoiceI2sStart error14:zDrvI2S_Write I2S_2 ret=%d", ret);

 	}

+#ifdef _VBUFF_IN_MULTI_CORE

+	voice_buffer_write(s_speechState.pVpTempRxOutPutBuffer, s_speechState.totalFrameBufSize);

 

+#else

 	voicebuffer_dlqueue_write(s_speechState.pVpTempRxOutPutBuffer, s_speechState.totalFrameBufSize);

+#endif

 #else	

 	if (g_voiceVar.isUseSlicCodec == 1)

 	{

@@ -2492,7 +2732,12 @@
 

 	g_voiceVar.vpI2sStatus = VP_I2S_INUSE;

 #ifdef  CONFIG_VOICE_BUFFER_DRV  

+#ifdef _VBUFF_IN_MULTI_CORE

+	voice_buffer_write(s_speechState.pVpTempRxOutPutBuffer, s_speechState.totalFrameBufSize);

+

+#else

 	voicebuffer_dlqueue_write(s_speechState.pVpTempRxOutPutBuffer, s_speechState.totalFrameBufSize);

+#endif

 #else

 	ret = zDrvExtAudio_GetBuf(&write_buf, &write_len);

 	if (ret != DRV_SUCCESS)

@@ -2685,8 +2930,12 @@
 	}

 	//wait_for_completion_timeout(&s_voice_completion, 60);

 	zOss_GetSemaphore(s_voiceWrSema,  60);

-	voicebuffer_dlqueue_write(s_speechState.pVpTempRxOutPutBuffer, s_speechState.totalFrameBufSize);

+#ifdef _VBUFF_IN_MULTI_CORE

+	voice_buffer_write(s_speechState.pVpTempRxOutPutBuffer, s_speechState.totalFrameBufSize);

 

+#else

+	voicebuffer_dlqueue_write(s_speechState.pVpTempRxOutPutBuffer, s_speechState.totalFrameBufSize);

+#endif

 	if (g_voiceVar.voiceInVolteMode == 1)

 	{

 		s_speechState.rxSaveLen += s_speechState.totalFrameBufSize;

@@ -2695,10 +2944,14 @@
 			s_speechState.rxSaveLen = 0;

 		}

 		s_speechState.pVpTempRxInBuffer = s_vpState.pVpRxInBuffer + s_speechState.rxSaveLen;

+#ifdef _USE_VP_OUTPUT_RXOUT_DATA

+        s_speechState.pVpTempRxOutPutBuffer = s_vpState.pVpRxOutPutBuffer + s_speechState.rxSaveLen;

+#else

 		s_speechState.pVpTempRxOutPutBuffer = s_vpState.pVpRxOutPutBuffer;

+#endif

 	}

 

-#else

+#else //not defined CONFIG_VOICE_BUFFER_DRV

 	if (e_reg_flag == 1)

 	{

 #ifdef ECALL_SUPPORT	

@@ -2961,7 +3214,12 @@
 

 //	wait_for_completion_timeout(&s_voice_completion, 60);

 	zOss_GetSemaphore(s_voiceRdSema,  60);

+#ifdef _VBUFF_IN_MULTI_CORE

+	voice_buffer_read(s_speechState.pVpTempTxInBuffer,  s_speechState.totalFrameBufSize);

+

+#else

 	voicebuffer_ulqueue_read(s_speechState.pVpTempTxInBuffer,  s_speechState.totalFrameBufSize);

+#endif

 	if (g_voiceVar.vProcIsNormal == TRUE)

 	{

 		VoiceProc_TxProcess(&s_speechState.pVpTempTxInBuffer, NULL, &s_speechState.pVpTempTxOutPutBuffer, s_speechState.frameCount);	

@@ -3299,205 +3557,204 @@
 				break;

 			}

 			//zOss_Memcpy((VOID *)( s_speechState.pVpTempRxOutPutBuffer), (VOID *) s_speechState.pVpTempRxInBuffer, VP_I2S_BUFFER_SIZE);

-		}

-		else

-		{

-			zOss_Memcpy((VOID *)(s_speechState.pVpTempRxOutPutBuffer), (VOID *) s_speechState.pVpTempRxInBuffer, 320);

-		}

+    		else

+    		{

+    			zOss_Memcpy((VOID *)(s_speechState.pVpTempRxOutPutBuffer), (VOID *) s_speechState.pVpTempRxInBuffer, 320);

+    		}

 

-		if (g_voiceVar.vpI2sStatus != VP_I2S_INUSE)

-		{

-			break;

-		}

+    		if (g_voiceVar.vpI2sStatus != VP_I2S_INUSE)

+    		{

+    			break;

+    		}

 

 #if 1

-		//zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "downlink:i2s1 write to codec\n");

-		/*downlink:write to codec*/

-		ret = zDrvExtAudio_GetBuf(&write_buf, &write_len);

+    		//zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "downlink:i2s1 write to codec\n");

+    		/*downlink:write to codec*/

+    		ret = zDrvExtAudio_GetBuf(&write_buf, &write_len);

 

-		//zOss_ASSERT(write_buf != NULL);

-		//zOss_ASSERT(write_len != 0);

+    		//zOss_ASSERT(write_buf != NULL);

+    		//zOss_ASSERT(write_len != 0);

 #if 0

-		if (s_speechState.saveLen == 3200)

-		{

-			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_GetBuf:I2S1:ret=%d,write_buf = %x,write_len = %d.\n", ret, write_buf, write_len);

-		}

+    		if (s_speechState.saveLen == 3200)

+    		{

+    			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_GetBuf:I2S1:ret=%d,write_buf = %x,write_len = %d.\n", ret, write_buf, write_len);

+    		}

 #endif

-		//if(ret == DRV_SUCCESS)

-		if ((ret == DRV_SUCCESS) && (write_buf != NULL) && (write_len != 0))

-		{

+    		//if(ret == DRV_SUCCESS)

+    		if ((ret == DRV_SUCCESS) && (write_buf != NULL) && (write_len != 0))

+    		{

 

-			if ((s_vpState.pVpExtI2sCfg->tClkMode == PCM_TIME_MODE) && (s_vpState.pVpExtI2sCfg->tPcmSlotNum != PCM_1TIME_SLOT))

-			{

-				//It is used for xinke to set teak voice gain when open  lvwenhua 20150709

-				zOss_Memset(write_buf, 0, write_len);

-				for (i = 0; i < VP_I2S_BUFFER_SIZE;)

-				{

-					* (write_buf + i * (s_vpState.pVpExtI2sCfg->tPcmSlotNum + 1)) = * (s_speechState.pVpTempRxOutPutBuffer + i);

-					* (write_buf + i * (s_vpState.pVpExtI2sCfg->tPcmSlotNum + 1) + 1) = * (s_speechState.pVpTempRxOutPutBuffer + i + 1);

-					i += 2;

-				}

-			}

-			else

+    			if ((s_vpState.pVpExtI2sCfg->tClkMode == PCM_TIME_MODE) && (s_vpState.pVpExtI2sCfg->tPcmSlotNum != PCM_1TIME_SLOT))

+    			{

+    				//It is used for xinke to set teak voice gain when open  lvwenhua 20150709

+    				zOss_Memset(write_buf, 0, write_len);

+    				for (i = 0; i < VP_I2S_BUFFER_SIZE;)

+    				{

+    					* (write_buf + i * (s_vpState.pVpExtI2sCfg->tPcmSlotNum + 1)) = * (s_speechState.pVpTempRxOutPutBuffer + i);

+    					* (write_buf + i * (s_vpState.pVpExtI2sCfg->tPcmSlotNum + 1) + 1) = * (s_speechState.pVpTempRxOutPutBuffer + i + 1);

+    					i += 2;

+    				}

+    			}

+    			else

 

-			{

-				zOss_Memcpy(write_buf, s_speechState.pVpTempRxOutPutBuffer, VP_I2S_BUFFER_SIZE);

-				//zOss_Memcpy(write_buf, s_speechState.pVpTempRxInBuffer,320);

-			}

-		}

-		else

-		{

-			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "write else zDrvI2S_GetBuf:I2S1:ret=%d,write_buf = %x,write_len = %d.\n", ret, write_buf, write_len);

-			break;

-		}

-		ret = zDrvExtAudio_Write(write_buf, write_len);

-		if (ret != DRV_SUCCESS)

-		{

-			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_Write:I2S_1:ret=%d,write_buf = %x,write_len = %d.\n", ret, write_buf, write_len);

-			break;

-		}

+    			{

+    				zOss_Memcpy(write_buf, s_speechState.pVpTempRxOutPutBuffer, VP_I2S_BUFFER_SIZE);

+    				//zOss_Memcpy(write_buf, s_speechState.pVpTempRxInBuffer,320);

+    			}

+    		}

+    		else

+    		{

+    			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "write else zDrvI2S_GetBuf:I2S1:ret=%d,write_buf = %x,write_len = %d.\n", ret, write_buf, write_len);

+    			break;

+    		}

+    		ret = zDrvExtAudio_Write(write_buf, write_len);

+    		if (ret != DRV_SUCCESS)

+    		{

+    			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_Write:I2S_1:ret=%d,write_buf = %x,write_len = %d.\n", ret, write_buf, write_len);

+    			break;

+    		}

 

 #endif

 #endif

-		if (g_voiceVar.vpI2sStatus != VP_I2S_INUSE)

-		{

-			break;

-		}

+    		if (g_voiceVar.vpI2sStatus != VP_I2S_INUSE)

+    		{

+    			break;

+    		}

 

-		/*uplink:read from codec*/

-		// zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "downlink:i2s1 read from codec\n");

-		vp_ReadDataFromCodec(s_speechState.pVpTempTxOutPutBuffer, s_speechState.i2sReadParam.buffersize);

+    		/*uplink:read from codec*/

+    		// zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "downlink:i2s1 read from codec\n");

+    		vp_ReadDataFromCodec(s_speechState.pVpTempTxOutPutBuffer, s_speechState.i2sReadParam.buffersize);

 #if 0

-		ret = zDrvExtAudio_Read(&read_buf, &read_len);

+    		ret = zDrvExtAudio_Read(&read_buf, &read_len);

 

-		//zOss_ASSERT(read_buf != NULL);

-		//zOss_ASSERT(read_len != 0);

+    		//zOss_ASSERT(read_buf != NULL);

+    		//zOss_ASSERT(read_len != 0);

 #if 0

 

-		if (s_speechState.saveLen == 3200)

-		{

-			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_GetBuf:I2S1:ret=%d,read_buf = %x,read_len = %d.\n", ret, read_buf, read_len);

-		}

+    		if (s_speechState.saveLen == 3200)

+    		{

+    			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_GetBuf:I2S1:ret=%d,read_buf = %x,read_len = %d.\n", ret, read_buf, read_len);

+    		}

 #endif

-		//if(ret == DRV_SUCCESS)

-		if ((ret == DRV_SUCCESS) && (read_buf != NULL) && (read_len != 0))

-		{

-			if ((s_vpState.pVpExtI2sCfg->tClkMode == PCM_TIME_MODE) && (s_vpState.pVpExtI2sCfg->tPcmSlotNum != PCM_1TIME_SLOT))

-			{

-				//It is used for xinke to set teak voice gain when open  lvwenhua 20150709

-				for (i = 0; i < VP_I2S_BUFFER_SIZE;)

-				{

-					* (s_speechState.pVpTempTxInBuffer + i) = * (read_buf + i * (s_vpState.pVpExtI2sCfg->tPcmSlotNum + 1));

-					* (s_speechState.pVpTempTxInBuffer + i + 1) = * (read_buf + i * (s_vpState.pVpExtI2sCfg->tPcmSlotNum + 1) + 1);

-					i += 2;

-				}

-			}

-			else

-			{

-				zOss_Memcpy(s_speechState.pVpTempTxInBuffer, read_buf, VP_I2S_BUFFER_SIZE);

-			}

-		}

-		else

-		{

-			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_Read:I2S1:ret=%d,read_buf = %p,read_len = %d.\n", ret, read_buf, read_len);

-			break;

-		}

-		ret = zDrvExtAudio_FreeBuf(read_buf);

-		if (ret != DRV_SUCCESS)

-		{

-			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_FreeBuf:I2S1:ret=%d,read_buf = %x.\n", ret, read_buf);

-			break;

-		}

+    		//if(ret == DRV_SUCCESS)

+    		if ((ret == DRV_SUCCESS) && (read_buf != NULL) && (read_len != 0))

+    		{

+    			if ((s_vpState.pVpExtI2sCfg->tClkMode == PCM_TIME_MODE) && (s_vpState.pVpExtI2sCfg->tPcmSlotNum != PCM_1TIME_SLOT))

+    			{

+    				//It is used for xinke to set teak voice gain when open  lvwenhua 20150709

+    				for (i = 0; i < VP_I2S_BUFFER_SIZE;)

+    				{

+    					* (s_speechState.pVpTempTxInBuffer + i) = * (read_buf + i * (s_vpState.pVpExtI2sCfg->tPcmSlotNum + 1));

+    					* (s_speechState.pVpTempTxInBuffer + i + 1) = * (read_buf + i * (s_vpState.pVpExtI2sCfg->tPcmSlotNum + 1) + 1);

+    					i += 2;

+    				}

+    			}

+    			else

+    			{

+    				zOss_Memcpy(s_speechState.pVpTempTxInBuffer, read_buf, VP_I2S_BUFFER_SIZE);

+    			}

+    		}

+    		else

+    		{

+    			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_Read:I2S1:ret=%d,read_buf = %p,read_len = %d.\n", ret, read_buf, read_len);

+    			break;

+    		}

+    		ret = zDrvExtAudio_FreeBuf(read_buf);

+    		if (ret != DRV_SUCCESS)

+    		{

+    			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_FreeBuf:I2S1:ret=%d,read_buf = %x.\n", ret, read_buf);

+    			break;

+    		}

 

-		if (g_voiceVar.vpI2sStatus != VP_I2S_INUSE)

-		{

-			break;

-		}

+    		if (g_voiceVar.vpI2sStatus != VP_I2S_INUSE)

+    		{

+    			break;

+    		}

 

-		/*uplink:voice process*/

-		if (g_voiceVar.vProcIsNormal == TRUE)

-			ret = VoiceProc_TxProcess(& s_speechState.pVpTempTxInBuffer, NULL, & s_speechState.pVpTempTxOutPutBuffer);

-		if (ret != DRV_SUCCESS)

-		{

-			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_DataProcessThreadEntry error:VoiceProc_TxProcess :ret=%d.\n", ret);

-			break;

-		}

-		//zOss_Memcpy((VOID *)( s_speechState.pVpTempTxOutPutBuffer), (VOID *) s_speechState.pVpTempTxInBuffer, VP_I2S_BUFFER_SIZE);

-	}

-	else

-	{

+    		/*uplink:voice process*/

+    		if (g_voiceVar.vProcIsNormal == TRUE)

+    			ret = VoiceProc_TxProcess(& s_speechState.pVpTempTxInBuffer, NULL, & s_speechState.pVpTempTxOutPutBuffer);

+    		if (ret != DRV_SUCCESS)

+    		{

+    			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_DataProcessThreadEntry error:VoiceProc_TxProcess :ret=%d.\n", ret);

+    			break;

+    		}

+    		//zOss_Memcpy((VOID *)( s_speechState.pVpTempTxOutPutBuffer), (VOID *) s_speechState.pVpTempTxInBuffer, VP_I2S_BUFFER_SIZE);

+        	else

+        	{

 

-		//no nxp lib lwenhua 20150317

-		//VoiceProc_TxProcess(& s_speechState.pVpTempTxInBuffer, NULL, & s_speechState.pVpTempTxOutPutBuffer);

-		zOss_Memcpy((VOID *)(s_speechState.pVpTempTxOutPutBuffer), (VOID *) s_speechState.pVpTempTxInBuffer, 320);

-	}

+        		//no nxp lib lwenhua 20150317

+        		//VoiceProc_TxProcess(& s_speechState.pVpTempTxInBuffer, NULL, & s_speechState.pVpTempTxOutPutBuffer);

+        		zOss_Memcpy((VOID *)(s_speechState.pVpTempTxOutPutBuffer), (VOID *) s_speechState.pVpTempTxInBuffer, 320);

+        	}

 #endif

 

 

-	if (g_voiceVar.vpI2sStatus != VP_I2S_INUSE)

-	{

-		break;

-	}

+        	if (g_voiceVar.vpI2sStatus != VP_I2S_INUSE)

+        	{

+        		break;

+        	}

 

-	/*uplink:write to teak*/

-	//zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "downlink:i2s2 write to teak\n");

-	ret = zDrvI2S_GetBuf(I2S_2, &write_buf, &write_len);

+        	/*uplink:write to teak*/

+        	//zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "downlink:i2s2 write to teak\n");

+        	ret = zDrvI2S_GetBuf(I2S_2, &write_buf, &write_len);

 

-	//zOss_ASSERT(write_buf != NULL);

-	//zOss_ASSERT(write_len != 0);

+        	//zOss_ASSERT(write_buf != NULL);

+        	//zOss_ASSERT(write_len != 0);

 #if 0

 

-	if (s_speechState.saveLen == 3200)

-	{

-		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_GetBuf:I2S2:ret=%d,write_buf = %x,write_len = %d.\n", ret, write_buf, write_len);

-	}

+        	if (s_speechState.saveLen == 3200)

+        	{

+        		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_GetBuf:I2S2:ret=%d,write_buf = %x,write_len = %d.\n", ret, write_buf, write_len);

+        	}

 #endif

-	//if(ret == DRV_SUCCESS)

-	if ((ret == DRV_SUCCESS) && (write_buf != NULL) && (write_len != 0))

-	{

-		zOss_Memcpy(write_buf, s_speechState.pVpTempTxOutPutBuffer, s_speechState.totalFrameBufSize);

-		//zOss_Memcpy(write_buf, s_speechState.pVpTempTxInBuffer,320);

-	}

-	else

-	{

-		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_GetBuf:I2S2:ret=%d,write_buf = %p,write_len = %d.\n", ret, write_buf, write_len);

-		break;

-	}

-	ret = zDrvI2S_Write(I2S_2, write_buf, write_len);

-	if (ret != DRV_SUCCESS)

-	{

-		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_Write:I2S2:ret=%d,write_buf = %p,write_len = %d.\n", ret, write_buf, write_len);

-		break;

-	}

+        	//if(ret == DRV_SUCCESS)

+        	if ((ret == DRV_SUCCESS) && (write_buf != NULL) && (write_len != 0))

+        	{

+        		zOss_Memcpy(write_buf, s_speechState.pVpTempTxOutPutBuffer, s_speechState.totalFrameBufSize);

+        		//zOss_Memcpy(write_buf, s_speechState.pVpTempTxInBuffer,320);

+        	}

+        	else

+        	{

+        		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_GetBuf:I2S2:ret=%d,write_buf = %p,write_len = %d.\n", ret, write_buf, write_len);

+        		break;

+        	}

+        	ret = zDrvI2S_Write(I2S_2, write_buf, write_len);

+        	if (ret != DRV_SUCCESS)

+        	{

+        		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "zDrvI2S_Write:I2S2:ret=%d,write_buf = %p,write_len = %d.\n", ret, write_buf, write_len);

+        		break;

+        	}

 #if 0

-	if (s_speechState.saveLen == 3200)

-	{

-		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_DataProcessThreadEntry:  s_speechState.saveLen = %d.\n",  s_speechState.saveLen);

-	}

+        	if (s_speechState.saveLen == 3200)

+        	{

+        		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_DataProcessThreadEntry:  s_speechState.saveLen = %d.\n",  s_speechState.saveLen);

+        	}

 #endif

-	//if( s_speechState.saveLen < VP_BUF_LENGTH)

-	{

-		s_speechState.saveLen += s_speechState.totalFrameBufSize;

-		if (s_speechState.saveLen >= s_speechState.inOutBufUseSize)

-		{

-			s_speechState.saveLen = 0;

-		}

-		s_speechState.pVpTempRxInBuffer = s_vpState.pVpRxInBuffer + s_speechState.saveLen;

-		s_speechState.pVpTempTxInBuffer = s_vpState.pVpTxInBuffer + s_speechState.saveLen;

-		s_speechState.pVpTempTxOutPutBuffer = s_vpState.pVpTxOutPutBuffer +  s_speechState.saveLen;

+        	//if( s_speechState.saveLen < VP_BUF_LENGTH)

+        	{

+        		s_speechState.saveLen += s_speechState.totalFrameBufSize;

+        		if (s_speechState.saveLen >= s_speechState.inOutBufUseSize)

+        		{

+        			s_speechState.saveLen = 0;

+        		}

+        		s_speechState.pVpTempRxInBuffer = s_vpState.pVpRxInBuffer + s_speechState.saveLen;

+        		s_speechState.pVpTempTxInBuffer = s_vpState.pVpTxInBuffer + s_speechState.saveLen;

+        		s_speechState.pVpTempTxOutPutBuffer = s_vpState.pVpTxOutPutBuffer +  s_speechState.saveLen;

 #ifdef _USE_VP_OUTPUT_RXOUT_DATA

-		s_speechState.pVpTempRxOutPutBuffer = s_vpState.pVpRxOutPutBuffer +  s_speechState.saveLen;

+        		s_speechState.pVpTempRxOutPutBuffer = s_vpState.pVpRxOutPutBuffer +  s_speechState.saveLen;

 #else

-		s_speechState.pVpTempRxOutPutBuffer = s_vpState.pVpRxOutPutBuffer;

+        		s_speechState.pVpTempRxOutPutBuffer = s_vpState.pVpRxOutPutBuffer;

 #endif

-	}

-}

+	        }

+        }

 

-vp_VoiceI2sStop();

-zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_DataProcessThreadEntry work end.\n");

-zOss_Printf(SUBMDL_HAL, PRINT_LEVEL_NORMAL, "voice vp_DataProcessThreadEntry work end!\n");

+        vp_VoiceI2sStop();

 

-}

+        zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_DataProcessThreadEntry work end.\n");

+        zOss_Printf(SUBMDL_HAL, PRINT_LEVEL_NORMAL, "voice vp_DataProcessThreadEntry work end!\n");

+

+    }

 }

 

 #ifdef  _OS_TOS

@@ -3586,6 +3843,49 @@
 		zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "voice_frameTimer  failed\n");

 		return DRV_ERROR;

 	}

+#ifdef _VBUFF_IN_MULTI_CORE

+		SINT32 ret = 0;

+

+		//ret = zDrvRpMsg_CreateChannel(IPC_MSG_ACTOR_A9,channel_41,0x10);

+		ret = zDrvRpMsg_CreateChannel_Cap(RPMSG_CAP_ID,channel_41,0x10);

+

+		if(DRV_SUCCESS != ret) {

+			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "create rpmsg err(%d) \n",ret);

+			return DRV_ERROR;

+		}

+		

+		volatile T_ZDrvRpMsg_Msg icp_pMsg = {0}; 

+		volatile unsigned int rpMsgBuf[2] = {0,0}; 

+		//printk( "vir_buf1:0x%x, vir_buf2:0x%x, phy_buf1:0x%x, phy_buf2:0x%x,\n",voice_buff[0],voice_buff[1],rpMsgBuf[0],rpMsgBuf[1]);

+		icp_pMsg.actorID = RPMSG_CAP_ID;

+		icp_pMsg.chID = channel_41;

+		icp_pMsg.flag &= ~RPMSG_READ_POLL;

+		icp_pMsg.buf = rpMsgBuf;

+		icp_pMsg.len = 8;

+		ret = zDrvRpMsg_Read_Cap(&icp_pMsg);

+		if(ret <= 0){

+			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "voice buffer  rpmsg addr read  fail,ret=%d \n",ret);

+			zOss_Printf(SUBMDL_HAL, PRINT_LEVEL_NORMAL, "ps voice buffer  rpmsg addr read  fail,ret=%d \n",ret);

+			

+

+		}

+		else{

+			#if 0

+

+			voice_buff[UP_LINK] = (struct voice_ring_buffer *)(rpMsgBuf[0]);

+			voice_buff[DOWN_LINK] = (struct voice_ring_buffer *)(rpMsgBuf[1]);	

+			#else

+

+			voice_buff[UP_LINK] = (struct voice_ring_buffer *)ioremap_wc(rpMsgBuf[0], (sizeof(struct voice_ring_buffer) + MAX_BUF_SIZE*MAX_BUF_NUM));

+			voice_buff[DOWN_LINK] = (struct voice_ring_buffer *)ioremap_wc(rpMsgBuf[1],(sizeof(struct voice_ring_buffer) + MAX_BUF_SIZE*MAX_BUF_NUM));	

+			#endif

+	

+			zOss_Printf(SUBMDL_HAL, PRINT_LEVEL_NORMAL, "ps rpmsg voice buffer addr,up vir buf=0x%x,  down vir buf=0x%x ,up phy buf=0x%x,  down phy buf=0x%x,size=%d \n" \

+			,voice_buff[0],voice_buff[1],rpMsgBuf[0],rpMsgBuf[1],(sizeof(struct voice_ring_buffer) + MAX_BUF_SIZE*MAX_BUF_NUM));

+			zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "voice buffer addr,up vir buf=0x%x,  down vir buf=0x%x ,up phy buf=0x%x,  down phy buf=0x%x,size=%d \n" \

+				,voice_buff[0],voice_buff[1],rpMsgBuf[0],rpMsgBuf[1],(sizeof(struct voice_ring_buffer) + MAX_BUF_SIZE*MAX_BUF_NUM));

+		}

+#endif

 #endif

 	

 	zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_CreateThreadSemaph success. \r\n");

@@ -4032,39 +4332,39 @@
 		//    pVoiceLoopInSaveBuffer =  s_speechState.pVpTempTxOutPutBuffer;

 		//  pVoiceLoopOutSaveBuffer =  s_speechState.pVpTempRxInBuffer;

 #endif

-

+#if 0

         if (FALSE == g_voiceVar.firstRegZCATFlag) {

             ret = zCatAgt_Audio_Reg(10,VP_INOUT_BAK_BUFFER_SIZE,(UINT32)vpInOutBuffer.p_voiceRxInBuffer);

             if(ret != DRV_SUCCESS){

-                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_Open RXIN register zCatAgt_Audio_Reg err\n");

+                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_LoopProcessThreadEntry RXIN register zCatAgt_Audio_Reg err\n");

             }

             

             ret = zCatAgt_Audio_Reg(12,VP_INOUT_BAK_BUFFER_SIZE,(UINT32)vpInOutBuffer.p_voiceTxInBuffer);

             if(ret != DRV_SUCCESS){

-                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_Open TXIN register zCatAgt_Audio_Reg err\n");

+                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_LoopProcessThreadEntry TXIN register zCatAgt_Audio_Reg err\n");

             }

                 

     		ret = zCatAgt_Audio_Reg(13,VP_INOUT_BAK_BUFFER_SIZE,(UINT32)vpInOutBuffer.p_voiceTxOutPutBuffer);

             if(ret != DRV_SUCCESS){

-                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_Open TXOUT register zCatAgt_Audio_Reg err\n");

+                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_LoopProcessThreadEntry TXOUT register zCatAgt_Audio_Reg err\n");

             }

 

 #ifdef _USE_VP_OUTPUT_RXOUT_DATA

     		ret = zCatAgt_Audio_Reg(11, VP_INOUT_BAK_BUFFER_SIZE, (UINT32)vpInOutBuffer.p_voiceRxOutPutBuffer);

             if(ret != DRV_SUCCESS){

-                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_Open RXOUT register zCatAgt_Audio_Reg err\n");

+                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_LoopProcessThreadEntry RXOUT register zCatAgt_Audio_Reg err\n");

             }

 

 #else

     		ret = zCatAgt_Audio_Reg(11,VP_INOUT_NOBAK_BUFSIZE,(UINT32)vpInOutBuffer.p_voiceRxOutPutBuffer);

             if(ret != DRV_SUCCESS){

-                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_Open RXOUT register zCatAgt_Audio_Reg err\n");

+                zDrvRamlog_PRINTF(RAMLOG_MOD_AUDIO, "vp_LoopProcessThreadEntry RXOUT register zCatAgt_Audio_Reg err\n");

             }

 #endif

 

             g_voiceVar.firstRegZCATFlag = TRUE;   

         }

-        

+#endif        

 		zOss_Sleep(500);

 		ret = zDrvVp_LoopStartDo();

 		if (ret != DRV_SUCCESS)

diff --git a/cp/ps/driver/ws/drv_cfg.mk b/cp/ps/driver/ws/drv_cfg.mk
old mode 100644
new mode 100755
index 4c5834b..4934471
--- a/cp/ps/driver/ws/drv_cfg.mk
+++ b/cp/ps/driver/ws/drv_cfg.mk
@@ -176,7 +176,10 @@
 #USE_NXP_AUD = yes

 USE_AUDIENCE = no

 

-

+ifeq ($(USE_VOICE_BUFFER_IN_CAP),yes)

+DEFINE += -DCONFIG_VOICE_BUFFER_DRV

+DEFINE += -D_VBUFF_IN_MULTI_CORE

+endif

 

 

 

diff --git a/cp/ps/modem/com/inc/config/atcfg/sys_func_atcfg.h b/cp/ps/modem/com/inc/config/atcfg/sys_func_atcfg.h
index 6b502ad..14ef26d 100755
--- a/cp/ps/modem/com/inc/config/atcfg/sys_func_atcfg.h
+++ b/cp/ps/modem/com/inc/config/atcfg/sys_func_atcfg.h
@@ -247,7 +247,7 @@
     /*NVÍ·²¿*/

     CHAR    magic[8];  /*ħÊõ×Ö*/

     UINT16    wVersion; /*°æ±¾ºÅ£¬µ±Ç°Èí¼þÔÝδʹÓÃ*/

-    UINT16    wLen;      /*ÐèÒª¿½±´µÄÓÐЧÊý¾ÝµÄ³¤¶È,±¾°æ±¾È¡ÖµÎª793*/

+    UINT16    wLen;      /*ÐèÒª¿½±´µÄÓÐЧÊý¾ÝµÄ³¤¶È,±¾°æ±¾È¡ÖµÎª796*/

 

     UINT8 jtagserver;/* 1:TDÎïÀí²ãµ÷ÊÔ°æ±¾ 0:TDÎïÀí²ã¹Ì»¯°æ±¾£¬ÆäËûÖµÎÞЧ £¬Ä¬ÈÏֵΪ0*/

     UINT8 exceptReset;/* 2:µ¼³öramdumpºóÔÙÖØÆô1:´ò¿ªÒì³£ÖØÆô 0:¹Ø±ÕÒì³£ÖØÆô£¬Ä¬ÈÏֵΪ0 */

@@ -439,7 +439,10 @@
     UINT8 bRrcRelCountM;/*RRCÊÍ·Å·¢Æð¼ÆÊýãÐÖµ,ȡֵ0-255,³ö³§Öµ0*/

     UINT8 bOosScanThreshFlg;/*OOSËÑÍøÃÅÏÞ¿ª¹Ø,0-¹Ø±Õ,1-´ò¿ª,³ö³§Öµ0*/

     UINT8 bOosScanThresh;/*OOSËÑÍøÃÅÏÞ,ȡֵ100-120,¶ÔÓ¦-110dBmµ½-120dBm,³ö³§Öµ0*/

-    UINT8 abSpare[3];

+    UINT8 bEcallFlg;/*0-ʹÓÿ¨ÖеÄECALL,1-ʹÓÃNVÖеÄECALL,³ö³§Öµ0*/

+    /*bit0:0-οؽµÎ»ָ´Ê±,µÈ»Ø¿ÕÏÐÔÙ´ò¿ªNRÄÜÁ¦,1-οؽµÎÂʱÁ¢¿Ì´ò¿ªNRÄÜÁ¦,³ö³§Öµ0

+      bit1:1-ÎÞÂÛ¿¨ÖÐRPLMNÊÇ·ñÓëNVÖеÄÏàͬ,´ÓRPLMN¿ªÊ¼Ñ¡Íø,1-¿¨ÖÐRPLMNÓëNVÖеIJ»Í¬Ê±,²»Ñ¡RPLMN,Ö±½Ó´ÓHPLMN¿ªÊ¼Ñ¡Íø,³ö³§Öµ0*/

+    UINT16 wNasBitmap;

 }CommAtSetting;

 /* atÉèÖýṹÌå ²»´æNV*/

 typedef struct  

@@ -1880,6 +1883,10 @@
 VOID zOss_GetOosScanThresh(CommAtCfgCmdParam * cmdParm);

 UINT8 zOss_GetOosScanThreshFlg(VOID);

 UINT8 zOss_GetOosScanThreshValue(VOID);

+UINT32 zOss_SetEcallFlag(CommAtCfgCmdParam * cmdParm);

+UINT8 zOss_GetEcallFlag(VOID);

+UINT32 zOss_SetNasCfg(CommAtCfgCmdParam * cmdParm);

+UINT16 zOss_GetNasCfg(VOID);

 #ifdef _USE_PSM_TEST

 /****************************************************************** 

  *  º¯ÊýÃû      : zSys_SetPsmFlagToIram

diff --git a/cp/ps/modem/com/src/appstart/inc/version_number.h b/cp/ps/modem/com/src/appstart/inc/version_number.h
index 5e2a2fc..a100b7f 100755
--- a/cp/ps/modem/com/src/appstart/inc/version_number.h
+++ b/cp/ps/modem/com/src/appstart/inc/version_number.h
@@ -1,9 +1,9 @@
 #if defined _CHIP_ZX297520
-#define VERSION_NUMBER "7520SCV2.01.01.02P52U02"
+#define VERSION_NUMBER "7520SCV2.01.01.02P54U02"
 #endif
 #if defined _CHIP_ZX297520V2
-#define VERSION_NUMBER "7520V2SCV2.01.01.02P52U02"
+#define VERSION_NUMBER "7520V2SCV2.01.01.02P54U02"
 #endif
 #if defined _CHIP_ZX297520V3
-#define VERSION_NUMBER "7520V3SCV2.01.01.02P52U02"
+#define VERSION_NUMBER "7520V3SCV2.01.01.02P54U02"
 #endif
diff --git a/cp/ps/modem/ps/inc/atipscom.h b/cp/ps/modem/ps/inc/atipscom.h
index a64ec13..a1a8d07 100755
--- a/cp/ps/modem/ps/inc/atipscom.h
+++ b/cp/ps/modem/ps/inc/atipscom.h
@@ -122,6 +122,8 @@
 #define Z_DEV_MAX_BEEPCALL_NUM                  (BYTE)11

 #define Z_DEV_MAX_BEEPCALL_GROUP                (BYTE)3

 

+#define Z_DEV_MAX_ECALL_NUM                  (BYTE)11

+

 #define Z_DEV_MAX_MSISDN_NUM                    (BYTE)15

 

 #ifdef _USE_LPP_ECID

@@ -228,13 +230,14 @@
 #define Z_ATI_NV_Msisdn1                                   (BYTE)(Z_ATI_NV_BeepCall + 1)

 #define Z_ATI_NV_Msisdn2                                   (BYTE)(Z_ATI_NV_Msisdn1 + 1)

 #define Z_ATI_NV_EcallCapa                                 (BYTE)(Z_ATI_NV_Msisdn2 + 1)

+#define Z_ATI_NV_EcallNum                                 (BYTE)(Z_ATI_NV_EcallCapa + 1)

 #ifdef BTRUNK_SUPPORT

-#define Z_ATI_NV_PttTruncUser                              (BYTE)(Z_ATI_NV_EcallCapa + 1)

+#define Z_ATI_NV_PttTruncUser                              (BYTE)(Z_ATI_NV_EcallNum + 1)

 #define Z_ATI_NV_PttIOTFlag                                (BYTE)(Z_ATI_NV_PttTruncUser + 1)

 #define Z_ATI_NV_PttSubWayFlag                             (BYTE)(Z_ATI_NV_PttIOTFlag + 1)

 #define Z_ATI_NV_PrvEnd                                    (BYTE)(Z_ATI_NV_PttSubWayFlag + 0)

 #else

-#define Z_ATI_NV_PrvEnd                                    (BYTE)(Z_ATI_NV_EcallCapa + 0)

+#define Z_ATI_NV_PrvEnd                                    (BYTE)(Z_ATI_NV_EcallNum + 0)

 #endif

 

 

@@ -1299,6 +1302,14 @@
     BYTE              abPadding[3];

 }T_zAti_NV_EcallCapa;

 

+typedef struct {

+    BYTE                            bTestNumLen;/*³ö³§Öµ0*/

+    BYTE                            bReCfgNumLen;/*³ö³§Öµ0*/

+

+    BYTE                            abTestNum[Z_DEV_MAX_ECALL_NUM];

+    BYTE                            abReCfgNum[Z_DEV_MAX_ECALL_NUM];

+}T_zAti_NV_EcallNum;

+

 #ifdef BTRUNK_SUPPORT

 typedef struct  

 {

diff --git a/cp/ps/modem/ps/inc/atipsint.h b/cp/ps/modem/ps/inc/atipsint.h
index 2fa876b..0272e78 100755
--- a/cp/ps/modem/ps/inc/atipsint.h
+++ b/cp/ps/modem/ps/inc/atipsint.h
@@ -1239,6 +1239,7 @@
 

 /*ZCCSTATEºê¶¨Òå*/

 #define Z_MAXCALLNM                              (BYTE)7

+#define Z_CC_STATE_NAME_MAX_LEN                  (BYTE)40

 

 #define  Z_MMIASM_ATCMD_ATD     (BYTE)0  // for VoLTE

 #define  Z_MMIASM_ATCMD_REDIAL     (BYTE)1  // for VoLTE

@@ -5381,12 +5382,14 @@
     BYTE                        bMptystate;  /* 1:mptyºô½Ð£¬0: ·Çmptyºô½Ð */

     BYTE                        bCallPriFg;

     BYTE                        bCallPriority;      /* ºô½ÐÓÅÏȼ¶£¬¼ûºê¶¨Òå */

-    

+

     BYTE                        bNumFg;

     BYTE                        bAlphaFg;

-    BYTE                        abPadding[2];   /* alpha ÒÔºóÐèÒªÔÙ¼Ó  */       

+    BYTE                        bNameFg;

+    BYTE                        bNameLen;

 

-    T_z_CallNum              tNum;         /* ¶Ô·½ºÅÂëÉÏÏÞ40*/

+    T_z_CallNum                 tNum;         /* ¶Ô·½ºÅÂëÉÏÏÞ40*/

+    BYTE                        abName[Z_CC_STATE_NAME_MAX_LEN];

 }T_zMmiaCc_State_Info;

 

 typedef struct {

@@ -5958,6 +5961,21 @@
    BYTE            abMSD[MSD_MAX_LENGTH];

 }T_zMmiaCc_ZECALL_Ind;

 

+/*==============================================================================

+ Ô­ÓMMIA_CC_ECALL_WORKSTATE_IND_EV(CC->ATI)

+ ˵Ã÷: Éϱ¨+ZECALLSTATE: <CallId>,<Dir>,<ecallState>

+==============================================================================*/

+typedef struct

+{

+   BYTE                        bSrcIndex;

+   BYTE                        bDesIndex;

+   BYTE                        bCallId;

+   BYTE                        bDir;

+

+   BYTE                        bECallState;

+   BYTE                        abpadding[3];

+}T_zMmiaCc_ECallWorkStateInd;

+

 typedef struct

 {

     BYTE                        bStatus;        /* ²Î¼ûºê¶¨Òå */

diff --git a/cp/ps/modem/ps/src/nas/ati/inc/zat_api.h b/cp/ps/modem/ps/src/nas/ati/inc/zat_api.h
index 8d0a863..3e906c4 100755
--- a/cp/ps/modem/ps/src/nas/ati/inc/zat_api.h
+++ b/cp/ps/modem/ps/src/nas/ati/inc/zat_api.h
@@ -221,6 +221,7 @@
     ZAT2_CC_ZNECALLNUM,

     ZAT2_CC_ZECALL,

     ZAT2_CC_ZECALLCAPA,

+    ZAT2_CC_ZECALLNUM,

     ZAT2_CC_END,       

 

     /*-----------SMSÄ£¿é-------------*/

diff --git a/cp/ps/modem/ps/src/nas/ati/inc/zat_fnc.h b/cp/ps/modem/ps/src/nas/ati/inc/zat_fnc.h
index 95c6f07..92c3829 100755
--- a/cp/ps/modem/ps/src/nas/ati/inc/zat_fnc.h
+++ b/cp/ps/modem/ps/src/nas/ati/inc/zat_fnc.h
@@ -404,6 +404,8 @@
 T_ZAt_ParseCmd2MsgRslt zAt_PsDecZnecallnumReq(T_ZAt_DecCmdInfo * pDecCmdInfo);

 T_ZAt_ParseCmd2MsgRslt zAt_PsDecEcallCapaSetReq(T_ZAt_DecCmdInfo * pDecCmdInfo);

 T_ZAt_ParseCmd2MsgRslt zAt_PsDecEcallCapaQryReq(T_ZAt_DecCmdInfo * pDecCmdInfo);

+T_ZAt_ParseCmd2MsgRslt zAt_PsDecEcallNumSetReq(T_ZAt_DecCmdInfo * pDecCmdInfo);

+T_ZAt_ParseCmd2MsgRslt zAt_PsDecEcallNumQryReq(T_ZAt_DecCmdInfo * pDecCmdInfo);

 #endif

 T_ZAt_ParseCmd2MsgRslt zAt_PsDecCcCrReq( T_ZAt_DecCmdInfo * pDecCmdInfo );

 T_ZAt_ParseCmd2MsgRslt zAt_PsDecCcCrcReq( T_ZAt_DecCmdInfo * pDecCmdInfo );

@@ -824,6 +826,7 @@
 #ifdef ECALL_SUPPORT

 UINT16 zAt_EncCcCecnInd(T_ZAt_EncCmdInfo * pEncCmdInfo);

 UINT16 zAt_EncCcZEcallInd(T_ZAt_EncCmdInfo * pEncCmdInfo);

+UINT16 zAt_EncCcZecallStateInd(T_ZAt_EncCmdInfo * pEncCmdInfo);

 #endif

 #endif

 UINT16 zAt_PsEncCeerSmActionCnf( T_ZAt_EncCmdInfo * pEncCmdInfo );

diff --git a/cp/ps/modem/ps/src/nas/ati/inc/zati_com.h b/cp/ps/modem/ps/src/nas/ati/inc/zati_com.h
index 68d7fe9..29f118d 100755
--- a/cp/ps/modem/ps/src/nas/ati/inc/zati_com.h
+++ b/cp/ps/modem/ps/src/nas/ati/inc/zati_com.h
@@ -559,10 +559,6 @@
 /*********************num type*************************/

 #define Z_ATI_TEST_NUM      (BYTE)0/*test num*/

 #define Z_ATI_RECFG_NUM      (BYTE)1/*reconfiguration number num*/

-/**********************ECALL CAPA**********************/

-#define Z_ATI_ECALL_NOT_SUP        (BYTE)0/*NOT SUP ECALL*/

-#define Z_ATI_ECALL_ONLY        (BYTE)1/*ECALL ONLY*/

-#define Z_ATI_ECALL_NORMALCALL        (BYTE)2/*NORMAL & ECALL*/

 

 

 #ifdef DSDS_VSIM

diff --git a/cp/ps/modem/ps/src/nas/ati/src/zat_fnc.c b/cp/ps/modem/ps/src/nas/ati/src/zat_fnc.c
index a297034..09035a2 100755
--- a/cp/ps/modem/ps/src/nas/ati/src/zat_fnc.c
+++ b/cp/ps/modem/ps/src/nas/ati/src/zat_fnc.c
@@ -3708,6 +3708,9 @@
     BYTE IsSupUri = Z_ATI_ECALL_URI_NOT_SUP;

     T_z_CallNum testNum = {0};

     T_z_CallNum ReCfgNum = {0};

+    T_z_CallNum *ptUicctestNum = ZOSS_NULL;

+    T_z_CallNum *ptUiccReCfgNum = ZOSS_NULL;

+    T_zAti_NV_EcallNum tEcallNum = {0};

 

     T_zMmiaCc_Moc_Req *ptMocReq = (T_zMmiaCc_Moc_Req*)zAti_GetUB(sizeof(T_zMmiaCc_Moc_Req));

     prsCmd2Msg.pMsgBody = (VOID*)ptMocReq;

@@ -3766,22 +3769,52 @@
 

     if(ptMocReq->bECallType == Z_MMIACC_ECALL_TESTCALL || ptMocReq->bECallType == Z_MMIACC_ECALL_RECONFIGCALL)

     {

-        if((Z_FAIL == zAt_GetEcallSupStat(&bCardEcallType, &IsSupNum, &IsSupUri)) || 

-            (bCardEcallType == Z_ATI_NOTSUP_ECALL) || (IsSupNum == Z_ATI_ECALL_NUM_NOT_SUP))

+        if(Z_FAIL == zAt_GetEcallSupStat(&bCardEcallType, &IsSupNum, &IsSupUri))

         {

             zAti_SendExpt2TraceAgt(ERR_InvalidMsg,  TRACE_ERR_LEVEL_NORMAL,"");

-            return zAt_GetParseRslt2(&prsCmd2Msg, ZAT2_OPTNOTALW_ERR);

         }

 

-        if(bCardEcallType == Z_ATI_ECALL_ONLY)

+        ptUicctestNum = (T_z_CallNum*)zAti_GetUB(sizeof(T_z_CallNum));

+        ptUiccReCfgNum = (T_z_CallNum*)zAti_GetUB(sizeof(T_z_CallNum));

+

+        if(bCardEcallType == Z_ATI_ECALL_ONLY && IsSupNum == Z_ATI_ECALL_NUM_SUP)

         {

-            zAt_GetFdnEcallNum(&testNum, &ReCfgNum, g_zAti_CurInstance);//¶ÁÈ¡FDN

+            zAt_GetFdnEcallNum(ptUicctestNum, ptUiccReCfgNum, g_zAti_CurInstance);//¶ÁÈ¡FDN

         }

-        else

+        else if(bCardEcallType == Z_ATI_ECALL_NORMCALL && IsSupNum == Z_ATI_ECALL_NUM_SUP)

         {

-            zAt_GetSdnEcallNum(&testNum, &ReCfgNum, g_zAti_CurInstance);//¶ÁÈ¡SDN

+            zAt_GetSdnEcallNum(ptUicctestNum, ptUiccReCfgNum, g_zAti_CurInstance);//¶ÁÈ¡SDN

         }

 

+        zDev_NV_AtiReadItem(Z_ATI_NV_EcallNum, (PBYTE)&tEcallNum);

+

+        if(tEcallNum.bTestNumLen > 0)

+        {

+            testNum.bNumLen = (tEcallNum.bTestNumLen > Z_DEV_MAX_ECALL_NUM)? Z_DEV_MAX_ECALL_NUM : tEcallNum.bTestNumLen;

+            zOss_Memcpy(testNum.abNum, tEcallNum.abTestNum, testNum.bNumLen);

+            testNum.bNumType = Z_APMMIA_TOA_NOPLUS;

+        }

+

+        if(tEcallNum.bReCfgNumLen > 0)

+        {

+            ReCfgNum.bNumLen = (tEcallNum.bReCfgNumLen > Z_DEV_MAX_ECALL_NUM)? Z_DEV_MAX_ECALL_NUM : tEcallNum.bReCfgNumLen;

+            zOss_Memcpy(ReCfgNum.abNum, tEcallNum.abReCfgNum, ReCfgNum.bNumLen);

+            ReCfgNum.bNumType = Z_APMMIA_TOA_NOPLUS;

+        }

+

+        if(testNum.bNumLen == 0)

+        {

+            testNum = (*ptUicctestNum);

+        }

+

+        if(ReCfgNum.bNumLen == 0)

+        {

+            ReCfgNum = (*ptUiccReCfgNum);

+        }

+

+        zAti_RetUB((VOID**)&ptUicctestNum);

+        zAti_RetUB((VOID**)&ptUiccReCfgNum);

+

         if(ptMocReq->bECallType == Z_MMIACC_ECALL_TESTCALL)

         {

             ptMocReq->tCalledNum = testNum;

@@ -3855,27 +3888,44 @@
 T_ZAt_ParseCmd2MsgRslt zAt_PsDecZnecallnumReq(T_ZAt_DecCmdInfo * pDecCmdInfo)

 {

     CHAR* pStrWalk = g_zAt_EncBuf;

-    CHAR* pDecCmdStr = pDecCmdInfo->strParam;

-    CHAR strSubBuf[ZAT2_SUB_PARAM_MAX_LEN] = {0};

     T_ZAt_ParseCmd2MsgRslt     prsCmd2Msg = {0};

     BYTE bEcallType = Z_ATI_NOTSUP_ECALL;

     BYTE IsSupNum = Z_ATI_ECALL_NUM_NOT_SUP;

     BYTE IsSupUri = Z_ATI_ECALL_URI_NOT_SUP;

     T_z_CallNum testNum = {0};

     T_z_CallNum ReCfgNum = {0};

+    T_z_CallNum UicctestNum = {0};

+    T_z_CallNum UiccReCfgNum = {0};

     T_z_UICC_FdnUri *ptTestFdnUri = NULL;

     T_z_UICC_FdnUri *ptRecfgFdnUri = NULL;

     T_z_UICC_SdnUri *ptTestSdnUri = NULL;

     T_z_UICC_SdnUri *ptRecfgSdnUri = NULL;

-    BYTE i = 0;

+    WORD i = 0;

+    T_zAti_NV_EcallNum tEcallNum = {0};

+    BYTE *pbTestUri = ZOSS_NULL;

+    BYTE *pbRecfgUri = ZOSS_NULL;

+    BYTE bTestUriLen = 0;

+    BYTE bRecfgUriLen = 0;

+

+    zDev_NV_AtiReadItem(Z_ATI_NV_EcallNum, (PBYTE)&tEcallNum);

+

+    if(tEcallNum.bTestNumLen > 0)

+    {

+        testNum.bNumLen = (tEcallNum.bTestNumLen > Z_DEV_MAX_ECALL_NUM)? Z_DEV_MAX_ECALL_NUM : tEcallNum.bTestNumLen;

+        zOss_Memcpy(testNum.abNum, tEcallNum.abTestNum, testNum.bNumLen);

+    }

+

+    if(tEcallNum.bReCfgNumLen > 0)

+    {

+        ReCfgNum.bNumLen = (tEcallNum.bReCfgNumLen > Z_DEV_MAX_ECALL_NUM)? Z_DEV_MAX_ECALL_NUM : tEcallNum.bReCfgNumLen;

+        zOss_Memcpy(ReCfgNum.abNum, tEcallNum.abReCfgNum, ReCfgNum.bNumLen);

+    }

 

     if(Z_FAIL == zAt_GetEcallSupStat(&bEcallType, &IsSupNum, &IsSupUri))

     {

-        return zAt_GetParseRslt2(&prsCmd2Msg, ZAT2_OPTNOTALW_ERR);

+        zAti_SendExpt2TraceAgt(ERR_InvalidMsg,  TRACE_ERR_LEVEL_NORMAL,"");

     }

 

-    pStrWalk += sprintf((char *)pStrWalk, "%s+ZNECALLNUM: ", g_zAt_CRLF);

-

     if(bEcallType == Z_ATI_ECALL_ONLY)

     {

         ptTestFdnUri = (T_z_UICC_FdnUri*)zAti_GetUB(sizeof(T_z_UICC_FdnUri));

@@ -3883,7 +3933,7 @@
 

         if(IsSupNum == Z_ATI_ECALL_NUM_SUP)

         {

-            zAt_GetFdnEcallNum(&testNum, &ReCfgNum, g_zAti_CurInstance);//¶ÁÈ¡FDN

+            zAt_GetFdnEcallNum(&UicctestNum, &UiccReCfgNum, g_zAti_CurInstance);//¶ÁÈ¡FDN

         }

 

         if(IsSupUri == Z_ATI_ECALL_URI_SUP)

@@ -3891,28 +3941,19 @@
             zAt_GetFdnEcallUri(ptTestFdnUri, ptRecfgFdnUri, g_zAti_CurInstance);//¶ÁÈ¡FDNURI

         }

 

-        pStrWalk += sprintf((char *)pStrWalk, "\"");

-        zAt_EncBcd2NumStrByCscsType(pStrWalk, testNum.abNum, testNum.bNumLen, ZAT2_CSCS_GSM);

-        pStrWalk += strlen((const char *)pStrWalk);

-

-        pStrWalk += sprintf((char *)pStrWalk, "\",\"");

-        zAt_EncBcd2NumStrByCscsType(pStrWalk, ReCfgNum.abNum, ReCfgNum.bNumLen, ZAT2_CSCS_GSM);

-        pStrWalk += strlen((const char *)pStrWalk);

-

-        pStrWalk += sprintf((char *)pStrWalk, "\",\"");

-

-        for(i = 0; i < ptTestFdnUri->bUriAddrLen; i++)

+        if(ptTestFdnUri->bUriAddrLen > 0)

         {

-            pStrWalk += sprintf((char *)pStrWalk, "%c", ptTestFdnUri->abUriAddr[i]);

+            bTestUriLen = ptTestFdnUri->bUriAddrLen;

+            pbTestUri = (BYTE*)zAti_GetUB(bTestUriLen);

+            zOss_Memcpy(pbTestUri, ptTestFdnUri->abUriAddr, bTestUriLen);

         }

 

-        pStrWalk += sprintf((char *)pStrWalk, "\",\"");

-

-        for(i = 0; i < ptRecfgFdnUri->bUriAddrLen; i++)

+        if(ptRecfgFdnUri->bUriAddrLen > 0)

         {

-            pStrWalk += sprintf((char *)pStrWalk, "%c", ptRecfgFdnUri->abUriAddr[i]);

+            bRecfgUriLen = ptRecfgFdnUri->bUriAddrLen;

+            pbRecfgUri = (BYTE*)zAti_GetUB(bRecfgUriLen);

+            zOss_Memcpy(pbRecfgUri, ptRecfgFdnUri->abUriAddr, bRecfgUriLen);

         }

-        pStrWalk += sprintf((char *)pStrWalk, "\"");

 

         zAti_RetUB((VOID**)&ptTestFdnUri);

         zAti_RetUB((VOID**)&ptRecfgFdnUri);

@@ -3924,46 +3965,71 @@
 

         if(IsSupNum == Z_ATI_ECALL_NUM_SUP)

         {

-            zAt_GetSdnEcallNum(&testNum, &ReCfgNum, g_zAti_CurInstance);//¶ÁÈ¡FDN

+            zAt_GetSdnEcallNum(&UicctestNum, &UiccReCfgNum, g_zAti_CurInstance);//¶ÁÈ¡SDN

         }

         if(IsSupUri == Z_ATI_ECALL_URI_SUP)

         {

             zAt_GetSdnEcallUri(ptTestSdnUri, ptRecfgSdnUri, g_zAti_CurInstance);//¶ÁÈ¡SDNURI

         }

 

-        pStrWalk += sprintf((char *)pStrWalk, "\"");

-        zAt_EncBcd2NumStrByCscsType(pStrWalk, testNum.abNum, testNum.bNumLen, ZAT2_CSCS_GSM);

-        pStrWalk += strlen((const char *)pStrWalk);

-

-        pStrWalk += sprintf((char *)pStrWalk, "\",\"");

-        zAt_EncBcd2NumStrByCscsType(pStrWalk, ReCfgNum.abNum, ReCfgNum.bNumLen, ZAT2_CSCS_GSM);

-        pStrWalk += strlen((const char *)pStrWalk);

-

-        pStrWalk += sprintf((char *)pStrWalk, "\",\"");

-

-        for(i = 0; i < ptTestSdnUri->bUriAddrLen; i++)

+        if(ptTestSdnUri->bUriAddrLen > 0)

         {

-            pStrWalk += sprintf((char *)pStrWalk, "%c", ptTestSdnUri->abUriAddr[i]);

+            bTestUriLen = ptTestSdnUri->bUriAddrLen;

+            pbTestUri = (BYTE*)zAti_GetUB(bTestUriLen);

+            zOss_Memcpy(pbTestUri, ptTestSdnUri->abUriAddr, bTestUriLen);

         }

 

-        pStrWalk += sprintf((char *)pStrWalk, "\",\"");

-

-        for(i = 0; i < ptRecfgSdnUri->bUriAddrLen; i++)

+        if(ptRecfgSdnUri->bUriAddrLen > 0)

         {

-            pStrWalk += sprintf((char *)pStrWalk, "%c", ptRecfgSdnUri->abUriAddr[i]);

+            bRecfgUriLen = ptRecfgSdnUri->bUriAddrLen;

+            pbRecfgUri = (BYTE*)zAti_GetUB(bRecfgUriLen);

+            zOss_Memcpy(pbRecfgUri, ptRecfgSdnUri->abUriAddr, bRecfgUriLen);

         }

-        pStrWalk += sprintf((char *)pStrWalk, "\"");

 

         zAti_RetUB((VOID**)&ptTestSdnUri);

         zAti_RetUB((VOID**)&ptRecfgSdnUri);

     }

-    else

+

+    if(testNum.bNumLen == 0)

     {

-        pStrWalk += sprintf((char *)pStrWalk, "\"\",\"\",\"\",\"\"");//IMSÒªÇóûÓÐʱÉϱ¨¿Õ

+        testNum = UicctestNum;

     }

 

+    if(ReCfgNum.bNumLen == 0)

+    {

+        ReCfgNum = UiccReCfgNum;

+    }

+

+    pStrWalk += sprintf((char *)pStrWalk, "%s+ZNECALLNUM: ", g_zAt_CRLF);

+

+    pStrWalk += sprintf((char *)pStrWalk, "\"");

+    zAt_EncBcd2NumStrByCscsType(pStrWalk, testNum.abNum, testNum.bNumLen, ZAT2_CSCS_GSM);

+    pStrWalk += strlen((const char *)pStrWalk);

+

+    pStrWalk += sprintf((char *)pStrWalk, "\",\"");

+    zAt_EncBcd2NumStrByCscsType(pStrWalk, ReCfgNum.abNum, ReCfgNum.bNumLen, ZAT2_CSCS_GSM);

+    pStrWalk += strlen((const char *)pStrWalk);

+

+    pStrWalk += sprintf((char *)pStrWalk, "\",\"");

+

+    for(i = 0; i < bTestUriLen; i++)

+    {

+        pStrWalk += sprintf((char *)pStrWalk, "%c", pbTestUri[i]);

+    }

+

+    pStrWalk += sprintf((char *)pStrWalk, "\",\"");

+

+    for(i = 0; i < bRecfgUriLen; i++)

+    {

+        pStrWalk += sprintf((char *)pStrWalk, "%c", pbRecfgUri[i]);

+    }

+    pStrWalk += sprintf((char *)pStrWalk, "\"");

+

     sprintf((char *)pStrWalk, "%s%s", g_zAt_CRLF, g_zAt_OK);

 

+    zAti_RetUB((VOID**)&pbTestUri);

+    zAti_RetUB((VOID**)&pbRecfgUri);

+

     return zAt_GetParseRslt(ZAT2_CMD_REPLY_DIRECT);

 }

 

@@ -3977,7 +4043,7 @@
 

     /*+ZECALLCAPA=<n>*/

     if(!(zAt_PsDecNextParamDecimalNumByteNeed( &prsCmd2Msg, strSubBuf, &pDecCmdStr, &bSetPara, NULL))

-        || bSetPara > Z_ATI_ECALL_NORMALCALL)

+        || bSetPara > Z_ATI_ECALL_NORMCALL)

     {

         return zAt_GetParseRslt2(&prsCmd2Msg,ZAT2_CMD_PARAM_ERR);

     }

@@ -4009,6 +4075,162 @@
 

     return zAt_GetParseRslt(ZAT2_CMD_REPLY_DIRECT);

 }

+

+T_ZAt_ParseCmd2MsgRslt zAt_PsDecEcallNumSetReq(T_ZAt_DecCmdInfo * pDecCmdInfo)

+{

+    CHAR* pDecCmdStr = pDecCmdInfo->strParam;   /* ¼Ç¼²ÎÊý×ֶεÄÓÎ×ßÖ¸Õë */

+    CHAR strSubBuf[ZAT2_SUB_PARAM_MAX_LEN] = {0};    /* ´æ·Å½ØÈ¡µÄ²ÎÊý×Ö·û´® */

+    T_ZAt_ParseCmd2MsgRslt   prsCmd2Msg = {0};

+    T_zAti_NV_EcallNum tEcallNum = {0};

+    T_zAti_NV_EcallNum tTmpEcallNum = {0};

+    BYTE abCallNum[Z_DEV_MAX_ECALL_NUM + 1] = {0};

+    BYTE bMode = Z_INVALID;

+    BYTE bType = Z_INVALID;

+    WORD strNumLen = 0;

+    BOOL bPlusFlag = FALSE;

+    WORD wNumLen = 0;

+    SINT16 iDecBcdRet = -1;

+    SINT16 iSubLen = -1;

+    CHAR *pstrSubBuf = ZOSS_NULL;

+

+    /*+ZECALLNUM=<Mode>[,<Type>[,<eCallNum>]]*/

+    if(!zAt_PsDecNextParamDecimalNumBoolNeed(&prsCmd2Msg, strSubBuf, &pDecCmdStr, &bMode, NULL))

+    {

+        return prsCmd2Msg;

+    }

+

+    zDev_NV_AtiReadItem(Z_ATI_NV_EcallNum, (PBYTE)&tEcallNum);

+    zOss_Memcpy(&tTmpEcallNum, &tEcallNum, sizeof(T_zAti_NV_EcallNum));

+

+    if(strlen((const char *)pDecCmdStr) > 0)

+    {

+        if(!zAt_PsDecNextParamDecimalNumBoolNeed(&prsCmd2Msg, strSubBuf, &pDecCmdStr, &bType, NULL))

+        {

+            return prsCmd2Msg;

+        }

+

+        pstrSubBuf = (CHAR *)zAti_GetUB(ZAT2_HEXFMTPA_MAX_LEN+1);

+        if ((iSubLen = zAt_GetNextParamStr(pstrSubBuf, ZAT2_PARAM_HEX_FORMAT, &pDecCmdStr)) == -1)

+        {

+            zAti_RetUB((VOID **)&pstrSubBuf);

+            return zAt_GetParseRslt2(&prsCmd2Msg,ZAT2_CMD_PARAM_ERR);

+        }

+

+        if(iSubLen > 0)

+        {

+            iDecBcdRet = zAt_DecCallNum2Bcd(abCallNum, &bPlusFlag, pstrSubBuf, (UINT16)iSubLen, Z_DEV_MAX_ECALL_NUM);

+            if (iDecBcdRet < 0)

+            {

+                zAti_RetUB((VOID **)&pstrSubBuf);

+                return zAt_GetParseRslt2(&prsCmd2Msg,ZAT2_CMD_PARAM_ERR);

+            }

+        }

+

+        zAti_RetUB((VOID **)&pstrSubBuf);

+

+        if(bMode == 0)//ɾ³ý

+        {

+            if(bType == Z_ATI_TEST_NUM)

+            {

+                tEcallNum.bTestNumLen = 0;

+                zOss_Memset(tEcallNum.abTestNum, 0, Z_DEV_MAX_ECALL_NUM);

+            }

+            else

+            {

+                tEcallNum.bReCfgNumLen = 0;

+                zOss_Memset(tEcallNum.abReCfgNum, 0, Z_DEV_MAX_ECALL_NUM);

+            }

+        }

+        else

+        {

+            if(iDecBcdRet <= 0)

+            {

+                return zAt_GetParseRslt2(&prsCmd2Msg,ZAT2_CMD_PARAM_ERR);

+            }

+

+            if(bType == Z_ATI_TEST_NUM)

+            {

+                tEcallNum.bTestNumLen = (BYTE)iDecBcdRet;

+                zOss_Memcpy(tEcallNum.abTestNum, abCallNum, Z_DEV_MAX_ECALL_NUM);

+            }

+            else

+            {

+                tEcallNum.bReCfgNumLen = (BYTE)iDecBcdRet;

+                zOss_Memcpy(tEcallNum.abReCfgNum, abCallNum, Z_DEV_MAX_ECALL_NUM);

+            }

+        }

+    }

+    else//ɾ³ý

+    {

+        if(bMode != 0)

+        {

+            return zAt_GetParseRslt2(&prsCmd2Msg,ZAT2_CMD_PARAM_ERR);

+        }

+        zOss_Memset(&tEcallNum, 0, sizeof(T_zAti_NV_EcallNum));

+    }

+

+    if(strlen((const char *)pDecCmdStr) != 0)

+    {

+        return zAt_GetParseRslt2(&prsCmd2Msg,ZAT2_CMD_PARAM_ERR);

+    }

+

+    if(0 != memcmp(&tTmpEcallNum, &tEcallNum, sizeof(T_zAti_NV_EcallNum)))

+    {

+        zDev_NV_AtiWriteItem(Z_ATI_NV_EcallNum, (BYTE*)&tEcallNum);

+    }

+

+    zOss_Memcpy(g_zAt_EncBuf, g_zAt_OK, strlen((const char *)g_zAt_OK));

+    return zAt_GetParseRslt(ZAT2_CMD_REPLY_DIRECT);

+}

+

+T_ZAt_ParseCmd2MsgRslt zAt_PsDecEcallNumQryReq(T_ZAt_DecCmdInfo * pDecCmdInfo)

+{

+    BYTE bExist = Z_INVALID;

+    CHAR * pStrWalk = g_zAt_EncBuf;

+    T_zAti_NV_EcallNum tEcallNum = {0};

+

+    zDev_NV_AtiReadItem(Z_ATI_NV_EcallNum, (PBYTE)&tEcallNum);

+

+    if(tEcallNum.bTestNumLen > 0)

+    {

+        pStrWalk += sprintf((char *)pStrWalk, "%s+ZECALLNUM: 0,", g_zAt_CRLF);

+

+        if(tEcallNum.bTestNumLen > Z_DEV_MAX_ECALL_NUM)

+        {

+            tEcallNum.bTestNumLen = Z_DEV_MAX_ECALL_NUM;

+        }

+        zAt_EncBcd2NumStrByCscsType(pStrWalk, (UINT8 *)tEcallNum.abTestNum, 

+                tEcallNum.bTestNumLen, ZAT2_CSCS_GSM);

+            pStrWalk += strlen((const char *)pStrWalk);

+

+        bExist = Z_VALID;

+    }

+

+    

+    if(tEcallNum.bReCfgNumLen > 0)

+    {

+        pStrWalk += sprintf((char *)pStrWalk, "%s+ZECALLNUM: 1,", g_zAt_CRLF);

+

+        if(tEcallNum.bReCfgNumLen > Z_DEV_MAX_ECALL_NUM)

+        {

+            tEcallNum.bReCfgNumLen = Z_DEV_MAX_ECALL_NUM;

+        }

+        zAt_EncBcd2NumStrByCscsType(pStrWalk, (UINT8 *)tEcallNum.abReCfgNum, 

+                tEcallNum.bReCfgNumLen, ZAT2_CSCS_GSM);

+            pStrWalk += strlen((const char *)pStrWalk);

+

+        bExist = Z_VALID;

+    }

+

+    if(bExist == Z_VALID)

+    {

+        pStrWalk += sprintf((char *)pStrWalk, "%s", g_zAt_CRLF);

+    }

+

+    sprintf((char *)pStrWalk, "%s", g_zAt_OK);

+

+    return zAt_GetParseRslt(ZAT2_CMD_REPLY_DIRECT);

+}

 #endif

 /*+Cr */

 T_ZAt_ParseCmd2MsgRslt zAt_PsDecCcCrReq(T_ZAt_DecCmdInfo * pDecCmdInfo)

@@ -4836,6 +5058,11 @@
     T_ZAt_ParseCmd2MsgRslt      prsCmd2Msg = {0};

     BYTE bNum = 0;

     BYTE i = 0;

+    SINT16 iDecBcdRet = -1;

+    BOOL bIsPlusStr = FALSE;

+    SINT16 iSubLen = -1;

+    BYTE bNumTypeFg = Z_INVALID;

+

     zAt_PsDecParamInit(&prsCmd2Msg, sizeof(T_zMmiaCc_State_Req));

     /* +ZCCSTATE=[<chnl_id>,<callid>,<dir>,<state>,<mode>,<mpty>, [<number>], [<type>],[<alpha>],[<priority>]

                                  [<chnl_id>,<callid>,<dir>,<state>,<mode>,<mpty>, [<number>], [<type>],[<alpha>],[<priority>]]]*/

@@ -4874,12 +5101,50 @@
             break;

         }

 

-        /* ,[<number>],[<type>],[<alpha>],[ priority] */

-        if(!zAt_DecPbNumType( &pDecCmdStr, Z_MAX_CALLNUM_LEN,  &CcStateReq.tStateInfo[bNum].tNum, &CcStateReq.tStateInfo[bNum].bNumFg))

+        if ((iSubLen = zAt_GetNextParamStr(strSubBuf, ZAT2_PARAM_STRING, &pDecCmdStr)) == -1)

         {

             break;

         }

 

+        bIsPlusStr = FALSE;

+        bNumTypeFg = Z_INVALID;

+        CcStateReq.tStateInfo[bNum].bNumFg = Z_INVALID;

+        CcStateReq.tStateInfo[bNum].bNameFg = Z_INVALID;

+        CcStateReq.tStateInfo[bNum].bNameLen = 0;

+        zOss_Memset(&CcStateReq.tStateInfo[bNum].tNum, 0, sizeof(T_z_CallNum));

+        zOss_Memset(CcStateReq.tStateInfo[bNum].abName, 0, Z_CC_STATE_NAME_MAX_LEN);

+

+        if(iSubLen > 0)

+        {

+            iDecBcdRet = zAt_DecCallNum2Bcd((UINT8 *)CcStateReq.tStateInfo[bNum].tNum.abNum, &bIsPlusStr, strSubBuf,  (UINT16)iSubLen, Z_MAX_CALLNUM_LEN);

+            if (iDecBcdRet == -1)

+            {

+                bIsPlusStr = FALSE;

+                CcStateReq.tStateInfo[bNum].bNameFg = Z_APMMIA_VALID;

+                CcStateReq.tStateInfo[bNum].bNameLen = (iSubLen > Z_CC_STATE_NAME_MAX_LEN)? Z_CC_STATE_NAME_MAX_LEN : iSubLen;

+                zOss_Memcpy(CcStateReq.tStateInfo[bNum].abName, strSubBuf, CcStateReq.tStateInfo[bNum].bNameLen);

+            }

+            else

+            {

+                CcStateReq.tStateInfo[bNum].tNum.bNumLen = (BYTE)iDecBcdRet;

+                CcStateReq.tStateInfo[bNum].bNumFg = Z_APMMIA_VALID;

+            }

+        }

+

+        /*[,<type>]*/

+        if(!zAt_PsDecNextParamDecimalNumByte(&prsCmd2Msg, strSubBuf, &pDecCmdStr, &CcStateReq.tStateInfo[bNum].tNum.bNumType, &bNumTypeFg)

+            || (bNumTypeFg && !zAt_DecideNumTypeValid(CcStateReq.tStateInfo[bNum].tNum.bNumType)))

+        {

+            break;

+        }

+

+        if (!bNumTypeFg)

+        {

+            /* default <type>, 145 when dialling string includes "+", otherwise 129 */

+            CcStateReq.tStateInfo[bNum].tNum.bNumType = (bIsPlusStr? Z_APMMIA_TOA_PLUS : Z_APMMIA_TOA_NOPLUS);

+        }

+

+        /*,[<alpha>],[ priority] */

         if(zAt_GetNextParamStr(strSubBuf, ZAT2_PARAM_STRING, &pDecCmdStr) < 0)

         {

             break;

@@ -12718,7 +12983,12 @@
     zAt_PsDecParamInit(&prsCmd2Msg, sizeof(T_zMmiaAs_CellInfo_Qry_Req));

 

     /* +ZEMSCIQ=<qryindex> */

-    if(!zAt_PsDecNextParamDecimalNumByteNeed( &prsCmd2Msg, strSubBuf, &pDecCmdStr, &bIndex, NULL) || (bIndex != 1))

+    if(!zAt_PsDecNextParamDecimalNumByteNeed( &prsCmd2Msg, strSubBuf, &pDecCmdStr, &bIndex, NULL) || (bIndex > 1))

+    {

+        return zAt_GetParseRslt2(&prsCmd2Msg,ZAT2_CMD_PARAM_ERR);

+    }

+

+    if (strlen((const char *)pDecCmdStr) != 0)

     {

         return zAt_GetParseRslt2(&prsCmd2Msg,ZAT2_CMD_PARAM_ERR);

     }

@@ -12732,7 +13002,7 @@
     }

     g_zAti_atDataEx[g_zAti_CurInstance].bZemsciqIndex = bIndex;

 

-    return zAt_PsDecFinishParse(&prsCmd2Msg, pDecCmdStr, &tCellInfoQryReq, sizeof(T_zMmiaAs_CellInfo_Qry_Req), TRUE); 

+    return zAt_PsDecFinishParse(&prsCmd2Msg, pDecCmdStr, &tCellInfoQryReq, sizeof(T_zMmiaAs_CellInfo_Qry_Req), FALSE); 

 }

 #if defined (PS_RAT_GSM) || defined (PS_RAT_TDD) || defined (PS_RAT_FDD)

 /**************************************************************************

@@ -19324,6 +19594,18 @@
 

     return (UINT16)strlen((const char *)pEncCmdInfo->pStrCmd);

 }

+

+UINT16 zAt_EncCcZecallStateInd(T_ZAt_EncCmdInfo * pEncCmdInfo)

+{

+    CHAR * pStrWalk = pEncCmdInfo->pStrCmd;

+    T_zMmiaCc_ECallWorkStateInd *pZEcallStateInd = (T_zMmiaCc_ECallWorkStateInd*) pEncCmdInfo->pMsgBody;

+

+    /*^ZECALLSTATE*/

+    sprintf((char *)pStrWalk, "%s^ZECALLSTATE: %d,%d,%d%s", g_zAt_CRLF, pZEcallStateInd->bCallId, 

+                          pZEcallStateInd->bDir, pZEcallStateInd->bECallState, g_zAt_CRLF);

+

+    return (UINT16)strlen((const char *)pEncCmdInfo->pStrCmd);

+}

 #endif

 /**************************************************************************

 * º¯ÊýÃû³Æ£º zAt_PsEncCcCringInd

diff --git a/cp/ps/modem/ps/src/nas/ati/src/zat_fnc_sup.c b/cp/ps/modem/ps/src/nas/ati/src/zat_fnc_sup.c
index b8cdf68..9abf081 100755
--- a/cp/ps/modem/ps/src/nas/ati/src/zat_fnc_sup.c
+++ b/cp/ps/modem/ps/src/nas/ati/src/zat_fnc_sup.c
@@ -5760,6 +5760,134 @@
 

     return (UINT16)strlen((const char *)pEncCmdInfo->pStrCmd);

 }

+

+UINT16 zAt_EncZemsciqByIndex0(T_ZAt_EncCmdInfo * pEncCmdInfo)

+{

+    BYTE i = 0;

+    BYTE b4GNum = 0;

+    BYTE b3GNum = 0;

+    BYTE bRelNum = 0;

+    WORD wUarfcn = 0;

+    WORD wPci = 0;

+    BYTE bRscp = 0;

+    CHAR * pStrWalk = pEncCmdInfo->pStrCmd;

+    T_zEM_EmInfo_Ind  *ptScellCnf = (T_zEM_EmInfo_Ind*)pEncCmdInfo->pMsgBody;

+

+    /*+ZEMSCIQ: 0,<4GCellNum>[,<Pci>,<Earfcn>,<RSRP>]s,<3GCellNum>[,<Psc>,<arfcn>,<Rscp>]s*/

+    pStrWalk += sprintf((char *)pStrWalk, "%s+ZEMSCIQ: 0", g_zAt_CRLF);

+

+    if(Z_LTE_ACT == ptScellCnf->bRatType)

+    {

+        T_zEm_Lte_EmInfo_Ind *ptLteInfo = &ptScellCnf->uEmInfo.tLteEmInfo;

+        T_zEm_Lte_NCellInfo *ptNcellInfo = &ptScellCnf->uEmInfo.tLteEmInfo.tMeasInfo.tNCellInfo;

+

+        b4GNum = ptNcellInfo->bIntraCellNum + ptNcellInfo->bInterCellNum + 1;

+        b4GNum = (b4GNum > 7)? 7 : b4GNum;

+

+        pStrWalk += sprintf((char *)pStrWalk, ",%d", b4GNum);

+

+        pStrWalk += sprintf((char *)pStrWalk, ",%d,%lu,%d", ptLteInfo->tScellPara.tScellInfo.wPci, ptLteInfo->tScellPara.tScellInfo.dwEarfcn, 

+                                ptLteInfo->tMeasInfo.bScellRsrp);

+        bRelNum++;

+

+        for(i = 0; i < ptNcellInfo->bIntraCellNum && bRelNum < b4GNum; i++, bRelNum++)

+        {

+            pStrWalk += sprintf((char *)pStrWalk, ",%d,%lu,%d", ptNcellInfo->tIntraCell[i].wPci, ptNcellInfo->tIntraCell[i].dwEarfcn, ptNcellInfo->tIntraCell[i].bRsrp);

+        }

+

+        for(i = 0; i < ptNcellInfo->bInterCellNum && bRelNum < b4GNum; i++, bRelNum++)

+        {

+            pStrWalk += sprintf((char *)pStrWalk, ",%d,%lu,%d", ptNcellInfo->tInterCell[i].wPci, ptNcellInfo->tInterCell[i].dwEarfcn, ptNcellInfo->tInterCell[i].bRsrp);

+        }

+

+        b3GNum = (ptNcellInfo->bWCellNum > 7)? 7 : ptNcellInfo->bWCellNum;

+

+        pStrWalk += sprintf((char *)pStrWalk, ",%d", b3GNum);

+

+        for(i = 0; i < b3GNum; i++)

+        {

+            pStrWalk += sprintf((char *)pStrWalk, ",%d,%lu,%d", ptNcellInfo->tNWCell[i].wPci, ptNcellInfo->tNWCell[i].wArfcn, ptNcellInfo->tNWCell[i].bRscp);

+        }

+    }

+    else if(Z_W_ACT == ptScellCnf->bRatType)

+    {

+        if(ptScellCnf->uEmInfo.tWEmInfo.bStateInd == 0)

+        {

+            T_zEm_W_DchMeasInfo *ptDch = &ptScellCnf->uEmInfo.tWEmInfo.uWcellMeasInfo.tDchInfo;

+            b4GNum = (ptDch->tNCellInfo.bLteCellNum > 7)? 7 : ptDch->tNCellInfo.bLteCellNum;

+

+            pStrWalk += sprintf((char *)pStrWalk, ",%d", b4GNum);

+

+            for(i = 0; i < b4GNum; i++)

+            {

+                pStrWalk += sprintf((char *)pStrWalk, ",%d,%lu,%d", ptDch->tNCellInfo.atLteCell[i].wPci, ptDch->tNCellInfo.atLteCell[i].dwEarfcn, ptDch->tNCellInfo.atLteCell[i].bRsrp);

+            }

+

+            b3GNum = ptDch->tNCellInfo.bIntraCellNum + ptDch->tNCellInfo.bInterCellNum + ptDch->tNCellInfo.bDetectCellNum + 1;

+            b3GNum = (b3GNum > 7)? 7 : b3GNum;

+

+            pStrWalk += sprintf((char *)pStrWalk, ",%d,%d,%lu,%d", b3GNum, ptDch->tFreqAsVasInfo.tUsedFreqAsInfo.atAsVasCell[0].wPsc, ptDch->tFreqAsVasInfo.tUsedFreqAsInfo.wUarfcn, 

+                             ptDch->tFreqAsVasInfo.tUsedFreqAsInfo.atAsVasCell[0].bRscp);

+            bRelNum++;

+

+            for(i = 0; i < ptDch->tNCellInfo.bIntraCellNum && bRelNum < b3GNum; i++, bRelNum++)

+            {

+                pStrWalk += sprintf((char *)pStrWalk, ",%d,%lu,%d", ptDch->tNCellInfo.atIntraCell[i].wPsc, ptDch->tNCellInfo.atIntraCell[i].wUarfcn, ptDch->tNCellInfo.atIntraCell[i].bRscp);

+            }

+

+            for(i = 0; i < ptDch->tNCellInfo.bInterCellNum && bRelNum < b3GNum; i++, bRelNum++)

+            {

+                pStrWalk += sprintf((char *)pStrWalk, ",%d,%lu,%d", ptDch->tNCellInfo.atInterCell[i].wPsc, ptDch->tNCellInfo.atInterCell[i].wUarfcn, ptDch->tNCellInfo.atInterCell[i].bRscp);

+            }

+

+            for(i = 0; i < ptDch->tNCellInfo.bDetectCellNum && bRelNum < b3GNum; i++, bRelNum++)

+            {

+                pStrWalk += sprintf((char *)pStrWalk, ",%d,%lu,%d", ptDch->tNCellInfo.atDetectCell[i].wPsc, ptDch->tNCellInfo.atDetectCell[i].wUarfcn, ptDch->tNCellInfo.atDetectCell[i].bRscp);

+            }

+        }

+        else

+        {

+            T_zEm_W_NotDchMeasInfo *ptNotDch = &ptScellCnf->uEmInfo.tWEmInfo.uWcellMeasInfo.tNotDchInfo;

+            b4GNum = (ptNotDch->bLteNCellNum > 7)? 7 : ptNotDch->bLteNCellNum;

+

+            pStrWalk += sprintf((char *)pStrWalk, ",%d", b4GNum);

+

+            for(i = 0; i < b4GNum; i++)

+            {

+                pStrWalk += sprintf((char *)pStrWalk, ",%d,%lu,%d", ptNotDch->atLteCellReselInfo[i].tLteCellInfo.wPci, ptNotDch->atLteCellReselInfo[i].tLteCellInfo.dwEarfcn, 

+                                 ptNotDch->atLteCellReselInfo[i].tLteCellInfo.bRsrp);

+            }

+

+            b3GNum = ptNotDch->bFddIntraCellNum + ptNotDch->bFddInterCellNum + 1;

+            b3GNum = (b3GNum > 7)? 7 : b3GNum;

+

+            pStrWalk += sprintf((char *)pStrWalk, ",%d,%d,%lu,%d", b3GNum, ptNotDch->tFddSCellReselInfo.tScellInfo.wPsc, ptNotDch->tFddSCellReselInfo.tScellInfo.wUarfcn, 

+                                 ptNotDch->tFddSCellReselInfo.tScellInfo.bRscp);

+            bRelNum++;

+

+            for(i = 0; i < ptNotDch->bFddIntraCellNum && bRelNum < b3GNum; i++, bRelNum++)

+            {

+                pStrWalk += sprintf((char *)pStrWalk, ",%d,%lu,%d", ptNotDch->atFddIntraCellInfo[i].tFddCellInfo.wPsc, ptNotDch->atFddIntraCellInfo[i].tFddCellInfo.wUarfcn, 

+                                 ptNotDch->atFddIntraCellInfo[i].tFddCellInfo.bRscp);

+            }

+

+            for(i = 0; i < ptNotDch->bFddInterCellNum && bRelNum < b3GNum; i++, bRelNum++)

+            {

+                pStrWalk += sprintf((char *)pStrWalk, ",%d,%lu,%d", ptNotDch->atFddInterCellInfo[i].tFddCellInfo.wPsc, ptNotDch->atFddInterCellInfo[i].tFddCellInfo.wUarfcn, 

+                                 ptNotDch->atFddInterCellInfo[i].tFddCellInfo.bRscp);

+            }

+        }

+    }

+    else

+    {

+        zAti_SendExpt2TraceAgt(ERR_InvalidPara,  TRACE_ERR_LEVEL_NORMAL,"");  

+        return zAt_EncErrorCode(pEncCmdInfo->pStrCmd, pEncCmdInfo->cmdId, ZAT2_CMEE_GETNOINFO_ERR);

+    }

+

+    sprintf((char *)pStrWalk, "%s%s", g_zAt_CRLF, g_zAt_OK);

+    return (UINT16)strlen((const char *)pEncCmdInfo->pStrCmd);

+}

+

 UINT16 zAt_PsEncZemsciqByIndexCnf(T_ZAt_EncCmdInfo * pEncCmdInfo)

 {

     T_zEM_EmInfo_Ind  *ptScellCnf = (T_zEM_EmInfo_Ind*)pEncCmdInfo->pMsgBody;

@@ -5773,6 +5901,10 @@
 

     switch (bZemsciqIndex)

     {

+        case 0:

+        {

+            return zAt_EncZemsciqByIndex0(pEncCmdInfo);

+        }

         case 1:

         {

             return zAt_EncZemsciqByIndex1(pEncCmdInfo);

diff --git a/cp/ps/modem/ps/src/nas/ati/src/zat_var.c b/cp/ps/modem/ps/src/nas/ati/src/zat_var.c
index b3ee326..e52bc2a 100755
--- a/cp/ps/modem/ps/src/nas/ati/src/zat_var.c
+++ b/cp/ps/modem/ps/src/nas/ati/src/zat_var.c
@@ -184,6 +184,7 @@
     {   "+CECN",       ZAT2_CC_CECN,       "+CECN: (0,1)"         },

     {   "+ZNECALLNUM",    ZAT2_CC_ZNECALLNUM,        ""          },

     {   "+ZECALLCAPA",    ZAT2_CC_ZECALLCAPA,      "+ZECALLCAPA: (0-2)"        },

+    {   "+ZECALLNUM",    ZAT2_CC_ZECALLNUM,      ""      },

 #endif

     /********************************* SMSÄ£¿é ***********************************/

     {   "+CGSMS",      ZAT2_SMS_CGSMS,        "+CGSMS: (0-3)"                     },

@@ -910,6 +911,10 @@
     /***************************************+ZECALLCAPA**********************************/

     { ZAT2_CC_ZECALLCAPA,   ZAT2_CO_SET_REQ,    0,    zAt_PsDecEcallCapaSetReq    },

     { ZAT2_CC_ZECALLCAPA,   ZAT2_CO_QUERY_REQ,    0,    zAt_PsDecEcallCapaQryReq    },

+

+    /*********************************+ZECALLNUM*****************************/

+    { ZAT2_CC_ZECALLNUM,   ZAT2_CO_SET_REQ,    0,    zAt_PsDecEcallNumSetReq    },

+    { ZAT2_CC_ZECALLNUM,   ZAT2_CO_QUERY_REQ,    0,    zAt_PsDecEcallNumQryReq    },

 #endif

     /******************************************* +CEER *********************************************/

     { ZAT2_CC_CEER,    ZAT2_CO_SET_REQ,                          0,                                 zAt_PsDecCeerSetReq      },

@@ -2003,6 +2008,9 @@
 

     /*************************************+ZECALL*************************/

     {MMIA_CC_ZECALL_IND_EV,    zAt_EncCcZEcallInd,     ZAT2_CO_IND    },

+

+    /*************************************^ECALLSTATE**********************/

+    {MMIA_CC_ECALL_WORKSTATE_IND_EV,    zAt_EncCcZecallStateInd,     ZAT2_CO_IND    },

 #endif

 #endif

     /*****************************************************************

diff --git a/cp/ps/modem/ps/src/nas/ati/src/zati_com.c b/cp/ps/modem/ps/src/nas/ati/src/zati_com.c
index 075fb4f..72b5b7f 100755
--- a/cp/ps/modem/ps/src/nas/ati/src/zati_com.c
+++ b/cp/ps/modem/ps/src/nas/ati/src/zati_com.c
@@ -1039,6 +1039,7 @@
 #ifdef ECALL_SUPPORT

     case MMIA_CC_CECN_IND_EV:

     case MMIA_CC_ZECALL_IND_EV:

+    case MMIA_CC_ECALL_WORKSTATE_IND_EV:

 #endif

     /* PDP ²¿·Ö  */

     case MMIA_SM_PDP_ACTIVATE_IND_EV:

diff --git a/cp/ps/modem/ps/src/nas/ati/src/zati_distribute_fnc.c b/cp/ps/modem/ps/src/nas/ati/src/zati_distribute_fnc.c
index 2a4cb47..d0b3f6e 100755
--- a/cp/ps/modem/ps/src/nas/ati/src/zati_distribute_fnc.c
+++ b/cp/ps/modem/ps/src/nas/ati/src/zati_distribute_fnc.c
@@ -2507,9 +2507,60 @@
     return Z_APMMIA_NORESULT;

 }

 

+DWORD zAti_EM_NCellInfoQryReq(VOID* pBuff)

+{

+    BYTE bRet = Z_FAIL;

+    BYTE bCurAct = Z_NO_ACT;

+    T_zMmiaAs_CellInfo_Qry_Req* ptCellInfoQryReq = ZOSS_NULL;

+    T_zMmiaAs_CellInfo_Qry_Req *ptQryReq = ZOSS_NULL;

+

+    bCurAct = zAti_GetCurAct_ByIndex(g_zAti_CurInstance);

+

+    ptCellInfoQryReq = (T_zMmiaAs_CellInfo_Qry_Req*)pBuff;

+    ptQryReq = (T_zMmiaAs_CellInfo_Qry_Req*)zAti_GetUB(sizeof(T_zMmiaAs_CellInfo_Qry_Req));

+

+    zOss_Memcpy(ptQryReq, ptCellInfoQryReq, sizeof(T_zMmiaAs_CellInfo_Qry_Req));

+

+    switch (bCurAct)

+    {

+        #ifdef PS_RAT_LTE

+        case Z_LTE_ACT:

+            bRet = zAti_MsgSend(MMIA_AS_QUERY_EM_CELL_INFO_REQ_EV, (PBYTE)ptQryReq, sizeof(T_zMmiaAs_CellInfo_Qry_Req), Z_ATI_TASKID_EUMCR);

+            break;

+        #endif

+        #ifdef PS_RAT_FDD

+        case Z_W_ACT:

+            bRet = zAti_MsgSend(MMIA_AS_QUERY_EM_CELL_INFO_REQ_EV, (PBYTE)ptQryReq, sizeof(T_zMmiaAs_CellInfo_Qry_Req), Z_ATI_TASKID_WMCR);

+            break;

+        #endif

+        default:

+            zAti_RetUB((VOID**)&ptQryReq);

+            zAti_SendExpt2TraceAgt(ERR_InvalidPara,  TRACE_ERR_LEVEL_NORMAL,"");  

+            return ZAT2_CMEE_GETNOINFO_ERR;

+    }

+

+    if(bRet == Z_FAIL)

+    {

+        zAti_SendExpt2TraceAgt(ERR_InvalidPara,  TRACE_ERR_LEVEL_NORMAL,"");                        

+        return Z_APMMIA_OPTNOTALW_ERR;

+    }

+

+    return Z_APMMIA_NORESULT;

+}

+

 DWORD zAti_EM_CellInfoQryReqByIndex(VOID* pBuff)

 {

-    DWORD dwResult = zAti_EM_CellInfoQryReq(pBuff);

+    DWORD dwResult = ZAT2_CMEE_SYNTAX_ERR;

+    BYTE bInsNo = ((g_zAti_CurInstance == Z_ATI_INSNO_1)? Z_ATI_INSNO_1 : Z_ATI_INSNO_2);

+

+    if(g_zAti_atDataEx[bInsNo].bZemsciqIndex == 1)

+    {

+        dwResult = zAti_EM_CellInfoQryReq(pBuff);

+    }

+    else if(g_zAti_atDataEx[bInsNo].bZemsciqIndex == 0)

+    {

+        dwResult = zAti_EM_NCellInfoQryReq(pBuff);

+    }

 

     if (dwResult != Z_APMMIA_NORESULT)

     {

diff --git a/cp/ps/modem/ps/src/nas/ati/src/zati_fnc.c b/cp/ps/modem/ps/src/nas/ati/src/zati_fnc.c
index cb9adba..10bf45f 100755
--- a/cp/ps/modem/ps/src/nas/ati/src/zati_fnc.c
+++ b/cp/ps/modem/ps/src/nas/ati/src/zati_fnc.c
@@ -4889,7 +4889,26 @@
     CHAR *pStrWalk = g_zAt_EncBuf;

     if(pZSetReq->bCommandOp == ZAT2_CO_SET_REQ)

     {

-        zAti_EncOKError((BOOL)(ZOSS_SUCCESS == zOss_AtCfgSet(pZSetReq->cmd, &(pZSetReq->iParam),g_zAti_CurInstance)));

+        BOOL bResult = (BOOL)(ZOSS_SUCCESS == zOss_AtCfgSet(pZSetReq->cmd, &(pZSetReq->iParam),g_zAti_CurInstance));

+        zAti_EncOKError(bResult);

+

+        if(bResult)

+        {

+            if(strcmp((const char *)pZSetReq->cmd,  "FREQ_SCAN") == 0)

+            {

+                if(Z_SUCC != zAti_MsgSend(MMIA_UMM_FREQ_SCAN_REQ_EV, ZOSS_NULL,  0,  Z_ATI_TASKID_UMM))

+                {

+                    zAti_SendExpt2TraceAgt(ERR_InvalidPara,  TRACE_ERR_LEVEL_NORMAL,"");

+                }

+            }

+            else if(strcmp((const char *)pZSetReq->cmd,  "FAST_FREQ_SCAN") == 0)

+            {

+                if(Z_SUCC != zAti_MsgSend(MMIA_UMM_FAST_FREQ_SCAN_REQ_EV, ZOSS_NULL,  0,  Z_ATI_TASKID_UMM))

+                {

+                    zAti_SendExpt2TraceAgt(ERR_InvalidPara,  TRACE_ERR_LEVEL_NORMAL,"");

+                }

+            }

+        }

     }

     else if(pZSetReq->bCommandOp == ZAT2_CO_QUERY_REQ)

     {

diff --git a/cp/ps/plat/src/oss/sup/src/sup_nvm.c b/cp/ps/plat/src/oss/sup/src/sup_nvm.c
index c0283a2..2bcd830 100755
--- a/cp/ps/plat/src/oss/sup/src/sup_nvm.c
+++ b/cp/ps/plat/src/oss/sup/src/sup_nvm.c
@@ -51,6 +51,9 @@
 #include <linux/statfs.h>

 #include <linux/fs.h>

 #include <linux/uaccess.h>

+#ifdef _USE_VEHICLE_DC

+#include "pub_flags.h"

+#endif

 #endif

 

 #ifdef __cplusplus

@@ -268,6 +271,10 @@
 	{// ro_c0cail

 		NvItemID -= OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV;

 		status = Nvram_FsWrite(NVM_FS_ROW_C0_FAC_PATH, NvItemID, NvItemLen, NvItemData);

+#ifdef _USE_VEHICLE_DC

+		extern int flags_set_nvroflag(unsigned int flag);

+		flags_set_nvroflag(NVRO_BACKING_UP);

+#endif

 	}

  

     zOss_PutMutex(gNV_Mutex);