本帖最后由 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有问题
请大神支持一下解决思路,跪谢。





