can_pc_message.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "bsp/bsp.h"
  2. #include "can_pc_message.h"
  3. #include "bsp/fmc_flash.h"
  4. #include "bsp/gd32_bkp.h"
  5. #include "libs/logger.h"
  6. #include "os/os_task.h"
  7. static void can_send_backtrace(void){
  8. set_log_level(MOD_SYSTEM, L_error);
  9. sys_error("src %x \n",gd32_get_reset_source());
  10. if (gd32_bkp_btrace_valid()){
  11. uint32_t bt[16];
  12. uint32_t bt_over;
  13. uint32_t bt_dep;
  14. uint16_t line;
  15. gd32_bkp_get_backtrace(bt, &bt_over, &bt_dep, &line);
  16. sys_error("system backtrace:\n");
  17. sys_error("stack overflow %d, stack dep = %d, line = %d\n", bt_over, bt_dep, line);
  18. for(bt_over = 0; bt_over < bt_dep; bt_over++){
  19. sys_error("0x%x ", bt[bt_over]);
  20. }
  21. sys_error("system backtrace end!\n");
  22. }else{
  23. sys_error("no backtrace\n");
  24. }
  25. }
  26. bool can_process_iap_message(can_message_t *can_message) {
  27. uint8_t response[8];
  28. uint8_t rsplen;
  29. encoder_can_key(response, can_message->key);
  30. response[2] = 0;
  31. rsplen = 3;
  32. switch(can_message->key) {
  33. case BUILD_CMD_KEY(0xF0):
  34. fmc_write_magic(0xFFFFFFFF);
  35. iap_send_data(can_message->src, response, rsplen);
  36. delay_ms(100);
  37. system_reboot();
  38. break;
  39. case BUILD_CMD_KEY(0xF5):
  40. memcpy(response + rsplen, can_message->data, can_message->len);
  41. rsplen += can_message->len;
  42. break;
  43. case BUILD_CMD_KEY(0xF9):
  44. fmc_write_magic(IAP_MAGIC_SUCCESS);
  45. break;
  46. case BUILD_CMD_KEY(0xF6):
  47. break;
  48. case BUILD_CMD_KEY(0xF8):
  49. iap_read_string(can_message->src, can_message->data);
  50. rsplen = 0;
  51. break;
  52. default:
  53. return false;
  54. }
  55. if (rsplen > 0) {
  56. iap_send_data(can_message->src, response, rsplen);
  57. }
  58. return true;
  59. }
  60. extern void iap_test_download(void);
  61. extern void cellular_stat_log(void);
  62. void can_process_pc_message(can_message_t *can_message){
  63. uint8_t response[8];
  64. uint8_t rsplen;
  65. encoder_can_key(response, can_message->key);
  66. response[2] = 0;
  67. rsplen = 3;
  68. switch(can_message->key) {
  69. case BUILD_CMD_KEY(0xD0):
  70. if (can_message->len != 2){
  71. response[2] = 1;
  72. break;
  73. }
  74. set_log_level(can_message->data[0], can_message->data[1]);
  75. break;
  76. case 0x5030:
  77. can_send_backtrace();
  78. break;
  79. case 0x5031:
  80. set_log_level(MOD_SYSTEM, L_error);
  81. sys_error("cls rst info\n");
  82. break;
  83. default:
  84. rsplen = 0;
  85. break;
  86. }
  87. if (rsplen > 0) {
  88. iap_send_data(can_message->src, response, rsplen);
  89. }
  90. }
  91. uint32_t iap_read_magic(void){
  92. return fmc_read_magic();
  93. }
  94. void iap_read_string(uint8_t can, const uint8_t *args)
  95. {
  96. #define buff_len 256
  97. uint8_t buff[buff_len];
  98. const char *text;
  99. uint32_t addr;
  100. uint32_t len;
  101. addr = ((uint32_t) args[2]) << 16 | ((uint32_t) args[1]) << 8 | args[0];
  102. text = (const char *) (0x08000000 + addr);
  103. len = strlen(text);
  104. if (len > buff_len) {
  105. len = buff_len;
  106. }
  107. buff[0] = 0xF8;
  108. buff[1] = CAN_MY_ADDRESS;
  109. buff[2] = 0x00;
  110. memcpy(buff + 3, args, 3);
  111. memcpy(buff + 6, text, len);
  112. iap_send_data(can, buff, len + 6);
  113. }
  114. void iap_send_data(uint8_t can, uint8_t *data, int len){
  115. can_id_t frame_id;
  116. frame_id.id=0;
  117. frame_id.src = CAN_MY_ADDRESS;
  118. frame_id.dest = can;
  119. frame_id.type = ptype_response;
  120. shark_can0_send_message(frame_id.id, data, len);
  121. }