forked from len0rd/rockbox
		
	rbutil: Add support for the xDuoo X3, X3ii, X20, and AGPTek Rocker.
* All include full bootloader installation! * X20 lack USB VID/PIDs so cannot be autodetected. * Benjie T6 (variant/OEM of the Rocker) USB VID/PID unknown. Change-Id: Ia823de072c83506d36410ec436be15a0caf97151
This commit is contained in:
		
							parent
							
								
									561937f2f4
								
							
						
					
					
						commit
						f6060d62d9
					
				
					 5 changed files with 296 additions and 2 deletions
				
			
		
							
								
								
									
										179
									
								
								rbutil/rbutilqt/base/bootloaderinstallbspatch.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								rbutil/rbutilqt/base/bootloaderinstallbspatch.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,179 @@ | ||||||
|  | /***************************************************************************
 | ||||||
|  |  *             __________               __   ___. | ||||||
|  |  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___ | ||||||
|  |  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 | ||||||
|  |  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  < | ||||||
|  |  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \ | ||||||
|  |  *                     \/            \/     \/    \/            \/ | ||||||
|  |  * | ||||||
|  |  *   Copyright (C) 2020 by Solomon Peachy | ||||||
|  |  * | ||||||
|  |  * All files in this archive are subject to the GNU General Public License. | ||||||
|  |  * See the file COPYING in the source tree root for full license agreement. | ||||||
|  |  * | ||||||
|  |  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||||
|  |  * KIND, either express or implied. | ||||||
|  |  * | ||||||
|  |  ****************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include <QtCore> | ||||||
|  | #include <QtDebug> | ||||||
|  | #include "bootloaderinstallbase.h" | ||||||
|  | #include "bootloaderinstallbspatch.h" | ||||||
|  | #include "../bspatch/bspatch.h" | ||||||
|  | #include "Logger.h" | ||||||
|  | 
 | ||||||
|  | /* class for running bspatch() in a separate thread to keep the UI responsive. */ | ||||||
|  | class BootloaderThreadBSPatch : public QThread | ||||||
|  | { | ||||||
|  |     public: | ||||||
|  |         void run(void); | ||||||
|  |         void setInputFile(QString f) | ||||||
|  |         { m_inputfile = f; } | ||||||
|  |         void setOutputFile(QString f) | ||||||
|  |         { m_outputfile = f; } | ||||||
|  |         void setBootloaderFile(QString f) | ||||||
|  |         { m_bootfile = f; } | ||||||
|  |         int error(void) | ||||||
|  |         { return m_error; } | ||||||
|  |     private: | ||||||
|  |         QString m_inputfile; | ||||||
|  |         QString m_bootfile; | ||||||
|  |         QString m_outputfile; | ||||||
|  |         int m_error; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void BootloaderThreadBSPatch::run(void) | ||||||
|  | { | ||||||
|  |     LOG_INFO() << "Thread started."; | ||||||
|  | 
 | ||||||
|  |     m_error = apply_bspatch(m_inputfile.toLocal8Bit().constData(), | ||||||
|  |             m_outputfile.toLocal8Bit().constData(), | ||||||
|  |             m_bootfile.toLocal8Bit().constData()); | ||||||
|  | 
 | ||||||
|  |     LOG_INFO() << "Thread finished, result:" << m_error; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | BootloaderInstallBSPatch::BootloaderInstallBSPatch(QObject *parent) | ||||||
|  |         : BootloaderInstallBase(parent) | ||||||
|  | { | ||||||
|  |     m_thread = NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | QString BootloaderInstallBSPatch::ofHint() | ||||||
|  | { | ||||||
|  |     return tr("Bootloader installation requires you to provide " | ||||||
|  |               "the correct verrsion of the original firmware file. " | ||||||
|  |               "This file will be patched with the Rockbox bootloader and " | ||||||
|  |               "installed to your player. You need to download this file " | ||||||
|  |               "yourself due to legal reasons. Please refer to the " | ||||||
|  |               "<a href='http://www.rockbox.org/wiki/'>rockbox wiki</a> " | ||||||
|  |               "pages on how to obtain this file.<br/>" | ||||||
|  |               "Press Ok to continue and browse your computer for the firmware " | ||||||
|  |               "file."); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** Start bootloader installation.
 | ||||||
|  |  */ | ||||||
|  | bool BootloaderInstallBSPatch::install(void) | ||||||
|  | { | ||||||
|  |     if(!QFileInfo(m_offile).isReadable()) | ||||||
|  |     { | ||||||
|  |         LOG_ERROR() << "could not read original firmware file" | ||||||
|  |                  << m_offile; | ||||||
|  |         emit logItem(tr("Could not read original firmware file"), LOGERROR); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     LOG_INFO() << "downloading bootloader"; | ||||||
|  |     // download bootloader from server
 | ||||||
|  |     emit logItem(tr("Downloading bootloader file"), LOGINFO); | ||||||
|  |     connect(this, SIGNAL(downloadDone()), this, SLOT(installStage2())); | ||||||
|  |     downloadBlStart(m_blurl); | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void BootloaderInstallBSPatch::installStage2(void) | ||||||
|  | { | ||||||
|  |     LOG_INFO() << "patching file..."; | ||||||
|  |     emit logItem(tr("Patching file..."), LOGINFO); | ||||||
|  |     m_tempfile.open(); | ||||||
|  | 
 | ||||||
|  |     // we have not detailed progress on the patching so just show a busy
 | ||||||
|  |     // indicator instead.
 | ||||||
|  |     emit logProgress(0, 0); | ||||||
|  |     m_patchedFile.open(); | ||||||
|  |     m_thread = new BootloaderThreadBSPatch(); | ||||||
|  |     m_thread->setInputFile(m_offile); | ||||||
|  |     m_thread->setBootloaderFile(m_tempfile.fileName()); | ||||||
|  |     m_thread->setOutputFile(m_patchedFile.fileName()); | ||||||
|  |     m_tempfile.close(); | ||||||
|  |     m_patchedFile.close(); | ||||||
|  |     connect(m_thread, SIGNAL(finished()), this, SLOT(installStage3())); | ||||||
|  |     connect(m_thread, SIGNAL(terminated()), this, SLOT(installStage3())); | ||||||
|  |     m_thread->start(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void BootloaderInstallBSPatch::installStage3(void) | ||||||
|  | { | ||||||
|  |     int err = m_thread->error(); | ||||||
|  |     emit logProgress(1, 1); | ||||||
|  |     // if the patch failed
 | ||||||
|  |     if (err != 0) | ||||||
|  |     { | ||||||
|  |         LOG_ERROR() << "Could not patch the original firmware file"; | ||||||
|  |         emit logItem(tr("Patching the original firmware failed"), LOGERROR); | ||||||
|  |         emit done(true); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     LOG_INFO() << "Original Firmware succesfully patched"; | ||||||
|  |     emit logItem(tr("Succesfully patched firmware file"), LOGINFO); | ||||||
|  | 
 | ||||||
|  |     // if a bootloader is already present delete it.
 | ||||||
|  |     QString fwfile(m_blfile); | ||||||
|  |     if(QFileInfo(fwfile).isFile()) | ||||||
|  |     { | ||||||
|  |         LOG_INFO() << "deleting old target file"; | ||||||
|  |         QFile::remove(fwfile); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // place (new) bootloader. Copy, since the temporary file will be removed
 | ||||||
|  |     // automatically.
 | ||||||
|  |     LOG_INFO() << "moving patched bootloader to" << fwfile; | ||||||
|  |     if(m_patchedFile.copy(fwfile)) | ||||||
|  |     { | ||||||
|  |         emit logItem(tr("Bootloader successful installed"), LOGOK); | ||||||
|  |         logInstall(LogAdd); | ||||||
|  |         emit done(false); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         emit logItem(tr("Patched bootloader could not be installed"), LOGERROR); | ||||||
|  |         emit done(true); | ||||||
|  |     } | ||||||
|  |     // clean up thread object.
 | ||||||
|  |     delete m_thread; | ||||||
|  |     return; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool BootloaderInstallBSPatch::uninstall(void) | ||||||
|  | { | ||||||
|  |     emit logItem(tr("To uninstall, perform a normal upgrade with an unmodified " | ||||||
|  |                     "original firmware."), LOGINFO); | ||||||
|  |     logInstall(LogRemove); | ||||||
|  |     emit done(true); | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | BootloaderInstallBase::BootloaderType BootloaderInstallBSPatch::installed(void) | ||||||
|  | { | ||||||
|  |     return BootloaderUnknown; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | BootloaderInstallBase::Capabilities BootloaderInstallBSPatch::capabilities(void) | ||||||
|  | { | ||||||
|  |     return (Install | NeedsOf); | ||||||
|  | } | ||||||
							
								
								
									
										47
									
								
								rbutil/rbutilqt/base/bootloaderinstallbspatch.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								rbutil/rbutilqt/base/bootloaderinstallbspatch.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | ||||||
|  | /***************************************************************************
 | ||||||
|  |  *             __________               __   ___. | ||||||
|  |  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___ | ||||||
|  |  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 | ||||||
|  |  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  < | ||||||
|  |  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \ | ||||||
|  |  *                     \/            \/     \/    \/            \/ | ||||||
|  |  * | ||||||
|  |  *   Copyright (C) 2020 Solomon Peachy | ||||||
|  |  * | ||||||
|  |  * All files in this archive are subject to the GNU General Public License. | ||||||
|  |  * See the file COPYING in the source tree root for full license agreement. | ||||||
|  |  * | ||||||
|  |  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||||
|  |  * KIND, either express or implied. | ||||||
|  |  * | ||||||
|  |  ****************************************************************************/ | ||||||
|  | #ifndef BOOTLOADERINSTALLBSPATCH_H | ||||||
|  | #define BOOTLOADERINSTALLBSPATCH_H | ||||||
|  | 
 | ||||||
|  | #include <QtCore> | ||||||
|  | #include "bootloaderinstallbase.h" | ||||||
|  | 
 | ||||||
|  | class BootloaderThreadBSPatch; | ||||||
|  | 
 | ||||||
|  | //! bootloader installation class for devices handled by mkimxboot.
 | ||||||
|  | class BootloaderInstallBSPatch : public BootloaderInstallBase | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  |     public: | ||||||
|  |         BootloaderInstallBSPatch(QObject *parent); | ||||||
|  |         bool install(void); | ||||||
|  |         bool uninstall(void); | ||||||
|  |         BootloaderInstallBase::BootloaderType installed(void); | ||||||
|  |         Capabilities capabilities(void); | ||||||
|  |         QString ofHint(); | ||||||
|  | 
 | ||||||
|  |     private slots: | ||||||
|  |         void installStage2(void); | ||||||
|  |         void installStage3(void); | ||||||
|  | 
 | ||||||
|  |     private: | ||||||
|  |         BootloaderThreadBSPatch *m_thread; | ||||||
|  |         QTemporaryFile m_patchedFile; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | @ -32,6 +32,7 @@ | ||||||
| #include "bootloaderinstallmpio.h" | #include "bootloaderinstallmpio.h" | ||||||
| #include "bootloaderinstallimx.h" | #include "bootloaderinstallimx.h" | ||||||
| #include "bootloaderinstalls5l.h" | #include "bootloaderinstalls5l.h" | ||||||
|  | #include "bootloaderinstallbspatch.h" | ||||||
| 
 | 
 | ||||||
| BootloaderInstallBase* BootloaderInstallHelper::createBootloaderInstaller(QObject* parent, QString type) | BootloaderInstallBase* BootloaderInstallHelper::createBootloaderInstaller(QObject* parent, QString type) | ||||||
| { | { | ||||||
|  | @ -68,10 +69,12 @@ BootloaderInstallBase* BootloaderInstallHelper::createBootloaderInstaller(QObjec | ||||||
|     else if(type == "s5l") { |     else if(type == "s5l") { | ||||||
|         return new BootloaderInstallS5l(parent); |         return new BootloaderInstallS5l(parent); | ||||||
|     } |     } | ||||||
|  |     else if(type == "bspatch") { | ||||||
|  |         return new BootloaderInstallBSPatch(parent); | ||||||
|  |     } | ||||||
|     else { |     else { | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -134,4 +137,3 @@ QString BootloaderInstallHelper::postinstallHints(QString model) | ||||||
|     else |     else | ||||||
|         return QString(); |         return QString(); | ||||||
| } | } | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -91,6 +91,10 @@ platform101=gogearhdd1630 | ||||||
| platform102=gogearhdd6330 | platform102=gogearhdd6330 | ||||||
| platform103=gogearsa9200 | platform103=gogearsa9200 | ||||||
| platform110=creativezenxfi3 | platform110=creativezenxfi3 | ||||||
|  | platform120=xduoox3 | ||||||
|  | platform130=xduoox3ii | ||||||
|  | platform131=xduoox20 | ||||||
|  | platform132=agptekrocker | ||||||
| 
 | 
 | ||||||
| ; devices sections | ; devices sections | ||||||
| ; | ; | ||||||
|  | @ -873,6 +877,66 @@ configure_modelname=creativezenxfi3 | ||||||
| playerpic=creativezenxfi3 | playerpic=creativezenxfi3 | ||||||
| encoder=rbspeex | encoder=rbspeex | ||||||
| 
 | 
 | ||||||
|  | [xduoox3] | ||||||
|  | name="xDuoo X3" | ||||||
|  | buildserver_modelname=xduoox3 | ||||||
|  | bootloadermethod=bspatch | ||||||
|  | bootloadername=/xduoo/X3-v11.bsdiff | ||||||
|  | bootloaderfile=update.zip | ||||||
|  | bootloaderfilter=*.zip | ||||||
|  | manualname= | ||||||
|  | brand=xDuoo | ||||||
|  | usbid=0x0525a4a5 | ||||||
|  | usberror= | ||||||
|  | configure_modelname=xduoox3 | ||||||
|  | playerpic=xduoox3 | ||||||
|  | encoder=rbspeex | ||||||
|  | 
 | ||||||
|  | [xduoox3ii] | ||||||
|  | name="xDuoo X3 II" | ||||||
|  | buildserver_modelname=xduoox3ii | ||||||
|  | bootloadermethod=bspatch | ||||||
|  | bootloadername=/xduoo/X3II-v13.bsdiff | ||||||
|  | bootloaderfile=/update.upt | ||||||
|  | bootloaderfilter=*.upt *.zip | ||||||
|  | manualname= | ||||||
|  | brand=xDuoo | ||||||
|  | usbid=0x003cc502 | ||||||
|  | usberror= | ||||||
|  | configure_modelname=xduoox3ii | ||||||
|  | playerpic=xduoox3ii | ||||||
|  | encoder=rbspeex | ||||||
|  | 
 | ||||||
|  | [xduoox20] | ||||||
|  | name="xDuoo X20" | ||||||
|  | buildserver_modelname=xduoox20 | ||||||
|  | bootloadermethod=bspatch | ||||||
|  | bootloadername=/xduoo/X20-v18.bsdiff | ||||||
|  | bootloaderfile=/update.upt | ||||||
|  | bootloaderfilter=*.upt *.zip | ||||||
|  | manualname= | ||||||
|  | brand=xDuoo | ||||||
|  | ;usbid=0x0525a4a5 | ||||||
|  | usberror= | ||||||
|  | configure_modelname=xduoox20 | ||||||
|  | playerpic=xduoox20 | ||||||
|  | encoder=rbspeex | ||||||
|  | 
 | ||||||
|  | [agptekrocker] | ||||||
|  | name="AGPTek Rocker" | ||||||
|  | buildserver_modelname=agptekrocker | ||||||
|  | bootloadermethod=bspatch | ||||||
|  | bootloadername=/agptek/ROCKER-20171101.bsdiff | ||||||
|  | bootloaderfile=/update.upt | ||||||
|  | bootloaderfilter=*.upt *.zip | ||||||
|  | manualname= | ||||||
|  | brand=AGPTek | ||||||
|  | usbid=0xc5020029 | ||||||
|  | usberror= | ||||||
|  | configure_modelname=agptekrocker | ||||||
|  | playerpic=agptekrocker | ||||||
|  | encoder=rbspeex | ||||||
|  | 
 | ||||||
| ; incompatible devices sections | ; incompatible devices sections | ||||||
| ; each section uses a USB VID / PID string as section name. | ; each section uses a USB VID / PID string as section name. | ||||||
| ; name: human readable string to show the user when this device is detected. | ; name: human readable string to show the user when this device is detected. | ||||||
|  |  | ||||||
|  | @ -55,6 +55,7 @@ SOURCES += \ | ||||||
|  sysinfo.cpp \ |  sysinfo.cpp \ | ||||||
|  systrace.cpp \ |  systrace.cpp \ | ||||||
|  base/bootloaderinstallbase.cpp \ |  base/bootloaderinstallbase.cpp \ | ||||||
|  |  base/bootloaderinstallbspatch.cpp \ | ||||||
|  base/bootloaderinstallhelper.cpp \ |  base/bootloaderinstallhelper.cpp \ | ||||||
|  base/bootloaderinstallmi4.cpp \ |  base/bootloaderinstallmi4.cpp \ | ||||||
|  base/bootloaderinstallhex.cpp \ |  base/bootloaderinstallhex.cpp \ | ||||||
|  | @ -134,6 +135,7 @@ HEADERS += \ | ||||||
|  base/system.h \ |  base/system.h \ | ||||||
|  systrace.h \ |  systrace.h \ | ||||||
|  base/bootloaderinstallbase.h \ |  base/bootloaderinstallbase.h \ | ||||||
|  |  base/bootloaderinstallbspatch.h \ | ||||||
|  base/bootloaderinstallhelper.h \ |  base/bootloaderinstallhelper.h \ | ||||||
|  base/bootloaderinstallmi4.h \ |  base/bootloaderinstallmi4.h \ | ||||||
|  base/bootloaderinstallhex.h \ |  base/bootloaderinstallhex.h \ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue