/************************************************************************************** CopyApp2Mcu 从外部FLASH中拷贝APP到MCU内 ***************************************************************************************/ #include "CopyApp2Mcu.h" #include "IAP.h" #include "W25Q64.h" #include "flash.h" #include "md5.h" /***************************************************************************************** CheckExFlashAppMD5 检查外部FLASH中的APP的MD5是否正确 正确返回1 不正确返回0 ******************************************************************************************/ int CheckExFlashAppMD5(unsigned long ExAddr,unsigned long datalen,uint8_t MD5[]) { MD5_CTX mdContext; unsigned char data[1024]; unsigned long len,l; char tembuf[5]; int i; //MD5计算初始化 MD5Init(&mdContext); len=0;//已验证的字节数 while(len1024)l=1024; else l=datalen-len; //从外部FLASH读出 sFlash_Read(data,ExAddr+len,l); //更新计算MD5 MD5Update(&mdContext,data,l); //更新已验证字节数 len+=l; } //MD5计算结束 MD5Final(&mdContext); #if 0 //debug trace md5 sprintf((char *)data,"FileSize=%d MD5=",FileLen); for(i=0;i<16;i++){ sprintf(tembuf,"%02X",mdContext.digest[i]); strcat((char *)data,tembuf); } strcat((char *)data,"\r\n"); IapTrace((char *)data); #endif //check for(i=0;i<16;i++){ if(MD5[i]!=mdContext.digest[i])break; } if(i<16)return 0; else return 1; } /************************************************************************************** CopyApp2Mcu 从外部FLASH拷贝APP到MCU的内部FLASH 每次拷贝1k bytes,每次都校验之 返回: 0--成功 非0--失败 -1 参数错误 ***************************************************************************************/ short CopyApp2Mcu(unsigned long ExAddr,unsigned long InAddr,unsigned long datalen,unsigned char *MD5) { int i; unsigned long len; unsigned short l; unsigned char buf[1024]; unsigned char rbuf[1024]; if(datalen==0)return -1; if((ExAddr+datalen)>EX_FLASH_SIZE)return -1; if((InAddr-FLASH_BASE+datalen)>IN_FLASH_SIZE)return -2; //先校验外部FLASH,检查MD5是否正确 if(0==CheckExFlashAppMD5(ExAddr,datalen,MD5)){ return -3; } //拷贝 len=0;//已拷贝的字节数 while(len1024)l=1024; else l=datalen-len; //从外部FLASH读出 sFlash_Read(buf,ExAddr+len,l); //写入MCU FLASH WritePageData(InAddr+len,buf,l); // len+=l; } //读出验证 len=0;//已读出的字节 while(len1024)l=1024; else l=datalen-len; //从外部FLASH读出 sFlash_Read(buf,ExAddr+len,l); //从MCU内部FLASH读出 ReadFlashData(InAddr+len,rbuf,l); //比较 for(i=0;i