Index: prj/MDK/YC3121_Keil.uvoptx
===================================================================
--- /YC3121_demo/ModuleDemo/POS/prj/MDK/YC3121_Keil.uvoptx	(revision 731)
+++ /YC3121_demo/ModuleDemo/POS/prj/MDK/YC3121_Keil.uvoptx	(working copy)
@@ -229,18 +229,6 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
-    <File>
-      <GroupNumber>1</GroupNumber>
-      <FileNumber>3</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\..\..\Librarier\core\bt_code.c</PathWithFileName>
-      <FilenameWithoutPath>bt_code.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
   </Group>
 
   <Group>
@@ -251,7 +239,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>4</FileNumber>
+      <FileNumber>3</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -263,7 +251,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>5</FileNumber>
+      <FileNumber>4</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -275,7 +263,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>6</FileNumber>
+      <FileNumber>5</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -285,6 +273,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\user\bt_code.c</PathWithFileName>
+      <FilenameWithoutPath>bt_code.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
Index: prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/POS/prj/MDK/YC3121_Keil.uvprojx	(revision 731)
+++ /YC3121_demo/ModuleDemo/POS/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -321,7 +321,7 @@
             <PlainCh>0</PlainCh>
             <Ropi>0</Ropi>
             <Rwpi>0</Rwpi>
-            <wLevel>1</wLevel>
+            <wLevel>2</wLevel>
             <uThumb>0</uThumb>
             <uSurpInc>0</uSurpInc>
             <uC99>1</uC99>
@@ -392,11 +392,6 @@
               <FileType>1</FileType>
               <FilePath>..\..\..\..\Librarier\core\system.c</FilePath>
             </File>
-            <File>
-              <FileName>bt_code.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\..\..\Librarier\core\bt_code.c</FilePath>
-            </File>
           </Files>
         </Group>
         <Group>
@@ -417,6 +412,11 @@
               <FileType>1</FileType>
               <FilePath>..\..\user\font.c</FilePath>
             </File>
+            <File>
+              <FileName>bt_code.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\user\bt_code.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
Index: user/font.h
===================================================================
--- /YC3121_demo/ModuleDemo/POS/user/font.h	(revision 731)
+++ /YC3121_demo/ModuleDemo/POS/user/font.h	(working copy)
@@ -86,5 +86,6 @@
 
 extern const unsigned char gImage_pic_test1[153608];
 extern const unsigned char gImage_pic_test2[153608];
-
+/* 蓝牙图标 */
+extern const unsigned char gImage_bt[578];
 #endif
Index: user/font.c
===================================================================
--- /YC3121_demo/ModuleDemo/POS/user/font.c	(revision 731)
+++ /YC3121_demo/ModuleDemo/POS/user/font.c	(working copy)
@@ -24214,3 +24214,41 @@
 0X59,0XEE,0X59,0XEE,0X59,0XEE,0X59,0XEE,0X59,0XCE,0X59,0XCE,0X51,0XCE,0X51,0XCE,
 0X51,0XCE,0X51,0XAE,0X51,0XAD,0X51,0XAD,0X51,0XAD,0X51,0X8D,0X51,0X8D,0X51,0X8D,
 };
