例如HDMI强制输出1280x720@60
1、打开~/3588-linux/u-boot/drivers/video/drm下的dw_hdmi_qp.c文件修改:
修改如下:
注释掉:const u8 def_modes_vic[6] = {4, 16, 2, 17, 31, 19};
添加 const u8 def_modes_vic[1] = {4};
2、const u8 def_modes_vic[1] = {4};对应~/3588-linux/u-boot/common/edid.c下的static const struct drm_display_mode edid_cea_modes_1[]
3、若要修改特殊分辨率,句末的分辨率改为自己需要的分辨率,同时把dw_hdmi_qp.c文件下的const u8 def_modes_vic[1] = {4};改为const u8 def_modes_vic[1] = {127};。
4、内核同步分辨率,修改~/3588-linux/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
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, },
#if 0
/* 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),
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
/* 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),
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
/* 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, },
/* 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),
.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),
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
/* 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),
.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),
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
#endif
};
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 *metedata =
&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(metedata, 0, sizeof(*metedata));
//注释掉hdmi edid读取阶段。
//edid = drm_get_edid(connector, hdmi->ddc);
edid = NULL;
...
}
5、kernel设备树配置
打开~/3588-linux/kernel/arch/arm64/boot/dts/rockchip/topeet_screen_lcds.dts文件
gedit topeet_screen_lcds.dts,修改如下打开HDMI0,HDMI1的宏。
//#define LCD_TYPE_MIPI0 //VP2
//#define LCD_TYPE_LVDS_10_1_1280x800_GT911 //VP2
//#define LCD_TYPE_LVDS_10_1_1280x800_GT9271 //VP2
//#define LCD_TYPE_LVDS_10_1_1024x600_GT911 //VP2
//#define LCD_TYPE_LVDS_7_0 //VP2
#define LCD_TYPE_HDMI1 //VP1
#define LCD_TYPE_HDMI0 //VP0
//#define LCD_TYPE_TYPEC_DP //VP1
//#define LCD_TYPE_MIPI1 //VP3