|
FirePrime RK3128点RGB屏 的困惑
发表于 2016-6-30 14:11:39
浏览:17368
|
回复:11
打印
只看该作者
[复制链接]
楼主
本帖最后由 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有问题
请大神支持一下解决思路,跪谢。
|
|