【FAQ】全志F133(D1s)芯片 如何在Tina下进行显示旋转?
https://bbs.aw-ol.com/topic/2600
想将t113-s3的屏幕旋转180度,搜了下,大都是这个帖子的内容。启动g2d功能,设备树里设置下旋转方向。
然后lvgl里手动调用某个函数。
5.旋转后framebuffer编程是需要注意,旋转后的buffer不会直接显示到屏幕上, 需要在应用刷屏的地方调用FBIOPAN_DISPLAY接口.同步旋转后的buffer到LCD上.
但是我想用的是qt,在qt程序中的什么位值调用这个函数呢?
最近编辑记录 Gentlepig (2024-01-18 17:12:21)
离线
如果想用纯软件旋转的话,qt5又该如何设置环境变量呢?搜了下,有说qt5不支持fb旋转。
我试了
QWS_DISPLAY=Transformed:Rot180
和
export QT_QPA_EVDEV_ROTATION=180
都没有效果。
离线
刚好前段时间踩坑了
1.QGraphicsScene旋转
需要应用全部修改支持
2.通过QT_QPA_PLATFORM旋转:
export QT_QPA_PLATFORM=$QT_QPA_PLATFORM:tty=/dev/console:rotation=90
注意是rotation
这个方式非常占cpu
3.修改qt fb的底层绘制函数
通过链接修改配置使能G2D
然后给QRegion QLinuxFbScreen::doRedraw()函数返回时添加刷新代码就够了
fb_var_screeninfo vinfo;
ioctl(mFbFd, FBIOGET_VSCREENINFO, &vinfo);
ioctl(mFbFd, FBIOPAN_DISPLAY, &vinfo);
路径在/sdk/platform/framework/qt/qt-everywhere-src-5.12.5/qtbase/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
有可能还需要其他修改,但是这是主要的
这个方式也解决了画面撕裂的问题
4.触摸旋转
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=$QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS:rotate=270
这个是rotate
最近编辑记录 wwwlll (2024-01-19 11:01:55)
离线
@wwwlll
感谢,我还看到个,按qt5.4的一个patch,修改qt的framebuffer插件的源码,使其支持旋转功能。
https://blog.csdn.net/qq_15725099/article/details/102717970
另,为什么方法2 cpu占用率高?
我试过方法2,没效果:
export QT_QPA_PLATFORM=linuxfb:rotation=180
-------------------------------------------------------------
仔细看了下,
qt源码打patch,这种,也是修改qtbase/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp这个文件,需要添加的内容稍多些,但是不用打开内核的g2d功能了。
那么现在可行的方案就两种:
1,内核打开g2d,修改qlinuxfbscreen.cpp,增加某个接口函数。
2,内核不动,修改qlinuxfbscreen.cpp,修改部分函数,增加旋转部分。
这两种都需要重新编译qt源码,头疼...
最近编辑记录 Gentlepig (2024-01-19 13:52:31)
离线
@Gentlepig
内核不动,直接修改qlinuxfbscreen.cpp和传递rotation感觉都是一样的,都是在这个文件的底层绘制函数上进行变换,所以非常占cpu
离线
触控这里,是使用原先非旋转情况下的坐标吗?
我现在g2d旋转成功了,qt5界面旋转了180度。想用ts_calibrate校准,结果显示不出界面来,这里估计也得修改tslib源码吧?
--------------------------------------------
#export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=$QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS:rotate=180
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=180
尝试了以上两句,都没效果,现在触控和画面是差180度的。
/etc/ts.conf 中加入module linear rot=2
也没效果。
最近编辑记录 Gentlepig (2024-01-20 13:29:32)
离线
目前是这么解决的:
在没打开g2d功能时,ts_calibrate -r 2,旋转tslib并校准,保留此时的校准文件。
然后烧录打开g2d的镜像,写入之前的这个校准文件。
离线
有的液晶屏支持修改上下翻转和左右翻转。
离线
board.dts 开启 g2d 旋转之后,怎么操作fb0都没用了。
离线
如果直接用 Qt5 自带的软旋转,画面撕裂太严重了,Qt5默认都不支持双缓冲,
得把 FBIOPAN_DISPLAY 添加到 qlinuxfbscreen.cpp 才行。
离线
大伙帮我喵喵,为啥这样修改之后,平移双缓冲不起作用呢? 现象是两个Qt界面不停切换
离线
全志科技T113 1920x1200 显示屏 qlinuxfbscreen.cpp 加了双缓冲,解决了撕裂的问题,
但是由于9M(1920*1200*4=9216000)的内存复制导致系统卡成了PPT
离线
确实啊,把fb0数据导出来,可以明显看到双缓冲切换的时候撕裂的画面
cat /dev/fb0 > /tmp/480x1600_bgra8888.bin
adb pull /tmp/480x1600_bgra8888.bin
离线
qfbscreen_p.h
class QFbScreen : public QObject, public QPlatformScreen
{
protected:
virtual QRegion doRedraw();
void initializeCompositor();
bool event(QEvent *event) override;
QFbWindow *windowForId(WId wid) const;
QList<QFbWindow *> mWindowStack;
QRegion mRepaintRegion;
bool mUpdatePending;
QFbCursor *mCursor;
QRect mGeometry;
int mDepth;
QImage::Format mFormat;
QSizeF mPhysicalSize;
QImage mScreenImage;
}
qlinuxfbscreen.cpp
class QLinuxFbScreen : public QFbScreen
{
}
追踪了半天代码,终于找到 QLinuxFbScreen 操作的那些变量的出处了。
离线
board.dts 开启 g2d 旋转之后,怎么操作fb0都没用了。
这个后面解决了不?
离线