mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-09 05:05:20 -05:00
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
This commit is contained in:
parent
3d41c1c466
commit
fc25266440
6 changed files with 119 additions and 6 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent)
|
|||
QSettings::UserScope, "rockbox.org", "RockboxUtility");
|
||||
qDebug() << "config: system";
|
||||
}
|
||||
|
||||
|
||||
// manual tab
|
||||
updateManual();
|
||||
updateDevice();
|
||||
|
|
|
|||
|
|
@ -124,6 +124,9 @@ macx {
|
|||
QMAKE_MAC_SDK=/Developer/SDKs/MacOSX10.4u.sdk
|
||||
CONFIG+=x86 ppc
|
||||
}
|
||||
unix {
|
||||
LIBS += -lusb
|
||||
}
|
||||
|
||||
static {
|
||||
QTPLUGIN += qtaccessiblewidgets
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue