diff options
-rw-r--r-- | src/serialport/qserialportinfo_unix.cpp | 80 | ||||
-rw-r--r-- | src/serialport/qtudev_p.h | 2 |
2 files changed, 49 insertions, 33 deletions
diff --git a/src/serialport/qserialportinfo_unix.cpp b/src/serialport/qserialportinfo_unix.cpp index 4fc6650..61d21d6 100644 --- a/src/serialport/qserialportinfo_unix.cpp +++ b/src/serialport/qserialportinfo_unix.cpp @@ -234,6 +234,45 @@ QString getUdevPropertyValue(struct ::udev_device *dev, const char *name) return QString::fromLatin1(::udev_device_get_property_value(dev, name)); } +static +bool checkUdevForSerial8250Driver(struct ::udev_device *dev) +{ + const QString driverName = QString::fromLatin1(::udev_device_get_driver(dev)); + return (driverName == QStringLiteral("serial8250")); +} + +static +QString getUdevModelName(struct ::udev_device *dev) +{ + return getUdevPropertyValue(dev, "ID_MODEL") + .replace(QLatin1Char('_'), QLatin1Char(' ')); +} + +static +QString getUdevVendorName(struct ::udev_device *dev) +{ + return getUdevPropertyValue(dev, "ID_VENDOR") + .replace(QLatin1Char('_'), QLatin1Char(' ')); +} + +static +quint16 getUdevModelIdentifier(struct ::udev_device *dev, bool &hasIdentifier) +{ + return getUdevPropertyValue(dev, "ID_MODEL_ID").toInt(&hasIdentifier, 16); +} + +static +quint16 getUdevVendorIdentifier(struct ::udev_device *dev, bool &hasIdentifier) +{ + return getUdevPropertyValue(dev, "ID_VENDOR_ID").toInt(&hasIdentifier, 16); +} + +static +QString getUdevSerialNumber(struct ::udev_device *dev) +{ + return getUdevPropertyValue(dev,"ID_SERIAL_SHORT"); +} + QList<QSerialPortInfo> availablePortsByUdev() { #ifndef LINK_LIBUDEV @@ -276,43 +315,18 @@ QList<QSerialPortInfo> availablePortsByUdev() if (parentdev) { - QString subsys = QString::fromLatin1(::udev_device_get_subsystem(parentdev)); - - if (subsys == QStringLiteral("usb-serial") - || subsys == QStringLiteral("usb")) { - serialPortInfo.d_ptr->description = - getUdevPropertyValue(dev.data(), "ID_MODEL").replace(QLatin1Char('_'), QLatin1Char(' ')); - - serialPortInfo.d_ptr->manufacturer = - getUdevPropertyValue(dev.data(), "ID_VENDOR").replace(QLatin1Char('_'), QLatin1Char(' ')); - - serialPortInfo.d_ptr->serialNumber = getUdevPropertyValue(dev.data(),"ID_SERIAL_SHORT"); - - serialPortInfo.d_ptr->vendorIdentifier = - getUdevPropertyValue(dev.data(), "ID_VENDOR_ID").toInt(&serialPortInfo.d_ptr->hasVendorIdentifier, 16); - - serialPortInfo.d_ptr->productIdentifier = - getUdevPropertyValue(dev.data(), "ID_MODEL_ID").toInt(&serialPortInfo.d_ptr->hasProductIdentifier, 16); - - } else if (subsys == QStringLiteral("pnp")) { - // TODO: Obtain more information - } else if (subsys == QStringLiteral("platform")) { + if (checkUdevForSerial8250Driver(parentdev)) continue; - } else if (subsys == QStringLiteral("pci")) { - serialPortInfo.d_ptr->description = - getUdevPropertyValue(dev.data(), "ID_MODEL"); - serialPortInfo.d_ptr->manufacturer = - getUdevPropertyValue(dev.data(), "ID_VENDOR"); + serialPortInfo.d_ptr->description = getUdevModelName(dev.data()); + serialPortInfo.d_ptr->manufacturer = getUdevVendorName(dev.data()); + serialPortInfo.d_ptr->serialNumber = getUdevSerialNumber(dev.data()); - serialPortInfo.d_ptr->vendorIdentifier = - getUdevPropertyValue(dev.data(), "ID_VENDOR_ID").toInt(&serialPortInfo.d_ptr->hasVendorIdentifier, 16); + serialPortInfo.d_ptr->vendorIdentifier = getUdevModelIdentifier( + dev.data(), serialPortInfo.d_ptr->hasVendorIdentifier); - serialPortInfo.d_ptr->productIdentifier = - getUdevPropertyValue(dev.data(), "ID_MODEL_ID").toInt(&serialPortInfo.d_ptr->hasProductIdentifier, 16); - } else { - // FIXME: Obtain more information - } + serialPortInfo.d_ptr->productIdentifier = getUdevVendorIdentifier( + dev.data(), serialPortInfo.d_ptr->hasProductIdentifier); } else { if (serialPortInfo.d_ptr->portName.startsWith(rfcommDeviceName)) { bool ok; diff --git a/src/serialport/qtudev_p.h b/src/serialport/qtudev_p.h index 434292d..0f0246d 100644 --- a/src/serialport/qtudev_p.h +++ b/src/serialport/qtudev_p.h @@ -82,6 +82,7 @@ GENERATE_SYMBOL_VARIABLE(struct udev_device *, udev_device_new_from_syspath, str GENERATE_SYMBOL_VARIABLE(const char *, udev_list_entry_get_name, struct udev_list_entry *) GENERATE_SYMBOL_VARIABLE(const char *, udev_device_get_devnode, struct udev_device *) GENERATE_SYMBOL_VARIABLE(const char *, udev_device_get_sysname, struct udev_device *) +GENERATE_SYMBOL_VARIABLE(const char *, udev_device_get_driver, struct udev_device *) GENERATE_SYMBOL_VARIABLE(struct udev_device *, udev_device_get_parent, struct udev_device *) GENERATE_SYMBOL_VARIABLE(const char *, udev_device_get_subsystem, struct udev_device *) GENERATE_SYMBOL_VARIABLE(const char *, udev_device_get_property_value, struct udev_device *, const char *) @@ -127,6 +128,7 @@ inline bool resolveSymbols(QLibrary *udevLibrary) RESOLVE_SYMBOL(udev_list_entry_get_name) RESOLVE_SYMBOL(udev_device_get_devnode) RESOLVE_SYMBOL(udev_device_get_sysname) + RESOLVE_SYMBOL(udev_device_get_driver) RESOLVE_SYMBOL(udev_device_get_parent) RESOLVE_SYMBOL(udev_device_get_subsystem) RESOLVE_SYMBOL(udev_device_get_property_value) |