iap.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include <string.h>
  2. #include "app/iap.h"
  3. #include "bsp/fmc_flash.h"
  4. #define QWS_IAP_MAGIC_SUCCESS 0x11223344
  5. #define QWS_IAP_MAGIC_FLASH 0xAABBCCDD
  6. static int iap_write_image(uint8_t *data, int len);
  7. static int iap_check_image(uint8_t *data, int len);
  8. static void _reboot_timer_handler(shark_timer_t *t);
  9. void iap_read_string(can_frame_t *frame);
  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. protocol_send_ack(frame->head.can_addr, frame->key, 0);
  18. break;
  19. case CAN_KEY_IAP_BEGIN:
  20. fmc_erase_image();
  21. _write_position = 0;
  22. protocol_send_ack(frame->head.can_addr, frame->key, 0);
  23. break;
  24. case CAN_KEY_IAP_WRITE:
  25. data_len = iap_write_image(frame->data, len);
  26. data = frame->data;
  27. break;
  28. case CAN_KEY_IAP_CHECK:
  29. data_len = iap_check_image(frame->data, len);
  30. data = frame->data;
  31. break;
  32. case CAN_KEY_IAP_BOOT:
  33. protocol_send_ack(frame->head.can_addr, frame->key, 0);
  34. shark_timer_post(&_reboot_timer,1000);
  35. break;
  36. case CAN_EEY_IAP_READ_STRING:
  37. iap_read_string(frame);
  38. break;
  39. }
  40. if (data != NULL && data_len > 0){
  41. protocol_send_bms_info(frame->head.can_addr, frame->key, frame->data, data_len);
  42. }
  43. }
  44. static void _reboot_timer_handler(shark_timer_t *t){
  45. NVIC_SystemReset();
  46. }
  47. static int iap_write_image(uint8_t *data, int len){
  48. int w_pos = shark_decode_u24(data);
  49. if (w_pos == _write_position) {
  50. fmc_write_image(data + 3, len - 3);
  51. _write_position += w_pos;
  52. }
  53. data[0] = 0;
  54. shark_encode_u24(data+1, w_pos);
  55. return 4;
  56. }
  57. void iap_read_string(can_frame_t *frame)
  58. {
  59. uint8_t buff[64];
  60. const char *text;
  61. uint32_t addr;
  62. uint32_t len;
  63. addr = ((uint32_t) frame->data[2]) << 16 | ((uint32_t) frame->data[1]) << 8 | frame->data[0];
  64. text = (const char *) (0x08000000 + addr);
  65. len = strlen(text);
  66. if (len > (sizeof(buff)-4)) {
  67. len = sizeof(buff) - 4;
  68. }
  69. buff[0] = 0;
  70. memcpy(buff+1, frame->data, 3);
  71. memcpy(buff + 4, text, len);
  72. protocol_send_bms_info(frame->head.can_addr, frame->key, buff, len + 4);
  73. }
  74. static int iap_check_image(uint8_t *data, int len) {
  75. uint32_t size, checksum;
  76. size = shark_decode_u24(data);
  77. checksum = shark_decode_u32(data + 3);
  78. uint32_t d_checksum = shark_iap_checksum_init();
  79. d_checksum = shark_iap_checksum_put(d_checksum, (const u8 *)fmc_iap_image_addr(), size);
  80. d_checksum = shark_iap_checksum_finish(d_checksum);
  81. if (checksum != d_checksum) {
  82. data[0] = 1;
  83. return 1;
  84. }
  85. fmc_write_magic(size, checksum, QWS_IAP_MAGIC_FLASH);
  86. data[0] = 0;
  87. return 1;
  88. }