**
Platform: ROCKCHIP
Chip: RK3399
OS: Android7.1.2
Kernel: 4.4.126*
**
【接上篇】上篇虽然HDMI能正常输出4K,但是帧率却达不到60帧,只能30帧,具体分析如下
按网上和官方的分别试了下修改,均没成功kernel/driversideo/rockchipmi/rockchip-hdmiv2 中的 rockchip-hdmi.h 文件,
/* HDMI default vide mode */
#define HDMI_VIDEO_DEFAULT_MODE HDMI_1280X720P_60HZ
又在dtsi中加入 rockchip,defaultmode = <4>;也没有成功。
以上是开机那时候的分辨率。
修改与现象
将输出特殊分辨率的方法输出
相关文件:
kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
kernel/drivers/gpu/drm/drm_edid.c
如上修改:
1、在edid_cea_modes数据的最后定义特殊的分辨率(drm_edid.c文件中)。
2、把def_mode数组的第一个值改成特殊分辨率对应的 vic(vic在drivers/gpu/drm/drm_edid.c文件中edid_cea_modes结构体中).
3、edid = NULL;强制把edid赋为NULL,不管有没有读到edid都强制按def_modes来显示。
kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c下的函数dw_hdmi_connector_get_modes(),修改def_modes
- def_modes[1] = {97};//3840x2160P60
烧录设备结果:hdmi输出显示屏黑屏 cat 设备结果如下
- 特殊分辨率 def_modes[1] = {108};//特殊分辨率 800x1280P60
/* 108 - 800x1280@60Hz */
kernel/drivers/gpu/drm/drm_edid.c里edid_cea_modes[]:新增如下特殊分辨率:
{ DRM_MODE(“800x1280”, DRM_MODE_TYPE_DRIVER, 76000, 800, 848,
880, 960, 0, 1280, 1300, 1304, 1314, 0,
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
.vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
烧录设备结果:出图正常 cat 设备结果如下
原因:显示屏不支持4K60hz,支支持4K30hz,所以导致设备分辨率为60hz时黑屏
其工作流程:底层通过edid,读取到显示器的分辨率列表,然后反馈给Android系统,在系统界面里显示出来
设置分辨率的流程分析
先通过i2c获取屏的edid信息。
EDID的全称是Extended Display Identification Data(扩展显示标识数据),共有128字节。其中包含有关显示器及其性能的参数,包括供应商信息、最大图像大小、颜色设置、厂商预设置、
频率范围的限制以及显示器名和序列号的字符串等等。
如何查看edid信息?
cat sys/class/drm/card0-HDMI-A-1/edid > /data/edid.bin //然后把edid.bin拷贝出来
或者:cat sys/class/drm/card0-HDMI-A-1/edid |busybox hexdump
驱动文件清单
通用屏配置驱动:
drivers/gpu/drm/panel/panel-simple.c //.c文件里面包含mipi的时序参数配置和mipi一些接口还有背光的使能关闭等,配置屏参可以在此文件或者dts
Core:
drivers/gpu/drm/rockchip/rockchip_drm_drv.c
framebuffer drivers/gpu/drm/rockchip/rockchip_drm_fb.c
gem drivers/gpu/drm/rockchip/rockchip_drm_gem.c
vop:
drivers/gpu/drm/rockchip/rockchip_drm_vop.c<