169 lines
4.6 KiB
Text
169 lines
4.6 KiB
Text
--- kcontrol/usbview/usbdevices.h.orig 2006-07-22 10:15:22.000000000 +0200
|
|
+++ kcontrol/usbview/usbdevices.h 2009-06-20 13:19:42.000000000 +0200
|
|
@@ -17,7 +17,9 @@
|
|
#include <qptrlist.h>
|
|
|
|
#ifdef Q_OS_FREEBSD
|
|
-#include <dev/usb/usb.h>
|
|
+#include <libusb20.h>
|
|
+#include <dev/usb/usb_ioctl.h>
|
|
+#include <dev/usb/usb_revision.h>
|
|
#endif
|
|
|
|
class USBDB;
|
|
@@ -66,7 +68,7 @@
|
|
unsigned int _vendorID, _prodID, _revMajor, _revMinor;
|
|
|
|
#ifdef Q_OS_FREEBSD
|
|
- void collectData( int fd, int level, usb_device_info &di, int parent );
|
|
+ void collectData(struct libusb20_backend *, struct libusb20_device *);
|
|
QStringList _devnodes;
|
|
#endif
|
|
};
|
|
--- kcontrol/usbview/usbdevices.cpp.orig 2006-07-22 04:15:22.000000000 -0400
|
|
+++ kcontrol/usbview/usbdevices.cpp 2009-07-06 11:47:28.000000000 -0400
|
|
@@ -318,17 +318,25 @@
|
|
|
|
/*
|
|
* FreeBSD support by Markus Brueffer <markus@brueffer.de>
|
|
+ * libusb20 support by Hans Petter Selasky <hselasky@freebsd.org>
|
|
*
|
|
* Basic idea and some code fragments were taken from FreeBSD's usbdevs(8),
|
|
* originally developed for NetBSD, so this code should work with no or
|
|
* only little modification on NetBSD.
|
|
*/
|
|
|
|
-void USBDevice::collectData( int fd, int level, usb_device_info &di, int parent)
|
|
+void USBDevice::collectData(struct libusb20_backend *pbe,
|
|
+ struct libusb20_device *pdev)
|
|
{
|
|
+ char tempbuf[32];
|
|
+ struct usb_device_info di;
|
|
+
|
|
+ if (libusb20_dev_get_info(pdev, &di))
|
|
+ memset(&di, 0, sizeof(di));
|
|
+
|
|
// determine data for this device
|
|
- _level = level;
|
|
- _parent = parent;
|
|
+ _level = 0;
|
|
+ _parent = 0;
|
|
|
|
_bus = di.udi_bus;
|
|
_device = di.udi_addr;
|
|
@@ -345,87 +353,49 @@
|
|
_channels = di.udi_nports;
|
|
|
|
// determine the speed
|
|
-#if __FreeBSD_version > 490102
|
|
switch (di.udi_speed) {
|
|
- case USB_SPEED_LOW: _speed = 1.5; break;
|
|
- case USB_SPEED_FULL: _speed = 12.0; break;
|
|
- case USB_SPEED_HIGH: _speed = 480.0; break;
|
|
+ case LIBUSB20_SPEED_LOW: _speed = 1.5; break;
|
|
+ case LIBUSB20_SPEED_FULL: _speed = 12.0; break;
|
|
+ case LIBUSB20_SPEED_HIGH: _speed = 480.0; break;
|
|
+ case LIBUSB20_SPEED_VARIABLE: _speed = 480.0; break;
|
|
+ case LIBUSB20_SPEED_SUPER: _speed = 4800.0; break;
|
|
+ default: _speed = 480.0; break;
|
|
}
|
|
-#else
|
|
- _speed = di.udi_lowspeed ? 1.5 : 12.0;
|
|
-#endif
|
|
|
|
// Get all attached devicenodes
|
|
- for ( int i = 0; i < USB_MAX_DEVNAMES; ++i )
|
|
- if ( di.udi_devnames[i][0] )
|
|
- _devnodes << di.udi_devnames[i];
|
|
+ for (int i = 0; i < 32; ++i) {
|
|
+ if (libusb20_dev_get_iface_desc(pdev, i, tempbuf, sizeof(tempbuf)) == 0) {
|
|
+ _devnodes << tempbuf;
|
|
+ } else {
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
|
|
// For compatibility, split the revision number
|
|
sscanf( di.udi_release, "%x.%x", &_revMajor, &_revMinor );
|
|
|
|
- // Cycle through the attached devices if there are any
|
|
- for ( int p = 0; p < di.udi_nports; ++p ) {
|
|
- // Get data for device
|
|
- struct usb_device_info di2;
|
|
-
|
|
- di2.udi_addr = di.udi_ports[p];
|
|
-
|
|
- if ( di2.udi_addr >= USB_MAX_DEVICES )
|
|
- continue;
|
|
-
|
|
- if ( ioctl(fd, USB_DEVICEINFO, &di2) == -1 )
|
|
- continue;
|
|
-
|
|
- // Only add the device if we didn't detect it, yet
|
|
- if (!find( di2.udi_bus, di2.udi_addr ) )
|
|
- {
|
|
- USBDevice *device = new USBDevice();
|
|
- device->collectData( fd, level + 1, di2, di.udi_addr );
|
|
- }
|
|
- }
|
|
}
|
|
|
|
-
|
|
-
|
|
bool USBDevice::parse(QString fname)
|
|
{
|
|
- static bool showErrorMessage = true;
|
|
- bool error = false;
|
|
+ struct libusb20_backend *pbe;
|
|
+ struct libusb20_device *pdev;
|
|
+
|
|
_devices.clear();
|
|
|
|
- QFile controller("/dev/usb0");
|
|
- int i = 1;
|
|
- while ( controller.exists() )
|
|
- {
|
|
- // If the devicenode exists, continue with further inspection
|
|
- if ( controller.open(IO_ReadOnly) )
|
|
- {
|
|
- for ( int addr = 1; addr < USB_MAX_DEVICES; ++addr )
|
|
- {
|
|
- struct usb_device_info di;
|
|
-
|
|
- di.udi_addr = addr;
|
|
- if ( ioctl(controller.handle(), USB_DEVICEINFO, &di) != -1 )
|
|
- {
|
|
- if (!find( di.udi_bus, di.udi_addr ) )
|
|
- {
|
|
- USBDevice *device = new USBDevice();
|
|
- device->collectData( controller.handle(), 0, di, 0);
|
|
- }
|
|
- }
|
|
- }
|
|
- controller.close();
|
|
- } else {
|
|
- error = true;
|
|
- }
|
|
- controller.setName( QString::fromLocal8Bit("/dev/usb%1").arg(i++) );
|
|
- }
|
|
-
|
|
- if ( showErrorMessage && error ) {
|
|
- showErrorMessage = false;
|
|
- KMessageBox::error( 0, i18n("Could not open one or more USB controller. Make sure, you have read access to all USB controllers that should be listed here."));
|
|
+ pbe = libusb20_be_alloc_default();
|
|
+ if (pbe == NULL)
|
|
+ return (false);
|
|
+
|
|
+ pdev = NULL;
|
|
+
|
|
+ while ((pdev = libusb20_be_device_foreach(pbe, pdev))) {
|
|
+ USBDevice *device = new USBDevice();
|
|
+ device->collectData(pbe, pdev);
|
|
}
|
|
-
|
|
+
|
|
+ libusb20_be_free(pbe);
|
|
+
|
|
return true;
|
|
}
|
|
#endif
|