打印
[i.MX]

IMX6Q Linux LCD模块

[复制链接]
15398|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我在使用IMX6Q的Linux LCD模块,LCD屏的格式的VGA。我修改了文件mxc_lcdif.c和board-mx6q_sabresd.c中相应的部分。点亮了LCD的背光并且pixclk、hsync和vsync的信号都有了。但是没有得到图像显示。请问图片数据是在哪里写入的。如何得到图像显示?

相关帖子

沙发
FSL_TICS_Jeremy| | 2014-2-18 08:13 | 只看该作者
你还,楼主!
我会尽快将你的问题转告给I.max工程师!

使用特权

评论回复
板凳
FSL_TICS_imx| | 2014-2-18 17:06 | 只看该作者
楼主你好,你是如何修改的mxc_lcdif.c和board-mx6q_sabresd.c?同时你u-boot环境参数是如何设置的?

使用特权

评论回复
地板
zengquanyun|  楼主 | 2014-2-18 17:47 | 只看该作者
在mxc_lcdif.c中:
static struct fb_videomode lcdif_modedb[] = {
        {
        /* 640x480 @ 60 Hz , pixel clk @ 25MHz */
        "HVGA", 60, 640, 480, 40000, 50, 110, 34, 11, 3, 2,//modified by jimmy
        FB_SYNC_CLK_LAT_FALL,
        FB_VMODE_NONINTERLACED,
        0,},
        /*{
        // 800x480 @ 60 Hz , pixel clk @ 32MHz
        "SEIKO-WVGA", 60, 800, 480, 29850, 89, 164, 23, 10, 10, 10,
        FB_SYNC_CLK_LAT_FALL,
        FB_VMODE_NONINTERLACED,
        0,},*/ // jimmy
};

在board-mx6q_sabresd.c中:
static struct ipuv3_fb_platform_data sabresd_fb_data[] = {
        { /*fb0*/
        .disp_dev = "lcd",
        .interface_pix_fmt = IPU_PIX_FMT_RGB565, //IPU_PIX_FMT_RGB666, //by jimmy
        .mode_str = "HVGA",   //jimmy
        .default_bpp = 16,
        .int_clk = false,
        }, /*{
        .disp_dev = "hdmi",
        .interface_pix_fmt = IPU_PIX_FMT_RGB24,
        .mode_str = "1920x1080M@60",
        .default_bpp = 32,
        .int_clk = false,
        }, {
        .disp_dev = "lcd0",
        .interface_pix_fmt = IPU_PIX_FMT_RGB666,
        .mode_str = "VGA",   //jimmy
        .default_bpp = 16,
        .int_clk = false,
        },*///masked by jimmy
};

static struct fsl_mxc_lcd_platform_data lcdif_data = {
        .ipu_id = 0,
        .disp_id = 0,
        .default_ifmt = IPU_PIX_FMT_RGB666,//modified by jimmy
};

