[玩转先楫显示接口RGB外设系列之一]LCDC显示性能和多图层展示
一、题外话
这个月hpmicro关于软件的发布了不少新版本,有以下些许新动作:
1、hpm_sdk已经在六月份更新到V1.2.0。包含env环境的可以了解这个仓库: hpmicro/sdk_env at v1.2.0 (github.com)
2、hpmicro rtthead bsp包已经更新到 v1.2.0。具体了解可以看官方公众号文章: 持续优化|RT-Thread BSP v1.2.0 发布啦!更新要点一文速览,干货满满
同样也发布了新的型号hpm5300系列,公众号信息: 独具匠“芯”|先楫半导体高性能运动控制MCU HPM5300系列正式发布!
二、概述
先楫的HPM6700/6400系列自带了RGB控制器接口,先楫对于此外设命名为LCDC,也就是LCD controller简称。
LCDC的特性如下:
这里需要知道的是:
支持的数据格式输入与显示接口并无多大关系。比如:
图层输入格式支持ARGB8888,但是显示接口可以为RGB565,只是输出的时候相对应的通道会损失对应的位。
本文主要探讨lcdc外设的显示性能以及8个图层的展示阐述。
三、显示屏面板初始化
1、LCDC功能时钟开启,提供pixclk时钟
这里需要配合对应的lcd屏幕需要的像素时钟,比如先楫适配的周立功7寸显示模块使用的就是 TM070RDH13型号面板,从手册可以知道,要求像素时钟最大40M,当然,当然也可以适当提高,只要不造成花屏都不太影响。
sdk中对应的board,时钟初始化设置为十分频,也就是59.4MHZ
2、引脚初始化
hpm的lcdc引脚初始化十分简单,只需要使能对应的复用引脚功能即可。hpm_sdk中使用的是RGB888,显示可以更为细腻,但这里使用的是RGB565。故注释掉对应的无效引脚。
3、显示屏面板参数设置
在设置之前,需要了解下RGB的时序,比如分辨率800*480,有效数据是800*480像素点,但实际传输中,需要一定行列间隔等待,也就是消隐阶段,之后才是有效区域数据。比如以下的时序图:
在帧同步VSYNC信号上,需要设置VSYNC本身宽度,帧前后消隐VFP、VBP;在行同步HSYNC信号上,需要设置HSYNC本身宽度,行前后消隐VFP、VBP;
在hpm手册中,对应的寄存器操作
而对应的hpm_sdk操作接口是lcd_init,结构体传参对应如下:
那么如何对应上对应的显示面板参数,在面板的手册中可以看到:
那么对应的宽度设置,sdk在对应的board.h中使用数组来包含,然后调用board_panel_para_to_lcdc来重新赋值。开发者可以根据自身显示屏更改。
另外还需要设置相关信号的极性选择,这样显示屏才能正确采样显示。
从面板的时序可以看到:
数据显示屏在下降沿采样数据,数据有效阶段是HREF(DE)信号为高电平有效,VS和HS信号在高电平时处于消隐阶段。那么对应的HPM手册可以看到如下寄存器操作:
对应的hpm_sdk操作的成员有:
另外需要设置下背景颜色,如果在没有图层的情况下,默认就是使用该背景,可以用来测试显示屏是否设置成功。当然也可以使用开启横竖条纹测试。
对应的hpm_sdk是lcdc_set_testmode这个API。
如此以来就可以驱动RGB显示屏。
四、显示帧率性能挖掘
这里使用800*480分辨率的通用显示屏作为验证。
hpm的lcdc作为VIS系统挂在AXI总线上,内置DMA访问AXI的RAM区域,开发者不需要自己搬运DMA,只需要根据相关标志位比如DMA传输完成后再赋值对应的缓冲显存即可。具体可以参考sample的lcdc例子。
若要计算帧率,需要像素时钟频率,显示屏尺寸像素,以及对应的消隐时间。那么可以以下公式:
上式给出了更新一帧图像所需要的像素时钟周期,那么要计算总帧数fps。则计算如下:
那么从上述的阐述中,给显示屏面板的像素时钟为49.5M,总的像素点为:(800 + 46 + 50) * (480 + 23 + 10)= 459648。
总的帧率就为:49500000/459648 = 129.22fps。
从之前作者做的视频可以看到--传送门《 hpm6750 sdxc读取sd卡速度49MB/S。800*480分辨率的整体刷屏帧率从20多提升到42fps+ 》
播放个RGB视频,小屏幕显示中间的值是8ms,也就是刷屏时间,合计为125fps左右,证明是可以达到帧率性能的。
五、多图层展示解析
先楫的LCDC支持8个图层layer,每个layer支持的输入格式ARGB8888, RGB565, YUV422/YCbCr422, Y8, 1bpp, 2bpp, 4bpp 和 8bpp。
图层之间有alpha混合器,也就是alpha blending,这里简称为bld,每两个图层都有bld,下一个图层对接上一个bld,比如:
混合器的作用就是在于把两个图层的像素能够进行混合成为新的图层,在手册文档中有几种模式的展示。
每个模式的计算方式如下:
像素点的计算规则如下表 ,每一行的 [..., ...] 里,逗号 (,) 之前为 alpha 通道的更新规则,逗号 (,)之后为色度通道的更新规则。Da 为目标图 alpha 通道值, Sa 为源图 alpha 通道值, Dc 为目标图色度通道值, Sc为源图色度通道值。
图层的寄存器操作比较多,这里不做阐述,在hpm_sdk中主要layer操作API是lcdc_config_layer,需要传参结构体是lcdc_layer_config_t,本文以此API作为阐述。
本文主要验证RGB,YUV不在本文阐述范围内,bld模式都设置为src_over叠加模式。其他模式可综合自身需求自行验证。
比如设置的第一层layer。
需要关心的成员解释:
position_x: 起始X坐标点(相对面板)
position_y:起始Y坐标点(相对面板)
width:图层的宽度
height:图层的高度
buffer:图层的显存缓冲(每一层需要有一个buffer缓冲)
alphablend.src_alpha:bld中的源图层数据透明度(这里的源图层,是本layer)
layer.alphablend.dst_alpha:bld的设备图层数据透明度(这里的设备图层,是上一级的bld)
alphablend.src_alpha_op: alpha option,选择是否覆盖本图层的透明度还是src_alpha无效化
alphablend.dst_alpha_op :alpha option,选择是否覆盖上一级的bld的透明度还是dst_alpha无效化
background:本图层的背景色
alphablend.mode:bld模式。参考上图。
上面的图和计算方式可能有点难以理解,下面依次做几个实验来展示多图层的效果:
另外需要理解的是:RGB565和RGB888没有alpha通道,一些生成的取模软件,带透明度的图片都会把透明的部分变成黑色像素点。
(一)只有一个图层(320*240像素点)
该图层格式为RGB565。图层设置如下:
看到的效果如下:
可以看到背景为黑色,但由于第一级混合器并无上一级混合器,故代码中设计的backgroup无效。
如果需要指定的背景色,我们可以设置LCDC的CTRL寄存器的BGDCL4CLR的位域,混色的时候采用ctrl的背景色代替。
代码中初始化为白色背景。
效果就可以指定背景色了
(二)设置两层图层(RGB565+ARGB8888)
这里第一层图层格式为RGB565,第二层图层格式为ARGB8888,两层bld模式都设置为src_over,也就是图像叠加。
效果如下:
可以看到第二层是ARGB8888图层(有alpha通道),经过bld处理后,会叠加到第一层图层中,并且背景色取决于第一层的背景色。
(三)设置三层图层(RGB565+ARGB8888+ARGB8888)
这里第一层图层格式为RGB565,第二三层图层格式为ARGB8888,两层bld模式都设置为src_over,也就是图像叠加。
在这里,第一层背景色为蓝色,第二层为绿色,第三层为红色。由于第一二层属于BLD0,那么BLD0与第三层组合成BLD1,背景取决于上一级的dst,所以应该为绿色背景。
效果如下,现象与实际相符。三层叠加。
(四)设置四层图层
(RGB565+ARGB8888+ARGB8888+RGB565)
在前面讲到,如果把有透明度的图片转换成RGB565,那么带透明的就会被0取代,也就是黑色像素取代。这里的图片使用图中带眼镜的小伙子,第四层为RGB565,这时候由于上面的BLD再次叠加,最终的背景色会是第三层的背景色,也就是红色背景。
可以看到,左边的图片是第四层叠加的,由于转换成RGB565,损失了透明度通道。
有没有办法可以把黑色的像素点弄为透明度呢 ,先楫提供了PDMA图形加速,可以把源图层的格式转换成ARGB8888格式。但PDMA不在本文阐述范围,只说明可行性。
并且有对应的color key设置,可以把对应的无效像素点赋值低位即可.
可以参考pdma_blit这个API进行葫芦画瓢,不过需要注意的参数是:
那么来看下效果:可以看到,无效的黑色像素点已经变为透明度。
六、多个图层应用
这里采用作者之前做的DIY,使用三个图层,一层显示USB摄像头数据,一层显示DVP摄像头数据,一层显示SD卡中的视频数据。完整显示。
视频传送门: hpm6750 双摄像头+视频播放显示
七、总结
1、先楫的LCDC外设显示性能能满足理论性能,比如49.5M像素时钟理论帧率为129.22fps,验证帧率为125左右,性能保持一致。
2、先楫的LCDC外设支持8个图层,极大满足多图层应用需求。
推荐帖子