Quellcode durchsuchen

Merge branch 'master' of http://jiecheng2024.tpddns.cn:3000/liyuezong/SmartPDCode

guohui vor 1 Jahr
Ursprung
Commit
1a5505daaf

+ 14 - 14
control/bootloader/app_demo/Modbus/BARE/port/port.c

@@ -179,25 +179,25 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 							usNRegs--;
 						}
 						{
-						if((usAddress >= AC3PPDU_ViLit_max_Addr)&&(usAddress <= AC3PPDU_BREAK_UPGRADE))
-						{
-							
+							if((usAddress >= AC3PPDU_ViLit_max_Addr)&&(usAddress <= AC3PPDU_BREAK_UPGRADE))
 							{
-								T_cnt = usAddress - AC3PPDU_Modbus_RegStAd;
-								memcpy((Modbus_Wr_buff[cmd_cnt]+2),&usRegHoldBuf[WiRegIndex],WusNRegs * 2);
-								Modbus_Wr_buff[cmd_cnt][0] = 1;
-								Modbus_Wr_buff[cmd_cnt][1] = T_cnt;
 								
-								cmd_cnt++;
-								if(cmd_cnt >= Mb_Wcmd_Width)
 								{
-									cmd_cnt = 0;
+									T_cnt = usAddress - AC3PPDU_Modbus_RegStAd;
+									memcpy((Modbus_Wr_buff[cmd_cnt]+2),&usRegHoldBuf[WiRegIndex],WusNRegs * 2);
+									Modbus_Wr_buff[cmd_cnt][0] = 1;
+									Modbus_Wr_buff[cmd_cnt][1] = T_cnt;
+									
+									cmd_cnt++;
+									if(cmd_cnt >= Mb_Wcmd_Width)
+									{
+										cmd_cnt = 0;
+									}
 								}
+							}else
+							{
+								eStatus = MB_ENOREG;
 							}
-						}else
-						{
-							eStatus = MB_ENOREG;
-						}
 
 						}
 						break;

Datei-Diff unterdrückt, da er zu groß ist
+ 216 - 216
control/bootloader/app_demo/USER/bootloader.uvguix.Gowon


+ 13 - 1
control/bootloader/app_demo/USER/cfg.h

@@ -19,7 +19,7 @@
 #define PROGRAME_APP2											((uint32_t)(0x08011C00))					//App2 Rom Start addr
 #define PROGRAME_APP2_SIZE								(50*1024)													//App2 programe Max size
 
-#define VERSION                          		"V1.0.0.0"
+#define VERSION                          		"V1.0.0.1"
 
 #define MODBUS_HEAD                        	"GOWONE_UPGRADE"
 
@@ -44,6 +44,14 @@
 #define APP2_ROM_ADDR											 (META_DATA + 44)
 #define APP2_PARTATION										 (META_DATA + 48)
 
+#define APP1_MD5													 (META_DATA + 52)
+#define APP2_MD5 													 (META_DATA + 84)
+
+#define APP1_SIZE                           (META_DATA + 116)
+#define APP2_SIZE                           (META_DATA + 120)
+
+
+#define MD5_LENTH       										8
 
 #define UNIQU_1                       			0x1FFFF7AC
 #define UNIQU_2                       			0x1FFFF7B0
