| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /**************************************************************************************
- 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(len<datalen){
- if((datalen-len)>1024)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(len<datalen){
- if((datalen-len)>1024)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(len<datalen)
- {
- if((datalen-len)>1024)l=1024;
- else l=datalen-len;
- //从外部FLASH读出
- sFlash_Read(buf,ExAddr+len,l);
- //从MCU内部FLASH读出
- ReadFlashData(InAddr+len,rbuf,l);
- //比较
- for(i=0;i<l;i++){
- if(buf[i]!=rbuf[i])return -4;
- }
- len+=l;
- }
- // copy 成功
- return 0;
- }
|