Index: fw/GenSdkLib.bat
===================================================================
--- /YC3121_SDK/fw/GenSdkLib.bat	(revision 633)
+++ /YC3121_SDK/fw/GenSdkLib.bat	(working copy)
@@ -13,6 +13,12 @@
 sdk\yc_msr\libyc_msr.a ^
 output\obj\yc_msr.o
 
+del sdk\yc_msr\libyc_msr_single.a
+C:\gcc-arm-none-eabi-7-2018-q2-update-win32\bin\arm-none-eabi-gcc-ar.exe ^
+ar rv ^
+sdk\yc_msr\libyc_msr_single.a ^
+output\obj\yc_msr_single.o
+
 
 del crypt\libyc_crypt.a
 C:\gcc-arm-none-eabi-7-2018-q2-update-win32\bin\arm-none-eabi-gcc-ar.exe ^
Index: fw/makefile_lib
===================================================================
--- /YC3121_SDK/fw/makefile_lib	(revision 633)
+++ /YC3121_SDK/fw/makefile_lib	(working copy)
@@ -25,6 +25,7 @@
 			crypt/yc_sm3 \
 			crypt/yc_sm4 \
 			sdk/yc_msr/yc_msr \
+			sdk/yc_msr/yc_msr_single \
 			sdk/yc_7816/yc_7816 \
 			sdk/yc_7816/yc_7816_T0 \
 			sdk/yc_7816/yc_7816_T1 \
Index: fw/sdk/libyc_encflash_bulk.a
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: fw/sdk/libyc_qspi.a
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: fw/sdk/yc_encflash_bulk.lib
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: fw/sdk/yc_msr/libyc_msr.a
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: fw/sdk/yc_msr/yc_msr.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_msr/yc_msr.c	(revision 633)
+++ /YC3121_SDK/fw/sdk/yc_msr/yc_msr.c	(working copy)
@@ -2,6 +2,7 @@
 
 
 //#define	MSR_DEBUG
+//#define	MSR_PRINT_RAW_DATA
 #define MAX_TRACK_NUM	3
 
 void ISO7811_Init(void);
@@ -9,7 +10,7 @@
 Boolean MSR_CheckTrackWRDone(uint8_t TrackSel);
 int ISO7811_GetTrackDataNum(uint8_t track_idx);
 int ISO7811_ERRORCheck(uint8_t track_idx);
-void ISO7811_AGC_CONFIG(int track, int en_sec_agc, int settletime, int disable_gac, int fixed_again,int  gain_init, int gain_target);
+void MSR_AGC_CONFIG(int track,  uint32_t gain_fixed);
 uint8_t MSR_Decode(uint8_t * InputBuf,int InPutLen,uint8_t head,uint8_t end,int track,int CodingBits,uint8_t* OutputBuf,int* OutLen);
 
 //raw data buffer near full size
@@ -22,8 +23,8 @@
 static swiping_direction SwipDirectionConfig =SD_BIDIRECTION;  //用户配置刷卡方向
 static swiping_direction SwipDirection =SD_FORWARD_DIRECTION;  //实际刷卡方向
 
-static uint8_t  TrackDataHead[3] = {0x45,0x0B,0x0B};//1,0,0,0,1,0,1   ,0,1,0,1,1     0,1,0,1,1
-static uint8_t  TrackDataEnd[3]  = {0x1F,0x1F,0x1F};//0,0,1,1,1,1,1    1,1,1,1,1      1,1,1,1,1
+static const uint8_t  TrackDataHead[3] = {0x45,0x0B,0x0B};//1,0,0,0,1,0,1   ,0,1,0,1,1     0,1,0,1,1
+static const uint8_t  TrackDataEnd[3]  = {0x1F,0x1F,0x1F};//0,0,1,1,1,1,1    1,1,1,1,1      1,1,1,1,1
 
 #define T1DATABIT 7
 #define T2DATABIT 5
