]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
* Patch by Philippe Robin, 09 Mar 2004:
authorwdenk <wdenk>
Sun, 14 Mar 2004 15:06:13 +0000 (15:06 +0000)
committerwdenk <wdenk>
Sun, 14 Mar 2004 15:06:13 +0000 (15:06 +0000)
  Added ARM Integrator AP, CP and Versatile PB926EJ-S Reference
  Platform support.

* Patch by Masami Komiya, 08 Mar 2004:
  Don't overwrite server IP address or boot file name
  when the boot server does not return values

* Patch by listmember@orkun.us, 5 Mar 2004:
  Removed compile time restriction on CFG_I2C_SPEED for DS1338 RTC

33 files changed:
CHANGELOG
MAKEALL
Makefile
board/integratorap/Makefile [new file with mode: 0644]
board/integratorap/config.mk [new file with mode: 0644]
board/integratorap/flash.c [new file with mode: 0644]
board/integratorap/integratorap.c [new file with mode: 0644]
board/integratorap/platform.S [new file with mode: 0644]
board/integratorap/u-boot.lds [new file with mode: 0644]
board/integratorcp/Makefile [new file with mode: 0644]
board/integratorcp/config.mk [new file with mode: 0644]
board/integratorcp/flash.c [new file with mode: 0644]
board/integratorcp/integratorcp.c [new file with mode: 0644]
board/integratorcp/platform.S [new file with mode: 0644]
board/integratorcp/u-boot.lds [new file with mode: 0644]
board/versatile/Makefile [new file with mode: 0644]
board/versatile/config.mk [new file with mode: 0644]
board/versatile/flash.c [new file with mode: 0644]
board/versatile/platform.S [new file with mode: 0644]
board/versatile/u-boot.lds [new file with mode: 0644]
board/versatile/versatile.c [new file with mode: 0644]
cpu/arm926ejs/interrupts.c
drivers/Makefile
drivers/serial_pl010.c [new file with mode: 0644]
drivers/serial_pl011.c [new file with mode: 0644]
drivers/serial_pl011.h [new file with mode: 0644]
drivers/smc91111.c
include/configs/integratorap.h [new file with mode: 0644]
include/configs/integratorcp.h [new file with mode: 0644]
include/configs/versatile.h [new file with mode: 0644]
net/bootp.c
net/net.c
rtc/ds1307.c

index 3a88aaf22fa15f58f0ea4e0e4a14bab1b77207c2..11ca9edcb32e6d1b7ee94c7c9b287664e343e118 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,17 @@
 Changes for U-Boot 1.0.2:
 ======================================================================
 
+* Patch by Philippe Robin, 09 Mar 2004:
+  Added ARM Integrator AP, CP and Versatile PB926EJ-S Reference
+  Platform support.
+
+* Patch by Masami Komiya, 08 Mar 2004:
+  Don't overwrite server IP address or boot file name
+  when the boot server does not return values
+
+* Patch by listmember@orkun.us, 5 Mar 2004:
+  Removed compile time restriction on CFG_I2C_SPEED for DS1338 RTC
+
 * Patch by Tolunay Orkun, 5 Mar 2004:
   Fix early board initialization for Cogent CSB272 board
 
diff --git a/MAKEALL b/MAKEALL
index ddc863ce9089ef1dd1cc95eba2cb23a759f784d6..eeb084a2f673165be2733db80a792508343200ec 100644 (file)
--- a/MAKEALL
+++ b/MAKEALL
@@ -135,9 +135,10 @@ LIST_ARM7="B2 ep7312 impa7"
 #########################################################################
 
 LIST_ARM9="    \
-       at91rm9200dk    omap1510inn     omap1610h2      omap1610inn     \
+       at91rm9200dk    integratorcp    integratorap                    \
+       omap1510inn     omap1610h2      omap1610inn                     \
        smdk2400        smdk2410        trab                            \
-       VCMA9                                                           \
+       VCMA9           versatile                                       \
 "
 
 #########################################################################
index 4be1aff2efef83b7ee1af04bee136536f1d8e99e..258e5998be1be31d0a592cffb9247a7d70d67891 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -111,7 +111,8 @@ LIBS += common/libcommon.a
 .PHONY : $(LIBS)
 
 # Add GCC lib
-PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
+PLATFORM_LIBS += --no-warn-mismatch -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
+
 
 # The "tools" are needed early, so put this first
 # Don't include stuff already done in $(LIBS)
@@ -927,6 +928,15 @@ xtract_omap1610xxx = $(subst _cs0boot,,$(subst _cs3boot,, $(subst _config,,$1)))
 SX1_config :           unconfig
        @./mkconfig $(@:_config=) arm arm925t sx1
 
+integratorcp_config :  unconfig
+       @./mkconfig $(@:_config=) arm arm926ejs integratorcp
+
+integratorap_config :  unconfig
+       @./mkconfig $(@:_config=) arm arm926ejs integratorap
+
+versatile_config :     unconfig
+       @./mkconfig $(@:_config=) arm arm926ejs versatile
+
 omap1510inn_config :   unconfig
        @./mkconfig $(@:_config=) arm arm925t omap1510inn
 
