itu.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. #include "FreeRTOS.h"
  2. #include "board.h"
  3. #include "chip.h"
  4. #ifdef REVERSE_TRACK
  5. #include "vg_driver.h"
  6. #endif
  7. #define ITU_CTL (0x00)
  8. #define ITU_IMAGE_WIDTH (0x04)
  9. #define ITU_YFRAM0_ADDR_START (0x08)
  10. #define ITU_YFRAM1_ADDR_START (0x0C)
  11. #define ITU_YFRAM2_ADDR_START (0x10)
  12. #define ITU_YFRAM3_ADDR_START (0x14)
  13. #define ITU_YFRAM0_ADDR_FLIP (0x18)
  14. #define ITU_YFRAM1_ADDR_FLIP (0x1C)
  15. #define ITU_YFRAM2_ADDR_FLIP (0x20)
  16. #define ITU_YFRAM3_ADDR_FLIP (0x24)
  17. #define ITU_CFRAM0_ADDR_START (0x28)
  18. #define ITU_CFRAM1_ADDR_START (0x2c)
  19. #define ITU_CFRAM2_ADDR_START (0x30)
  20. #define ITU_CFRAM3_ADDR_START (0x34)
  21. #define ITU_CFRAM0_ADDR_FLIP (0x38)
  22. #define ITU_CFRAM1_ADDR_FLIP (0x3C)
  23. #define ITU_CFRAM2_ADDR_FLIP (0x40)
  24. #define ITU_CFRAM3_ADDR_FLIP (0x44)
  25. #define ITU_REC_HST_REC_HSP (0x48)//
  26. #define ITU_REC_VST_REC_VSP (0x4C)//开窗口大小,目的窗口
  27. #define ITU_WIN_HST_WIN_HSP (0x50)//黑色位置
  28. #define ITU_WIN_VST_WIN_VSP (0x54)
  29. #define ITU_EN_REG (0x58)
  30. #define ITU_ITU_HSTART_HSTOP (0x5C)
  31. #define ITU_ITU_VSTART_VSTOP (0x60)
  32. #define ITU_GLOBAL_ALPHA (0x64)
  33. #define ITU_WR_STATUS (0x6C)
  34. #define ITU_SCAL_CLK_RST (0x70)
  35. #define ITU_VGATE_START1_STOP1 (0x80)
  36. #define ITU_SCALE_CTRL_REG (0x84)
  37. #define ITU_VSYN_DEL_HFZ (0x88)
  38. #define ITU_VFZ_RHLEN_REG (0x8C)
  39. #define ITU_HSYN_START_STOP (0x90)
  40. #define ITU_HGATE_START_STOP (0x94)
  41. #define ITU_VSYN_START_STOP (0x98)
  42. #define ITU_VGATE_START_STOP (0x9C)
  43. #define ITU_IMG_CUT_REG (0xA0)
  44. #define ITU_DOWN_BLACK_NUM_HV_DELAY_COS_l (0xA4)
  45. #define ITU_COS_H_VXMOD_ODDF_INI_TVLEN_l (0xA8)
  46. #define ITU_TVLEN_H_SCAL_CTL (0xAC)
  47. #define ITU_SCALE_STATUS (0xB0)
  48. #define ITU_VFILT_COEF0_3 (0xB4)
  49. #define ITU_VFILT_COEF4_6_VFILT_CTL (0xB8)
  50. #define ITU_SRC_WIDE_HIGHT (0xBC)
  51. #define ITU_SRC_WIDE_FILTER (0xC0)
  52. #define ITU_DET_REG0 (0xC8)
  53. #define ITU_DET_REG1 (0xCC)
  54. #define ITU_DET_REG2 (0xD0)
  55. #define ITU_DET_REG3 (0xD4)
  56. #define ITU_INT_EN (0xD8)
  57. #define ITU_INT_STATUS (0xDC)
  58. #define ITU656IN_BUF_NUM 4
  59. #define ITUFRAME_MAX_WIDTH VIN_WIDTH
  60. #define ITUFRAME_MAX_HEIGHT VIN_HEIGHT
  61. typedef struct {
  62. uint32_t yaddr;
  63. uint32_t uvaddr;
  64. int status;
  65. } ItuBufInfo;
  66. static uint32_t itubase = REGS_ITU_BASE;
  67. //static ItuBufInfo itubuf_info[ITU656IN_BUF_NUM] = {0};
  68. static ItuConfigPara itu_para;
  69. static TaskHandle_t itu_task;
  70. static SemaphoreHandle_t itu_mutex = NULL;
  71. static void *itu_buf = NULL;
  72. static int itu_enable = 0;
  73. static int itu_take_video = 0;
  74. static unsigned int itu_get_frame_yadde(unsigned int itu_id)
  75. {
  76. if(itu_id == 0)
  77. return readl(itubase + ITU_YFRAM0_ADDR_START);
  78. else if(itu_id == 1)
  79. return readl(itubase + ITU_YFRAM1_ADDR_START);
  80. else if(itu_id == 2)
  81. return readl(itubase + ITU_YFRAM2_ADDR_START);
  82. else
  83. return readl(itubase + ITU_YFRAM3_ADDR_START);
  84. }
  85. static unsigned int itu_get_frame_uvadde(unsigned int itu_id)
  86. {
  87. if(itu_id == 0)
  88. return readl(itubase + ITU_CFRAM0_ADDR_START);
  89. else if(itu_id == 1)
  90. return readl(itubase + ITU_CFRAM1_ADDR_START);
  91. else if(itu_id == 2)
  92. return readl(itubase + ITU_CFRAM2_ADDR_START);
  93. else
  94. return readl(itubase + ITU_CFRAM3_ADDR_START);
  95. }
  96. static void itu_interupt_handler(void *param)
  97. {
  98. unsigned int status = readl(itubase + ITU_INT_STATUS);
  99. unsigned int height = 0,wide = 0;
  100. unsigned int totheight = 0,totwide = 0;
  101. unsigned int curr_handle_frame_id=0;
  102. //clear inter
  103. writel(status & 0xf0, itubase + ITU_INT_STATUS);
  104. if(status >>4 & 0x1)
  105. {
  106. unsigned int val;
  107. val = readl(itubase + ITU_DET_REG3) ;
  108. height = (val>>12)&0xFFF;
  109. wide = val&0xFFF;
  110. val = readl(itubase + ITU_DET_REG2) ;
  111. totheight = (val>>12)&0xFFF;
  112. totwide = val&0xFFF;
  113. printf(">>>>height = %d,wide= %d,totheight = %d,totwide= %d\n",height ,wide,totheight ,totwide);
  114. }
  115. if(status >> 6 & 0x1)
  116. {
  117. unsigned int itu_dis_id = 1;
  118. curr_handle_frame_id = readl(itubase + ITU_WR_STATUS) &0x3;
  119. if(curr_handle_frame_id != 0)
  120. itu_dis_id = curr_handle_frame_id - 1;
  121. else
  122. itu_dis_id = 3;
  123. // if (last_frame_id == itu_dis_id)
  124. // printf("itu_dis_id:%d \n", itu_dis_id);
  125. // last_frame_id = itu_dis_id;
  126. xTaskNotifyFromISR(itu_task, itu_dis_id, eSetValueWithOverwrite, 0);
  127. }
  128. }
  129. void itu_clear_addr_for_hwuse(void)
  130. {
  131. unsigned int regval = 0;
  132. unsigned int current_id = readl(itubase + ITU_WR_STATUS);
  133. if(current_id == ITU656IN_BUF_NUM - 1)
  134. regval = 1;
  135. else
  136. regval = 1<<(current_id + 1);
  137. writel(regval, itubase + ITU_INT_STATUS);
  138. }
  139. void itu_clk_cofig(void)
  140. {
  141. //select mfc clk 250M/5
  142. unsigned int reg = readl(REGS_SYSCTL_BASE + 0x7c);
  143. reg &=~(0x1<<8);
  144. reg |=(0x1<<8);
  145. writel(reg , REGS_SYSCTL_BASE + 0x7c);
  146. reg = readl(itubase + ITU_SCAL_CLK_RST);
  147. reg &=~(0x3f<<20);
  148. //reg |=(0x5<<20);
  149. reg |=(0x7<<20);
  150. writel(reg , itubase + ITU_SCAL_CLK_RST);
  151. }
  152. int itu_config(ItuConfigPara *para)
  153. {
  154. uint32_t val;
  155. int ret = 0;
  156. int i;
  157. unsigned int Total_line_num = 0;//585;
  158. //thl (输入clk/2)/(总行数*总点数) = (scaler_clk)/(thlen*总点数)
  159. unsigned int Total_pixs_num = 2400;//2224(50M);//2661;//3333;//3232;//1716;//4608;
  160. configASSERT(para->in_width <= ITUFRAME_MAX_WIDTH &&
  161. para->in_height <= ITUFRAME_MAX_HEIGHT);
  162. xSemaphoreTake(itu_mutex, portMAX_DELAY);
  163. para->win_hst = 0;
  164. para->win_hsp = para->out_width;
  165. para->win_vst = 0;
  166. para->win_vsp = para->out_height -1;
  167. para->rec_vsp = para->out_height;
  168. para->rec_vst = 0;
  169. para->rec_hsp = para->out_width;
  170. para->rec_hst = 0;
  171. para->itu_vstop = 0;//height;
  172. para->itu_vstart = 0;
  173. para->itu_hstop = 0;//wide;
  174. para->itu_hstart = 0;
  175. para->hsyn_start = 3;
  176. para->hsyn_stop = para->hsyn_start + 5;//wide;
  177. para->vsyn_start = 3;
  178. para->vsyn_stop = para->vsyn_start + 3;
  179. para->hgate_start = para->hsyn_stop + 20;
  180. para->hgate_stop = para->hgate_start +para->scale_out_width;
  181. if(para->Input_DataMode == ITU_MIPI)
  182. para->vgate_start = para->vsyn_stop + 0;
  183. else
  184. para->vgate_start = para->vsyn_stop + 18;
  185. para->vgate_stop = para->vgate_start + para->scale_out_height;
  186. para->vgate_start1= para->vgate_start;
  187. para->vgate_stop1 = para->vgate_stop + 0x10 ;
  188. Total_line_num = para->vgate_stop + 50;
  189. itu_clk_cofig();
  190. writel((uint32_t)itu_buf, itubase + ITU_YFRAM0_ADDR_START);
  191. writel((uint32_t)itu_buf + para->out_width*para->out_height, itubase + ITU_CFRAM0_ADDR_START);
  192. writel((uint32_t)itu_buf + (para->out_height -1)*para->out_width, itubase + ITU_YFRAM0_ADDR_FLIP);
  193. if(para->out_format == ITU_Y_UV420)
  194. writel(readl(itubase + ITU_CFRAM0_ADDR_START) + ((para->out_height/2 -1)*para->out_width), itubase + ITU_CFRAM0_ADDR_FLIP);
  195. else if(para->out_format == ITU_Y_UV422)
  196. writel(readl(itubase + ITU_CFRAM0_ADDR_START) + ((para->out_height -1)*para->out_width), itubase + ITU_CFRAM0_ADDR_FLIP);
  197. writel((uint32_t)itu_buf + para->out_width*para->out_height*2, itubase + ITU_YFRAM1_ADDR_START);
  198. writel(readl(itubase + ITU_YFRAM1_ADDR_START) + para->out_width*para->out_height, itubase + ITU_CFRAM1_ADDR_START);
  199. writel(readl(itubase + ITU_YFRAM1_ADDR_START) + (para->out_height -1)*para->out_width, itubase + ITU_YFRAM1_ADDR_FLIP) ;
  200. if(para->out_format == ITU_Y_UV420)
  201. writel(readl(itubase + ITU_CFRAM1_ADDR_START) + ((para->out_height/2 -1)*para->out_width), itubase + ITU_CFRAM1_ADDR_FLIP);
  202. else if(para->out_format == ITU_Y_UV422)
  203. writel(readl(itubase + ITU_CFRAM1_ADDR_START) + ((para->out_height -1)*para->out_width), itubase + ITU_CFRAM1_ADDR_FLIP);
  204. writel((uint32_t)itu_buf + para->out_width*para->out_height*4, itubase + ITU_YFRAM2_ADDR_START);
  205. writel(readl(itubase + ITU_YFRAM2_ADDR_START) + para->out_width*para->out_height, itubase + ITU_CFRAM2_ADDR_START);
  206. writel(readl(itubase + ITU_YFRAM2_ADDR_START) + (para->out_height -1)*para->out_width, itubase + ITU_YFRAM2_ADDR_FLIP);
  207. if(para->out_format == ITU_Y_UV420)
  208. writel(readl(itubase + ITU_CFRAM2_ADDR_START)+ ((para->out_height/2 -1)*para->out_width), itubase + ITU_CFRAM2_ADDR_FLIP);
  209. else if(para->out_format == ITU_Y_UV422)
  210. writel(readl(itubase + ITU_CFRAM2_ADDR_START) + ((para->out_height -1)*para->out_width), itubase + ITU_CFRAM2_ADDR_FLIP);
  211. writel((uint32_t)itu_buf + para->out_width*para->out_height*6, itubase + ITU_YFRAM3_ADDR_START);
  212. writel(readl(itubase + ITU_YFRAM3_ADDR_START) + para->out_width*para->out_height, itubase + ITU_CFRAM3_ADDR_START);
  213. writel(readl(itubase + ITU_YFRAM3_ADDR_START) + (para->out_height -1)*para->out_width, itubase + ITU_YFRAM3_ADDR_FLIP);
  214. if(para->out_format == ITU_Y_UV420)
  215. writel(readl(itubase + ITU_CFRAM3_ADDR_START) + ((para->out_height/2 -1)*para->out_width), itubase + ITU_CFRAM3_ADDR_FLIP);
  216. else if(para->out_format == ITU_Y_UV422)
  217. writel(readl(itubase + ITU_CFRAM3_ADDR_START) + ((para->out_height -1)*para->out_width), itubase + ITU_CFRAM3_ADDR_FLIP);
  218. writel(para->rec_hsp << 12 | para->rec_hst << 0, itubase + ITU_REC_HST_REC_HSP);
  219. writel(para->rec_vsp << 12 | para->rec_vst << 0, itubase + ITU_REC_VST_REC_VSP);
  220. writel(para->win_hsp << 12 | para->win_hst << 0, itubase + ITU_WIN_HST_WIN_HSP);
  221. writel(para->win_vsp << 12 | para->win_hst << 0, itubase + ITU_WIN_VST_WIN_VSP);
  222. writel(para->vgate_stop1 << 16 | para->vgate_start1<< 0, itubase + ITU_VGATE_START1_STOP1);
  223. writel(para->hgate_stop << 16 | para->hgate_start << 0, itubase + ITU_HGATE_START_STOP);
  224. writel(para->hsyn_stop << 16 | para->hsyn_start << 0, itubase + ITU_HSYN_START_STOP);
  225. writel(para->vsyn_stop << 16 | para->vsyn_start << 0, itubase + ITU_VSYN_START_STOP);
  226. writel(para->vgate_stop << 16 | para->vgate_start << 0, itubase + ITU_VGATE_START_STOP);
  227. writel(para->itu_hstop << 12 | para->itu_hstart << 0, itubase + ITU_ITU_HSTART_HSTOP);
  228. writel(para->itu_vstop << 12 | para->itu_vstart << 0, itubase + ITU_ITU_VSTART_VSTOP);
  229. writel(2 | 0xc <<24 , itubase + ITU_SCALE_CTRL_REG);
  230. writel((para->in_width * 1024 / (para->scale_out_width + 0x17/*para.left_cut_num*/))<<16, itubase + ITU_VSYN_DEL_HFZ);
  231. writel((para->in_height * 1024)/(para->scale_out_height + para->up_black_num) | Total_pixs_num<<16, itubase + ITU_VFZ_RHLEN_REG);
  232. writel( 0x14 << 8, itubase + ITU_DOWN_BLACK_NUM_HV_DELAY_COS_l);
  233. writel((Total_line_num & 0xff)<<24, itubase + ITU_COS_H_VXMOD_ODDF_INI_TVLEN_l);
  234. writel(0x0<<16 | 0x1<<11 | (Total_line_num>>8 & 0xff), itubase + ITU_TVLEN_H_SCAL_CTL);
  235. writel(0, itubase + ITU_VFILT_COEF0_3);
  236. writel(4<<24, itubase + ITU_VFILT_COEF4_6_VFILT_CTL);
  237. writel(para->in_width | para->in_height<< 16, itubase + ITU_SRC_WIDE_HIGHT);
  238. writel(para->in_width, itubase + ITU_SRC_WIDE_FILTER);
  239. writel(para->out_width | para->out_width <<16, itubase + ITU_IMAGE_WIDTH);
  240. writel(para->in_height << 12 | para->in_width, itubase + ITU_DET_REG1);
  241. writel(1<<9 | 1<<8 |3<<2 | 1<<1, itubase + ITU_EN_REG);
  242. writel(readl(itubase + ITU_CTL)|(1<<6), itubase + ITU_CTL);//bit[3:2]fnum_sel/bit6 mode_en/bit7 yuv420
  243. writel(readl(itubase + ITU_CTL)|2<<2 | 1<<1, itubase + ITU_CTL);//bit17 cbcr_inv bit5 hmirror bit4 vflip
  244. if(para->out_format == ITU_Y_UV420)
  245. {
  246. val = readl(itubase + ITU_CTL);
  247. val &=~(1<<26 | 1<<7);
  248. val |= 0<<26 | 1<<7 ;
  249. writel(val,itubase + ITU_CTL);
  250. }
  251. else if(para->out_format == ITU_Y_UV422)
  252. {
  253. val = readl(itubase + ITU_CTL);
  254. val &=~(1<<26 | 1<<7);
  255. writel(val,itubase + ITU_CTL);
  256. }
  257. else if(para->out_format == ITU_RGB_MODE)
  258. {
  259. val = readl(itubase + ITU_CTL);
  260. val &=~(1<<26);
  261. val |=(1<<26);
  262. writel(val, itubase + ITU_CTL);
  263. }
  264. if(para->itu601 == ITU_601)
  265. {
  266. val = readl(itubase + ITU_EN_REG);
  267. val &=~(3<<4);
  268. val |= 2 << 4 ;
  269. writel(val,itubase + ITU_EN_REG);
  270. }
  271. if(para->scale_bypass == 0)
  272. {
  273. val =readl(itubase + ITU_CTL);
  274. val &=~(1<<19);
  275. //ITU_CTL = val;//19bit scaler open
  276. writel(val, itubase + ITU_CTL);
  277. val =readl(itubase + ITU_TVLEN_H_SCAL_CTL);
  278. val |=(1<<8);
  279. writel(val, itubase + ITU_TVLEN_H_SCAL_CTL);
  280. }
  281. else
  282. writel(readl(itubase + ITU_CTL) | 1<<19 , itubase + ITU_CTL);
  283. //open mirror
  284. if(para->hmirror == 1)
  285. {
  286. val =readl(itubase + ITU_CTL);
  287. val &=~(1<<5 | 0x3ff<<8);
  288. val |=(1<<5)| ((para->out_width/8)-1) << 8;
  289. writel(val,itubase + ITU_CTL);
  290. val = readl(itubase + ITU_EN_REG);
  291. val &=~(1<<1);
  292. writel(val,itubase + ITU_EN_REG);
  293. }
  294. //open flip
  295. if(para->vflip== 1)
  296. {
  297. val = readl(itubase + ITU_CTL);
  298. val &=~(1<<4);
  299. val |= (1<<4);
  300. writel(val,itubase + ITU_CTL);
  301. }
  302. if(para->Input_DataMode == ITU_MIPI)
  303. {
  304. val = readl(itubase + ITU_CTL);
  305. val &=~((1<<24));
  306. val |=((1<<24));
  307. writel(val, itubase + ITU_CTL);
  308. val = readl(itubase + ITU_SCAL_CLK_RST);
  309. val &=~((1<<11));
  310. val |=((1<<11));
  311. writel(val, itubase + ITU_SCAL_CLK_RST);
  312. val = readl(itubase + ITU_CTL);
  313. val &=~((1<<22)|(1<<1));
  314. writel(val, itubase + ITU_CTL);
  315. val = readl(itubase + ITU_SCALE_CTRL_REG);
  316. val &=~((1<<30));
  317. val |=((1<<30));
  318. writel(val, itubase + ITU_SCALE_CTRL_REG);
  319. }
  320. else if(para->Input_DataMode == ITU_ITU656_601)
  321. {
  322. val = readl(itubase + ITU_CTL);
  323. val &=~((1<<24));
  324. writel(val, itubase + ITU_CTL);
  325. }
  326. if(para->in_height == 1080)
  327. {
  328. val = readl(itubase + ITU_EN_REG);
  329. val &=~((1<<1) | (1<<2));
  330. writel(val, itubase + ITU_EN_REG);
  331. }
  332. val = readl(itubase + ITU_CTL);
  333. val &=~((1<<28) | (1<<29) | (1<<0));
  334. writel(val, itubase + ITU_CTL);
  335. val = readl(itubase + ITU_DET_REG0);
  336. val &=~((7<<0));
  337. val |=((7<<0));
  338. writel(val, itubase + ITU_DET_REG0);
  339. // writel(0x05380400, itubase + ITU_VFZ_RHLEN_REG);
  340. memcpy(&itu_para, para, sizeof(itu_para));
  341. end:
  342. xSemaphoreGive(itu_mutex);
  343. return ret;
  344. }
  345. void itu_start(void)
  346. {
  347. uint32_t val;
  348. //enable write data
  349. xSemaphoreTake(itu_mutex, portMAX_DELAY);
  350. val = readl(itubase + ITU_EN_REG);
  351. val |= (1<<0);
  352. writel(val, itubase + ITU_EN_REG);
  353. val = readl(itubase + ITU_CTL);
  354. val |= (1<<0);
  355. writel(val, itubase + ITU_CTL);
  356. itu_enable = 1;
  357. xSemaphoreGive(itu_mutex);
  358. }
  359. void itu_stop(void)
  360. {
  361. uint32_t val;
  362. //disable write data
  363. xSemaphoreTake(itu_mutex, portMAX_DELAY);
  364. val = readl(itubase + ITU_EN_REG);
  365. val &=~(1<<0);
  366. writel(val, itubase + ITU_EN_REG);
  367. val = readl(itubase + ITU_CTL);
  368. val &=~(1<<0);
  369. writel(val, itubase + ITU_CTL);
  370. itu_enable = 0;
  371. #ifndef REVERSE_UI
  372. ark_lcd_osd_enable(LCD_VIDEO_LAYER, 0);
  373. ark_lcd_set_osd_sync(LCD_VIDEO_LAYER);
  374. ark_lcd_osd_enable(LCD_OSD1, 1);
  375. ark_lcd_set_osd_sync(LCD_OSD1);
  376. #endif
  377. xTaskNotify(itu_task, 0, eSetValueWithOverwrite);
  378. xSemaphoreGive(itu_mutex);
  379. }
  380. void itu_display_thread(void *param)
  381. {
  382. uint32_t ulNotifiedValue;
  383. uint32_t yaddr, uvaddr, dstaddr;
  384. for (;;) {
  385. xTaskNotifyWait( 0x00, /* Don't clear any notification bits on entry. */
  386. 0xffffffff, /* Reset the notification value to 0 on exit. */
  387. &ulNotifiedValue, /* Notified value pass out in ulNotifiedValue. */
  388. portMAX_DELAY);
  389. // printf("received address id 0x%x.\n", ulNotifiedValue);
  390. xSemaphoreTake(itu_mutex, portMAX_DELAY);
  391. if (!itu_enable) {
  392. xSemaphoreGive(itu_mutex);
  393. vVideoDisplayBufFree(dstaddr);
  394. /* 倒车显示优先级高,等倒车结束之后才释放视频显示资源 */
  395. if (itu_take_video) {
  396. vVideoDisplayBufGive();
  397. itu_take_video = 0;
  398. }
  399. continue;
  400. }
  401. /* 获取视频显示资源 */
  402. if (!itu_take_video) {
  403. xVideoDisplayBufTake(portMAX_DELAY);
  404. itu_take_video = 1;
  405. }
  406. if (!ark_lcd_get_osd_info_atomic_isactive(LCD_VIDEO_LAYER)) {
  407. ark_lcd_wait_for_vsync();
  408. }
  409. /* 通过该接口获取视频显示共用的缓存可以避免切换过程中的黑屏、
  410. 花屏等问题 */
  411. dstaddr = ulVideoDisplayBufGet();
  412. yaddr = itu_get_frame_yadde(ulNotifiedValue);//ulNotifiedValue;
  413. uvaddr = itu_get_frame_uvadde(ulNotifiedValue);//yaddr + itu_para.in_width * itu_para.in_height;
  414. #ifdef REVERSE_TRACK
  415. extern int get_reverse_track_index(void);
  416. static int index = 58;
  417. index = get_reverse_track_index();
  418. xm_vg_set_gpu_fb_addr(dstaddr);
  419. xm_vg_draw_prepare(&index);
  420. xm_vg_draw_start();
  421. #endif
  422. LcdOsdInfo info = {0};
  423. info.x = itu_para.out_x;
  424. info.y = itu_para.out_y;
  425. info.width = itu_para.out_width;
  426. info.height = itu_para.out_height;
  427. if (itu_para.out_format == ITU_Y_UV422)
  428. info.format = LCD_OSD_FORAMT_Y_UV422;
  429. else if (itu_para.out_format == ITU_Y_UV420)
  430. info.format = LCD_OSD_FORAMT_Y_UV420;
  431. info.yaddr = yaddr;
  432. info.uaddr = uvaddr;
  433. ark_lcd_set_osd_info_atomic(LCD_VIDEO_LAYER, &info);
  434. ark_lcd_osd_enable(LCD_VIDEO_LAYER, 1);
  435. ark_lcd_set_osd_sync(LCD_VIDEO_LAYER);
  436. #ifndef REVERSE_UI
  437. ark_lcd_osd_enable(LCD_OSD1, 0);
  438. ark_lcd_set_osd_sync(LCD_OSD1);
  439. #endif
  440. itu_clear_addr_for_hwuse();
  441. vVideoDisplayBufRender(dstaddr);
  442. xSemaphoreGive(itu_mutex);
  443. }
  444. }
  445. int itu_init(void)
  446. {
  447. sys_soft_reset(softreset_itu);
  448. itu_mutex = xSemaphoreCreateMutex();
  449. itu_buf = pvPortMalloc(ITUFRAME_MAX_WIDTH * ITUFRAME_MAX_HEIGHT * 3 * ITU656IN_BUF_NUM);
  450. if (!itu_buf) {
  451. printf("Itu malloc memory fail.\n");
  452. return -ENOMEM;
  453. }
  454. if (xTaskCreate(itu_display_thread, "itudis", configMINIMAL_STACK_SIZE, NULL,
  455. configMAX_PRIORITIES - 2, &itu_task) != pdPASS) {
  456. printf("create itu display task fail.\n");
  457. return -1;
  458. }
  459. request_irq(ITU_IRQn, 0, itu_interupt_handler, NULL);
  460. return 0;
  461. }