Firefly开源社区

12
发表新贴
打印 上一主题 下一主题

[Android] 【折腾】Firefly-RK3288 Android 5.1 HDMI输出4K(重新修改)

23

积分

0

威望

0

贡献

技术小白

积分
23

【折腾】Firefly-RK3288 Android 5.1 HDMI输出4K(重新修改)

发表于 2018-6-12 17:24:51      浏览:31237 | 回复:10        打印      只看该作者   [复制链接] 楼主
本帖最后由 houxn22 于 2018-7-13 13:06 编辑

小白折腾记,献给需要的人,少走些弯路。
参考了帖子:http://dev.t-firefly.com/thread-271-1-1.htmlhttp://dev.t-firefly.com/thread-9817-1-1.html

之前的修改有问题,不是真正的4K,这里重新改一下(2018-07-13)~~

Android版本:5.1
内核版本:3.10.79
要使板子HDMI输出4K,需要修改内核层和Android framework层。

一、内核层修改

在没修改内核前,adb进入shell,
cd /sys/class/display/HDMI;cat modes,输出当前显示器支持的显示格式。
即使显示器支持4K显示,这里也不会有4K分辨率(3840x2160)。修改内核层目标是使这里识别出4K分辨率。
内核层只需要修改对应dts即可,修改地方为2处,一是禁用掉VGA,二是修改disp_timings。

        进入目录firefly-rk3288_android5.1_git/kernel/arch/arm/boot/dts,该Android系统使用的dts为firefly-rk3288.dts,打开该文件,发现该dts引用了
#include "rk3288.dtsi"
#include "lcd-box.dtsi"
两个头文件。


①禁用掉VGA

在rk3288.dtsi,找到hdmi标签:
  1. hdmi: hdmi@ff980000 {  
  2.        compatible = "rockchip,rk3288-hdmi";  
  3.        reg = <0xff980000 0x20000>;  
  4.        interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;  
  5.        pinctrl-names = "default", "sleep";  
  6.        pinctrl-0 = <&i2c5_sda &i2c5_scl &hdmi_cec>;  
  7.        pinctrl-1 = <&i2c5_gpio>;  
  8.        clocks = <&clk_gates16 9>, <&clk_gates5 12>,<&clk_gates5 11>;  
  9.        clock-names = "pclk_hdmi", "hdcp_clk_hdmi","cec_clk_hdmi";  
  10.        //rockchip,hdmi_video_source = <DISPLAY_SOURCE_LCDC1>;  
  11.        rockchip,hdmi_video_source =<DISPLAY_SOURCE_LCDC0>;  
  12.        rockchip,hdmi_audio_source = <0>;  
  13.        rockchip,hdcp_enable = <0>;  
  14.        rockchip,cec_enable = <0>;  
  15.        status = "disabled";  
  16. };
复制代码

这里修改rockchip,hdmi_video_source 为DISPLAY_SOURCE_LCDC0;即HDMI的视频源为lcdc0。

【说明】因为dtsi文件可能有其他dts引用,最好不要直接修改dtsi文件,而是应该在设备dts即firefly-rk3288.dts中通过引用的方式对欲修改的项目进行覆盖修改。例如,上面修改可以在firefly-rk3288.dts中添加
&hdmi {
      rockchip,hdmi_video_source =<DISPLAY_SOURCE_LCDC0>;
};
这里为了方便,就直接修改了dtsi,但是不提倡。


    然后修改firefly-rk3288.dts,打开该文件,发现vga相关设备都挂在i2c4下,并且该控制器下没有挂其它设备,直接禁用掉该路I2C控制器省事,修改 status = "disabled"。

  1. &i2c4 {  
  2.      //status = "okay";  
  3.     status = "disabled";  
  4.     。。。下面省略。。。  
  5. }
复制代码
  这时候lcdc1已经没用了,直接禁用掉:
  1. &lcdc1 {  
  2.    //status = "okay";  
  3.    status = "disabled";  
  4.    rockchip,iommu-enabled = <1>;  
  5.    rockchip,prop = <EXTEND>;  
  6. };  
