竖屏横用、横屏竖用
ArtinChip 平台支持屏幕旋转,允许竖屏横用或横屏竖用,兼容单 buffer 和双 buffer 的应用程序。
display engine 并不提供旋转功能,旋转由显示驱动调用 graphics engine 实现。支持顺时针 0°/90°/180°/270° 旋转。
LCD 适配
无论是竖屏横用,还是横屏竖用,在适配 LCD 屏幕时,按照屏幕的真实宽高配置 display-timings 节点即可,不需要在屏端进行旋转。
LCD 屏幕适配可参考 Display 配置。
device tree
&fb0 { artinchip,uboot-logo-on=<1>; rotation-degress = <270>; height-virtual = <1440>; // 720 * 2 port { fb0_out: endpoint { remote-endpoint = <&de0_in>; }; }; };
Required properties:
-
rotation-degress
framebuffer 旋转角度,支持顺时针 0°/90°/180°/270° 旋转。
Optional properties:
-
height-virtual
framebuffer 的内存高度。在设置旋转角度后,表示绘制 buf 的内存高度。
-
disp-buf-num
显示 buffer 个数,可通过双 buffer 来避免 LCD 撕裂。
-
height-virtual 不设置,height-virtual 缺省等于 height,显示 buffer 个数为 1
-
height-virtual 设置为 height 的两倍,使用双 framebuffer,显示 buffer 个数自动适配为 2
屏幕旋转
scons --menuconfig
,进入
menuconfig 的功能配置界面,按如下选择:Board options ---> Graphics Support ---> Graphics support [*] Display Support framebuffer rotation degree (0) --->
如果设置为 0 度,则不调用 graphics engine 进行旋转。
/** * FB ROTATION options */ /* drawing buf for GUI, range [1, 2] */ #define AIC_FB_DRAW_BUF_NUM 2
disp_conf.h
头文件用于配置 GUI 使用的绘制 buf 个数。
绘制 buf 的含义可查看后续实现原理章节。这里推荐设置为 2,能满足应用程序在不同平台上的兼容性。
实现原理
屏幕旋转时,显示驱动管理着两种 buffer
-
上层 GUI 应用使用的绘制 buffer
-
display engine 使用的显示 buffer
+--------------------+ | | | 绘制 buf | | | +---------+----------+ | | | | | | |显示 buf | | | | | +---------+
这两块 buf 其实是一大块物理连续内存,对应 /dev/fb0,只是横屏和竖屏的 stride 不同,才会有不同的内存布局。
GUI 以横屏的方式在绘制 buf 中绘制好界面,然后下发 ioctl
FBIOPAN_DISPLAY
。
如果配置了屏幕旋转,显示驱动在接收到 FBIOPAN_DISPLAY
后,调用 graphics engine 将横屏界面旋转为竖屏,并把数据
bitblt 到显示 buf 中。
最后 display engine 将显示 buf 中的数据传送给 LCD 屏幕。
在编写 GUI 应用程序时要注意,通过标准接口获得的参数与屏幕的实际宽高是相反的。 GUI 获取到横屏的参数,认为外接了一块横屏才会以横屏的方式绘制界面。
此外,GUI 只能操作到绘制 buf ,显示 buf 对 GUI 来说是透明的。
横屏竖用的原理类似。