Initial (untested) attempt at a Windows version. The MTP_DLL.dll library needs expanding to offer the same API as mtp_libmtp.c, but this needs someone with access to a MS compiler. Ideally we should also stop using a separate DLL and compile a single standalone beastpatcher.exe.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20088 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Dave Chapman 2009-02-22 23:35:29 +00:00
parent 72bd567494
commit 93f4bd351b
6 changed files with 183 additions and 13 deletions

View file

@ -3,20 +3,17 @@ CFLAGS=-Wall -W
ifeq ($(findstring CYGWIN,$(shell uname)),CYGWIN) ifeq ($(findstring CYGWIN,$(shell uname)),CYGWIN)
OUTPUT=beastpatcher.exe OUTPUT=beastpatcher.exe
CROSS= CROSS=
CFLAGS+=-mno-cygwin
else else
OUTPUT=beastpatcher OUTPUT=beastpatcher
CROSS=i586-mingw32msvc- CROSS=i586-mingw32msvc-
endif endif
ifeq ($(OUTPUT),beastpatcher)
LIBS = /usr/lib/libmtp.a /usr/lib/libusb.a LIBS = /usr/lib/libmtp.a /usr/lib/libusb.a
CFLAGS += $(shell printf \ CFLAGS += $(shell printf \
'\#include <libmtp.h>\nlibmtp version: LIBMTP_VERSION\n' | \ '\#include <libmtp.h>\nlibmtp version: LIBMTP_VERSION\n' | \
gcc -E -P - -o - | grep -q '^libmtp version: 0\.2' && echo '-DOLDMTP') gcc -E -P - -o - | grep -q '^libmtp version: 0\.2' && echo '-DOLDMTP')
else WINLIBS = ../MTP_DLL.dll
CFLAGS+=-mno-cygwin
LIBS = ../MTP_DLL.dll
endif
NATIVECC = gcc NATIVECC = gcc
CC = $(CROSS)gcc CC = $(CROSS)gcc
@ -27,8 +24,8 @@ beastpatcher: beastpatcher.c bootimg.c mtp_common.h mtp_libmtp.c
gcc $(CFLAGS) -o beastpatcher beastpatcher.c bootimg.c mtp_libmtp.c $(LIBS) gcc $(CFLAGS) -o beastpatcher beastpatcher.c bootimg.c mtp_libmtp.c $(LIBS)
strip beastpatcher strip beastpatcher
beastpatcher.exe: beastpatcher.c bootimg.c mtp_common.h mtp_win32.c $(LIBS) beastpatcher.exe: beastpatcher.c bootimg.c mtp_common.h mtp_win32.c $(WINLIBS)
$(CROSS)$(CC) $(CFLAGS) $(LIBS) -o beastpatcher.exe beastpatcher.c bootimg.c $(CC) $(CFLAGS) -o beastpatcher.exe beastpatcher.c bootimg.c mtp_win32.c $(WINLIBS)
$(CROSS)strip beastpatcher.exe $(CROSS)strip beastpatcher.exe
beastpatcher-mac: beastpatcher-i386 beastpatcher-ppc beastpatcher-mac: beastpatcher-i386 beastpatcher-ppc

View file

@ -50,8 +50,6 @@ The OS X build is a universal binary statically linked with libusb and libmtp.
Windows Windows
------- -------
[Not yet implemented]
The MTP_DLL.dll requires VC2005 to compile - see instructions in The MTP_DLL.dll requires VC2005 to compile - see instructions in
MTP_DLL/README MTP_DLL/README
@ -59,3 +57,5 @@ To compile beastpatcher itself, you can either cross-compile from
Linux using the mingw32 package, or compile in Cygwin. Just type Linux using the mingw32 package, or compile in Cygwin. Just type
"make beastpatcher.exe" (in Linux) or "make" (in Cygwin). "make beastpatcher.exe" (in Linux) or "make" (in Cygwin).
To run beastpatcher.exe, you need MTP_DLL.dll in the same directory
(or the Windows DLL path).

View file

@ -6,7 +6,7 @@
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/ * \/ \/ \/ \/ \/
* *
* $Id:$ * $Id$
* *
* Copyright (c) 2009, Dave Chapman * Copyright (c) 2009, Dave Chapman
* All rights reserved. * All rights reserved.

View file

