最近在移植i.MX6Q的HDMI的驱动,发现各种毛病.就此记录调试过程,如果需要立马得到结果的,请不断往下翻.
第一次尝试,修改dts,开启HDMI,无果.
第二次尝试,给U-Boot添加HDMI的参数.(其实就是append参数)
setenv mmcroot "/dev/mmcblk1p2 rootwait rw video=mxcfb0:dev=hdmi,if=RGB24,bpp=24"
最终显示了,但是分辨率是640*480的.
第三次尝试,给drivers/video/fbdev/mxc/mxc_hdmi.c添加DEBUG标准,把日志调整到7.然后跟踪到mxc_hdmi_read_edid,再到mxc_hdmi_edid_rebuild_modelist.基本猜测,这里获取视频模式.
但是没有说获取到什么内容.发现在rebuild list里面,他必须判断了两个if条件,才能继续执行,一个是必须非隔行扫描,另一个眼看也进不去.不如把打印提前,来看看.
然后成功读取了~
但是肯定没加入列表,不然还有Added Mode这个提示.
第四次尝试,但是刚才mxc_edid_mode_to_vic是什么函数,安全函数吗?不如分析一下.
int mxc_edid_mode_to_vic(const struct fb_videomode *mode) { int i; bool use_aspect = (mode->vmode & FB_VMODE_ASPECT_MASK); for (i = 0; i < ARRAY_SIZE(mxc_cea_mode); i++) { if (mxc_edid_fb_mode_is_equal(use_aspect, mode, &mxc_cea_mode[i])) break; } if (i == ARRAY_SIZE(mxc_cea_mode)) return 0; return i; }
然后主要跳转到.
int mxc_edid_fb_mode_is_equal(bool use_aspect, const struct fb_videomode *mode1, const struct fb_videomode *mode2) { u32 mask; if (use_aspect) mask = ~0; else mask = ~FB_VMODE_ASPECT_MASK; return (mode1->xres == mode2->xres && mode1->yres == mode2->yres && mode1->hsync_len == mode2->hsync_len && mode1->vsync_len == mode2->vsync_len && mode1->left_margin == mode2->left_margin && mode1->right_margin == mode2->right_margin && mode1->upper_margin == mode2->upper_margin && mode1->lower_margin == mode2->lower_margin && mode1->sync == mode2->sync && /* refresh check, 59.94Hz and 60Hz have the same parameter * in struct of mxc_cea_mode */ abs(mode1->refresh - mode2->refresh) <= 1 && (mode1->vmode & mask) == (mode2->vmode & mask)); }
可见是比较MODE的.与mxc_cea_mode比较.而这个数组里面没有我们分辨率.
测试后发现,虽然可以添加,但是无法正常显示.还是默认模式的锅.
总体修改:
diff --git a/drivers/video/fbdev/mxc/mxc_hdmi.c b/drivers/video/fbdev/mxc/mxc_hdmi.c index ebec8d2..21425f7 100644 --- a/drivers/video/fbdev/mxc/mxc_hdmi.c +++ b/drivers/video/fbdev/mxc/mxc_hdmi.c @@ -1791,7 +1791,8 @@ static void mxc_hdmi_edid_rebuild_modelist(struct mxc_hdmi *hdmi) console_lock(); fb_destroy_modelist(&hdmi->fbi->modelist); - fb_add_videomode(&vga_mode, &hdmi->fbi->modelist); + if(hdmi->fbi->monspecs.modedb_len == 0) fb_add_videomode(&vga_mode, &hdmi->fbi->modelist); for (i = 0; i < hdmi->fbi->monspecs.modedb_len; i++) { /* @@ -1801,8 +1802,7 @@ static void mxc_hdmi_edid_rebuild_modelist(struct mxc_hdmi *hdmi) */ mode = &hdmi->fbi->monspecs.modedb[i]; - if (!(mode->vmode & FB_VMODE_INTERLACED) && - (mxc_edid_mode_to_vic(mode) != 0)) { + if (!(mode->vmode & FB_VMODE_INTERLACED)) { dev_dbg(&hdmi->pdev->dev, "Added mode %d:", i); dev_dbg(&hdmi->pdev->dev,
你好,我的也是imx6q hdmi显示不出来?yocto是qt5模式编译的,修改了环境变量也不行!能指导一下吗?
@张武辉 显示与否只和内核有关,和其他无关,不知道你手边有没有1080p的屏幕,你可以先拿那个试一试,因为默认驱动就支持那个分辨率识别的.