From fc2526644003e80346d231b3904aa10340e7d9b2 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Fri, 14 Sep 2007 20:52:38 +0000 Subject: Device detection based on USB PIDs. This is currently linux only and requires libusb. There is also no way to figure the mount point from the USB PID so the old methods are tried for this. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14698 a1c6a512-1295-4272-9138-f99709370657 --- rbutil/rbutilqt/autodetection.cpp | 87 +++++++++++++++++++++++++++++++++++++-- rbutil/rbutilqt/autodetection.h | 4 +- rbutil/rbutilqt/configure.cpp | 14 +++++++ rbutil/rbutilqt/rbutil.ini | 15 +++++++ rbutil/rbutilqt/rbutilqt.cpp | 2 +- rbutil/rbutilqt/rbutilqt.pro | 3 ++ 6 files changed, 119 insertions(+), 6 deletions(-) diff --git a/rbutil/rbutilqt/autodetection.cpp b/rbutil/rbutilqt/autodetection.cpp index f29df535ab..c16b6976cc 100644 --- a/rbutil/rbutilqt/autodetection.cpp +++ b/rbutil/rbutilqt/autodetection.cpp @@ -19,9 +19,10 @@ #include "autodetection.h" -#if defined(Q_OS_LINUX) +#if defined(Q_OS_LINUX) || defined(Q_OS_MACX) #include #include +#include #endif Autodetection::Autodetection(QObject* parent): QObject(parent) @@ -33,6 +34,9 @@ bool Autodetection::detect() { m_device = ""; m_mountpoint = ""; + m_errdev = ""; + + detectUsb(); // Try detection via rockbox.info / rbutil.log QStringList mountpoints = getMountpoints(); @@ -48,7 +52,8 @@ bool Autodetection::detect() QSettings log(mountpoints.at(i) + "/.rockbox/rbutil.log", QSettings::IniFormat, this); if(!log.value("platform").toString().isEmpty()) { - m_device = log.value("platform").toString(); + if(m_device.isEmpty()) + m_device = log.value("platform").toString(); m_mountpoint = mountpoints.at(i); qDebug() << "rbutil.log detected:" << m_device << m_mountpoint; return true; @@ -64,7 +69,8 @@ bool Autodetection::detect() if(line.startsWith("Target: ")) { line.remove("Target: "); - m_device = line.trimmed(); // trim whitespaces + if(m_device.isEmpty()) + m_device = line.trimmed(); // trim whitespaces m_mountpoint = mountpoints.at(i); qDebug() << "rockbox-info.txt detected:" << m_device << m_mountpoint; return true; @@ -133,7 +139,9 @@ bool Autodetection::detect() return true; } - return false; + if(m_mountpoint.isEmpty() && m_device.isEmpty() && m_errdev.isEmpty()) + return false; + return true; } @@ -192,3 +200,74 @@ QString Autodetection::resolveMountPoint(QString device) return QString(""); } + + +/** @brief detect devices based on usb pid / vid. + * @return true upon success, false otherwise. + */ +bool Autodetection::detectUsb() +{ + // autodetection only uses the buildin device settings only + QSettings dev(":/ini/rbutil.ini", QSettings::IniFormat, this); + + // get a list of ID -> target name + QStringList platforms; + dev.beginGroup("platforms"); + platforms = dev.childKeys(); + dev.endGroup(); + + // usbids holds the mapping in the form + // ((VID<<16)|(PID)), targetname + // the ini file needs to hold the IDs as hex values. + QMap usbids; + QMap usberror; + + for(int i = 0; i < platforms.size(); i++) { + dev.beginGroup("platforms"); + QString target = dev.value(platforms.at(i)).toString(); + dev.endGroup(); + dev.beginGroup(target); + if(!dev.value("usbid").toString().isEmpty()) + usbids.insert(dev.value("usbid").toString().toInt(0, 16), target); + if(!dev.value("usberror").toString().isEmpty()) + usberror.insert(dev.value("usberror").toString().toInt(0, 16), target); + dev.endGroup(); + } + + // usb pid detection +#if defined(Q_OS_LINUX) | defined(Q_OS_MACX) + usb_init(); + usb_find_busses(); + usb_find_devices(); + struct usb_bus *b; + b = usb_get_busses(); + + while(b) { + qDebug() << "bus:" << b->dirname << b->devices; + if(b->devices) { + qDebug() << "devices present."; + struct usb_device *u; + u = b->devices; + while(u) { + uint32_t id; + id = u->descriptor.idVendor << 16 | u->descriptor.idProduct; + qDebug("%x", id); + + if(usbids.contains(id)) { + m_device = usbids.value(id); + return true; + } + if(usberror.contains(id)) { + m_errdev = usberror.value(id); + // we detected something, so return true + qDebug() << "detected device with problems via usb!"; + return true; + } + u = u->next; + } + } + b = b->next; + } +#endif + return false; +} diff --git a/rbutil/rbutilqt/autodetection.h b/rbutil/rbutilqt/autodetection.h index 2443b442f4..85b69045ef 100644 --- a/rbutil/rbutilqt/autodetection.h +++ b/rbutil/rbutilqt/autodetection.h @@ -40,14 +40,16 @@ public: QString getDevice() {return m_device;} QString getMountPoint() {return m_mountpoint;} + QString errdev(void) { return m_errdev; } private: QStringList getMountpoints(void); QString resolveMountPoint(QString); + bool detectUsb(void); QString m_device; QString m_mountpoint; - + QString m_errdev; }; diff --git a/rbutil/rbutilqt/configure.cpp b/rbutil/rbutilqt/configure.cpp index b67d454e82..07947691e5 100644 --- a/rbutil/rbutilqt/configure.cpp +++ b/rbutil/rbutilqt/configure.cpp @@ -565,6 +565,20 @@ void Config::autodetect() } } + if(!detector.errdev().isEmpty()) { + QString text; + if(detector.errdev() == "sansae200") + text = tr("Sansa e200 in MTP mode found!\n" + "You need to change your player to MSC mode for installation. "); + if(detector.errdev() == "h10") + text = tr("H10 20GB in MTP mode found!\n" + "You need to change your player to UMS mode for installation. "); + text += tr("Unless you changed this installation will fail!"); + + QMessageBox::critical(this, tr("Fatal error"), text, QMessageBox::Ok); + return; + } + if(detector.getMountPoint() != "" ) { ui.mountPoint->setText(detector.getMountPoint()); diff --git a/rbutil/rbutilqt/rbutil.ini b/rbutil/rbutilqt/rbutil.ini index 68c371e142..0ece567eba 100644 --- a/rbutil/rbutilqt/rbutil.ini +++ b/rbutil/rbutilqt/rbutil.ini @@ -142,6 +142,7 @@ bootloadername=bootloader-h100.bin resolution=160x128x2 manualname=rockbox-h100 brand=Iriver +usbid=0x10063001 [h120] name="iHP120 / iHP140 / H120 / H140" @@ -153,6 +154,7 @@ bootloadername=bootloader-h120.bin resolution=160x128x2 manualname=rockbox-h100 brand=Iriver +usbid=0x10063002 [h300] name="H320 / H340" @@ -164,6 +166,7 @@ bootloadername=bootloader-h300.bin resolution=220x176x16 manualname=rockbox-h300 brand=Iriver +usbid=0x10063003 [h10_5gbums] name="H10 (5 / 6GB) UMS" @@ -175,6 +178,7 @@ bootloadername=H10.mi4 resolution=128x128x16 manualname= brand=Iriver +usbid=0x41022002 [h10_5gbmtp] name="H10 (5 / 6GB) MTP" @@ -186,6 +190,7 @@ bootloadername=H10_5GB-MTP/H10.mi4 resolution=128x128x16 manualname= brand=Iriver +usbid=0x41022105 [h10] name="H10 (20GB)" @@ -197,6 +202,8 @@ bootloadername=H10_20GC.mi4 resolution=160x128x16 manualname= brand=Iriver +usbid=0x0b7000ba +usberror=0x41022101 [ipod1g2g] name="Ipod (1st / 2nd gen)" @@ -230,6 +237,7 @@ bootloadername=ipodnano resolution=176x132x16 manualname= brand=Apple +usbid=0x05ac120a [ipod4gray] name="Ipod (4th gen, greyscale)" @@ -274,6 +282,7 @@ bootloadername=ipod3g resolution=160x128x2 manualname= brand=Apple +usbid=0x05ac1201 [ipodmini1g] name="Ipod Mini (1st gen)" @@ -307,6 +316,8 @@ bootloadername=x5_fw.bin resolution=160x128x16 manualname= brand=Cowon +usbid=0x0e210510 +usbid=0x0e210513 [iaudiox5v] name="iAudio X5V" @@ -329,6 +340,7 @@ bootloadername=m5_fw.bin resolution=160x128x16 manualname= brand=Cowon +usbid=0x0e210520 [gigabeatf] name="Gigabeat F / X" @@ -339,6 +351,7 @@ bootloadername=FWIMG01.DAT resolution=240x320x16 manualname= brand=Toshiba +usbid=0x09300009 [sansae200] name="Sansa E200" @@ -350,6 +363,8 @@ bootloadername=PP5022.mi4 resolution=176x220x16 manualname= brand=Sandisk +usbid=0x07817421 +usberror=0x07810720 [encoders] encpreset01 = "Lame (default)" diff --git a/rbutil/rbutilqt/rbutilqt.cpp b/rbutil/rbutilqt/rbutilqt.cpp index f5376b5185..6a561e1b85 100644 --- a/rbutil/rbutilqt/rbutilqt.cpp +++ b/rbutil/rbutilqt/rbutilqt.cpp @@ -66,7 +66,7 @@ RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent) QSettings::UserScope, "rockbox.org", "RockboxUtility"); qDebug() << "config: system"; } - + // manual tab updateManual(); updateDevice(); diff --git a/rbutil/rbutilqt/rbutilqt.pro b/rbutil/rbutilqt/rbutilqt.pro index e45560c124..2d0bd7633b 100644 --- a/rbutil/rbutilqt/rbutilqt.pro +++ b/rbutil/rbutilqt/rbutilqt.pro @@ -124,6 +124,9 @@ macx { QMAKE_MAC_SDK=/Developer/SDKs/MacOSX10.4u.sdk CONFIG+=x86 ppc } +unix { + LIBS += -lusb +} static { QTPLUGIN += qtaccessiblewidgets -- cgit v1.2.3