
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@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@netfarm.it + * Parts by Kees Zeelenberg kzlg@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)