1 /* 2 * Copyright (c) 2013, The Linux Foundation. All rights reserved. 3 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above 10 * copyright notice, this list of conditions and the following 11 * disclaimer in the documentation and/or other materials provided 12 * with the distribution. 13 * * Neither the name of The Linux Foundation nor the names of its 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #include "qd_utils.h" 31 32 33 #define MAX_FRAME_BUFFER_NAME_SIZE (80) 34 #define QD_UTILS_DEBUG 0 35 36 int getHDMINode(void) 37 { 38 FILE *displayDeviceFP = NULL; 39 char fbType[MAX_FRAME_BUFFER_NAME_SIZE]; 40 char msmFbTypePath[MAX_FRAME_BUFFER_NAME_SIZE]; 41 int j = 0; 42 43 for(j = 0; j < HWC_NUM_DISPLAY_TYPES; j++) { 44 snprintf (msmFbTypePath, sizeof(msmFbTypePath), 45 "/sys/class/graphics/fb%d/msm_fb_type", j); 46 displayDeviceFP = fopen(msmFbTypePath, "r"); 47 if(displayDeviceFP) { 48 fread(fbType, sizeof(char), MAX_FRAME_BUFFER_NAME_SIZE, 49 displayDeviceFP); 50 if(strncmp(fbType, "dtv panel", strlen("dtv panel")) == 0) { 51 ALOGD("%s: HDMI is at fb%d", __func__, j); 52 fclose(displayDeviceFP); 53 break; 54 } 55 fclose(displayDeviceFP); 56 } else { 57 ALOGE("%s: Failed to open fb node %d", __func__, j); 58 } 59 } 60 61 if (j < HWC_NUM_DISPLAY_TYPES) 62 return j; 63 else 64 ALOGE("%s: Failed to find HDMI node", __func__); 65 66 return -1; 67 } 68 69 int getEdidRawData(char *buffer) 70 { 71 int size; 72 int edidFile; 73 char msmFbTypePath[MAX_FRAME_BUFFER_NAME_SIZE]; 74 int node_id = getHDMINode(); 75 76 if (node_id < 0) { 77 ALOGE("%s no HDMI node found", __func__); 78 return 0; 79 } 80 81 snprintf(msmFbTypePath, sizeof(msmFbTypePath), 82 "/sys/class/graphics/fb%d/edid_raw_data", node_id); 83 84 edidFile = open(msmFbTypePath, O_RDONLY, 0); 85 86 if (edidFile < 0) { 87 ALOGE("%s no edid raw data found", __func__); 88 return 0; 89 } 90 91 size = (int)read(edidFile, (char*)buffer, EDID_RAW_DATA_SIZE); 92 close(edidFile); 93 return size; 94 } 95 96 /* Calculates the aspect ratio for based on src & dest */ 97 void getAspectRatioPosition(int destWidth, int destHeight, int srcWidth, 98 int srcHeight, hwc_rect_t& rect) { 99 int x =0, y =0; 100 101 if (srcWidth * destHeight > destWidth * srcHeight) { 102 srcHeight = destWidth * srcHeight / srcWidth; 103 srcWidth = destWidth; 104 } else if (srcWidth * destHeight < destWidth * srcHeight) { 105 srcWidth = destHeight * srcWidth / srcHeight; 106 srcHeight = destHeight; 107 } else { 108 srcWidth = destWidth; 109 srcHeight = destHeight; 110 } 111 if (srcWidth > destWidth) srcWidth = destWidth; 112 if (srcHeight > destHeight) srcHeight = destHeight; 113 x = (destWidth - srcWidth) / 2; 114 y = (destHeight - srcHeight) / 2; 115 ALOGD_IF(QD_UTILS_DEBUG, "%s: AS Position: x = %d, y = %d w = %d h = %d", 116 __FUNCTION__, x, y, srcWidth , srcHeight); 117 // Convert it back to hwc_rect_t 118 rect.left = x; 119 rect.top = y; 120 rect.right = srcWidth + rect.left; 121 rect.bottom = srcHeight + rect.top; 122 } 123 124