external.cpp revision d0d432cf032707cbdea7635619ad5622bfc1b371
1ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed/* 2ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project 356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved. 4ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * 5ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Not a Contribution, Apache license notifications and license are 6ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * retained for attribution purposes only. 7ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * 8ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 9ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * you may not use this file except in compliance with the License. 10ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * You may obtain a copy of the License at 11ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * 12ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 13ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * 14ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Unless required by applicable law or agreed to in writing, software 15ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 16ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * See the License for the specific language governing permissions and 18ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * limitations under the License. 19ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed */ 20ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 211589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#define DEBUG 0 22ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <ctype.h> 231589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <fcntl.h> 24ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <media/IAudioPolicyService.h> 25ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <media/AudioSystem.h> 26ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <utils/threads.h> 27ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <utils/Errors.h> 28ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <utils/Log.h> 29ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 30ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <linux/msm_mdp.h> 3156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R#include <video/msm_hdmi_modes.h> 32ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <linux/fb.h> 33ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <sys/ioctl.h> 34ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <sys/poll.h> 351589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <sys/resource.h> 36ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include <cutils/properties.h> 37ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed#include "hwc_utils.h" 38bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h" 39bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "overlayUtils.h" 40620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar#include "overlay.h" 41bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 42bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahusing namespace android; 43ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 44ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmednamespace qhwc { 45ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 46620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar#define MAX_FRAME_BUFFER_NAME_SIZE (80) 47620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar#define MAX_DISPLAY_DEVICES (3) 489d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R#define MAX_SYSFS_FILE_PATH 255 499d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R#define UNKNOWN_STRING "unknown" 509d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R#define SPD_NAME_LENGTH 16 51620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 52620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarconst char* msmFbDevicePath[] = { "/dev/graphics/fb1", 53620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar "/dev/graphics/fb2"}; 54620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 55620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar/* 56620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar * Updates extDeviceFbIndex Array with the correct frame buffer indices 57620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar * of avaiable external devices 58620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar * 59620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar */ 60620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::updateExtDispDevFbIndex() 61620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar{ 62620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar FILE *displayDeviceFP = NULL; 63620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar char fbType[MAX_FRAME_BUFFER_NAME_SIZE]; 64620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar char msmFbTypePath[MAX_FRAME_BUFFER_NAME_SIZE]; 65620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 66620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar for(int j = 1; j < MAX_DISPLAY_DEVICES; j++) { 679d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R snprintf (msmFbTypePath, sizeof(msmFbTypePath), 689d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R "/sys/class/graphics/fb%d/msm_fb_type", j); 69620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar displayDeviceFP = fopen(msmFbTypePath, "r"); 70620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(displayDeviceFP){ 71620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar fread(fbType, sizeof(char), MAX_FRAME_BUFFER_NAME_SIZE, 72620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar displayDeviceFP); 73620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(strncmp(fbType, "dtv panel", strlen("dtv panel")) == 0){ 74620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"hdmi framebuffer index is %d",j); 75620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mHdmiFbNum = j; 76620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } else if(strncmp(fbType, "writeback panel", 77620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar strlen("writeback panel")) == 0){ 78620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"wfd framebuffer index is %d",j); 79620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mWfdFbNum = j; 80620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 81620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar fclose(displayDeviceFP); 82620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 83620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 84620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"%s: mHdmiFbNum: %d mWfdFbNum: %d ",__FUNCTION__, 85620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mHdmiFbNum, mWfdFbNum); 86620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 87620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 88620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::configureHDMIDisplay() { 89620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar openFrameBuffer(mHdmiFbNum); 90620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mFd == -1) 91620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return -1; 920ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R readCEUnderscanInfo(); 93620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar readResolution(); 94620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar // TODO: Move this to activate 95c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R /* Used for changing the resolution 96c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R * getUserMode will get the preferred 97c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R * mode set thru adb shell */ 98c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R int mode = getUserMode(); 99c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R if (mode == -1) { 100c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R //Get the best mode and set 101c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R mode = getBestMode(); 102c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 103c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R setResolution(mode); 104620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setDpyHdmiAttr(); 105620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 106aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar // set system property 107aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar property_set("hw.hdmiON", "1"); 108620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return 0; 109620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 110620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 111620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::configureWFDDisplay() { 112620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar int ret = 0; 113620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mHdmiFbNum) { 114620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGE("%s: Cannot process WFD connection while HDMI is active", 115620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar __FUNCTION__); 116620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return -1; 117620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 118620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar openFrameBuffer(mWfdFbNum); 119620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mFd == -1) 120620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return -1; 121620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ret = ioctl(mFd, FBIOGET_VSCREENINFO, &mVInfo); 122620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(ret < 0) { 123620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD("In %s: FBIOGET_VSCREENINFO failed Err Str = %s", __FUNCTION__, 124620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar strerror(errno)); 125620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 126620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setDpyWfdAttr(); 127620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(true, mWfdFbNum); 128620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return 0; 129620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 130620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 131620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::teardownHDMIDisplay() { 132620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mHdmiFbNum) { 133620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar // hdmi offline event..! 134620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar closeFrameBuffer(); 135620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar resetInfo(); 136620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(false); 137aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar // unset system property 138aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar property_set("hw.hdmiON", "0"); 139620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 140620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return 0; 141620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 142ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 143620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::teardownWFDDisplay() { 144620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mWfdFbNum) { 145620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar // wfd offline event..! 146620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar closeFrameBuffer(); 147620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar memset(&mVInfo, 0, sizeof(mVInfo)); 148620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(false); 149620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 150620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return 0; 151620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 152ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 153aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumarint ExternalDisplay::ignoreRequest(const char *str) { 154620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar const char *s1 = str + strlen("change@/devices/virtual/switch/"); 155aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar if(!strncmp(s1,"wfd",strlen(s1))) { 156aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mHdmiFbNum) { 157aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar ALOGE("Ignore wfd event when HDMI is active"); 158aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar return true; 159aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar } 160620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 161aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar return false; 162620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 163ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 164ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 165080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer AhmedExternalDisplay::ExternalDisplay(hwc_context_t* ctx):mFd(-1), 166620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mCurrentMode(-1), mConnected(0), mConnectedFbNum(0), mModeCount(0), 16790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mUnderscanSupported(false), mHwcContext(ctx), mHdmiFbNum(-1), 16890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mWfdFbNum(-1), mExtDpyNum(HWC_DISPLAY_EXTERNAL) 169ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 170080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed memset(&mVInfo, 0, sizeof(mVInfo)); 171620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar //Determine the fb index for external display devices. 172620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar updateExtDispDevFbIndex(); 173a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R // disable HPD at start, it will be enabled later 174a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R // when the display powers on 175a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R // This helps for framework reboot or adb shell stop/start 176a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R writeHPDOption(0); 17790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar 17856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R // for HDMI - retreive all the modes supported by the driver 17956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R if(mHdmiFbNum != -1) { 18056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R supported_video_mode_lut = 18156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R new msm_hdmi_mode_timing_info[HDMI_VFRMT_MAX]; 18256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R // Populate the mode table for supported modes 18356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R MSM_HDMI_MODES_INIT_TIMINGS(supported_video_mode_lut); 18456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R MSM_HDMI_MODES_SET_SUPP_TIMINGS(supported_video_mode_lut, 18556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R MSM_HDMI_MODES_ALL); 1869d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R // Update the Source Product Information 1879d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R // Vendor Name 1889d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R setSPDInfo("vendor_name", "ro.product.manufacturer"); 1899d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R // Product Description 1909d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R setSPDInfo("product_description", "ro.product.name"); 1919d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R } 1929d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R} 1939d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R/* gets the product manufacturer and product name and writes it 1949d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R * to the sysfs node, so that the driver can get that information 1959d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R * Used to show QCOM 8974 instead of Input 1 for example 1969d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R */ 1979d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.Rvoid ExternalDisplay::setSPDInfo(const char* node, const char* property) { 1989d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R int err = -1; 1999d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R char info[PROPERTY_VALUE_MAX]; 2009d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R char sysFsSPDFilePath[MAX_SYSFS_FILE_PATH]; 2019d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R memset(sysFsSPDFilePath, 0, sizeof(sysFsSPDFilePath)); 2029d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R snprintf(sysFsSPDFilePath , sizeof(sysFsSPDFilePath), 2039d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R "/sys/devices/virtual/graphics/fb%d/%s", 2049d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R mHdmiFbNum, node); 2059d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R int spdFile = open(sysFsSPDFilePath, O_RDWR, 0); 2069d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R if (spdFile < 0) { 2079d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R ALOGE("%s: file '%s' not found : ret = %d" 2089d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R "err str: %s", __FUNCTION__, sysFsSPDFilePath, 2099d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R spdFile, strerror(errno)); 2109d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R } else { 2119d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R memset(info, 0, sizeof(info)); 2129d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R property_get(property, info, UNKNOWN_STRING); 2139d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R ALOGD_IF(DEBUG, "In %s: %s = %s", __FUNCTION__, property, info); 2149d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R if (strncmp(info, UNKNOWN_STRING, SPD_NAME_LENGTH)) { 2159d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R err = write(spdFile, info, strlen(info)); 2169d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R if (err <= 0) { 2179d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R ALOGE("%s: file write failed for '%s'" 2189d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R "err no = %d", __FUNCTION__, sysFsSPDFilePath, errno); 2199d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R } 2209d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R } else { 2219d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R ALOGD_IF(DEBUG, "%s: property_get failed for SPD %s", 2229d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R __FUNCTION__, node); 2239d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R } 2249d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R close(spdFile); 22556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R } 226ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 227ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 228bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::setEDIDMode(int resMode) { 229bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah ALOGD_IF(DEBUG,"resMode=%d ", resMode); 230bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah { 231bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah Mutex::Autolock lock(mExtDispLock); 232620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(false); 233620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar openFrameBuffer(mHdmiFbNum); 234bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah setResolution(resMode); 235bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah } 236620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 237bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 238bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 239bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::setHPD(uint32_t startEnd) { 240bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah ALOGD_IF(DEBUG,"HPD enabled=%d", startEnd); 241bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah writeHPDOption(startEnd); 242bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 243bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 244bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::setActionSafeDimension(int w, int h) { 245bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah ALOGD_IF(DEBUG,"ActionSafe w=%d h=%d", w, h); 246bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah Mutex::Autolock lock(mExtDispLock); 2470ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char actionsafeWidth[PROPERTY_VALUE_MAX]; 2480ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char actionsafeHeight[PROPERTY_VALUE_MAX]; 2499d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R snprintf(actionsafeWidth, sizeof(actionsafeWidth), "%d", w); 2500ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R property_set("hw.actionsafe.width", actionsafeWidth); 2519d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R snprintf(actionsafeHeight, sizeof(actionsafeHeight), "%d", h); 2520ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R property_set("hw.actionsafe.height", actionsafeHeight); 253620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 254bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 255bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 256bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahint ExternalDisplay::getModeCount() const { 257bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah ALOGD_IF(DEBUG,"HPD mModeCount=%d", mModeCount); 258bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah Mutex::Autolock lock(mExtDispLock); 259bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah return mModeCount; 260bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 261bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 262bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::getEDIDModes(int *out) const { 263bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah Mutex::Autolock lock(mExtDispLock); 264bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah for(int i = 0;i < mModeCount;i++) { 265bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah out[i] = mEDIDModes[i]; 266bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah } 267bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 268bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 2690ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.Rvoid ExternalDisplay::readCEUnderscanInfo() 2700ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R{ 2710ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R int hdmiScanInfoFile = -1; 2720ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R int len = -1; 2730ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char scanInfo[17]; 2740ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char *ce_info_str = NULL; 2750ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R const char token[] = ", \n"; 2760ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R int ce_info = -1; 2779d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R char sysFsScanInfoFilePath[MAX_SYSFS_FILE_PATH]; 2789d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R snprintf(sysFsScanInfoFilePath, sizeof(sysFsScanInfoFilePath), 2799d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R "/sys/devices/virtual/graphics/fb%d/" 2800ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R "scan_info", mHdmiFbNum); 2810ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 2820ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R memset(scanInfo, 0, sizeof(scanInfo)); 2830ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R hdmiScanInfoFile = open(sysFsScanInfoFilePath, O_RDONLY, 0); 2840ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (hdmiScanInfoFile < 0) { 2850ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ALOGD_IF(DEBUG, "%s: scan_info file '%s' not found", 2860ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R __FUNCTION__, sysFsScanInfoFilePath); 2870ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R return; 2880ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } else { 2890ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R len = read(hdmiScanInfoFile, scanInfo, sizeof(scanInfo)-1); 2900ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ALOGD("%s: Scan Info string: %s length = %d", 2910ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R __FUNCTION__, scanInfo, len); 2920ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (len <= 0) { 2930ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R close(hdmiScanInfoFile); 2940ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ALOGE("%s: Scan Info file empty '%s'", 2950ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R __FUNCTION__, sysFsScanInfoFilePath); 2960ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R return; 2970ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 2980ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R scanInfo[len] = '\0'; /* null terminate the string */ 2990ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 3000ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R close(hdmiScanInfoFile); 3010ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 3020ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R /* 3030ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R * The scan_info contains the three fields 3040ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R * PT - preferred video format 3050ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R * IT - video format 3060ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R * CE video format - containing the underscan support information 3070ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R */ 3080ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 3090ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R /* PT */ 3100ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ce_info_str = strtok(scanInfo, token); 3110ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info_str) { 3120ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R /* IT */ 3130ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ce_info_str = strtok(NULL, token); 3140ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info_str) { 3150ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R /* CE */ 3160ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ce_info_str = strtok(NULL, token); 3170ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info_str) 3180ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ce_info = atoi(ce_info_str); 3190ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 3200ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 3210ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 3220ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info_str) { 3230ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // ce_info contains the underscan information 3240ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info == EXT_SCAN_ALWAYS_UNDERSCANED || 3250ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ce_info == EXT_SCAN_BOTH_SUPPORTED) 3260ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // if TV supported underscan, then driver will always underscan 3270ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // hence no need to apply action safe rectangle 3280ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R mUnderscanSupported = true; 3290ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } else { 3300ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ALOGE("%s: scan_info string error", __FUNCTION__); 3310ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 3320ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 3330ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // Store underscan support info in a system property 3340ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R const char* prop = (mUnderscanSupported) ? "1" : "0"; 3350ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R property_set("hw.underscan_supported", prop); 3360ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R return; 3370ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R} 3380ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 3391589dee5c27293d278d3e549af8a4bda27e080f8Naseer AhmedExternalDisplay::~ExternalDisplay() 3401589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 34156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R delete [] supported_video_mode_lut; 342080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed closeFrameBuffer(); 343ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 344ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 34556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R/* 34656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R * sets the fb_var_screeninfo from the hdmi_mode_timing_info 34756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R */ 34856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.Rvoid setDisplayTiming(struct fb_var_screeninfo &info, 34956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R const msm_hdmi_mode_timing_info* mode) 350ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 351ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.reserved[0] = 0; 352ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.reserved[1] = 0; 353ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.reserved[2] = 0; 354e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#ifndef FB_METADATA_VIDEO_INFO_CODE_SUPPORT 35556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.reserved[3] = (info.reserved[3] & 0xFFFF) | 35656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R (mode->video_format << 16); 357e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#endif 358ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.xoffset = 0; 359ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.yoffset = 0; 36056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.xres = mode->active_h; 36156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.yres = mode->active_v; 36256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R 36356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.pixclock = (mode->pixel_freq)*1000; 36456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.vmode = mode->interlaced ? 36556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R FB_VMODE_INTERLACED : FB_VMODE_NONINTERLACED; 36656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R 36756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.right_margin = mode->front_porch_h; 36856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.hsync_len = mode->pulse_width_h; 36956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.left_margin = mode->back_porch_h; 37056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.lower_margin = mode->front_porch_v; 37156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.vsync_len = mode->pulse_width_v; 37256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.upper_margin = mode->back_porch_v; 37356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R} 3741589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 375080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmedint ExternalDisplay::parseResolution(char* edidStr, int* edidModes) 376ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 377ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed char delim = ','; 378ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int count = 0; 379ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed char *start, *end; 380ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // EDIDs are string delimited by ',' 381ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // Ex: 16,4,5,3,32,34,1 382ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // Parse this string to get mode(int) 383ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed start = (char*) edidStr; 384080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed end = &delim; 385080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed while(*end == delim) { 386080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed edidModes[count] = (int) strtol(start, &end, 10); 387ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed start = end+1; 388ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed count++; 389ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 390080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD_IF(DEBUG, "In %s: count = %d", __FUNCTION__, count); 391080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed for (int i = 0; i < count; i++) 392080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD_IF(DEBUG, "Mode[%d] = %d", i, edidModes[i]); 393ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return count; 394ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 395080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed 3961589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedbool ExternalDisplay::readResolution() 397ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 3989d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R char sysFsEDIDFilePath[MAX_SYSFS_FILE_PATH]; 3999d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R snprintf(sysFsEDIDFilePath , sizeof(sysFsEDIDFilePath), 4009d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R "/sys/devices/virtual/graphics/fb%d/edid_modes", mHdmiFbNum); 401620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 402620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar int hdmiEDIDFile = open(sysFsEDIDFilePath, O_RDONLY, 0); 403ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int len = -1; 404ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 405ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if (hdmiEDIDFile < 0) { 406080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGE("%s: edid_modes file '%s' not found", 407620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar __FUNCTION__, sysFsEDIDFilePath); 408ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return false; 409ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } else { 410ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed len = read(hdmiEDIDFile, mEDIDs, sizeof(mEDIDs)-1); 4111589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGD_IF(DEBUG, "%s: EDID string: %s length = %d", 4121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed __FUNCTION__, mEDIDs, len); 413ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if ( len <= 0) { 414080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGE("%s: edid_modes file empty '%s'", 415620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar __FUNCTION__, sysFsEDIDFilePath); 416ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 417ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed else { 418ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed while (len > 1 && isspace(mEDIDs[len-1])) 419ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed --len; 420ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed mEDIDs[len] = 0; 421ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 422ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 423ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed close(hdmiEDIDFile); 424ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if(len > 0) { 425620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar // Get EDID modes from the EDID strings 426080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mModeCount = parseResolution(mEDIDs, mEDIDModes); 4271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGD_IF(DEBUG, "%s: mModeCount = %d", __FUNCTION__, 4281589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed mModeCount); 429ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 430ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 431ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return (strlen(mEDIDs) > 0); 432ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 433ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 434620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarbool ExternalDisplay::openFrameBuffer(int fbNum) 435ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 436080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if (mFd == -1) { 437620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mFd = open(msmFbDevicePath[fbNum-1], O_RDWR); 438080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if (mFd < 0) 439620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGE("%s: %s is not available", __FUNCTION__, 440620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar msmFbDevicePath[fbNum-1]); 441620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mHwcContext) { 44290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[mExtDpyNum].fd = mFd; 443620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 4442e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 445080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed return (mFd > 0); 446080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed} 447080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed 448080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmedbool ExternalDisplay::closeFrameBuffer() 449080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed{ 450080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed int ret = 0; 45150e19d2c536783fad3c29f8ffced6ba5915e7f06Naseer Ahmed if(mFd >= 0) { 452080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ret = close(mFd); 453080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mFd = -1; 454ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 4552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah if(mHwcContext) { 45690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[mExtDpyNum].fd = mFd; 4572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 458080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed return (ret == 0); 459ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 460ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 461080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed// clears the vinfo, edid, best modes 462080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmedvoid ExternalDisplay::resetInfo() 463080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed{ 464080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed memset(&mVInfo, 0, sizeof(mVInfo)); 465080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed memset(mEDIDs, 0, sizeof(mEDIDs)); 466080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed memset(mEDIDModes, 0, sizeof(mEDIDModes)); 467080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mModeCount = 0; 468080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mCurrentMode = -1; 4690ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R mUnderscanSupported = false; 4700ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // Reset the underscan supported system property 4710ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R const char* prop = "0"; 4720ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R property_set("hw.underscan_supported", prop); 473080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed} 474ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 4751589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedint ExternalDisplay::getModeOrder(int mode) 476ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 477c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R // XXX: We dont support interlaced modes but having 47856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R // it here for future 479ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed switch (mode) { 480ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed default: 48156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x480i60_4_3: 482ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return 1; // 480i 4:3 48356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x480i60_16_9: 484ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return 2; // 480i 16:9 48556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x576i50_4_3: 486ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return 3; // i576i 4:3 48756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x576i50_16_9: 488ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return 4; // 576i 16:9 489ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R case HDMI_VFRMT_1920x1080i60_16_9: 490ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 5; // 1080i 16:9 49156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_640x480p60_4_3: 492ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 6; // 640x480 4:3 49356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x480p60_4_3: 494ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 7; // 480p 4:3 49556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x480p60_16_9: 496ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 8; // 480p 16:9 49756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x576p50_4_3: 498ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 9; // 576p 4:3 49956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x576p50_16_9: 500ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 10; // 576p 16:9 501ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R case HDMI_VFRMT_1280x1024p60_5_4: 502ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 11; // 1024p; Vesa format 50356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1280x720p50_16_9: 504ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 12; // 720p@50Hz 50556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1280x720p60_16_9: 506ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 13; // 720p@60Hz 50756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p24_16_9: 508ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 14; //1080p@24Hz 50956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p25_16_9: 510ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 15; //108-p@25Hz 51156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p30_16_9: 512ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 16; //1080p@30Hz 51356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p50_16_9: 514ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 17; //1080p@50Hz 51556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p60_16_9: 516ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 18; //1080p@60Hz 51793497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_2560x1600p60_16_9: 51893497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel return 19; //WQXGA@60Hz541 51993497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_3840x2160p24_16_9: 52093497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel return 20;//2160@24Hz 52193497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_3840x2160p25_16_9: 52293497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel return 21;//2160@25Hz 52393497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_3840x2160p30_16_9: 52493497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel return 22; //2160@30Hz 52593497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_4096x2160p24_16_9: 52693497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel return 23; //4kx2k@24Hz 5271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 528ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 529ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 530c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R/// Returns the user mode set(if any) using adb shell 531c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.Rint ExternalDisplay::getUserMode() { 532c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R /* Based on the property set the resolution */ 533c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R char property_value[PROPERTY_VALUE_MAX]; 53496b413618bcdd213927494ca85f022bc78bbc60fArun Kumar K.R property_get("hw.hdmi.resolution", property_value, "-1"); 535c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R int mode = atoi(property_value); 536c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R // We dont support interlaced modes 537c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R if(isValidMode(mode) && !isInterlacedMode(mode)) { 53859644b2127280052ca410cb053f0a41c3181a97aNaseer Ahmed ALOGD_IF(DEBUG, "%s: setting the HDMI mode = %d", __FUNCTION__, mode); 539c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R return mode; 540c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 541c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R return -1; 542c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R} 543c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R 544ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed// Get the best mode for the current HD TV 5451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedint ExternalDisplay::getBestMode() { 546ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int bestOrder = 0; 54756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R int bestMode = HDMI_VFRMT_640x480p60_4_3; 548bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah Mutex::Autolock lock(mExtDispLock); 549ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // for all the edid read, get the best mode 550ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed for(int i = 0; i < mModeCount; i++) { 551ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int mode = mEDIDModes[i]; 552ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int order = getModeOrder(mode); 553ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if (order > bestOrder) { 554ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed bestOrder = order; 555ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed bestMode = mode; 556ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 557ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 558ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return bestMode; 5591589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 560ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 5611589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedinline bool ExternalDisplay::isValidMode(int ID) 562ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 563c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R bool valid = false; 564c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R for (int i = 0; i < mModeCount; i++) { 565c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R if(ID == mEDIDModes[i]) { 566c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R valid = true; 567c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R break; 568c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 569c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 570c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R return valid; 571c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R} 572c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R 573c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R// returns true if the mode(ID) is interlaced mode format 574c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.Rbool ExternalDisplay::isInterlacedMode(int ID) { 575c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R bool interlaced = false; 576c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R switch(ID) { 57756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x480i60_4_3: 57856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x480i60_16_9: 57956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x576i50_4_3: 58056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x576i50_16_9: 58156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080i60_16_9: 582c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R interlaced = true; 583c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R default: 584c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R interlaced = false; 585c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 586c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R return interlaced; 587ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 588ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 5891589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedvoid ExternalDisplay::setResolution(int ID) 590ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 591ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed struct fb_var_screeninfo info; 592080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed int ret = 0; 593080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ret = ioctl(mFd, FBIOGET_VSCREENINFO, &mVInfo); 594080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if(ret < 0) { 595080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD("In %s: FBIOGET_VSCREENINFO failed Err Str = %s", __FUNCTION__, 596080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed strerror(errno)); 597080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed } 598080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD_IF(DEBUG, "%s: GET Info<ID=%d %dx%d (%d,%d,%d)," 599080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed "(%d,%d,%d) %dMHz>", __FUNCTION__, 600080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.reserved[3], mVInfo.xres, mVInfo.yres, 601080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin, 602080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin, 603080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.pixclock/1000/1000); 604c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R //If its a new ID - update var_screeninfo 605080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if ((isValidMode(ID)) && mCurrentMode != ID) { 60656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R const struct msm_hdmi_mode_timing_info *mode = 6071589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed &supported_video_mode_lut[0]; 60856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R for (unsigned int i = 0; i < HDMI_VFRMT_MAX; ++i) { 60956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R const struct msm_hdmi_mode_timing_info *cur = 61056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R &supported_video_mode_lut[i]; 61156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R if (cur->video_format == (uint32_t)ID) { 612ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed mode = cur; 61356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R break; 61456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R } 615ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 61656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R setDisplayTiming(mVInfo, mode); 617080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD_IF(DEBUG, "%s: SET Info<ID=%d => Info<ID=%d %dx %d" 6181589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed "(%d,%d,%d), (%d,%d,%d) %dMHz>", __FUNCTION__, ID, 61997133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R mode->video_format, mVInfo.xres, mVInfo.yres, 620080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin, 621080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin, 622080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.pixclock/1000/1000); 623e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#ifdef FB_METADATA_VIDEO_INFO_CODE_SUPPORT 624e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang struct msmfb_metadata metadata; 625e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang memset(&metadata, 0 , sizeof(metadata)); 626e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang metadata.op = metadata_op_vic; 627e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang metadata.data.video_info_code = mode->video_format; 628e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang if (ioctl(mFd, MSMFB_METADATA_SET, &metadata) == -1) { 629e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang ALOGD("In %s: MSMFB_METADATA_SET failed Err Str = %s", 630e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang __FUNCTION__, strerror(errno)); 631e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang } 632e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#endif 63397133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R mVInfo.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_ALL | FB_ACTIVATE_FORCE; 63497133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R ret = ioctl(mFd, FBIOPUT_VSCREENINFO, &mVInfo); 63597133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R if(ret < 0) { 63697133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R ALOGD("In %s: FBIOPUT_VSCREENINFO failed Err Str = %s", 63797133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R __FUNCTION__, strerror(errno)); 63897133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R } 639080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mCurrentMode = ID; 640ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 641ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 642ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 643620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setExternalDisplay(bool connected, int extFbNum) 644ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 645ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed hwc_context_t* ctx = mHwcContext; 646ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if(ctx) { 647620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG, "%s: connected = %d", __FUNCTION__, connected); 648ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // Store the external display 649620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mConnected = connected; 650620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mConnectedFbNum = extFbNum; 65190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[mExtDpyNum].connected = connected; 652620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar // Update external fb number in Overlay context 653620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar overlay::Overlay::getInstance()->setExtFbNum(extFbNum); 654ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 655620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 656620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 657620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::getExtFbNum(int &fbNum) { 658620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar int ret = -1; 659620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mConnected) { 660620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar fbNum = mConnectedFbNum; 661620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ret = 0; 662620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 663620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return ret; 664ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 665ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 6661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedbool ExternalDisplay::writeHPDOption(int userOption) const 667ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 668ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed bool ret = true; 6699d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R char sysFsHPDFilePath[MAX_SYSFS_FILE_PATH]; 6709d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R snprintf(sysFsHPDFilePath ,sizeof(sysFsHPDFilePath), 6719d2cf700ca8ae9be23b549f3d4432fa0850e2572Arun Kumar K.R "/sys/devices/virtual/graphics/fb%d/hpd", mHdmiFbNum); 672620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar int hdmiHPDFile = open(sysFsHPDFilePath,O_RDWR, 0); 673ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if (hdmiHPDFile < 0) { 674620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGE("%s: state file '%s' not found : ret%d err str: %s", __FUNCTION__, 675620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar sysFsHPDFilePath, hdmiHPDFile, strerror(errno)); 676ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed ret = false; 677ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } else { 678ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int err = -1; 679620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG, "%s: option = %d", __FUNCTION__, userOption); 680ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if(userOption) 681ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed err = write(hdmiHPDFile, "1", 2); 682ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed else 683ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed err = write(hdmiHPDFile, "0" , 2); 684ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if (err <= 0) { 685620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGE("%s: file write failed '%s'", __FUNCTION__, sysFsHPDFilePath); 686ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed ret = false; 687ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 688ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed close(hdmiHPDFile); 689ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 690ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return ret; 691ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 692080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed 693620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setDpyWfdAttr() { 694620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mHwcContext) { 69590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[mExtDpyNum].xres = mVInfo.xres; 69690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[mExtDpyNum].yres = mVInfo.yres; 69790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[mExtDpyNum].vsync_period = 698620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 1000000000l /60; 699620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"%s: wfd...connected..!",__FUNCTION__); 700620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 701620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 702620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 703620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setDpyHdmiAttr() { 7042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int width = 0, height = 0, fps = 0; 7052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah getAttrForMode(width, height, fps); 7062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah if(mHwcContext) { 70776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("ExtDisplay setting xres = %d, yres = %d", width, height); 7082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].xres = width; 7092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].yres = height; 71076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].vsync_period = 71176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 1000000000l / fps; 7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 7142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 715620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::getAttrForMode(int& width, int& height, int& fps) { 7162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch (mCurrentMode) { 71756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_640x480p60_4_3: 7182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 640; 7192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 480; 7202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 60; 7212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 72256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x480p60_4_3: 72356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x480p60_16_9: 7242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 720; 7252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 480; 7262e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 60; 7272e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 72856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x576p50_4_3: 72956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x576p50_16_9: 7302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 720; 7312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 576; 7322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 50; 7332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 73456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1280x720p50_16_9: 7352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1280; 7362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 720; 7372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 50; 7382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 73956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1280x720p60_16_9: 7402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1280; 7412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 720; 7422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 60; 7432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 744ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R case HDMI_VFRMT_1280x1024p60_5_4: 745ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R width = 1280; 746ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R height = 1024; 747ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R fps = 60; 748ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R break; 74956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p24_16_9: 7502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 7512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 7522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 24; 7532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 75456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p25_16_9: 7552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 7562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 7572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 25; 7582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 75956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p30_16_9: 7602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 7612e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 7622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 30; 7632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 76456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p50_16_9: 7652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 7662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 7672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 50; 7682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 76956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p60_16_9: 7702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 7712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 7722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 60; 7732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 77493497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_2560x1600p60_16_9: 77593497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel width = 2560; 77693497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel height = 1600; 77793497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel fps = 60; 77893497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel break; 77993497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_3840x2160p24_16_9: 78093497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel width = 3840; 78193497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel height = 2160; 78293497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel fps = 24; 78393497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel break; 784d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R case HDMI_VFRMT_3840x2160p25_16_9: 785d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R width = 3840; 786d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R height = 2160; 787d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R fps = 25; 788d0d432cf032707cbdea7635619ad5622bfc1b371Arun Kumar K.R break; 78993497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_3840x2160p30_16_9: 79093497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel width = 3840; 79193497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel height = 2160; 79293497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel fps = 30; 79393497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel break; 79493497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel case HDMI_VFRMT_4096x2160p24_16_9: 79593497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel width = 4096; 79693497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel height = 2160; 79793497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel fps = 24; 79893497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel break; 79993497cfeef2625f01515de8bdc51f3195a23fb31Ujwal Patel 800080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed } 801080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed} 802080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed 803ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}; 804