[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