Rockchip DRM Display Driver Development Guide
:::info 文档信息
发布版本:1.0 · 页数:28 · 语言:英文
原始文档:Rockchip_DRM_Display_Driver_Development_Guide_V1.0.pdf
:::
章节大纲
- 前言(P3)
- 目录(P4)
- 1 DRM概述(P6)
- 1.1 基本概念(P6)
- 1.2 DRM显示通路(P6)
- 1.3 DRM驱动和libdrm交互过程(P6)
- 2 DRM驱动(P7)
- 2.1 uboot驱动(P7)
- 2.1.1 驱动目录(P7)
- 2.1.2 驱动文件(P7)
- 2.1.3 接口说明(P7)
- 2.2 kernel驱动(P8)
- 2.2.1 驱动目录(P8)
- 2.2.2 驱动文件(P8)
- 2.2.3 内核驱动加载流程(P9)
- 2.1 uboot驱动(P7)
- 3 Display feature(P10)
- 3.1 各平台支持的显示接口及属性(P10)
- 3.2 最大输出分辨率和协议标准(P10)
- 3.2.1 RK3036平台(P10)
- 3.2.2 RK312X/PX3SE平台(P10)
- 3.2.3 RK322X/RK312XH平台(P10)
- 3.2.4 RK3288X平台(P10)
- 3.2.5 RK3308平台(P11)
- 3.2.6 RK322XH/RK332X平台(P11)
- 3.2.7 RK3326/px30平台(P11)
- 3.2.8 RK3368/PX5平台(P11)
- 3.2.9 RK3399平台(P11)
- 4 硬件相关(P11)
- 4.1 RGB输出/TTL模式硬件连接(P11)
- 4.1.1 RGB888 24BIT屏(P11)
- 4.1.2 RGB666 18 bit屏(P12)
- 4.1.3 RGB565 16 bit屏(P13)
- 4.1.4 MCU屏(P13)
- 4.2 LVDS Data Mapping(P15)
- 4.2.1 6 bit output mode(P15)
- 4.2.2 8 bit output mode(P15)
- 4.2.3 10 bit output mode(P16)
- 4.1 RGB输出/TTL模式硬件连接(P11)
- 5 扫描时序说明(P18)
- 5.1 常见的扫描时序图(P18)
- 5.2 DRM对扫描时序的定义(P19)
- 5.3 软件配置的对应关系(P19)
- 6 常用的debug手段(P19)
- 6.1 dump当前的显示状态(P19)
- 6.1.1 使用命令(P19)
- 6.1.2 参数说明(P20)
- 6.2 调整drm log等级抓log(P21)
- 6.3 查看当前的显示时钟(P21)
- 6.4 强行开关显示设备(P21)
- 6.5 查看drm buffer使用情况(P22)
- 6.6 查看gpio的状态(P22)
- 6.7 modetest使用(P22)
- 6.8 界面暂停、启动(P22)
- 6.9 查看EDID信息(P23)
- 6.10 查看HDMI的状态信息(P23)
- 6.11 Dump当前显示的buffer(P23)
- 6.11.1 使用说明(P23)
- 6.11.2 例子(P23)
- 6.1 dump当前的显示状态(P19)
- 7 FAQ(P23)
- 7.1 uboot logo切换到内核logo出现闪屏/无法显示问题(P23)
- 7.1.1 DDR变频导致(P23)
- 7.1.2 clk tree变化导致(P23)
- 7.1.3 时钟被关闭导致(P24)
- 7.1.4 uboot logo图片和kernel logo图片大小不一致(P24)
- 7.1.5 内核初始化过程一些电源/GPIO被重新初始化(P24)
- 7.1.6 VOP优先级配置问题(P24)
- 7.1.7 测试相关电源和信号(P24)
- 7.2 如何开关uboot logo显示(P24)
- 7.3 VOP POST_BUF_EMPTY(P25)
- 7.3.1 带宽不够(P25)
- 7.3.2 iommu出错(P25)
- 7.3.3 logic电压太低(P25)
- 7.3.4 AFBDC/IFBDC对齐要求(P25)
- 7.4 drm驱动bind(P25)
- 7.5 uboot logo要求(P26)
- 7.6 部分机器开机动画显示异常,桌面显示正常(P26)
- 7.7 显示效果调节(P27)
- 7.8 屏无法点亮/休眠唤醒显示异常/不显示问题(P27)
- 7.9 rk3308 显示特殊性(P27)
- 7.9.1 uboot显示(P27)
- 7.9.2 CMA_SIZE的修改(P27)
- 7.10 OLED屏余晖确认(P28)
- 7.11 各种接口屏配置(P28)
- 7.1 uboot logo切换到内核logo出现闪屏/无法显示问题(P23)
- 8参考文档(P28)
在线预览
若预览无法显示,请直接下载 PDF 后用本地阅读器打开。
DRM 概述
DRM 全称是Direct Rendering Manager,进行显示输出管理、buffer 分配、帧缓冲。对应userspace 库为libdrm,,libdrm 库提供了一系列友好的控制封装,使用户可以方便的进行显示的控制和buffer 申请。DRM的设备节点为"/dev/dri/cardX",X 为0-15 的数值,默认使用的是/dev/dri/card0。从linux 4.4 内核开始,Rockchip 显示驱动全部切到DRM 显示框架。
1.1
基本概念
CRTC:显示控制器,在rockchip 平台是SOC 内部VOP(部分文档也称为LCDC)模块的抽象;Plane:图层,在rockchip 平台是SOC 内部VOP(LCDC)模块win 图层的抽象;Encoder:输出转换器,指RGB、LVDS、DSI、eDP、HDMI、CVBS、VGA 等显示接口;Connector:连接器,指encoder 和panel 之间交互的接口部分;Bridge:桥接设备,一般用于注册encoder 后面另外再接的转换芯片,如DSI2HDMI 转换芯片。Panel:泛指屏,各种LCD、HDMI 等显示设备的抽象;GEM:buffer 管理和分配,类似android 下的ion。
1.2
DRM 显示通路
1.3
DRM 驱动和 libdrm 交互过程
第 1 页
DRM 驱动
2.1
uboot 驱动
2.1.1
驱动目录
2.1.2
drivers/video/drm/
驱动文件
| Driver | File |
|---|---|
| Core | rockchip display.c _ rockchip crtc.c _ rockchip connector.c _ rockchip phy.c _ rockchip panel.c _ |
| VOP | rockchip vop.c _ rockchip vop reg.c _ _ |
| eDP | rockchip analogix dp.c _ _ rockchip analogix dp reg.c _ _ _ |
| MIPI-DSI | rockchip mipi dsi.c _ _ rockchip-dw-mipi-dsi.c inno video phy.c _ _ |
| LVDS | rockchip lvds.c _ inno video phy.c _ _ |
| RGB | rockchip rgb.c _ inno video phy.c _ _ |
| HDMI | dw hdmi.c _ rockchip dw hdmi.c _ _ rockchip-inno-hdmi-phy.c |
| TVE/CVBS | rockchip drm tve.c _ _ |
| Panel | panel simple.c _ rockchip dsi panel.c _ _ |
2.1.3
接口说明
(1) void rockchip_show_logo(void)显示U-Boot logo 和kernel logo (2) void rockchip_show_bmp(const char *bmp)显示指定的bmp 图片,目前主要用于充电logo 的显示:(3) rockchip_display_fixup(void *blob)将U-Boot 中确定的一些变量通过dtb 文件传递给内核,包括kernel logo 的大小、地址、格式、输出扫描时序以及过扫描的配置等信息。
第 2 页
2.2
kernel 驱动
2.2.1
驱动目录
drivers/gpu/drm/rockchip/ drivers/gpu/drm/bridge/analogix/ drivers/gpu/drm/bridge/synopsys/
2.2.2
drivers/phy/rockchip/
驱动文件
| Driver | File | Doc |
|---|---|---|
| Core | rockchip drm drv.c _ _ rockchip drm fb.c _ _ rockchip drm fbdev.c _ _ | rockchip-drm.txt |
| VOP | rockchip drm vop.c _ _ rockchip vop reg.c _ _ | rockchip-vop.txt |
| LVDS | rockchip lvds.c _ phy-rockchip-inno-video-phy.c | rockchip-lvds.txt |
| MIPI-DSI | dw-mipi-dsi.c phy-rockchip-inno-video-phy.c | dw mipi dsi rockchip.txt _ _ _ phy-rockchip-inno-video-combo-phy .txt |
| eDP | analogix dp-rockchip.c _ analogix dp core.c _ _ analogix dp reg.c _ _ phy-rockchip-dp.c | analogix dp-rockchip.txt _ analogix dp.txt _ rockchip-dp-phy.txt |
| HDMI | inno hdmi.c _ dw-hdmi.c dw hdmi-rockchip.c _ dw-hdmi-hdcp.c dw-hdmi-cec.c dw-hdmi-i2s-audio.c phy-rockchip-inno-hdmi-phy.c | inno hdmi-rockchip.txt _ dw hdmi-rockchip.txt _ phy-rockchip-inno-hdmi-phy.txt |
| TVE/CVBS | rockchip drm tve.c _ _ | rockchip drm tve.txt _ _ |
| Panel | panel-simple.c | simple-panel.txt |
第 3 页
2.2.3
内核驱动加载流程
第 4 页
Display feature
3.1
各平台支持的显示接口及属性
3.2
最大输出分辨率和协议标准
3.2.1
RK3036 平台
| 显示接口 | 最大输出 | 协议标准 |
|---|---|---|
| HDMI | 1920x1080@60hz | 支持HDMI 1.4a 协议标准 |
| CVBS | 720x480i@60hz/720x576@50hz | 支持NTSC/PAL 标准输出 |
3.2.2
RK312X/PX3SE 平台
| 显示接口 | 最大输出 | 协议标准 |
|---|---|---|
| RGB | 1280x800@60hz | 支持RGB666/sRGB888 |
| LVDS | 1280x800@60hz | 支持VESA 和JEIDA LVDS 数据格式 |
| MIPI | 1280x800@60hz | 支持DSI v1.0,DCS v1.0,DPHY v1.0 协议标准 |
| HDMI | 1920x1080@60hz | 支持HDMI 1.4a 协议标准 |
3.2.3
RK322X/RK312XH 平台
| 显示接口 | 最大输出 | 协议标准 |
|---|---|---|
| HDMI | 4096x2160@60hz | 支持HDMI 1.4a 和2.0 协议标准 |
| CVBS | 720x480i@60hz/720x576@50hz | 支持NTSC/PAL 标准输出 |
3.2.4
RK3288X 平台
| 显示接口 | 最大输出 | 协议标准 |
|---|---|---|
| RGB | 1920X1080@60hz | 支持RGB888/RGB666/sRGB888 |
| LVDS | 单通道:1280x800@60hz 双通道:1920x1080@60hz | 支持VESA 和JEIDA LVDS 数据格式 |
| eDP | 2560x1600@60hz | 支持DP1.2a 和eDP1.3 协议标准 |
| MIPI | 单通道:1920x1080@60hz 双通道:2560x1600@60hz | 支持DSI v1.1,DCS v1.1,DPHY v1.1 协议标准 |
第 5 页HDMI VOP BIG::3840x2160@60hz支持HDMI 1.4a 和2.0 协议标准
3.2.5
RK3308 平台
VOP LIT: 1920x1080@60hz
| 显示接口 | 最大输出 | 协议标准 |
|---|---|---|
| RGB | 1280x800@60hz | 支持RGB888/RGB666/sRGB888/MCU |
3.2.6
RK322XH/RK332X 平台
| 显示接口 | 最大输出 | 协议标准 |
|---|---|---|
| HDMI | 4096x2160@60hz | 支持HDMI 1.4a 和2.0 协议标准 |
| CVBS | 720x480i@60hz/720x576@50hz | 支持NTSC/PAL 标准输出 |
3.2.7
RK3326/px30 平台
| 显示接口 | 最大输出 | 协议标准 |
|---|---|---|
| RGB | 1280x800@60hz | 支持RGB888/RGB666/sRGB888/MCU |
| LVDS | 1280x800@60hz | 支持VESA 和JEIDA LVDS 数据格式 |
| MIPI | 1920x1080@60hz | 支持DSI v1.0,DCS v1.0,DPHY v1.0 协议标准 |
3.2.8
RK3368/PX5 平台
| 显示接口 | 最大输出 | 协议标准 |
|---|---|---|
| RGB | 1920X1080@60hz | 支持RGB888/RGB666/sRGB888 |
| LVDS | 1280x800@60hz | 支持VESA 和JEIDA LVDS 数据格式 |
| eDP | 2560x1600@60hz | 支持DP1.2a 和eDP1.3 协议标准 |
| MIPI | 1920x1080@60hz | 支持DSI v1.0,DCS v1.0, DPHY v1.0 协议标准 |
| HDMI | VOP BIG::4096X2160@60hz | 支持HDMI 1.4a 和2.0 协议标准 |
3.2.9
RK3399 平台
| 显示接口 | 最大输出 | 协议标准 |
|---|---|---|
| eDP | VOP BIG: 3840x2160@60hz VOP LITE: 2560x1600@60hz | 支持DP1.2a 和eDP1.3 协议标准 |
| MIPI | 单通道:1920x1080@60hz 双通道:2560x1600@60hz | 支持DSI v1.1,DCS v1.1,DPHY v1.1 协议标准准 |
| HDMI | VOP BIG::4096X2160@60hz VOP LITE: 2560x1600@60hz | 支持HDMI 1.4a 和2.0a 协议标准 |
| DP | VOP BIG::4096X2160@60hz VOP LITE: 2560x1600@60hz | 支持DP 1.2 协议标准 |
硬件相关
4.1
RGB 输出/TTL 模式硬件连接
4.1.1
RGB888 24BIT 屏
硬件可以参考下面表格 screen_face 为 OUT_P888 的连接,软件在 RGB 节点配置:bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
第 6 页传输时序:
4.1.2
RGB666 18 bit 屏
硬件有两种连接方式: (1). 硬件按下面表格 screen_face 为 OUT_D888_P666 的方式连接,软件在 RGB 节点配置:
bus-format = <MEDIA_BUS_FMT_RGB666_1X24_CPADHI>;
(2). 硬件按下面表格 screen_face 为 OUT_P666 的方式连接,软件在 RGB 节点配置:bus-format = <MEDIA_BUS_FMT_RGB666_1X18>;传输时序:
第 7 页
4.1.3
RGB565 16 bit 屏
按下面表格 screen_face 为 OUT_D888_P565 的方式连接,软件在 RGB 节点配置:bus-format = <MEDIA_BUS_FMT_RGB565_1X16>;传输时序:
4.1.4
MCU 屏
硬件连接可以参考上面(1),(2),(3)的连接方式,MCU 比较特殊的是 RGB 模式下的DCLK/VSYNC/HSYNC/DEN 在 MCU 模式下对应 RS/CS/WEN/REN 引脚;
第 8 页
| Display mode | RGB RGB RGB RGB RGB ITU656 ITU656 ITU656 MCU mode Paralle Parallel Parallel Parallel Parallel Mode0 Mode1 Mode2 l 24-bit 18-bit 18-bit 16-bit 16-bit |
|---|---|
| Screen _ face | OUT P OUT D88 OUT P66 OUT D88 OUT P56 OUT S8 OUT S88 OUT S888 OUT P888 _ _ _ _ _ _ _ _ _ 888 8 P666 6 8 P565 5 88/OUT 8/OUT S8 /OUT S88 _ _ _ _ S888D 88DUMY 8DUMY _ UMY |
| DCLK VSYNC HSYNC DEN | DCLK DCLK DCLK DCLK DCLK DCLK DCLK DCLK RS VSYNC VSYNC VSYNC VSYNC VSYNC CS HSYNC HSYNC HSYNC HSYNC HSYNC WEN DEN DEN DEN DEN DEN REN |
| DATA | DATA[2 DATA[23:1 DATA[17:0 DATA[23:1 DATA[15:0 DATA[7:0 DATA[15:8 DATA[14:7] 3:0] 8] ] 9] ] ] ] DATA[15:1 DATA[15:1 0] 0] DATA[7:2] DATA[7: 3] |
| D23 | R7 R5 - R4 - - - - D23 |
| D22 | R6 R4 - R3 - - - - D22 |
| D21 | R5 R3 - R2 - - - - D21 |
| D20 | R4 R2 - R1 - - - - D20 |
| D19 | R3 R1 - R0 - - - - D19 |
| D18 | R2 R0 - - - - - - D18 |
| D17 | R1 - R5 - - - - - D17 |
| D16 | R0 - R4 - - - - - D16 |
| D15 | G7 G5 R3 G5 R4 - D7 - D15 |
| D14 | G6 G4 R2 G4 R3 - D6 D7 D14 |
| D13 | G5 G3 R1 G3 R2 - D5 D6 D13 |
| D12 | G4 G2 R0 G2 R1 - D4 D5 D12 |
| D11 | G3 G1 G5 G1 R0 - D3 D4 D11 |
| D10 | G2 G0 G4 G0 G5 - D2 D3 D10 |
| D9 | G1 - G3 - G4 - D1 D2 D9 |
| D8 | G0 - G2 - G3 - D0 D1 D8 |
| D7 | B7 B5 G1 B4 G2 D7 - D0 D7 |
| D6 | B6 B4 G0 B3 G1 D6 - - D6 |
| D5 | B5 B3 B5 B2 G0 D5 - - D5 |
| D4 | B4 B2 B4 B1 B4 D4 - - D4 |
| D3 | B3 B1 B3 B0 B3 D3 - - D3 |
| D2 | B2 B0 B2 - B2 D2 - - D2 |
| D1 | B1 - B1 - B1 D1 - - D1 |
| D0 | B0 - B0 - B0 D0 - - D0 |
第 9 页
4.2
LVDS Data Mapping
可以通过dts 文件LVDS 节点下的rockchip,data-mapping 属性和rockchip,data-width 属性来配置
4.2.1
6 bit output mode
哪种模式输出。
采用 4+1 的传输模式,即 4 组数据信号加一组时钟信号,最后一组数据信号传输无效数据。JEIDA_6BIT:
bus-format = <MEDIA_BUS_FMT_RGB666_1X7X3_SPWG>;
4.2.2
8 bit output mode
采用 4+1 的传输模式,即 4 组数据信号加一组时钟信号。VESA_8BIT:
bus-format = <MEDIA_BUS_FMT_RGB888_1X7X4_SPWG>;
JEIDA_8BIT:
bus-format = <MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA>;
第 10 页
4.2.3
10 bit output mode
采用 5+1 的传输模式,即 5 组数据信号加一组时钟信号。目前 DRM 驱动尚未加入该支持。
第 11 页第 12 页
扫描时序说明
5.1
常见的扫描时序图
第 13 页
5.2
DRM 对扫描时序的定义
5.3
软件配置的对应关系
常用的 debug 手段
6.1
dump 当前的显示状态
6.1.1
使用命令
cat /sys/kernel/debug/dri/0/summary
第 14 页
6.1.2
参数说明
(1) 两个红色方框表示两个显示设备使用的 vop 分别是 ff900000.vop 和 ff8f0000.vop;(2) 绿色部分表示 connector 信息,两个显示设备分别为 eDP 屏和 MIPI 屏;(3) 粉色部分为显示模式,可以知道具体的时序、DCLK 以及帧率,上图中两个设备分别为分辨率为1536x2048p60 的 eDP 屏和分辨率 1280x720p29 的 MIPI 屏;(4) 蓝色部分是 VOP 图层信息,第一个显示设备打开 win0 图层,大小为 1536x2048 格式为 XRGB第二个显示设备打开 win0 图层,大小 1280x720 格式为 XRGB, src 和 dst 表示源数据和显示的大小和位置,如下图所示:
第 15 页(5) 橙色部分为 VOP HDR、CSC 的一些状态信息;
6.2
调整drm log 等级抓 log
debug:Enable debug output, where each bit enables a debug category. Bit 0 (0x01) will enable CORE messages (drm core code) Bit 1 (0x02) will enable DRIVER messages (drm controller code) Bit 2 (0x04) will enable KMS messages (modesetting code) Bit 3 (0x08) will enable PRIME messages (prime code) Bit 4 (0x10) will enable ATOMIC messages (atomic code) Bit 5 (0x20) will enable VBL messages (vblank code) (int)示例: echo 0x0c > /sys/module/drm/parameters/debug 打开了 KMS, PRIME 这些的打印, kernel驱动中使用 DRM_DEBUG_KMS 和 DRM_DEBUG_PRIME 打印的信息都可以打印出来。
6.3
查看当前的显示时钟
有时候需要知道 VOP dclk 和 aclk 的值,以及 pll 源,可以通过下面的命令获取:
cat /sys/kernel/debug/clk/clk_summary
如果只要关注 vop 的时钟,可以使用:
cat /sys/kernel/debug/clk/clk_summary | grep vop
6.4
强行开关显示设备
以 LVDS 为例:关 LVDS: echo off > /sys/class/drm/card0-LVDS-1/status开 LVDS: echo on > /sys/class/drm/card0-LVDS-1/status第 16 页
6.5
查看drm buffer 使用情况
cat /sys/kernel/debug/dri/0/mm_dump,可以知道当前 drm 这边 buffer 的使用情况。
6.6
查看gpio 的状态
cat /sys/kernel/debug/gpio,通过这个命令可以知道当前一些 GPIO 的状态,确认和屏相关的 GPIO是否有被正常设置。
6.7
modetest 使用
6.8
界面暂停、启动
暂停进程(只能短暂暂停,一段时间后会自动恢复) kill -STOP `pgrep surfaceflinger`恢复进程kill -CONT `pgrep surfaceflinger`
第 17 页
6.9
查看EDID 信息
以 HDMI 为例:cat /sys/class/drm/card0-HDMI-A-1/edid > /data/edid.bin
6.10
查看HDMI 的状态信息
cat /sys/kernel/debug/dw-hdmi/status
6.11
Dump 当前显示的buffer
6.11.1
使用说明
6.11.2
例子
(1) dump 一帧当前显示的 buffer:
echo dump > /sys/kernel/debug/dri/0/ff900000.vop/vop_dump/dump
(2) 连续 dump n 帧显示的 buffer
FAQ
echo dumpn > /sys/kernel/debug/dri/0/ff900000.vop/vop_dump/dump
(3) dump 出来的文件保存在/data/vop_buf/,可以使用 7yuv 软件查看。
7.1
uboot logo 切换到内核 logo 出现闪屏/无法显示问题
7.1.1
DDR 变频导致
DDR 变频导致,可以做如下修改尝试:(1) 关闭 dts 文件中 ddr 变频节点,保证内核阶段不做 DDR 变频,修改方法如下:
&dmc {
status = “disabled”;}; (2) 关闭 DDR 变频时对 DCLK 的调整,修改方法如下:
&dmc {
vop-dclk-mode = <1>;
7.1.2
clk tree 变化导致
};
部分平台 uboot 中的 clk tree 配置和内核的 clk tree 配置是独立的,如果两个驱动的 clk 策略不一致,第 18 页就会出现在 clk 重新初始化的时候出现闪屏问题,以 RK3399 为例,可以按如下方法确认:(1) 在 rk3399_clk_init()@kernel/drivers/clk/rockchip/clk-rk3399.c 函数入口处加上 while(1);确认是否会有闪屏问题;(2) 在 rk3399_clk_init()@kernel/drivers/clk/rockchip/clk-rk3399.c 函数结束处加上 while(1),确认是否会有闪屏问题;(3) 如果步骤 a 中无闪屏现象步骤 b 中有闪屏现象,那基本可以确认是 clk tree 变化导致闪屏问题,可
7.1.3
以直接找对应平台 cru 负责人或者提交 remdine 并说明转给 pll 相关负责人。
时钟被关闭导致
有一些流程上的问题或者软件上的 bug 可能存在一些必要的时钟在驱动注册的时候没有被使能,导致这些时钟在内核跑完后被框架自动关闭从而导致显示异常,可以尝试按下面的修改默认不关闭时钟做测试:在 dts 文件中,找到 chosen 节点,在 bootargs 末尾加上 clk_ignore_unused:如 bootargs = "xxxx clk_ignore_unused”;
7.1.4
uboot logo 图片和kernel logo 图片大小不一致
rockchip 平台有要求 uboot logo 和 kernel logo 的图片分辨率大小一样,如果出现 uboot logo 显示正常,到内核阶段显示异常,可以确认下 kernel 目录下 logo.bmp 和 logo_kernel.bmp 分辨率是否一致;
7.1.5
内核初始化过程一些电源/GPIO 被重新初始化
该问题涉及的可能性很多,总之在新项目 porting 过程中要及时确认显示相关的 GPIO 电源是否和其他模块有冲突;如果 dts 确认无误,可以在内核代码搜索串口中的关键字,通过二分法在各个模块加载的位置 while 住,
7.1.6
VOP 优先级配置问题
逐步确认导致闪屏问题;
如果 VOP 优先级没有被配置最高,有可能在内核加载阶段被其他 IP 抢占总线导致闪屏问题,该问题一
7.1.7
般会在 SDK 发布前 Fix。
测试相关电源和信号
如果以上还未找到闪屏问题,请使用示波器抓取 clk、data 和电源等相关信号从 uboot 到内核阶段的波形图并提交 redmine。
7.2
如何开关uboot logo 显示
以 eDP 为例,可以在 dts 文件里找到 route_edp 节点,配置 status 状态:
第 19 页如果 uboot logo 关闭,需要等到安卓起来后屏才会正常显示;
7.3
VOP POST_BUF_EMPTY
7.3.1
带宽不够
如果系统带宽不够会导致 VOP 不能及时取到数据,从而报 post empty,可以做如下尝试:(1) 尝试将 ddr 固定最高频率;
7.3.2
iommu 出错
(2) 将屏的消隐期加长,提高一行的取数时间;
确认是否如下图所示的 iommu pagefault 错误,如果有,请先尝试更新到最新代码测试,如果最新代码还存在该问题,请提交 remine 系统,并附上相关 log;
7.3.3
logic 电压太低
7.3.4
AFBDC/IFBDC 对齐要求
logic 电压太低会导致 VOP 异常,可以尝试提高 100mv 测试;
对于 px30/rk3326、rk3368、rk3399 平台如果屏的分辨率非 16pixel 对齐可以尝试关闭 afbdc/ifbdc功能,修改方法参考文档《FAQ-DRM-HWC》 1.3.1 章节。
7.4
drm 驱动 bind
如果看到下面 log 红色部分说明 drm 驱动已经正常加载成功:
第 20 页在驱动加载过程中,可能会出现一些显示设备加载失败,那可能是因为显示驱动依赖的一些资源没准备好导致,如果最后能看到上面的 log 我们就认为 drm 驱动已经正常加载。如果一直出现 drm 驱动加载失败 log,产品上比较可能出现的是 GPIO 口被其他设备先注册或者 panel的 compatible 未正确配置导致 panel 注册失败。
7.5
uboot logo 要求
(1) uboot logo 和内核 logo 的大小一直;(2) 支持 8bit rle8 压缩的 bmp 图片(生成方式:convert -compress rle -colors 256 logo_old.bmp logo_new.bmp)和 24bit 非压缩的 bmp 图片;
7.6
部分机器开机动画显示异常,桌面显示正常
(1) 异常 logo verified-boot 对固件校验时发现校验失败才会重新调用屏端的接口,对应的 log 为:init: Starting service 'exec 1 (/sbin/slideshow)'. (2) 原因system 校验失败,可能是 system 分区太小导致结尾校验 hash 信息丢失或者烧写工具,会导致如下调用关系:draw()@system/extras/slideshow/slideshow.cpp ->drm_flip()bootable/recovery/minui/graphics_drm.cpp ->drmModePageFlip()导致在一些屏上显示黑屏(3) 处理方法可以通过关闭这个加密临时处理,真正解决需要确认烧写工具的版本,具体关闭方法如下:a/fstab.rk30board.bootmode.forceencrypt.emmc b/fstab.rk30board.bootmode.forceencrypt.emmc -/dev/block/platform/fe330000.sdhci/by-name/system /system ext4 ro,noatime,nodiratime,noauto_da_alloc wait,resize,verify=/dev/block/platform/fe330000.sdhci/by-name/verity_mode
+/dev/block/platform/fe330000.sdhci/by-name/system /system ext4 ro,noatime,nodiratime,noauto_da_alloc wait,resize # use this line below instead to enable verity
第 21 页
7.7
显示效果调节
RK 平台支持亮度,对比度,饱和度的调节,从 linux 4.4 开始我们默认使用 BCSH 模块来调节效果,可以使用下面命令调节,默认值为 50:
| setprop | persist.sys.brightness.main | 50;setprop | persist.sys.contrast.main | 50;setprop | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| persist.sys.hue.main | 50;setprop | persist.sys.saturation.main | 50; | ||||||||
| setprop | sys.display.timeline | N | -->N | 的值每次调节加 | 1 |
7.8
屏无法点亮/休眠唤醒显示异常/不显示问题
按以下几个方面做进一步确认:(1) 确认是否有背光;(2) 确认屏的相关电源及复位控制是否正常;(3) 确认上下电时序是否满足屏的 spec 要求;
7.9
rk3308 显示特殊性
7.9.1
uboot 显示
RK3308 默认关闭 uboot 显示,如果要打开 uboot 显示需要参考如下配置 uboot 中的 defconfig
7.9.2
CMA_SIZE 的修改
RK3308 VOP 不支持IOMMU,所以分配内存需要从预留的cma buffer 分配,默认CMA_SIZE 为16M,如果出现分配内存失败,可以参考如下方法修改 CMA_SIZE:第 22 页
7.10
OLED 屏余晖确认
传统的 LCD 屏是 16ms 全余晖,而 OLED 一大优势就是低余晖,这可以给 VR 产品带来更舒适的体验。一般 OLED 屏可以调整余晖值,在没有高速 DV 的情况下可以使用 iphone 手机的慢动作模式拍摄屏幕,根据亮度区间和全屏幕的比例关系初步估算出余晖时间,如下面这张图,如果屏按 60fps 扫描,刷一帧需要的时间是 16.6ms,这个时候亮部区域差不多占全屏区域一半,这样可以估算余晖时间大概为 8ms 左右。
7.11
各种接口屏配置
8 参考文档
请参考文档《Rockchip_DRM_Panel_Porting_Guide》。
(1) Rockchip_drm_integration_helper-zh.pdf (2) Rockchip_DRM_Panel_Porting_Guide.pdf (3) Rockchip rk fb development guide.pdf (4) https://en.wikipedia.org/wiki/Direct_Rendering_Manager (5) https://01.org/linuxgraphics/gfx-docs/drm/gpu/index.html (6) https://kernel.readthedocs.io/en/latest/gpu/drm-kms.html#mode-setting (7) https://events.static.linuxfound.org/sites/events/files/slides/brezillon-drm-kms.pdf
第 23 页