+
+const unsigned char gImage_bt[578] = { 0X10,0X10,0X00,0X0F,0X00,0X13,0X01,0X1B,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBF,0XDF,0X3D,0XB6,0X5B,0XA5,0XFB,
+0XC6,0XBC,0XE7,0X5E,0XF7,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XA5,0XFA,0X02,0XB4,0X01,0XF2,0X02,0X74,0X01,0XF3,0X02,0X13,
+0X01,0XF2,0X23,0X55,0XC6,0XBC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0X7D,0X18,0X02,0X33,0X02,0XD5,0X02,0XB5,0X44,0X17,0X8D,0X9A,0X02,0X33,0X02,0XF5,
+0X02,0X94,0X02,0X93,0XCE,0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB6,0X5B,0X02,0X74,
+0X02,0XD5,0X02,0XF5,0X02,0XB4,0X33,0XD6,0XFF,0XFF,0X7D,0X59,0X02,0X33,0X02,0XF5,
+0X02,0X94,0X4B,0XF6,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X6C,0XD8,0X02,0X74,0X02,0XD5,
+0X02,0XB4,0X02,0XB4,0X2B,0XB6,0XFF,0XFF,0XFF,0XFF,0X75,0X19,0X02,0X53,0X02,0XD5,
+0X0A,0XF5,0XC6,0XBC,0XFF,0XFF,0XF7,0XDF,0X33,0XD6,0X02,0X94,0X1B,0X35,0X5C,0XB7,
+0X02,0X53,0X2B,0XB6,0XF7,0XDF,0X23,0X54,0XFF,0XFF,0X7D,0X39,0X02,0XB4,0X02,0X54,
+0X95,0XBA,0XFF,0XFF,0XF7,0XBF,0X23,0X75,0X02,0X54,0X5C,0XB7,0XFF,0XFF,0X5C,0X57,
+0X23,0X75,0XFF,0XDF,0X01,0XB1,0XAE,0X5B,0XFF,0XFF,0X02,0XB4,0X02,0X54,0X85,0X39,
+0XFF,0XFF,0XEF,0X9E,0X0B,0X15,0X02,0XD5,0X02,0X73,0X95,0X99,0XFF,0XFF,0X85,0X99,
+0XF7,0XDF,0X8D,0X58,0XEF,0X9E,0X4C,0X17,0X02,0X94,0X02,0X94,0X5C,0X97,0XFF,0XFF,
+0XEF,0X7E,0X02,0XB4,0X02,0XD5,0X02,0XF5,0X02,0X74,0X95,0X9A,0XFF,0XFF,0XFF,0XFF,
+0XEF,0XBE,0X44,0X16,0X02,0X74,0X02,0XF5,0X02,0X94,0X44,0X17,0XF7,0XDF,0XE7,0X7E,
+0X02,0X94,0X02,0XF5,0X02,0XF5,0X02,0XD5,0X01,0XD2,0XBE,0X7C,0XFF,0XFF,0X74,0XD8,
+0X01,0XD2,0X02,0XF5,0X02,0XF5,0X02,0XB4,0X33,0XD6,0XF7,0XDF,0XE7,0X7E,0X02,0XB4,
+0X02,0XD5,0X02,0XF5,0X02,0X73,0X95,0XBA,0XFF,0XFF,0XFF,0XFF,0XEF,0XBE,0X64,0X97,
+0X02,0X74,0X02,0XF5,0X02,0X94,0X3B,0XD6,0XF7,0XDF,0XEF,0X9E,0X02,0XF4,0X02,0XD5,
+0X02,0X74,0X95,0XBA,0XFF,0XFF,0X85,0X59,0XF7,0XDF,0X6C,0X97,0XEF,0XBE,0X64,0X77,
+0X02,0X94,0X02,0X94,0X4C,0X37,0XFF,0XFF,0XF7,0XBF,0X23,0X75,0X02,0X54,0X64,0XD8,
+0XFF,0XFF,0X54,0X37,0X23,0X55,0XFF,0XDF,0X01,0XB1,0XAE,0X3B,0XFF,0XFF,0X02,0XB4,
+0X02,0X74,0X6C,0XD8,0XFF,0XFF,0XFF,0XFF,0X4C,0X36,0X02,0X94,0X1B,0X35,0X5C,0X97,
+0X02,0X34,0X2B,0XB6,0XFF,0XDF,0X3B,0XF5,0XFF,0XFF,0X75,0X18,0X02,0XB4,0X02,0X53,
+0X95,0X9A,0XFF,0XFF,0XFF,0XFF,0X95,0X9A,0X02,0X53,0X02,0XD5,0X02,0XB4,0X02,0XB4,
+0X2B,0XB6,0XFF,0XFF,0XFF,0XFF,0X6C,0XF8,0X02,0X54,0X02,0XD5,0X0A,0XF4,0XBE,0XBC,
+0XFF,0XFF,0XFF,0XFF,0XD7,0X1D,0X13,0X15,0X02,0XB4,0X02,0XF5,0X02,0XB4,0X33,0XD6,
+0XFF,0XFF,0X7D,0X39,0X02,0X33,0X02,0XF5,0X02,0X94,0X4C,0X17,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0X9D,0XDA,0X02,0X33,0X02,0XB5,0X02,0XB4,0X44,0X37,0X8D,0XBA,
+0X02,0X33,0X02,0XF5,0X02,0X94,0X02,0XB4,0XCE,0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XB6,0X5B,0X0A,0XD4,0X01,0XD2,0X02,0X54,0X01,0XD2,0X01,0XF3,
+0X02,0X12,0X33,0XB6,0XCE,0XDD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XF7,0XBF,0XE7,0X5D,0XCE,0XDC,0XCE,0XFC,0XD7,0X1D,0XEF,0X9E,
+0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
Index: user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/POS/user/main.c	(revision 731)
+++ /YC3121_demo/ModuleDemo/POS/user/main.c	(working copy)
@@ -53,23 +53,24 @@
 {
 	SYSCTRL_HCLKConfig(SYSCTRL_HCLK_Div_None);
 	#if (BOARD_VER == EPOS_BOARD_V1_0)
-	GPIO_Config(GPIOA, GPIO_Pin_2, OUTPUT_HIGH);//�ⲿldoʹ��
+	GPIO_Config(GPIOA, GPIO_Pin_2, OUTPUT_HIGH);//External LDO enable
 	#endif
-	
+	UART_Configuration();
 #if BEEP_PWM
 	BEEP_PWM_Init();
 #else
 	BEEP_End();
 #endif
-	UART_Configuration();
 	SysTick_Configuration();
 	MyPrintf("Yichip Yc3121 POS Demo V1.0.\r\n");
-
+	MyPrintf("build date:%s-%s\r\n",__DATE__,__TIME__);
 	TFT_SPI_Init();
+	app_bt_init();
 	Display_InterfaceWindow();
 
 	while(1)
 	{
+		BT_Progress();
 		MeunState_Check_Update();
 	}
 }
@@ -112,7 +113,7 @@
   */
 void SysTick_Configuration(void)
 {
-	SysTick_Config(10000000);
+	SysTick_Config(CPU_MHZ/100);//10ms
 }
 
 
@@ -121,11 +122,12 @@
   * @param  None
   * @retval None
   */
+extern tick SystickCount;
 void SYSTICK_IRQHandler(void)
 {
 	static uint8_t off_cnt = 0;
 	
-	if (off_cnt == 9)
+	if (off_cnt == 100)
 	{
 		off_cnt = 0;
 		if (TRUE == Power_Keyscan())
@@ -139,6 +141,9 @@
 		}
 	}
 	off_cnt++;
+	
+	SystickCount++;
+	if(SystickCount>=TICK_MAX_VALUE)	SystickCount=0;
 }
 
 /************************ (C) COPYRIGHT Yichip Microelectronics *****END OF FILE****/
Index: user/meun.h
===================================================================
--- /YC3121_demo/ModuleDemo/POS/user/meun.h	(revision 731)
+++ /YC3121_demo/ModuleDemo/POS/user/meun.h	(working copy)
@@ -12,7 +12,9 @@
 #include "yc_7816.h"
 #include "yc_msr.h"
 #include "yc_touch.h"
-
+#include "yc_bt.h"
+#include "yc_qspi.h"
+#include "yc_systick.h"
 #include "yc_emv_contactless_l1.h"
 #include "yc_nfc_common.h"
 
@@ -28,5 +30,6 @@
 void BEEP_PWM_Init(void);
 void TFT_Power_scan(void);
 void TFT_Single_scan(void);
-
+void app_bt_init(void);
+void show_bt_status(Boolean status);
 #endif
Index: user/meun.c
===================================================================
--- /YC3121_demo/ModuleDemo/POS/user/meun.c	(revision 731)
+++ /YC3121_demo/ModuleDemo/POS/user/meun.c	(working copy)
@@ -19,6 +19,7 @@
 
 }
 
+#if BEEP_PWM
 void BEEP_PWM_Init(void)
 {
     uint32_t value;
@@ -32,6 +33,901 @@
     TIM_PWMInit(&PWM_init_struct);
     TIM_ModeConfig(TIM8, TIM_Mode_PWM);
 }
