本文主要讲解RK3568如何固定HDMI 分辨率,包含如何查询RK3568如何查询weston 桌面固定分辨率输出,如何将将rk3568通过修改源码固定分辨率输出。 文主要适用于飞凌OKT3568-C 平台Linux4.19.206 操作系统,其他平台也可以参考,但是不同平台之间会存在差异,需客户自行修改以适应自己的使用。 更多ARM开发板相关资讯,关注飞凌嵌入式。
↑ 硬件平台:OK3568-C(基于瑞芯微国产处理器 RK3568) OS:Linux4.19.206 正文开始: 1、weston 桌面固定分辨率输出查看显示设备: 输入ls /sys/class/drm命令,以MIPI 屏为例。
显示支持分辨率: 查看所用适配器支持的分辨率,以MIPI 屏为例。
修改/etc/xdg/weston/weston.ini 文件: [output] name=HDMI-A-1 //与上面列表相对应,去掉card0 mode=1024x600 //需为屏幕支持的有效分辨率 scale=2 //需为整数倍数 2、 修改源码固定分辨率输出uboot选屏为hdmi屏幕修改OK3568-linux-source/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c文件 添加edid = NULL; static int dw_hdmi_connector_get_modes(struct drm_connector *connector) { struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi, connector); struct hdr_static_metadata *metedata = &connector->hdr_sink_metadata.hdmi_type1; struct edid *edid; struct drm_display_mode *mode; struct drm_display_info *info = &connector->display_info; int i, ret = 0; memset(metedata, 0, sizeof(*metedata)); if (!hdmi->ddc) return 0; edid = drm_get_edid(connector, hdmi->ddc); edid = NULL; if (edid) { dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n", edid->width_cm, edid->height_cm); hdmi->support_hdmi = drm_detect_hdmi_monitor(edid); hdmi->sink_has_audio = drm_detect_monitor_audio(edid); drm_connector_update_edid_property(connector, edid); cec_notifier_set_phys_addr_from_edid(hdmi->cec_notifier, edid); ret = drm_add_edid_modes(connector, edid); dw_hdmi_update_hdr_property(connector); kfree(edid); } else { hdmi->support_hdmi = true; hdmi->sink_has_audio = true; for (i = 0; i < ARRAY_SIZE(dw_hdmi_default_modes); i++) { const struct drm_display_mode *ptr = &dw_hdmi_default_modes[i]; mode = drm_mode_duplicate(connector->dev, ptr); if (mode) { if (!i) { mode->type = DRM_MODE_TYPE_PREFERRED; mode->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE; } drm_mode_probed_add(connector, mode); ret++; } } info->edid_hdmi_dc_modes = 0; info->hdmi.y420_dc_modes = 0; info->color_formats = 0; dev_info(hdmi->dev, "failed to get edid\n"); } dw_hdmi_check_output_type_changed(hdmi); return ret; } 只保留客户想要的分辨率,将其他分辨率注释掉,分辨率参数可查看文件添加: OK3568-linux-source/kernel/drivers/gpu/drm/drm_edid.c static const struct drm_display_mode dw_hdmi_default_modes[] = { /* 108 - 1920x1080@60Hz */ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,2052, 2200, 0, 1080, 1084, 1089, 1125, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, /* 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), .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, 16 - 1920x1080@60Hz 16:9 { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,2052, 2200, 0, 1080, 1084, 1089, 1125, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, 31 - 1920x1080@50Hz 16:9 { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,2492, 2640, 0, 1080, 1084, 1089, 1125, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, 19 - 1280x720@50Hz 16:9 { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,1760, 1980, 0, 720, 725, 730, 750, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, 0x10 - 1024x768@60Hz { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,1184, 1344, 0, 768, 771, 777, 806, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, 17 - 720x576@50Hz 4:3 { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,796, 864, 0, 576, 581, 586, 625, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, 2 - 720x480@60Hz 4:3 { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,798, 858, 0, 480, 489, 495, 525, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, */ }; 使用./build.sh kernel 单独编译生成/kernel/boot.img 文件。单独烧写boot.img 文件。 注:有用户反馈rk3568如此固定HDMI 分辨率后屏幕颜色有差异,存在挑屏现象,大部分用户可正常使用。 |
|