void lcd_pin_init(void)   //by jimmy
{
    //writel(((readl(IOMUXC_LCD_PWR_EN) & ~0x7) | 0x5), IOMUXC_LCD_PWR_EN);
    gpio_request(SABRESD_LCD_PWR_EN, "lcd");
    gpio_direction_output(SABRESD_LCD_PWR_EN, 1);
    msleep(1);
    gpio_set_value(SABRESD_LCD_PWR_EN, 1);

    //writel(((readl(IOMUXC_BKL_EN) & ~0x7) | 0x0), IOMUXC_BKL_EN);
    gpio_request(SABRESD_BKL_EN, "lcd");
    gpio_direction_output(SABRESD_BKL_EN, 1);
    msleep(1);
    gpio_set_value(SABRESD_BKL_EN, 1);   


    gpio_request(SABRESD_DISP_CLK, "lcd");
    gpio_direction_output(SABRESD_DISP_CLK, 1);
   
    gpio_request(SABRESD_DISP_ENAB, "lcd");
    gpio_direction_output(SABRESD_DISP_ENAB, 1);

    gpio_request(SABRESD_DISP_HSYNC, "lcd");
    gpio_direction_output(SABRESD_DISP_HSYNC, 1);

    gpio_request(SABRESD_DISP_SYNC, "lcd");
    gpio_direction_output(SABRESD_DISP_SYNC, 1);

    gpio_request(SABRESD_DISP_DATA00, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA00, 1);

    gpio_request(SABRESD_DISP_DATA01, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA01, 1);

    gpio_request(SABRESD_DISP_DATA02, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA02, 1);

    gpio_request(SABRESD_DISP_DATA03, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA03, 1);

    gpio_request(SABRESD_DISP_DATA04, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA04, 1);

    gpio_request(SABRESD_DISP_DATA05, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA05, 1);

    gpio_request(SABRESD_DISP_DATA06, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA06, 1);

    gpio_request(SABRESD_DISP_DATA07, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA07, 1);

    gpio_request(SABRESD_DISP_DATA08, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA08, 1);

    gpio_request(SABRESD_DISP_DATA09, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA09, 1);

    gpio_request(SABRESD_DISP_DATA10, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA10, 1);

    gpio_request(SABRESD_DISP_DATA11, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA11, 1);

    gpio_request(SABRESD_DISP_DATA12, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA12, 1);

    gpio_request(SABRESD_DISP_DATA13, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA13, 1);

    gpio_request(SABRESD_DISP_DATA14, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA14, 1);

    gpio_request(SABRESD_DISP_DATA15, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA15, 1);

    gpio_request(SABRESD_DISP_DATA16, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA16, 1);

    gpio_request(SABRESD_DISP_DATA17, "lcd");
    gpio_direction_output(SABRESD_DISP_DATA17, 1);


    writel(((readl(IOMUXC_DI0_DISP_CLK) & ~0x7) | 0x0), IOMUXC_DI0_DISP_CLK);
    writel(((readl(IOMUXC_DI0_PIN15) & ~0x7) | 0x0), IOMUXC_DI0_PIN15);
    writel(((readl(IOMUXC_DI0_PIN02) & ~0x7) | 0x0), IOMUXC_DI0_PIN02);
    writel(((readl(IOMUXC_DI0_PIN03) & ~0x7) | 0x0), IOMUXC_DI0_PIN03);
    writel(((readl(IOMUXC_DISP0_DATA00) & ~0x7) | 0x0), IOMUXC_DISP0_DATA00);
    writel(((readl(IOMUXC_DISP0_DATA01) & ~0x7) | 0x0), IOMUXC_DISP0_DATA01);
    writel(((readl(IOMUXC_DISP0_DATA02) & ~0x7) | 0x0), IOMUXC_DISP0_DATA02);
    writel(((readl(IOMUXC_DISP0_DATA03) & ~0x7) | 0x0), IOMUXC_DISP0_DATA03);
    writel(((readl(IOMUXC_DISP0_DATA04) & ~0x7) | 0x0), IOMUXC_DISP0_DATA04);
    writel(((readl(IOMUXC_DISP0_DATA05) & ~0x7) | 0x0), IOMUXC_DISP0_DATA05);
    writel(((readl(IOMUXC_DISP0_DATA06) & ~0x7) | 0x0), IOMUXC_DISP0_DATA06);
    writel(((readl(IOMUXC_DISP0_DATA07) & ~0x7) | 0x0), IOMUXC_DISP0_DATA07);
    writel(((readl(IOMUXC_DISP0_DATA08) & ~0x7) | 0x0), IOMUXC_DISP0_DATA08);
    writel(((readl(IOMUXC_DISP0_DATA09) & ~0x7) | 0x0), IOMUXC_DISP0_DATA09);
    writel(((readl(IOMUXC_DISP0_DATA10) & ~0x7) | 0x0), IOMUXC_DISP0_DATA10);
    writel(((readl(IOMUXC_DISP0_DATA11) & ~0x7) | 0x0), IOMUXC_DISP0_DATA11);
    writel(((readl(IOMUXC_DISP0_DATA12) & ~0x7) | 0x0), IOMUXC_DISP0_DATA12);
    writel(((readl(IOMUXC_DISP0_DATA13) & ~0x7) | 0x0), IOMUXC_DISP0_DATA13);
    writel(((readl(IOMUXC_DISP0_DATA14) & ~0x7) | 0x0), IOMUXC_DISP0_DATA14);
    writel(((readl(IOMUXC_DISP0_DATA15) & ~0x7) | 0x0), IOMUXC_DISP0_DATA15);
    writel(((readl(IOMUXC_DISP0_DATA16) & ~0x7) | 0x0), IOMUXC_DISP0_DATA16);
    writel(((readl(IOMUXC_DISP0_DATA17) & ~0x7) | 0x0), IOMUXC_DISP0_DATA17);
}           
在函数mx6_sabresd_board_init加入lcd_pin_init();

u-boot环境参数设置是:
MX6Q SABRESD U-Boot > setenv loadaddr 0x10800000
MX6Q SABRESD U-Boot > setenv bootargs_base 'setenv bootargs console=ttymxc0,115200'
MX6Q SABRESD U-Boot > setenv bootargs_mmc 'setenv bootargs ${bootargs} root=/dev/
mmcblk0p1 rootwait rw video=mxcfb0:dev=lcd,HVGA,640x480M-16@60,if=RGB666,bpp=16’
MX6Q SABRESD U-Boot > setenv bootcmd_mmc 'run bootargs_base bootargs_mmc;mmc dev
2;mmc read ${loadaddr} 0x800 0x2000;bootm'
MX6Q SABRESD U-Boot > setenv bootcmd 'run bootcmd_mmc'
MX6Q SABRESD U-Boot > saveenv

