framework 分辨率的配置流程

1.设置的源码-创建DisplayOutputManager实例
try {
        	mDisplayManagement = new DisplayOutputManager();
        }catch (RemoteException doe) {
            doe.printStackTrace();
        }
2.设置的源码-设置分辨率
public void saveVideoMode(String videoMode){
		Logger.d(TAG , "saveVideoMode, displayIntf = "+mMainDisplay_set+", videoMode = "+videoMode);
		mDisplayManagement.setMode(mDisplayManagement.MAIN_DISPLAY,mMainDisplay_set, videoMode);
		mDisplayManagement.setInterface(mDisplayManagement.MAIN_DISPLAY,mMainDisplay_set, true);
		mUIHandler.postDelayed(new Runnable() {
			@Override
			public void run() {
				mDisplayManagement.saveConfig();
			}
		}, 3000);
	}
3.framework-DisplayOutputManager.java
public int saveConfig()
	{
		try {
			return mService.saveConfig();
		} catch (Exception e) {
			Log.e(TAG, "Error save :" + e);
			return -1;
		}
	}
public DisplayOutputManager() throws RemoteException {
		IBinder b = ServiceManager.getService("display_device_management");
		if(b == null) {
			Log.e(TAG, "Unable to connect to display device management service! - is it running yet?");
			return;
		}
		mWM = IWindowManager.Stub.asInterface(ServiceManager.checkService(
        						Context.WINDOW_SERVICE));
		mService = IDisplayDeviceManagementService.Stub.asInterface(b);
		try {
			// Get main display interface
			String[] display_iface = mService.listInterfaces(MAIN_DISPLAY);
			if(DBG) Log.d(TAG, "main display iface num is " + display_iface.length);
			if(display_iface != null && display_iface.length > 0) {
				m_main_iface = new int[display_iface.length];
				for(int i = 0; i < m_main_iface.length; i++) {
					if(DBG) Log.d(TAG, display_iface[i]);
					m_main_iface[i] = ifacetotype(display_iface[i]);
				}
			}
			else
				m_main_iface = null;

			// Get aux display interface
			display_iface = mService.listInterfaces(AUX_DISPLAY);
			if(DBG) Log.d(TAG, "aux display iface num is " + display_iface.length);
			if(display_iface != null && display_iface.length > 0) {
				m_aux_iface = new int[display_iface.length];
				for(int i = 0; i < m_aux_iface.length; i++) {
					if(DBG) Log.d(TAG, display_iface[i]);
					m_aux_iface[i] = ifacetotype(display_iface[i]);
				}
			}
			else
				m_aux_iface = null;

        } catch (Exception e) {
            Log.e(TAG, "Error listing Interfaces :" + e);
            return;
        }
	}
4.framework-SystemServer.java
try {
            	Slog.i(TAG, "DisplayDeviceManagementService Service");
                ServiceManager.addService(
                        "display_device_management",
                        new DisplayDeviceManagementService(context));
            } catch (Throwable e) {
                Slog.e(TAG, "Failure starting DisplayDeviceManagementService Service", e);
            }
5.framework-DisplayDeviceManagementService.java
/**
	 * Constructs a new NetworkManagementService instance
	 *
	 * @param context  Binder context for this service
	 */
	public DisplayDeviceManagementService(Context context) {
		mContext = context;

		if ("simulator".equals(SystemProperties.get("ro.product.device"))) {
			return;
		}
		IntentFilter hdmiFilter = new IntentFilter();
		hdmiFilter.addAction(ACTION_PLUGGED);
		hdmiFilter.addAction(ACTION_CHANGE);
                hdmiFilter.addAction("android.intent.action.DISPLAY_TOAST");
		hdmiFilter.addAction(ACTION_TV_STANDBY);
		mHdmiReceiver = new HdmiReceiver();
		mContext.registerReceiver(mHdmiReceiver,hdmiFilter);
		mConnector = new NativeDaemonConnector(
				new DisplaydCallbackReceiver(), "displayd", 50, DISPLAYD_TAG, 160);
		Thread thread = new Thread(mConnector, DISPLAYD_TAG);
		thread.start();
		if(DBG) Slog.d(TAG, "DisplayDeviceManagementService start");
	}
