Firefly开源社区

标题: 4k 是假的吗? [打印本页]

作者: connet    时间: 2014-11-19 13:00
标题: 4k 是假的吗?
    测试发现,即使android 选择4k 输出, android 系统运行状态还是1080p, 所谓的4k是不是把 1080p 的framebuffer scale输出到 4k 显示器(新下载的11月版本)?
   请问如何修改 kernel 分辨率,让 android 运行在 4k分辨率下?
作者: isle    时间: 2014-11-19 16:39
一般FB 是FHD,  HDMI 会scale到4k。播放ideo的是时候video输出video buffer直接 4K。无 scale 。
FB直接4K 没试过。内存会紧张吧。楼主有啥需求要FB 4K?
作者: openeyes    时间: 2014-11-19 17:01
那一張4k2k的bmp檔,顯示出來不就失真了?
作者: isle    时间: 2014-11-19 17:26
好吧 ,FB改4K的地方在kernel/arch/arm/boot/dts/lcd-box.dtsi
disp_timings: display-timings {
                        native-mode = <&timing1>;

改成 native-mode = <&timing2>;

作者: 暴走的阿Sai    时间: 2014-11-19 17:51
4K是一个分辨率标准,4K还包括解码能力,可以播放4K高清的视频,至于Android和HDMI的buffer也可以改大
作者: connet    时间: 2014-11-20 10:03
把 kernel/arch/arm/boot/dts/lcd-box.dtsi  修改为 改成 native-mode = <&timing2>; 编译出 resource.img, 更新后不是4k, 变成1280x720,4k 失败自动回到720p ?
作者: isle    时间: 2014-11-20 14:25
把 cat /sys/class/graphics/fb0/disp_info 信息贴上来。

作者: sky    时间: 2014-11-20 19:45
电视是4K吗?
作者: connet    时间: 2014-11-21 10:32
烧写4k resource.img 后显示 /sys/class/graphics/fb0/disp_info
  1. z-order:
  2.   layer3_sel_win[3]
  3.   layer2_sel_win[2]
  4.   layer1_sel_win[1]
  5.   layer0_sel_win[0]
  6. win0:
  7.   state:0,   fmt:ARGB888,   y_vir:320,   uv_vir:320
  8.   xact: 320,   yact: 240,   dsp_x: 320,   dsp_y: 240,   x_st:   0,   y_st:   0
  9.   y_h_fac:    4096,   y_v_fac:    4096,   uv_h_fac:    4096,   uv_v_fac:    4096
  10.   y_addr: 0x00000000,   uv_addr:0x00000000
  11. win1:
  12.   state:1,   fmt:ARGB888,   y_vir:3840,   uv_vir:0
  13.   xact:1280,   yact: 720,   dsp_x:3840,   dsp_y:2160,   x_st:   0,   y_st:   0
  14.   y_h_fac:   21825,   y_v_fac:   21809,   uv_h_fac:    4096,   uv_v_fac:    4096
  15.   y_addr: 0x10000000,   uv_addr:0x00000000
  16. win2:
  17.   state:0
  18.   fmt:ARGB888
  19.   area0:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
  20.   area1:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
  21.   area2:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
  22.   area3:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
  23. win3:
  24.   state:0
  25.   fmt:ARGB888
  26.   area0:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
  27.   area1:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0   addr:0x00000000
  28.   area2:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
  29.   area3:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
复制代码


马上 reboot 后变成
  1. z-order:
  2.   layer3_sel_win[3]
  3.   layer2_sel_win[2]
  4.   layer1_sel_win[1]
  5.   layer0_sel_win[0]
  6. win0:
  7.   state:0,   fmt:ARGB888,   y_vir:320,   uv_vir:320
  8.   xact: 320,   yact: 240,   dsp_x: 320,   dsp_y: 240,   x_st:   0,   y_st:   0
  9.   y_h_fac:    4096,   y_v_fac:    4096,   uv_h_fac:    4096,   uv_v_fac:    4096
  10.   y_addr: 0x00000000,   uv_addr:0x00000000
  11. win1:
  12.   state:1,   fmt:ARGB888,   y_vir:3840,   uv_vir:0
  13.   xact:1920,   yact:1080,   dsp_x:3840,   dsp_y:2160,   x_st:   0,   y_st:   0
  14.   y_h_fac:   32750,   y_v_fac:   32737,   uv_h_fac:    4096,   uv_v_fac:    4096
  15.   y_addr: 0x13f48000,   uv_addr:0x00000000
  16. win2:
  17.   state:0
  18.   fmt:ARGB888
  19.   area0:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
  20.   area1:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
  21.   area2:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
  22.   area3:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
  23. win3:
  24.   state:0
  25.   fmt:ARGB888
  26.   area0:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
  27.   area1:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0   addr:0x00000000
  28.   area2:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
  29.   area3:  state:0,  y_vir: 320,  dsp_x: 320,  dsp_y: 240,  x_st:   0,  y_st:   0,  addr:0x00000000
复制代码

重启过程可以看到 屏幕中央的 android 图标 明显变小很多, 似乎4k 有效了, 但是进入android 后,第一次是720p 分辨率, 之后重启都是1080p,貌似android 系统拒绝了4k模式?
作者: isle    时间: 2014-11-21 10:50
依照你的描述 应该是kernel已经生效了。android做了限制。
我在ubuntu上试过了。FB 4K是没问题。
这个需要android上层修改。可能比较麻烦点。
我先找找有没有解决方案吧。
作者: connet    时间: 2014-11-21 11:23
android 本身限制应该没有,2013 年开始 android 就支持高分辨率了。现在一些平板手机超过1080p.
贴上log
  1. [root@victor ApiDemos]# adb logcat|egrep '(384|192|128)0'
  2. D/Displaymanager(  138): [display_list_add] display 0 iface HDMI connect 1 enable 1 mode 3840x2160p-30
  3. D/Displaymanager(  138): [display_list_add] display 0 iface VGA connect 1 enable 0 mode 1920x1080p-60
  4. D/Displaymanager(  138): read cfg: display=0,iface=4,enable=1,mode=3840x2160p-25
  5. D/Displaymanager(  138): [readConfig] display 0 iface 4 connect 1 enable 1 mode 3840x2160p-25
  6. D/Displaymanager(  138): read cfg: display=0,iface=3,enable=0,mode=1920x1080p-60
  7. D/Displaymanager(  138): [readConfig] display 0 iface 3 connect 1 enable 0 mode 1920x1080p-60
  8. D/Displaymanager(  138): [operateIfaceMode] property 0 iface 4 type 1 mode 3840x2160p-25
  9. I/[Gralloc](  142): xres         = 3840 px
  10. I/[Gralloc](  142): xres_virtual = 3840 px
  11. D/hwcomposer(  142): set default fake ui size 1280x720
  12. D/hwcomposer(  142): hwc_getDisplayAttributes disp = 0, width = 3840
  13. D/BootAnimation(  447): DISPLAY,W-H: 3840-2160, ori: 0
  14. D/CameraHal(  145): ParserDVConfig(667):  DV_720P(720p) resolution(1280x720) fps(10) support(0)
  15. D/CameraHal(  145): ParserDVConfig(679):  DV_1080P(1080p) resolution(1920x1080) fps(10) support(0)
  16. D/CameraHal(  145): ParserDVConfig(667):  DV_720P(720p) resolution(1280x720) fps(10) support(1)
  17. D/CameraHal(  145): ParserDVConfig(679):  DV_1080P(1080p) resolution(1920x1080) fps(10) support(1)
  18. D/SensorService(  470): Max socket buffer size 163840
  19. I/DisplayManagerService(  470): Display device added: DisplayDeviceInfo{"Built-in Screen": 3840 x 2160, 60.000004 fps, density 160, 159.895 x 159.953 dpi, touch INTERNAL, rotation 0, type BUILT_IN, FLAG_DEFAULT_DISPLAY, FLAG_ROTATES_WITH_CONTENT, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS}
  20. D/Environment(  470): screen raw size:3840,2160
  21. D/Environment(  470): screen raw size:3840,2160
  22. D/Environment(  470): screen raw size:3840,2160
  23. D/Environment(  470): screen raw size:3840,2160
  24. D/Environment(  470): screen raw size:3840,2160
  25. D/qiuen   (  470): >>>CURRENT DISPLAY SIZE: 1920x1080
  26. I/qiuen   (  470): FORCED DISPLAY SIZE: 1920x1080
  27. I/ActivityManager(  470): Config changes=1df8 {1.0 ?mcc?mnc en_US ldltr sw1080dp w1920dp h1080dp 160dpi xlrg long land ?uimode ?night -touch -keyb/v/h -nav/h s.2}
  28. I/ActivityManager(  470): Config changes=400 {1.0 ?mcc?mnc en_US ldltr sw1080dp w1920dp h1007dp 160dpi xlrg long land ?uimode ?night -touch -keyb/v/h -nav/h s.3}
  29. I/ActivityManager(  470): Config changes=200 {1.0 ?mcc?mnc en_US ldltr sw1080dp w1920dp h1007dp 160dpi xlrg long land -touch -keyb/v/h -nav/h s.4}
  30. D/Environment(  470): screen raw size:1920,1080
  31. I/ActivityManager(  470): Config changes=60 {1.0 ?mcc?mnc en_US ldltr sw1080dp w1920dp h1007dp 160dpi xlrg long land -touch -keyb/v/h dpad/v s.5}
  32. D/Environment(  470): screen raw size:1920,1080
  33. D/Environment(  470): screen raw size:1920,1080
  34. D/DisplayOutputManager(  470): setDisplaySize 0 1920 1080
  35. D/Displaymanager(  138): switchFramebuffer display 0 new res is x 1920 y 1080
  36. D/DisplayDeviceManagementService(  470): send cmd utils switchfb 0 1920x1080

复制代码

貌似是进入ui 后 才强制到1080p.
作者: isle    时间: 2014-11-21 11:31
额,我的意思是这个sdk上的android上层displaymanager 做了限制。不是说android原生的限制。

作者: bunchen    时间: 2014-11-24 10:23
试一下在frameworks/base/services/java/com/android/server/wm/WindowManagerService.java

  1. public void displayReady() {
  2.         displayReady(Display.DEFAULT_DISPLAY);

  3.         synchronized(mWindowMap) {
  4.             final DisplayContent displayContent = getDefaultDisplayContentLocked();
  5.             readForcedDisplaySizeAndDensityLocked(displayContent);
  6.             mDisplayReady = true;
  7.         }

  8.         try {
  9.             mActivityManager.updateConfiguration(null);
  10.         } catch (RemoteException e) {
  11.         }

  12.         synchronized(mWindowMap) {
  13.             mIsTouchDevice = mContext.getPackageManager().hasSystemFeature(
  14.                     PackageManager.FEATURE_TOUCHSCREEN);
  15.             configureDisplayPolicyLocked(getDefaultDisplayContentLocked());
  16.         }

  17.         try {
  18.             mActivityManager.updateConfiguration(null);
  19.         } catch (RemoteException e) {
  20.         }
  21.     }
复制代码


注释掉
readForcedDisplaySizeAndDensityLocked(displayContent);
貌似就是这里强制成1080p了。

  1. private void readForcedDisplaySizeAndDensityLocked(final DisplayContent displayContent) {
  2.       //$_rbox_$_modify_$_qiuen begin,add switch framebuffer size
  3.         String displaypolicy = SystemProperties.get("persist.sys.display.policy", "manual");
  4.             if (displaypolicy.equals("auto") == true) {
  5.                     Point ssize= new Point();
  6.                     synchronized(displayContent.mDisplaySizeLock) {
  7.                             ssize.x = displayContent.mBaseDisplayWidth;
  8.                             ssize.y = displayContent.mBaseDisplayHeight;
  9.                     }
  10.             getCurScreenSize(Display.DEFAULT_DISPLAY, ssize);
  11.                 Slog.d("qiuen", ">>>CURRENT DISPLAY SIZE: " + ssize.x + "x" + ssize.y);
  12.                 synchronized(displayContent.mDisplaySizeLock) {
  13.                         if (displayContent.mBaseDisplayWidth != ssize.x
  14.                         || displayContent.mBaseDisplayHeight != ssize.y) {
  15.                         Slog.i("qiuen", "FORCED DISPLAY SIZE: " + ssize.x + "x" + ssize.y);
  16.                         displayContent.mBaseDisplayWidth = ssize.x;
  17.                         displayContent.mBaseDisplayHeight = ssize.y;
  18.                         }
  19.                     }
  20.       //$_rbox_$_modify_$_end      
  21.         }else{
  22.         String sizeStr = Settings.Global.getString(mContext.getContentResolver(),
  23.                 Settings.Global.DISPLAY_SIZE_FORCED);
  24.         if (sizeStr == null || sizeStr.length() == 0) {
  25.             sizeStr = SystemProperties.get(SIZE_OVERRIDE, null);
  26.         }
  27.         if (sizeStr != null && sizeStr.length() > 0) {
  28.             final int pos = sizeStr.indexOf(',');
  29.             if (pos > 0 && sizeStr.lastIndexOf(',') == pos) {
  30.                 int width, height;
  31.                 try {
  32.                     width = Integer.parseInt(sizeStr.substring(0, pos));
  33.                     height = Integer.parseInt(sizeStr.substring(pos+1));
  34.                     synchronized(displayContent.mDisplaySizeLock) {
  35.                         if (displayContent.mBaseDisplayWidth != width
  36.                                 || displayContent.mBaseDisplayHeight != height) {
  37.                             Slog.i(TAG, "FORCED DISPLAY SIZE: " + width + "x" + height);
  38.                             displayContent.mBaseDisplayWidth = width;
  39.                             displayContent.mBaseDisplayHeight = height;
  40.                         }
  41.                     }
  42.                 } catch (NumberFormatException ex) {
  43.                 }
  44.             }
  45.         }
  46.         }


  47.         String densityStr = Settings.Global.getString(mContext.getContentResolver(),
  48.                 Settings.Global.DISPLAY_DENSITY_FORCED);
  49.         if (densityStr == null || densityStr.length() == 0) {
  50.             densityStr = SystemProperties.get(DENSITY_OVERRIDE, null);
  51.         }
  52.         if (densityStr != null && densityStr.length() > 0) {
  53.             int density;
  54.             try {
  55.                 density = Integer.parseInt(densityStr);
  56.                 synchronized(displayContent.mDisplaySizeLock) {
  57.                     if (displayContent.mBaseDisplayDensity != density) {
  58.                         Slog.i(TAG, "FORCED DISPLAY DENSITY: " + density);
  59.                         displayContent.mBaseDisplayDensity = density;
  60.                     }
  61.                 }
  62.             } catch (NumberFormatException ex) {
  63.             }
  64.         }
  65.     }
复制代码

作者: isle    时间: 2014-11-24 10:56
  1. win1:
  2.   state:1,   fmt:ARGB888,   y_vir:3840,   uv_vir:0
  3.   xact:3840,   yact:2160,   dsp_x:3840,   dsp_y:2160,   x_st:   0,   y_st:   0
  4.   y_h_fac:    4096,   y_v_fac:    4096,   uv_h_fac:    4096,   uv_v_fac:    4096
  5.   y_addr: 0x13f48000,   uv_addr:0x00000000
复制代码


楼上正解。亲测有效!
作者: connet    时间: 2014-11-24 15:41
确实如此,那个 里面那个 getCurScreenSize 读 /sys/class/graphic/fb0/disp_info 过滤了 1080 以上的
作者: connet    时间: 2014-11-24 17:36
测试发现只修改 getCurScreenSize 还不够,切换分辨率之后回不到4k,原来
frameworks/base/core/java/android/os/DisplayOutputManager.java 中 setMode 也限制了1080p
修改后切换分辨率回4k正常
  1.                 if (n <= 720){
  2.                   m = 1280;
  3.                   n = 720;
  4.                 } else if (n > 2160) {
  5.                   m = 1920;
  6.                   n = 1080;
  7.                 } else if ( (m==3840&&n==2160)|| (m==1920&&n==1080)||(m == 1680 && n == 1050) ||(m == 1600 && n == 900) || (m == 1440 && n == 900) || (m == 1366 && n == 768)|| (m == 1024 && n == 768)|| (m == 800 && n == 600)) {
  8.                     //Oh no
  9.                     ;
  10.                 } else {
  11.                   m = 1280;
  12.                   n = 720;
  13.                 }
复制代码

作者: fadeer    时间: 2014-11-26 15:55
有人试过Linux下HDMI输出2560x1080分辨率么?
作者: isle    时间: 2014-11-28 09:07
ubuntu上hdmi输出4K (3840*2160)都没问题的。2560*1080应该也没问题的。改下驱动就可以的。楼上可以自己试下。
作者: 萧瑶    时间: 2015-9-18 05:58
connet 发表于 2014-11-24 17:36
测试发现只修改 getCurScreenSize 还不够,切换分辨率之后回不到4k,原来
frameworks/base/core/java/andr ...

前辈,我想在安卓系统里增加2560*1440的分辨率跟1440*2560分辨率,我有个VR眼镜必须指定这个分辨率才能点亮,我刚刚接触开发板这个东西,对安卓以前是一窍不通,能否指点一下增加以上两个分辨率的具体办法?感激不尽。
作者: 萧瑶    时间: 2015-9-18 06:03
本帖最后由 萧瑶 于 2015-9-18 06:07 编辑
connet 发表于 2014-11-24 17:36
测试发现只修改 getCurScreenSize 还不够,切换分辨率之后回不到4k,原来
frameworks/base/core/java/andr ...

cht2能否直接帮忙把原系统必须修改的两个地方的代码直接修改后提供一下我自己研究怎么去替换。因为以我现在的水平要直接自己编译代码的话距离还很遥远。
作者: openeyes    时间: 2015-9-18 08:30
這個開發板要自行改變code裡沒設定的timing,是很困難的.
沒有任何的技術文件,你的需求,我猜你弄出不來,連這裡的大大們也都弄出不來,
這方面的討論也太多了,就是沒結果.
作者: bzhao    时间: 2016-7-16 22:26
ui 本身是按照1080p设计的,没有4k的ui, 就是显示为4k,也要把1080p的zoom到4k显示, 这样4k的ui 意义不大了! 除非自己设计4k的ui
如果显示4k视频和图片都正常就可以了!
不知我说的是否正确?!
作者: csworld    时间: 2017-3-11 13:49
视频是真4k,ui是放大到4k
作者: godfather516    时间: 2017-3-23 15:55
csworld 发表于 2017-3-11 13:49
视频是真4k,ui是放大到4k

你好,请问RK3288支持1080*2560的分辨率吗?
作者: dianziit    时间: 2017-3-23 17:36
把 cat /sys/class/graphics/fb0/disp_info 信息贴上来
作者: szwifi    时间: 2017-3-27 09:42
就怕2K转4K输出的假4K
作者: lnjaqg    时间: 2017-3-31 16:33
bunchen 发表于 2014-11-24 10:23
试一下在frameworks/base/services/java/com/android/server/wm/WindowManagerService.java

厉害了,赞,感谢




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