复制代码
②修改disp_timings显示时序

    在lcd-box.dtsi中已经定义好了3组timing:timing0、timing1、timing2。它们对应的最大显示分辨率依次增加,当前使用模式通过native-mode指定,在该文件中默认native-mode = <&timing0>。我们不在该dtsi文件中进行修改,而是在firefly-rk3288.dts中覆盖修改。打开firefly-rk3288.dts,找到disp_timings,修改为timing2:
  1. &disp_timings {  
  2.    native-mode = <&timing2>;  
  3. };
复制代码
     
这里对timing2定义也进行了一些修改,由原来的3840x2160改成了1920x1080;如果不修改会使安卓显示内容过小,看是来不舒服(或许也可以通过修改build.prop的lcd_density来改善,没尝试)。  

   
        上面这个得去掉,必须是3840*2160才可以(2018-07-13)!
        进行完上述修改后,内核层修改完成,这时烧入新的设备树,cd /sys/class/display/HDMI;cat modes:
  1. auto  
  2. 3840x2160p-30  
  3. 3840x2160p-25  
  4. 3840x2160p-24  
  5. 1920x1080p-60  
  6. 1920x1080p-50  
  7. 1920x1080p-24  
  8. 1280x720p-60  
  9. 1280x720p-50  
  10. 720x576p-50  
  11. 720x480p-60
复制代码
发现4K显示器支持的分辨率都已经有了。

【遇到的坑】我在烧写RK3288设备树的时候,遇到了一个坑,无论怎么烧写resource.img(内包含最新的设备树),新的设备树根本不起作用,甚至擦除掉kernel.img和resource.img所在分区的内容,系统也能照常起来。后来发现内核和设备树都是使用的boot.img里面的,但是通过使用安卓源码里面的mkimage.sh默认生成的boot.img不包含kernel和resource,后来我修改了mkimage.sh,使里面的TARGET=$BOOT_OTA,才生成了包含内核和dtb的boot.img,重新烧写了生成的boot.img才使修改生效。在此记录一下。

二、安卓层修改
  
