Edit online

竖屏横用、横屏竖用

ArtinChip 平台支持屏幕旋转,允许竖屏横用或横屏竖用,兼容单 buffer 和双 buffer 的应用程序。

display engine 并不提供旋转功能,旋转由显示驱动调用 graphics engine 实现。支持顺时针 0°/90°/180°/270° 旋转。

LCD 适配

无论是竖屏横用,还是横屏竖用,在适配 LCD 屏幕时,按照屏幕的真实宽高配置 display-timings 节点即可,不需要在屏端进行旋转。

LCD 屏幕适配可参考 Display 配置

device tree

屏幕旋转的 device tree 配置集中在 fb0 节点。以 720x1280 屏幕 竖屏横用 为例:
&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 撕裂。

注:
如果不设置 disp-buf-num 属性,显示 buffer 个数与 height-virtual 绑定。
  • height-virtual 不设置,height-virtual 缺省等于 height,显示 buffer 个数为 1

  • height-virtual 设置为 height 的两倍,使用双 framebuffer,显示 buffer 个数自动适配为 2

屏幕旋转

屏幕旋转的角度通过 menuconfig 进行配置,在 Luban-Lite 根目录下执行 scons --menuconfig,进入 menuconfig 的功能配置界面,按如下选择:
Board options  --->
    Graphics Support  --->
        Graphics support
            [*] Display Support
                framebuffer rotation degree (0)  --->

如果设置为 0 度,则不调用 graphics engine 进行旋转。

disp_conf 头文件
/**
 * 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 来说是透明的。

横屏竖用的原理类似。