ark_mcu.c 5.4 KB

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