summaryrefslogtreecommitdiffstats
path: root/utils/MTP
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2009-02-22 23:35:29 +0000
committerDave Chapman <dave@dchapman.com>2009-02-22 23:35:29 +0000
commit93f4bd351bcbd422d81592182aa1a2328f8d2d25 (patch)
tree8f19f7344e6e1cc6fba933e2f7aa91e6de3a4163 /utils/MTP
parent72bd567494c7c5744b1422d99fb8595ed0b1ae51 (diff)
downloadrockbox-93f4bd351bcbd422d81592182aa1a2328f8d2d25.tar.gz
rockbox-93f4bd351bcbd422d81592182aa1a2328f8d2d25.zip
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
Diffstat (limited to 'utils/MTP')
-rw-r--r--utils/MTP/beastpatcher/Makefile11
-rw-r--r--utils/MTP/beastpatcher/README4
-rw-r--r--utils/MTP/beastpatcher/beastpatcher.c2
-rw-r--r--utils/MTP/beastpatcher/mtp_common.h3
-rw-r--r--utils/MTP/beastpatcher/mtp_libmtp.c2
-rw-r--r--utils/MTP/beastpatcher/mtp_win32.c174
6 files changed, 183 insertions, 13 deletions
diff --git a/utils/MTP/beastpatcher/Makefile b/utils/MTP/beastpatcher/Makefile
index edd08b1248..c0c82df53b 100644
--- a/utils/MTP/beastpatcher/Makefile
+++ b/utils/MTP/beastpatcher/Makefile
@@ -3,20 +3,17 @@ CFLAGS=-Wall -W
ifeq ($(findstring CYGWIN,$(shell uname)),CYGWIN)
OUTPUT=beastpatcher.exe
CROSS=
+CFLAGS+=-mno-cygwin
else
OUTPUT=beastpatcher
CROSS=i586-mingw32msvc-
endif
-ifeq ($(OUTPUT),beastpatcher)
LIBS = /usr/lib/libmtp.a /usr/lib/libusb.a
CFLAGS += $(shell printf \
'\#include <libmtp.h>\nlibmtp version: LIBMTP_VERSION\n' | \
gcc -E -P - -o - | grep -q '^libmtp version: 0\.2' && echo '-DOLDMTP')
-else
-CFLAGS+=-mno-cygwin
-LIBS = ../MTP_DLL.dll
-endif
+WINLIBS = ../MTP_DLL.dll
NATIVECC = 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)
strip beastpatcher
-beastpatcher.exe: beastpatcher.c bootimg.c mtp_common.h mtp_win32.c $(LIBS)
- $(CROSS)$(CC) $(CFLAGS) $(LIBS) -o beastpatcher.exe beastpatcher.c bootimg.c
+beastpatcher.exe: beastpatcher.c bootimg.c mtp_common.h mtp_win32.c $(WINLIBS)
+ $(CC) $(CFLAGS) -o beastpatcher.exe beastpatcher.c bootimg.c mtp_win32.c $(WINLIBS)
$(CROSS)strip beastpatcher.exe
beastpatcher-mac: beastpatcher-i386 beastpatcher-ppc
diff --git a/utils/MTP/beastpatcher/README b/utils/MTP/beastpatcher/README
index 85a039268a..42968b0022 100644
--- a/utils/MTP/beastpatcher/README
+++ b/utils/MTP/beastpatcher/README
@@ -50,8 +50,6 @@ The OS X build is a universal binary statically linked with libusb and libmtp.
Windows
-------
-[Not yet implemented]
-
The MTP_DLL.dll requires VC2005 to compile - see instructions in
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
"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).
diff --git a/utils/MTP/beastpatcher/beastpatcher.c b/utils/MTP/beastpatcher/beastpatcher.c
index 8043ebadc2..0ba324883a 100644
--- a/utils/MTP/beastpatcher/beastpatcher.c
+++ b/utils/MTP/beastpatcher/beastpatcher.c
@@ -6,7 +6,7 @@
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
- * $Id:$
+ * $Id$
*
* Copyright (c) 2009, Dave Chapman
* All rights reserved.
diff --git a/utils/MTP/beastpatcher/mtp_common.h b/utils/MTP/beastpatcher/mtp_common.h
index 2fb52a9e81..5f7de3983b 100644
--- a/utils/MTP/beastpatcher/mtp_common.h
+++ b/utils/MTP/beastpatcher/mtp_common.h
@@ -6,7 +6,7 @@
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
- * $Id:$
+ * $Id$
*
* Copyright (c) 2009, Dave Chapman
* All rights reserved.
@@ -41,7 +41,6 @@
#define _MTP_COMMON_H
#ifdef __WIN32__
-#error Windows support not yet implemented
#else
#include "libmtp.h"
#endif
diff --git a/utils/MTP/beastpatcher/mtp_libmtp.c b/utils/MTP/beastpatcher/mtp_libmtp.c
index 7e8579ac99..9ada7bfeea 100644
--- a/utils/MTP/beastpatcher/mtp_libmtp.c
+++ b/utils/MTP/beastpatcher/mtp_libmtp.c
@@ -6,7 +6,7 @@
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
- * $Id:$
+ * $Id$
*
* Copyright (c) 2009, Dave Chapman
* All rights reserved.
diff --git a/utils/MTP/beastpatcher/mtp_win32.c b/utils/MTP/beastpatcher/mtp_win32.c
new file mode 100644
index 0000000000..f68faddbc2
--- /dev/null
+++ b/utils/MTP/beastpatcher/mtp_win32.c
@@ -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;
+}