vg_driver_wrapper.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. #include <stdarg.h>
  2. #include "FreeRTOS.h"
  3. #include "board.h"
  4. #include "chip.h"
  5. #include "rtos.h"
  6. #include "romfile.h"
  7. #include "vg_driver.h"
  8. #ifndef VG_ONLY
  9. #include "lvgl/lvgl.h"
  10. #endif
  11. #ifdef VG_DRIVER
  12. #include "xm_base.h"
  13. uint32_t FS_FWrite(const void * pData, uint32_t Size, uint32_t N, void * pFile)
  14. {
  15. return 0;
  16. }
  17. int32_t FS_FTell(void * pFile)
  18. {
  19. return 0;
  20. }
  21. DWORD XM_GetTickCount (void)
  22. {
  23. return OS_GetTime();
  24. }
  25. unsigned int xm_vg_get_width (void)
  26. {
  27. return VG_W;
  28. }
  29. unsigned int xm_vg_get_height (void)
  30. {
  31. return VG_H;
  32. }
  33. unsigned int xm_vg_get_stride (void)
  34. {
  35. return VG_OSD_W * VG_BPP / 8;
  36. }
  37. unsigned int xm_vg_get_bpp (void)
  38. {
  39. return VG_BPP;
  40. }
  41. #if defined(REVERSE_TRACK)
  42. int xm_vg_is_valid_gpu_fb (unsigned int base)
  43. {
  44. int i;
  45. for (i = 0; i < VIDEO_DISPLAY_BUF_NUM; i++) {
  46. unsigned fb_base = ulVideoDisplayGetBufferAddr(i);
  47. unsigned vg_base = fb_base + VG_Y * VG_OSD_W * VG_BPP / 8 + VG_X * VG_BPP / 8;
  48. if (base == vg_base)
  49. return 1;
  50. }
  51. return 0;
  52. }
  53. #else
  54. int xm_vg_is_valid_gpu_fb (unsigned int base)
  55. {
  56. unsigned fb_base = ark_lcd_get_virt_addr();
  57. unsigned vg_base = fb_base + VG_Y * VG_OSD_W * VG_BPP / 8 + VG_X * VG_BPP / 8;
  58. if (base == vg_base || base == vg_base + xm_vg_get_stride() * VG_OSD_H)
  59. return 1;
  60. return 0;
  61. }
  62. #endif
  63. void* XM_RomAddress (const char *src)
  64. {
  65. if (!src || src[0] == '\0') return NULL;
  66. void *ptr;
  67. RomFile *file = RomFileOpen(src);
  68. if (!file) {
  69. printf("open romfile %s fail.\n", src);
  70. return NULL;
  71. }
  72. RomFileRead(file, NULL, file->size);
  73. ptr = file->buf;
  74. #ifndef ROMFILE_USE_SMALL_MEM
  75. RomFileClose(file);
  76. #endif
  77. return ptr;
  78. }
  79. #ifdef LVGL_VG_GPU
  80. unsigned int xm_vg_require_gpu_fb (void)
  81. {
  82. lv_disp_t * disp = lv_disp_get_default();
  83. unsigned int vg_frame_base = 0;
  84. if (disp) {
  85. lv_disp_buf_t * vdb = lv_disp_get_buf(disp);
  86. lv_color_t * disp_buf = vdb->buf_act;
  87. vg_frame_base = (unsigned int)disp_buf;
  88. } else {
  89. vg_frame_base = ark_lcd_get_virt_addr();
  90. }
  91. vg_frame_base += VG_Y * VG_OSD_W * VG_BPP / 8 + VG_X * VG_BPP / 8;
  92. return vg_frame_base;
  93. }
  94. #else
  95. #if defined(VG_ONLY)
  96. #ifdef AWTK
  97. #include "fb_queue.h"
  98. static fb_queue_s *curr_fb = NULL;
  99. unsigned int xm_vg_require_gpu_fb (void)
  100. {
  101. fb_queue_s *fb_unit = NULL;
  102. while (!fb_unit)
  103. {
  104. fb_unit = fb_queue_get_free_unit();
  105. if(fb_unit)
  106. break;
  107. OS_Delay (1);
  108. }
  109. curr_fb = fb_unit;
  110. //XM_lock();
  111. //printf ("req %x\n", fb_unit->fb_base);
  112. //XM_unlock();
  113. return fb_unit->fb_base;
  114. }
  115. void xm_vg_release_gpu_fb (void)
  116. {
  117. fb_queue_s *fb_unit = curr_fb;
  118. if(fb_unit)
  119. {
  120. curr_fb = NULL;
  121. fb_queue_set_ready (fb_unit);
  122. //XM_lock();
  123. //printf ("rdy %x\n", fb_unit->fb_base);
  124. //XM_unlock();
  125. }
  126. }
  127. #else
  128. static int fb_index = 0;
  129. unsigned int xm_vg_require_gpu_fb (void)
  130. {
  131. unsigned fb_base = ark_lcd_get_virt_addr();
  132. fb_base += fb_index * VG_OSD_W * VG_OSD_H * VG_BPP / 8;
  133. return fb_base;
  134. }
  135. void xm_vg_release_gpu_fb (void)
  136. {
  137. unsigned fb_base = xm_vg_require_gpu_fb();
  138. CP15_clean_dcache_for_dma((uint32_t)fb_base, VG_OSD_W * VG_OSD_H * VG_BPP / 8 + (uint32_t)fb_base);
  139. ark_lcd_set_osd_yaddr(LCD_UI_LAYER, (unsigned int)fb_base);
  140. ark_lcd_set_osd_sync(LCD_UI_LAYER);
  141. ark_lcd_wait_for_vsync();
  142. fb_index = (fb_index + 1) & 1;
  143. }
  144. // 获取当前正在渲染的OSD framebuffer
  145. // *no == -1 表示获取当前正在渲染的OSD framebuffer
  146. // 返回值
  147. // 当前正在渲染的OSD framebuffer基址
  148. unsigned int xm_vg_get_osd_fb (int *no)
  149. {
  150. unsigned fb_base = ark_lcd_get_virt_addr();
  151. fb_base += fb_index * VG_OSD_W * VG_OSD_H * VG_BPP / 8;
  152. if(*no == (-1))
  153. {
  154. *no = fb_index;
  155. return fb_base;
  156. }
  157. else
  158. {
  159. if(*no >= 2)
  160. return 0;
  161. else
  162. return fb_base;
  163. }
  164. }
  165. #endif
  166. #elif defined(REVERSE_TRACK)
  167. static unsigned int gpu_fb_addr = 0;
  168. void xm_vg_set_gpu_fb_addr(unsigned int addr)
  169. {
  170. gpu_fb_addr = addr;
  171. }
  172. unsigned int xm_vg_require_gpu_fb (void)
  173. {
  174. unsigned int vg_frame_base;
  175. vg_frame_base = gpu_fb_addr ? gpu_fb_addr : ulVideoDisplayGetBufferAddr(0);
  176. vg_frame_base += VG_Y * VG_OSD_W * VG_BPP / 8 + VG_X * VG_BPP / 8;
  177. return vg_frame_base;
  178. }
  179. #else
  180. unsigned int xm_vg_require_gpu_fb (void)
  181. {
  182. lv_disp_t * disp = lv_disp_get_default();
  183. lv_disp_buf_t * vdb = lv_disp_get_buf(disp);
  184. lv_color_t * disp_buf = vdb->buf_act;
  185. unsigned int vg_frame_base = (unsigned int)disp_buf;
  186. vg_frame_base += VG_Y * VG_OSD_W * VG_BPP / 8 + VG_X * VG_BPP / 8;
  187. return vg_frame_base;
  188. }
  189. #endif
  190. #endif
  191. int xm_vg_get_offset_x (void)
  192. {
  193. return VG_X;
  194. }
  195. int xm_vg_get_offset_y (void)
  196. {
  197. return VG_Y;
  198. }
  199. unsigned int xm_vg_get_osd_stride (void)
  200. {
  201. return VG_OSD_W * VG_BPP / 8;
  202. }
  203. void xm_vg_get_osd_window ( unsigned int* x,
  204. unsigned int* y,
  205. unsigned int* w,
  206. unsigned int* h,
  207. unsigned int* stride
  208. )
  209. {
  210. *x = VG_X;
  211. *y = VG_Y;
  212. *w = VG_W;
  213. *h = VG_H;
  214. *stride = xm_vg_get_stride();
  215. }
  216. void* xm_vg_get_gpu_background_image (void)
  217. {
  218. static RomFile *bgfile = NULL;
  219. if(!bgfile) {
  220. bgfile = RomFileOpen("vg_bg.rgb");
  221. if (!bgfile)
  222. return NULL;
  223. RomFileRead(bgfile, NULL, bgfile->size);
  224. }
  225. char *bk = (char*)bgfile->buf;
  226. if(bk)
  227. bk += (VG_H - 1) * VG_W * VG_BPP / 8;
  228. return (void *)bk;
  229. }
  230. unsigned int vg_get_framebuffer (void)
  231. {
  232. return xm_vg_require_gpu_fb();
  233. }
  234. #define XM_PRINTF_SIZE 128
  235. void XM_printf (char *fmt, ...)
  236. {
  237. static char xm_info[XM_PRINTF_SIZE + 4];
  238. va_list ap;
  239. xm_info[XM_PRINTF_SIZE] = 0;
  240. va_start(ap, fmt);
  241. //vsprintf (xm_info, fmt, ap);
  242. vsnprintf (xm_info, XM_PRINTF_SIZE, fmt, ap);
  243. va_end(ap);
  244. printf ("%s", xm_info);
  245. }
  246. void XM_printf_ (char *fmt, ...)
  247. {
  248. va_list ap;
  249. va_start(ap, fmt);
  250. printf(fmt, ap);
  251. va_end(ap);
  252. }
  253. #include "xm_base.h"
  254. #include "rtc.h"
  255. // 时间设置/读取函数
  256. // 返回1表示系统时间已设置
  257. // 返回0表示系统时间未设置,系统返回缺省定义时间
  258. int XM_GetLocalTime (XMSYSTEMTIME* pSystemTime)
  259. {
  260. SystemTime_t t;
  261. iGetLocalTime (&t);
  262. pSystemTime->wDay = t.tm_mday;
  263. pSystemTime->wDayOfWeek = t.tm_wday;
  264. pSystemTime->wHour = t.tm_hour;
  265. pSystemTime->wMilliseconds = 0;
  266. pSystemTime->wMinute = t.tm_min;
  267. pSystemTime->wMonth = t.tm_mon;
  268. pSystemTime->wSecond = t.tm_sec;
  269. pSystemTime->wYear = t.tm_year;
  270. return 1;
  271. }
  272. // 返回1设置系统时间成功
  273. // 返回0设置系统时间失败
  274. int XM_SetLocalTime (const XMSYSTEMTIME *pSystemTime)
  275. {
  276. SystemTime_t t;
  277. t.tm_mday = pSystemTime->wDay;
  278. t.tm_wday = pSystemTime->wDayOfWeek ;
  279. t.tm_hour = pSystemTime->wHour;
  280. t.tm_min = pSystemTime->wMinute;
  281. t.tm_mon = pSystemTime->wMonth;
  282. t.tm_sec = pSystemTime->wSecond;
  283. t.tm_year = pSystemTime->wYear;
  284. vSetLocalTime (&t);
  285. return 1;
  286. }
  287. #ifndef LVGL_VG_GPU
  288. #if defined(VG_ONLY)
  289. #if defined(DOUBLE_POINTER_HALO)
  290. extern int double_pointer_halo_init (int width, int height);
  291. extern int double_pointer_halo_draw (void);
  292. #elif defined(SINGLE_POINTER_HALO)
  293. extern int single_pointer_halo_init (int width, int height);
  294. extern int single_pointer_halo_draw (void);
  295. #elif defined(AWTK)
  296. extern int gui_app_start(int lcd_w, int lcd_h);
  297. #endif
  298. #include <stdlib.h>
  299. int xm_vg_loop (void *context)
  300. {
  301. #ifdef AWTK
  302. vTaskPrioritySet(NULL,16);
  303. gui_app_start (xm_vg_get_width(), xm_vg_get_height());
  304. return 0;
  305. #else
  306. int frame_count = 0;
  307. int vg_draw_tickets = 0; // 累加VG时间
  308. int vsync_delay_tickets = 0; // 累加LCD帧同步等待时间
  309. #if defined(DOUBLE_POINTER_HALO)
  310. double_pointer_halo_init(xm_vg_get_width(), xm_vg_get_height());
  311. #elif defined(SINGLE_POINTER_HALO)
  312. single_pointer_halo_init(xm_vg_get_width(), xm_vg_get_height());
  313. #endif
  314. unsigned int start_ticket = XM_GetTickCount();
  315. while(1)
  316. {
  317. // 获取当前正在渲染使用的OSD framebuffer基址及序号
  318. int fb_no = -1;
  319. unsigned int fb_base = xm_vg_get_osd_fb(&fb_no);
  320. int t1 = get_timer(0);
  321. #if defined(DOUBLE_POINTER_HALO)
  322. double_pointer_halo_draw();
  323. #elif defined(SINGLE_POINTER_HALO)
  324. single_pointer_halo_draw();
  325. #endif
  326. int t2 = get_timer(0);
  327. vg_draw_tickets += abs(t2 - t1);
  328. // 释放当前渲染的GPU帧, 并等待LCD刷新该帧
  329. xm_vg_release_gpu_fb ();
  330. int t3 = get_timer(0);
  331. vsync_delay_tickets += abs(t3 - t2);
  332. frame_count ++;
  333. if(frame_count == 1000)
  334. {
  335. unsigned int t = XM_GetTickCount() - start_ticket;
  336. printf ("fps = %4.1f , vg_ticket = %d us, vsync_delay_ticket = %d us\r\n", 1000.0*1000.0 / t, vg_draw_tickets / 1000, vsync_delay_tickets / 1000);
  337. vg_draw_tickets = 0;
  338. vsync_delay_tickets = 0;
  339. frame_count = 0;
  340. start_ticket = XM_GetTickCount();
  341. }
  342. //OS_Delay(1);
  343. }
  344. //double_pointer_halo_exit();
  345. //vgFinish();
  346. return 0;
  347. #endif
  348. }
  349. #else
  350. #ifdef REVERSE_TRACK
  351. static int track_index = 0;
  352. #else
  353. static int pointer_halo_speed = 0;
  354. #endif
  355. static TaskHandle_t vg_task = NULL;
  356. QueueHandle_t vg_done;
  357. void xm_vg_draw_prepare(void *para)
  358. {
  359. if (para == NULL)
  360. return;
  361. #ifdef REVERSE_TRACK
  362. track_index = *(int*)para;
  363. #else
  364. pointer_halo_speed = *(int*)para;
  365. #endif
  366. }
  367. void xm_vg_draw_start(void)
  368. {
  369. if (vg_done)
  370. xQueueReset(vg_done);
  371. if (vg_task)
  372. xTaskNotify(vg_task, 1, eSetValueWithOverwrite);
  373. if (vg_done)
  374. xQueueReceive(vg_done, NULL, portMAX_DELAY);
  375. }
  376. #ifdef REVERSE_TRACK
  377. extern int reversing_auxiliary_line_init (int width, int height);
  378. extern int reversing_auxiliary_line_draw (int index);
  379. #else
  380. extern int pointer_halo_init (int width, int height);
  381. extern int pointer_halo_draw (int speed);
  382. #endif
  383. int xm_vg_loop (void *context)
  384. {
  385. uint32_t ulNotifiedValue;
  386. //uint32_t stick = xTaskGetTickCount();
  387. //uint32_t framecount = 0;
  388. vg_task = xTaskGetCurrentTaskHandle();
  389. vg_done = xQueueCreate(1, 0);
  390. #ifdef REVERSE_TRACK
  391. reversing_auxiliary_line_init(xm_vg_get_width(), xm_vg_get_height());
  392. #else
  393. pointer_halo_init(xm_vg_get_width(), xm_vg_get_height());
  394. #endif
  395. while(1)
  396. {
  397. xTaskNotifyWait( 0x00, /* Don't clear any notification bits on entry. */
  398. 0xffffffff, /* Reset the notification value to 0 on exit. */
  399. &ulNotifiedValue, /* Notified value pass out in ulNotifiedValue. */
  400. portMAX_DELAY);
  401. #ifdef REVERSE_TRACK
  402. reversing_auxiliary_line_draw(track_index);
  403. #else
  404. pointer_halo_draw(pointer_halo_speed);
  405. #endif
  406. /* if (++framecount == 1000) {
  407. uint32_t tick = xTaskGetTickCount();
  408. printf("fps %d.\n", 1000 * 1000 / (tick - stick));
  409. framecount = 0;
  410. stick = xTaskGetTickCount();
  411. } */
  412. xQueueSend(vg_done, NULL, 0);
  413. }
  414. #ifdef REVERSE_TRACK
  415. //reversing_auxiliary_line_exit();
  416. #else
  417. //pointer_halo_exit();
  418. #endif
  419. //vgFinish();
  420. return 0;
  421. }
  422. #endif
  423. #endif
  424. #ifdef LVGL_VG_GPU
  425. extern void lvgl_thread(void *data);
  426. int xm_vg_loop (void *context)
  427. {
  428. lvgl_thread(NULL);
  429. return 0;
  430. }
  431. #endif
  432. #endif