iap.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include <string.h>
  2. #include "app/iap.h"
  3. #include "app/nv_storage.h"
  4. #include "bsp/fmc_flash.h"
  5. static int iap_write_image(uint8_t *data, int len);
  6. static int iap_check_image(uint8_t *data, int len);
  7. void _reboot_timer_handler(shark_timer_t *t);
  8. void iap_read_string(can_frame_t *frame);
  9. static u8 _write_success = 0;
  10. static int _write_position = 0;
  11. static shark_timer_t _reboot_timer = {.handler = _reboot_timer_handler,};
  12. void process_iap_message(can_frame_t *frame, int len){
  13. uint8_t *data = NULL;
  14. int data_len = 0;
  15. switch(frame->key) {
  16. case CAN_KEY_IAP_ENTER:
  17. if (gd32_flash_size() < 128 * 1024){
  18. wdog_reload();
  19. fmc_iap_write_magic(0xFFFFFFFF);
  20. NVIC_SystemReset();
  21. while(1);
  22. }
  23. protocol_send_ack(frame->head.can_addr, frame->key, 0);
  24. break;
  25. case CAN_KEY_IAP_BEGIN:
  26. if (gd32_flash_size() < 128 * 1024){
  27. protocol_send_ack(frame->head.can_addr, frame->key, 1);
  28. break;
  29. }
  30. fmc_erase_image();
  31. _write_position = 0;
  32. _write_success = 0;
  33. protocol_send_ack(frame->head.can_addr, frame->key, 0);
  34. break;
  35. case CAN_KEY_IAP_WRITE:
  36. _write_success = 0;
  37. data_len = iap_write_image(frame->data, len);
  38. data = frame->data;
  39. break;
  40. case CAN_KEY_IAP_CHECK:
  41. data_len = iap_check_image(frame->data, len);
  42. data = frame->data;
  43. break;
  44. case CAN_KEY_IAP_BOOT:
  45. if (_write_success) {
  46. NVIC_SystemReset();
  47. while(1);
  48. } else {
  49. protocol_send_ack(frame->head.can_addr, frame->key, 0);
  50. }
  51. break;
  52. case CAN_EEY_IAP_READ_STRING:
  53. iap_read_string(frame);
  54. break;
  55. case CAN_KEY_REBOOT:
  56. shark_timer_post(&_reboot_timer, 100);
  57. protocol_send_ack(frame->head.can_addr, frame->key, 1);
  58. break;
  59. case CAN_KET_ERASE_NV:
  60. nv_erase();
  61. shark_timer_post(&_reboot_timer, 100);
  62. protocol_send_ack(frame->head.can_addr, frame->key, 1);
  63. break;
  64. }
  65. if (data != NULL && data_len > 0){
  66. protocol_send_bms_info(frame->head.can_addr, frame->key, frame->data, data_len);
  67. }
  68. }
  69. void _reboot_timer_handler(shark_timer_t *t){
  70. NVIC_SystemReset();
  71. }
  72. static int iap_write_image(uint8_t *data, int len){
  73. int w_pos = shark_decode_u24(data);
  74. if (w_pos == _write_position) {
  75. fmc_write_image(data + 3, len - 3);
  76. _write_position += len - 3;
  77. }
  78. data[0] = 0;
  79. shark_encode_u24(data+1, _write_position);
  80. return 4;
  81. }
  82. void iap_read_string(can_frame_t *frame)
  83. {
  84. uint8_t buff[64];
  85. const char *text;
  86. uint32_t addr;
  87. uint32_t len;
  88. addr = ((uint32_t) frame->data[2]) << 16 | ((uint32_t) frame->data[1]) << 8 | frame->data[0];
  89. text = (const char *) (0x08000000 + addr);
  90. len = strlen(text);
  91. if (len > (sizeof(buff)-4)) {
  92. len = sizeof(buff) - 4;
  93. }
  94. buff[0] = 0;
  95. memcpy(buff+1, frame->data, 3);
  96. memcpy(buff + 4, text, len);
  97. protocol_send_bms_info(frame->head.can_addr, frame->key, buff, len + 4);
  98. }
  99. static int iap_check_image(uint8_t *data, int len) {
  100. uint32_t size, checksum;
  101. size = shark_decode_u24(data);
  102. checksum = shark_decode_u32(data + 3);
  103. uint32_t d_checksum = shark_iap_checksum_init();
  104. d_checksum = shark_iap_checksum_put(d_checksum, (const u8 *)fmc_iap_image_addr(), size);
  105. d_checksum = shark_iap_checksum_finish(d_checksum);
  106. if (checksum != d_checksum) {
  107. data[0] = 1;
  108. return 1;
  109. }
  110. fmc_write_magic(size, checksum, SHARK_IAP_MAGIC_FLASH);
  111. _write_success = 1;
  112. data[0] = 0;
  113. return 1;
  114. }