summaryrefslogtreecommitdiffstats
path: root/rbutil
diff options
context:
space:
mode:
Diffstat (limited to 'rbutil')
-rw-r--r--rbutil/rbutilqt/autodetection.cpp87
-rw-r--r--rbutil/rbutilqt/autodetection.h4
-rw-r--r--rbutil/rbutilqt/configure.cpp14
-rw-r--r--rbutil/rbutilqt/rbutil.ini15
-rw-r--r--rbutil/rbutilqt/rbutilqt.cpp2
-rw-r--r--rbutil/rbutilqt/rbutilqt.pro3
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 <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 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