Edit online

屏幕旋转

4 Dec 2024
Read time: 2 minute(s)

ArtInChip 平台支持屏幕旋转,支持竖屏横用和横屏竖用,兼容单缓冲 和双缓冲的应用程序。

Display Engine 并不提供旋转功能,旋转是由显示驱动调用 Graphics Engine 实现的。支持顺时针旋转 0°/ 90°/ 180°/ 270°。

屏幕旋转功能配置流程如下所示:
  1. 适配 LCD 屏幕。

    无论是竖屏横用,还是横屏竖用,在适配 LCD 屏幕时,按照屏幕的物理宽高配置时序参数即可,不需要将时序参数中的宽高互换。

    显示驱动在旋转时会根据旋转角度自动互换宽高。LCD 屏幕适配可参考

  2. 进入 menuconfig 的功能配置界面,按如下选择,配置屏幕旋转的角度:
    Board options  --->
        Graphics Support  --->
            Graphics support
                [*] Display Support
                    framebuffer rotation degree (0)  --->

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

  3. disp_conf.h 头文件中,配置 GUI 使用的绘制 buf 个数。

    推荐设置为 2,能满足应用程序在不同平台上的兼容性。

    /**
     * FB ROTATION options
     */
    
    /* drawing buf for GUI, range [1, 2] */
    #define AIC_FB_DRAW_BUF_NUM 2
    提示:

    关于绘制 buf 的含义,可查看实现原理

实现原理

屏幕旋转时,显示驱动管理着两种 buffer:

  • 屏幕旋转时,显示驱动管理着两种 buffer:

    当屏幕处于竖屏横用状态时,GUI 应用会以横屏的方式在绘制 buf 中绘制界面,并将数据写入到绘制缓冲区中,然后调用 pan_display ioctl。

    如果配置了屏幕旋转,底层显示驱动在接收到 pan_display ioctl 后会调用 graphics engine,将横屏的界面旋转为竖屏,并把数据 bitblt 到显示 buf 中。

  • Display Engine 使用的显示 buffer,即底层显示引擎使用的缓冲区,用于将最终的图像数据传输到 LCD 屏幕上。

    Display Engine 将显示 buf 中的数据传送给 LCD 屏幕。显示缓冲区与绘制缓冲区在物理上是连续的内存块,但它们的布局会根据屏幕的旋转角度不同而有所变化。

以竖屏横用为例,底层的内存使用情况如下所示:
+--------------------+
|                    |
|      绘制 buf      |
|                    |
+---------+----------+
|         |
|         |
|         |
|显示 buf |
|         |
|         |
+---------+

这两块 buf 在底层是一大块物理连续内存,对应 framebuffer。只是横屏和竖屏的 stride 不同,才会有不同的内存布局。

提示:

当屏幕被配置为竖屏横用时,GUI 应用通过 ioctl 接口获取到的是横屏的参数。这意味着,如果屏幕的实际分辨率是 1080x1920(竖屏),通过 ioctl 接口获取到的宽高将是 1920x1080(横屏)。由于 GUI 应用以为此时外接了一块横屏,就会以横屏的方式绘制好界面。 在编写应用程序时要注意,通过 ioctl 接口获得的参数与屏幕的实际宽高是相反的。

此外,GUI 只能操作到绘制 buf ,显示 buf 对 GUI 来说是透明的。