mailbox_message.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "chip.h"
  2. #include "board.h"
  3. typedef union {
  4. struct {
  5. uint8_t type;
  6. uint8_t dl;
  7. uint8_t data[MB_FRAME_DSIZE];
  8. }frame_data;
  9. uint32_t raw_data[MAILBOX_DR_SUM];
  10. }mb_frame_fmt_t;
  11. #ifdef MAILBOX_SUPPORT
  12. static SemaphoreHandle_t msg_tx_mutex[MB_MSG_T_MAX];
  13. static QueueHandle_t msg_rx_queue[MB_MSG_T_MAX];
  14. static reply_t mb_rx_cb(mail_t mail, void *param)
  15. {
  16. int i;
  17. reply_t reply = {0};
  18. mb_frame_fmt_t fr_data;
  19. mb_rxmsg_t msg;
  20. for (i = 0; i < MAILBOX_DR_SUM; i++) {
  21. fr_data.raw_data[i] = mail.data[i];
  22. }
  23. msg.dl = fr_data.frame_data.dl;
  24. memcpy(msg.data, fr_data.frame_data.data, msg.dl);
  25. xQueueSendFromISR(msg_rx_queue[fr_data.frame_data.type], &msg, 0);
  26. return reply;
  27. }
  28. int mailbox_msg_send(mb_msg_type_t type, const uint8_t *data, uint32_t dl, TickType_t xTicksToWait)
  29. {
  30. uint32_t i, j;
  31. mail_t mail;
  32. mb_frame_fmt_t fr_data;
  33. int id;
  34. int ret = 0;
  35. TickType_t stick, tick, ptick, rtick;
  36. stick = xTaskGetTickCount();
  37. if (xSemaphoreTake(msg_tx_mutex[type], xTicksToWait) != pdTRUE) {
  38. printf("%s time out!\n", __func__);
  39. return -1;
  40. }
  41. tick = xTaskGetTickCount();
  42. if (tick >= stick) {
  43. ptick = tick - stick;
  44. } else {
  45. ptick = (portMAX_DELAY - stick) + tick;
  46. }
  47. if (ptick < xTicksToWait) {
  48. rtick = xTicksToWait - ptick;
  49. } else {
  50. rtick = 1;
  51. }
  52. while (rtick) {
  53. id = mailbox_request(-1);
  54. if (id >= 0)
  55. break;
  56. vTaskDelay(1);
  57. rtick--;
  58. }
  59. if (id >= 0) {
  60. fr_data.frame_data.type = type;
  61. if (!data) {
  62. fr_data.frame_data.dl = 0;
  63. for (j = 0; j < MAILBOX_DR_SUM; j++)
  64. mail.data[j] = fr_data.raw_data[j];
  65. mail.auto_acknowledge = 0;
  66. mail.auto_link = 0;
  67. mail.sender = MAILBOX_MY_CORE_ID;
  68. mail.recipients = MAILBOX_MCU_CORE_ID;
  69. mail.mailbox_id = id;
  70. mail.tx_tout_tick = rtick;
  71. mailbox_send_mail(&mail, 1);
  72. if (mail.tx_status != mail_s_done)
  73. ret = -1;
  74. } else {
  75. for (i = 0; i < dl;) {
  76. if ((dl - i) >= MB_FRAME_DSIZE) {
  77. fr_data.frame_data.dl = MB_FRAME_DSIZE;
  78. for (j = 0; j < fr_data.frame_data.dl; j++, i++)
  79. fr_data.frame_data.data[j] = data[i];
  80. for (j = 0; j < MAILBOX_DR_SUM; j++)
  81. mail.data[j] = fr_data.raw_data[j];
  82. } else {
  83. fr_data.frame_data.dl = dl - i;
  84. for (j = 0; j < fr_data.frame_data.dl; j++, i++)
  85. fr_data.frame_data.data[j] = data[i];
  86. for (j = 0; j < MAILBOX_DR_SUM; j++)
  87. mail.data[j] = fr_data.raw_data[j];
  88. }
  89. mail.auto_acknowledge = 0;
  90. mail.auto_link = 0;
  91. mail.sender = MAILBOX_MY_CORE_ID;
  92. mail.recipients = MAILBOX_MCU_CORE_ID;
  93. mail.mailbox_id = id;
  94. mail.tx_tout_tick = rtick;
  95. mailbox_send_mail(&mail, 1);
  96. if (mail.tx_status != mail_s_done)
  97. ret = -1;
  98. }
  99. }
  100. mailbox_release(id);
  101. } else {
  102. ret = -1;
  103. }
  104. xSemaphoreGive(msg_tx_mutex[type]);
  105. return ret;
  106. }
  107. BaseType_t mailbox_msg_receive(mb_msg_type_t type, mb_rxmsg_t *msg, TickType_t xTicksToWait)
  108. {
  109. int ret = 0;
  110. mb_rxmsg_t rx_msg;
  111. ret = xQueueReceive(msg_rx_queue[type], &rx_msg, xTicksToWait);
  112. if (msg)
  113. *msg = rx_msg;
  114. return ret;
  115. }
  116. void mailbox_msg_init(void)
  117. {
  118. int i;
  119. mailbox_init();
  120. for (i = 0; i < MB_MSG_T_MAX; i++) {
  121. msg_tx_mutex[i] = xSemaphoreCreateMutex();
  122. msg_rx_queue[i] = xQueueCreate(MB_RX_QUEUE_LEN, sizeof(mb_rxmsg_t));
  123. }
  124. for (i = RX_MAILBOX_START_ID; i < RX_MAILBOX_MAX_ID; i++) {
  125. mailbox_register_rx_cb(i, mb_rx_cb, NULL);
  126. }
  127. }
  128. #endif