如题,上周末应晕哥邀请解决下小问题。
启明云端的群有挺多群友需要这个东西。硬件平台是7寸 1024x600 的ssd202 开发板,自带一个点菜系统的demo
这里直接打包发送网盘:
链接: https://pan.baidu.com/s/117lyj1uTXC-Rt66Co07wLA
提取码:fkk5
释放后在配置好交叉编译器的条件下可以直接make出来,可执行文件是 demossd
上传在这儿
几个细节注意下:
1、注意下我的代码的Makefile 依赖 SSD20X的源代码的project文件夹,
结构是这样的:
├── LVGL7.10-SSD202
│ ├── export-ssd20x-gcc.sh
│ ├── gcc-arm-8.2-2018.08-x86_64-arm-linux-gnueabihf
│ ├── linux_frame_buffer
├── project
2、释放出来代码后阅读下Makefile 或者修改一下自己的结构让它可以调用到project 的目录。
3 、另外ssd20x 这个平台比较不一样, 使用fb之前要配置硬件信息,
我是无脑直接搬运来用,可以阅读一下 sstardisp.c, 我直接搬运ssd20x 开发板源码的 JpegPlayer
4、这个LVGL7.10 的lv_demo_music 被我改了些参数,下拉窗大小和原装的demo程序不一样。 我就不改回去了反正就是改着玩的。
5、注意修改双缓的缓冲区大小
要修改 /config/fbdev.ini 修改缓冲区到2倍的大小 4800x1024 (原来是4096, 不改会段错误)
FB_BUFFER_LEN = 4800
好了编译跑一下飞起来吧。
视频是跑printer demo 的效果
以下由 @哇酷小管家 从楼主百度网盘下载
------------------------------------
本站下载: LVGL7.10-linux_framebuffer-SSD202-TEVET-PACK-20210223.tar.7z (约65M)
最近编辑记录 TeveT (2021-02-23 23:48:29)
离线
不会有撕裂的,你可以用手机超级慢动作拍一下就知道了,
在大神的热心帮助下demo跑起来了,滑动的时候几乎没有撕裂感,比单缓冲好了几条街!
离线
嗯? 怎么理解呢,意思是,双缓冲下,在硬件disp控制器读帧过程中顿一下么, vsync机制是当前帧被使用的时候不会被填充么
光双缓冲,没有vsync处理,应该还是有小概率产生撕裂吧
离线
高手,学习了
TeveT 说:嗯? 怎么理解呢,意思是,双缓冲下,在硬件disp控制器读帧过程中顿一下么, vsync机制是当前帧被使用的时候不会被填充么
达克罗德 说:光双缓冲,没有vsync处理,应该还是有小概率产生撕裂吧
就怕切缓冲buff地址时候,如果发生在读帧过程中,一样会导致画面撕裂。感觉和硬件设计和驱动程序有关,也许某些SOC硬件可以保证直接切换地址不会导致问题。
不过我看许多SOC都还是明确要求在帧中断去切缓冲。
DRM的文档有关于这个双缓冲和VSync的说明:
https://github.com/dvdhrm/docs/blob/master/drm-howto/modeset-double-buffered.c
https://github.com/dvdhrm/docs/blob/master/drm-howto/modeset-vsync.cIf you run this example, you will notice that there is almost no flickering,
* anymore. The buffers are now swapped as a whole so each new frame shows
* always the whole new image. If you look carefully, you will notice that the
* modeset.c example showed many screen corruptions during redraw-cycles.
*
* However, this example is still not perfect. Imagine the display-controller is
* currently scanning out a new image and we call drmModeSetCrtc()
* simultaneously. It will then have the same effect as if we used a single
* buffer and we get some tearing. But, the chance that this happens is a lot
* less likely as with a single-buffer. This is because there is a long period
* between each frame called vertical-blank where the display-controller does
* not perform a scanout. If we swap the buffers in this period, we have the
* guarantee that there will be no tearing. See the modeset-vsync.c example if
* you want to know how you can guarantee that the swap takes place at a
* vertical-sync.根据这个理解,即使硬件支持任意切缓冲不会导致画面撕裂,也还是会有问题。当绘图刷新率不稳定的时候,有可能会导致掉帧现象。你可以想象在一帧的时间里,如果不在v-blank时间来切缓冲,有可能刚好错过当前这一帧的数据。所以PC游戏里一般有个选项,锁定帧刷新到显卡vsync
离线
哈哈哈哈,真的,搞这个需要开脑洞
不过怎么感觉你这个号是晕哥的马甲?
感谢楼主指导, 终于搞定,
这一步一定要做:
5、注意修改双缓的缓冲区大小
要修改 /config/fbdev.ini 修改缓冲区到2倍的大小 4800x1024 (原来是4096, 不改会段错误)FB_BUFFER_LEN = 4800
离线
感谢大佬分享,一步到位,
一体打包烧录固件:
ssd202-7inch-1024x600-spinand-20210302.7zu-boot 烧录指令:
setenv serverip 192.168.1.99;setenv ipaddr 192.168.1.33;nand erase 0x0 0x8000000;tftp 0x20000000 o/sysimage-nand.img;nand write 0x20000000 0x0 ${filesize};
官方烧录器烧录:
https://whycan.com/files/members/5985/2021-03-02_124657.png
离线
大佬另开个帖子呀,顶上去
在楼主的基础上增加rotation,开源了:
https://github.com/caszhao/ssd_lvgl
离线
详细请看 JpegPlayer ,代码包有的
楼主啊,如何显示外部的jpg图片啊?有没有Demo参考一下啊
离线
咋说,awtk 本地编译有包吗,我弄来看看
楼主很厉害啊,可以顺便搞一下AWTK的双缓冲吗
离线
好滴,感谢分享,搞搞看
TeveT 说:咋说,awtk 本地编译有包吗,我弄来看看
duanchangstar 说:楼主很厉害啊,可以顺便搞一下AWTK的双缓冲吗
离线
看来楼上的楼上大佬已经了解了fb的操作过程,改起来应当是大同小异哈,
duanchangstar 说:已经搞定了AWTK的双缓冲,使用了楼主的方法。感谢~
方便分享一下diff差异文件吗?
离线
都嘛系开源的东西,修改了抛上来共享下大大滴好,
如果有小毛病被鞭尸后还能共同进步,来嘛来嘛
cube 说:duanchangstar 说:已经搞定了AWTK的双缓冲,使用了楼主的方法。感谢~
方便分享一下diff差异文件吗?
按楼主的方法做就行了
最近编辑记录 TeveT (2021-05-30 12:51:20)
离线
有公开啊,但是没有全部公开。
比较暧昧吧,没有TRM
这个SSD20X有没有公开资料?
离线
注意下我帖子里描述的依赖路径project 还有lvgl 的Makefile
你的这个缺少的库在这个路径下面:
SDK_LIBS=../project/release/nvr/i2m/common/glibc/8.2.1/mi_libs/dynamic
我自己搞了个demo,提示缺少库文件 libmi_disp.so
离线
对的这个帖子就是拉lvgl fb 改的,加入了你说的初始化部分,只是填坑
lvgl_v8.zip
8.0的,lv_driver替换的时候注意不要把文件覆盖了。
其实lvgl的git上面有linux的移植,基于frame buffer。只要把ssd20x的特定初始化部分添加上就可以。
离线
@pencil
芜湖? 建议使用我网盘上传的试一下。
坛主上传的我不太清楚呢,毕竟下载要分数。
离线
放在服务器下编译,还是报很多错,我一时也搞不明白
注意project的目录,注意阅读一下Makefile
├── LVGL7.10-SSD202
│ ├── export-ssd20x-gcc.sh
│ ├── gcc-arm-8.2-2018.08-x86_64-arm-linux-gnueabihf
│ ├── linux_frame_buffer
├── project
离线
请问 我这边接入LVGL后 显示 一亮一灭 这个是怎么导致的?显示是有的。一般是哪部分引起的现象。https://whycan.com/files/members/1813/d61c12ed6a33ecb12217fcbc4a816478.mp4
5、注意修改双缓的缓冲区大小
要修改 /config/fbdev.ini 修改缓冲区到2倍的大小 4800x1024 (原来是4096, 不改会段错误)
FB_BUFFER_LEN = 4800
你的机器不是开发板的话,需要自己计算一下,修改一下
离线
@TeveT
您好 同缓存大小 我加到8192了,接入LVGL8单缓存是能正常使用的,接入这个7.10双缓的就是会闪屏,是因为在切换双缓存导致的吗?
我代码里是写了除以2后刚好是整屏幕大小, 你的这个buffer 如果没有另作他用,我的代码不修改的前提下, 你的buffer大小也要写成固定的你的屏幕的缓冲区的2倍才行的,不会算的话你可以报上来你的屏幕尺寸大小我给你个数值也行。
离线
@TeveT
您好 同缓存大小 我加到8192了,接入LVGL8单缓存是能正常使用的,接入这个7.10双缓的就是会闪屏,是因为在切换双缓存导致的吗?
计算很简单的
我之所以修改为 4800 是因为 1024x600x4x2/1024 = 4800
H x V x 单一像素字节数量 x 2(双缓冲) / 1024
离线
@pencil
交叉编译器是否有导出?
离线
@pencil
程序已经跑起来了,
你的屏幕初始化配置文件是否搞对了,分辨率,双缓大小是否能对上,
报错是没有触摸。
离线
@pencil
注意看下你的屏幕初始化和你的屏幕是否是对上的,开发板是CC0702I50R_1024x600.h这个头文件做的初始化序列和液晶屏显示参数传递。
你如果logo正常,那就把logo那边显示的参数拿出来,来修改这个h文件
可以看下sstardisp.c 这些相关信息。
离线
强啊,这个开发板有链接吗
有的,淘宝搜一下就有了,或者自己做一个。
离线
@future
大佬,你这个project要在这个makefile的上一个文件目录下存在。
这个project就是ssd202开发板的一个project的压缩包解压出来的文件夹。
离线
@future
屏幕还没点亮过么,logo能亮?屏幕参数头文件正确??
离线
@future
大佬,你的现象拍照片发来看看。
另外你这个初始化没问题的话,一般不会有颜色问题。
如果是双缓冲没有弄好的话,就是要改屏幕fb的配置文件,详细看看帖子。
如果是位宽引起的颜色问题的话,查看LCD接线方式是565还是888,同时改lv_conf 来匹配你的屏幕参数
默认程序用的是888, ARGB 32bit
离线
@future
残影问题,应该是屏幕初始化不对,偏压搞太高了,容易残影,久了会坏屏
如果前面你一直点这LOGO,没有显示其他东西,是静态的显示,也可能留下残影,如果有动态显示的画面,过一段时间会没掉,也就是,要搞个屏保图滚动
离线
@981378640
大佬,这个虽然可以用,但是还是硬加速的帧率高一些,体验好一些。你可以实测一下。
离线
大佬,我小白一枚,该如何无脑操作:(
按照帖子说明应该是很无脑了,
如果不行的话贴上出错的LOG,然后一起动动脑解决一下。
离线
4800那里已经改了,fbdev.c也改了,现在我的情况是不报错,但是画面抖动,不知道为啥,单缓冲的时候没事
请问下你的分辨率多大呢, 另外其他程序是否用到这块显示的保留内存?我的代码仅供参考, fb 的映射地址起点可以自己研究一下呀。
离线
@seannaaa
不好意思现在才看到,请问问题解决了吗?
你这个 问题是驱动双换冲 map 地址没有做对的问题,我里边是写死的,测个意思。 你可以自己改掉。
离线
我用8.2的版本 分辨率800*480 不会显示会花屏
1、屏显示头文件对不对,
2、注意双缓冲 偏移,
离线
@tangloong
要修改 /config/fbdev.ini 修改缓冲区到2倍的大小 4800x1024 (原来是4096, 不改会段错误)
看log 应该是这里。
离线
想问西 lgvl好用还是minigui好用还是qt
好点?
我验证过LVGL和QT
其他未验证。
分辨率高于720x720的场合,对显示效果要求较高的场合(比如全屏滑动,全屏翻页动画等)Qt 比较吃力。
若是LVGL,800x1280下也可以优化达到好效果。
离线
一般是双缓冲大小不对引起的。
需要调试可企鹅 415855548 V同号
离线