深入解析 RK 平台显示驱动:格式支持、处理流程与实现原理

电子说

1.4w人已加入

描述

 

 

在嵌入式领域,显示驱动是连接硬件与视觉体验的核心桥梁。瑞芯微(Rockchip)平台的显示驱动以其兼容性强、适配场景广著称,广泛应用于智能终端、物联网设备等领域。本文将从支持的显示格式、驱动处理流程、核心实现原理三个维度,带您深入了解 RK 平台显示驱动的工作机制。

显示驱动

一、RK 显示驱动支持的显示格式

 

RK 平台显示驱动对多种像素格式和总线格式提供了完善支持,覆盖从低带宽到高画质的各类场景,主要包括以下两类:

 

 

1. 像素格式(BPP

 

像素格式决定了每个像素的颜色深度,RK 驱动支持的主流格式如下:

 

 

16bppRGB565(每个像素占 字节,红 位、绿 位、蓝 位),适用于低功耗场景。

 

 

24bppRGB888(每个像素占 字节,红、绿、蓝各 位),提供基础高清色彩。

 

 

32bppARGB8888(每个像素占 字节,包含 位透明度通道),支持半透明叠加,常用于 UI 图层显示。

 

 

代码中通过display_logo函数明确区分了这三种格式的处理逻辑,例如:

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
switch (logo->bpp) {case 16:    crtc_state->format = ROCKCHIP_FMT_RGB565;    break;case 24:    crtc_state->format = ROCKCHIP_FMT_RGB888;    break;case 32:    crtc_state->format = ROCKCHIP_FMT_ARGB8888;    break;}

2. 媒体总线格式

 

总线格式定义了像素数据在硬件接口上的传输方式,RK 驱动通过rockchip_drm_get_cycles_per_pixel函数支持多种总线格式,核心包括:

 

 

单通道并行:如 RGB565_1X1616 位单通道)、RGB888_1X2424 位单通道)。

 

 

多通道并行:如 RGB888_3X8通道各 位)、RGB888_DUMMY_4X8通道含无效位)。

 

 

差分信号:支持 MIPI-DSILVDS 等高速接口的总线格式(通过rockchip_get_output_if_name函数可见对 MIPI0/1LVDS0/1 的支持)。

 

 

这些格式的适配确保了驱动能与 LCDHDMIeDP 等不同类型的显示设备通信。

 

 

二、显示驱动的核心处理流程

 

RK 显示驱动的工作流程可分为初始化显示输出两大阶段,每个阶段包含多个关键步骤,以下是详细解析:

 

 

阶段 1:驱动初始化(从设备启动到准备显示)

 

初始化阶段的目标是完成硬件资源配置、时序参数获取和显示链路准备,流程如下:

 

 

1.设备树(DTS)解析

 

 

驱动通过display_get_timing_from_dts函数从设备树中读取显示时序参数(如分辨率、刷新率、同步信号极性),例如:

 

 

水平参数:hactive(有效宽度)、hfront_porch(前廊)、hsync_len(同步长度)。

 

 

垂直参数:vactive(有效高度)、vback_porch(后廊)、vsync_len(同步长度)。

 

 

若设备树未定义,则使用默认时序(如 720p60)。

 

 

1.PHY 与连接器初始化

 

 

对于 HDMITVE 等接口,通过check_public_use_phy识别公共 PHY 类型(如 INNO_HDMI_PHY),并调用get_public_phy完成 PHY 初始化。

 

 

连接器(connector)通过rockchip_connector_pre_initrockchip_connector_init完成硬件引脚、信号极性配置。

 

 

1.显示模式验证与修正

 

 

display_mode_valid检查当前模式是否符合 CRTC(显示控制器)和连接器的硬件能力(如最大分辨率、帧率)。

 

 

display_mode_fixup对模式进行微调(如调整时序以匹配硬件限制)。

 

 

1.内存缓冲区分配

 

 

通过init_display_bufferget_display_buffer分配显示缓存(如帧缓冲区、LUT 查找表),确保内存地址对齐(align_size = PAGE_SIZE)。

 

 

阶段 2:显示输出(从图像加载到屏幕显示)

 

当初始化完成后,驱动进入显示输出阶段,核心流程如下:

 

 

1.图像加载与处理

 

 

加载 BMP 图像:通过load_bmp_logo读取图像文件,支持从资源分区加载,并缓存到logo_cache_list避免重复加载。

 

 

格式转换:若图像格式不直接支持(如低于 16bpp),则通过bmpdecoder转换为 16/32bpp

 

 

旋转处理:rockchip_logo_rotate支持 90°/180°/270° 旋转,通过内存拷贝重排像素数据。

 

 

1.平面(Plane)配置

 

 

display_set_plane配置 CRTC 的显示平面,包括:

 

 

源区域(src_rect):图像的显示范围(如部分缩放)。

 

 

目标区域(crtc_rect):屏幕上的显示位置(如居中、全屏)。

 

 

数据地址:帧缓冲区的物理地址(dma_addr)。

 

 

1.显示使能

 

 

display_enable触发 CRTC 和连接器的使能:

 

 

CRTC:通过crtc_funcs->enable启动时序发生器,输出同步信号。

 

 

连接器 / 面板:通过rockchip_connector_enable打开背光、初始化面板。

 

 

最终图像通过 MIPI/LVDS/HDMI 等接口传输到显示设备,完成显示。

 

 

三、显示驱动的实现原理:核心模块与交互

 

RK 显示驱动基于 DRMDirect Rendering Manager)框架设计,通过多个核心模块协同工作,关键模块如下:

 

 

1. 核心数据结构

 

display_state:全局状态结构体,包含 CRTC 状态(crtc_state)、连接器状态(conn_state)、图像信息(logo)等,是驱动流程的核心载体。

 

 

rockchip_crtcCRTC(显示控制器)结构体,封装了硬件寄存器操作函数(crtc_funcs),负责时序生成和数据传输。

 

 

rockchip_connector:连接器结构体,管理物理接口(如 HDMIMIPI),包含 EDID 读取、热插拔检测等功能。

 

 

rockchip_panel:面板驱动结构体,适配具体的 LCD/OLED 面板,提供初始化、时序配置接口。

 

 

2. 模块交互逻辑

 

CRTC 与连接器CRTC 生成的像素数据通过连接器传输到显示设备,display_state作为中间载体传递时序和格式信息。

 

 

PHY 与接口PHY(如 HDMI PHY)负责信号电平转换,连接器通过connector_phy_init绑定 PHY 驱动,确保高速信号传输质量。

 

 

内存管理:显示缓存通过get_display_buffer从预分配的内存池(MEMORY_POOL_SIZE)中分配,避免动态内存碎片。

 

 

3. 流程图:RK 显示驱动工作流程

 

显示驱动

四、总结

 

RK 平台显示驱动通过灵活的格式支持、模块化的流程设计和完善的硬件适配,实现了对多类型显示设备的高效驱动。其核心优势在于:

 

 

1.兼容性:支持 RGBMIPIHDMI 等多接口,覆盖从低功耗到高清场景。

 

 

2.可扩展性:通过设备树和模块化设计,便于适配新面板和硬件平台。

 

 

3.性能优化:通过缓存管理、时序优化确保图像显示流畅。

 

 

对于开发者而言,理解驱动的格式支持和流程设计,有助于快速定位显示问题(如分辨率异常、花屏),并根据需求定制显示功能(如多图层叠加、动态分辨率切换)。


审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分