使用特权

评论回复
5
zengquanyun|  楼主 | 2014-2-19 13:49 | 只看该作者
FSL_TICS_imx,你好。经过测量波形,我确认到DATA0到DATA17的引脚在启动linux的过程中一直都是低电平。所以推测是没有执行写图像数据。请问写图像数据的接口在哪里?

使用特权

评论回复
6
FSL_TICS_imx| | 2014-2-20 10:22 | 只看该作者
Hi,
   你的LCD初始化函数里,对DISP0接口的复用是不对的,我们已经做了复用的配置,你不需要再用writel方式去写寄存器进行配置。你打开board-mx6q_sabresd.h文件,你就看到DISP0引脚的所有复用。因此,你只需要在你的lcd_pin_init()函数的开头,加上:mxc_iomux_v3_setup_multiple_pads(mx6q_sabresd_pads,ARRY_SIZE(mx6q_sabresd_pads),这个函数可以在borad-mx6q_sabresd.c文件里找到。事实上,可能你不需要增加这个函数到你的lcd_pin_init()里面!但是,下面的代码必须删除:
    writel(((readl(IOMUXC_DI0_DISP_CLK) & ~0x7) | 0x0), IOMUXC_DI0_DISP_CLK);
    writel(((readl(IOMUXC_DI0_PIN15) & ~0x7) | 0x0), IOMUXC_DI0_PIN15);
    writel(((readl(IOMUXC_DI0_PIN02) & ~0x7) | 0x0), IOMUXC_DI0_PIN02);
    writel(((readl(IOMUXC_DI0_PIN03) & ~0x7) | 0x0), IOMUXC_DI0_PIN03);
    writel(((readl(IOMUXC_DISP0_DATA00) & ~0x7) | 0x0), IOMUXC_DISP0_DATA00);
    writel(((readl(IOMUXC_DISP0_DATA01) & ~0x7) | 0x0), IOMUXC_DISP0_DATA01);
    writel(((readl(IOMUXC_DISP0_DATA02) & ~0x7) | 0x0), IOMUXC_DISP0_DATA02);
    writel(((readl(IOMUXC_DISP0_DATA03) & ~0x7) | 0x0), IOMUXC_DISP0_DATA03);
    writel(((readl(IOMUXC_DISP0_DATA04) & ~0x7) | 0x0), IOMUXC_DISP0_DATA04);
    writel(((readl(IOMUXC_DISP0_DATA05) & ~0x7) | 0x0), IOMUXC_DISP0_DATA05);
    writel(((readl(IOMUXC_DISP0_DATA06) & ~0x7) | 0x0), IOMUXC_DISP0_DATA06);
    writel(((readl(IOMUXC_DISP0_DATA07) & ~0x7) | 0x0), IOMUXC_DISP0_DATA07);
    writel(((readl(IOMUXC_DISP0_DATA08) & ~0x7) | 0x0), IOMUXC_DISP0_DATA08);
    writel(((readl(IOMUXC_DISP0_DATA09) & ~0x7) | 0x0), IOMUXC_DISP0_DATA09);
    writel(((readl(IOMUXC_DISP0_DATA10) & ~0x7) | 0x0), IOMUXC_DISP0_DATA10);
    writel(((readl(IOMUXC_DISP0_DATA11) & ~0x7) | 0x0), IOMUXC_DISP0_DATA11);
    writel(((readl(IOMUXC_DISP0_DATA12) & ~0x7) | 0x0), IOMUXC_DISP0_DATA12);
    writel(((readl(IOMUXC_DISP0_DATA13) & ~0x7) | 0x0), IOMUXC_DISP0_DATA13);
    writel(((readl(IOMUXC_DISP0_DATA14) & ~0x7) | 0x0), IOMUXC_DISP0_DATA14);
    writel(((readl(IOMUXC_DISP0_DATA15) & ~0x7) | 0x0), IOMUXC_DISP0_DATA15);
    writel(((readl(IOMUXC_DISP0_DATA16) & ~0x7) | 0x0), IOMUXC_DISP0_DATA16);
    writel(((readl(IOMUXC_DISP0_DATA17) & ~0x7) | 0x0), IOMUXC_DISP0_DATA17);
所以,建议你先这样试试:
先不要添加这句话mxc_iomux_v3_setup_multiple_pads(mx6q_sabresd_pads,ARRY_SIZE(mx6q_sabresd_pads),
只删掉上面那些不必要的代码。

使用特权

评论回复
7
zengquanyun|  楼主 | 2014-2-20 13:29 | 只看该作者
删掉了这些代码,结果还是一样。我确认到程序中已经有执行mxc_iomux_v3_setup_multiple_pads了。所以,我增加的这些代码确实是重复了。说一个题外话:board-mx6q_sabresd.h中IOMUX的配置方式怎么跟reference manual中介绍的对寄存器的配置不同?
现在的问题是:pixclk、hsync和vsync有预期的信号,但是RGB的18根data引脚一直都是低电平。所以我估计是程序中没有往framebuffer中写图像数据。请问代码中是在哪里进行这个操作的?



使用特权

评论回复
8
FSL_TICS_imx| | 2014-2-20 16:10 | 只看该作者
楼主你好,
static struct fsl_mxc_lcd_platform_data lcdif_data = {
        .ipu_id = 0,
        .disp_id = 0,
        .default_ifmt = IPU_PIX_FMT_RGB666,//modified by jimmy
};
加粗部分你修改一下,你用的是RGB565。

使用特权

评论回复
9
zengquanyun|  楼主 | 2014-2-20 16:42 | 只看该作者
我使用的LCD引脚R、G、B各有6根引脚。不是应该为RGB666吗?

使用特权

评论回复
10
FSL_TICS_imx| | 2014-2-20 16:46 | 只看该作者
zengquanyun 发表于 2014-2-20 16:42
我使用的LCD引脚R、G、B各有6根引脚。不是应该为RGB666吗?

static struct ipuv3_fb_platform_data sabresd_fb_data[] = {
        { /*fb0*/
        .disp_dev = "lcd",
        .interface_pix_fmt = IPU_PIX_FMT_RGB565, //IPU_PIX_FMT_RGB666, //by jimmy
        .mode_str = "HVGA",   //jimmy
        .default_bpp = 16,
        .int_clk = false,
        },
那就将这里改为RGB666,要一致。

使用特权

评论回复
11
zengquanyun|  楼主 | 2014-2-20 17:03 | 只看该作者
我把它改成一致了。结果是一样的。还是没有显示图像。

使用特权

评论回复
12
FSL_TICS_imx| | 2014-2-20 17:05 | 只看该作者
zengquanyun 发表于 2014-2-20 17:03
我把它改成一致了。结果是一样的。还是没有显示图像。

那你再检查一下你LCD的时序设置的是否正确。

使用特权

评论回复
13
FSL_TICS_imx| | 2014-2-20 17:11 | 只看该作者
本帖最后由 FSL_TICS_imx 于 2014-2-20 17:24 编辑

在mxc_lcdif.c中你改成如下,试一下
{
        /* 640x480 @ 60 Hz , pixel clk @ 25MHz */
        "HVGA", 60, 640, 480, 40000, 50, 110, 34, 11, 3, 2,
        FB_VMODE_NONINTERLACED,
        FB_MODE_IS_DETAILED,
}  

使用特权

评论回复
14
FSL_TICS_imx| | 2014-2-20 17:25 | 只看该作者
楼主你好,请问现在可以显示了吗?

使用特权

评论回复
15
zengquanyun|  楼主 | 2014-2-20 17:44 | 只看该作者
这个数组少了一个数组元素?要这样试吗?

使用特权

评论回复
16
FSL_TICS_imx| | 2014-2-21 10:36 | 只看该作者
zengquanyun 发表于 2014-2-20 17:44
这个数组少了一个数组元素?要这样试吗?

你可以先试一下。

使用特权

评论回复
17
FSL_TICS_imx| | 2014-2-21 10:37 | 只看该作者
楼主你好,现在图像可以显示了么?

使用特权

评论回复
18
alexer| | 2014-2-21 10:54 | 只看该作者
我也有i.mx6板  VGA引脚定义见附件图

QQ截图20140221105310.png (11 KB )

QQ截图20140221105310.png

QQ截图20140221105322.png (4.82 KB )

QQ截图20140221105322.png

使用特权

评论回复
19
zengquanyun|  楼主 | 2014-2-21 13:11 | 只看该作者
FSL_TICS_imx,我改成你那样,还是不能显示。

使用特权

评论回复
20
FSL_TICS_imx| | 2014-2-21 16:11 | 只看该作者
zengquanyun 发表于 2014-2-21 13:11
FSL_TICS_imx,我改成你那样,还是不能显示。

您好,你用的LCD屏,目前我手上也没有,具体的参数也不知晓,也没法帮您debug,所以也不知道具体是哪里出现的问题,这里我发给你两个文档你参考一下,关于如何配置的LCD显示的:
1. http://cache.freescale.com/files/32bit/doc/user_guide/MX53UG.pdf
18章节是介绍 LCD porting的.
2. Different Display Configurations on i.MX35 Linux PDK
http://cache.freescale.com/files/dsp/doc/app_note/AN3974.pdf
虽然是关于 i.MX35的,但是 driving porting in Linux 对于i.mx6也是适用的。



你看完文档你自己测试一下,如果有问题再给出什么问题,我们再帮您解决

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

75

帖子

2

粉丝