Firefly开源社区

标题: FirePrime RK3128点RGB屏 的困惑 [打印本页]

作者: ljj3166    时间: 2016-6-30 14:11
标题: 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:
  1. /{     
  2.     disp_timings:display-timings {
  3.         native-mode= <&timing0>;
  4.         timing0:timing0 {
  5.             screen-type= <SCREEN_RGB>;                           
  6.             out-face   = <OUT_P888>;
  7.             clock-frequency= <60000000>;               
  8.              hactive= <860>;
  9.              vactive= <480>;
  10.             hback-porch= <40>;
  11.             hfront-porch= <50>;
  12.             vback-porch= <12>;
  13.             vfront-porch= <30>;
  14.             hsync-len= <16>;
  15.             vsync-len= <3>;
  16.             hsync-active= <1>;//active low
  17.             vsync-active= <1>;//active low
  18.             de-active= <0>;//active high
  19.             pixelclk-active= <1>;//active low
  20.              swap-rb= <0>;
  21.              swap-rg= <0>;
  22.              swap-gb= <0>;
  23.         };
  24.     };
  25. };
复制代码

在rk3128-fireprime.dts中引用
同时把内核配置中与network相关的配置都去掉
编译内核后烧写除System以外的img文件
RGB屏不能正常工作
上示波器发现CLK、HS、VS和DEN都没有正常波形输出
看了一下底层的LCD驱动
RGB的使能在rk31xx_lvds.c文件中
  1. static int rk31xx_lvds_en(void)
  2. {
  3.         struct rk_lvds_device *lvds = rk31xx_lvds;
  4.         struct rk_screen *screen;

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

  7.         screen = &lvds->screen;
  8.         rk_fb_get_prmry_screen(screen);

  9.         /* enable clk */
  10.         rk31xx_lvds_clk_enable(lvds);

  11.         switch (screen->type) {
  12.         case SCREEN_LVDS:
  13.                 rk31xx_output_lvds(lvds, screen);
  14.                 break;
  15.         case SCREEN_RGB:
  16.                 printk(KERN_ALERT"RGB SET!\n"); //<span style="background-color: rgb(255, 255, 255);">串口debug</span>
  17.                 rk31xx_output_lvttl(lvds, screen);
  18.                 break;
  19.         default:
  20.                 printk("unsupport screen type\n");
  21.                 break;
  22.         }

  23.         lvds->sys_state = true;
  24.         return 0;
  25. }
复制代码
很奇怪,RK3288有直接配置RGB的宏 v_RGB_OUT_EN
RK3128中直接用了个TTL相关的字眼
譬如,个人理解下面的代码就是用来配置RGB的
  1. static void rk31xx_output_lvttl(struct rk_lvds_device *lvds,
  2.                                 struct rk_screen *screen)
  3. {
  4.         u32 val = 0;

  5.         /* iomux to lcdc */
  6. #if defined(CONFIG_RK_FPGA)
  7.         grf_writel(0xffff5555, RK312X_GRF_GPIO2B_IOMUX);
  8.         grf_writel(0x00ff0055, RK312X_GRF_GPIO2C_IOMUX);
  9.         grf_writel(0x77771111, 0x00e8); /* RK312X_GRF_GPIO2C_IOMUX2 */
  10.         grf_writel(0x700c1004, RK312X_GRF_GPIO2D_IOMUX);
  11. #else
  12.         if (lvds->pins && !IS_ERR(lvds->pins->default_state))
  13.                 pinctrl_select_state(lvds->pins->p, lvds->pins->default_state);
  14. #endif

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

  18.         val = v_MIPITTL_CLK_EN(1) | v_MIPITTL_LANE0_EN(1) |
  19.                 v_MIPITTL_LANE1_EN(1) | v_MIPITTL_LANE2_EN(1) |
  20.                 v_MIPITTL_LANE3_EN(1);
  21.         grf_writel(val, RK312X_GRF_SOC_CON1);

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

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

  31.         rk31xx_lvds_pwr_on();
  32. printk(KERN_ALERT"RGB SET over!\n");//<span style="background-color: rgb(255, 255, 255);">串口debug</span>
  33.                
  34. }
复制代码

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

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





作者: 54zw    时间: 2016-6-30 15:33
参考这个:
http://developer.t-firefly.com/thread-9223-1-1.html
作者: ljj3166    时间: 2016-6-30 16:45
54zw 发表于 2016-6-30 15:33
参考这个:
http://developer.t-firefly.com/thread-9223-1-1.html

见好
拜读过这个帖子
我的处理方式也类似,还是得不到有效的波形
能详细描述一下管脚配置的处理吗?
祝好
作者: 54zw    时间: 2016-6-30 16:52
ljj3166 发表于 2016-6-30 16:45
见好
拜读过这个帖子
我的处理方式也类似,还是得不到有效的波形

管脚配置在LCD控制上配置,其中只要配置SYNC信号,因为你在代码中找不到对数据信号的mux,因为数据信号脚是默认配置,所以只要保证没有mux成网卡功能脚就可以了。要注意的地方都在那篇文章提到,除了LCD控制里有个MMU的BUG没说,在你贴出来的代码中没看到有配置管脚的地方,你可以贴出来看下。
作者: ljj3166    时间: 2016-6-30 17:02
54zw 发表于 2016-6-30 16:52
管脚配置在LCD控制上配置,其中只要配置SYNC信号,因为你在代码中找不到对数据信号的mux,因为数据信号脚 ...

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

作者: ljj3166    时间: 2016-6-30 17:42
本帖最后由 ljj3166 于 2016-6-30 17:46 编辑
54zw 发表于 2016-6-30 16:52
管脚配置在LCD控制上配置,其中只要配置SYNC信号,因为你在代码中找不到对数据信号的mux,因为数据信号脚 ...

我直接把pinctrl.dtsi文件附上来了
rk312x-pinctrl.dtsi.zip (2.75 KB, 下载次数: 6)



截了个图


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

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

也截了个图


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

作者: flowerking    时间: 2017-9-6 15:13
楼主,请问最后怎么点亮的?
作者: zhangmk    时间: 2017-9-29 14:56
可以试试用 io 命令读取一下复用寄存器是否已经修改过来。
作者: zhangmk    时间: 2017-9-29 14:57
io -v -1|2|4 -r|w [-l <len>] [-f <file>] <addr> [<value>]

    -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


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

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

有大神可以指导以下吗?
作者: qq号2317783075    时间: 2024-3-29 14:24
F0restPewPew 发表于 2024-3-28 23:23
我也遇到同样的问题,论坛下关于RK3128下调试RGB屏幕的文章都看了(已屏蔽GMAC以太网等),但使用24Mhz逻辑 ...

是不是管脚没有指定对?
作者: F0restPewPew    时间: 2024-3-29 21:30
D10~D23管脚是在lvds节点下通过pinctrl复用到lcdc0_lcdc_d,这个文件我查看了一下复用关系是正确的。

1.png (139.83 KB, 下载次数: 342)

lvds

lvds

2.png (171.25 KB, 下载次数: 306)

pinctrl

pinctrl





欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1