Here it is Stefan!
There is only one main changes:
* add common/cmd_bin.c for adding 'bootwince' command. This command
accept only one argument which is the base address of .bin image. The
command should also handle .nk (raw) images, but I have never tried it
so much (.nk are quite huge and useless)
It also calls build_bin_image_parameters() (if defined) to build
"platform dependent" parameters (e.g. command line, EDBG setup and so on)
* obvious changes to cmd_confdefs.h and Makefile
The "real" patch (as it's used on our platform) also:
* add two platform dependent file (drv_glob.h and halether.h) taken from
WinCE BSP (don't know if this can be added due licence restrictions) to
have C struct to pass info to the kernel (DRIVER_GLOBALS as called
withing WinCE BSP).
* add build_bin_image_parameters() to pass command line and "BSP
dependent" info to the WinCE kernel.
I think that this can be useful too, if you want I can give you a
separate "platform dependent" patch.
I think that the patch needs only to adjust .bin base address and entry
point which is now platform dependent. It can be made platform
independet by playing with WinCE .bib parameters...
HTH!
Best Regards,
--
Andrea
DAVE Srl - Electronics System House
e-mail address: r&d4@dave-tech.it
Stefan Roese wrote:
>
> Yes, please send me the patch. Perhaps we will clean it up and integrate it
> into the common source.
>
> Thanks.
>
> Best regards,
> Stefan
>
> =====================================================================
diff -bwpurN zelk-0.9.0/u-boot/common/cmd_bin.c u-boot/common/cmd_bin.c
--- zelk-0.9.0/u-boot/common/cmd_bin.c 1970-01-01 01:00:00.000000000 +0100
+++ u-boot/common/cmd_bin.c 2005-04-01 17:24:06.000000000 +0200
@@ -0,0 +1,286 @@
+/*
+ * (C) Copyright 2004
+ * Andrea Scian, Dave Srl, andrea.scian@dave-tech.it
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ */
+
+
+#include <common.h>
+#include <command.h>
+#include <linux/ctype.h>
+#include <net.h>
+#include <ep93xx.h>
+
+
+#if (CONFIG_COMMANDS & CFG_CMD_BIN)
+
+#ifndef MAX
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
+#endif
+
+#undef CMD_BIN_DEBUG
+
+
+#ifdef CMD_BIN_DEBUG
+#define PRINTF(fmt,args...) printf (fmt ,##args)
+#else
+#define PRINTF(fmt,args...)
+#endif
+
+/* ======================================================================
+ * BIN file type definition
+ * ====================================================================== */
+
+#define NUM_SYNCBYTES 7
+
+#define SYNC_MAGIC "B000FF\n"
+
+struct bin_sync {
+ unsigned char syncbytes[NUM_SYNCBYTES];
+};
+
+struct bin_header {
+ unsigned int img_start;
+ unsigned int img_length;
+};
+
+#define BASE_BIN_RECORD_SIZE 12
+
+struct bin_record {
+ unsigned int address;
+ unsigned int length;
+ unsigned int checksum;
+ /*
+ ** unsigned char data[length];
+ */
+};
+
+extern int build_bin_image_parameters(char* cmdline);
+
+int valid_bin_image (unsigned long addr);
+unsigned long load_bin_image (unsigned long addr);
+
+
+/* ======================================================================
+ * Interpreter command to boot WindowsCE from a memory image. The image can
+ * be either a .bin image or a raw binary (nb0). Will attempt to setup the
+ * bootline and other parameters correctly.
+ * ====================================================================== */
+int do_bootwince ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+#if defined(CONFIG_WALNUT405) || \
+ defined(CONFIG_CPCI405) || \
+ defined(CONFIG_OCRTC) || \
+ defined(CONFIG_ORSG)
+ DECLARE_GLOBAL_DATA_PTR;
+#endif
+
+ unsigned long addr; /* Address of image */
+ unsigned long bootaddr; /* Address to put the bootline */
+ char *bootline; /* Text of the bootline */
+ char *tmp; /* Temporary char pointer */
+
+ char build_buf[80]; /* Buffer for building the bootline */
+
+ volatile unsigned int value;
+
+ /*
+ * Check the loadaddr variable.
+ * If we don't know where the image is then we're done.
+ */
+
+ if (argc>1) {
+ addr = simple_strtoul (argv[1], NULL, 16);
+ } else if ((tmp = getenv ("loadaddr")) != NULL) {
+ addr = simple_strtoul (tmp, NULL, 16);
+ } else {
+ puts ("No load address provided!\n");
+ return 1;
+ }
+
+#if (CONFIG_COMMANDS & CFG_CMD_NET)
+ /* Check to see if we need to tftp the image ourselves before starting */
+
+ if ((argc == 2) && (strcmp (argv[1], "tftp") == 0)) {
+ if (NetLoop (TFTP) <= 0)
+ return 1;
+ printf ("Automatic boot of WindowsCE image at address 0x%04x ... \n", addr);
+ }
+#endif
+
+ /*
+ * Use bootaddr to find the location in memory that WindowsCE
+ * will look for the bootline string. The default value for
+ * PowerPC is LOCAL_MEM_LOCAL_ADRS + BOOT_LINE_OFFSET which
+ * defaults to 0x4200
+ */
+ if ((tmp = getenv ("bootaddr")) == NULL)
+ bootaddr = PHYS_SDRAM_1 | 0x4200;
+ else
+ bootaddr = simple_strtoul (tmp, NULL, 16);
+
+ /*
+ * Check to see if the bootline is defined in the 'bootargs'
+ * parameter. If it is not defined, we may be able to
+ * construct the info
+ */
+
+ if ((bootline = getenv ("bootargs")) != NULL) {
+ memcpy ((void *) bootaddr, bootline, MAX(strlen(bootline), 512));
+ flush_cache (bootaddr, MAX(strlen(bootline), 512));
+ } else {
+ /* there is no command line! */
+ memset ((void *) bootaddr, 0, 512);
+ }
+
+#ifdef CONFIG_BUILD_BIN_PARAM
+ build_bin_image_parameters(bootaddr);
+#endif
+
+ /*
+ * If the data at the load address is an elf image, then
+ * treat it like an elf image. Otherwise, assume that it is a
+ * binary image
+ */
+
+ printf ("## Loading WindowsCE binary image from 0x%04x, please wait...\n", addr);
+
+ if (valid_bin_image (addr)) {
+ addr = load_bin_image (addr+NUM_SYNCBYTES);
+ } else {
+ puts ("## Not an WinCE BIN image, assuming absolute binary image (.nb0)\n");
+ /* leave addr as load_addr */
+ }
+
+ if (addr==(unsigned long)0xFFFFFFFF) {
+ printf ("## ABORTING: wrong CRC\n");
+ return 1;
+ }
+
+ PRINTF ("## Using bootline (@ 0x%lx): %s\n", bootaddr,
+ (char *) bootaddr);
+ printf ("## Starting WindowsCE at 0x%04x ...\n", addr);
+
+ ((void (*)(void)) addr) ();
+
+ /* we should NEVER get here! */
+
+ puts ("## WindowsCE terminated\n");
+ return 1;
+}
+
+/* ======================================================================
+ * Determine if a valid BIN image exists at the given memory location.
+ * Looks at the BIN header magic field.
+ * ====================================================================== */
+int valid_bin_image (unsigned long addr)
+{
+ struct bin_sync* sync;
+
+ sync = (struct bin_sync*) addr;
+
+ if (strncmp(sync->syncbytes, SYNC_MAGIC, NUM_SYNCBYTES) == 0)
+ return 1;
+ else return 0;
+}
+
+
+/* ======================================================================
+ * A simple WinCE BIN loader, assumes the image is valid, returns the
+ * entry point address.
+ * ====================================================================== */
+unsigned long load_bin_image (unsigned long addr)
+{
+ int i;
+ unsigned long current_addr;
+ unsigned long dest_addr;
+ unsigned long current_dest_addr;
+ struct bin_header header;
+ struct bin_record record;
+ int record_num;
+ long int record_checksum;
+
+ /* read bin header */
+
+ memcpy((char*)&header, (char*)addr, sizeof(header));
+
+ PRINTF("#### .bin image header data:\n");
+ PRINTF("#### start 0x%04x, size 0x%04x\n", header.img_start,
+ header.img_length);
+
+ current_addr = addr + sizeof(struct bin_header);
+ current_dest_addr = header.img_start;
+
+ record_num = 0;
+ while (1) {
+ /* read record */
+ memcpy((char*)&record, (char*)current_addr, sizeof(record));
+
+ PRINTF("#### .bin record #%d:\n", record_num);
+ PRINTF("#### start 0x%04x, size 0x%04x, chksum 0x%04x\n",
+ record.address, record.length, record.checksum);
+
+ if (record.address==0) {
+ PRINTF("#### address==0->quitting!\n");
+ break;
+ }
+
+ current_addr += BASE_BIN_RECORD_SIZE;
+
+ /* checksum verification */
+ record_checksum = 0;
+ for (i=0; i<record.length; i++) {
+ record_checksum += ((char*)(current_addr))[i];
+ }
+
+ if (record_checksum!=record.checksum) {
+ printf("wrong checksum (having 0x%04X!=0x%04X)\n", record_checksum,
+ record.checksum);
+ return 0xFFFFFFFF;
+ }
+
+
+ /* clear uninitialized memory */
+ memset((char*)current_dest_addr+PHYS_SDRAM_1, 0, record.address-current_dest_addr);
+ memcpy((char *)record.address+PHYS_SDRAM_1, (char *)current_addr, record.length);
+
+ current_addr += record.length;
+
+ current_dest_addr = record.address + record.length;
+
+ record_num++;
+
+ putc ('.');
+ }
+
+ printf("\n");
+
+ return header.img_start + PHYS_SDRAM_1;
+}
+
+/* ====================================================================== */
+
+U_BOOT_CMD(
+ bootwince, 2, 0, do_bootwince,
+ "bootwince - Boot Windows CE from a binary (.bin) image\n",
+ " [address] - load address of Windows CE BIN image.\n"
+);
+#endif /* CFG_CMD_BIN */
diff -bwpurN zelk-0.9.0/u-boot/common/Makefile u-boot/common/Makefile
--- zelk-0.9.0/u-boot/common/Makefile 2004-10-12 12:06:40.000000000 +0200
+++ u-boot/common/Makefile 2005-01-28 18:38:38.000000000 +0100
@@ -48,7 +48,8 @@ COBJS = main.o ACEX1K.o altera.o bedbug.
memsize.o miiphybb.o miiphyutil.o \
s_record.o serial.o soft_i2c.o soft_spi.o spartan2.o \
usb.o usb_kbd.o usb_storage.o \
- virtex2.o xilinx.o
+ virtex2.o xilinx.o \
+ cmd_bin.o
OBJS = $(AOBJS) $(COBJS)
diff -bwpurN zelk-0.9.0/u-boot/include/cmd_confdefs.h u-boot/include/cmd_confdefs.h
--- zelk-0.9.0/u-boot/include/cmd_confdefs.h 2004-10-12 12:06:42.000000000 +0200
+++ u-boot/include/cmd_confdefs.h 2005-01-28 18:52:24.000000000 +0100
@@ -90,6 +90,7 @@
#define CFG_CMD_REISER 0x0100000000000000U /* Reiserfs support */
#define CFG_CMD_CDP 0x0200000000000000U /* Cisco Discovery Protocol */
#define CFG_CMD_XIMG 0x0400000000000000U /* Load part of Multi Image */
+#define CFG_CMD_BIN 0x0800000000000000U /* Load a WindowsCE BIN Image */
#define CFG_CMD_ALL 0xFFFFFFFFFFFFFFFFU /* ALL commands */