+#endif
+
+
+static uint8_t hex_lookup[16] = { '0', '1', '2', '3', '4', '5', '6', '7','8','9', 'a', 'b', 'c', 'd', 'e', 'f' };
+static void array2hex(uint8_t* in, int inlen, uint8_t* out)
+{
+	int i;
+	for (i = 0; i < inlen; ++i)
+	{
+		out[2 * i] = hex_lookup[in[i] >> 4];
+		out[2 * i + 1] = hex_lookup[in[i] & 0x0f];
+	}
+}
+
+#define	MAX_INT_STR_SIZE	10
+static int int2str(uint32_t value, uint8_t* out)
+{
+	int i,j;
+	Boolean start=FALSE;
+	uint32_t base_num=1000000000;
+	i=0;
+	while (base_num>0)
+	{
+		j=value/base_num;
+		if(j>0||start==TRUE||base_num==1)
+		{
+			start=TRUE;
+			out[i++]=hex_lookup[j];
+		}
+		value=value%base_num;
+		base_num=base_num/10;
+	}
+	return i;//str len
+}
+
+
+#define BNEP_STATUS_IDLE					0x00
+#define BNEP_STATUS_CONNECTING		0x01
+#define BNEP_STATUS_CONNECTED			0x10
+#define BNEP_STATUS_DOWNLOADING		0x11
+uint8_t bnep_status=BNEP_STATUS_IDLE;
+
+#define APP_TOTAL_DOWNLOAD_LEN		0x80000	//512k
+#define APP_SUB_LEN								1024	//subpackage len 1k
+uint32_t app_total_received_len=0;
+uint32_t app_received_len=0;
+uint16_t app_crc16=0xffff;
+Boolean load_data_error=FALSE;
+#define BNEP_APP_LOAD_TIMEOUT			10000	//10s
+tick bnep_last_tick=0;
+tick download_progress_tick=0;
+Boolean bt_progress_idle=FALSE;
+uint8_t download_cmd[]={0x00,0xAA,0x55,0x01,0x00,0x04,0x00,0x00,0x82,0x8B};
+
+
+// byte0： uuid length
+//byte1-16: uuid
+// 49535343-FE78-4AE5-8FA9-9FAFD205E455
+uint8_t ble_service_uuid_lsps[] = {0x10,0x55,0xe4,0x05,0xd2,0xaf,0x9f,0xa9,0x8f,0xe5,0x4a,0x7d,0xfe,0x43,0x53,0x53,0x49};
+
+/*
+byte0: characterisitic  
+byte1:characterisitic uuid length  
+byte2-17:characterisitic uuid 
+byte18:write/read payload length 
+byte19-20:write/read payload
+*/
+//49535343-1E4D-4BD9-BA61-23C647249616
+uint8_t ble_Characteristic_uuid_lsps_tx[] = {0x10,0x10,0x16,0x96,0x24,0x47,0xc6,0x23,0x61,0xba,0xd9,0x4b,0x4d,0x1e,0x43,0x53,0x53,0x49,0x01,0x00};
+//49535343-8841-43F4-A8D4-ECBE34729BB3
+uint8_t ble_Characteristic_uuid_lsps_rx[] = {0x0c,0x10,0xb3,0x9b,0x72,0x34,0xbe,0xec,0xd4,0xa8,0xf4,0x43,0x41,0x88,0x43,0x53,0x53,0x49,0x01,0x00};
+
+#define IFLASH_NVRAM_ADDR 0x1000000+((1024-4)*1024)
+#define NVRAM_LEN 170//Nvram 长度170bytes,每个设备信息34个字节.
+//#define SPP_FLOWCONTROL
+uint16_t ble_send_handle=0x002a;
+uint8_t bt_name[15] = "YC3121bt";
+uint8_t bt_cod[3] = {0x24,0x04,0x04};
+uint8_t NvramData[NVRAM_LEN]={0};
+Boolean btStatus=FALSE;
+void app_bt_init(void)
+{
+	uint8_t bt_addr[6] =  {0x00,0x00,0x00,0x33,0x22,0x10};
+	uint8_t chip_id[6]={0};
+	uint16_t temp_handle;
+
+	BT_Init();
+	enable_intr(INTR_BT);
+	
+	read_chipid(chip_id);
+	array2hex(chip_id,3,bt_name+8);
+	bt_name[14]='\0';
+	memcpy(bt_addr,chip_id,3);
+
+	if(BT_SetBleName(bt_name,sizeof(bt_name)-1)==TRUE) 
+		MyPrintf("SetBleName_suc ble name:%s\n",bt_name);
+	else 
+		MyPrintf("SetBleName_failed\n");
+	
+	if(BT_SetBtName(bt_name,sizeof(bt_name)-1) == TRUE)//bt与ble名字地址可以设置成一样
+		MyPrintf("SetbtName_suc\n");
+	else 
+		MyPrintf("SetbtName_fail\n");
+	
+	if(BT_SetBleAddr(bt_addr) == TRUE) 
+		MyPrintf("SetBleAddr_suc\n");
+	else 
+		MyPrintf("SetBleAddr_fail\n"); 
+	
+	if(BT_SetBtAddr(bt_addr) == TRUE)
+		MyPrintf("SetBtAddr_suc\n");
+	else 
+		MyPrintf("SetBtAddr_fail\n");
+	
+	if(BT_SetParingMode(0x01) == TRUE)
+		MyPrintf("set confirmkey mode success\n");
+	else
+		MyPrintf("set confirmkey mode failed\n");
+	
+	if(BT_SetCOD(bt_cod) == TRUE) //设置bt3.0设备类型
+		MyPrintf("set COD sucess\n");
+	else
+		MyPrintf("set COD failed\n");
+
+	
+	if(BT_DeleteService() == TRUE) //  删除用户自定义服务
+		MyPrintf("delete service sucess\n");
+	else
+		MyPrintf("delete service failed\n");
+
+	temp_handle=BT_AddBleService(ble_service_uuid_lsps,sizeof(ble_service_uuid_lsps));
+	if( temp_handle!= 0)  //增加服务 返回handle无需保存
+		MyPrintf("add service sucess,handle=%04x\n",temp_handle);
+	else
+		MyPrintf("add service failed,return=%04x\n",temp_handle);
+	
+	ble_send_handle=BT_AddBleCharacteristic(ble_Characteristic_uuid_lsps_tx,sizeof(ble_Characteristic_uuid_lsps_tx));
+	if( ble_send_handle!= 0)  //增加服务的TX特征,返回的handle需要保存，发ble数据时使用
+		MyPrintf("add Characteristic tx sucess,handle=%04x\n",ble_send_handle);
+	else
+		MyPrintf("add Characteristic tx failed,return=%04x\n",ble_send_handle);
+	
+	temp_handle=BT_AddBleCharacteristic(ble_Characteristic_uuid_lsps_rx,sizeof(ble_Characteristic_uuid_lsps_rx));
+	if( temp_handle!= 0)  //增加服务的RX特征,返回的handle不需保存
+		MyPrintf("add Characteristic rx sucess;handle=%04x\n",temp_handle);
+	else
+		MyPrintf("add Characteristic rx failed,return=%04x\n",temp_handle);
+
+
+	if(BT_SetVisibility(0x01,0x01,0x01) == TRUE)  //设置可发现
+		MyPrintf("SetVisibility sucess\n");
+	else
+		MyPrintf("SetVisibility failed\n");
+	
+	MyPrintf("bt version=%x\n",BT_GetVersion());
+	
+	qspi_flash_read(IFLASH_NVRAM_ADDR,NvramData,NVRAM_LEN);
+	if(NvramData[34*0] > 0x05||NvramData[34*1] > 0x05||NvramData[34*2] > 0x05||NvramData[34*3] > 0x05||NvramData[34*4] > 0x05)
+	{
+		memset(NvramData,0x00,NVRAM_LEN);
+	}
+	int i=0;
+	if(BT_SetNVRAM(NvramData,NVRAM_LEN) == TRUE)
+	{
+		MyPrintf("set nvram success:\n");
+		while(i<NVRAM_LEN)
+			MyPrintf("0x%02X ",NvramData[i++]);
+		MyPrintf("\n");
+	}
+	else
+		MyPrintf("set nvram failed\n");
+	
+	MyPrintf("bt init finish\n");
+}
+
+void BT_IRQHandler()
+{
+	while(IPC_have_data())
+	{
+		BT_ParseBTData();
+	}
+
+	BT_CONFIG &= (~(1<<BT_INIT_FLAG));
+}
+
+static uint16_t CRC16(uint8_t *data, int len,uint16_t crc16_base)
+{
+	int i;
+
+	if(len<=0) return 0xffff;
+
+	for (i = 0; i < len; i++)
+	{
+		crc16_base  = (crc16_base >> 8) | (crc16_base << 8);
+		crc16_base ^= (uint16_t)(data[i] & 0xff);
+		crc16_base ^= (crc16_base & 0xff) >> 4;
+		crc16_base ^= crc16_base << 12;
+		crc16_base ^= (crc16_base & 0xff) << 5;
+		crc16_base &= 0xffff;
+	}
+	return crc16_base;
+}
+
+
+
+#define NAME_OFFSET_INDEX         0
+#define NAME_LEN_INDEX            1
+#define NAME_START_INDEX          2
+#define NAME_MAC_INDEX            16
+#define NAME_MAC_LEN              6
+#define NAME_LINKKEY_INDEX        22
+#define NAME_LINKKEY_LEN          16
+#define MAX_SUBPACKAGE_NAME_LEN		14
+#define MAX_BT_MASTER_NAME_LEN		(MAX_SUBPACKAGE_NAME_LEN*4+1)
+uint8_t bt_master_name[MAX_BT_MASTER_NAME_LEN];
+/**
+  * @brief  deal with data from bt core event 
+  * @param  None
+  * @retval None
+  */
+void BT_Progress(void)
+{	
+	int eventCmd= BT_GetEventOpcode();
+	switch(eventCmd)
+	{	
+		case DNS_RSP:
+		{
+			uint8_t recive_dns_rsp[MAX_BLUETOOTH_DATA_LEN];
+			uint8_t tcp_addr[7];
+			tcp_addr[0]=0x01;//tcp handle
+			int DnsDataLen=0;
+			DnsDataLen=BT_ReadBTData(recive_dns_rsp);
+			if(DnsDataLen>0)
+			{
+				MyPrintf("DNS IP:");
+				for(int i=0;i<DnsDataLen;i++)
+				{
+					MyPrintf("%d.",recive_dns_rsp[i]);
+					if(i<4)	tcp_addr[1+i]=recive_dns_rsp[i];
+				}
+				MyPrintf("\n");
+				//add port 443(0x1bb)
+				tcp_addr[5]=0x01;
+				tcp_addr[6]=0xbb;
+				MyPrintf("start connect:www.baidu.com\n");
+				if(BT_ConnectTcp(tcp_addr,sizeof(tcp_addr))==TRUE)
+				{
+					MyPrintf("Connect Tcp cmd ok\n");		
+				}
+				else 
+				{
+					MyPrintf("Connect Tcp cmd fail\n");
+				}
+			}
+			else
+			{
+				MyPrintf("read dns_rsp error");
+			}
+		}
+		break;
+		
+		case BNEP_RECEIVE_TCP_DATA:
+			{
+				bnep_last_tick=SysTick_GetTick();
+				uint8_t i = 0;
+				uint8_t bnep_recive_tcp_data[MAX_BLUETOOTH_DATA_LEN];
+				int BnepDataLen=0;
+				BnepDataLen=BT_ReadBTData(bnep_recive_tcp_data);
+				if(BnepDataLen>0)
+				{
+					MyPrintf("recieve_tcp_data[%d]:\n",BnepDataLen-1);
+					MyPrintf("tcp_handle:%02x\n",bnep_recive_tcp_data[0]);
+					for(int i=1;i<BnepDataLen;i++)	MyPrintf("%02x ",bnep_recive_tcp_data[i]);
+					MyPrintf("\n");	
+					
+					//download app
+					app_received_len+=BnepDataLen-1;
+					app_total_received_len+=BnepDataLen-1;
+					app_crc16=CRC16((uint8_t*)&bnep_recive_tcp_data[1],BnepDataLen-1,app_crc16);
+					MyPrintf("app_received_len=%d\r\n",app_total_received_len);
+					if(app_received_len>=APP_SUB_LEN)
+					{
+						if(app_crc16!=0)
+						{
+							load_data_error=TRUE;
+							MyPrintf("app download fail[app_crc16=%04x]\r\n",app_crc16);
+						}
+						app_crc16=0xffff;
+						app_received_len=0;
+						if(app_total_received_len>=APP_TOTAL_DOWNLOAD_LEN)
+						{
+							bnep_status=BNEP_STATUS_CONNECTED;
+							if(load_data_error!=TRUE)
+							{
+								MyPrintf("app download ok\r\n");
+								ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+								ST7789_TFT_ShowString(0, 152, 16*15, 16, "app download ok", 32, 1, WHITE, OLIVE);
+							}
+							else
+							{
+								MyPrintf("app download fail\r\n");
+								ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+								ST7789_TFT_ShowString(0, 152, 16*17, 16, "app download fail", 32, 1, WHITE, OLIVE);
+							}
+						}
+						else
+						{
+							if(BT_BnepSendTcpData( download_cmd,sizeof(download_cmd))!=TRUE)
+							{
+								MyPrintf("download cmd fail\n"); 
+								ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+								ST7789_TFT_ShowString(0, 152, 16*17, 16, "download cmd fail", 32, 1, WHITE, OLIVE);
+								BT_disconnectBnep();
+								bnep_status=BNEP_STATUS_IDLE;
+							}
+						}
+					}
+					
+				}
+				else	MyPrintf("read bnep_recieve_tcp_data error");
+			}
+		break;
+			
+			case UDP_INFO:
+			{
+				uint8_t bnep_recive_udp_info[MAX_BLUETOOTH_DATA_LEN];
+				if(BT_ReadBTData(bnep_recive_udp_info)>0)
+				{
+					MyPrintf("remote IP:");
+					for(int i=0;i<4;i++)	MyPrintf("%d.",bnep_recive_udp_info[i]);
+					MyPrintf(" port:%d\n",((bnep_recive_udp_info[8]<<8)|bnep_recive_udp_info[9]));	
+					MyPrintf("local IP:");
+					for(int i=0;i<4;i++)	MyPrintf("%d.",bnep_recive_udp_info[4+i]);
+					MyPrintf(" port:%d\n",((bnep_recive_udp_info[10]<<8)|bnep_recive_udp_info[11]));	
+				}
+				else	MyPrintf("read udp info error");
+			}
+		break;
+			
+			case BNEP_RECEIVE_UDP_DATA:
+			{
+				uint8_t bnep_recive_udp_data[MAX_BLUETOOTH_DATA_LEN];
+				int BnepDataLen=0;
+				BnepDataLen=BT_ReadBTData(bnep_recive_udp_data);
+				if(BnepDataLen>0)
+				{
+					MyPrintf("recive_udp_data[%d]:\n",BnepDataLen-1);
+					for(int i=1;i<BnepDataLen;i++)	MyPrintf("%02x ",bnep_recive_udp_data[i]);
+					MyPrintf("\n");	
+				}
+				else	MyPrintf("read bnep_recive_udp_data error");
+			}
+		break;
+			
+			case BNEP_CONNECT_FAIL:
+			{
+				MyPrintf("BNEP_CONNECT_FAIL\n");
+				uint8_t i = 0;
+				uint8_t bnep_connect_fail_reason[MAX_BLUETOOTH_DATA_LEN];
+				int Datalen=0;
+				Datalen=BT_ReadBTData(bnep_connect_fail_reason);
+				if(Datalen>0)
+				{
+					switch(bnep_connect_fail_reason[0])
+					{
+						case 0:
+						{
+						   MyPrintf("BNEP_CONNECT_TIMEOUT\n");
+						}
+						break;
+						case 1:
+						{
+							 MyPrintf("MOBILE_PHONE_NOT_SUPPORTED_BNEP\n");
+						}
+						break;
+						case 2:
+						{
+							 MyPrintf("LINKKLY_ERROR \n");
+						}
+						break;
+						case 3:
+						{
+							 MyPrintf("ROLE_SWITCH_FAIL \n");
+						}
+						break;
+						
+						case 4:
+						{
+							 MyPrintf("L2CAP Connect Fail \n");
+						}
+						break;
+						
+						case 5:
+						{
+							 MyPrintf("DHCP timeout \n");
+						}
+						break;
+						
+						case 6:
+						{
+							 MyPrintf("unpaired \n");
+						}
+						break;
+						
+						case 8:
+						{
+							 MyPrintf("baseband is connected \n");
+						}
+						break;
+						
+						default:
+							MyPrintf("unknow  BNEP_CONNECT_FAIL code:%d\n",bnep_connect_fail_reason[0]);
+							break;	
+					}
+					
+				}
+				if(bnep_status!=BNEP_STATUS_IDLE)
+				{
+					bnep_status=BNEP_STATUS_IDLE;
+					ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+					ST7789_TFT_ShowString(0, 152, 16*19, 16, "connect server fail", 32, 1, WHITE, OLIVE);
+					BT_disconnectBnep();
+				}
+			}
+		break;
+			case TCP_FAIL:
+			{
+				MyPrintf("TCP_FAIL\n");
+				uint8_t i = 0;
+				uint8_t tcp_connect_fail_reason[MAX_BLUETOOTH_DATA_LEN];
+				int Datalen=0;
+				Datalen=BT_ReadBTData(tcp_connect_fail_reason);
+				if(Datalen>0)
+				{
+					switch(tcp_connect_fail_reason[0])
+					{
+						case 0:
+						{
+						   MyPrintf("TCP_CONNECT_TIMEOUT\n");
+						}
+						break;
+						case 1:
+						{
+							 MyPrintf("DNS_NO_ACK\n");
+						}
+						break;
+						case 2:
+						{
+							 MyPrintf("IP_ERROR \n");
+						}
+						break;
+						case 3:
+						{
+							 MyPrintf("DISCONNECT_TIMEOUT \n");
+						}
+						break;
+						
+						default:
+							MyPrintf("unknow  TCP_FAIL code:%d\n",tcp_connect_fail_reason[0]);
+							break;	
+					}
+					
+				}
+				if(bnep_status!=BNEP_STATUS_IDLE)
+				{
+					bnep_status=BNEP_STATUS_IDLE;
+					ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+					ST7789_TFT_ShowString(0, 152, 16*19, 16, "connect server fail", 32, 1, WHITE, OLIVE);
+					BT_disconnectBnep();
+				}
+			}
+		break;
+			
+		case TCP_CONNECT_LOG:
+			{
+				bnep_last_tick=SysTick_GetTick();
+				uint8_t i = 0;
+				uint8_t tcp_connect_Log[MAX_BLUETOOTH_DATA_LEN];
+				int Datalen=0;
+				Datalen=BT_ReadBTData(tcp_connect_Log);
+				if(Datalen>0)
+				{
+					switch(tcp_connect_Log[0])
+					{
+						case 1:
+						{
+						   MyPrintf("RECIEVE_DHCP_OFFER\n");
+						}
+						break;
+						case 3:
+						{
+							 MyPrintf("RECIEVE_DHCP_ACK\n");
+							 uint8_t tcp_ip_addr[7]={0x00,0x8b,0xe0,0x38,0x57,0x30,0x3a};//ip:139.224.56.87 port:12346
+							 MyPrintf("start connect:ip:139.224.56.87 port:12346\r\n");
+							 if(BT_ConnectTcp(tcp_ip_addr,sizeof(tcp_ip_addr))==TRUE)
+							 {
+									MyPrintf("Connect Tcp cmd ok\n");		
+							 }
+							 else 
+							 {
+									MyPrintf("Connect Tcp cmd fail\n");
+									ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+									ST7789_TFT_ShowString(0, 152, 16*19, 16, "Connect server fail", 32, 1, WHITE, OLIVE);
+									bnep_status=BNEP_STATUS_IDLE;
+									BT_disconnectBnep();
+							 }
+						}
+						break;
+						case 5:
+						{
+							 MyPrintf("RECIEVE_ARP_RESPONSE \n");
+						}
+						break;
+						case 7:
+						{
+							 MyPrintf("RECIEVE_DNS_RESPONSE \n");
+						}
+						break;
+						case 9:
+						{
+							 MyPrintf("RECIEVE_TCP_SYN_ACK \n");
+						}
+						break;
+						default:
+							break;	
+					}
+					
+				}
+			}
+		break;
+		
+		
+		case BT_DATA:
+			{
+				uint8_t i = 0;
+				uint8_t btData[MAX_BLUETOOTH_DATA_LEN];
+				int BtDataLen=0;
+				BtDataLen=BT_ReadBTData(btData);
+				if(BtDataLen>0)
+				{
+					MyPrintf("received %d bytes bt data:\n",BtDataLen);
+					for(int i=0;i<BtDataLen;i++)	MyPrintf("%02x ",btData[i]);
+					MyPrintf("\n");	
+
+					BT_SendSppData(btData,BtDataLen);
+					MyPrintf("send %d bytes bt data:\n",BtDataLen);
+					for(int i=0;i<BtDataLen;i++)	MyPrintf("%02x ",btData[i]);
+					MyPrintf("\n");	
+					#ifdef SPP_FLOWCONTROL
+					if(BT_SetSppFlowcontrol(1) != TRUE)	MyPrintf("set Flowcontrol failed\n");
+					#endif
+				}
+				else	MyPrintf("read bt data error\r\n");
+			}
+		break;
+			
+		case BLE_DATA:
+			{
+				uint8_t bleData[MAX_BLUETOOTH_DATA_LEN]={0};
+				int BleDataLen=0;
+				BleDataLen=BT_ReadBTData(bleData+2);
+				if(BleDataLen>0)
+				{
+					MyPrintf("received %d bytes ble data:\n",BleDataLen);
+					for(int i=0;i<BleDataLen;i++)	MyPrintf("%02x ",bleData[2+i]);
+					MyPrintf("\n");
+					
+					//add handle
+					bleData[0]=(ble_send_handle&0xff);
+					bleData[1]=((ble_send_handle>>8)&0xff);
+					BT_SendBleData(bleData,BleDataLen+2);
+					MyPrintf("send %d bytes ble data[%02x %02x]:\n",BleDataLen,bleData[0],bleData[1]);
+					for(int i=0;i<BleDataLen;i++)	MyPrintf("%02x ",bleData[2+i]);
+					MyPrintf("\n");
+				}
+				else	MyPrintf("read ble data error\r\n");
+			}
+		break;
+
+		case BT_CONNECTED:
+			MyPrintf("bt connected\n");
+			show_bt_status(TRUE);
+		break;
+			
+		case BLE_CONNECTED:
+			MyPrintf("ble connected\n");
+			show_bt_status(TRUE);
+		break;
+			
+		case BT_DISCONNECTED:
+			MyPrintf("bt disconnected\n");
+			show_bt_status(FALSE);
+		break;
+			
+		case BLE_DISCONNECTED:
+			MyPrintf("ble disconnected\n");
+			show_bt_status(FALSE);
+		break;
+		
+		case BNEP_CONNECT:
+			bnep_last_tick=SysTick_GetTick();
+			MyPrintf("bnep connected\n");
+			show_bt_status(TRUE);
+		break;
+		
+		case BB_DISCONNECT:
+			MyPrintf("bt baseband disconnected\n");
+			show_bt_status(FALSE);
+			if(bnep_status!=BNEP_STATUS_IDLE)
+			{
+				bnep_status=BNEP_STATUS_IDLE;
+				ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+				ST7789_TFT_ShowString(0, 152, 16*17, 16, "bnep disconnected", 32, 1, WHITE, OLIVE);
+			}
+		break;
+		
+		case TCP_CONNECT:
+			{
+				bnep_last_tick=SysTick_GetTick();
+				MyPrintf("tcp connected\n");
+				uint8_t connect_handle[MAX_BLUETOOTH_DATA_LEN];
+				int connectHandleLen=0;
+				connectHandleLen=BT_ReadBTData(connect_handle);
+				if(connectHandleLen>0)
+				{
+					MyPrintf("handle:%02x\n",connect_handle[0]);
+					bnep_status=BNEP_STATUS_CONNECTED;
+					ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+					ST7789_TFT_ShowString(0, 152, 16*16, 16, "connected server", 32, 1, WHITE, OLIVE);
+				}
+				else	
+				{
+					MyPrintf("read connect_handle error\r\n");
+				}
+			}
+		break;
+		
+		case TCP_DISCONNECT:
+			{
+				MyPrintf("tcp disconnected\n");
+				uint8_t disconnect_handle[MAX_BLUETOOTH_DATA_LEN];
+				int disconnectHandleLen=0;
+				disconnectHandleLen=BT_ReadBTData(NvramData);
+				if(disconnectHandleLen>0)
+				{
+					MyPrintf("handle:%02x\n",disconnect_handle[0]);
+					BT_disconnectBnep();
+				}
+				else	
+				{
+					MyPrintf("read disconnect_handle error\r\n");
+				}
+				if(bnep_status!=BNEP_STATUS_IDLE)
+				{
+					bnep_status=BNEP_STATUS_IDLE;
+					ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+					ST7789_TFT_ShowString(0, 152, 16*19, 16, "server disconnected", 32, 1, WHITE, OLIVE);
+					BT_disconnectBnep();
+				}
+			}
+		break;
+		
+		case BNEP_DISCONNECT:
+			if(bnep_status!=BNEP_STATUS_IDLE)
+			{
+				bnep_status=BNEP_STATUS_IDLE;
+				ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+				ST7789_TFT_ShowString(0, 152, 16*19, 16, "server disconnected", 32, 1, WHITE, OLIVE);
+			}
+			MyPrintf("bnep disconnected\n");
+			show_bt_status(FALSE);
+		break;
+		
+		case BNEP_CHIP_ERROR:
+			MyPrintf("bnep chip error\n");
+		break;
+
+		case NVRAM_DATA:
+			{
+				uint8_t NvramData[MAX_BLUETOOTH_DATA_LEN];
+				int NvramDataLen=0;
+				NvramDataLen=BT_ReadBTData(NvramData);
+				if(NvramDataLen>0)
+				{
+					MyPrintf("receive %dbytes Nvramdata:",NvramDataLen);
+					for(int i=0;i<NvramDataLen;i++)
+					{
+						MyPrintf("%02X ",NvramData[i]);
+					}
+					MyPrintf("\n");
+					MyPrintf("update new nvram to flash\r\n");
+					qspi_flash_sectorerase(IFLASH_NVRAM_ADDR);
+					qspi_flash_write(IFLASH_NVRAM_ADDR,NvramData,NVRAM_LEN);
+				}
+				else	
+					MyPrintf("read Nvram data error\r\n");
+			}
+		break;
+
+		case CONFIRM_GKEY:
+			{
+				uint8_t GkeyData[MAX_BLUETOOTH_DATA_LEN];
+				int GkeyDataLen=0;
+				GkeyDataLen=BT_ReadBTData(GkeyData);
+				if(GkeyDataLen>0)
+				{
+					MyPrintf("receive %dbytes CONFIRM_GKEY:",GkeyDataLen);
+					for(int i=0;i<GkeyDataLen;i++)
+					{
+						MyPrintf("%02X ",GkeyData[i]);
+					}
+					MyPrintf("\n");
+				}
+				else	MyPrintf("read CONFIRM_GKEY data error\r\n");
+			
+				if(BT_ConfirmGkey(0) == TRUE)//BT_ConfirmGkey参数为0则继续配对，1则取消配对。
+					MyPrintf("set confirmkey  success");
+				else
+					MyPrintf("set confirmkey  failed\n");
+		}
+		break;
+
+		case PASSKEY:
+			MyPrintf("request Passkey\r\n");
+		break;
+
+		case PAIRING_COMPLETED:
+			{
+				uint8_t PairingData[MAX_BLUETOOTH_DATA_LEN];
+				int PairingDataLen=0;
+				PairingDataLen=BT_ReadBTData(PairingData);
+				if(PairingDataLen>0)
+				{
+					MyPrintf("receive %dbytes paring data:",PairingDataLen);
+					for(int i=0;i<PairingDataLen;i++)
+					{
+						MyPrintf("%02X ",PairingData[i]);
+					}
+					MyPrintf("\n");
+				}
+				else	MyPrintf("read PAIRING_COMPLETED data error\r\n");
+			}
+		break;
+			
+		case PAIRING_STATE:
+			{
+				uint8_t PairingData[MAX_BLUETOOTH_DATA_LEN];
+				int PairingDataLen=0;
+				uint16_t pairing_status=0;
+				PairingDataLen=BT_ReadBTData(PairingData);
+				if(PairingDataLen==2)
+				{
+					pairing_status |=PairingData[0];
+					pairing_status |=(PairingData[1]<<8);
+					switch(pairing_status)
+					{
+						case 0x0001:
+							MyPrintf("BT Pairing Success\r\n");
+						break;
+						
+						case 0x0101:
+							MyPrintf("BT Pairing fail\r\n");
+						break;
+						
+						case 0x0080:
+							MyPrintf("BLE Pairing Success\r\n");
+						break;
+						
+						case 0x0180:
+							MyPrintf("BLE Pairing fail\r\n");
+						break;
+						
+						default:
+							MyPrintf("unknown pairing_status[%04x]\r\n",pairing_status);
+						break;
+					}
+				}
+				else	MyPrintf("read PAIRING_STATE data error\r\n");
+			}
+		break;
+			
+		case BT_NAME:
+			{
+				uint8_t btName[MAX_BLUETOOTH_DATA_LEN];
+				int btNameLen=0;
+				btNameLen=BT_ReadBTData(btName);
+				if(btNameLen>0)
+				{
+					//bt master name join
+					if((btName[NAME_OFFSET_INDEX]+MAX_SUBPACKAGE_NAME_LEN)<MAX_BT_MASTER_NAME_LEN)
+					{
+						memcpy(bt_master_name+btName[NAME_OFFSET_INDEX],btName+NAME_START_INDEX,MAX_SUBPACKAGE_NAME_LEN);
+						if((btName[NAME_OFFSET_INDEX]+MAX_SUBPACKAGE_NAME_LEN)>=btName[NAME_LEN_INDEX])
+						{
+							bt_master_name[btName[NAME_LEN_INDEX]]=0;
+							MyPrintf("receive bt master name:%s\n",bt_master_name);
+							MyPrintf("mac:");
+							for(int i=0;i<NAME_MAC_LEN;i++)	MyPrintf("%02x ",btName[NAME_MAC_INDEX+i]);
+							MyPrintf("\r\n");
+							MyPrintf("link key:");
+							for(int i=0;i<NAME_LINKKEY_LEN;i++)	MyPrintf("%02x ",btName[NAME_LINKKEY_INDEX+i]);
+							MyPrintf("\r\n");
+						}
+					}
+					else
+					{
+						bt_master_name[MAX_BT_MASTER_NAME_LEN-1]=0;
+						MyPrintf("bt master name len[%d]>MAX_BT_MASTER_NAME_LEN[%d]\r\n",btName[NAME_LEN_INDEX],MAX_BT_MASTER_NAME_LEN-1);
+						MyPrintf("receive bt master name:%s...\n",bt_master_name);
+						MyPrintf("mac:");
+						for(int i=0;i<NAME_MAC_LEN;i++)	MyPrintf("%02x ",btName[NAME_MAC_INDEX+i]);
+						MyPrintf("\r\n");
+						MyPrintf("link key:");
+						for(int i=0;i<NAME_LINKKEY_LEN;i++)	MyPrintf("%02x ",btName[NAME_LINKKEY_INDEX+i]);
+						MyPrintf("\r\n");
+					}
+				}
+				else	MyPrintf("read bt master name error\r\n");
+			}
+		break;
+			
+		case -1:
+			bt_progress_idle=TRUE;//no event
+		break;
+			
+		default:
+		{
+			MyPrintf("unknown event:%02x\r\n",eventCmd);
+			uint8_t unknownData[MAX_BLUETOOTH_DATA_LEN];
+			int unknownDataLen=0;
+			unknownDataLen=BT_ReadBTData(unknownData);
+			if(unknownDataLen>0)
+			{
+				MyPrintf("datalen:%d\r\n",unknownDataLen);
+				for(int i=0;i<unknownDataLen;i++)
+				{
+					MyPrintf("%02X ",unknownData[i]);
+				}
+				MyPrintf("\n");
+			}
+		}
+		break;
+	}
+	//load app timeout check
+	if(bnep_last_tick!=0)
+	{
+		if(SysTick_IsTimeOut(bnep_last_tick,BNEP_APP_LOAD_TIMEOUT))
+		{
+			if(bnep_status==BNEP_STATUS_CONNECTING)
+			{
+				bnep_status=BNEP_STATUS_IDLE;
+				MyPrintf("connect server timeout\r\n");
+				ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+				ST7789_TFT_ShowString(0, 152, 16*15, 16, "Connect timeout", 32, 1, WHITE, OLIVE);
+				BT_disconnectBnep();
+			}
+			else if(bnep_status==BNEP_STATUS_DOWNLOADING)
+			{
+				bnep_status=BNEP_STATUS_CONNECTED;
+				MyPrintf("download app timeout\r\n");
+				ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+				ST7789_TFT_ShowString(0, 152, 16*20, 16, "download app timeout", 32, 1, WHITE, OLIVE);
+			}
+		}
+	}
+	//update download progress
+	if(bnep_status==BNEP_STATUS_DOWNLOADING)
+	{
+		if(SysTick_IsTimeOut(download_progress_tick,5000)==TRUE)
+		{
+			download_progress_tick=SysTick_GetTick();
+			uint8_t strBuf[MAX_INT_STR_SIZE+2];
+			int strLen=int2str((app_total_received_len*100)/APP_TOTAL_DOWNLOAD_LEN,strBuf);
+			strBuf[strLen]='%';
+			strLen +=1;
+			strBuf[strLen]=0;
+			ST7789_TFT_Clear_White(16*14, 152, 320, 152+42);//清百分比
+			ST7789_TFT_ShowString(16*14, 152, 16*strLen, 16, strBuf, 32, 1, WHITE, OLIVE);
+		}
+	}
+}
+
+void show_bt_status(Boolean status)
+{
+	if(status==TRUE)
+	{
+		btStatus=TRUE;
+		ST7789_TFT_Picture_Q(80, 4, gImage_bt);
+	}
+	else
+	{
+		btStatus=FALSE;
+		ST7789_TFT_Clear_White(80, 4, 80+15, 4+19);
+	}
+}
 
 void Display_InterfaceWindow(void)
 {
@@ -43,6 +939,9 @@
     ST7789_TFT_ShowString(175, 111, 128, 16, "YC3121-E", 32, 1, WHITE, OLIVE);
     ST7789_TFT_Picture_Q(25, 80, gImage_Yichip);
     ST7789_TFT_ShowString(10, 160, 300, 12, "TUSN:00000302Q3NL01638914", 24, 1, WHITE, OLIVE);
+	ST7789_TFT_ShowString(10, 185, 300, 12, "bt name:", 24, 1, WHITE, OLIVE);
+	ST7789_TFT_ShowString(106, 185, 300, 12, bt_name, 24, 1, WHITE, OLIVE);
+	show_bt_status(FALSE);
     TFT_Power_scan();
     TFT_Single_scan();
 }
