导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    Debian 5.4 内核 H618/H616 高速 SPI 小屏幕实战,ST7789V 跑上 60FPS 折腾总结

    H/F/TV Series
    1
    1
    30
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • L
      leomini5 LV 6 最后由 编辑

      主要还是得靠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镜像给你

      1 条回复 最后回复 回复 引用 分享 0
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策