首页 > 其他分享 >全志A133 Android10 Display框架实践

全志A133 Android10 Display框架实践

时间:2022-12-22 19:45:06浏览次数:49  
标签:disp layer buffer Android10 全志 mode A133 alpha 图层

一、Sunxi平台图形开发术语

全志A133采用的DISP2的框架,即DE2.0版本。

对应kernel的配置:CONFIG_DISP2_SUNXI=y

 

 

 

1、硬件术语
1)layer:一个图层处理单元,可以处理一张输入图像,按支持的图像格式分为video和ui类型。
2)channel:一个硬件通道,包含若干个图层处理单元,可以同时处理若干(典型4个)格式相同的图层。
3)alpha:透明度,在混合时决定对应图像的透明度。
4)transform:图像变换,如平移、旋转等。
5)overlay:图像叠加,按顺序将图像叠加一起的效果。Z序大的靠近观察者,会把z序小的挡住。
6)blending:图像混合,按alpha比例将图像合成一起的效果。
7)enhance:图像增强,有目的地处理图像数据已达到改善图像效果的过程或方法。
8)capture:截屏,将de的输出保存到本地文件。
9)de:Display Engine,显示引擎用于实现对图层的管理以及显示工作,支持HDMI、TV、LCD、等输出模式,是负责将输入的多图层进行叠加、混合、缩放等处理的硬件模块。它不但支持linux标准的framebuffer接口,还支持多种显示效果处理,比如alpha,colorkey,图像增强,亮度、对比度、饱和度、色度调整。

2、软件术语
1)fb:帧缓冲(framebuffer),linux为显示设备提供的一个接口,把显存抽象成的一种设备。(也可以通过ion分配buffer使用)
2)al:抽象层,驱动中将底层硬件抽象成固定业务逻辑的软件层。
3)lowlevel:底层,直接操作硬件寄存器的软件层。

二、Sunxi平台DE引擎

不同的处理器中的DE模块支持的功能具有差异,典型的DE模块支持1路显示通路,该显示通路支持4个可以做alpha blending操作的通道(channel),通道之间的排序可以通过Z值控制,Z值越大越靠上。每个通道又支持4个可以做overlay操作的图层(layer)。但是这四个显示通路并不完全一致,通道0和通道1称为Video channel,支持YUV和RGB数据格式的输入:通道2和通道3称为UI channel,仅支持RGB数据格式的输入。

     

 

 

 

 

DE图层模块使用主要通过 ioctl 实现,对应的驱动节点是/dev/disp,具体定义请仔细阅读头文件上面的注释:  kernel/linux-4.9/include/video/sunxi_display2.h。对于显示模块来说,把图层参数设置到驱动让显示器显示为最重要。以下介绍sunxi_display2.h中3个核心的结构体:

1) struct disp_layer_config2  : 该结构体包含对应通道和图层的全部信息

/* disp_layer_config2 - layer config v2
 *
 * @info: layer info
 * @enable: indicate to enable/disable the layer
 * @channel: the channel index of the layer, 0~max-channel-number
 * @layer_id: the layer index of the layer widthin it's channel
 */
struct disp_layer_config2 {
        struct disp_layer_info2 info;
        bool enable;
        unsigned int channel;
        unsigned int layer_id;
};

sunxi 平台的 DE 接受用户设置的图层以 disp,channel,layer id 三个索引唯一确定 (disp:0/1,channel: 0/1/2/3,layer id:0/1/2/3),其中 disp 表示显示器索引,channel 表示通道索引,layer id 表示通道内的图层索引。

2)struct disp_fb_info2  : 该结构体对应图像缓冲区的信息

/* disp_fb_info2 - image buffer info v2
 *
 * @fd: dma_buf  fd for frame buffer
 * @size: size<width,height> for each buffer, unit:pixels
 * @align: align for each buffer, unit:bytes
 * @format: pixel format
 * @color_space: color space
 * @trd_right_fd: dma_buf fd for the right-eye frame buffer,
 *                  valid when frame-packing 3d buffer input
 * @pre_multiply: indicate the pixel use premultiplied alpha
 * @crop: crop rectangle for buffer to be display
 * @flag: indicate stereo/non-stereo buffer
 * @scan: indicate interleave/progressive scan type, and the scan order
 * @depth: depth perception for stereo image, only valid when stereo image input
 *            unit: pixel
 * @fbd_en: indicate if enable fbd function
 * @metadata_fd: dma_buf fd for the buffer contained metadata for fbc/hdr
 * @metadata_size: the size of metadata buffer, unit:bytes
 * @metadata_flag: the flag to indicate the type of metadata buffer
 *      0     : no metadata
 *      1 << 0: hdr static metadata
 *      1 << 1: hdr dynamic metadata
 *      1 << 4: frame buffer compress(fbc) metadata
 *      x     : all type could be "or" together
 */
struct disp_fb_info2 {
        int                      fd;
        struct disp_rectsz       size[3];
        unsigned int             align[3];
        enum disp_pixel_format   format;
        enum disp_color_space    color_space;
        int                      trd_right_fd;
        bool                     pre_multiply;
        struct disp_rect64       crop;
        enum disp_buffer_flags   flags;
        enum disp_scan_flags     scan;
        enum disp_eotf           eotf;
        int                      depth;
        unsigned int             fbd_en;
        int                      metadata_fd;
        unsigned int             metadata_size;
        unsigned int             metadata_flag;
};

Size 表示 buffer 的完整尺寸,crop 则表示 buffer 中需要显示裁减区。如下图所示,完整的图像以size 标识,而矩形框住的部分为裁减区,以 crop 标识,在屏幕上只能看到 crop 标识的部分,其余部分是隐藏的,不能在屏幕上显示出来。

 

   crop 上面已经介绍过,Screen win 为 crop 部分 buffer 在屏幕上显示的位置。如果不需要进行缩放的话,crop 和 screen win 的 width,height 是相等的,如果需要缩放,crop 和 screen win 的 width,height可以不相等

3)struct disp_fb_info2  : 该结构体对应图层的参数

/* disp_layer_info2 - layer info v2
 *
 * @mode: buffer/clolor mode, when in color mode, the layer is widthout buffer
 * @zorder: the zorder of layer, 0~max-layer-number
 * @alpha_mode:
 *      0: pixel alpha;
 *      1: global alpha
 *      2: mixed alpha, compositing width pixel alpha before global alpha
 * @alpha_value: global alpha value, valid when alpha_mode is not pixel alpha
 * @screen_win: the rectangle on the screen for fb to be display
 * @b_trd_out: indicate if 3d display output
 * @out_trd_mode: 3d output mode, valid when b_trd_out is true
 * @color: the color value to be display, valid when layer is in color mode
 * @fb: the framebuffer info related width the layer, valid when in buffer mode
 * @id: frame id, the user could get the frame-id display currently by
 *      DISP_LAYER_GET_FRAME_ID ioctl
 * @atw: asynchronous time wrap information
 */
struct disp_layer_info2 {
        enum disp_layer_mode      mode;
        unsigned char             zorder;
        unsigned char             alpha_mode;
        unsigned char             alpha_value;
        struct disp_rect          screen_win;
        bool                      b_trd_out;
        enum disp_3d_out_mode     out_trd_mode;
        union {
                unsigned int            color;
                struct disp_fb_info2    fb;
        };

        unsigned int              id;
        struct disp_atw_info      atw;
        enum disp_transform transform;
        struct disp_snr_info snr;
};

Alpha 模式有三种:

0:Pixelalpha: 点alpha,即每个像素都有自己单独的 alpha,可以实现部分区域全透,部分区域半透,部分区域不透的效果。

1:Gloabal alpha: 全局alpha,也叫面alpha,即整个图层共用一个 alpha,统一的透明度。

2:Global pixel alpha: 可以是说以上两种效果的叠加,在实现 pxiel alpha 的效果的同时,还可以做淡入浅出的效果。

 

三、DE图层操作demo

sunxi显示驱动对应的字符设备节点为 /dev/disp 驱动代码位置:kernel/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/dev_disp.c

 实际上只有disp_ioctl()和disp_mmap()两个函数有具体实现。

下面基于手上的A133平台通disp驱动添加一个图层,用于应用层直接写入ARGB数据进行显示。

首先查看当前设备的图层信息:cat /sys/class/disp/disp/attr/sys

其中 enable ch[0] lyr[0] z[0] 可以看出只有1个图层,即channel为0,layer为0,zorder(图层优先级,值越大越在上层)为0。
初始化部分代码:

 

g_dispConfig就是struct disp_layer_config2变量保存当前的配置信息,然后通过ioctl发送到驱动层执行:

 

然后再查看设备的图层信息:

可以看出增加了一个图层:channel为1,layer为0,zorder为20(高于原来的图层ch[0])。

注:增加的图层不一定要对接到底层实际的framebuffer,可以通过ION驱动ION_IOC_ALLOC和ION_IOC_SHARE创建一块内存,然后通过共享内存的句柄mmap出虚拟地址给应用层直接写入数据进行显示,如上配置代码段中的g_dispConfig.info.fb.fd赋值的ionBufferFd就是ION共享Buffer对应的文件描述符。

 

标签:disp,layer,buffer,Android10,全志,mode,A133,alpha,图层
From: https://www.cnblogs.com/blogs-of-lxl/p/16999462.html

相关文章

  • 全志V853 在 NPU 转换 YOLO V3 模型
    NPU转换YOLOV3模型YOLO全称是YouOnlyLookOnce(你只需看一次),从名称上也能看出这种算法速度快的优势,因此在许多边缘设备上,YOLO算法的使用十分广泛。YOLOV3是华盛顿......
  • Android10系统定制|frida逆向分析实战课程
    ......
  • 全志V853平台Camera模块开发框架详解
    Camera本章节介绍V853平台Camera模块的开发。V853支持并口CSI、MIPI,使用VINcamera驱动框架。Camera通路框架VIN支持灵活配置单/双路输入双ISP多通路输出的规格......
  • 全志V3S 调试串口更改或关闭
    有时项目外设比较多,很容易造成串口不够用的情况。最近就遇到了,新增加一个GPS模块串口的,串口现在外部只有原来的调试串口可以用,所以尝试将调试口更改为普通串口。经过网......
  • 全志F133(D1s)芯片 如何在Tina下进行显示旋转?
    问题背景目前显示多基于横屏的情况设计布局,UI,图片,视频等显示.而常用到的MIPI屏大多都是竖屏,为避免重新调整布局,显示提供了竖屏旋转成横屏的显示方式,节省客户......
  • 全志t507 tp2815 采集摄像头视频 app应用demo ffmpeg5将NV21转rgb
      //摄像头驱动层输出的数据流是NV21格式,此处是使用ffmpeg5将nv21转为rgb并输出到屏幕上#include<stdio.h>#include<pthread.h>#include<unistd.h>#inc......
  • UVA1331 题解
    前言题目传送门!更好的阅读体验?计算几何、区间DP。思路......
  • 创龙AD+全志T3 TL7606I模块测试
    前言本文主要介绍基于全志科技T3(ARMCortex-A7)处理器的8/16通道AD采集开发案例,使用核芯互联CL1606/CL1616AD芯片,亦适用于ADIAD7606/AD7616。CL1606/CL1616与AD7606/AD......
  • 创龙AD+全志T3 ad_display 开发案例
    前言本文主要介绍基于全志科技T3(ARMCortex-A7)处理器的8/16通道AD采集开发案例,使用核芯互联CL1606/CL1616AD芯片,亦适用于ADIAD7606/AD7616。CL1606/CL1616与AD7606/AD......
  • Android10 dex2oat实践
    最近看到一篇博客:Android性能优化之Android10+dex2oat实践,对这个优化很感兴趣,打算研究研究能否接入到项目中。不过该博客只讲述了思路,没有给完整源码。本项目参考该博......