6.mk文件搜索displayd:find ./ -name "*.mk" | xargs grep -rn displayd
599
7.经过上一步搜索,/system/displayd/模块下搜索:grep -rn "saveConfig" ./
600
8.分析DisplayManager.cpp的saveConfig方法即可
void DisplayManager::saveConfig(void) {
	FILE *fd = NULL;
	struct displaynode *node;
	char buf[BUFFER_LENGTH];
	char tvdpi[BUFFER_LENGTH];
	struct file_base_paramer base_paramer;

	memset(&base_paramer,0,sizeof(base_paramer));

	fd = fopen(DISPLAY_CONFIG_FILE, "w");

	if(fd != NULL) {
		for(node = main_display_list; node != NULL; node = node->next) {
			memset(node->savemode, 0, MODE_LENGTH);
			memcpy(node->savemode, node->mode, MODE_LENGTH);
		       memset(buf, 0 , BUFFER_LENGTH);
		       sprintf(buf, "display=%d,iface=%d,enable=%d,mode=%s\n", node->property, node->type, node->enable, node->mode);
		       fwrite(buf, 1, strlen(buf), fd);
		}
		for(node = aux_display_list; node != NULL; node = node->next) {
			memset(node->savemode, 0, MODE_LENGTH);
			memcpy(node->savemode, node->mode, MODE_LENGTH);
		       memset(buf, 0 , BUFFER_LENGTH);
		       sprintf(buf, "display=%d,iface=%d,enable=%d,mode=%s\n", node->property, node->type, node->enable, node->mode);
		       fwrite(buf, 1, strlen(buf), fd);
		}
		fflush(fd);
		fclose(fd);
	}
	sync();
	
	int file;
	const char *baseparameterfile = GetBaseparameterFile();
	if (!baseparameterfile) {
		ALOGW("base paramter file can not be find");
		return;
	}
	file = open(baseparameterfile, O_RDWR);
	if (file < 0) {
		ALOGW("base paramter file can not be opened");
		return;
	}
	// caculate file's size and read it
	unsigned int length = lseek(file, 0L, SEEK_END);
	lseek(file, 0L, SEEK_SET);
	if(length < sizeof(base_paramer)) {
		ALOGE("BASEPARAME data's length is error\n");
		close(file);
		return;
	}

	read(file, (void*)&base_paramer, sizeof(file_base_paramer));

	for(node = main_display_list; node != NULL; node = node->next) {
		if(node->type == DISPLAY_INTERFACE_HDMI) {
			if(node->mode) {
				base_paramer.hdmi.type = node->type;
				base_paramer.hdmi.interlaced = 0;

				if (strstr(node->mode, "YCbCr420"))
					base_paramer.hdmi.interlaced |= HDMI_VIDEO_YUV420;

				if (strchr(node->mode, 'p')) {
					sscanf(node->mode, "%dx%dp-%d",
					       &base_paramer.hdmi.xres,
					       &base_paramer.hdmi.yres,
					       &base_paramer.hdmi.refresh);
				} else if (strchr(node->mode, 'i')) {
					sscanf(node->mode, "%dx%di-%d",
					       &base_paramer.hdmi.xres,
					       &base_paramer.hdmi.yres,
					       &base_paramer.hdmi.refresh);
					base_paramer.hdmi.interlaced |= 1;
				} else if (strcmp(node->mode,"auto") == 0) {
					base_paramer.hdmi.xres = 0;
					base_paramer.hdmi.yres = 0;
					base_paramer.hdmi.refresh = 0;
				}
				ALOGD("[%s] hdmi_mode %s\n", __FUNCTION__,node->mode);
			}
		} else if(node->type == DISPLAY_INTERFACE_TV) {
			if(node->mode) {
				sscanf(node->mode, "%dx%di-%d",
				       &base_paramer.tve.xres,
				       &base_paramer.tve.yres,
				       &base_paramer.tve.refresh);
				base_paramer.tve.interlaced = 1;
				ALOGD("[%s] tve_mode  %s\n", __FUNCTION__,node->mode);
			}
		}
	}
	lseek(file, 0L, SEEK_SET);
	write(file, (char*)(&base_paramer), sizeof(base_paramer));
	close(file);
	sync();

	ALOGD("[%s] hdmi:%d,%d,%d,%d,%d,%d\n", __FUNCTION__,
	base_paramer.hdmi.xres,
	base_paramer.hdmi.yres,
	base_paramer.hdmi.interlaced,
	base_paramer.hdmi.type,
	base_paramer.hdmi.refresh,
	base_paramer.hdmi.reserve);
	
	ALOGD("[%s] tve:%d,%d,%d,%d,%d,%d\n", __FUNCTION__,
	base_paramer.tve.xres,
	base_paramer.tve.yres,
	base_paramer.tve.interlaced,
	base_paramer.tve.type,
	base_paramer.tve.refresh,
	base_paramer.tve.reserve);
}
0

留下评论