[U-Boot] [PATCH v2][RFC] Add native win32 mkimage support

Peter Tyser ptyser at xes-inc.com
Fri Feb 6 22:22:01 CET 2009


Add a mkimage_win32.exe build target which can produce a native
win32 mkimage executable using the MinGW toolchain.  The
mkimage_win32.exe binary is generated when the MINGW_COMPILE
environment variable is defined.  The mkimage_win32.exe binary
can be used by those who use Windows as an OS build environment
but don't use cygwin.

Signed-off-by: Peter Tyser <ptyser at xes-inc.com>
---
I'm not sure what the odds of this being picked up, but I thought
others might find this useful.

Changes since v1:
- Fixed "Engineering" typos

 Makefile              |    5 ++-
 README                |    6 +++
 include/image.h       |    2 +
 include/libfdt_env.h  |    6 +++
 include/linux/types.h |    5 ++-
 tools/Makefile        |   13 ++++++-
 tools/mingw_support.c |   95 +++++++++++++++++++++++++++++++++++++++++++++++++
 tools/mingw_support.h |   48 +++++++++++++++++++++++++
 tools/mkimage.c       |    4 ++
 tools/mkimage.h       |    5 +++
 10 files changed, 185 insertions(+), 4 deletions(-)
 create mode 100644 tools/mingw_support.c
 create mode 100644 tools/mingw_support.h

diff --git a/Makefile b/Makefile
index 84e6125..8fb59de 100644
--- a/Makefile
+++ b/Makefile
@@ -3447,8 +3447,9 @@ clean:
 	       $(obj)tools/envcrc					  \
 	       $(obj)tools/gdb/{astest,gdbcont,gdbsend}			  \
 	       $(obj)tools/gen_eth_addr    $(obj)tools/img2srec		  \
-	       $(obj)tools/mkimage	   $(obj)tools/mpc86x_clk	  \
-	       $(obj)tools/ncb		   $(obj)tools/ubsha1
+	       $(obj)tools/mkimage	   $(obj)tools/mkimage_win32.exe  \
+	       $(obj)tools/mpc86x_clk	   $(obj)tools/ncb		  \
+	       $(obj)tools/ubsha1					  \
 	@rm -f $(obj)board/cray/L1/{bootscript.c,bootscript.image}	  \
 	       $(obj)board/netstar/{eeprom,crcek,crcit,*.srec,*.bin}	  \
 	       $(obj)board/trab/trab_fkt   $(obj)board/voiceblue/eeprom   \
diff --git a/README b/README
index 522471c..96b8db7 100644
--- a/README
+++ b/README
@@ -2695,6 +2695,12 @@ necessary. For example using the ELDK on a 4xx CPU, please enter:
 	$ CROSS_COMPILE=ppc_4xx-
 	$ export CROSS_COMPILE
 