diff --git a/board/integratorap/Makefile b/board/integratorap/Makefile
new file mode 100644 (file)
index 0000000..00336aa
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# (C) Copyright 2000-2004
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# (C) Copyright 2004
+# ARM Ltd.
+# Philippe Robin, <philippe.robin@arm.com>
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB    = lib$(BOARD).a
+
+OBJS   := integratorap.o flash.o
+SOBJS  := platform.o
+
+$(LIB):        $(OBJS) $(SOBJS)
+       $(AR) crv $@ $^
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+.depend:       Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
+               $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
+
+-include .depend
+
+#########################################################################
diff --git a/board/integratorap/config.mk b/board/integratorap/config.mk
new file mode 100644 (file)
index 0000000..df67491
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# image should be loaded at 0x01000000 
+#
+
+TEXT_BASE = 0x01000000
diff --git a/board/integratorap/flash.c b/board/integratorap/flash.c
new file mode 100644 (file)
index 0000000..b120d63
--- /dev/null
@@ -0,0 +1,473 @@
+/*
+ * (C) Copyright 2001
+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
+ *
+ * (C) Copyright 2001-2004
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * (C) Copyright 2003
+ * Texas Instruments, <www.ti.com>
+ * Kshitij Gupta <Kshitij@ti.com>
+ *
+ * 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 <linux/byteorder/swab.h>
+
+#define PHYS_FLASH_SECT_SIZE   0x00020000      /* 256 KB sectors (x2) */
+flash_info_t flash_info[CFG_MAX_FLASH_BANKS];  /* info for FLASH chips    */
+
+/* Board support for 1 or 2 flash devices */
+#undef FLASH_PORT_WIDTH32
+#define FLASH_PORT_WIDTH16
+
+#ifdef FLASH_PORT_WIDTH16
+#define FLASH_PORT_WIDTH               ushort
+#define FLASH_PORT_WIDTHV              vu_short
+#define SWAP(x)                        __swab16(x)
+#else
+#define FLASH_PORT_WIDTH               ulong
+#define FLASH_PORT_WIDTHV              vu_long
+#define SWAP(x)                        __swab32(x)
+#endif
+
+#define FPW    FLASH_PORT_WIDTH
+#define FPWV   FLASH_PORT_WIDTHV
+
+#define mb() __asm__ __volatile__ ("" : : : "memory")
+
+
+/* Flash Organization Structure */
+typedef struct OrgDef {
+       unsigned int sector_number;
+       unsigned int sector_size;
+} OrgDef;
+
+
+/* Flash Organizations */
+OrgDef OrgIntel_28F256L18T[] = {
+       {4, 32 * 1024},                         /* 4 * 32kBytes sectors */
+       {255, 128 * 1024},                      /* 255 * 128kBytes sectors */
+};
+
+
+/*-----------------------------------------------------------------------
+ * Functions
+ */
+unsigned long flash_init (void);
+static ulong flash_get_size (FPW * addr, flash_info_t * info);
+static int write_data (flash_info_t * info, ulong dest, FPW data);
+static void flash_get_offsets (ulong base, flash_info_t * info);
+void inline spin_wheel (void);
+void flash_print_info (flash_info_t * info);
+void flash_unprotect_sectors (FPWV * addr);
+int flash_erase (flash_info_t * info, int s_first, int s_last);
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt);
+
+/*-----------------------------------------------------------------------
+ */
+
+unsigned long flash_init (void)
+{
+       int i;
+       ulong size = 0;
+       for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {
+               switch (i) {
+               case 0:
+                       flash_get_size ((FPW *) PHYS_FLASH_1, &flash_info[i]);
+                       flash_get_offsets (PHYS_FLASH_1, &flash_info[i]);
+                       break;
+               default:
+                       panic ("configured too many flash banks!\n");
+                       break;
+               }
+               size += flash_info[i].size;
+       }
+
+       /* Protect monitor and environment sectors
+        */
+       flash_protect (FLAG_PROTECT_SET,
+                       CFG_FLASH_BASE,
+                       CFG_FLASH_BASE + monitor_flash_len - 1, &flash_info[0]);
+
+       return size;
+}
+
+/*-----------------------------------------------------------------------
+ */
+static void flash_get_offsets (ulong base, flash_info_t * info)
+{
+       int i;
+       OrgDef *pOrgDef;
+
+       pOrgDef = OrgIntel_28F256L18T;
+       if (info->flash_id == FLASH_UNKNOWN) {
+               return;
+       }
+
+       if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) {
+               for (i = 0; i < info->sector_count; i++) {
+                       if (i > 255) {
+                               info->start[i] = base + (i * 0x8000);
+                               info->protect[i] = 0;
+                       } else {
+                               info->start[i] = base +
+                                               (i * PHYS_FLASH_SECT_SIZE);
+                               info->protect[i] = 0;
+                       }
+               }
+       }
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info (flash_info_t * info)
+{
+       int i;
+
+       if (info->flash_id == FLASH_UNKNOWN) {
+               printf ("missing or unknown FLASH type\n");
+               return;
+       }
+
+       switch (info->flash_id & FLASH_VENDMASK) {
+       case FLASH_MAN_INTEL:
+               printf ("INTEL ");
+               break;
+       default:
+               printf ("Unknown Vendor ");
+               break;
+       }
+
+       switch (info->flash_id & FLASH_TYPEMASK) {
+       case FLASH_28F256L18T:
+               printf ("FLASH 28F256L18T\n");
+               break;
+       default:
+               printf ("Unknown Chip Type\n");
+               break;
+       }
+
+       printf ("  Size: %ld MB in %d Sectors\n",
+                       info->size >> 20, info->sector_count);
+
+       printf ("  Sector Start Addresses:");
+       for (i = 0; i < info->sector_count; ++i) {
+               if ((i % 5) == 0)
+                       printf ("\n   ");
+               printf (" %08lX%s",
+                       info->start[i], info->protect[i] ? " (RO)" : "     ");
+       }
+       printf ("\n");
+       return;
+}
+
+/*
+ * The following code cannot be run from FLASH!
+ */
+static ulong flash_get_size (FPW * addr, flash_info_t * info)
+{
+       volatile FPW value;
+
+       /* Write auto select command: read Manufacturer ID */
+       addr[0x5555] = (FPW) 0x00AA00AA;
+       addr[0x2AAA] = (FPW) 0x00550055;
+       addr[0x5555] = (FPW) 0x00900090;
+
+       mb ();
+       value = addr[0];
+
+       switch (value) {
+
+       case (FPW) INTEL_MANUFACT:
+               info->flash_id = FLASH_MAN_INTEL;
+               break;
+
+       default:
+               info->flash_id = FLASH_UNKNOWN;
+               info->sector_count = 0;
+               info->size = 0;
+               addr[0] = (FPW) 0x00FF00FF;     /* restore read mode */
+               return (0);             /* no or unknown flash  */
+       }
+
+       mb ();
+       value = addr[1];        /* device ID        */
+       switch (value) {
+
+       case (FPW) (INTEL_ID_28F256L18T):
+               info->flash_id += FLASH_28F256L18T;
+               info->sector_count = 259;
+               info->size = 0x02000000;
+               break;                  /* => 32 MB     */
+
+       default:
+               info->flash_id = FLASH_UNKNOWN;
+               break;
+       }
+
+       if (info->sector_count > CFG_MAX_FLASH_SECT) {
+               printf ("** ERROR: sector count %d > max (%d) **\n",
+                               info->sector_count, CFG_MAX_FLASH_SECT);
+               info->sector_count = CFG_MAX_FLASH_SECT;
+       }
+
+       addr[0] = (FPW) 0x00FF00FF;     /* restore read mode */
+
+       return (info->size);
+}
+
+
+/* unprotects a sector for write and erase
+ * on some intel parts, this unprotects the entire chip, but it
+ * wont hurt to call this additional times per sector...
+ */
+void flash_unprotect_sectors (FPWV * addr)
+{
+#define PD_FINTEL_WSMS_READY_MASK    0x0080
+
+       *addr = (FPW) 0x00500050;       /* clear status register */
+
+       /* this sends the clear lock bit command */
+       *addr = (FPW) 0x00600060;
+       *addr = (FPW) 0x00D000D0;
+}
+
+
+/*-----------------------------------------------------------------------
+ */
+
+int flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+       int flag, prot, sect;
+       ulong type, start, last;
+       int rcode = 0;
+
+       if ((s_first < 0) || (s_first > s_last)) {
+               if (info->flash_id == FLASH_UNKNOWN) {
+                       printf ("- missing\n");
+               } else {
+                       printf ("- no sectors to erase\n");
+               }
+               return 1;
+       }
+
+       type = (info->flash_id & FLASH_VENDMASK);
+       if ((type != FLASH_MAN_INTEL)) {
+               printf ("Can't erase unknown flash type %08lx - aborted\n",
+                               info->flash_id);
+               return 1;
+       }
+
+       prot = 0;
+       for (sect = s_first; sect <= s_last; ++sect) {
+               if (info->protect[sect]) {
+                       prot++;
+               }
+       }
+
+       if (prot) {
+               printf ("- Warning: %d protected sectors will not be erased!\n",
+                               prot);
+       } else {
+               printf ("\n");
+       }
+
+
+       start = get_timer (0);
+       last = start;
+
+       /* Disable interrupts which might cause a timeout here */
+       flag = disable_interrupts ();
+
+       /* Start erase on unprotected sectors */
+       for (sect = s_first; sect <= s_last; sect++) {
+               if (info->protect[sect] == 0) { /* not protected */
+                       FPWV *addr = (FPWV *) (info->start[sect]);
+                       FPW status;
+
+                       printf ("Erasing sector %2d ... ", sect);
+
+                       flash_unprotect_sectors (addr);
+
+                       /* arm simple, non interrupt dependent timer */
+                       reset_timer_masked ();
+
+                       *addr = (FPW) 0x00500050;/* clear status register */
+                       *addr = (FPW) 0x00200020;/* erase setup */
+                       *addr = (FPW) 0x00D000D0;/* erase confirm */
+
+                       while (((status =
+                               *addr) & (FPW) 0x00800080) !=
+                               (FPW) 0x00800080) {
+                                       if (get_timer_masked () >
+                                       CFG_FLASH_ERASE_TOUT) {
+                                       printf ("Timeout\n");
+                                       /* suspend erase     */
+                                       *addr = (FPW) 0x00B000B0;
+                                       /* reset to read mode */
+                                       *addr = (FPW) 0x00FF00FF;
+                                       rcode = 1;
+                                       break;
+                               }
+                       }
+
+                       /* clear status register cmd.   */
+                       *addr = (FPW) 0x00500050;
+                       *addr = (FPW) 0x00FF00FF;/* resest to read mode */
+                       printf (" done\n");
+               }
+       }
+       return rcode;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ * 4 - Flash not identified
+ */
+
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+       ulong cp, wp;
+       FPW data;
+       int count, i, l, rc, port_width;
+
+       if (info->flash_id == FLASH_UNKNOWN) {
+               return 4;
+       }
+/* get lower word aligned address */
+#ifdef FLASH_PORT_WIDTH16
+       wp = (addr & ~1);
+       port_width = 2;
+#else
+       wp = (addr & ~3);
+       port_width = 4;
+#endif
+
+       /*
+        * handle unaligned start bytes
+        */
+       if ((l = addr - wp) != 0) {
+               data = 0;
+               for (i = 0, cp = wp; i < l; ++i, ++cp) {
+                       data = (data << 8) | (*(uchar *) cp);
+               }
+               for (; i < port_width && cnt > 0; ++i) {
+                       data = (data << 8) | *src++;
+                       --cnt;
+                       ++cp;
+               }
+               for (; cnt == 0 && i < port_width; ++i, ++cp) {
+                       data = (data << 8) | (*(uchar *) cp);
+               }
+
+               if ((rc = write_data (info, wp, SWAP (data))) != 0) {
+                       return (rc);
+               }
+               wp += port_width;
+       }
+
+       /*
+        * handle word aligned part
+        */
+       count = 0;
+       while (cnt >= port_width) {
+               data = 0;
+               for (i = 0; i < port_width; ++i) {
+                       data = (data << 8) | *src++;
+               }
+               if ((rc = write_data (info, wp, SWAP (data))) != 0) {
+                       return (rc);
+               }
+               wp += port_width;
+               cnt -= port_width;
+               if (count++ > 0x800) {
+                       spin_wheel ();
+                       count = 0;
+               }
+       }
+
+       if (cnt == 0) {
+               return (0);
+       }
+
+       /*
+        * handle unaligned tail bytes
+        */
+       data = 0;
+       for (i = 0, cp = wp; i < port_width && cnt > 0; ++i, ++cp) {
+               data = (data << 8) | *src++;
+               --cnt;
+       }
+       for (; i < port_width; ++i, ++cp) {
+               data = (data << 8) | (*(uchar *) cp);
+       }
+
+       return (write_data (info, wp, SWAP (data)));
+}
+
+/*-----------------------------------------------------------------------
+ * Write a word or halfword to Flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ */
+static int write_data (flash_info_t * info, ulong dest, FPW data)
+{
+       FPWV *addr = (FPWV *) dest;
+       ulong status;
+       int flag;
+
+       /* Check if Flash is (sufficiently) erased */
+       if ((*addr & data) != data) {
+               printf ("not erased at %08lx (%x)\n", (ulong) addr, *addr);
+               return (2);
+       }
+       flash_unprotect_sectors (addr);
+       /* Disable interrupts which might cause a timeout here */
+       flag = disable_interrupts ();
+       *addr = (FPW) 0x00400040;       /* write setup */
+       *addr = data;
+
+       /* arm simple, non interrupt dependent timer */
+       reset_timer_masked ();
+
+       /* wait while polling the status register */
+       while (((status = *addr) & (FPW) 0x00800080) != (FPW) 0x00800080) {
+               if (get_timer_masked () > CFG_FLASH_WRITE_TOUT) {
+                       *addr = (FPW) 0x00FF00FF;       /* restore read mode */
+                       return (1);
+               }
+       }
+       *addr = (FPW) 0x00FF00FF;       /* restore read mode */
+       return (0);
+}
+
+void inline spin_wheel (void)
+{
+       static int p = 0;
+       static char w[] = "\\/-";
+
+       printf ("\010%c", w[p]);
+       (++p == 3) ? (p = 0) : 0;
+}
diff --git a/board/integratorap/integratorap.c b/board/integratorap/integratorap.c
new file mode 100644 (file)
index 0000000..960ec3a
--- /dev/null
@@ -0,0 +1,455 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2002
+ * David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
+ *
+ * (C) Copyright 2003
+ * Texas Instruments, <www.ti.com>
+ * Kshitij Gupta <Kshitij@ti.com>
+ *
+ * (C) Copyright 2004
+ * ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ *
+ * 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>
+
+#ifdef CONFIG_PCI
+#   include <pci.h>
+#endif
+
+void flash__init (void);
+void ether__init (void);
+void peripheral_power_enable (void);
+
+#if defined(CONFIG_SHOW_BOOT_PROGRESS)
+void show_boot_progress(int progress)
+{
+    printf("Boot reached stage %d\n", progress);
+}
+#endif
+
+#define COMP_MODE_ENABLE ((unsigned int)0x0000EAEF)
+
+static inline void delay (unsigned long loops)
+{
+       __asm__ volatile ("1:\n"
+               "subs %0, %1, #1\n"
+               "bne 1b":"=r" (loops):"0" (loops));
+}
+
+/*
+ * Miscellaneous platform dependent initialisations
+ */
+
+int board_init (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       /* arch number of Integrator Board */
+       gd->bd->bi_arch_number = 21;
+
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = 0x00000100;
+
+       icache_enable ();
+
+       flash__init ();
+       return 0;
+}
+
+
+int misc_init_r (void)
+{
+#ifdef CONFIG_PCI
+       pci_init();
+#endif
+       setenv("verify", "n");
+       return (0);
+}
+
+/*
+ * Initialize PCI Devices, report devices found.
+ */
+#ifdef CONFIG_PCI
+
+#ifndef CONFIG_PCI_PNP
+
+static struct pci_config_table pci_integrator_config_table[] = {
+       { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x0f, PCI_ANY_ID,
+         pci_cfgfunc_config_device, { PCI_ENET0_IOADDR,
+                                      PCI_ENET0_MEMADDR,
+                                      PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER }},
+       { }
+};
+#endif
+
+// V3 access routines
+#define _V3Write16(o,v) (*(volatile unsigned short *)(PCI_V3_BASE + (unsigned int)(o)) = (unsigned short)(v))
+#define _V3Read16(o)    (*(volatile unsigned short *)(PCI_V3_BASE + (unsigned int)(o)))
+
+#define _V3Write32(o,v) (*(volatile unsigned int *)(PCI_V3_BASE + (unsigned int)(o)) = (unsigned int)(v))
+#define _V3Read32(o)    (*(volatile unsigned int *)(PCI_V3_BASE + (unsigned int)(o)))
+
+// Compute address necessary to access PCI config space for the given
+// bus and device.
+#define PCI_CONFIG_ADDRESS( __bus, __devfn, __offset ) \
+    ({                                                                                 \
+    unsigned int __address, __devicebit;                                                       \
+    unsigned short __mapaddress;                                                               \
+    unsigned int __dev = PCI_DEV(__devfn);     /* FIXME to check!! (slot?) */  \
+                                                                                       \
+    if (__bus == 0) {                                                                  \
+       /* local bus segment so need a type 0 config cycle */                           \
+        /* build the PCI configuration "address" with one-hot in A31-A11 */            \
+        __address = PCI_CONFIG_BASE;                                                   \
+        __address |= ((__devfn & 0x07) << 8);                                          \
+        __address |= __offset & 0xFF;                                                  \
+        __mapaddress = 0x000A;    /* 101=>config cycle, 0=>A1=A0=0 */                  \
+        __devicebit = (1 << (__dev + 11));                                             \
+                                                                                       \
+        if ((__devicebit & 0xFF000000) != 0) {                                         \
+            /* high order bits are handled by the MAP register */                      \
+            __mapaddress |= (__devicebit >> 16);                                       \
+        } else {                                                                       \
+            /* low order bits handled directly in the address */                       \
+            __address |= __devicebit;                                                  \
+        }                                                                              \
+    } else {   /* bus !=0 */                                                           \
+        /* not the local bus segment so need a type 1 config cycle */                  \
+        /* A31-A24 are don't care (so clear to 0) */                                   \
+        __mapaddress = 0x000B;    /* 101=>config cycle, 1=>A1&A0 from PCI_CFG */       \
+        __address = PCI_CONFIG_BASE;                                                   \
+        __address |= ((__bus & 0xFF) << 16);   /* bits 23..16 = bus number     */      \
+        __address |= ((__dev & 0x1F) << 11);   /* bits 15..11 = device number  */      \
+        __address |= ((__devfn & 0x07) << 8);          /* bits 10..8  = function number*/      \
+        __address |= __offset & 0xFF;                  /* bits  7..0  = register number*/      \
+    }                                                                                  \
+    _V3Write16(V3_LB_MAP1, __mapaddress);                                              \
+                                                                                       \
+    __address;                                                                         \
+    })
+
+// _V3OpenConfigWindow - open V3 configuration window
+#define _V3OpenConfigWindow()                                                  \
+    {                                                                          \
+    /* Set up base0 to see all 512Mbytes of memory space (not       */         \
+    /* prefetchable), this frees up base1 for re-use by configuration*/                \
+    /* memory */                                                               \
+                                                                               \
+    _V3Write32 (V3_LB_BASE0, ((INTEGRATOR_PCI_BASE & 0xFFF00000) |             \
+                            0x90 | V3_LB_BASE_M_ENABLE));                      \
+    /* Set up base1 to point into configuration space, note that MAP1 */       \
+    /* register is set up by pciMakeConfigAddress(). */                                \
+                                                                               \
+    _V3Write32 (V3_LB_BASE1, ((CPU_PCI_CNFG_ADRS & 0xFFF00000) |               \
+                            0x40 | V3_LB_BASE_M_ENABLE));                      \
+    }
+
+// _V3CloseConfigWindow - close V3 configuration window
+#define _V3CloseConfigWindow()                                                 \
+    {                                                                          \
+    /* Reassign base1 for use by prefetchable PCI memory */                    \
+    _V3Write32 (V3_LB_BASE1, (((INTEGRATOR_PCI_BASE + 0x10000000) & 0xFFF00000)        \
+                                       | 0x84 | V3_LB_BASE_M_ENABLE));         \
+    _V3Write16 (V3_LB_MAP1,                                                    \
+           (((INTEGRATOR_PCI_BASE + 0x10000000) & 0xFFF00000) >> 16) | 0x0006);        \
+                                                                               \
+    /* And shrink base0 back to a 256M window (NOTE: MAP0 already correct) */  \
+                                                                               \
+    _V3Write32 (V3_LB_BASE0, ((INTEGRATOR_PCI_BASE & 0xFFF00000) |             \
+                            0x80 | V3_LB_BASE_M_ENABLE));                      \
+    }
+
+
+static int pci_integrator_read_byte(struct pci_controller *hose, pci_dev_t dev,
+                                   int offset, unsigned char *val)
+{
+    _V3OpenConfigWindow();
+    *val = *(volatile unsigned char *)PCI_CONFIG_ADDRESS(PCI_BUS(dev), PCI_FUNC(dev), offset);
+    _V3CloseConfigWindow();
+
+    return 0;
+}
+
+static int pci_integrator_read__word(struct pci_controller *hose, pci_dev_t dev,
+                                    int offset, unsigned short *val)
+{
+    _V3OpenConfigWindow();
+    *val = *(volatile unsigned short *)PCI_CONFIG_ADDRESS(PCI_BUS(dev), PCI_FUNC(dev), offset);
+    _V3CloseConfigWindow();
+
+    return 0;
+}
+
+static int pci_integrator_read_dword(struct pci_controller *hose, pci_dev_t dev,
+                                    int offset, unsigned int *val)
+{
+    _V3OpenConfigWindow();
+    *val = *(volatile unsigned short *)PCI_CONFIG_ADDRESS(PCI_BUS(dev), PCI_FUNC(dev), offset);
+    *val |= (*(volatile unsigned int *)PCI_CONFIG_ADDRESS(PCI_BUS(dev), PCI_FUNC(dev), (offset+2))) << 16;
+    _V3CloseConfigWindow();
+
+    return 0;
+}
+
+static int pci_integrator_write_byte(struct pci_controller *hose, pci_dev_t dev,
+                                    int offset, unsigned char val)
+{
+    _V3OpenConfigWindow();
+    *(volatile unsigned char *)PCI_CONFIG_ADDRESS(PCI_BUS(dev), PCI_FUNC(dev), offset) = val;
+    _V3CloseConfigWindow();
+
+    return 0;
+}
+
+static int pci_integrator_write_word(struct pci_controller *hose, pci_dev_t dev,
+                                    int offset,unsigned short val)
+{
+    _V3OpenConfigWindow();
+    *(volatile unsigned short *)PCI_CONFIG_ADDRESS(PCI_BUS(dev), PCI_FUNC(dev), offset) = val;
+    _V3CloseConfigWindow();
+
+    return 0;
+}
+
+static int pci_integrator_write_dword(struct pci_controller *hose, pci_dev_t dev,
+                                     int offset, unsigned int val)
+{
+    _V3OpenConfigWindow();
+    *(volatile unsigned short *)PCI_CONFIG_ADDRESS(PCI_BUS(dev), PCI_FUNC(dev), offset) = (val & 0xFFFF);
+    *(volatile unsigned short *)PCI_CONFIG_ADDRESS(PCI_BUS(dev), PCI_FUNC(dev), (offset + 2)) = ((val >> 16) & 0xFFFF);
+    _V3CloseConfigWindow();
+
+    return 0;
+}
+
+/******************************
+ * PCI initialisation
+ ******************************/
+
+struct pci_controller integrator_hose = {
+#ifndef CONFIG_PCI_PNP
+       config_table: pci_integrator_config_table,
+#endif
+};
+
+void pci_init_board(void)
+{
+    volatile int i, j;
+    struct pci_controller *hose = &integrator_hose;
+
+    /* setting this register will take the V3 out of reset */
+
+    *(volatile unsigned int *)(INTEGRATOR_SC_PCIENABLE) = 1;
+
+    /* wait a few usecs to settle the device and the PCI bus */
+
+    for (i = 0; i < 100 ; i++)
+          j = i + 1;
+
+    /* Now write the Base I/O Address Word to V3_BASE + 0x6C */
+
+    *(volatile unsigned short *)(V3_BASE + V3_LB_IO_BASE) = (unsigned short)(V3_BASE >> 16);
+
+    do {
+        *(volatile unsigned char *)(V3_BASE + V3_MAIL_DATA) = 0xAA;
+       *(volatile unsigned char *)(V3_BASE + V3_MAIL_DATA + 4) = 0x55;
+    } while (*(volatile unsigned char *)(V3_BASE + V3_MAIL_DATA) != 0xAA ||
+            *(volatile unsigned char *)(V3_BASE + V3_MAIL_DATA + 4) != 0x55);
+
+    /* Make sure that V3 register access is not locked, if it is, unlock it */
+
+    if ((*(volatile unsigned short *)(V3_BASE + V3_SYSTEM) & V3_SYSTEM_M_LOCK)
+                               == V3_SYSTEM_M_LOCK)
+       *(volatile unsigned short *)(V3_BASE + V3_SYSTEM) = 0xA05F;
+
+    /* Ensure that the slave accesses from PCI are disabled while we */
+    /* setup windows */
+
+    *(volatile unsigned short *)(V3_BASE + V3_PCI_CMD) &=
+                               ~(V3_COMMAND_M_MEM_EN | V3_COMMAND_M_IO_EN);
+
+    /* Clear RST_OUT to 0; keep the PCI bus in reset until we've finished */
+
+    *(volatile unsigned short *)(V3_BASE + V3_SYSTEM) &= ~V3_SYSTEM_M_RST_OUT;
+
+    /* Make all accesses from PCI space retry until we're ready for them */
+
+    *(volatile unsigned short *)(V3_BASE + V3_PCI_CFG) |= V3_PCI_CFG_M_RETRY_EN;
+
+    /* Set up any V3 PCI Configuration Registers that we absolutely have to */
+    /* LB_CFG controls Local Bus protocol. */
+    /* Enable LocalBus byte strobes for READ accesses too. */
+    /* set bit 7 BE_IMODE and bit 6 BE_OMODE */
+
+    *(volatile unsigned short *)(V3_BASE + V3_LB_CFG) |= 0x0C0;
+
+    /* PCI_CMD controls overall PCI operation. */
+    /* Enable PCI bus master. */
+
+    *(volatile unsigned short *)(V3_BASE + V3_PCI_CMD) |= 0x04;
+
+    /* PCI_MAP0 controls where the PCI to CPU memory window is on Local Bus*/
+
+    *(volatile unsigned int *)(V3_BASE + V3_PCI_MAP0) = (INTEGRATOR_BOOT_ROM_BASE) |
+                                       (V3_PCI_MAP_M_ADR_SIZE_512M |
+                                       V3_PCI_MAP_M_REG_EN |
+                                       V3_PCI_MAP_M_ENABLE);
+
+    /* PCI_BASE0 is the PCI address of the start of the window */
+
+    *(volatile unsigned int *)(V3_BASE + V3_PCI_BASE0) = INTEGRATOR_BOOT_ROM_BASE;
+
+    /* PCI_MAP1 is LOCAL address of the start of the window */
+
+    *(volatile unsigned int *)(V3_BASE + V3_PCI_MAP1) = (INTEGRATOR_HDR0_SDRAM_BASE) |
+                       (V3_PCI_MAP_M_ADR_SIZE_1024M | V3_PCI_MAP_M_REG_EN |
+                        V3_PCI_MAP_M_ENABLE);
+
+    /* PCI_BASE1 is the PCI address of the start of the window */
+
+    *(volatile unsigned int *)(V3_BASE + V3_PCI_BASE1) = INTEGRATOR_HDR0_SDRAM_BASE;
+
+    /* Set up the windows from local bus memory into PCI configuration, */
+    /* I/O and Memory. */
+    /* PCI I/O, LB_BASE2 and LB_MAP2 are used exclusively for this. */
+
+    *(volatile unsigned short *)(V3_BASE +V3_LB_BASE2) =
+                       ((CPU_PCI_IO_ADRS >> 24) << 8) | V3_LB_BASE_M_ENABLE;
+    *(volatile unsigned short *)(V3_BASE + V3_LB_MAP2) = 0;
+
+    /* PCI Configuration, use LB_BASE1/LB_MAP1. */
+
+    /* PCI Memory use LB_BASE0/LB_MAP0 and LB_BASE1/LB_MAP1 */
+    /* Map first 256Mbytes as non-prefetchable via BASE0/MAP0 */
+    /* (INTEGRATOR_PCI_BASE == PCI_MEM_BASE) */
+
+    *(volatile unsigned int *)(V3_BASE + V3_LB_BASE0) =
+                       INTEGRATOR_PCI_BASE | (0x80 | V3_LB_BASE_M_ENABLE);
+
+    *(volatile unsigned short *)(V3_BASE + V3_LB_MAP0) =
+                       ((INTEGRATOR_PCI_BASE >> 20) << 0x4) | 0x0006;
+
+    /* Map second 256 Mbytes as prefetchable via BASE1/MAP1 */
+
+    *(volatile unsigned int *)(V3_BASE + V3_LB_BASE1) =
+                       INTEGRATOR_PCI_BASE | (0x84 | V3_LB_BASE_M_ENABLE);
+
+    *(volatile unsigned short *)(V3_BASE + V3_LB_MAP1) =
+                       (((INTEGRATOR_PCI_BASE + 0x10000000) >> 20) << 4) | 0x0006;
+
+    /* Allow accesses to PCI Configuration space */
+    /* and set up A1, A0 for type 1 config cycles */
+
+    *(volatile unsigned short *)(V3_BASE + V3_PCI_CFG) =
+                       ((*(volatile unsigned short *)(V3_BASE + V3_PCI_CFG)) &
+                          ~(V3_PCI_CFG_M_RETRY_EN | V3_PCI_CFG_M_AD_LOW1) ) |
+                          V3_PCI_CFG_M_AD_LOW0;
+
+    /* now we can allow in PCI MEMORY accesses */
+
+    *(volatile unsigned short *)(V3_BASE + V3_PCI_CMD) =
+               (*(volatile unsigned short *)(V3_BASE + V3_PCI_CMD)) | V3_COMMAND_M_MEM_EN;
+
+    /* Set RST_OUT to take the PCI bus is out of reset, PCI devices can */
+    /* initialise and lock the V3 system register so that no one else */
+    /* can play with it */
+
+   *(volatile unsigned short *)(V3_BASE + V3_SYSTEM) =
+               (*(volatile unsigned short *)(V3_BASE + V3_SYSTEM)) | V3_SYSTEM_M_RST_OUT;
+
+   *(volatile unsigned short *)(V3_BASE + V3_SYSTEM) =
+               (*(volatile unsigned short *)(V3_BASE + V3_SYSTEM)) | V3_SYSTEM_M_LOCK;
+
+     /*
+      * Register the hose
+      */
+   hose->first_busno = 0;
+   hose->last_busno = 0xff;
+
+   /* System memory space */
+   pci_set_region(hose->regions + 0,
+                 0x00000000, 0x40000000, 0x01000000,
+                 PCI_REGION_MEM | PCI_REGION_MEMORY);
+
+   /* PCI Memory - config space */
+   pci_set_region(hose->regions + 1,
+                 0x00000000, 0x62000000, 0x01000000,
+                 PCI_REGION_MEM);
+
+   /* PCI V3 regs */
+   pci_set_region(hose->regions + 2,
+                 0x00000000, 0x61000000, 0x00080000,
+                 PCI_REGION_MEM);
+
+   /* PCI I/O space */
+   pci_set_region(hose->regions + 3,
+                 0x00000000, 0x60000000, 0x00010000,
+                 PCI_REGION_IO);
+
+   pci_set_ops(hose,
+              pci_integrator_read_byte,
+              pci_integrator_read__word,
+              pci_integrator_read_dword,
+              pci_integrator_write_byte,
+              pci_integrator_write_word,
+              pci_integrator_write_dword);
+
+   hose->region_count = 4;
+
+   pci_register_hose(hose);
+
+   pciauto_config_init(hose);
+   pciauto_config_device(hose, 0);
+
+   hose->last_busno = pci_hose_scan(hose);
+}
+#endif
+
+/******************************
+ Routine:
+ Description:
+******************************/
+void flash__init (void)
+{
+}
+/*************************************************************
+ Routine:ether__init
+ Description: take the Ethernet controller out of reset and wait
+                          for the EEPROM load to complete.
+*************************************************************/
+void ether__init (void)
+{
+}
+
+/******************************
+ Routine:
+ Description:
+******************************/
+int dram_init (void)
+{
+       return 0;
+}
+
diff --git a/board/integratorap/platform.S b/board/integratorap/platform.S
new file mode 100644 (file)
index 0000000..480e040
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Board specific setup info
+ *
+ * (C) Copyright 2004, ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ *
+ * 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 <config.h>
+#include <version.h>
+
+.globl platformsetup
+platformsetup:
+
+       /* All done by Integrator's boot monitor! */
+       mov pc, lr
diff --git a/board/integratorap/u-boot.lds b/board/integratorap/u-boot.lds
new file mode 100644 (file)
index 0000000..da679c2
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ *
+ * 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
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x00000000;
+       . = ALIGN(4);
+       .text   :
+       {
+         cpu/arm926ejs/start.o (.text)
+         *(.text)
+       }
+       .rodata : { *(.rodata) }
+       . = ALIGN(4);
+       .data : { *(.data) }
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       __u_boot_cmd_start = .;
+       .u_boot_cmd : { *(.u_boot_cmd) }
+       __u_boot_cmd_end = .;
+
+       armboot_end_data = .;
+       . = ALIGN(4);
+       .bss : { *(.bss) }
+       armboot_end = .;
+}
diff --git a/board/integratorcp/Makefile b/board/integratorcp/Makefile
new file mode 100644 (file)
index 0000000..9c97237
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# (C) Copyright 2000-2004
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB    = lib$(BOARD).a
+
+OBJS   := integratorcp.o flash.o
+SOBJS  := platform.o
+
+$(LIB):        $(OBJS) $(SOBJS)
+       $(AR) crv $@ $^
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+.depend:       Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
+               $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
+
+-include .depend
+
+#########################################################################
diff --git a/board/integratorcp/config.mk b/board/integratorcp/config.mk
new file mode 100644 (file)
index 0000000..df67491
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# image should be loaded at 0x01000000 
+#
+
+TEXT_BASE = 0x01000000
diff --git a/board/integratorcp/flash.c b/board/integratorcp/flash.c
new file mode 100644 (file)
index 0000000..b120d63
--- /dev/null
@@ -0,0 +1,473 @@
+/*
+ * (C) Copyright 2001
+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
+ *
+ * (C) Copyright 2001-2004
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * (C) Copyright 2003
+ * Texas Instruments, <www.ti.com>
+ * Kshitij Gupta <Kshitij@ti.com>
+ *
+ * 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 <linux/byteorder/swab.h>
+
+#define PHYS_FLASH_SECT_SIZE   0x00020000      /* 256 KB sectors (x2) */
+flash_info_t flash_info[CFG_MAX_FLASH_BANKS];  /* info for FLASH chips    */
+
+/* Board support for 1 or 2 flash devices */
+#undef FLASH_PORT_WIDTH32
+#define FLASH_PORT_WIDTH16
+
+#ifdef FLASH_PORT_WIDTH16
+#define FLASH_PORT_WIDTH               ushort
+#define FLASH_PORT_WIDTHV              vu_short
+#define SWAP(x)                        __swab16(x)
+#else
+#define FLASH_PORT_WIDTH               ulong
+#define FLASH_PORT_WIDTHV              vu_long
+#define SWAP(x)                        __swab32(x)
+#endif
+
+#define FPW    FLASH_PORT_WIDTH
+#define FPWV   FLASH_PORT_WIDTHV
+
+#define mb() __asm__ __volatile__ ("" : : : "memory")
+
+
+/* Flash Organization Structure */
+typedef struct OrgDef {
+       unsigned int sector_number;
+       unsigned int sector_size;
+} OrgDef;
+
+
+/* Flash Organizations */
+OrgDef OrgIntel_28F256L18T[] = {
+       {4, 32 * 1024},                         /* 4 * 32kBytes sectors */
+       {255, 128 * 1024},                      /* 255 * 128kBytes sectors */
+};
+
+
+/*-----------------------------------------------------------------------
+ * Functions
+ */
+unsigned long flash_init (void);
+static ulong flash_get_size (FPW * addr, flash_info_t * info);
+static int write_data (flash_info_t * info, ulong dest, FPW data);
+static void flash_get_offsets (ulong base, flash_info_t * info);
+void inline spin_wheel (void);
+void flash_print_info (flash_info_t * info);
+void flash_unprotect_sectors (FPWV * addr);
+int flash_erase (flash_info_t * info, int s_first, int s_last);
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt);
+
+/*-----------------------------------------------------------------------
+ */
+
+unsigned long flash_init (void)
+{
+       int i;
+       ulong size = 0;
+       for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {
+               switch (i) {
+               case 0:
+                       flash_get_size ((FPW *) PHYS_FLASH_1, &flash_info[i]);
+                       flash_get_offsets (PHYS_FLASH_1, &flash_info[i]);
+                       break;
+               default:
+                       panic ("configured too many flash banks!\n");
+                       break;
+               }
+               size += flash_info[i].size;
+       }
+
+       /* Protect monitor and environment sectors
+        */
+       flash_protect (FLAG_PROTECT_SET,
+                       CFG_FLASH_BASE,
+                       CFG_FLASH_BASE + monitor_flash_len - 1, &flash_info[0]);
+
+       return size;
+}
+
+/*-----------------------------------------------------------------------
+ */
+static void flash_get_offsets (ulong base, flash_info_t * info)
+{
+       int i;
+       OrgDef *pOrgDef;
+
+       pOrgDef = OrgIntel_28F256L18T;
+       if (info->flash_id == FLASH_UNKNOWN) {
+               return;
+       }
+
+       if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) {
+               for (i = 0; i < info->sector_count; i++) {
+                       if (i > 255) {
+                               info->start[i] = base + (i * 0x8000);
+                               info->protect[i] = 0;
+                       } else {
+                               info->start[i] = base +
+                                               (i * PHYS_FLASH_SECT_SIZE);
+                               info->protect[i] = 0;
+                       }
+               }
+       }
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info (flash_info_t * info)
+{
+       int i;
+
+       if (info->flash_id == FLASH_UNKNOWN) {
+               printf ("missing or unknown FLASH type\n");
+               return;
+       }
+
+       switch (info->flash_id & FLASH_VENDMASK) {
+       case FLASH_MAN_INTEL:
+               printf ("INTEL ");
+               break;
+       default:
+               printf ("Unknown Vendor ");
+               break;
+       }
+
+       switch (info->flash_id & FLASH_TYPEMASK) {
+       case FLASH_28F256L18T:
+               printf ("FLASH 28F256L18T\n");
+               break;
+       default:
+               printf ("Unknown Chip Type\n");
+               break;
+       }
+
+       printf ("  Size: %ld MB in %d Sectors\n",
+                       info->size >> 20, info->sector_count);
+
+       printf ("  Sector Start Addresses:");
+       for (i = 0; i < info->sector_count; ++i) {
+               if ((i % 5) == 0)
+                       printf ("\n   ");
+               printf (" %08lX%s",
+                       info->start[i], info->protect[i] ? " (RO)" : "     ");
+       }
+       printf ("\n");
+       return;
+}
+
+/*
+ * The following code cannot be run from FLASH!
+ */
+static ulong flash_get_size (FPW * addr, flash_info_t * info)
+{
+       volatile FPW value;
+
+       /* Write auto select command: read Manufacturer ID */
+       addr[0x5555] = (FPW) 0x00AA00AA;
+       addr[0x2AAA] = (FPW) 0x00550055;
+       addr[0x5555] = (FPW) 0x00900090;
+
+       mb ();
+       value = addr[0];
+
+       switch (value) {
+
+       case (FPW) INTEL_MANUFACT:
+               info->flash_id = FLASH_MAN_INTEL;
+               break;
+
+       default:
+               info->flash_id = FLASH_UNKNOWN;
+               info->sector_count = 0;
+               info->size = 0;
+               addr[0] = (FPW) 0x00FF00FF;     /* restore read mode */
+               return (0);             /* no or unknown flash  */
+       }
+
+       mb ();
+       value = addr[1];        /* device ID        */
+       switch (value) {
+
+       case (FPW) (INTEL_ID_28F256L18T):
+               info->flash_id += FLASH_28F256L18T;
+               info->sector_count = 259;
+               info->size = 0x02000000;
+               break;                  /* => 32 MB     */
+
+       default:
+               info->flash_id = FLASH_UNKNOWN;
+               break;
+       }
+
+       if (info->sector_count > CFG_MAX_FLASH_SECT) {
+               printf ("** ERROR: sector count %d > max (%d) **\n",
+                               info->sector_count, CFG_MAX_FLASH_SECT);
+               info->sector_count = CFG_MAX_FLASH_SECT;
+       }
+
+       addr[0] = (FPW) 0x00FF00FF;     /* restore read mode */
+
+       return (info->size);
+}
+
+
+/* unprotects a sector for write and erase
+ * on some intel parts, this unprotects the entire chip, but it
+ * wont hurt to call this additional times per sector...
+ */
+void flash_unprotect_sectors (FPWV * addr)
+{
+#define PD_FINTEL_WSMS_READY_MASK    0x0080
+
+       *addr = (FPW) 0x00500050;       /* clear status register */
+
+       /* this sends the clear lock bit command */
+       *addr = (FPW) 0x00600060;
+       *addr = (FPW) 0x00D000D0;
+}
+
+
+/*-----------------------------------------------------------------------
+ */
+
+int flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+       int flag, prot, sect;
+       ulong type, start, last;
+       int rcode = 0;
+
+       if ((s_first < 0) || (s_first > s_last)) {
+               if (info->flash_id == FLASH_UNKNOWN) {
+                       printf ("- missing\n");
+               } else {
+                       printf ("- no sectors to erase\n");
+               }
+               return 1;
+       }
+
+       type = (info->flash_id & FLASH_VENDMASK);
+       if ((type != FLASH_MAN_INTEL)) {
+               printf ("Can't erase unknown flash type %08lx - aborted\n",
+                               info->flash_id);
+               return 1;
+       }
+
+       prot = 0;
+       for (sect = s_first; sect <= s_last; ++sect) {
+               if (info->protect[sect]) {
+                       prot++;
+               }
+       }
+
+       if (prot) {
+               printf ("- Warning: %d protected sectors will not be erased!\n",
+                               prot);
+       } else {
+               printf ("\n");
+       }
+
+
+       start = get_timer (0);
+       last = start;
+
+       /* Disable interrupts which might cause a timeout here */
+       flag = disable_interrupts ();
+
+       /* Start erase on unprotected sectors */
+       for (sect = s_first; sect <= s_last; sect++) {
+               if (info->protect[sect] == 0) { /* not protected */
+                       FPWV *addr = (FPWV *) (info->start[sect]);
+                       FPW status;
+
+                       printf ("Erasing sector %2d ... ", sect);
+
+                       flash_unprotect_sectors (addr);
+
+                       /* arm simple, non interrupt dependent timer */
+                       reset_timer_masked ();
+
+                       *addr = (FPW) 0x00500050;/* clear status register */
+                       *addr = (FPW) 0x00200020;/* erase setup */
+                       *addr = (FPW) 0x00D000D0;/* erase confirm */
+
+                       while (((status =
+                               *addr) & (FPW) 0x00800080) !=
+                               (FPW) 0x00800080) {
+                                       if (get_timer_masked () >
+                                       CFG_FLASH_ERASE_TOUT) {
+                                       printf ("Timeout\n");
+                                       /* suspend erase     */
+                                       *addr = (FPW) 0x00B000B0;
+                                       /* reset to read mode */
+                                       *addr = (FPW) 0x00FF00FF;
+                                       rcode = 1;
+                                       break;
+                               }
+                       }
+
+                       /* clear status register cmd.   */
+                       *addr = (FPW) 0x00500050;
+                       *addr = (FPW) 0x00FF00FF;/* resest to read mode */
+                       printf (" done\n");
+               }
+       }
+       return rcode;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ * 4 - Flash not identified
+ */
+
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+       ulong cp, wp;
+       FPW data;
+       int count, i, l, rc, port_width;
+
+       if (info->flash_id == FLASH_UNKNOWN) {
+               return 4;
+       }
+/* get lower word aligned address */
+#ifdef FLASH_PORT_WIDTH16
+       wp = (addr & ~1);
+       port_width = 2;
+#else
+       wp = (addr & ~3);
+       port_width = 4;
+#endif
+
+       /*
+        * handle unaligned start bytes
+        */
+       if ((l = addr - wp) != 0) {
+               data = 0;
+               for (i = 0, cp = wp; i < l; ++i, ++cp) {
+                       data = (data << 8) | (*(uchar *) cp);
+               }
+               for (; i < port_width && cnt > 0; ++i) {
+                       data = (data << 8) | *src++;
+                       --cnt;
+                       ++cp;
+               }
+               for (; cnt == 0 && i < port_width; ++i, ++cp) {
+                       data = (data << 8) | (*(uchar *) cp);
+               }
+
+               if ((rc = write_data (info, wp, SWAP (data))) != 0) {
+                       return (rc);
+               }
+               wp += port_width;
+       }
+
+       /*
+        * handle word aligned part
+        */
+       count = 0;
+       while (cnt >= port_width) {
+               data = 0;
+               for (i = 0; i < port_width; ++i) {
+                       data = (data << 8) | *src++;
+               }
+               if ((rc = write_data (info, wp, SWAP (data))) != 0) {
+                       return (rc);
+               }
+               wp += port_width;
+               cnt -= port_width;
+               if (count++ > 0x800) {
+                       spin_wheel ();
+                       count = 0;
+               }
+       }
+
+       if (cnt == 0) {
+               return (0);
+       }
+
+       /*
+        * handle unaligned tail bytes
+        */
+       data = 0;
+       for (i = 0, cp = wp; i < port_width && cnt > 0; ++i, ++cp) {
+               data = (data << 8) | *src++;
+               --cnt;
+       }
+       for (; i < port_width; ++i, ++cp) {
+               data = (data << 8) | (*(uchar *) cp);
+       }
+
+       return (write_data (info, wp, SWAP (data)));
+}
+
+/*-----------------------------------------------------------------------
+ * Write a word or halfword to Flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ */
+static int write_data (flash_info_t * info, ulong dest, FPW data)
+{
+       FPWV *addr = (FPWV *) dest;
+       ulong status;
+       int flag;
+
+       /* Check if Flash is (sufficiently) erased */
+       if ((*addr & data) != data) {
+               printf ("not erased at %08lx (%x)\n", (ulong) addr, *addr);
+               return (2);
+       }
+       flash_unprotect_sectors (addr);
+       /* Disable interrupts which might cause a timeout here */
+       flag = disable_interrupts ();
+       *addr = (FPW) 0x00400040;       /* write setup */
+       *addr = data;
+
+       /* arm simple, non interrupt dependent timer */
+       reset_timer_masked ();
+
+       /* wait while polling the status register */
+       while (((status = *addr) & (FPW) 0x00800080) != (FPW) 0x00800080) {
+               if (get_timer_masked () > CFG_FLASH_WRITE_TOUT) {
+                       *addr = (FPW) 0x00FF00FF;       /* restore read mode */
+                       return (1);
+               }
+       }
+       *addr = (FPW) 0x00FF00FF;       /* restore read mode */
+       return (0);
+}
+
+void inline spin_wheel (void)
+{
+       static int p = 0;
+       static char w[] = "\\/-";
+
+       printf ("\010%c", w[p]);
+       (++p == 3) ? (p = 0) : 0;
+}
diff --git a/board/integratorcp/integratorcp.c b/board/integratorcp/integratorcp.c
new file mode 100644 (file)
index 0000000..2e62f26
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2002
+ * David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
+ *
+ * (C) Copyright 2003
+ * Texas Instruments, <www.ti.com>
+ * Kshitij Gupta <Kshitij@ti.com>
+ *
+ * (C) Copyright 2004
+ * ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ *
+ * 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>
+
+void flash__init (void);
+void ether__init (void);
+void peripheral_power_enable (void);
+
+#if defined(CONFIG_SHOW_BOOT_PROGRESS)
+void show_boot_progress(int progress)
+{
+    printf("Boot reached stage %d\n", progress);
+}
+#endif
+
+#define COMP_MODE_ENABLE ((unsigned int)0x0000EAEF)
+
+static inline void delay (unsigned long loops)
+{
+       __asm__ volatile ("1:\n"
+               "subs %0, %1, #1\n"
+               "bne 1b":"=r" (loops):"0" (loops));
+}
+
+/*
+ * Miscellaneous platform dependent initialisations
+ */
+
+int board_init (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       /* arch number of Integrator Board */
+       gd->bd->bi_arch_number = 275;
+
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = 0x00000100;
+
+       icache_enable ();
+
+       flash__init ();
+       ether__init ();
+       return 0;
+}
+
+
+int misc_init_r (void)
+{
+       setenv("verify", "n");
+       return (0);
+}
+
+/******************************
+ Routine:
+ Description:
+******************************/
+void flash__init (void)
+{
+}
+/*************************************************************
+ Routine:ether__init
+ Description: take the Ethernet controller out of reset and wait
+                          for the EEPROM load to complete.
+*************************************************************/
+void ether__init (void)
+{
+}
+
+/******************************
+ Routine:
+ Description:
+******************************/
+int dram_init (void)
+{
+       return 0;
+}
+
diff --git a/board/integratorcp/platform.S b/board/integratorcp/platform.S
new file mode 100644 (file)
index 0000000..c02051b
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Board specific setup info
+ *
+ * (C) Copyright 2003, ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ *
+ * 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 <config.h>
+#include <version.h>
+
+.globl platformsetup
+platformsetup:
+
+       /* All done by IntegratorCP's boot monitor! */
+       mov pc, lr
diff --git a/board/integratorcp/u-boot.lds b/board/integratorcp/u-boot.lds
new file mode 100644 (file)
index 0000000..da679c2
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ *
+ * 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
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x00000000;
+       . = ALIGN(4);
+       .text   :
+       {
+         cpu/arm926ejs/start.o (.text)
+         *(.text)
+       }
+       .rodata : { *(.rodata) }
+       . = ALIGN(4);
+       .data : { *(.data) }
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       __u_boot_cmd_start = .;
+       .u_boot_cmd : { *(.u_boot_cmd) }
+       __u_boot_cmd_end = .;
+
+       armboot_end_data = .;
+       . = ALIGN(4);
+       .bss : { *(.bss) }
+       armboot_end = .;
+}
diff --git a/board/versatile/Makefile b/board/versatile/Makefile
new file mode 100644 (file)
index 0000000..42b6ed5
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# (C) Copyright 2000-2004
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB    = lib$(BOARD).a
+
+OBJS   := versatile.o flash.o
+SOBJS  := platform.o
+
+$(LIB):        $(OBJS) $(SOBJS)
+       $(AR) crv $@ $^
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+.depend:       Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
+               $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
+
+-include .depend
+
+#########################################################################
diff --git a/board/versatile/config.mk b/board/versatile/config.mk
new file mode 100644 (file)
index 0000000..df67491
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# image should be loaded at 0x01000000 
+#
+
+TEXT_BASE = 0x01000000
diff --git a/board/versatile/flash.c b/board/versatile/flash.c
new file mode 100644 (file)
index 0000000..b120d63
--- /dev/null
@@ -0,0 +1,473 @@
+/*
+ * (C) Copyright 2001
+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
+ *
+ * (C) Copyright 2001-2004
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * (C) Copyright 2003
+ * Texas Instruments, <www.ti.com>
+ * Kshitij Gupta <Kshitij@ti.com>
+ *
+ * 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 <linux/byteorder/swab.h>
+
+#define PHYS_FLASH_SECT_SIZE   0x00020000      /* 256 KB sectors (x2) */
+flash_info_t flash_info[CFG_MAX_FLASH_BANKS];  /* info for FLASH chips    */
+
+/* Board support for 1 or 2 flash devices */
+#undef FLASH_PORT_WIDTH32
+#define FLASH_PORT_WIDTH16
+
+#ifdef FLASH_PORT_WIDTH16
+#define FLASH_PORT_WIDTH               ushort
+#define FLASH_PORT_WIDTHV              vu_short
+#define SWAP(x)                        __swab16(x)
+#else
+#define FLASH_PORT_WIDTH               ulong
+#define FLASH_PORT_WIDTHV              vu_long
+#define SWAP(x)                        __swab32(x)
+#endif
+
+#define FPW    FLASH_PORT_WIDTH
+#define FPWV   FLASH_PORT_WIDTHV
+
+#define mb() __asm__ __volatile__ ("" : : : "memory")
+
+
+/* Flash Organization Structure */
+typedef struct OrgDef {
+       unsigned int sector_number;
+       unsigned int sector_size;
+} OrgDef;
+
+
+/* Flash Organizations */
+OrgDef OrgIntel_28F256L18T[] = {
+       {4, 32 * 1024},                         /* 4 * 32kBytes sectors */
+       {255, 128 * 1024},                      /* 255 * 128kBytes sectors */
+};
+
+
+/*-----------------------------------------------------------------------
+ * Functions
+ */
+unsigned long flash_init (void);
+static ulong flash_get_size (FPW * addr, flash_info_t * info);
+static int write_data (flash_info_t * info, ulong dest, FPW data);
+static void flash_get_offsets (ulong base, flash_info_t * info);
+void inline spin_wheel (void);
+void flash_print_info (flash_info_t * info);
+void flash_unprotect_sectors (FPWV * addr);
+int flash_erase (flash_info_t * info, int s_first, int s_last);
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt);
+
+/*-----------------------------------------------------------------------
+ */
+
+unsigned long flash_init (void)
+{
+       int i;
+       ulong size = 0;
+       for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {
+               switch (i) {
+               case 0:
+                       flash_get_size ((FPW *) PHYS_FLASH_1, &flash_info[i]);
+                       flash_get_offsets (PHYS_FLASH_1, &flash_info[i]);
+                       break;
+               default:
+                       panic ("configured too many flash banks!\n");
+                       break;
+               }
+               size += flash_info[i].size;
+       }
+
+       /* Protect monitor and environment sectors
+        */
+       flash_protect (FLAG_PROTECT_SET,
+                       CFG_FLASH_BASE,
+                       CFG_FLASH_BASE + monitor_flash_len - 1, &flash_info[0]);
+
+       return size;
+}
+
+/*-----------------------------------------------------------------------
+ */
+static void flash_get_offsets (ulong base, flash_info_t * info)
+{
+       int i;
+       OrgDef *pOrgDef;
+
+       pOrgDef = OrgIntel_28F256L18T;
+       if (info->flash_id == FLASH_UNKNOWN) {
+               return;
+       }
+
+       if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) {
+               for (i = 0; i < info->sector_count; i++) {
+                       if (i > 255) {
+                               info->start[i] = base + (i * 0x8000);
+                               info->protect[i] = 0;
+                       } else {
+                               info->start[i] = base +
+                                               (i * PHYS_FLASH_SECT_SIZE);
+                               info->protect[i] = 0;
+                       }
+               }
+       }
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info (flash_info_t * info)
+{
+       int i;
+
+       if (info->flash_id == FLASH_UNKNOWN) {
+               printf ("missing or unknown FLASH type\n");
+               return;
+       }
+
+       switch (info->flash_id & FLASH_VENDMASK) {
+       case FLASH_MAN_INTEL:
+               printf ("INTEL ");
+               break;
+       default:
+               printf ("Unknown Vendor ");
+               break;
+       }
+
+       switch (info->flash_id & FLASH_TYPEMASK) {
+       case FLASH_28F256L18T:
+               printf ("FLASH 28F256L18T\n");
+               break;
+       default:
+               printf ("Unknown Chip Type\n");
+               break;
+       }
+
+       printf ("  Size: %ld MB in %d Sectors\n",
+                       info->size >> 20, info->sector_count);
+
+       printf ("  Sector Start Addresses:");
+       for (i = 0; i < info->sector_count; ++i) {
+               if ((i % 5) == 0)
+                       printf ("\n   ");
+               printf (" %08lX%s",
+                       info->start[i], info->protect[i] ? " (RO)" : "     ");
+       }
+       printf ("\n");
+       return;
+}
+
+/*
+ * The following code cannot be run from FLASH!
+ */
+static ulong flash_get_size (FPW * addr, flash_info_t * info)
+{
+       volatile FPW value;
+
+       /* Write auto select command: read Manufacturer ID */
+       addr[0x5555] = (FPW) 0x00AA00AA;
+       addr[0x2AAA] = (FPW) 0x00550055;
+       addr[0x5555] = (FPW) 0x00900090;
+
+       mb ();
+       value = addr[0];
+
+       switch (value) {
+
+       case (FPW) INTEL_MANUFACT:
+               info->flash_id = FLASH_MAN_INTEL;
+               break;
+
+       default:
+               info->flash_id = FLASH_UNKNOWN;
+               info->sector_count = 0;
+               info->size = 0;
+               addr[0] = (FPW) 0x00FF00FF;     /* restore read mode */
+               return (0);             /* no or unknown flash  */
+       }
+
+       mb ();
+       value = addr[1];        /* device ID        */
+       switch (value) {
+
+       case (FPW) (INTEL_ID_28F256L18T):
+               info->flash_id += FLASH_28F256L18T;
+               info->sector_count = 259;
+               info->size = 0x02000000;
+               break;                  /* => 32 MB     */
+
+       default:
+               info->flash_id = FLASH_UNKNOWN;
+               break;
+       }
+
+       if (info->sector_count > CFG_MAX_FLASH_SECT) {
+               printf ("** ERROR: sector count %d > max (%d) **\n",
+                               info->sector_count, CFG_MAX_FLASH_SECT);
+               info->sector_count = CFG_MAX_FLASH_SECT;
+       }
+
+       addr[0] = (FPW) 0x00FF00FF;     /* restore read mode */
+
+       return (info->size);
+}
+
+
+/* unprotects a sector for write and erase
+ * on some intel parts, this unprotects the entire chip, but it
+ * wont hurt to call this additional times per sector...
+ */
+void flash_unprotect_sectors (FPWV * addr)
+{
+#define PD_FINTEL_WSMS_READY_MASK    0x0080
+
+       *addr = (FPW) 0x00500050;       /* clear status register */
+
+       /* this sends the clear lock bit command */
+       *addr = (FPW) 0x00600060;
+       *addr = (FPW) 0x00D000D0;
+}
+
+
+/*-----------------------------------------------------------------------
+ */
+
+int flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+       int flag, prot, sect;
+       ulong type, start, last;
+       int rcode = 0;
+
+       if ((s_first < 0) || (s_first > s_last)) {
+               if (info->flash_id == FLASH_UNKNOWN) {
+                       printf ("- missing\n");
+               } else {
+                       printf ("- no sectors to erase\n");
+               }
+               return 1;
+       }
+
+       type = (info->flash_id & FLASH_VENDMASK);
+       if ((type != FLASH_MAN_INTEL)) {
+               printf ("Can't erase unknown flash type %08lx - aborted\n",
+                               info->flash_id);
+               return 1;
+       }
+
+       prot = 0;
+       for (sect = s_first; sect <= s_last; ++sect) {
+               if (info->protect[sect]) {
+                       prot++;
+               }
+       }
+
+       if (prot) {
+               printf ("- Warning: %d protected sectors will not be erased!\n",
+                               prot);
+       } else {
+               printf ("\n");
+       }
+
+
+       start = get_timer (0);
+       last = start;
+
+       /* Disable interrupts which might cause a timeout here */
+       flag = disable_interrupts ();
+
+       /* Start erase on unprotected sectors */
+       for (sect = s_first; sect <= s_last; sect++) {
+               if (info->protect[sect] == 0) { /* not protected */
+                       FPWV *addr = (FPWV *) (info->start[sect]);
+                       FPW status;
+
+                       printf ("Erasing sector %2d ... ", sect);
+
+                       flash_unprotect_sectors (addr);
+
+                       /* arm simple, non interrupt dependent timer */
+                       reset_timer_masked ();
+
+                       *addr = (FPW) 0x00500050;/* clear status register */
+                       *addr = (FPW) 0x00200020;/* erase setup */
+                       *addr = (FPW) 0x00D000D0;/* erase confirm */
+
+                       while (((status =
+                               *addr) & (FPW) 0x00800080) !=
+                               (FPW) 0x00800080) {
+                                       if (get_timer_masked () >
+                                       CFG_FLASH_ERASE_TOUT) {
+                                       printf ("Timeout\n");
+                                       /* suspend erase     */
+                                       *addr = (FPW) 0x00B000B0;
+                                       /* reset to read mode */
+                                       *addr = (FPW) 0x00FF00FF;
+                                       rcode = 1;
+                                       break;
+                               }
+                       }
+
+                       /* clear status register cmd.   */
+                       *addr = (FPW) 0x00500050;
+                       *addr = (FPW) 0x00FF00FF;/* resest to read mode */
+                       printf (" done\n");
+               }
+       }
+       return rcode;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ * 4 - Flash not identified
+ */
+
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+       ulong cp, wp;
+       FPW data;
+       int count, i, l, rc, port_width;
+
+       if (info->flash_id == FLASH_UNKNOWN) {
+               return 4;
+       }
+/* get lower word aligned address */
+#ifdef FLASH_PORT_WIDTH16
+       wp = (addr & ~1);
+       port_width = 2;
+#else
+       wp = (addr & ~3);
+       port_width = 4;
+#endif
+
+       /*
+        * handle unaligned start bytes
+        */
+       if ((l = addr - wp) != 0) {
+               data = 0;
+               for (i = 0, cp = wp; i < l; ++i, ++cp) {
+                       data = (data << 8) | (*(uchar *) cp);
+               }
+               for (; i < port_width && cnt > 0; ++i) {
+                       data = (data << 8) | *src++;
+                       --cnt;
+                       ++cp;
+               }
+               for (; cnt == 0 && i < port_width; ++i, ++cp) {
+                       data = (data << 8) | (*(uchar *) cp);
+               }
+
+               if ((rc = write_data (info, wp, SWAP (data))) != 0) {
+                       return (rc);
+               }
+               wp += port_width;
+       }
+
+       /*
+        * handle word aligned part
+        */
+       count = 0;
+       while (cnt >= port_width) {
+               data = 0;
+               for (i = 0; i < port_width; ++i) {
+                       data = (data << 8) | *src++;
+               }
+               if ((rc = write_data (info, wp, SWAP (data))) != 0) {
+                       return (rc);
+               }
+               wp += port_width;
+               cnt -= port_width;
+               if (count++ > 0x800) {
+                       spin_wheel ();
+                       count = 0;
+               }
+       }
+
+       if (cnt == 0) {
+               return (0);
+       }
+
+       /*
+        * handle unaligned tail bytes
+        */
+       data = 0;
+       for (i = 0, cp = wp; i < port_width && cnt > 0; ++i, ++cp) {
+               data = (data << 8) | *src++;
+               --cnt;
+       }
+       for (; i < port_width; ++i, ++cp) {
+               data = (data << 8) | (*(uchar *) cp);
+       }
+
+       return (write_data (info, wp, SWAP (data)));
+}
+
+/*-----------------------------------------------------------------------
+ * Write a word or halfword to Flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ */
+static int write_data (flash_info_t * info, ulong dest, FPW data)
+{
+       FPWV *addr = (FPWV *) dest;
+       ulong status;
+       int flag;
+
+       /* Check if Flash is (sufficiently) erased */
+       if ((*addr & data) != data) {
+               printf ("not erased at %08lx (%x)\n", (ulong) addr, *addr);
+               return (2);
+       }
+       flash_unprotect_sectors (addr);
+       /* Disable interrupts which might cause a timeout here */
+       flag = disable_interrupts ();
+       *addr = (FPW) 0x00400040;       /* write setup */
+       *addr = data;
+
+       /* arm simple, non interrupt dependent timer */
+       reset_timer_masked ();
+
+       /* wait while polling the status register */
+       while (((status = *addr) & (FPW) 0x00800080) != (FPW) 0x00800080) {
+               if (get_timer_masked () > CFG_FLASH_WRITE_TOUT) {
+                       *addr = (FPW) 0x00FF00FF;       /* restore read mode */
+                       return (1);
+               }
+       }
+       *addr = (FPW) 0x00FF00FF;       /* restore read mode */
+       return (0);
+}
+
+void inline spin_wheel (void)
+{
+       static int p = 0;
+       static char w[] = "\\/-";
+
+       printf ("\010%c", w[p]);
+       (++p == 3) ? (p = 0) : 0;
+}
diff --git a/board/versatile/platform.S b/board/versatile/platform.S
new file mode 100644 (file)
index 0000000..68c3e8b
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Board specific setup info
+ *
+ * (C) Copyright 2003, ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ *
+ * 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 <config.h>
+#include <version.h>
+
+.globl platformsetup
+platformsetup:
+
+       /* All done by Versatile's boot monitor! */
+       mov pc, lr
diff --git a/board/versatile/u-boot.lds b/board/versatile/u-boot.lds
new file mode 100644 (file)
index 0000000..da679c2
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ *
+ * 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
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x00000000;
+       . = ALIGN(4);
+       .text   :
+       {
+         cpu/arm926ejs/start.o (.text)
+         *(.text)
+       }
+       .rodata : { *(.rodata) }
+       . = ALIGN(4);
+       .data : { *(.data) }
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       __u_boot_cmd_start = .;
+       .u_boot_cmd : { *(.u_boot_cmd) }
+       __u_boot_cmd_end = .;
+
+       armboot_end_data = .;
+       . = ALIGN(4);
+       .bss : { *(.bss) }
+       armboot_end = .;
+}
diff --git a/board/versatile/versatile.c b/board/versatile/versatile.c
new file mode 100644 (file)
index 0000000..ead3088
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2002
+ * David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
+ *
+ * (C) Copyright 2003
+ * Texas Instruments, <www.ti.com>
+ * Kshitij Gupta <Kshitij@ti.com>
+ *
+ * (C) Copyright 2004
+ * ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ *
+ * 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>
+
+void flash__init (void);
+void ether__init (void);
+void peripheral_power_enable (void);
+
+#if defined(CONFIG_SHOW_BOOT_PROGRESS)
+void show_boot_progress(int progress)
+{
+    printf("Boot reached stage %d\n", progress);
+}
+#endif
+
+#define COMP_MODE_ENABLE ((unsigned int)0x0000EAEF)
+
+static inline void delay (unsigned long loops)
+{
+       __asm__ volatile ("1:\n"
+               "subs %0, %1, #1\n"
+               "bne 1b":"=r" (loops):"0" (loops));
+}
+
+/*
+ * Miscellaneous platform dependent initialisations
+ */
+
+int board_init (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+
+       /*
+        * set clock frequency:
+        *      VERSATILE_REFCLK is 32KHz
+        *      VERSATILE_TIMCLK is 1MHz
+        */
+       *(volatile unsigned int *)(VERSATILE_SCTL_BASE) |=
+         ((VERSATILE_TIMCLK << VERSATILE_TIMER1_EnSel) | (VERSATILE_TIMCLK << VERSATILE_TIMER2_EnSel) |
+          (VERSATILE_TIMCLK << VERSATILE_TIMER3_EnSel) | (VERSATILE_TIMCLK << VERSATILE_TIMER4_EnSel));
+
+       /* arch number of Versatile Board */
+       gd->bd->bi_arch_number = 387;
+
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = 0x00000100;
+
+       icache_enable ();
+
+       flash__init ();
+       ether__init ();
+       return 0;
+}
+
+
+int misc_init_r (void)
+{
+       setenv("verify", "n");
+       return (0);
+}
+
+/******************************
+ Routine:
+ Description:
+******************************/
+void flash__init (void)
+{
+}
+/*************************************************************
+ Routine:ether__init
+ Description: take the Ethernet controller out of reset and wait
+                          for the EEPROM load to complete.
+*************************************************************/
+void ether__init (void)
+{
+}
+
+/******************************
+ Routine:
+ Description:
+******************************/
+int dram_init (void)
+{
+       return 0;
+}
+
index 616793380f9cf3786103e24631176e73c904f4eb..10841fd0a13c3bfc9540602977becbb9731db51f 100644 (file)
  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
  * Alex Zuepke <azu@sysgo.de>
  *
