ark_mcu.c 7.2 KB

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