summaryrefslogtreecommitdiff
path: root/rbutil/rbutilqt
diff options
context:
space:
mode:
Diffstat (limited to 'rbutil/rbutilqt')
-rw-r--r--rbutil/rbutilqt/Makefile.libs4
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstallhelper.cpp4
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstalls5l.cpp428
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstalls5l.h71
-rw-r--r--rbutil/rbutilqt/changelog.txt1
-rw-r--r--rbutil/rbutilqt/progressloggerfrm.ui9
-rw-r--r--rbutil/rbutilqt/rbutil.ini3
-rw-r--r--rbutil/rbutilqt/rbutilqt.pri2
-rw-r--r--rbutil/rbutilqt/rbutilqt.pro2
9 files changed, 519 insertions, 5 deletions
diff --git a/rbutil/rbutilqt/Makefile.libs b/rbutil/rbutilqt/Makefile.libs
index ecb1c1814e..bd0dc121af 100644
--- a/rbutil/rbutilqt/Makefile.libs
+++ b/rbutil/rbutilqt/Makefile.libs
@@ -31,7 +31,7 @@ export CFLAGS=$(EXTRALIB_CFLAGS)
31export CC=$(EXTRALIBS_CC) 31export CC=$(EXTRALIBS_CC)
32export AR=$(EXTRALIBS_AR) 32export AR=$(EXTRALIBS_AR)
33 33
34libs: librbspeex libucl libipodpatcher libsansapatcher libmkamsboot libmktccboot libmkmpioboot libchinachippatcher libmkimxboot 34libs: librbspeex libucl libipodpatcher libsansapatcher libmkamsboot libmktccboot libmkmpioboot libchinachippatcher libmkimxboot libmks5lboot
35 35
36 36
37librbspeex: 37librbspeex:
@@ -61,3 +61,5 @@ libchinachippatcher:
61libmkimxboot: 61libmkimxboot:
62 $(SILENT)$(MAKE) -C $(RBBASE_DIR)/rbutil/mkimxboot BUILD_DIR=$(BUILD_DIR)/mkimxboot libmkimxboot.a 62 $(SILENT)$(MAKE) -C $(RBBASE_DIR)/rbutil/mkimxboot BUILD_DIR=$(BUILD_DIR)/mkimxboot libmkimxboot.a
63 63
64libmks5lboot:
65 $(SILENT)$(MAKE) -C $(RBBASE_DIR)/rbutil/mks5lboot BUILD_DIR=$(BUILD_DIR)/mks5lboot libmks5lboot.a
diff --git a/rbutil/rbutilqt/base/bootloaderinstallhelper.cpp b/rbutil/rbutilqt/base/bootloaderinstallhelper.cpp
index fe962d2b1d..d6d2dbc7a1 100644
--- a/rbutil/rbutilqt/base/bootloaderinstallhelper.cpp
+++ b/rbutil/rbutilqt/base/bootloaderinstallhelper.cpp
@@ -31,6 +31,7 @@
31#include "bootloaderinstalltcc.h" 31#include "bootloaderinstalltcc.h"
32#include "bootloaderinstallmpio.h" 32#include "bootloaderinstallmpio.h"
33#include "bootloaderinstallimx.h" 33#include "bootloaderinstallimx.h"
34#include "bootloaderinstalls5l.h"
34 35
35BootloaderInstallBase* BootloaderInstallHelper::createBootloaderInstaller(QObject* parent, QString type) 36BootloaderInstallBase* BootloaderInstallHelper::createBootloaderInstaller(QObject* parent, QString type)
36{ 37{
@@ -64,6 +65,9 @@ BootloaderInstallBase* BootloaderInstallHelper::createBootloaderInstaller(QObjec
64 else if(type == "imx") { 65 else if(type == "imx") {
65 return new BootloaderInstallImx(parent); 66 return new BootloaderInstallImx(parent);
66 } 67 }
68 else if(type == "s5l") {
69 return new BootloaderInstallS5l(parent);
70 }
67 else { 71 else {
68 return NULL; 72 return NULL;
69 } 73 }
diff --git a/rbutil/rbutilqt/base/bootloaderinstalls5l.cpp b/rbutil/rbutilqt/base/bootloaderinstalls5l.cpp
new file mode 100644
index 0000000000..2442970655
--- /dev/null
+++ b/rbutil/rbutilqt/base/bootloaderinstalls5l.cpp
@@ -0,0 +1,428 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2008 by Dominik Riebeling
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18
19#include <QtCore>
20#include "bootloaderinstallbase.h"
21#include "bootloaderinstalls5l.h"
22#include "Logger.h"
23#include "utils.h"
24#include "system.h"
25#include "rbsettings.h"
26#include "systeminfo.h"
27
28#include "../mks5lboot/mks5lboot.h"
29
30
31BootloaderInstallS5l::BootloaderInstallS5l(QObject *parent)
32 : BootloaderInstallBase(parent)
33{
34}
35
36
37bool BootloaderInstallS5l::install(void)
38{
39 LOG_INFO() << "installing bootloader";
40 doInstall = true;
41 return installStage1();
42}
43
44
45bool BootloaderInstallS5l::uninstall(void)
46{
47 LOG_INFO() << "uninstalling bootloader";
48 doInstall = false;
49 return installStage1();
50}
51
52
53bool BootloaderInstallS5l::installStage1(void)
54{
55 LOG_INFO() << "installStage1";
56
57 mntpoint = RbSettings::value(RbSettings::Mountpoint).toString();
58
59 if (!Utils::mountpoints(Utils::MountpointsSupported).contains(mntpoint)) {
60 LOG_ERROR() << "iPod not mounted:" << mntpoint;
61 emit logItem(tr("Could not find mounted iPod."), LOGERROR);
62 emit done(true);
63 return false;
64 }
65
66 if (doInstall) {
67 // download firmware from server
68 emit logItem(tr("Downloading bootloader file..."), LOGINFO);
69 connect(this, SIGNAL(downloadDone()), this, SLOT(installStageMkdfu()));
70 downloadBlStart(m_blurl);
71 }
72 else {
73 installStageMkdfu();
74 }
75
76 return true;
77}
78
79
80void BootloaderInstallS5l::installStageMkdfu(void)
81{
82 int dfu_type;
83 QString dfu_arg;
84 char errstr[200];
85
86 LOG_INFO() << "installStageMkdfu";
87
88 setProgress(0);
89 aborted = false;
90 connect(this, SIGNAL(installAborted()), this, SLOT(abortInstall()));
91 connect(this, SIGNAL(done(bool)), this, SLOT(installDone(bool)));
92
93 if (doInstall) {
94 dfu_type = DFU_INST;
95 m_tempfile.open();
96 dfu_arg = m_tempfile.fileName();
97 m_tempfile.close();
98 }
99 else {
100 dfu_type = DFU_UNINST;
101 dfu_arg = RbSettings::value(RbSettings::Platform).toString();
102 }
103
104 // build DFU image
105 dfu_buf = mkdfu(dfu_type, dfu_arg.toLocal8Bit().data(),
106 &dfu_size, errstr, sizeof(errstr));
107 if (!dfu_buf) {
108 LOG_ERROR() << "mkdfu() failed:" << errstr;
109 emit logItem(errstr, LOGERROR);
110 emit logItem(tr("Could not make DFU image."), LOGERROR);
111 emit done(true);
112 return;
113 }
114
115 LOG_INFO() << "preparing installStageWaitForEject";
116 emit logItem(tr("Ejecting iPod..."), LOGINFO);
117 setProgress(10);
118 scanTimer = QTime();
119 installStageWaitForEject();
120}
121
122
123void BootloaderInstallS5l::installStageWaitForEject(void)
124{
125 if (!updateProgress())
126 return; /* aborted */
127
128 if (scanTimer.isNull() || (scanTimer.elapsed() > 3000)) {
129 scanSuccess = Utils::ejectDevice(mntpoint);
130 if (!scanSuccess) {
131 scanSuccess = !Utils::mountpoints(
132 Utils::MountpointsSupported).contains(mntpoint);
133 }
134 scanTimer.start();
135 }
136 if (!scanSuccess) {
137 if (!actionShown) {
138 emit logItem(tr("Action required:\n"
139 " Please make sure no programs are accessing\n"
140 " files on the device. If ejecting still fails\n"
141 " please use your computers eject funtionality."),
142 LOGWARNING);
143 actionShown = true;
144 }
145 QTimer::singleShot(250, this, SLOT(installStageWaitForEject()));
146 return;
147 }
148 emit logItem(tr("Device successfully ejected."), LOGINFO);
149
150 LOG_INFO() << "preparing installStageWaitForProcs";
151 setProgress(40, 18);
152 scanTimer = QTime();
153 installStageWaitForProcs();
154}
155
156
157void BootloaderInstallS5l::installStageWaitForProcs(void)
158{
159 if (!updateProgress())
160 return; /* aborted */
161
162 if (scanTimer.isNull() || (scanTimer.elapsed() > 1000)) {
163 scanSuccess = Utils::findRunningProcess(QStringList("iTunes")).isEmpty();
164 scanTimer.start();
165 }
166 if (!scanSuccess) {
167 if (!actionShown) {
168 emit logItem(tr("Action required:\n"
169 " Quit iTunes application."), LOGWARNING);
170 actionShown = true;
171 }
172 QTimer::singleShot(250, this, SLOT(installStageWaitForProcs()));
173 return;
174 }
175 if (actionShown) {
176 emit logItem(tr("iTunes closed."), LOGINFO);
177 if (!updateProgress())
178 return; /* aborted */
179 }
180
181 QList<int> helperPids = Utils::findRunningProcess(
182#if defined(Q_OS_WIN32)
183 QStringList("iTunesHelper"))["iTunesHelper.exe"];
184#else
185 QStringList("iTunesHelper"))["iTunesHelper"];
186#endif
187 suspendedPids = Utils::suspendProcess(helperPids, true);
188 if (suspendedPids.size() != helperPids.size()) {
189 emit logItem(tr("Could not suspend iTunesHelper. Stop it\n"
190 "using the Task Manager, and try again."), LOGERROR);
191 emit done(true);
192 return;
193 }
194
195 LOG_INFO() << "preparing installStageWaitForSpindown";
196 // for Windows: skip waiting if the HDD was ejected a time ago
197 if (progressTimer.elapsed() < progressTimeout)
198 emit logItem(tr("Waiting for HDD spin-down..."), LOGINFO);
199 installStageWaitForSpindown();
200}
201
202
203void BootloaderInstallS5l::installStageWaitForSpindown(void)
204{
205 if (!updateProgress())
206 return; /* aborted */
207
208 if (progressTimer.elapsed() < progressTimeout) {
209 QTimer::singleShot(250, this, SLOT(installStageWaitForSpindown()));
210 return;
211 }
212
213 LOG_INFO() << "preparing installStageWaitForDfu";
214 emit logItem(tr("Waiting for DFU mode..."), LOGINFO);
215 emit logItem(tr("Action required:\n"
216 " Press and hold SELECT+MENU buttons, after\n"
217 " about 12 seconds a new action will require\n"
218 " you to release the buttons, DO IT QUICKLY,\n"
219 " otherwise the process could fail."), LOGWARNING);
220 scanTimer = QTime();
221 installStageWaitForDfu();
222}
223
224
225void BootloaderInstallS5l::installStageWaitForDfu(void)
226{
227 if (!updateProgress())
228 return; /* aborted */
229
230 if (scanTimer.isNull() || (scanTimer.elapsed() > 2000)) {
231 scanSuccess = System::listUsbIds().contains(0x05ac1223);
232 scanTimer.start();
233 }
234 if (!scanSuccess) {
235 QTimer::singleShot(250, this, SLOT(installStageWaitForDfu()));
236 return;
237 }
238 emit logItem(tr("DFU mode detected."), LOGINFO);
239
240 emit logItem(tr("Action required:\n"
241 " Release SELECT+MENU buttons and wait..."), LOGWARNING);
242
243 // Once the iPod enters DFU mode, the device will reset again if
244 // SELECT+MENU remains pressed for another 8 seconds. To avoid a
245 // reset while the NOR is being written, we wait ~10 seconds
246 // before sending the DFU image.
247 LOG_INFO() << "preparing installStageSendDfu";
248 setProgress(60, 10);
249 installStageSendDfu();
250}
251
252
253void BootloaderInstallS5l::installStageSendDfu(void)
254{
255 if (!updateProgress())
256 return; /* aborted */
257
258 if (progressTimer.elapsed() < progressTimeout) {
259 QTimer::singleShot(250, this, SLOT(installStageSendDfu()));
260 return;
261 }
262
263 if (!System::listUsbIds().contains(0x05ac1223)) {
264 LOG_ERROR() << "device not in DFU mode";
265 emit logItem(tr("Device is not in DFU mode. It seems that\n"
266 "the previous required action failed, please\n"
267 "try again."), LOGERROR);
268 emit done(true);
269 return;
270 }
271
272 emit logItem(tr("Transfering DFU image..."), LOGINFO);
273 if (!updateProgress())
274 return; /* aborted */
275
276 char errstr[200];
277 if (!ipoddfu_send(0x1223, dfu_buf, dfu_size, errstr, sizeof(errstr))) {
278 LOG_ERROR() << "ipoddfu_send() failed:" << errstr;
279#if defined(Q_OS_WIN32)
280 if (strstr(errstr, "DFU device not found"))
281 {
282 emit logItem(tr("No valid DFU USB driver found.\n"
283 "Install iTunes (or the Apple Device Driver)\n"
284 "and try again."),
285 LOGERROR);
286 }
287 else
288#endif
289 {
290 emit logItem(errstr, LOGERROR);
291 emit logItem(tr("Could not transfer DFU image."), LOGERROR);
292 }
293 emit done(true);
294 return;
295 }
296 emit logItem(tr("DFU transfer completed."), LOGINFO);
297
298 LOG_INFO() << "preparing installStageWaitForRemount";
299 emit logItem(tr("Restarting iPod, waiting for remount..."), LOGINFO);
300 setProgress(99, 45);
301 scanTimer = QTime();
302 installStageWaitForRemount();
303}
304
305
306void BootloaderInstallS5l::installStageWaitForRemount(void)
307{
308 if (!updateProgress())
309 return; /* aborted */
310
311 if (scanTimer.isNull() || (scanTimer.elapsed() > 5000)) {
312 scanSuccess = Utils::mountpoints(
313 Utils::MountpointsSupported).contains(mntpoint);
314 scanTimer.start();
315 }
316 if (!scanSuccess) {
317 if (!actionShown && (progressTimer.elapsed() > progressTimeout)) {
318 emit logItem(tr("Action required:\n"
319 " Could not remount the device, try to do it\n"
320 " manually. If the iPod didn't restart, force\n"
321 " a reset by pressing SELECT+MENU buttons\n"
322 " for about 5 seconds. If the problem could\n"
323 " not be solved then click 'Abort' to cancel."),
324 LOGWARNING);
325 actionShown = true;
326 }
327 QTimer::singleShot(250, this, SLOT(installStageWaitForRemount()));
328 return;
329 }
330 emit logItem(tr("Device remounted."), LOGINFO);
331
332 emit logItem(tr("Bootloader successfully %1.").
333 arg(tr(doInstall ? "installed" : "uninstalled")), LOGOK);
334
335 logInstall(doInstall ? LogAdd : LogRemove);
336 emit logProgress(1, 1);
337 emit done(false);
338}
339
340
341void BootloaderInstallS5l::installDone(bool status)
342{
343 LOG_INFO() << "installDone, status:" << status;
344 if (Utils::suspendProcess(suspendedPids, false).size() != suspendedPids.size())
345 emit logItem(tr("Could not resume iTunesHelper."), LOGWARNING);
346}
347
348
349void BootloaderInstallS5l::abortInstall(void)
350{
351 LOG_INFO() << "abortInstall";
352 aborted = true;
353 disconnect(this, SIGNAL(installAborted()), this, SLOT(abortInstall()));
354}
355
356
357bool BootloaderInstallS5l::abortDetected(void)
358{
359 if (aborted) {
360 LOG_ERROR() << "abortDetected";
361 emit logItem(tr("%1 aborted by user.").
362 arg(tr(doInstall ? "Install" : "Uninstall")), LOGERROR);
363 emit done(true);
364 return true;
365 }
366 return false;
367}
368
369
370void BootloaderInstallS5l::setProgress(int progress, int secondsTimeout)
371{
372 progressTimer.start();
373 progressTimeout = secondsTimeout * 1000;
374 progOrigin = progTarget;
375 progTarget = progress;
376 actionShown = false;
377}
378
379
380bool BootloaderInstallS5l::updateProgress(void)
381{
382 if (progressTimeout) {
383 progCurrent = qMin(progTarget, progOrigin +
384 progressTimer.elapsed()*(progTarget-progOrigin)/progressTimeout);
385 }
386 else {
387 progCurrent = progTarget;
388 }
389 emit logProgress(progCurrent, 100);
390 QCoreApplication::sendPostedEvents();
391 QCoreApplication::processEvents();
392 return !abortDetected();
393}
394
395
396BootloaderInstallBase::BootloaderType BootloaderInstallS5l::installed(void)
397{
398 bool rbblInstalled;
399
400 QString device = Utils::resolveDevicename(m_blfile);
401 if (device.isEmpty()) {
402 LOG_INFO() << "installed: BootloaderUnknown";
403 return BootloaderUnknown;
404 }
405
406 // rely on logfile
407 QString logfile = RbSettings::value(RbSettings::Mountpoint).toString()
408 + "/.rockbox/rbutil.log";
409 QSettings s(logfile, QSettings::IniFormat, this);
410 QString section = SystemInfo::value(
411 SystemInfo::CurBootloaderName).toString().section('/', -1);
412 rbblInstalled = s.contains("Bootloader/" + section);
413
414 if (rbblInstalled) {
415 LOG_INFO() << "installed: BootloaderRockbox";
416 return BootloaderRockbox;
417 }
418 else {
419 LOG_INFO() << "installed: BootloaderOther";
420 return BootloaderOther;
421 }
422}
423
424
425BootloaderInstallBase::Capabilities BootloaderInstallS5l::capabilities(void)
426{
427 return (Install | Uninstall);
428}
diff --git a/rbutil/rbutilqt/base/bootloaderinstalls5l.h b/rbutil/rbutilqt/base/bootloaderinstalls5l.h
new file mode 100644
index 0000000000..a59e5d378b
--- /dev/null
+++ b/rbutil/rbutilqt/base/bootloaderinstalls5l.h
@@ -0,0 +1,71 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2008 by Dominik Riebeling
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18
19#ifndef BOOTLOADERINSTALLS5L_H
20#define BOOTLOADERINSTALLS5L_H
21
22#include <QtCore>
23#include "bootloaderinstallbase.h"
24
25
26//! bootloader installation derivate based on mks5lboot
27class BootloaderInstallS5l : public BootloaderInstallBase
28{
29 Q_OBJECT
30
31 public:
32 BootloaderInstallS5l(QObject *parent);
33 bool install(void);
34 bool uninstall(void);
35 BootloaderInstallBase::BootloaderType installed(void);
36 Capabilities capabilities(void);
37
38 private slots:
39 bool installStage1(void);
40 void installStageMkdfu(void);
41 void installStageWaitForEject(void);
42 void installStageWaitForSpindown(void);
43 void installStageWaitForProcs(void);
44 void installStageWaitForDfu(void);
45 void installStageSendDfu(void);
46 void installStageWaitForRemount(void);
47 void abortInstall(void);
48 void installDone(bool);
49
50 private:
51 bool doInstall;
52 QString mntpoint;
53 unsigned char* dfu_buf;
54 int dfu_size;
55 QList<int> suspendedPids;
56 bool aborted;
57 bool abortDetected(void);
58 QTime scanTimer;
59 bool scanSuccess;
60 // progress
61 QTime progressTimer;
62 int progressTimeout;
63 int progCurrent;
64 int progOrigin;
65 int progTarget;
66 bool actionShown;
67 void setProgress(int, int=0);
68 bool updateProgress(void);
69};
70
71#endif
diff --git a/rbutil/rbutilqt/changelog.txt b/rbutil/rbutilqt/changelog.txt
index c97105f651..0dec314155 100644
--- a/rbutil/rbutilqt/changelog.txt
+++ b/rbutil/rbutilqt/changelog.txt
@@ -25,3 +25,4 @@ Version 1.4.1
25* Extend hint when uninstallation requires reinstalling the Original Firmware. 25* Extend hint when uninstallation requires reinstalling the Original Firmware.
26* Improve update check information dialog. 26* Improve update check information dialog.
27* Correct USB IDs for Sandisk Sansa c200v2. 27* Correct USB IDs for Sandisk Sansa c200v2.
28* Add support for iPod Classic 6G bootloader.
diff --git a/rbutil/rbutilqt/progressloggerfrm.ui b/rbutil/rbutilqt/progressloggerfrm.ui
index c10e26a4af..cc4509081a 100644
--- a/rbutil/rbutilqt/progressloggerfrm.ui
+++ b/rbutil/rbutilqt/progressloggerfrm.ui
@@ -5,8 +5,13 @@
5 <rect> 5 <rect>
6 <x>0</x> 6 <x>0</x>
7 <y>0</y> 7 <y>0</y>
8 <width>315</width> 8 <!-- Larger progress window - quick workaround to avoid user confusion
9 <height>302</height> 9 during iPod Classic 6G bootloader installation. Due to progress
10 scroll, many users (including me) are confused and do not realize
11 an important action message.
12 -->
13 <width>360</width>
14 <height>560</height>
10 </rect> 15 </rect>
11 </property> 16 </property>
12 <property name="windowTitle" > 17 <property name="windowTitle" >
diff --git a/rbutil/rbutilqt/rbutil.ini b/rbutil/rbutilqt/rbutil.ini
index e8ec8afb25..06dc622864 100644
--- a/rbutil/rbutilqt/rbutil.ini
+++ b/rbutil/rbutilqt/rbutil.ini
@@ -362,7 +362,8 @@ encoder=rbspeex
362[ipod6g] 362[ipod6g]
363name="Ipod Classic (6th gen)" 363name="Ipod Classic (6th gen)"
364buildserver_modelname=ipod6g 364buildserver_modelname=ipod6g
365bootloadermethod=none 365bootloadermethod=s5l
366bootloadername=/ipod/bootloader-ipod6g.ipod
366manualname= 367manualname=
367brand=Apple 368brand=Apple
368usbid=0x05ac1261 369usbid=0x05ac1261
diff --git a/rbutil/rbutilqt/rbutilqt.pri b/rbutil/rbutilqt/rbutilqt.pri
index 9f1aea694d..d9ef1071f4 100644
--- a/rbutil/rbutilqt/rbutilqt.pri
+++ b/rbutil/rbutilqt/rbutilqt.pri
@@ -66,6 +66,7 @@ SOURCES += \
66 base/bootloaderinstalltcc.cpp \ 66 base/bootloaderinstalltcc.cpp \
67 base/bootloaderinstallmpio.cpp \ 67 base/bootloaderinstallmpio.cpp \
68 base/bootloaderinstallimx.cpp \ 68 base/bootloaderinstallimx.cpp \
69 base/bootloaderinstalls5l.cpp \
69 base/rockboxinfo.cpp \ 70 base/rockboxinfo.cpp \
70 ../../tools/mkboot.c \ 71 ../../tools/mkboot.c \
71 ../../tools/iriver.c \ 72 ../../tools/iriver.c \
@@ -142,6 +143,7 @@ HEADERS += \
142 base/bootloaderinstalltcc.h \ 143 base/bootloaderinstalltcc.h \
143 base/bootloaderinstallmpio.h \ 144 base/bootloaderinstallmpio.h \
144 base/bootloaderinstallimx.h \ 145 base/bootloaderinstallimx.h \
146 base/bootloaderinstalls5l.h \
145 base/rockboxinfo.h \ 147 base/rockboxinfo.h \
146 ../../tools/mkboot.h \ 148 ../../tools/mkboot.h \
147 ../../tools/iriver.h \ 149 ../../tools/iriver.h \
diff --git a/rbutil/rbutilqt/rbutilqt.pro b/rbutil/rbutilqt/rbutilqt.pro
index 745d9887b5..cfd6fb39ab 100644
--- a/rbutil/rbutilqt/rbutilqt.pro
+++ b/rbutil/rbutilqt/rbutilqt.pro
@@ -88,7 +88,7 @@ extralibs.commands = $$SILENT \
88# Note: order is important for RBLIBS! The libs are appended to the linker 88# Note: order is important for RBLIBS! The libs are appended to the linker
89# flags in this order, put libucl at the end. 89# flags in this order, put libucl at the end.
90RBLIBS = rbspeex ipodpatcher sansapatcher mkamsboot mktccboot \ 90RBLIBS = rbspeex ipodpatcher sansapatcher mkamsboot mktccboot \
91 mkmpioboot chinachippatcher mkimxboot ucl 91 mkmpioboot chinachippatcher mkimxboot mks5lboot ucl
92!win32-msvc* { 92!win32-msvc* {
93 QMAKE_EXTRA_TARGETS += extralibs 93 QMAKE_EXTRA_TARGETS += extralibs
94 PRE_TARGETDEPS += extralibs 94 PRE_TARGETDEPS += extralibs