- * (C) Copyright 2002
+ * (C) Copyright 2002-2004
  * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
  *
+ * (C) Copyright 2004
+ * Philippe Robin, ARM Ltd. <philippe.robin@arm.com>
+ *
  * See file CREDITS for list of people who contributed to this
  * project.
  *
@@ -41,7 +44,15 @@ extern void reset_cpu(ulong addr);
 #define TIMER_LOAD_VAL 0xffffffff
 
 /* macro to read the 32 bit timer */
+#ifdef CONFIG_OMAP
 #define READ_TIMER (*(volatile ulong *)(CFG_TIMERBASE+8))
+#endif
+#ifdef CONFIG_INTEGRATOR
+#define READ_TIMER (*(volatile ulong *)(CFG_TIMERBASE+4))
+#endif
+#ifdef CONFIG_VERSATILE
+#define READ_TIMER (*(volatile ulong *)(CFG_TIMERBASE+4))
+#endif
 
 #ifdef CONFIG_USE_IRQ
 /* enable IRQ interrupts */
@@ -182,12 +193,26 @@ static ulong lastdec;
 /* nothing really to do with interrupts, just starts up a counter. */
 int interrupt_init (void)
 {
+#ifdef CONFIG_OMAP
        int32_t val;
 
        /* Start the decrementer ticking down from 0xffffffff */
        *((int32_t *) (CFG_TIMERBASE + LOAD_TIM)) = TIMER_LOAD_VAL;
        val = MPUTIM_ST | MPUTIM_AR | MPUTIM_CLOCK_ENABLE | (CFG_PVT << MPUTIM_PTV_BIT);
        *((int32_t *) (CFG_TIMERBASE + CNTL_TIMER)) = val;
+#endif /* CONFIG_OMAP */
+#ifdef CONFIG_INTEGRATOR
+       /* Load timer with initial value */
+       *(volatile ulong *)(CFG_TIMERBASE + 0) = TIMER_LOAD_VAL;
+       /* Set timer to be enabled, free-running, no interrupts, 256 divider */
+       *(volatile ulong *)(CFG_TIMERBASE + 8) = 0x8C;
+#endif /* CONFIG_INTEGRATOR */
+#ifdef CONFIG_VERSATILE
+       *(volatile ulong *)(CFG_TIMERBASE + 0) = CFG_TIMER_RELOAD;      /* TimerLoad */
+       *(volatile ulong *)(CFG_TIMERBASE + 4) = CFG_TIMER_RELOAD;      /* TimerValue */
+       *(volatile ulong *)(CFG_TIMERBASE + 8) = 0x8C;
+       /* *(volatile ulong *)(CFG_TIMERBASE + 8) = CFG_TIMER_CTRL | 0x40;  Periodic */
+#endif /* CONFIG_VERSATILE */
 
        /* init the timestamp and lastdec value */
        reset_timer_masked();
index 32a6a0607e642b560173f4fa0b9e3745ada04ea4..33b9ab4b7cdfd771497c3972bd2035ad21acad7a 100644 (file)
@@ -38,7 +38,8 @@ OBJS  = 3c589.o 5701rls.o ali512x.o \
          pcnet.o plb2800_eth.o \
          ps2ser.o ps2mult.o pc_keyb.o keyboard.o \
          rtl8019.o rtl8139.o \
-         s3c24x0_i2c.o sed13806.o serial.o serial_max3100.o \
+         s3c24x0_i2c.o sed13806.o \
+         serial.o serial_max3100.o serial_pl011.o serial_pl010.o \
          smc91111.o smiLynxEM.o status_led.o sym53c8xx.o \
          ti_pci1410a.o tigon3.o w83c553f.o omap1510_i2c.o \
          usbdcore.o usbdcore_ep0.o usbdcore_omap1510.o usbtty.o
diff --git a/drivers/serial_pl010.c b/drivers/serial_pl010.c
new file mode 100644 (file)
index 0000000..01b5f0a
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * (C) Copyright 2000
+ * Rob Taylor, Flying Pig Systems. robt@flyingpig.com.
+ *
+ * (C) Copyright 2004
+ * ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ *
+ * 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
+ */
+
+/* Simple U-Boot driver for the PrimeCell PL011 UARTs on the IntegratorCP */
+/* Should be fairly simple to make it work with the PL010 as well */
+
+#include <common.h>
+
+#ifdef CFG_PL010_SERIAL
+
+#include "serial_pl011.h"
+
+#define IO_WRITE(addr, val) (*(volatile unsigned int *)(addr) = (val))
+#define IO_READ(addr) (*(volatile unsigned int *)(addr))
+
+/* Integrator AP has two UARTs, we use the first one, at 38400-8-N-1 */
+#define NUM_PORTS 2
+#define CONSOLE_PORT CONFIG_CONS_INDEX
+#define baudRate CONFIG_BAUDRATE
+static volatile unsigned char * const port[NUM_PORTS] = {(void*)(CFG_SERIAL0),
+                                                         (void*)(CFG_SERIAL1)};
+
+
+static void pl010_putc(int portnum, char c);
+static int pl010_getc(int portnum);
+static int pl010_tstc(int portnum);
+
+
+int serial_init (void)
+{
+    unsigned int temp;
+    unsigned int divisor;
+
+    /*
+    ** First, disable everything.
+    */
+    IO_WRITE(port[CONSOLE_PORT] + UART_PL010_CR, 0x0);
+
+    /*
+    ** Set baud rate
+    **
+    */
+    switch (baudRate) {
+    case 9600:
+      divisor = UART_PL010_BAUD_9600;
+      break;
+
+    case 19200:
+      divisor = UART_PL010_BAUD_9600;
+      break;
+
+    case 38400:
+      divisor = UART_PL010_BAUD_38400;
+      break;
+
+    case 57600:
+      divisor = UART_PL010_BAUD_57600;
+      break;
+
+    case 115200:
+      divisor = UART_PL010_BAUD_115200;
+      break;
+
+    default:
+      divisor = UART_PL010_BAUD_38400;
+    }
+    IO_WRITE(port[CONSOLE_PORT] + UART_PL010_LCRM, ((divisor & 0xf00) >> 8));
+    IO_WRITE(port[CONSOLE_PORT] + UART_PL010_LCRL, (divisor & 0xff));
+
+    /*
+    ** Set the UART to be 8 bits, 1 stop bit, no parity, fifo enabled.
+    */
+    IO_WRITE(port[CONSOLE_PORT] + UART_PL010_LCRH,
+        (UART_PL010_LCRH_WLEN_8 | UART_PL010_LCRH_FEN));
+
+    /*
+    ** Finally, enable the UART
+    */
+    IO_WRITE(port[CONSOLE_PORT] + UART_PL010_CR, (UART_PL010_CR_UARTEN));
+
+    return (0);
+}
+
+void
+serial_putc(const char c)
+{
+       if (c == '\n')
+               pl010_putc(CONSOLE_PORT, '\r');
+
+       pl010_putc(CONSOLE_PORT, c);
+}
+
+void
+serial_puts (const char *s)
+{
+       while (*s) {
+               serial_putc (*s++);
+       }
+}
+
+int
+serial_getc(void)
+{
+       return pl010_getc(CONSOLE_PORT);
+}
+
+int
+serial_tstc(void)
+{
+       return pl010_tstc(CONSOLE_PORT);
+}
+
+void
+serial_setbrg (void)
+{
+}
+
+static void pl010_putc(int portnum, char c)
+{
+    /* Wait until there is space in the FIFO */
+    while (IO_READ(port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_TXFF);
+    
+    /* Send the character */
+    IO_WRITE(port[portnum] + UART_PL01x_DR, c);
+}
+
+static int pl010_getc(int portnum)
+{
+    unsigned int data;
+
+    /* Wait until there is data in the FIFO */
+    while (IO_READ(port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_RXFE);
+    
+    data = IO_READ(port[portnum] + UART_PL01x_DR);
+    
+    /* Check for an error flag */
+    if (data & 0xFFFFFF00)
+    {
+        /* Clear the error */
+        IO_WRITE(port[portnum] + UART_PL01x_ECR, 0xFFFFFFFF);
+        return -1;
+    }
+    
+    return (int)data;
+}
+
+static int pl010_tstc(int portnum)
+{
+    return !(IO_READ(port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_RXFE);
+}
+
+#endif
diff --git a/drivers/serial_pl011.c b/drivers/serial_pl011.c
new file mode 100644 (file)
index 0000000..60fcc91
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * (C) Copyright 2000
+ * Rob Taylor, Flying Pig Systems. robt@flyingpig.com.
+ *
+ * (C) Copyright 2004
+ * ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ *
+ * 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
+ */
+
+/* Simple U-Boot driver for the PrimeCell PL011 UARTs on the IntegratorCP */
+/* Should be fairly simple to make it work with the PL010 as well */
+
+#include <common.h>
+
+#ifdef CFG_PL011_SERIAL
+
+#include "serial_pl011.h"
+
+#define IO_WRITE(addr, val) (*(volatile unsigned int *)(addr) = (val))
+#define IO_READ(addr) (*(volatile unsigned int *)(addr))
+
+/*
+ * IntegratorCP has two UARTs, use the first one, at 38400-8-N-1 
+ * Versatile PB has four UARTs.
+ */
+#define NUM_PORTS 2
+#define CONSOLE_PORT CONFIG_CONS_INDEX
+#define baudRate CONFIG_BAUDRATE
+static volatile unsigned char * const port[NUM_PORTS] = {(void*)(CFG_SERIAL0),
+                                                         (void*)(CFG_SERIAL1)};
+
+
+static void pl011_putc(int portnum, char c);
+static int pl011_getc(int portnum);
+static int pl011_tstc(int portnum);
+
+
+int serial_init (void)
+{
+    unsigned int temp;
+    unsigned int divider;
+    unsigned int remainder;
+    unsigned int fraction;
+
+    /*
+    ** First, disable everything.
+    */
+    IO_WRITE(port[CONSOLE_PORT] + UART_PL011_CR, 0x0);
+
+    /*
+    ** Set baud rate
+    **
+    ** IBRD = UART_CLK / (16 * BAUD_RATE)
+    ** FBRD = ROUND((64 * MOD(UART_CLK,(16 * BAUD_RATE))) / (16 * BAUD_RATE))
+    */
+#ifdef CONFIG_VERSATILE
+    temp      = 16 * baudRate;
+    divider   = 24000000 / temp;
+    remainder = 24000000 % temp;
+    temp      = (8 * remainder) / baudRate;
+    fraction  = (temp >> 1) + (temp & 1);
+#endif
+#ifdef CONFIG_INTEGRATOR
+    temp      = 16 * baudRate;
+    divider   = 14745600 / temp;
+    remainder = 14745600 % temp;
+    temp      = (8 * remainder) / baudRate;
+    fraction  = (temp >> 1) + (temp & 1);
+#endif
+    IO_WRITE(port[CONSOLE_PORT] + UART_PL011_IBRD, divider);
+    IO_WRITE(port[CONSOLE_PORT] + UART_PL011_FBRD, fraction);
+
+    /*
+    ** Set the UART to be 8 bits, 1 stop bit, no parity, fifo enabled.
+    */
+    IO_WRITE(port[CONSOLE_PORT] + UART_PL011_LCRH,
+        (UART_PL011_LCRH_WLEN_8 | UART_PL011_LCRH_FEN));
+
+    /*
+    ** Finally, enable the UART
+    */
+    IO_WRITE(port[CONSOLE_PORT] + UART_PL011_CR,
+        (UART_PL011_CR_UARTEN | UART_PL011_CR_TXE | UART_PL011_CR_RXE));
+
+    return (0);
+}
+
+void
+serial_putc(const char c)
+{
+       if (c == '\n')
+               pl011_putc(CONSOLE_PORT, '\r');
+
+       pl011_putc(CONSOLE_PORT, c);
+}
+
+void
+serial_puts (const char *s)
+{
+       while (*s) {
+               serial_putc (*s++);
+       }
+}
+
+int
+serial_getc(void)
+{
+       return pl011_getc(CONSOLE_PORT);
+}
+
+int
+serial_tstc(void)
+{
+       return pl011_tstc(CONSOLE_PORT);
+}
+
+void
+serial_setbrg (void)
+{
+}
+
+static void pl011_putc(int portnum, char c)
+{
+    /* Wait until there is space in the FIFO */
+    while (IO_READ(port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_TXFF);
+    
+    /* Send the character */
+    IO_WRITE(port[portnum] + UART_PL01x_DR, c);
+}
+
+static int pl011_getc(int portnum)
+{
+    unsigned int data;
+
+    /* Wait until there is data in the FIFO */
+    while (IO_READ(port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_RXFE);
+    
+    data = IO_READ(port[portnum] + UART_PL01x_DR);
+    
+    /* Check for an error flag */
+    if (data & 0xFFFFFF00)
+    {
+        /* Clear the error */
+        IO_WRITE(port[portnum] + UART_PL01x_ECR, 0xFFFFFFFF);
+        return -1;
+    }
+    
+    return (int)data;
+}
+
+static int pl011_tstc(int portnum)
+{
+    return !(IO_READ(port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_RXFE);
+}
+
+#endif
diff --git a/drivers/serial_pl011.h b/drivers/serial_pl011.h
new file mode 100644 (file)
index 0000000..2117848
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * (C) Copyright 2003, 2004
+ * ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ *
+ * 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
+ */
+
+/*
+ * ARM PrimeCell UART's (PL010 & PL011) 
+ * ------------------------------------
+ *  
+ *  Definitions common to both PL010 & PL011
+ * 
+ */
+#define UART_PL01x_DR                   0x00    /*  Data read or written from the interface. */
+#define UART_PL01x_RSR                  0x04    /*  Receive status register (Read). */
+#define UART_PL01x_ECR                  0x04    /*  Error clear register (Write). */
+#define UART_PL01x_FR                   0x18    /*  Flag register (Read only). */
+
+#define UART_PL01x_RSR_OE               0x08
+#define UART_PL01x_RSR_BE               0x04
+#define UART_PL01x_RSR_PE               0x02
+#define UART_PL01x_RSR_FE               0x01
+
+#define UART_PL01x_FR_TXFE              0x80
+#define UART_PL01x_FR_RXFF              0x40
+#define UART_PL01x_FR_TXFF              0x20
+#define UART_PL01x_FR_RXFE              0x10
+#define UART_PL01x_FR_BUSY              0x08
+#define UART_PL01x_FR_TMSK              (UART_PL01x_FR_TXFF + UART_PL01x_FR_BUSY)
+
+/* 
+ *  PL010 definitions
+ * 
+ */
+#define UART_PL010_LCRH                 0x08    /*  Line control register, high byte. */
+#define UART_PL010_LCRM                 0x0C    /*  Line control register, middle byte. */
+#define UART_PL010_LCRL                 0x10    /*  Line control register, low byte. */
+#define UART_PL010_CR                   0x14    /*  Control register. */
+#define UART_PL010_IIR                  0x1C    /*  Interrupt indentification register (Read). */
+#define UART_PL010_ICR                  0x1C    /*  Interrupt clear register (Write). */
+#define UART_PL010_ILPR                 0x20    /*  IrDA low power counter register. */
+#define UART_PL010_CR_LPE               (1 << 7)
+#define UART_PL010_CR_RTIE              (1 << 6)
+#define UART_PL010_CR_TIE               (1 << 5)
+#define UART_PL010_CR_RIE               (1 << 4)
+#define UART_PL010_CR_MSIE              (1 << 3)
+#define UART_PL010_CR_IIRLP             (1 << 2)
+#define UART_PL010_CR_SIREN             (1 << 1)
+#define UART_PL010_CR_UARTEN            (1 << 0)
+#define UART_PL010_LCRH_WLEN_8          (3 << 5)
+#define UART_PL010_LCRH_WLEN_7          (2 << 5)
+#define UART_PL010_LCRH_WLEN_6          (1 << 5)
+#define UART_PL010_LCRH_WLEN_5          (0 << 5)
+#define UART_PL010_LCRH_FEN             (1 << 4)
+#define UART_PL010_LCRH_STP2            (1 << 3)
+#define UART_PL010_LCRH_EPS             (1 << 2)
+#define UART_PL010_LCRH_PEN             (1 << 1)
+#define UART_PL010_LCRH_BRK             (1 << 0)
+
+
+#define UART_PL010_BAUD_460800            1
+#define UART_PL010_BAUD_230400            3
+#define UART_PL010_BAUD_115200            7
+#define UART_PL010_BAUD_57600             15
+#define UART_PL010_BAUD_38400             23
+#define UART_PL010_BAUD_19200             47
+#define UART_PL010_BAUD_14400             63
+#define UART_PL010_BAUD_9600              95
+#define UART_PL010_BAUD_4800              191
+#define UART_PL010_BAUD_2400              383
+#define UART_PL010_BAUD_1200              767
+/* 
+ *  PL011 definitions
+ * 
+ */
+#define UART_PL011_IBRD                 0x24
+#define UART_PL011_FBRD                 0x28
+#define UART_PL011_LCRH                 0x2C
+#define UART_PL011_CR                   0x30
+#define UART_PL011_IMSC                 0x38
+#define UART_PL011_PERIPH_ID0           0xFE0
+#define UART_PL011_LCRH_SPS             (1 << 7)
+#define UART_PL011_LCRH_WLEN_8          (3 << 5)
+#define UART_PL011_LCRH_WLEN_7          (2 << 5)
+#define UART_PL011_LCRH_WLEN_6          (1 << 5)
+#define UART_PL011_LCRH_WLEN_5          (0 << 5)
+#define UART_PL011_LCRH_FEN             (1 << 4)
+#define UART_PL011_LCRH_STP2            (1 << 3)
+#define UART_PL011_LCRH_EPS             (1 << 2)
+#define UART_PL011_LCRH_PEN             (1 << 1)
+#define UART_PL011_LCRH_BRK             (1 << 0)
+
+#define UART_PL011_CR_CTSEN             (1 << 15)
+#define UART_PL011_CR_RTSEN             (1 << 14)
+#define UART_PL011_CR_OUT2              (1 << 13)
+#define UART_PL011_CR_OUT1              (1 << 12)
+#define UART_PL011_CR_RTS               (1 << 11)
+#define UART_PL011_CR_DTR               (1 << 10)
+#define UART_PL011_CR_RXE               (1 << 9)
+#define UART_PL011_CR_TXE               (1 << 8)
+#define UART_PL011_CR_LPE               (1 << 7)
+#define UART_PL011_CR_IIRLP             (1 << 2)
+#define UART_PL011_CR_SIREN             (1 << 1)
+#define UART_PL011_CR_UARTEN            (1 << 0)
+
+#define UART_PL011_IMSC_OEIM            (1 << 10)
+#define UART_PL011_IMSC_BEIM            (1 << 9)
+#define UART_PL011_IMSC_PEIM            (1 << 8)
+#define UART_PL011_IMSC_FEIM            (1 << 7)
+#define UART_PL011_IMSC_RTIM            (1 << 6)
+#define UART_PL011_IMSC_TXIM            (1 << 5)
+#define UART_PL011_IMSC_RXIM            (1 << 4)
+#define UART_PL011_IMSC_DSRMIM          (1 << 3)
+#define UART_PL011_IMSC_DCDMIM          (1 << 2)
+#define UART_PL011_IMSC_CTSMIM          (1 << 1)
+#define UART_PL011_IMSC_RIMIM           (1 << 0)
index 6c3a0b753c0a6a7741b0766299fcbce8dd98a6e9..486c11cd09d648b6669059efb16cd49dfccba64f 100644 (file)
@@ -1313,7 +1313,6 @@ static void smc_phy_configure ()
 #if SMC_DEBUG > 2
 static void print_packet( byte * buf, int length )
 {
-#if 0
        int i;
        int remainder;
        int lines;
@@ -1345,7 +1344,6 @@ static void print_packet( byte * buf, int length )
        }
        printf("\n");
 #endif
-#endif
 }
 #endif
 
@@ -1423,28 +1421,26 @@ int smc_get_ethaddr (bd_t * bd)
        }
        memcpy (bd->bi_enetaddr, v_mac, 6);     /* update global address to match env (allows env changing) */
        smc_set_mac_addr (v_mac);       /* use old function to update smc default */
+       PRINTK("Using MAC Address %02X:%02X:%02X:%02X:%02X:%02X\n", v_mac[0], v_mac[1],
+                v_mac[2], v_mac[3], v_mac[4], v_mac[5]);
        return (0);
 }
 
 int get_rom_mac (char *v_rom_mac)
 {
-       int is_rom_present = 0;
-
 #ifdef HARDCODE_MAC    /* used for testing or to supress run time warnings */
        char hw_mac_addr[] = { 0x02, 0x80, 0xad, 0x20, 0x31, 0xb8 };
 
        memcpy (v_rom_mac, hw_mac_addr, 6);
        return (1);
 #else
-       if (is_rom_present) {
-               /* if eeprom contents are valid
-                *   extract mac address into hw_mac_addr, 8 or 16 bit accesses
-                *   memcpy (v_rom_mac, hc_mac_addr, 6);
-                *   return(1);
-                */
+       int i;
+       SMC_SELECT_BANK (1);
+       for (i=0; i<6; i++)
+       {
+               v_rom_mac[i] = SMC_inb (ADDR0_REG + i);
        }
-       memset (v_rom_mac, 0, 6);
-       return (0);
+       return (1);
 #endif
 }
 #endif /* CONFIG_DRIVER_SMC91111 */
diff --git a/include/configs/integratorap.h b/include/configs/integratorap.h
new file mode 100644 (file)
index 0000000..e6b5941
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+ * (C) Copyright 2003
+ * Texas Instruments.
+ * Kshitij Gupta <kshitij@ti.com>
+ * Configuation settings for the TI OMAP Innovator board.
+ *
+ * (C) Copyright 2004
+ * ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ * Configuration for Integrator AP board.
+ *.
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+#define CONFIG_ARM926EJS       1       /* This is an arm926ejs CPU core  */
+#define CONFIG_INTEGRATOR      1       /* in an Integrator board       */
+#define CONFIG_ARCH_CINTEGRATOR 1      /* Specifically, a CP           */
+
+
+#define CFG_MEMTEST_START   0x100000
+#define CFG_MEMTEST_END   0x10000000
+#define CFG_HZ (1000000 / 256)         /* Timer 1 is clocked at 1Mhz, with 256 divider */
+#define CFG_TIMERBASE 0x13000100
+
+#define CONFIG_CMDLINE_TAG     1       /* enable passing of ATAGs  */
+#define CONFIG_SETUP_MEMORY_TAGS       1
+#define CONFIG_MISC_INIT_R     1       /* call misc_init_r during start up */
+/*
+ * Size of malloc() pool
+ */
+#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024)
+
+/*
+ * PL010 Configuration
+ */
+#define CFG_PL010_SERIAL
+#define CONFIG_CONS_INDEX      0
+#define CONFIG_BAUDRATE         38400
+#define CFG_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
+#define CFG_SERIAL0            0x16000000
+#define CFG_SERIAL1            0x17000000
+
+//#define CONFIG_COMMANDS      (CFG_CMD_DHCP | CFG_CMD_IMI | CFG_CMD_NET | CFG_CMD_PING | CFG_CMD_BDI | CFG_CMD_PCI)
+//#define CONFIG_NET_MULTI
+//#define CONFIG_BOOTP_MASK       CONFIG_BOOTP_DEFAULT
+
+#define CONFIG_COMMANDS        (CFG_CMD_IMI | CFG_CMD_BDI | CFG_CMD_MEMORY)
+
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#define CONFIG_BOOTDELAY        2
+#define CONFIG_BOOTARGS         "root=/dev/mtdblock0 mem=32M console=ttyAM0 console=tty" 
+#define CONFIG_BOOTCOMMAND      ""
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP   /* undef to save memory     */
+#define CFG_PROMPT     "Integrator-AP # "      /* Monitor Command Prompt   */
+#define CFG_CBSIZE     256             /* Console I/O Buffer Size  */
+/* Print Buffer Size */
+#define CFG_PBSIZE     (CFG_CBSIZE+sizeof(CFG_PROMPT)+16)
+#define CFG_MAXARGS    16              /* max number of command args   */
+#define CFG_BARGSIZE   CFG_CBSIZE      /* Boot Argument Buffer Size    */
+
+#undef CFG_CLKS_IN_HZ          /* everything, incl board info, in Hz */
+#define CFG_LOAD_ADDR  0x7fc0  /* default load address */
+
+/*-----------------------------------------------------------------------
+ * Stack sizes
+ *
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE       (128*1024)      /* regular stack */
+#ifdef CONFIG_USE_IRQ
+#define CONFIG_STACKSIZE_IRQ   (4*1024)        /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ   (4*1024)        /* FIQ stack */
+#endif
+
+/*-----------------------------------------------------------------------
+ * Physical Memory Map
+ */
+#define CONFIG_NR_DRAM_BANKS    1      /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1            0x00000000     /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE      0x02000000      /* 32 MB */
+
+#define CFG_FLASH_BASE          0x24000000
+
+/*-----------------------------------------------------------------------
+ * FLASH and environment organization
+ */
+#define CFG_ENV_IS_NOWHERE
+#define CFG_MAX_FLASH_BANKS    1               /* max number of memory banks */
+#define PHYS_FLASH_SIZE                0x01000000      /* 16MB */
+/* timeout values are in ticks */
+#define CFG_FLASH_ERASE_TOUT   (20*CFG_HZ)     /* Timeout for Flash Erase */
+#define CFG_FLASH_WRITE_TOUT   (20*CFG_HZ)     /* Timeout for Flash Write */
+#define CFG_MAX_FLASH_SECT     128
+#define CFG_ENV_SIZE           32768
+
+#define PHYS_FLASH_1           (CFG_FLASH_BASE)
+
+/*-----------------------------------------------------------------------
+ * PCI definitions
+ */
+
+//#define CONFIG_PCI                   /* include pci support                  */
+#undef CONFIG_PCI_PNP
+#define CONFIG_PCI_SCAN_SHOW    1       /* show pci devices on startup  */
+#define DEBUG
+
+#define CONFIG_EEPRO100
+#define CFG_RX_ETH_BUFFER      8       /* use 8 rx buffer on eepro100  */
+
+
+#define INTEGRATOR_BOOT_ROM_BASE       0x20000000
+#define INTEGRATOR_HDR0_SDRAM_BASE      0x80000000
+
+// PCI Base area
+#define INTEGRATOR_PCI_BASE            0x40000000
+#define INTEGRATOR_PCI_SIZE            0x3FFFFFFF
+
+// memory map as seen by the CPU on the local bus
+#define CPU_PCI_IO_ADRS                0x60000000      // PCI I/O space base
+#define CPU_PCI_IO_SIZE                0x10000 
+
+#define CPU_PCI_CNFG_ADRS      0x61000000      // PCI config space
+#define CPU_PCI_CNFG_SIZE      0x1000000
+
+#define PCI_MEM_BASE            0x40000000   // 512M to xxx
+//  unused 256M from A0000000-AFFFFFFF might be used for I2O ???
+#define INTEGRATOR_PCI_IO_BASE  0x60000000   // 16M to xxx
+//  unused (128-16)M from B1000000-B7FFFFFF
+#define PCI_CONFIG_BASE         0x61000000   // 16M to xxx
+//  unused ((128-16)M - 64K) from XXX
+
+#define PCI_V3_BASE             0x62000000
+
+// V3 PCI bridge controller
+#define V3_BASE                        0x62000000    // V360EPC registers
+
+#define PCI_ENET0_IOADDR       (CPU_PCI_IO_ADRS)
+#define PCI_ENET0_MEMADDR      (PCI_MEM_BASE)
+
+
+#define V3_PCI_VENDOR           0x00000000
+#define V3_PCI_DEVICE           0x00000002
+#define V3_PCI_CMD              0x00000004
+#define V3_PCI_STAT             0x00000006
+#define V3_PCI_CC_REV           0x00000008
+#define V3_PCI_HDR_CF           0x0000000C
+#define V3_PCI_IO_BASE          0x00000010
+#define V3_PCI_BASE0            0x00000014
+#define V3_PCI_BASE1            0x00000018
+#define V3_PCI_SUB_VENDOR       0x0000002C
+#define V3_PCI_SUB_ID           0x0000002E
+#define V3_PCI_ROM              0x00000030
+#define V3_PCI_BPARAM           0x0000003C
+#define V3_PCI_MAP0             0x00000040
+#define V3_PCI_MAP1             0x00000044
+#define V3_PCI_INT_STAT         0x00000048
+#define V3_PCI_INT_CFG          0x0000004C
+#define V3_LB_BASE0             0x00000054
+#define V3_LB_BASE1             0x00000058
+#define V3_LB_MAP0              0x0000005E
+#define V3_LB_MAP1              0x00000062
+#define V3_LB_BASE2             0x00000064
+#define V3_LB_MAP2              0x00000066
+#define V3_LB_SIZE              0x00000068
+#define V3_LB_IO_BASE           0x0000006E
+#define V3_FIFO_CFG             0x00000070
+#define V3_FIFO_PRIORITY        0x00000072
+#define V3_FIFO_STAT            0x00000074
+#define V3_LB_ISTAT             0x00000076
+#define V3_LB_IMASK             0x00000077
+#define V3_SYSTEM               0x00000078
+#define V3_LB_CFG               0x0000007A
+#define V3_PCI_CFG              0x0000007C
+#define V3_DMA_PCI_ADR0         0x00000080
+#define V3_DMA_PCI_ADR1         0x00000090
+#define V3_DMA_LOCAL_ADR0       0x00000084
+#define V3_DMA_LOCAL_ADR1       0x00000094
+#define V3_DMA_LENGTH0          0x00000088
+#define V3_DMA_LENGTH1          0x00000098
+#define V3_DMA_CSR0             0x0000008B
+#define V3_DMA_CSR1             0x0000009B
+#define V3_DMA_CTLB_ADR0        0x0000008C
+#define V3_DMA_CTLB_ADR1        0x0000009C
+#define V3_DMA_DELAY            0x000000E0
+#define V3_MAIL_DATA            0x000000C0
+#define V3_PCI_MAIL_IEWR        0x000000D0
+#define V3_PCI_MAIL_IERD        0x000000D2
+#define V3_LB_MAIL_IEWR         0x000000D4
+#define V3_LB_MAIL_IERD         0x000000D6
+#define V3_MAIL_WR_STAT         0x000000D8
+#define V3_MAIL_RD_STAT         0x000000DA
+#define V3_QBA_MAP              0x000000DC
+
+// SYSTEM register bits
+#define V3_SYSTEM_M_RST_OUT             (1 << 15)
+#define V3_SYSTEM_M_LOCK                (1 << 14)
+
+//  PCI_CFG bits
+#define V3_PCI_CFG_M_RETRY_EN           (1 << 10)
+#define V3_PCI_CFG_M_AD_LOW1            (1 << 9)
+#define V3_PCI_CFG_M_AD_LOW0            (1 << 8)
+
+// PCI MAP register bits (PCI -> Local bus)
+#define V3_PCI_MAP_M_MAP_ADR            0xFFF00000
+#define V3_PCI_MAP_M_RD_POST_INH        (1 << 15)
+#define V3_PCI_MAP_M_ROM_SIZE           (1 << 11 | 1 << 10)
+#define V3_PCI_MAP_M_SWAP               (1 << 9 | 1 << 8)
+#define V3_PCI_MAP_M_ADR_SIZE           0x000000F0
+#define V3_PCI_MAP_M_REG_EN             (1 << 1)
+#define V3_PCI_MAP_M_ENABLE             (1 << 0)
+
+// 9 => 512M window size
+#define V3_PCI_MAP_M_ADR_SIZE_512M      0x00000090
+
+// A => 1024M window size
+#define V3_PCI_MAP_M_ADR_SIZE_1024M     0x000000A0
+
+// LB_BASE register bits (Local bus -> PCI)
+#define V3_LB_BASE_M_MAP_ADR            0xFFF00000
+#define V3_LB_BASE_M_SWAP               (1 << 8 | 1 << 9)
+#define V3_LB_BASE_M_ADR_SIZE           0x000000F0
+#define V3_LB_BASE_M_PREFETCH           (1 << 3)
+#define V3_LB_BASE_M_ENABLE             (1 << 0)
+
+// PCI COMMAND REGISTER bits
+#define V3_COMMAND_M_FBB_EN             (1 << 9)
+#define V3_COMMAND_M_SERR_EN            (1 << 8)
+#define V3_COMMAND_M_PAR_EN             (1 << 6)
+#define V3_COMMAND_M_MASTER_EN          (1 << 2)
+#define V3_COMMAND_M_MEM_EN             (1 << 1)
+#define V3_COMMAND_M_IO_EN              (1 << 0)
+
+#define INTEGRATOR_SC_BASE             0x11000000
+#define INTEGRATOR_SC_PCIENABLE_OFFSET 0x18
+#define INTEGRATOR_SC_PCIENABLE \
+                       (INTEGRATOR_SC_BASE + INTEGRATOR_SC_PCIENABLE_OFFSET)
+
+
+#endif                                                 /* __CONFIG_H */
diff --git a/include/configs/integratorcp.h b/include/configs/integratorcp.h
new file mode 100644 (file)
index 0000000..3fcb8af
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * (C) Copyright 2003
+ * Texas Instruments.
+ * Kshitij Gupta <kshitij@ti.com>
+ * Configuation settings for the TI OMAP Innovator board.
+ *
+ * (C) Copyright 2004
+ * ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ * Configuration for Compact Integrator board.
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+#define CONFIG_ARM926EJS       1       /* This is an arm926ejs CPU core  */
+#define CONFIG_INTEGRATOR      1       /* in an Integrator board       */
+#define CONFIG_ARCH_CINTEGRATOR 1      /* Specifically, a CP           */
+
+
+#define CFG_MEMTEST_START       0x100000
+#define CFG_MEMTEST_END         0x10000000
+#define CFG_HZ                  (1000000 / 256)        /* Timer 1 is clocked at 1Mhz, with 256 divider */
+#define CFG_TIMERBASE           0x13000100
+
+#define CONFIG_CMDLINE_TAG     1       /* enable passing of ATAGs  */
+#define CONFIG_SETUP_MEMORY_TAGS       1
+#define CONFIG_MISC_INIT_R     1       /* call misc_init_r during start up */
+/*
+ * Size of malloc() pool
+ */
+#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024)
+
+/*
+ * Hardware drivers
+ */
+#define CONFIG_DRIVER_SMC91111
+#define CONFIG_SMC_USE_32_BIT
+#define CONFIG_SMC91111_BASE    0xC8000000
+#undef CONFIG_SMC91111_EXT_PHY
+
+/*
+ * NS16550 Configuration
+ */
+#define CFG_PL011_SERIAL
+#define CONFIG_CONS_INDEX      0
+#define CONFIG_BAUDRATE        38400
+#define CFG_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
+#define CFG_SERIAL0            0x16000000
+#define CFG_SERIAL1            0x17000000
+
+#define CONFIG_COMMANDS        (CFG_CMD_DHCP | CFG_CMD_IMI | CFG_CMD_NET | CFG_CMD_PING | CFG_CMD_BDI | CFG_CMD_MEMORY)
+#define CONFIG_BOOTP_MASK      CONFIG_BOOTP_DEFAULT
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#define CONFIG_BOOTDELAY       2
+#define CONFIG_BOOTARGS        "root=/dev/nfs mem=128M ip=dhcp netdev=27,0,0xfc800000,0xfc800010,eth0" 
+#define CONFIG_BOOTCOMMAND "bootp ; bootm"
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP   /* undef to save memory     */
+#define CFG_PROMPT     "Integrator-CP # "      /* Monitor Command Prompt   */
+#define CFG_CBSIZE     256             /* Console I/O Buffer Size  */
+/* Print Buffer Size */
+#define CFG_PBSIZE     (CFG_CBSIZE+sizeof(CFG_PROMPT)+16)
+#define CFG_MAXARGS    16              /* max number of command args   */
+#define CFG_BARGSIZE   CFG_CBSIZE      /* Boot Argument Buffer Size    */
+
+#undef CFG_CLKS_IN_HZ          /* everything, incl board info, in Hz */
+#define CFG_LOAD_ADDR  0x7fc0  /* default load address */
+
+/*-----------------------------------------------------------------------
+ * Stack sizes
+ *
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE       (128*1024)      /* regular stack */
+#ifdef CONFIG_USE_IRQ
+#define CONFIG_STACKSIZE_IRQ   (4*1024)        /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ   (4*1024)        /* FIQ stack */
+#endif
+
+/*-----------------------------------------------------------------------
+ * Physical Memory Map
+ */
+#define CONFIG_NR_DRAM_BANKS    1      /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1            0x00000000     /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE       0x02000000     /* 32 MB */
+
+#define CFG_FLASH_BASE          0x24000000
+#define PHYS_FLASH_1           (CFG_FLASH_BASE)
+
+/*-----------------------------------------------------------------------
+ * FLASH and environment organization
+ */
+#define CFG_ENV_IS_NOWHERE
+#define CFG_MAX_FLASH_BANKS    1               /* max number of memory banks */
+#define PHYS_FLASH_SIZE         0x01000000     /* 16MB */
+/* timeout values are in ticks */
+#define CFG_FLASH_ERASE_TOUT   (20*CFG_HZ)     /* Timeout for Flash Erase */
+#define CFG_FLASH_WRITE_TOUT   (20*CFG_HZ)     /* Timeout for Flash Write */
+#define CFG_MAX_FLASH_SECT 128
+#define CFG_ENV_SIZE 32768
+
+#endif                                                 /* __CONFIG_H */
diff --git a/include/configs/versatile.h b/include/configs/versatile.h
new file mode 100644 (file)
index 0000000..58ed25b
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * (C) Copyright 2003
+ * Texas Instruments.
+ * Kshitij Gupta <kshitij@ti.com>
+ * Configuation settings for the TI OMAP Innovator board.
+ *
+ * (C) Copyright 2004
+ * ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ * Configuration for Versatile PB.
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+#define CONFIG_ARM926EJS       1       /* This is an arm926ejs CPU core  */
+#define CONFIG_VERSATILE       1       /* in Versatile Platform Board  */
+#define CONFIG_ARCH_VERSATILE   1      /* Specifically, a Versatile    */
+
+
+#define CFG_MEMTEST_START       0x100000
+#define CFG_MEMTEST_END         0x10000000
+#define CFG_HZ                  (1000000 / 256)
+#define CFG_TIMERBASE           0x101E2000     /* Timer 0 and 1 base */
+
+#define CFG_TIMER_INTERVAL     10000
+#define CFG_TIMER_RELOAD       (CFG_TIMER_INTERVAL >> 4)       /* Divide by 16 */
+#define CFG_TIMER_CTRL          0x84                           /* Enable, Clock / 16 */
+
+/*
+ * control registers
+ */
+#define VERSATILE_SCTL_BASE            0x101E0000      /* System controller */
+
+/*
+ * System controller bit assignment
+ */
+#define VERSATILE_REFCLK       0
+#define VERSATILE_TIMCLK       1
+
+#define VERSATILE_TIMER1_EnSel 15
+#define VERSATILE_TIMER2_EnSel 17
+#define VERSATILE_TIMER3_EnSel 19
+#define VERSATILE_TIMER4_EnSel 21
+
+#define CONFIG_CMDLINE_TAG             1       /* enable passing of ATAGs  */
+#define CONFIG_SETUP_MEMORY_TAGS       1
+#define CONFIG_MISC_INIT_R             1       /* call misc_init_r during start up */
+/*
+ * Size of malloc() pool
+ */
+#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024)
+
+/*
+ * Hardware drivers
+ */
+
+#define CONFIG_DRIVER_SMC91111
+#define CONFIG_SMC_USE_32_BIT
+#define CONFIG_SMC91111_BASE           0x10010000
+#undef CONFIG_SMC91111_EXT_PHY
+
+/*
+ * NS16550 Configuration
+ */
+#define CFG_PL011_SERIAL
+#define CONFIG_CONS_INDEX      0
+#define CONFIG_BAUDRATE         38400
+#define CFG_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
+#define CFG_SERIAL0            0x101F1000
+#define CFG_SERIAL1            0x101F2000
+
+#define CONFIG_COMMANDS        (CFG_CMD_DHCP | CFG_CMD_IMI | CFG_CMD_NET | CFG_CMD_PING | CFG_CMD_BDI | CFG_CMD_MEMORY)
+
+//#define CONFIG_COMMANDS      (CFG_CMD_IMI | CFG_CMD_BDI | CFG_CMD_MEMORY)
+
+#define CONFIG_BOOTP_MASK      CONFIG_BOOTP_DEFAULT
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#define CONFIG_BOOTDELAY       2
+#define CONFIG_BOOTARGS        "root=/dev/nfs mem=128M ip=dhcp netdev=27,0,0xfc800000,0xfc800010,eth0" 
+//#define CONFIG_BOOTCOMMAND "bootp ; bootm"
+
+/*
+ * Static configuration when assigning fixed address
+ */
+//#define CONFIG_NETMASK       255.255.255.0   /* talk on MY local net */
+//#define CONFIG_IPADDR                xx.xx.xx.xx     /* static IP I currently own */
+//#define CONFIG_SERVERIP      xx.xx.xx.xx     /* current IP of my dev pc */
+#define CONFIG_BOOTFILE            "/tftpboot/uImage" /* file to load */
+
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP   /* undef to save memory     */
+#define CFG_PROMPT     "Versatile # "  /* Monitor Command Prompt   */
+#define CFG_CBSIZE     256             /* Console I/O Buffer Size  */
+/* Print Buffer Size */
+#define CFG_PBSIZE     (CFG_CBSIZE+sizeof(CFG_PROMPT)+16)
+#define CFG_MAXARGS    16              /* max number of command args   */
+#define CFG_BARGSIZE   CFG_CBSIZE      /* Boot Argument Buffer Size    */
+
+#undef CFG_CLKS_IN_HZ          /* everything, incl board info, in Hz */
+#define CFG_LOAD_ADDR  0x7fc0  /* default load address */
+
+/*-----------------------------------------------------------------------
+ * Stack sizes
+ *
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE       (128*1024)      /* regular stack */
+#ifdef CONFIG_USE_IRQ
+#define CONFIG_STACKSIZE_IRQ   (4*1024)        /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ   (4*1024)        /* FIQ stack */
+#endif
+
+/*-----------------------------------------------------------------------
+ * Physical Memory Map
+ */
+#define CONFIG_NR_DRAM_BANKS    1      /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1            0x00000000     /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE       0x08000000     /* 128 MB */
+
+#define CFG_FLASH_BASE          0x34000000
+
+/*-----------------------------------------------------------------------
+ * FLASH and environment organization
+ */
+#define CFG_ENV_IS_NOWHERE
+#define CFG_MAX_FLASH_BANKS    1               /* max number of memory banks */
+#define PHYS_FLASH_SIZE         0x34000000     /* 64MB */
+/* timeout values are in ticks */
+#define CFG_FLASH_ERASE_TOUT   (20*CFG_HZ)     /* Timeout for Flash Erase */
+#define CFG_FLASH_WRITE_TOUT   (20*CFG_HZ)     /* Timeout for Flash Write */
+#define CFG_MAX_FLASH_SECT 128
+#define CFG_ENV_SIZE 32768
+
+#define PHYS_FLASH_1           (CFG_FLASH_BASE)
+
+#endif                                                 /* __CONFIG_H */
index b760b885b2afe08788b4457e3768b8493db25920..9eae34fd4002e0c97623def7a2afe962a2fdd5ef 100644 (file)
@@ -117,10 +117,15 @@ static int BootpCheckPkt(uchar *pkt, unsigned dest, unsigned src, unsigned len)
  */
 static void BootpCopyNetParams(Bootp_t *bp)
 {
+       IPaddr_t tmp_ip;
+
        NetCopyIP(&NetOurIP, &bp->bp_yiaddr);
-       NetCopyIP(&NetServerIP, &bp->bp_siaddr);
+       NetCopyIP(&tmp_ip, &bp->bp_siaddr);
+       if (tmp_ip != 0)
+               NetCopyIP(&NetServerIP, &bp->bp_siaddr);
        memcpy (NetServerEther, ((Ethernet_t *)NetRxPkt)->et_src, 6);
-       copy_filename (BootFile, bp->bp_file, sizeof(BootFile));
+       if (strlen(bp->bp_file) > 0)
+               copy_filename (BootFile, bp->bp_file, sizeof(BootFile));
 
        debug ("Bootfile: %s\n", BootFile);
 
index 47c2007696ca035afa0b67c0d7a6d7510f844e60..907cd73e9e947264088ca50b54dc48577b4f4643 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -323,7 +323,7 @@ restart:
                 * IP addr assigned to us by the BOOTP / RARP server
                 */
                NetOurIP = 0;
-               NetServerIP = 0;
+               NetServerIP = getenv_IPaddr ("serverip");
                break;
        default:
                break;
@@ -354,7 +354,7 @@ restart:
                case DHCP:
                        /* Start with a clean slate... */
                        NetOurIP = 0;
-                       NetServerIP = 0;
+                       NetServerIP = getenv_IPaddr ("serverip");
                        DhcpRequest();          /* Basically same as BOOTP */
                        break;
 #endif /* CFG_CMD_DHCP */
@@ -832,7 +832,8 @@ NetReceive(volatile uchar * pkt, int len)
                        printf("invalid RARP header\n");
                } else {
                        NetCopyIP(&NetOurIP,    &arp->ar_data[16]);
-                       NetCopyIP(&NetServerIP, &arp->ar_data[ 6]);
+                       if (NetServerIP == 0)
+                               NetCopyIP(&NetServerIP, &arp->ar_data[ 6]);
                        memcpy (NetServerEther, &arp->ar_data[ 0], 6);
 
                        (*packetHandler)(0,0,0,0);
index 4b6d8acbfa5a2b6b6a63d4df1e9fd70590db2b8c..3b26a0a327ad7f18169969fc0895debfe5b79408 100644 (file)
@@ -52,7 +52,7 @@
 # define CFG_I2C_RTC_ADDR      0x68
 #endif
 
-#if CFG_I2C_SPEED > 100000
+#if defined(CONFIG_RTC_DS1307) && (CFG_I2C_SPEED > 100000)
 # error The DS1307 is specified only up to 100kHz!
 #endif