[FreeBSD] update adapter detection
authorFneufneu <fneufneu@xbmc.org>
Wed, 12 Jun 2013 15:06:41 +0000 (17:06 +0200)
committerFneufneu <fneufneu@xbmc.org>
Wed, 12 Jun 2013 15:10:51 +0000 (17:10 +0200)
src/lib/adapter/Pulse-Eight/USBCECAdapterDetection.cpp

index 73af24ab29948088f1f107ba3714ed0ef97297e6..58bf4a562abd17697a85c15e5fe6bf99e2d237e9 100644 (file)
@@ -61,10 +61,10 @@ extern "C" {
 #include <libudev.h>
 }
 #elif defined(__FreeBSD__)
+#include <sys/param.h>
+#include <sys/sysctl.h>
 #include <stdio.h>
 #include <unistd.h>
-#include <sys/types.h>
-#include <sys/sysctl.h>
 #endif
 
 #define CEC_VID  0x2548
@@ -445,17 +445,26 @@ uint8_t CUSBCECAdapterDetection::FindAdapters(cec_adapter_descriptor *deviceList
 
   for (i = 0; ; ++i)
   {
+    unsigned int iVendor, iProduct;
     memset(infos, 0, sizeof(infos));
     (void)snprintf(sysctlname, sizeof(sysctlname),
       "dev.umodem.%d.%%pnpinfo", i);
     if (sysctlbyname(sysctlname, infos, &infos_size,
       NULL, 0) != 0)
         break;
-    if (strstr(infos, "vendor=0x2548") == NULL)
+    pos = strstr(infos, "vendor=");
+    if (pos == NULL)
       continue;
-    if (strstr(infos, "product=0x1001") == NULL
-    && strstr(infos, "product=0x1002") == NULL)
+    sscanf(pos, "vendor=%x ", &iVendor);
+
+    pos = strstr(infos, "product=");
+    if (pos == NULL)
+      continue;
+    sscanf(pos, "product=%x ", &iProduct);
+
+    if (iVendor != CEC_VID || (iProduct != CEC_PID && iProduct != CEC_PID2))
       continue;
+
     pos = strstr(infos, "ttyname=");
     if (pos == NULL)
       continue;
@@ -464,13 +473,38 @@ uint8_t CUSBCECAdapterDetection::FindAdapters(cec_adapter_descriptor *deviceList
     (void)snprintf(devicePath, sizeof(devicePath),
       "/dev/tty%s", ttyname);
 
-    if (strDevicePath &&
-        strcmp(devicePath, strDevicePath) != 0)
-      continue;
+    if (strDevicePath) {
+      char currStrDevicePath[512];
+      int port = 0;
+      int devaddr = 0;
+      memset(currStrDevicePath, 0, sizeof(currStrDevicePath));
+      memset(infos, 0, sizeof(infos));
+      (void)snprintf(sysctlname, sizeof(sysctlname),
+        "dev.umodem.%d.%%location", i);
+      if (sysctlbyname(sysctlname, infos, &infos_size,
+        NULL, 0) != 0)
+          break;
+
+      pos = strstr(infos, "port=");
+      if (pos == NULL)
+        continue;
+      sscanf(pos, "port=%d ", &port);
+
+      pos = strstr(infos, "devaddr=");
+      if (pos == NULL)
+        continue;
+      sscanf(pos, "devaddr=%d ", &devaddr);
+
+      (void)snprintf(currStrDevicePath, sizeof(currStrDevicePath),
+        "/dev/ugen%d.%d", port, devaddr);
+
+      if (strcmp(currStrDevicePath, strDevicePath) != 0)
+        continue;
+    }
     snprintf(deviceList[iFound].strComPath, sizeof(deviceList[iFound].strComPath), "%s", devicePath);
     snprintf(deviceList[iFound].strComName, sizeof(deviceList[iFound].strComName), "%s", devicePath);
-    deviceList[iFound].iVendorId = CEC_VID;
-    deviceList[iFound].iProductId = CEC_VID;
+    deviceList[iFound].iVendorId = iVendor;
+    deviceList[iFound].iProductId = iProduct;
     deviceList[iFound].adapterType = ADAPTERTYPE_P8_EXTERNAL; // will be overridden when not doing a "quick scan" by the actual type
     iFound++;
   }