屏幕旋转
3 Mar 2025
Read time: 1 minute(s)
LCD 适配
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>; }; }; };
如果不设置 disp-buf-num 属性,显示 buffer 个数与 height-virtual 绑定。
-
height-virtual 不设置,height-virtual 缺省等于 height,显示 buffer 个数为 1。
-
height-virtual 设置为 height 的两倍,使用双 framebuffer,显示 buffer 个数自动适配为 2。
注: 关于详细的参数描述,可查看Display FB0。
实现原理
-
GUI 以横屏的方式在绘制 buf 中绘制好界面,然后下发 ioctl FBIOPAN_DISPLAY。
如果配置了屏幕旋转,显示驱动在接收到 FBIOPAN_DISPLAY 后,调用 Graphics Engine 将横屏界面旋转为竖屏,并把数据 bitblt 到显示 buf 中。
这两块 buf 其实是一大块物理连续内存,对应 /dev/fb0,只是横屏和竖屏的 stride 不同,才会有不同的内存布局。横屏竖用的原理类似。
注:
在编写 GUI 应用程序时要注意,通过标准接口获得的参数与屏幕的实际宽高是相反的。 GUI 获取到横屏的参数,认为外接了一块横屏才会以横屏的方式绘制界面。
此外,GUI 只能操作到绘制 buf ,显示 buf 对 GUI 来说是透明的。