android 显示和分辨率区别

来源:互联网 发布:反转二叉树c语言 编辑:程序博客网 时间:2024/06/05 13:21
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 0
原创粉丝点击