#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
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;
(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++;
}