从RK3568上接一块SPI小屏这件事,网上资料很零散,大多是拿fbtft改一改、能亮就算完。但真到产品化阶段,你会遇到一堆绕不开的问题:初始化时序不对导致花屏、片选策略影响命令发送、刷新帧率上不去、竖屏改横屏不知道改哪里。这篇文章把我自己在RK3568上从零驱动一块ST7789V SPI LCD的完整过程写出来,重点讲FrameBuffer模式下的驱动架构、设备树配置、刷新机制和实际调试中踩过的坑,给正在做类似事情的嵌入式驱动开发工程师一个可以直接参考的路径。
1. 为什么在RK3568上驱动SPI LCD要选择FrameBuffer模式
1.1 RK3568显示链路里没有SPI LCD的位置
RK3568的显示资源其实很丰富,VOP(Video Output Processor)后面挂了MIPI DSI、LVDS、RGB/eDP这些标准显示接口,系统正常显示链路走的是DRM/KMS框架。但你拿到的SPI小屏完全不属于这一套体系,它没有标准视频时序,没有pixel clock,也不需要HSYNC/VSYNC,它就是一个挂在SPI总线上的从设备,需要主机持续往它内部的GRAM里写像素数据。VOP根本不知道这种屏的存在,所以不能像处理RGB屏那样直接接上就完事。
这时候摆在面前的路有三条:一是用内核自带的fbtft框架,二是基于FrameBuffer自己写一个spi_driver,三是强行用DRM的panel-bridge去包一层虚拟显示接口。第三条路工作量最大,而且对DRM内部机制不熟的人很容易被绕晕,除非团队里有人专门搞过,否则不建议碰。
1.2 FrameBuffer模式与DRM/KMS方案的选择逻辑
很多新入行的驱动工程师一听说Linux显示就应该用DRM,看到FrameBuffer就觉得是老古董,这种判断在标准RGB/LVDS屏场景下是正确的,但放在SPI LCD上就不太合适。
我对比一下这两种思路以及fbtft方案的实际体验,用一个表格看更清楚:
| 方案 | 实现复杂度 | 可控性 | 适用场景 |
|---|---|---|---|
| 自写FrameBuffer驱动 | 中 | 高,所有刷新逻辑自己掌控 | 产品定制、低分辨率SPI屏、LVGL界面 |
| fbtft | 低,但调试成本高 | 低,很多行为被框架锁死 | 快速验证、个人DIY、不追求深度定制 |
| DRM panel-bridge | 高 | 中 | 团队有DRM基础,必须统一走DRM框架的场景 |
我自己最终选的是自写FrameBuffer驱动。原因很简单,fbtft在一定程度上绑定老内核的初始化路径和一些历史包袱,在RK3568这种比较新的内核上要打补丁,而且我想实现局部刷新、亮度调节、MADCTL旋转这些产品化功能,在fbtft上改远不如自己掌控来得直接。
FrameBuffer模式的核心思想是 :把显存看作一块普通内存,用户程序往/dev/fb0里写数据等同于往这块内存写像素,驱动后台用一个刷新机制把内存里的内容搬运到SPI LCD里。LCD显示的是一个静态画面,和VOP定时扫描是两回事。
1.3 这种模式能跑什么应用,不能跑什么应用
搞清楚定位才能选对方案。FrameBuffer模式的SPI LCD适合做这些事:
- 低分辨率人机界面,比如240x240、320x240的小屏
- 配合LVGL等GUI库显示菜单、仪表盘、状态信息
- 调试面板、参数显示、简单的串口屏替代品
不适合做这些事:
- 视频播放,刷新率上限受SPI总线带宽限制,一般到不了流畅视频的帧率
- 复杂动画场景,CPU往SPI上持续搬运数据会占用不少算力
- 需要GPU合成加速的界面,FrameBuffer模式绕开了VOP合成链路,GPU画的画面无法直接命中这块显存
所以做方案选型时,先算清楚这个产品要不要跑动效、视频,再决定是不是用SPI LCD。只是显示静态文字、温湿度、电压电流这类数据,SPI屏方案成本优势非常明显。
2. 先把SPI协议和RK3568 SPI控制器的脾气摸清
2.1 SPI四根线的语义与LCD只收不发的特点
不管接的是ST7789V、ILI9341还是ST7735S,SPI LCD的通信都围绕四根线展开:CLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。
这里可以类比成对讲机通话:主机按下CS按键表示“我要开始通话了”,CLK相当于节拍器,每打一个拍子双方约定传输一个bit,MOSI是主机说话的内容,MISO是从机回话的内容。LCD屏只需要接收命令和数据,绝大多数情况下不返回数据,所以MISO这根线可以不接,或者留着以后做屏幕ID读取用。
驱动开发中的 速率上限 由CLK频率决定。RK3568的SPI控制器支持的频率范围很宽,但并不是设备树里写多高就一定能跑多高,还要看PCB走线长度、杜邦线质量、屏幕本身的规格上限。SPI小屏驱动IC通常能跑到30MHz到60MHz,但实际产品里为了信号完整性,我一般控制在20MHz到40MHz之间。
2.2 时钟极性和相位配置错了,黑屏是最轻的后果
SPI协议有四种模式,由CPOL(时钟极性)和CPHA(时钟相位)组合而成。CPOL决定空闲时CLK是高还是低,CPHA决定数据是在时钟上升沿还是下降沿被采样。
大部分SPI TFT LCD驱动IC支持Mode 0(CPOL=0, CPHA=0)或Mode 3(CPOL=1, CPHA=1),具体看数据手册。配置错了最直观的表现就是整个屏幕无显示或者显示乱码,而且这种问题用眼睛看代码很难发现,必须用逻辑分析仪抓波形和手册里的时序图对照。
ST7789V这颗IC我在RK3568上用的是Mode 0,设备树里不需要显式写模式,驱动代码中通过spi_
251



被折叠的 条评论
为什么被折叠?



