external.cpp revision 2310d4e7739b173b950a89c604c553e3302349f5
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(); 149358d2dd774971c048057dbf85d594f5aa02af8eeArun Kumar K.R // set system property 150358d2dd774971c048057dbf85d594f5aa02af8eeArun Kumar K.R property_set("hw.hdmiON", "1"); 151c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar }else if(!strncmp(s1,"wfd",strlen(s1))) { 152c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // wfd online event..! 153c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar configureWFDDisplay(); 154c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 155c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 1560c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 157c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::processUEventOffline(const char *str) { 158c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar const char *s1 = str + strlen("change@/devices/virtual/switch/"); 159c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(!strncmp(s1,"hdmi",strlen(s1))) { 160c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar teardownHDMIDisplay(); 161358d2dd774971c048057dbf85d594f5aa02af8eeArun Kumar K.R // unset system property 162358d2dd774971c048057dbf85d594f5aa02af8eeArun Kumar K.R property_set("hw.hdmiON", "0"); 163c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar }else if(!strncmp(s1,"wfd",strlen(s1))) { 164c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar teardownWFDDisplay(); 165c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 166c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 1670c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 168f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer AhmedExternalDisplay::ExternalDisplay(hwc_context_t* ctx):mFd(-1), 169c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mCurrentMode(-1), mConnected(0), mConnectedFbNum(0), mModeCount(0), 170c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext(ctx), mHdmiFbNum(-1), mWfdFbNum(-1) 1710c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 172f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed memset(&mVInfo, 0, sizeof(mVInfo)); 173c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar //Determine the fb index for external display devices. 174c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar updateExtDispDevFbIndex(); 1750c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 1760c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 17756f610dd235b577725198e9341caae92379fdf23Saurabh Shahvoid ExternalDisplay::setEDIDMode(int resMode) { 17856f610dd235b577725198e9341caae92379fdf23Saurabh Shah ALOGD_IF(DEBUG,"resMode=%d ", resMode); 17956f610dd235b577725198e9341caae92379fdf23Saurabh Shah { 18056f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 181c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(false); 182c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar openFrameBuffer(mHdmiFbNum); 18356f610dd235b577725198e9341caae92379fdf23Saurabh Shah setResolution(resMode); 18456f610dd235b577725198e9341caae92379fdf23Saurabh Shah } 185c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 18656f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 18756f610dd235b577725198e9341caae92379fdf23Saurabh Shah 18856f610dd235b577725198e9341caae92379fdf23Saurabh Shahvoid ExternalDisplay::setHPD(uint32_t startEnd) { 18956f610dd235b577725198e9341caae92379fdf23Saurabh Shah ALOGD_IF(DEBUG,"HPD enabled=%d", startEnd); 19056f610dd235b577725198e9341caae92379fdf23Saurabh Shah writeHPDOption(startEnd); 19156f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 19256f610dd235b577725198e9341caae92379fdf23Saurabh Shah 19356f610dd235b577725198e9341caae92379fdf23Saurabh Shahvoid ExternalDisplay::setActionSafeDimension(int w, int h) { 19456f610dd235b577725198e9341caae92379fdf23Saurabh Shah ALOGD_IF(DEBUG,"ActionSafe w=%d h=%d", w, h); 19556f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 19656f610dd235b577725198e9341caae92379fdf23Saurabh Shah overlay::utils::ActionSafe::getInstance()->setDimension(w, h); 197c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 19856f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 19956f610dd235b577725198e9341caae92379fdf23Saurabh Shah 20056f610dd235b577725198e9341caae92379fdf23Saurabh Shahint ExternalDisplay::getModeCount() const { 20156f610dd235b577725198e9341caae92379fdf23Saurabh Shah ALOGD_IF(DEBUG,"HPD mModeCount=%d", mModeCount); 20256f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 20356f610dd235b577725198e9341caae92379fdf23Saurabh Shah return mModeCount; 20456f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 20556f610dd235b577725198e9341caae92379fdf23Saurabh Shah 20656f610dd235b577725198e9341caae92379fdf23Saurabh Shahvoid ExternalDisplay::getEDIDModes(int *out) const { 20756f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 20856f610dd235b577725198e9341caae92379fdf23Saurabh Shah for(int i = 0;i < mModeCount;i++) { 20956f610dd235b577725198e9341caae92379fdf23Saurabh Shah out[i] = mEDIDModes[i]; 21056f610dd235b577725198e9341caae92379fdf23Saurabh Shah } 21156f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 21256f610dd235b577725198e9341caae92379fdf23Saurabh Shah 21372cf9762f84aab07faab86e35fe830b63ec54d72Naseer AhmedExternalDisplay::~ExternalDisplay() 21472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{ 215f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed closeFrameBuffer(); 2160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 2170c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmedstruct disp_mode_timing_type { 2190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int video_format; 2200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2210c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int active_h; 2220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int active_v; 2230c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int front_porch_h; 2250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int pulse_width_h; 2260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int back_porch_h; 2270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int front_porch_v; 2290c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int pulse_width_v; 2300c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int back_porch_v; 2310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2320c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int pixel_freq; 2330c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed bool interlaced; 2340c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2350c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed void set_info(struct fb_var_screeninfo &info) const; 2360c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; 2370c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2380c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmedvoid disp_mode_timing_type::set_info(struct fb_var_screeninfo &info) const 2390c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 2400c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.reserved[0] = 0; 2410c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.reserved[1] = 0; 2420c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.reserved[2] = 0; 2432310d4e7739b173b950a89c604c553e3302349f5Ken Zhang#ifndef FB_METADATA_VIDEO_INFO_CODE_SUPPORT 24456f610dd235b577725198e9341caae92379fdf23Saurabh Shah info.reserved[3] = (info.reserved[3] & 0xFFFF) | (video_format << 16); 2452310d4e7739b173b950a89c604c553e3302349f5Ken Zhang#endif 2460c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.xoffset = 0; 2470c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.yoffset = 0; 2480c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.xres = active_h; 2490c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.yres = active_v; 2500c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2510c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.pixclock = pixel_freq*1000; 2520c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.vmode = interlaced ? FB_VMODE_INTERLACED : FB_VMODE_NONINTERLACED; 2530c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2540c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.right_margin = front_porch_h; 2550c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.hsync_len = pulse_width_h; 2560c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.left_margin = back_porch_h; 2570c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.lower_margin = front_porch_v; 2580c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.vsync_len = pulse_width_v; 2590c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.upper_margin = back_porch_v; 2600c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 2610c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2620c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed/* Video formates supported by the HDMI Standard */ 2630c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed/* Indicates the resolution, pix clock and the aspect ratio */ 2640c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m640x480p60_4_3 1 2650c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m720x480p60_4_3 2 2660c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m720x480p60_16_9 3 2670c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1280x720p60_16_9 4 2680c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080i60_16_9 5 2690c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1440x480i60_4_3 6 2700c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1440x480i60_16_9 7 2710c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p60_16_9 16 2720c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m720x576p50_4_3 17 2730c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m720x576p50_16_9 18 2740c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1280x720p50_16_9 19 2750c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1440x576i50_4_3 21 2760c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1440x576i50_16_9 22 2770c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p50_16_9 31 2780c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p24_16_9 32 2790c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p25_16_9 33 2800c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p30_16_9 34 2810c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2820c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmedstatic struct disp_mode_timing_type supported_video_mode_lut[] = { 2830c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m640x480p60_4_3, 640, 480, 16, 96, 48, 10, 2, 33, 25200, false}, 2840c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m720x480p60_4_3, 720, 480, 16, 62, 60, 9, 6, 30, 27030, false}, 2850c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m720x480p60_16_9, 720, 480, 16, 62, 60, 9, 6, 30, 27030, false}, 2860c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1280x720p60_16_9, 1280, 720, 110, 40, 220, 5, 5, 20, 74250, false}, 2870c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080i60_16_9, 1920, 540, 88, 44, 148, 2, 5, 5, 74250, false}, 2880c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1440x480i60_4_3, 1440, 240, 38, 124, 114, 4, 3, 15, 27000, true}, 2890c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1440x480i60_16_9, 1440, 240, 38, 124, 114, 4, 3, 15, 27000, true}, 2900c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p60_16_9, 1920, 1080, 88, 44, 148, 4, 5, 36, 148500, false}, 2910c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m720x576p50_4_3, 720, 576, 12, 64, 68, 5, 5, 39, 27000, false}, 2920c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m720x576p50_16_9, 720, 576, 12, 64, 68, 5, 5, 39, 27000, false}, 2930c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1280x720p50_16_9, 1280, 720, 440, 40, 220, 5, 5, 20, 74250, false}, 2940c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1440x576i50_4_3, 1440, 288, 24, 126, 138, 2, 3, 19, 27000, true}, 2950c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1440x576i50_16_9, 1440, 288, 24, 126, 138, 2, 3, 19, 27000, true}, 2960c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p50_16_9, 1920, 1080, 528, 44, 148, 4, 5, 36, 148500, false}, 2970c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p24_16_9, 1920, 1080, 638, 44, 148, 4, 5, 36, 74250, false}, 2980c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p25_16_9, 1920, 1080, 528, 44, 148, 4, 5, 36, 74250, false}, 2990c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p30_16_9, 1920, 1080, 88, 44, 148, 4, 5, 36, 74250, false}, 3000c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; 30172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 302f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmedint ExternalDisplay::parseResolution(char* edidStr, int* edidModes) 3030c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 3040c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed char delim = ','; 3050c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int count = 0; 3060c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed char *start, *end; 3070c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // EDIDs are string delimited by ',' 3080c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // Ex: 16,4,5,3,32,34,1 3090c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // Parse this string to get mode(int) 3100c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed start = (char*) edidStr; 311f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed end = &delim; 312f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed while(*end == delim) { 313f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed edidModes[count] = (int) strtol(start, &end, 10); 3140c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed start = end+1; 3150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed count++; 3160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 317f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD_IF(DEBUG, "In %s: count = %d", __FUNCTION__, count); 318f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed for (int i = 0; i < count; i++) 319f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD_IF(DEBUG, "Mode[%d] = %d", i, edidModes[i]); 3200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return count; 3210c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 322f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 32372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedbool ExternalDisplay::readResolution() 3240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 325c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar char sysFsEDIDFilePath[255]; 326c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar sprintf(sysFsEDIDFilePath , "/sys/devices/virtual/graphics/fb%d/edid_modes", 327c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHdmiFbNum); 328c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 329c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar int hdmiEDIDFile = open(sysFsEDIDFilePath, O_RDONLY, 0); 3300c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int len = -1; 3310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 3320c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (hdmiEDIDFile < 0) { 333f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGE("%s: edid_modes file '%s' not found", 334c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar __FUNCTION__, sysFsEDIDFilePath); 3350c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return false; 3360c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } else { 3370c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed len = read(hdmiEDIDFile, mEDIDs, sizeof(mEDIDs)-1); 33872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ALOGD_IF(DEBUG, "%s: EDID string: %s length = %d", 33972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed __FUNCTION__, mEDIDs, len); 3400c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if ( len <= 0) { 341f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGE("%s: edid_modes file empty '%s'", 342c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar __FUNCTION__, sysFsEDIDFilePath); 3430c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3440c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed else { 3450c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed while (len > 1 && isspace(mEDIDs[len-1])) 3460c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed --len; 3470c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mEDIDs[len] = 0; 3480c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3490c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3500c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed close(hdmiEDIDFile); 3510c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(len > 0) { 352c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // Get EDID modes from the EDID strings 353f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mModeCount = parseResolution(mEDIDs, mEDIDModes); 35472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ALOGD_IF(DEBUG, "%s: mModeCount = %d", __FUNCTION__, 35572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed mModeCount); 3560c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3570c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 3580c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return (strlen(mEDIDs) > 0); 3590c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 3600c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 361c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarbool ExternalDisplay::openFrameBuffer(int fbNum) 3620c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 363f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if (mFd == -1) { 364c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mFd = open(msmFbDevicePath[fbNum-1], O_RDWR); 365f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if (mFd < 0) 366c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: %s is not available", __FUNCTION__, 367c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar msmFbDevicePath[fbNum-1]); 368c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mHwcContext) { 369c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].fd = mFd; 370c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 3713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 372f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return (mFd > 0); 373f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed} 374f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 375f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmedbool ExternalDisplay::closeFrameBuffer() 376f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed{ 377f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed int ret = 0; 378f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if(mFd > 0) { 379f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ret = close(mFd); 380f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mFd = -1; 3810c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(mHwcContext) { 3833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].fd = mFd; 3843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 385f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return (ret == 0); 3860c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 3870c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 388f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed// clears the vinfo, edid, best modes 389f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmedvoid ExternalDisplay::resetInfo() 390f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed{ 391f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed memset(&mVInfo, 0, sizeof(mVInfo)); 392f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed memset(mEDIDs, 0, sizeof(mEDIDs)); 393f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed memset(mEDIDModes, 0, sizeof(mEDIDModes)); 394f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mModeCount = 0; 395f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mCurrentMode = -1; 396f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed} 3970c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 39872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedint ExternalDisplay::getModeOrder(int mode) 3990c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 400f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R // XXX: We dont support interlaced modes but having 401f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R // it here for for future 4020c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed switch (mode) { 4030c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed default: 4040c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1440x480i60_4_3: 4050c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 1; // 480i 4:3 4060c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1440x480i60_16_9: 4070c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 2; // 480i 16:9 4080c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1440x576i50_4_3: 4090c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 3; // i576i 4:3 4100c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1440x576i50_16_9: 4110c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 4; // 576i 16:9 4120c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m640x480p60_4_3: 4130c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 5; // 640x480 4:3 4140c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m720x480p60_4_3: 4150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 6; // 480p 4:3 4160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m720x480p60_16_9: 4170c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 7; // 480p 16:9 4180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m720x576p50_4_3: 4190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 8; // 576p 4:3 4200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m720x576p50_16_9: 4210c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 9; // 576p 16:9 4220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080i60_16_9: 4230c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 10; // 1080i 16:9 4240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1280x720p50_16_9: 4250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 11; // 720p@50Hz 4260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1280x720p60_16_9: 4270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 12; // 720p@60Hz 4280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p24_16_9: 4290c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 13; //1080p@24Hz 4300c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p25_16_9: 4310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 14; //108-p@25Hz 4320c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p30_16_9: 4330c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 15; //1080p@30Hz 4340c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p50_16_9: 4350c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 16; //1080p@50Hz 4360c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p60_16_9: 4370c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 17; //1080p@60Hz 43872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed } 4390c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 4400c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 441f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R/// Returns the user mode set(if any) using adb shell 442f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.Rint ExternalDisplay::getUserMode() { 443f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R /* Based on the property set the resolution */ 444f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R char property_value[PROPERTY_VALUE_MAX]; 445f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R property_get("hdmi.resolution", property_value, "-1"); 446f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R int mode = atoi(property_value); 447f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R // We dont support interlaced modes 448f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R if(isValidMode(mode) && !isInterlacedMode(mode)) { 449f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R ALOGD_IF("%s: setting the HDMI mode = %d", __FUNCTION__, mode); 450f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R return mode; 451f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R } 452f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R return -1; 453f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R} 454f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R 4550c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed// Get the best mode for the current HD TV 45672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedint ExternalDisplay::getBestMode() { 4570c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int bestOrder = 0; 4580c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int bestMode = m640x480p60_4_3; 45956f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 4600c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // for all the edid read, get the best mode 4610c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed for(int i = 0; i < mModeCount; i++) { 4620c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int mode = mEDIDModes[i]; 4630c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int order = getModeOrder(mode); 4640c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (order > bestOrder) { 4650c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed bestOrder = order; 4660c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed bestMode = mode; 4670c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 4680c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 4690c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return bestMode; 47072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed} 4710c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 47272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedinline bool ExternalDisplay::isValidMode(int ID) 4730c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 474f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R bool valid = false; 475f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R for (int i = 0; i < mModeCount; i++) { 476f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R if(ID == mEDIDModes[i]) { 477f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R valid = true; 478f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R break; 479f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R } 480f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R } 481f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R return valid; 482f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R} 483f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R 484f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R// returns true if the mode(ID) is interlaced mode format 485f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.Rbool ExternalDisplay::isInterlacedMode(int ID) { 486f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R bool interlaced = false; 487f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R switch(ID) { 488f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R case m1440x480i60_4_3: 489f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R case m1440x480i60_16_9: 490f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R case m1440x576i50_4_3: 491f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R case m1440x576i50_16_9: 492f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R case m1920x1080i60_16_9: 493f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R interlaced = true; 494f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R default: 495f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R interlaced = false; 496f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R } 497f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R return interlaced; 4980c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 4990c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 50072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedvoid ExternalDisplay::setResolution(int ID) 5010c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 5020c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed struct fb_var_screeninfo info; 503f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed int ret = 0; 504f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ret = ioctl(mFd, FBIOGET_VSCREENINFO, &mVInfo); 505f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if(ret < 0) { 506f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD("In %s: FBIOGET_VSCREENINFO failed Err Str = %s", __FUNCTION__, 507f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed strerror(errno)); 508f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed } 509f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 510f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD_IF(DEBUG, "%s: GET Info<ID=%d %dx%d (%d,%d,%d)," 511f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed "(%d,%d,%d) %dMHz>", __FUNCTION__, 512f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.reserved[3], mVInfo.xres, mVInfo.yres, 513f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin, 514f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin, 515f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.pixclock/1000/1000); 516f402f149587c185267504f6eec780eb3fe010a55Arun Kumar K.R //If its a new ID - update var_screeninfo 517f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if ((isValidMode(ID)) && mCurrentMode != ID) { 5180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed const struct disp_mode_timing_type *mode = 51972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed &supported_video_mode_lut[0]; 5200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed unsigned count = sizeof(supported_video_mode_lut)/sizeof 52172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed (*supported_video_mode_lut); 5220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed for (unsigned int i = 0; i < count; ++i) { 5230c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed const struct disp_mode_timing_type *cur = 52472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed &supported_video_mode_lut[i]; 5250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (cur->video_format == ID) 5260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mode = cur; 5270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 528f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mode->set_info(mVInfo); 529f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD_IF(DEBUG, "%s: SET Info<ID=%d => Info<ID=%d %dx %d" 53072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed "(%d,%d,%d), (%d,%d,%d) %dMHz>", __FUNCTION__, ID, 531f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.reserved[3], mVInfo.xres, mVInfo.yres, 532f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin, 533f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin, 534f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.pixclock/1000/1000); 535f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_ALL | FB_ACTIVATE_FORCE; 536f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ret = ioctl(mFd, FBIOPUT_VSCREENINFO, &mVInfo); 537f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if(ret < 0) { 538f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD("In %s: FBIOPUT_VSCREENINFO failed Err Str = %s", 539f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed __FUNCTION__, strerror(errno)); 540f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed } 5412310d4e7739b173b950a89c604c553e3302349f5Ken Zhang#ifdef FB_METADATA_VIDEO_INFO_CODE_SUPPORT 5422310d4e7739b173b950a89c604c553e3302349f5Ken Zhang struct msmfb_metadata metadata; 5432310d4e7739b173b950a89c604c553e3302349f5Ken Zhang memset(&metadata, 0 , sizeof(metadata)); 5442310d4e7739b173b950a89c604c553e3302349f5Ken Zhang metadata.op = metadata_op_vic; 5452310d4e7739b173b950a89c604c553e3302349f5Ken Zhang metadata.data.video_info_code = mode->video_format; 5462310d4e7739b173b950a89c604c553e3302349f5Ken Zhang if (ioctl(mFd, MSMFB_METADATA_SET, &metadata) == -1) { 5472310d4e7739b173b950a89c604c553e3302349f5Ken Zhang ALOGD("In %s: MSMFB_METADATA_SET failed Err Str = %s", 5482310d4e7739b173b950a89c604c553e3302349f5Ken Zhang __FUNCTION__, strerror(errno)); 5492310d4e7739b173b950a89c604c553e3302349f5Ken Zhang } 5502310d4e7739b173b950a89c604c553e3302349f5Ken Zhang#endif 551f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mCurrentMode = ID; 5520c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 5530c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 5540c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 555c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setExternalDisplay(bool connected, int extFbNum) 5560c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 5570c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed hwc_context_t* ctx = mHwcContext; 5580c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(ctx) { 559c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG, "%s: connected = %d", __FUNCTION__, connected); 5600c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // Store the external display 561c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mConnected = connected; 562c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mConnectedFbNum = extFbNum; 563c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].connected = connected; 564c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // Update external fb number in Overlay context 565c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar overlay::Overlay::getInstance()->setExtFbNum(extFbNum); 5660c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 567c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 568c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 569c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarint ExternalDisplay::getExtFbNum(int &fbNum) { 570c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar int ret = -1; 571c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mConnected) { 572c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar fbNum = mConnectedFbNum; 573c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ret = 0; 574c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 575c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return ret; 5760c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 5770c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 57872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedbool ExternalDisplay::writeHPDOption(int userOption) const 5790c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 5800c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed bool ret = true; 581c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar char sysFsHPDFilePath[255]; 582c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar sprintf(sysFsHPDFilePath ,"/sys/devices/virtual/graphics/fb%d/hpd", 583c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHdmiFbNum); 584c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar int hdmiHPDFile = open(sysFsHPDFilePath,O_RDWR, 0); 5850c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (hdmiHPDFile < 0) { 586c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: state file '%s' not found : ret%d err str: %s", __FUNCTION__, 587c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar sysFsHPDFilePath, hdmiHPDFile, strerror(errno)); 5880c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed ret = false; 5890c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } else { 5900c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int err = -1; 591c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG, "%s: option = %d", __FUNCTION__, userOption); 5920c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(userOption) 5930c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed err = write(hdmiHPDFile, "1", 2); 5940c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed else 5950c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed err = write(hdmiHPDFile, "0" , 2); 5960c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (err <= 0) { 597c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: file write failed '%s'", __FUNCTION__, sysFsHPDFilePath); 5980c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed ret = false; 5990c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 6000c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed close(hdmiHPDFile); 6010c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 6020c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return ret; 6030c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 604f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 6053825f25827d3e23b0bc12e5bf453c851d4c238d8Saurabh Shah/* 6063825f25827d3e23b0bc12e5bf453c851d4c238d8Saurabh Shah * commits the changes to the external display 6073825f25827d3e23b0bc12e5bf453c851d4c238d8Saurabh Shah */ 6083e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool ExternalDisplay::post() 609f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed{ 61065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed if(mFd == -1) 611f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return false; 61265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed struct mdp_display_commit ext_commit; 6136145012a20c4469625e5b3bc81aa919ccefcf958Naseer Ahmed memset(&ext_commit, 0, sizeof(ext_commit)); 6142279d22d6491034eccf478882f1a6daf30db1b66Ben Cheng ext_commit.flags = MDP_DISPLAY_COMMIT_OVERLAY; 61565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed if (ioctl(mFd, MSMFB_DISPLAY_COMMIT, &ext_commit) == -1) { 616c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: MSMFB_DISPLAY_COMMIT for external failed, str: %s", 617c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar __FUNCTION__, strerror(errno)); 618c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return false; 619f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed } 620f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return true; 621f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed} 622f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 623c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setDpyWfdAttr() { 624c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mHwcContext) { 625c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].xres = mVInfo.xres; 626c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].yres = mVInfo.yres; 627c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].vsync_period = 628c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 1000000000l /60; 629c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"%s: wfd...connected..!",__FUNCTION__); 630c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 631c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 632c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 633c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setDpyHdmiAttr() { 6343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int width = 0, height = 0, fps = 0; 6353e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah getAttrForMode(width, height, fps); 6363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(mHwcContext) { 637c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ALOGD("ExtDisplay setting xres = %d, yres = %d", width, height); 6383e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].xres = width; 6393e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].yres = height; 640c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].vsync_period = 641c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 1000000000l / fps; 6423e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 6433e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 6443e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 645c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::getAttrForMode(int& width, int& height, int& fps) { 6463e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch (mCurrentMode) { 6473e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m640x480p60_4_3: 6483e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 640; 6493e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 480; 6503e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 60; 6513e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6523e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m720x480p60_4_3: 6533e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m720x480p60_16_9: 6543e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 720; 6553e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 480; 6563e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 60; 6573e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6583e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m720x576p50_4_3: 6593e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m720x576p50_16_9: 6603e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 720; 6613e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 576; 6623e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 50; 6633e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6643e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1280x720p50_16_9: 6653e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1280; 6663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 720; 6673e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 50; 6683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6693e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1280x720p60_16_9: 6703e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1280; 6713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 720; 6723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 60; 6733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p24_16_9: 6753e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6763e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 24; 6783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6793e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p25_16_9: 6803e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6813e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 25; 6833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p30_16_9: 6853e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6863e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6873e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 30; 6883e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p50_16_9: 6903e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6923e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 50; 6933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6943e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p60_16_9: 6953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6963e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6973e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 60; 6983e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 699f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed } 700f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed} 701f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 7020c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; 703