ark_mcu.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #include <linux/kernel.h>
  2. #include <linux/proc_fs.h>
  3. #include <asm/setup.h>
  4. #include <linux/cdev.h>
  5. #include "ark_mcu.h"
  6. #include "ark_track.h"
  7. #include "ark1668ed_carback.h"
  8. #include <linux/serial.h>
  9. extern struct carback_context *g_carback_context;
  10. extern unsigned int track_pic_id;
  11. extern unsigned int radar_pic_id;
  12. extern unsigned int car_pic_id;
  13. extern unsigned int track2_pic_id;//small track for vbox
  14. void get_mcu_carback_data(unsigned char ch)
  15. {
  16. if (!g_carback_context->carback_status || !g_carback_context->layer_status)
  17. return;
  18. if (g_carback_context->carback_signal) {
  19. if (g_carback_context && g_carback_context->get_wheel_angle)
  20. g_carback_context->get_wheel_angle(ch);
  21. if (g_carback_context && g_carback_context->get_radar_info)
  22. g_carback_context->get_radar_info(ch);
  23. }
  24. }
  25. EXPORT_SYMBOL(get_mcu_carback_data);
  26. #ifdef CONFIG_REVERSING_TRACK
  27. static u8 get_rx_crc(u8 *buf, u8 len)
  28. {
  29. u8 i, crc;
  30. crc = 0;
  31. for (i = 1; i < len; i++) {
  32. crc ^= buf[i];
  33. }
  34. return crc;
  35. }
  36. static void demo_parse_mcu_data(unsigned char *buf, unsigned char size)
  37. {
  38. unsigned char wheel_angle, wheel_anglesign;
  39. unsigned int pic_id_fl, pic_id_fr, pic_id_rl, pic_id_rr;
  40. unsigned char cmd;
  41. unsigned char data[20];
  42. memset(data, 0, 20);
  43. memcpy(data, buf, size);
  44. cmd = data[0];
  45. if (cmd == 0x01) {
  46. //demo: parse to track id, and set track_pic_id
  47. wheel_anglesign = data[1];
  48. wheel_angle = data[2];
  49. if (wheel_anglesign == 0)
  50. track_pic_id = TRACK_STRAIGHT_FORWARD_ID + wheel_angle;
  51. else
  52. track_pic_id = TRACK_STRAIGHT_FORWARD_ID - wheel_angle;
  53. set_disp_track_id(track_pic_id);
  54. } else if(cmd == 0x03){
  55. //demo: parse data to radar id,and set radar_pic_id
  56. pic_id_fl = (data[1]&0xf) << 4 | (data[2]&0xf);
  57. if (pic_id_fl == 0)
  58. pic_id_fl = 0xaa;
  59. pic_id_fl <<= 24;
  60. pic_id_fr = (data[3]&0xf) << 4 | (data[4]&0xf);
  61. if (pic_id_fr == 0)
  62. pic_id_fr = 0xaa;
  63. pic_id_fr <<= 16;
  64. pic_id_rl = (data[5]&0xf) << 4 | (data[6]&0xf);
  65. if (pic_id_rl == 0)
  66. pic_id_rl = 0xaa;
  67. pic_id_rl <<= 8;
  68. pic_id_rr = (data[7]&0xf) << 4 | (data[8]&0xf);
  69. if (pic_id_rr == 0)
  70. pic_id_rr = 0xaa;
  71. pic_id_rr <<= 0;
  72. //printk(KERN_ALERT "pic_id_fl = %d,pic_id_fr = %d,pic_id_rl = %d,pic_id_rr = %d,\n",pic_id_fl,pic_id_fr,pic_id_rl ,pic_id_rr);
  73. radar_pic_id = pic_id_fl | pic_id_fr | pic_id_rl | pic_id_rr;
  74. set_disp_radar_id(radar_pic_id);
  75. }
  76. }
  77. static void demo_get_wheel_angle(unsigned char ch)
  78. {
  79. /*******************************************************************************
  80. * demo radar info format:
  81. * [0x02] [0x81] [cmd] [len] ----->fixdata
  82. * [subcmd] [anglesign] [angle] ----->vardata
  83. * [checksum]
  84. ********************************************************************************/
  85. static u8 mcu_data[20] = {0x02, 0x81, 0xee, 0x03, 0x01, 0x01, 0x05, 0x69};
  86. static bool app_check_first = false;
  87. static unsigned int i = 0;
  88. unsigned char vardata_len = 0x03;//mcu_data[3];
  89. int fixdata_len = 4;
  90. //ARKTRACK_DBGPRTK("0x%0x\n",ch);
  91. if (app_check_first == false ) {
  92. app_check_first = true;
  93. i = 0;
  94. return;
  95. }
  96. if (i < fixdata_len) {
  97. if (mcu_data[i] == ch)
  98. i++;
  99. else i = 0;
  100. } else if (i >= fixdata_len && i < (fixdata_len + vardata_len)) {
  101. mcu_data[i] = ch;
  102. i++;
  103. } else if (i == (fixdata_len + vardata_len) && get_rx_crc(mcu_data, i) == ch) {
  104. if (g_carback_context && g_carback_context->parse_mcu_data)
  105. g_carback_context->parse_mcu_data(&mcu_data[fixdata_len], vardata_len);
  106. memset(&mcu_data[fixdata_len], 0, vardata_len);
  107. i = 0;
  108. } else {
  109. i = 0;
  110. }
  111. }
  112. static void demo_get_radar_info(unsigned char ch)
  113. {
  114. /*******************************************************************************
  115. * demo radar info format:
  116. * [0x02] [0x81] [cmd] [len] ----->fixdata
  117. * [subcmd] [radar_fl] [radar_cfl] [radar_cfr] [radar_fr][radar_rl] [radar_crl][radar_crr] [radar_rr] ----->vardata
  118. * [checksum]
  119. ********************************************************************************/
  120. static u8 mcu_data[20] = {0x02, 0x81, 0xee, 0x09, 0x03, 0x01, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x02, 0x66};//demo
  121. static bool app_check_first = false;
  122. static unsigned int i = 0;
  123. unsigned char vardata_len = 0x09;//mcu_data[3];
  124. int fixdata_len = 4;
  125. if (app_check_first == false) {
  126. app_check_first = true;
  127. i = 0;
  128. return;
  129. }
  130. if (i < fixdata_len) {
  131. if (mcu_data[i] == ch)
  132. i++;
  133. else i = 0;
  134. } else if (i >= fixdata_len && i < (fixdata_len + vardata_len)) {
  135. mcu_data[i] = ch;
  136. i++;
  137. } else if (i == (fixdata_len + vardata_len) && get_rx_crc(mcu_data, i) == ch) {
  138. if (g_carback_context && g_carback_context->parse_mcu_data)
  139. g_carback_context->parse_mcu_data(&mcu_data[fixdata_len], vardata_len);
  140. memset(&mcu_data[fixdata_len], 0, vardata_len);
  141. i = 0;
  142. } else {
  143. i = 0;
  144. }
  145. }
  146. #endif
  147. void register_mcu_interface(void)
  148. {
  149. if (g_carback_context == NULL) {
  150. printk(KERN_ALERT "register mcu interface error.\n");
  151. return;
  152. }
  153. #ifdef CONFIG_REVERSING_TRACK
  154. //user need change interface
  155. g_carback_context->parse_mcu_data = demo_parse_mcu_data;
  156. g_carback_context->get_wheel_angle = demo_get_wheel_angle;
  157. g_carback_context->get_radar_info = demo_get_radar_info;
  158. #endif
  159. }
  160. void unregister_mcu_interface(void)
  161. {
  162. if (g_carback_context == NULL) {
  163. printk(KERN_ALERT "unregister mcu interface error.\n");
  164. return;
  165. }
  166. #ifdef CONFIG_REVERSING_TRACK
  167. //user need change interface
  168. g_carback_context->parse_mcu_data = NULL;
  169. g_carback_context->get_wheel_angle = NULL;
  170. g_carback_context->get_radar_info = NULL;
  171. #endif
  172. }