]> www.infradead.org Git - users/rw/ppcboot.git/commitdiff
More changes for ARMBoot merge;
authorwdenk <wdenk>
Wed, 14 Aug 2002 14:53:06 +0000 (14:53 +0000)
committerwdenk <wdenk>
Wed, 14 Aug 2002 14:53:06 +0000 (14:53 +0000)
include ARMBoot patch by Kyle Harris, 14 Aug 2002:
- Add Xscale support, add support for lubbock and cradle boards

55 files changed:
CHANGELOG
MAINTAINERS
MAKEALL
Makefile
arm_config.mk [new file with mode: 0644]
board/bmw/ppcboot.lds
board/cradle/Makefile [new file with mode: 0644]
board/cradle/armboot.lds [new file with mode: 0644]
board/cradle/config.mk [new file with mode: 0644]
board/cradle/cradle.c [new file with mode: 0644]
board/cradle/env.c [new file with mode: 0644]
board/cradle/flash.c [new file with mode: 0644]
board/cradle/memsetup.S [new file with mode: 0644]
board/cu824/ppcboot.lds
board/esd/ar405/ppcboot.lds
board/esd/canbt/ppcboot.lds
board/esd/dasa_sim/ppcboot.lds
board/lubbock/Makefile [new file with mode: 0644]
board/lubbock/armboot.lds [new file with mode: 0644]
board/lubbock/config.mk [new file with mode: 0644]
board/lubbock/env.c [new file with mode: 0644]
board/lubbock/flash.c [new file with mode: 0644]
board/lubbock/lubbock.c [new file with mode: 0644]
board/lubbock/memsetup.S [new file with mode: 0644]
board/mousse/ppcboot.lds
board/musenki/ppcboot.lds
board/oxc/ppcboot.lds
board/pn62/ppcboot.lds
board/sandpoint/ppcboot.lds
board/utx8245/ppcboot.lds
common/Makefile
config.mk
cpu/arm920t/interrupts.c
cpu/xscale/Makefile [new file with mode: 0644]
cpu/xscale/config.mk [new file with mode: 0644]
cpu/xscale/cpu.c [new file with mode: 0644]
cpu/xscale/interrupts.c [new file with mode: 0644]
cpu/xscale/serial.c [new file with mode: 0644]
cpu/xscale/start.S [new file with mode: 0644]
drivers/smc91111.c
drivers/smc91111.h
include/asm-arm/arch-xscale/pxa-regs.h [new file with mode: 0644]
include/asm-arm/posix_types.h [new file with mode: 0644]
include/asm-arm/proc-armv/ptrace.h [new file with mode: 0644]
include/asm-arm/string.h [new file with mode: 0644]
include/asm-arm/types.h [new file with mode: 0644]
include/configs/cradle.h [new file with mode: 0644]
include/configs/lubbock.h [new file with mode: 0644]
lib_arm/Makefile
lib_arm/armlinux.c [new file with mode: 0644]
lib_arm/board.c [new file with mode: 0644]
lib_ppc/Makefile
lib_ppc/board.c [moved from common/board.c with 100% similarity]
mkconfig
ppc_config.mk [moved from lib_ppc/config.mk with 100% similarity]

index 2f25528a0b6a84b564ae9243576d8079766491d2..3b4b6817d34602875e057f2e0f2a75bb82d1c69c 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,10 @@
 Modifications for 1.2.0:
 ======================================================================
 
+* More changes for ARMBoot merge;
+  include ARMBoot patch by Kyle Harris, 14 Aug 2002:
+  - Add Xscale support, add support for lubbock and cradle boards
+
 * Patch by James Dougherty, 12 Aug 2002
   Support for Broadcom BCM56xx PPC BMW Board
   Added Broadcom BCM570x Gigabit Ethernet for MPC824x systems
index 108036d8df5ed50d8710b467d6ba1d4585555b55..819c4c6dbfb237cdc99b2dff76d04c132f1e42d7 100644 (file)
@@ -3,10 +3,19 @@
 # Regular Maintainers for PPCBoot board support:                       #
 #                                                                      #
 # For any board without permanent maintainer, please contact           #
+#    for PowerPC systems:                                              #
 #      Wolfgang Denk <wd@denx.de>                                      #
-# and Cc: the <ppcboot-users@lists.sourceforge.net> mailing list.      #
+#    for ARM systems:                                                  #
+#      Marius Gröger <mag@sysgo.de>                                    #
+# and Cc: the <ppcboot-users@lists.sourceforge.net>                    #
+# and/or  the <armboot-users@lists.sourceforge.net> mailing lists.     #
 #                                                                      #
+# Note: lists sorted by Maintainer Name                                        #
 #########################################################################
+
+
+#########################################################################
+#                                                                      #
 # Maintainer Name, Email Address                                       #
 #      Board                   CPU                                     #
 #########################################################################
@@ -177,6 +186,41 @@ Unknown / orphaned boards:
 
        EVB64260                MPC7xx_74xx
 
+
+#########################################################################
+# ARM Systems:                                                         #
+#                                                                      #
+# Maintainer Name, Email Address                                       #
+#      Board                   CPU                                     #
+#########################################################################
+
+Marius Gröger <mag@sysgo.de>
+
+       impa7                   ARM720T (EP7211)
+       ep7312                  ARM720T (EP7312)
+
+Kyle Harris <kharris@nexus-tech.net>
+
+       lubbock                 xscale
+       cradle                  xscale
+
+Gary Jennejohn <gj@denx.de>
+
+       smdk2400                ARM920T
+
+David Müller <d.mueller@elsoft.ch>
+
+       smdk2410                ARM920T
+
+Rolf Offermanns <rof@sysgo.de>
+
+       shannon                 SA1100
+
+Alex Züpke <azu@sysgo.de>
+
+       lart                    SA1100
+       dnp1110                 SA1110
+
 #########################################################################
 # End of MAINTAINERS list                                              #
 #########################################################################
diff --git a/MAKEALL b/MAKEALL
index e17d7cffe71129233272d81893fb67cca60fc272..8494f546f6d5f1b3ccd5802a7d248c44b37804a7 100755 (executable)
--- a/MAKEALL
+++ b/MAKEALL
@@ -18,15 +18,15 @@ LIST_8xx="  \
        ADS860          AMX860          c2mon           CCM             \
        cogent_mpc8xx   ESTEEM192E      ETX094          FADS823         \
        FADS850SAR      FADS860T        FLAGADM         FPS850L         \
-       GEN860T         GENIETV         GTH             hermes          \
-       IAD210          ICU862_100MHz   IP860           IVML24          \
-       IVML24_128      IVML24_256      IVMS8           IVMS8_128       \
-       IVMS8_256       LANTEC          lwmon           MBX             \
-       MBX860T         MHPC            MVS1            NX823           \
-       pcu_e           R360MPI         RPXClassic      RPXlite         \
-       SM850           SPD823TS        SXNI855T        TQM823L         \
-       TQM823L_LCD     TQM850L         TQM855L         TQM860L         \
-       TQM860L_FEC     TTTech          \
+       GENIETV         GTH             hermes          IAD210          \
+       ICU862_100MHz   IP860           IVML24          IVML24_128      \
+       IVML24_256      IVMS8           IVMS8_128       IVMS8_256       \
+       LANTEC          lwmon           MBX             MBX860T         \
+       MHPC            MVS1            NX823           pcu_e           \
+       R360MPI         RPXClassic      RPXlite         SM850           \
+       SPD823TS        SXNI855T        TQM823L         TQM823L_LCD     \
+       TQM850L         TQM855L         TQM860L         TQM860L_FEC     \
+       TTTech                                                          \
 "
 
 #########################################################################
index 9e4bdbe9b5de9cc834fe9459aab665d2fc889ac8..0fc0303e96327557ed5645455f2a401a75c5e0e6 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -100,28 +100,23 @@ SUBDIRS   = tools \
 #########################################################################
 # ppcboot objects....order is important (i.e. start must be first)
 
-OBJS  =        cpu/$(CPU)/start.o              \
-       common/libcommon.a              \
-       fs/jffs2/libjffs2.a
-
-OBJS +=        net/libnet.a disk/libdisk.a rtc/librtc.a
-
-OBJS += dtt/libdtt.a
-
-OBJS +=        board/$(BOARDDIR)/lib$(BOARD).a \
-       cpu/$(CPU)/lib$(CPU).a  \
-       lib_generic/libgeneric.a \
-       lib_$(ARCH)/lib$(ARCH).a
-
-OBJS += drivers/libdrivers.a
+OBJS  =        cpu/$(CPU)/start.o
 
 ifeq ($(CPU),ppc4xx)
 OBJS +=        cpu/$(CPU)/resetvec.o
 endif
 
-# include libcommon last for common low level functions referenced
-# by the other libraries
-OBJS +=        common/libcommon.a
+LIBS  =        board/$(BOARDDIR)/lib$(BOARD).a
+LIBS += cpu/$(CPU)/lib$(CPU).a
+LIBS += lib_$(ARCH)/lib$(ARCH).a
+LIBS += drivers/libdrivers.a
+LIBS += fs/jffs2/libjffs2.a
+LIBS += net/libnet.a
+LIBS += disk/libdisk.a
+LIBS += rtc/librtc.a
+LIBS += dtt/libdtt.a
+LIBS += common/libcommon.a
+LIBS += lib_generic/libgeneric.a
 
 #########################################################################
 
@@ -140,8 +135,8 @@ ppcboot.bin:        ppcboot
 ppcboot.dis:   ppcboot
                $(OBJDUMP) -d $< > $@
 
-ppcboot:       depend subdirs $(OBJS) $(LDSCRIPT)
-               $(LD) $(LDFLAGS) $(OBJS) -Map ppcboot.map -o ppcboot
+ppcboot:       depend subdirs $(OBJS) $(LIBS) $(LDSCRIPT)
+               $(LD) $(LDFLAGS) $(OBJS) $(LIBS) $(LIBS) -Map ppcboot.map -o ppcboot
 
 subdirs:
                @for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir || exit 1 ; done
@@ -591,6 +586,16 @@ impa7_config       :       unconfig
 ep7312_config  :       unconfig
        @./mkconfig $(@:_config=) arm arm720t ep7312
 
+#########################################################################
+## Xscale Systems
+#########################################################################
+
+lubbock_config :       unconfig
+       @./mkconfig $(@:_config=) arm xscale lubbock
+
++cradle_config :       unconfig
+       @./mkconfig $(@:_config=) arm xscale cradle
+
 #########################################################################
 
 clean:
@@ -611,7 +616,8 @@ clobber:    clean
        rm -f $(OBJS) *.bak tags TAGS
        rm -fr *.*~
        rm -f ppcboot ppcboot.bin ppcboot.elf ppcboot.srec ppcboot.map System.map
-       rm -f tools/crc32.c tools/environment.c include/asm
+       rm -f tools/crc32.c tools/environment.c
+       rm -f include/asm/arch include/asm
 
 mrproper \
 distclean:     clobber unconfig
diff --git a/arm_config.mk b/arm_config.mk
new file mode 100644 (file)
index 0000000..e69de29
index 0e6091ceb8f5a2a417e8ff0c2a11208da6d8942a..4370e0843255089a471193ccc0dd5e327d2fb8e4 100644 (file)
@@ -33,37 +33,37 @@ SECTIONS
   .hash          : { *(.hash)          }
   .dynsym        : { *(.dynsym)                }
   .dynstr        : { *(.dynstr)                }
-  .rel.text      : { *(.rel.text)              }
+  .rel.text      : { *(.rel.text)      }
   .rela.text     : { *(.rela.text)     }
-  .rel.data      : { *(.rel.data)              }
+  .rel.data      : { *(.rel.data)      }
   .rela.data     : { *(.rela.data)     }
   .rel.rodata    : { *(.rel.rodata)    }
   .rela.rodata   : { *(.rela.rodata)   }
-  .rel.got       : { *(.rel.got)               }
-  .rela.got      : { *(.rela.got)              }
+  .rel.got       : { *(.rel.got)       }
+  .rela.got      : { *(.rela.got)      }
   .rel.ctors     : { *(.rel.ctors)     }
   .rela.ctors    : { *(.rela.ctors)    }
   .rel.dtors     : { *(.rel.dtors)     }
   .rela.dtors    : { *(.rela.dtors)    }
