最近在移植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的屏幕,你可以先拿那个试一试,因为默认驱动就支持那个分辨率识别的.