cec: attempt to get the edid from nvidia's driver on linux via /proc/acpi/video/NGFX...
authorLars Op den Kamp <lars@opdenkamp.eu>
Mon, 4 Jun 2012 07:38:31 +0000 (09:38 +0200)
committerLars Op den Kamp <lars@opdenkamp.eu>
Mon, 4 Jun 2012 08:12:16 +0000 (10:12 +0200)
project/libcec.vcxproj
project/libcec.vcxproj.filters
src/lib/Makefile.am
src/lib/adapter/USBCECAdapterCommunication.cpp
src/lib/platform/nvidia/nv-edid.cpp [new file with mode: 0644]
src/lib/platform/nvidia/nv-edid.h [new file with mode: 0644]

index 9ee2db38e3436837b8926bf9f8db8087cda36530..29fb6892af9b2963537946a91d05f99193639b79 100644 (file)
@@ -50,6 +50,7 @@
     <ClInclude Include="..\src\lib\platform\adl\adl_defines.h" />
     <ClInclude Include="..\src\lib\platform\adl\adl_sdk.h" />
     <ClInclude Include="..\src\lib\platform\adl\adl_structures.h" />
+    <ClInclude Include="..\src\lib\platform\nvidia\nv-edid.h" />
     <ClInclude Include="..\src\lib\platform\os.h" />
     <ClInclude Include="..\src\lib\platform\sockets\serialport.h" />
     <ClInclude Include="..\src\lib\platform\sockets\socket.h" />
@@ -91,6 +92,7 @@
     <ClCompile Include="..\src\lib\LibCECC.cpp" />
     <ClCompile Include="..\src\lib\LibCECDll.cpp" />
     <ClCompile Include="..\src\lib\platform\adl\adl-edid.cpp" />
+    <ClCompile Include="..\src\lib\platform\nvidia\nv-edid.cpp" />
     <ClCompile Include="..\src\lib\platform\windows\dlfcn-win32.cpp" />
     <ClCompile Include="..\src\lib\platform\windows\os-edid.cpp" />
     <ClCompile Include="..\src\lib\platform\windows\os-threads.cpp" />
index 0fb251b6ab091c30438f13fdde428c2137d13bd1..58d0dbbfa321031d88bfb9093586fa5c0953d2b1 100644 (file)
@@ -31,6 +31,9 @@
     <Filter Include="platform\adl">
       <UniqueIdentifier>{4fbd02e2-5671-4132-9b37-964c17fb3b0d}</UniqueIdentifier>
     </Filter>
+    <Filter Include="platform\nvidia">
+      <UniqueIdentifier>{685e2589-204d-4f9a-a637-a7ba1b61c669}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\src\lib\CECProcessor.h" />
     <ClInclude Include="..\src\lib\platform\windows\dlfcn-win32.h">
       <Filter>platform\windows</Filter>
     </ClInclude>
+    <ClInclude Include="..\src\lib\platform\nvidia\nv-edid.h">
+      <Filter>platform\nvidia</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\src\lib\CECProcessor.cpp" />
     <ClCompile Include="..\src\lib\platform\windows\dlfcn-win32.cpp">
       <Filter>platform\windows</Filter>
     </ClCompile>
+    <ClCompile Include="..\src\lib\platform\nvidia\nv-edid.cpp">
+      <Filter>platform\nvidia</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="libcec.rc" />
index 3ece384d8c40a6a2efa2c7ea303f2558ba1b9d85..30637f2920a091df0e365a4486d8a5fa62906b50 100644 (file)
@@ -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
index 1940e88aaba12fb5e34964efb5deb913347369b1..bc451676280cadf7388ca1d373cfa331127e0179 100644 (file)
@@ -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 (file)
index 0000000..0c0bbd6
--- /dev/null
@@ -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       <license@pulse-eight.com>
+ *     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 (file)
index 0000000..81f10ce
--- /dev/null
@@ -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       <license@pulse-eight.com>
+ *     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);
+
+  };
+}