1.概要
2.内容
3.ITOP-RK3588 HDMI强制分辨率跳过EDID
在ITOP-RK3588开发板上,如果需要通过HDMI强制输出特定分辨率并跳过EDID(扩展显示标识数据)的读取,您可以按照以下步骤进行配置和修改。EDID通常用于显示设备之间交换有关其显示能力的信息,但在某些情况下,可能需要强制输出特定的分辨率。
一、修改U-Boot代码
-
定位并修改dw_hdmi_qp.c文件
- 打开路径为
~/3588-linux/u-boot/drivers/video/drm/dw_hdmi_qp.c
的文件。 - 注释掉原有的默认分辨率数组:
// const u8 def_modes_vic[6] = {4, 16, 2, 17, 31, 19};
- 添加您需要的分辨率对应的VIC(视频标识码)值。例如,如果希望强制输出1280x720@60Hz的分辨率,其VIC值为4,则修改为:
const u8 def_modes_vic[1] = {4};
- 打开路径为
-
修改edid.c文件
- 打开路径为
~/3588-linux/u-boot/common/edid.c
的文件。 - 找到
static const struct drm_display_mode edid_cea_modes_1[]
数组,确保其中包含了您需要的分辨率模式。
- 打开路径为
二、修改内核代码
-
定位并修改dw-hdmi-qp.c文件
- 打开路径为
~/3588-linux/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
的文件。 - 在
static const struct drm_display_mode dw_hdmi_default_modes[]
数组中添加或修改为您需要的分辨率模式。例如,添加1280x720@60Hz的分辨率模式:static const struct drm_display_mode dw_hdmi_default_modes[] = { /* 4 - 1280x720@60Hz 16:9 */ { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390, 1430, 1650, 0, 720, 725, 730, 750, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, // 其他分辨率模式... };
- 打开路径为
-
修改HDMI连接器的模式获取函数
- 在同一个文件中,找到
static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
函数。 - 注释掉EDID读取的代码部分,使系统不依赖EDID来获取分辨率信息:
static int dw_hdmi_connector_get_modes(struct drm_connector *connector) { struct dw_hdmi_qp *hdmi = container_of(connector, struct dw_hdmi_qp, connector); struct hdr_static_metadata *metadata = &connector->hdr_sink_metadata.hdmi_type1; struct edid *edid; struct drm_display_mode *mode; struct drm_display_info *info = &connector->display_info; void *data = hdmi->plat_data->phy_data; int i, ret = 0; if (!hdmi->ddc) return 0; memset(metadata, 0, sizeof(*metadata)); // 注释掉EDID读取部分 // edid = drm_get_edid(connector, hdmi->ddc); edid = NULL; // 其他代码... return ret; }
- 在同一个文件中,找到
三、修改设备树配置
-
定位并修改topeet_screen_lcds.dts文件
- 打开路径为
~/3588-linux/kernel/arch/arm64/boot/dts/rockchip/topeet_screen_lcds.dts
的文件。 - 确保HDMI接口被正确启用,并配置为所需的模式。根据需要修改或添加相关的HDMI接口配置。
- 打开路径为
四、编译和烧写镜像
- 完成上述修改后,重新编译U-Boot和内核镜像。
- 将编译好的镜像烧写到ITOP-RK3588开发板上。
五、注意事项
- 分辨率兼容性:确保强制输出的分辨率被您的显示设备支持,否则可能导致显示异常。
- 系统稳定性:修改底层驱动和系统配置可能会影响系统的稳定性,建议在测试环境中进行充分验证。
- 备份原始文件:在进行任何修改之前,建议备份原始文件,以便在需要时恢复。
通过上述步骤,您可以在ITOP-RK3588开发板上通过HDMI强制输出特定分辨率,并跳过EDID的读取。这在进行特定显示测试或开发时非常有用。
3.关联链接
ITOP-RK3588 HDMI强制分辨率跳过EDID_rk3588 hdmi强制输出-优快云博客
RK3588添加分辨率_rk3588添加hdmi分辨率-优快云博客
rk3588内核添加特殊分辨率_3588 hdmi 特殊分辨率-优快云博客
4.关联知识
1.HDMI_PICTURE_ASPECT_16_10的定义在那个文件中
HDMI_PICTURE_ASPECT_16_10 的定义通常位于与HDMI或视频输出相关的内核头文件中。然而,具体的文件路径可能因不同的Linux发行版、内核版本或硬件平台而异。在Linux内核开发中,这种定义通常出现在包含HDMI或视频模式相关常量的头文件中。
虽然无法提供一个绝对准确的文件路径,但可以根据常见的Linux内核开发实践,推测 HDMI_PICTURE_ASPECT_16_10 可能定义在类似以下的文件中:
kernel/include/linux/hdmi.h 或 kernel/include/uapi/linux/hdmi.h:这些文件通常包含与HDMI相关的常量定义,包括视频模式、宽高比等。
kernel/drivers/video/rockchip/hdmi/rockchip-hdmi.h 或类似路径下的头文件:如果这是针对特定硬件平台(如Rockchip的RK3399proC)的HDMI驱动,那么相关的HDMI常量定义可能会出现在该硬件平台特定的驱动头文件中。
要找到确切的定义位置,建议:
查阅相关硬件平台的内核源码:如果你有访问特定硬件平台的内核源码的权限,可以直接在源码中搜索 HDMI_PICTURE_ASPECT_16_10。
查阅内核文档或开发者社区:内核开发者社区或文档可能会提供关于常量定义位置的额外信息。
使用代码搜索工具:如果你使用的是Linux发行版,并且安装了相应的内核源码包,可以使用代码搜索工具(如 grep、ack 或 ripgrep)在源码中搜索 HDMI_PICTURE_ASPECT_16_10。
请注意,由于内核源码的频繁更新和变化,具体的文件路径可能会随着时间而变化。因此,最可靠的方法是在你正在使用的特定内核版本和硬件平台的源码中搜索该常量。