-  .rel.bss       : { *(.rel.bss)               }
-  .rela.bss      : { *(.rela.bss)              }
-  .rel.plt       : { *(.rel.plt)               }
-  .rela.plt      : { *(.rela.plt)              }
-  .init          : { *(.init)  }
+  .rel.bss       : { *(.rel.bss)       }
+  .rela.bss      : { *(.rela.bss)      }
+  .rel.plt       : { *(.rel.plt)       }
+  .rela.plt      : { *(.rela.plt)      }
+  .init          : { *(.init)          }
   .plt : { *(.plt) }
   .text      :
   {
-    cpu/mpc824x/start.o        (.text)
-    common/board.o     (.text)
-    lib_ppc/ppcstring.o        (.text)
+    cpu/mpc824x/start.o                (.text)
+    lib_ppc/board.o            (.text)
+    lib_ppc/ppcstring.o                (.text)
     lib_generic/vsprintf.o     (.text)
-    lib_generic/crc32.o        (.text)
-    lib_generic/zlib.o (.text)
+    lib_generic/crc32.o                (.text)
+    lib_generic/zlib.o         (.text)
 
-               . = DEFINED(env_offset) ? env_offset : .;
+       . = DEFINED(env_offset) ? env_offset : .;
     common/environment.o (.text)
 
-               *(.text)
+       *(.text)
 
     *(.fixup)
     *(.got1)
diff --git a/board/cradle/Makefile b/board/cradle/Makefile
new file mode 100644 (file)
index 0000000..2870ddc
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# (C) Copyright 2000, 2002
+# 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   := cradle.o flash.o env.o
+SOBJS  := memsetup.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/cradle/armboot.lds b/board/cradle/armboot.lds
new file mode 100644 (file)
index 0000000..2825f90
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * (C) Copyright 2000
+ * 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
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+        . = 0x00000000;
+
+        . = ALIGN(4);
+       .text      :
+       {
+         cpu/xscale/start.o    (.text)
+         *(.text)
+       }
+
+        . = ALIGN(4);
+        .rodata : { *(.rodata) }
+
+        . = ALIGN(4);
+        .data : { *(.data) }
+
+        . = ALIGN(4);
+        .got : { *(.got) }
+
+        . = ALIGN(4);
+        .bss : { *(.bss) }
+
+       armboot_end = .;
+}
diff --git a/board/cradle/config.mk b/board/cradle/config.mk
new file mode 100644 (file)
index 0000000..2977572
--- /dev/null
@@ -0,0 +1,3 @@
+TEXT_BASE = 0xa0f08000
+#TEXT_BASE = 0
+
diff --git a/board/cradle/cradle.c b/board/cradle/cradle.c
new file mode 100644 (file)
index 0000000..7feec95
--- /dev/null
@@ -0,0 +1,225 @@
+/*
+ * (C) Copyright 2002
+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.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 <asm/arch/pxa-regs.h>
+#include <ppcboot.h>
+
+/* ------------------------------------------------------------------------- */
+
+
+/* local prototypes */
+void set_led(int led, int color);
+void error_code_halt(int code);
+int init_sio(int led, unsigned long base);
+inline void cradle_outb(unsigned short val, unsigned long base, unsigned long reg);
+inline unsigned char cradle_inb(unsigned long base, unsigned long reg);
+inline void sleep(int i);
+
+inline void
+/**********************************************************/
+sleep(int i)
+/**********************************************************/
+{
+   while (i--)
+   {
+      udelay(1000000);
+   }
+}
+
+void
+/**********************************************************/
+error_code_halt(int code)
+/**********************************************************/
+{
+   while (1)
+   {
+      led_code(code, RED);
+      sleep(1);
+      led_code(0, OFF);
+      sleep(1);
+   }
+}
+
+void
+/**********************************************************/
+led_code(int code, int color)
+/**********************************************************/
+{
+   int i;
+
+   code &= 0xf;   /* only 4 leds */
+
+   for (i = 0; i < 4; i++)
+   {
+      if (code & (1 << i))
+      {
+         set_led(i, color);
+      }
+      else
+      {
+         set_led(i, OFF);
+      }
+   }
+}
+
+void
+/**********************************************************/
+set_led(int led, int color)
+/**********************************************************/
+{
+   int shift = led * 2;
+   unsigned long mask = 0x3 << shift;
+
+   CRADLE_LED_CLR_REG = mask;               /* clear bits */
+   CRADLE_LED_SET_REG = (color << shift);   /* set bits */
+   udelay(5000);
+}
+
+inline void
+/**********************************************************/
+cradle_outb(unsigned short val, unsigned long base, unsigned long reg)
+/**********************************************************/
+{
+   *(volatile unsigned short *)(base + (reg*2)) = val;
+}
+
+inline unsigned char
+/**********************************************************/
+cradle_inb(unsigned long base, unsigned long reg)
+/**********************************************************/
+{
+   unsigned short val;
+
+   val = *(volatile unsigned short *)(base + (reg*2));
+   return (val & 0xff);
+}
+
+int
+/**********************************************************/
+init_sio(int led, unsigned long base)
+/**********************************************************/
+{
+   unsigned char val;
+
+   set_led(led, YELLOW);
+   val = cradle_inb(base, CRADLE_SIO_INDEX);
+   val = cradle_inb(base, CRADLE_SIO_INDEX);
+   if (val != 0)
+   {
+      set_led(led, RED);
+      return -1;
+   }
+
+   /* map SCC2 to COM1 */
+   cradle_outb(0x01, base, CRADLE_SIO_INDEX);
+   cradle_outb(0x00, base, CRADLE_SIO_DATA);
+
+   /* enable SCC2 extended regs */
+   cradle_outb(0x40, base, CRADLE_SIO_INDEX);
+   cradle_outb(0xa0, base, CRADLE_SIO_DATA);
+
+   /* enable SCC2 clock multiplier */
+   cradle_outb(0x51, base, CRADLE_SIO_INDEX);
+   cradle_outb(0x04, base, CRADLE_SIO_DATA);
+
+   /* enable SCC2 */
+   cradle_outb(0x00, base, CRADLE_SIO_INDEX);
+   cradle_outb(0x04, base, CRADLE_SIO_DATA);
+
+   /* map SCC2 DMA to channel 0 */
+   cradle_outb(0x4f, base, CRADLE_SIO_INDEX);
+   cradle_outb(0x09, base, CRADLE_SIO_DATA);
+
+   /* read ID from SIO to check operation */
+   cradle_outb(0xe4, base, 0x3f8+0x3);
+   val = cradle_inb(base, 0x3f8+0x0);
+   if ((val & 0xf0) != 0x20)
+   {
+      set_led(led, RED);
+      /* disable SCC2 */
+      cradle_outb(0, base, CRADLE_SIO_INDEX);
+      cradle_outb(0, base, CRADLE_SIO_DATA);
+      return -1;
+   }
+   /* set back to bank 0 */
+   cradle_outb(0, base, 0x3f8+0x3);
+   set_led(led, GREEN);
+   return 0;
+}
+
+/*
+ * Miscelaneous platform dependent initialisations
+ */
+
+int
+/**********************************************************/
+board_post_init(bd_t *bd)
+/**********************************************************/
+{
+}
+
+int
+/**********************************************************/
+board_init(bd_t *bd)
+/**********************************************************/
+{
+   led_code(0xf, YELLOW);
+
+   /* arch number of HHP Cradle */
+   bd->bi_arch_number = 174;
+
+   /* adress of boot parameters */
+   bd->bi_boot_params = 0xa0000100;
+
+   /* Init SIOs to enable SCC2 */
+   udelay(100000);   // delay makes it look neat
+   init_sio(0, CRADLE_SIO1_PHYS);
+   udelay(100000);
+   init_sio(1, CRADLE_SIO2_PHYS);
+   udelay(100000);
+   init_sio(2, CRADLE_SIO3_PHYS);
+   udelay(100000);
+   set_led(3, GREEN);
+
+   return 1;
+}
+
+int
+/**********************************************************/
+dram_init(bd_t *bd)
+/**********************************************************/
+{
+   bd->bi_dram[0].start = PHYS_SDRAM_1;
+   bd->bi_dram[0].size  = PHYS_SDRAM_1_SIZE;
+   bd->bi_dram[1].start = PHYS_SDRAM_2;
+   bd->bi_dram[1].size  = PHYS_SDRAM_2_SIZE;
+   bd->bi_dram[2].start = PHYS_SDRAM_3;
+   bd->bi_dram[2].size  = PHYS_SDRAM_3_SIZE;
+   bd->bi_dram[3].start = PHYS_SDRAM_4;
+   bd->bi_dram[3].size  = PHYS_SDRAM_4_SIZE;
+   return PHYS_SDRAM_1_SIZE + PHYS_SDRAM_2_SIZE + PHYS_SDRAM_3_SIZE + PHYS_SDRAM_4_SIZE;
+}
diff --git a/board/cradle/env.c b/board/cradle/env.c
new file mode 100644 (file)
index 0000000..b0aca82
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.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 <ppcboot.h>
+
+static int check_crc(bd_t *bd)
+{
+    /* need to calculate crc? */
+    if (bd->bi_ext.env_crc_valid == 0)
+    {
+       env_t *env = (env_t *)CFG_ENV_ADDR;
+
+       if (crc32(0, env->data, sizeof(env->data)) == env->crc)
+         bd->bi_ext.env_crc_valid = 1;
+       else
+         bd->bi_ext.env_crc_valid = -1;
+    }
+    return bd->bi_ext.env_crc_valid > 0;
+}
+
+
+/*
+ * save environment buffer back to flash
+ * returns -1 on error, 0 if ok
+ */
+int board_env_save(bd_t *bd, env_t *env, int size)
+{
+    int rc;
+    ulong start_addr, end_addr;
+
+#if CFG_ENV_SIZE <= CFG_ENV_SECT_SIZE
+#error Make sure that CFG_ENV_SIZE <= CFG_ENV_SECT_SIZE
+#endif
+
+    start_addr = CFG_ENV_ADDR;
+    end_addr   = start_addr + CFG_ENV_SIZE - 1;
+
+    rc = flash_sect_protect(0, CFG_ENV_ADDR, end_addr);
+    if (rc < 0)
+      return rc;
+
+    rc = flash_sect_erase(start_addr, end_addr);
+    if (rc < 0)
+    {
+       flash_sect_protect(1, start_addr, end_addr);
+       flash_perror(rc);
+       return rc;
+    }
+
+    printf("Saving Environment to Flash...");
+    rc = flash_write((uchar*)env, start_addr, size);
+    if (rc < 0)
+      flash_perror(rc);
+    else
+      printf("done.\n");
+
+    (void)flash_sect_protect(1, start_addr, end_addr);
+
+    return 0;
+}
+
+/*
+ * copy environment to memory
+ * returns -1 on error, 0 if ok
+ */
+int board_env_copy(bd_t *bd, env_t *data, int size)
+{
+    env_t *env = (env_t *)CFG_ENV_ADDR;
+
+    if (check_crc(bd))
+    {
+       memcpy(data, env, sizeof(env_t));
+       return 0;
+    }
+
+    return -1;
+}
+
+/*
+ * try to read env character at offset #index
+ *
+ * called before the environment is copied to ram
+ * returns -1 on error, 0 if ok
+ */
+int board_env_getchar(bd_t * bd, int index, uchar *c)
+{
+    env_t *env = (env_t *)CFG_ENV_ADDR;
+
+    /* check environment crc */
+    if (index < sizeof(env->data) && check_crc(bd))
+    {
+       *c = env->data[index];
+       return 0;
+    }
+
+    return -1;
+}
+
+/*
+ * try to read env character at offset #index
+ *
+ * called before the environment is copied to ram
+ * returns -1 on error, 0 if ok
+ */
+uchar *board_env_getaddr(bd_t * bd, int index)
+{
+    env_t *env = (env_t *)CFG_ENV_ADDR;
+
+    /* check environment crc */
+    if (index < sizeof(env->data) && check_crc(bd))
+      return &env->data[index];
+
+    return 0;
+}
diff --git a/board/cradle/flash.c b/board/cradle/flash.c
new file mode 100644 (file)
index 0000000..efc5c38
--- /dev/null
@@ -0,0 +1,367 @@
+/*
+ * (C) Copyright 2002
+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.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 <ppcboot.h>
+
+#define FLASH_BANK_SIZE 0x400000
+#define MAIN_SECT_SIZE  0x20000
+
+flash_info_t    flash_info[CFG_MAX_FLASH_BANKS];
+
+
+/*-----------------------------------------------------------------------
+ */
+
+ulong flash_init(bd_t *bd)
+{
+   int i, j;
+   ulong size = 0;
+
+   for (i = 0; i < CFG_MAX_FLASH_BANKS; i++)
+   {
+      ulong flashbase = 0;
+      flash_info[i].flash_id =
+          (INTEL_MANUFACT & FLASH_VENDMASK) |
+          (INTEL_ID_28F128J3 & FLASH_TYPEMASK);
+      flash_info[i].size = FLASH_BANK_SIZE;
+      flash_info[i].sector_count = CFG_MAX_FLASH_SECT;
+      memset(flash_info[i].protect, 0, CFG_MAX_FLASH_SECT);
+      switch (i)
+      {
+         case 0:
+                flashbase = PHYS_FLASH_1;
+                break;
+         case 1:
+                flashbase = PHYS_FLASH_2;
+                break;
+         default:
+                panic("configured to many flash banks!\n");
+                break;
+      }
+      for (j = 0; j < flash_info[i].sector_count; j++)
+      {
+         flash_info[i].start[j] = flashbase + j*MAIN_SECT_SIZE;
+      }
+      size += flash_info[i].size;
+   }
+
+   /* Protect monitor and environment sectors
+    */
+   flash_protect(FLAG_PROTECT_SET,
+                  CFG_FLASH_BASE,
+                  CFG_FLASH_BASE + _armboot_end - _armboot_start,
+                  &flash_info[0]);
+
+   flash_protect(FLAG_PROTECT_SET,
+                  CFG_ENV_ADDR,
+                  CFG_ENV_ADDR + CFG_ENV_SIZE - 1,
+                  &flash_info[0]);
+
+   return size;
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info  (flash_info_t *info)
+{
+   int i, j;
+
+   for (j=0; j<CFG_MAX_FLASH_BANKS; j++)
+   {
+      switch (info->flash_id & FLASH_VENDMASK)
+      {
+         case (INTEL_MANUFACT & FLASH_VENDMASK):
+                printf("Intel: ");
+                break;
+         default:
+                printf("Unknown Vendor ");
+                break;
+      }
+
+      switch (info->flash_id & FLASH_TYPEMASK)
+      {
+         case (INTEL_ID_28F320JA3 & FLASH_TYPEMASK):
+                printf("28F320JA3 (32Mbit)\n");
+                break;
+         case (INTEL_ID_28F128J3 & FLASH_TYPEMASK):
+                printf("28F128J3 (128Mbit)\n");
+                break;
+         default:
+                printf("Unknown Chip Type\n");
+                goto Done;
+                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");
+      info++;
+   }
+
+Done:
+}
+
+/*-----------------------------------------------------------------------
+ */
+
+int        flash_erase (flash_info_t *info, int s_first, int s_last)
+{
+   int flag, prot, sect;
+   int rc = ERR_OK;
+
+   if (info->flash_id == FLASH_UNKNOWN)
+        return ERR_UNKNOWN_FLASH_TYPE;
+
+   if ((s_first < 0) || (s_first > s_last)) {
+        return ERR_INVAL;
+   }
+
+   if ((info->flash_id & FLASH_VENDMASK) !=
+        (INTEL_MANUFACT & FLASH_VENDMASK)) {
+        return ERR_UNKNOWN_FLASH_VENDOR;
+   }
+
+   prot = 0;
+   for (sect=s_first; sect<=s_last; ++sect) {
+      if (info->protect[sect]) {
+            prot++;
+      }
+   }
+   if (prot)
+        return ERR_PROTECTED;
+
+   /*
+    * Disable interrupts which might cause a timeout
+    * here. Remember that our exception vectors are
+    * at address 0 in the flash, and we don't want a
+    * (ticker) exception to happen while the flash
+    * chip is in programming mode.
+    */
+   flag = disable_interrupts();
+
+   /* Start erase on unprotected sectors */
+   for (sect = s_first; sect<=s_last && !ctrlc(); sect++) {
+
+      printf("Erasing sector %2d ... ", sect);
+
+      /* arm simple, non interrupt dependent timer */
+      reset_timer_masked();
+
+      if (info->protect[sect] == 0) {        /* not protected */
+          vushort *addr = (vushort *)(info->start[sect]);
+
+          *addr = 0x20;        /* erase setup */
+          *addr = 0xD0;        /* erase confirm */
+
+          while ((*addr & 0x80) != 0x80) {
+             if (get_timer_masked() > CFG_FLASH_ERASE_TOUT) {
+                *addr = 0xB0; /* suspend erase */
+                *addr = 0xFF;        /* reset to read mode */
+                rc = ERR_TIMOUT;
+                goto outahere;
+             }
+          }
+
+          /* clear status register command */
+          *addr = 0x50;
+          /* reset to read mode */
+          *addr = 0xFF;
+      }
+      printf("ok.\n");
+   }
+   if (ctrlc())
+      printf("User Interrupt!\n");
+
+outahere:
+
+   /* allow flash to settle - wait 10 ms */
+   udelay_masked(10000);
+
+   if (flag)
+      enable_interrupts();
+
+   return rc;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash
+ */
+
+static int write_word (flash_info_t *info, ulong dest, ushort data)
+{
+   vushort *addr = (vushort *)dest, val;
+   int rc = ERR_OK;
+   int flag;
+
+   /* Check if Flash is (sufficiently) erased
+    */
+   if ((*addr & data) != data)
+      return ERR_NOT_ERASED;
+
+   /*
+    * Disable interrupts which might cause a timeout
+    * here. Remember that our exception vectors are
+    * at address 0 in the flash, and we don't want a
+    * (ticker) exception to happen while the flash
+    * chip is in programming mode.
+    */
+   flag = disable_interrupts();
+
+   /* clear status register command */
+   *addr = 0x50;
+
+   /* program set-up command */
+   *addr = 0x40;
+
+   /* latch address/data */
+   *addr = data;
+
+   /* arm simple, non interrupt dependent timer */
+   reset_timer_masked();
+
+   /* wait while polling the status register */
+   while(((val = *addr) & 0x80) != 0x80)
+   {
+      if (get_timer_masked() > CFG_FLASH_WRITE_TOUT) {
+          rc = ERR_TIMOUT;
+          /* suspend program command */
+          *addr = 0xB0;
+          goto outahere;
+      }
+   }
+
+   if(val & 0x1A) {        /* check for error */
+      printf("\nFlash write error %02x at address %08lx\n",
+               (int)val, (unsigned long)dest);
+      if(val & (1<<3)) {
+         printf("Voltage range error.\n");
+         rc = ERR_PROG_ERROR;
+         goto outahere;
+      }
+      if(val & (1<<1)) {
+         printf("Device protect error.\n");
+         rc = ERR_PROTECTED;
+         goto outahere;
+      }
+      if(val & (1<<4)) {
+         printf("Programming error.\n");
+         rc = ERR_PROG_ERROR;
+         goto outahere;
+      }
+      rc = ERR_PROG_ERROR;
+      goto outahere;
+   }
+
+outahere:
+   /* read array command */
+   *addr = 0xFF;
+
+   if (flag)
+      enable_interrupts();
+
+   return rc;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash.
+ */
+
+int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
+{
+   ulong cp, wp;
+   ushort data;
+   int l;
+   int i, rc;
+
+   wp = (addr & ~1);        /* get lower word aligned address */
+
+   /*
+    * 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 << 8);
+      }
+      for (; i<2 && cnt>0; ++i) {
+         data = (data >> 8) | (*src++ << 8);
+         --cnt;
+         ++cp;
+      }
+      for (; cnt==0 && i<2; ++i, ++cp) {
+         data = (data >> 8) | (*(uchar *)cp << 8);
+      }
+
+      if ((rc = write_word(info, wp, data)) != 0) {
+         return (rc);
+      }
+      wp += 2;
+   }
+
+   /*
+    * handle word aligned part
+    */
+   while (cnt >= 2) {
+      data = *((vushort*)src);
+      if ((rc = write_word(info, wp, data)) != 0) {
+          return (rc);
+      }
+      src += 2;
+      wp  += 2;
+      cnt -= 2;
+   }
+
+   if (cnt == 0) {
+      return ERR_OK;
+   }
+
+   /*
+    * handle unaligned tail bytes
+    */
+   data = 0;
+   for (i=0, cp=wp; i<2 && cnt>0; ++i, ++cp) {
+      data = (data >> 8) | (*src++ << 8);
+      --cnt;
+   }
+   for (; i<2; ++i, ++cp) {
+      data = (data >> 8) | (*(uchar *)cp << 8);
+   }
+
+   return write_word(info, wp, data);
+}
diff --git a/board/cradle/memsetup.S b/board/cradle/memsetup.S
new file mode 100644 (file)
index 0000000..bb637c6
--- /dev/null
@@ -0,0 +1,515 @@
+/*
+ * Most of this taken from Redboot hal_platform_setup.h with cleanup
+ *
+ * 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>
+#include <asm/arch/pxa-regs.h>
+
+DRAM_SIZE:  .long   CFG_DRAM_SIZE
+
+// wait for coprocessor write complete
+   .macro CPWAIT reg
+   mrc  p15,0,\reg,c2,c0,0
+   mov  \reg,\reg
+   sub  pc,pc,#4
+   .endm
+
+   .macro SET_LED val
+   ldr   r6, =CRADLE_LED_CLR_REG
+   ldr   r7, =0
+   str   r7, [r6]
+   ldr   r6, =CRADLE_LED_SET_REG
+   ldr   r7, =\val
+   str   r7, [r6]
+   .endm
+
+
+.globl memsetup
+memsetup:
+
+    mov      r10, lr
+
+    /* Set up GPIO pins first */
+
+   ldr      r0,   =GPSR0
+   ldr      r1,   =CFG_GPSR0_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GPSR1
+   ldr      r1,   =CFG_GPSR1_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GPSR2
+   ldr      r1,   =CFG_GPSR2_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GPCR0
+   ldr      r1,   =CFG_GPCR0_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GPCR1
+   ldr      r1,   =CFG_GPCR1_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GPCR2
+   ldr      r1,   =CFG_GPCR2_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GRER0
+   ldr      r1,   =CFG_GRER0_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GRER1
+   ldr      r1,   =CFG_GRER1_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GRER2
+   ldr      r1,   =CFG_GRER2_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GFER0
+   ldr      r1,   =CFG_GFER0_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GFER1
+   ldr      r1,   =CFG_GFER1_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GFER2
+   ldr      r1,   =CFG_GFER2_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GPDR0
+   ldr      r1,   =CFG_GPDR0_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GPDR1
+   ldr      r1,   =CFG_GPDR1_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GPDR2
+   ldr      r1,   =CFG_GPDR2_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GAFR0_L
+   ldr      r1,   =CFG_GAFR0_L_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GAFR0_U
+   ldr      r1,   =CFG_GAFR0_U_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GAFR1_L
+   ldr      r1,   =CFG_GAFR1_L_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GAFR1_U
+   ldr      r1,   =CFG_GAFR1_U_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GAFR2_L
+   ldr      r1,   =CFG_GAFR2_L_VAL
+   str      r1,   [r0]
+
+   ldr      r0,   =GAFR2_U
+   ldr      r1,   =CFG_GAFR2_U_VAL
+   str      r1,   [r0]
+
+   // enable GPIO pins
+   ldr      r0,   =PSSR
+   ldr      r1,   =CFG_PSSR_VAL
+   str      r1,   [r0]
+
+   SET_LED 1
+
+   ldr    r3, =MSC1             // low - bank 2 Lubbock Registers / SRAM
+   ldr    r2, =CFG_MSC1_VAL     // high - bank 3 Ethernet Controller
+   str    r2, [r3]              // need to set MSC1 before trying to write to the HEX LEDs
+   ldr    r2, [r3]              // need to read it back to make sure the value latches (see MSC section of manual)
+
+
+/*********************************************************************
+    Initlialize Memory Controller
+
+    See PXA250 Operating System Developer's Guide
+
+    pause for 200 uSecs- allow internal clocks to settle
+    *Note: only need this if hard reset... doing it anyway for now
+*/
+
+    @ Step 1
+   @ ---- Wait 200 usec
+   ldr r3, =OSCR       @ reset the OS Timer Count to zero
+   mov r2, #0
+   str r2, [r3]
+   ldr r4, =0x300         @ really 0x2E1 is about 200usec, so 0x300 should be plenty
+1:
+   ldr r2, [r3]
+   cmp r4, r2
+   bgt 1b
+
+   SET_LED 2
+
+mem_init:
+        @ get memory controller base address
+        ldr     r1,  =MEMC_BASE
+
+
+@****************************************************************************
+@  Step 2
+@
+
+   @ Step 2a
+   @ write msc0, read back to ensure data latches
+   @
+   ldr     r2,   =CFG_MSC0_VAL
+   str     r2,   [r1, #MSC0_OFFSET]
+   ldr     r2,   [r1, #MSC0_OFFSET]
+
+   @ write msc1
+   ldr     r2,  =CFG_MSC1_VAL
+   str     r2,  [r1, #MSC1_OFFSET]
+   ldr     r2,  [r1, #MSC1_OFFSET]
+
+   @ write msc2
+   ldr     r2,  =CFG_MSC2_VAL
+   str     r2,  [r1, #MSC2_OFFSET]
+   ldr     r2,  [r1, #MSC2_OFFSET]
+
+   @ Step 2b
+   @ write mecr
+   ldr     r2,  =CFG_MECR_VAL
+   str     r2,  [r1, #MECR_OFFSET]
+
+   @ write mcmem0
+   ldr     r2,  =CFG_MCMEM0_VAL
+   str     r2,  [r1, #MCMEM0_OFFSET]
+
+   @ write mcmem1
+   ldr     r2,  =CFG_MCMEM1_VAL
+   str     r2,  [r1, #MCMEM1_OFFSET]
+
+   @ write mcatt0
+   ldr     r2,  =CFG_MCATT0_VAL
+   str     r2,  [r1, #MCATT0_OFFSET]
+
+   @ write mcatt1
+   ldr     r2,  =CFG_MCATT1_VAL
+   str     r2,  [r1, #MCATT1_OFFSET]
+
+   @ write mcio0
+   ldr     r2,  =CFG_MCIO0_VAL
+   str     r2,  [r1, #MCIO0_OFFSET]
+
+   @ write mcio1
+   ldr     r2,  =CFG_MCIO1_VAL
+   str     r2,  [r1, #MCIO1_OFFSET]
+
+   //SET_LED 3
+
+   @ Step 2c
+   @ fly-by-dma is defeatured on this part
+   @ write flycnfg
+   @ldr     r2,  =CFG_FLYCNFG_VAL
+   @str     r2,  [r1, #FLYCNFG_OFFSET]
+
+/* FIXME Does this sequence really make sense */
+#ifdef REDBOOT_WAY
+   @ Step 2d
+   @ get the mdrefr settings
+   ldr     r3,  =CFG_MDREFR_VAL
+
+   @ extract DRI field (we need a valid DRI field)
+   @
+   ldr     r2,  =0xFFF
+
+   @ valid DRI field in r3
+   @
+   and     r3,  r3,  r2
+
+   @ get the reset state of MDREFR
+   @
+   ldr     r4,  [r1, #MDREFR_OFFSET]
+
+   @ clear the DRI field
+   @
+   bic     r4,  r4,  r2
+
+   @ insert the valid DRI field loaded above
+   @
+   orr     r4,  r4,  r3
+
+   @ write back mdrefr
+   @
+   str     r4,  [r1, #MDREFR_OFFSET]
+
+   @ *Note: preserve the mdrefr value in r4 *
+
+   //SET_LED 4
+
+@****************************************************************************
+@  Step 3
+@
+@ NO SRAM
+
+   mov   pc, r10
+
+
+@****************************************************************************
+@  Step 4
+@
+
+   @ Assumes previous mdrefr value in r4, if not then read current mdrefr
+
+   @ clear the free-running clock bits
+   @ (clear K0Free, K1Free, K2Free
+   @
+   bic     r4,  r4,  #(0x00800000 | 0x01000000 | 0x02000000)
+
+   @ set K0RUN for CPLD clock
+   @
+   orr   r4,  r4,  #0x00002000
+
+   @ set K1RUN if bank 0 installed
+   @
+   orr   r4,  r4,  #0x00010000
+
+   @ write back mdrefr
+   @
+   str     r4,  [r1, #MDREFR_OFFSET]
+   ldr     r4,  [r1, #MDREFR_OFFSET]
+
+   @ deassert SLFRSH
+   @
+   bic     r4,  r4,  #0x00400000
+
+   @ write back mdrefr
+   @
+   str     r4,  [r1, #MDREFR_OFFSET]
+
+   @ assert E1PIN
+   @
+   orr     r4,  r4,  #0x00008000
+
+   @ write back mdrefr
+   @
+   str     r4,  [r1, #MDREFR_OFFSET]
+   ldr     r4,  [r1, #MDREFR_OFFSET]
+   nop
+   nop
+#else
+   @ Step 2d
+   @ get the mdrefr settings
+   ldr     r3,  =CFG_MDREFR_VAL
+
+   @ write back mdrefr
+   @
+   str     r4,  [r1, #MDREFR_OFFSET]
+
+   @  Step 4
+
+   @ set K0RUN for CPLD clock
+   @
+   orr   r4,  r4,  #0x00002000
+
+   @ set K1RUN for bank 0
+   @
+   orr   r4,  r4,  #0x00010000
+
+   @ write back mdrefr
+   @
+   str     r4,  [r1, #MDREFR_OFFSET]
+   ldr     r4,  [r1, #MDREFR_OFFSET]
+
+   @ deassert SLFRSH
+   @
+   bic     r4,  r4,  #0x00400000
+
+   @ write back mdrefr
+   @
+   str     r4,  [r1, #MDREFR_OFFSET]
+
+   @ assert E1PIN
+   @
+   orr     r4,  r4,  #0x00008000
+
+   @ write back mdrefr
+   @
+   str     r4,  [r1, #MDREFR_OFFSET]
+   ldr     r4,  [r1, #MDREFR_OFFSET]
+   nop
+   nop
+#endif
+
+   @ Step 4d
+   @ fetch platform value of mdcnfg
+   @
+   ldr     r2,  =CFG_MDCNFG_VAL
+
+   @ disable all sdram banks
+   @
+   bic     r2,  r2,  #(MDCNFG_DE0 | MDCNFG_DE1)
+   bic     r2,  r2,  #(MDCNFG_DE2 | MDCNFG_DE3)
+
+   @ program banks 0/1 for bus width
+   @
+   bic   r2,  r2,  #MDCNFG_DWID0      @0=32-bit
+
+   @ write initial value of mdcnfg, w/o enabling sdram banks
+   @
+   str     r2,  [r1, #MDCNFG_OFFSET]
+
+   @ Step 4e
+   @ pause for 200 uSecs
+   @
+   ldr r3, =OSCR       @ reset the OS Timer Count to zero
+   mov r2, #0
+   str r2, [r3]
+   ldr r4, =0x300                      @ really 0x2E1 is about 200usec, so 0x300 should be plenty
+1:
+   ldr r2, [r3]
+   cmp r4, r2
+   bgt 1b
+
+   //SET_LED 5
+
+   /* Why is this here??? */
+   mov    r0, #0x78                @turn everything off
+   mcr    p15, 0, r0, c1, c0, 0      @(caches off, MMU off, etc.)
+
+   @ Step 4f
+   @ Access memory *not yet enabled* for CBR refresh cycles (8)
+   @ - CBR is generated for all banks
+
+   ldr     r2, =CFG_DRAM_BASE
+   str     r2, [r2]
+   str     r2, [r2]
+   str     r2, [r2]
+   str     r2, [r2]
+   str     r2, [r2]
+   str     r2, [r2]
+   str     r2, [r2]
+   str     r2, [r2]
+
+   @ Step 4g
+   @get memory controller base address
+   @
+   ldr     r1,  =MEMC_BASE
+
+   @fetch current mdcnfg value
+   @
+   ldr     r3,  [r1, #MDCNFG_OFFSET]
+
+   @enable sdram bank 0 if installed (must do for any populated bank)
+   @
+   orr     r3,  r3,  #MDCNFG_DE0
+
+   @write back mdcnfg, enabling the sdram bank(s)
+   @
+   str     r3,  [r1, #MDCNFG_OFFSET]
+
+   @ Step 4h
+   @ write mdmrs
+   @
+   ldr     r2,  =CFG_MDMRS_VAL
+   str     r2,  [r1, #MDMRS_OFFSET]
+
+   @ Done Memory Init
+
+   //SET_LED 6
+
+   @********************************************************************
+   @ Disable (mask) all interrupts at the interrupt controller
+   @
+
+   @ clear the interrupt level register (use IRQ, not FIQ)
+   @
+   mov     r1, #0
+   ldr     r2,  =ICLR
+   str     r1,  [r2]
+
+   @ Set interrupt mask register
+   @
+   ldr     r1,  =CFG_ICMR_VAL
+   ldr     r2,  =ICMR
+   str     r1,  [r2]
+
+   @ ********************************************************************
+   @ Disable the peripheral clocks, and set the core clock
+   @
+
+       @ Turn Off ALL on-chip peripheral clocks for re-configuration
+       @
+   ldr     r1,  =CKEN
+   mov     r2,  #0
+   str     r2,  [r1]
+
+   @ set core clocks
+   @
+   ldr     r2,  =CFG_CCCR_VAL
+   ldr     r1,  =CCCR
+   str     r2,  [r1]
+
+#ifdef ENABLE32KHZ
+   @ enable the 32Khz oscillator for RTC and PowerManager
+   @
+   ldr     r1,  =OSCC
+   mov     r2,  #OSCC_OON
+   str     r2,  [r1]
+
+   @ NOTE:  spin here until OSCC.OOK get set,
+   @        meaning the PLL has settled.
+   @
+60:
+   ldr     r2, [r1]
+   ands    r2, r2, #1
+   beq     60b
+#endif
+
+       @ Turn on needed clocks
+       @
+   ldr     r1,  =CKEN
+   ldr     r2,  =CFG_CKEN_VAL
+   str     r2,  [r1]
+
+   //SET_LED 7
+
+/* Is this needed???? */
+#define NODEBUG
+#ifdef NODEBUG
+   //Disable software and data breakpoints
+   mov   r0,#0
+   mcr   p15,0,r0,c14,c8,0  // ibcr0
+   mcr   p15,0,r0,c14,c9,0  // ibcr1
+   mcr   p15,0,r0,c14,c4,0  // dbcon
+
+   //Enable all debug functionality
+   mov   r0,#0x80000000
+   mcr   p14,0,r0,c10,c0,0  // dcsr
+
+#endif
+
+   //SET_LED 8
+
+   mov   pc, r10
+
+@ End memsetup
index 3c0dab9c1e53430f6809fa8b1059367f6e68f6f4..6e290efeef8aba8caa76f75f7de096a5a102d93e 100644 (file)
@@ -54,7 +54,7 @@ SECTIONS
   .text      :
   {
     cpu/mpc824x/start.o        (.text)
-               common/board.o (.text)
+    lib_ppc/board.o (.text)
     lib_ppc/ppcstring.o        (.text)
     lib_generic/vsprintf.o     (.text)
     lib_generic/crc32.o                (.text)
index cbcae7893f731c5e2ed0753b9af8c0f0485a0515..4a4552f4b3f39deaec3eaf2c106eca5d440ef52f 100644 (file)
@@ -61,31 +61,31 @@ SECTIONS
     /* WARNING - the following is hand-optimized to fit within */
     /* the sector layout of our flash chips!   XXX FIXME XXX   */
 
-    cpu/ppc4xx/start.o (.text)
+    cpu/ppc4xx/start.o         (.text)
     board/esd/ar405/init.o     (.text)
-    cpu/ppc4xx/traps.o (.text)
+    cpu/ppc4xx/traps.o         (.text)
     cpu/ppc4xx/interrupts.o    (.text)
-    cpu/ppc4xx/serial.o        (.text)
+    cpu/ppc4xx/serial.o                (.text)
     cpu/ppc4xx/cpu_init.o      (.text)
-    cpu/ppc4xx/speed.o (.text)
+    cpu/ppc4xx/speed.o         (.text)
     cpu/ppc4xx/405gp_enet.o    (.text)
-    common/dlmalloc.o  (.text)
+    common/dlmalloc.o          (.text)
     lib_generic/crc32.o                (.text)
-    lib_ppc/extable.o  (.text)
+    lib_ppc/extable.o          (.text)
+    lib_ppc/board.o            (.text)
     lib_generic/zlib.o         (.text)
 
-    common/cmd_boot.o  (.text)
-    common/cmd_bootm.o (.text)
-    common/cmd_flash.o (.text)
-    common/cmd_mem.o   (.text)
-    common/cmd_nvedit.o        (.text)
-    common/console.o   (.text)
-    common/lists.o     (.text)
-    common/board.o     (.text)
-    common/main.o      (.text)
+    common/cmd_boot.o          (.text)
+    common/cmd_bootm.o         (.text)
+    common/cmd_flash.o         (.text)
+    common/cmd_mem.o           (.text)
+    common/cmd_nvedit.o                (.text)
+    common/console.o           (.text)
+    common/lists.o             (.text)
+    common/main.o              (.text)
 
     . = env_offset;
-    common/environment.o(.text)
+    common/environment.o       (.text)
 
     *(.text)
     *(.fixup)
index 15f02843b111f59b85ec2389915c20397726ac6e..72015ffcafe0b70d93eb300e0d14e1c52374ceec 100644 (file)
@@ -61,32 +61,32 @@ SECTIONS
     /* WARNING - the following is hand-optimized to fit within */
     /* the sector layout of our flash chips!   XXX FIXME XXX   */
 
-    cpu/ppc4xx/start.o (.text)
+    cpu/ppc4xx/start.o         (.text)
     board/esd/canbt/init.o     (.text)
-    cpu/ppc4xx/traps.o (.text)
+    cpu/ppc4xx/traps.o         (.text)
     cpu/ppc4xx/interrupts.o    (.text)
-    cpu/ppc4xx/serial.o        (.text)
+    cpu/ppc4xx/serial.o                (.text)
     cpu/ppc4xx/cpu_init.o      (.text)
-    cpu/ppc4xx/speed.o (.text)
+    cpu/ppc4xx/speed.o         (.text)
     cpu/ppc4xx/405gp_enet.o    (.text)
-    common/dlmalloc.o  (.text)
-    lib_generic/crc32.o                (.text)
-    lib_ppc/extable.o  (.text)
+    common/dlmalloc.o          (.text)
+    lib_ppc/extable.o          (.text)
+    lib_ppc/board.o            (.text)
     lib_generic/zlib.o         (.text)
+    lib_generic/crc32.o                (.text)
 
-    common/cmd_boot.o  (.text)
-    common/cmd_bootm.o (.text)
-    common/cmd_flash.o (.text)
-    common/cmd_mem.o   (.text)
-    common/cmd_nvedit.o        (.text)
-    common/console.o   (.text)
-    common/lists.o     (.text)
-    common/board.o     (.text)
-    common/main.o      (.text)
-    net/net.o  (.text)
+    common/cmd_boot.o          (.text)
+    common/cmd_bootm.o         (.text)
+    common/cmd_flash.o         (.text)
+    common/cmd_mem.o           (.text)
+    common/cmd_nvedit.o                (.text)
+    common/console.o           (.text)
+    common/lists.o             (.text)
+    common/main.o              (.text)
+    net/net.o                  (.text)
 
 /*    . = env_offset;
-    common/environment.o(.text)
+    common/environment.o       (.text)
 */
 
     *(.text)
index d05440497998deff757327ddc38ac772c4c6115b..831fc0c14d19ee684e5f99a946e328322652e892 100644 (file)
@@ -61,26 +61,26 @@ SECTIONS
     /* WARNING - the following is hand-optimized to fit within */
     /* the sector layout of our flash chips!   XXX FIXME XXX   */
 
-    cpu/ppc4xx/start.o (.text)
-    cpu/ppc4xx/traps.o (.text)
+    cpu/ppc4xx/start.o         (.text)
+    cpu/ppc4xx/traps.o         (.text)
     cpu/ppc4xx/interrupts.o    (.text)
-    cpu/ppc4xx/serial.o        (.text)
+    cpu/ppc4xx/serial.o                (.text)
     cpu/ppc4xx/cpu_init.o      (.text)
-    cpu/ppc4xx/speed.o (.text)
-    common/dlmalloc.o  (.text)
-    lib_generic/crc32.o                (.text)
-    lib_ppc/extable.o  (.text)
+    cpu/ppc4xx/speed.o         (.text)
+    common/dlmalloc.o          (.text)
+    lib_ppc/extable.o          (.text)
+    lib_ppc/board.o            (.text)
     lib_generic/zlib.o         (.text)
+    lib_generic/crc32.o                (.text)
 
-    common/cmd_boot.o  (.text)
-    common/cmd_bootm.o (.text)
-    common/cmd_flash.o (.text)
-    common/cmd_mem.o   (.text)
-    common/cmd_nvedit.o        (.text)
-    common/console.o   (.text)
-    common/lists.o     (.text)
-    common/board.o     (.text)
-    common/main.o      (.text)
+    common/cmd_boot.o          (.text)
+    common/cmd_bootm.o         (.text)
+    common/cmd_flash.o         (.text)
+    common/cmd_mem.o           (.text)
+    common/cmd_nvedit.o                (.text)
+    common/console.o           (.text)
+    common/lists.o             (.text)
+    common/main.o              (.text)
 
     board/esd/dasa_sim/flash.o (.text)
     common/cmd_nvedit.o        (.text)
diff --git a/board/lubbock/Makefile b/board/lubbock/Makefile
new file mode 100644 (file)
index 0000000..2655d55
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# (C) Copyright 2000
+# 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   := lubbock.o flash.o env.o
+SOBJS  := memsetup.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/lubbock/armboot.lds b/board/lubbock/armboot.lds
new file mode 100644 (file)
index 0000000..2825f90
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * (C) Copyright 2000
+ * 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
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+        . = 0x00000000;
+
+        . = ALIGN(4);
+       .text      :
+       {
+         cpu/xscale/start.o    (.text)
+         *(.text)
+       }
+
+        . = ALIGN(4);
+        .rodata : { *(.rodata) }
+
+        . = ALIGN(4);
+        .data : { *(.data) }
+
+        . = ALIGN(4);
+        .got : { *(.got) }
+
+        . = ALIGN(4);
+        .bss : { *(.bss) }
+
+       armboot_end = .;
+}
diff --git a/board/lubbock/config.mk b/board/lubbock/config.mk
new file mode 100644 (file)
index 0000000..d6ec08c
--- /dev/null
@@ -0,0 +1,13 @@
+#
+# Linux-Kernel is expected to be at c000'8000, entry c000'8000
+#
+# we load ourself to c170'0000, the upper 1 MB of second bank
+#
+# download areas is c800'0000
+#
+
+
+#TEXT_BASE = 0xa1700000
+TEXT_BASE = 0xa3000000
+#TEXT_BASE = 0
+
diff --git a/board/lubbock/env.c b/board/lubbock/env.c
new file mode 100644 (file)
index 0000000..b0aca82
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.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 <ppcboot.h>
+
+static int check_crc(bd_t *bd)
+{
+    /* need to calculate crc? */
+    if (bd->bi_ext.env_crc_valid == 0)
+    {
+       env_t *env = (env_t *)CFG_ENV_ADDR;
+
+       if (crc32(0, env->data, sizeof(env->data)) == env->crc)
+         bd->bi_ext.env_crc_valid = 1;
+       else
+         bd->bi_ext.env_crc_valid = -1;
+    }
+    return bd->bi_ext.env_crc_valid > 0;
+}
+
+
+/*
+ * save environment buffer back to flash
+ * returns -1 on error, 0 if ok
+ */
+int board_env_save(bd_t *bd, env_t *env, int size)
+{
+    int rc;
+    ulong start_addr, end_addr;
+
+#if CFG_ENV_SIZE <= CFG_ENV_SECT_SIZE
+#error Make sure that CFG_ENV_SIZE <= CFG_ENV_SECT_SIZE
+#endif
+
+    start_addr = CFG_ENV_ADDR;
+    end_addr   = start_addr + CFG_ENV_SIZE - 1;
+
+    rc = flash_sect_protect(0, CFG_ENV_ADDR, end_addr);
+    if (rc < 0)
+      return rc;
+
+    rc = flash_sect_erase(start_addr, end_addr);
+    if (rc < 0)
+    {
+       flash_sect_protect(1, start_addr, end_addr);
+       flash_perror(rc);
+       return rc;
+    }
+
+    printf("Saving Environment to Flash...");
+    rc = flash_write((uchar*)env, start_addr, size);
+    if (rc < 0)
+      flash_perror(rc);
+    else
+      printf("done.\n");
+
+    (void)flash_sect_protect(1, start_addr, end_addr);
+
+    return 0;
+}
+
+/*
+ * copy environment to memory
+ * returns -1 on error, 0 if ok
+ */
+int board_env_copy(bd_t *bd, env_t *data, int size)
+{
+    env_t *env = (env_t *)CFG_ENV_ADDR;
+
+    if (check_crc(bd))
+    {
+       memcpy(data, env, sizeof(env_t));
+       return 0;
+    }
+
+    return -1;
+}
+
+/*
+ * try to read env character at offset #index
+ *
+ * called before the environment is copied to ram
+ * returns -1 on error, 0 if ok
+ */
+int board_env_getchar(bd_t * bd, int index, uchar *c)
+{
+    env_t *env = (env_t *)CFG_ENV_ADDR;
+
+    /* check environment crc */
+    if (index < sizeof(env->data) && check_crc(bd))
+    {
+       *c = env->data[index];
+       return 0;
+    }
+
+    return -1;
+}
+
+/*
+ * try to read env character at offset #index
+ *
+ * called before the environment is copied to ram
+ * returns -1 on error, 0 if ok
+ */
+uchar *board_env_getaddr(bd_t * bd, int index)
+{
+    env_t *env = (env_t *)CFG_ENV_ADDR;
+
+    /* check environment crc */
+    if (index < sizeof(env->data) && check_crc(bd))
+      return &env->data[index];
+
+    return 0;
+}
diff --git a/board/lubbock/flash.c b/board/lubbock/flash.c
new file mode 100644 (file)
index 0000000..7465dce
--- /dev/null
@@ -0,0 +1,363 @@
+/*
+ * (C) Copyright 2002
+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.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 <ppcboot.h>
+
+#define FLASH_BANK_SIZE 0x2000000
+#define MAIN_SECT_SIZE  0x40000         /* 2x16 = 256k per sector */
+
+flash_info_t    flash_info[CFG_MAX_FLASH_BANKS];
+
+
+/*-----------------------------------------------------------------------
+ */
+
+ulong flash_init(bd_t *bd)
+{
+    int i, j;
+    ulong size = 0;
+
+    for (i = 0; i < CFG_MAX_FLASH_BANKS; i++)
+    {
+       ulong flashbase = 0;
+       flash_info[i].flash_id =
+         (INTEL_MANUFACT & FLASH_VENDMASK) |
+         (INTEL_ID_28F128J3 & FLASH_TYPEMASK);
+       flash_info[i].size = FLASH_BANK_SIZE;
+       flash_info[i].sector_count = CFG_MAX_FLASH_SECT;
+       memset(flash_info[i].protect, 0, CFG_MAX_FLASH_SECT);
+        switch (i)
+        {
+           case 0:
+               flashbase = PHYS_FLASH_1;
+                break;
+           case 1:
+               flashbase = PHYS_FLASH_2;
+                break;
+           default:
+               panic("configured to many flash banks!\n");
+                break;
+        }
+       for (j = 0; j < flash_info[i].sector_count; j++)
+       {
+           flash_info[i].start[j] = flashbase + j*MAIN_SECT_SIZE;
+       }
+       size += flash_info[i].size;
+    }
+
+    /* Protect monitor and environment sectors
+     */
+    flash_protect(FLAG_PROTECT_SET,
+                 CFG_FLASH_BASE,
+                 CFG_FLASH_BASE + _armboot_end - _armboot_start,
+                 &flash_info[0]);
+
+    flash_protect(FLAG_PROTECT_SET,
+                 CFG_ENV_ADDR,
+                 CFG_ENV_ADDR + CFG_ENV_SIZE - 1,
+                 &flash_info[0]);
+
+    return size;
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info  (flash_info_t *info)
+{
+    int i, j;
+
+    for (j=0; j<CFG_MAX_FLASH_BANKS; j++)
+    {
+        switch (info->flash_id & FLASH_VENDMASK)
+        {
+        case (INTEL_MANUFACT & FLASH_VENDMASK):
+               printf("Intel: ");
+               break;
+        default:
+               printf("Unknown Vendor ");
+               break;
+        }
+
+        switch (info->flash_id & FLASH_TYPEMASK)
+        {
+        case (INTEL_ID_28F128J3 & FLASH_TYPEMASK):
+               printf("28F128J3 (128Mbit)\n");
+               break;
+        default:
+               printf("Unknown Chip Type\n");
+               goto Done;
+               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");
+        info++;
+    }
+
+Done:
+}
+
+/*-----------------------------------------------------------------------
+ */
+
+int    flash_erase (flash_info_t *info, int s_first, int s_last)
+{
+    int flag, prot, sect;
+    int rc = ERR_OK;
+
+    if (info->flash_id == FLASH_UNKNOWN)
+       return ERR_UNKNOWN_FLASH_TYPE;
+
+    if ((s_first < 0) || (s_first > s_last)) {
+       return ERR_INVAL;
+    }
+
+    if ((info->flash_id & FLASH_VENDMASK) !=
+       (INTEL_MANUFACT & FLASH_VENDMASK)) {
+       return ERR_UNKNOWN_FLASH_VENDOR;
+    }
+
+    prot = 0;
+    for (sect=s_first; sect<=s_last; ++sect) {
+       if (info->protect[sect]) {
+           prot++;
+       }
+    }
+    if (prot)
+       return ERR_PROTECTED;
+
+    /*
+     * Disable interrupts which might cause a timeout
+     * here. Remember that our exception vectors are
+     * at address 0 in the flash, and we don't want a
+     * (ticker) exception to happen while the flash
+     * chip is in programming mode.
+     */
+    flag = disable_interrupts();
+
+    /* Start erase on unprotected sectors */
+    for (sect = s_first; sect<=s_last && !ctrlc(); sect++) {
+
+       printf("Erasing sector %2d ... ", sect);
+
+       /* arm simple, non interrupt dependent timer */
+       reset_timer_masked();
+
+       if (info->protect[sect] == 0) { /* not protected */
+           vushort *addr = (vushort *)(info->start[sect]);
+
+           *addr = 0x20;       /* erase setup */
+           *addr = 0xD0;       /* erase confirm */
+
+           while ((*addr & 0x80) != 0x80) {
+               if (get_timer_masked() > CFG_FLASH_ERASE_TOUT) {
+                   *addr = 0xB0; /* suspend erase */
+                   *addr = 0xFF;       /* reset to read mode */
+                   rc = ERR_TIMOUT;
+                   goto outahere;
+               }
+           }
+
+           /* clear status register command */
+           *addr = 0x50;
+           /* reset to read mode */
+           *addr = 0xFF;
+       }
+       printf("ok.\n");
+    }
+    if (ctrlc())
+      printf("User Interrupt!\n");
+
+outahere:
+
+    /* allow flash to settle - wait 10 ms */
+    udelay_masked(10000);
+
+    if (flag)
+      enable_interrupts();
+
+    return rc;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash
+ */
+
+static int write_word (flash_info_t *info, ulong dest, ushort data)
+{
+    vushort *addr = (vushort *)dest, val;
+    int rc = ERR_OK;
+    int flag;
+
+    /* Check if Flash is (sufficiently) erased
+     */
+    if ((*addr & data) != data)
+        return ERR_NOT_ERASED;
+
+    /*
+     * Disable interrupts which might cause a timeout
+     * here. Remember that our exception vectors are
+     * at address 0 in the flash, and we don't want a
+     * (ticker) exception to happen while the flash
+     * chip is in programming mode.
+     */
+    flag = disable_interrupts();
+
+    /* clear status register command */
+    *addr = 0x50;
+
+    /* program set-up command */
+    *addr = 0x40;
+
+    /* latch address/data */
+    *addr = data;
+
+    /* arm simple, non interrupt dependent timer */
+    reset_timer_masked();
+
+    /* wait while polling the status register */
+    while(((val = *addr) & 0x80) != 0x80)
+    {
+       if (get_timer_masked() > CFG_FLASH_WRITE_TOUT) {
+           rc = ERR_TIMOUT;
+           /* suspend program command */
+           *addr = 0xB0;
+           goto outahere;
+       }
+    }
+
+    if(val & 0x1A) {   /* check for error */
+        printf("\nFlash write error %02x at address %08lx\n",
+          (int)val, (unsigned long)dest);
+        if(val & (1<<3)) {
+           printf("Voltage range error.\n");
+           rc = ERR_PROG_ERROR;
+           goto outahere;
+        }
+        if(val & (1<<1)) {
+           printf("Device protect error.\n");
+           rc = ERR_PROTECTED;
+           goto outahere;
+        }
+        if(val & (1<<4)) {
+           printf("Programming error.\n");
+           rc = ERR_PROG_ERROR;
+           goto outahere;
+        }
+        rc = ERR_PROG_ERROR;
+        goto outahere;
+    }
+
+outahere:
+    /* read array command */
+    *addr = 0xFF;
+
+    if (flag)
+      enable_interrupts();
+
+    return rc;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash.
+ */
+
+int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
+{
+    ulong cp, wp;
+    ushort data;
+    int l;
+    int i, rc;
+
+    wp = (addr & ~1);  /* get lower word aligned address */
+
+    /*
+     * 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 << 8);
+       }
+       for (; i<2 && cnt>0; ++i) {
+           data = (data >> 8) | (*src++ << 8);
+           --cnt;
+           ++cp;
+       }
+       for (; cnt==0 && i<2; ++i, ++cp) {
+           data = (data >> 8) | (*(uchar *)cp << 8);
+       }
+
+       if ((rc = write_word(info, wp, data)) != 0) {
+           return (rc);
+       }
+       wp += 2;
+    }
+
+    /*
+     * handle word aligned part
+     */
+    while (cnt >= 2) {
+       data = *((vushort*)src);
+       if ((rc = write_word(info, wp, data)) != 0) {
+           return (rc);
+       }
+       src += 2;
+       wp  += 2;
+       cnt -= 2;
+    }
+
+    if (cnt == 0) {
+       return ERR_OK;
+    }
+
+    /*
+     * handle unaligned tail bytes
+     */
+    data = 0;
+    for (i=0, cp=wp; i<2 && cnt>0; ++i, ++cp) {
+       data = (data >> 8) | (*src++ << 8);
+       --cnt;
+    }
+    for (; i<2; ++i, ++cp) {
+       data = (data >> 8) | (*(uchar *)cp << 8);
+    }
+
+    return write_word(info, wp, data);
+}
diff --git a/board/lubbock/lubbock.c b/board/lubbock/lubbock.c
new file mode 100644 (file)
index 0000000..0900156
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * (C) Copyright 2002
+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.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 <ppcboot.h>
+
+/* ------------------------------------------------------------------------- */
+
+
+/*
+ * Miscelaneous platform dependent initialisations
+ */
+
+int board_init(bd_t *bd)
+{
+    /* memory and cpu-speed are setup before relocation */
+    /* so we do _nothing_ here */
+
+    /* arch number of Lubbock-Board */
+    bd->bi_arch_number = 89;
+
+    /* adress of boot parameters */
+    bd->bi_boot_params = 0xa0000100;
+
+    return 1;
+}
+
+int dram_init(bd_t *bd)
+{
+    bd->bi_dram[0].start = PHYS_SDRAM_1;
+    bd->bi_dram[0].size  = PHYS_SDRAM_1_SIZE;
+    bd->bi_dram[1].start = PHYS_SDRAM_2;
+    bd->bi_dram[1].size  = PHYS_SDRAM_2_SIZE;
+    bd->bi_dram[2].start = PHYS_SDRAM_3;
+    bd->bi_dram[2].size  = PHYS_SDRAM_3_SIZE;
+    bd->bi_dram[3].start = PHYS_SDRAM_4;
+    bd->bi_dram[3].size  = PHYS_SDRAM_4_SIZE;
+    return PHYS_SDRAM_1_SIZE + PHYS_SDRAM_2_SIZE + PHYS_SDRAM_3_SIZE + PHYS_SDRAM_4_SIZE;
+}
diff --git a/board/lubbock/memsetup.S b/board/lubbock/memsetup.S
new file mode 100644 (file)
index 0000000..3d69083
--- /dev/null
@@ -0,0 +1,749 @@
+/*
+ * Most of this taken from Redboot hal_platform_setup.h with cleanup
+ *
+ * NOTE: I haven't clean this up considerably, just enough to get it
+ * running. See hal_platform_setup.h for the source. See
+ * board/cradle/memsetup.S for another PXA250 setup that is
+ * much cleaner.
+ *
+ * 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>
+#include <asm/arch/pxa-regs.h>
+
+DRAM_SIZE:  .long   CFG_DRAM_SIZE
+
+// wait for coprocessor write complete
+   .macro CPWAIT reg
+   mrc  p15,0,\reg,c2,c0,0
+   mov  \reg,\reg
+   sub  pc,pc,#4
+   .endm
+
+
+.globl memsetup
+memsetup:
+
+    mov      r10, lr
+
+    /* Set up GPIO pins first */
+
+       ldr             r0,     =GPSR0
+       ldr             r1,     =CFG_GPSR0_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GPSR1
+       ldr             r1,     =CFG_GPSR1_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GPSR2
+       ldr             r1,     =CFG_GPSR2_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GPCR0
+       ldr             r1,     =CFG_GPCR0_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GPCR1
+       ldr             r1,     =CFG_GPCR1_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GPCR2
+       ldr             r1,     =CFG_GPCR2_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GPDR0
+       ldr             r1,     =CFG_GPDR0_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GPDR1
+       ldr             r1,     =CFG_GPDR1_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GPDR2
+       ldr             r1,     =CFG_GPDR2_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GAFR0_L
+       ldr             r1,     =CFG_GAFR0_L_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GAFR0_U
+       ldr             r1,     =CFG_GAFR0_U_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GAFR1_L
+       ldr             r1,     =CFG_GAFR1_L_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GAFR1_U
+       ldr             r1,     =CFG_GAFR1_U_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GAFR2_L
+       ldr             r1,     =CFG_GAFR2_L_VAL
+       str             r1,   [r0]
+
+       ldr             r0,     =GAFR2_U
+       ldr             r1,     =CFG_GAFR2_U_VAL
+       str             r1,   [r0]
+
+   // enable GPIO pins
+       ldr             r0,     =PSSR
+       ldr             r1,     =CFG_PSSR_VAL
+       str             r1,   [r0]
+
+   ldr    r3, =MSC1                            // low - bank 2 Lubbock Registers / SRAM
+   ldr    r2, =CFG_MSC1_VAL                    // high - bank 3 Ethernet Controller
+   str    r2, [r3]                             // need to set MSC1 before trying to write to the HEX LEDs
+   ldr    r2, [r3]                             // need to read it back to make sure the value latches (see MSC section of manual)
+
+   ldr    r1, =LED_BLANK
+   mov    r0, #0xFF
+   str    r0, [r1]             // turn on hex leds
+
+loop:
+   ldr         r0, =0xB0070001
+   ldr         r1, =_LED
+   str         r0, [r1]                                                        // hex display
+
+/*********************************************************************
+    Initlialize Memory Controller
+        The sequence below is based on the recommended init steps detailed
+        in the EAS, chapter 5 (Chapter 10, Operating Systems Developers Guide)
+
+
+    pause for 200 uSecs- allow internal clocks to settle
+        *Note: only need this if hard reset... doing it anyway for now
+*/
+
+       @ ---- Wait 200 usec
+       ldr r3, =OSCR       @ reset the OS Timer Count to zero
+       mov r2, #0
+       str r2, [r3]
+       ldr r4, =0x300                  @ really 0x2E1 is about 200usec, so 0x300 should be plenty
+1:
+       ldr r2, [r3]
+       cmp r4, r2
+       bgt 1b
+
+mem_init:
+        @ get memory controller base address
+        ldr     r1,  =MEMC_BASE
+
+@****************************************************************************
+@  Step 1
+@
+
+        @ write msc0, read back to ensure data latches
+        @
+        ldr     r2,   =CFG_MSC0_VAL
+        str     r2,   [r1, #MSC0_OFFSET]
+        ldr     r2,   [r1, #MSC0_OFFSET]
+
+        @ write msc1
+        ldr     r2,  =CFG_MSC1_VAL
+        str     r2,  [r1, #MSC1_OFFSET]
+        ldr     r2,  [r1, #MSC1_OFFSET]
+
+        @ write msc2
+        ldr     r2,  =CFG_MSC2_VAL
+        str     r2,  [r1, #MSC2_OFFSET]
+        ldr     r2,  [r1, #MSC2_OFFSET]
+
+        @ write mecr
+        ldr     r2,  =CFG_MECR_VAL
+        str     r2,  [r1, #MECR_OFFSET]
+
+        @ write mcmem0
+        ldr     r2,  =CFG_MCMEM0_VAL
+        str     r2,  [r1, #MCMEM0_OFFSET]
+
+        @ write mcmem1
+        ldr     r2,  =CFG_MCMEM1_VAL
+        str     r2,  [r1, #MCMEM1_OFFSET]
+
+        @ write mcatt0
+        ldr     r2,  =CFG_MCATT0_VAL
+        str     r2,  [r1, #MCATT0_OFFSET]
+
+        @ write mcatt1
+        ldr     r2,  =CFG_MCATT1_VAL
+        str     r2,  [r1, #MCATT1_OFFSET]
+
+        @ write mcio0
+        ldr     r2,  =CFG_MCIO0_VAL
+        str     r2,  [r1, #MCIO0_OFFSET]
+
+        @ write mcio1
+        ldr     r2,  =CFG_MCIO1_VAL
+        str     r2,  [r1, #MCIO1_OFFSET]
+
+        @-------------------------------------------------------
+        @ 3rd bullet, Step 1
+        @
+
+        @ get the mdrefr settings
+        ldr     r3,  =CFG_MDREFR_VAL_100
+
+        @ extract DRI field (we need a valid DRI field)
+        @
+        ldr     r2,  =0xFFF
+
+        @ valid DRI field in r3
+        @
+        and     r3,  r3,  r2
+
+        @ get the reset state of MDREFR
+        @
+        ldr     r4,  [r1, #MDREFR_OFFSET]
+
+        @ clear the DRI field
+        @
+        bic     r4,  r4,  r2
+
+        @ insert the valid DRI field loaded above
+        @
+        orr     r4,  r4,  r3
+
+        @ write back mdrefr
+        @
+        str     r4,  [r1, #MDREFR_OFFSET]
+
+        @ *Note: preserve the mdrefr value in r4 *
+
+@****************************************************************************
+@  Step 2
+@
+        /* This should be for SRAM, why is it commented out??? */
+
+        @ fetch sxcnfg value
+        @
+        @ldr     r2,  =0
+        @ write back sxcnfg
+        @str     r2,  [r1, #SXCNFG_OFFSET]
+
+//        @if sxcnfg=0, don't program for synch-static memory
+        @cmp     r2,  #0
+        @beq     1f
+
+        @program sxmrs
+        @ldr     r2,  =SXMRS_SETTINGS
+        @str     r2,  [r1, #SXMRS_OFFSET]
+
+
+@****************************************************************************
+@  Step 3
+@
+
+        @ Assumes previous mdrefr value in r4, if not then read current mdrefr
+
+        @ clear the free-running clock bits
+        @ (clear K0Free, K1Free, K2Free
+        @
+        bic     r4,  r4,  #(0x00800000 | 0x01000000 | 0x02000000)
+
+        @ set K1RUN if bank 0 installed
+        @
+        orr   r4,  r4,  #0x00010000
+
+
+
+#ifdef THIS
+@<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<
+@<!<!<!<!<!<!<!<!<!<!<!  Begin INSERT 1    <!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<
+        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+        @ Lubbock: Allow the user to select the {T/R/M} with predetermined
+        @   SDCLK.  Based on Table 3-1 in PXA250 and PXA210 Dev Man.
+        @
+        @  * = Must set MDREFR.K1DB2 to halve the MemClk for desired SDCLK[1]
+        @
+        @   S25, S26 used to provide all 400 MHz BIN values for Cotulla (0,0 - 1,3)
+        @   S25, S26 used to provide all 200 MHz BIN values for Sabinal
+        @
+        @   S23: Force the halving of MemClk when deriving SDCLK[1]
+        @        DOT: no override  !DOT: halve (if not already forced half)
+//        @        *For certain MemClks, SDCLK's derivation is forced to be halved
+        @
+        @   S24: Run/Turbo.
+        @        DOT: Run mode   !DOT: Turbo mode
+        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+        @
+        @ Allow the user to control K1DB2 where applicable
+        @
+        @ Get the value of S23:          @ 1 = DOT (unity), 0 = !DOT (halve it)
+        @
+        @ DOT:   set K1DB2     (SDCLD = MemClk)
+        @ !DOT:  clear K1DB2   (SDCLK = MemClk/2)
+        @
+        @ldr r2, =FPGA_REGS_BASE_PHYSICAL
+
+        bl GET_S23                          @ r3, r2                    @ get the value of S23 in R0, i put the base adx of fpga in r3
+
+        cmp      r3, #0x0                 @ is !DOT?
+        orreq    r4, r4,  #0x00020000     @ SDClk[1] = MemClk/2
+        bicne    r4, r4,  #0x00020000     @ SDClk[1] = MemClk
+
+        @
+        @ Next, we need to look for S25,S26 selections that necessitate the
+        @  halving of MemClk to derive SDCLK[1]: (S25,S26)={03-0C, 10-13}
+        @ Override above S23-based selection accordingly.
+        @
+        ldr r2, =FPGA_REGS_BASE_PHYSICAL
+        bl  GET_S25                           @ r0, r2
+                                       @ get the value of S25 in R0, i put the base adx of fpga in r2
+
+
+
+        ldr r2, =FPGA_REGS_BASE_PHYSICAL
+        BL  GET_S26                              @ r3, r2
+                                      @ get the value of S26 in R1, i put the base adx of fpga in r2
+
+        orr     r0, r0, r3               @ concatenate S25 & S26 vals
+        and     r0, r0, #0xFF
+
+        @ Set K1DB2 for the frequencies that require it
+        @
+        cmp     r0, #0x03
+        cmpne   r0, #0x04
+        cmpne   r0, #0x05
+        cmpne   r0, #0x06
+        cmpne   r0, #0x07
+        cmpne   r0, #0x08
+        cmpne   r0, #0x09
+        cmpne   r0, #0x0A
+        cmpne   r0, #0x0B
+        cmpne   r0, #0x0C
+        cmpne   r0, #0x10
+        cmpne   r0, #0x11
+        cmpne   r0, #0x12
+        cmpne   r0, #0x13
+        orreq   r4, r4,  #0x00020000     @ SDCLK[1] = (MemClk)/2 for 03 - 0C @ 10 - 13
+
+        @
+        @ *Must make MSC0&1 adjustments now for MEMClks > 100MHz.
+        @
+        @ Adjust MSC0 for MemClks > 100 MHz
+        @
+        ldreq   r0,   [r1, #MSC0_OFFSET]
+        ldreq   r3,   =0x7F007F00
+        biceq   r0,   r0, r3                @ clear MSC0[14:12, 11:8] (RRR, RDN)
+        ldreq   r3,   =0x46004600
+        orreq   r0,   r0, r3                @ set   MSC0[14, 10:9]  (doubling RRR, RDN)
+        streq   r0,   [r1, #MSC0_OFFSET]
+        ldreq   r0,   [r1, #MSC0_OFFSET]    @ read it back to ensure that the data latches
+
+        @
+        @ Adjust MSC1.LH for MemClks > 100 MHz
+        @
+        ldreq   r0,   [r1, #MSC1_OFFSET]
+        ldreq   r3,   =0x7FF0
+        biceq   r0,   r0, r3               @ clear MSC1[14:12, 11:8, 7:4] (RRR, RDN, RDF)
+        ldreq   r3,   =0x4880
+        orreq   r0,   r0, r3               @ set   MSC1[14, 11, 7]  (doubling RRR, RDN, RDF)
+        streq   r0,   [r1, #MSC1_OFFSET]
+        ldreq   r0,   [r1, #MSC1_OFFSET]   @ read it back to ensure that the data latches
+
+        @                                                                   @
+        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+#endif
+
+@<!<!<!<!<!<!<!<!<!<!<!    End INSERT 1    <!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<
+@<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<
+
+
+        @ write back mdrefr
+        @
+        str     r4,  [r1, #MDREFR_OFFSET]
+        ldr     r4,  [r1, #MDREFR_OFFSET]
+
+        @ deassert SLFRSH
+        @
+        bic     r4,  r4,  #0x00400000
+
+        @ write back mdrefr
+        @
+        str     r4,  [r1, #MDREFR_OFFSET]
+
+        @ assert E1PIN
+        @
+        orr     r4,  r4,  #0x00008000
+
+        @ write back mdrefr
+        @
+        str     r4,  [r1, #MDREFR_OFFSET]
+        ldr     r4,  [r1, #MDREFR_OFFSET]
+        nop
+        nop
+
+
+@****************************************************************************
+@  Step 4
+@
+
+        @ fetch platform value of mdcnfg
+        @
+        ldr     r2,  =CFG_MDCNFG_VAL
+
+        @ disable all sdram banks
+        @
+        bic     r2,  r2,  #(MDCNFG_DE0 | MDCNFG_DE1)
+        bic     r2,  r2,  #(MDCNFG_DE2 | MDCNFG_DE3)
+
+        @ program banks 0/1 for bus width
+        @
+        bic   r2,  r2,  #MDCNFG_DWID0      @0=32-bit
+
+
+        @ write initial value of mdcnfg, w/o enabling sdram banks
+        @
+        str     r2,  [r1, #MDCNFG_OFFSET]
+
+@ ****************************************************************************
+@  Step 5
+@
+
+        @ pause for 200 uSecs
+        @
+       ldr r3, =OSCR   @reset the OS Timer Count to zero
+       mov r2, #0
+           str r2, [r3]
+           ldr r4, =0x300                      @really 0x2E1 is about 200usec, so 0x300 should be plenty
+1:
+           ldr r2, [r3]
+           cmp r4, r2
+           bgt 1b
+
+
+@****************************************************************************
+@  Step 6
+@
+
+           mov    r0, #0x78                                @turn everything off
+      mcr    p15, 0, r0, c1, c0, 0             @(caches off, MMU off, etc.)
+
+
+@ ****************************************************************************
+@  Step 7
+@
+        @ Access memory *not yet enabled* for CBR refresh cycles (8)
+        @ - CBR is generated for all banks
+
+           ldr     r2, =CFG_DRAM_BASE
+           str     r2, [r2]
+           str     r2, [r2]
+           str     r2, [r2]
+           str     r2, [r2]
+           str     r2, [r2]
+           str     r2, [r2]
+           str     r2, [r2]
+           str     r2, [r2]
+
+
+@ ****************************************************************************
+@  Step 8: NOP (enable dcache if you wanna... we dont)
+@
+
+
+@ ****************************************************************************
+@  Step 9
+@
+
+
+        @get memory controller base address
+        @
+        ldr     r1,  =MEMC_BASE
+
+        @fetch current mdcnfg value
+        @
+        ldr     r3,  [r1, #MDCNFG_OFFSET]
+
+        @enable sdram bank 0 if installed (must do for any populated bank)
+        @
+        orr     r3,  r3,  #MDCNFG_DE0
+
+        @write back mdcnfg, enabling the sdram bank(s)
+        @
+        str     r3,  [r1, #MDCNFG_OFFSET]
+
+
+@****************************************************************************
+@  Step 10
+@
+
+        @ write mdmrs
+        @
+        ldr     r2,  =CFG_MDMRS_VAL
+        str     r2,  [r1, #MDMRS_OFFSET]
+
+
+@****************************************************************************
+@  Step 11: Final Step
+@
+
+@INITINTC
+        @********************************************************************
+        @ Disable (mask) all interrupts at the interrupt controller
+        @
+
+        @ clear the interrupt level register (use IRQ, not FIQ)
+        @
+        mov     r1, #0
+        ldr     r2,  =ICLR
+        str     r1,  [r2]
+
+        @ mask all interrupts at the controller
+        @
+        ldr     r2,  =ICMR
+        str     r1,  [r2]
+
+
+@INITCLKS
+        @ ********************************************************************
+        @ Disable the peripheral clocks, and set the core clock
+        @ frequency (hard-coding at 398.12MHz for now).
+        @
+
+               @ Turn Off ALL on-chip peripheral clocks for re-configuration
+               @ *Note: See label 'ENABLECLKS' for the re-enabling
+               @
+        ldr     r1,  =CKEN
+        mov     r2,  #0
+        str     r2,  [r1]
+
+
+        @ default value in case no valid rotary switch setting is found
+        ldr     r2, =(CCCR_L27 | CCCR_M2 | CCCR_N10)        @ DEFAULT: {200/200/100}
+
+
+        @... and write the core clock config register
+        @
+        ldr     r1,  =CCCR
+        str     r2,  [r1]
+
+/*        @ enable the 32Khz oscillator for RTC and PowerManager
+        @
+        ldr     r1,  =OSCC
+        mov     r2,  #OSCC_OON
+        str     r2,  [r1]
+
+
+        @ NOTE:  spin here until OSCC.OOK get set,
+        @        meaning the PLL has settled.
+        @
+60:
+        ldr     r2, [r1]
+        ands    r2, r2, #1
+        beq     60b
+*/
+
+@OSCC_OON_DONE
+
+
+#ifdef  A0_COTULLA
+    @****************************************************************************
+    @ !!! Take care of A0 Errata Sighting #4 --
+    @ after a frequency change, the memory controller must be restarted
+    @
+
+        @ get memory controller base address
+        ldr     r1,  =MEMC_BASE
+
+        @ get the current state of MDREFR
+        @
+        ldr     r2,  [r1, #MDREFR_OFFSET]
+
+        @ clear E0PIN, E1PIN
+        @
+        bic     r3,  r2,  #(MDREFR_E0PIN | MDREFR_E1PIN)
+
+        @ write MDREFR with E0PIN, E1PIN cleared (disable sdclk[0,1])
+        @
+        str     r3,  [r1, #MDREFR_OFFSET]
+
+        @ then write MDREFR with E0PIN, E1PIN set (enable sdclk[0,1])
+        @
+        str     r2,  [r1, #MDREFR_OFFSET]
+
+        @ get the current state of MDCNFG
+        @
+        ldr     r3,  [r1, #MDCNFG_OFFSET]
+
+        @ disable all SDRAM banks
+        @
+        bic     r3,  r3,  #(MDCNFG_DE0 | MDCNFG_DE1)
+        bic     r3,  r3,  #(MDCNFG_DE2 |  MDCNFG_DE3)
+
+        @ write back MDCNFG
+        @
+        ldr     r3,  [r1, #MDCNFG_OFFSET]
+
+           @ Access memory not yet enabled for CBR refresh cycles (8)
+        @ - CBR is generated for *all* banks
+           ldr     r2, =CFG_DRAM_BASE
+           str     r2, [r2]
+           str     r2, [r2]
+           str     r2, [r2]
+           str     r2, [r2]
+           str     r2, [r2]
+           str     r2, [r2]
+           str     r2, [r2]
+           str     r2, [r2]
+
+        @ fetch current mdcnfg value
+        @
+        ldr     r3,  [r1, #MDCNFG_OFFSET]
+
+        @ enable sdram bank 0 if installed
+        @
+        orr     r3,  r3,  #MDCNFG_DE0
+
+        @ write back mdcnfg, enabling the sdram bank(s)
+        @
+        str     r3,  [r1, #MDCNFG_OFFSET]
+
+        @ write mdmrs
+        @
+        ldr     r2,  =CFG_MDMRS_VAL
+        str     r2,  [r1, #MDMRS_OFFSET]
+
+
+
+    //    @ errata: don't enable auto power-down
+        @ get current value of mdrefr
+        @ldr     r3,  [r1, #MDREFR_OFFSET]
+        @ enable auto-power down
+        @orr     r3,  r3,  #MDREFR_APD
+        @write back mdrefr
+        @str     r3,  [r1, #MDREFR_OFFSET]
+
+#endif A0_Cotulla
+
+
+  ldr     r0, =0x000C0dE3
+  ldr          r1, =_LED
+  str          r0, [r1]                // hex display
+
+@ ^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%
+@ ^%^%^%^%^%^%^%^%^%   above could be replaced by prememLLI ^%^%^%^%^%^%^%^%^%
+@ ^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%
+
+
+       // Save SDRAM size
+    ldr     r1, =DRAM_SIZE
+        str       r8, [r1]
+
+    ldr     r0, =0xC0DE0006
+    ldr        r1, =_LED
+    str        r0, [r1]                // hex display
+
+       // Interrupt init
+       // Mask all interrupts
+    ldr        r0, =ICMR // enable no sources
+       mov r1, #0
+    str r1, [r0]
+
+#define NODEBUG
+#ifdef NODEBUG
+       //Disable software and data breakpoints
+       mov     r0,#0
+       mcr     p15,0,r0,c14,c8,0  // ibcr0
+       mcr     p15,0,r0,c14,c9,0  // ibcr1
+       mcr     p15,0,r0,c14,c4,0  // dbcon
+
+       //Enable all debug functionality
+       mov     r0,#0x80000000
+       mcr     p14,0,r0,c10,c0,0  // dcsr
+
+#endif
+
+       ldr     r0, =0xBEEF001D
+    ldr        r1, =_LED
+    str        r0, [r1]                // hex display
+
+       mov     pc, r10
+
+@ End memsetup
+
+@ %%%%%%%%%%%   Useful subroutines
+GET_S23:
+    @ This macro will read S23 and return its value in r3
+    @ r2 contains the base address of the Lubbock user registers
+    ldr r2, =FPGA_REGS_BASE_PHYSICAL
+
+    //@ read S23's value
+    ldr     r3, [r2, #USER_SWITCHES_OFFSET]
+
+    @ mask out irrelevant bits
+    and     r3, r3, #0x200
+
+    @ get bit into position 0
+    mov     r3, r3, LSR #9
+
+    mov     pc, lr
+@ End GET_S23
+
+
+GET_S24:
+    @ This macro will read S24 and return its value in r0
+    @ r2 contains the base address of the Lubbock user registers
+    ldr r2, =FPGA_REGS_BASE_PHYSICAL
+
+    //@ read S24's value
+    ldr     r0, [r2, #USER_SWITCHES_OFFSET]
+
+    @ mask out irrelevant bits
+    and     r0, r0, #0x100
+
+    @ get bit into position 0
+    mov     r0, r0, LSR #8
+
+    mov     pc, lr
+@ End GET_S23
+
+
+GET_S25:
+    @ This macro will read rotary S25 and return its value in r0
+    @ r2 contains the base address of the Lubbock user registers
+    @ read the user switches register
+    ldr     r0, [r2, #USER_SWITCHES_OFFSET]
+
+    @ mask out irrelevant bits
+    and     r0, r0, #0xF0
+
+    mov     pc, lr
+@ End subroutine
+
+
+GET_S26:
+    @ This macro will read rotary S26 and return its value in r3
+    @ r2 contains the base address of the Lubbock user registers
+    @ read the user switches register
+    ldr     r3, [r2, #USER_SWITCHES_OFFSET]
+
+    @ mask out irrelevant bits
+    and     r3, r3, #0x0F
+
+    mov     pc, lr
+@ End subroutine GET_S26
+
+
index ca6e77c329d3c56535b7a0e87f3d35371a5874cd..812112253f4f022e075e5045f38ab80b999b17d6 100644 (file)
@@ -53,9 +53,9 @@ SECTIONS
   .plt : { *(.plt) }
   .text      :
   {
-    cpu/mpc824x/start.o        (.text)
-    common/board.o (.text)
-    lib_ppc/ppcstring.o        (.text)
+    cpu/mpc824x/start.o                (.text)
+    lib_ppc/board.o            (.text)
+    lib_ppc/ppcstring.o                (.text)
     lib_generic/vsprintf.o     (.text)
     lib_generic/crc32.o                (.text)
     lib_generic/zlib.o         (.text)
index 3c0dab9c1e53430f6809fa8b1059367f6e68f6f4..627a53b3b600900927e95521ca56993867ba5bdd 100644 (file)
@@ -53,17 +53,17 @@ SECTIONS
   .plt : { *(.plt) }
   .text      :
   {
-    cpu/mpc824x/start.o        (.text)
-               common/board.o (.text)
-    lib_ppc/ppcstring.o        (.text)
+    cpu/mpc824x/start.o                (.text)
+    lib_ppc/board.o            (.text)
+    lib_ppc/ppcstring.o                (.text)
     lib_generic/vsprintf.o     (.text)
     lib_generic/crc32.o                (.text)
     lib_generic/zlib.o         (.text)
 
-               . = DEFINED(env_offset) ? env_offset : .;
+       . = DEFINED(env_offset) ? env_offset : .;
     common/environment.o (.text)
 
-               *(.text)
+       *(.text)
 
     *(.fixup)
     *(.got1)
index 5cf623cccdecfabb021c07674c53907d6c640547..c7e6ac02d917eb9c8a6d887cbede2de58bde27b3 100644 (file)
@@ -33,34 +33,34 @@ SECTIONS
   .hash          : { *(.hash)          }
   .dynsym        : { *(.dynsym)                }
   .dynstr        : { *(.dynstr)                }
-  .rel.text      : { *(.rel.text)              }
+  .rel.text      : { *(.rel.text)      }
   .rela.text     : { *(.rela.text)     }
-  .rel.data      : { *(.rel.data)              }
+  .rel.data      : { *(.rel.data)      }
   .rela.data     : { *(.rela.data)     }
   .rel.rodata    : { *(.rel.rodata)    }
   .rela.rodata   : { *(.rela.rodata)   }
-  .rel.got       : { *(.rel.got)               }
-  .rela.got      : { *(.rela.got)              }
+  .rel.got       : { *(.rel.got)       }
+  .rela.got      : { *(.rela.got)      }
   .rel.ctors     : { *(.rel.ctors)     }
   .rela.ctors    : { *(.rela.ctors)    }
   .rel.dtors     : { *(.rel.dtors)     }
   .rela.dtors    : { *(.rela.dtors)    }
-  .rel.bss       : { *(.rel.bss)               }
-  .rela.bss      : { *(.rela.bss)              }
-  .rel.plt       : { *(.rel.plt)               }
-  .rela.plt      : { *(.rela.plt)              }
-  .init          : { *(.init)  }
+  .rel.bss       : { *(.rel.bss)       }
+  .rela.bss      : { *(.rela.bss)      }
+  .rel.plt       : { *(.rel.plt)       }
+  .rela.plt      : { *(.rela.plt)      }
+  .init          : { *(.init)          }
   .plt : { *(.plt) }
   .text      :
   {
     cpu/mpc824x/start.o        (.text)
-               common/board.o (.text)
+    lib_ppc/board.o    (.text)
     lib_ppc/ppcstring.o        (.text)
 
-               . = DEFINED(env_offset) ? env_offset : .;
+       . = DEFINED(env_offset) ? env_offset : .;
     common/environment.o (.text)
 
-               *(.text)
+       *(.text)
 
     *(.fixup)
     *(.got1)
index 3c0dab9c1e53430f6809fa8b1059367f6e68f6f4..4370e0843255089a471193ccc0dd5e327d2fb8e4 100644 (file)
@@ -33,37 +33,37 @@ SECTIONS
   .hash          : { *(.hash)          }
   .dynsym        : { *(.dynsym)                }
   .dynstr        : { *(.dynstr)                }
-  .rel.text      : { *(.rel.text)              }
+  .rel.text      : { *(.rel.text)      }
   .rela.text     : { *(.rela.text)     }
-  .rel.data      : { *(.rel.data)              }
+  .rel.data      : { *(.rel.data)      }
   .rela.data     : { *(.rela.data)     }
   .rel.rodata    : { *(.rel.rodata)    }
   .rela.rodata   : { *(.rela.rodata)   }
-  .rel.got       : { *(.rel.got)               }
-  .rela.got      : { *(.rela.got)              }
+  .rel.got       : { *(.rel.got)       }
+  .rela.got      : { *(.rela.got)      }
   .rel.ctors     : { *(.rel.ctors)     }
   .rela.ctors    : { *(.rela.ctors)    }
   .rel.dtors     : { *(.rel.dtors)     }
   .rela.dtors    : { *(.rela.dtors)    }
-  .rel.bss       : { *(.rel.bss)               }
-  .rela.bss      : { *(.rela.bss)              }
-  .rel.plt       : { *(.rel.plt)               }
-  .rela.plt      : { *(.rela.plt)              }
-  .init          : { *(.init)  }
+  .rel.bss       : { *(.rel.bss)       }
+  .rela.bss      : { *(.rela.bss)      }
+  .rel.plt       : { *(.rel.plt)       }
+  .rela.plt      : { *(.rela.plt)      }
+  .init          : { *(.init)          }
   .plt : { *(.plt) }
   .text      :
   {
-    cpu/mpc824x/start.o        (.text)
-               common/board.o (.text)
-    lib_ppc/ppcstring.o        (.text)
+    cpu/mpc824x/start.o                (.text)
+    lib_ppc/board.o            (.text)
+    lib_ppc/ppcstring.o                (.text)
     lib_generic/vsprintf.o     (.text)
     lib_generic/crc32.o                (.text)
     lib_generic/zlib.o         (.text)
 
-               . = DEFINED(env_offset) ? env_offset : .;
+       . = DEFINED(env_offset) ? env_offset : .;
     common/environment.o (.text)
 
-               *(.text)
+       *(.text)
 
     *(.fixup)
     *(.got1)
index 5cf623cccdecfabb021c07674c53907d6c640547..c7e6ac02d917eb9c8a6d887cbede2de58bde27b3 100644 (file)
@@ -33,34 +33,34 @@ SECTIONS
   .hash          : { *(.hash)          }
   .dynsym        : { *(.dynsym)                }
   .dynstr        : { *(.dynstr)                }
-  .rel.text      : { *(.rel.text)              }
+  .rel.text      : { *(.rel.text)      }
   .rela.text     : { *(.rela.text)     }
-  .rel.data      : { *(.rel.data)              }
+  .rel.data      : { *(.rel.data)      }
   .rela.data     : { *(.rela.data)     }
   .rel.rodata    : { *(.rel.rodata)    }
   .rela.rodata   : { *(.rela.rodata)   }
-  .rel.got       : { *(.rel.got)               }
-  .rela.got      : { *(.rela.got)              }
+  .rel.got       : { *(.rel.got)       }
+  .rela.got      : { *(.rela.got)      }
   .rel.ctors     : { *(.rel.ctors)     }
   .rela.ctors    : { *(.rela.ctors)    }
   .rel.dtors     : { *(.rel.dtors)     }
   .rela.dtors    : { *(.rela.dtors)    }
-  .rel.bss       : { *(.rel.bss)               }
-  .rela.bss      : { *(.rela.bss)              }
-  .rel.plt       : { *(.rel.plt)               }
-  .rela.plt      : { *(.rela.plt)              }
-  .init          : { *(.init)  }
+  .rel.bss       : { *(.rel.bss)       }
+  .rela.bss      : { *(.rela.bss)      }
+  .rel.plt       : { *(.rel.plt)       }
+  .rela.plt      : { *(.rela.plt)      }
+  .init          : { *(.init)          }
   .plt : { *(.plt) }
   .text      :
   {
     cpu/mpc824x/start.o        (.text)
-               common/board.o (.text)
+    lib_ppc/board.o    (.text)
     lib_ppc/ppcstring.o        (.text)
 
-               . = DEFINED(env_offset) ? env_offset : .;
+       . = DEFINED(env_offset) ? env_offset : .;
     common/environment.o (.text)
 
-               *(.text)
+       *(.text)
 
     *(.fixup)
     *(.got1)
index 0be43ae8a91e015b53d9d52b764268c1ac3b7536..e33f44816a173867b96d1741b58b27cd6876a3ab 100644 (file)
@@ -38,37 +38,37 @@ SECTIONS
   .hash          : { *(.hash)          }
   .dynsym        : { *(.dynsym)                }
   .dynstr        : { *(.dynstr)                }
-  .rel.text      : { *(.rel.text)              }
+  .rel.text      : { *(.rel.text)      }
   .rela.text     : { *(.rela.text)     }
-  .rel.data      : { *(.rel.data)              }
+  .rel.data      : { *(.rel.data)      }
   .rela.data     : { *(.rela.data)     }
   .rel.rodata    : { *(.rel.rodata)    }
   .rela.rodata   : { *(.rela.rodata)   }
-  .rel.got       : { *(.rel.got)               }
-  .rela.got      : { *(.rela.got)              }
+  .rel.got       : { *(.rel.got)       }
+  .rela.got      : { *(.rela.got)      }
   .rel.ctors     : { *(.rel.ctors)     }
   .rela.ctors    : { *(.rela.ctors)    }
   .rel.dtors     : { *(.rel.dtors)     }
   .rela.dtors    : { *(.rela.dtors)    }
-  .rel.bss       : { *(.rel.bss)               }
-  .rela.bss      : { *(.rela.bss)              }
-  .rel.plt       : { *(.rel.plt)               }
-  .rela.plt      : { *(.rela.plt)              }
-  .init          : { *(.init)  }
+  .rel.bss       : { *(.rel.bss)       }
+  .rela.bss      : { *(.rela.bss)      }
+  .rel.plt       : { *(.rel.plt)       }
+  .rela.plt      : { *(.rela.plt)      }
+  .init          : { *(.init)          }
   .plt : { *(.plt) }
   .text      :
   {
-    cpu/mpc824x/start.o        (.text)
-               common/board.o (.text)
-    lib_ppc/ppcstring.o        (.text)
+    cpu/mpc824x/start.o                (.text)
+    lib_ppc/board.o            (.text)
+    lib_ppc/ppcstring.o                (.text)
     lib_generic/vsprintf.o     (.text)
     lib_generic/crc32.o                (.text)
     lib_generic/zlib.o         (.text)
 
-               . = DEFINED(env_offset) ? env_offset : .;
+       . = DEFINED(env_offset) ? env_offset : .;
     common/environment.o (.text)
 
-               *(.text)
+       *(.text)
 
     *(.fixup)
     *(.got1)
index 2999370c109b5e619bd749ea1c015f4ddd3c652a..a90403f637980b02b20b6a66499516fd58c49532 100644 (file)
@@ -26,7 +26,7 @@ include $(TOPDIR)/config.mk
 LIB    = libcommon.a
 
 AOBJS  =
-COBJS  = board.o main.o command.o environment.o bedbug.o \
+COBJS  = main.o command.o environment.o bedbug.o \
          cmd_autoscript.o cmd_bedbug.o cmd_boot.o \
          cmd_bootm.o cmd_cache.o cmd_console.o cmd_date.o \
          cmd_dcr.o cmd_doc.o cmd_dtt.o cmd_eeprom.o cmd_elf.o \
index 82e0362f5bde8aac0102296cc86628cdb4b70db1..fc5ead5d60a25141ea10f541bba9e90f19b2900f 100644 (file)
--- a/config.mk
+++ b/config.mk
 #
 # [Tested on NetBSD/i386 1.5 + cross-powerpc-netbsd-1.3]
 
+ifeq ($(ARCH),ppc)
 ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
 PLATFORM_CPPFLAGS+= -D__PPC__
 endif
 ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
 PLATFORM_CPPFLAGS+= -D__PPC__
 endif
+endif
+
+ifeq ($(ARCH),arm)
+ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
+PLATFORM_CPPFLAGS+= -D__ARM__
+endif
+ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
+PLATFORM_CPPFLAGS+= -D__ARM__
+endif
+endif
 
 ifdef  ARCH
-sinclude $(TOPDIR)/$(ARCH)/config.mk   # include architecture dependend rules
+sinclude $(TOPDIR)/$(ARCH)_config.mk   # include architecture dependend rules
 endif
 ifdef  CPU
-sinclude $(TOPDIR)/cpu/$(CPU)/config.mk                # include  CPU  specific rules
+sinclude $(TOPDIR)/cpu/$(CPU)/config.mk        # include  CPU  specific rules
 endif
 ifdef  VENDOR
 BOARDDIR = $(VENDOR)/$(BOARD)
@@ -89,10 +100,10 @@ OPTFLAGS= -Os -fomit-frame-pointer
 LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/ppcboot.lds
 OBJCFLAGS := --gap-fill=0xff
 
-CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS)                        \
-       -D__KERNEL__ -D__powerpc__ -DTEXT_BASE=$(TEXT_BASE)     \
-       -I$(TOPDIR)/include                                     \
-       -fno-builtin                                            \
+CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS)                \
+       -D__KERNEL__ -DTEXT_BASE=$(TEXT_BASE)           \
+       -I$(TOPDIR)/include                             \
+       -fno-builtin                                    \
        -pipe $(PLATFORM_CPPFLAGS)
 
 ifdef BUILD_TAG
index 1b630516f16f739f2562968243e5a44f4aeb45b5..90374ebad9c6b0eaf1134568329e5944b99de59d 100644 (file)
@@ -37,7 +37,7 @@
 #include <s3c2410.h>
 #endif
 
-#include <ptregs.h>
+#include <asm/proc-armv/ptrace.h>
 
 extern void reset_cpu(ulong addr);
 
diff --git a/cpu/xscale/Makefile b/cpu/xscale/Makefile
new file mode 100644 (file)
index 0000000..c940d6a
--- /dev/null
@@ -0,0 +1,43 @@
+#
+# (C) Copyright 2000, 2002
+# 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$(CPU).a
+
+START  = start.o
+OBJS   = serial.o interrupts.o cpu.o
+
+all:   .depend $(START) $(LIB)
+
+$(LIB):        $(OBJS)
+       $(AR) crv $@ $(OBJS)
+
+#########################################################################
+
+.depend:       Makefile $(START:.o=.S) $(OBJS:.o=.c)
+               $(CC) -M $(CFLAGS) $(START:.o=.S) $(OBJS:.o=.c) > $@
+
+sinclude .depend
+
+#########################################################################
diff --git a/cpu/xscale/config.mk b/cpu/xscale/config.mk
new file mode 100644 (file)
index 0000000..7cb87b9
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# (C) Copyright 2002
+# Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+# Marius Groeger <mgroeger@sysgo.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
+#
+
+PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common \
+       -mshort-load-bytes -msoft-float
+
+PLATFORM_CPPFLAGS += -mapcs-32 -march=armv4 -mtune=strongarm1100
diff --git a/cpu/xscale/cpu.c b/cpu/xscale/cpu.c
new file mode 100644 (file)
index 0000000..ae5b12d
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Alex Zuepke <azu@sysgo.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
+ */
+
+/*
+ * CPU specific code
+ */
+
+#include <ppcboot.h>
+#include <command.h>
+
+void cpu_init(bd_t *bd)
+{
+    /*
+     * setup up stack if necessary
+     */
+#ifdef CONFIG_USE_IRQ
+    IRQ_STACK_START = _armboot_end +
+                       CONFIG_STACKSIZE + CONFIG_STACKSIZE_IRQ - 4;
+    FIQ_STACK_START = IRQ_STACK_START + CONFIG_STACKSIZE_FIQ;
+    _armboot_real_end = FIQ_STACK_START + 4;
+#else
+    _armboot_real_end = _armboot_end + CONFIG_STACKSIZE;
+#endif
+}
+
+void cleanup_before_linux(bd_t *bd)
+{
+    /*
+     * this function is called just before we call linux
+     * it prepares the processor for linux
+     *
+     * just disable everything that can disturb booting linux
+     */
+
+    unsigned long i;
+
+    disable_interrupts();
+
+    /* turn off I-cache */
+    asm ("mrc p15, 0, %0, c1, c0, 0": "=r" (i));
+    i &= ~0x1000;
+    asm ("mcr p15, 0, %0, c1, c0, 0": : "r" (i));
+
+    /* flush I-cache */
+    asm ("mcr p15, 0, %0, c7, c5, 0": : "r" (i));
+}
+
+void do_reset (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
+{
+    extern void reset_cpu(ulong addr);
+
+    printf("reseting ...\n");
+
+    udelay(50000); /* wait 50 ms */
+    disable_interrupts();
+    reset_cpu(0);
+    /*NOTREACHED*/
+}
+
+/* taken from blob */
+void icache_enable(void)
+{
+    register u32 i;
+
+    /* read control register */
+    asm ("mrc p15, 0, %0, c1, c0, 0": "=r" (i));
+
+    /* set i-cache */
+    i |= 0x1000;
+
+    /* write back to control register */
+    asm ("mcr p15, 0, %0, c1, c0, 0": : "r" (i));
+}
+
+void icache_disable(void)
+{
+    register u32 i;
+
+    /* read control register */
+    asm ("mrc p15, 0, %0, c1, c0, 0": "=r" (i));
+
+    /* clear i-cache */
+    i &= ~0x1000;
+
+    /* write back to control register */
+    asm ("mcr p15, 0, %0, c1, c0, 0": : "r" (i));
+
+    /* flush i-cache */
+    asm ("mcr p15, 0, %0, c7, c5, 0": : "r" (i));
+}
+
+int icache_status(void)
+{
+    register u32 i;
+
+    /* read control register */
+    asm ("mrc p15, 0, %0, c1, c0, 0": "=r" (i));
+
+    /* return bit */
+    return (i & 0x1000);
+}
+
+/* we will never enable dcache, because we have to setup MMU first */
+void dcache_enable(void)
+{
+    return;
+}
+
+void dcache_disable(void)
+{
+    return;
+}
+
+int dcache_status(void)
+{
+    return 0; /* always off */
+}
diff --git a/cpu/xscale/interrupts.c b/cpu/xscale/interrupts.c
new file mode 100644 (file)
index 0000000..d2896cd
--- /dev/null
@@ -0,0 +1,207 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Alex Zuepke <azu@sysgo.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 <ppcboot.h>
+#include <asm/arch/pxa-regs.h>
+#include <asm/ptregs.h>
+
+extern void reset_cpu(ulong addr);
+
+#ifdef CONFIG_USE_IRQ
+/* enable IRQ/FIQ interrupts */
+void enable_interrupts (void)
+{
+#error: interrupts not implemented yet
+}
+
+
+/*
+ * disable IRQ/FIQ interrupts
+ * returns true if interrupts had been enabled before we disabled them
+ */
+int disable_interrupts (void)
+{
+#error: interrupts not implemented yet
+}
+#else
+void enable_interrupts (void)
+{
+    return;
+}
+int disable_interrupts (void)
+{
+    return 0;
+}
+#endif
+
+
+
+void bad_mode(void)
+{
+    panic("Resetting CPU ...\n");
+    reset_cpu(0);
+}
+
+void show_regs(struct pt_regs * regs)
+{
+    unsigned long flags;
+const char *processor_modes[]=
+{ "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" ,
+  "UK8_26" , "UK9_26" , "UK10_26", "UK11_26", "UK12_26", "UK13_26", "UK14_26", "UK15_26",
+  "USER_32", "FIQ_32" , "IRQ_32" , "SVC_32" , "UK4_32" , "UK5_32" , "UK6_32" , "ABT_32" ,
+  "UK8_32" , "UK9_32" , "UK10_32", "UND_32" , "UK12_32", "UK13_32", "UK14_32", "SYS_32"
+};
+
+    flags = condition_codes(regs);
+
+    printf("pc : [<%08lx>]    lr : [<%08lx>]\n"
+          "sp : %08lx  ip : %08lx  fp : %08lx\n",
+          instruction_pointer(regs),
+          regs->ARM_lr, regs->ARM_sp,
+          regs->ARM_ip, regs->ARM_fp);
+    printf("r10: %08lx  r9 : %08lx  r8 : %08lx\n",
+          regs->ARM_r10, regs->ARM_r9,
+          regs->ARM_r8);
+    printf("r7 : %08lx  r6 : %08lx  r5 : %08lx  r4 : %08lx\n",
+          regs->ARM_r7, regs->ARM_r6,
+          regs->ARM_r5, regs->ARM_r4);
+    printf("r3 : %08lx  r2 : %08lx  r1 : %08lx  r0 : %08lx\n",
+          regs->ARM_r3, regs->ARM_r2,
+          regs->ARM_r1, regs->ARM_r0);
+    printf("Flags: %c%c%c%c",
+          flags & CC_N_BIT ? 'N' : 'n',
+          flags & CC_Z_BIT ? 'Z' : 'z',
+          flags & CC_C_BIT ? 'C' : 'c',
+          flags & CC_V_BIT ? 'V' : 'v');
+    printf("  IRQs %s  FIQs %s  Mode %s%s\n",
+          interrupts_enabled(regs) ? "on" : "off",
+          fast_interrupts_enabled(regs) ? "on" : "off",
+          processor_modes[processor_mode(regs)],
+          thumb_mode(regs) ? " (T)" : "");
+}
+
+void do_undefined_instruction(struct pt_regs *pt_regs)
+{
+    printf("undefined instruction\n");
+    show_regs(pt_regs);
+    bad_mode();
+}
+
+void do_software_interrupt(struct pt_regs *pt_regs)
+{
+    printf("software interrupt\n");
+    show_regs(pt_regs);
+    bad_mode();
+}
+
+void do_prefetch_abort(struct pt_regs *pt_regs)
+{
+    printf("prefetch abort\n");
+    show_regs(pt_regs);
+    bad_mode();
+}
+
+void do_data_abort(struct pt_regs *pt_regs)
+{
+    printf("data abort\n");
+    show_regs(pt_regs);
+    bad_mode();
+}
+
+void do_not_used(struct pt_regs *pt_regs)
+{
+    printf("not used\n");
+    show_regs(pt_regs);
+    bad_mode();
+}
+
+void do_fiq(struct pt_regs *pt_regs)
+{
+    printf("fast interrupt request\n");
+    show_regs(pt_regs);
+    bad_mode();
+}
+
+void do_irq(struct pt_regs *pt_regs)
+{
+    printf("interrupt request\n");
+    show_regs(pt_regs);
+    bad_mode();
+}
+
+
+extern void interrupt_init (bd_t *bd)
+{
+  /* nothing happens here - we don't setup any IRQs */
+}
+
+void reset_timer (void)
+{
+    reset_timer_masked ();
+}
+
+ulong get_timer (ulong base)
+{
+    return get_timer_masked();
+}
+
+void set_timer (ulong t)
+{
+    /* nop */
+}
+
+void udelay(unsigned long usec)
+{
+    udelay_masked(usec);
+}
+
+
+void reset_timer_masked(void)
+{
+    OSCR = 0;
+}
+
+ulong get_timer_masked(void)
+{
+    return OSCR;
+}
+
+void udelay_masked(unsigned long usec)
+{
+    ulong tmo;
+
+    tmo = usec / 1000;
+    tmo *= CFG_HZ;
+    tmo /= 1000;
+
+    reset_timer_masked();
+
+    while (tmo >= get_timer_masked())
+      /*NOP*/;
+}
+
diff --git a/cpu/xscale/serial.c b/cpu/xscale/serial.c
new file mode 100644 (file)
index 0000000..49b152b
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Alex Zuepke <azu@sysgo.de>
+ *
+ * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl)
+ *
+ * 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 <ppcboot.h>
+#include <asm/arch/pxa-regs.h>
+
+void serial_setbrg(bd_t *bd, int baudrate)
+{
+    unsigned int quot = 0;
+
+    if (baudrate == 1200)        quot = 192;
+    else if (baudrate == 9600)   quot = 96;
+    else if (baudrate == 19200)  quot = 48;
+    else if (baudrate == 38400)  quot = 24;
+    else if (baudrate == 57600)  quot = 16;
+    else if (baudrate == 115200) quot = 8;
+    else hang();
+
+#ifdef CONFIG_FFUART
+
+    CKEN |= CKEN6_FFUART;
+
+    FFIER = 0;  /* Disable for now */
+    FFFCR = 0;  /* No fifos enabled */
+
+    /* set baud rate */
+    FFLCR = LCR_WLS0 | LCR_WLS1 | LCR_DLAB;
+    FFDLL = quot & 0xff;
+    FFDLH = quot >> 8;
+    FFLCR = LCR_WLS0 | LCR_WLS1;
+
+    FFIER = IER_UUE;  /* Enable FFUART */
+
+#elif CONFIG_STUART
+#error "Bad: not implemented yet!"
+#else
+#error "Bad: you didn't configured serial ..."
+#endif
+}
+
+
+/*
+ * Initialise the serial port with the given baudrate. The settings
+ * are always 8 data bits, no parity, 1 stop bit, no start bits.
+ *
+ */
+void serial_init(bd_t *bd)
+{
+    const char *baudrate;
+
+    if ((baudrate = getenv(bd, "baudrate")) != 0)
+      bd->bi_baudrate = simple_strtoul(baudrate, NULL, 10);
+
+    serial_setbrg(bd, bd->bi_baudrate);
+}
+
+
+/*
+ * Output a single byte to the serial port.
+ */
+void serial_putc(const char c)
+{
+#ifdef CONFIG_FFUART
+    /* wait for room in the tx FIFO on FFUART */
+    while((FFLSR & LSR_TEMT) == 0) ;
+
+    FFTHR = c;
+#elif CONFIG_STUART
+#endif
+
+    /* If \n, also do \r */
+    if(c == '\n')
+      serial_putc('\r');
+}
+
+/*
+ * Read a single byte from the serial port. Returns 1 on success, 0
+ * otherwise. When the function is succesfull, the character read is
+ * written into its argument c.
+ */
+int serial_tstc(void)
+{
+#ifdef CONFIG_FFUART
+    return FFLSR & LSR_DR;
+#elif CONFIG_STUART
+#endif
+}
+
+/*
+ * Read a single byte from the serial port. Returns 1 on success, 0
+ * otherwise. When the function is succesfull, the character read is
+ * written into its argument c.
+ */
+int serial_getc(void)
+{
+#ifdef CONFIG_FFUART
+    while (!(FFLSR & LSR_DR))
+       ;
+
+    return (char)FFRBR & 0xff;
+#elif CONFIG_STUART
+#endif
+}
diff --git a/cpu/xscale/start.S b/cpu/xscale/start.S
new file mode 100644 (file)
index 0000000..20d04e2
--- /dev/null
@@ -0,0 +1,420 @@
+/*
+ *  armboot - Startup Code for XScale
+ *
+ *  Copyright (C) 1998 Dan Malek <dmalek@jlc.net>
+ *  Copyright (C) 1999 Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
+ *  Copyright (C) 2000 Wolfgang Denk <wd@denx.de>
+ *  Copyright (c) 2001 Alex Züpke <azu@sysgo.de>
+ *  Copyright (c) 2002 Kyle Harris <kharris@nexus-tech.net>
+ *
+ * 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 <ppcboot.h>
+#include <version.h>
+
+.globl _start
+_start:        b       reset
+       ldr     pc, _undefined_instruction
+       ldr     pc, _software_interrupt
+       ldr     pc, _prefetch_abort
+       ldr     pc, _data_abort
+       ldr     pc, _not_used
+       ldr     pc, _irq
+       ldr     pc, _fiq
+
+_undefined_instruction:        .word undefined_instruction
+_software_interrupt:   .word software_interrupt
+_prefetch_abort:       .word prefetch_abort
+_data_abort:           .word data_abort
+_not_used:             .word not_used
+_irq:                  .word irq
+_fiq:                  .word fiq
+
+       .balignl 16,0xdeadbeef
+
+
+/*
+ *************************************************************************
+ *
+ * Startup Code (reset vector)
+ *
+ * do important init only if we don't start from memory!
+ * relocate armboot to ram
+ * setup stack
+ * jump to second stage
+ *
+ *************************************************************************
+ */
+
+/*
+ * CFG_MEM_END is in the board dependent config-file (configs/config_BOARD.h)
+ */
+_TEXT_BASE:
+       .word   TEXT_BASE
+
+.globl _armboot_start
+_armboot_start:
+       .word _start
+
+/*
+ * Note: armboot_end is defined by the (board-dependent) linker script
+ */
+.globl _armboot_end
+_armboot_end:
+       .word armboot_end
+
+/*
+ * _armboot_real_end is the first usable RAM address behind armboot
+ * and the various stacks
+ */
+.globl _armboot_real_end
+_armboot_real_end:
+       .word 0x0badc0de
+
+#ifdef CONFIG_USE_IRQ
+/* IRQ stack memory (calculated at run-time) */
+.globl IRQ_STACK_START
+IRQ_STACK_START:
+       .word   0x0badc0de
+
+/* IRQ stack memory (calculated at run-time) */
+.globl FIQ_STACK_START
+FIQ_STACK_START:
+       .word 0x0badc0de
+#endif
+
+
+/*
+ * the actual reset code
+ */
+
+reset:
+       /*
+        * set the cpu to SVC32 mode
+        */
+       mrs     r0,cpsr
+       bic     r0,r0,#0x1f
+       orr     r0,r0,#0x13
+       msr     cpsr,r0
+
+       /*
+        * we do sys-critical inits only at reboot,
+        * not when booting from ram!
+        */
+#ifdef CONFIG_INIT_CRITICAL
+       bl      cpu_init_crit
+#endif
+
+relocate:
+       /*
+        * relocate armboot to RAM
+        */
+       adr     r0, _start              /* r0 <- current position of code */
+       ldr     r2, _armboot_start
+       ldr     r3, _armboot_end
+       sub     r2, r3, r2              /* r2 <- size of armboot */
+       ldr     r1, _TEXT_BASE          /* r1 <- destination address */
+       add     r2, r0, r2              /* r2 <- source end address */
+
+       /*
+        * r0 = source address
+        * r1 = target address
+        * r2 = source end address
+        */
+copy_loop:
+       ldmia   r0!, {r3-r10}
+       stmia   r1!, {r3-r10}
+       cmp     r0, r2
+       ble     copy_loop
+
+       /* set up the stack */
+       ldr     r0, _armboot_end
+       add     r0, r0, #CONFIG_STACKSIZE
+       sub     sp, r0, #12             /* leave 3 words for abort-stack */
+
+       ldr     pc, _start_armboot
+
+_start_armboot:        .word start_armboot
+
+
+/*
+ *************************************************************************
+ *
+ * CPU_init_critical registers
+ *
+ * setup important registers
+ * setup memory timing
+ *
+ *************************************************************************
+ */
+
+
+/* Interupt-Controller base address */
+IC_BASE:          .word           0x40d00000
+#define ICMR   0x04
+
+
+/* FIXME RSRR doesn't exist on the PXA */
+/* Reset-Controller */
+RST_BASE:      .word   0x40f00030
+#define RSRR   0x00
+#define RCSR   0x00
+
+
+/* Clocks */
+CC_BASE:               .word   0x41300000
+#define CCCR    0x00
+
+cpuspeed:      .word   CFG_CPUSPEED
+
+       .macro CPWAIT
+    mrc  p15,0,r0,c2,c0,0
+       mov  r0,r0
+       sub  pc,pc,#4
+       .endm
+
+cpu_init_crit:
+       /*
+        * mask all IRQs
+        */
+       ldr     r0, IC_BASE
+       mov     r1, #0x00
+       str     r1, [r0, #ICMR]
+
+       /* set clock speed */
+       ldr     r0, CC_BASE
+       ldr     r1, cpuspeed
+       str     r1, [r0, #CCCR]
+
+       /*
+        * before relocating, we have to setup RAM timing
+        * because memory timing is board-dependend, you will
+        * find a memsetup.S in your board directory.
+        */
+       mov     ip,     lr
+       bl      memsetup
+       mov     lr,     ip
+
+       /*
+        * disable MMU stuff and enable I-cache
+        */
+       ldr     r0, =0x2001                             // enable access to all coprocessors
+       mcr     p15, 0, r0, c15, c1, 0
+    CPWAIT
+
+       mcr     p15, 0, r0, c7, c10, 4          // drain the write & fill buffers
+    CPWAIT
+
+       mcr     p15, 0, r0, c7, c7, 0           // flush Icache, Dcache and BTB
+    CPWAIT
+
+       mcr     p15, 0, r0, c8, c7, 0           // flush instuction and data TLBs
+    CPWAIT
+
+       // Enable the Icache
+       mrc     p15, 0, r0, c1, c0, 0
+       orr     r0, r0, #0x1800
+       mcr     p15, 0, r0, c1, c0, 0
+    CPWAIT
+
+       mov     pc, lr
+
+/*
+ *************************************************************************
+ *
+ * Interrupt handling
+ *
+ *************************************************************************
+ */
+
+@
+@ IRQ stack frame.
+@
+#define S_FRAME_SIZE   72
+
+#define S_OLD_R0       68
+#define S_PSR          64
+#define S_PC           60
+#define S_LR           56
+#define S_SP           52
+
+#define S_IP           48
+#define S_FP           44
+#define S_R10          40
+#define S_R9           36
+#define S_R8           32
+#define S_R7           28
+#define S_R6           24
+#define S_R5           20
+#define S_R4           16
+#define S_R3           12
+#define S_R2           8
+#define S_R1           4
+#define S_R0           0
+
+#define MODE_SVC 0x13
+
+/*
+ * use bad_save_user_regs for abort/prefetch/undef/swi ...
+ * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling
+ */
+
+       .macro  bad_save_user_regs
+       sub     sp, sp, #S_FRAME_SIZE
+       stmia   sp, {r0 - r12}                  @ Calling r0-r12
+       add     r8, sp, #S_PC
+
+       ldr     r2, _armboot_end
+       add     r2, r2, #CONFIG_STACKSIZE
+       sub     r2, r2, #8
+       ldmia   r2, {r2 - r4}                   @ get pc, cpsr, old_r0
+       add     r0, sp, #S_FRAME_SIZE           @ restore sp_SVC
+
+       add     r5, sp, #S_SP
+       mov     r1, lr
+       stmia   r5, {r0 - r4}                   @ save sp_SVC, lr_SVC, pc, cpsr, old_r
+       mov     r0, sp
+       .endm
+
+       .macro  irq_save_user_regs
+       sub     sp, sp, #S_FRAME_SIZE
+       stmia   sp, {r0 - r12}                  @ Calling r0-r12
+       add     r8, sp, #S_PC
+       stmdb   r8, {sp, lr}^                   @ Calling SP, LR
+       str     lr, [r8, #0]                    @ Save calling PC
+       mrs     r6, spsr
+       str     r6, [r8, #4]                    @ Save CPSR
+       str     r0, [r8, #8]                    @ Save OLD_R0
+       mov     r0, sp
+       .endm
+
+       .macro  irq_restore_user_regs
+       ldmia   sp, {r0 - lr}^                  @ Calling r0 - lr
+       mov     r0, r0
+       ldr     lr, [sp, #S_PC]                 @ Get PC
+       add     sp, sp, #S_FRAME_SIZE
+       subs    pc, lr, #4                      @ return & move spsr_svc into cpsr
+       .endm
+
+       .macro get_bad_stack
+       ldr     r13, _armboot_end               @ setup our mode stack
+       add     r13, r13, #CONFIG_STACKSIZE     @ resides at top of normal stack
+       sub     r13, r13, #8
+
+       str     lr, [r13]                       @ save caller lr / spsr
+       mrs     lr, spsr
+       str     lr, [r13, #4]
+
+       mov     r13, #MODE_SVC                  @ prepare SVC-Mode
+       msr     spsr_c, r13
+       mov     lr, pc
+       movs    pc, lr
+       .endm
+
+       .macro get_irq_stack                    @ setup IRQ stack
+       ldr     sp, IRQ_STACK_START
+       .endm
+
+       .macro get_fiq_stack                    @ setup FIQ stack
+       ldr     sp, FIQ_STACK_START
+       .endm
+
+/*
+ * exception handlers
+ */
+       .align  5
+undefined_instruction:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_undefined_instruction
+
+       .align  5
+software_interrupt:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_software_interrupt
+
+       .align  5
+prefetch_abort:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_prefetch_abort
+
+       .align  5
+data_abort:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_data_abort
+
+       .align  5
+not_used:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_not_used
+
+#ifdef CONFIG_USE_IRQ
+
+       .align  5
+irq:
+       get_irq_stack
+       irq_save_user_regs
+       bl      do_irq
+       irq_restore_user_regs
+
+       .align  5
+fiq:
+       get_fiq_stack
+       /* someone ought to write a more effiction fiq_save_user_regs */
+       irq_save_user_regs
+       bl      do_fiq
+       irq_restore_user_regs
+
+#else
+
+       .align  5
+irq:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_irq
+
+       .align  5
+fiq:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_fiq
+
+#endif
+
+/*
+ * FIXME How do we reset??? Watchdog timeout??
+ */
+       .align  5
+.globl reset_cpu
+reset_cpu:
+       /*
+       ldr     r0, RST_BASE
+       mov     r1, #0x0                        @ set bit 3-0 ...
+       str     r1, [r0, #RCSR]                 @ ... to clear in RCSR
+       mov     r1, #0x1
+       str     r1, [r0, #RSRR]                 @ and perform reset
+       */
+       b       reset_cpu                       @ silly, but repeat endlessly
index b7f8ea5f1c2b0becb8a83b2272dde5fc637cf84b..c5d41cb7fd8b3d21cfb801c62b89285096a88ae5 100644 (file)
@@ -122,7 +122,7 @@ static const char version[] =
 // Memory sizing constant
 #define LAN91C111_MEMORY_MULTIPLIER    (1024*2)
 
-#define SMC_BASE_ADDRESS 0x20000300
+#define SMC_BASE_ADDRESS CONFIG_SMC91111_BASE 
 #define SMC_DEV_NAME "SMC91111"
 #define SMC_PHY_ADDR 0x0000
 #define SMC_ALLOC_MAX_TRY 5
@@ -131,8 +131,12 @@ static const char version[] =
 #define SMC_PHY_CLOCK_DELAY 1000
 
 #define ETH_ZLEN 60
-/* #define USE_32_BIT 1 */
+
+#ifdef  CONFIG_SMC_USE_32_BIT
+#define USE_32_BIT  1
+#else
 #undef USE_32_BIT 
+#endif
 /*-----------------------------------------------------------------
  .
  .  The driver can be entered at any of the following entry points.
@@ -205,7 +209,7 @@ static int smc_rcv(void);
  * fetched from FLASHBLOCK 1 / OFFSET 0x10 using 
  * smc_get_macaddr( smc_mac_addr );
  */
-byte   smc_mac_addr[6] = {0x02, 0x80, 0xad, 0x20, 0x31, 0xb8};
+byte   smc_mac_addr[6] = {0x08, 0x00, 0x3e, 0x26, 0x0a, 0x5b};
 
 void smc_get_macaddr( byte *addr ) {
        /* MAC ADDRESS AT FLASHBLOCK 1 / OFFSET 0x10 */
@@ -322,7 +326,11 @@ static void smc_reset( void )
        /* by a soft reset */
 
        SMC_SELECT_BANK( 1 );
+#if defined(CONFIG_SMC91111_EXT_PHY)
+       SMC_outw( CONFIG_DEFAULT | CONFIG_EXT_PHY, CONFIG_REG);
+#else
        SMC_outw( CONFIG_DEFAULT, CONFIG_REG);
+#endif
 
 
        /* Release from possible power-down state */
@@ -341,7 +349,6 @@ static void smc_reset( void )
        /* set the control register */
        SMC_SELECT_BANK( 1 );
        SMC_outw( CTL_DEFAULT, CTL_REG );
-       
 
        /* Reset the MMU */
        SMC_SELECT_BANK( 2 );
@@ -536,9 +543,9 @@ again:
         . almost as much time as is saved?
        */
 #ifdef USE_32_BIT
-       outsl(ioaddr + DATA_REG, buf,  length >> 2 );
+       SMC_outsl(DATA_REG, buf,  length >> 2 );
        if ( length & 0x2  )
-               SMC_outw(*((word *)(buf + (length & 0xFFFFFFFC))),DATA_REG);
+               SMC_outw(*((word *)(buf + (length & 0xFFFFFFFC))), DATA_REG);
 #else
        SMC_outsw(DATA_REG , buf, (length ) >> 1);
 #endif // USE_32_BIT
@@ -621,7 +628,6 @@ static int smc_open()
 {
        int     i;      /* used to set hw ethernet address */
 
-
        PRINTK2("%s:smc_open\n", SMC_DEV_NAME);
 
        /* reset the hardware */
@@ -630,7 +636,10 @@ static int smc_open()
        smc_enable();
 
        /* Configure the PHY */
+#ifndef CONFIG_SMC91111_EXT_PHY
        smc_phy_configure();
+#endif
+
 
        /* conservative setting (10Mbps, HalfDuplex, no AutoNeg.) */
 //     SMC_SELECT_BANK(0);
@@ -642,12 +651,36 @@ static int smc_open()
                ioctl.  Easily done...
        */
        SMC_SELECT_BANK( 1 );
-       for ( i = 0; i < 6; i ++ )
+#ifdef USE_32_BIT
+       for ( i = 0; i < 6; i += 2 ) {
+               word address;
+
+               address = smc_mac_addr[ i + 1 ] << 8 ;
+               address  |= smc_mac_addr[ i ];
+               SMC_outw( address, ADDR0_REG + i );
+       }
+#else
+   for ( i = 0; i < 6; i ++ )
                SMC_outb( smc_mac_addr[i], ADDR0_REG + i );
+#endif
 
        return 0;
 }
 
+#ifdef USE_32_BIT
+void
+insl32(r,b,l)  
+{      
+   int __i ;  
+   dword *__b2;  
+
+       __b2 = (dword *) b;  
+       for (__i = 0; __i < l; __i++) 
+   {  
+                 *(__b2 + __i) = *(dword *)(r+0x10000300);  
+       }  
+}
+#endif
 
 /*-------------------------------------------------------------
  .
@@ -667,6 +700,9 @@ static int smc_rcv()
        word    status;
        word    packet_length;
        int     is_error = 0;
+#ifdef USE_32_BIT
+   dword stat_len;
+#endif
 
 
        SMC_SELECT_BANK(2);
@@ -682,8 +718,14 @@ static int smc_rcv()
        SMC_outw( PTR_READ | PTR_RCV | PTR_AUTOINC, PTR_REG );
 
        /* First two words are status and packet_length */
+#ifdef USE_32_BIT
+   stat_len = SMC_inl(DATA_REG);
+   status = stat_len & 0xffff;
+   packet_length = stat_len >> 16;
+#else
        status          = SMC_inw( DATA_REG );
        packet_length   = SMC_inw( DATA_REG );
+#endif
 
        packet_length &= 0x07ff;  /* mask off top bits */
 
@@ -691,7 +733,7 @@ static int smc_rcv()
 
        if ( !(status & RS_ERRORS ) ){
                /* Adjust for having already read the first two words */
-               packet_length -= 4;
+               packet_length -= 4; //4;
 
 
 
@@ -707,10 +749,16 @@ static int smc_rcv()
                   to send the DWORDs or the bytes first, or some
                   mixture.  A mixture might improve already slow PIO
                   performance  */
-               SMC_insl( DATA_REG , NetRxPackets, packet_length >> 2 );
+               SMC_insl( DATA_REG , NetRxPackets[0], packet_length >> 2 );
                /* read the left over bytes */
-               SMC_insb(  DATA_REG, NetRxPackets + (packet_length & 0xFFFFFC),
-                       packet_length & 0x3  );
+          if (packet_length & 3) 
+      {
+         int i;
+                  byte *tail = NetRxPackets[0] + (packet_length & ~3);
+                  dword leftover = SMC_inl(DATA_REG);
+                  for (i=0; i<(packet_length & 3); i++) 
+                          *tail++ = (byte) (leftover >> (8*i)) & 0xff;
+          }           
 #else
                PRINTK3(" Reading %d words and %d byte(s) \n",
                        (packet_length >> 1 ), packet_length & 1 );
index 13a672af01d391589a0c5007669ab301790cedfa..4d2ed74d86e70f8fb53cd232efc356e6a356967e 100644 (file)
@@ -65,13 +65,79 @@ typedef unsigned long int           dword;
 
 /* Because of bank switching, the LAN91xxx uses only 16 I/O ports */
 
+#define        SMC_IO_EXTENT   16
+
+#ifdef CONFIG_PXA250
+
+#define        SMC_inl(r)      (*((volatile dword *)(SMC_BASE_ADDRESS+(r))))
+#define        SMC_inw(r)      (*((volatile word *)(SMC_BASE_ADDRESS+(r))))
+#define SMC_inb(p)     ({ \
+       unsigned int __p = (unsigned int)(SMC_BASE_ADDRESS + (p)); \
+       unsigned int __v = *(volatile unsigned short *)((SMC_BASE_ADDRESS + __p) & ~1); \
+       if (__p & 1) __v >>= 8; \
+       else __v &= 0xff; \
+       __v; })
+
+#define        SMC_outl(d,r)   (*((volatile dword *)(SMC_BASE_ADDRESS+(r))) = d)
+#define        SMC_outw(d,r)   (*((volatile word *)(SMC_BASE_ADDRESS+(r))) = d)
+#define        SMC_outb(d,r)   ({      word __d = (byte)(d);  \
+                               word __w = SMC_inw((r)&~1);  \
+                               __w &= ((r)&1) ? 0x00FF : 0xFF00;  \
+                               __w |= ((r)&1) ? __d<<8 : __d;  \
+                               SMC_outw(__w,(r)&~1);  \
+                       })
+
+#define SMC_outsl(r,b,l)       ({      int __i; \
+                                       dword *__b2; \
+                                       __b2 = (dword *) b; \
+                                       for (__i = 0; __i < l; __i++) { \
+                                           SMC_outl( *(__b2 + __i), r); \
+                                       } \
+                               })
+
+#define SMC_outsw(r,b,l)       ({      int __i; \
+                                       word *__b2; \
+                                       __b2 = (word *) b; \
+                                       for (__i = 0; __i < l; __i++) { \
+                                           SMC_outw( *(__b2 + __i), r); \
+                                       } \
+                               })
+
+#define SMC_insl(r,b,l)        ({      int __i ;  \
+                                       dword *__b2;  \
+                                       __b2 = (dword *) b;  \
+                                       for (__i = 0; __i < l; __i++) {  \
+                                         *(__b2 + __i) = SMC_inl(r);  \
+                                         SMC_inl(0);  \
+                                       };  \
+                               })
+
+#define SMC_insw(r,b,l)        ({      int __i ;  \
+                                       word *__b2;  \
+                                       __b2 = (word *) b;  \
+                                       for (__i = 0; __i < l; __i++) {  \
+                                         *(__b2 + __i) = SMC_inw(r);  \
+                                         SMC_inw(0);  \
+                                       };  \
+                               })
+
+#define SMC_insb(r,b,l)        ({      int __i ;  \
+                                       byte *__b2;  \
+                                       __b2 = (byte *) b;  \
+                                       for (__i = 0; __i < l; __i++) {  \
+                                         *(__b2 + __i) = SMC_inb(r);  \
+                                         SMC_inb(0);  \
+                                       };  \
+                               })
+
+#else /* if not CONFIG_PXA250 */
+
 /*
  * We have only 16 Bit PCMCIA access on Socket 0
  */
-#define        SMC_IO_EXTENT   16
 
 #define        SMC_inw(r)      (*((volatile word *)(SMC_BASE_ADDRESS+(r))))
-#define SMC_inb(r)     (((r)&1) ? SMC_inw((r)&~1)>>8 : SMC_inw(r)&0xFF)
+#define  SMC_inb(r)    (((r)&1) ? SMC_inw((r)&~1)>>8 : SMC_inw(r)&0xFF)
 
 #define        SMC_outw(d,r)   (*((volatile word *)(SMC_BASE_ADDRESS+(r))) = d)
 #define        SMC_outb(d,r)   ({      word __d = (byte)(d);  \
@@ -105,6 +171,8 @@ typedef unsigned long int           dword;
                                })
 #endif
 
+#endif
+
 /*---------------------------------------------------------------
  .  
  . A description of the SMSC registers is probably in order here,
@@ -144,7 +212,7 @@ typedef unsigned long int           dword;
 #define        TCR_CLEAR       0       /* do NOTHING */
 /* the default settings for the TCR register : */ 
 /* QUESTION: do I want to enable padding of short packets ? */
-#define        TCR_DEFAULT     TCR_ENABLE 
+#define        TCR_DEFAULT     TCR_ENABLE
 
 
 // EPH Status Register
diff --git a/include/asm-arm/arch-xscale/pxa-regs.h b/include/asm-arm/arch-xscale/pxa-regs.h
new file mode 100644 (file)
index 0000000..3bc0751
--- /dev/null
@@ -0,0 +1,1121 @@
+/*
+ *  linux/include/asm-arm/arch-pxa/pxa-regs.h
+ *
+ *  Author:    Nicolas Pitre
+ *  Created:   Jun 15, 2001
+ *  Copyright: MontaVista Software Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+
+// FIXME hack so that SA-1111.h will work [cb]
+
+#ifndef __ASSEMBLY__
+typedef unsigned short  Word16 ;
+typedef unsigned int    Word32 ;
+typedef Word32          Word ;
+typedef Word            Quad [4] ;
+typedef void            *Address ;
+typedef void            (*ExcpHndlr) (void) ;
+#endif
+
+#ifndef __ASSEMBLY__
+#define io_p2v(PhAdd)    (PhAdd)
+#define __REG(x) (*((volatile u32 *)io_p2v(x)))
+#else
+#define __REG(x) (x)
+#endif
+
+/*
+ * PXA Chip selects
+ */
+
+#define PXA_CS0_PHYS   0x00000000
+#define PXA_CS1_PHYS   0x04000000
+#define PXA_CS2_PHYS   0x08000000
+#define PXA_CS3_PHYS   0x0C000000
+#define PXA_CS4_PHYS   0x10000000
+#define PXA_CS5_PHYS   0x14000000
+
+
+/*
+ * Personal Computer Memory Card International Association (PCMCIA) sockets
+ */
+
+#define PCMCIAPrtSp    0x04000000      /* PCMCIA Partition Space [byte]   */
+#define PCMCIASp       (4*PCMCIAPrtSp) /* PCMCIA Space [byte]             */
+#define PCMCIAIOSp     PCMCIAPrtSp     /* PCMCIA I/O Space [byte]         */
+#define PCMCIAAttrSp   PCMCIAPrtSp     /* PCMCIA Attribute Space [byte]   */
+#define PCMCIAMemSp    PCMCIAPrtSp     /* PCMCIA Memory Space [byte]      */
+
+#define PCMCIA0Sp      PCMCIASp        /* PCMCIA 0 Space [byte]           */
+#define PCMCIA0IOSp    PCMCIAIOSp      /* PCMCIA 0 I/O Space [byte]       */
+#define PCMCIA0AttrSp  PCMCIAAttrSp    /* PCMCIA 0 Attribute Space [byte] */
+#define PCMCIA0MemSp   PCMCIAMemSp     /* PCMCIA 0 Memory Space [byte]    */
+
+#define PCMCIA1Sp      PCMCIASp        /* PCMCIA 1 Space [byte]           */
+#define PCMCIA1IOSp    PCMCIAIOSp      /* PCMCIA 1 I/O Space [byte]       */
+#define PCMCIA1AttrSp  PCMCIAAttrSp    /* PCMCIA 1 Attribute Space [byte] */
+#define PCMCIA1MemSp   PCMCIAMemSp     /* PCMCIA 1 Memory Space [byte]    */
+
+#define _PCMCIA(Nb)                    /* PCMCIA [0..1]                   */ \
+                       (0x20000000 + (Nb)*PCMCIASp)
+#define _PCMCIAIO(Nb)  _PCMCIA (Nb)    /* PCMCIA I/O [0..1]               */
+#define _PCMCIAAttr(Nb)                        /* PCMCIA Attribute [0..1]         */ \
+                       (_PCMCIA (Nb) + 2*PCMCIAPrtSp)
+#define _PCMCIAMem(Nb)                 /* PCMCIA Memory [0..1]            */ \
+                       (_PCMCIA (Nb) + 3*PCMCIAPrtSp)
+
+#define _PCMCIA0       _PCMCIA (0)     /* PCMCIA 0                        */
+#define _PCMCIA0IO     _PCMCIAIO (0)   /* PCMCIA 0 I/O                    */
+#define _PCMCIA0Attr   _PCMCIAAttr (0) /* PCMCIA 0 Attribute              */
+#define _PCMCIA0Mem    _PCMCIAMem (0)  /* PCMCIA 0 Memory                 */
+
+#define _PCMCIA1       _PCMCIA (1)     /* PCMCIA 1                        */
+#define _PCMCIA1IO     _PCMCIAIO (1)   /* PCMCIA 1 I/O                    */
+#define _PCMCIA1Attr   _PCMCIAAttr (1) /* PCMCIA 1 Attribute              */
+#define _PCMCIA1Mem    _PCMCIAMem (1)  /* PCMCIA 1 Memory                 */
+
+
+
+/*
+ * DMA Controller
+ */
+
+#define DCSR0          __REG(0x40000000)  /* DMA Control / Status Register for Channel 0 */
+#define DCSR1          __REG(0x40000004)  /* DMA Control / Status Register for Channel 1 */
+#define DCSR2          __REG(0x40000008)  /* DMA Control / Status Register for Channel 2 */
+#define DCSR3          __REG(0x4000000c)  /* DMA Control / Status Register for Channel 3 */
+#define DCSR4          __REG(0x40000010)  /* DMA Control / Status Register for Channel 4 */
+#define DCSR5          __REG(0x40000014)  /* DMA Control / Status Register for Channel 5 */
+#define DCSR6          __REG(0x40000018)  /* DMA Control / Status Register for Channel 6 */
+#define DCSR7          __REG(0x4000001c)  /* DMA Control / Status Register for Channel 7 */
+#define DCSR8          __REG(0x40000020)  /* DMA Control / Status Register for Channel 8 */
+#define DCSR9          __REG(0x40000024)  /* DMA Control / Status Register for Channel 9 */
+#define DCSR10         __REG(0x40000028)  /* DMA Control / Status Register for Channel 10 */
+#define DCSR11         __REG(0x4000002c)  /* DMA Control / Status Register for Channel 11 */
+#define DCSR12         __REG(0x40000030)  /* DMA Control / Status Register for Channel 12 */
+#define DCSR13         __REG(0x40000034)  /* DMA Control / Status Register for Channel 13 */
+#define DCSR14         __REG(0x40000038)  /* DMA Control / Status Register for Channel 14 */
+#define DCSR15         __REG(0x4000003c)  /* DMA Control / Status Register for Channel 15 */
+
+#define DCSR(x)                __REG2(0x40000000, (x) << 2)
+
+#define DCSR_RUN       (1 << 31)       /* Run Bit (read / write) */
+#define DCSR_NODESC    (1 << 30)       /* No-Descriptor Fetch (read / write) */
+#define DCSR_STOPIRQEN (1 << 29)       /* Stop Interrupt Enable (read / write) */
+#define DCSR_REQPEND   (1 << 8)        /* Request Pending (read-only) */
+#define DCSR_STOPSTATE (1 << 3)        /* Stop State (read-only) */
+#define DCSR_ENDINTR   (1 << 2)        /* End Interrupt (read / write) */
+#define DCSR_STARTINTR (1 << 1)        /* Start Interrupt (read / write) */
+#define DCSR_BUSERR    (1 << 0)        /* Bus Error Interrupt (read / write) */
+
+#define DINT           __REG(0x400000f0)  /* DMA Interrupt Register */
+
+#define DRCMR0         __REG(0x40000100)  /* Request to Channel Map Register for DREQ 0 */
+#define DRCMR1         __REG(0x40000104)  /* Request to Channel Map Register for DREQ 1 */
+#define DRCMR2         __REG(0x40000108)  /* Request to Channel Map Register for I2S receive Request */
+#define DRCMR3         __REG(0x4000010c)  /* Request to Channel Map Register for I2S transmit Request */
+#define DRCMR4         __REG(0x40000110)  /* Request to Channel Map Register for BTUART receive Request */
+#define DRCMR5         __REG(0x40000114)  /* Request to Channel Map Register for BTUART transmit Request. */
+#define DRCMR6         __REG(0x40000118)  /* Request to Channel Map Register for FFUART receive Request */
+#define DRCMR7         __REG(0x4000011c)  /* Request to Channel Map Register for FFUART transmit Request */
+#define DRCMR8         __REG(0x40000120)  /* Request to Channel Map Register for AC97 microphone Request */
+#define DRCMR9         __REG(0x40000124)  /* Request to Channel Map Register for AC97 modem receive Request */
+#define DRCMR10                __REG(0x40000128)  /* Request to Channel Map Register for AC97 modem transmit Request */
+#define DRCMR11                __REG(0x4000012c)  /* Request to Channel Map Register for AC97 audio receive Request */
+#define DRCMR12                __REG(0x40000130)  /* Request to Channel Map Register for AC97 audio transmit Request */
+#define DRCMR13                __REG(0x40000134)  /* Request to Channel Map Register for SSP receive Request */
+#define DRCMR14                __REG(0x40000138)  /* Request to Channel Map Register for SSP transmit Request */
+#define DRCMR15                __REG(0x4000013c)  /* Reserved */
+#define DRCMR16                __REG(0x40000140)  /* Reserved */
+#define DRCMR17                __REG(0x40000144)  /* Request to Channel Map Register for ICP receive Request */
+#define DRCMR18                __REG(0x40000148)  /* Request to Channel Map Register for ICP transmit Request */
+#define DRCMR19                __REG(0x4000014c)  /* Request to Channel Map Register for STUART receive Request */
+#define DRCMR20                __REG(0x40000150)  /* Request to Channel Map Register for STUART transmit Request */
+#define DRCMR21                __REG(0x40000154)  /* Request to Channel Map Register for MMC receive Request */
+#define DRCMR22                __REG(0x40000158)  /* Request to Channel Map Register for MMC transmit Request */
+#define DRCMR23                __REG(0x4000015c)  /* Reserved */
+#define DRCMR24                __REG(0x40000160)  /* Reserved */
+#define DRCMR25                __REG(0x40000164)  /* Request to Channel Map Register for USB endpoint 1 Request */
+#define DRCMR26                __REG(0x40000168)  /* Request to Channel Map Register for USB endpoint 2 Request */
+#define DRCMR27                __REG(0x4000016C)  /* Request to Channel Map Register for USB endpoint 3 Request */
+#define DRCMR28                __REG(0x40000170)  /* Request to Channel Map Register for USB endpoint 4 Request */
+#define DRCMR29                __REG(0x40000174)  /* Reserved */
+#define DRCMR30                __REG(0x40000178)  /* Request to Channel Map Register for USB endpoint 6 Request */
+#define DRCMR31                __REG(0x4000017C)  /* Request to Channel Map Register for USB endpoint 7 Request */
+#define DRCMR32                __REG(0x40000180)  /* Request to Channel Map Register for USB endpoint 8 Request */
+#define DRCMR33                __REG(0x40000184)  /* Request to Channel Map Register for USB endpoint 9 Request */
+#define DRCMR34                __REG(0x40000188)  /* Reserved */
+#define DRCMR35                __REG(0x4000018C)  /* Request to Channel Map Register for USB endpoint 11 Request */
+#define DRCMR36                __REG(0x40000190)  /* Request to Channel Map Register for USB endpoint 12 Request */
+#define DRCMR37                __REG(0x40000194)  /* Request to Channel Map Register for USB endpoint 13 Request */
+#define DRCMR38                __REG(0x40000198)  /* Request to Channel Map Register for USB endpoint 14 Request */
+#define DRCMR39                __REG(0x4000019C)  /* Reserved */
+
+#define DRCMRRXSADR    DRCMR2
+#define DRCMRTXSADR    DRCMR3
+#define DRCMRRXBTRBR   DRCMR4
+#define DRCMRTXBTTHR   DRCMR5
+#define DRCMRRXFFRBR   DRCMR6
+#define DRCMRTXFFTHR   DRCMR7
+#define DRCMRRXMCDR    DRCMR8
+#define DRCMRRXMODR    DRCMR9
+#define DRCMRTXMODR    DRCMR10
+#define DRCMRRXPCDR    DRCMR11
+#define DRCMRTXPCDR    DRCMR12
+#define DRCMRRXSSDR    DRCMR13
+#define DRCMRTXSSDR    DRCMR14
+#define DRCMRRXICDR    DRCMR17
+#define DRCMRTXICDR    DRCMR18
+#define DRCMRRXSTRBR   DRCMR19
+#define DRCMRTXSTTHR   DRCMR20
+#define DRCMRRXMMC     DRCMR21
+#define DRCMRTXMMC     DRCMR22
+
+#define DRCMR_MAPVLD   (1 << 7)        /* Map Valid (read / write) */
+#define DRCMR_CHLNUM   0x0f            /* mask for Channel Number (read / write) */
+
+#define DDADR0         __REG(0x40000200)  /* DMA Descriptor Address Register Channel 0 */
+#define DSADR0         __REG(0x40000204)  /* DMA Source Address Register Channel 0 */
+#define DTADR0         __REG(0x40000208)  /* DMA Target Address Register Channel 0 */
+#define DCMD0          __REG(0x4000020c)  /* DMA Command Address Register Channel 0 */
+#define DDADR1         __REG(0x40000210)  /* DMA Descriptor Address Register Channel 1 */
+#define DSADR1         __REG(0x40000214)  /* DMA Source Address Register Channel 1 */
+#define DTADR1         __REG(0x40000218)  /* DMA Target Address Register Channel 1 */
+#define DCMD1          __REG(0x4000021c)  /* DMA Command Address Register Channel 1 */
+#define DDADR2         __REG(0x40000220)  /* DMA Descriptor Address Register Channel 2 */
+#define DSADR2         __REG(0x40000224)  /* DMA Source Address Register Channel 2 */
+#define DTADR2         __REG(0x40000228)  /* DMA Target Address Register Channel 2 */
+#define DCMD2          __REG(0x4000022c)  /* DMA Command Address Register Channel 2 */
+#define DDADR3         __REG(0x40000230)  /* DMA Descriptor Address Register Channel 3 */
+#define DSADR3         __REG(0x40000234)  /* DMA Source Address Register Channel 3 */
+#define DTADR3         __REG(0x40000238)  /* DMA Target Address Register Channel 3 */
+#define DCMD3          __REG(0x4000023c)  /* DMA Command Address Register Channel 3 */
+#define DDADR4         __REG(0x40000240)  /* DMA Descriptor Address Register Channel 4 */
+#define DSADR4         __REG(0x40000244)  /* DMA Source Address Register Channel 4 */
+#define DTADR4         __REG(0x40000248)  /* DMA Target Address Register Channel 4 */
+#define DCMD4          __REG(0x4000024c)  /* DMA Command Address Register Channel 4 */
+#define DDADR5         __REG(0x40000250)  /* DMA Descriptor Address Register Channel 5 */
+#define DSADR5         __REG(0x40000254)  /* DMA Source Address Register Channel 5 */
+#define DTADR5         __REG(0x40000258)  /* DMA Target Address Register Channel 5 */
+#define DCMD5          __REG(0x4000025c)  /* DMA Command Address Register Channel 5 */
+#define DDADR6         __REG(0x40000260)  /* DMA Descriptor Address Register Channel 6 */
+#define DSADR6         __REG(0x40000264)  /* DMA Source Address Register Channel 6 */
+#define DTADR6         __REG(0x40000268)  /* DMA Target Address Register Channel 6 */
+#define DCMD6          __REG(0x4000026c)  /* DMA Command Address Register Channel 6 */
+#define DDADR7         __REG(0x40000270)  /* DMA Descriptor Address Register Channel 7 */
+#define DSADR7         __REG(0x40000274)  /* DMA Source Address Register Channel 7 */
+#define DTADR7         __REG(0x40000278)  /* DMA Target Address Register Channel 7 */
+#define DCMD7          __REG(0x4000027c)  /* DMA Command Address Register Channel 7 */
+#define DDADR8         __REG(0x40000280)  /* DMA Descriptor Address Register Channel 8 */
+#define DSADR8         __REG(0x40000284)  /* DMA Source Address Register Channel 8 */
+#define DTADR8         __REG(0x40000288)  /* DMA Target Address Register Channel 8 */
+#define DCMD8          __REG(0x4000028c)  /* DMA Command Address Register Channel 8 */
+#define DDADR9         __REG(0x40000290)  /* DMA Descriptor Address Register Channel 9 */
+#define DSADR9         __REG(0x40000294)  /* DMA Source Address Register Channel 9 */
+#define DTADR9         __REG(0x40000298)  /* DMA Target Address Register Channel 9 */
+#define DCMD9          __REG(0x4000029c)  /* DMA Command Address Register Channel 9 */
+#define DDADR10                __REG(0x400002a0)  /* DMA Descriptor Address Register Channel 10 */
+#define DSADR10                __REG(0x400002a4)  /* DMA Source Address Register Channel 10 */
+#define DTADR10                __REG(0x400002a8)  /* DMA Target Address Register Channel 10 */
+#define DCMD10         __REG(0x400002ac)  /* DMA Command Address Register Channel 10 */
+#define DDADR11                __REG(0x400002b0)  /* DMA Descriptor Address Register Channel 11 */
+#define DSADR11                __REG(0x400002b4)  /* DMA Source Address Register Channel 11 */
+#define DTADR11                __REG(0x400002b8)  /* DMA Target Address Register Channel 11 */
+#define DCMD11         __REG(0x400002bc)  /* DMA Command Address Register Channel 11 */
+#define DDADR12                __REG(0x400002c0)  /* DMA Descriptor Address Register Channel 12 */
+#define DSADR12                __REG(0x400002c4)  /* DMA Source Address Register Channel 12 */
+#define DTADR12                __REG(0x400002c8)  /* DMA Target Address Register Channel 12 */
+#define DCMD12         __REG(0x400002cc)  /* DMA Command Address Register Channel 12 */
+#define DDADR13                __REG(0x400002d0)  /* DMA Descriptor Address Register Channel 13 */
+#define DSADR13                __REG(0x400002d4)  /* DMA Source Address Register Channel 13 */
+#define DTADR13                __REG(0x400002d8)  /* DMA Target Address Register Channel 13 */
+#define DCMD13         __REG(0x400002dc)  /* DMA Command Address Register Channel 13 */
+#define DDADR14                __REG(0x400002e0)  /* DMA Descriptor Address Register Channel 14 */
+#define DSADR14                __REG(0x400002e4)  /* DMA Source Address Register Channel 14 */
+#define DTADR14                __REG(0x400002e8)  /* DMA Target Address Register Channel 14 */
+#define DCMD14         __REG(0x400002ec)  /* DMA Command Address Register Channel 14 */
+#define DDADR15                __REG(0x400002f0)  /* DMA Descriptor Address Register Channel 15 */
+#define DSADR15                __REG(0x400002f4)  /* DMA Source Address Register Channel 15 */
+#define DTADR15                __REG(0x400002f8)  /* DMA Target Address Register Channel 15 */
+#define DCMD15         __REG(0x400002fc)  /* DMA Command Address Register Channel 15 */
+
+#define DDADR(x)       __REG2(0x40000200, (x) << 4)
+#define DSADR(x)       __REG2(0x40000204, (x) << 4)
+#define DTADR(x)       __REG2(0x40000208, (x) << 4)
+#define DCMD(x)                __REG2(0x4000020c, (x) << 4)
+
+#define DDADR_DESCADDR 0xfffffff0      /* Address of next descriptor (mask) */
+#define DDADR_STOP     (1 << 0)        /* Stop (read / write) */
+
+#define DCMD_INCSRCADDR        (1 << 31)       /* Source Address Increment Setting. */
+#define DCMD_INCTRGADDR        (1 << 30)       /* Target Address Increment Setting. */
+#define DCMD_FLOWSRC   (1 << 29)       /* Flow Control by the source. */
+#define DCMD_FLOWTRG   (1 << 28)       /* Flow Control by the target. */
+#define DCMD_STARTIRQEN        (1 << 22)       /* Start Interrupt Enable */
+#define DCMD_ENDIRQEN  (1 << 21)       /* End Interrupt Enable */
+#define DCMD_ENDIAN    (1 << 18)       /* Device Endian-ness. */
+#define DCMD_BURST8    (1 << 16)       /* 8 byte burst */
+#define DCMD_BURST16   (2 << 16)       /* 16 byte burst */
+#define DCMD_BURST32   (3 << 16)       /* 32 byte burst */
+#define DCMD_WIDTH1    (1 << 14)       /* 1 byte width */
+#define DCMD_WIDTH2    (2 << 14)       /* 2 byte width (HalfWord) */
+#define DCMD_WIDTH4    (3 << 14)       /* 4 byte width (Word) */
+#define DCMD_LENGTH    0x01fff         /* length mask (max = 8K - 1) */
+
+/* default combinations */
+#define DCMD_RXPCDR    (DCMD_INCTRGADDR|DCMD_FLOWSRC|DCMD_BURST32|DCMD_WIDTH4)
+#define DCMD_RXMCDR    (DCMD_INCTRGADDR|DCMD_FLOWSRC|DCMD_BURST32|DCMD_WIDTH4)
+#define DCMD_TXPCDR    (DCMD_INCSRCADDR|DCMD_FLOWTRG|DCMD_BURST32|DCMD_WIDTH4)
+
+
+/*
+ * UARTs
+ */
+
+/* Full Function UART (FFUART) */
+#define FFUART         FFRBR
+#define FFRBR          __REG(0x40100000)  /* Receive Buffer Register (read only) */
+#define FFTHR          __REG(0x40100000)  /* Transmit Holding Register (write only) */
+#define FFIER          __REG(0x40100004)  /* Interrupt Enable Register (read/write) */
+#define FFIIR          __REG(0x40100008)  /* Interrupt ID Register (read only) */
+#define FFFCR          __REG(0x40100008)  /* FIFO Control Register (write only) */
+#define FFLCR          __REG(0x4010000C)  /* Line Control Register (read/write) */
+#define FFMCR          __REG(0x40100010)  /* Modem Control Register (read/write) */
+#define FFLSR          __REG(0x40100014)  /* Line Status Register (read only) */
+#define FFMSR          __REG(0x40100018)  /* Modem Status Register (read only) */
+#define FFSPR          __REG(0x4010001C)  /* Scratch Pad Register (read/write) */
+#define FFISR          __REG(0x40100020)  /* Infrared Selection Register (read/write) */
+#define FFDLL          __REG(0x40100000)  /* Divisor Latch Low Register (DLAB = 1) (read/write) */
+#define FFDLH          __REG(0x40100004)  /* Divisor Latch High Register (DLAB = 1) (read/write) */
+
+/* Bluetooth UART (BTUART) */
+#define BTUART         BTRBR
+#define BTRBR          __REG(0x40200000)  /* Receive Buffer Register (read only) */
+#define BTTHR          __REG(0x40200000)  /* Transmit Holding Register (write only) */
+#define BTIER          __REG(0x40200004)  /* Interrupt Enable Register (read/write) */
+#define BTIIR          __REG(0x40200008)  /* Interrupt ID Register (read only) */
+#define BTFCR          __REG(0x40200008)  /* FIFO Control Register (write only) */
+#define BTLCR          __REG(0x4020000C)  /* Line Control Register (read/write) */
+#define BTMCR          __REG(0x40200010)  /* Modem Control Register (read/write) */
+#define BTLSR          __REG(0x40200014)  /* Line Status Register (read only) */
+#define BTMSR          __REG(0x40200018)  /* Modem Status Register (read only) */
+#define BTSPR          __REG(0x4020001C)  /* Scratch Pad Register (read/write) */
+#define BTISR          __REG(0x40200020)  /* Infrared Selection Register (read/write) */
+#define BTDLL          __REG(0x40200000)  /* Divisor Latch Low Register (DLAB = 1) (read/write) */
+#define BTDLH          __REG(0x40200004)  /* Divisor Latch High Register (DLAB = 1) (read/write) */
+
+/* Standard UART (STUART) */
+#define STUART         STRBR
+#define STRBR          __REG(0x40700000)  /* Receive Buffer Register (read only) */
+#define STTHR          __REG(0x40700000)  /* Transmit Holding Register (write only) */
+#define STIER          __REG(0x40700004)  /* Interrupt Enable Register (read/write) */
+#define STIIR          __REG(0x40700008)  /* Interrupt ID Register (read only) */
+#define STFCR          __REG(0x40700008)  /* FIFO Control Register (write only) */
+#define STLCR          __REG(0x4070000C)  /* Line Control Register (read/write) */
+#define STMCR          __REG(0x40700010)  /* Modem Control Register (read/write) */
+#define STLSR          __REG(0x40700014)  /* Line Status Register (read only) */
+#define STMSR          __REG(0x40700018)  /* Reserved */
+#define STSPR          __REG(0x4070001C)  /* Scratch Pad Register (read/write) */
+#define STISR          __REG(0x40700020)  /* Infrared Selection Register (read/write) */
+#define STDLL          __REG(0x40700000)  /* Divisor Latch Low Register (DLAB = 1) (read/write) */
+#define STDLH          __REG(0x40700004)  /* Divisor Latch High Register (DLAB = 1) (read/write) */
+
+#define IER_DMAE       (1 << 7)        /* DMA Requests Enable */
+#define IER_UUE                (1 << 6)        /* UART Unit Enable */
+#define IER_NRZE       (1 << 5)        /* NRZ coding Enable */
+#define IER_RTIOE      (1 << 4)        /* Receiver Time Out Interrupt Enable */
+#define IER_MIE                (1 << 3)        /* Modem Interrupt Enable */
+#define IER_RLSE       (1 << 2)        /* Receiver Line Status Interrupt Enable */
+#define IER_TIE                (1 << 1)        /* Transmit Data request Interrupt Enable */
+#define IER_RAVIE      (1 << 0)        /* Receiver Data Available Interrupt Enable */
+
+#define IIR_FIFOES1    (1 << 7)        /* FIFO Mode Enable Status */
+#define IIR_FIFOES0    (1 << 6)        /* FIFO Mode Enable Status */
+#define IIR_TOD                (1 << 3)        /* Time Out Detected */
+#define IIR_IID2       (1 << 2)        /* Interrupt Source Encoded */
+#define IIR_IID1       (1 << 1)        /* Interrupt Source Encoded */
+#define IIR_IP         (1 << 0)        /* Interrupt Pending (active low) */
+
+#define FCR_ITL2       (1 << 7)        /* Interrupt Trigger Level */
+#define FCR_ITL1       (1 << 6)        /* Interrupt Trigger Level */
+#define FCR_RESETTF    (1 << 2)        /* Reset Transmitter FIFO */
+#define FCR_RESETRF    (1 << 1)        /* Reset Receiver FIFO */
+#define FCR_TRFIFOE    (1 << 0)        /* Transmit and Receive FIFO Enable */
+#define FCR_ITL_1      (0)
+#define FCR_ITL_8      (FCR_ITL1)
+#define FCR_ITL_16     (FCR_ITL2)
+#define FCR_ITL_32     (FCR_ITL2|FCR_ITL1)
+
+#define LCR_DLAB       (1 << 7)        /* Divisor Latch Access Bit */
+#define LCR_SB         (1 << 6)        /* Set Break */
+#define LCR_STKYP      (1 << 5)        /* Sticky Parity */
+#define LCR_EPS                (1 << 4)        /* Even Parity Select */
+#define LCR_PEN                (1 << 3)        /* Parity Enable */
+#define LCR_STB                (1 << 2)        /* Stop Bit */
+#define LCR_WLS1       (1 << 1)        /* Word Length Select */
+#define LCR_WLS0       (1 << 0)        /* Word Length Select */
+
+#define LSR_FIFOE      (1 << 7)        /* FIFO Error Status */
+#define LSR_TEMT       (1 << 6)        /* Transmitter Empty */
+#define LSR_TDRQ       (1 << 5)        /* Transmit Data Request */
+#define LSR_BI         (1 << 4)        /* Break Interrupt */
+#define LSR_FE         (1 << 3)        /* Framing Error */
+#define LSR_PE         (1 << 2)        /* Parity Error */
+#define LSR_OE         (1 << 1)        /* Overrun Error */
+#define LSR_DR         (1 << 0)        /* Data Ready */
+
+#define MCR_LOOP       (1 << 4)        */
+#define MCR_OUT2       (1 << 3)        /* force MSR_DCD in loopback mode */
+#define MCR_OUT1       (1 << 2)        /* force MSR_RI in loopback mode */
+#define MCR_RTS                (1 << 1)        /* Request to Send */
+#define MCR_DTR                (1 << 0)        /* Data Terminal Ready */
+
+#define MSR_DCD                (1 << 7)        /* Data Carrier Detect */
+#define MSR_RI         (1 << 6)        /* Ring Indicator */
+#define MSR_DSR                (1 << 5)        /* Data Set Ready */
+#define MSR_CTS                (1 << 4)        /* Clear To Send */
+#define MSR_DDCD       (1 << 3)        /* Delta Data Carrier Detect */
+#define MSR_TERI       (1 << 2)        /* Trailing Edge Ring Indicator */
+#define MSR_DDSR       (1 << 1)        /* Delta Data Set Ready */
+#define MSR_DCTS       (1 << 0)        /* Delta Clear To Send */
+
+/*
+ * IrSR (Infrared Selection Register)
+ */
+#define IrSR_OFFSET 0x20
+
+#define IrSR_RXPL_NEG_IS_ZERO (1<<4)
+#define IrSR_RXPL_POS_IS_ZERO 0x0
+#define IrSR_TXPL_NEG_IS_ZERO (1<<3)
+#define IrSR_TXPL_POS_IS_ZERO 0x0
+#define IrSR_XMODE_PULSE_1_6  (1<<2)
+#define IrSR_XMODE_PULSE_3_16 0x0
+#define IrSR_RCVEIR_IR_MODE   (1<<1)
+#define IrSR_RCVEIR_UART_MODE 0x0
+#define IrSR_XMITIR_IR_MODE   (1<<0)
+#define IrSR_XMITIR_UART_MODE 0x0
+
+#define IrSR_IR_RECEIVE_ON (\
+                IrSR_RXPL_NEG_IS_ZERO | \
+                IrSR_TXPL_POS_IS_ZERO | \
+                IrSR_XMODE_PULSE_3_16 | \
+                IrSR_RCVEIR_IR_MODE   | \
+                IrSR_XMITIR_UART_MODE)
+
+#define IrSR_IR_TRANSMIT_ON (\
+                IrSR_RXPL_NEG_IS_ZERO | \
+                IrSR_TXPL_POS_IS_ZERO | \
+                IrSR_XMODE_PULSE_3_16 | \
+                IrSR_RCVEIR_UART_MODE | \
+                IrSR_XMITIR_IR_MODE)
+
+
+/*
+ * I2C registers
+ */
+
+#define IBMR           __REG(0x40301680)  /* I2C Bus Monitor Register - IBMR */
+#define IDBR           __REG(0x40301688)  /* I2C Data Buffer Register - IDBR */
+#define ICR            __REG(0x40301690)  /* I2C Control Register - ICR */
+#define ISR            __REG(0x40301698)  /* I2C Status Register - ISR */
+#define ISAR           __REG(0x403016A0)  /* I2C Slave Address Register - ISAR */
+
+
+/*
+ * Serial Audio Controller
+ */
+
+
+/* FIXME the audio defines collide w/ the SA1111 defines.  I don't like these
+ * short defines because there is too much chance of namespace collision */
+
+//#define SACR0                __REG(0x40400000)  /* Global Control Register */
+//#define SACR1                __REG(0x40400004)  /* Serial Audio I 2 S/MSB-Justified Control Register */
+//#define SASR0                __REG(0x4040000C)  /* Serial Audio I 2 S/MSB-Justified Interface and FIFO Status Register */
+//#define SAIMR                __REG(0x40400014)  /* Serial Audio Interrupt Mask Register */
+//#define SAICR                __REG(0x40400018)  /* Serial Audio Interrupt Clear Register */
+//#define SADIV                __REG(0x40400060)  /* Audio Clock Divider Register. */
+//#define SADR         __REG(0x40400080)  /* Serial Audio Data Register (TX and RX FIFO access Register). */
+
+
+/*
+ * AC97 Controller registers
+ */
+
+#define POCR           __REG(0x40500000)  /* PCM Out Control Register */
+#define POCR_FEIE      (1 << 3)        /* FIFO Error Interrupt Enable */
+
+#define PICR           __REG(0x40500004)  /* PCM In Control Register */
+#define PICR_FEIE      (1 << 3)        /* FIFO Error Interrupt Enable */
+
+#define MCCR           __REG(0x40500008)  /* Mic In Control Register */
+#define MCCR_FEIE      (1 << 3)        /* FIFO Error Interrupt Enable */
+
+#define GCR            __REG(0x4050000C)  /* Global Control Register */
+#define GCR_CDONE_IE   (1 << 19)       /* Command Done Interrupt Enable */
+#define GCR_SDONE_IE   (1 << 18)       /* Status Done Interrupt Enable */
+#define GCR_SECRDY_IEN (1 << 9)        /* Secondary Ready Interrupt Enable */
+#define GCR_PRIRDY_IEN (1 << 8)        /* Primary Ready Interrupt Enable */
+#define GCR_SECRES_IEN (1 << 5)        /* Secondary Resume Interrupt Enable */
+#define GCR_PRIRES_IEN (1 << 4)        /* Primary Resume Interrupt Enable */
+#define GCR_ACLINK_OFF (1 << 3)        /* AC-link Shut Off */
+#define GCR_WARM_RST   (1 << 2)        /* AC97 Warm Reset */
+#define GCR_COLD_RST   (1 << 1)        /* AC'97 Cold Reset (0 = active) */
+#define GCR_GIE                (1 << 0)        /* Codec GPI Interrupt Enable */
+
+#define POSR           __REG(0x40500010)  /* PCM Out Status Register */
+#define POSR_FIFOE     (1 << 4)        /* FIFO error */
+
+#define PISR           __REG(0x40500014)  /* PCM In Status Register */
+#define PISR_FIFOE     (1 << 4)        /* FIFO error */
+
+#define MCSR           __REG(0x40500018)  /* Mic In Status Register */
+#define MCSR_FIFOE     (1 << 4)        /* FIFO error */
+
+#define GSR            __REG(0x4050001C)  /* Global Status Register */
+#define GSR_CDONE      (1 << 19)       /* Command Done */
+#define GSR_SDONE      (1 << 18)       /* Status Done */
+#define GSR_RDCS       (1 << 15)       /* Read Completion Status */
+#define GSR_BIT3SLT12  (1 << 14)       /* Bit 3 of slot 12 */
+#define GSR_BIT2SLT12  (1 << 13)       /* Bit 2 of slot 12 */
+#define GSR_BIT1SLT12  (1 << 12)       /* Bit 1 of slot 12 */
+#define GSR_SECRES     (1 << 11)       /* Secondary Resume Interrupt */
+#define GSR_PRIRES     (1 << 10)       /* Primary Resume Interrupt */
+#define GSR_SCR                (1 << 9)        /* Secondary Codec Ready */
+#define GSR_PCR                (1 << 8)        /*  Primary Codec Ready */
+#define GSR_MINT       (1 << 7)        /* Mic In Interrupt */
+#define GSR_POINT      (1 << 6)        /* PCM Out Interrupt */
+#define GSR_PIINT      (1 << 5)        /* PCM In Interrupt */
+#define GSR_MOINT      (1 << 2)        /* Modem Out Interrupt */
+#define GSR_MIINT      (1 << 1)        /* Modem In Interrupt */
+#define GSR_GSCI       (1 << 0)        /* Codec GPI Status Change Interrupt */
+
+#define CAR            __REG(0x40500020)  /* CODEC Access Register */
+#define CAR_CAIP       (1 << 0)        /* Codec Access In Progress */
+
+#define PCDR           __REG(0x40500040)  /* PCM FIFO Data Register */
+#define MCDR           __REG(0x40500060)  /* Mic-in FIFO Data Register */
+
+#define MOCR           __REG(0x40500100)  /* Modem Out Control Register */
+#define MOCR_FEIE      (1 << 3)        /* FIFO Error */
+
+#define MICR           __REG(0x40500108)  /* Modem In Control Register */
+#define MICR_FEIE      (1 << 3)        /* FIFO Error */
+
+#define MOSR           __REG(0x40500110)  /* Modem Out Status Register */
+#define MOSR_FIFOE     (1 << 4)        /* FIFO error */
+
+#define MISR           __REG(0x40500118)  /* Modem In Status Register */
+#define MISR_FIFOE     (1 << 4)        /* FIFO error */
+
+#define MODR           __REG(0x40500140)  /* Modem FIFO Data Register */
+
+#define PAC_REG_BASE   __REG(0x40500200)  /* Primary Audio Codec */
+#define SAC_REG_BASE   __REG(0x40500300)  /* Secondary Audio Codec */
+#define PMC_REG_BASE   __REG(0x40500400)  /* Primary Modem Codec */
+#define SMC_REG_BASE   __REG(0x40500500)  /* Secondary Modem Codec */
+
+
+/*
+ * USB Device Controller
+ */
+
+#define UDCCR          __REG(0x40600000)  /* UDC Control Register */
+#define UDCCS0         __REG(0x40600010)  /* UDC Endpoint 0 Control/Status Register */
+#define UDCCS1         __REG(0x40600014)  /* UDC Endpoint 1 (IN) Control/Status Register */
+#define UDCCS2         __REG(0x40600018)  /* UDC Endpoint 2 (OUT) Control/Status Register */
+#define UDCCS3         __REG(0x4060001C)  /* UDC Endpoint 3 (IN) Control/Status Register */
+#define UDCCS4         __REG(0x40600020)  /* UDC Endpoint 4 (OUT) Control/Status Register */
+#define UDCCS5         __REG(0x40600024)  /* UDC Endpoint 5 (Interrupt) Control/Status Register */
+#define UDCCS6         __REG(0x40600028)  /* UDC Endpoint 6 (IN) Control/Status Register */
+#define UDCCS7         __REG(0x4060002C)  /* UDC Endpoint 7 (OUT) Control/Status Register */
+#define UDCCS8         __REG(0x40600030)  /* UDC Endpoint 8 (IN) Control/Status Register */
+#define UDCCS9         __REG(0x40600034)  /* UDC Endpoint 9 (OUT) Control/Status Register */
+#define UDCCS10                __REG(0x40600038)  /* UDC Endpoint 10 (Interrupt) Control/Status Register */
+#define UDCCS11                __REG(0x4060003C)  /* UDC Endpoint 11 (IN) Control/Status Register */
+#define UDCCS12                __REG(0x40600040)  /* UDC Endpoint 12 (OUT) Control/Status Register */
+#define UDCCS13                __REG(0x40600044)  /* UDC Endpoint 13 (IN) Control/Status Register */
+#define UDCCS14                __REG(0x40600048)  /* UDC Endpoint 14 (OUT) Control/Status Register */
+#define UDCCS15                __REG(0x4060004C)  /* UDC Endpoint 15 (Interrupt) Control/Status Register */
+#define UFNRH          __REG(0x40600060)  /* UDC Frame Number Register High */
+#define UFNRL          __REG(0x40600064)  /* UDC Frame Number Register Low */
+#define UBCR2          __REG(0x40600068)  /* UDC Byte Count Reg 2 */
+#define UBCR4          __REG(0x4060006c)  /* UDC Byte Count Reg 4 */
+#define UBCR7          __REG(0x40600070)  /* UDC Byte Count Reg 7 */
+#define UBCR9          __REG(0x40600074)  /* UDC Byte Count Reg 9 */
+#define UBCR12         __REG(0x40600078)  /* UDC Byte Count Reg 12 */
+#define UBCR14         __REG(0x4060007c)  /* UDC Byte Count Reg 14 */
+#define UDDR0          __REG(0x40600080)  /* UDC Endpoint 0 Data Register */
+#define UDDR1          __REG(0x40600100)  /* UDC Endpoint 1 Data Register */
+#define UDDR2          __REG(0x40600180)  /* UDC Endpoint 2 Data Register */
+#define UDDR3          __REG(0x40600200)  /* UDC Endpoint 3 Data Register */
+#define UDDR4          __REG(0x40600400)  /* UDC Endpoint 4 Data Register */
+#define UDDR5          __REG(0x406000A0)  /* UDC Endpoint 5 Data Register */
+#define UDDR6          __REG(0x40600600)  /* UDC Endpoint 6 Data Register */
+#define UDDR7          __REG(0x40600680)  /* UDC Endpoint 7 Data Register */
+#define UDDR8          __REG(0x40600700)  /* UDC Endpoint 8 Data Register */
+#define UDDR9          __REG(0x40600900)  /* UDC Endpoint 9 Data Register */
+#define UDDR10         __REG(0x406000C0)  /* UDC Endpoint 10 Data Register */
+#define UDDR11         __REG(0x40600B00)  /* UDC Endpoint 11 Data Register */
+#define UDDR12         __REG(0x40600B80)  /* UDC Endpoint 12 Data Register */
+#define UDDR13         __REG(0x40600C00)  /* UDC Endpoint 13 Data Register */
+#define UDDR14         __REG(0x40600E00)  /* UDC Endpoint 14 Data Register */
+#define UDDR15         __REG(0x406000E0)  /* UDC Endpoint 15 Data Register */
+#define UICR0          __REG(0x40600050)  /* UDC Interrupt Control Register 0 */
+#define UICR1          __REG(0x40600054)  /* UDC Interrupt Control Register 1 */
+#define USIR0          __REG(0x40600058)  /* UDC Status Interrupt Register 0 */
+#define USIR1          __REG(0x4060005C)  /* UDC Status Interrupt Register 1 */
+
+
+/*
+ * Fast Infrared Communication Port
+ */
+
+#define ICCR0          __REG(0x40800000)  /* ICP Control Register 0 */
+#define ICCR1          __REG(0x40800004)  /* ICP Control Register 1 */
+#define ICCR2          __REG(0x40800008)  /* ICP Control Register 2 */
+#define ICDR           __REG(0x4080000c)  /* ICP Data Register */
+#define ICSR0          __REG(0x40800014)  /* ICP Status Register 0 */
+#define ICSR1          __REG(0x40800018)  /* ICP Status Register 1 */
+
+
+/*
+ * Real Time Clock
+ */
+
+#define RCNR           __REG(0x40900000)  /* RTC Count Register */
+#define RTAR           __REG(0x40900004)  /* RTC Alarm Register */
+#define RTSR           __REG(0x40900008)  /* RTC Status Register */
+#define RTTR           __REG(0x4090000C)  /* RTC Timer Trim Register */
+
+#define RTSR_HZE       (1 << 3)        /* HZ interrupt enable */
+#define RTSR_ALE       (1 << 2)        /* RTC alarm interrupt enable */
+#define RTSR_HZ                (1 << 1)        /* HZ rising-edge detected */
+#define RTSR_AL                (1 << 0)        /* RTC alarm detected */
+
+
+/*
+ * OS Timer & Match Registers
+ */
+
+#define OSMR0          __REG(0x40A00000)  /* */
+#define OSMR1          __REG(0x40A00004)  /* */
+#define OSMR2          __REG(0x40A00008)  /* */
+#define OSMR3          __REG(0x40A0000C)  /* */
+#define OSCR           __REG(0x40A00010)  /* OS Timer Counter Register */
+#define OSSR           __REG(0x40A00014)  /* OS Timer Status Register */
+#define OWER           __REG(0x40A00018)  /* OS Timer Watchdog Enable Register */
+#define OIER           __REG(0x40A0001C)  /* OS Timer Interrupt Enable Register */
+
+#define OSSR_M3                (1 << 3)        /* Match status channel 3 */
+#define OSSR_M2                (1 << 2)        /* Match status channel 2 */
+#define OSSR_M1                (1 << 1)        /* Match status channel 1 */
+#define OSSR_M0                (1 << 0)        /* Match status channel 0 */
+
+#define OWER_WME       (1 << 0)        /* Watchdog Match Enable */
+
+#define OIER_E3                (1 << 3)        /* Interrupt enable channel 3 */
+#define OIER_E2                (1 << 2)        /* Interrupt enable channel 2 */
+#define OIER_E1                (1 << 1)        /* Interrupt enable channel 1 */
+#define OIER_E0                (1 << 0)        /* Interrupt enable channel 0 */
+
+
+/*
+ * Pulse Width Modulator
+ */
+
+#define PWM_CTRL0      __REG(0x40B00000)  /* PWM 0 Control Register */
+#define PWM_PWDUTY0    __REG(0x40B00004)  /* PWM 0 Duty Cycle Register */
+#define PWM_PERVAL0    __REG(0x40B00008)  /* PWM 0 Period Control Register */
+
+#define PWM_CTRL1      __REG(0x40C00000)  /* PWM 1Control Register */
+#define PWM_PWDUTY1    __REG(0x40C00004)  /* PWM 1 Duty Cycle Register */
+#define PWM_PERVAL1    __REG(0x40C00008)  /* PWM 1 Period Control Register */
+
+
+/*
+ * Interrupt Controller
+ */
+
+#define ICIP           __REG(0x40D00000)  /* Interrupt Controller IRQ Pending Register */
+#define ICMR           __REG(0x40D00004)  /* Interrupt Controller Mask Register */
+#define ICLR           __REG(0x40D00008)  /* Interrupt Controller Level Register */
+#define ICFP           __REG(0x40D0000C)  /* Interrupt Controller FIQ Pending Register */
+#define ICPR           __REG(0x40D00010)  /* Interrupt Controller Pending Register */
+#define ICCR           __REG(0x40D00014)  /* Interrupt Controller Control Register */
+
+
+/*
+ * General Purpose I/O
+ */
+
+#define GPLR0          __REG(0x40E00000)  /* GPIO Pin-Level Register GPIO<31:0> */
+#define GPLR1          __REG(0x40E00004)  /* GPIO Pin-Level Register GPIO<63:32> */
+#define GPLR2          __REG(0x40E00008)  /* GPIO Pin-Level Register GPIO<80:64> */
+
+#define GPDR0          __REG(0x40E0000C)  /* GPIO Pin Direction Register GPIO<31:0> */
+#define GPDR1          __REG(0x40E00010)  /* GPIO Pin Direction Register GPIO<63:32> */
+#define GPDR2          __REG(0x40E00014)  /* GPIO Pin Direction Register GPIO<80:64> */
+
+#define GPSR0          __REG(0x40E00018)  /* GPIO Pin Output Set Register GPIO<31:0> */
+#define GPSR1          __REG(0x40E0001C)  /* GPIO Pin Output Set Register GPIO<63:32> */
+#define GPSR2          __REG(0x40E00020)  /* GPIO Pin Output Set Register GPIO<80:64> */
+
+#define GPCR0          __REG(0x40E00024)  /* GPIO Pin Output Clear Register GPIO<31:0> */
+#define GPCR1          __REG(0x40E00028)  /* GPIO Pin Output Clear Register GPIO <63:32> */
+#define GPCR2          __REG(0x40E0002C)  /* GPIO Pin Output Clear Register GPIO <80:64> */
+
+#define GRER0          __REG(0x40E00030)  /* GPIO Rising-Edge Detect Register GPIO<31:0> */
+#define GRER1          __REG(0x40E00034)  /* GPIO Rising-Edge Detect Register GPIO<63:32> */
+#define GRER2          __REG(0x40E00038)  /* GPIO Rising-Edge Detect Register GPIO<80:64> */
+
+#define GFER0          __REG(0x40E0003C)  /* GPIO Falling-Edge Detect Register GPIO<31:0> */
+#define GFER1          __REG(0x40E00040)  /* GPIO Falling-Edge Detect Register GPIO<63:32> */
+#define GFER2          __REG(0x40E00044)  /* GPIO Falling-Edge Detect Register GPIO<80:64> */
+
+#define GEDR0          __REG(0x40E00048)  /* GPIO Edge Detect Status Register GPIO<31:0> */
+#define GEDR1          __REG(0x40E0004C)  /* GPIO Edge Detect Status Register GPIO<63:32> */
+#define GEDR2          __REG(0x40E00050)  /* GPIO Edge Detect Status Register GPIO<80:64> */
+
+#define GAFR0_L                __REG(0x40E00054)  /* GPIO Alternate Function Select Register GPIO<15:0> */
+#define GAFR0_U                __REG(0x40E00058)  /* GPIO Alternate Function Select Register GPIO<31:16> */
+#define GAFR1_L                __REG(0x40E0005C)  /* GPIO Alternate Function Select Register GPIO<47:32> */
+#define GAFR1_U                __REG(0x40E00060)  /* GPIO Alternate Function Select Register GPIO<63:48> */
+#define GAFR2_L                __REG(0x40E00064)  /* GPIO Alternate Function Select Register GPIO<79:64> */
+#define GAFR2_U                __REG(0x40E00068)  /* GPIO Alternate Function Select Register GPIO 80 */
+
+/* More handy macros.  The argument is a literal GPIO number. */
+
+#define GPIO_bit(x)    (1 << ((x) & 0x1f))
+#define GPLR(x)                __REG2(0x40E00000, ((x) & 0x60) >> 3)
+#define GPDR(x)                __REG2(0x40E0000C, ((x) & 0x60) >> 3)
+#define GPSR(x)                __REG2(0x40E00018, ((x) & 0x60) >> 3)
+#define GPCR(x)                __REG2(0x40E00024, ((x) & 0x60) >> 3)
+#define GRER(x)                __REG2(0x40E00030, ((x) & 0x60) >> 3)
+#define GFER(x)                __REG2(0x40E0003C, ((x) & 0x60) >> 3)
+#define GEDR(x)                __REG2(0x40E00048, ((x) & 0x60) >> 3)
+#define GAFR(x)                __REG2(0x40E00054, ((x) & 0x70) >> 2)
+
+/* GPIO alternate function assignments */
+
+#define GPIO1_RST              1       /* reset */
+#define GPIO6_MMCCLK           6       /* MMC Clock */
+#define GPIO8_48MHz            7       /* 48 MHz clock output */
+#define GPIO8_MMCCS0           8       /* MMC Chip Select 0 */
+#define GPIO9_MMCCS1           9       /* MMC Chip Select 1 */
+#define GPIO10_RTCCLK          10      /* real time clock (1 Hz) */
+#define GPIO11_3_6MHz          11      /* 3.6 MHz oscillator out */
+#define GPIO12_32KHz           12      /* 32 kHz out */
+#define GPIO13_MBGNT           13      /* memory controller grant */
+#define GPIO14_MBREQ           14      /* alternate bus master request */
+#define GPIO15_nCS_1           15      /* chip select 1 */
+#define GPIO16_PWM0            16      /* PWM0 output */
+#define GPIO17_PWM1            17      /* PWM1 output */
+#define GPIO18_RDY             18      /* Ext. Bus Ready */
+#define GPIO19_DREQ1           19      /* External DMA Request */
+#define GPIO20_DREQ0           20      /* External DMA Request */
+#define GPIO23_SCLK            23      /* SSP clock */
+#define GPIO24_SFRM            24      /* SSP Frame */
+#define GPIO25_STXD            25      /* SSP transmit */
+#define GPIO26_SRXD            26      /* SSP receive */
+#define GPIO27_SEXTCLK         27      /* SSP ext_clk */
+#define GPIO28_BITCLK          28      /* AC97/I2S bit_clk */
+#define GPIO29_SDATA_IN                29      /* AC97 Sdata_in0 / I2S Sdata_in */
+#define GPIO30_SDATA_OUT       30      /* AC97/I2S Sdata_out */
+#define GPIO31_SYNC            31      /* AC97/I2S sync */
+#define GPIO32_SDATA_IN1       32      /* AC97 Sdata_in1 */
+#define GPIO33_nCS_5           33      /* chip select 5 */
+#define GPIO34_FFRXD           34      /* FFUART receive */
+#define GPIO34_MMCCS0          34      /* MMC Chip Select 0 */
+#define GPIO35_FFCTS           35      /* FFUART Clear to send */
+#define GPIO36_FFDCD           36      /* FFUART Data carrier detect */
+#define GPIO37_FFDSR           37      /* FFUART data set ready */
+#define GPIO38_FFRI            38      /* FFUART Ring Indicator */
+#define GPIO39_MMCCS1          39      /* MMC Chip Select 1 */
+#define GPIO39_FFTXD           39      /* FFUART transmit data */
+#define GPIO40_FFDTR           40      /* FFUART data terminal Ready */
+#define GPIO41_FFRTS           41      /* FFUART request to send */
+#define GPIO42_BTRXD           42      /* BTUART receive data */
+#define GPIO43_BTTXD           43      /* BTUART transmit data */
+#define GPIO44_BTCTS           44      /* BTUART clear to send */
+#define GPIO45_BTRTS           45      /* BTUART request to send */
+#define GPIO46_ICPRXD          46      /* ICP receive data */
+#define GPIO46_STRXD           46      /* STD_UART receive data */
+#define GPIO47_ICPTXD          47      /* ICP transmit data */
+#define GPIO47_STTXD           47      /* STD_UART transmit data */
+#define GPIO48_nPOE            48      /* Output Enable for Card Space */
+#define GPIO49_nPWE            49      /* Write Enable for Card Space */
+#define GPIO50_nPIOR           50      /* I/O Read for Card Space */
+#define GPIO51_nPIOW           51      /* I/O Write for Card Space */
+#define GPIO52_nPCE_1          52      /* Card Enable for Card Space */
+#define GPIO53_nPCE_2          53      /* Card Enable for Card Space */
+#define GPIO53_MMCCLK          53      /* MMC Clock */
+#define GPIO54_MMCCLK          54      /* MMC Clock */
+#define GPIO54_pSKTSEL         54      /* Socket Select for Card Space */
+#define GPIO55_nPREG           55      /* Card Address bit 26 */
+#define GPIO56_nPWAIT          56      /* Wait signal for Card Space */
+#define GPIO57_nIOIS16         57      /* Bus Width select for I/O Card Space */
+#define GPIO58_LDD_0           58      /* LCD data pin 0 */
+#define GPIO59_LDD_1           59      /* LCD data pin 1 */
+#define GPIO60_LDD_2           60      /* LCD data pin 2 */
+#define GPIO61_LDD_3           61      /* LCD data pin 3 */
+#define GPIO62_LDD_4           62      /* LCD data pin 4 */
+#define GPIO63_LDD_5           63      /* LCD data pin 5 */
+#define GPIO64_LDD_6           64      /* LCD data pin 6 */
+#define GPIO65_LDD_7           65      /* LCD data pin 7 */
+#define GPIO66_LDD_8           66      /* LCD data pin 8 */
+#define GPIO66_MBREQ           66      /* alternate bus master req */
+#define GPIO67_LDD_9           67      /* LCD data pin 9 */
+#define GPIO67_MMCCS0          67      /* MMC Chip Select 0 */
+#define GPIO68_LDD_10          68      /* LCD data pin 10 */
+#define GPIO68_MMCCS1          68      /* MMC Chip Select 1 */
+#define GPIO69_LDD_11          69      /* LCD data pin 11 */
+#define GPIO69_MMCCLK          69      /* MMC_CLK */
+#define GPIO70_LDD_12          70      /* LCD data pin 12 */
+#define GPIO70_RTCCLK          70      /* Real Time clock (1 Hz) */
+#define GPIO71_LDD_13          71      /* LCD data pin 13 */
+#define GPIO71_3_6MHz          71      /* 3.6 MHz Oscillator clock */
+#define GPIO72_LDD_14          72      /* LCD data pin 14 */
+#define GPIO72_32kHz           72      /* 32 kHz clock */
+#define GPIO73_LDD_15          73      /* LCD data pin 15 */
+#define GPIO73_MBGNT           73      /* Memory controller grant */
+#define GPIO74_LCD_FCLK                74      /* LCD Frame clock */
+#define GPIO75_LCD_LCLK                75      /* LCD line clock */
+#define GPIO76_LCD_PCLK                76      /* LCD Pixel clock */
+#define GPIO77_LCD_ACBIAS      77      /* LCD AC Bias */
+#define GPIO78_nCS_2           78      /* chip select 2 */
+#define GPIO79_nCS_3           79      /* chip select 3 */
+#define GPIO80_nCS_4           80      /* chip select 4 */
+
+/* GPIO alternate function mode & direction */
+
+#define GPIO_IN                        0x000
+#define GPIO_OUT               0x080
+#define GPIO_ALT_FN_1_IN       0x100
+#define GPIO_ALT_FN_1_OUT      0x180
+#define GPIO_ALT_FN_2_IN       0x200
+#define GPIO_ALT_FN_2_OUT      0x280
+#define GPIO_ALT_FN_3_IN       0x300
+#define GPIO_ALT_FN_3_OUT      0x380
+#define GPIO_MD_MASK_NR                0x07f
+#define GPIO_MD_MASK_DIR       0x080
+#define GPIO_MD_MASK_FN                0x300
+
+#define GPIO1_RTS_MD           ( 1 | GPIO_ALT_FN_1_IN)
+#define GPIO6_MMCCLK_MD                ( 6 | GPIO_ALT_FN_1_OUT)
+#define GPIO8_48MHz_MD         ( 8 | GPIO_ALT_FN_1_OUT)
+#define GPIO8_MMCCS0_MD                ( 8 | GPIO_ALT_FN_1_OUT)
+#define GPIO9_MMCCS1_MD                ( 9 | GPIO_ALT_FN_1_OUT)
+#define GPIO10_RTCCLK_MD       (10 | GPIO_ALT_FN_1_OUT)
+#define GPIO11_3_6MHz_MD       (11 | GPIO_ALT_FN_1_OUT)
+#define GPIO12_32KHz_MD                (12 | GPIO_ALT_FN_1_OUT)
+#define GPIO13_MBGNT_MD                (13 | GPIO_ALT_FN_2_OUT)
+#define GPIO14_MBREQ_MD                (14 | GPIO_ALT_FN_1_IN)
+#define GPIO15_nCS_1_MD                (15 | GPIO_ALT_FN_2_OUT)
+#define GPIO16_PWM0_MD         (16 | GPIO_ALT_FN_2_OUT)
+#define GPIO17_PWM1_MD         (17 | GPIO_ALT_FN_2_OUT)
+#define GPIO18_RDY_MD          (18 | GPIO_ALT_FN_1_IN)
+#define GPIO19_DREQ1_MD                (19 | GPIO_ALT_FN_1_IN)
+#define GPIO20_DREQ0_MD                (20 | GPIO_ALT_FN_1_IN)
+#define GPIO23_SCLK_md         (23 | GPIO_ALT_FN_2_OUT)
+#define GPIO24_SFRM_MD         (24 | GPIO_ALT_FN_2_OUT)
+#define GPIO25_STXD_MD         (25 | GPIO_ALT_FN_2_OUT)
+#define GPIO26_SRXD_MD         (26 | GPIO_ALT_FN_1_IN)
+#define GPIO27_SEXTCLK_MD      (27 | GPIO_ALT_FN_1_IN)
+#define GPIO28_BITCLK_AC97_MD  (28 | GPIO_ALT_FN_1_IN)
+#define GPIO28_BITCLK_I2S_MD   (28 | GPIO_ALT_FN_2_IN)
+#define GPIO29_SDATA_IN_AC97_MD        (29 | GPIO_ALT_FN_1_IN)
+#define GPIO29_SDATA_IN_I2S_MD (29 | GPIO_ALT_FN_2_IN)
+#define GPIO30_SDATA_OUT_AC97_MD       (30 | GPIO_ALT_FN_2_OUT)
+#define GPIO30_SDATA_OUT_I2S_MD        (30 | GPIO_ALT_FN_1_OUT)
+#define GPIO31_SYNC_AC97_MD    (31 | GPIO_ALT_FN_2_OUT)
+#define GPIO31_SYNC_I2S_MD     (31 | GPIO_ALT_FN_1_OUT)
+#define GPIO32_SDATA_IN1_AC97_MD       (32 | GPIO_ALT_FN_1_IN)
+#define GPIO33_nCS_5_MD                (33 | GPIO_ALT_FN_2_OUT)
+#define GPIO34_FFRXD_MD                (34 | GPIO_ALT_FN_1_IN)
+#define GPIO34_MMCCS0_MD       (34 | GPIO_ALT_FN_2_OUT)
+#define GPIO35_FFCTS_MD                (35 | GPIO_ALT_FN_1_IN)
+#define GPIO36_FFDCD_MD                (36 | GPIO_ALT_FN_1_IN)
+#define GPIO37_FFDSR_MD                (37 | GPIO_ALT_FN_1_IN)
+#define GPIO38_FFRI_MD         (38 | GPIO_ALT_FN_1_IN)
+#define GPIO39_MMCCS1_MD       (39 | GPIO_ALT_FN_1_OUT)
+#define GPIO39_FFTXD_MD                (39 | GPIO_ALT_FN_2_OUT)
+#define GPIO40_FFDTR_MD                (40 | GPIO_ALT_FN_2_OUT)
+#define GPIO41_FFRTS_MD                (41 | GPIO_ALT_FN_2_OUT)
+#define GPIO42_BTRXD_MD                (42 | GPIO_ALT_FN_1_IN)
+#define GPIO43_BTTXD_MD                (43 | GPIO_ALT_FN_2_OUT)
+#define GPIO44_BTCTS_MD                (44 | GPIO_ALT_FN_1_IN)
+#define GPIO45_BTRTS_MD                (45 | GPIO_ALT_FN_2_OUT)
+#define GPIO46_ICPRXD_MD       (46 | GPIO_ALT_FN_1_IN)
+#define GPIO46_STRXD_MD                (46 | GPIO_ALT_FN_2_IN)
+#define GPIO47_ICPTXD_MD       (47 | GPIO_ALT_FN_2_OUT)
+#define GPIO47_STTXD_MD                (47 | GPIO_ALT_FN_1_OUT)
+#define GPIO48_nPOE_MD         (48 | GPIO_ALT_FN_2_OUT)
+#define GPIO49_nPWE_MD         (49 | GPIO_ALT_FN_2_OUT)
+#define GPIO50_nPIOR_MD                (50 | GPIO_ALT_FN_2_OUT)
+#define GPIO51_nPIOW_MD                (51 | GPIO_ALT_FN_2_OUT)
+#define GPIO52_nPCE_1_MD       (52 | GPIO_ALT_FN_2_OUT)
+#define GPIO53_nPCE_2_MD       (53 | GPIO_ALT_FN_2_OUT)
+#define GPIO53_MMCCLK_MD       (53 | GPIO_ALT_FN_1_OUT)
+#define GPIO54_MMCCLK_MD       (54 | GPIO_ALT_FN_1_OUT)
+#define GPIO54_pSKTSEL_MD      (54 | GPIO_ALT_FN_2_OUT)
+#define GPIO55_nPREG_MD                (55 | GPIO_ALT_FN_2_OUT)
+#define GPIO56_nPWAIT_MD       (56 | GPIO_ALT_FN_1_IN)
+#define GPIO57_nIOIS16_MD      (57 | GPIO_ALT_FN_1_IN)
+#define GPIO58_LDD_0_MD                (58 | GPIO_ALT_FN_2_OUT)
+#define GPIO59_LDD_1_MD                (59 | GPIO_ALT_FN_2_OUT)
+#define GPIO60_LDD_2_MD                (60 | GPIO_ALT_FN_2_OUT)
+#define GPIO61_LDD_3_MD                (61 | GPIO_ALT_FN_2_OUT)
+#define GPIO62_LDD_4_MD                (62 | GPIO_ALT_FN_2_OUT)
+#define GPIO63_LDD_5_MD                (63 | GPIO_ALT_FN_2_OUT)
+#define GPIO64_LDD_6_MD                (64 | GPIO_ALT_FN_2_OUT)
+#define GPIO65_LDD_7_MD                (65 | GPIO_ALT_FN_2_OUT)
+#define GPIO66_LDD_8_MD                (66 | GPIO_ALT_FN_2_OUT)
+#define GPIO66_MBREQ_MD                (66 | GPIO_ALT_FN_1_IN)
+#define GPIO67_LDD_9_MD                (67 | GPIO_ALT_FN_2_OUT)
+#define GPIO67_MMCCS0_MD       (67 | GPIO_ALT_FN_1_OUT)
+#define GPIO68_LDD_10_MD       (68 | GPIO_ALT_FN_2_OUT)
+#define GPIO68_MMCCS1_MD       (68 | GPIO_ALT_FN_1_OUT)
+#define GPIO69_LDD_11_MD       (69 | GPIO_ALT_FN_2_OUT)
+#define GPIO69_MMCCLK_MD       (69 | GPIO_ALT_FN_1_OUT)
+#define GPIO70_LDD_12_MD       (70 | GPIO_ALT_FN_2_OUT)
+#define GPIO70_RTCCLK_MD       (70 | GPIO_ALT_FN_1_OUT)
+#define GPIO71_LDD_13_MD       (71 | GPIO_ALT_FN_2_OUT)
+#define GPIO71_3_6MHz_MD       (71 | GPIO_ALT_FN_1_OUT)
+#define GPIO72_LDD_14_MD       (72 | GPIO_ALT_FN_2_OUT)
+#define GPIO72_32kHz_MD                (72 | GPIO_ALT_FN_1_OUT)
+#define GPIO73_LDD_15_MD       (73 | GPIO_ALT_FN_2_OUT)
+#define GPIO73_MBGNT_MD                (73 | GPIO_ALT_FN_1_OUT)
+#define GPIO74_LCD_FCLK_MD     (74 | GPIO_ALT_FN_2_OUT)
+#define GPIO75_LCD_LCLK_MD     (75 | GPIO_ALT_FN_2_OUT)
+#define GPIO76_LCD_PCLK_MD     (76 | GPIO_ALT_FN_2_OUT)
+#define GPIO77_LCD_ACBIAS_MD   (77 | GPIO_ALT_FN_2_OUT)
+#define GPIO78_nCS_2_MD                (78 | GPIO_ALT_FN_2_OUT)
+#define GPIO79_nCS_3_MD                (79 | GPIO_ALT_FN_2_OUT)
+#define GPIO80_nCS_4_MD                (80 | GPIO_ALT_FN_2_OUT)
+
+
+/*
+ * Power Manager
+ */
+
+#define PMCR           __REG(0x40F00000)  /* Power Manager Control Register */
+#define PSSR           __REG(0x40F00004)  /* Power Manager Sleep Status Register */
+#define PSPR           __REG(0x40F00008)  /* Power Manager Scratch Pad Register */
+#define PWER           __REG(0x40F0000C)  /* Power Manager Wake-up Enable Register */
+#define PRER           __REG(0x40F00010)  /* Power Manager GPIO Rising-Edge Detect Enable Register */
+#define PFER           __REG(0x40F00014)  /* Power Manager GPIO Falling-Edge Detect Enable Register */
+#define PEDR           __REG(0x40F00018)  /* Power Manager GPIO Edge Detect Status Register */
+#define PCFR           __REG(0x40F0001C)  /* Power Manager General Configuration Register */
+#define PGSR0          __REG(0x40F00020)  /* Power Manager GPIO Sleep State Register for GP[31-0] */
+#define PGSR1          __REG(0x40F00024)  /* Power Manager GPIO Sleep State Register for GP[63-32] */
+#define PGSR2          __REG(0x40F00028)  /* Power Manager GPIO Sleep State Register for GP[84-64] */
+#define RCSR           __REG(0x40F00030)  /* Reset Controller Status Register */
+
+
+/*
+ * SSP Serial Port Registers
+ */
+
+#define SSCR0          __REG(0x41000000)  /* SSP Control Register 0 */
+#define SSCR1          __REG(0x41000004)  /* SSP Control Register 1 */
+#define SSSR           __REG(0x41000008)  /* SSP Status Register */
+#define SSITR          __REG(0x4100000C)  /* SSP Interrupt Test Register */
+#define SSDR           __REG(0x41000010)  /* (Write / Read) SSP Data Write Register/SSP Data Read Register */
+
+
+/*
+ * MultiMediaCard (MMC) controller
+ */
+
+#define MMC_STRPCL     __REG(0x41100000)  /* Control to start and stop MMC clock */
+#define MMC_STAT       __REG(0x41100004)  /* MMC Status Register (read only) */
+#define MMC_CLKRT      __REG(0x41100008)  /* MMC clock rate */
+#define MMC_SPI                __REG(0x4110000c)  /* SPI mode control bits */
+#define MMC_CMDAT      __REG(0x41100010)  /* Command/response/data sequence control */
+#define MMC_RESTO      __REG(0x41100014)  /* Expected response time out */
+#define MMC_RDTO       __REG(0x41100018)  /* Expected data read time out */
+#define MMC_BLKLEN     __REG(0x4110001c)  /* Block length of data transaction */
+#define MMC_NOB                __REG(0x41100020)  /* Number of blocks, for block mode */
+#define MMC_PRTBUF     __REG(0x41100024)  /* Partial MMC_TXFIFO FIFO written */
+#define MMC_I_MASK     __REG(0x41100028)  /* Interrupt Mask */
+#define MMC_I_REG      __REG(0x4110002c)  /* Interrupt Register (read only) */
+#define MMC_CMD                __REG(0x41100030)  /* Index of current command */
+#define MMC_ARGH       __REG(0x41100034)  /* MSW part of the current command argument */
+#define MMC_ARGL       __REG(0x41100038)  /* LSW part of the current command argument */
+#define MMC_RES                __REG(0x4110003c)  /* Response FIFO (read only) */
+#define MMC_RXFIFO     __REG(0x41100040)  /* Receive FIFO (read only) */
+#define MMC_TXFIFO     __REG(0x41100044)  /* Transmit FIFO (write only) */
+
+
+/*
+ * Core Clock
+ */
+
+#define CCCR           __REG(0x41300000)  /* Core Clock Configuration Register */
+#define CKEN           __REG(0x41300004)  /* Clock Enable Register */
+#define OSCC           __REG(0x41300008)  /* Oscillator Configuration Register */
+
+#define CCCR_N_MASK    0x0380          /* Run Mode Frequency to Turbo Mode Frequency Multiplier */
+#define CCCR_M_MASK    0x0060          /* Memory Frequency to Run Mode Frequency Multiplier */
+#define CCCR_L_MASK    0x001f          /* Crystal Frequency to Memory Frequency Multiplier */
+
+#define CKEN16_LCD     (1 << 16)       /* LCD Unit Clock Enable */
+#define CKEN14_I2C     (1 << 14)       /* I2C Unit Clock Enable */
+#define CKEN13_FICP    (1 << 13)       /* FICP Unit Clock Enable */
+#define CKEN12_MMC     (1 << 12)       /* MMC Unit Clock Enable */
+#define CKEN11_USB     (1 << 11)       /* USB Unit Clock Enable */
+#define CKEN8_I2S      (1 << 8)        /* I2S Unit Clock Enable */
+#define CKEN7_BTUART   (1 << 7)        /* BTUART Unit Clock Enable */
+#define CKEN6_FFUART   (1 << 6)        /* FFUART Unit Clock Enable */
+#define CKEN5_STUART   (1 << 5)        /* STUART Unit Clock Enable */
+#define CKEN3_SSP      (1 << 3)        /* SSP Unit Clock Enable */
+#define CKEN2_AC97     (1 << 2)        /* AC97 Unit Clock Enable */
+#define CKEN1_PWM1     (1 << 1)        /* PWM1 Clock Enable */
+#define CKEN0_PWM0     (1 << 0)        /* PWM0 Clock Enable */
+
+#define OSCC_OON       (1 << 1)        /* 32.768kHz OON (write-once only bit) */
+#define OSCC_OOK       (1 << 0)        /* 32.768kHz OOK (read-only bit) */
+
+#define  CCCR_L09      (0x1F)
+#define  CCCR_L27      (0x1)
+#define  CCCR_L32      (0x2)
+#define  CCCR_L36      (0x3)
+#define  CCCR_L40      (0x4)
+#define  CCCR_L45      (0x5)
+
+#define  CCCR_M1       (0x1 << 5)
+#define  CCCR_M2       (0x2 << 5)
+#define  CCCR_M4       (0x3 << 5)
+
+#define  CCCR_N10      (0x2 << 7)
+#define  CCCR_N15      (0x3 << 7)
+#define  CCCR_N20      (0x4 << 7)
+#define  CCCR_N25      (0x5 << 7)
+#define  CCCR_N30      (0x6 << 7)
+
+/*
+ * LCD
+ */
+
+#define LCCR0          __REG(0x44000000)  /* LCD Controller Control Register 0 */
+#define LCCR1          __REG(0x44000004)  /* LCD Controller Control Register 1 */
+#define LCCR2          __REG(0x44000008)  /* LCD Controller Control Register 2 */
+#define LCCR3          __REG(0x4400000C)  /* LCD Controller Control Register 3 */
+#define DFBR0          __REG(0x44000020)  /* DMA Channel 0 Frame Branch Register */
+#define DFBR1          __REG(0x44000024)  /* DMA Channel 1 Frame Branch Register */
+#define LCSR           __REG(0x44000038)  /* LCD Controller Status Register */
+#define LIIDR          __REG(0x4400003C)  /* LCD Controller Interrupt ID Register */
+#define TMEDRGBR       __REG(0x44000040)  /* TMED RGB Seed Register */
+#define TMEDCR         __REG(0x44000044)  /* TMED Control Register */
+
+#define FDADR0         __REG(0x44000200)  /* DMA Channel 0 Frame Descriptor Address Register */
+#define FSADR0         __REG(0x44000204)  /* DMA Channel 0 Frame Source Address Register */
+#define FIDR0          __REG(0x44000208)  /* DMA Channel 0 Frame ID Register */
+#define LDCMD0         __REG(0x4400020C)  /* DMA Channel 0 Command Register */
+#define FDADR1         __REG(0x44000210)  /* DMA Channel 1 Frame Descriptor Address Register */
+#define FSADR1         __REG(0x44000214)  /* DMA Channel 1 Frame Source Address Register */
+#define FIDR1          __REG(0x44000218)  /* DMA Channel 1 Frame ID Register */
+#define LDCMD1         __REG(0x4400021C)  /* DMA Channel 1 Command Register */
+
+#define LCCR0_ENB      (1 << 0)        /* LCD Controller enable */
+#define LCCR0_CMS      (1 << 1)        /* Color = 0, Monochrome = 1 */
+#define LCCR0_SDS      (1 << 2)        /* Single Panel = 0, Dual Panel = 1 */
+#define LCCR0_LDM      (1 << 3)        /* LCD Disable Done Mask */
+#define LCCR0_SFM      (1 << 4)        /* Start of frame mask */
+#define LCCR0_IUM      (1 << 5)        /* Input FIFO underrun mask */
+#define LCCR0_EFM      (1 << 6)        /* End of Frame mask */
+#define LCCR0_PAS      (1 << 7)        /* Passive = 0, Active = 1 */
+#define LCCR0_BLE      (1 << 8)        /* Little Endian = 0, Big Endian = 1 */
+#define LCCR0_DPD      (1 << 9)        /* Double Pixel mode, 4 pixel value = 0, 8 pixle values = 1 */
+#define LCCR0_DIS      (1 << 10)       /* LCD Disable */
+#define LCCR0_QDM      (1 << 11)       /* LCD Quick Disable mask */
+#define LCCR0_PDD      (0xff << 12)    /* Palette DMA request delay */
+#define LCCR0_PDD_S    12
+#define LCCR0_BM       (1 << 20)       /* Branch mask */
+#define LCCR0_OUM      (1 << 21)       /* Output FIFO underrun mask */
+
+#define LCCR3_PCD      (0xff)          /* Pixel clock divisor */
+#define LCCR3_ACB      (0xff << 8)     /* AC Bias pin frequency */
+#define LCCR3_ACB_S    8
+#define LCCR3_API      (0xf << 16)     /* AC Bias pin trasitions per interrupt */
+#define LCCR3_API_S    16
+#define LCCR3_VSP      (1 << 20)       /* vertical sync polarity */
+#define LCCR3_HSP      (1 << 21)       /* horizontal sync polarity */
+#define LCCR3_PCP      (1 << 22)       /* pixel clock polarity */
+#define LCCR3_OEP      (1 << 23)       /* output enable polarity */
+#define LCCR3_BPP      (7 << 24)       /* bits per pixel */
+#define LCCR3_BPP_S    24
+#define LCCR3_DPC      (1 << 27)       /* double pixel clock mode */
+
+#define LCSR_LDD       (1 << 0)        /* LCD Disable Done */
+#define LCSR_SOF       (1 << 1)        /* Start of frame */
+#define LCSR_BER       (1 << 2)        /* Bus error */
+#define LCSR_ABC       (1 << 3)        /* AC Bias count */
+#define LCSR_IUL       (1 << 4)        /* input FIFO underrun Lower panel */
+#define LCSR_IUU       (1 << 5)        /* input FIFO underrun Upper panel */
+#define LCSR_OU                (1 << 6)        /* output FIFO underrun */
+#define LCSR_QD                (1 << 7)        /* quick disable */
+#define LCSR_EOF       (1 << 8)        /* end of frame */
+#define LCSR_BS                (1 << 9)        /* branch status */
+#define LCSR_SINT      (1 << 10)       /* subsequent interrupt */
+
+#define LDCMD_PAL      (1 << 26)       /* instructs DMA to load palette buffer */
+
+/*
+ * Memory controller
+ */
+
+#define MEMC_BASE __REG(0x48000000)  /* Base of Memoriy Controller */
+#define MDCNFG         __REG(0x48000000)  /* SDRAM Configuration Register 0 */
+#define MDREFR         __REG(0x48000004)  /* SDRAM Refresh Control Register */
+#define MSC0           __REG(0x48000008)  /* Static Memory Control Register 0 */
+#define MSC1           __REG(0x4800000C)  /* Static Memory Control Register 1 */
+#define MSC2           __REG(0x48000010)  /* Static Memory Control Register 2 */
+#define MECR           __REG(0x48000014)  /* Expansion Memory (PCMCIA/Compact Flash) Bus Configuration */
+#define SXLCR          __REG(0x48000018)  /* LCR value to be written to SDRAM-Timing Synchronous Flash */
+#define SXCNFG         __REG(0x4800001C)  /* Synchronous Static Memory Control Register */
+#define SXMRS          __REG(0x48000024)  /* MRS value to be written to Synchronous Flash or SMROM */
+#define MCMEM0         __REG(0x48000028)  /* Card interface Common Memory Space Socket 0 Timing */
+#define MCMEM1         __REG(0x4800002C)  /* Card interface Common Memory Space Socket 1 Timing */
+#define MCATT0         __REG(0x48000030)  /* Card interface Attribute Space Socket 0 Timing Configuration */
+#define MCATT1         __REG(0x48000034)  /* Card interface Attribute Space Socket 1 Timing Configuration */
+#define MCIO0          __REG(0x48000038)  /* Card interface I/O Space Socket 0 Timing Configuration */
+#define MCIO1          __REG(0x4800003C)  /* Card interface I/O Space Socket 1 Timing Configuration */
+#define MDMRS          __REG(0x48000040)  /* MRS value to be written to SDRAM */
+#define BOOT_DEF       __REG(0x48000044)  /* Read-Only Boot-Time Register. Contains BOOT_SEL and PKG_SEL */
+
+#define MDCNFG_DE0      0x00000001
+#define MDCNFG_DE1      0x00000002
+#define MDCNFG_DE2      0x00010000
+#define MDCNFG_DE3      0x00020000
+#define MDCNFG_DWID0    0x00000004
+#define MDREFR_E0PIN    0x00001000
+#define MDREFR_E1PIN    0x00008000
+
+#define MDCNFG_OFFSET   0x0
+#define MDREFR_OFFSET   0x4
+#define MSC0_OFFSET     0x8
+#define MSC1_OFFSET     0xC
+#define MSC2_OFFSET     0x10
+#define MECR_OFFSET     0x14
+#define SXLCR_OFFSET    0x18
+#define SXCNFG_OFFSET   0x1C
+#define FLYCNFG_OFFSET  0x20
+#define SXMRS_OFFSET    0x24
+#define MCMEM0_OFFSET   0x28
+#define MCMEM1_OFFSET   0x2C
+#define MCATT0_OFFSET   0x30
+#define MCATT1_OFFSET   0x34
+#define MCIO0_OFFSET    0x38
+#define MCIO1_OFFSET    0x3C
+#define MDMRS_OFFSET    0x40
+
+
+
+
diff --git a/include/asm-arm/posix_types.h b/include/asm-arm/posix_types.h
new file mode 100644 (file)
index 0000000..c412486
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ *  linux/include/asm-arm/posix_types.h
+ *
+ *  Copyright (C) 1996-1998 Russell King.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   27-06-1996        RMK     Created
+ */
+#ifndef __ARCH_ARM_POSIX_TYPES_H
+#define __ARCH_ARM_POSIX_TYPES_H
+
+/*
+ * This file is generally used by user-level software, so you need to
+ * be a little careful about namespace pollution etc.  Also, we cannot
+ * assume GCC is being used.
+ */
+
+typedef unsigned short         __kernel_dev_t;
+typedef unsigned long          __kernel_ino_t;
+typedef unsigned short         __kernel_mode_t;
+typedef unsigned short         __kernel_nlink_t;
+typedef long                   __kernel_off_t;
+typedef int                    __kernel_pid_t;
+typedef unsigned short         __kernel_ipc_pid_t;
+typedef unsigned short         __kernel_uid_t;
+typedef unsigned short         __kernel_gid_t;
+typedef unsigned int           __kernel_size_t;
+typedef int                    __kernel_ssize_t;
+typedef int                    __kernel_ptrdiff_t;
+typedef long                   __kernel_time_t;
+typedef long                   __kernel_suseconds_t;
+typedef long                   __kernel_clock_t;
+typedef int                    __kernel_daddr_t;
+typedef char *                 __kernel_caddr_t;
+typedef unsigned short         __kernel_uid16_t;
+typedef unsigned short         __kernel_gid16_t;
+typedef unsigned int           __kernel_uid32_t;
+typedef unsigned int           __kernel_gid32_t;
+
+typedef unsigned short         __kernel_old_uid_t;
+typedef unsigned short         __kernel_old_gid_t;
+
+#ifdef __GNUC__
+typedef long long              __kernel_loff_t;
+#endif
+
+typedef struct {
+#if defined(__KERNEL__) || defined(__USE_ALL)
+       int     val[2];
+#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */
+       int     __val[2];
+#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */
+} __kernel_fsid_t;
+
+#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
+
+#undef __FD_SET
+#define __FD_SET(fd, fdsetp) \
+               (((fd_set *)fdsetp)->fds_bits[fd >> 5] |= (1<<(fd & 31)))
+
+#undef __FD_CLR
+#define __FD_CLR(fd, fdsetp) \
+               (((fd_set *)fdsetp)->fds_bits[fd >> 5] &= ~(1<<(fd & 31)))
+
+#undef __FD_ISSET
+#define __FD_ISSET(fd, fdsetp) \
+               ((((fd_set *)fdsetp)->fds_bits[fd >> 5] & (1<<(fd & 31))) != 0)
+
+#undef __FD_ZERO
+#define __FD_ZERO(fdsetp) \
+               (memset (fdsetp, 0, sizeof (*(fd_set *)fdsetp)))
+
+#endif
+
+#endif
diff --git a/include/asm-arm/proc-armv/ptrace.h b/include/asm-arm/proc-armv/ptrace.h
new file mode 100644 (file)
index 0000000..190caa1
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ *  linux/include/asm-arm/proc-armv/ptrace.h
+ *
+ *  Copyright (C) 1996-1999 Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifndef __ASM_PROC_PTRACE_H
+#define __ASM_PROC_PTRACE_H
+
+#include <linux/config.h>
+
+#define USR26_MODE     0x00
+#define FIQ26_MODE     0x01
+#define IRQ26_MODE     0x02
+#define SVC26_MODE     0x03
+#define USR_MODE       0x10
+#define FIQ_MODE       0x11
+#define IRQ_MODE       0x12
+#define SVC_MODE       0x13
+#define ABT_MODE       0x17
+#define UND_MODE       0x1b
+#define SYSTEM_MODE    0x1f
+#define MODE_MASK      0x1f
+#define T_BIT          0x20
+#define F_BIT          0x40
+#define I_BIT          0x80
+#define CC_V_BIT       (1 << 28)
+#define CC_C_BIT       (1 << 29)
+#define CC_Z_BIT       (1 << 30)
+#define CC_N_BIT       (1 << 31)
+#define PCMASK         0
+
+#ifndef __ASSEMBLY__
+
+/* this struct defines the way the registers are stored on the
+   stack during a system call. */
+
+struct pt_regs {
+       long uregs[18];
+};
+
+#define ARM_cpsr       uregs[16]
+#define ARM_pc         uregs[15]
+#define ARM_lr         uregs[14]
+#define ARM_sp         uregs[13]
+#define ARM_ip         uregs[12]
+#define ARM_fp         uregs[11]
+#define ARM_r10                uregs[10]
+#define ARM_r9         uregs[9]
+#define ARM_r8         uregs[8]
+#define ARM_r7         uregs[7]
+#define ARM_r6         uregs[6]
+#define ARM_r5         uregs[5]
+#define ARM_r4         uregs[4]
+#define ARM_r3         uregs[3]
+#define ARM_r2         uregs[2]
+#define ARM_r1         uregs[1]
+#define ARM_r0         uregs[0]
+#define ARM_ORIG_r0    uregs[17]
+
+#ifdef __KERNEL__
+
+#define user_mode(regs)        \
+       (((regs)->ARM_cpsr & 0xf) == 0)
+
+#ifdef CONFIG_ARM_THUMB
+#define thumb_mode(regs) \
+       (((regs)->ARM_cpsr & T_BIT))
+#else
+#define thumb_mode(regs) (0)
+#endif
+
+#define processor_mode(regs) \
+       ((regs)->ARM_cpsr & MODE_MASK)
+
+#define interrupts_enabled(regs) \
+       (!((regs)->ARM_cpsr & I_BIT))
+
+#define fast_interrupts_enabled(regs) \
+       (!((regs)->ARM_cpsr & F_BIT))
+
+#define condition_codes(regs) \
+       ((regs)->ARM_cpsr & (CC_V_BIT|CC_C_BIT|CC_Z_BIT|CC_N_BIT))
+       
+/* Are the current registers suitable for user mode?
+ * (used to maintain security in signal handlers)
+ */
+static inline int valid_user_regs(struct pt_regs *regs)
+{
+       if ((regs->ARM_cpsr & 0xf) == 0 &&
+           (regs->ARM_cpsr & (F_BIT|I_BIT)) == 0)
+               return 1;
+
+       /*
+        * Force CPSR to something logical...
+        */
+       regs->ARM_cpsr &= (CC_V_BIT|CC_C_BIT|CC_Z_BIT|CC_N_BIT|0x10);
+
+       return 0;
+}
+
+#endif /* __KERNEL__ */
+
+#endif /* __ASSEMBLY__ */
+
+#endif
+
diff --git a/include/asm-arm/string.h b/include/asm-arm/string.h
new file mode 100644 (file)
index 0000000..2a8ab16
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef __ASM_ARM_STRING_H
+#define __ASM_ARM_STRING_H
+
+/*
+ * We don't do inline string functions, since the
+ * optimised inline asm versions are not small.
+ */
+
+#define __HAVE_ARCH_STRRCHR
+extern char * strrchr(const char * s, int c);
+
+#define __HAVE_ARCH_STRCHR
+extern char * strchr(const char * s, int c);
+
+#define __HAVE_ARCH_MEMCPY
+extern void * memcpy(void *, const void *, __kernel_size_t);
+
+#define __HAVE_ARCH_MEMMOVE
+extern void * memmove(void *, const void *, __kernel_size_t);
+
+#define __HAVE_ARCH_MEMCHR
+extern void * memchr(const void *, int, __kernel_size_t);
+
+#define __HAVE_ARCH_MEMZERO
+#define __HAVE_ARCH_MEMSET
+extern void * memset(void *, int, __kernel_size_t);
+
+extern void __memzero(void *ptr, __kernel_size_t n);
+
+#define memset(p,v,n)                                                  \
+       ({                                                              \
+               if ((n) != 0) {                                         \
+                       if (__builtin_constant_p((v)) && (v) == 0)      \
+                               __memzero((p),(n));                     \
+                       else                                            \
+                               memset((p),(v),(n));                    \
+               }                                                       \
+               (p);                                                    \
+       })
+
+#define memzero(p,n) ({ if ((n) != 0) __memzero((p),(n)); (p); })
+
+#endif
diff --git a/include/asm-arm/types.h b/include/asm-arm/types.h
new file mode 100644 (file)
index 0000000..39d5290
--- /dev/null
@@ -0,0 +1,51 @@
+#ifndef __ASM_ARM_TYPES_H
+#define __ASM_ARM_TYPES_H
+
+typedef unsigned short umode_t;
+
+/*
+ * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
+ * header files exported to user space
+ */
+
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+#endif
+
+/*
+ * These aren't exported outside the kernel to avoid name space clashes
+ */
+#ifdef __KERNEL__
+
+typedef signed char s8;
+typedef unsigned char u8;
+
+typedef signed short s16;
+typedef unsigned short u16;
+
+typedef signed int s32;
+typedef unsigned int u32;
+
+typedef signed long long s64;
+typedef unsigned long long u64;
+
+#define BITS_PER_LONG 32
+
+/* Dma addresses are 32-bits wide.  */
+
+typedef u32 dma_addr_t;
+
+#endif /* __KERNEL__ */
+
+#endif
+
diff --git a/include/configs/cradle.h b/include/configs/cradle.h
new file mode 100644 (file)
index 0000000..3024e84
--- /dev/null
@@ -0,0 +1,381 @@
+/*
+ * (C) Copyright 2002
+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * If we are developing, we might want to start armboot from ram
+ * so we MUST NOT initialize critical regs like mem-timing ...
+ */
+#define CONFIG_INIT_CRITICAL            /* undef for developing */
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+#define CONFIG_PXA250           1       /* This is an PXA250 CPU    */
+#define CONFIG_HHP_CRADLE       1       /* on an Cradle Board       */
+
+#undef CONFIG_USE_IRQ                   /* we don't need IRQ/FIQ stuff */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_MALLOC_SIZE      (CFG_ENV_SIZE + 128*1024)
+
+/*
+ * Hardware drivers
+ */
+#define CONFIG_DRIVER_SMC91111
+#define CONFIG_SMC91111_BASE 0x10000300
+#define CONFIG_SMC91111_EXT_PHY
+#define CONFIG_SMC_USE_32_BIT
+
+/*
+ * select serial console configuration
+ */
+#define CONFIG_FFUART          1       /* we use FFUART on LUBBOCK */
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+#define CONFIG_BAUDRATE         115200
+
+#define CONFIG_COMMANDS         (CONFIG_CMD_DFL)
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#define CONFIG_BOOTDELAY        3
+#define CONFIG_BOOTARGS         "root=/dev/mtdblock2 console=ttyS0,115200"
+#define CONFIG_ETHADDR          08:00:3e:26:0a:5b
+#define CONFIG_NETMASK          255.255.0.0
+#define CONFIG_IPADDR           192.168.0.21
+#define CONFIG_SERVERIP         192.168.0.250
+#define CONFIG_BOOTCOMMAND      "bootm 40000"
+#define CONFIG_CMDLINE_TAG
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP                            /* undef to save memory         */
+#define CFG_PROMPT              "=> "   /* Monitor Command Prompt       */
+#define CFG_CBSIZE              256             /* Console I/O Buffer Size      */
+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
+#define CFG_MAXARGS             16              /* max number of command args   */
+#define CFG_BARGSIZE            CFG_CBSIZE      /* Boot Argument Buffer Size    */
+
+#define CFG_MEMTEST_START       0xa0400000      /* memtest works on     */
+#define CFG_MEMTEST_END         0xa0800000      /* 4 ... 8 MB in DRAM   */
+
+#undef  CFG_CLKS_IN_HZ          /* everything, incl board info, in Hz */
+
+#define CFG_LOAD_ADDR           0xa2000000      /* default load address */
+
+#define CFG_HZ                  3686400         /* incrementer freq: 3.6864 MHz */
+#define CFG_CPUSPEED            0x141           /* set core clock to 200/200/100 MHz */
+
+                                                /* valid baudrates */
+#define CFG_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
+
+#ifndef __ASSEMBLY__
+/*
+ * Board specific extension for bd_info
+ *
+ * This structure is embedded in the global bd_info (bd_t) structure
+ * and can be used by the board specific code (eg board/...)
+ */
+
+struct bd_info_ext
+{
+    /* helper variable for board environment handling
+     *
+     * env_crc_valid == 0    =>   uninitialised
+     * env_crc_valid  > 0    =>   environment crc in flash is valid
+     * env_crc_valid  < 0    =>   environment crc in flash is invalid
+     */
+     int        env_crc_valid;
+};
+#endif
+
+/*
+ * 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    4          /* we have 2 banks of DRAM */
+#define PHYS_SDRAM_1            0xa0000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE       0x01000000 /* 64 MB */
+#define PHYS_SDRAM_2            0xa4000000 /* SDRAM Bank #2 */
+#define PHYS_SDRAM_2_SIZE       0x00000000 /* 0 MB */
+#define PHYS_SDRAM_3            0xa8000000 /* SDRAM Bank #3 */
+#define PHYS_SDRAM_3_SIZE       0x00000000 /* 0 MB */
+#define PHYS_SDRAM_4            0xac000000 /* SDRAM Bank #4 */
+#define PHYS_SDRAM_4_SIZE       0x00000000 /* 0 MB */
+
+#define PHYS_FLASH_1            0x00000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2            0x04000000 /* Flash Bank #1 */
+#define PHYS_FLASH_SIZE         0x02000000 /* 32 MB */
+
+#define CFG_DRAM_BASE           0xa0000000
+#define CFG_DRAM_SIZE           0x04000000
+
+#define CFG_FLASH_BASE          PHYS_FLASH_1
+
+/*
+ * FLASH and environment organization
+ */
+#define CFG_MAX_FLASH_BANKS     1     /* max number of memory banks           */
+#define CFG_MAX_FLASH_SECT      32    /* max number of sectors on one chip    */
+
+/* timeout values are in ticks */
+#define CFG_FLASH_ERASE_TOUT    (2*CFG_HZ) /* Timeout for Flash Erase */
+#define CFG_FLASH_WRITE_TOUT    (2*CFG_HZ) /* Timeout for Flash Write */
+
+#define CFG_ENV_IS_IN_FLASH    1
+#undef EMBED
+#ifdef  EMBED
+#define CFG_ENV_SECT_SIZE     0x20000
+#define CFG_ENV_SIZE                           0x200                   /* FIXME How big when embedded?? */
+#define CFG_ENV_ADDR                           0x0004fb00
+#else
+#define CFG_ENV_ADDR                           0x00020000      /* absolute address for now   */
+#define CFG_ENV_SIZE                           0x20000    /* 8K ouch, this may later be */
+#endif
+
+/******************************************************************************
+ *
+ * CPU specific defines
+ *
+ ******************************************************************************/
+
+/*
+ * GPIO settings
+ *
+ * GPIO pin assignments
+ * GPIO     Name        Dir Out AF
+ * 0        NC
+ * 1        NC
+ * 2        SIRQ1       I
+ * 3        SIRQ2       I
+ * 4        SIRQ3       I
+ * 5        DMAACK1     O   0
+ * 6        DMAACK2     O   0
+ * 7        DMAACK3     O   0
+ * 8        TC1         O   0
+ * 9        TC2         O   0
+ * 10       TC3         O   0
+ * 11       nDMAEN      O   1
+ * 12       AENCTRL     O   0
+ * 13       PLDTC       O   0
+ * 14       ETHIRQ      I
+ * 15       NC
+ * 16       NC
+ * 17       NC
+ * 18       RDY         I
+ * 19       DMASIO      I
+ * 20       ETHIRQ      NC
+ * 21       NC
+ * 22       PGMEN       O   1    FIXME for debug only enable flash
+ * 23       NC
+ * 24       NC
+ * 25       NC
+ * 26       NC
+ * 27       NC
+ * 28       NC
+ * 29       NC
+ * 30       NC
+ * 31       NC
+ * 32       NC
+ * 33       NC
+ * 34       FFRXD       I       01
+ * 35       FFCTS       I       01
+ * 36       FFDCD       I       01
+ * 37       FFDSR       I       01
+ * 38       FFRI        I       01
+ * 39       FFTXD       O   1   10
+ * 40       FFDTR       O   0   10
+ * 41       FFRTS       O   0   10
+ * 42       RS232FOFF   O   0   00
+ * 43       NC
+ * 44       NC
+ * 45       IRSL0       O   0
+ * 46       IRRX0       I       01
+ * 47       IRTX0       O   0   10
+ * 48       NC
+ * 49       nIOWE       O   0
+ * 50       NC
+ * 51       NC
+ * 52       NC
+ * 53       NC
+ * 54       NC
+ * 55       NC
+ * 56       NC
+ * 57       NC
+ * 58       DKDIRQ      I
+ * 59       NC
+ * 60       NC
+ * 61       NC
+ * 62       NC
+ * 63       NC
+ * 64       COMLED      O   0
+ * 65       COMLED      O   0
+ * 66       COMLED      O   0
+ * 67       COMLED      O   0
+ * 68       COMLED      O   0
+ * 69       COMLED      O   0
+ * 70       COMLED      O   0
+ * 71       COMLED      O   0
+ * 72       NC
+ * 73       NC
+ * 74       NC
+ * 75       NC
+ * 76       NC
+ * 77       NC
+ * 78       CSIO        O   1
+ * 79       NC
+ * 80       CSETH       O   1
+ *
+ * NOTE: All NC's are defined to be outputs
+ *
+ */
+/* Pin direction control */
+/* NOTE GPIO 0, 61, 62 are set for inputs due to CPLD SPAREs */
+#define CFG_GPDR0_VAL       0xfff3bf02
+#define CFG_GPDR1_VAL       0xfbffbf83
+#define CFG_GPDR2_VAL       0x0001ffff
+/* Set and Clear registers */
+#define CFG_GPSR0_VAL       0x00400800
+#define CFG_GPSR1_VAL       0x00000480
+#define CFG_GPSR2_VAL       0x00014000
+#define CFG_GPCR0_VAL       0x00000000
+#define CFG_GPCR1_VAL       0x00000000
+#define CFG_GPCR2_VAL       0x00000000
+/* Edge detect registers (these are set by the kernel) */
+#define CFG_GRER0_VAL       0x00000000
+#define CFG_GRER1_VAL       0x00000000
+#define CFG_GRER2_VAL       0x00000000
+#define CFG_GFER0_VAL       0x00000000
+#define CFG_GFER1_VAL       0x00000000
+#define CFG_GFER2_VAL       0x00000000
+/* Alternate function registers */
+#define CFG_GAFR0_L_VAL     0x00000000
+#define CFG_GAFR0_U_VAL     0x00000010
+#define CFG_GAFR1_L_VAL     0x900a9550
+#define CFG_GAFR1_U_VAL     0x00000008
+#define CFG_GAFR2_L_VAL     0x20000000
+#define CFG_GAFR2_U_VAL     0x00000002
+
+/*
+ * Clocks, power control and interrupts
+ */
+#define CFG_PSSR_VAL        0x00000020
+#define CFG_CCCR_VAL        0x00000141  /* 100 MHz memory, 200 MHz CPU  */
+#define CFG_CKEN_VAL        0x00000060  /* FFUART and STUART enabled    */
+#define CFG_ICMR_VAL        0x00000000  /* No interrupts enabled        */
+
+/* FIXME
+ *
+ * RTC settings
+ * Watchdog
+ *
+ */
+
+/*
+ * Memory settings
+ *
+ * FIXME Can ethernet be burst read and/or write?? This is set for lubbock
+ *       Verify timings on all
+ */
+#define CFG_MSC0_VAL        0x000023FA  /* flash bank    (cs0)   */
+//#define CFG_MSC1_VAL        0x00003549  /* SuperIO bank  (cs2)   */
+#define CFG_MSC1_VAL        0x0000354c  /* SuperIO bank  (cs2)   */
+#define CFG_MSC2_VAL        0x00001224  /* Ethernet bank (cs4)   */
+#ifdef REDBOOT_WAY
+#define CFG_MDCNFG_VAL      0x00001aa1  /* FIXME can DTC be 01?     */
+#define CFG_MDMRS_VAL       0x00000000
+#define CFG_MDREFR_VAL      0x00018018
+#else
+#define CFG_MDCNFG_VAL      0x00001aa1  /* FIXME can DTC be 01?     */
+#define CFG_MDMRS_VAL       0x00000000
+#define CFG_MDREFR_VAL      0x00403018  /* Initial setting, individual bits set in memsetup.S */
+#endif
+
+/*
+ * PCMCIA and CF Interfaces (NOT USED, these values from lubbock init)
+ */
+#define CFG_MECR_VAL          0x00000000
+#define CFG_MCMEM0_VAL        0x00010504
+#define CFG_MCMEM1_VAL        0x00010504
+#define CFG_MCATT0_VAL        0x00010504
+#define CFG_MCATT1_VAL        0x00010504
+#define CFG_MCIO0_VAL         0x00004715
+#define CFG_MCIO1_VAL         0x00004715
+
+/* Board specific defines */
+
+/* LED defines */
+#define YELLOW    0x03
+#define RED       0x02
+#define GREEN     0x01
+#define OFF       0x00
+#define LED_IRDA0 0
+#define LED_IRDA1 2
+#define LED_IRDA2 4
+#define LED_IRDA3 6
+#define CRADLE_LED_SET_REG GPSR2
+#define CRADLE_LED_CLR_REG GPCR2
+
+/* SuperIO defines */
+#define CRADLE_SIO_INDEX      0x2e
+#define CRADLE_SIO_DATA       0x2f
+
+/* IO defines */
+#define CRADLE_CPLD_PHYS      0x08000000
+#define CRADLE_SIO1_PHYS      0x08100000
+#define CRADLE_SIO2_PHYS      0x08200000
+#define CRADLE_SIO3_PHYS      0x08300000
+#define CRADLE_ETH_PHYS       0x10000000
+
+#ifndef __ASSEMBLY__
+
+/* global prototypes */
+void led_code(int code, int color);
+
+#endif
+
+#endif  /* __CONFIG_H */
diff --git a/include/configs/lubbock.h b/include/configs/lubbock.h
new file mode 100644 (file)
index 0000000..45cd074
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * (C) Copyright 2002
+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * Configuation settings for the LUBBOCK 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
+
+/*
+ * If we are developing, we might want to start armboot from ram
+ * so we MUST NOT initialize critical regs like mem-timing ...
+ */
+#define CONFIG_INIT_CRITICAL            /* undef for developing */
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+#define CONFIG_PXA250           1       /* This is an PXA250 CPU    */
+#define CONFIG_LUBBOCK          1       /* on an LUBBOCK Board      */
+
+#undef CONFIG_USE_IRQ                   /* we don't need IRQ/FIQ stuff */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_MALLOC_SIZE      (CFG_ENV_SIZE + 128*1024)
+
+/*
+ * Hardware drivers
+ */
+
+/*
+ * select serial console configuration
+ */
+#define CONFIG_FFUART          1       /* we use FFUART on LUBBOCK */
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+#define CONFIG_BAUDRATE         115200
+
+#define CONFIG_COMMANDS         (CONFIG_CMD_DFL & ~CFG_CMD_NET)
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#define CONFIG_BOOTDELAY        3
+#define CONFIG_BOOTARGS         "root=ramfs devfs=mount console=ttySA0,9600"
+#define CONFIG_ETHADDR          08:00:3e:26:0a:5b
+#define CONFIG_NETMASK          255.255.0.0
+#define CONFIG_IPADDR           192.168.0.21
+#define CONFIG_SERVERIP         192.168.0.250
+#define CONFIG_BOOTCOMMAND      "FIXME"
+
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CONFIG_KGDB_BAUDRATE    230400          /* speed to run kgdb serial port */
+#define CONFIG_KGDB_SER_INDEX   2               /* which serial port to use */
+#endif
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP                            /* undef to save memory         */
+#define CFG_PROMPT              "=> "   /* Monitor Command Prompt       */
+#define CFG_CBSIZE              256             /* Console I/O Buffer Size      */
+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
+#define CFG_MAXARGS             16              /* max number of command args   */
+#define CFG_BARGSIZE            CFG_CBSIZE      /* Boot Argument Buffer Size    */
+
+#define CFG_MEMTEST_START       0xa0400000      /* memtest works on     */
+#define CFG_MEMTEST_END         0xa0800000      /* 4 ... 8 MB in DRAM   */
+
+#undef  CFG_CLKS_IN_HZ          /* everything, incl board info, in Hz */
+
+#define CFG_LOAD_ADDR           0xa8000000      /* default load address */
+
+#define CFG_HZ                  3686400         /* incrementer freq: 3.6864 MHz */
+#define CFG_CPUSPEED            0x141           /* set core clock to 200/200/100 MHz */
+
+                                                /* valid baudrates */
+#define CFG_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
+
+#ifndef __ASSEMBLY__
+/*
+ * Board specific extension for bd_info
+ *
+ * This structure is embedded in the global bd_info (bd_t) structure
+ * and can be used by the board specific code (eg board/...)
+ */
+
+struct bd_info_ext
+{
+    /* helper variable for board environment handling
+     *
+     * env_crc_valid == 0    =>   uninitialised
+     * env_crc_valid  > 0    =>   environment crc in flash is valid
+     * env_crc_valid  < 0    =>   environment crc in flash is invalid
+     */
+     int        env_crc_valid;
+};
+#endif
+
+/*
+ * 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    4          /* we have 2 banks of DRAM */
+#define PHYS_SDRAM_1            0xa0000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE       0x04000000 /* 64 MB */
+#define PHYS_SDRAM_2            0xa4000000 /* SDRAM Bank #2 */
+#define PHYS_SDRAM_2_SIZE       0x00000000 /* 0 MB */
+#define PHYS_SDRAM_3            0xa8000000 /* SDRAM Bank #3 */
+#define PHYS_SDRAM_3_SIZE       0x00000000 /* 0 MB */
+#define PHYS_SDRAM_4            0xac000000 /* SDRAM Bank #4 */
+#define PHYS_SDRAM_4_SIZE       0x00000000 /* 0 MB */
+
+#define PHYS_FLASH_1            0x00000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2            0x04000000 /* Flash Bank #1 */
+#define PHYS_FLASH_SIZE         0x02000000 /* 32 MB */
+
+#define CFG_DRAM_BASE           0xa0000000
+#define CFG_DRAM_SIZE           0x04000000
+
+#define CFG_FLASH_BASE          PHYS_FLASH_1
+
+#define FPGA_REGS_BASE_PHYSICAL 0x08000000
+
+/*
+ * GPIO settings
+ */
+#define CFG_GPSR0_VAL       0x00008000
+#define CFG_GPSR1_VAL       0x00FC0382
+#define CFG_GPSR2_VAL       0x0001FFFF
+#define CFG_GPCR0_VAL       0x00000000
+#define CFG_GPCR1_VAL       0x00000000
+#define CFG_GPCR2_VAL       0x00000000
+#define CFG_GPDR0_VAL       0x0060A800
+#define CFG_GPDR1_VAL       0x00FF0382
+#define CFG_GPDR2_VAL       0x0001C000
+#define CFG_GAFR0_L_VAL     0x98400000
+#define CFG_GAFR0_U_VAL     0x00002950
+#define CFG_GAFR1_L_VAL     0x000A9558
+#define CFG_GAFR1_U_VAL     0x0005AAAA
+#define CFG_GAFR2_L_VAL     0xA0000000
+#define CFG_GAFR2_U_VAL     0x00000002
+
+#define CFG_PSSR_VAL        0x20
+
+/*
+ * Memory settings
+ */
+#define CFG_MSC0_VAL        0x23F223F2
+#define CFG_MSC1_VAL        0x3FF1A441
+#define CFG_MSC2_VAL        0x7FF17FF1
+#define CFG_MDCNFG_VAL      0x00001AC9
+#define CFG_MDREFR_VAL      0x000BC018
+#define CFG_MDREFR_VAL_100  0x00018018
+#define CFG_MDMRS_VAL       0x00000000
+
+/*
+ * PCMCIA and CF Interfaces
+ */
+#define CFG_MECR_VAL        0x00000000
+#define CFG_MCMEM0_VAL      0x00010504
+#define CFG_MCMEM1_VAL      0x00010504
+#define CFG_MCATT0_VAL      0x00010504
+#define CFG_MCATT1_VAL      0x00010504
+#define CFG_MCIO0_VAL       0x00004715
+#define CFG_MCIO1_VAL       0x00004715
+
+#define _LED        0x08000010
+#define LED_BLANK  (0x08000040)
+
+/*
+ * FLASH and environment organization
+ */
+#define CFG_MAX_FLASH_BANKS     2       /* max number of memory banks           */
+#define CFG_MAX_FLASH_SECT      128  /* max number of sectors on one chip    */
+
+/* timeout values are in ticks */
+#define CFG_FLASH_ERASE_TOUT    (2*CFG_HZ) /* Timeout for Flash Erase */
+#define CFG_FLASH_WRITE_TOUT    (2*CFG_HZ) /* Timeout for Flash Write */
+
+/* FIXME */
+#define CFG_ENV_ADDR            (PHYS_FLASH_1 + 0x1C000)        /* Addr of Environment Sector   */
+#define CFG_ENV_SIZE            0x4000  /* Total Size of Environment Sector     */
+
+
+/*
+ * FPGA Offsets
+ */
+#define WHOAMI_OFFSET           0x00
+#define HEXLED_OFFSET           0x10
+#define BLANKLED_OFFSET         0x40
+#define DISCRETELED_OFFSET      0x40
+#define CNFG_SWITCHES_OFFSET    0x50
+#define USER_SWITCHES_OFFSET    0x60
+#define MISC_WR_OFFSET          0x80
+#define MISC_RD_OFFSET          0x90
+#define INT_MASK_OFFSET         0xC0
+#define INT_CLEAR_OFFSET        0xD0
+#define GP_OFFSET               0x100
+
+#endif  /* __CONFIG_H */
index 0376c6e6955aadd1ee27a7fd67598c77f8e3e536..8ebc797820095fc5e88f68571bc15c36fdde6390 100644 (file)
@@ -27,7 +27,7 @@ LIB   = lib$(ARCH).a
 
 AOBJS  = 
 
-COBJS  = 
+COBJS  = armlinux.o board.o
 
 OBJS   = $(AOBJS) $(COBJS)
 
diff --git a/lib_arm/armlinux.c b/lib_arm/armlinux.c
new file mode 100644 (file)
index 0000000..4198d84
--- /dev/null
@@ -0,0 +1,285 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * Copyright (C) 2001  Erik Mouw (J.A.K.Mouw@its.tudelft.nl)
+ *
+ * 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 "armboot.h"
+#include "command.h"
+#include "cmd_boot.h"
+#include "image.h"
+#include "malloc.h"
+#include "zlib.h"
+
+#include <asm/setup.h>
+#define tag_size(type)  ((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
+#define tag_next(t)     ((struct tag *)((u32 *)(t) + (t)->hdr.size))
+
+static void setup_start_tag(bd_t *bd);
+static void setup_memory_tags(bd_t *bd);
+static void setup_commandline_tag(bd_t *bd, char *commandline);
+#if 0
+static void setup_ramdisk_tag(bd_t *bd);
+#endif
+static void setup_initrd_tag(bd_t *bd, ulong initrd_start, ulong initrd_end);
+static void setup_end_tag(bd_t *bd);
+
+extern image_header_t header;           /* from cmd_bootm.c */
+
+#undef DEBUG
+
+static struct tag *params;
+
+void boot_linux(cmd_tbl_t *cmdtp,
+               bd_t *bd, int flag,
+               int argc, char *argv[],
+               ulong addr,
+               ulong *len_ptr,
+               int   verify)
+{
+    ulong len = 0, checksum;
+    ulong initrd_start, initrd_end;
+    ulong data;
+    char *commandline = getenv(bd, "bootargs");
+    void (*theKernel)(int zero, int arch);
+    image_header_t *hdr = &header;
+
+    /*
+     * Check if there is an initrd image
+     */
+    if (argc >= 3) {
+       addr = simple_strtoul(argv[2], NULL, 16);
+       
+       printf ("## Loading Ramdisk Image at %08lx ...\n", addr);
+       
+       /* Copy header so we can blank CRC field for re-calculation */
+       memcpy (&header, (char *)addr, sizeof(image_header_t));
+       
+       if (SWAP32(hdr->ih_magic) != IH_MAGIC) {
+           printf ("Bad Magic Number\n");
+           do_reset (cmdtp, bd, flag, argc, argv);
+       }
+       
+       data = (ulong)&header;
+       len  = sizeof(image_header_t);
+       
+       checksum = SWAP32(hdr->ih_hcrc);
+       hdr->ih_hcrc = 0;
+       
+       if (crc32 (0, (char *)data, len) != checksum) {
+           printf ("Bad Header Checksum\n");
+           do_reset (cmdtp, bd, flag, argc, argv);
+       }
+       
+       print_image_hdr (hdr);
+       
+       data = addr + sizeof(image_header_t);
+       len  = SWAP32(hdr->ih_size);
+       
+       if (verify) {
+           ulong csum = 0;
+
+           printf ("   Verifying Checksum ... ");
+           csum = crc32 (0, (char *)data, len);
+           if (csum != SWAP32(hdr->ih_dcrc)) {
+               printf ("Bad Data CRC\n");
+               do_reset (cmdtp, bd, flag, argc, argv);
+           }
+           printf ("OK\n");
+       }
+       
+       if ((hdr->ih_os   != IH_OS_LINUX)       ||
+           (hdr->ih_arch != IH_CPU_ARM)        ||
+           (hdr->ih_type != IH_TYPE_RAMDISK)   ) {
+           printf ("No Linux ARM Ramdisk Image\n");
+           do_reset (cmdtp, bd, flag, argc, argv);
+       }
+       
+       /*
+        * Now check if we have a multifile image
+        */
+    } else if ((hdr->ih_type==IH_TYPE_MULTI) && (len_ptr[1])) {
+       ulong tail    = SWAP32(len_ptr[0]) % 4;
+       int i;
+       
+       /* skip kernel length and terminator */
+       data = (ulong)(&len_ptr[2]);
+       /* skip any additional image length fields */
+       for (i=1; len_ptr[i]; ++i)
+         data += 4;
+       /* add kernel length, and align */
+       data += SWAP32(len_ptr[0]);
+       if (tail) {
+           data += 4 - tail;
+       }
+       
+       len   = SWAP32(len_ptr[1]);
+       
+    } else {
+       /*
+        * no initrd image
+        */
+       data = 0;
+    }
+    
+#ifdef DEBUG
+    if (!data) {
+       printf ("No initrd\n");
+    }
+#endif
+    
+    if (data) {
+       initrd_start = data;
+       initrd_end   = initrd_start + len;
+       printf ("   Loading Ramdisk to %08lx, end %08lx ... ",
+               initrd_start, initrd_end);
+       memmove ((void *)initrd_start, (void *)data, len);
+       printf ("OK\n");
+    } else {
+       initrd_start = 0;
+       initrd_end = 0;
+    }
+    
+    theKernel = (void (*)(int, int))SWAP32(hdr->ih_ep);
+   
+#ifdef DEBUG
+    printf ("## Transferring control to Linux (at address %08lx) ...\n",
+           (ulong)theKernel);
+#endif
+
+#if defined (CONFIG_SETUP_MEMORY_TAGS) || \
+    defined (CONFIG_CMDLINE_TAG) || \
+    defined (CONFIG_INITRD_TAG)
+    setup_start_tag(bd);
+#ifdef CONFIG_SETUP_MEMORY_TAGS
+    setup_memory_tags(bd);
+#endif
+#ifdef CONFIG_CMDLINE_TAG
+    setup_commandline_tag(bd, commandline);
+#endif
+#ifdef CONFIG_INITRD_TAG
+    setup_initrd_tag(bd, initrd_start, initrd_end);
+#endif
+#if 0
+    setup_ramdisk_tag(bd);
+#endif
+    setup_end_tag(bd);
+#endif
+
+    /* we assume that the kernel is in place */
+    printf("\nStarting kernel ...\n\n");
+
+    cleanup_before_linux(bd);
+
+    theKernel(0, bd->bi_arch_number);
+}
+
+
+static void setup_start_tag(bd_t *bd)
+{
+    params = (struct tag *)bd->bi_boot_params;
+    
+    params->hdr.tag = ATAG_CORE;
+    params->hdr.size = tag_size(tag_core);
+    
+    params->u.core.flags = 0;
+    params->u.core.pagesize = 0;
+    params->u.core.rootdev = 0;
+    
+    params = tag_next(params);
+}
+
+
+static void setup_memory_tags(bd_t *bd)
+{
+    int i;
+    
+    for(i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+       params->hdr.tag = ATAG_MEM;
+       params->hdr.size = tag_size(tag_mem32);
+       
+       params->u.mem.start = bd->bi_dram[i].start;
+       params->u.mem.size = bd->bi_dram[i].size;
+           
+       params = tag_next(params);
+    }
+}
+
+
+static void setup_commandline_tag(bd_t *bd, char *commandline)
+{
+    char *p;
+    
+    /* eat leading white space */
+    for(p = commandline; *p == ' '; p++)
+      ;
+    
+    /* skip non-existent command lines so the kernel will still
+     * use its default command line.
+     */
+    if(*p == '\0')
+      return;
+    
+    params->hdr.tag = ATAG_CMDLINE;
+    params->hdr.size = (sizeof(struct tag_header) + strlen(p) + 1 + 4) >> 2;
+    
+    strcpy(params->u.cmdline.cmdline, p);
+    
+    params = tag_next(params);
+}
+
+
+static void setup_initrd_tag(bd_t *bd, ulong initrd_start, ulong initrd_end)
+{
+    /* an ATAG_INITRD node tells the kernel where the compressed
+     * ramdisk can be found. ATAG_RDIMG is a better name, actually.
+     */
+    params->hdr.tag = ATAG_INITRD;
+    params->hdr.size = tag_size(tag_initrd);
+    
+    params->u.initrd.start = initrd_start;
+    params->u.initrd.size = initrd_end - initrd_start;
+    
+    params = tag_next(params);
+}
+
+
+#if 0
+static void setup_ramdisk_tag(bd_t *bd)
+{
+    /* an ATAG_RAMDISK node tells the kernel how large the
+     * decompressed ramdisk will become.
+     */
+    params->hdr.tag = ATAG_RAMDISK;
+    params->hdr.size = tag_size(tag_ramdisk);
+    
+    params->u.ramdisk.start = 0;
+    //params->u.ramdisk.size = RAMDISK_SIZE;
+    params->u.ramdisk.flags = 1;       /* automatically load ramdisk */
+    
+    params = tag_next(params);
+}
+#endif
+
+static void setup_end_tag(bd_t *bd)
+{
+    params->hdr.tag = ATAG_NONE;
+    params->hdr.size = 0;
+}
diff --git a/lib_arm/board.c b/lib_arm/board.c
new file mode 100644 (file)
index 0000000..70f9de3
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * (C) Copyright 2002
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ * 
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.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 "armboot.h"
+#include "command.h"
+#include "devices.h"
+#include "version.h"
+
+#ifdef CONFIG_DRIVER_CS8900
+extern void cs8900_get_enetaddr(uchar *addr);
+#endif
+
+/*
+ * Begin and End of memory area for malloc(), and current "brk"
+ */
+static  ulong   mem_malloc_start = 0;
+static  ulong   mem_malloc_end   = 0;
+static  ulong   mem_malloc_brk   = 0;
+static void mem_malloc_init (ulong dest_addr)
+{
+    mem_malloc_start  = dest_addr;
+    mem_malloc_end    = dest_addr + CONFIG_MALLOC_SIZE;
+    mem_malloc_brk    = mem_malloc_start;
+    
+    memset ((void *)mem_malloc_start, 0, mem_malloc_end - mem_malloc_start);
+}
+
+void *sbrk (ptrdiff_t increment)
+{
+    ulong old = mem_malloc_brk;
+    ulong new = old + increment;
+    
+    if ((new < mem_malloc_start) ||
+       (new > mem_malloc_end) ) {
+       return (NULL);
+    }
+    mem_malloc_brk = new;
+    
+    return ((void *)old);
+}
+
+/*
+ * Breath some life into the board...
+ *
+ * Initialize an SMC for serial comms, and carry out some hardware
+ * tests.
+ *
+ * The first part of initialization is running from Flash memory;
+ * its main purpose is to initialize the RAM so that we
+ * can relocate the monitor code to RAM.
+ */
+void start_armboot(void)
+{
+    bd_t bd;
+    ulong size;
+   
+    /* set up bd strucuture */
+    memset(&bd, 0, sizeof(bd));
+    bd.bi_baudrate = CONFIG_BAUDRATE;
+
+    /* basic cpu dependent setup */
+    cpu_init(&bd);
+   
+    /* basic board dependent setup */
+    board_init(&bd);
+
+    /* initialize environment */
+    env_init(&bd);
+
+    /* serial communications setup */
+    serial_init(&bd);
+
+    display_banner(&bd);
+
+    /* set up execptions */
+    interrupt_init(&bd);
+
+    /* configure available RAM banks */
+    dram_init(&bd);
+    display_dram_config(&bd);
+
+    /* configure available FLASH banks */
+    size = flash_init(&bd);
+    display_flash_config(&bd, size);
+
+    /* armboot_end is defined in the board-specific linker script */
+    mem_malloc_init(_armboot_real_end);
+
+    /* initialize environment */
+    env_relocate(&bd);
+
+    /* enable exceptions */
+    enable_interrupts();
+    
+#ifdef CONFIG_DRIVER_CS8900
+    if (!getenv(&bd,"ethaddr") ) {
+       cs8900_get_enetaddr(bd.bi_enetaddr);
+    }
+#endif    
+
+#ifdef BOARD_POST_INIT
+    board_post_init(&bd);
+#endif
+
+    /* main_loop() can return to retry autoboot, if so just run it again. */
+    for (;;) {
+       main_loop(&bd);
+    }
+
+    /* NOTREACHED - no way out of command loop except booting */
+}
+
+void hang(void)
+{
+       puts ("### ERROR ### Please RESET the board ###\n");
+       for (;;);
+}
index d9d51058d5ab61b12e8077e2e64ecd92dbd726f9..36ddf3cacf424306eabb429a2e23beb4a939ad58 100644 (file)
@@ -27,7 +27,8 @@ LIB   = lib$(ARCH).a
 
 AOBJS  = ppcstring.o ticks.o
 
-COBJS  = bat_rw.o cache.o extable.o kgdb.o time.o
+COBJS  = board.o \
+         bat_rw.o cache.o extable.o kgdb.o time.o
 
 OBJS   = $(AOBJS) $(COBJS)
 
similarity index 100%
rename from common/board.c
rename to lib_ppc/board.c
index 3c5fdff4542f831c8d86384aa62b74efa2902311..63fda0f6730756f2d32a531098dc8f1519b68fe4 100755 (executable)
--- a/mkconfig
+++ b/mkconfig
@@ -30,6 +30,8 @@ cd ./include
 #
 rm -f asm
 ln -s asm-$2 asm
+rm -f asm-$2/arch
+ln -s arch-$3 asm-$2/arch
 
 #
 # Create include file for Make
similarity index 100%
rename from lib_ppc/config.mk
rename to ppc_config.mk