diff options
| author | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2007-09-14 20:52:38 +0000 |
|---|---|---|
| committer | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2007-09-14 20:52:38 +0000 |
| commit | fc2526644003e80346d231b3904aa10340e7d9b2 (patch) | |
| tree | 98242a2dabfd09d464885aac230444f3ff5af083 | |
| parent | 3d41c1c466e4f9f1521ac6164e41f393a16402ff (diff) | |
| download | rockbox-fc2526644003e80346d231b3904aa10340e7d9b2.zip rockbox-fc2526644003e80346d231b3904aa10340e7d9b2.tar.gz rockbox-fc2526644003e80346d231b3904aa10340e7d9b2.tar.bz2 rockbox-fc2526644003e80346d231b3904aa10340e7d9b2.tar.xz | |
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
| -rw-r--r-- | rbutil/rbutilqt/autodetection.cpp | 87 | ||||
| -rw-r--r-- | rbutil/rbutilqt/autodetection.h | 4 | ||||
| -rw-r--r-- | rbutil/rbutilqt/configure.cpp | 14 | ||||
| -rw-r--r-- | rbutil/rbutilqt/rbutil.ini | 15 | ||||
| -rw-r--r-- | rbutil/rbutilqt/rbutilqt.cpp | 2 | ||||
| -rw-r--r-- | 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 f29df53..c16b697 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 <stdio.h> #include <mntent.h> +#include <usb.h> #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<int, QString> usbids; + QMap<int, QString> 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 2443b44..85b6904 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 b67d454..0794769 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 68c371e..0ece567 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 f5376b5..6a561e1 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 e45560c..2d0bd76 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 |