@@ -147,17 +148,23 @@
 
 	if(*direction == SD_FORWARD_DIRECTION)
 	{
-		while (bufindex < InPutLen){
+		while (bufindex < InPutLen)
+		{
 			TempHead = get_one_char(InputBuf, bufindex, bitindex, CodingBits, SD_FORWARD_DIRECTION);
 			HeadIndex = (((bufindex << 8) & 0xffffff00) | (bitindex & 0xff));
 			if (TempHead == head) 
 			{
+        #if 0			
 				count = 0;
 				while (count < CodingBits) { indexadd(bufindex, bitindex);   count++; }
 				count = 0;
 				tempchar = get_one_char(InputBuf, bufindex, bitindex, CodingBits, SD_FORWARD_DIRECTION);
-				if (tempchar != end) { return HeadIndex; }
-				else { break; }
+				if (tempchar != end)
+					 { return HeadIndex; }
+				      else { break; }
+				#else  
+				return HeadIndex;
+				#endif
 			}
 			else 
 			{ 
@@ -170,7 +177,8 @@
 	*direction = SD_REVERSE_DIRECTION;
 	bufindex = InPutLen - 1;
 	bitindex = 4;
-	while (bufindex >= 0) {
+	while (bufindex >= 0)
+	{
 		TempHead = get_one_char(InputBuf, bufindex, bitindex, CodingBits, SD_REVERSE_DIRECTION);
 		HeadIndex = (((bufindex << 8) & 0xffffff00) | (bitindex & 0xff));
 		if (TempHead == head) { return HeadIndex; }
@@ -238,7 +246,7 @@
 		CodingBits: one data size
 		direction: swipcard direction
 		track: the track you select ,it will equal to TRACK_SELECT_1,TRACK_SELECT_2 or TRACK_SELECT_3
-		OutputBuf��decoding data
+		OutputBuf:decoding data
 		Outlen: decoding data length 
 
 * @retval 
@@ -257,7 +265,25 @@
 	{
 		return TRACK_NO_DATA;          
 	}
-	int TempDirection=SD_FORWARD_DIRECTION, HeadIndex=0;//默认按照正向解码
+	#ifdef MSR_PRINT_RAW_DATA
+	for(int i=0;i<MAX_TRACK_NUM;i++)
+	{
+		if(track==(1<<i))
+		{
+			MyPrintf("track%d raw data[%d]:\n",i+1,InPutLen);
+		}
+	}
+	for(int i=0;i<InPutLen;i++)
+	{
+		MyPrintf("[%03d]",i);
+		for(int j=0;j<5;j++)
+		{
+			MyPrintf("%d",(InputBuf[i]>>j)&1);
+		}
+		MyPrintf("\n");
+	}
+	#endif
+	int TempDirection=SD_FORWARD_DIRECTION, HeadIndex=0;//默认按照正向解码，
 	int bufindex = 0;
 	int bitindex = 0;
 	uint8_t tempdata = 0;
@@ -299,9 +325,19 @@
 					}
 					getbinarynum++;
 					indexadd(bufindex,bitindex);	//#define indexadd(a,b) ((b)<4)?((b)++):((a)++, (b)=0)bufindex是当前检索的字节数，bitindex是在当前字节的有效位
+					if(bufindex>=InPutLen)
+					{
+						#ifdef MSR_DEBUG
+						MyPrintf("Forward direction len error; bufindex:%d  bitindex %d data count:%d\n",bufindex,bitindex,(*OutLen));
+						#endif
+						MSR_ClearBuf(OutputBuf,MAX_TRACK_DATA_SIZE);
+						*OutLen=0;
+						rtnvalue =  LENGTH_ERR;
+						break;
+					}
 			}
 
-			if(!MSR_OddEvenCheck(tempdata,CodingBits))                   //奇校验，如果错误则进入执行
+			if(!MSR_OddEvenCheck(tempdata,CodingBits))     //奇校验，如果错误则进入执行
 			{
 				#ifdef MSR_DEBUG
 				MyPrintf("Forward direction Odd Even Check error bufindex:%d  bitindex %d data:%02X\n",bufindex,bitindex,tempdata);
@@ -310,7 +346,7 @@
 				rtnvalue = PARITY_ERR;
 				break;
 			}
-			OutputBuf[(*OutLen)++] = tempdata;     //奇校验通过
+			OutputBuf[(*OutLen)++] = tempdata;    //奇校验通过
 
 			if(*(OutLen) >MAX_TRACK_DATA_SIZE)
 			{
@@ -342,7 +378,7 @@
 					if(bufindex>=InPutLen)
 					{
 						#ifdef MSR_DEBUG
-						MyPrintf("Forward direction LENGTH_ERR\n");
+						MyPrintf("Forward direction len ERROR; bufindex:%d  bitindex %d data count:%d\n",bufindex,bitindex,(*OutLen));
 						#endif
 						MSR_ClearBuf(OutputBuf,MAX_TRACK_DATA_SIZE);
 						*OutLen=0;
@@ -391,13 +427,12 @@
 	
 	if(HeadIndex == -1)
 	{
-		//SwipDirection = SD_FORWARD_DIRECTION;
 		*OutLen = 0;
 		return PARITY_ERR;
 	}
 		
 	bufindex = HeadIndex>>8;
-	bitindex =  HeadIndex&0x0f;
+	bitindex =  HeadIndex&0xff;
 	
 	#ifdef MSR_DEBUG  
 	MyPrintf("Back direction ::Head bufindex:%d bitindex:%d  direction:%d\n", bufindex, bitindex, TempDirection);
@@ -414,6 +449,15 @@
 			}
 			getbinarynum++;
 			indexdec(bufindex, bitindex);	
+			if(bufindex<0)
+			{
+				#if defined (MSR_DEBUG) 
+				MyPrintf("Back direction length error; bufindex:%d  bitindex %d data count:%d\n",bufindex,bitindex,(*OutLen));
+				#endif
+				MSR_ClearBuf(OutputBuf, MAX_TRACK_DATA_SIZE);
+				*OutLen=0;
+				return LENGTH_ERR;
+			}
 		}
 		
 		if(!MSR_OddEvenCheck(tempdata, CodingBits))
@@ -437,7 +481,7 @@
 		}
 		else
 		{
-			if(OutputBuf[(*OutLen)-1] == end)//找到停止位
+			if(OutputBuf[(*OutLen)-1] == end)//判断是否遇到停止位
 			{
 				tempdata = 0;
 				getbinarynum = 0;
@@ -452,10 +496,10 @@
 				}
 				OutputBuf[*OutLen] = tempdata;
 				
-				if(bufindex<=0)
+				if(bufindex<0)
 				{
 					#if defined (MSR_DEBUG) 
-					MyPrintf("Back direction length error \n");
+					MyPrintf("Back direction length ERROR; bufindex:%d  bitindex %d data count:%d\n",bufindex,bitindex,(*OutLen));
 					#endif
 					MSR_ClearBuf(OutputBuf, MAX_TRACK_DATA_SIZE);
 					*OutLen=0;
@@ -595,12 +639,11 @@
 }
 
 
-int old_track_data_num[MAX_TRACK_NUM]={0};
-int new_track_data_num[MAX_TRACK_NUM]={0};
-#ifdef DECODE_T23
-uint8_t MSR_DetectSwipingCard(void)
+#define VALID_CHARNUM 10
+#define TRAKDOWN_TIMEOUT 300
+uint8_t  MSR_DetectSwipingCard(void)
 {
-	volatile unsigned int timecount = WAITTIME;
+	int waitedtime = 0; 
 	
 	if(MSR_RawBufNearFull())
 	{
@@ -608,155 +651,58 @@
 		MSR_ENABLE(ENABLE);
 		return DETECT_NO_SWIPING_CARD;
 	}
-	if(MSR_CheckTrackWRDone(TRACK_SELECT_2)||MSR_CheckTrackWRDone(TRACK_SELECT_3))
-	{
-		#ifdef MSR_DEBUG
-		MyPrintf("ISO7811_STATUS=%08x\n",ISO7811_STATUS);
-		MyPrintf("ISO7811_CHAR_NUM=%08x\n",ISO7811_CHAR_NUM);
-		MyPrintf("ISO7811_INTERFER_CHAR_NUM=%08x\n",ISO7811_INTERFER_CHAR_NUM);
-		MyPrintf("ISO7811_DC_EST=%08x\n",ISO7811_DC_EST);
-		MyPrintf("ISO7811_INTF_PEAK=%08x\n",ISO7811_INTF_PEAK);
-		MyPrintf("ISO7811_AGC_PEAK_VAL=%08x\n",ISO7811_AGC_PEAK_VAL);
-		#endif
-		while(timecount--)
-		{
-				if(MSR_RawBufNearFull())
-				{
-						MSR_ENABLE(DISABLE);
-						MSR_ENABLE(ENABLE);
-						return DETECT_NO_SWIPING_CARD;
-				}
-				for(int i=0;i<MAX_TRACK_NUM;i++)
-				{
-					new_track_data_num[i]=ISO7811_GetTrackDataNum(1<<i);
-				}
-				for(int i=0;i<MAX_TRACK_NUM;i++)
-				{
-					if(old_track_data_num[i]!=new_track_data_num[i])
-					{
-						old_track_data_num[i]=new_track_data_num[i];
-						delay_ms(150);
-						continue;
-					}
-				}
-				#ifdef MSR_DEBUG
-				for(int i=0;i<MAX_TRACK_NUM;i++)
-				{
-					new_track_data_num[i]=ISO7811_GetTrackDataNum(1<<i);
-					MyPrintf("track%d_data_num=%d\n",i+1,new_track_data_num[i]);
-				}
-				#endif
-				return DETECT_SWIPING_CARD;
-		}
-		return DETECT_SWIPING_CARD;
-	}
-	else
+	
+	
+	if(MSR_CheckTrackWRDone(TRACK_SELECT_1) ||MSR_CheckTrackWRDone(TRACK_SELECT_2)||MSR_CheckTrackWRDone(TRACK_SELECT_3))
 	{
-		for(int i=0;i<MAX_TRACK_NUM;i++)
-		{
-			old_track_data_num[i]=ISO7811_GetTrackDataNum(1<<i);
-		}
-		for(int i=0;i<MAX_TRACK_NUM;i++)
+		if(ISO7811_GetTrackDataNum( TRACK_SELECT_1)> VALID_CHARNUM && (!(MSR_CheckTrackWRDone(TRACK_SELECT_1))))
 		{
-			if(0!=old_track_data_num[i])
+			#ifdef MSR_DEBUG
+			MyPrintf("track1 have data[%d],need wait\n",ISO7811_GetTrackDataNum( TRACK_SELECT_1));
+			#endif
+			while((waitedtime < TRAKDOWN_TIMEOUT)& ( !(MSR_CheckTrackWRDone(TRACK_SELECT_1)) ) )
 			{
-				delay_ms(150);
-				new_track_data_num[i]=ISO7811_GetTrackDataNum(1<<i);
-				if(old_track_data_num[i]!=new_track_data_num[i])
-				{
-					return DETECT_NO_SWIPING_CARD;//��ˢ��
-				}
-				else
-				{
-					//û��done��char_num��Ϊ0��һ��ʱ��Ҳ���仯������Ϊ���ҵ�����
-					MSR_ENABLE(DISABLE);
-					MSR_ENABLE(ENABLE);
-					return DETECT_NO_SWIPING_CARD;
-				}
+				((void(*)(int))(FUNC_DELAY_MS_ADDR))(1);
+				waitedtime++;
 			}
+			#ifdef MSR_DEBUG
+			MyPrintf("track1 waitedtime=%d done=%d data=%d\n",waitedtime,MSR_CheckTrackWRDone(TRACK_SELECT_1),ISO7811_GetTrackDataNum( TRACK_SELECT_1));
+			#endif
 		}
-	}
-	return DETECT_NO_SWIPING_CARD;
-}
-#else 
-uint8_t MSR_DetectSwipingCard(void)
-{
-	volatile unsigned int timecount = WAITTIME;
-	
-	if(MSR_RawBufNearFull())
-	{
-
-		MSR_ENABLE(DISABLE);
-		MSR_ENABLE(ENABLE);
-		return DETECT_NO_SWIPING_CARD;
-	}
 		
-	if(MSR_CheckTrackWRDone(TRACK_SELECT_1) ||MSR_CheckTrackWRDone(TRACK_SELECT_2)||MSR_CheckTrackWRDone(TRACK_SELECT_3))
-	{
-
-		while(timecount--)
+		if(ISO7811_GetTrackDataNum( TRACK_SELECT_2)> VALID_CHARNUM && (!(MSR_CheckTrackWRDone(TRACK_SELECT_2))))
 		{
-				if(MSR_RawBufNearFull())
-				{
-						MSR_ENABLE(DISABLE);
-						MSR_ENABLE(ENABLE);
-						return DETECT_NO_SWIPING_CARD;
-				}	
-				
-				for(int i=0;i<MAX_TRACK_NUM;i++)
-				{
-					new_track_data_num[i]=ISO7811_GetTrackDataNum(1<<i);
-				}
-				for(int i=0;i<MAX_TRACK_NUM;i++)
-				{
-					if(old_track_data_num[i]!=new_track_data_num[i])
-					{
-						old_track_data_num[i]=new_track_data_num[i];
-						delay_ms(150);
-						continue;
-					}
-				}
-				#ifdef MSR_DEBUG
-				for(int i=0;i<MAX_TRACK_NUM;i++)
-				{
-					new_track_data_num[i]=ISO7811_GetTrackDataNum(1<<i);
-					MyPrintf("track%d_data_num=%d\n",i+1,new_track_data_num[i]);
-				}
-				#endif
-				return DETECT_SWIPING_CARD;
-		}
-		return DETECT_SWIPING_CARD;
-	}
-	else
-	{
-		for(int i=0;i<MAX_TRACK_NUM;i++)
-		{
-			old_track_data_num[i]=ISO7811_GetTrackDataNum(1<<i);
+			#ifdef MSR_DEBUG
+			MyPrintf("track2 have data[%d],need wait\n",ISO7811_GetTrackDataNum( TRACK_SELECT_2));
+			#endif
+			while((waitedtime < TRAKDOWN_TIMEOUT)& ( !(MSR_CheckTrackWRDone(TRACK_SELECT_2)) ) )
+			{
+				((void(*)(int))(FUNC_DELAY_MS_ADDR))(1);
+				waitedtime++;
+			}
+			#ifdef MSR_DEBUG
+			MyPrintf("track2 waitedtime=%d done=%d data=%d\n",waitedtime,MSR_CheckTrackWRDone(TRACK_SELECT_2),ISO7811_GetTrackDataNum( TRACK_SELECT_2));
+			#endif
 		}
-		for(int i=0;i<MAX_TRACK_NUM;i++)
+
+		if(ISO7811_GetTrackDataNum( TRACK_SELECT_3)> VALID_CHARNUM && (!(MSR_CheckTrackWRDone(TRACK_SELECT_3))))
 		{
-			if(0!=old_track_data_num[i])
+			#ifdef MSR_DEBUG
+			MyPrintf("track3 have data[%d],need wait\n",ISO7811_GetTrackDataNum( TRACK_SELECT_3));
+			#endif
+			while((waitedtime < TRAKDOWN_TIMEOUT)& ( !(MSR_CheckTrackWRDone(TRACK_SELECT_3)) ) )
 			{
-				delay_ms(150);
-				new_track_data_num[i]=ISO7811_GetTrackDataNum(1<<i);
-				if(old_track_data_num[i]!=new_track_data_num[i])
-				{
-					return DETECT_NO_SWIPING_CARD;//��ˢ��
-				}
-				else
-				{
-					//û��done��char_num��Ϊ0��һ��ʱ��Ҳ���仯������Ϊ���ҵ�����
-					MSR_ENABLE(DISABLE);
-					MSR_ENABLE(ENABLE);
-					return DETECT_NO_SWIPING_CARD;
-				}
+				((void(*)(int))(FUNC_DELAY_MS_ADDR))(1);
+				waitedtime++;
 			}
+			#ifdef MSR_DEBUG
+			MyPrintf("track3 waitedtime=%d done=%d data=%d\n",waitedtime,MSR_CheckTrackWRDone(TRACK_SELECT_3),ISO7811_GetTrackDataNum( TRACK_SELECT_3));
+			#endif
 		}
+
+		return DETECT_SWIPING_CARD;
 	}
-	return DETECT_NO_SWIPING_CARD;
 }
-#endif
-
 
 swiping_direction MSR_GetSwipeDir(void)
 {
@@ -826,13 +772,11 @@
 {
 	 if( NewState)
 	 {
-		  ISO7811_CTRL&=~(ENABLE);
-		  delay(100);
-		  ISO7811_CTRL |= ENABLE;
+		((void(*)(int))(FUNC_DELAY_MS_ADDR))(10);//清状态位需要时间
+		ISO7811_CTRL |= ENABLE;
 	  }
 	  else
 	  {
-			 delay(100);
 		   ISO7811_CTRL&=~(ENABLE);
 	  }
 }
@@ -898,26 +842,109 @@
 	ISO7811_T1_AGC_CFG |= 1<<ISO7811_AGC_CFG_DISAB_MASK;
 	ISO7811_T2_AGC_CFG |= 1<<ISO7811_AGC_CFG_DISAB_MASK;
 	ISO7811_T3_AGC_CFG |= 1<<ISO7811_AGC_CFG_DISAB_MASK;
-delay_ms(300);
+//DL配置
+//	ISO7811_T2_PEAK_VALUE_CFG = 0x9010;
+//	ISO7811_T2_AGC_CFG = 0x24714b22;
+	
+	delay_ms(300);//处理上电第一次刷卡失败问题(配置完模拟寄存器需要等待稳定再使能总开关)
 #ifdef MSR_FPGA
 	ISO7811_CTRL &= ~(0x1FF <<20);
 #endif
 	MSR_ENABLE(ENABLE);
 } 
 
-void ISO7811_AGC_CONFIG(int track, int en_sec_agc, int settletime, int disable_gac, int fixed_again,int  gain_init, int gain_target)
+
+void MSR_AGC_CONFIG(int track, uint32_t gain_fixed)
 {
+	int temp = 0;
 	switch(track)
 	{
 	case TRACK_SELECT_1:
-		ISO7811_T1_AGC_CFG = ((en_sec_agc<<2) |( settletime << 3) |(disable_gac<<11)|(fixed_again<<12)|(gain_init<<18)|(gain_target<<24));
+		temp = ISO7811_T1_AGC_CFG;
+		temp  &= ~(0x3f<<12);
+		temp  |= (1<<11)|(gain_fixed<<12);
+		ISO7811_T1_AGC_CFG = temp;
 	break;
+		
 	case TRACK_SELECT_2:
-		ISO7811_T2_AGC_CFG = ((en_sec_agc<<2) |( settletime << 3) |(disable_gac<<11)|(fixed_again<<12)|(gain_init<<18)|(gain_target<<24));
+		temp = ISO7811_T2_AGC_CFG;
+		temp  &= ~(0x3f<<12);
+		temp  |= (1<<11)|(gain_fixed<<12);
+		ISO7811_T2_AGC_CFG = temp;
 	break;
+
 	case TRACK_SELECT_3:
-		ISO7811_T3_AGC_CFG = ((en_sec_agc<<2) |( settletime << 3) |(disable_gac<<11)|(fixed_again<<12)|(gain_init<<18)|(gain_target<<24));
+		temp = ISO7811_T3_AGC_CFG;
+		temp  &= ~(0x3f<<12);
+		temp  |= (1<<11)|(gain_fixed<<12);
+		ISO7811_T3_AGC_CFG = temp;
 	break;
+
+	default:
+	break;
+	}
+}
+
+
+void ISO7811_PeakWidth_CONFIG(int track, uint32_t thld_init )
+{
+	int temp = 0;
+	switch(track)
+	{
+	case TRACK_SELECT_1:
+		temp = 	ISO7811_T1_PEAK_WIDTH_CFG;
+		temp &=~(0x7fff<<0);
+		temp |=(thld_init<<0);
+		ISO7811_T1_PEAK_WIDTH_CFG = temp;
+	break;
+		
+	case TRACK_SELECT_2:
+		temp = 	ISO7811_T2_PEAK_WIDTH_CFG;
+		temp &=~(0x7fff<<0);
+		temp |=(thld_init<<0);
+		ISO7811_T2_PEAK_WIDTH_CFG = temp;
+
+	break;
+
+	case TRACK_SELECT_3:
+		temp = 	ISO7811_T3_PEAK_WIDTH_CFG;
+		temp &=~(0x7fff<<0);
+		temp |=(thld_init<<0);
+		ISO7811_T3_PEAK_WIDTH_CFG = temp;
+	break;
+
+	default:
+	break;
+	}
+}
+
+void ISO7811_PulseWidth_CONFIG(int track, uint32_t alpha)
+{
+	int temp = 0;
+	switch(track)
+	{
+	case TRACK_SELECT_1:
+		temp = 	ISO7811_T1_PULSE_WIDTH_CFG;
+		temp &=~(0x0f<<17);
+		temp |=((alpha&0x0f)<<17);
+		ISO7811_T1_PULSE_WIDTH_CFG = temp;
+	break;
+		
+	case TRACK_SELECT_2:
+		temp = 	ISO7811_T2_PULSE_WIDTH_CFG;
+		temp &=~(0x0f<<17);
+		temp |=((alpha&0x0f)<<17);
+		ISO7811_T2_PULSE_WIDTH_CFG = temp;
+
+	break;
+
+	case TRACK_SELECT_3:
+		temp = 	ISO7811_T3_PULSE_WIDTH_CFG;
+		temp &=~(0x0f<<17);
+		temp |=((alpha&0x0f)<<17);
+		ISO7811_T3_PULSE_WIDTH_CFG = temp;
+	break;
+
 	default:
 	break;
 	}
@@ -1009,7 +1036,7 @@
 
 /**
  * @brief	:Channel select signal for 3 tracks 
- * @param ��T1ChannelSel: channel seletct signal for track 1,the param must equal to signal_t1 in this software version.
+ * @param :T1ChannelSel: channel seletct signal for track 1,the param must equal to signal_t1 in this software version.
 						T2ChannelSel: channel seletct signal for track 2,the param can  equal to signal_t2,signal_t3
 						T3ChannelSel: channel seletct signal for track 3,the param can  equal to signal_t2,signal_t3
 						//parm select from enum signal_fortrack.
Index: fw/sdk/yc_msr/yc_msr.lib
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: fw/sdk/yc_msr/yc_msr_single.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_msr/yc_msr_single.c	(revision 633)
+++ /YC3121_SDK/fw/sdk/yc_msr/yc_msr_single.c	(working copy)
@@ -1,10 +1,8 @@
 #include "yc_msr.h"
-#include "yc_systick.h"
-#include "stdlib.h"
-#include "system.h"
-#include "yc_timer.h"
+
 
 //#define	MSR_DEBUG
+//#define	MSR_PRINT_RAW_DATA
 #define MAX_TRACK_NUM	3
 
 void ISO7811_Init(void);
@@ -12,7 +10,7 @@
 Boolean MSR_CheckTrackWRDone(uint8_t TrackSel);
 int ISO7811_GetTrackDataNum(uint8_t track_idx);
 int ISO7811_ERRORCheck(uint8_t track_idx);
-void ISO7811_AGC_CONFIG(int track, int en_sec_agc, int settletime, int disable_gac, int fixed_again,int  gain_init, int gain_target);
+void MSR_AGC_CONFIG(int track,  uint32_t gain_fixed);
 uint8_t MSR_Decode(uint8_t * InputBuf,int InPutLen,uint8_t head,uint8_t end,int track,int CodingBits,uint8_t* OutputBuf,int* OutLen);
 
 //raw data buffer near full size
@@ -25,8 +23,8 @@
 static swiping_direction SwipDirectionConfig =SD_BIDIRECTION;  //用户配置刷卡方向
 static swiping_direction SwipDirection =SD_FORWARD_DIRECTION;  //实际刷卡方向
 
-static uint8_t  TrackDataHead[3] = {0x45,0x0B,0x0B};//1,0,0,0,1,0,1   ,0,1,0,1,1     0,1,0,1,1
-static uint8_t  TrackDataEnd[3]  = {0x1F,0x1F,0x1F};//0,0,1,1,1,1,1    1,1,1,1,1      1,1,1,1,1
+static const uint8_t  TrackDataHead[3] = {0x45,0x0B,0x0B};//1,0,0,0,1,0,1   ,0,1,0,1,1     0,1,0,1,1
+static const uint8_t  TrackDataEnd[3]  = {0x1F,0x1F,0x1F};//0,0,1,1,1,1,1    1,1,1,1,1      1,1,1,1,1
 
 #define T1DATABIT 7
 #define T2DATABIT 5
@@ -104,7 +102,7 @@
 	switch(direction)
 	{
 		case SD_FORWARD_DIRECTION:
-			while( bitnum < CodingBits)      //在包头的长度内读取对应位的数据
+			while( bitnum < CodingBits)     //在包头的长度内读取对应位的数据
 			{
 				if( 1 == get_data_bit(InputBuf[bufindex], bitindex)  )
 				getchar |=  (1<<bitnum);
@@ -150,17 +148,23 @@
 
 	if(*direction == SD_FORWARD_DIRECTION)
 	{
-		while (bufindex < InPutLen){
+		while (bufindex < InPutLen)
+		{
 			TempHead = get_one_char(InputBuf, bufindex, bitindex, CodingBits, SD_FORWARD_DIRECTION);
 			HeadIndex = (((bufindex << 8) & 0xffffff00) | (bitindex & 0xff));
 			if (TempHead == head) 
 			{
+        #if 0			
 				count = 0;
 				while (count < CodingBits) { indexadd(bufindex, bitindex);   count++; }
 				count = 0;
 				tempchar = get_one_char(InputBuf, bufindex, bitindex, CodingBits, SD_FORWARD_DIRECTION);
-				if (tempchar != end) { return HeadIndex; }
-				else { break; }
+				if (tempchar != end)
+					 { return HeadIndex; }
+				      else { break; }
+				#else  
+				return HeadIndex;
+				#endif
 			}
 			else 
 			{ 
@@ -173,7 +177,8 @@
 	*direction = SD_REVERSE_DIRECTION;
 	bufindex = InPutLen - 1;
 	bitindex = 4;
-	while (bufindex >= 0) {
+	while (bufindex >= 0)
+	{
 		TempHead = get_one_char(InputBuf, bufindex, bitindex, CodingBits, SD_REVERSE_DIRECTION);
 		HeadIndex = (((bufindex << 8) & 0xffffff00) | (bitindex & 0xff));
 		if (TempHead == head) { return HeadIndex; }
@@ -241,7 +246,7 @@
 		CodingBits: one data size
 		direction: swipcard direction
 		track: the track you select ,it will equal to TRACK_SELECT_1,TRACK_SELECT_2 or TRACK_SELECT_3
-		OutputBuf��decoding data
+		OutputBuf:decoding data
 		Outlen: decoding data length 
 
 * @retval 
@@ -260,6 +265,24 @@
 	{
 		return TRACK_NO_DATA;          
 	}
+	#ifdef MSR_PRINT_RAW_DATA
+	for(int i=0;i<MAX_TRACK_NUM;i++)
+	{
+		if(track==(1<<i))
+		{
+			MyPrintf("track%d raw data[%d]:\n",i+1,InPutLen);
+		}
+	}
+	for(int i=0;i<InPutLen;i++)
+	{
+		MyPrintf("[%03d]",i);
+		for(int j=0;j<5;j++)
+		{
+			MyPrintf("%d",(InputBuf[i]>>j)&1);
+		}
+		MyPrintf("\n");
+	}
+	#endif
 	int TempDirection=SD_FORWARD_DIRECTION, HeadIndex=0;//默认按照正向解码，
 	int bufindex = 0;
 	int bitindex = 0;
@@ -302,6 +325,16 @@
 					}
 					getbinarynum++;
 					indexadd(bufindex,bitindex);	//#define indexadd(a,b) ((b)<4)?((b)++):((a)++, (b)=0)bufindex是当前检索的字节数，bitindex是在当前字节的有效位
+					if(bufindex>=InPutLen)
+					{
+						#ifdef MSR_DEBUG
+						MyPrintf("Forward direction len error; bufindex:%d  bitindex %d data count:%d\n",bufindex,bitindex,(*OutLen));
+						#endif
+						MSR_ClearBuf(OutputBuf,MAX_TRACK_DATA_SIZE);
+						*OutLen=0;
+						rtnvalue =  LENGTH_ERR;
+						break;
+					}
 			}
 
 			if(!MSR_OddEvenCheck(tempdata,CodingBits))     //奇校验，如果错误则进入执行
@@ -345,7 +378,7 @@
 					if(bufindex>=InPutLen)
 					{
 						#ifdef MSR_DEBUG
-						MyPrintf("Forward direction LENGTH_ERR\n");
+						MyPrintf("Forward direction len ERROR; bufindex:%d  bitindex %d data count:%d\n",bufindex,bitindex,(*OutLen));
 						#endif
 						MSR_ClearBuf(OutputBuf,MAX_TRACK_DATA_SIZE);
 						*OutLen=0;
@@ -394,13 +427,12 @@
 	
 	if(HeadIndex == -1)
 	{
-		//SwipDirection = SD_FORWARD_DIRECTION;
 		*OutLen = 0;
 		return PARITY_ERR;
 	}
 		
 	bufindex = HeadIndex>>8;
-	bitindex =  HeadIndex&0x0f;
+	bitindex =  HeadIndex&0xff;
 	
 	#ifdef MSR_DEBUG  
 	MyPrintf("Back direction ::Head bufindex:%d bitindex:%d  direction:%d\n", bufindex, bitindex, TempDirection);
@@ -417,6 +449,15 @@
 			}
 			getbinarynum++;
 			indexdec(bufindex, bitindex);	
+			if(bufindex<0)
+			{
+				#if defined (MSR_DEBUG) 
+				MyPrintf("Back direction length error; bufindex:%d  bitindex %d data count:%d\n",bufindex,bitindex,(*OutLen));
+				#endif
+				MSR_ClearBuf(OutputBuf, MAX_TRACK_DATA_SIZE);
+				*OutLen=0;
+				return LENGTH_ERR;
+			}
 		}
 		
 		if(!MSR_OddEvenCheck(tempdata, CodingBits))
@@ -440,7 +481,7 @@
 		}
 		else
 		{
-			if(OutputBuf[(*OutLen)-1] == end)//找到停止位
+			if(OutputBuf[(*OutLen)-1] == end)//判断是否遇到停止位
 			{
 				tempdata = 0;
 				getbinarynum = 0;
@@ -455,10 +496,10 @@
 				}
 				OutputBuf[*OutLen] = tempdata;
 				
-				if(bufindex<=0)
+				if(bufindex<0)
 				{
 					#if defined (MSR_DEBUG) 
-					MyPrintf("Back direction length error \n");
+					MyPrintf("Back direction length ERROR; bufindex:%d  bitindex %d data count:%d\n",bufindex,bitindex,(*OutLen));
 					#endif
 					MSR_ClearBuf(OutputBuf, MAX_TRACK_DATA_SIZE);
 					*OutLen=0;
@@ -503,7 +544,7 @@
 	*tflag = 0;
 	*cfmt =0;
 	 memset((char*)ptrack,0,sizeof(ptrack));
-	 
+
  	if(options&TRACK_SELECT_1||options&TRACK_SELECT_ALL)   //选择磁道一或全部磁道
  	{
  		#if defined (MSR_DEBUG) 
@@ -597,11 +638,12 @@
 	return FALSE;
 }
 
-#define DECODE_T23
-#ifdef DECODE_T23
-uint8_t MSR_DetectSwipingCard(void)
+
+#define VALID_CHARNUM 10
+#define TRAKDOWN_TIMEOUT 300
+uint8_t  MSR_DetectSwipingCard(void)
 {
-	volatile unsigned int timecount = WAITTIME;
+	int waitedtime = 0; 
 	
 	if(MSR_RawBufNearFull())
 	{
@@ -609,67 +651,58 @@
 		MSR_ENABLE(ENABLE);
 		return DETECT_NO_SWIPING_CARD;
 	}
-	if(MSR_CheckTrackWRDone(TRACK_SELECT_2)||MSR_CheckTrackWRDone(TRACK_SELECT_3))
-	{
-		#ifdef MSR_DEBUG
-		MyPrintf("ISO7811_STATUS=%08x\n",ISO7811_STATUS);
-		MyPrintf("ISO7811_CHAR_NUM=%08x\n",ISO7811_CHAR_NUM);
-		MyPrintf("ISO7811_INTERFER_CHAR_NUM=%08x\n",ISO7811_INTERFER_CHAR_NUM);
-		MyPrintf("ISO7811_DC_EST=%08x\n",ISO7811_DC_EST);
-		MyPrintf("ISO7811_INTF_PEAK=%08x\n",ISO7811_INTF_PEAK);
-		MyPrintf("ISO7811_AGC_PEAK_VAL=%08x\n",ISO7811_AGC_PEAK_VAL);
-		#endif
-		while(timecount--)
-		{
-				if(MSR_RawBufNearFull())
-				{
-						MSR_ENABLE(DISABLE);
-						MSR_ENABLE(ENABLE);
-						return DETECT_NO_SWIPING_CARD;
-				}
-				if(MSR_CheckTrackWRDone(TRACK_SELECT_2)&&MSR_CheckTrackWRDone(TRACK_SELECT_3))
-				{
-					return DETECT_SWIPING_CARD;
-				}
-		}
-		return DETECT_SWIPING_CARD;
-	}
-	return DETECT_NO_SWIPING_CARD;
-}
-#else 
-uint8_t MSR_DetectSwipingCard(void)
-{
-	volatile unsigned int timecount = WAITTIME;
 	
-	if(MSR_RawBufNearFull())
-	{
-
-		MSR_ENABLE(DISABLE);
-		MSR_ENABLE(ENABLE);
-		return DETECT_NO_SWIPING_CARD;
-	}
+	
 	if(MSR_CheckTrackWRDone(TRACK_SELECT_1) ||MSR_CheckTrackWRDone(TRACK_SELECT_2)||MSR_CheckTrackWRDone(TRACK_SELECT_3))
 	{
+		if(ISO7811_GetTrackDataNum( TRACK_SELECT_1)> VALID_CHARNUM && (!(MSR_CheckTrackWRDone(TRACK_SELECT_1))))
+		{
+			#ifdef MSR_DEBUG
+			MyPrintf("track1 have data[%d],need wait\n",ISO7811_GetTrackDataNum( TRACK_SELECT_1));
+			#endif
+			while((waitedtime < TRAKDOWN_TIMEOUT)& ( !(MSR_CheckTrackWRDone(TRACK_SELECT_1)) ) )
+			{
+				((void(*)(int))(FUNC_DELAY_MS_ADDR))(1);
+				waitedtime++;
+			}
+			#ifdef MSR_DEBUG
+			MyPrintf("track1 waitedtime=%d done=%d data=%d\n",waitedtime,MSR_CheckTrackWRDone(TRACK_SELECT_1),ISO7811_GetTrackDataNum( TRACK_SELECT_1));
+			#endif
+		}
+		
+		if(ISO7811_GetTrackDataNum( TRACK_SELECT_2)> VALID_CHARNUM && (!(MSR_CheckTrackWRDone(TRACK_SELECT_2))))
+		{
+			#ifdef MSR_DEBUG
+			MyPrintf("track2 have data[%d],need wait\n",ISO7811_GetTrackDataNum( TRACK_SELECT_2));
+			#endif
+			while((waitedtime < TRAKDOWN_TIMEOUT)& ( !(MSR_CheckTrackWRDone(TRACK_SELECT_2)) ) )
+			{
+				((void(*)(int))(FUNC_DELAY_MS_ADDR))(1);
+				waitedtime++;
+			}
+			#ifdef MSR_DEBUG
+			MyPrintf("track2 waitedtime=%d done=%d data=%d\n",waitedtime,MSR_CheckTrackWRDone(TRACK_SELECT_2),ISO7811_GetTrackDataNum( TRACK_SELECT_2));
+			#endif
+		}
 
-		while(timecount--)
+		if(ISO7811_GetTrackDataNum( TRACK_SELECT_3)> VALID_CHARNUM && (!(MSR_CheckTrackWRDone(TRACK_SELECT_3))))
 		{
-				if(MSR_RawBufNearFull())
-				{
-						MSR_ENABLE(DISABLE);
-						MSR_ENABLE(ENABLE);
-						return DETECT_NO_SWIPING_CARD;
-				}	
-				if(MSR_CheckTrackWRDone(TRACK_SELECT_1)&&MSR_CheckTrackWRDone(TRACK_SELECT_2)&&MSR_CheckTrackWRDone(TRACK_SELECT_3))
-				{
-					return DETECT_SWIPING_CARD;
-				}
+			#ifdef MSR_DEBUG
+			MyPrintf("track3 have data[%d],need wait\n",ISO7811_GetTrackDataNum( TRACK_SELECT_3));
+			#endif
+			while((waitedtime < TRAKDOWN_TIMEOUT)& ( !(MSR_CheckTrackWRDone(TRACK_SELECT_3)) ) )
+			{
+				((void(*)(int))(FUNC_DELAY_MS_ADDR))(1);
+				waitedtime++;
+			}
+			#ifdef MSR_DEBUG
+			MyPrintf("track3 waitedtime=%d done=%d data=%d\n",waitedtime,MSR_CheckTrackWRDone(TRACK_SELECT_3),ISO7811_GetTrackDataNum( TRACK_SELECT_3));
+			#endif
 		}
+
 		return DETECT_SWIPING_CARD;
 	}
-	return DETECT_NO_SWIPING_CARD;
 }
-#endif
-
 
 swiping_direction MSR_GetSwipeDir(void)
 {
@@ -739,9 +772,8 @@
 {
 	 if( NewState)
 	 {
-//		  ISO7811_CTRL&=~(ENABLE);
-//		  delay(100);
-		  ISO7811_CTRL |= ENABLE;
+		((void(*)(int))(FUNC_DELAY_MS_ADDR))(10);//清状态位需要时间
+		ISO7811_CTRL |= ENABLE;
 	  }
 	  else
 	  {
@@ -824,14 +856,10 @@
 	#endif
 	ISO7811_T2_AGC_CFG	= 0x2471fb22;
 	
-//	ISO7811_T2_AGC_CFG	= 0x24720b22;
-	
 	ISO7811_T3_PEAK_WIDTH_CFG = 0x2a0050;
 	ISO7811_T3_PULSE_WIDTH_CFG	= 0x148fffe;
 	ISO7811_T3_AGC_CFG = 0x2471db22;
 	
-//	ISO7811_T3_AGC_CFG = 0x24722b22;
-	
 	delay_ms(300);//处理上电第一次刷卡失败问题(配置完模拟寄存器需要等待稳定再使能总开关)
 #ifdef MSR_FPGA
 	ISO7811_CTRL &= ~(0x1FF <<20);
@@ -839,19 +867,98 @@
 	MSR_ENABLE(ENABLE);
 } 
 
-void ISO7811_AGC_CONFIG(int track, int en_sec_agc, int settletime, int disable_gac, int fixed_again,int  gain_init, int gain_target)
+
+void MSR_AGC_CONFIG(int track, uint32_t gain_fixed)
+{
+	int temp = 0;
+	switch(track)
+	{
+	case TRACK_SELECT_1:
+		temp = ISO7811_T1_AGC_CFG;
+		temp  &= ~(0x3f<<12);
+		temp  |= (1<<11)|(gain_fixed<<12);
+		ISO7811_T1_AGC_CFG = temp;
+	break;
+		
+	case TRACK_SELECT_2:
+		temp = ISO7811_T2_AGC_CFG;
+		temp  &= ~(0x3f<<12);
+		temp  |= (1<<11)|(gain_fixed<<12);
+		ISO7811_T2_AGC_CFG = temp;
+	break;
+
+	case TRACK_SELECT_3:
+		temp = ISO7811_T3_AGC_CFG;
+		temp  &= ~(0x3f<<12);
+		temp  |= (1<<11)|(gain_fixed<<12);
+		ISO7811_T3_AGC_CFG = temp;
+	break;
+
+	default:
+	break;
+	}
+}
+
+
+void ISO7811_PeakWidth_CONFIG(int track, uint32_t thld_init )
+{
+	int temp = 0;
+	switch(track)
+	{
+	case TRACK_SELECT_1:
+		temp = 	ISO7811_T1_PEAK_WIDTH_CFG;
+		temp &=~(0x7fff<<0);
+		temp |=(thld_init<<0);
+		ISO7811_T1_PEAK_WIDTH_CFG = temp;
+	break;
+		
+	case TRACK_SELECT_2:
+		temp = 	ISO7811_T2_PEAK_WIDTH_CFG;
+		temp &=~(0x7fff<<0);
+		temp |=(thld_init<<0);
+		ISO7811_T2_PEAK_WIDTH_CFG = temp;
+
+	break;
+
+	case TRACK_SELECT_3:
+		temp = 	ISO7811_T3_PEAK_WIDTH_CFG;
+		temp &=~(0x7fff<<0);
+		temp |=(thld_init<<0);
+		ISO7811_T3_PEAK_WIDTH_CFG = temp;
+	break;
+
+	default:
+	break;
+	}
+}
+
+void ISO7811_PulseWidth_CONFIG(int track, uint32_t alpha)
 {
+	int temp = 0;
 	switch(track)
 	{
 	case TRACK_SELECT_1:
-		ISO7811_T1_AGC_CFG = ((en_sec_agc<<2) |( settletime << 3) |(disable_gac<<11)|(fixed_again<<12)|(gain_init<<18)|(gain_target<<24));
+		temp = 	ISO7811_T1_PULSE_WIDTH_CFG;
+		temp &=~(0x0f<<17);
+		temp |=((alpha&0x0f)<<17);
+		ISO7811_T1_PULSE_WIDTH_CFG = temp;
 	break;
+		
 	case TRACK_SELECT_2:
-		ISO7811_T2_AGC_CFG = ((en_sec_agc<<2) |( settletime << 3) |(disable_gac<<11)|(fixed_again<<12)|(gain_init<<18)|(gain_target<<24));
+		temp = 	ISO7811_T2_PULSE_WIDTH_CFG;
+		temp &=~(0x0f<<17);
+		temp |=((alpha&0x0f)<<17);
+		ISO7811_T2_PULSE_WIDTH_CFG = temp;
+
 	break;
+
 	case TRACK_SELECT_3:
-		ISO7811_T3_AGC_CFG = ((en_sec_agc<<2) |( settletime << 3) |(disable_gac<<11)|(fixed_again<<12)|(gain_init<<18)|(gain_target<<24));
+		temp = 	ISO7811_T3_PULSE_WIDTH_CFG;
+		temp &=~(0x0f<<17);
+		temp |=((alpha&0x0f)<<17);
+		ISO7811_T3_PULSE_WIDTH_CFG = temp;
 	break;
+
 	default:
 	break;
 	}
@@ -943,7 +1050,7 @@
 
 /**
  * @brief	:Channel select signal for 3 tracks 
- * @param ��T1ChannelSel: channel seletct signal for track 1,the param must equal to signal_t1 in this software version.
+ * @param :T1ChannelSel: channel seletct signal for track 1,the param must equal to signal_t1 in this software version.
 						T2ChannelSel: channel seletct signal for track 2,the param can  equal to signal_t2,signal_t3
 						T3ChannelSel: channel seletct signal for track 3,the param can  equal to signal_t2,signal_t3
 						//parm select from enum signal_fortrack.
Index: fw/sdk/yc_qspi.h
===================================================================
--- /YC3121_SDK/fw/sdk/yc_qspi.h	(revision 633)
+++ /YC3121_SDK/fw/sdk/yc_qspi.h	(working copy)
@@ -51,6 +51,7 @@
   */
 void enc_erase_flash_32byte(uint32_t flash_addr);
 
+
 /**
   * @brief  enc erase flash 32k
   * @param  flash_addr   
@@ -59,6 +60,14 @@
 void enc_erase_flash_32k(uint32_t flash_addr);
 
 /**
+  * @brief  enc erase flash app area
+  * @param  addr:MCU every 32k start addr  
+  * @param  len:erase len	
+  * @return none
+  */
+uint8_t enc_earse_flash_app_area(uint32_t addr,uint32_t len);
+
+/**
   * @brief  enc write flash
   * @param  flash_addr, tx buf, len  
   * @return none
@@ -90,10 +99,18 @@
 
 
 /**
-  * @brief  clear app disable download flag
+  * @brief  clear app info(reset into bootload)
   * @param  none
   * @return none
   */
 void app_enable_download();
 
+
+/**
+  * @brief  clear app disable download flag(reset and gpio1(UART0_TX)to gnd into bootload)
+  * @param  none
+  * @return none
+  */
+void app_clear_disable_download_flag();
+
 #endif
Index: fw/sdk/yc_qspi.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_qspi.c	(revision 633)
+++ /YC3121_SDK/fw/sdk/yc_qspi.c	(working copy)
@@ -118,24 +118,30 @@
 
 void enc_read_flash(uint32_t flash_addr,uint8_t *buf,uint32_t len)
 {
-	uint32_t i = 0;
-	if(flash_blank_check(flash_addr,len)==FALSE)
+	uint32_t i,j,n;
+	uint32_t primask=get_primask();
+	if(!primask)	__asm("CPSID i");
+	n=(32-(flash_addr&0x20))>len?len:(32-(flash_addr&0x20));
+	i=0;
+	while(len>0)
 	{
-		uint32_t primask=get_primask();
-		if(!primask)	__asm("CPSID i");
-		prefetch((uint8_t*)flash_addr,(uint8_t*)(flash_addr+len));
-		for(i=0;i<len;i++)
+		if(flash_blank_check(flash_addr,n)==FALSE)
 		{
-			buf[i] = *(volatile uint8_t *)(flash_addr+i);
+			prefetch((uint8_t*)flash_addr,(uint8_t*)(flash_addr+n));
+			for(j=0;j<n;j++)
+			{
+				buf[i++] = *(volatile uint8_t *)(flash_addr+j);
+			}
 		}
-		if(!primask)	__asm("CPSIE i");
-	}
-	else
-	{
-		memset(buf,0xff,len);
+		else
+		{
+			memset(buf+i,0xff,n);
+		}
+		flash_addr +=n;
+		len -=n;
+		n= len>=32? 32:len;
 	}
-	
-	
+	if(!primask)	__asm("CPSIE i");
 }
 
 
@@ -155,13 +161,15 @@
 	((void(*)(void *start_addr, void *end_addr))FUNC_PREFETCH)(start_addr, end_addr);
 }
 
-static void replace_w_data(uint32_t real_addr)
+static void noinline replace_w_data(uint32_t real_addr)
 {
+	//�Ķ��˺���ʱ��Ҫͬʱ����enc_erase_flash_32byte�еĺ���ˢ�µ�ַ
 	uint32_t page_addr = 0;
 	uint32_t rem_addr = 0;
 	uint8_t rbuf[4096] ={0};
 	uint8_t times = 0;
 	uint8_t fill_data_nums = 36;
+	
 //	uint8_t tmpbuf[4096]={0};
 	page_addr = (real_addr & 0xfffff000);
 	rem_addr = real_addr & 0xfff;
@@ -171,20 +179,19 @@
 	while(times--)
 	{
 		//step1: sector read
-		qspi_flash_read(page_addr, rbuf, 4096);
-
+		//qspi_flash_read(page_addr, rbuf, 4096);
+		((uint8_t(*)(uint32_t flash_addr, uint32_t len, uint8_t *tbuf))FUNC_QSPI_FLASH_READ_ADDR)(page_addr, 4096, rbuf);
 		//step2: sector erase
-		qspi_flash_sectorerase(page_addr);
-
+		//qspi_flash_sectorerase(page_addr);
+		((uint8_t(*)(uint32_t flash_addr))FUNC_QSPI_FLASH_SECTORERASE_ADDR)(page_addr); 
 		//step3: fill page data
 		for(int i=0; i < fill_data_nums; i++)
 		{
 			rbuf[rem_addr + i] = 0xff;
 		} 
-
 		//step4:sector write
-		qspi_flash_write(page_addr, rbuf, 4096);
-
+		//qspi_flash_write(page_addr, rbuf, 4096);
+		((uint8_t(*)(uint32_t flash_addr, uint32_t len, uint8_t *tbuf))FUNC_QSPI_FLASH_WRITE_ADDR)(page_addr, 4096, rbuf);
 		page_addr += 4096; 
 		rem_addr = 0;
 		fill_data_nums = 36 - fill_data_nums;
@@ -205,16 +212,20 @@
 	            ((real_addr >> 8) & 0xff) << 16 |
 	            ((real_addr >> 16) & 0xff) << 8 |
 	            ((real_addr >> 24) & 0xff) << 0;
-	
+	uint8_t tmp = pre_qspi();
+	uint32_t replace_w_data_start_addr=(uint32_t)replace_w_data;
+	prefetch((uint32_t*)replace_w_data_start_addr,(uint32_t*)(replace_w_data_start_addr+178));
 	replace_w_data(real_addr);
+	end_qspi(tmp);
 	if(!primask)	__asm("CPSIE i");
 }
 
+
+
 void enc_erase_flash_32k(uint32_t flash_addr)
 {
  uint8_t num;
- uint8_t src_r1[4096];
- uint8_t src_r2[4096];
+ uint8_t back_buf[4096];
  uint32_t log_addr;
  uint32_t i;
 
@@ -223,35 +234,107 @@
  
  log_addr = log_addr + 0x1000000;
 
- qspi_flash_read(log_addr, src_r1, 4096);
- memset(src_r1+16, 0xff, 4080);
+ qspi_flash_read(log_addr, back_buf, 0x10);
  
  for (i = log_addr; i < log_addr + 0x9000; i += 0x1000)
  {
   qspi_flash_sectorerase(i);
  }
 
- qspi_flash_write(log_addr, src_r1, 0x10);
+ qspi_flash_write(log_addr, back_buf, 0x10);
 
- qspi_flash_read(log_addr+0x9000, src_r2, 4096);
+ qspi_flash_read(log_addr+0x9000, back_buf, 4096);
  qspi_flash_sectorerase(log_addr+0x9000);
- memset(src_r2,0xff,16);
- qspi_flash_write(log_addr+0x9000, src_r2, 4096);
+ memset(back_buf,0xff,0x10);
+ qspi_flash_write(log_addr+0x9000, back_buf, 4096);
 }
 
-#define APP_DOWNLOAD_FLAG_ADDR	0x1008000
-void app_enable_download()
+uint8_t enc_earse_flash_app_area(uint32_t addr,uint32_t len)
 {
-	uint8_t buf32[32]={0};
+	uint8_t head_backup[16]={0};
+	uint8_t end_backup[0x1000]={0};
+	uint32_t earse_start_addr;
+	uint32_t earse_end_addr;
+	uint32_t earse_start_addr_backup;
+	int i;
+	
+	if(len<=0)
+	{
+		return ERROR;
+	}
+	
+	earse_start_addr=(addr&0xffffff);
+	earse_end_addr=earse_start_addr+len;
+	
+	earse_start_addr=((earse_start_addr/0x8000)*0x9000);//cpu地址转物理地址(cpu地址32k对齐)
+	earse_end_addr=((((earse_end_addr+(0x8000-1))/0x8000)*0x9000)+0x10);
+	earse_end_addr=((earse_end_addr+(0x1000-1))/0x1000)*0x1000;//最小擦除单元4k对齐
+	
+	earse_start_addr|=0x1000000;
+	earse_end_addr|=0x1000000;
+	
+	earse_start_addr_backup=earse_start_addr;
+	
+	qspi_flash_read(earse_start_addr,head_backup,0x10);//cpu 32k head backup(16byte)
+	qspi_flash_read(earse_end_addr-0x1000,end_backup,0x1000);//32k end page backup(0x1000)
+	for(int i=0;i<0x10;i++)//clear end_backup first 16 bytes
+	{
+		end_backup[i]=0xff;
+	}
+	//earse head sector(4k)
+	for(;((earse_start_addr%0x8000)!=0);earse_start_addr+=0x1000)
+	{
+		if(qspi_flash_sectorerase(earse_start_addr)!=SUCCESS)
+		{
+			return ERROR;
+		}
+	}
+	
+	//earse block(32k)
+	for(;(earse_start_addr+0x8000)<=earse_end_addr;earse_start_addr+=0x8000)
+	{
+		if(qspi_flash_blockerase32k(earse_start_addr)!=SUCCESS)
+		{
+			return ERROR;
+		}
+	}
 	
-	uint32_t enc_unit_head_addr=(APP_DOWNLOAD_FLAG_ADDR/32)*32;
-	if(flash_blank_check(enc_unit_head_addr,32)==FALSE)
+	//earse end sector(4k)
+	for(;earse_start_addr<earse_end_addr;earse_start_addr+=0x1000)
 	{
-		enc_read_flash(enc_unit_head_addr,buf32,32);
-		
-		enc_erase_flash_32byte(enc_unit_head_addr);
-		
-		buf32[APP_DOWNLOAD_FLAG_ADDR%32]=0xff;
-		enc_write_flash(enc_unit_head_addr,buf32,32);
+		if(qspi_flash_sectorerase(earse_start_addr)!=SUCCESS)
+		{
+			return ERROR;
+		}
 	}
+
+	if(qspi_flash_write(earse_start_addr_backup,head_backup,0x10)!=SUCCESS)//write cpu 32k head backup(16byte)
+	{
+		return ERROR;
+	}
+	if(qspi_flash_write(earse_end_addr-0x1000,end_backup,0x1000)!=SUCCESS)//write cpu 32k end page backup(0x1000)
+	{
+		return ERROR;
+	}
+
+	return SUCCESS;
+}
+
+#define APP_INFO_ADDR	0x1008000
+void app_enable_download()
+{
+	for(int i=0;i<0x200;i+=32)
+	{
+		enc_erase_flash_32byte(APP_INFO_ADDR+i);
+	}
+}
+
+void app_clear_disable_download_flag()
+{
+	uint8_t app_info_buf[512]={0};
+	enc_read_flash(APP_INFO_ADDR,app_info_buf,sizeof(app_info_buf));
+	app_info_buf[0]=0xff;
+	((void(*)(uint8_t*,int,uint8_t*))(0x4ea8+1))(app_info_buf,268,(uint8_t*)(app_info_buf+268));//put crc32
+	app_enable_download();
+	enc_write_flash(APP_INFO_ADDR,app_info_buf,sizeof(app_info_buf));
 }
Index: fw/sdk/yc_qspi.lib
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