@@ -64,6 +72,10 @@ typedef struct {
 	uint32_t app2_version;							// V1.0.0.0   (1<<24 | 0 << 16 | 0 << 8 | 0)
 	uint32_t app2_rom_addr;							// PROGRAME_APP2 0x0800A400
 	uint32_t app2_partition;						// 2
+	uint32_t app1_md5[8];								// app1 md5 value
+	uint32_t app2_md5[8];								// app2 md5 value
+	uint32_t app1_size;
+	uint32_t app2_size;
 }META_DATA_S;
 
 typedef struct {

+ 18 - 0
control/bootloader/app_demo/USER/main.c

@@ -139,6 +139,24 @@ void get_meta_data_from_flash(META_DATA_S *meta)
 	meta->app2_version 							= *(uint32_t*)(APP2_VERSION);
 	meta->app2_rom_addr 						= *(uint32_t*)(APP2_ROM_ADDR);
 	meta->app2_partition 						= *(uint32_t*)(APP2_PARTATION);
+	uint32_t buff[MD5_LENTH] = {0};
+		uint32_t addr = APP1_MD5;
+		for(int i = 0;i < MD5_LENTH;i++)
+		{
+			buff[i] =  *(uint32_t*)(addr);
+			addr += 4;
+		}
+		memcpy(&meta->app1_md5[0],buff,sizeof(uint32_t) *MD5_LENTH);
+		
+		addr = APP2_MD5;
+		for(int i = 0;i < MD5_LENTH;i++)
+		{
+			buff[i] =  *(uint32_t*)(addr);
+			addr += 4;
+		}
+		memcpy(&meta->app2_md5[0],buff,sizeof(uint32_t) *MD5_LENTH);
+		meta->app1_size = *(uint32_t*)(APP1_SIZE);
+		meta->app2_size = *(uint32_t*)(APP2_SIZE);
 }
 void flash_get_infomation(information_t *info)
 {

+ 1 - 1
control/bootloader/boot/HARDWARE/Led/Led.c

@@ -113,7 +113,7 @@ void LEDFlicker1(unsigned short cnt)
 void LEDFlicker2(void)
 {
 	//USER_LED״̬ȡ·´£¬ÊµÏÖUSER_LEDÉÁ˸
-//	gpio_bit_toggle(USR_LED_IO, USR_LED);
+	gpio_bit_toggle(USR_LED_IO, USR_LED);
 //	delay_ms(100);
 //	gpio_bit_toggle(USR_LED_IO, USR_LED);
 //	delay_ms(100);

+ 192 - 0
control/bootloader/boot/HARDWARE/Md5/md5.c

@@ -0,0 +1,192 @@
+#include <string.h>
+#include "md5.h"  
+  
+uint8_t PADDING[]={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  
+  
+void md5_init(md5_ctx_t *ctx)
+{  
+    ctx->count[0] = 0;
+    ctx->count[1] = 0;
+    ctx->state[0] = 0x67452301;
+    ctx->state[1] = 0xEFCDAB89;
+    ctx->state[2] = 0x98BADCFE;
+    ctx->state[3] = 0x10325476;
+}  
+void md5_update(md5_ctx_t* ctx, uint8_t *input,uint32_t inputlen)
+{  
+    uint32_t i = 0,index = 0,partlen = 0;  
+    index = (ctx->count[0] >> 3) & 0x3F;
+    partlen = 64 - index;  
+    ctx->count[0] += inputlen << 3;
+    if(ctx->count[0] < (inputlen << 3))
+        ctx->count[1]++;
+    ctx->count[1] += inputlen >> 29;
+  
+    if(inputlen >= partlen)  
+    {  
+        memcpy(&ctx->buffer[index],input,partlen);
+        md5_transform(ctx->state, ctx->buffer);
+        for(i = partlen;i+64 <= inputlen;i+=64)  
+            md5_transform(ctx->state,&input[i]);
+        index = 0;          
+    }    
+    else  
+    {  
+        i = 0;  
+    }  
+    memcpy(&ctx->buffer[index],&input[i],inputlen-i);
+}  
+void md5_final(md5_ctx_t* ctx,uint8_t digest[16])
+{  
+    uint32_t index = 0,padlen = 0;  
+    uint8_t bits[8];  
+    index = (ctx->count[0] >> 3) & 0x3F;
+    padlen = (index < 56)?(56-index):(120-index);  
+    md5_encode(bits, ctx->count,8);
+    md5_update(ctx,PADDING,padlen);
+    md5_update(ctx,bits,8);
+    md5_encode(digest, ctx->state,16);
+}  
+void md5_encode(uint8_t *output,uint32_t *input,uint32_t len)  
+{  
+    uint32_t i = 0,j = 0;  
+    while(j < len)  
+    {  
+        output[j] = input[i] & 0xFF;    
+        output[j+1] = (input[i] >> 8) & 0xFF;  
+        output[j+2] = (input[i] >> 16) & 0xFF;  
+        output[j+3] = (input[i] >> 24) & 0xFF;  
+        i++;  
+        j+=4;  
+    }  
+}  
+void md5_decode(uint32_t *output,uint8_t *input,uint32_t len)  
+{  
+    uint32_t i = 0,j = 0;  
+    while(j < len)  
+    {  
+        output[i] = (input[j]) |  
+            (input[j+1] << 8) |  
+            (input[j+2] << 16) |  
+            (input[j+3] << 24);  
+        i++;  
+        j+=4;   
+    }  
+}  
+void md5_transform(uint32_t state[4],uint8_t block[64])  
+{  
+    uint32_t a = state[0];  
+    uint32_t b = state[1];  
+    uint32_t c = state[2];  
+    uint32_t d = state[3];  
+    uint32_t x[64];  
+    md5_decode(x,block,64);  
+    FF(a, b, c, d, x[ 0], 7, 0xd76aa478);   
+    FF(d, a, b, c, x[ 1], 12, 0xe8c7b756);   
+    FF(c, d, a, b, x[ 2], 17, 0x242070db);   
+    FF(b, c, d, a, x[ 3], 22, 0xc1bdceee);   
+    FF(a, b, c, d, x[ 4], 7, 0xf57c0faf);   
+    FF(d, a, b, c, x[ 5], 12, 0x4787c62a);   
+    FF(c, d, a, b, x[ 6], 17, 0xa8304613);   
+    FF(b, c, d, a, x[ 7], 22, 0xfd469501);   
+    FF(a, b, c, d, x[ 8], 7, 0x698098d8);   
+    FF(d, a, b, c, x[ 9], 12, 0x8b44f7af);   
+    FF(c, d, a, b, x[10], 17, 0xffff5bb1);   
+    FF(b, c, d, a, x[11], 22, 0x895cd7be);   
+    FF(a, b, c, d, x[12], 7, 0x6b901122);   
+    FF(d, a, b, c, x[13], 12, 0xfd987193);   
+    FF(c, d, a, b, x[14], 17, 0xa679438e);   
+    FF(b, c, d, a, x[15], 22, 0x49b40821);   
+  
+      
+    GG(a, b, c, d, x[ 1], 5, 0xf61e2562);   
+    GG(d, a, b, c, x[ 6], 9, 0xc040b340);   
+    GG(c, d, a, b, x[11], 14, 0x265e5a51);   
+    GG(b, c, d, a, x[ 0], 20, 0xe9b6c7aa);   
+    GG(a, b, c, d, x[ 5], 5, 0xd62f105d);   
+    GG(d, a, b, c, x[10], 9,  0x2441453);   
+    GG(c, d, a, b, x[15], 14, 0xd8a1e681);   
+    GG(b, c, d, a, x[ 4], 20, 0xe7d3fbc8);   
+    GG(a, b, c, d, x[ 9], 5, 0x21e1cde6);   
+    GG(d, a, b, c, x[14], 9, 0xc33707d6);   
+    GG(c, d, a, b, x[ 3], 14, 0xf4d50d87);   
+    GG(b, c, d, a, x[ 8], 20, 0x455a14ed);   
+    GG(a, b, c, d, x[13], 5, 0xa9e3e905);   
+    GG(d, a, b, c, x[ 2], 9, 0xfcefa3f8);   
+    GG(c, d, a, b, x[ 7], 14, 0x676f02d9);   
+    GG(b, c, d, a, x[12], 20, 0x8d2a4c8a);   
+  
+      
+    HH(a, b, c, d, x[ 5], 4, 0xfffa3942);   
+    HH(d, a, b, c, x[ 8], 11, 0x8771f681);   
+    HH(c, d, a, b, x[11], 16, 0x6d9d6122);   
+    HH(b, c, d, a, x[14], 23, 0xfde5380c);   
+    HH(a, b, c, d, x[ 1], 4, 0xa4beea44);   
+    HH(d, a, b, c, x[ 4], 11, 0x4bdecfa9);   
+    HH(c, d, a, b, x[ 7], 16, 0xf6bb4b60);   
+    HH(b, c, d, a, x[10], 23, 0xbebfbc70);   
+    HH(a, b, c, d, x[13], 4, 0x289b7ec6);   
+    HH(d, a, b, c, x[ 0], 11, 0xeaa127fa);   
+    HH(c, d, a, b, x[ 3], 16, 0xd4ef3085);   
+    HH(b, c, d, a, x[ 6], 23,  0x4881d05);   
+    HH(a, b, c, d, x[ 9], 4, 0xd9d4d039);   
+    HH(d, a, b, c, x[12], 11, 0xe6db99e5);   
+    HH(c, d, a, b, x[15], 16, 0x1fa27cf8);   
+    HH(b, c, d, a, x[ 2], 23, 0xc4ac5665);   
+  
+      
+    II(a, b, c, d, x[ 0], 6, 0xf4292244);   
+    II(d, a, b, c, x[ 7], 10, 0x432aff97);   
+    II(c, d, a, b, x[14], 15, 0xab9423a7);   
+    II(b, c, d, a, x[ 5], 21, 0xfc93a039);   
+    II(a, b, c, d, x[12], 6, 0x655b59c3);   
+    II(d, a, b, c, x[ 3], 10, 0x8f0ccc92);   
+    II(c, d, a, b, x[10], 15, 0xffeff47d);   
+    II(b, c, d, a, x[ 1], 21, 0x85845dd1);   
+    II(a, b, c, d, x[ 8], 6, 0x6fa87e4f);   
+    II(d, a, b, c, x[15], 10, 0xfe2ce6e0);   
+    II(c, d, a, b, x[ 6], 15, 0xa3014314);   
+    II(b, c, d, a, x[13], 21, 0x4e0811a1);   
+    II(a, b, c, d, x[ 4], 6, 0xf7537e82);   
+    II(d, a, b, c, x[11], 10, 0xbd3af235);   
+    II(c, d, a, b, x[ 2], 15, 0x2ad7d2bb);   
+    II(b, c, d, a, x[ 9], 21, 0xeb86d391);   
+    state[0] += a;  
+    state[1] += b;  
+    state[2] += c;  
+    state[3] += d;  
+}
+
+#define CHAR(b) (b<=9)?(b+0x30):(b-10+0x61);
+static void byte2char(char *chr, uint8_t b)
+{
+    char h,l;
+    
+    l = b&0x0f;
+    h = (b>>4)&0x0f;
+    
+    chr[0] = CHAR(h);
+    chr[1] = CHAR(l);
+}
+
+int md5_calc(void *p1, int len1, void *p2, int len2, char *md5)
+{
+    int i;
+    uint8_t tmp[16];
+    md5_ctx_t ctx;
+    
+    md5_init(&ctx);
+    md5_update(&ctx, (uint8_t*)p1, len1);
+    md5_update(&ctx, (uint8_t*)p2, len2);
+    md5_final(&ctx, tmp);
+    
+    for (i=0; i<16; i++) {
+        byte2char(&md5[i*2], tmp[i]);
+    }
+    
+    return 0;
+}
+

+ 68 - 0
control/bootloader/boot/HARDWARE/Md5/md5.h

@@ -0,0 +1,68 @@
+#ifndef MD5_H  
+#define MD5_H  
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef struct
+{
+	uint32_t count[2];
+	uint32_t state[4];
+	uint8_t buffer[64];
+}md5_ctx_t;
+
+
+#define F(x,y,z) ((x & y) | (~x & z))  
+#define G(x,y,z) ((x & z) | (y & ~z))  
+#define H(x,y,z) (x^y^z)  
+#define I(x,y,z) (y ^ (x | ~z))  
+#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))  
+
+#define FF(a,b,c,d,x,s,ac) \
+	{ \
+		a += F(b, c, d) + x + ac; \
+		a = ROTATE_LEFT(a, s); \
+		a += b; \
+	}
+
+#define GG(a,b,c,d,x,s,ac) \
+	{ \
+		a += G(b, c, d) + x + ac; \
+		a = ROTATE_LEFT(a, s); \
+		a += b; \
+	}
+
+#define HH(a,b,c,d,x,s,ac) \
+	{ \
+		a += H(b, c, d) + x + ac; \
+		a = ROTATE_LEFT(a, s); \
+		a += b; \
+	}
+
+#define II(a,b,c,d,x,s,ac) \
+	{ \
+		a += I(b, c, d) + x + ac; \
+		a = ROTATE_LEFT(a, s); \
+		a += b; \
+	}
+
+void md5_init(md5_ctx_t* context);
+void md5_update(md5_ctx_t* context, uint8_t* input, uint32_t inputlen);
+void md5_final(md5_ctx_t* context, uint8_t digest[16]);
+void md5_transform(uint32_t state[4], uint8_t block[64]);
+void md5_encode(uint8_t* output, uint32_t* input, uint32_t len);
+void md5_decode(uint32_t* output, uint8_t* input, uint32_t len);
+
+int md5_calc(void* p1, int len1, void* p2, int len2, char* md5);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#endif  

+ 4 - 3
control/bootloader/boot/HARDWARE/Timer/Timer.c

@@ -77,22 +77,23 @@ void delete_Timer14()
 
 
 extern uint8_t flash_flag;
-
-
+extern uint8_t upgrade_count;
 void TIMER14_IRQHandler(void)
 {
 	static uint16_t int_cnt = 0;
+	static uint16_t reboot_cnt = 0;
 	if(timer_interrupt_flag_get(TIMER14, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
 	{
 		timer_interrupt_flag_clear(TIMER14, TIMER_INT_FLAG_UP);       //清除定时器更新中断标志
 	}
-	if(int_cnt == 5)
+	if(int_cnt == 3)
 	{
 		flash_flag = 1;
 		Upgrade *up = get_upgrade();
 		up->led_flash_flag = 1;
 		int_cnt = 0;
 	}
+	upgrade_count++;
 	int_cnt ++;
 }
 

Datei-Diff unterdrückt, da er zu groß ist
+ 125 - 350
control/bootloader/boot/USER/bootloader.uvguix.Gowon


+ 45 - 144
control/bootloader/boot/USER/bootloader.uvoptx

@@ -148,134 +148,11 @@
           <Name></Name>
         </SetRegEntry>
       </TargetDriverDllRegistry>
-      <Breakpoint>
-        <Bp>
-          <Number>0</Number>
-          <Type>0</Type>
-          <LineNumber>227</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>0</Address>
-          <ByteObject>0</ByteObject>
-          <HtxType>0</HtxType>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>0</BreakIfRCount>
-          <Filename>.\main.c</Filename>
-          <ExecCommand></ExecCommand>
-          <Expression></Expression>
-        </Bp>
-        <Bp>
-          <Number>1</Number>
-          <Type>0</Type>
-          <LineNumber>226</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>134218142</Address>
-          <ByteObject>0</ByteObject>
-          <HtxType>0</HtxType>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>1</BreakIfRCount>
-          <Filename>.\startup_gd32e23x.s</Filename>
-          <ExecCommand></ExecCommand>
-          <Expression>\\bootloader\startup_gd32e23x.s\226</Expression>
-        </Bp>
-        <Bp>
-          <Number>2</Number>
-          <Type>0</Type>
-          <LineNumber>227</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>0</Address>
-          <ByteObject>0</ByteObject>
-          <HtxType>0</HtxType>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>0</BreakIfRCount>
-          <Filename>.\startup_gd32e23x.s</Filename>
-          <ExecCommand></ExecCommand>
-          <Expression></Expression>
-        </Bp>
-        <Bp>
-          <Number>3</Number>
-          <Type>0</Type>
-          <LineNumber>227</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>0</Address>
-          <ByteObject>0</ByteObject>
-          <HtxType>0</HtxType>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>0</BreakIfRCount>
-          <Filename>.\system_gd32e23x.c</Filename>
-          <ExecCommand></ExecCommand>
-          <Expression></Expression>
-        </Bp>
-        <Bp>
-          <Number>4</Number>
-          <Type>0</Type>
-          <LineNumber>262</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>0</Address>
-          <ByteObject>0</ByteObject>
-          <HtxType>0</HtxType>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>0</BreakIfRCount>
-          <Filename>.\system_gd32e23x.c</Filename>
-          <ExecCommand></ExecCommand>
-          <Expression></Expression>
-        </Bp>
-        <Bp>
-          <Number>5</Number>
-          <Type>0</Type>
-          <LineNumber>263</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>0</Address>
-          <ByteObject>0</ByteObject>
-          <HtxType>0</HtxType>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>0</BreakIfRCount>
-          <Filename>.\system_gd32e23x.c</Filename>
-          <ExecCommand></ExecCommand>
-          <Expression></Expression>
-        </Bp>
-        <Bp>
-          <Number>6</Number>
-          <Type>0</Type>
-          <LineNumber>270</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>0</Address>
-          <ByteObject>0</ByteObject>
-          <HtxType>0</HtxType>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>0</BreakIfRCount>
-          <Filename>.\system_gd32e23x.c</Filename>
-          <ExecCommand></ExecCommand>
-          <Expression></Expression>
-        </Bp>
-      </Breakpoint>
+      <Breakpoint/>
       <WatchWindow1>
         <Ww>
           <count>0</count>
           <WinNumber>1</WinNumber>
-          <ItemText>head_buffer</ItemText>
-        </Ww>
-        <Ww>
-          <count>1</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>upgrade</ItemText>
-        </Ww>
-        <Ww>
-          <count>2</count>
-          <WinNumber>1</WinNumber>
           <ItemText>meta_data</ItemText>
         </Ww>
       </WatchWindow1>
@@ -502,6 +379,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>14</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\gd32e23x_it.c</PathWithFileName>
+      <FilenameWithoutPath>gd32e23x_it.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -512,7 +401,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <FileNumber>15</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -524,7 +413,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -536,7 +425,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -548,7 +437,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -560,7 +449,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -572,7 +461,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -584,7 +473,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -596,7 +485,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -608,7 +497,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -620,7 +509,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -632,7 +521,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -644,7 +533,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -656,7 +545,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -668,7 +557,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -680,7 +569,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -692,7 +581,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -712,7 +601,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -724,7 +613,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -736,7 +625,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -748,7 +637,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -758,6 +647,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>35</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\HARDWARE\Md5\md5.c</PathWithFileName>
+      <FilenameWithoutPath>md5.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>

+ 13 - 3
control/bootloader/boot/USER/bootloader.uvprojx

@@ -53,7 +53,7 @@
           <CreateExecutable>1</CreateExecutable>
           <CreateLib>0</CreateLib>
           <CreateHexFile>1</CreateHexFile>
-          <DebugInformation>1</DebugInformation>
+          <DebugInformation>0</DebugInformation>
           <BrowseInformation>1</BrowseInformation>
           <ListingPath>.\Listings\</ListingPath>
           <HexFormatSelection>1</HexFormatSelection>
@@ -313,7 +313,7 @@
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
-            <Optim>0</Optim>
+            <Optim>2</Optim>
             <oTime>0</oTime>
             <SplitLS>0</SplitLS>
             <OneElfS>1</OneElfS>
@@ -339,7 +339,7 @@
               <MiscControls></MiscControls>
               <Define>GD32E235</Define>
               <Undefine></Undefine>
-              <IncludePath>..\CORE\Include;..\CORE\Source\ARM;..\GD32_FW\Include;..\HARDWARE\Fwdgt;..\HARDWARE\Key;..\HARDWARE\Led;..\HARDWARE\Timer;..\Modbus\ascii;..\Modbus\BARE\port;..\Modbus\include;..\Modbus\rtu;..\Modbus\tcp;..\USER;..\HARDWARE\Timer;..\HARDWARE\Flash</IncludePath>
+              <IncludePath>..\CORE\Include;..\CORE\Source\ARM;..\GD32_FW\Include;..\HARDWARE\Fwdgt;..\HARDWARE\Key;..\HARDWARE\Led;..\HARDWARE\Timer;..\Modbus\ascii;..\Modbus\BARE\port;..\Modbus\include;..\Modbus\rtu;..\Modbus\tcp;..\USER;..\HARDWARE\Timer;..\HARDWARE\Flash;..\HARDWARE\Md5</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -458,6 +458,11 @@
               <FileType>1</FileType>
               <FilePath>.\main.c</FilePath>
             </File>
+            <File>
+              <FileName>gd32e23x_it.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\gd32e23x_it.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
@@ -568,6 +573,11 @@
               <FileType>1</FileType>
               <FilePath>..\HARDWARE\Timer\Timer.c</FilePath>
             </File>
+            <File>
+              <FileName>md5.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\HARDWARE\Md5\md5.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

+ 10 - 0
control/bootloader/boot/USER/cfg.h

@@ -46,6 +46,12 @@
 #define APP2_ROM_ADDR											 (META_DATA + 44)
 #define APP2_PARTATION										 (META_DATA + 48)
 
+#define APP1_MD5													 (META_DATA + 52)
+#define APP2_MD5 													 (META_DATA + 84)
+
+#define APP1_SIZE                           (META_DATA + 116)
+#define APP2_SIZE                           (META_DATA + 120)
+
 
 
 #define UNIQU_1                       			0x1FFFF7AC
@@ -67,6 +73,10 @@ typedef struct {
 	uint32_t app2_version;							// V1.0.0.0   (1<<24 | 0 << 16 | 0 << 8 | 0)
 	uint32_t app2_rom_addr;							// PROGRAME_APP2 0x0800A400
 	uint32_t app2_partition;						// 2
+	uint32_t app1_md5[8];								// app1 md5 value
+	uint32_t app2_md5[8];								// app2 md5 value
+	uint32_t app1_size;
+	uint32_t app2_size;
 }META_DATA_S;
 
 

+ 223 - 39
control/bootloader/boot/USER/main.c

@@ -11,6 +11,10 @@
 #include "gd32e230x_conf.h"
 #include "string.h"
 #include "Timer.h"
+#include "md5.h"
+
+
+#define MD5_LENTH       8
 
 //#define USR_LED_RCU RCU_GPIOB
 //#define USR_LED_IO GPIOB
@@ -35,6 +39,7 @@ uint16_t CurrentAddr = 0;
 uint32_t operation_cmd_cnt = 0;
 
 uint8_t flash_flag = 0;
+uint8_t reboot_flag = 0;
 
 
 MD_DATA Md_Data[Mb_Wcmd_Width] = {0};
@@ -47,6 +52,9 @@ g_MD_Data g_md_data={
 	.data = {0},
 };
 
+uint8_t md5_head[128] = {0};
+uint32_t md5_sum[MD5_LENTH] = {0};
+
 
 g_MD_Data* get_md_data()
 {
@@ -70,7 +78,7 @@ void flash_write_meta(META_DATA_S *meta_data)
 	uint32_t address = META_DATA;
 	uint32_t *data = (uint32_t*)(meta_data);
 	uint32_t data0 = 0;
-	for(int i = 0; i < sizeof(META_DATA_S);i++)
+	for(int i = 0; i < sizeof(META_DATA_S) / 4;i++)
 	{
 		data0 = *data;
 		fmc_word_program(address,data0);
@@ -126,6 +134,24 @@ void flash_get_meta(META_DATA_S *meta)
 		meta->app2_version 							= *(uint32_t*)(APP2_VERSION);
 		meta->app2_rom_addr 						= *(uint32_t*)(APP2_ROM_ADDR);
 		meta->app2_partition 						= *(uint32_t*)(APP2_PARTATION);
+		uint32_t buff[MD5_LENTH] = {0};
+		uint32_t addr = APP1_MD5;
+		for(int i = 0;i < MD5_LENTH;i++)
+		{
+			buff[i] =  *(uint32_t*)(addr);
+			addr += 4;
+		}
+		memcpy(&meta->app1_md5[0],buff,sizeof(uint32_t) *MD5_LENTH);
+		
+		addr = APP2_MD5;
+		for(int i = 0;i < MD5_LENTH;i++)
+		{
+			buff[i] =  *(uint32_t*)(addr);
+			addr += 4;
+		}
+		memcpy(&meta->app2_md5[0],buff,sizeof(uint32_t) *MD5_LENTH);
+		meta->app1_size = *(uint32_t*)(APP1_SIZE);
+		meta->app2_size = *(uint32_t*)(APP2_SIZE);
 }
 
 
@@ -146,7 +172,14 @@ void flash_write_programe(uint32_t *addr,uint32_t* source,uint32_t lenth)
 
 uint16_t cnt = 0;
 uint8_t md_status = 0;
+uint8_t upgrade_count = 0;
 
+static void break_2_boot_upgreade(void)
+{
+	//__disable_irq();
+	//__set_FAULTMASK(1);
+	NVIC_SystemReset();
+}
 
 void operation_Flash_data(Flash_Data *data)
 {
@@ -163,6 +196,8 @@ void operation_Flash_data(Flash_Data *data)
 				_msg.size 		= (data->recive[lenth]) | (data->recive[lenth+1] << 8);
 				_msg.patition = (data->recive[lenth+2]) | (data->recive[lenth+3] << 8) | (data->recive[lenth+4] << 16) | (data->recive[lenth+5] << 24);
 				_msg.version 	= (data->recive[lenth+6]) | (data->recive[lenth+6] << 8) | (data->recive[lenth+8] << 16) | (data->recive[lenth+9] << 24);
+				//memcmp(&md5_head,&data->recive,128);
+				memcpy(_msg.md5,&data->recive[lenth+10],32);
 				get_head_over_flag = 1;
 			}
 		}
@@ -171,6 +206,7 @@ void operation_Flash_data(Flash_Data *data)
 		if(md_status == UPGRADE_STATUS_WRITE_PROGRAME)
 		{
 			flash_write_programe(&my_addr,(uint32_t*)(data->recive),data->lenth);
+			upgrade_count = 0;
 			if(data->index < 0)
 			{
 				programe_write_complete_flag = 1;
@@ -192,6 +228,11 @@ void ModBus_CMD(void)
 				operation_Flash_data(&g_md_data.data[operation_cmd_cnt].flash_Data);
 			}
 				break;
+			case MD_WRITE_Reset:
+			{
+				break_2_boot_upgreade();
+			}	
+			break;
 			default:
 				break;
 		}
@@ -213,15 +254,63 @@ Upgrade *get_upgrade()
 }
 
 
+#define CHAR(b) (((b)<=9)?((b)+0x30):((b)-10+0x61));
+static void byte2char(char *chr, uint8_t b)
+{
+    chr[0] = CHAR(b>>4);
+    chr[1] = CHAR(b&0x0f);
+}
 
-
-
+uint8_t md5_check(uint32_t addr,uint32_t lenth,uint32_t* md5)
+{
+	md5_ctx_t ctx;
+	char  m1[32];
+	uint8_t i,tmp[16];
+	md5_init(&ctx);
+	uint32_t buff[64] = {0};
+	uint32_t read_lenth;
+	if(lenth % 4 == 0)
+		read_lenth = lenth / 4;
+	else
+		read_lenth = lenth / 4 + 1;
+	uint32_t base_addr = addr;
+	int size = 0;
+	int check_size = (64*4);
+	do
+	{
+		for(int i = 0;i < 64;i++)
+		{
+			buff[i] = *(uint32_t*)(base_addr);
+			base_addr += 4;
+		}
+		size += 64;
+		if(size > read_lenth)
+		{
+			check_size = lenth;
+			//check
+			md5_update(&ctx,(uint8_t*)&buff,check_size);
+		}else
+		{
+			//check
+			md5_update(&ctx,(uint8_t*)&buff,check_size);
+			lenth -= check_size;
+		}
+	}while(size < read_lenth);
+	md5_final(&ctx, tmp);
+	for (i=0; i<16; i++) {
+        byte2char(&m1[i*2], tmp[i]);
+  }
+	 if(memcmp(&m1, md5, sizeof(m1))) {
+        return 0xFF;
+   }
+	return 0;
+}
 
 
 
 int main(void)
 {
-	SystemInit();
+	//SystemInit();
 	//systick_config();
 	InitLED();
 	InitKey();
@@ -230,54 +319,139 @@ int main(void)
 	eMBInit(MB_RTU, CurrentAddr, 0, 115200, MB_PAR_NONE);
 	eMBEnable();
 	flash_get_meta(&meta_data);
+	Fwdgt_Init();
+	
+	//read data and 
+	uint8_t app1_checum = 0xFF;
+	uint8_t app2_checum = 0xFF;
 	
 	if(meta_data.operation_flag == 0x0)
 	{
+			
 			if(meta_data.rom_addr == PROGRAME_APP1 || meta_data.rom_addr == PROGRAME_APP2)
 			{
-		
-				if(meta_data.errno != NOERROR && meta_data.error_count >= MAX_ERROR_COUNT)
+				if(meta_data.app1_rom_addr == PROGRAME_APP1)
 				{
-							//check current version is last versions? 
-					if(meta_data.app1_version == meta_data.app2_version)
+					app1_checum = md5_check(meta_data.app1_rom_addr,meta_data.app1_size,meta_data.app1_md5);
+				}
+				if(meta_data.app2_rom_addr == PROGRAME_APP2)
+				{
+					app2_checum = md5_check(meta_data.app2_rom_addr,meta_data.app2_size,meta_data.app2_md5);
+				}
+				if((app1_checum == 0) && (app2_checum == 0))
+				{
+					if(meta_data.errno != NOERROR && meta_data.error_count >= MAX_ERROR_COUNT)
 					{
+								//check current version is last versions? 
+						if(meta_data.app1_version == meta_data.app2_version)
+						{
 								
+						}else
+						{
+							uint32_t version_max = meta_data.app1_version > meta_data.app2_version ? meta_data.app1_version :meta_data.app2_version;
+							uint32_t version_min = meta_data.app1_version < meta_data.app2_version ? meta_data.app1_version :meta_data.app2_version;
+							if(version_max == ERROR_VERSION)
+							{
+								
+							}else if(meta_data.running_app_version == version_max)
+							{
+										//swtich lower version to running
+								flash_erase_page(META_DATA);
+								if(version_max == meta_data.app2_version){
+									meta_data.partition =  meta_data.app1_partition;
+									meta_data.rom_addr = meta_data.app1_rom_addr;
+								}else
+								{
+									meta_data.partition =  meta_data.app2_partition;
+									meta_data.rom_addr = meta_data.app2_rom_addr;
+								}
+
+								meta_data.running_app_version = version_min;
+								meta_data.errno = 0;
+								meta_data.error_count = 0;
+								flash_write_meta(&meta_data);
+
+								UserJumpToApplication(meta_data.rom_addr);
+								}else
+								{
+										;;
+								}
+							}
 					}else
 					{
-						uint32_t version_max = meta_data.app1_version > meta_data.app2_version ? meta_data.app1_version :meta_data.app2_version;
-						uint32_t version_min = meta_data.app1_version < meta_data.app2_version ? meta_data.app1_version :meta_data.app2_version;
-						if(version_max == ERROR_VERSION)
-						{
-							
-						}else if(meta_data.running_app_version == version_max)
+						if(meta_data.rom_addr == PROGRAME_APP1)
 						{
-									//swtich lower version to running
-							flash_erase_page(META_DATA);
-							if(version_max == meta_data.app2_version){
-								meta_data.partition =  meta_data.app1_partition;
-								meta_data.rom_addr = meta_data.app1_rom_addr;
-							}else
-							{
-								meta_data.partition =  meta_data.app2_partition;
-								meta_data.rom_addr = meta_data.app2_rom_addr;
+							if(app1_checum == 0){
+								UserJumpToApplication(meta_data.rom_addr);
+								if(app2_checum == 0)
+								{
+									flash_erase_page(META_DATA);
+									meta_data.partition =  meta_data.app2_partition;
+									meta_data.rom_addr = meta_data.app2_rom_addr;
+									meta_data.running_app_version = meta_data.app2_version;
+									meta_data.errno = 0;
+									meta_data.error_count = 0;
+									flash_write_meta(&meta_data);
+									UserJumpToApplication(meta_data.rom_addr);
+								}
 							}
-
-							meta_data.running_app_version = version_min;
-							meta_data.errno = 0;
-							meta_data.error_count = 0;
-							flash_write_meta(&meta_data);
-
-							UserJumpToApplication(meta_data.rom_addr);
-							}else
-							{
-									;;
+						}
+						
+						if(meta_data.rom_addr == PROGRAME_APP2)
+						{
+							if(app2_checum == 0){
+								UserJumpToApplication(meta_data.rom_addr);
+								if(app1_checum == 0)
+								{
+									flash_erase_page(META_DATA);
+									meta_data.partition =  meta_data.app1_partition;
+									meta_data.rom_addr = meta_data.app1_rom_addr;
+									meta_data.running_app_version = meta_data.app1_version;
+									meta_data.errno = 0;
+									meta_data.error_count = 0;
+									flash_write_meta(&meta_data);
+									UserJumpToApplication(meta_data.rom_addr);
+								}
 							}
 						}
+					}
+				}else if(app1_checum == 0)
+				{
+					if(meta_data.errno != NOERROR && meta_data.error_count >= MAX_ERROR_COUNT)
+					{
+						//upgrade
+					}else
+					{
+						flash_erase_page(META_DATA);
+						meta_data.partition =  meta_data.app1_partition;
+						meta_data.rom_addr = meta_data.app1_rom_addr;
+						meta_data.running_app_version = meta_data.app1_version;
+						meta_data.errno = 0;
+						meta_data.error_count = 0;
+						flash_write_meta(&meta_data);
+						UserJumpToApplication(meta_data.rom_addr);
+					}
+				}else if(app2_checum == 0)
+				{
+					if(meta_data.errno != NOERROR && meta_data.error_count >= MAX_ERROR_COUNT)
+					{
+						//upgrade
+					}else
+					{
+						flash_erase_page(META_DATA);
+						meta_data.partition =  meta_data.app2_partition;
+						meta_data.rom_addr = meta_data.app2_rom_addr;
+						meta_data.running_app_version = meta_data.app2_version;
+						meta_data.errno = 0;
+						meta_data.error_count = 0;
+						flash_write_meta(&meta_data);
+						UserJumpToApplication(meta_data.rom_addr);
+					}
 				}else
 				{
-					UserJumpToApplication(meta_data.rom_addr);			//
-					
+					;;
 				}
+
 			}
 		}else
 		{
@@ -288,6 +462,7 @@ int main(void)
 		while(1)
 		{
 			eMBPoll();
+			Fwdgt_reload();
 			if(flash_flag)
 			{
 				LEDFlicker2();
@@ -333,12 +508,16 @@ int main(void)
 							my_addr = start_addr;
 							programe_erase_flag = 1;
 							md_status = UPGRADE_STATUS_WRITE_PROGRAME;
+							upgrade_count = 0;
 						}
 					}
 						break;
 					case UPGRADE_STATUS_WRITE_PROGRAME:
 					{
-						
+						if(upgrade_count > 10)
+						{
+							break_2_boot_upgreade();
+						}
 						if(programe_write_complete_flag)
 						{
 							md_status = UPGRADE_STATUS_ERASE_META;
@@ -358,19 +537,23 @@ int main(void)
 								meta_data.app1_partition = _msg.patition;
 								meta_data.app1_rom_addr = PROGRAME_APP1;
 								meta_data.app1_version = _msg.version;
-							}
-							else if(meta_data.partition == SECOND)
+								memcpy(meta_data.app1_md5,_msg.md5,32);
+								meta_data.app1_size = _msg.size;
+							} else if(meta_data.partition == SECOND)
 							{
 								meta_data.rom_addr =PROGRAME_APP2;
 								meta_data.app2_partition = _msg.patition;
 								meta_data.app2_rom_addr = PROGRAME_APP2;
 								meta_data.app2_version = _msg.version;
+								memcpy(meta_data.app2_md5,_msg.md5,32);
+								meta_data.app2_size = _msg.size;
 							}else
 							{
 								// errno  
 								md_status = UPGRADE_STATUS_IDE;
 								get_head_over_flag = 0;
-								
+								programe_write_complete_flag = 0;
+								programe_erase_flag = 0;
 								break;
 							}
 							meta_data.operation_flag = 0;
@@ -394,6 +577,7 @@ int main(void)
 					case UPGRADE_STATUS_FINISH:
 					{
 						UserJumpToApplication(start_addr);
+						
 						md_status = UPGRADE_STATUS_IDE;
 						meta_write_complete_flag = 0;   // 
 						meta_erase_flag = 0;

+ 2 - 0
control/bootloader/boot/USER/main.h

@@ -33,6 +33,7 @@
 
 //write
 #define MD_WRITE_Addr  														(50)
+#define MD_WRITE_Reset                            (51)
 
 
 
@@ -112,6 +113,7 @@ typedef struct {
 	uint16_t size;
 	uint32_t patition;
 	uint32_t version;
+	uint32_t md5[8];
 }get_md_msg;
 
 

BIN
control/bootloader/tool/app1.bin


BIN
control/bootloader/tool/bootloader.bin


+ 10 - 0
control/bootloader/tool/cfg.h

@@ -46,6 +46,12 @@
 #define APP2_ROM_ADDR											 (META_DATA + 44)
 #define APP2_PARTATION										 (META_DATA + 48)
 
+#define APP1_MD5													 (META_DATA + 52)
+#define APP2_MD5 													 (META_DATA + 84)
+
+#define APP1_SIZE                           (META_DATA + 116)
+#define APP2_SIZE                           (META_DATA + 120)
+
 
 
 #define UNIQU_1                       			0x1FFFF7AC
@@ -67,6 +73,10 @@ typedef struct {
 	uint32_t app2_version;							// V1.0.0.0   (1<<24 | 0 << 16 | 0 << 8 | 0)
 	uint32_t app2_rom_addr;							// PROGRAME_APP2 0x0800A400
 	uint32_t app2_partition;						// 2
+	uint32_t app1_md5[8];								// app1 md5 value
+	uint32_t app2_md5[8];								// app2 md5 value
+	uint32_t app1_size;
+	uint32_t app2_size;
 }META_DATA_S;
 
 

BIN
control/bootloader/tool/mb.exe


+ 1 - 1
pro/.vscode/launch.json

@@ -16,7 +16,7 @@
             "externalConsole": false,
             "MIMode": "gdb",
             "miDebuggerPath": "/home/tronlong/T113/T113-i_v1.0/out/t113_i/tlt113-evm-emmc/longan/buildroot/host/opt/ext-toolchain/bin/arm-linux-gnueabi-gdb",
-            "miDebuggerServerAddress": "192.168.234.132:1234"
+            "miDebuggerServerAddress": "192.168.1.137:1234"
         }
     ]
 }

+ 1 - 1
pro/config/cfg.h

@@ -28,7 +28,7 @@
 //
 
 
-//#define USE_BOARD_UPGRADE
+#define USE_BOARD_UPGRADE
 
 #define USE_MAIL
 #define MAIL_SEND_BUILTIN