+Note: If you wish to generate a WIN32 version of the mkimage tool
+      using the MinGW toolchain (see http://www.mingw.org) you must
+      also set the MINGW_COMPILE environment variable, for example:
+
+	$ export MINGW_COMPILE=i586-mingw32msvc-
+
 U-Boot is intended to be simple to build. After installing the
 sources you must configure U-Boot for one specific board type. This
 is done by typing:
diff --git a/include/image.h b/include/image.h
index 4609200..ec6bb1a 100644
--- a/include/image.h
+++ b/include/image.h
@@ -34,7 +34,9 @@
 #define __IMAGE_H__
 
 #if USE_HOSTCC
+#ifndef __MINGW32__
 #include <endian.h>
+#endif
 
 /* new uImage format support enabled on host */
 #define CONFIG_FIT		1
diff --git a/include/libfdt_env.h b/include/libfdt_env.h
index ea474a5..bdc7a58 100644
--- a/include/libfdt_env.h
+++ b/include/libfdt_env.h
@@ -24,8 +24,10 @@
 #ifdef USE_HOSTCC
 #include <stdint.h>
 #include <string.h>
+#ifndef __MINGW32__
 #include <endian.h>
 #include <byteswap.h>
+#endif /* __MINGW32__ */
 #else
 #include <linux/string.h>
 #include <linux/types.h>
@@ -36,6 +38,10 @@
 extern struct fdt_header *working_fdt;  /* Pointer to the working fdt */
 
 #if __BYTE_ORDER == __LITTLE_ENDIAN
+#ifdef __MINGW32__
+extern uint32_t bswap_32(uint32_t x);
+extern uint64_t bswap_64(uint64_t x);
+#endif
 #define fdt32_to_cpu(x)		bswap_32(x)
 #define cpu_to_fdt32(x)		bswap_32(x)
 #define fdt64_to_cpu(x)		bswap_64(x)
diff --git a/include/linux/types.h b/include/linux/types.h
index 1b0b4a4..90c0695 100644
--- a/include/linux/types.h
+++ b/include/linux/types.h
@@ -10,10 +10,13 @@
 
 #ifndef __KERNEL_STRICT_NAMES
 
+#ifndef __MINGW32__
+/* prevent mingw overlaps for certain typedefs */
 typedef __kernel_fd_set		fd_set;
 typedef __kernel_dev_t		dev_t;
 typedef __kernel_ino_t		ino_t;
 typedef __kernel_mode_t		mode_t;
+#endif
 typedef __kernel_nlink_t	nlink_t;
 typedef __kernel_off_t		off_t;
 typedef __kernel_pid_t		pid_t;
@@ -54,7 +57,7 @@ typedef __kernel_loff_t		loff_t;
 typedef __kernel_size_t		size_t;
 #endif
 
-#ifndef _SSIZE_T
+#if !defined(_SSIZE_T) && !defined(__MINGW32__)
 #define _SSIZE_T
 typedef __kernel_ssize_t	ssize_t;
 #endif
diff --git a/tools/Makefile b/tools/Makefile
index 9e9ee15..64d4a3f 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -21,7 +21,8 @@
 # MA 02111-1307 USA
 #
 
-BIN_FILES	= img2srec$(SFX) mkimage$(SFX) envcrc$(SFX) ubsha1$(SFX) gen_eth_addr$(SFX) bmp_logo$(SFX)
+BIN_FILES	= img2srec$(SFX) mkimage$(SFX) mkimage_win32.exe envcrc$(SFX) \
+		ubsha1$(SFX) gen_eth_addr$(SFX) bmp_logo$(SFX)
 
 OBJ_LINKS	= env_embedded.o crc32.o md5.o sha1.o image.o
 OBJ_FILES	= img2srec.o mkimage.o envcrc.o ubsha1.o gen_eth_addr.o bmp_logo.o
@@ -39,6 +40,9 @@ endif
 
 LIBFDT_OBJ_FILES	= $(obj)fdt.o $(obj)fdt_ro.o $(obj)fdt_rw.o $(obj)fdt_strerror.o $(obj)fdt_wip.o
 
+MKIMAGE_WIN32_SRC_FILES	= $(src)mkimage.c $(src)mingw_support.c $(obj)crc32.c \
+			$(obj)image.c $(obj)md5.c $(obj)sha1.c $(LIBFDT_OBJ_FILES:%.o=%.c)
+
 LOGO_H	= $(OBJTREE)/include/bmp_logo.h
 
 ifeq ($(LOGO_BMP),)
@@ -151,6 +155,13 @@ $(obj)mkimage$(SFX):	$(obj)mkimage.o $(obj)crc32.o $(obj)image.o $(obj)md5.o $(o
 		$(CC) $(CFLAGS) $(HOST_LDFLAGS) -o $@ $^
 		$(STRIP) $@
 
+# Build native win32 mkimage if mingw compiler is specified
+ifneq ($(MINGW_COMPILE),)
+$(obj)mkimage_win32.exe: $(MKIMAGE_WIN32_SRC_FILES)
+		$(MINGW_COMPILE)gcc $(FIT_CFLAGS) $(HOST_LDFLAGS) -o $@ $^
+		$(MINGW_COMPILE)strip $@
+endif
+
 $(obj)ncb$(SFX):	$(obj)ncb.o
 		$(CC) $(CFLAGS) $(HOST_LDFLAGS) -o $@ $^
 		$(STRIP) $@
diff --git a/tools/mingw_support.c b/tools/mingw_support.c
new file mode 100644
index 0000000..237914b
--- /dev/null
+++ b/tools/mingw_support.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2008 Extreme Engineering Solutions, Inc.
+ *
+ * mmap/munmap implementation derived from:
+ * Clamav Native Windows Port : mmap win32 compatibility layer
+ * Copyright (c) 2005-2006 Gianluigi Tiesi <sherpya at netfarm.it>
+ * Parts by Kees Zeelenberg <kzlg at users.sourceforge.net> (LibGW32C)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this software; if not, write to the
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "mingw_support.h"
+#include <stdio.h>
+#include <stdint.h>
+#include <errno.h>
+#include <io.h>
+
+uint16_t bswap_16(uint16_t __x)
+{
+	return (__x >> 8) | (__x << 8);
+}
+
+uint32_t bswap_32(uint32_t __x)
+{
+	return (bswap_16(__x & 0xffff) << 16) | (bswap_16(__x >> 16));
+}
+
+uint64_t bswap_64(uint64_t __x)
+{
+	return (((uint64_t) bswap_32(__x & 0xffffffff)) << 32) |
+		(bswap_32(__x >> 32));
+}
+
+int fsync(int fd)
+{
+	return _commit(fd);
+}
+
+void *mmap(void *addr, size_t len, int prot, int flags, int fd, int offset)
+{
+	void *map = NULL;
+	HANDLE handle = INVALID_HANDLE_VALUE;
+	DWORD cfm_flags = 0, mvf_flags = 0;
+
+	switch (prot) {
+	case PROT_READ | PROT_WRITE:
+		cfm_flags = PAGE_READWRITE;
+		mvf_flags = FILE_MAP_ALL_ACCESS;
+		break;
+	case PROT_WRITE:
+		cfm_flags = PAGE_READWRITE;
+		mvf_flags = FILE_MAP_WRITE;
+		break;
+	case PROT_READ:
+		cfm_flags = PAGE_READONLY;
+		mvf_flags = FILE_MAP_READ;
+		break;
+	default:
+		return MAP_FAILED;
+	}
+
+	handle = CreateFileMappingA((HANDLE) _get_osfhandle(fd), NULL,
+				cfm_flags, HIDWORD(len), LODWORD(len), NULL);
+	if (!handle)
+		return MAP_FAILED;
+
+	map = MapViewOfFile(handle, mvf_flags, HIDWORD(offset),
+			LODWORD(offset), len);
+	CloseHandle(handle);
+
+	if (!map)
+		return MAP_FAILED;
+
+	return map;
+}
+
+int munmap(void *addr, size_t len)
+{
+	if (!UnmapViewOfFile(addr))
+		return -1;
+
+	return 0;
+}
diff --git a/tools/mingw_support.h b/tools/mingw_support.h
new file mode 100644
index 0000000..b4011a6
--- /dev/null
+++ b/tools/mingw_support.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2008 Extreme Engineering Solutions, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this software; if not, write to the
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __MINGW_SUPPORT_H_
+#define __WINGW_SUPPORT_H_	1
+
+/* Defining __INSIDE_MSYS__ helps to prevent u-boot/mingw overlap */
+#define __INSIDE_MSYS__	1
+
+#include <windows.h>
+
+/* mmap protections */
+#define PROT_READ	0x1		/* Page can be read */
+#define PROT_WRITE	0x2		/* Page can be written */
+#define PROT_EXEC	0x4		/* Page can be executed */
+#define PROT_NONE	0x0		/* Page can not be accessed */
+
+/* Sharing types (must choose one and only one of these) */
+#define MAP_SHARED	0x01		/* Share changes */
+#define MAP_PRIVATE	0x02		/* Changes are private */
+
+/* Return value of `mmap' in case of an error */
+#define MAP_FAILED	((void *) -1)
+
+/* Windows 64-bit access macros */
+#define LODWORD(l) ((DWORD)((DWORDLONG)(l)))
+#define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF))
+
+int fsync(int fd);
+void *mmap(void *, size_t, int, int, int, int);
+int munmap(void *, size_t);
+
+#endif /* __MINGW_SUPPORT_H_ */
diff --git a/tools/mkimage.c b/tools/mkimage.c
index 967fe9a..380b535 100644
--- a/tools/mkimage.c
+++ b/tools/mkimage.c
@@ -25,6 +25,10 @@
 #include "mkimage.h"
 #include <image.h>
 
+#ifdef __MINGW32__
+#include "mingw_support.h"
+#endif
+
 extern int errno;
 
 #ifndef MAP_FAILED
diff --git a/tools/mkimage.h b/tools/mkimage.h
index a2d5248..6974fa4 100644
--- a/tools/mkimage.h
+++ b/tools/mkimage.h
@@ -28,7 +28,11 @@
 #ifndef __WIN32__
 #include <netinet/in.h>		/* for host / network byte order conversions	*/
 #endif
+#ifdef __MINGW32__
+#include <stdint.h>
+#else
 #include <sys/mman.h>
+#endif
 #include <sys/stat.h>
 #include <time.h>
 #include <unistd.h>
@@ -65,6 +69,7 @@ typedef unsigned int __u32;
 typedef		unsigned char	uint8_t;
 typedef		unsigned short	uint16_t;
 typedef		unsigned int	uint32_t;
+typedef		unsigned long	ulong;
 
 #define     ntohl(a)	SWAP_LONG(a)
 #define     htonl(a)	SWAP_LONG(a)
-- 
1.6.0.2.GIT



More information about the U-Boot mailing list