ark_mcu.c 6.1 KB

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