概念

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数据读走显示。

工作流

1