Index: ota_ble.h
===================================================================
--- /YC3121_demo/ModuleDemo/updata_app/Boot/user/ota_ble.h	(revision 920)
+++ /YC3121_demo/ModuleDemo/updata_app/Boot/user/ota_ble.h	(working copy)
@@ -5,12 +5,12 @@
 #include "yc_encflash_bulk.h"
 #include "type.h"
 
-#define PORTOCOL_VERSION_REQUEST    0x10       //Э��汾��ȡ
-#define BUCK_SIZE_REQUEST           0x11       //��ȡBUCK_SIZE
-#define START_REQUEST               0x15       //��ʼ��������
-#define DATA_WRITE_CMD              0x16       //��ʼ������������
-#define DATA_WRITE_REQUEST          0x17       //��β������������
-#define END_REQUEST                 0x18       //��������
+#define PORTOCOL_VERSION_REQUEST    0x10      
+#define BUCK_SIZE_REQUEST           0x11      
+#define START_REQUEST               0x15      
+#define DATA_WRITE_CMD              0x16      
+#define DATA_WRITE_REQUEST          0x17      
+#define END_REQUEST                 0x18      
 
 #define RESULTTRUE                  0x00
 #define RESULTERROR                 0x01
@@ -34,10 +34,10 @@
 
 typedef struct
 {
-    uint16_t Buck_length;       //��ǰBuck����
-    int Sum_length;             //��ǰ�����ܳ���
-    int CheckSum;               //��ǰ���ݺ�
-    uint8_t  Back2AppFlag;      //�����ɹ���־
+    uint16_t Buck_length;      
+    int Sum_length;            
+    int CheckSum;              
+    uint8_t  Back2AppFlag;     
 }BleotadataStr;
 
 void BleInit(void);
Index: ota_ble.c
===================================================================
--- /YC3121_demo/ModuleDemo/updata_app/Boot/user/ota_ble.c	(revision 920)
+++ /YC3121_demo/ModuleDemo/updata_app/Boot/user/ota_ble.c	(working copy)
@@ -2,6 +2,9 @@
 #include "yc_bt.h"
 #include "yc_qspi.h"
 
+/* DEBUG LOG */
+//#define debug
+
 // 49535343-FE7d-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};
 
@@ -15,16 +18,13 @@
 uint8_t ble_Characteristic_uuid_flow_ctrl[] = {0x18,0x10,0x18,0x03,0xa6,0x28,0x5e,0xd8,0xec,0x91,0x1c,0x48,0xa3,0xac,0x43,0x53,0x53,0x49,0x01,0x00};
 
 uint16_t ble_send_handle = 0x2a;
+uint16_t ble_receive_handle = 0x2d;
 uint8_t bt_cod[3] = {0x24,0x04,0x04};
 
-
-
-
 volatile uint32_t CurOta2FlashSize = 0;
 volatile uint32_t CurBuck_length   = 0;
-volatile uint16_t PacketCurIndex   = 0;       //��ǰ���Ͱ����
-volatile uint16_t PacketLastIndex  = 0;       //�ж��Ƿ��ش�
-static   uint8_t  BUCK[BUCK_LEN]   = {0};       //��ŵ�ǰ�������������
+volatile uint16_t PacketCurIndex   = 0;     //Package number
+static   uint8_t  BUCK[BUCK_LEN]   = {0};   //APP data cache
 
 BleotadataStr BleotaDatacheck;
 
@@ -81,38 +81,38 @@
 	else
 		MyPrintf("SetBleAddr_fail\n");
 
-	if(BT_SetParingMode(0x03) == TRUE)//�������ģʽΪconfirmkey
+	if(BT_SetParingMode(0x03) == TRUE)
 		MyPrintf("set confirmkey mode success\n");
 	else
 		MyPrintf("set confirmkey mode failed\n");
 
-	if(BT_SetCOD(bt_cod) == TRUE) //����COD
+	if(BT_SetCOD(bt_cod) == TRUE)
 		MyPrintf("set COD sucess\n");
 	else
 		MyPrintf("set COD failed\n");
 
-	if(BT_DeleteService() == TRUE) //  ɾ���û��Զ������
+	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���豣��
+	if( temp_handle!= 0)
 		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)  //���ӷ�������  write���ص�handle��Ҫ���棬������ʹ��
+	if( ble_send_handle!= 0)
 		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)
-		MyPrintf("add Characteristic rx sucess;handle=%04x\n",temp_handle);
+	ble_receive_handle=BT_AddBleCharacteristic(ble_Characteristic_uuid_lsps_rx,sizeof(ble_Characteristic_uuid_lsps_rx));
+	if( ble_receive_handle!= 0)
+		MyPrintf("add Characteristic rx sucess;handle=%04x\n",ble_receive_handle);
 	else
-		MyPrintf("add Characteristic rx failed,return=%04x\n",temp_handle);
+		MyPrintf("add Characteristic rx failed,return=%04x\n",ble_receive_handle);
 
 	temp_handle=BT_AddBleCharacteristic(ble_Characteristic_uuid_flow_ctrl,sizeof(ble_Characteristic_uuid_flow_ctrl));
 	if( temp_handle!= 0)
@@ -120,9 +120,9 @@
 	else
 		MyPrintf("add Characteristic flow_ctrl failed,return=%04x\n",temp_handle);
 #if 0
-	if(BT_SetVisibility(0x01,0x01,0x01) == TRUE)  //����ble bt�ɷ���
+	if(BT_SetVisibility(0x01,0x01,0x01) == TRUE)
 #else
-    if(BT_SetVisibility(0x00,0x00,0x01) == TRUE)  //����Ble�ɷ���
+    if(BT_SetVisibility(0x00,0x00,0x01) == TRUE)
 #endif
         MyPrintf("SetVisibility sucess\n");
 	else
@@ -132,7 +132,7 @@
 }
 
 #define IFLASH_NVRAM_ADDR 0x1000000+((512-4)*1024)
-#define NVRAM_LEN 170//Nvram ����170bytes,ÿ��Nvram����Ϊ34bytes,���ɴ洢5�������Ϣ
+#define NVRAM_LEN 170
 
 static uint8_t bleData[MAX_BLUETOOTH_DATA_LEN]={0};
 volatile static int32_t BleDataLen = 0;
@@ -174,15 +174,7 @@
 		break;
 
 		case BLE_DATA:
-            BleDataLen=BT_ReadBTData(bleData+2); //Ble�յ������浽buff��
-            if(BleDataLen>0)
-            {
-                //add handle
-                bleData[0]=(ble_send_handle&0xff);
-                bleData[1]=((ble_send_handle>>8)&0xff);
-                BleDataLen += 2;
-            }
-            else	MyPrintf("read ble data error\r\n");
+            BleDataLen=BT_ReadBTData(bleData); 
 		break;
 
 		case BT_CONNECTED:
@@ -214,7 +206,7 @@
 						MyPrintf("%02X ",NvramData[i]);
 					}
 					MyPrintf("\n");
-					ReserveNV(NvramData);//�����µ�5���豸��Ϣ��NVRAM�� д��flash ,
+					ReserveNV(NvramData);
 				}
 				else
 					MyPrintf("read Nvram data error\r\n");
@@ -237,7 +229,7 @@
 				}
 				else	MyPrintf("read CONFIRM_GKEY data error\r\n");
 
-				if(BT_ConfirmGkey(0) == TRUE)//BT_ConfirmGkey����Ϊ0�������ԣ�1��ȡ����ԡ�
+				if(BT_ConfirmGkey(0) == TRUE)
 					MyPrintf("set confirmkey  success");
 				else
 					MyPrintf("set confirmkey  failed\n");
@@ -327,10 +319,10 @@
 	}
 }
 
-//#define debug
 void OtaData2FlashStart(void)
 {
-    enc_write_flash_bulk(APPWRITEADDR + CurOta2FlashSize, BUCK,BleotaDatacheck.Buck_length, 0);
+    enc_write_flash_bulk(APPWRITEADDR + CurOta2FlashSize, BUCK, BleotaDatacheck.Buck_length, 0);
+	
     CurOta2FlashSize += BleotaDatacheck.Buck_length;
     CurBuck_length = BleotaDatacheck.Buck_length;
 }
@@ -340,95 +332,168 @@
     enc_write_flash_bulk(APPWRITEADDR + CurOta2FlashSize-CurBuck_length, BUCK,CurBuck_length, 1);
 }
 
