external.cpp revision f402f149587c185267504f6eec780eb3fe010a55
10c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed/* 20c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project 356f610dd235b577725198e9341caae92379fdf23Saurabh Shah * Copyright (C) 2012, The Linux Foundation. All rights reserved. 40c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * 50c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Not a Contribution, Apache license notifications and license are 60c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * retained for attribution purposes only. 70c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * 80c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 90c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * you may not use this file except in compliance with the License. 100c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * You may obtain a copy of the License at 110c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * 120c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 130c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * 140c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Unless required by applicable law or agreed to in writing, software 150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 170c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * See the License for the specific language governing permissions and 180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * limitations under the License. 190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed */ 200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#define DEBUG 0 220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include <ctype.h> 2372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <fcntl.h> 240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include <media/IAudioPolicyService.h> 250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include <media/AudioSystem.h> 260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include <utils/threads.h> 270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include <utils/Errors.h> 280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include <utils/Log.h> 290c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 300c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include <linux/msm_mdp.h> 310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include <linux/fb.h> 320c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include <sys/ioctl.h> 330c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include <sys/poll.h> 3472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <sys/resource.h> 350c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include <cutils/properties.h> 360c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include "hwc_utils.h" 3756f610dd235b577725198e9341caae92379fdf23Saurabh Shah#include "external.h" 3856f610dd235b577725198e9341caae92379fdf23Saurabh Shah#include "overlayUtils.h" 39c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar#include "overlay.h" 4056f610dd235b577725198e9341caae92379fdf23Saurabh Shah 4156f610dd235b577725198e9341caae92379fdf23Saurabh Shahusing namespace android; 420c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 430c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmednamespace qhwc { 440c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 45c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar#define MAX_FRAME_BUFFER_NAME_SIZE (80) 46c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar#define MAX_DISPLAY_DEVICES (3) 47c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 48c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 49c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarconst char* msmFbDevicePath[] = { "/dev/graphics/fb1", 50c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar "/dev/graphics/fb2"}; 51c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 52c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar/* 53c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar * Updates extDeviceFbIndex Array with the correct frame buffer indices 54c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar * of avaiable external devices 55c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar * 56c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar */ 57c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::updateExtDispDevFbIndex() 58c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar{ 59c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar FILE *displayDeviceFP = NULL; 60c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar char fbType[MAX_FRAME_BUFFER_NAME_SIZE]; 61c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar char msmFbTypePath[MAX_FRAME_BUFFER_NAME_SIZE]; 62c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 63c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar for(int j = 1; j < MAX_DISPLAY_DEVICES; j++) { 64c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar sprintf (msmFbTypePath,"/sys/class/graphics/fb%d/msm_fb_type", j); 65c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar displayDeviceFP = fopen(msmFbTypePath, "r"); 66c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(displayDeviceFP){ 67c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar fread(fbType, sizeof(char), MAX_FRAME_BUFFER_NAME_SIZE, 68c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar displayDeviceFP); 69c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(strncmp(fbType, "dtv panel", strlen("dtv panel")) == 0){ 70c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"hdmi framebuffer index is %d",j); 71c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHdmiFbNum = j; 72c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } else if(strncmp(fbType, "writeback panel", 73c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar strlen("writeback panel")) == 0){ 74c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"wfd framebuffer index is %d",j); 75c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mWfdFbNum = j; 76c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 77c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar fclose(displayDeviceFP); 78c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 79c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 80c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"%s: mHdmiFbNum: %d mWfdFbNum: %d ",__FUNCTION__, 81c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHdmiFbNum, mWfdFbNum); 82c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 83c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 84c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarint ExternalDisplay::configureHDMIDisplay() { 85c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar openFrameBuffer(mHdmiFbNum); 86c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mFd == -1) 87c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return -1; 88c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar readResolution(); 89c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // TODO: Move this to activate 90f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R /* Used for changing the resolution 91f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R * getUserMode will get the preferred 92f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R * mode set thru adb shell */ 93f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R int mode = getUserMode(); 94f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R if (mode == -1) { 95f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R //Get the best mode and set 96f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R mode = getBestMode(); 97f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R } 98f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R setResolution(mode); 99c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setDpyHdmiAttr(); 100c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 101c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return 0; 102c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 103c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 104c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarint ExternalDisplay::configureWFDDisplay() { 105c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar int ret = 0; 106c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mHdmiFbNum) { 107c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: Cannot process WFD connection while HDMI is active", 108c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar __FUNCTION__); 109c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return -1; 110c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 111c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar openFrameBuffer(mWfdFbNum); 112c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mFd == -1) 113c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return -1; 114c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ret = ioctl(mFd, FBIOGET_VSCREENINFO, &mVInfo); 115c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(ret < 0) { 116c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD("In %s: FBIOGET_VSCREENINFO failed Err Str = %s", __FUNCTION__, 117c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar strerror(errno)); 118c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 119c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setDpyWfdAttr(); 120c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(true, mWfdFbNum); 121c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return 0; 122c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 123c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 124c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarint ExternalDisplay::teardownHDMIDisplay() { 125c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mHdmiFbNum) { 126c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // hdmi offline event..! 127c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar closeFrameBuffer(); 128c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar resetInfo(); 129c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(false); 130c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 131c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return 0; 132c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 1330c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 134c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarint ExternalDisplay::teardownWFDDisplay() { 135c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mWfdFbNum) { 136c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // wfd offline event..! 137c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar closeFrameBuffer(); 138c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar memset(&mVInfo, 0, sizeof(mVInfo)); 139c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(false); 140c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 141c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return 0; 142c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 1430c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 144c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::processUEventOnline(const char *str) { 145c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar const char *s1 = str + strlen("change@/devices/virtual/switch/"); 146c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(!strncmp(s1,"hdmi",strlen(s1))) { 147c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // hdmi online event..! 148c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar configureHDMIDisplay(); 149c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar }else if(!strncmp(s1,"wfd",strlen(s1))) { 150c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // wfd online event..! 151c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar configureWFDDisplay(); 152c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 153c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 1540c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 155c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::processUEventOffline(const char *str) { 156c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar const char *s1 = str + strlen("change@/devices/virtual/switch/"); 157c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(!strncmp(s1,"hdmi",strlen(s1))) { 158c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar teardownHDMIDisplay(); 159c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar }else if(!strncmp(s1,"wfd",strlen(s1))) { 160c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar teardownWFDDisplay(); 161c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 162c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 1630c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 164f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer AhmedExternalDisplay::ExternalDisplay(hwc_context_t* ctx):mFd(-1), 165c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mCurrentMode(-1), mConnected(0), mConnectedFbNum(0), mModeCount(0), 166c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext(ctx), mHdmiFbNum(-1), mWfdFbNum(-1) 1670c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 168f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed memset(&mVInfo, 0, sizeof(mVInfo)); 169c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar //Determine the fb index for external display devices. 170c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar updateExtDispDevFbIndex(); 1710c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 1720c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 17356f610dd235b577725198e9341caae92379fdf23Saurabh Shahvoid ExternalDisplay::setEDIDMode(int resMode) { 17456f610dd235b577725198e9341caae92379fdf23Saurabh Shah ALOGD_IF(DEBUG,"resMode=%d ", resMode); 17556f610dd235b577725198e9341caae92379fdf23Saurabh Shah { 17656f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 177c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(false); 178c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar openFrameBuffer(mHdmiFbNum); 17956f610dd235b577725198e9341caae92379fdf23Saurabh Shah setResolution(resMode); 18056f610dd235b577725198e9341caae92379fdf23Saurabh Shah } 181c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 18256f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 18356f610dd235b577725198e9341caae92379fdf23Saurabh Shah 18456f610dd235b577725198e9341caae92379fdf23Saurabh Shahvoid ExternalDisplay::setHPD(uint32_t startEnd) { 18556f610dd235b577725198e9341caae92379fdf23Saurabh Shah ALOGD_IF(DEBUG,"HPD enabled=%d", startEnd); 18656f610dd235b577725198e9341caae92379fdf23Saurabh Shah writeHPDOption(startEnd); 18756f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 18856f610dd235b577725198e9341caae92379fdf23Saurabh Shah 18956f610dd235b577725198e9341caae92379fdf23Saurabh Shahvoid ExternalDisplay::setActionSafeDimension(int w, int h) { 19056f610dd235b577725198e9341caae92379fdf23Saurabh Shah ALOGD_IF(DEBUG,"ActionSafe w=%d h=%d", w, h); 19156f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 19256f610dd235b577725198e9341caae92379fdf23Saurabh Shah overlay::utils::ActionSafe::getInstance()->setDimension(w, h); 193c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 19456f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 19556f610dd235b577725198e9341caae92379fdf23Saurabh Shah 19656f610dd235b577725198e9341caae92379fdf23Saurabh Shahint ExternalDisplay::getModeCount() const { 19756f610dd235b577725198e9341caae92379fdf23Saurabh Shah ALOGD_IF(DEBUG,"HPD mModeCount=%d", mModeCount); 19856f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 19956f610dd235b577725198e9341caae92379fdf23Saurabh Shah return mModeCount; 20056f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 20156f610dd235b577725198e9341caae92379fdf23Saurabh Shah 20256f610dd235b577725198e9341caae92379fdf23Saurabh Shahvoid ExternalDisplay::getEDIDModes(int *out) const { 20356f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 20456f610dd235b577725198e9341caae92379fdf23Saurabh Shah for(int i = 0;i < mModeCount;i++) { 20556f610dd235b577725198e9341caae92379fdf23Saurabh Shah out[i] = mEDIDModes[i]; 20656f610dd235b577725198e9341caae92379fdf23Saurabh Shah } 20756f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 20856f610dd235b577725198e9341caae92379fdf23Saurabh Shah 20972cf9762f84aab07faab86e35fe830b63ec54d72Naseer AhmedExternalDisplay::~ExternalDisplay() 21072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{ 211f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed closeFrameBuffer(); 2120c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 2130c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2140c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmedstruct disp_mode_timing_type { 2150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int video_format; 2160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2170c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int active_h; 2180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int active_v; 2190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int front_porch_h; 2210c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int pulse_width_h; 2220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int back_porch_h; 2230c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int front_porch_v; 2250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int pulse_width_v; 2260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int back_porch_v; 2270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int pixel_freq; 2290c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed bool interlaced; 2300c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed void set_info(struct fb_var_screeninfo &info) const; 2320c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; 2330c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2340c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmedvoid disp_mode_timing_type::set_info(struct fb_var_screeninfo &info) const 2350c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 2360c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.reserved[0] = 0; 2370c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.reserved[1] = 0; 2380c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.reserved[2] = 0; 23956f610dd235b577725198e9341caae92379fdf23Saurabh Shah info.reserved[3] = (info.reserved[3] & 0xFFFF) | (video_format << 16); 2400c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2410c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.xoffset = 0; 2420c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.yoffset = 0; 2430c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.xres = active_h; 2440c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.yres = active_v; 2450c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2460c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.pixclock = pixel_freq*1000; 2470c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.vmode = interlaced ? FB_VMODE_INTERLACED : FB_VMODE_NONINTERLACED; 2480c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2490c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.right_margin = front_porch_h; 2500c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.hsync_len = pulse_width_h; 2510c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.left_margin = back_porch_h; 2520c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.lower_margin = front_porch_v; 2530c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.vsync_len = pulse_width_v; 2540c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.upper_margin = back_porch_v; 2550c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 2560c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2570c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed/* Video formates supported by the HDMI Standard */ 2580c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed/* Indicates the resolution, pix clock and the aspect ratio */ 2590c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m640x480p60_4_3 1 2600c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m720x480p60_4_3 2 2610c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m720x480p60_16_9 3 2620c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1280x720p60_16_9 4 2630c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080i60_16_9 5 2640c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1440x480i60_4_3 6 2650c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1440x480i60_16_9 7 2660c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p60_16_9 16 2670c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m720x576p50_4_3 17 2680c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m720x576p50_16_9 18 2690c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1280x720p50_16_9 19 2700c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1440x576i50_4_3 21 2710c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1440x576i50_16_9 22 2720c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p50_16_9 31 2730c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p24_16_9 32 2740c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p25_16_9 33 2750c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p30_16_9 34 2760c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2770c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmedstatic struct disp_mode_timing_type supported_video_mode_lut[] = { 2780c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m640x480p60_4_3, 640, 480, 16, 96, 48, 10, 2, 33, 25200, false}, 2790c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m720x480p60_4_3, 720, 480, 16, 62, 60, 9, 6, 30, 27030, false}, 2800c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m720x480p60_16_9, 720, 480, 16, 62, 60, 9, 6, 30, 27030, false}, 2810c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1280x720p60_16_9, 1280, 720, 110, 40, 220, 5, 5, 20, 74250, false}, 2820c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080i60_16_9, 1920, 540, 88, 44, 148, 2, 5, 5, 74250, false}, 2830c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1440x480i60_4_3, 1440, 240, 38, 124, 114, 4, 3, 15, 27000, true}, 2840c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1440x480i60_16_9, 1440, 240, 38, 124, 114, 4, 3, 15, 27000, true}, 2850c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p60_16_9, 1920, 1080, 88, 44, 148, 4, 5, 36, 148500, false}, 2860c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m720x576p50_4_3, 720, 576, 12, 64, 68, 5, 5, 39, 27000, false}, 2870c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m720x576p50_16_9, 720, 576, 12, 64, 68, 5, 5, 39, 27000, false}, 2880c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1280x720p50_16_9, 1280, 720, 440, 40, 220, 5, 5, 20, 74250, false}, 2890c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1440x576i50_4_3, 1440, 288, 24, 126, 138, 2, 3, 19, 27000, true}, 2900c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1440x576i50_16_9, 1440, 288, 24, 126, 138, 2, 3, 19, 27000, true}, 2910c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p50_16_9, 1920, 1080, 528, 44, 148, 4, 5, 36, 148500, false}, 2920c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p24_16_9, 1920, 1080, 638, 44, 148, 4, 5, 36, 74250, false}, 2930c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p25_16_9, 1920, 1080, 528, 44, 148, 4, 5, 36, 74250, false}, 2940c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p30_16_9, 1920, 1080, 88, 44, 148, 4, 5, 36, 74250, false}, 2950c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; 29672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 297f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmedint ExternalDisplay::parseResolution(char* edidStr, int* edidModes) 2980c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 2990c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed char delim = ','; 3000c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int count = 0; 3010c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed char *start, *end; 3020c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // EDIDs are string delimited by ',' 3030c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // Ex: 16,4,5,3,32,34,1 3040c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // Parse this string to get mode(int) 3050c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed start = (char*) edidStr; 306f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed end = &delim; 307f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed while(*end == delim) { 308f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed edidModes[count] = (int) strtol(start, &end, 10); 3090c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed start = end+1; 3100c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed count++; 3110c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 312f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD_IF(DEBUG, "In %s: count = %d", __FUNCTION__, count); 313f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed for (int i = 0; i < count; i++) 314f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD_IF(DEBUG, "Mode[%d] = %d", i, edidModes[i]); 3150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return count; 3160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 317f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 31872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedbool ExternalDisplay::readResolution() 3190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 320c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar char sysFsEDIDFilePath[255]; 321c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar sprintf(sysFsEDIDFilePath , "/sys/devices/virtual/graphics/fb%d/edid_modes", 322c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHdmiFbNum); 323c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 324c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar int hdmiEDIDFile = open(sysFsEDIDFilePath, O_RDONLY, 0); 3250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int len = -1; 3260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 3270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (hdmiEDIDFile < 0) { 328f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGE("%s: edid_modes file '%s' not found", 329c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar __FUNCTION__, sysFsEDIDFilePath); 3300c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return false; 3310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } else { 3320c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed len = read(hdmiEDIDFile, mEDIDs, sizeof(mEDIDs)-1); 33372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ALOGD_IF(DEBUG, "%s: EDID string: %s length = %d", 33472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed __FUNCTION__, mEDIDs, len); 3350c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if ( len <= 0) { 336f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGE("%s: edid_modes file empty '%s'", 337c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar __FUNCTION__, sysFsEDIDFilePath); 3380c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3390c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed else { 3400c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed while (len > 1 && isspace(mEDIDs[len-1])) 3410c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed --len; 3420c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mEDIDs[len] = 0; 3430c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3440c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3450c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed close(hdmiEDIDFile); 3460c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(len > 0) { 347c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // Get EDID modes from the EDID strings 348f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mModeCount = parseResolution(mEDIDs, mEDIDModes); 34972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ALOGD_IF(DEBUG, "%s: mModeCount = %d", __FUNCTION__, 35072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed mModeCount); 3510c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3520c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 3530c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return (strlen(mEDIDs) > 0); 3540c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 3550c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 356c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarbool ExternalDisplay::openFrameBuffer(int fbNum) 3570c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 358f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if (mFd == -1) { 359c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mFd = open(msmFbDevicePath[fbNum-1], O_RDWR); 360f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if (mFd < 0) 361c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: %s is not available", __FUNCTION__, 362c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar msmFbDevicePath[fbNum-1]); 363c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mHwcContext) { 364c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].fd = mFd; 365c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 3663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 367f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return (mFd > 0); 368f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed} 369f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 370f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmedbool ExternalDisplay::closeFrameBuffer() 371f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed{ 372f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed int ret = 0; 373f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if(mFd > 0) { 374f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ret = close(mFd); 375f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mFd = -1; 3760c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(mHwcContext) { 3783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].fd = mFd; 3793e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 380f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return (ret == 0); 3810c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 3820c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 383f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed// clears the vinfo, edid, best modes 384f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmedvoid ExternalDisplay::resetInfo() 385f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed{ 386f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed memset(&mVInfo, 0, sizeof(mVInfo)); 387f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed memset(mEDIDs, 0, sizeof(mEDIDs)); 388f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed memset(mEDIDModes, 0, sizeof(mEDIDModes)); 389f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mModeCount = 0; 390f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mCurrentMode = -1; 391f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed} 3920c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 39372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedint ExternalDisplay::getModeOrder(int mode) 3940c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 395f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R // XXX: We dont support interlaced modes but having 396f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R // it here for for future 3970c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed switch (mode) { 3980c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed default: 3990c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1440x480i60_4_3: 4000c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 1; // 480i 4:3 4010c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1440x480i60_16_9: 4020c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 2; // 480i 16:9 4030c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1440x576i50_4_3: 4040c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 3; // i576i 4:3 4050c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1440x576i50_16_9: 4060c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 4; // 576i 16:9 4070c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m640x480p60_4_3: 4080c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 5; // 640x480 4:3 4090c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m720x480p60_4_3: 4100c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 6; // 480p 4:3 4110c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m720x480p60_16_9: 4120c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 7; // 480p 16:9 4130c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m720x576p50_4_3: 4140c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 8; // 576p 4:3 4150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m720x576p50_16_9: 4160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 9; // 576p 16:9 4170c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080i60_16_9: 4180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 10; // 1080i 16:9 4190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1280x720p50_16_9: 4200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 11; // 720p@50Hz 4210c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1280x720p60_16_9: 4220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 12; // 720p@60Hz 4230c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p24_16_9: 4240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 13; //1080p@24Hz 4250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p25_16_9: 4260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 14; //108-p@25Hz 4270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p30_16_9: 4280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 15; //1080p@30Hz 4290c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p50_16_9: 4300c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 16; //1080p@50Hz 4310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p60_16_9: 4320c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 17; //1080p@60Hz 43372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed } 4340c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 4350c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 436f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R/// Returns the user mode set(if any) using adb shell 437f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.Rint ExternalDisplay::getUserMode() { 438f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R /* Based on the property set the resolution */ 439f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R char property_value[PROPERTY_VALUE_MAX]; 440f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R property_get("hdmi.resolution", property_value, "-1"); 441f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R int mode = atoi(property_value); 442f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R // We dont support interlaced modes 443f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R if(isValidMode(mode) && !isInterlacedMode(mode)) { 444f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R ALOGD_IF("%s: setting the HDMI mode = %d", __FUNCTION__, mode); 445f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R return mode; 446f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R } 447f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R return -1; 448f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R} 449f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R 4500c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed// Get the best mode for the current HD TV 45172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedint ExternalDisplay::getBestMode() { 4520c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int bestOrder = 0; 4530c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int bestMode = m640x480p60_4_3; 45456f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 4550c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // for all the edid read, get the best mode 4560c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed for(int i = 0; i < mModeCount; i++) { 4570c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int mode = mEDIDModes[i]; 4580c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int order = getModeOrder(mode); 4590c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (order > bestOrder) { 4600c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed bestOrder = order; 4610c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed bestMode = mode; 4620c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 4630c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 4640c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return bestMode; 46572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed} 4660c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 46772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedinline bool ExternalDisplay::isValidMode(int ID) 4680c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 469f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R bool valid = false; 470f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R for (int i = 0; i < mModeCount; i++) { 471f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R if(ID == mEDIDModes[i]) { 472f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R valid = true; 473f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R break; 474f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R } 475f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R } 476f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R return valid; 477f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R} 478f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R 479f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R// returns true if the mode(ID) is interlaced mode format 480f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.Rbool ExternalDisplay::isInterlacedMode(int ID) { 481f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R bool interlaced = false; 482f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R switch(ID) { 483f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R case m1440x480i60_4_3: 484f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R case m1440x480i60_16_9: 485f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R case m1440x576i50_4_3: 486f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R case m1440x576i50_16_9: 487f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R case m1920x1080i60_16_9: 488f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R interlaced = true; 489f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R default: 490f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R interlaced = false; 491f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R } 492f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R return interlaced; 4930c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 4940c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 49572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedvoid ExternalDisplay::setResolution(int ID) 4960c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 4970c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed struct fb_var_screeninfo info; 498f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed int ret = 0; 499f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ret = ioctl(mFd, FBIOGET_VSCREENINFO, &mVInfo); 500f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if(ret < 0) { 501f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD("In %s: FBIOGET_VSCREENINFO failed Err Str = %s", __FUNCTION__, 502f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed strerror(errno)); 503f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed } 504f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 505f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD_IF(DEBUG, "%s: GET Info<ID=%d %dx%d (%d,%d,%d)," 506f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed "(%d,%d,%d) %dMHz>", __FUNCTION__, 507f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.reserved[3], mVInfo.xres, mVInfo.yres, 508f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin, 509f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin, 510f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.pixclock/1000/1000); 511f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R //If its a new ID - update var_screeninfo 512f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if ((isValidMode(ID)) && mCurrentMode != ID) { 5130c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed const struct disp_mode_timing_type *mode = 51472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed &supported_video_mode_lut[0]; 5150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed unsigned count = sizeof(supported_video_mode_lut)/sizeof 51672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed (*supported_video_mode_lut); 5170c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed for (unsigned int i = 0; i < count; ++i) { 5180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed const struct disp_mode_timing_type *cur = 51972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed &supported_video_mode_lut[i]; 5200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (cur->video_format == ID) 5210c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mode = cur; 5220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 523f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mode->set_info(mVInfo); 524f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD_IF(DEBUG, "%s: SET Info<ID=%d => Info<ID=%d %dx %d" 52572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed "(%d,%d,%d), (%d,%d,%d) %dMHz>", __FUNCTION__, ID, 526f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.reserved[3], mVInfo.xres, mVInfo.yres, 527f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin, 528f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin, 529f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.pixclock/1000/1000); 530f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_ALL | FB_ACTIVATE_FORCE; 531f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ret = ioctl(mFd, FBIOPUT_VSCREENINFO, &mVInfo); 532f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if(ret < 0) { 533f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD("In %s: FBIOPUT_VSCREENINFO failed Err Str = %s", 534f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed __FUNCTION__, strerror(errno)); 535f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed } 536f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mCurrentMode = ID; 5370c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 5380c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 5390c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 540c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setExternalDisplay(bool connected, int extFbNum) 5410c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 5420c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed hwc_context_t* ctx = mHwcContext; 5430c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(ctx) { 544c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG, "%s: connected = %d", __FUNCTION__, connected); 5450c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // Store the external display 546c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mConnected = connected; 547c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mConnectedFbNum = extFbNum; 548c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].connected = connected; 549c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // Update external fb number in Overlay context 550c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar overlay::Overlay::getInstance()->setExtFbNum(extFbNum); 5510c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 552c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 553c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 554c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarint ExternalDisplay::getExtFbNum(int &fbNum) { 555c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar int ret = -1; 556c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mConnected) { 557c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar fbNum = mConnectedFbNum; 558c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ret = 0; 559c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 560c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return ret; 5610c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 5620c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 56372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedbool ExternalDisplay::writeHPDOption(int userOption) const 5640c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 5650c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed bool ret = true; 566c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar char sysFsHPDFilePath[255]; 567c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar sprintf(sysFsHPDFilePath ,"/sys/devices/virtual/graphics/fb%d/hpd", 568c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHdmiFbNum); 569c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar int hdmiHPDFile = open(sysFsHPDFilePath,O_RDWR, 0); 5700c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (hdmiHPDFile < 0) { 571c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: state file '%s' not found : ret%d err str: %s", __FUNCTION__, 572c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar sysFsHPDFilePath, hdmiHPDFile, strerror(errno)); 5730c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed ret = false; 5740c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } else { 5750c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int err = -1; 576c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG, "%s: option = %d", __FUNCTION__, userOption); 5770c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(userOption) 5780c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed err = write(hdmiHPDFile, "1", 2); 5790c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed else 5800c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed err = write(hdmiHPDFile, "0" , 2); 5810c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (err <= 0) { 582c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: file write failed '%s'", __FUNCTION__, sysFsHPDFilePath); 5830c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed ret = false; 5840c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 5850c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed close(hdmiHPDFile); 5860c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 5870c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return ret; 5880c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 589f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 5903825f25827d3e23b0bc12e5bf453c851d4c238d8Saurabh Shah/* 5913825f25827d3e23b0bc12e5bf453c851d4c238d8Saurabh Shah * commits the changes to the external display 5923825f25827d3e23b0bc12e5bf453c851d4c238d8Saurabh Shah */ 5933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool ExternalDisplay::post() 594f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed{ 59565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed if(mFd == -1) 596f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return false; 59765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed struct mdp_display_commit ext_commit; 5986145012a20c4469625e5b3bc81aa919ccefcf958Naseer Ahmed memset(&ext_commit, 0, sizeof(ext_commit)); 5992279d22d6491034eccf478882f1a6daf30db1b66Ben Cheng ext_commit.flags = MDP_DISPLAY_COMMIT_OVERLAY; 60065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed if (ioctl(mFd, MSMFB_DISPLAY_COMMIT, &ext_commit) == -1) { 601c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: MSMFB_DISPLAY_COMMIT for external failed, str: %s", 602c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar __FUNCTION__, strerror(errno)); 603c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return false; 604f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed } 605f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return true; 606f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed} 607f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 608c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setDpyWfdAttr() { 609c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mHwcContext) { 610c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].xres = mVInfo.xres; 611c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].yres = mVInfo.yres; 612c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].vsync_period = 613c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 1000000000l /60; 614c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"%s: wfd...connected..!",__FUNCTION__); 615c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 616c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 617c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 618c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setDpyHdmiAttr() { 6193e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int width = 0, height = 0, fps = 0; 6203e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah getAttrForMode(width, height, fps); 6213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(mHwcContext) { 622c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ALOGD("ExtDisplay setting xres = %d, yres = %d", width, height); 6233e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].xres = width; 6243e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].yres = height; 625c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].vsync_period = 626c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 1000000000l / fps; 6273e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 6283e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 6293e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 630c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::getAttrForMode(int& width, int& height, int& fps) { 6313e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch (mCurrentMode) { 6323e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m640x480p60_4_3: 6333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 640; 6343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 480; 6353e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 60; 6363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m720x480p60_4_3: 6383e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m720x480p60_16_9: 6393e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 720; 6403e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 480; 6413e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 60; 6423e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6433e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m720x576p50_4_3: 6443e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m720x576p50_16_9: 6453e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 720; 6463e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 576; 6473e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 50; 6483e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6493e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1280x720p50_16_9: 6503e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1280; 6513e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 720; 6523e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 50; 6533e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6543e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1280x720p60_16_9: 6553e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1280; 6563e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 720; 6573e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 60; 6583e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6593e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p24_16_9: 6603e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6613e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6623e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 24; 6633e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6643e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p25_16_9: 6653e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6673e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 25; 6683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6693e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p30_16_9: 6703e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 30; 6733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p50_16_9: 6753e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6763e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 50; 6783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6793e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p60_16_9: 6803e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6813e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 60; 6833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 684f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed } 685f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed} 686f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 6870c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; 688