can_update_demo.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <string.h>
  4. #include "ff_stdio.h"
  5. #include "FreeRTOS.h"
  6. #include "task.h"
  7. #include "chip.h"
  8. #include "crc.h"
  9. #include "ota_update.h"
  10. #include "mailbox_message.h"
  11. #include "mmcsd_core.h"
  12. #include "romfile.h"
  13. #include "sfud.h"
  14. #include "animation.h"
  15. #include "mailbox_update/mailbox_update_demo.h"
  16. static uint32_t upfile_total_size;
  17. static uint32_t upfile_size;
  18. static uint32_t upfile_offset;
  19. static int upfile_type;
  20. static int CanUpdateSendstatus(mb_msg_type_t msg_type, MailboxUpdateFrameRespondStatus status)
  21. {
  22. MailboxUpdateFrame frame = {0};
  23. frame.FrameRspStatus = status;
  24. return MailboxUpdateSendFrame(msg_type, &frame);
  25. }
  26. uint32_t MailboxUpdateCheck(void)
  27. {
  28. if (upfile_size != upfile_total_size) {
  29. printf("%s, data size rev err.\n", __func__);
  30. printf("upfile_size = %d, upfile_total_size = %d \n", upfile_size, upfile_total_size);
  31. return MUFRS_ACK_FAIL;
  32. }
  33. if (check_upfile_and_save(upfile_type, upfile_size, upfile_offset)) {
  34. printf("%s, filecheck fail.\n", __func__);
  35. return MUFRS_ACK_FAIL;
  36. } else {
  37. printf("%s update ok.\n", g_upfilename[upfile_type]);
  38. return MUFRS_ACK_OK;
  39. }
  40. }
  41. static uint32_t CanUpdateHandleData(MailboxUpdateFrame *frame)
  42. {
  43. int leftsize;
  44. uint32_t rwsize, rwoffset;
  45. uint8_t *buf = NULL;
  46. static uint32_t upfile_cur_offset;
  47. #if DEVICE_TYPE_SELECT != EMMC_FLASH
  48. sfud_flash *sflash = sfud_get_device(0);
  49. #endif
  50. leftsize = frame->DataSize;
  51. buf = (uint8_t *)frame->DataAddr;
  52. printf("Mailbox update rev frame dataaddr: 0x%x, datasize: 0x%x.\n", \
  53. (void *)frame->DataAddr, frame->DataSize);
  54. CP15_invalidate_dcache_for_dma(frame->DataAddr, frame->DataAddr + frame->DataSize); //使cache的数据无效 重新去ddr里面读
  55. rwoffset = upfile_cur_offset;
  56. if (frame->FrameStatus == MUFS_START) {
  57. uint32_t checksum;
  58. upfile_type = frame->FileType;
  59. if (upfile_type > UPFILE_TYPE_ROM){
  60. printf("%s, mailbox rev filetype error.\n", __func__);
  61. return MUFRS_ACK_FNOSUP;
  62. } else {
  63. printf("Mailbox update rev %s, file length %d.\n", g_upfilename[upfile_type], frame->TotalSize);
  64. if (frame->TotalSize > get_upfile_maxsize(upfile_type)) {
  65. printf("%s, filelength is too large, not enough space to save.\n", __func__);
  66. return MUFRS_ACK_FNOSPACE;
  67. }
  68. }
  69. if (upfile_type == UPFILE_TYPE_APP || upfile_type == UPFILE_TYPE_LDR) {
  70. checksum = *(uint32_t*)(buf + APPLDR_CHECKSUM_OFFSET);
  71. } else if (upfile_type == UPFILE_TYPE_ANIMATION) {
  72. BANIHEADER *header = (BANIHEADER *)buf;
  73. checksum = header->checksum;
  74. } else if (upfile_type == UPFILE_TYPE_ROM) {
  75. RomHeader *header = (RomHeader *)buf;
  76. checksum = header->checksum;
  77. }
  78. if (checksum == get_upfile_checksum(upfile_type, 0, 0)) {
  79. printf("checksum is the same as now, don't update.\n");
  80. return MUFRS_ACK_FSAME;
  81. }
  82. upfile_cur_offset = upfile_offset = get_upfile_offset(upfile_type, 1);
  83. upfile_size = 0;
  84. upfile_total_size = frame->TotalSize;
  85. } else if (frame->FrameStatus == MUFS_TFR) {
  86. while (leftsize > 0) {
  87. rwsize = leftsize > OTA_RW_SIZE ? OTA_RW_SIZE : leftsize;
  88. #if DEVICE_TYPE_SELECT == EMMC_FLASH
  89. if (emmc_write(rwoffset, rwsize, buf))
  90. #else
  91. if (sfud_erase_write(sflash, rwoffset, rwsize, buf) != SFUD_SUCCESS)
  92. #endif
  93. {
  94. printf("%s, burn data fail.\n", __func__);
  95. return MUFRS_ACK_FBURNE;
  96. }
  97. leftsize -= rwsize;
  98. rwoffset += rwsize;
  99. buf += rwsize;
  100. }
  101. upfile_size += frame->DataSize;
  102. printf("upfile_size = 0x%x.\n", upfile_size);
  103. upfile_cur_offset += frame->DataSize;
  104. printf("burn size: 0x%x.\n", frame->DataSize);
  105. } else {
  106. return MUFRS_ACK_FAIL;
  107. }
  108. return MUFRS_ACK_OK;
  109. }
  110. static void CanUpdateReceiveThread(void *para)
  111. {
  112. unsigned int status;
  113. mb_rxmsg_t msg;
  114. MailboxUpdateFrame *rx_frame;
  115. for (;;) {
  116. rx_frame = MailboxUpdateReceiveFrame(MB_MSG_T_CAN_UPDATE, &msg, portMAX_DELAY);
  117. if (!rx_frame)
  118. continue;
  119. //data analysis
  120. switch (rx_frame->FrameStatus) {
  121. case MUFS_START:
  122. case MUFS_TFR:
  123. CanUpdateSendstatus(MB_MSG_T_CAN_UPDATE, CanUpdateHandleData(rx_frame));
  124. break;
  125. case MUFS_END:
  126. CanUpdateSendstatus(MB_MSG_T_CAN_UPDATE, MailboxUpdateCheck());
  127. break;
  128. }
  129. }
  130. }
  131. /* 接收MCU Mailbox(CAN升级)信息, 升级CPU升级文件 */
  132. void CanUpdateReceiveDemo(void)
  133. {
  134. if (xTaskCreate(CanUpdateReceiveThread, "CanUpdateReceiveDemo", configMINIMAL_STACK_SIZE, NULL,
  135. 1, NULL) != pdPASS) {
  136. printf("create can update receive task fail.\n");
  137. }
  138. }