屏幕旋转
ArtInChip 平台支持屏幕旋转,支持竖屏横用和横屏竖用,兼容单缓冲 和双缓冲的应用程序。
Display Engine 并不提供旋转功能,旋转是由显示驱动调用 Graphics Engine 实现的。支持顺时针旋转 0°/ 90°/ 180°/ 270°。
LCD 适配
无论是竖屏横用,还是横屏竖用,在适配 LCD 屏幕时,按照屏幕的物理宽高配置时序参数即可,不需要将时序参数中的宽高互换。
显示驱动在旋转时会根据旋转角度自动互换宽高。LCD 屏幕适配可参考。
device tree
&fb0 {
artinchip,uboot-logo-on=<1>;
rotation-degress = <270>;
height-virtual = <1440>; // 720 * 2
port {
fb0_out: endpoint {
remote-endpoint = <&de0_in>;
};
};
};
-
height-virtual 不设置,height-virtual 缺省等于 height,显示 buffer 个数为 1。
-
height-virtual 设置为 height 的两倍,使用双 framebuffer,显示 buffer 个数自动适配为 2。
实现原理
屏幕旋转时,显示驱动管理着两种 buffer:
-
上层 GUI 应用使用的绘制 buffer,用于存储绘制的图像数据。
GUI 以横屏的方式在绘制 buf 中绘制好界面,然后下发 ioctl FBIOPAN_DISPLAY。
如果配置了屏幕旋转,显示驱动在接收到 FBIOPAN_DISPLAY 后,调用 Graphics Engine 将横屏界面旋转为竖屏,并把数据 bitblt 到显示 buf 中。
-
Display Engine 使用的显示 buffer,即底层显示引擎使用的缓冲区,用于将最终的图像数据传输到 LCD 屏幕上。
Display Engine 将显示 buf 中的数据传送给 LCD 屏幕。显示缓冲区与绘制缓冲区在物理上是连续的内存块,但它们的布局会根据屏幕的旋转角度不同而有所变化。
+--------------------+
| |
| 绘制 buf |
| |
+---------+----------+
| |
| |
| |
|显示 buf |
| |
| |
+---------+
这两块 buf 其实是一大块物理连续内存,对应 /dev/fb0,只是横屏和竖屏的 stride 不同,才会有不同的内存布局。横屏竖用的原理类似。
在编写 GUI 应用程序时要注意,通过标准接口获得的参数与屏幕的实际宽高是相反的。 GUI 获取到横屏的参数,认为外接了一块横屏才会以横屏的方式绘制界面。
此外,GUI 只能操作到绘制 buf ,显示 buf 对 GUI 来说是透明的。