i.MX6 Kernel HDMI 驱动 Issue

/ 2评 / 0

最近在移植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,

 

  1. 张武辉说道:

    你好,我的也是imx6q hdmi显示不出来?yocto是qt5模式编译的,修改了环境变量也不行!能指导一下吗?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注