ark1668显示接口相关说明.txt 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. ark1668显示接口相关说明:
  2. ---------------------------------------------------------------------------------------------
  3. 一、显示层说明
  4. ---------------------------------------------------------------------------------------------
  5. ark1668一共有5个显示层,各显示层功能分配如下:
  6. enum ark1668_disp_layer {
  7. PRIMARY_LAYER, //UI显示
  8. VIDEO_LAYER, //多媒体视频,手机互联carlife carplay等
  9. OVER_LAYER, //overlay for UI,比如倒车轨迹,倒车警告画面等
  10. TVOUT_LAYER, //tvout 输出
  11. AUX_LAYER, //倒车, auxin
  12. };
  13. 对于app开发者来说主要涉及到需要处理的显示层是PRIMARY_LAYER,OVER_LAYER,VIDEO_LAYER。
  14. TVOUT_LAYER, AUX_LAYER一般由底层处理,一般情况下不要关心。
  15. ---------------------------------------------------------------------------------------------
  16. 二、显示层优先级
  17. ---------------------------------------------------------------------------------------------
  18. VIDEO_LAYER AUX_LAYER PRIMARY_LAYER OVER_LAYER
  19. 0 1 2 3
  20. --------------------------------------------------------->
  21. 显示层按以上次序从上往下叠加,数字越大,显示就在越上面。
  22. ---------------------------------------------------------------------------------------------
  23. 三、相关显示接口说明
  24. ---------------------------------------------------------------------------------------------
  25. 1、打开关闭显示层
  26. int arkapi_display_open_layer(enum ark1668_disp_layer layer);
  27. void arkapi_display_close_layer(int fd);
  28. int arkapi_display_recycle_layer(enum ark1668_disp_layer layer);
  29. arkapi_display_open_layer如果返回值为-EBUSY表示该层已经在使用,可以延长一段时间
  30. 等待对方close后再申请或者调用arkapi_display_recycle_layer强制关闭并释放该显示层。
  31. 2、显示隐藏显示层
  32. int arkapi_display_show_layer(int fd);
  33. int arkapi_display_hide_layer(int fd);
  34. int arkapi_display_force_show_layer(enum ark1668_disp_layer layer);
  35. int arkapi_display_force_hide_layer(enum ark1668_disp_layer layer);
  36. 应用有的时候需要强制关闭某层,比如倒车时可以关闭视频层显示来降低带宽,调用
  37. arkapi_display_force_hide_layer后,可以强制该层进行隐藏,该层之前的拥有者调用
  38. arkapi_display_show_layer不再会显示该层,只是纪录状态,等到调用arkapi_display_force_show_layer
  39. 后会根据该层拥有者设置的显示状态来决定是否需要重新显示。
  40. 3、显示层窗口参数设置立刻生效接口
  41. int arkapi_display_set_layer_pos(int fd, int x, int y);
  42. int arkapi_display_set_layer_size(int fd, int width, int height);
  43. int arkapi_display_set_layer_format(int fd, enum ark1668_disp_format format);
  44. //int arkapi_display_set_layer_addr(int fd, unsigned int pyrgbaddr, unsigned int pcbaddr, unsigned int pcraddr);
  45. int arkapi_display_set_layer_scaler(int fd, struct ark1668_disp_scaler* spara);
  46. 注意:PRIMARY_LAYER,OVER_LAYER,VIDEO_LAYER这三层是没有arkapi_display_set_layer_scaler功能
  47. 只有TVOUT_LAYER, AUX_LAYER这两层才有。
  48. 4、显示层窗口参数设置统一生效接口
  49. int arkapi_display_set_layer_pos_atomic(int fd, int x, int y);
  50. int arkapi_display_set_layer_size_atomic(int fd, int width, int height);
  51. int arkapi_display_set_layer_format_atomic(int fd, enum ark1668_disp_format format);
  52. int arkapi_display_set_layer_addr_atomic(int fd, unsigned int pyrgbaddr, unsigned int pcbaddr, unsigned int pcraddr);
  53. int arkapi_display_set_layer_scaler_atomic(int fd, struct ark1668_disp_scaler* spara);
  54. int arkapi_display_layer_update_commit(int fd);
  55. 以上xxx_atomic 函数设置时不会马上生效(根据需要调用相关的接口),需要调用
  56. arkapi_display_layer_update_commit后才统一生效,主要用于避免视频播放过程中改变显示分辨率造成的花屏。
  57. 注意:PRIMARY_LAYER,OVER_LAYER,VIDEO_LAYER这三层是没有arkapi_display_set_layer_scaler_atomic功能
  58. 只有TVOUT_LAYER, AUX_LAYER这两层才有。
  59. 5、显示层内存申请
  60. unsigned int arkapi_display_request_buffer(int fd, unsigned int size);
  61. 显示层内存申请返回是申请到的内存的虚拟地址,这块size的大小的内存在物理上是连续的,
  62. 申请的size的大小由用户自定义。如果返回0,则申请不成功。
  63. 注意: PRIMARY_LAYER的addr默认情况下示已经设置好的,该地址和申请到的基地址一样。
  64. 该层实现了标准的fb相关功能,没有特殊要求的情况下可以不需要申请内存之类的操作。
  65. 6、显示层内存使用方法
  66. 如果OVER_LAYER的需求是需要两个块buffer,一块处理数据,一块显示,两buffer功能不停的切换。可以按如下方法实现:
  67. (1)申请size = buffer_size * 2,内存申请成功后会返回虚拟地址virt_base
  68. (2)设置两个buffer的基地址
  69. buffer_addr[0] = virt_base;
  70. buffer_addr[1] = virt_base + buffer_size;
  71. (3)填充好bufffer中的数据后显示
  72. arkapi_display_set_layer_addr(int fd, unsigned int pyrgbaddr, unsigned int pcbaddr, unsigned int pcraddr)
  73. arkapi_display_set_layer_addr_atomic(int fd, unsigned int pyrgbaddr, unsigned int pcbaddr, unsigned int pcraddr);
  74. pyrgbaddr------------------------对应buffer的基地址
  75. pcbaddr--------------------------0(rgb格式) 或者 buffer的基地址的偏移(yuv数据格式)
  76. pcraddr--------------------------0(rgb格式) 或者 buffer的基地址的偏移(yuv数据格式)
  77. ---------------------------------------------------------------------------------------------
  78. 四、app与倒车交互
  79. ---------------------------------------------------------------------------------------------
  80. 1、app启动后首先打开carback驱动,同时需要告诉carback驱动,app已经启动。
  81. static int carback_open(void)
  82. {
  83. int fd, ret;
  84. fd = open("/dev/carback", O_RDWR);
  85. if (fd < 0) {
  86. printf("open /dev/carback failed.\n");
  87. return -ENOENT;
  88. }
  89. ret = ioctl(fd, CARBACK_IOCTL_SET_APP_READY, NULL);
  90. if (ret != 0) {
  91. printf("%s: ioctl error.\n",__func__);
  92. }
  93. return fd;
  94. }
  95. 2、通过poll监听当前倒车状态是否变化,如果倒车状态有变化,读取倒车状态。
  96. 3、如果倒车状态发生变化,carback驱动最多会有500ms时间让app处理相关事项
  97. (包括隐藏或显示ui和overlay显示)准备进入或退出倒车。
  98. 4、app准备好进入倒车后,调用
  99. ioctl(fd, CARBACK_IOCTL_APP_ENTER_DONE, NULL);carback驱动开始进入倒车。
  100. app准备好退出倒车后,调用
  101. ioctl(fd, CARBACK_IOCTL_APP_EXIT_DONE, NULL);carback驱动开始退出倒车
  102. ---------------------------------------------------------------------------------------------
  103. 五、其他
  104. ---------------------------------------------------------------------------------------------
  105. 1、增加libarkdisp.so,存放路径/usr/lib
  106. 2、以上相关接口调用可以参考demo-display源代码
  107. 串口终端运行/usr/bin/demo-display,可以看到效果