CopyApp2Mcu.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /**************************************************************************************
  2. CopyApp2Mcu
  3. 从外部FLASH中拷贝APP到MCU内
  4. ***************************************************************************************/
  5. #include "CopyApp2Mcu.h"
  6. #include "IAP.h"
  7. #include "W25Q64.h"
  8. #include "flash.h"
  9. #include "md5.h"
  10. /*****************************************************************************************
  11. CheckExFlashAppMD5
  12. 检查外部FLASH中的APP的MD5是否正确
  13. 正确返回1
  14. 不正确返回0
  15. ******************************************************************************************/
  16. int CheckExFlashAppMD5(unsigned long ExAddr,unsigned long datalen,uint8_t MD5[])
  17. {
  18. MD5_CTX mdContext;
  19. unsigned char data[1024];
  20. unsigned long len,l;
  21. char tembuf[5];
  22. int i;
  23. //MD5计算初始化
  24. MD5Init(&mdContext);
  25. len=0;//已验证的字节数
  26. while(len<datalen){
  27. if((datalen-len)>1024)l=1024;
  28. else l=datalen-len;
  29. //从外部FLASH读出
  30. sFlash_Read(data,ExAddr+len,l);
  31. //更新计算MD5
  32. MD5Update(&mdContext,data,l);
  33. //更新已验证字节数
  34. len+=l;
  35. }
  36. //MD5计算结束
  37. MD5Final(&mdContext);
  38. #if 0 //debug trace md5
  39. sprintf((char *)data,"FileSize=%d MD5=",FileLen);
  40. for(i=0;i<16;i++){
  41. sprintf(tembuf,"%02X",mdContext.digest[i]);
  42. strcat((char *)data,tembuf);
  43. }
  44. strcat((char *)data,"\r\n");
  45. IapTrace((char *)data);
  46. #endif
  47. //check
  48. for(i=0;i<16;i++){
  49. if(MD5[i]!=mdContext.digest[i])break;
  50. }
  51. if(i<16)return 0;
  52. else return 1;
  53. }
  54. /**************************************************************************************
  55. CopyApp2Mcu
  56. 从外部FLASH拷贝APP到MCU的内部FLASH
  57. 每次拷贝1k bytes,每次都校验之
  58. 返回:
  59. 0--成功
  60. 非0--失败
  61. -1 参数错误
  62. ***************************************************************************************/
  63. short CopyApp2Mcu(unsigned long ExAddr,unsigned long InAddr,unsigned long datalen,unsigned char *MD5)
  64. {
  65. int i;
  66. unsigned long len;
  67. unsigned short l;
  68. unsigned char buf[1024];
  69. unsigned char rbuf[1024];
  70. if(datalen==0)return -1;
  71. if((ExAddr+datalen)>EX_FLASH_SIZE)return -1;
  72. if((InAddr-FLASH_BASE+datalen)>IN_FLASH_SIZE)return -2;
  73. //先校验外部FLASH,检查MD5是否正确
  74. if(0==CheckExFlashAppMD5(ExAddr,datalen,MD5)){
  75. return -3;
  76. }
  77. //拷贝
  78. len=0;//已拷贝的字节数
  79. while(len<datalen){
  80. if((datalen-len)>1024)l=1024;
  81. else l=datalen-len;
  82. //从外部FLASH读出
  83. sFlash_Read(buf,ExAddr+len,l);
  84. //写入MCU FLASH
  85. WritePageData(InAddr+len,buf,l);
  86. //
  87. len+=l;
  88. }
  89. //读出验证
  90. len=0;//已读出的字节
  91. while(len<datalen)
  92. {
  93. if((datalen-len)>1024)l=1024;
  94. else l=datalen-len;
  95. //从外部FLASH读出
  96. sFlash_Read(buf,ExAddr+len,l);
  97. //从MCU内部FLASH读出
  98. ReadFlashData(InAddr+len,rbuf,l);
  99. //比较
  100. for(i=0;i<l;i++){
  101. if(buf[i]!=rbuf[i])return -4;
  102. }
  103. len+=l;
  104. }
  105. // copy 成功
  106. return 0;
  107. }