external.cpp revision c9ef1b45b51f4b541da4337cd86dc510654c390b
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 //Get the best mode and set 90c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // TODO: Move this to activate 91c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setResolution(getBestMode()); 92c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setDpyHdmiAttr(); 93c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 94c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return 0; 95c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 96c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 97c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarint ExternalDisplay::configureWFDDisplay() { 98c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar int ret = 0; 99c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mHdmiFbNum) { 100c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: Cannot process WFD connection while HDMI is active", 101c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar __FUNCTION__); 102c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return -1; 103c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 104c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar openFrameBuffer(mWfdFbNum); 105c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mFd == -1) 106c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return -1; 107c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ret = ioctl(mFd, FBIOGET_VSCREENINFO, &mVInfo); 108c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(ret < 0) { 109c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD("In %s: FBIOGET_VSCREENINFO failed Err Str = %s", __FUNCTION__, 110c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar strerror(errno)); 111c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 112c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setDpyWfdAttr(); 113c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(true, mWfdFbNum); 114c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return 0; 115c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 116c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 117c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarint ExternalDisplay::teardownHDMIDisplay() { 118c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mHdmiFbNum) { 119c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // hdmi offline event..! 120c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar closeFrameBuffer(); 121c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar resetInfo(); 122c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(false); 123c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 124c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return 0; 125c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 1260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 127c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarint ExternalDisplay::teardownWFDDisplay() { 128c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mWfdFbNum) { 129c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // wfd offline event..! 130c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar closeFrameBuffer(); 131c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar memset(&mVInfo, 0, sizeof(mVInfo)); 132c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(false); 133c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 134c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return 0; 135c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 1360c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 137c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::processUEventOnline(const char *str) { 138c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar const char *s1 = str + strlen("change@/devices/virtual/switch/"); 139c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(!strncmp(s1,"hdmi",strlen(s1))) { 140c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // hdmi online event..! 141c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar configureHDMIDisplay(); 142c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar }else if(!strncmp(s1,"wfd",strlen(s1))) { 143c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // wfd online event..! 144c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar configureWFDDisplay(); 145c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 146c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 1470c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 148c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::processUEventOffline(const char *str) { 149c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar const char *s1 = str + strlen("change@/devices/virtual/switch/"); 150c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(!strncmp(s1,"hdmi",strlen(s1))) { 151c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar teardownHDMIDisplay(); 152c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar }else if(!strncmp(s1,"wfd",strlen(s1))) { 153c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar teardownWFDDisplay(); 154c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 155c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 1560c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 157f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer AhmedExternalDisplay::ExternalDisplay(hwc_context_t* ctx):mFd(-1), 158c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mCurrentMode(-1), mConnected(0), mConnectedFbNum(0), mModeCount(0), 159c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext(ctx), mHdmiFbNum(-1), mWfdFbNum(-1) 1600c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 161f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed memset(&mVInfo, 0, sizeof(mVInfo)); 162c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar //Determine the fb index for external display devices. 163c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar updateExtDispDevFbIndex(); 1640c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 1650c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 16656f610dd235b577725198e9341caae92379fdf23Saurabh Shahvoid ExternalDisplay::setEDIDMode(int resMode) { 16756f610dd235b577725198e9341caae92379fdf23Saurabh Shah ALOGD_IF(DEBUG,"resMode=%d ", resMode); 16856f610dd235b577725198e9341caae92379fdf23Saurabh Shah { 16956f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 170c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(false); 171c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar openFrameBuffer(mHdmiFbNum); 17256f610dd235b577725198e9341caae92379fdf23Saurabh Shah setResolution(resMode); 17356f610dd235b577725198e9341caae92379fdf23Saurabh Shah } 174c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 17556f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 17656f610dd235b577725198e9341caae92379fdf23Saurabh Shah 17756f610dd235b577725198e9341caae92379fdf23Saurabh Shahvoid ExternalDisplay::setHPD(uint32_t startEnd) { 17856f610dd235b577725198e9341caae92379fdf23Saurabh Shah ALOGD_IF(DEBUG,"HPD enabled=%d", startEnd); 17956f610dd235b577725198e9341caae92379fdf23Saurabh Shah writeHPDOption(startEnd); 18056f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 18156f610dd235b577725198e9341caae92379fdf23Saurabh Shah 18256f610dd235b577725198e9341caae92379fdf23Saurabh Shahvoid ExternalDisplay::setActionSafeDimension(int w, int h) { 18356f610dd235b577725198e9341caae92379fdf23Saurabh Shah ALOGD_IF(DEBUG,"ActionSafe w=%d h=%d", w, h); 18456f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 18556f610dd235b577725198e9341caae92379fdf23Saurabh Shah overlay::utils::ActionSafe::getInstance()->setDimension(w, h); 186c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 18756f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 18856f610dd235b577725198e9341caae92379fdf23Saurabh Shah 18956f610dd235b577725198e9341caae92379fdf23Saurabh Shahint ExternalDisplay::getModeCount() const { 19056f610dd235b577725198e9341caae92379fdf23Saurabh Shah ALOGD_IF(DEBUG,"HPD mModeCount=%d", mModeCount); 19156f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 19256f610dd235b577725198e9341caae92379fdf23Saurabh Shah return mModeCount; 19356f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 19456f610dd235b577725198e9341caae92379fdf23Saurabh Shah 19556f610dd235b577725198e9341caae92379fdf23Saurabh Shahvoid ExternalDisplay::getEDIDModes(int *out) const { 19656f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 19756f610dd235b577725198e9341caae92379fdf23Saurabh Shah for(int i = 0;i < mModeCount;i++) { 19856f610dd235b577725198e9341caae92379fdf23Saurabh Shah out[i] = mEDIDModes[i]; 19956f610dd235b577725198e9341caae92379fdf23Saurabh Shah } 20056f610dd235b577725198e9341caae92379fdf23Saurabh Shah} 20156f610dd235b577725198e9341caae92379fdf23Saurabh Shah 20272cf9762f84aab07faab86e35fe830b63ec54d72Naseer AhmedExternalDisplay::~ExternalDisplay() 20372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed{ 204f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed closeFrameBuffer(); 2050c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 2060c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2070c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmedstruct disp_mode_timing_type { 2080c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int video_format; 2090c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2100c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int active_h; 2110c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int active_v; 2120c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2130c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int front_porch_h; 2140c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int pulse_width_h; 2150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int back_porch_h; 2160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2170c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int front_porch_v; 2180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int pulse_width_v; 2190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int back_porch_v; 2200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2210c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int pixel_freq; 2220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed bool interlaced; 2230c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed void set_info(struct fb_var_screeninfo &info) const; 2250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; 2260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmedvoid disp_mode_timing_type::set_info(struct fb_var_screeninfo &info) const 2280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 2290c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.reserved[0] = 0; 2300c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.reserved[1] = 0; 2310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.reserved[2] = 0; 23256f610dd235b577725198e9341caae92379fdf23Saurabh Shah info.reserved[3] = (info.reserved[3] & 0xFFFF) | (video_format << 16); 2330c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2340c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.xoffset = 0; 2350c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.yoffset = 0; 2360c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.xres = active_h; 2370c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.yres = active_v; 2380c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2390c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.pixclock = pixel_freq*1000; 2400c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.vmode = interlaced ? FB_VMODE_INTERLACED : FB_VMODE_NONINTERLACED; 2410c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2420c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.right_margin = front_porch_h; 2430c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.hsync_len = pulse_width_h; 2440c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.left_margin = back_porch_h; 2450c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.lower_margin = front_porch_v; 2460c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.vsync_len = pulse_width_v; 2470c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed info.upper_margin = back_porch_v; 2480c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 2490c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2500c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed/* Video formates supported by the HDMI Standard */ 2510c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed/* Indicates the resolution, pix clock and the aspect ratio */ 2520c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m640x480p60_4_3 1 2530c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m720x480p60_4_3 2 2540c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m720x480p60_16_9 3 2550c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1280x720p60_16_9 4 2560c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080i60_16_9 5 2570c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1440x480i60_4_3 6 2580c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1440x480i60_16_9 7 2590c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p60_16_9 16 2600c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m720x576p50_4_3 17 2610c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m720x576p50_16_9 18 2620c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1280x720p50_16_9 19 2630c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1440x576i50_4_3 21 2640c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1440x576i50_16_9 22 2650c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p50_16_9 31 2660c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p24_16_9 32 2670c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p25_16_9 33 2680c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define m1920x1080p30_16_9 34 2690c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 2700c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmedstatic struct disp_mode_timing_type supported_video_mode_lut[] = { 2710c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m640x480p60_4_3, 640, 480, 16, 96, 48, 10, 2, 33, 25200, false}, 2720c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m720x480p60_4_3, 720, 480, 16, 62, 60, 9, 6, 30, 27030, false}, 2730c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m720x480p60_16_9, 720, 480, 16, 62, 60, 9, 6, 30, 27030, false}, 2740c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1280x720p60_16_9, 1280, 720, 110, 40, 220, 5, 5, 20, 74250, false}, 2750c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080i60_16_9, 1920, 540, 88, 44, 148, 2, 5, 5, 74250, false}, 2760c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1440x480i60_4_3, 1440, 240, 38, 124, 114, 4, 3, 15, 27000, true}, 2770c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1440x480i60_16_9, 1440, 240, 38, 124, 114, 4, 3, 15, 27000, true}, 2780c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p60_16_9, 1920, 1080, 88, 44, 148, 4, 5, 36, 148500, false}, 2790c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m720x576p50_4_3, 720, 576, 12, 64, 68, 5, 5, 39, 27000, false}, 2800c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m720x576p50_16_9, 720, 576, 12, 64, 68, 5, 5, 39, 27000, false}, 2810c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1280x720p50_16_9, 1280, 720, 440, 40, 220, 5, 5, 20, 74250, false}, 2820c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1440x576i50_4_3, 1440, 288, 24, 126, 138, 2, 3, 19, 27000, true}, 2830c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1440x576i50_16_9, 1440, 288, 24, 126, 138, 2, 3, 19, 27000, true}, 2840c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p50_16_9, 1920, 1080, 528, 44, 148, 4, 5, 36, 148500, false}, 2850c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p24_16_9, 1920, 1080, 638, 44, 148, 4, 5, 36, 74250, false}, 2860c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p25_16_9, 1920, 1080, 528, 44, 148, 4, 5, 36, 74250, false}, 2870c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed {m1920x1080p30_16_9, 1920, 1080, 88, 44, 148, 4, 5, 36, 74250, false}, 2880c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; 28972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 290f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmedint ExternalDisplay::parseResolution(char* edidStr, int* edidModes) 2910c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 2920c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed char delim = ','; 2930c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int count = 0; 2940c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed char *start, *end; 2950c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // EDIDs are string delimited by ',' 2960c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // Ex: 16,4,5,3,32,34,1 2970c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // Parse this string to get mode(int) 2980c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed start = (char*) edidStr; 299f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed end = &delim; 300f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed while(*end == delim) { 301f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed edidModes[count] = (int) strtol(start, &end, 10); 3020c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed start = end+1; 3030c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed count++; 3040c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 305f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD_IF(DEBUG, "In %s: count = %d", __FUNCTION__, count); 306f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed for (int i = 0; i < count; i++) 307f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD_IF(DEBUG, "Mode[%d] = %d", i, edidModes[i]); 3080c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return count; 3090c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 310f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 31172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedbool ExternalDisplay::readResolution() 3120c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 313c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar char sysFsEDIDFilePath[255]; 314c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar sprintf(sysFsEDIDFilePath , "/sys/devices/virtual/graphics/fb%d/edid_modes", 315c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHdmiFbNum); 316c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 317c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar int hdmiEDIDFile = open(sysFsEDIDFilePath, O_RDONLY, 0); 3180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int len = -1; 3190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 3200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (hdmiEDIDFile < 0) { 321f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGE("%s: edid_modes file '%s' not found", 322c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar __FUNCTION__, sysFsEDIDFilePath); 3230c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return false; 3240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } else { 3250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed len = read(hdmiEDIDFile, mEDIDs, sizeof(mEDIDs)-1); 32672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ALOGD_IF(DEBUG, "%s: EDID string: %s length = %d", 32772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed __FUNCTION__, mEDIDs, len); 3280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if ( len <= 0) { 329f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGE("%s: edid_modes file empty '%s'", 330c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar __FUNCTION__, sysFsEDIDFilePath); 3310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3320c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed else { 3330c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed while (len > 1 && isspace(mEDIDs[len-1])) 3340c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed --len; 3350c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mEDIDs[len] = 0; 3360c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3370c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3380c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed close(hdmiEDIDFile); 3390c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(len > 0) { 340c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // Get EDID modes from the EDID strings 341f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mModeCount = parseResolution(mEDIDs, mEDIDModes); 34272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed ALOGD_IF(DEBUG, "%s: mModeCount = %d", __FUNCTION__, 34372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed mModeCount); 3440c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3450c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 3460c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return (strlen(mEDIDs) > 0); 3470c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 3480c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 349c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarbool ExternalDisplay::openFrameBuffer(int fbNum) 3500c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 351f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if (mFd == -1) { 352c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mFd = open(msmFbDevicePath[fbNum-1], O_RDWR); 353f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if (mFd < 0) 354c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: %s is not available", __FUNCTION__, 355c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar msmFbDevicePath[fbNum-1]); 356c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mHwcContext) { 357c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].fd = mFd; 358c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 3593e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 360f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return (mFd > 0); 361f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed} 362f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 363f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmedbool ExternalDisplay::closeFrameBuffer() 364f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed{ 365f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed int ret = 0; 366f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if(mFd > 0) { 367f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ret = close(mFd); 368f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mFd = -1; 3690c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 3703e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(mHwcContext) { 3713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].fd = mFd; 3723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 373f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return (ret == 0); 3740c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 3750c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 376f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed// clears the vinfo, edid, best modes 377f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmedvoid ExternalDisplay::resetInfo() 378f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed{ 379f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed memset(&mVInfo, 0, sizeof(mVInfo)); 380f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed memset(mEDIDs, 0, sizeof(mEDIDs)); 381f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed memset(mEDIDModes, 0, sizeof(mEDIDModes)); 382f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mModeCount = 0; 383f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mCurrentMode = -1; 384f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed} 3850c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 38672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedint ExternalDisplay::getModeOrder(int mode) 3870c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 3880c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed switch (mode) { 3890c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed default: 3900c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1440x480i60_4_3: 3910c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 1; // 480i 4:3 3920c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1440x480i60_16_9: 3930c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 2; // 480i 16:9 3940c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1440x576i50_4_3: 3950c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 3; // i576i 4:3 3960c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1440x576i50_16_9: 3970c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 4; // 576i 16:9 3980c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m640x480p60_4_3: 3990c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 5; // 640x480 4:3 4000c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m720x480p60_4_3: 4010c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 6; // 480p 4:3 4020c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m720x480p60_16_9: 4030c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 7; // 480p 16:9 4040c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m720x576p50_4_3: 4050c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 8; // 576p 4:3 4060c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m720x576p50_16_9: 4070c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 9; // 576p 16:9 4080c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080i60_16_9: 4090c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 10; // 1080i 16:9 4100c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1280x720p50_16_9: 4110c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 11; // 720p@50Hz 4120c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1280x720p60_16_9: 4130c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 12; // 720p@60Hz 4140c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p24_16_9: 4150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 13; //1080p@24Hz 4160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p25_16_9: 4170c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 14; //108-p@25Hz 4180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p30_16_9: 4190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 15; //1080p@30Hz 4200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p50_16_9: 4210c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 16; //1080p@50Hz 4220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed case m1920x1080p60_16_9: 4230c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return 17; //1080p@60Hz 42472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed } 4250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 4260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 4270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed// Get the best mode for the current HD TV 42872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedint ExternalDisplay::getBestMode() { 4290c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int bestOrder = 0; 4300c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int bestMode = m640x480p60_4_3; 43156f610dd235b577725198e9341caae92379fdf23Saurabh Shah Mutex::Autolock lock(mExtDispLock); 4320c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // for all the edid read, get the best mode 4330c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed for(int i = 0; i < mModeCount; i++) { 4340c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int mode = mEDIDModes[i]; 4350c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int order = getModeOrder(mode); 4360c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (order > bestOrder) { 4370c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed bestOrder = order; 4380c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed bestMode = mode; 4390c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 4400c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 4410c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return bestMode; 44272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed} 4430c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 44472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedinline bool ExternalDisplay::isValidMode(int ID) 4450c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 4460c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return ((ID >= m640x480p60_4_3) && (ID <= m1920x1080p30_16_9)); 4470c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 4480c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 44972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedvoid ExternalDisplay::setResolution(int ID) 4500c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 4510c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed struct fb_var_screeninfo info; 452f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed int ret = 0; 453f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ret = ioctl(mFd, FBIOGET_VSCREENINFO, &mVInfo); 454f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if(ret < 0) { 455f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD("In %s: FBIOGET_VSCREENINFO failed Err Str = %s", __FUNCTION__, 456f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed strerror(errno)); 457f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed } 458f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 459f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD_IF(DEBUG, "%s: GET Info<ID=%d %dx%d (%d,%d,%d)," 460f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed "(%d,%d,%d) %dMHz>", __FUNCTION__, 461f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.reserved[3], mVInfo.xres, mVInfo.yres, 462f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin, 463f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin, 464f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.pixclock/1000/1000); 4650c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed //If its a valid mode and its a new ID - update var_screeninfo 466f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if ((isValidMode(ID)) && mCurrentMode != ID) { 4670c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed const struct disp_mode_timing_type *mode = 46872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed &supported_video_mode_lut[0]; 4690c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed unsigned count = sizeof(supported_video_mode_lut)/sizeof 47072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed (*supported_video_mode_lut); 4710c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed for (unsigned int i = 0; i < count; ++i) { 4720c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed const struct disp_mode_timing_type *cur = 47372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed &supported_video_mode_lut[i]; 4740c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (cur->video_format == ID) 4750c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed mode = cur; 4760c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 477f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mode->set_info(mVInfo); 478f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD_IF(DEBUG, "%s: SET Info<ID=%d => Info<ID=%d %dx %d" 47972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed "(%d,%d,%d), (%d,%d,%d) %dMHz>", __FUNCTION__, ID, 480f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.reserved[3], mVInfo.xres, mVInfo.yres, 481f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin, 482f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin, 483f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.pixclock/1000/1000); 484f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mVInfo.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_ALL | FB_ACTIVATE_FORCE; 485f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ret = ioctl(mFd, FBIOPUT_VSCREENINFO, &mVInfo); 486f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed if(ret < 0) { 487f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed ALOGD("In %s: FBIOPUT_VSCREENINFO failed Err Str = %s", 488f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed __FUNCTION__, strerror(errno)); 489f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed } 490f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed mCurrentMode = ID; 4910c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 4920c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 4930c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 494c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setExternalDisplay(bool connected, int extFbNum) 4950c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 4960c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed hwc_context_t* ctx = mHwcContext; 4970c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(ctx) { 498c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG, "%s: connected = %d", __FUNCTION__, connected); 4990c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // Store the external display 500c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mConnected = connected; 501c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mConnectedFbNum = extFbNum; 502c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].connected = connected; 503c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar // Update external fb number in Overlay context 504c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar overlay::Overlay::getInstance()->setExtFbNum(extFbNum); 5050c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 506c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 507c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 508c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarint ExternalDisplay::getExtFbNum(int &fbNum) { 509c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar int ret = -1; 510c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mConnected) { 511c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar fbNum = mConnectedFbNum; 512c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ret = 0; 513c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 514c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return ret; 5150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 5160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed 51772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedbool ExternalDisplay::writeHPDOption(int userOption) const 5180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{ 5190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed bool ret = true; 520c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar char sysFsHPDFilePath[255]; 521c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar sprintf(sysFsHPDFilePath ,"/sys/devices/virtual/graphics/fb%d/hpd", 522c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHdmiFbNum); 523c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar int hdmiHPDFile = open(sysFsHPDFilePath,O_RDWR, 0); 5240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (hdmiHPDFile < 0) { 525c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: state file '%s' not found : ret%d err str: %s", __FUNCTION__, 526c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar sysFsHPDFilePath, hdmiHPDFile, strerror(errno)); 5270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed ret = false; 5280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } else { 5290c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed int err = -1; 530c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG, "%s: option = %d", __FUNCTION__, userOption); 5310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if(userOption) 5320c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed err = write(hdmiHPDFile, "1", 2); 5330c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed else 5340c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed err = write(hdmiHPDFile, "0" , 2); 5350c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed if (err <= 0) { 536c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: file write failed '%s'", __FUNCTION__, sysFsHPDFilePath); 5370c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed ret = false; 5380c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 5390c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed close(hdmiHPDFile); 5400c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed } 5410c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed return ret; 5420c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed} 543f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 5443825f25827d3e23b0bc12e5bf453c851d4c238d8Saurabh Shah/* 5453825f25827d3e23b0bc12e5bf453c851d4c238d8Saurabh Shah * commits the changes to the external display 5463825f25827d3e23b0bc12e5bf453c851d4c238d8Saurabh Shah */ 5473e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool ExternalDisplay::post() 548f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed{ 54965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed if(mFd == -1) 550f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return false; 55165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed struct mdp_display_commit ext_commit; 5526145012a20c4469625e5b3bc81aa919ccefcf958Naseer Ahmed memset(&ext_commit, 0, sizeof(ext_commit)); 5532279d22d6491034eccf478882f1a6daf30db1b66Ben Cheng ext_commit.flags = MDP_DISPLAY_COMMIT_OVERLAY; 55465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed if (ioctl(mFd, MSMFB_DISPLAY_COMMIT, &ext_commit) == -1) { 555c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGE("%s: MSMFB_DISPLAY_COMMIT for external failed, str: %s", 556c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar __FUNCTION__, strerror(errno)); 557c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar return false; 558f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed } 559f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed return true; 560f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed} 561f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 562c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setDpyWfdAttr() { 563c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar if(mHwcContext) { 564c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].xres = mVInfo.xres; 565c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].yres = mVInfo.yres; 566c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].vsync_period = 567c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 1000000000l /60; 568c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"%s: wfd...connected..!",__FUNCTION__); 569c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar } 570c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar} 571c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumar 572c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setDpyHdmiAttr() { 5733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int width = 0, height = 0, fps = 0; 5743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah getAttrForMode(width, height, fps); 5753e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(mHwcContext) { 576c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ALOGD("ExtDisplay setting xres = %d, yres = %d", width, height); 5773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].xres = width; 5783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].yres = height; 579c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].vsync_period = 580c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 1000000000l / fps; 5813e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 5823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 5833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 584c9ef1b45b51f4b541da4337cd86dc510654c390bAmara Venkata Mastan Manoj Kumarvoid ExternalDisplay::getAttrForMode(int& width, int& height, int& fps) { 5853e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch (mCurrentMode) { 5863e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m640x480p60_4_3: 5873e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 640; 5883e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 480; 5893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 60; 5903e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m720x480p60_4_3: 5923e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m720x480p60_16_9: 5933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 720; 5943e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 480; 5953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 60; 5963e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 5973e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m720x576p50_4_3: 5983e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m720x576p50_16_9: 5993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 720; 6003e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 576; 6013e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 50; 6023e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6033e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1280x720p50_16_9: 6043e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1280; 6053e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 720; 6063e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 50; 6073e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6083e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1280x720p60_16_9: 6093e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1280; 6103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 720; 6113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 60; 6123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6133e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p24_16_9: 6143e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6153e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6163e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 24; 6173e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6183e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p25_16_9: 6193e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6203e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 25; 6223e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6233e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p30_16_9: 6243e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6253e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6263e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 30; 6273e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6283e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p50_16_9: 6293e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6303e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6313e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 50; 6323e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 6333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case m1920x1080p60_16_9: 6343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah width = 1920; 6353e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah height = 1080; 6363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fps = 60; 6373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 638f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed } 639f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed} 640f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed 6410c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; 642