+uint8_t otaHead=0;
+uint8_t otaOpcode=0;
+uint8_t  blerecdatalen=0;
+uint8_t  otaReceivedLen=0;
+Boolean waitSubPacket=FALSE;
 void Ble_Cmd_check(void)
 {
     uint16_t version = 0;
     uint16_t packet_maxlen = PACKET_MAXLEN;
     uint16_t buck_len = BUCK_LEN;
-    uint8_t  blerecdatalen;
-    uint8_t  updateflashmode;       //����normal �̼�
+    uint8_t  updateflashmode;       //NORMALOTA
     uint32_t SumLength = 0;
     uint32_t CheckSum = 0;
-    BleDataPackStr Dataretpack;     //���巵�����ݰ�
-    uint8_t *data = bleData+4;
-    if(bleData[0] == (ble_send_handle&0xff) && bleData[1] == ((ble_send_handle>>8)&0xff))
+    BleDataPackStr Dataretpack;
+    uint8_t *data = bleData+2;
+
+    if(BleDataLen<2)
+	{
+		return;
+	}
+    BleDataLen -=2;//去除两字节handle
+    if(bleData[0] == (ble_receive_handle&0xff) && bleData[1] == ((ble_receive_handle>>8)&0xff))
     {
+        if(waitSubPacket==FALSE)
+		{
+			otaHead=data[0];
+			otaOpcode=data[1];
+		}
         Dataretpack.notifydata_1 = (ble_send_handle&0xff);
         Dataretpack.notifydata_2 = ((ble_send_handle>>8)&0xff);
         Dataretpack.Evt          = EVTRESPOND;
         Dataretpack.ResultCode   = RESULTTRUE;
-        Dataretpack.RcvFlag      = data[1];
-        if(data[0] == RECDATAPACKCMD)
+        Dataretpack.RcvFlag      = otaOpcode;
+        if(otaHead == RECDATAPACKCMD)
         {
-            switch (data[1])
+            switch (otaOpcode)
             {
-            case PORTOCOL_VERSION_REQUEST:
+            case PORTOCOL_VERSION_REQUEST:// 协议版本获取，获取当前设备支持的协议版本，用于 APP 端发送给设备端，让设备返回当前支持的 OTA 协议版本。该指令通常第一次收发使用。
                 version = BT_GetVersion();
                 Dataretpack.Payload[0] = version&0xff;
                 Dataretpack.Payload[1] = ((version>>8)&0xff);
                 BT_SendBleData((uint8_t *)&Dataretpack,7);
+                waitSubPacket=FALSE;
                 break;
-            case BUCK_SIZE_REQUEST:
+            case BUCK_SIZE_REQUEST:// BUCK Size 获取，用于获取当前设备支持的 BUCK 缓存区大小
                 memcpy(Dataretpack.Payload, &buck_len, 2);
                 memcpy(Dataretpack.Payload + 2, &packet_maxlen, 2);
                 BT_SendBleData((uint8_t *)&Dataretpack, 9);
+                waitSubPacket=FALSE;
                 break;
-            case START_REQUEST:
+            case START_REQUEST: // OTA 开始命令请求，用于请求开始 OTA 行为
                 updateflashmode = NORMALOTA;
                 Dataretpack.Payload[0] = updateflashmode;
                 BT_SendBleData((uint8_t *)&Dataretpack,6);
+                CurOta2FlashSize = 0;
+                CurBuck_length   = 0;
+                PacketCurIndex   = 0;     
+                BleotaDatacheck.Buck_length  = 0;
+                BleotaDatacheck.CheckSum     = 0;
+                BleotaDatacheck.Sum_length   = 0;
+                BleotaDatacheck.Back2AppFlag = 0;
+                waitSubPacket=FALSE;
                 break;
-            case DATA_WRITE_CMD:
-                PacketCurIndex = ((uint16_t)data[3]<<8|(uint16_t)data[2]);
-                blerecdatalen = data[4];
-                #ifdef debug
-                MyPrintf("PacketCurIndex = 0x%04x\n",PacketCurIndex);
-                MyPrintf("blerecdatalen = 0x%02x\n",blerecdatalen);
-                #endif
-                PacketLastIndex = PacketCurIndex-PacketLastIndex;
-                if(PacketLastIndex != 0x00 && PacketLastIndex != 0x01)
-                {
-                    BleotaDatacheck.Buck_length = 0x00;
-                    BleotaDatacheck.CheckSum    = 0x00;
-                    BleotaDatacheck.Sum_length  = 0x00;
-                }
-                PacketLastIndex = PacketCurIndex;
-                memcpy(BUCK + BleotaDatacheck.Buck_length, data + 5, blerecdatalen);
-                BleotaDatacheck.Buck_length += blerecdatalen;
-                for(uint8_t i = 0; i < blerecdatalen; i++)    //�ۼ����
-                {
-                    BleotaDatacheck.CheckSum += BUCK[BleotaDatacheck.Buck_length - blerecdatalen + i];
-                }
-                break;
+            case DATA_WRITE_CMD:// 数据发送请求，用于 APP 发送数据给设备端，该命令不要求对方回复
+                     if(waitSubPacket==FALSE)
+                     {
+                        otaHead=data[0];
+                        otaOpcode=data[1];
+                        PacketCurIndex = ((uint16_t)data[3]<<8|(uint16_t)data[2]);	// 包序号
+                        blerecdatalen  = data[4];	// 长度
+                        otaReceivedLen=BleDataLen-5;
+						#ifdef debug
+                        MyPrintf("PacketCurIndex=%d\r\n",PacketCurIndex);
+                        MyPrintf("otaReceivedLen=%d  blerecdatalen=%d\r\n",otaReceivedLen, blerecdatalen);
+                        #endif
+                        memcpy(BUCK + BleotaDatacheck.Buck_length, data + 5, otaReceivedLen);
+                        BleotaDatacheck.Buck_length += otaReceivedLen;
+                        for(uint8_t i = 0; i < blerecdatalen; i++)    //checksum
+                        {
+                            BleotaDatacheck.CheckSum += BUCK[BleotaDatacheck.Buck_length - blerecdatalen + i];
+                        }
+                        if(otaReceivedLen<blerecdatalen)
+                        {
+                           waitSubPacket=TRUE; 
+                        }
+                        
+                     }
+                     else
+                     {
+                        memcpy(BUCK + BleotaDatacheck.Buck_length, data, BleDataLen);
+                        BleotaDatacheck.Buck_length += BleDataLen;
+                        #ifdef debug
+                        MyPrintf("otaReceivedLen2=%d\r\n",otaReceivedLen);
+                        MyPrintf("BleDataLen2=%d\r\n",BleDataLen);
+                        #endif
+                        otaReceivedLen +=BleDataLen;
+                        #ifdef debug
+                        MyPrintf("otaReceivedLen3=%d\r\n",otaReceivedLen);
+                        #endif
+                        for(uint8_t i = 0; i < BleDataLen; i++)    //checksum
+                        {
+                            BleotaDatacheck.CheckSum += BUCK[BleotaDatacheck.Buck_length - BleDataLen + i];
+                        }
+                        if(otaReceivedLen>=blerecdatalen)
+                        {
+                           waitSubPacket=FALSE; 
+                        }
+                     }
+					 break;
             case DATA_WRITE_REQUEST:
-                PacketCurIndex = ((uint16_t)data[3]<<8|(uint16_t)data[2]);
-                blerecdatalen = data[4];
-                #ifdef debug
-                MyPrintf("PacketCurIndex = 0x%04x\n",PacketCurIndex);
-                MyPrintf("blerecdatalen = 0x%02x\n",blerecdatalen);
-                #endif
-                PacketLastIndex = PacketCurIndex-PacketLastIndex;
-                if(PacketLastIndex != 0x00 && PacketLastIndex != 0x01)
-                {
-                    BleotaDatacheck.Buck_length = 0x00;
-                    BleotaDatacheck.CheckSum    = 0x00;
-                    BleotaDatacheck.Sum_length  = 0x00;
-                }
-                PacketLastIndex = PacketCurIndex;
-                memcpy(BUCK + BleotaDatacheck.Buck_length, data + 5, blerecdatalen);
-                BleotaDatacheck.Buck_length += blerecdatalen;
-                BleotaDatacheck.Sum_length += BleotaDatacheck.Buck_length;
-                for(uint8_t i = 0; i < blerecdatalen; i++)    //�ۼ����
-                {
-                    BleotaDatacheck.CheckSum += BUCK[BleotaDatacheck.Buck_length - blerecdatalen + i];
-                }
-                /*���յ���BUCK���浽flash��*/
-                OtaData2FlashStart();
-                BleotaDatacheck.Buck_length = 0;
-                BT_SendBleData((uint8_t *)&Dataretpack, 5);
+                 if(waitSubPacket==FALSE)
+                 {
+                    otaHead=data[0];
+                    otaOpcode=data[1];
+                    PacketCurIndex = ((uint16_t)data[3]<<8|(uint16_t)data[2]);	// 包序号
+                    blerecdatalen  = data[4];	// 长度
+                    otaReceivedLen=BleDataLen-5;
+                    #ifdef debug
+                    MyPrintf("PacketCurIndex=%d\r\n",PacketCurIndex);
+                    MyPrintf("otaReceivedLen=%d  blerecdatalen=%d\r\n",otaReceivedLen, blerecdatalen);
+                    #endif
+                    memcpy(BUCK + BleotaDatacheck.Buck_length, data + 5, otaReceivedLen);
+                    BleotaDatacheck.Buck_length += otaReceivedLen;
+                    for(uint8_t i = 0; i < blerecdatalen; i++)    //checksum
+                    {
+                        BleotaDatacheck.CheckSum += BUCK[BleotaDatacheck.Buck_length - blerecdatalen + i];
+                    }
+                    if(otaReceivedLen<blerecdatalen)
+                    {
+                       waitSubPacket=TRUE; 
+                    }
+                 }
+                 else
+                 {
+                    memcpy(BUCK + BleotaDatacheck.Buck_length, data, BleDataLen);
+                    BleotaDatacheck.Buck_length += BleDataLen;
+                    #ifdef debug
+                    MyPrintf("otaReceivedLen2=%d\r\n",otaReceivedLen);
+                    MyPrintf("BleDataLen2=%d\r\n",BleDataLen);
+                    #endif
+                    otaReceivedLen +=BleDataLen;
+                    #ifdef debug
+                    MyPrintf("otaReceivedLen3=%d\r\n",otaReceivedLen);
+                    #endif
+                    for(uint8_t i = 0; i < BleDataLen; i++)    //checksum
+                    {
+                        BleotaDatacheck.CheckSum += BUCK[BleotaDatacheck.Buck_length - BleDataLen + i];
+                    }
+                    if(otaReceivedLen>=blerecdatalen)
+                    {
+                       waitSubPacket=FALSE; 
+                    }
+                 }
+                 if(waitSubPacket==FALSE)
+                 {
+                     BleotaDatacheck.Sum_length += BleotaDatacheck.Buck_length;
+                     OtaData2FlashStart();
+                     BleotaDatacheck.Buck_length = 0;
+                     BT_SendBleData((uint8_t *)&Dataretpack, 5);
+                 }
                 break;
-            case END_REQUEST:
-                /*���һ��BUCK����д��*/
+            case END_REQUEST:// 结束请求，每个固件升级完毕后，需要发送给对端
                 OtaData2FlashEnd();
                 Dataretpack.Payload[0] = NORMALOTA;
                 SumLength = ((uint32_t)data[3]|(uint32_t)data[4]<<8|(uint32_t)data[5]<<16|(uint32_t)data[6]<<24);
@@ -452,8 +517,8 @@
                 break;
             }
         }
-        /*�������buf*/
-        memset(bleData,0,255);
+		memset(bleData,0,255);
+        BleDataLen=0;
     }
 }
 
Index: otausb.c
===================================================================
--- /YC3121_demo/ModuleDemo/updata_app/Boot/user/otausb.c	(revision 920)
+++ /YC3121_demo/ModuleDemo/updata_app/Boot/user/otausb.c	(working copy)
@@ -10,7 +10,6 @@
 uint8_t  rev_data[64];
 uint8_t  rev_data[64], tx_buffer[64];
 uint8_t  tx_buffer_flash[8192];
-uint8_t  rx_buffer_flash[8192];
 uint8_t  send_data_flag;
 uint8_t  rx_buffer[100] = {0};
 uint8_t  tx_buffer_boot[32] = {0};