因为该安卓硬件抽象层里rockchip对分辨率进行了限制,强制忽略了1080p以上的分辨率,这里取消该限制。

  进入hardware/rockchip/hwcomposer目录,修改rk_hwcomposer.cpp文件:
  在hotplug_set_config()函数里,找到:
     } else if(ctxp->dpyAttr[dType].yres > 1080) {
  这一行,修改为:

    } else if(ctxp->dpyAttr[dType].yres > 2160) { 即可

   

  1. int hotplug_set_config()
  2. {
  3.     int dType = HWC_DISPLAY_EXTERNAL;
  4.     hwcContext * ctxp = _contextAnchor;
  5.     hwcContext * ctxe = _contextAnchor1;
  6.     if(ctxe != NULL) {
  7.         ctxp->dpyAttr[dType].fd           = ctxe->dpyAttr[dType].fd;
  8.         ctxp->dpyAttr[dType].stride       = ctxe->dpyAttr[dType].stride;
  9.         ctxp->dpyAttr[dType].xres         = ctxe->dpyAttr[dType].xres;
  10.         ctxp->dpyAttr[dType].yres         = ctxe->dpyAttr[dType].yres;
  11.         ctxp->dpyAttr[dType].xdpi         = ctxe->dpyAttr[dType].xdpi;
  12.         ctxp->dpyAttr[dType].ydpi         = ctxe->dpyAttr[dType].ydpi;
  13.         ctxp->dpyAttr[dType].vsync_period = ctxe->dpyAttr[dType].vsync_period;
  14.         ctxp->dpyAttr[dType].connected    = true;
  15.         if(ctxp->mIsDualViewMode) {
  16.             ctxp->dpyAttr[dType].xres = ctxe->dpyAttr[dType].xres * 2;
  17.             ctxp->dpyAttr[dType].yres = ctxe->dpyAttr[dType].yres;
  18.             ctxe->mIsDualViewMode = true;
  19.             LOGV("w_s,h_s,w_d,h_d = [%d,%d,%d,%d]",
  20.                 ctxp->dpyAttr[dType].xres,ctxp->dpyAttr[dType].yres,
  21.                 ctxe->dpyAttr[dType].xres,ctxe->dpyAttr[dType].yres);
  22.         //} else if(ctxp->dpyAttr[dType].yres > 1080) {
  23.         } else if(ctxp->dpyAttr[dType].yres > 2160) {
  24.             ctxp->dpyAttr[dType].xres = 1920;
  25.             ctxp->dpyAttr[dType].yres = 1080;
  26.             ctxp->mHdmiSI.NeedReDst = true;
  27.             LOGV("w_s,h_s,w_d,h_d = [%d,%d,%d,%d]",
  28.                 ctxp->dpyAttr[dType].xres,ctxp->dpyAttr[dType].yres,
  29.                 ctxe->dpyAttr[dType].xres,ctxe->dpyAttr[dType].yres);
  30.         } else {
  31.             ctxp->mIsDualViewMode = false;
  32.             ctxp->mHdmiSI.NeedReDst = false;
  33.         }
  34.         return 0;
  35.     } else {
  36.         ctxp->dpyAttr[dType].connected = false;
  37.         ctxp->mIsDualViewMode = false;
  38.         ALOGE("hotplug_set_config fail,ctxe is null");
  39.         return -ENODEV;
  40.     }
  41. }
复制代码

    所有上述修改完成后,重现编译安卓系统,生成system.img后,烧写,安卓HDMI就完美支持4K了。

   另外:如果感觉4K下字体太小,是因为默认的density 160太小造成的,可以在adb shell下执行

          wm density

   看下默认density,执行 wm density 320 看下界面就比较合适了;修改/system/build.prop:
          ro.sf.lcd_density=320
  就可以了(编译前修改或者烧写后adb root;adb remount挂载/system可读写后修改也可以)。


回复

使用道具 举报

3750

积分

17

威望

18

贡献

官方团队

Rank: 9Rank: 9Rank: 9

积分
3750
发表于 2018-6-13 09:13:08        只看该作者  沙发
回复

使用道具 举报

529

积分

0

威望

0

贡献

技术大神

Rank: 3Rank: 3

积分
529
发表于 2018-6-26 15:20:48        只看该作者  板凳
看到这里, 我有个疑问:那原厂当初为啥要限制对 4K 的支持?
会有啥问题吗?
回复

使用道具 举报

10

积分

0

威望

0

贡献

游客

积分
10
发表于 2018-7-7 11:24:18        只看该作者  地板
感谢楼主分享。有一个问题请问下楼主,按照楼主这样修改以后是不是说1080p的显示器输出的是1080p的分别率,4k显示器输出的是4k的分辨率?
回复

使用道具 举报

9

积分

0

威望

0

贡献

技术小白

积分
9
发表于 2018-7-11 16:50:21        只看该作者  5#
回复

使用道具 举报

30

积分

0

威望

0

贡献

技术小白

积分
30
发表于 2018-7-12 10:44:37        只看该作者  6#
流弊流弊,,
回复

使用道具 举报

23

积分

0

威望

0

贡献

技术小白

积分
23
发表于 2018-7-13 13:11:17        只看该作者  7#
kernew 发表于 2018-7-7 11:24
感谢楼主分享。有一个问题请问下楼主,按照楼主这样修改以后是不是说1080p的显示器输出的是1080p的分别率, ...

试了下 可能要重启  重启后默认720p 然后手动改一下
回复

使用道具 举报

30

积分

0

威望

0

贡献

技术小白

积分
30
发表于 2018-8-29 10:49:04        只看该作者  8#
你好,能提供下固件吗?不会编译固件
回复

使用道具 举报

80

积分

0

威望

0

贡献

技术小白

积分
80
发表于 2018-12-5 16:07:42        只看该作者  9#
楼主,那个timing2的定义,有没有哦,有的话,也请贴出来吧
回复

使用道具 举报

6

积分

0

威望

0

贡献

技术小白

积分
6
发表于 2018-12-17 10:51:47        只看该作者  10#
HDMI显示的时候  disp_timings  是没有用的  不用管  只需要如下配置就行
&hdmi {
        status = "okay";
        rockchip,hdmi_video_source = <DISPLAY_SOURCE_LCDC0>;
        rockchip,hdmi_audio_source = <1>;
        rockchip,cec_enable = <0>;
        rockchip,hdcp_enable = <0>;
        rockchip,hdmi_4K = <1>;
};

重点是需要使用DISPLAY_SOURCE_LCDC0  并且打开         rockchip,hdmi_4K = <1>;

因为只有LCDC0是能支持HDMI 4K的
回复

使用道具 举报

返回列表
12
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表