@@ -60,7 +959,7 @@
     ST7789_TFT_ShowChinese(155, 72, jiaoyichaxun_ch, 32, 5, 1, WHITE, OLIVE);
     ST7789_TFT_ShowChinese(5, 115, guanli_ch, 32, 4, 1, WHITE, OLIVE);
     ST7789_TFT_ShowChinese(155, 115, tupianceshi_ch, 32, 5, 1, WHITE, OLIVE);
-    ST7789_TFT_ShowChinese(5, 158, jiesuan_ch, 32, 4, 1, WHITE, OLIVE);
+    ST7789_TFT_ShowString(5, 158,  96,  16, "7.BNEP", 32, 1, WHITE, OLIVE);
     ST7789_TFT_ShowChinese(155, 158, TPTest_ch, 32, 5, 1, WHITE, OLIVE);
     ST7789_TFT_ShowChinese(5, 201, CARDTest_ch, 32, 5, 1, WHITE, OLIVE);
 }
@@ -675,6 +1574,166 @@
     TFT_Power_scan();
     TFT_Single_scan();
 }
+
+static void Display_bnepTest(void)
+{
+	uint8_t keyCode=0;
+	if (changeFlag == 0)
+	{
+		ST7789_TFT_Clear_White(0, 28, TFT_COL, TFT_ROW);
+		ST7789_TFT_ShowString(0, 30,  16*16,  16, "1.connect server", 32, 1, WHITE, OLIVE);
+		ST7789_TFT_ShowString(0, 72,  16*20,  16, "2.download 512k data", 32, 1, WHITE, OLIVE);
+		ST7789_TFT_ShowString(0, 114, 16*12, 16, "3.disconnect", 32, 1, WHITE, OLIVE);
+		changeFlag = 1;
+		KEY_Scan_check();
+	}
+	while (changeFlag)
+	{
+		keyCode=KEY_Scan();
+		switch(keyCode)
+		{
+			case KEY_CANCEL:
+				changeFlag=0;
+				break;
+			
+			case KEY_NUM_1://connect server
+				if(btStatus==FALSE)
+				{
+					if(bnep_status==BNEP_STATUS_IDLE)
+					{
+						uint8_t phone_mac_addr[22];
+						memset(phone_mac_addr,0,sizeof(phone_mac_addr));
+						if(BT_ConnectBnep( phone_mac_addr,sizeof(phone_mac_addr))==TRUE)
+						{
+							bnep_status=BNEP_STATUS_CONNECTING;
+							bnep_last_tick=SysTick_GetTick();
+							MyPrintf("Connect Bnep cmd ok\n");
+							ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+							ST7789_TFT_ShowString(0, 152, 16*13, 16, "Connecting...", 32, 1, WHITE, OLIVE);
+						}
+						else 
+						{
+							MyPrintf("Connect Bnep cmd fail\n"); 
+							ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+							ST7789_TFT_ShowString(0, 152, 16*16, 16, "Connect cmd fail", 32, 1, WHITE, OLIVE);
+						}
+					}
+					else
+					{
+						MyPrintf("bnep connected:bnep_status=%02x\r\n",bnep_status);
+						ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+						ST7789_TFT_ShowString(0, 152, 16*14, 16, "bnep connected", 32, 1, WHITE, OLIVE);
+					}
+				}
+				else
+				{
+					MyPrintf("bt/ble is connected\n"); 
+					ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+					ST7789_TFT_ShowString(0, 152, 16*19, 16, "bt/ble is connected", 32, 1, WHITE, OLIVE);
+				}
+				break;
+			
+			case KEY_NUM_2:
+				if(bnep_status==BNEP_STATUS_CONNECTED)
+				{
+					app_received_len=0;
+					app_total_received_len=0;
+					load_data_error=FALSE;
+					app_crc16=0xffff;
+					if(BT_BnepSendTcpData( download_cmd,sizeof(download_cmd))==TRUE)
+					{
+						bnep_last_tick=SysTick_GetTick();
+						MyPrintf("download cmd ok\n");
+						bnep_status=BNEP_STATUS_DOWNLOADING;
+						download_progress_tick=SysTick_GetTick();
+						ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+						ST7789_TFT_ShowString(0, 152, 16*14, 16, "downloading...", 32, 1, WHITE, OLIVE);
+					}
+					else 
+					{
+						MyPrintf("download cmd fail\n"); 
+						ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+						ST7789_TFT_ShowString(0, 152, 16*17, 16, "download cmd fail", 32, 1, WHITE, OLIVE);
+					}
+				}
+				else
+				{
+					if(bnep_status==BNEP_STATUS_DOWNLOADING)
+					{
+						MyPrintf("BNEP_STATUS_DOWNLOADING:bnep_status=%02x\r\n",bnep_status);
+						ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+						ST7789_TFT_ShowString(0, 152, 16*14, 16, "downloading...", 32, 1, WHITE, OLIVE);
+					}
+					else
+					{
+						MyPrintf("bnep not connect:bnep_status=%02x\r\n",bnep_status);
+						ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+						ST7789_TFT_ShowString(0, 152, 16*18, 16, "server not connect", 32, 1, WHITE, OLIVE);
+					}
+				}
+				break;
+			
+			case KEY_NUM_3:
+				if(bnep_status!=BNEP_STATUS_IDLE)
+				{
+					if(BT_disconnectBnep()==TRUE)
+					{
+						MyPrintf("disconnect cmd ok\n");
+						bnep_last_tick=SysTick_GetTick();
+						ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+						ST7789_TFT_ShowString(0, 152, 16*16, 16, "disconnecting...", 32, 1, WHITE, OLIVE);
+					}
+					else 
+					{
+						MyPrintf("disconnect cmd fail\n"); 
+						ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+						ST7789_TFT_ShowString(0, 152, 16*19, 16, "disconnect cmd fail", 32, 1, WHITE, OLIVE);
+					}
+				}
+				else
+				{
+					if(bnep_status==BNEP_STATUS_IDLE)
+					{
+						MyPrintf("bnep not connect:bnep_status=%02x\r\n",bnep_status);
+						ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+						ST7789_TFT_ShowString(0, 152, 16*18, 16, "server not connect", 32, 1, WHITE, OLIVE);
+					}
+					else
+					{
+						MyPrintf("connecting...:bnep_status=%02x\r\n",bnep_status);
+						ST7789_TFT_Clear_White(0, 152, 320, 152+84);//清两行
+						ST7789_TFT_ShowString(0, 152, 16*13, 16, "connecting...", 32, 1, WHITE, OLIVE);
+					}
+				}
+				break;
+				
+			default:
+				break;
+		}
+		do
+		{
+			bt_progress_idle=FALSE;
+			BT_Progress();
+		}
+		while(!bt_progress_idle);
+		if(keyCode!=0)
+		{
+			KEY_Scan_check();
+		}
+	}
+	MyPrintf("exit download test\r\n");
+	if(bnep_status!=BNEP_STATUS_IDLE)
+	{
+		BT_disconnectBnep();
+		while(btStatus);
+		bnep_status=BNEP_STATUS_IDLE;
+	}
+	meunState=0;
+	Display_InterfaceWindow();
+	TFT_Power_scan();
+	TFT_Single_scan();
+}
+
 /*************************************************QR_Code start*****************************************************************/
 #include "YC_QRDecode.h"
 #include "YC_QRDecode_TypeDef.h"
@@ -1171,6 +2230,10 @@
         meunState = 0;
         Display_picturetest();
         break;
+    case KEY_NUM_7:
+        meunState = 0;
+        Display_bnepTest();
+        break;
     case KEY_NUM_8:
         meunState = 0;
         Display_touch();
