场景选择
3 Mar 2025
Read time: 2 minute(s)
双绘制 buffer 和双显示 buffer
仅需要设置 rotation-degress (旋转角度)和 height-virtual (内存高度),且 height-virtual 必须为横屏高度的 2 倍。此时
GUI 会使用双 framebuffer 的方式绘制界面,显示 buf 个数自动适配为
2。
&fb0 { artinchip,uboot-logo-on=<1>; rotation-degress = <270>; height-virtual = <1440>; // 720 * 2 port { fb0_out: endpoint { remote-endpoint = <&de0_in>; }; }; };
单绘制 buffer 和双显示 buffer
由于只有 1 块绘制 buf,不需要设置 height-virtual ,但需要设置
disp-buf-num。
&fb0 { artinchip,uboot-logo-on=<1>; rotation-degress = <270>; disp-buf-num = <2>; port { fb0_out: endpoint { remote-endpoint = <&de0_in>; }; }; };
GUI 绘制完界面后,下放 ioctl FBIOPAN_DISPLAY,底层驱动会自动切换显示 buf,避免撕裂现象的发生。GUI 应用程序不需要关注显示 buf 的切换。
这种使用方式能避免 LCD 撕裂,并节省一块绘制
buf,但需要修改应用程序。
struct fb_var_screeninfo var = {0}; int zero = 0; if (ioctl(fbfd, FBIOGET_VSCREENINFO, &var) < 0) { printf("ioctl FBIOGET_VSCREENINFO fail\n"); return; } if (ioctl(fbfd, FBIOPAN_DISPLAY, &var) == 0) { if (ioctl(fbfd, FBIO_WAITFORVSYNC, &zero) < 0) { printf("ioctl FBIO_WAITFORVSYNC fail\n"); return; } } else { printf("pan display err\n"); }
单绘制 buffer 和单显示 buffer
&fb0 { artinchip,uboot-logo-on=<1>; rotation-degress = <270>; port { fb0_out: endpoint { remote-endpoint = <&de0_in>; }; }; };
注:
该场景只需要指定旋转角度。
GUI 在绘制 buf0 绘制完界面后,需要下发 ioctl FBIOPAN_DISPLAY 才可以触发屏幕旋转。
struct fb_var_screeninfo var = {0}; int zero = 0; if (ioctl(fbfd, FBIOGET_VSCREENINFO, &var) < 0) { printf("ioctl FBIOGET_VSCREENINFO fail\n"); return; } if (ioctl(fbfd, FBIOPAN_DISPLAY, &var) == 0) { if (ioctl(fbfd, FBIO_WAITFORVSYNC, &zero) < 0) { printf("ioctl FBIO_WAITFORVSYNC fail\n"); return; } } else { printf("pan display err\n"); }