android 显示和分辨率区别

1、系统启动时:
/system/core/init/init_disp.c函数init_initdisplay()先是判断是否有HDMI的信号和其他信号输出然后交又函数init_swtichdisplay()处理。这里处理的事/dev/disp设备

2、点击设置界面的显示模式:
源码分为两种模式:
1)、不改变分辨率但是改变扫描的点数和刷新频率
打开设备/dev/disp,DISP_CMD_LAYER_SET_SCN_WINDOW等操作
包括HDMI等的控制
init_dispoutput()
DISP_CMD_HDMI_SET_MODE
DISP_CMD_HDMI_ON

驱动如下:
驱动drivers/video/sun4i/disp/dev_disp.c
实现drivers/video/sun4i/disp/de_bsp/de/disp_layer.c函数BSP_disp_layer_set_screen_window
drivers/video/sun4i/disp/de_bsp/de/disp_scaler.c函数Scaler_Set_Framebuffer

2)、改变实际的分辨率
在驱动中发现drivers/video/fbmem.c函数do_fb_ioctl()中得出设置fb大小的cmd是FBIOPUT_VSCREENINFO
Android源码中发现device\softwinner\crane-common\hardware\libhardware\display\Display.cpp中调用了ioctl(ctx->mFD_fb[fb_id],FBIOPUT_VSCREENINFO,&var);而此文件正是设置节目点击后进入的,只是选中了上面的模式。

display_changemode【设置界面调节,有进入此函数】
->display_singlechangemode->display_requestfb
出现本来1080p,调成720p是分成了3个界面,因为每次启动bootloader都会去修改framebuffer,并且在这里去改fb,已经初始化了界面,所以这里的修改有点晚了,但是在这里去kill掉surfaceflinger是可以实现分辨率调节的。所以设想应该是在系统启动第一个界面之前就修改好fb大小,这是想到init.c的初始化

接下来的问题是何处修改分辨率,满足如下条件
(1)、必须在surfaceflinger启动之前
(2)、必须在第一次操作fb之前
(3)、必须在驱动加载完毕
搜索整个Android源码,发现第一次使用fb的是
Init_disp.c (system\core\init):    sprintf(node, "/dev/graphics/fb%d", fb_id);
Logo.c (system\core\init):    fb->fd = open("/dev/graphics/fb0", O_RDWR);
发现第一次使用fb的事init进程,所以毫无疑问要在init中实现,但是发现系统启动到这个init.c的函数init_disp.c()时nand分区尚未挂载成功,所以想通过读取文件去修改分辨率是实现不了的,只能把参数传递给内核去修改sys_config1.fex。但是此处可以实现任意固定的分辨率。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值