Debian 5.4 内核 H618/H616 高速 SPI 小屏幕实战,ST7789V 跑上 60FPS 折腾总结
-
主要还是得靠AI,我是第一次玩这东西,坑很多,但是吧最后都填平了,只不过ai被我撸爆了
Orangepi Zero 2W这个板子 H618芯片,板子上的pin接的一个spi屏幕
最终效果
<iframe src="//player.bilibili.com/player.html?isOutside=true&aid=116542847064811&bvid=BV11sRSBDErM&cid=38205524172&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>这种Linux板子本身输出是走hdmi的所以对这种spi小屏幕支持得特别不好
我刚开始走驱动的时候把lvgl接进去跑刷出来是0fps,从上往下一页一页刷,简直了这个不是CPU的锅,是驱动的问题,这驱动太老了,本声就是点个亮用的
所以光靠我肯定搞不定,我是撸ai,成功搞定的现在留个总结在这里,以后谁遇上了也有个参考
结果是可以跑到60fps,80mhz spi
简单总结一下原理
一次刷全屏数据,spi频率要拉满,然后需要单出一个线程专门处理dma刷过来的数据,简单点说就是开一次门以后就别关了,有数据就直接进来刷进去,驱动主要慢也就在这,每次刷数据都是找钥匙,开门,数据刷,再关门,神仙也快不起来下面是ai总结的,应该很全面了
一、硬件环境
Orange Pi Zero 2W
H618/H616
官方 Debian 5.4 内核
屏幕:
ST7789V
240x280 SPI LCD二、别直接上 Mainline / tinyDRM
反正我在armbain系统上没成功,即便成功了也没有我现在改的驱动快
Failed to setup spi
EINVAL
三、真正能跑流畅的关键:不是 LVGL,而是 SPI原因:
- syscall 开销
- SPI transfer 切碎
- 小块刷新太多
- DC 切换频繁
最后 CPU 都耗在 ioctl 上。
四、真正有效的路线:fb_st7789v + framebuffer
最终稳定能跑的几个关键参数:
spi-max-frequency = <80000000>;
fps = <60>;
txbuflen = <131072>;六、真正决定 FPS 的核心:改驱动,单独 DMA 刷新线程
这里其实才是整个项目最关键的部分。
一开始:
text fb_st7789v
虽然能显示。
但:
text LVGL 一动就掉帧 SPI write 阻塞 CPU 占用高 动画一卡一卡
后来发现:
text 问题根本不是 SPI 频率 而是刷新机制。
默认:
text fb_st7789v
很多刷新逻辑实际上是:
text 谁调用刷新 谁阻塞等待 SPI DMA 完成
这意味着:
text LVGL render SPI flush DMA wait
全部串行。
结果:
text CPU 大量时间卡在 SPI wait 上。
后来直接开始改驱动。
核心思路:
不让 LVGL 线程直接刷 SPI
而是:
text 单独创建 DMA 刷新线程
流程变成:
text LVGL ↓ 只提交 dirty buffer ↓ 放入刷新队列 ↓ 独立 DMA thread ↓ 后台 SPI DMA 刷新
这样:
text LVGL 渲染
和:
text SPI DMA 发送
彻底解耦。
改完以后最大的变化
原来:
text LVGL flush_cb
会卡住。
改完:
text flush_cb
基本只负责:
- 标记 dirty
- 提交 buffer
- 立即返回
真正 SPI DMA:
text 后台线程异步跑。
这个提升非常大。
为什么这个方法效果这么明显
因为 SPI LCD 真正慢的是:
text SPI transfer 时间
而不是:
text CPU 渲染
尤其:
text 240x280 RGB565
全屏:
text 240 × 280 × 2 ≈ 134KB
60FPS:
text 134KB × 60 ≈ 8MB/s
已经非常接近 SPI 极限。
所以:
text 减少阻塞 减少等待 DMA后台化
比:
text 单纯提高 SPI 频率
更重要。
后面进一步优化的方向
目前还准备继续:
1. DMA 双缓冲
也就是:
text ping-pong buffer
SPI 刷当前 buffer 的时候:
text LVGL 同时渲染下一帧
进一步减少等待。
2. partial refresh
目前已经:
text 只刷 dirty area
但后面准备:
text 合并区域 减少 transaction 次数
因为:
text SPI transaction 次数
很多时候比:
text SPI 频率
更影响 FPS。
3. 更激进 DMA
目前:
text fb_st7789v
本质上还是:
text Linux framebuffer
后面甚至考虑:
text 自己写 ultra-light SPI DMA framebuffer
直接绕过大量 framebuffer/fbtft 历史包袱。
最终结论
最后发现:
text 真正让 SPI 小屏跑流畅的 不是 LVGL 不是 tinyDRM 甚至不只是 SPI 频率
而是:
text 刷新架构。
尤其:
text DMA 异步线程化
提升非常明显。
需要驱动源码的给我私信吧,改了不少东西,可以直接把整个sd卡的img镜像给你
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号