external.cpp revision ec56080710fee33d2e5cf1b022bc1080584c182b
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) 48620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 49620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 50620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarconst char* msmFbDevicePath[] = { "/dev/graphics/fb1", 51620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar "/dev/graphics/fb2"}; 52620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 53620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar/* 54620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar * Updates extDeviceFbIndex Array with the correct frame buffer indices 55620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar * of avaiable external devices 56620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar * 57620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar */ 58620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::updateExtDispDevFbIndex() 59620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar{ 60620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar FILE *displayDeviceFP = NULL; 61620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar char fbType[MAX_FRAME_BUFFER_NAME_SIZE]; 62620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar char msmFbTypePath[MAX_FRAME_BUFFER_NAME_SIZE]; 63620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 64620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar for(int j = 1; j < MAX_DISPLAY_DEVICES; j++) { 65620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar sprintf (msmFbTypePath,"/sys/class/graphics/fb%d/msm_fb_type", j); 66620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar displayDeviceFP = fopen(msmFbTypePath, "r"); 67620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(displayDeviceFP){ 68620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar fread(fbType, sizeof(char), MAX_FRAME_BUFFER_NAME_SIZE, 69620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar displayDeviceFP); 70620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(strncmp(fbType, "dtv panel", strlen("dtv panel")) == 0){ 71620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"hdmi framebuffer index is %d",j); 72620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mHdmiFbNum = j; 73620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } else if(strncmp(fbType, "writeback panel", 74620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar strlen("writeback panel")) == 0){ 75620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"wfd framebuffer index is %d",j); 76620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mWfdFbNum = j; 77620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 78620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar fclose(displayDeviceFP); 79620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 80620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 81620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"%s: mHdmiFbNum: %d mWfdFbNum: %d ",__FUNCTION__, 82620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mHdmiFbNum, mWfdFbNum); 83620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 84620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 85620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::configureHDMIDisplay() { 86620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar openFrameBuffer(mHdmiFbNum); 87620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mFd == -1) 88620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return -1; 890ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R readCEUnderscanInfo(); 90620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar readResolution(); 91620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar // TODO: Move this to activate 92c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R /* Used for changing the resolution 93c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R * getUserMode will get the preferred 94c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R * mode set thru adb shell */ 95c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R int mode = getUserMode(); 96c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R if (mode == -1) { 97c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R //Get the best mode and set 98c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R mode = getBestMode(); 99c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 100c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R setResolution(mode); 101620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setDpyHdmiAttr(); 102620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 103aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar // set system property 104aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar property_set("hw.hdmiON", "1"); 105620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return 0; 106620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 107620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 108620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::configureWFDDisplay() { 109620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar int ret = 0; 110620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mHdmiFbNum) { 111620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGE("%s: Cannot process WFD connection while HDMI is active", 112620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar __FUNCTION__); 113620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return -1; 114620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 115620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar openFrameBuffer(mWfdFbNum); 116620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mFd == -1) 117620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return -1; 118620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ret = ioctl(mFd, FBIOGET_VSCREENINFO, &mVInfo); 119620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(ret < 0) { 120620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD("In %s: FBIOGET_VSCREENINFO failed Err Str = %s", __FUNCTION__, 121620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar strerror(errno)); 122620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 123620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setDpyWfdAttr(); 124620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(true, mWfdFbNum); 125620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return 0; 126620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 127620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 128620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::teardownHDMIDisplay() { 129620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mHdmiFbNum) { 130620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar // hdmi offline event..! 131620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar closeFrameBuffer(); 132620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar resetInfo(); 133620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(false); 134aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar // unset system property 135aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar property_set("hw.hdmiON", "0"); 136620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 137620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return 0; 138620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 139ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 140620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::teardownWFDDisplay() { 141620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mWfdFbNum) { 142620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar // wfd offline event..! 143620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar closeFrameBuffer(); 144620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar memset(&mVInfo, 0, sizeof(mVInfo)); 145620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(false); 146620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 147620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return 0; 148620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 149ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 150aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumarint ExternalDisplay::ignoreRequest(const char *str) { 151620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar const char *s1 = str + strlen("change@/devices/virtual/switch/"); 152aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar if(!strncmp(s1,"wfd",strlen(s1))) { 153aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar if(mConnectedFbNum == mHdmiFbNum) { 154aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar ALOGE("Ignore wfd event when HDMI is active"); 155aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar return true; 156aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar } 157620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 158aca973d77f39ea40b62eed400ee37ca9b0904be6Amara Venkata Mastan Manoj Kumar return false; 159620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 160ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 161ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 162080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer AhmedExternalDisplay::ExternalDisplay(hwc_context_t* ctx):mFd(-1), 163620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mCurrentMode(-1), mConnected(0), mConnectedFbNum(0), mModeCount(0), 16490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mUnderscanSupported(false), mHwcContext(ctx), mHdmiFbNum(-1), 16590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mWfdFbNum(-1), mExtDpyNum(HWC_DISPLAY_EXTERNAL) 166ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 167080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed memset(&mVInfo, 0, sizeof(mVInfo)); 168620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar //Determine the fb index for external display devices. 169620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar updateExtDispDevFbIndex(); 170a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R // disable HPD at start, it will be enabled later 171a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R // when the display powers on 172a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R // This helps for framework reboot or adb shell stop/start 173a0ab8e632404bb11744420accaa9eaddf198c4a9Arun Kumar K.R writeHPDOption(0); 17490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar 17556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R // for HDMI - retreive all the modes supported by the driver 17656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R if(mHdmiFbNum != -1) { 17756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R supported_video_mode_lut = 17856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R new msm_hdmi_mode_timing_info[HDMI_VFRMT_MAX]; 17956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R // Populate the mode table for supported modes 18056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R MSM_HDMI_MODES_INIT_TIMINGS(supported_video_mode_lut); 18156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R MSM_HDMI_MODES_SET_SUPP_TIMINGS(supported_video_mode_lut, 18256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R MSM_HDMI_MODES_ALL); 18356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R } 184ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 185ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 186bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::setEDIDMode(int resMode) { 187bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah ALOGD_IF(DEBUG,"resMode=%d ", resMode); 188bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah { 189bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah Mutex::Autolock lock(mExtDispLock); 190620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(false); 191620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar openFrameBuffer(mHdmiFbNum); 192bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah setResolution(resMode); 193bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah } 194620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 195bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 196bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 197bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::setHPD(uint32_t startEnd) { 198bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah ALOGD_IF(DEBUG,"HPD enabled=%d", startEnd); 199bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah writeHPDOption(startEnd); 200bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 201bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 202bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::setActionSafeDimension(int w, int h) { 203bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah ALOGD_IF(DEBUG,"ActionSafe w=%d h=%d", w, h); 204bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah Mutex::Autolock lock(mExtDispLock); 2050ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char actionsafeWidth[PROPERTY_VALUE_MAX]; 2060ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char actionsafeHeight[PROPERTY_VALUE_MAX]; 2070ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R sprintf(actionsafeWidth, "%d", w); 2080ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R property_set("hw.actionsafe.width", actionsafeWidth); 2090ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R sprintf(actionsafeHeight, "%d", h); 2100ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R property_set("hw.actionsafe.height", actionsafeHeight); 211620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar setExternalDisplay(true, mHdmiFbNum); 212bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 213bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 214bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahint ExternalDisplay::getModeCount() const { 215bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah ALOGD_IF(DEBUG,"HPD mModeCount=%d", mModeCount); 216bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah Mutex::Autolock lock(mExtDispLock); 217bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah return mModeCount; 218bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 219bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 220bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahvoid ExternalDisplay::getEDIDModes(int *out) const { 221bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah Mutex::Autolock lock(mExtDispLock); 222bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah for(int i = 0;i < mModeCount;i++) { 223bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah out[i] = mEDIDModes[i]; 224bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah } 225bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 226bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 2270ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.Rvoid ExternalDisplay::readCEUnderscanInfo() 2280ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R{ 2290ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R int hdmiScanInfoFile = -1; 2300ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R int len = -1; 2310ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char scanInfo[17]; 2320ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char *ce_info_str = NULL; 2330ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R const char token[] = ", \n"; 2340ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R int ce_info = -1; 2350ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R char sysFsScanInfoFilePath[128]; 2360ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R sprintf(sysFsScanInfoFilePath, "/sys/devices/virtual/graphics/fb%d/" 2370ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R "scan_info", mHdmiFbNum); 2380ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 2390ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R memset(scanInfo, 0, sizeof(scanInfo)); 2400ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R hdmiScanInfoFile = open(sysFsScanInfoFilePath, O_RDONLY, 0); 2410ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (hdmiScanInfoFile < 0) { 2420ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ALOGD_IF(DEBUG, "%s: scan_info file '%s' not found", 2430ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R __FUNCTION__, sysFsScanInfoFilePath); 2440ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R return; 2450ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } else { 2460ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R len = read(hdmiScanInfoFile, scanInfo, sizeof(scanInfo)-1); 2470ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ALOGD("%s: Scan Info string: %s length = %d", 2480ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R __FUNCTION__, scanInfo, len); 2490ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (len <= 0) { 2500ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R close(hdmiScanInfoFile); 2510ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ALOGE("%s: Scan Info file empty '%s'", 2520ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R __FUNCTION__, sysFsScanInfoFilePath); 2530ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R return; 2540ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 2550ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R scanInfo[len] = '\0'; /* null terminate the string */ 2560ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 2570ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R close(hdmiScanInfoFile); 2580ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 2590ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R /* 2600ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R * The scan_info contains the three fields 2610ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R * PT - preferred video format 2620ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R * IT - video format 2630ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R * CE video format - containing the underscan support information 2640ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R */ 2650ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 2660ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R /* PT */ 2670ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ce_info_str = strtok(scanInfo, token); 2680ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info_str) { 2690ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R /* IT */ 2700ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ce_info_str = strtok(NULL, token); 2710ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info_str) { 2720ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R /* CE */ 2730ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ce_info_str = strtok(NULL, token); 2740ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info_str) 2750ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ce_info = atoi(ce_info_str); 2760ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 2770ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 2780ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 2790ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info_str) { 2800ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // ce_info contains the underscan information 2810ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R if (ce_info == EXT_SCAN_ALWAYS_UNDERSCANED || 2820ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ce_info == EXT_SCAN_BOTH_SUPPORTED) 2830ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // if TV supported underscan, then driver will always underscan 2840ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // hence no need to apply action safe rectangle 2850ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R mUnderscanSupported = true; 2860ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } else { 2870ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R ALOGE("%s: scan_info string error", __FUNCTION__); 2880ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R } 2890ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 2900ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // Store underscan support info in a system property 2910ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R const char* prop = (mUnderscanSupported) ? "1" : "0"; 2920ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R property_set("hw.underscan_supported", prop); 2930ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R return; 2940ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R} 2950ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 2961589dee5c27293d278d3e549af8a4bda27e080f8Naseer AhmedExternalDisplay::~ExternalDisplay() 2971589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 29856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R delete [] supported_video_mode_lut; 299080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed closeFrameBuffer(); 300ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 301ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 30256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R/* 30356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R * sets the fb_var_screeninfo from the hdmi_mode_timing_info 30456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R */ 30556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.Rvoid setDisplayTiming(struct fb_var_screeninfo &info, 30656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R const msm_hdmi_mode_timing_info* mode) 307ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 308ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.reserved[0] = 0; 309ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.reserved[1] = 0; 310ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.reserved[2] = 0; 311e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#ifndef FB_METADATA_VIDEO_INFO_CODE_SUPPORT 31256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.reserved[3] = (info.reserved[3] & 0xFFFF) | 31356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R (mode->video_format << 16); 314e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#endif 315ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.xoffset = 0; 316ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed info.yoffset = 0; 31756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.xres = mode->active_h; 31856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.yres = mode->active_v; 31956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R 32056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.pixclock = (mode->pixel_freq)*1000; 32156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.vmode = mode->interlaced ? 32256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R FB_VMODE_INTERLACED : FB_VMODE_NONINTERLACED; 32356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R 32456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.right_margin = mode->front_porch_h; 32556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.hsync_len = mode->pulse_width_h; 32656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.left_margin = mode->back_porch_h; 32756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.lower_margin = mode->front_porch_v; 32856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.vsync_len = mode->pulse_width_v; 32956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R info.upper_margin = mode->back_porch_v; 33056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R} 3311589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 332080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmedint ExternalDisplay::parseResolution(char* edidStr, int* edidModes) 333ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 334ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed char delim = ','; 335ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int count = 0; 336ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed char *start, *end; 337ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // EDIDs are string delimited by ',' 338ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // Ex: 16,4,5,3,32,34,1 339ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // Parse this string to get mode(int) 340ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed start = (char*) edidStr; 341080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed end = &delim; 342080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed while(*end == delim) { 343080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed edidModes[count] = (int) strtol(start, &end, 10); 344ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed start = end+1; 345ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed count++; 346ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 347080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD_IF(DEBUG, "In %s: count = %d", __FUNCTION__, count); 348080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed for (int i = 0; i < count; i++) 349080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD_IF(DEBUG, "Mode[%d] = %d", i, edidModes[i]); 350ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return count; 351ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 352080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed 3531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedbool ExternalDisplay::readResolution() 354ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 355620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar char sysFsEDIDFilePath[255]; 356620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar sprintf(sysFsEDIDFilePath , "/sys/devices/virtual/graphics/fb%d/edid_modes", 357620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mHdmiFbNum); 358620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 359620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar int hdmiEDIDFile = open(sysFsEDIDFilePath, O_RDONLY, 0); 360ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int len = -1; 361ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 362ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if (hdmiEDIDFile < 0) { 363080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGE("%s: edid_modes file '%s' not found", 364620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar __FUNCTION__, sysFsEDIDFilePath); 365ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return false; 366ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } else { 367ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed len = read(hdmiEDIDFile, mEDIDs, sizeof(mEDIDs)-1); 3681589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGD_IF(DEBUG, "%s: EDID string: %s length = %d", 3691589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed __FUNCTION__, mEDIDs, len); 370ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if ( len <= 0) { 371080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGE("%s: edid_modes file empty '%s'", 372620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar __FUNCTION__, sysFsEDIDFilePath); 373ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 374ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed else { 375ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed while (len > 1 && isspace(mEDIDs[len-1])) 376ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed --len; 377ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed mEDIDs[len] = 0; 378ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 379ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 380ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed close(hdmiEDIDFile); 381ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if(len > 0) { 382620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar // Get EDID modes from the EDID strings 383080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mModeCount = parseResolution(mEDIDs, mEDIDModes); 3841589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGD_IF(DEBUG, "%s: mModeCount = %d", __FUNCTION__, 3851589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed mModeCount); 386ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 387ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 388ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return (strlen(mEDIDs) > 0); 389ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 390ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 391620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarbool ExternalDisplay::openFrameBuffer(int fbNum) 392ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 393080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if (mFd == -1) { 394620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mFd = open(msmFbDevicePath[fbNum-1], O_RDWR); 395080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if (mFd < 0) 396620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGE("%s: %s is not available", __FUNCTION__, 397620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar msmFbDevicePath[fbNum-1]); 398620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mHwcContext) { 39990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[mExtDpyNum].fd = mFd; 400620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 4012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 402080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed return (mFd > 0); 403080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed} 404080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed 405080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmedbool ExternalDisplay::closeFrameBuffer() 406080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed{ 407080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed int ret = 0; 40850e19d2c536783fad3c29f8ffced6ba5915e7f06Naseer Ahmed if(mFd >= 0) { 409080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ret = close(mFd); 410080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mFd = -1; 411ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 4122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah if(mHwcContext) { 41390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[mExtDpyNum].fd = mFd; 4142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 415080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed return (ret == 0); 416ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 417ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 418080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed// clears the vinfo, edid, best modes 419080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmedvoid ExternalDisplay::resetInfo() 420080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed{ 421080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed memset(&mVInfo, 0, sizeof(mVInfo)); 422080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed memset(mEDIDs, 0, sizeof(mEDIDs)); 423080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed memset(mEDIDModes, 0, sizeof(mEDIDModes)); 424080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mModeCount = 0; 425080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mCurrentMode = -1; 4260ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R mUnderscanSupported = false; 4270ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R // Reset the underscan supported system property 4280ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R const char* prop = "0"; 4290ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R property_set("hw.underscan_supported", prop); 430080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed} 431ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 4321589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedint ExternalDisplay::getModeOrder(int mode) 433ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 434c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R // XXX: We dont support interlaced modes but having 43556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R // it here for future 436ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed switch (mode) { 437ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed default: 43856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x480i60_4_3: 439ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return 1; // 480i 4:3 44056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x480i60_16_9: 441ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return 2; // 480i 16:9 44256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x576i50_4_3: 443ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return 3; // i576i 4:3 44456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x576i50_16_9: 445ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return 4; // 576i 16:9 446ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R case HDMI_VFRMT_1920x1080i60_16_9: 447ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 5; // 1080i 16:9 44856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_640x480p60_4_3: 449ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 6; // 640x480 4:3 45056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x480p60_4_3: 451ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 7; // 480p 4:3 45256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x480p60_16_9: 453ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 8; // 480p 16:9 45456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x576p50_4_3: 455ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 9; // 576p 4:3 45656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x576p50_16_9: 457ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 10; // 576p 16:9 458ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R case HDMI_VFRMT_1280x1024p60_5_4: 459ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 11; // 1024p; Vesa format 46056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1280x720p50_16_9: 461ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 12; // 720p@50Hz 46256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1280x720p60_16_9: 463ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 13; // 720p@60Hz 46456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p24_16_9: 465ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 14; //1080p@24Hz 46656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p25_16_9: 467ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 15; //108-p@25Hz 46856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p30_16_9: 469ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 16; //1080p@30Hz 47056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p50_16_9: 471ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 17; //1080p@50Hz 47256e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p60_16_9: 473ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R return 18; //1080p@60Hz 4741589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 475ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 476ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 477c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R/// Returns the user mode set(if any) using adb shell 478c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.Rint ExternalDisplay::getUserMode() { 479c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R /* Based on the property set the resolution */ 480c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R char property_value[PROPERTY_VALUE_MAX]; 48196b413618bcdd213927494ca85f022bc78bbc60fArun Kumar K.R property_get("hw.hdmi.resolution", property_value, "-1"); 482c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R int mode = atoi(property_value); 483c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R // We dont support interlaced modes 484c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R if(isValidMode(mode) && !isInterlacedMode(mode)) { 48559644b2127280052ca410cb053f0a41c3181a97aNaseer Ahmed ALOGD_IF(DEBUG, "%s: setting the HDMI mode = %d", __FUNCTION__, mode); 486c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R return mode; 487c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 488c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R return -1; 489c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R} 490c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R 491ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed// Get the best mode for the current HD TV 4921589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedint ExternalDisplay::getBestMode() { 493ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int bestOrder = 0; 49456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R int bestMode = HDMI_VFRMT_640x480p60_4_3; 495bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah Mutex::Autolock lock(mExtDispLock); 496ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // for all the edid read, get the best mode 497ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed for(int i = 0; i < mModeCount; i++) { 498ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int mode = mEDIDModes[i]; 499ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int order = getModeOrder(mode); 500ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if (order > bestOrder) { 501ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed bestOrder = order; 502ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed bestMode = mode; 503ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 504ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 505ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return bestMode; 5061589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 507ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 5081589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedinline bool ExternalDisplay::isValidMode(int ID) 509ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 510c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R bool valid = false; 511c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R for (int i = 0; i < mModeCount; i++) { 512c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R if(ID == mEDIDModes[i]) { 513c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R valid = true; 514c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R break; 515c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 516c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 517c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R return valid; 518c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R} 519c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R 520c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R// returns true if the mode(ID) is interlaced mode format 521c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.Rbool ExternalDisplay::isInterlacedMode(int ID) { 522c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R bool interlaced = false; 523c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R switch(ID) { 52456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x480i60_4_3: 52556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x480i60_16_9: 52656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x576i50_4_3: 52756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1440x576i50_16_9: 52856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080i60_16_9: 529c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R interlaced = true; 530c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R default: 531c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R interlaced = false; 532c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R } 533c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R return interlaced; 534ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 535ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 5361589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedvoid ExternalDisplay::setResolution(int ID) 537ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 538ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed struct fb_var_screeninfo info; 539080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed int ret = 0; 540080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ret = ioctl(mFd, FBIOGET_VSCREENINFO, &mVInfo); 541080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if(ret < 0) { 542080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD("In %s: FBIOGET_VSCREENINFO failed Err Str = %s", __FUNCTION__, 543080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed strerror(errno)); 544080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed } 545080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD_IF(DEBUG, "%s: GET Info<ID=%d %dx%d (%d,%d,%d)," 546080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed "(%d,%d,%d) %dMHz>", __FUNCTION__, 547080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.reserved[3], mVInfo.xres, mVInfo.yres, 548080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin, 549080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin, 550080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.pixclock/1000/1000); 551c5bb51f047f080f2920994cfbd788d27800a8e89Arun Kumar K.R //If its a new ID - update var_screeninfo 552080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if ((isValidMode(ID)) && mCurrentMode != ID) { 55356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R const struct msm_hdmi_mode_timing_info *mode = 5541589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed &supported_video_mode_lut[0]; 55556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R for (unsigned int i = 0; i < HDMI_VFRMT_MAX; ++i) { 55656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R const struct msm_hdmi_mode_timing_info *cur = 55756e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R &supported_video_mode_lut[i]; 55856e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R if (cur->video_format == (uint32_t)ID) { 559ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed mode = cur; 56056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R break; 56156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R } 562ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 56356e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R setDisplayTiming(mVInfo, mode); 564080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed ALOGD_IF(DEBUG, "%s: SET Info<ID=%d => Info<ID=%d %dx %d" 5651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed "(%d,%d,%d), (%d,%d,%d) %dMHz>", __FUNCTION__, ID, 56697133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R mode->video_format, mVInfo.xres, mVInfo.yres, 567080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.right_margin, mVInfo.hsync_len, mVInfo.left_margin, 568080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.lower_margin, mVInfo.vsync_len, mVInfo.upper_margin, 569080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mVInfo.pixclock/1000/1000); 570e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#ifdef FB_METADATA_VIDEO_INFO_CODE_SUPPORT 571e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang struct msmfb_metadata metadata; 572e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang memset(&metadata, 0 , sizeof(metadata)); 573e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang metadata.op = metadata_op_vic; 574e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang metadata.data.video_info_code = mode->video_format; 575e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang if (ioctl(mFd, MSMFB_METADATA_SET, &metadata) == -1) { 576e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang ALOGD("In %s: MSMFB_METADATA_SET failed Err Str = %s", 577e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang __FUNCTION__, strerror(errno)); 578e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang } 579e31290730a9c47d2d02b0ef1d7d766280fea17bcKen Zhang#endif 58097133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R mVInfo.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_ALL | FB_ACTIVATE_FORCE; 58197133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R ret = ioctl(mFd, FBIOPUT_VSCREENINFO, &mVInfo); 58297133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R if(ret < 0) { 58397133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R ALOGD("In %s: FBIOPUT_VSCREENINFO failed Err Str = %s", 58497133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R __FUNCTION__, strerror(errno)); 58597133affcb6618a547b5650771a97cd104b06405Arun Kumar K.R } 586080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed mCurrentMode = ID; 587ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 588ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 589ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 590620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setExternalDisplay(bool connected, int extFbNum) 591ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 592ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed hwc_context_t* ctx = mHwcContext; 593ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if(ctx) { 594620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG, "%s: connected = %d", __FUNCTION__, connected); 595ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // Store the external display 596620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mConnected = connected; 597620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mConnectedFbNum = extFbNum; 59890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[mExtDpyNum].connected = connected; 599620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar // Update external fb number in Overlay context 600620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar overlay::Overlay::getInstance()->setExtFbNum(extFbNum); 601ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 602620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 603620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 604620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarint ExternalDisplay::getExtFbNum(int &fbNum) { 605620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar int ret = -1; 606620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mConnected) { 607620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar fbNum = mConnectedFbNum; 608620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ret = 0; 609620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 610620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar return ret; 611ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 612ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 6131589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedbool ExternalDisplay::writeHPDOption(int userOption) const 614ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 615ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed bool ret = true; 616620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar char sysFsHPDFilePath[255]; 617620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar sprintf(sysFsHPDFilePath ,"/sys/devices/virtual/graphics/fb%d/hpd", 618620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar mHdmiFbNum); 619620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar int hdmiHPDFile = open(sysFsHPDFilePath,O_RDWR, 0); 620ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if (hdmiHPDFile < 0) { 621620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGE("%s: state file '%s' not found : ret%d err str: %s", __FUNCTION__, 622620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar sysFsHPDFilePath, hdmiHPDFile, strerror(errno)); 623ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed ret = false; 624ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } else { 625ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int err = -1; 626620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG, "%s: option = %d", __FUNCTION__, userOption); 627ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if(userOption) 628ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed err = write(hdmiHPDFile, "1", 2); 629ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed else 630ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed err = write(hdmiHPDFile, "0" , 2); 631ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if (err <= 0) { 632620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGE("%s: file write failed '%s'", __FUNCTION__, sysFsHPDFilePath); 633ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed ret = false; 634ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 635ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed close(hdmiHPDFile); 636ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 637ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return ret; 638ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 639080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed 640620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setDpyWfdAttr() { 641620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar if(mHwcContext) { 64290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[mExtDpyNum].xres = mVInfo.xres; 64390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[mExtDpyNum].yres = mVInfo.yres; 64490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar mHwcContext->dpyAttr[mExtDpyNum].vsync_period = 645620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 1000000000l /60; 646620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar ALOGD_IF(DEBUG,"%s: wfd...connected..!",__FUNCTION__); 647620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar } 648620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar} 649620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumar 650620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::setDpyHdmiAttr() { 6512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int width = 0, height = 0, fps = 0; 6522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah getAttrForMode(width, height, fps); 6532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah if(mHwcContext) { 65476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("ExtDisplay setting xres = %d, yres = %d", width, height); 6552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].xres = width; 6562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].yres = height; 65776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah mHwcContext->dpyAttr[HWC_DISPLAY_EXTERNAL].vsync_period = 65876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 1000000000l / fps; 6592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 6602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 6612e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 662620fc1f5f84e968c2e9b803e8580ee718c3c3f65Amara Venkata Mastan Manoj Kumarvoid ExternalDisplay::getAttrForMode(int& width, int& height, int& fps) { 6632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch (mCurrentMode) { 66456e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_640x480p60_4_3: 6652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 640; 6662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 480; 6672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 60; 6682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 66956e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x480p60_4_3: 67056e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x480p60_16_9: 6712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 720; 6722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 480; 6732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 60; 6742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 67556e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x576p50_4_3: 67656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_720x576p50_16_9: 6772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 720; 6782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 576; 6792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 50; 6802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 68156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1280x720p50_16_9: 6822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1280; 6832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 720; 6842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 50; 6852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 68656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1280x720p60_16_9: 6872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1280; 6882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 720; 6892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 60; 6902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 691ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R case HDMI_VFRMT_1280x1024p60_5_4: 692ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R width = 1280; 693ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R height = 1024; 694ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R fps = 60; 695ec56080710fee33d2e5cf1b022bc1080584c182bArun Kumar K.R break; 69656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p24_16_9: 6972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 6982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 6992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 24; 7002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 70156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p25_16_9: 7022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 7032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 7042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 25; 7052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 70656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p30_16_9: 7072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 7082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 7092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 30; 7102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 71156e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p50_16_9: 7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 7142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 50; 7152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 71656e7f2675db48df98bff43b6e8d0e0828875e04fArun Kumar K.R case HDMI_VFRMT_1920x1080p60_16_9: 7172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah width = 1920; 7182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah height = 1080; 7192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fps = 60; 7202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 721080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed } 722080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed} 723080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed 724ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}; 725