ark_track.c 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486
  1. #include <linux/kernel.h>
  2. #include <linux/proc_fs.h>
  3. #include <linux/platform_device.h>
  4. #include <asm/setup.h>
  5. #include <linux/zlib.h>
  6. #include <linux/cdev.h>
  7. #include "ark_track.h"
  8. #include "ark1668ed_carback.h"
  9. #include "ark_mcu.h"
  10. #include <asm/cacheflush.h>
  11. #include <linux/dma-mapping.h>
  12. #include <linux/vmalloc.h>
  13. const idmap_info radar_idmap[RADAR_MAX] = {
  14. //FL
  15. { "FL_00", FL_00, 0},
  16. { "FL_01", FL_01, 0},
  17. { "FL_02", FL_02, 0},
  18. { "FL_03", FL_03, 0},
  19. { "FL_04", FL_04, 0},
  20. { "FL_05", FL_05, 0},
  21. { "FL_06", FL_06, 0},
  22. { "FL_10", FL_10, 0},
  23. { "FL_11", FL_11, 0},
  24. { "FL_12", FL_12, 0},
  25. { "FL_13", FL_13, 0},
  26. { "FL_14", FL_14, 0},
  27. { "FL_15", FL_15, 0},
  28. { "FL_16", FL_16, 0},
  29. { "FL_20", FL_20, 0},
  30. { "FL_21", FL_21, 0},
  31. { "FL_22", FL_22, 0},
  32. { "FL_23", FL_23, 0},
  33. { "FL_24", FL_24, 0},
  34. { "FL_25", FL_25, 0},
  35. { "FL_26", FL_26, 0},
  36. { "FL_30", FL_30, 0},
  37. { "FL_31", FL_31, 0},
  38. { "FL_32", FL_32, 0},
  39. { "FL_33", FL_33, 0},
  40. { "FL_34", FL_34, 0},
  41. { "FL_35", FL_35, 0},
  42. { "FL_36", FL_36, 0},
  43. { "FL_40", FL_40, 0},
  44. { "FL_41", FL_41, 0},
  45. { "FL_42", FL_42, 0},
  46. { "FL_43", FL_43, 0},
  47. { "FL_44", FL_44, 0},
  48. { "FL_45", FL_45, 0},
  49. { "FL_46", FL_46, 0},
  50. { "FL_50", FL_50, 0},
  51. { "FL_51", FL_51, 0},
  52. { "FL_52", FL_52, 0},
  53. { "FL_53", FL_53, 0},
  54. { "FL_54", FL_54, 0},
  55. { "FL_55", FL_55, 0},
  56. { "FL_56", FL_56, 0},
  57. { "FL_60", FL_60, 0},
  58. { "FL_61", FL_61, 0},
  59. { "FL_62", FL_62, 0},
  60. { "FL_63", FL_63, 0},
  61. { "FL_64", FL_64, 0},
  62. { "FL_65", FL_65, 0},
  63. { "FL_66", FL_66, 0},
  64. //FR
  65. { "FR_00", FR_00, 1},
  66. { "FR_01", FR_01, 1},
  67. { "FR_02", FR_02, 1},
  68. { "FR_03", FR_03, 1},
  69. { "FR_04", FR_04, 1},
  70. { "FR_05", FR_05, 1},
  71. { "FR_06", FR_06, 1},
  72. { "FR_10", FR_10, 1},
  73. { "FR_11", FR_11, 1},
  74. { "FR_12", FR_12, 1},
  75. { "FR_13", FR_13, 1},
  76. { "FR_14", FR_14, 1},
  77. { "FR_15", FR_15, 1},
  78. { "FR_16", FR_16, 1},
  79. { "FR_20", FR_20, 1},
  80. { "FR_21", FR_21, 1},
  81. { "FR_22", FR_22, 1},
  82. { "FR_23", FR_23, 1},
  83. { "FR_24", FR_24, 1},
  84. { "FR_25", FR_25, 1},
  85. { "FR_26", FR_26, 1},
  86. { "FR_30", FR_30, 1},
  87. { "FR_31", FR_31, 1},
  88. { "FR_32", FR_32, 1},
  89. { "FR_33", FR_33, 1},
  90. { "FR_34", FR_34, 1},
  91. { "FR_35", FR_35, 1},
  92. { "FR_36", FR_36, 1},
  93. { "FR_40", FR_40, 1},
  94. { "FR_41", FR_41, 1},
  95. { "FR_42", FR_42, 1},
  96. { "FR_43", FR_43, 1},
  97. { "FR_44", FR_44, 1},
  98. { "FR_45", FR_45, 1},
  99. { "FR_46", FR_46, 1},
  100. { "FR_50", FR_50, 1},
  101. { "FR_51", FR_51, 1},
  102. { "FR_52", FR_52, 1},
  103. { "FR_53", FR_53, 1},
  104. { "FR_54", FR_54, 1},
  105. { "FR_55", FR_55, 1},
  106. { "FR_56", FR_56, 1},
  107. { "FR_60", FR_60, 1},
  108. { "FR_61", FR_61, 1},
  109. { "FR_62", FR_62, 1},
  110. { "FR_63", FR_63, 1},
  111. { "FR_64", FR_64, 1},
  112. { "FR_65", FR_65, 1},
  113. { "FR_66", FR_66, 1},
  114. //RL
  115. { "RL_00", RL_00, 2},
  116. { "RL_01", RL_01, 2},
  117. { "RL_02", RL_02, 2},
  118. { "RL_03", RL_03, 2},
  119. { "RL_04", RL_04, 2},
  120. { "RL_05", RL_05, 2},
  121. { "RL_06", RL_06, 2},
  122. { "RL_10", RL_10, 2},
  123. { "RL_11", RL_11, 2},
  124. { "RL_12", RL_12, 2},
  125. { "RL_13", RL_13, 2},
  126. { "RL_14", RL_14, 2},
  127. { "RL_15", RL_15, 2},
  128. { "RL_16", RL_16, 2},
  129. { "RL_20", RL_20, 2},
  130. { "RL_21", RL_21, 2},
  131. { "RL_22", RL_22, 2},
  132. { "RL_23", RL_23, 2},
  133. { "RL_24", RL_24, 2},
  134. { "RL_25", RL_25, 2},
  135. { "RL_26", RL_26, 2},
  136. { "RL_30", RL_30, 2},
  137. { "RL_31", RL_31, 2},
  138. { "RL_32", RL_32, 2},
  139. { "RL_33", RL_33, 2},
  140. { "RL_34", RL_34, 2},
  141. { "RL_35", RL_35, 2},
  142. { "RL_36", RL_36, 2},
  143. { "RL_40", RL_40, 2},
  144. { "RL_41", RL_41, 2},
  145. { "RL_42", RL_42, 2},
  146. { "RL_43", RL_43, 2},
  147. { "RL_44", RL_44, 2},
  148. { "RL_45", RL_45, 2},
  149. { "RL_46", RL_46, 2},
  150. { "RL_50", RL_50, 2},
  151. { "RL_51", RL_51, 2},
  152. { "RL_52", RL_52, 2},
  153. { "RL_53", RL_53, 2},
  154. { "RL_54", RL_54, 2},
  155. { "RL_55", RL_55, 2},
  156. { "RL_56", RL_56, 2},
  157. { "RL_60", RL_60, 2},
  158. { "RL_61", RL_61, 2},
  159. { "RL_62", RL_62, 2},
  160. { "RL_63", RL_63, 2},
  161. { "RL_64", RL_64, 2},
  162. { "RL_65", RL_65, 2},
  163. { "RL_66", RL_66, 2},
  164. //RR
  165. { "RR_00", RR_00, 3},
  166. { "RR_01", RR_01, 3},
  167. { "RR_02", RR_02, 3},
  168. { "RR_03", RR_03, 3},
  169. { "RR_04", RR_04, 3},
  170. { "RR_05", RR_05, 3},
  171. { "RR_06", RR_06, 3},
  172. { "RR_10", RR_10, 3},
  173. { "RR_11", RR_11, 3},
  174. { "RR_12", RR_12, 3},
  175. { "RR_13", RR_13, 3},
  176. { "RR_14", RR_14, 3},
  177. { "RR_15", RR_15, 3},
  178. { "RR_16", RR_16, 3},
  179. { "RR_20", RR_20, 3},
  180. { "RR_21", RR_21, 3},
  181. { "RR_22", RR_22, 3},
  182. { "RR_23", RR_23, 3},
  183. { "RR_24", RR_24, 3},
  184. { "RR_25", RR_25, 3},
  185. { "RR_26", RR_26, 3},
  186. { "RR_30", RR_30, 3},
  187. { "RR_31", RR_31, 3},
  188. { "RR_32", RR_32, 3},
  189. { "RR_33", RR_33, 3},
  190. { "RR_34", RR_34, 3},
  191. { "RR_35", RR_35, 3},
  192. { "RR_36", RR_36, 3},
  193. { "RR_40", RR_40, 3},
  194. { "RR_41", RR_41, 3},
  195. { "RR_42", RR_42, 3},
  196. { "RR_43", RR_43, 3},
  197. { "RR_44", RR_44, 3},
  198. { "RR_45", RR_45, 3},
  199. { "RR_46", RR_46, 3},
  200. { "RR_50", RR_50, 3},
  201. { "RR_51", RR_51, 3},
  202. { "RR_52", RR_52, 3},
  203. { "RR_53", RR_53, 3},
  204. { "RR_54", RR_54, 3},
  205. { "RR_55", RR_55, 3},
  206. { "RR_56", RR_56, 3},
  207. { "RR_60", RR_60, 3},
  208. { "RR_61", RR_61, 3},
  209. { "RR_62", RR_62, 3},
  210. { "RR_63", RR_63, 3},
  211. { "RR_64", RR_64, 3},
  212. { "RR_65", RR_65, 3},
  213. { "RR_66", RR_66, 3},
  214. };
  215. extern int dvr_detect_carback_signal(void);
  216. track_context *g_ptrack_context;
  217. static user_header *g_pheader_buf;
  218. static z_stream stream;
  219. static int initialized;
  220. unsigned int track_pic_id;
  221. unsigned int radar_pic_id;
  222. unsigned int car_pic_id;
  223. unsigned int track2_pic_id;//small track for vbox
  224. extern struct carback_context *g_carback_context;
  225. extern int first_draw_track;
  226. static user2_header *g_pheader2_buf;
  227. track_context2 *g_ptrack_context2;
  228. #if 0
  229. static unsigned int get_time_ms(void)
  230. {
  231. struct timeval tv;
  232. //float s;
  233. do_gettimeofday(&tv);
  234. //s = tv.tv_usec; s *= 0.000001; s += tv.tv_sec;
  235. return tv.tv_sec * 1000 + tv.tv_usec / 1000;
  236. }
  237. #endif
  238. static void show_header_info(void)
  239. {
  240. user_header *p = g_pheader_buf;
  241. if (p == NULL) {
  242. printk(KERN_ERR "header_info_show error!\n");
  243. return;
  244. }
  245. ARKTRACK_DBGPRTK("header_buf ===>identity=0x%0x track_total=%d car_total=%d signal_total= %d radar_total=%d file_type=0x%0x file_size=0x%0x\n", \
  246. p->identity, p->track_total, p->car_total, p->signal_total, p->radar_total, p->file_type, p->file_size);
  247. ARKTRACK_DBGPRTK("track rect ===> pos_x=%d pos_y=%d width=%d height=%d\n", p->track_rect.pos_x, \
  248. p->track_rect.pos_y, p->track_rect.width, p->track_rect.height);
  249. ARKTRACK_DBGPRTK("car rect ===> pos_x=%d pos_y=%d width=%d height=%d\n", p->car_rect.pos_x, \
  250. p->car_rect.pos_y, p->car_rect.width, p->car_rect.height);
  251. ARKTRACK_DBGPRTK("signal rect ===> pos_x=%d pos_y=%d width=%d height=%d\n", p->signal_rect.pos_x, \
  252. p->signal_rect.pos_y, p->signal_rect.width, p->signal_rect.height);
  253. ARKTRACK_DBGPRTK("radar0 rect===> pos_x=%d pos_y=%d width=%d height=%d\n", p->radar_rect[0].pos_x, \
  254. p->radar_rect[0].pos_y, p->radar_rect[0].width, p->radar_rect[0].height);
  255. ARKTRACK_DBGPRTK("radar1 rect===> pos_x=%d pos_y=%d width=%d height=%d\n", p->radar_rect[1].pos_x, \
  256. p->radar_rect[1].pos_y, p->radar_rect[1].width, p->radar_rect[1].height);
  257. ARKTRACK_DBGPRTK("radar2 rect===> pos_x=%d pos_y=%d width=%d height=%d\n", p->radar_rect[2].pos_x, \
  258. p->radar_rect[2].pos_y, p->radar_rect[2].width, p->radar_rect[2].height);
  259. ARKTRACK_DBGPRTK("radar3 rect===> pos_x=%d pos_y=%d width=%d height=%d\n", p->radar_rect[3].pos_x, \
  260. p->radar_rect[3].pos_y, p->radar_rect[3].width, p->radar_rect[3].height);
  261. ARKTRACK_DBGPRTK("track2 rect===> pos_x=%d pos_y=%d width=%d height=%d\n", p->track2_rect.pos_x, \
  262. p->track2_rect.pos_y, p->track2_rect.width, p->track2_rect.height);
  263. ARKTRACK_DBGPRTK("track[0] image===> image_type=%d image_store_id=%d image_id=0x%0x image_offset=0x%0x image_size=0x%0x\n", \
  264. p->track[0].image_type, p->track[0].image_store_id, p->track[0].image_id, p->track[0].image_offset, p->track[0].image_size);
  265. ARKTRACK_DBGPRTK("car[0] image===> image_type=%d image_store_id=%d image_id=0x%0x image_offset=0x%0x image_size=0x%0x\n", \
  266. p->car[0].image_type, p->car[0].image_store_id, p->car[0].image_id, p->car[0].image_offset, p->car[0].image_size);
  267. ARKTRACK_DBGPRTK("signal[0] image===> image_type=%d image_store_id=%d image_id=0x%0x image_offset=0x%0x image_size=0x%0x\n", \
  268. p->signal[0].image_type, p->signal[0].image_store_id, p->signal[0].image_id, p->signal[0].image_offset, p->signal[0].image_size);
  269. ARKTRACK_DBGPRTK("radar[1] image===> image_type=%d image_store_id=%d image_id=0x%0x image_offset=0x%0x image_size=0x%0x\n", \
  270. p->radar[1].image_type, p->radar[1].image_store_id, p->radar[1].image_id, p->radar[1].image_offset, p->radar[1].image_size);
  271. ARKTRACK_DBGPRTK("track2[0]image===> image_type=%d image_store_id=%d image_id=0x%0x image_offset=0x%0x image_size=0x%0x\n", \
  272. p->track2[0].image_type, p->track2[0].image_store_id, p->track2[0].image_id, p->track2[0].image_offset, p->track2[0].image_size);
  273. }
  274. static int check_header_info(void)
  275. {
  276. int i;
  277. int fail = -1;
  278. user_header *p = g_pheader_buf;
  279. //check header info
  280. if (p->identity != ARK_IDENTITY || p->track_total == 0 || p->file_size <= sizeof(user_header)) {
  281. printk(KERN_ERR "identity info error!\n");
  282. return fail;
  283. }
  284. if (p->track_rect.width > g_carback_context->screen_width || p->track_rect.width == 0) {
  285. printk(KERN_ERR "track rect width error!\n");
  286. return fail;
  287. }
  288. if (p->track_rect.height > g_carback_context->screen_height || p->track_rect.height == 0) {
  289. printk(KERN_ERR "track rect height error!\n");
  290. return fail;
  291. }
  292. for (i = 0; i < TRACK_MAX; i++) {
  293. if (p->track[i].image_store_id > TRACK_MAX) {
  294. printk(KERN_ERR "track[%d].image_store_id error!\n", i);
  295. return fail;
  296. }
  297. }
  298. for (i = 0; i < CAR_MAX; i++) {
  299. if (p->car[i].image_store_id > CAR_MAX) {
  300. printk(KERN_ERR "track[%d].image_store_id error!\n", i);
  301. return fail;
  302. }
  303. }
  304. for (i = 0; i < p->radar_total; i++) {
  305. if (p->radar[i].image_store_id > RADAR_MAX) {
  306. printk(KERN_ERR "track[%d].image_store_id error!\n", i);
  307. return fail;
  308. }
  309. }
  310. for (i = 0; i < TRACK_MAX; i++) {
  311. if (p->track2[i].image_store_id > TRACK_MAX) {
  312. printk(KERN_ERR "track2[%d].image_store_id error!\n", i);
  313. return fail;
  314. }
  315. }
  316. return 0;
  317. }
  318. static bool is_radar_image_id(unsigned int image_id)
  319. {
  320. int i;
  321. for (i = 0; i < RADAR_MAX; i++) {
  322. if (radar_idmap[i].image_id == image_id) {
  323. return true;
  324. }
  325. }
  326. return false;
  327. }
  328. int set_disp_track_id(unsigned int track_id)
  329. {
  330. static unsigned int pre_id = IMAGE_ID_NONE;
  331. track_context *p = g_ptrack_context;
  332. if (p == NULL) {
  333. printk(KERN_ALERT "%s: g_ptrack_context NULL, error!\n", __func__);
  334. return -1;
  335. }
  336. if (track_id >= TRACK_MAX && track_id < IMAGE_ID_NONE) {
  337. printk(KERN_ERR "set disp track image id error!\n");
  338. return -1;
  339. }
  340. if (pre_id != track_id || IMAGE_ID_NONE == track_id) {
  341. p->disp_track_id = track_id;
  342. pre_id = track_id;
  343. }
  344. return 0;
  345. }
  346. int set_disp_car_id(unsigned int car_id)
  347. {
  348. static unsigned int pre_id = IMAGE_ID_NONE;
  349. track_context *p = g_ptrack_context;
  350. if (p == NULL) {
  351. printk(KERN_ALERT "%s: g_ptrack_context NULL, error!\n", __func__);
  352. return -1;
  353. }
  354. if (car_id >= CAR_MAX && car_id < IMAGE_ID_NONE) {
  355. printk(KERN_ERR "set disp car image id error!\n");
  356. return -1;
  357. }
  358. if (pre_id != car_id || IMAGE_ID_NONE == car_id) {
  359. p->disp_car_id = car_id;
  360. pre_id = car_id;
  361. }
  362. return 0;
  363. }
  364. int set_disp_radar_id(unsigned int radar_id)
  365. {
  366. static unsigned int pre_id = IMAGE_ID_NONE;
  367. track_context *p = g_ptrack_context;
  368. unsigned int image_id;
  369. unsigned char channel;
  370. unsigned int mask = 0xff000000;
  371. unsigned int disp_id = 0;
  372. if (p == NULL) {
  373. printk(KERN_ALERT "%s: g_ptrack_context NULL, error!\n", __func__);
  374. return -1;
  375. }
  376. if (radar_id == IMAGE_ID_NONE) {
  377. p->disp_radar_id = IMAGE_ID_NONE;
  378. pre_id = IMAGE_ID_NONE;
  379. return 0;
  380. }
  381. if (pre_id == radar_id) {
  382. return 0;
  383. }
  384. for (channel = RADAR_CHANNEL_FL; channel <= RADAR_CHANNEL_RR; channel++) {
  385. image_id = radar_id & (mask >> 8*channel);
  386. if (!is_radar_image_id(image_id)) {
  387. printk(KERN_ERR "set disp radar id channel=%d ,error!\n", channel);
  388. continue;
  389. }
  390. disp_id |= image_id;
  391. }
  392. p->disp_radar_id = disp_id;
  393. pre_id = disp_id;
  394. //printk(KERN_ALERT "set disp radar id disp_id=0x%0x.\n",disp_id);
  395. return 0;
  396. }
  397. int set_disp_signal_id(unsigned int disp_signal_id)
  398. {
  399. static unsigned int pre_id = IMAGE_ID_NONE;
  400. track_context *p = g_ptrack_context;
  401. if (p == NULL) {
  402. printk(KERN_ALERT "%s: g_ptrack_context NULL, error!\n", __func__);
  403. return -1;
  404. }
  405. if (disp_signal_id >= SIGNAL_MAX && disp_signal_id < IMAGE_ID_NONE) {
  406. printk(KERN_ERR "set disp signal image id error!\n");
  407. return -1;
  408. }
  409. if (pre_id != disp_signal_id || IMAGE_ID_NONE == disp_signal_id) {
  410. p->disp_signal_id = disp_signal_id;
  411. pre_id = disp_signal_id;
  412. }
  413. //printk(KERN_ALERT "++++++p->disp_signal_id = %d\n" ,p->disp_signal_id);
  414. return 0;
  415. }
  416. int set_disp_track2_id(unsigned int track2_id)
  417. {
  418. static unsigned int pre_id = IMAGE_ID_NONE;
  419. track_context *p = g_ptrack_context;
  420. if (p == NULL) {
  421. printk(KERN_ALERT "%s: g_ptrack_context NULL, error!\n", __func__);
  422. return -1;
  423. }
  424. if (track2_id >= TRACK_MAX && track2_id < IMAGE_ID_NONE) {
  425. printk(KERN_ERR "set disp track2 image id error!\n");
  426. return -1;
  427. }
  428. if (pre_id != track2_id || IMAGE_ID_NONE == track2_id) {
  429. p->disp_track2_id = track2_id;
  430. pre_id = track2_id;
  431. }
  432. return 0;
  433. }
  434. /*
  435. *set_disp_mradar_id: radar new solution
  436. *
  437. *-------------------------front-----------------------
  438. *
  439. * mradar0 mradar1 mradar2 mradar3
  440. * +-----------------+
  441. * | |
  442. * | |
  443. * mradar8 | | mradar12
  444. * | |
  445. * mradar9 | | mradar13
  446. * | |
  447. * mradar10| | mradar14
  448. * | |
  449. * mradar11| | mradar15
  450. * | |
  451. * | |
  452. * +-----------------+
  453. * mradar4 mradar5 mradar6 mradar7
  454. *
  455. *-------------------------rear-----------------------
  456. */
  457. int set_disp_mradar_id(unsigned char *pimage_id)
  458. {
  459. static unsigned char pre_mradar_id[MRADAR_MAX] = {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF};
  460. unsigned char mradar_id[MRADAR_MAX];
  461. track_context2 *p = g_ptrack_context2;
  462. int i;
  463. if (p == NULL) {
  464. //printk(KERN_ALERT "%s: no header2 ,set mradar id invalid!\n", __FUNCTION__);
  465. return 0;
  466. }
  467. memcpy(mradar_id, pimage_id, MRADAR_MAX);
  468. for (i = 0; i < MRADAR_MAX; i++) {
  469. ARKTRACK_DBGPRTK("mradar_id[%d]=%d\n", i, mradar_id[i]);
  470. if (mradar_id[i] > 0xF) {
  471. printk(KERN_ALERT "%s: mradar_id[%d]=%d, MRADAR_MAX=0xF, error.\n", __func__, i, mradar_id[i]);
  472. return -1;
  473. }
  474. }
  475. for (i = 0; i < MRADAR_MAX; i++) {
  476. if (pre_mradar_id[i] != mradar_id[i]) {
  477. break;
  478. }
  479. }
  480. if (i < MRADAR_MAX) {
  481. memcpy(p->disp_mradar_id, mradar_id, MRADAR_MAX);
  482. memcpy(pre_mradar_id, mradar_id, MRADAR_MAX);
  483. p->disp_mradar_id_change = 1;
  484. }
  485. return 0;
  486. }
  487. static int init_track_context(unsigned int addr)
  488. {
  489. int ret = -1;
  490. int size;
  491. int i;
  492. unsigned char *p;
  493. //printk(KERN_ALERT "init_track_context ...\n");
  494. if (addr == 0) {
  495. printk(KERN_ERR "addr error!\n");
  496. return ret;
  497. }
  498. g_pheader_buf = (user_header *)addr;
  499. show_header_info();
  500. if (check_header_info() < 0) {
  501. printk(KERN_ERR "identity info error!\n");
  502. return ret;
  503. }
  504. p = vzalloc(sizeof(track_context));
  505. if (p == NULL) {
  506. printk(KERN_ERR "%s %d: failed to allocate track_context\n", __func__, __LINE__);
  507. return -ENOMEM;
  508. }
  509. g_ptrack_context = (track_context *)p;
  510. g_ptrack_context->disp_track_size = 4 * g_pheader_buf->track_rect.width * g_pheader_buf->track_rect.height;
  511. if (g_pheader_buf->track_total > 0) {
  512. size = 4 * g_pheader_buf->track_rect.width * g_pheader_buf->track_rect.height;
  513. p = vzalloc(size);
  514. if (p == NULL) {
  515. printk(KERN_ERR "%s %d: failed to allocate track\n", __func__, __LINE__);
  516. ret = -ENOMEM;
  517. goto err_track2;
  518. }
  519. g_ptrack_context->disp_track_buf = p;
  520. g_ptrack_context->disp_track_size = size;
  521. }
  522. if (g_pheader_buf->car_total > 0) {
  523. size = 4 * g_pheader_buf->car_rect.width * g_pheader_buf->car_rect.height;
  524. p = vzalloc(size);
  525. if (p == NULL) {
  526. printk(KERN_ERR "%s %d: failed to allocate car\n", __func__, __LINE__);
  527. ret = -ENOMEM;
  528. goto err_car;
  529. }
  530. g_ptrack_context->disp_car_buf = p;
  531. g_ptrack_context->disp_car_size = size;
  532. }
  533. if (g_pheader_buf->signal_total > 0) {
  534. size = 4 * g_pheader_buf->signal_rect.width * g_pheader_buf->signal_rect.height;
  535. p = vzalloc(size);
  536. if (p == NULL) {
  537. printk(KERN_ERR "%s %d: failed to allocate car\n", __func__, __LINE__);
  538. ret = -ENOMEM;
  539. goto err_car;
  540. }
  541. g_ptrack_context->disp_signal_buf = p;
  542. g_ptrack_context->disp_signal_size = size;
  543. }
  544. if (g_pheader_buf->radar_total > 0) {
  545. size = 4 * g_pheader_buf->radar_rect[0].width * g_pheader_buf->radar_rect[0].height;
  546. for (i = 0; i < 4; i++) {
  547. p = vzalloc(size);
  548. if (p == NULL) {
  549. printk(KERN_ERR "%s %d: failed to allocate radar\n", __func__, __LINE__);
  550. ret = -ENOMEM;
  551. while (i-- >= 0) {
  552. vfree(g_ptrack_context->disp_radar_buf[i]);
  553. }
  554. goto err_radar;
  555. }
  556. g_ptrack_context->disp_radar_buf[i] = p;
  557. g_ptrack_context->disp_radar_size = size;
  558. }
  559. }
  560. if (g_pheader_buf->track2_total > 0) {
  561. size = 4 * g_pheader_buf->track2_rect.width * g_pheader_buf->track2_rect.height;
  562. p = vzalloc(size);
  563. if (p == NULL) {
  564. printk(KERN_ERR "%s %d: failed to allocate track2\n", __func__, __LINE__);
  565. ret = -ENOMEM;
  566. goto err_track2;
  567. }
  568. g_ptrack_context->disp_track2_buf = p;
  569. g_ptrack_context->disp_track2_size = size;
  570. }
  571. g_ptrack_context->pheader_buf = g_pheader_buf;
  572. g_ptrack_context->disp_xpos = g_pheader_buf->track_rect.pos_x;
  573. g_ptrack_context->disp_ypos = g_pheader_buf->track_rect.pos_y;
  574. g_ptrack_context->disp_width = g_carback_context->screen_width;
  575. g_ptrack_context->disp_height = g_carback_context->screen_height;
  576. memcpy(&g_ptrack_context->track_param, &g_pheader_buf->track_rect, sizeof(track_param_context));
  577. g_ptrack_context->file_type = g_pheader_buf->file_type;
  578. g_ptrack_context->disp_track_id = IMAGE_ID_NONE;
  579. g_ptrack_context->disp_car_id = IMAGE_ID_NONE;
  580. g_ptrack_context->disp_radar_id = IMAGE_ID_NONE;
  581. g_ptrack_context->disp_track2_id = IMAGE_ID_NONE;
  582. return 0;
  583. err_track2:
  584. for (i = 0; i < 4; i++)
  585. if (g_ptrack_context->disp_radar_buf[i])
  586. vfree(g_ptrack_context->disp_radar_buf[i]);
  587. err_radar:
  588. if (g_ptrack_context->disp_car_buf)
  589. vfree(g_ptrack_context->disp_car_buf);
  590. err_car:
  591. if (g_ptrack_context)
  592. vfree(g_ptrack_context);
  593. return ret;
  594. }
  595. static void show_header2_info(void)
  596. {
  597. user2_header *p = g_pheader2_buf;
  598. rect_info *prect;
  599. item_info *pitem;
  600. int i;
  601. if (p == NULL) {
  602. printk(KERN_ERR "header_info_show error!\n");
  603. return;
  604. }
  605. ARKTRACK_DBGPRTK("header2_buf ===>identity=0x%0x,file_type=0x%0x file_size=0x%0x\n", p->identity, p->file_type, p->file_size);
  606. for (i = 0; i < MRADAR_MAX; i++) {
  607. prect = &p->mradar_rect[i];
  608. pitem = &p->mradar[i][0];
  609. ARKTRACK_DBGPRTK("mradar_rect[%d]===>total=%d, pos_x=%d pos_y=%d width=%d height=%d\n", \
  610. i, p->mradar_total[i], prect->pos_x, prect->pos_y, prect->width, prect->height);
  611. ARKTRACK_DBGPRTK("mradar[%d][0] ===> image_type=%d image_store_id=%d image_id=0x%0x image_offset=0x%0x image_size=0x%0x\n", \
  612. i, pitem->image_type, pitem->image_store_id, pitem->image_id, pitem->image_offset, pitem->image_size);
  613. }
  614. }
  615. static int check_header2_info(void)
  616. {
  617. int i, j;
  618. user2_header *p = g_pheader2_buf;
  619. if (p == NULL) {
  620. printk(KERN_ERR "check_header2_info error!\n");
  621. return -1;
  622. }
  623. //check header info
  624. if (p->identity != ARK_IDENTITY || p->file_size <= sizeof(user2_header)) {
  625. printk(KERN_ERR "header2 identity info error!\n");
  626. return -1;
  627. }
  628. for (j = 0 ; j < MRADAR_MAX; j++) {
  629. for (i = 0; i < MRADAR_ITEM_MAX; i++) {
  630. if (p->mradar[j][i].image_id > MRADAR_MAX) {
  631. printk(KERN_ALERT "track[%d].image_id error!\n", i);
  632. return -1;
  633. }
  634. }
  635. }
  636. printk(KERN_ALERT "check_header2_info success!\n");
  637. return 0;
  638. }
  639. static int init_track_context2(unsigned int addr)
  640. {
  641. unsigned int header2_addr_start;
  642. unsigned char *p;
  643. int ret = -1;
  644. int size;
  645. int i;
  646. //printk(KERN_ALERT "file_type=%0x ---> HEADER2_FILE_FLAG=%0x.\n", g_pheader_buf->file_type, HEADER2_FILE_FLAG);
  647. if ((g_pheader_buf->file_type & 0x80000000) != HEADER2_FILE_FLAG) {
  648. printk(KERN_ALERT "only header file.\n");
  649. return 0;
  650. }
  651. if (addr == 0) {
  652. printk(KERN_ERR "addr error!\n");
  653. return -1;
  654. }
  655. //g_pheader2_buf = (user2_header*)(addr + g_pheader_buf->file_size);
  656. p = vzalloc(sizeof(user2_header));
  657. if (p == NULL) {
  658. printk(KERN_ERR "%s: failed to user2_header.\n", __func__);
  659. return -1;
  660. }
  661. header2_addr_start = addr + g_pheader_buf->file_size;
  662. printk(KERN_ALERT "header2_addr_start=0x%0x.\n", header2_addr_start);
  663. memcpy(p, (void *)header2_addr_start, sizeof(user2_header));
  664. g_pheader2_buf = (user2_header *)p;
  665. show_header2_info();
  666. if (check_header2_info() < 0) {
  667. printk(KERN_ALERT "check_header2_info failed!\n");
  668. return -1;
  669. }
  670. p = vzalloc(sizeof(track_context2));
  671. if (p == NULL) {
  672. printk(KERN_ERR "%s %d: failed to allocate track_context2\n", __func__, __LINE__);
  673. return -1;
  674. }
  675. memset(p, 0, sizeof(track_context2));
  676. g_ptrack_context2 = (track_context2 *)p;
  677. g_ptrack_context2->pheader2_buf = g_pheader2_buf;
  678. g_ptrack_context2->file_type = g_pheader2_buf->file_type;
  679. memset(g_ptrack_context2->disp_mradar_id, 0x0F, MRADAR_MAX);
  680. for (i = 0; i < MRADAR_MAX; i++) {
  681. size = 4 * g_pheader2_buf->mradar_rect[i].width * g_pheader2_buf->mradar_rect[i].height;
  682. p = vzalloc(size);
  683. if (p == NULL) {
  684. printk(KERN_ERR "%s %d: failed to allocate radar\n", __func__, __LINE__);
  685. ret = -ENOMEM;
  686. while (i-- >= 0) {
  687. vfree(g_ptrack_context2->disp_mradar_buf[i]);
  688. }
  689. vfree(g_pheader2_buf);
  690. return -1;
  691. }
  692. g_ptrack_context2->disp_mradar_buf[i] = p;
  693. g_ptrack_context2->disp_mradar_size[i] = size;
  694. memcpy(&g_ptrack_context2->mradar_param.mradar_rect[i], &g_pheader2_buf->mradar_rect[i], sizeof(rect_info));
  695. ARKTRACK_DBGPRTK("mradar_buf[%d]=0x%0x, size=0x%0x\n", i, p, size);
  696. }
  697. printk(KERN_ALERT "%s: success.\n", __func__);
  698. return 0;
  699. }
  700. static int get_radar_channel(unsigned int image_id)
  701. {
  702. int i;
  703. int channel = -1;
  704. for (i = 0; i < RADAR_MAX; i++) {
  705. if (radar_idmap[i].image_id == image_id) {
  706. channel = radar_idmap[i].dis_channel;
  707. break;
  708. }
  709. }
  710. return channel;
  711. }
  712. static unsigned int get_picture_addr(enum image_type type, unsigned int id)
  713. {
  714. unsigned int offset;
  715. int i;
  716. if (type == IMAGE_TYPE_TRACK) {
  717. offset = g_pheader_buf->track[id].image_offset;
  718. } else if(type == IMAGE_TYPE_CAR){
  719. offset = g_pheader_buf->car[id].image_offset;
  720. } else if(type == IMAGE_TYPE_SIGNAL){
  721. offset = g_pheader_buf->signal[id].image_offset;
  722. } else if(type == IMAGE_TYPE_RADAR){
  723. for (i = 0; i < RADAR_MAX; i++) {
  724. if (g_pheader_buf->radar[i].image_id == id) {
  725. offset = g_pheader_buf->radar[i].image_offset;
  726. break;
  727. }
  728. }
  729. } else if(type == IMAGE_TYPE_TRACK2){
  730. offset = g_pheader_buf->track2[id].image_offset;
  731. }
  732. return g_carback_context->track_data_virtaddr + offset;
  733. }
  734. static unsigned int get_picture_offset(enum image_type type, unsigned int id)
  735. {
  736. unsigned int offset = 0;
  737. int i;
  738. if (type == IMAGE_TYPE_TRACK) {
  739. offset = g_pheader_buf->track[id].image_offset;
  740. } else if(type == IMAGE_TYPE_CAR){
  741. offset = g_pheader_buf->car[id].image_offset;
  742. } else if(type == IMAGE_TYPE_SIGNAL){
  743. offset = g_pheader_buf->signal[id].image_offset;
  744. } else if(type == IMAGE_TYPE_RADAR){
  745. for (i = 0; i < RADAR_MAX; i++) {
  746. if (g_pheader_buf->radar[i].image_id == id) {
  747. offset = g_pheader_buf->radar[i].image_offset;
  748. break;
  749. }
  750. }
  751. } else if(type == IMAGE_TYPE_TRACK2){
  752. offset = g_pheader_buf->track2[id].image_offset;
  753. }
  754. return offset;
  755. }
  756. static unsigned int get_picture_size(enum image_type type, unsigned int id)
  757. {
  758. unsigned int image_size = 0;
  759. int i;
  760. if (type == IMAGE_TYPE_TRACK) {
  761. image_size = g_pheader_buf->track[id].image_size;
  762. } else if(type == IMAGE_TYPE_CAR){
  763. image_size = g_pheader_buf->car[id].image_size;
  764. } else if(type == IMAGE_TYPE_SIGNAL){
  765. image_size = g_pheader_buf->signal[id].image_size;
  766. } else if(type == IMAGE_TYPE_RADAR){
  767. for (i = 0; i < RADAR_MAX; i++) {
  768. if (g_pheader_buf->radar[i].image_id == id) {
  769. image_size = g_pheader_buf->radar[i].image_size;
  770. break;
  771. }
  772. }
  773. } else if(type == IMAGE_TYPE_TRACK2){
  774. image_size = g_pheader_buf->track2[id].image_size;
  775. }
  776. return image_size;
  777. }
  778. /* Returns length of decompressed data. */
  779. static int zlib_uncompress_block(void *dst, int dstlen, void *src, int srclen)
  780. {
  781. int err;
  782. stream.next_in = src;
  783. stream.avail_in = srclen;
  784. stream.next_out = dst;
  785. stream.avail_out = dstlen;
  786. err = zlib_inflateReset(&stream);
  787. if (err != Z_OK) {
  788. printk("zlib_inflateReset error %d\n", err);
  789. zlib_inflateEnd(&stream);
  790. zlib_inflateInit(&stream);
  791. }
  792. err = zlib_inflate(&stream, Z_FINISH);
  793. if (err != Z_STREAM_END)
  794. goto err;
  795. return stream.total_out;
  796. err:
  797. printk(KERN_ERR "Error %d while decompressing!\n", err);
  798. printk(KERN_ERR "%p(%d)->%p(%d)\n", src, srclen, dst, dstlen);
  799. return -EIO;
  800. }
  801. static int zlib_uncompress_init(void)
  802. {
  803. if (!initialized++) {
  804. stream.workspace = vmalloc(zlib_inflate_workspacesize());
  805. if (!stream.workspace) {
  806. initialized = 0;
  807. return -ENOMEM;
  808. }
  809. stream.next_in = NULL;
  810. stream.avail_in = 0;
  811. zlib_inflateInit(&stream);
  812. }
  813. return 0;
  814. }
  815. static void zlib_uncompress_exit(void)
  816. {
  817. if (!--initialized) {
  818. zlib_inflateEnd(&stream);
  819. vfree(stream.workspace);
  820. }
  821. }
  822. static void copy_line_data(unsigned int *dest, unsigned int *src, unsigned int width, enum cover_type cover)
  823. {
  824. unsigned int i;
  825. unsigned int *psrc = (unsigned int *)src;
  826. unsigned int *pdest = (unsigned int *)dest;
  827. if (cover == SRC_COVER_DST) {
  828. memcpy(pdest, psrc, width*PIXEL_DATA_SIZE);
  829. } else if (cover == DST_COVER_SRC2) {
  830. for (i = 0; i < width; i++) {
  831. if (*pdest == PIXEL_DATA_NONE || *pdest == PIXEL_DATA_ZERO)
  832. *pdest = *psrc;
  833. psrc++;
  834. pdest++;
  835. }
  836. } else if(cover == SRC_COVER_DST2){
  837. for (i = 0; i < width; i++) {
  838. if (*psrc == 0xFFFFFFFF || *psrc == PIXEL_DATA_NONE || *psrc == PIXEL_DATA_ZERO) {
  839. psrc++;
  840. pdest++;
  841. continue;
  842. }
  843. *pdest = *psrc;
  844. psrc++;
  845. pdest++;
  846. }
  847. }
  848. }
  849. static int copy_pic_data(void *dest, void *src, enum image_type type, unsigned int id, enum cover_type cover)
  850. {
  851. unsigned int width;
  852. unsigned int height;
  853. unsigned int pos_x;
  854. unsigned int pos_y;
  855. track_param_context *p = &g_ptrack_context->track_param;
  856. unsigned int *dest_tmp;
  857. unsigned int *src_tmp;
  858. int radar_channel;
  859. int i;
  860. if (dest == NULL || src == NULL) {
  861. printk(KERN_ERR "paint car dest src error!\n");
  862. return -1;
  863. }
  864. if (type == IMAGE_TYPE_TRACK) {
  865. width = p->track_rect.width;
  866. height = p->track_rect.height;
  867. pos_x = p->track_rect.pos_x;
  868. pos_y = p->track_rect.pos_y;
  869. } else if(type == IMAGE_TYPE_CAR){
  870. width = p->car_rect.width;
  871. height = p->car_rect.height;
  872. pos_x = p->car_rect.pos_x;
  873. pos_y = p->car_rect.pos_y;
  874. } else if(type == IMAGE_TYPE_RADAR){
  875. radar_channel = get_radar_channel(id);
  876. if (radar_channel < 0) {
  877. printk(KERN_ERR "get radar_channel error!\n");
  878. return -1;
  879. }
  880. width = p->radar_rect[radar_channel].width;
  881. height = p->radar_rect[radar_channel].height;
  882. pos_x = p->radar_rect[radar_channel].pos_x;
  883. pos_y = p->radar_rect[radar_channel].pos_y;
  884. } else if(type == IMAGE_TYPE_SIGNAL){
  885. width = p->signal_rect.width;
  886. height = p->signal_rect.height;
  887. pos_x = p->signal_rect.pos_x;
  888. pos_y = p->signal_rect.pos_y;
  889. } else if(type == IMAGE_TYPE_TRACK2){
  890. width = p->track2_rect.width;
  891. height = p->track2_rect.height;
  892. pos_x = p->track2_rect.pos_x;
  893. pos_y = p->track2_rect.pos_y;
  894. } else if(type == IMAGE_TYPE_MRADAR){
  895. mradar_param_context *p2 = &g_ptrack_context2->mradar_param;
  896. width = p2->mradar_rect[id].width;
  897. height = p2->mradar_rect[id].height;
  898. pos_x = p2->mradar_rect[id].pos_x;
  899. pos_y = p2->mradar_rect[id].pos_y;
  900. } else{
  901. printk(KERN_ERR "paint car type error!\n");
  902. return -1;
  903. }
  904. for (i = 0; i < height; i++) {
  905. dest_tmp = dest + g_ptrack_context->disp_width * (pos_y + i) * PIXEL_DATA_SIZE + pos_x * PIXEL_DATA_SIZE;
  906. src_tmp = src + i * width * PIXEL_DATA_SIZE;
  907. copy_line_data(dest_tmp, src_tmp, width, cover);
  908. }
  909. return 0;
  910. }
  911. static unsigned int subjoin_car_pic(void *dest)
  912. {
  913. static unsigned int last_id = IMAGE_ID_NONE;
  914. track_context *p = g_ptrack_context;
  915. void *dest_car = p->disp_car_buf;
  916. unsigned int dest_size = p->disp_car_size;
  917. unsigned int fill_size = 0;
  918. unsigned int source_size;
  919. unsigned int source_offset;
  920. void *source;
  921. if (p->disp_car_id > CAR_MAX)
  922. return 0;
  923. if (first_draw_track)
  924. last_id = IMAGE_ID_NONE;
  925. source_offset = get_picture_offset(IMAGE_TYPE_CAR, p->disp_car_id);
  926. source_size = get_picture_size(IMAGE_TYPE_CAR, p->disp_car_id);
  927. //printk(KERN_ALERT "source_offset=%0x ,source_size=%0x\n",source_offset,source_size );
  928. if (source_size == 0 || source_offset < sizeof(user_header)) {
  929. printk(KERN_ERR "subjoin car pic source error, disp_car_id=0x%0x.\n", p->disp_car_id);
  930. return 0;
  931. }
  932. if (last_id == IMAGE_ID_NONE || last_id != p->disp_car_id) {
  933. source = (void*)get_picture_addr(IMAGE_TYPE_CAR, p->disp_car_id);
  934. fill_size = zlib_uncompress_block(dest_car, dest_size, source, source_size);
  935. if (fill_size != dest_size) {
  936. printk(KERN_ERR " zlib uncompress car error!\n");
  937. return fill_size;
  938. }
  939. }
  940. copy_pic_data(dest, dest_car, IMAGE_TYPE_CAR, p->disp_car_id, SRC_COVER_DST);
  941. last_id = p->disp_car_id;
  942. return fill_size;
  943. }
  944. static unsigned int subjoin_signal_pic(void *dest)
  945. {
  946. static unsigned int last_id = IMAGE_ID_NONE;
  947. track_context *p = g_ptrack_context;
  948. void *dest_signal = p->disp_signal_buf;
  949. unsigned int dest_size = p->disp_signal_size;
  950. unsigned int fill_size = 0;
  951. unsigned int source_size;
  952. unsigned int source_offset;
  953. void *source;
  954. if (p->disp_signal_id > SIGNAL_MAX)
  955. return 0;
  956. if (first_draw_track)
  957. last_id = IMAGE_ID_NONE;
  958. source_offset = get_picture_offset(IMAGE_TYPE_SIGNAL, p->disp_signal_id);
  959. source_size = get_picture_size(IMAGE_TYPE_SIGNAL, p->disp_signal_id);
  960. //printk(KERN_ALERT "~~~~~~source_offset=%0x ,source_size=%0x\n",source_offset,source_size );
  961. if (source_size == 0 || source_offset < sizeof(user_header)) {
  962. printk(KERN_ERR "subjoin signal pic source error, disp_signal_id=0x%0x.\n", p->disp_signal_id);
  963. return 0;
  964. }
  965. if (last_id == IMAGE_ID_NONE || last_id != p->disp_signal_id) {
  966. source = (void*)get_picture_addr(IMAGE_TYPE_SIGNAL, p->disp_signal_id);
  967. fill_size = zlib_uncompress_block(dest_signal, dest_size, source, source_size);
  968. if (fill_size != dest_size) {
  969. printk(KERN_ERR " zlib uncompress signal error!\n");
  970. return fill_size;
  971. }
  972. }
  973. copy_pic_data(dest, dest_signal, IMAGE_TYPE_SIGNAL, p->disp_signal_id, SRC_COVER_DST);
  974. last_id = p->disp_signal_id;
  975. return fill_size;
  976. }
  977. static unsigned int subjoin_track_pic(void *dest)
  978. {
  979. static unsigned int last_id = IMAGE_ID_NONE;
  980. track_context *p = g_ptrack_context;
  981. void *dest_track = p->disp_track_buf;
  982. unsigned int dest_size = p->disp_track_size;
  983. unsigned int fill_size = 0;
  984. unsigned int source_size;
  985. unsigned int source_offset;
  986. void *source;
  987. if (p->disp_track_id > TRACK_MAX)
  988. return 0;
  989. if (first_draw_track)
  990. last_id = IMAGE_ID_NONE;
  991. source_offset = get_picture_offset(IMAGE_TYPE_TRACK, p->disp_track_id);
  992. source_size = get_picture_size(IMAGE_TYPE_TRACK, p->disp_track_id);
  993. if (source_size == 0 || source_offset < sizeof(user_header)) {
  994. printk(KERN_ERR "subjoin track pic source error, disp_track_id=0x%0x.\n", p->disp_track_id);
  995. return 0;
  996. }
  997. if (last_id == IMAGE_ID_NONE || last_id != p->disp_track_id) {
  998. source = (void*)get_picture_addr(IMAGE_TYPE_TRACK, p->disp_track_id);
  999. fill_size = zlib_uncompress_block(dest_track, dest_size, source, source_size);
  1000. if (fill_size != dest_size) {
  1001. printk(KERN_ERR " zlib uncompress track error!\n");
  1002. return fill_size;
  1003. }
  1004. }
  1005. copy_pic_data(dest, dest_track, IMAGE_TYPE_TRACK, p->disp_track_id, SRC_COVER_DST);
  1006. last_id = p->disp_track_id;
  1007. //printk(KERN_ALERT "p->disp_track_id = %d",p->disp_track_id);
  1008. return fill_size;
  1009. }
  1010. static unsigned int subjoin_radar_pic(void *dest)
  1011. {
  1012. static unsigned int last_id = IMAGE_ID_NONE;
  1013. track_context *p = g_ptrack_context;
  1014. void *dest_radar = p->disp_radar_buf[0];
  1015. unsigned int dest_size = p->disp_radar_size;
  1016. unsigned int mask = 0xff000000;
  1017. unsigned int image_id;
  1018. unsigned char channel;
  1019. unsigned int fill_size = 0;
  1020. unsigned int source_size;
  1021. unsigned int source_offset;
  1022. void *source;
  1023. if (p->disp_radar_id == IMAGE_ID_NONE)
  1024. return 0;
  1025. if (first_draw_track)
  1026. last_id = IMAGE_ID_NONE;
  1027. for (channel = RADAR_CHANNEL_FL; channel <= RADAR_CHANNEL_RR; channel++) {
  1028. image_id = p->disp_radar_id & (mask >> 8*channel);
  1029. if (!is_radar_image_id(image_id)) {
  1030. printk(KERN_ERR " subjoin radar id channel=%d image_id=0x%0x, error!\n", channel, image_id);
  1031. continue;
  1032. }
  1033. dest_radar = p->disp_radar_buf[channel];
  1034. source_size = get_picture_size(IMAGE_TYPE_RADAR, image_id);
  1035. source_offset = get_picture_offset(IMAGE_TYPE_RADAR, image_id);
  1036. //printk(KERN_ALERT "channel=%d image_id=0x%0x ---> source_offset=%0x ,source_size=%0x\n",channel,image_id,source_offset,source_size );
  1037. if (source_size == 0 || source_offset < sizeof(user_header)) {
  1038. printk(KERN_ERR "subjoin radar pic source error,channel=%d image_id=0x%0x.\n", channel, image_id);
  1039. continue;
  1040. }
  1041. if (last_id == IMAGE_ID_NONE || last_id != p->disp_radar_id) {
  1042. source = (void*)get_picture_addr(IMAGE_TYPE_RADAR, image_id);
  1043. fill_size = zlib_uncompress_block(dest_radar, dest_size, source, source_size);
  1044. if (fill_size != dest_size) {
  1045. printk(KERN_ERR " zlib uncompress radar error!\n");
  1046. return fill_size;
  1047. }
  1048. }
  1049. if (channel == RADAR_CHANNEL_RR) {
  1050. copy_pic_data(dest, dest_radar, IMAGE_TYPE_RADAR, image_id, SRC_COVER_DST);
  1051. } else{
  1052. copy_pic_data(dest, dest_radar, IMAGE_TYPE_RADAR, image_id, SRC_COVER_DST);
  1053. }
  1054. }
  1055. last_id = p->disp_radar_id;
  1056. return fill_size;
  1057. }
  1058. static unsigned int subjoin_track2_pic(void *dest)
  1059. {
  1060. static unsigned int last_id = IMAGE_ID_NONE;
  1061. track_context *p = g_ptrack_context;
  1062. void *dest_track2 = p->disp_track2_buf;
  1063. unsigned int dest_size = p->disp_track2_size;
  1064. unsigned int fill_size = 0;
  1065. unsigned int source_size;
  1066. unsigned int source_offset;
  1067. void *source;
  1068. if (p->disp_track2_id > TRACK_MAX)
  1069. return 0;
  1070. if (first_draw_track)
  1071. last_id = IMAGE_ID_NONE;
  1072. source_offset = get_picture_offset(IMAGE_TYPE_TRACK2, p->disp_track2_id);
  1073. source_size = get_picture_size(IMAGE_TYPE_TRACK2, p->disp_track2_id);
  1074. if (source_size == 0 || source_offset < sizeof(user_header)) {
  1075. printk(KERN_ERR "subjoin track2 pic source error, disp_track2_id=0x%0x.\n", p->disp_track2_id);
  1076. return 0;
  1077. }
  1078. if (last_id == IMAGE_ID_NONE || last_id != p->disp_radar_id) {
  1079. source = (void*)get_picture_addr(IMAGE_TYPE_TRACK2, p->disp_track2_id);
  1080. fill_size = zlib_uncompress_block(dest_track2, dest_size, source, source_size);
  1081. if (fill_size != dest_size) {
  1082. printk(KERN_ERR " zlib uncompress track2 error!\n");
  1083. return fill_size;
  1084. }
  1085. }
  1086. copy_pic_data(dest, dest_track2, IMAGE_TYPE_TRACK2, p->disp_track2_id, SRC_COVER_DST);
  1087. last_id = p->disp_track2_id;
  1088. return fill_size;
  1089. }
  1090. static unsigned int subjoin_mradar_pic(void *dest)
  1091. {
  1092. static unsigned char last_mradar_id[MRADAR_MAX] = {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF};
  1093. track_context2 *p = g_ptrack_context2;
  1094. void *dest_buf;
  1095. unsigned int dest_size;
  1096. unsigned int fill_size = 0;
  1097. unsigned int source_size;
  1098. unsigned int source_offset;
  1099. void *source;
  1100. int i, item_id;
  1101. if (p == NULL)
  1102. return -1;
  1103. if (first_draw_track) {
  1104. for (i = 0; i < MRADAR_MAX; i++) {
  1105. last_mradar_id[i] = 0x0F;
  1106. }
  1107. }
  1108. for (i = 0; i < MRADAR_MAX; i++) {
  1109. if (p->disp_mradar_id[i] == 0x0F)
  1110. continue;
  1111. item_id = p->disp_mradar_id[i];
  1112. dest_buf = p->disp_mradar_buf[i];
  1113. dest_size = p->disp_mradar_size[i];
  1114. source_offset = g_pheader2_buf->mradar[i][item_id].image_offset + g_pheader_buf->file_size;
  1115. source_size = g_pheader2_buf->mradar[i][item_id].image_size;
  1116. //printk(KERN_ALERT "mradar[%d][%d]: source_offset=0x%0x ,source_size=0x%0x\n",i,item_id,source_offset,source_size);
  1117. if (source_size == 0 || source_offset < sizeof(user2_header)) {
  1118. //printk(KERN_ERR "subjoin mradar pic source error, mradar[%d][%d].\n",i, item_id);
  1119. continue;
  1120. }
  1121. if (last_mradar_id[i] == 0x0F || last_mradar_id[i] != p->disp_mradar_id[i]) {
  1122. source = (void*)(g_carback_context->track_data_virtaddr+source_offset);
  1123. fill_size = zlib_uncompress_block(dest_buf, dest_size, source, source_size);
  1124. if (fill_size != dest_size) {
  1125. printk(KERN_ERR " zlib uncompress mradar error, fill_size=%0x, dest_size=%0x.\n", fill_size, dest_size);
  1126. return fill_size;
  1127. }
  1128. }
  1129. copy_pic_data(dest, dest_buf, IMAGE_TYPE_MRADAR, i, SRC_COVER_DST2);
  1130. }
  1131. for (i = 0; i < MRADAR_MAX; i++)
  1132. last_mradar_id[i] = p->disp_mradar_id[i];
  1133. p->disp_mradar_id_change = 0;
  1134. return fill_size;
  1135. }
  1136. int track_paint_init(void)
  1137. {
  1138. int ret = 0;
  1139. if (zlib_uncompress_init()) {
  1140. printk(KERN_ERR "zlib uncompress init failed!\n");
  1141. return -1;
  1142. }
  1143. if (*(volatile unsigned int *)g_carback_context->track_data_virtaddr != MKTAG('R', 'S', 'T', 'K')) {
  1144. printk(KERN_ALERT "reservingtrack check failed!\n");
  1145. return -1;
  1146. }
  1147. if (init_track_context(g_carback_context->track_data_virtaddr) < 0) {
  1148. printk(KERN_ERR "init track context failed.\n");
  1149. return -1;
  1150. }
  1151. if (init_track_context2(g_carback_context->track_data_virtaddr) < 0) {
  1152. printk(KERN_ERR "init track context2 failed.\n");
  1153. g_ptrack_context2 = NULL;
  1154. return -1;
  1155. }
  1156. if (g_carback_context && g_carback_context->screen_width >= g_ptrack_context->disp_width && g_carback_context->screen_height >= g_ptrack_context->disp_height) {
  1157. g_carback_context->track_disp_width = g_ptrack_context->disp_width;
  1158. g_carback_context->track_disp_height = g_ptrack_context->disp_height;
  1159. g_carback_context->track_disp_xpos = g_ptrack_context->disp_xpos;
  1160. g_carback_context->track_disp_ypos = g_ptrack_context->disp_ypos;
  1161. g_carback_context->ptrack_param = &g_ptrack_context->track_param;
  1162. g_carback_context->file_type = g_ptrack_context->file_type;
  1163. g_carback_context->pmradar_param = NULL;
  1164. if (g_ptrack_context2)
  1165. g_carback_context->pmradar_param = &g_ptrack_context2->mradar_param;
  1166. set_disp_track_id(TRACK_STRAIGHT_FORWARD_ID);
  1167. set_disp_car_id(CAR_NORMAL_STATUS_ID);
  1168. set_disp_radar_id(RADAR_NORMAL_STATUS_ID);
  1169. set_disp_track2_id(TRACK2_STRAIGHT_FORWARD_ID);
  1170. set_disp_signal_id(IMAGE_ID_NONE);
  1171. printk("track_paint init width=%d, height=%d,xpos=%d,ypos=%d.\n", g_carback_context->track_disp_width, \
  1172. g_carback_context->track_disp_height, g_carback_context->track_disp_xpos, g_carback_context->track_disp_ypos);
  1173. } else{
  1174. printk(KERN_ALERT "track paint init out width or height fail!\n");
  1175. ret = -1;
  1176. }
  1177. return ret;
  1178. }
  1179. void track_paint_deinit(void)
  1180. {
  1181. int i;
  1182. zlib_uncompress_exit();
  1183. if (g_ptrack_context->disp_track2_buf)
  1184. vfree(g_ptrack_context->disp_track2_buf);
  1185. for (i = 0; i < 4; i++)
  1186. if (g_ptrack_context->disp_radar_buf[i])
  1187. vfree(g_ptrack_context->disp_radar_buf[i]);
  1188. if (g_ptrack_context->disp_car_buf)
  1189. vfree(g_ptrack_context->disp_car_buf);
  1190. if (g_ptrack_context)
  1191. vfree(g_ptrack_context);
  1192. }
  1193. unsigned int track_paint_fill(void *dest, unsigned int width, unsigned int height)
  1194. {
  1195. static unsigned int last_track_id;
  1196. static unsigned int last_car_id;
  1197. static unsigned int last_radar_id;
  1198. static unsigned int last_signal_id = -1;
  1199. static unsigned int last_track2_id = 0;
  1200. track_context *p = g_ptrack_context;
  1201. user_header *ph = g_pheader_buf;
  1202. if (p == NULL || g_carback_context == NULL) {
  1203. printk(KERN_ERR "track_paint_fill g_ptrack_context or carback_context null\n");
  1204. return 0;
  1205. }
  1206. if (width > p->disp_width || height > p->disp_height) {
  1207. printk(KERN_ERR "track paint fill width height error!\n");
  1208. return 0;
  1209. }
  1210. if (p->disp_track_id > TRACK_MAX && p->disp_track_id < IMAGE_ID_NONE)
  1211. return 0;
  1212. if (!g_carback_context->track_setting) {
  1213. memset(dest, 0, g_carback_context->track_display_size);
  1214. last_track_id = 0;
  1215. last_car_id = 0;
  1216. last_radar_id = 0;
  1217. last_signal_id = -1;
  1218. last_track2_id = 0;
  1219. return g_carback_context->track_display_size;
  1220. }
  1221. if (p->disp_track_id == IMAGE_ID_NONE) {
  1222. memset(dest, 0, p->disp_track_size);
  1223. if (ph->car_total)
  1224. subjoin_car_pic(dest);
  1225. if (ph->radar_total)
  1226. subjoin_radar_pic(dest);
  1227. last_track_id = p->disp_track_id;
  1228. last_car_id = p->disp_car_id;
  1229. last_radar_id = p->disp_radar_id;
  1230. return p->disp_track_size;
  1231. }
  1232. if (g_carback_context->carback_signal) {
  1233. if (last_track_id == p->disp_track_id && last_car_id == p->disp_car_id &&
  1234. last_radar_id == p->disp_radar_id && last_track2_id == p->disp_track2_id && last_signal_id == p->disp_signal_id){
  1235. if (g_ptrack_context2 == NULL || !g_ptrack_context2->disp_mradar_id_change)
  1236. return 0;
  1237. }
  1238. }
  1239. if (!g_carback_context->carback_signal) {
  1240. if (last_signal_id != p->disp_signal_id)
  1241. memset(dest, 0, g_carback_context->track_display_size);
  1242. if (ph->signal_total)
  1243. subjoin_signal_pic(dest);
  1244. } else {
  1245. if (g_carback_context->layer_status) {
  1246. if (ph->track_total)
  1247. subjoin_track_pic(dest);
  1248. if (ph->car_total)
  1249. subjoin_car_pic(dest);
  1250. if (ph->radar_total)
  1251. subjoin_radar_pic(dest);
  1252. if (ph->track2_total)
  1253. subjoin_track2_pic(dest);
  1254. if (g_ptrack_context2) {
  1255. subjoin_mradar_pic(dest);
  1256. }
  1257. }
  1258. }
  1259. if (g_carback_context->layer_status) {
  1260. last_track_id = p->disp_track_id;
  1261. last_car_id = p->disp_car_id;
  1262. last_radar_id = p->disp_radar_id;
  1263. last_track2_id = p->disp_track2_id;
  1264. }
  1265. last_signal_id = p->disp_signal_id;
  1266. return g_carback_context->track_display_size;
  1267. }