rk3288 MIPI+EDP 双屏显示

2019-12-16html

关键字:双屏异显android


 

笔者手里有一块运行着 Android 5.1 的 rk3288 开发板。ide

 

最近接到一个需求:在这块开发板上实现 MIPI + EDP 双屏异显功能。函数

 

笔者手里的这块开发板默认是不支持双屏异显的,不过好在 rk 有官方补丁,合入补丁后能够支持双屏异显功能。ui

 

笔者是在网上找到的这份补丁程序,主要参考了如下两篇博客,感谢这两位博主的无私奉献:spa

https://www.cnblogs.com/lialong1st/p/9149213.html.net

https://blog.csdn.net/lb5761311/article/details/900244703d

 

其实这两篇博客中所记载的补丁已是将双屏异显的核心功能给支持上的了。通常来说,合入博客中的补丁后都能成功实现双屏异显功能。但恰恰笔者就是那个“特殊状况”,笔者在仔细登入补丁后,仍然发现了一些问题,致使不能实现双异异显功能。这篇博客,就来记述一下这些问题以及解决办法。视频

 

固然,如下记载的问题现象首先都必需要保证补丁程序被正确无误地合并进去,必定要仔细检查每一行补丁代码,确保不是因为合补丁失误引起的问题。htm

 

一、主屏点不亮

上面两篇博客中都有提到,要将 uboot logo 关掉:

 

至少笔者手里的 MIPI 屏,或者说主屏,是在 uboot 阶段而不是在 kernel 阶段点亮的。在 uboot 阶段也会去解析 dts 配置,并根据 rockchip,uboot-logo-on 属性的值来决定是否跑 uboot 阶段的点屏操做。因此,若是你发现你在正确合入补丁之后出现了连主屏都点不亮的状况,能够尝试着将这个属性配置为1,让uboot去点一下屏。须要注意的是,rk3288不能直接烧 uboot 分区,须要编译大包才能应用到 uboot 的修改。但若是仅仅是改一下 kernel 层的 dts 文件,则能够经过烧 resource.img 来验证。

 

uboot 阶段的点屏流程大体以下:

./u-boot/board/rockchip/common/rkboot/fastboot.c

  board_fbt_preboot();

./u-boot/common/lcd.c

  drv_lcd_init();

  lcd_init();

./u-boot/driver/video/rockchip_fb.c

  lcd_ctrl_init();

 

对了,uboot 阶段点屏时解析的屏参 dts 是必须记载在根 dts 下的,即咱们除了要像补丁程序中那样,在 rk_screen 节点下增长主屏参信息配置,也得在根 dts 下继续引用完整的屏参文件:

 

若是没有像上图那样 include 进来完整的 MIPI 屏参文件,uboot阶段点屏时会报找不到 display-timing 节点错误的。

 

通常来讲,按照上面的步骤操做之后都能点亮主屏。

 

二、副屏不亮

副屏是没法在 uboot 阶段点亮的。或者说 uboot 默认只点了一块屏幕,若是你硬要像点主屏同样在 uboot 阶段副屏也点亮,那只能你本身去研究修改 uboot 代码了。

 

笔者的副屏不亮就没有动过 uboot 的代码。

 

在笔者的 rk3288 中,主屏的视频数据是来自于 fb0 的,而副屏的是来自于 fb4 的:dev/graphics/fb4。咱们首先来查一下 fb4 的基础屏参信息:

cat /sys/class/graphics/fb4/screen_info

 

这里要确保副屏的分辨率与帧率与咱们手里实际的屏幕对的上。若是对不上,好比笔者的以前就出现过副屏解析成 480x320 的状况。这样就固然点不亮了。若是出现了分辨率被解析错了的状况,修改如下这个文件:

./kernel/drivers/video/rockchip/lcdc/rk3288_lcdc.c

将 lcdc_read_reg_defalut_cfg 函数的设置屏幕分辨率的代码注释掉,以下图所示:

 

注掉这两段代码,能够解决分辨率被修改的问题。

 

若是发现分辨率与帧率都正确了,仍然点不亮,则能够查一下副屏的时钟,即 lcdc1 的时钟。

 

查询方式有好几种,第一种是看开机打印:

 

第二种方式是直接查询时钟配置表:

cat /d/clk/clk_summary | grep lcdc

lcdc1 的时钟必须在副屏的可接受范围之内,不然至关于副屏的屏参不正确,固然点不亮了。

 

若是发现 lcdc1 的时钟频率不对,与本身在 dtsi 中填写的不一致,则要修改 dtsi。

 

系统是在哪里强制将你设定在 dtsi 中的时钟频率给修改掉的呢?在如下代码中的 set_dclk 函数中。

./kernel/drivers/video/rockchip/lcdc/rk3288_lcdc.c

 

当初始化副屏时,这个函数会去执行上图红箭头所指的函数,并在里面根据一些条件来应用或修改你设定的频率值。有兴趣的能够加打印跟踪一下这个函数流程,它并不复杂,不过笔者就不在这里贴出来了。

 

总而言之,解决时钟频率被修改的办法就是加打印跟踪,并将副屏 dtsi 中的时钟频率设置成系统强制设给你的频率的倍数,固然这个倍数也得在你的屏幕的可接受范围以内才行。

 

三、HDMI不插副屏不亮

可能有些同窗是没有严格按照补丁程序将 dts 中的 hdmi 节点给关闭掉的。

 

关不关 hdmi 自己不会影响双屏异显功能,但有的同窗可能会发现一个神奇的现象:HDMI不插时副屏死活点不亮。

 

这实际上是 rk3288 的机制为之。这个板子默认就将 lcdc1 与 HDMI 绑定死了的。没有HDMI时就不给 lcdc1 送视频数据。更过度的是当插了 HDMI 时,副屏虽然亮了,但使用的屏参倒是 HDMI 显示器的。换句话说,若是你所接的 HDMI 显示器的屏参与你要点的副屏的屏参差别较大,是有可能出现插了 HDMI 后副屏黑掉的状况的。因此严格来说,应该是当要用双屏异显时就关掉 HDMI 功能,当要使用 HDMI 时就不要用双屏异显功能。

 

不过若是咱们不考虑兼容性而非要同时使用双屏异显与 HDMI 怎么办呢?

 

也简单,在确保了 fb4/screen_info 中的分辨率与 lcdc1 的时钟正确之后,在 android 系统中设置一条属性:

  ro.htg.force=1

便可。即在 /system/build.prop 上添加上这条属性,重启便可。

 

四、HDMI拨掉致使副屏熄灭

前面有提到,rk3288 默认将 lcdc1 与 HDMI 绑定死了。当检测到拨掉 HDMI 时就不往 lcdc1 送视频数据。

 

因此最简单的解决办法就是不上报 HDMI 的拨出事件。只需修改一处代码便可,以下图所示:

 

五、副屏花屏

修改副屏的屏参,若是屏参正确了,则将上面第 3 步提到的 ro.htg.force=1 配置一下基本也能解决的了。

相关文章
相关标签/搜索