deinterlace_test.c 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <sys/mman.h>
  7. #include <unistd.h>
  8. #include <sys/ioctl.h>
  9. #include <string.h>
  10. #include "ftcfg.h"
  11. #include "ftypes.h"
  12. #include "utils.h"
  13. #include "ark1668ft.h"
  14. #include "display.h"
  15. #define DEINTERLACE_SUCCESS (0)
  16. #define DEINTERLACE_PARA_ERROR (-1)
  17. #define DEINTERLACE_AXI_ERROR (-2)
  18. #define DEINTERLACE_TIMEOUT (-3)
  19. enum {
  20. DEINTERLACE_LINE_SIZE_720H = 0,
  21. DEINTERLACE_LINE_SIZE_960H
  22. };
  23. enum {
  24. DEINTERLACE_DATA_MODE_420 = 0,
  25. DEINTERLACE_DATA_MODE_422
  26. };
  27. enum {
  28. DEINTERLACE_TYPE_PAL = 0, // 576
  29. DEINTERLACE_TYPE_NTSC // 480
  30. };
  31. enum {
  32. DEINTERLACE_FIELD_ODD = 0,
  33. DEINTERLACE_FIELD_EVEN
  34. };
  35. static u32* deintbase = NULL;
  36. struct cma_mem *deint_mem = NULL;
  37. #define rDEINTERLACE_START *(volatile u32*)(deintbase + 0x00/4)
  38. #define rDEINTERLACE_CTRL0 *(volatile u32*)(deintbase + 0x04/4)
  39. #define rDEINTERLACE_CTRL1 *(volatile u32*)(deintbase + 0x08/4)
  40. #define rDEINTERLACE_CTRL2 *(volatile u32*)(deintbase + 0x0C/4)
  41. #define rDEINTERLACE_CTRL3 *(volatile u32*)(deintbase + 0x10/4)
  42. #define rDEINTERLACE_FILM_MODECTRL *(volatile u32*)(deintbase + 0x14/4)
  43. #define rDEINTERLACE_SADDR0 *(volatile u32*)(deintbase + 0x18/4)
  44. #define rDEINTERLACE_SADDR1 *(volatile u32*)(deintbase + 0x1C/4)
  45. #define rDEINTERLACE_SADDR2 *(volatile u32*)(deintbase + 0x20/4)
  46. #define rDEINTERLACE_DADDRY *(volatile u32*)(deintbase + 0x24/4)
  47. #define rDEINTERLACE_DADDRU *(volatile u32*)(deintbase + 0x28/4)
  48. #define rDEINTERLACE_DADDRV *(volatile u32*)(deintbase + 0x2C/4)
  49. #define rDEINTERLACE_SADDR0_1 *(volatile u32*)(deintbase + 0x30/4)
  50. #define rDEINTERLACE_SADDR1_1 *(volatile u32*)(deintbase + 0x34/4)
  51. #define rDEINTERLACE_SADDR2_1 *(volatile u32*)(deintbase + 0x38/4)
  52. #define rDEINTERLACE_DADDRY_1 *(volatile u32*)(deintbase + 0x3C/4)
  53. #define rDEINTERLACE_DADDRU_1 *(volatile u32*)(deintbase + 0x40/4)
  54. #define rDEINTERLACE_DADDRV_1 *(volatile u32*)(deintbase + 0x44/4)
  55. #define rDEINTERLACE_INT_MASK *(volatile u32*)(deintbase + 0x48/4)
  56. #define rDEINTERLACE_RAW_INT *(volatile u32*)(deintbase + 0x4C/4)
  57. #define rDEINTERLACE_INT_CLEAR *(volatile u32*)(deintbase + 0x50/4)
  58. #define rDEINTERLACE_STATUS *(volatile u32*)(deintbase + 0x54/4)
  59. #define rDEINTERLACE_ADDR_SWITCHMODE *(volatile u32*)(deintbase + 0x58/4)
  60. static void deinterlace_reset(void)
  61. {
  62. rDEINTERLACE_CTRL0 = (1 << 0);
  63. usleep(10);
  64. rDEINTERLACE_CTRL0 = (0 << 0);
  65. }
  66. static void deinterlace_init(void)
  67. {
  68. deinterlace_reset();
  69. rDEINTERLACE_INT_CLEAR = 0x3;
  70. rDEINTERLACE_INT_MASK = 0x3;
  71. }
  72. static int deinterlace_process (unsigned int deinterlace_size, unsigned int data_mode, unsigned int deinterlace_type,
  73. unsigned int deinterlace_field, unsigned int src_field_addr_0, unsigned int src_field_addr_1,unsigned int src_field_addr_2,
  74. unsigned int dst_y_addr, unsigned int dst_u_addr, unsigned int dst_v_addr)
  75. {
  76. unsigned int pixel_per_line;
  77. unsigned int total_line;
  78. unsigned int pn;
  79. unsigned int denoise_bypass;
  80. unsigned int stride;
  81. unsigned int only_wr_1_field;
  82. unsigned int field;
  83. unsigned int out_mode;
  84. unsigned int vary_level_th;
  85. int ret = DEINTERLACE_SUCCESS;
  86. if(deinterlace_field != DEINTERLACE_FIELD_ODD
  87. && deinterlace_field != DEINTERLACE_FIELD_EVEN){
  88. printf("invalid deinterlace field (%d)\r\n", deinterlace_field);
  89. return DEINTERLACE_PARA_ERROR;
  90. }
  91. field = deinterlace_field;
  92. if(deinterlace_size == DEINTERLACE_LINE_SIZE_960H){
  93. pixel_per_line = 120 * (1 + data_mode);
  94. }else if(deinterlace_size == DEINTERLACE_LINE_SIZE_720H){
  95. pixel_per_line = 90 * (1 + data_mode);
  96. }else{
  97. printf("invalid deinterlace size (%d)\r\n", deinterlace_size);
  98. return DEINTERLACE_PARA_ERROR;
  99. }
  100. if(data_mode == DEINTERLACE_DATA_MODE_420){
  101. denoise_bypass = 1;
  102. stride = pixel_per_line;
  103. only_wr_1_field = 1;
  104. }else if(data_mode == DEINTERLACE_DATA_MODE_422){
  105. if(dst_y_addr == 0){
  106. printf("illegal deinterlace dst Y address\r\n");
  107. return DEINTERLACE_PARA_ERROR;
  108. }
  109. denoise_bypass = 1;
  110. stride = 0;
  111. only_wr_1_field = 0;
  112. }else{
  113. printf("invalid deinterlace data mode (%d)\r\n", data_mode);
  114. return DEINTERLACE_PARA_ERROR;
  115. }
  116. if(deinterlace_type == DEINTERLACE_TYPE_PAL){
  117. pn = 0;
  118. total_line = 288;
  119. vary_level_th = 0x800;
  120. }else if(deinterlace_type == DEINTERLACE_TYPE_NTSC){
  121. pn = 1;
  122. total_line = 240;
  123. vary_level_th = 0x8;
  124. }else{
  125. printf("invalid deinterlace type (%d)\r\n", deinterlace_type);
  126. return DEINTERLACE_PARA_ERROR;
  127. }
  128. out_mode = DEINTERLACE_DATA_MODE_422;
  129. rDEINTERLACE_CTRL0 = (out_mode<<31)
  130. | (0x0 << 29)
  131. | (only_wr_1_field << 28) // field_1 only_wr_1_field
  132. | (pixel_per_line << 20) // pixel_pl
  133. | (total_line << 11) // total_line
  134. | (stride << 3) // stride
  135. | (data_mode << 2) // data_mode
  136. | (field << 1); // field
  137. rDEINTERLACE_CTRL1 = (0x8 << 24 )
  138. |(vary_level_th << 8)
  139. |(0X8 << 0);
  140. rDEINTERLACE_CTRL2 = 0x300A4230;
  141. // denoise bypass pn: 1:n display_motion line_intra global_cnt display_mv_0
  142. rDEINTERLACE_CTRL3 = (0x07 << 16) //motion_ctrl_reg5\uff1a\u964d\u566a\u95e8\u9650
  143. | (denoise_bypass << 15)
  144. | (pn << 13)
  145. | (0x1 << 11)
  146. | (0x1 << 10)
  147. | (0x1 << 9)
  148. | (0x0 << 6)
  149. | (0x0 << 5)
  150. | (0x1 << 3)
  151. | (0x0 << 2) // max_ycbcr_ena :use for control the max control
  152. | (0x1 << 1)
  153. | (0x0 << 0);
  154. rDEINTERLACE_FILM_MODECTRL = (0x0 << 31);
  155. rDEINTERLACE_SADDR0 = src_field_addr_0; // s0_0
  156. rDEINTERLACE_SADDR1 = src_field_addr_1; // s1_0
  157. rDEINTERLACE_SADDR2 = src_field_addr_2; // s2_0
  158. rDEINTERLACE_DADDRY = dst_y_addr; // dy_0 when filed = 1 ,data_mode = 0 then dy_0 = s0_0 , when filed = 0 ,data_mode = 0 then dy_0 = s2_0
  159. rDEINTERLACE_DADDRU = dst_u_addr; // du_0
  160. rDEINTERLACE_DADDRV = dst_v_addr; // dv_0
  161. // pingpong addr fetch
  162. rDEINTERLACE_ADDR_SWITCHMODE = 0x0;
  163. // \u6e05\u9664\u4e2d\u65ad
  164. rDEINTERLACE_INT_CLEAR = 0x3;
  165. // start de-interlace
  166. rDEINTERLACE_START = 0x1;
  167. return ret;
  168. }
  169. void *deinterlace_test_thread(void *arg)
  170. {
  171. struct ft_runtime *rt = (struct ft_runtime *)arg;
  172. u32 field1_phyaddr, field2_phyaddr, field3_phyaddr;
  173. char *field1_viraddr, *field2_viraddr, *field3_viraddr;
  174. u32 dst_phyaddr;
  175. char *dst_viraddr;
  176. int fdfield = -1;
  177. unsigned int *databuf = NULL;
  178. int fddata = -1;
  179. unsigned long datasize;
  180. u32 *tmp;
  181. int i;
  182. deintbase = map_phy_memory(0xe0d00000, 0x1000, 1);
  183. if (!deintbase)
  184. goto err;
  185. deint_mem = alloc_cma_mem(0x200000);
  186. if (!deint_mem) {
  187. printf("alloc_cma_mem fail.\n");
  188. goto err;
  189. }
  190. field1_phyaddr = deint_mem->phyaddr;
  191. field1_viraddr = deint_mem->viraddr;
  192. field2_phyaddr = field1_phyaddr + NTSC_WIDTH * NTSC_HEIGHT;
  193. field2_viraddr = field1_viraddr + NTSC_WIDTH * NTSC_HEIGHT;
  194. field3_phyaddr = field2_phyaddr + NTSC_WIDTH * NTSC_HEIGHT;
  195. field3_viraddr = field2_viraddr + NTSC_WIDTH * NTSC_HEIGHT;
  196. dst_phyaddr = field3_phyaddr + NTSC_WIDTH * NTSC_HEIGHT;
  197. dst_viraddr = field3_viraddr + NTSC_WIDTH * NTSC_HEIGHT;
  198. fdfield = open(DEINT_FIELD_DATA_PATH, O_RDONLY);
  199. if (fdfield < 0) {
  200. printf("open %s fail.\n", DEINT_FIELD_DATA_PATH);
  201. goto err;
  202. }
  203. if (read(fdfield, field1_viraddr, NTSC_WIDTH * NTSC_HEIGHT * 3) !=
  204. NTSC_WIDTH * NTSC_HEIGHT * 3) {
  205. printf("read data err.\n");
  206. goto err;
  207. }
  208. deinterlace_init();
  209. deinterlace_process (
  210. DEINTERLACE_LINE_SIZE_720H,
  211. DEINTERLACE_DATA_MODE_422,
  212. DEINTERLACE_TYPE_NTSC,
  213. DEINTERLACE_FIELD_ODD,
  214. field1_phyaddr,
  215. field2_phyaddr,
  216. field3_phyaddr,
  217. dst_phyaddr,
  218. 0, // for yuv420
  219. 0); // for yuv420
  220. usleep(100000);
  221. /* int fd_frame = open("frame.yuv", O_WRONLY | O_CREAT | O_TRUNC);
  222. write(fd_frame, dst_viraddr, NTSC_WIDTH * NTSC_HEIGHT * 2);
  223. close(fd_frame);
  224. } */
  225. fddata = open(DEINT_FRAME_DATA_PATH, O_RDONLY);
  226. if (fddata < 0) {
  227. printf("open data file fail.\n");
  228. goto err;
  229. }
  230. datasize = get_file_size(DEINT_FRAME_DATA_PATH);
  231. databuf = malloc(datasize);
  232. if (!databuf) {
  233. printf("mallco databuf fail.\n");
  234. goto err;
  235. }
  236. if (read(fddata, databuf, datasize) != datasize) {
  237. printf("read data file err.\n");
  238. goto err;
  239. }
  240. tmp = (unsigned int*)dst_viraddr;
  241. for (i = 0; i < datasize / 4; i++) {
  242. if (databuf[i] != tmp[i]) {
  243. printf("compare data fail.0x%x, 0x%x.\n", databuf[i], tmp[i]);
  244. goto err;
  245. }
  246. }
  247. free(databuf);
  248. close(fddata);
  249. close(fdfield);
  250. free_cma_mem(deint_mem);
  251. unmap_phy_memory(deintbase, 0x1000);
  252. rt->finish = 1;
  253. rt->pass = 1;
  254. return (void*)0;
  255. err:
  256. if (databuf)
  257. free(databuf);
  258. if (fddata > 0)
  259. close(fddata);
  260. if (fdfield > 0)
  261. close(fdfield);
  262. if (deint_mem)
  263. free_cma_mem(deint_mem);
  264. if (!deintbase)
  265. unmap_phy_memory(deintbase, 0x1000);
  266. rt->finish = 1;
  267. return (void*)-1;
  268. }