From 61cc6036562a3b9eba3c725366f4d3cf779e11d5 Mon Sep 17 00:00:00 2001 From: Ken Zhang Date: Sun, 2 Jun 2013 10:54:16 -0400 Subject: [PATCH] libqdutils: add edid raw data reading support Add API getEdidRawData to fill the input buffer with edid raw data(640 bytes) Change-Id: I993c3fdc01b469f65d78d8f5d05c46c54d4e580d --- libqdutils/Android.mk | 2 +- libqdutils/qd_utils.cpp | 95 +++++++++++++++++++++++++++++++++++++++++ libqdutils/qd_utils.h | 50 ++++++++++++++++++++++ 3 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 libqdutils/qd_utils.cpp create mode 100644 libqdutils/qd_utils.h diff --git a/libqdutils/Android.mk b/libqdutils/Android.mk index 459f548eb9..b6bbc47296 100644 --- a/libqdutils/Android.mk +++ b/libqdutils/Android.mk @@ -10,7 +10,7 @@ LOCAL_CFLAGS := $(common_flags) -DLOG_TAG=\"qdutils\" LOCAL_ADDITIONAL_DEPENDENCIES := $(common_deps) LOCAL_SRC_FILES := profiler.cpp mdp_version.cpp \ idle_invalidator.cpp \ - comptype.cpp + comptype.cpp qd_utils.cpp include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) diff --git a/libqdutils/qd_utils.cpp b/libqdutils/qd_utils.cpp new file mode 100644 index 0000000000..5a457d0a26 --- /dev/null +++ b/libqdutils/qd_utils.cpp @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2013, The Linux Foundation. All rights reserved. + + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "qd_utils.h" + + +#define MAX_FRAME_BUFFER_NAME_SIZE (80) +#define MAX_DISPLAY_DEVICES (3) + +int getHDMINode(void) +{ + FILE *displayDeviceFP = NULL; + char fbType[MAX_FRAME_BUFFER_NAME_SIZE]; + char msmFbTypePath[MAX_FRAME_BUFFER_NAME_SIZE]; + int j = 0; + + for(j = 0; j < MAX_DISPLAY_DEVICES; j++) { + snprintf (msmFbTypePath, sizeof(msmFbTypePath), + "/sys/class/graphics/fb%d/msm_fb_type", j); + displayDeviceFP = fopen(msmFbTypePath, "r"); + if(displayDeviceFP) { + fread(fbType, sizeof(char), MAX_FRAME_BUFFER_NAME_SIZE, + displayDeviceFP); + if(strncmp(fbType, "dtv panel", strlen("dtv panel")) == 0) { + ALOGD("%s: HDMI is at fb%d", __func__, j); + fclose(displayDeviceFP); + break; + } + fclose(displayDeviceFP); + } else { + ALOGE("%s: Failed to open fb node %d", __func__, j); + } + } + + if (j < MAX_DISPLAY_DEVICES) + return j; + else + ALOGE("%s: Failed to find HDMI node", __func__); + + return -1; +} + +int getEdidRawData(char *buffer) +{ + int size; + int edidFile; + char msmFbTypePath[MAX_FRAME_BUFFER_NAME_SIZE]; + int node_id = getHDMINode(); + + if (node_id < 0) { + ALOGE("%s no HDMI node found", __func__); + return 0; + } + + snprintf(msmFbTypePath, sizeof(msmFbTypePath), + "/sys/class/graphics/fb%d/edid_raw_data", node_id); + + edidFile = open(msmFbTypePath, O_RDONLY, 0); + + if (edidFile < 0) { + ALOGE("%s no edid raw data found", __func__); + return 0; + } + + size = read(edidFile, (char*)buffer, EDID_RAW_DATA_SIZE); + close(edidFile); + return size; +} + diff --git a/libqdutils/qd_utils.h b/libqdutils/qd_utils.h new file mode 100644 index 0000000000..cca55d5865 --- /dev/null +++ b/libqdutils/qd_utils.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2013, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation or the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _QD_UTIL_MISC_H +#define _QD_UTIL_MISC_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define EDID_RAW_DATA_SIZE 640 + +int getEdidRawData(char *buffer); + +#endif