wrap.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. #include "chip.h"
  2. #include "board.h"
  3. #include "FreeRTOS.h"
  4. #include "ff_stdio.h"
  5. //wrap register
  6. #define WRAP_CTL_INRSTATUS_REG 0x00 //00
  7. #define WRAP_CTL_WORK_EN_REG 0x04 //01
  8. #define WRAP_CTL_READ_ID_REG 0x08 //02
  9. #define WRAP_CTL_INTER_CLR_REG 0x0C //03
  10. #define WRAP_CTL_INTER_MASK_REG 0x10 //04
  11. #define WRAP_CTL_READ_WIDTH_S0_S1_REG0 0x14 //05
  12. #define WRAP_CTL_READ_WIDTH_S2_S3_REG1 0x18 //06
  13. #define WRAP_CTL_READ_WIDTH_S4_S5_REG2 0x1C //07
  14. #define WRAP_CTL_FISHEYE_H_W_INIT_S0 0x2C //0b
  15. #define WRAP_CTL_FISHEYE_H_W_INIT_S1 0x30 //0c
  16. #define WRAP_CTL_FISHEYE_H_W_INIT_S2 0x34 //0d
  17. #define WRAP_CTL_FISHEYE_H_W_INIT_S3 0x38 //0d
  18. #define WRAP_CTL_FISHEYE_H_W_INIT_S4 0x3C //0e
  19. #define WRAP_CTL_FISHEYE_H_W_INIT_S5 0x40 //10
  20. #define WRAP_CTL_RD_FADDR_Y_S0 0x44 //11
  21. #define WRAP_CTL_RD_FADDR_Y_S1 0x48 //12
  22. #define WRAP_CTL_RD_FADDR_Y_S2 0x4C //13
  23. #define WRAP_CTL_RD_FADDR_Y_S3 0x50 //14
  24. #define WRAP_CTL_RD_FADDR_Y_S4 0x54 //15
  25. #define WRAP_CTL_RD_FADDR_Y_S5 0x58 //16
  26. #define WRAP_CTL_RD_HEIGHT_WIDETH_YUV_S0 0x5C //17
  27. #define WRAP_CTL_RD_HEIGHT_WIDETH_YUV_S1 0x60 //18
  28. #define WRAP_CTL_RD_HEIGHT_WIDETH_YUV_S2 0x64 //19
  29. #define WRAP_CTL_RD_HEIGHT_WIDETH_YUV_S3 0x68 //1a
  30. #define WRAP_CTL_RD_HEIGHT_WIDETH_YUV_S4 0x6C //1b
  31. #define WRAP_CTL_RD_HEIGHT_WIDETH_YUV_S5 0x70 //1c
  32. #define WRAP_CTL_RD_LINE_WIDE_INIT_S0 0x74 //1d
  33. #define WRAP_CTL_RD_LINE_WIDE_INIT_S1 0x78 //1e
  34. #define WRAP_CTL_RD_LINE_WIDE_INIT_S2 0x7c //1f
  35. #define WRAP_CTL_RD_LINE_WIDE_INIT_S3 0x80 //20
  36. #define WRAP_CTL_RD_LINE_WIDE_INIT_S4 0x84 //21
  37. #define WRAP_CTL_RD_LINE_WIDE_INIT_S5 0x88 //22
  38. #define WRAP_CTL_RD_FADDR_ML_S0 0xA0 //28
  39. #define WRAP_CTL_RD_FADDR_ML_S1 0xA4 //29
  40. #define WRAP_CTL_RD_FADDR_ML_S2 0xA8 //2a
  41. #define WRAP_CTL_RD_FADDR_ML_S3 0xAC //2b
  42. #define WRAP_CTL_RD_FADDR_ML_S4 0xB0 //2c
  43. #define WRAP_CTL_RD_FADDR_ML_S5 0xB4 //2d
  44. #define WRAP_CTL_ML_HEIGHT_WIDETH_S0 0xB8 //2e
  45. #define WRAP_CTL_ML_HEIGHT_WIDETH_S1 0xBC //2f
  46. #define WRAP_CTL_ML_HEIGHT_WIDETH_S2 0xC0 //30
  47. #define WRAP_CTL_ML_HEIGHT_WIDETH_S3 0xC4 //31
  48. #define WRAP_CTL_ML_HEIGHT_WIDETH_S4 0xC8 //32
  49. #define WRAP_CTL_ML_HEIGHT_WIDETH_S5 0xCC //33
  50. //畸变校正图坐标读取,整个坐标图在memory的一行宽度
  51. #define WRAP_CTL_IMG_R_S1_S0 0xD0 //34
  52. #define WRAP_CTL_IMG_R_S3_S2 0xD4 //35
  53. #define WRAP_CTL_IMG_R_S5_S4 0xD8 //36
  54. //畸变校正图回写memory时,memory中一行的宽度
  55. #define WRAP_CTL_IMG_W_MRM_S1_S0 0xDC //37
  56. #define WRAP_CTL_IMG_W_MRM_S3_S2 0xE0 //38
  57. #define WRAP_CTL_IMG_W_MRM_S5_S4 0xE4 //39
  58. //畸变校正图,分段数据的存储起始地址
  59. #define WRAP_CTL_WR_FADDR_RGB_S0 0xE8 //3a
  60. #define WRAP_CTL_WR_FADDR_RGB_S1 0xEC //3b
  61. #define WRAP_CTL_WR_FADDR_RGB_S2 0xF0 //3c
  62. #define WRAP_CTL_WR_FADDR_RGB_S3 0xF4 //3d
  63. #define WRAP_CTL_WR_FADDR_RGB_S4 0xF8 //3e
  64. #define WRAP_CTL_WR_FADDR_RGB_S5 0xFC //3f
  65. #define WRAP_MAX_WIDTH 800 //VIN_WIDTH
  66. #define WRAP_MAX_HEIGHT 480 //VIN_HEIGHTs
  67. #define WRAP_SEC_MAX_WHDTH 1024
  68. //enum
  69. enum wrap_sections {
  70. SECT_1 = 0x1,
  71. SECT_2 = 0x3,
  72. };
  73. //structure
  74. struct wrap_obj {
  75. enum wrap_sections sect; //分段数配置 当分段数位1时,srcwide不得超过1024
  76. unsigned int srcwide;
  77. unsigned int srcheight;
  78. unsigned int *srcwrap_buf;
  79. unsigned int *coordinatewrap_buf;
  80. unsigned int *deswrap_buf;
  81. };
  82. //global variable
  83. static TaskHandle_t wrap_task = NULL;
  84. //external
  85. extern int usb_wait_stor_dev_pluged(uint32_t timeout);
  86. static void wrap_interupt_handler(void *param)
  87. {
  88. unsigned int val;
  89. val = readl(REGS_WRAP_BASE + WRAP_CTL_INRSTATUS_REG);
  90. writel(1, REGS_WRAP_BASE + WRAP_CTL_INTER_CLR_REG);
  91. if ((val >> 5) & 0x1) {
  92. printf("%s write back error!!\n", __func__);
  93. }
  94. if ((val >> 3) & 0x1) {
  95. if (wrap_task)
  96. xTaskNotifyFromISR(wrap_task, 0, eSetValueWithOverwrite, 0);
  97. printf("%s Fish eye work down!!\n", __func__);
  98. }
  99. }
  100. static void wrap_configure(struct wrap_obj *wo)
  101. {
  102. unsigned int value = 0;
  103. unsigned int fml_whc_sel;
  104. unsigned int fml_bit_sel;
  105. unsigned int Pic_src_init_sel;
  106. unsigned int wb_bus_bvalid_dsen;
  107. unsigned int wb_wait_en;
  108. //wrap_ram_sel
  109. value = readl(REGS_SYSCTL_BASE + 0x1c8);
  110. value |= (1 << 0);
  111. writel(value, REGS_SYSCTL_BASE + 0x1c8);
  112. Pic_src_init_sel = 0; //set srcpicture mode select bit22
  113. wb_bus_bvalid_dsen = 0; //interrupt mode bit20
  114. wb_wait_en = 0; //set if wait bresp
  115. fml_whc_sel = 1;
  116. fml_bit_sel = 0;
  117. //softreset
  118. value = readl(REGS_WRAP_BASE + WRAP_CTL_INRSTATUS_REG);
  119. value |= (1 << 1);
  120. writel(value, REGS_WRAP_BASE + WRAP_CTL_INRSTATUS_REG);
  121. value = readl(REGS_WRAP_BASE + WRAP_CTL_INRSTATUS_REG);
  122. value &= ~((0x3F << 8) | (0x1 << 16) | (0x1 << 17) | (0x1 << 18) | (0x1 << 20) | (0x1 << 19) | (0x1 << 22));
  123. value |= ((wo->sect << 8) |
  124. (fml_bit_sel << 16) |
  125. (fml_whc_sel << 17) |
  126. (wb_wait_en << 19) |
  127. (wb_bus_bvalid_dsen << 20) |
  128. (Pic_src_init_sel << 22));
  129. writel(value, REGS_WRAP_BASE + WRAP_CTL_INRSTATUS_REG);
  130. writel((wo->srcheight << 16) | (wo->srcwide << 0), REGS_WRAP_BASE + WRAP_CTL_FISHEYE_H_W_INIT_S0);
  131. //源图,分段,Y(rgb)通道的起始地址
  132. writel((unsigned int)wo->srcwrap_buf, REGS_WRAP_BASE + WRAP_CTL_RD_FADDR_Y_S0);
  133. //源图分段的高度和宽度
  134. writel((wo->srcwide << 16) | (wo->srcwide << 0), REGS_WRAP_BASE + WRAP_CTL_RD_HEIGHT_WIDETH_YUV_S0);
  135. //分段1源图的起始点在原图中的垂直位置和水平位置
  136. writel((0 << 16) | (0 << 0), REGS_WRAP_BASE + WRAP_CTL_RD_LINE_WIDE_INIT_S0);
  137. //畸变校正图坐标,分段,映射坐标的起始地址配置
  138. writel((unsigned int)wo->coordinatewrap_buf, REGS_WRAP_BASE + WRAP_CTL_RD_FADDR_ML_S0);
  139. //畸变校正图坐标,分段的高度和宽度
  140. writel((wo->srcheight << 16) | (wo->srcwide << 0), REGS_WRAP_BASE + WRAP_CTL_ML_HEIGHT_WIDETH_S0);
  141. //畸变校正图坐标读取,整个坐标图在memory的一行宽度
  142. writel((wo->srcwide << 16) | (wo->srcwide << 0), REGS_WRAP_BASE + WRAP_CTL_IMG_R_S1_S0);
  143. //畸变校正图回写memory时,memory中一行的宽度
  144. writel((wo->srcwide << 16) | (wo->srcwide << 0), REGS_WRAP_BASE + WRAP_CTL_IMG_W_MRM_S1_S0);
  145. //畸变校正图,分段,数据的存储起始地址
  146. writel((unsigned int)wo->deswrap_buf, REGS_WRAP_BASE + WRAP_CTL_WR_FADDR_RGB_S0);
  147. if (wo->sect == SECT_2) {
  148. writel((wo->srcheight << 16) | (wo->srcwide << 0), REGS_WRAP_BASE + WRAP_CTL_FISHEYE_H_W_INIT_S1);
  149. writel((unsigned int)wo->srcwrap_buf + (wo->srcwide / 2 - 4) * 4, REGS_WRAP_BASE + WRAP_CTL_RD_FADDR_Y_S1);
  150. writel((wo->srcheight << 16) | ((wo->srcwide / 2) << 0), REGS_WRAP_BASE + WRAP_CTL_RD_HEIGHT_WIDETH_YUV_S0);
  151. writel((wo->srcheight << 16) | ((wo->srcwide / 2) << 0), REGS_WRAP_BASE + WRAP_CTL_RD_HEIGHT_WIDETH_YUV_S1);
  152. writel((0 << 16) | ((wo->srcwide / 2 - 4) << 0), REGS_WRAP_BASE + WRAP_CTL_RD_LINE_WIDE_INIT_S1);
  153. writel((unsigned int)wo->coordinatewrap_buf + (wo->srcwide / 2) * 8, REGS_WRAP_BASE + WRAP_CTL_RD_FADDR_ML_S1);
  154. writel((wo->srcheight << 16) | ((wo->srcwide / 2) << 0), REGS_WRAP_BASE + WRAP_CTL_ML_HEIGHT_WIDETH_S0);
  155. writel((wo->srcheight << 16) | ((wo->srcwide / 2) << 0), REGS_WRAP_BASE + WRAP_CTL_ML_HEIGHT_WIDETH_S1);
  156. writel((wo->srcwide << 16) | (wo->srcwide << 0), REGS_WRAP_BASE + WRAP_CTL_IMG_R_S3_S2);
  157. writel((wo->srcwide << 16) | (wo->srcwide << 0), REGS_WRAP_BASE + WRAP_CTL_IMG_R_S5_S4);
  158. writel((wo->srcwide << 16) | (wo->srcwide << 0), REGS_WRAP_BASE + WRAP_CTL_IMG_W_MRM_S3_S2);
  159. writel((wo->srcwide << 16) | (wo->srcwide << 0), REGS_WRAP_BASE + WRAP_CTL_IMG_W_MRM_S5_S4);
  160. writel((unsigned int)wo->deswrap_buf + (wo->srcwide / 2) * 4, REGS_WRAP_BASE + WRAP_CTL_WR_FADDR_RGB_S1);
  161. }
  162. request_irq(WRAP_IRQn, 0, wrap_interupt_handler, NULL);
  163. writel(0, REGS_WRAP_BASE + WRAP_CTL_INTER_MASK_REG);
  164. value = readl(REGS_WRAP_BASE + WRAP_CTL_READ_ID_REG);
  165. value |= (0x55 << 12);
  166. writel(value, REGS_WRAP_BASE + WRAP_CTL_READ_ID_REG);
  167. writel(1, REGS_WRAP_BASE + WRAP_CTL_WORK_EN_REG);
  168. }
  169. static void wrap_display_demo(void *param)
  170. {
  171. struct wrap_obj *wo = (struct wrap_obj *)param;
  172. uint32_t ulNotifiedValue;
  173. unsigned int status;
  174. FF_FILE *fp;
  175. size_t filesize;
  176. int rlen;
  177. if (!wo) {
  178. printf("%s Invalid wo.\n", __func__);
  179. goto end;
  180. }
  181. status = usb_wait_stor_dev_pluged(portMAX_DELAY);
  182. if (status != 0) {
  183. printf("%s usb_wait_stor_dev_pluged fail\n", __func__);
  184. goto end;
  185. }
  186. fp = ff_fopen("/usb/Distort_480x800_a888.bin", "rb");
  187. if (!fp) {
  188. printf("%s open file fail.\n", __func__);
  189. goto end;
  190. }
  191. filesize = ff_filelength(fp);
  192. rlen = ff_fread(wo->srcwrap_buf, 1, filesize, fp);
  193. if (rlen <= 0) {
  194. printf("%s read data fail.\n", __func__);
  195. ff_fclose(fp);
  196. goto end;
  197. }
  198. if (fp)
  199. ff_fclose(fp);
  200. fp = ff_fopen("/usb/outij480_800.bin", "rb");
  201. if (!fp) {
  202. printf("%s open file fail.\n", __func__);
  203. goto end;
  204. }
  205. filesize = ff_filelength(fp);
  206. rlen = ff_fread(wo->coordinatewrap_buf, 1, filesize, fp);
  207. if (rlen <= 0) {
  208. printf("%s read data fail.\n", __func__);
  209. ff_fclose(fp);
  210. goto end;
  211. }
  212. if (fp)
  213. ff_fclose(fp);
  214. wrap_configure(wo);
  215. xTaskNotifyWait(0x00, /* Don't clear any notification bits on entry. */
  216. 0xffffffff, /* Reset the notification value to 0 on exit. */
  217. &ulNotifiedValue, /* Notified value pass out in ulNotifiedValue. */
  218. portMAX_DELAY);
  219. ark_lcd_osd_enable(LCD_VIDEO_LAYER, 0);
  220. ark_lcd_osd_enable(LCD_UI_LAYER, 0);
  221. ark_lcd_set_osd_sync(LCD_VIDEO_LAYER);
  222. ark_lcd_set_osd_sync(LCD_UI_LAYER);
  223. ark_lcd_osd_coeff_enable(LCD_VIDEO_LAYER, 1);
  224. ark_lcd_osd_set_coeff(LCD_VIDEO_LAYER, 0xFF);
  225. ark_lcd_set_osd_possition(LCD_VIDEO_LAYER, 0, 0);
  226. ark_lcd_set_osd_size(LCD_VIDEO_LAYER, wo->srcwide, wo->srcheight);
  227. ark_lcd_set_osd_format(LCD_VIDEO_LAYER, LCD_OSD_FORAMT_ARGB888);
  228. ark_lcd_set_osd_yaddr(LCD_VIDEO_LAYER, (unsigned int)wo->deswrap_buf);
  229. ark_lcd_osd_enable(LCD_VIDEO_LAYER, 1);
  230. ark_lcd_set_osd_sync(LCD_VIDEO_LAYER);
  231. ark_lcd_wait_for_vsync();
  232. end:
  233. while(1)
  234. vTaskDelay(portMAX_DELAY);
  235. }
  236. void wrap_demo(void)
  237. {
  238. struct wrap_obj *wo;
  239. wo = pvPortMalloc(sizeof(struct wrap_obj));
  240. if (!wo) {
  241. printf("%s malloc wrap_obj fail!\n", __func__);
  242. return;
  243. }
  244. memset(wo, 0, sizeof(struct wrap_obj));
  245. wo->sect = SECT_1;
  246. wo->srcwide = WRAP_MAX_WIDTH;
  247. wo->srcheight = WRAP_MAX_HEIGHT;
  248. //源宽度小于1024的时候用分段1,源宽度大于1024用分段2
  249. if (!((wo->sect == SECT_1 && wo->srcwide <= WRAP_SEC_MAX_WHDTH) ||
  250. (wo->sect == SECT_2 && (WRAP_SEC_MAX_WHDTH < wo->srcwide) && (wo->srcwide <= LCD_WIDTH)))) {
  251. printf("%s wrap set fail.\n", __func__);
  252. goto err;
  253. }
  254. wo->srcwrap_buf = (void *)pvPortMalloc(WRAP_MAX_WIDTH * WRAP_MAX_HEIGHT * 4);
  255. if (!wo->srcwrap_buf) {
  256. printf("%s Src wrap buf malloc memory fail.\n", __func__);
  257. goto err;
  258. }
  259. wo->deswrap_buf = (void *)pvPortMalloc(WRAP_MAX_WIDTH * WRAP_MAX_HEIGHT * 4);
  260. if (!wo->deswrap_buf) {
  261. printf("%s Des wrap buf malloc memory fail.\n", __func__);
  262. goto err;
  263. }
  264. wo->coordinatewrap_buf = (void *)pvPortMalloc(WRAP_MAX_WIDTH * WRAP_MAX_HEIGHT * 8);
  265. if (!wo->coordinatewrap_buf) {
  266. printf("%s Des wrap buf malloc memory fail.\n", __func__);
  267. goto err;
  268. }
  269. memset(wo->srcwrap_buf, 0, WRAP_MAX_WIDTH * WRAP_MAX_HEIGHT * 4);
  270. memset(wo->deswrap_buf, 0, WRAP_MAX_WIDTH * WRAP_MAX_HEIGHT * 4);
  271. memset(wo->coordinatewrap_buf, 0, WRAP_MAX_WIDTH * WRAP_MAX_HEIGHT * 8);
  272. printf(">>>srcwrap_buf 0x%x, deswrap_buf 0x%x, coordinatewrap_buf 0x%x\n",
  273. wo->srcwrap_buf, wo->deswrap_buf, wo->coordinatewrap_buf);
  274. if (xTaskCreate(wrap_display_demo, "wrapdis", configMINIMAL_STACK_SIZE * 10, (void *)wo,
  275. configMAX_PRIORITIES - 3, &wrap_task) != pdPASS) {
  276. printf("%s create wrap display task fail.\n", __func__);
  277. goto err;
  278. }
  279. return;
  280. err:
  281. if (wo->coordinatewrap_buf)
  282. vPortFree(wo->coordinatewrap_buf);
  283. if (wo->deswrap_buf)
  284. vPortFree(wo->deswrap_buf);
  285. if (wo->srcwrap_buf)
  286. vPortFree(wo->srcwrap_buf);
  287. if (wo)
  288. vPortFree(wo);
  289. }