概念
FB(framebuffer):本质是一块内核管理的连续物理内存。显示驱动挂载时,向内核去申请(分配)一块连续物理内存,通常是**CMA(连续内存分配器)**区域。
将要显示到屏幕的数据写入到这个内存之后CPU就完全不参与搬运工作了。显示控制器(在RV1106中叫 VOP,在全志中叫 DE)内部有一个专门的DMA硬件模块,它会以固定的刷新率(如60Hz,即每秒60次)主动从这片物理内存地址中读取像素数据,并自动转换成MIPI/RGB信号发送给屏幕。
FB全程都是CPU在画画以及转换,GPU全程没有参与
把内核显存映射给用户态读写。
问题
-
画面撕裂(Tearing)
VOP读到一半,你还没来得及写完这一帧数据,VOP就把“半成品”画面(上半部分旧图,下半部分新图)读走了并显示出来。
FB方案对此没有任何保护机制,你必须自己用软件去防撕裂(比如双缓冲+等待VSYNC信号)。
-
YUV转RGB
YUV数据读到CPU,用CPU逐像素计算转换成RGB,再把RGB写进FB映射的内存里。CPU占用率极高。
RGA优化
- 摄像头生成YUV数据 -> 放在内存A
- 内存A的地址告诉RGA驱动,调用
librga的imcvtcolor命令:“帮我把YUV转成RGB,直接写到内存B(FB那片物理内存) - RGA硬件通过DMA直接把数据转换好写进FB内存,CPU全程不用碰像素数据。
- VOP(显示控制器)再从FB内存把RGB数据读走显示。
工作流
