您尚未登录。

楼主 # 2024-01-18 17:05:08

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,302
积分: 1262.5

d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

【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)

离线

楼主 #1 2024-01-18 17:43:27

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,302
积分: 1262.5

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

如果想用纯软件旋转的话,qt5又该如何设置环境变量呢?搜了下,有说qt5不支持fb旋转。

我试了
QWS_DISPLAY=Transformed:Rot180

export QT_QPA_EVDEV_ROTATION=180

都没有效果。

离线

#2 2024-01-19 10:58:04

wwwlll
会员
注册时间: 2023-12-15
已发帖子: 3
积分: 18

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

刚好前段时间踩坑了
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)

离线

楼主 #3 2024-01-19 11:53:23

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,302
积分: 1262.5

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

@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)

离线

#4 2024-01-19 17:52:50

wwwlll
会员
注册时间: 2023-12-15
已发帖子: 3
积分: 18

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

@Gentlepig
内核不动,直接修改qlinuxfbscreen.cpp和传递rotation感觉都是一样的,都是在这个文件的底层绘制函数上进行变换,所以非常占cpu

离线

楼主 #5 2024-01-20 11:07:44

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,302
积分: 1262.5

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

触控这里,是使用原先非旋转情况下的坐标吗?

我现在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)

离线

楼主 #6 2024-01-20 14:25:49

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,302
积分: 1262.5

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

目前是这么解决的:

在没打开g2d功能时,ts_calibrate -r 2,旋转tslib并校准,保留此时的校准文件。
然后烧录打开g2d的镜像,写入之前的这个校准文件。

离线

#7 2024-02-05 13:30:34

ktouch
会员
注册时间: 2023-11-27
已发帖子: 18
积分: 3

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

有的液晶屏支持修改上下翻转和左右翻转。

离线

#8 2024-02-05 14:01:17

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 567
积分: 692
个人网站

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

在framebuffer框架下应该难免要改Qt的内部渲染来实现。

如果支持wayland的话,在wayland框架下应该无需Qt源码就可以实现,将g2d放到合成器里就可以了。

离线

#9 2024-06-07 18:07:47

memory
会员
注册时间: 2021-08-11
已发帖子: 331
积分: 307

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

board.dts 开启 g2d 旋转之后,怎么操作fb0都没用了。

离线

#10 2024-06-21 11:16:27

memory
会员
注册时间: 2021-08-11
已发帖子: 331
积分: 307

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

如果直接用 Qt5 自带的软旋转,画面撕裂太严重了,Qt5默认都不支持双缓冲,

得把 FBIOPAN_DISPLAY 添加到 qlinuxfbscreen.cpp 才行。

离线

#11 2024-06-22 08:49:50

yixiuge
会员
注册时间: 2022-04-07
已发帖子: 55
积分: 65

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

996892A8DEFA67D120B89690DD4332F2.png


3FD63DD93D8A416953BC20491F0CE2F5.png

大伙帮我喵喵,为啥这样修改之后,平移双缓冲不起作用呢? 现象是两个Qt界面不停切换

离线

#12 2024-06-24 09:14:43

yixiuge
会员
注册时间: 2022-04-07
已发帖子: 55
积分: 65

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

2024-06-24_085134.png

全志科技T113 1920x1200 显示屏 qlinuxfbscreen.cpp 加了双缓冲,解决了撕裂的问题,

但是由于9M(1920*1200*4=9216000)的内存复制导致系统卡成了PPT

离线

#13 2024-06-24 18:13:22

memory
会员
注册时间: 2021-08-11
已发帖子: 331
积分: 307

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

QQ截图20240624181110.png

确实啊,把fb0数据导出来,可以明显看到双缓冲切换的时候撕裂的画面

cat /dev/fb0 > /tmp/480x1600_bgra8888.bin

adb pull /tmp/480x1600_bgra8888.bin

离线

#14 2024-06-25 21:09:05

memory
会员
注册时间: 2021-08-11
已发帖子: 331
积分: 307

Re: d1s/t113s如何旋转屏幕?尝试了g2d,但是需要手动调用接口,但是qt如何调用?

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 操作的那些变量的出处了。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn