From cebbfe03806c603c65318fcdca7c7e194ea68bcc Mon Sep 17 00:00:00 2001 From: Lars Op den Kamp Date: Mon, 4 Jun 2012 09:38:31 +0200 Subject: [PATCH] cec: attempt to get the edid from nvidia's driver on linux via /proc/acpi/video/NGFX/HDMI/EDID --- project/libcec.vcxproj | 2 + project/libcec.vcxproj.filters | 9 +++ src/lib/Makefile.am | 3 +- .../adapter/USBCECAdapterCommunication.cpp | 12 ++++ src/lib/platform/nvidia/nv-edid.cpp | 63 +++++++++++++++++++ src/lib/platform/nvidia/nv-edid.h | 50 +++++++++++++++ 6 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 src/lib/platform/nvidia/nv-edid.cpp create mode 100644 src/lib/platform/nvidia/nv-edid.h diff --git a/project/libcec.vcxproj b/project/libcec.vcxproj index 9ee2db3..29fb689 100644 --- a/project/libcec.vcxproj +++ b/project/libcec.vcxproj @@ -50,6 +50,7 @@ + @@ -91,6 +92,7 @@ + diff --git a/project/libcec.vcxproj.filters b/project/libcec.vcxproj.filters index 0fb251b..58d0dbb 100644 --- a/project/libcec.vcxproj.filters +++ b/project/libcec.vcxproj.filters @@ -31,6 +31,9 @@ {4fbd02e2-5671-4132-9b37-964c17fb3b0d} + + {685e2589-204d-4f9a-a637-a7ba1b61c669} + @@ -164,6 +167,9 @@ platform\windows + + platform\nvidia + @@ -237,6 +243,9 @@ platform\windows + + platform\nvidia + diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 3ece384..30637f2 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -32,7 +32,8 @@ libcec_la_SOURCES = CECProcessor.cpp \ platform/posix/serialport.cpp \ platform/posix/serversocket.cpp\ platform/posix/os-edid.cpp \ - platform/adl/adl-edid.cpp + platform/adl/adl-edid.cpp \ + platform/nvidia/nv-edid.cpp libcec_la_LDFLAGS = @LIBS@ -version-info @VERSION@ libcec_la_CPPFLAGS = -I@abs_top_srcdir@/include diff --git a/src/lib/adapter/USBCECAdapterCommunication.cpp b/src/lib/adapter/USBCECAdapterCommunication.cpp index 1940e88..bc45167 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.cpp +++ b/src/lib/adapter/USBCECAdapterCommunication.cpp @@ -38,6 +38,7 @@ #include "../platform/util/util.h" #include "../platform/util/edid.h" #include "../platform/adl/adl-edid.h" +#include "../platform/nvidia/nv-edid.h" #include "../LibCEC.h" #include "../CECProcessor.h" @@ -576,6 +577,17 @@ uint16_t CUSBCECAdapterCommunication::GetPhysicalAddress(void) } #endif + // try to get the PA from the nvidia driver +#if defined(HAS_NVIDIA_EDID_PARSER) + if (iPA == 0) + { + LIB_CEC->AddLog(CEC_LOG_DEBUG, "%s - trying to get the physical address via nvidia driver", __FUNCTION__); + CNVEdidParser nv; + iPA = nv.GetPhysicalAddress(); + LIB_CEC->AddLog(CEC_LOG_DEBUG, "%s - nvidia driver returned physical address %04x", __FUNCTION__, iPA); + } +#endif + // try to get the PA from the OS if (iPA == 0) { diff --git a/src/lib/platform/nvidia/nv-edid.cpp b/src/lib/platform/nvidia/nv-edid.cpp new file mode 100644 index 0000000..0c0bbd6 --- /dev/null +++ b/src/lib/platform/nvidia/nv-edid.cpp @@ -0,0 +1,63 @@ +/* + * This file is part of the libCEC(R) library. + * + * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved. + * libCEC(R) is an original work, containing original code. + * + * libCEC(R) is a trademark of Pulse-Eight Limited. + * + * This program is dual-licensed; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * Alternatively, you can license this library under a commercial license, + * please contact Pulse-Eight Licensing for more information. + * + * For more information contact: + * Pulse-Eight Licensing + * http://www.pulse-eight.com/ + * http://www.pulse-eight.net/ + */ + +#include "nv-edid.h" + +using namespace PLATFORM; + +uint16_t CNVEdidParser::GetPhysicalAddress(void) +{ + uint16_t iPA(0); + +#if !defined(__WINDOWS__) + FILE *fp = fopen("/proc/acpi/video/NGFX/HDMI/EDID", "r"); + + if (fp) + { + char buf[4096]; + memset(buf, 0, sizeof(buf)); + int iPtr(0); + char c(0); + while (c != EOF) + { + c = fgetc(fp); + if (c != EOF) + buf[iPtr++] = c; + } + + iPA = CEDIDParser::GetPhysicalAddressFromEDID(buf, iPtr); + fclose(fp); + } +#endif + + return iPA; +} diff --git a/src/lib/platform/nvidia/nv-edid.h b/src/lib/platform/nvidia/nv-edid.h new file mode 100644 index 0000000..81f10ce --- /dev/null +++ b/src/lib/platform/nvidia/nv-edid.h @@ -0,0 +1,50 @@ +#pragma once +/* + * This file is part of the libCEC(R) library. + * + * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved. + * libCEC(R) is an original work, containing original code. + * + * libCEC(R) is a trademark of Pulse-Eight Limited. + * + * This program is dual-licensed; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * Alternatively, you can license this library under a commercial license, + * please contact Pulse-Eight Licensing for more information. + * + * For more information contact: + * Pulse-Eight Licensing + * http://www.pulse-eight.com/ + * http://www.pulse-eight.net/ + */ + +#define HAS_NVIDIA_EDID_PARSER + +#include "../os.h" +#include "../util/edid.h" + +namespace PLATFORM +{ + class CNVEdidParser + { + public: + CNVEdidParser(void) {}; + virtual ~CNVEdidParser(void) {}; + + uint16_t GetPhysicalAddress(void); + + }; +} -- 2.34.1