@ -6,7 +6,7 @@
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/ * \/ \/ \/ \/ \/
* *
* $Id:$ * $Id$
* *
* Copyright (c) 2009, Dave Chapman * Copyright (c) 2009, Dave Chapman
* All rights reserved. * All rights reserved.
@ -41,7 +41,6 @@
#define _MTP_COMMON_H #define _MTP_COMMON_H
#ifdef __WIN32__ #ifdef __WIN32__
#error Windows support not yet implemented
#else #else
#include "libmtp.h" #include "libmtp.h"
#endif #endif

View file

@ -6,7 +6,7 @@
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/ * \/ \/ \/ \/ \/
* *
* $Id:$ * $Id$
* *
* Copyright (c) 2009, Dave Chapman * Copyright (c) 2009, Dave Chapman
* All rights reserved. * All rights reserved.

View file

@ -0,0 +1,174 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
* $Id$
*
* Copyright (c) 2009, Dave Chapman
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>
#include <stdbool.h>
#include <windows.h>
#include <tchar.h>
#include "mtp_common.h"
extern __declspec(dllimport) bool send_fw(LPWSTR file, int filesize,
void (*callback)(unsigned int progress, unsigned int max));
int mtp_init(struct mtp_info_t* mtp_info)
{
/* Fill the info struct with zeros - mainly for the strings */
memset(mtp_info, 0, sizeof(struct mtp_info_t));
return 0;
}
int mtp_finished(struct mtp_info_t* mtp_info)
{
(void)mtp_info;
return 0;
}
int mtp_scan(struct mtp_info_t* mtp_info)
{
strcpy(mtp_info->manufacturer,"<unknown>");
strcpy(mtp_info->modelname,"<unknown>");
strcpy(mtp_info->version,"<unknown>");
return 0;
}
static void callback(unsigned int progress, unsigned int max)
{
int percent = (progress * 100) / max;
printf("Progress: %u of %u (%d%%)\r", progress, max, percent);
fflush(stdout);
}
int mtp_send_firmware(struct mtp_info_t* mtp_info, unsigned char* fwbuf,
int fwsize)
{
HANDLE hTempFile;
DWORD dwRetVal;
DWORD dwBytesWritten;
UINT uRetVal;
TCHAR szTempName[1024];
TCHAR lpPathBuffer[1024];
BOOL fSuccess;
wchar_t *tmp;
int ret;
(void)mtp_info;
/* Get the path for temporary files */
dwRetVal = GetTempPath(sizeof(lpPathBuffer), lpPathBuffer);
if (dwRetVal > sizeof(lpPathBuffer) || (dwRetVal == 0))
{
fprintf(stderr, "[ERR] GetTempPath failed (%d)\n", (int)GetLastError());
return -1;
}
/* Create the temporary file */
uRetVal = GetTempFileName(lpPathBuffer, TEXT("NKBIN"), 0, szTempName);
if (uRetVal == 0)
{
fprintf(stderr, "[ERR] GetTempFileName failed (%d)\n", (int)GetLastError());
return -1;
}
/* Now create the file */
hTempFile = CreateFile((LPTSTR) szTempName, // file name
GENERIC_READ | GENERIC_WRITE, // open r-w
0, // do not share
NULL, // default security
CREATE_ALWAYS, // overwrite existing
FILE_ATTRIBUTE_NORMAL,// normal file
NULL); // no template
if (hTempFile == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "[ERR] Could not create %s\n", szTempName);
return -1;
}
fSuccess = WriteFile(hTempFile, fwbuf, fwsize, &dwBytesWritten, NULL);
if (!fSuccess)
{
fprintf(stderr, "[ERR] WriteFile failed (%d)\n", (int)GetLastError());
return -1;
}
fSuccess = CloseHandle (hTempFile);
if (!fSuccess)
{
fprintf(stderr, "[ERR] CloseHandle failed (%d)\n", (int)GetLastError());
return -1;
}
tmp = (LPWSTR)malloc(strlen(szTempName)*2+1);
mbstowcs(tmp, szTempName, strlen(szTempName)*2+1);
fprintf(stderr, "[INFO] Sending firmware...\n");
if (send_fw(tmp, fwsize, &callback))
{
fprintf(stderr, "[INFO] Firmware sent successfully\n");
ret = 0;
}
else
{
fprintf(stderr, "[ERR] Error occured during sending.\n");
ret = -1;
}
/* Keep the progress line onscreen */
printf("\n");
free(tmp);
if (!DeleteFile(szTempName))
fprintf(stderr,"[WARN] Could not remove temporary file %s\n",szTempName);
return ret;
}