您尚未登录。

楼主 # 2025-07-07 17:53:50

lztmfx
会员
注册时间: 2023-03-01
已发帖子: 9
积分: 14

全志disp显示框架如何指定图层显示

大概查了一下全志的芯片,发现很少用drm显示框架的,都是用自研的disp框架,唯一的资料就是《Linux_Display_开发指南.pdf》,然而呢这个文档是个通用文档,实际上每颗芯片支持的显示接口和图层数量都不一样,具体的对应关系没法得知,如果用drm框架,modetest命令就能清晰查看整个显示框架之间的关系,但没办法,官方不适配DRM,图层处理又涉及一些硬件加速模块,咋也没能力适配。
.png

有没有大佬对这个显示框架使用比较熟悉的?比如用T113S3这个芯片,至少是支持两个显示图层吧,那么显示接口是“/dev/fb0”,控制接口是"/dev/disp",常规用法就是往fb0推图显示,这样是显示在默认图层,如何实现推送fb0显示时指定显示在哪个图层?在DRM框架,图层是通过ZPOS属性控制层级顺序的,zpos大的覆盖zpos小的图层。是初始化两个/dev/fb0的句柄,然后在每次推送显示buf的时候都调用"/dev/disp"设置要显示在哪个图层吗?DRM框架是通过指定layer id来区分的。/dev/fb貌似没有指定显示ID的接口

为什么要纠结这个点?
主要是想做类似播放器的这种应用,LVGL UI+透明背景推送显示在上层,下层播放需要硬解码的视频,图片资源,因为把解码后的数据memcpy给lvgl的控件显示太低效了,SDK的lv_monitor有类似的功能,但是还是没有具体控制显示图层的代码,是直接调用了tplayer框架,还是不灵活。

最近编辑记录 lztmfx (2025-07-07 17:56:39)

离线

#1 2025-07-09 08:00:42

m68000
会员
注册时间: 2022-04-13
已发帖子: 21
积分: 21

Re: 全志disp显示框架如何指定图层显示

最近研究de很长时间,不过是裸机状态,裸机的话能帮你,linux不懂

离线

楼主 #2 2025-07-09 10:11:20

lztmfx
会员
注册时间: 2023-03-01
已发帖子: 9
积分: 14

Re: 全志disp显示框架如何指定图层显示

m68000 说:

最近研究de很长时间,不过是裸机状态,裸机的话能帮你,linux不懂

感谢大佬的回复,裸机代码也有参考价值,裸机上如何做图层显示的?我看一个DE有多个chn,每个chn下面有多个layer,layer就是显示的图层,如何获取当前芯片有几个chn?指定的chn有几个layer?哪些layer是支持yuv和rgb的,哪些layer只支持rgb?如果要同时在两个layer上显示,流程是什么样的?裸机上有用libuapi这个库吗?看着就是这个库涉及相关操作,但是跑不起来。
_20250709-1010.png

离线

#3 2025-07-10 08:20:27

m68000
会员
注册时间: 2022-04-13
已发帖子: 21
积分: 21

Re: 全志disp显示框架如何指定图层显示

一般来说,DE2是有4个ch的,但是T113只有两个ch,ch0为VI通道,支持YUV和RGB,ch1为UI通道,只支持RGB,每个通道有4个layer,
ch0的四个layer可以选择支持yuv也可以选择支持RGB,也可以选择不同的layer支持yue和RGB, ch1的四个layer只能是RGB,注意:两个通道ch0和ch1的4个layer是有优先级的,layer3显示优先级最大,layer0的显示优先级最小,也就是说,layer3是显示在最前面的,layer0是显示在最后面的,前面的layer会覆盖后面的layer,它们之间没有透明模式,透明模式只能是ch0和ch1之间, 同一个ch的4个layer可以显示在不同的位置,比如可以将屏幕分成四份,每个layer负责显示一份.
我的裸机没用到任何库,完全是寄存器操作.
如果要在UI层进行单layer显示,参考xboot的代码就可以,如果需要多layer显示,需要设置UI通道的:
OVL_UI attribute control register,选择layer的格式,透明度,允许
OVL_UI memory block size register,设置layer的大小
OVL_UI memory block coordinate register ,设置layer的位置
OVL_UI memory pitch register,设置layer pitch的长度,如果是ARGB8888模式,是layer宽度x4,如果是RGB565,则是宽度x2
OVL_UI_TOP_LADD 设置你的帧的数据地址

离线

楼主 #4 2025-07-10 10:09:35

lztmfx
会员
注册时间: 2023-03-01
已发帖子: 9
积分: 14

Re: 全志disp显示框架如何指定图层显示

@m68000
非常感谢大佬解惑,终于知道这个chn和layer的数量和层次关系了,如果在全志的其他平台,有什么方式查看支持几个chn,几个layer吗?

离线

#5 2025-07-10 11:24:44

微凉VeiLiang
会员
所在地: 深圳
注册时间: 2018-10-28
已发帖子: 639
积分: 534
个人网站

Re: 全志disp显示框架如何指定图层显示

楼上说的对。这里提供下linux下的操作
对于disp显示对接,可以直接应用层操作设备文件/dev/disp
比如我们做摄像头刷图,上层显示界面的应用,会做一个app来做图像采集刷图 ,刷在通道0,图层0。这个是最底层的。操作如下
包含头文件 #include "sunxi_display2.h"

dispfh = open("/dev/disp", O_RDWR);
config.channel = 0;
config.layer_id = 0;
config.info.fb.addr[0] = addr0;//刷图的内容,按照下面具体格式来决定三个地址传参的内容
config.info.fb.addr[1] = addr1;
config.info.fb.addr[2] = addr2;
config.info.fb.format = DISP_FORMAT_YUV420_P;
config.info.mode      = LAYER_MODE_BUFFER;
config.enable = 1;
arg[0] = 0;
arg[1] = (unsigned long)&config;
arg[2] = 1;
arg[3] = 0;
return ioctl(dispfh, DISP_LAYER_SET_CONFIG, (void *)arg);

再修改fb驱动,这样可以让linux跑的ui刷图在上面,对于透明的地方就显示出摄像头图像内容
具体默认fb驱动对接的就是通道1,图层0.  >>所以不用改<<,具体驱动文件内容位置在tina5/kernel/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/dev_fb.c的1432行附近2177行附近。内容如下
/* fb0 bound to layer(1,0)  */
g_fbi.layer_hdl[fb_id][0] = 1;
g_fbi.layer_hdl[fb_id][1] = 0;

如果楼主的gui是自己控制对接的话,可以在应用层对接上disp的第0通道各个图层,记得不操作fb,这样就行了

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn