FirePrime RK3128点RGB屏 的困惑

本帖最后由 ljj3166 于 2016-6-30 14:12 编辑

最近需要点一块RGB屏,可支持888和565格式
主要用到FirePrime底板的D0-D23,、DEN、CLK、HS和VS等几个管脚
RGB的控制管脚被以太网复用
于是在rk3128-fireprime.dts和rk312x-pinctrl.desi文件里面
把gmac相关的引脚和功能都注释掉

RGB屏的DTSI:

/{
    disp_timings:display-timings {
        native-mode= <&timing0>;
        timing0:timing0 {
            screen-type= <SCREEN_RGB>;
            out-face   = <OUT_P888>;
            clock-frequency= <60000000>;
             hactive= <860>;
             vactive= <480>;
            hback-porch= <40>;
            hfront-porch= <50>;
            vback-porch= <12>;
            vfront-porch= <30>;
            hsync-len= <16>;
            vsync-len= <3>;
            hsync-active= <1>;//active low
            vsync-active= <1>;//active low
            de-active= <0>;//active high
            pixelclk-active= <1>;//active low
             swap-rb= <0>;
             swap-rg= <0>;
             swap-gb= <0>;
        };
    };
};

在rk3128-fireprime.dts中引用
同时把内核配置中与network相关的配置都去掉
编译内核后烧写除System以外的img文件
RGB屏不能正常工作
上示波器发现CLK、HS、VS和DEN都没有正常波形输出
看了一下底层的LCD驱动
RGB的使能在rk31xx_lvds.c文件中

static int rk31xx_lvds_en(void)
{
        struct rk_lvds_device *lvds = rk31xx_lvds;
        struct rk_screen *screen;

        if (unlikely(!lvds) || lvds->sys_state)
                return 0;

        screen = &lvds->screen;
        rk_fb_get_prmry_screen(screen);

        /* enable clk */
        rk31xx_lvds_clk_enable(lvds);

        switch (screen->type) {
        case SCREEN_LVDS:
                rk31xx_output_lvds(lvds, screen);
                break;
        case SCREEN_RGB:
                printk(KERN_ALERT"RGB SET!\n"); //<span style="background-color: rgb(255, 255, 255);">串口debug</span>
                rk31xx_output_lvttl(lvds, screen);
                break;
        default:
                printk("unsupport screen type\n");
                break;
        }

        lvds->sys_state = true;
        return 0;
}

很奇怪,RK3288有直接配置RGB的宏 v_RGB_OUT_EN
RK3128中直接用了个TTL相关的字眼
譬如,个人理解下面的代码就是用来配置RGB的

static void rk31xx_output_lvttl(struct rk_lvds_device *lvds,
                                struct rk_screen *screen)
{
        u32 val = 0;

        /* iomux to lcdc */
#if defined(CONFIG_RK_FPGA)
        grf_writel(0xffff5555, RK312X_GRF_GPIO2B_IOMUX);
        grf_writel(0x00ff0055, RK312X_GRF_GPIO2C_IOMUX);
        grf_writel(0x77771111, 0x00e8); /* RK312X_GRF_GPIO2C_IOMUX2 */
        grf_writel(0x700c1004, RK312X_GRF_GPIO2D_IOMUX);
#else
        if (lvds->pins && !IS_ERR(lvds->pins->default_state))
                pinctrl_select_state(lvds->pins->p, lvds->pins->default_state);
#endif

        val |= v_LVDSMODE_EN(0) | v_MIPIPHY_TTL_EN(1);  /* enable lvds mode */
        val |= v_LVDS_DATA_SEL(LVDS_DATA_FROM_LCDC);    /* config data source */
        grf_writel(0xffff0380, RK312X_GRF_LVDS_CON0);

        val = v_MIPITTL_CLK_EN(1) | v_MIPITTL_LANE0_EN(1) |
                v_MIPITTL_LANE1_EN(1) | v_MIPITTL_LANE2_EN(1) |
                v_MIPITTL_LANE3_EN(1);
        grf_writel(val, RK312X_GRF_SOC_CON1);

        /* enable lane */
        lvds_writel(lvds, MIPIPHY_REG0, 0x7f);
        val = v_LANE0_EN(1) | v_LANE1_EN(1) | v_LANE2_EN(1) | v_LANE3_EN(1) |
                v_LANECLK_EN(1) | v_PLL_PWR_OFF(1);
        lvds_writel(lvds, MIPIPHY_REGEB, val);

        /* set ttl mode and reset phy config */
        val = v_LVDS_MODE_EN(0) | v_TTL_MODE_EN(1) | v_MIPI_MODE_EN(0) |
                v_MSB_SEL(1) | v_DIG_INTER_RST(1);
        lvds_writel(lvds, MIPIPHY_REGE0, val);

        rk31xx_lvds_pwr_on();
printk(KERN_ALERT"RGB SET over!\n");//<span style="background-color: rgb(255, 255, 255);">串口debug</span>

}

上面的两个代码中都加入了串口debug输出
在串口启动中,都能够正常输出两句串口信息
cat sys/class/graphics/fb0/fps也都能获得帧数
说明RGB的配置应该是成功的了
可是不知为何RGB屏不能正常点亮
感觉还是GPIO的MUX有问题

请大神支持一下解决思路,跪谢。

参考这个:
http://developer.t-firefly.com/thread-9223-1-1.html

54zw 发表于 2016-6-30 15:33
参考这个:
http://developer.t-firefly.com/thread-9223-1-1.html

见好
拜读过这个帖子
我的处理方式也类似,还是得不到有效的波形
能详细描述一下管脚配置的处理吗?
祝好

ljj3166 发表于 2016-6-30 16:45
见好
拜读过这个帖子
我的处理方式也类似,还是得不到有效的波形

管脚配置在LCD控制上配置,其中只要配置SYNC信号,因为你在代码中找不到对数据信号的mux,因为数据信号脚是默认配置,所以只要保证没有mux成网卡功能脚就可以了。要注意的地方都在那篇文章提到,除了LCD控制里有个MMU的BUG没说,在你贴出来的代码中没看到有配置管脚的地方,你可以贴出来看下。

54zw 发表于 2016-6-30 16:52
管脚配置在LCD控制上配置,其中只要配置SYNC信号,因为你在代码中找不到对数据信号的mux,因为数据信号脚 …

非常感谢
现在在外场,晚些时候贴出来
祝好

本帖最后由 ljj3166 于 2016-6-30 17:46 编辑

54zw 发表于 2016-6-30 16:52
管脚配置在LCD控制上配置,其中只要配置SYNC信号,因为你在代码中找不到对数据信号的mux,因为数据信号脚 …

我直接把pinctrl.dtsi文件附上来了
rk312x-pinctrl.dtsi.zip (2.75 KB)

rk312x-pinctrl.dtsi.zip (2.75 KB)

截了个图

基本上都是默认的配置
不过把D18-D23都使能了

再狠一点,把管脚的宏定义都干掉了
rockchip-rk312x.h.zip (1.8 KB)

也截了个图

应该不会是由于以太网功能复用了
谢谢大神支招

楼主,请问最后怎么点亮的?

可以试试用 io 命令读取一下复用寄存器是否已经修改过来。

io -v -1|2|4 -r|w [-l ] [-f ] []

-v         Verbose, asks for confirmation
-1|2|4     Sets memory access size in bytes (default byte)
-l <len>   Length in bytes of area to access (defaults to
           one access, or whole file length)
-r|w       Read from or Write to memory (default read)
-f <file>  File to write on memory read, or
           to read on memory write
<addr>     The memory address to access
<val>      The value to write (implies -w)

Examples:
io 0x1000 Reads one byte from 0x1000
io 0x1000 0x12 Writes 0x12 to location 0x1000
io -2 -l 8 0x1000 Reads 8 words from 0x1000
io -r -f dmp -l 100 200 Reads 100 bytes from addr 200 to file
io -w -f img 0x10000 Writes the whole of file to memory

我也遇到同样的问题,论坛下关于RK3128下调试RGB屏幕的文章都看了(已屏蔽GMAC以太网等),但使用24Mhz逻辑分析仪查看D10~D23和HSYNC、VSYNC、DE、CLK都没有信号,而D0~D9信号有规律的信号。

硬件平台:fireprime S;
代码分支:fireprime:809d3e1feaff99ff1b59d16f9478de050e2494a2;

有大神可以指导以下吗?

F0restPewPew 发表于 2024-3-28 23:23
我也遇到同样的问题,论坛下关于RK3128下调试RGB屏幕的文章都看了(已屏蔽GMAC以太网等),但使用24Mhz逻辑 …

是不是管脚没有指定对?

D10~D23管脚是在lvds节点下通过pinctrl复用到lcdc0_lcdc_d,这个文件我查看了一下复用关系是正确的。