uboot 2011.12 port to lpc32xx
authorSrinivas Bakki <srinivas.bakki@nxp.com>
Tue, 28 Feb 2012 11:17:39 +0000 (11:17 +0000)
committerSrinivas Bakki <srinivas.bakki@nxp.com>
Tue, 28 Feb 2012 11:17:39 +0000 (11:17 +0000)
46 files changed:
Makefile
arch/arm/cpu/arm926ejs/lpc3250/Makefile [new file with mode: 0644]
arch/arm/cpu/arm926ejs/lpc3250/clkpwr.c [new file with mode: 0644]
arch/arm/cpu/arm926ejs/lpc3250/config.mk [new file with mode: 0644]
arch/arm/cpu/arm926ejs/lpc3250/cpu.c [new file with mode: 0644]
arch/arm/cpu/arm926ejs/lpc3250/serial.c [new file with mode: 0644]
board/nxp/ea3250/Makefile [new file with mode: 0644]
board/nxp/ea3250/config.mk [new file with mode: 0644]
board/nxp/ea3250/ea3250.c [new file with mode: 0644]
board/nxp/ea3250/ea3250_prv.h [new file with mode: 0644]
board/nxp/ea3250/lowlevel_init.S [new file with mode: 0644]
board/nxp/ea3250/lowlevelsys_init.c [new file with mode: 0644]
board/nxp/ea3250/net.c [new file with mode: 0644]
board/nxp/ea3250/u-boot.lds [new file with mode: 0644]
board/nxp/fdi3250/Makefile [new file with mode: 0644]
board/nxp/fdi3250/config.mk [new file with mode: 0644]
board/nxp/fdi3250/fdi3250.c [new file with mode: 0644]
board/nxp/fdi3250/fdi3250_prv.h [new file with mode: 0644]
board/nxp/fdi3250/lowlevel_init.S [new file with mode: 0644]
board/nxp/fdi3250/lowlevelsys_init.c [new file with mode: 0644]
board/nxp/fdi3250/net.c [new file with mode: 0644]
board/nxp/fdi3250/u-boot.lds [new file with mode: 0644]
board/nxp/phy3250/#Makefile# [new file with mode: 0644]
board/nxp/phy3250/#config.mk# [new file with mode: 0644]
board/nxp/phy3250/Makefile [new file with mode: 0644]
board/nxp/phy3250/config.mk [new file with mode: 0644]
board/nxp/phy3250/lowlevel_init.S [new file with mode: 0644]
board/nxp/phy3250/lowlevelsys_init.c [new file with mode: 0644]
board/nxp/phy3250/net.c [new file with mode: 0644]
board/nxp/phy3250/phy3250.c [new file with mode: 0644]
board/nxp/phy3250/phy3250_prv.h [new file with mode: 0644]
board/nxp/phy3250/u-boot.lds [new file with mode: 0644]
cpu/arm926ejs/lpc3250/Makefile [new file with mode: 0644]
cpu/arm926ejs/lpc3250/clkpwr.c [new file with mode: 0644]
cpu/arm926ejs/lpc3250/config.mk [new file with mode: 0644]
cpu/arm926ejs/lpc3250/cpu.c [new file with mode: 0644]
cpu/arm926ejs/lpc3250/serial.c [new file with mode: 0644]
drivers/dma/Makefile
drivers/dma/lpc32xx_dma.c [new file with mode: 0644]
drivers/mtd/nand/Makefile
drivers/mtd/nand/lpc32xx_nand.c [new file with mode: 0644]
include/configs/ea3250.h [new file with mode: 0644]
include/configs/fdi3250.h [new file with mode: 0644]
include/configs/phy3250.h [new file with mode: 0644]
include/lpc3250.h [new file with mode: 0644]
include/u-boot/u-boot.lds.h

index 0438f1e..63cf8c1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -326,7 +326,7 @@ else
 PLATFORM_LIBGCC = -L $(USE_PRIVATE_LIBGCC) -lgcc
 endif
 else
-PLATFORM_LIBGCC := -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
+PLATFORM_LIBGCC := -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc -lgcov -lgcc_eh
 endif
 PLATFORM_LIBS += $(PLATFORM_LIBGCC)
 export PLATFORM_LIBS
@@ -334,7 +334,7 @@ export PLATFORM_LIBS
 # Special flags for CPP when processing the linker script.
 # Pass the version down so we can handle backwards compatibility
 # on the fly.
-LDPPFLAGS += \
+LDPPFLAGS += 
        -include $(TOPDIR)/include/u-boot/u-boot.lds.h \
        $(shell $(LD) --version | \
          sed -ne 's/GNU ld version \([0-9][0-9]*\)\.\([0-9][0-9]*\).*/-DLD_MAJOR=\1 -DLD_MINOR=\2/p')
@@ -674,6 +674,19 @@ SX1_config:                unconfig
        @$(MKCONFIG) -n $@ SX1 arm arm925t sx1
 
 #########################################################################
+## NXP ARM926EJ-S Systems
+#########################################################################
+
+phy3250_config :       unconfig
+       @$(MKCONFIG) $(@:_config=) arm arm926ejs phy3250 nxp lpc3250
+
+ea3250_config: unconfig
+       @$(MKCONFIG) $(@:_config=) arm arm926ejs ea3250 nxp lpc3250
+
+fdi3250_config:        unconfig
+       @$(MKCONFIG) $(@:_config=) arm arm926ejs fdi3250 nxp lpc3250
+
+#########################################################################
 ## XScale Systems
 #########################################################################
 
diff --git a/arch/arm/cpu/arm926ejs/lpc3250/Makefile b/arch/arm/cpu/arm926ejs/lpc3250/Makefile
new file mode 100644 (file)
index 0000000..d52f7f7
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# Copyright (C) 2008 by NXP Semiconductors
+# All rights reserved.
+#
+# 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    = $(obj)lib$(SOC).o
+
+COBJS-y        += serial.o cpu.o clkpwr.o
+
+SRCS    := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
+OBJS    := $(addprefix $(obj),$(SOBJS) $(COBJS-y))
+
+all:   $(obj).depend $(LIB)
+
+$(LIB):        $(OBJS)
+       $(call cmd_link_o_target, $(OBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/arch/arm/cpu/arm926ejs/lpc3250/clkpwr.c b/arch/arm/cpu/arm926ejs/lpc3250/clkpwr.c
new file mode 100644 (file)
index 0000000..cec6a3d
--- /dev/null
@@ -0,0 +1,360 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC3250 clock and power query functions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <common.h>
+#include <lpc3250.h>
+#include <div64.h>
+
+//DECLARE_GLOBAL_DATA_PTR;
+
+
+/* CLK divider values for HCLK based on selected register value */\r
+static unsigned int hclkdivs[4] =\r
+{\r
+  1, 2, 4, 4\r
+};
+
+/* Post divider values for PLLs based on selected register value */\r
+static unsigned int pll_postdivs[4] =\r
+{\r
+  1, 2, 4, 8\r
+};
+
+/*
+ * Structure used for setting up the HCLK PLL
+ */\r
+typedef struct\r
+{\r
+  /* (0) = analog off, (!0) = on */\r
+  int analog_on;\r
+  /* (0) = CCO clock sent to post divider, (!0) = PLL input clock sent\r
+  to post div */\r
+  int cco_bypass_b15;\r
+  /* (0) = PLL out from post divider, (!0) = PLL out bypasses post\r
+  divider */\r
+  int direct_output_b14;\r
+  /* (0) = use CCO clock, (!0) = use FCLKOUT */\r
+  int fdbk_div_ctrl_b13;\r
+  /* Must be 1, 2, 4, or 8 */\r
+  int pll_p;\r
+  /* Must be 1, 2, 3, or 4 */\r
+  int pll_n;\r
+  /* Feedback multiplier 1-256 */\r
+  unsigned int pll_m;\r
+} CLKPWR_HCLK_PLL_SETUP_T;
+
+/*
+ * Determine if PLL rate is valid
+ */\r
+static unsigned int clkpwr_check_pll_setup(unsigned int ifreq,\r
+                                               CLKPWR_HCLK_PLL_SETUP_T *pllsetup)\r
+{\r
+  unsigned long long i64freq, p, m, n, fcco, fref,
+               cfreq, div_cfreq, div_fcco, div_fref;\r
+  int mode;\r
+\r
+  /* PLL requirements */\r
+  /* ifreq must be >= 1MHz and <= 20MHz */\r
+  /* FCCO must be >= 156MHz and <= 320MHz */\r
+  /* FREF must be >= 1MHz and <= 27MHz. */\r
+  /* Assume the passed input data is not valid */\r
+
+       fcco = fref = cfreq = 0;
+       div_cfreq = div_fcco = div_fref = 0;
+\r
+  /* Work with 64-bit values to prevent overflow */\r
+  i64freq = (unsigned long long) ifreq;\r
+  m = (unsigned long long) pllsetup->pll_m;\r
+  n = (unsigned long long) pllsetup->pll_n;\r
+  p = (unsigned long long) pllsetup->pll_p;\r
+\r
+  /* Get components of the PLL register */\r
+  mode = (pllsetup->cco_bypass_b15 << 2) |\r
+         (pllsetup->direct_output_b14 << 1) |\r
+         pllsetup->fdbk_div_ctrl_b13;\r
+
+  switch (mode)\r
+  {\r
+    case 0x0: /* Non-integer mode */\r
+      cfreq = m * i64freq;
+      div_cfreq = 2 * p * n;
+      fcco = m * i64freq;
+      div_fcco = n;
+      fref = i64freq;
+      div_fref = n;
+      break;\r
+\r
+    case 0x1: /* integer mode */\r
+      cfreq = m * i64freq;
+      div_cfreq = n;
+      fcco = m * i64freq;
+      div_fcco = 2 * p * n;
+      fref = i64freq;
+      div_fref = n;
+      break;\r
+\r
+    case 0x2:\r
+    case 0x3: /* Direct mode */\r
+      cfreq = m * i64freq;
+      div_cfreq = n;\r
+      fcco = m * i64freq;\r
+      div_fcco = n;
+      fref = i64freq;
+      div_fref = n;\r
+      break;\r
+\r
+    case 0x4:\r
+    case 0x5: /* Bypass mode */\r
+      cfreq = i64freq;
+      div_cfreq = 2 * p;\r
+      fcco = 156000000;\r
+      fref = 1000000;\r
+      break;\r
+\r
+    case 0x6:\r
+    case 0x7: /* Direct bypass mode */\r
+      cfreq = i64freq;\r
+      fcco = 156000000;\r
+      fref = 1000000;\r
+      break;\r
+  }\r
+\r
+  if (div_cfreq != 0)
+         do_div(cfreq, div_cfreq);
+  
+  if (div_fcco != 0)
+         do_div(fcco, div_fcco);
+
+  if (div_fref != 0)
+         do_div(fref, div_fref);
+
+  if ((fcco < 156000000) || (fcco > 320000000))\r
+  {\r
+    /* not a valid range */\r
+    cfreq = 0;\r
+  }\r
+\r
+  if ((fref < 1000000) || (fref > 27000000))\r
+  {\r
+    /* not a valid range */\r
+    cfreq = 0;\r
+  }\r
+\r
+  return (int) cfreq;\r
+}\r
+\r
+/*
+ * Get PLL values and compute PLL rate
+ */\r
+static unsigned int clkpwr_pll_rate_from_val(unsigned int osc_rate,\r
+                                               unsigned int val)\r
+{\r
+  CLKPWR_HCLK_PLL_SETUP_T pllcfg;\r
+\r
+  /* Get components of the PLL register */\r
+  pllcfg.cco_bypass_b15 = 0;\r
+  pllcfg.direct_output_b14 = 0;\r
+  pllcfg.fdbk_div_ctrl_b13 = 0;\r
+  if ((val & CLKPWR_HCLKPLL_CCO_BYPASS) != 0)\r
+  {\r
+    pllcfg.cco_bypass_b15 = 1;\r
+  }\r
+  if ((val & CLKPWR_HCLKPLL_POSTDIV_BYPASS) != 0)\r
+  {\r
+    pllcfg.direct_output_b14 = 1;\r
+  }\r
+  if ((val & CLKPWR_HCLKPLL_FDBK_SEL_FCLK) != 0)\r
+  {\r
+    pllcfg.fdbk_div_ctrl_b13 = 1;\r
+  }\r
+  pllcfg.pll_m = 1 + ((val >> 1) & 0xFF);\r
+  pllcfg.pll_n = 1 + ((val >> 9) & 0x3);\r
+  pllcfg.pll_p = pll_postdivs[((val >> 11) & 0x3)];\r
+\r
+  return clkpwr_check_pll_setup(osc_rate, &pllcfg);\r
+}\r
+\r
+/*
+ * Get PLL rate from USB or HCLK PLL
+ */\r
+static unsigned int clkpwr_pll_rate(unsigned int osc_rate,\r
+                               unsigned int *pPllreg)\r
+{\r
+  return clkpwr_pll_rate_from_val(osc_rate, *pPllreg);\r
+}
+
+/*
+ * Clock rate fetch function
+ */
+unsigned int sys_get_rate(CLKPWR_BASE_CLOCK_T clkid)
+{
+       unsigned int sys_clk, ddr_clock, ddr_hclk_div, hclkpll_clk;
+       unsigned int periph_clk, tmp, hclk1_clk, arm1_clk;
+       unsigned int hclk_clk, arm_clk, clkrate;\r
+\r
+       /* Is PLL397 oscillator being used? */\r
+       if ((CLKPWR->clkpwr_sysclk_ctrl & CLKPWR_SYSCTRL_USEPLL397) != 0)\r
+       {\r
+               /* PLL397 is used */\r
+               sys_clk = CLOCK_OSC_FREQ * 397;\r
+       }\r
+       else\r
+       {\r
+               sys_clk = MAIN_OSC_FREQ;\r
+       }\r
+\r
+       /* Compute HCLK DDR divider */\r
+       ddr_hclk_div = 0;\r
+       if ((CLKPWR->clkpwr_sdramclk_ctrl & CLKPWR_SDRCLK_USE_DDR) != 0)\r
+       {\r
+               /* DDR is being used */\r
+               if ((CLKPWR->clkpwr_hclk_div & CLKPWR_HCLKDIV_DDRCLK_NORM) != 0)\r
+               {\r
+                       ddr_hclk_div = 1;\r
+               }\r
+               else if ((CLKPWR->clkpwr_hclk_div &\r
+                       CLKPWR_HCLKDIV_DDRCLK_HALF) != 0)\r
+               {\r
+                       ddr_hclk_div = 2;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               /* SDRAM is being used */\r
+               tmp = CLKPWR->clkpwr_hclk_div & CLKPWR_HCLKDIV_DIV_2POW(0x3);\r
+               ddr_hclk_div = hclkdivs[tmp] - 1;\r
+       }\r
+\r
+       /* Is the device in run mode? */\r
+       if ((CLKPWR->clkpwr_pwr_ctrl & CLKPWR_SELECT_RUN_MODE) != 0)\r
+       {\r
+               /* In run mode */\r
+\r
+               /* Compute HCLK PLL rate */\r
+               hclkpll_clk = clkpwr_pll_rate(sys_clk,\r
+                       (unsigned int *) &CLKPWR->clkpwr_hclkpll_ctrl);\r
+\r
+               /* Base DDR rate */\r
+               ddr_clock = hclkpll_clk;\r
+\r
+               /* Base peripheral clock rate */\r
+               tmp = 1 + ((CLKPWR->clkpwr_hclk_div >> 2) & 0x1F);\r
+               periph_clk = hclkpll_clk / tmp;\r
+\r
+               /* Base HCLK rate (when not using peripheral clock */\r
+               hclk1_clk = hclkpll_clk /\r
+                       hclkdivs[CLKPWR_HCLKDIV_DIV_2POW(CLKPWR->clkpwr_hclk_div)];\r
+\r
+               /* Base ARM clock (when not using peripheral clock */\r
+               arm1_clk = hclkpll_clk;\r
+       }\r
+       else\r
+       {\r
+               /* In direct-run mode */\r
+\r
+               /* Base DDR rate */\r
+               ddr_clock = sys_clk;\r
+\r
+               /* Base peripheral clock rate */\r
+               periph_clk = sys_clk;\r
+\r
+               /* Base HCLK rate (when not using peripheral clock */\r
+               hclk1_clk = sys_clk;\r
+\r
+               /* Base ARM clock (when not using peripheral clock */\r
+               arm1_clk = sys_clk;\r
+       }\r
+\r
+       /* Compute SDRAM/DDR clock */\r
+       ddr_clock = ddr_clock / (ddr_hclk_div + 1);\r
+\r
+       /* Compute HCLK and ARM clock rates */\r
+       if ((CLKPWR->clkpwr_pwr_ctrl & CLKPWR_CTRL_FORCE_PCLK) != 0)\r
+       {\r
+               /* HCLK and ARM clock run from peripheral clock */\r
+               hclk_clk = periph_clk;\r
+               arm_clk = periph_clk;\r
+       }\r
+       else\r
+       {\r
+               /* Normal clock is used for HCLK and ARM clock */\r
+               hclk_clk = hclk1_clk;\r
+               arm_clk = arm1_clk;\r
+       }\r
+\r
+       /* Determine rates */\r
+       switch (clkid)\r
+       {\r
+               case CLKPWR_MAINOSC_CLK:\r
+                       /* Main oscillator rate */\r
+                       clkrate = MAIN_OSC_FREQ;\r
+                       break;\r
+\r
+               case CLKPWR_RTC_CLK:\r
+                       /* RTC oscillator rate */\r
+                       clkrate = CLOCK_OSC_FREQ;\r
+                       break;\r
+\r
+               case CLKPWR_SYSCLK:\r
+                       /* System oscillator (main osc or PLL397) rate */\r
+                       clkrate = sys_clk;\r
+                       break;\r
+\r
+               case CLKPWR_ARM_CLK:\r
+                       clkrate = arm_clk;\r
+                       break;\r
+\r
+               case CLKPWR_HCLK:\r
+                       clkrate = hclk_clk;\r
+                       break;\r
+\r
+               case CLKPWR_PERIPH_CLK:\r
+                       clkrate = periph_clk;\r
+                       break;\r
+\r
+               case CLKPWR_USB_HCLK_SYS:\r
+                       clkrate = 0; // Not supported\r
+                       break;\r
+\r
+               case CLKPWR_48M_CLK:\r
+                       clkrate = 0; // Not supported\r
+                       break;\r
+\r
+               case CLKPWR_DDR_CLK:\r
+                       clkrate = ddr_clock;\r
+                       break;\r
+\r
+               case CLKPWR_MSSD_CLK:\r
+                       clkrate = hclk_clk;\r
+                       break;\r
+\r
+               default:\r
+                       clkrate = 0;\r
+                       break;\r
+       }\r
+\r
+       return clkrate;\r
+}
+
+
+
diff --git a/arch/arm/cpu/arm926ejs/lpc3250/config.mk b/arch/arm/cpu/arm926ejs/lpc3250/config.mk
new file mode 100644 (file)
index 0000000..da754f4
--- /dev/null
@@ -0,0 +1,8 @@
+PLATFORM_CPPFLAGS += -march=armv5te 
+PLATFORM_CPPFLAGS += $(call cc-option,-mtune=arm926ejs,)
+
+PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common -ffixed-r8
+
+PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
+
+
diff --git a/arch/arm/cpu/arm926ejs/lpc3250/cpu.c b/arch/arm/cpu/arm926ejs/lpc3250/cpu.c
new file mode 100644 (file)
index 0000000..6f6360c
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/*
+ * CPU specific code
+ */
+
+#include <common.h>
+#include <command.h>
+#include <lpc3250.h>
+
+/*
+ * Use the watchdog timer to reset the system
+ */
+void reset_cpu(ulong addr)
+{
+       /* Enable the WDT clock */
+       CLKPWR->clkpwr_timer_clk_ctrl |= CLKPWR_PWMCLK_WDOG_EN;
+
+       /* Force RESETOUT_N active */
+       WDT->wdtim_pulse = 13000;
+       WDT->wdtim_mctrl = 0x70;
+
+       /* Wait forever */
+       while (1);
+}
diff --git a/arch/arm/cpu/arm926ejs/lpc3250/serial.c b/arch/arm/cpu/arm926ejs/lpc3250/serial.c
new file mode 100644 (file)
index 0000000..02765c2
--- /dev/null
@@ -0,0 +1,459 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC3250 serial port functions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <common.h>
+#include <lpc3250.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * ABS function
+ */
+int serial_abs(int v1, int v2)\r
+{\r
+  if (v1 > v2)\r
+  {\r
+    return v1 - v2;\r
+  }\r
+\r
+  return v2 - v1;\r
+}
+
+/*
+ * Find the best UART clock divider to get the desired port rate
+ */
+void serial_getdiv(u32 baudrate,
+                       unsigned int *xdiv,
+                       unsigned int *ydiv)
+{
+       unsigned int clkrate, savedclkrate, diff, basepclk;\r
+       int idxx, idyy;\r
+\r
+       /* Get the clock rate for the UART block */\r
+       basepclk = sys_get_rate(CLKPWR_PERIPH_CLK) >> 4;\r
+\r
+       /* Find the best divider */\r
+       *xdiv = *ydiv = 0;\r
+       savedclkrate = 0;\r
+       diff = 0xFFFFFFFF;\r
+       for (idxx = 1; idxx < 0xFF; idxx++)\r
+       {\r
+               for (idyy = idxx; idyy < 0xFF; idyy++)\r
+               {\r
+                       clkrate = (basepclk * idxx) / idyy;\r
+                       if (serial_abs(clkrate, baudrate) < diff)\r
+                       {\r
+                               diff = serial_abs(clkrate, baudrate);\r
+                               savedclkrate = clkrate;\r
+                               *xdiv = idxx;\r
+                               *ydiv = idyy;\r
+                       }\r
+               }\r
+       }\r
+}
+
+#ifdef USE_HIGH_SPEED_UART
+void hsuart_getdiv(u32 baudrate,\r
+                       unsigned int *xdiv)\r
+{\r
+  unsigned int clkrate, savedclkrate, diff, basepclk;\r
+  int idiv;\r
+  unsigned int divider;\r
+\r
+  /* Get the clock rate for the UART block */\r
+  basepclk = sys_get_rate(CLKPWR_PERIPH_CLK);\r
+\r
+  /* Find the best divider */\r
+  divider = 0;\r
+  savedclkrate = 0;\r
+  diff = 0xFFFFFFFF;\r
+  for (idiv = 0; idiv < 0x100; idiv++)\r
+  {\r
+    clkrate = basepclk / (14 * (idiv + 1));\r
+    if (serial_abs(clkrate, baudrate) < diff)\r
+    {\r
+      diff = serial_abs(clkrate, baudrate);\r
+      savedclkrate = clkrate;\r
+      divider = idiv;\r
+    }\r
+  }\r
+\r
+  /* Save computed divider */\r
+  *xdiv = divider;\r
+}\r
+\r
+void serial_setbrg (void)
+{
+       unsigned int xdiv, ydiv;\r
+    unsigned int divider;
+    UART_REGS_T *puregs = (UART_REGS_T *) CFG_UART_SEL;\r
+    HSUART_REGS_T *phsuregs = (HSUART_REGS_T *) CFG_UART_SEL;\r
+\r
+    if (CFG_UART_SEL == UART1) {\r
+           /* Find closest high speed baud rate for desired clock frequency */\r
+           hsuart_getdiv(gd->baudrate, &divider);\r
+        phsuregs->rate = divider;\r
+\r
+        // Disable flow control\r
+        phsuregs->ctrl &= ~((1<<14)|(1<<18));\r
+    } else {\r
+           /* Find closest baud rate for desired clock frequency */\r
+           serial_getdiv(gd->baudrate, &xdiv, &ydiv);\r
+\r
+           /* Set clock x/y divider for the UART */
+           if (puregs == UART3)
+           {\r
+                   CLKPWR->clkpwr_uart3_clk_ctrl =\r
+                           CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+           }
+           else if (puregs == UART4)
+           {\r
+                   CLKPWR->clkpwr_uart4_clk_ctrl =\r
+                           CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+           }\r
+           else if (puregs == UART5)
+           {\r
+                   CLKPWR->clkpwr_uart5_clk_ctrl =\r
+                           CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+           }\r
+           else if (puregs == UART6)
+           {\r
+                   CLKPWR->clkpwr_uart6_clk_ctrl =\r
+                           CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+           }\r
+    }\r
+}
+
+/*
+ * Initialise the serial port with the given baudrate. The settings
+ * are always 8 data bits, no parity, 1 stop bit, no start bits.
+ *
+ */
+int serial_init (void)
+{
+       volatile unsigned int tmp32;
+       int unum;
+       UART_REGS_T *puregs = (UART_REGS_T *) CFG_UART_SEL;\r
+    HSUART_REGS_T *phsuregs = (HSUART_REGS_T *) CFG_UART_SEL;
+
+       /* UART setup */
+\r
+    if (phsuregs == UART1) {\r
+           /* set baudrate */\r
+           serial_setbrg();\r
+\r
+        /* setup the buffers */\r
+        phsuregs->ctrl = (  (2<<19) /*HSU_HRTS_TRIG_32B*/ | \r
+                            (3<<16) /* HSU_TMO_INACT_16B*/ |\r
+                            (0x14<<9) /* HSU_OFFSET(0x14)*/ | \r
+                            (4<<2) /* HSU_RX_TL32B */ | \r
+                            (0<<0) /* HSU_TX_TL0B */);\r
+    } else {
+           /* Enable UART system clock */
+           if (puregs == UART3)
+           {
+                   CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART3_EN;
+                   unum = 3;
+           }
+           else if (puregs == UART4)
+           {
+                   CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART4_EN;
+                   unum = 4;
+           }\r
+           else if (puregs == UART5)
+           {
+                   CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART5_EN;
+                   unum = 5;
+           }\r
+           else if (puregs == UART6)
+           {
+                   CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART6_EN;
+                   unum = 6;
+           }\r
+
+           /* Place UART in autoclock mode */
+           tmp32 = UARTCNTL->clkmode & UART_CLKMODE_MASK(unum);
+           UARTCNTL->clkmode = (tmp32 |\r
+                   UART_CLKMODE_LOAD(UART_CLKMODE_AUTO, (unum)));\r
+\r
+           /* UART baud rate generator isn't used, so just set it to divider\r
+              by 1 */\r
+           puregs->lcr |= UART_LCR_DIVLATCH_EN;\r
+           puregs->dll_fifo = 1;\r
+           puregs->dlm_ier = 0;\r
+           puregs->lcr &= ~UART_LCR_DIVLATCH_EN;\r
+\r
+           /* Setup default UART state for N81 with FIFO mode */
+           puregs->lcr = UART_LCR_WLEN_8BITS;\r
+
+           /* set baudrate */
+           serial_setbrg();
+\r
+           /* Clear FIFOs and set FIFO level */\r
+           puregs->iir_fcr = (UART_FCR_RXFIFO_TL16 |\r
+                   UART_FCR_TXFIFO_TL0 | UART_FCR_FIFO_CTRL |\r
+                   UART_FCR_FIFO_EN | UART_FCR_TXFIFO_FLUSH |\r
+                   UART_FCR_RXFIFO_FLUSH);\r
+           tmp32 = puregs->iir_fcr;\r
+           tmp32 = puregs->lsr;\r
+\r
+           /* Use automatic clocking */\r
+    // tmp32 = UARTCNTL->clkmode & UART_CLKMODE_MASK(unum + 3);\r
+    // UARTCNTL->clkmode = tmp32 | UART_CLKMODE_LOAD(\r
+    //         UART_CLKMODE_AUTO, (unum + 3));  // TBD delete me\r
+    }\r
+
+       return 0;
+}
+
+/*
+ * Read a single byte from the serial port.
+ */
+int serial_getc (void)
+{
+    HSUART_REGS_T *phsuregs = (HSUART_REGS_T *) CFG_UART_SEL;\r
+       UART_REGS_T *puregs = (UART_REGS_T *) CFG_UART_SEL;\r
+\r
+    if (phsuregs == UART1) {\r
+        // Wait for a character to come in\r
+        while ((phsuregs->level & 0xFF) == 0)\r
+            {}\r
+        // Send the received character back\r
+        return ((unsigned char)(phsuregs->txrx_fifo));\r
+    } else {\r
+           /* Wait for a character from the UART */
+           while ((puregs->lsr & UART_LSR_RDR) == 0);
+
+           return (int) (puregs->dll_fifo & 0xFF);\r
+    }
+}
+
+/*
+ * Output a single byte to the serial port.
+ */
+void serial_putc (const char c)
+{
+    HSUART_REGS_T *phsuregs = (HSUART_REGS_T *) CFG_UART_SEL;\r
+       UART_REGS_T *puregs = (UART_REGS_T *) CFG_UART_SEL;\r
+\r
+    if (phsuregs == UART1) {\r
+        // Send out the character\r
+        phsuregs->txrx_fifo = c;\r
+        \r
+        // Wait for character to be sent (goes from non-zero to 0)\r
+        while ((phsuregs->level & 0xFF00) != 0);\r
+    } else {\r
+           /* Wait for FIFO to become empty */
+           while ((puregs->lsr & UART_LSR_THRE) == 0);
+
+           puregs->dll_fifo = (u32) c;\r
+    }\r
+
+       /* If \n, also do \r */
+       if (c == '\n')
+       {
+               serial_putc ('\r');
+       }
+}
+
+/*
+ * Test whether a character is in the RX buffer
+ */
+int serial_tstc (void)
+{
+    HSUART_REGS_T *phsuregs = (HSUART_REGS_T *) CFG_UART_SEL;\r
+       UART_REGS_T *puregs = (UART_REGS_T *) CFG_UART_SEL;\r
+\r
+    if (phsuregs == UART1) {\r
+           /* Wait for a character from the UART */\r
+           if ((phsuregs->level & 0xFF) == 0)\r
+           {\r
+            // No characters waiting\r
+            return 0;\r
+        }\r
+    } else {\r
+           /* Wait for a character from the UART */
+           if ((puregs->lsr & UART_LSR_RDR) == 0)
+           {
+                   return 0;
+           }
+    }\r
+\r
+    // Got here, must be a character waiting
+       return 1;
+}
+
+#else
+void serial_setbrg (void)
+{
+       unsigned int xdiv, ydiv;
+\r
+       /* Find closest baud rate for desired clock frequency */\r
+       serial_getdiv(gd->baudrate, &xdiv, &ydiv);\r
+\r
+       /* Set clock x/y divider for the UART */
+       if (CFG_UART_SEL == UART3)
+       {\r
+               CLKPWR->clkpwr_uart3_clk_ctrl =\r
+                       CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+       }
+       else if (CFG_UART_SEL == UART4)
+       {\r
+               CLKPWR->clkpwr_uart4_clk_ctrl =\r
+                       CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+       }\r
+       else if (CFG_UART_SEL == UART5)
+       {\r
+               CLKPWR->clkpwr_uart5_clk_ctrl =\r
+                       CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+       }\r
+       else if (CFG_UART_SEL == UART6)
+       {\r
+               CLKPWR->clkpwr_uart6_clk_ctrl =\r
+                       CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+       }\r
+}
+
+/*
+ * Initialise the serial port with the given baudrate. The settings
+ * are always 8 data bits, no parity, 1 stop bit, no start bits.
+ *
+ */
+int serial_init (void)
+{
+       volatile unsigned int tmp32;
+       int unum;
+       UART_REGS_T *puregs = (UART_REGS_T *) CFG_UART_SEL;
+
+       /* UART setup */
+
+       /* Enable UART system clock */
+       if (puregs == UART3)
+       {
+               CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART3_EN;
+               unum = 3;
+       }
+       else if (puregs == UART4)
+       {
+               CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART4_EN;
+               unum = 4;
+       }\r
+       else if (puregs == UART5)
+       {
+               CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART5_EN;
+               unum = 5;
+       }\r
+       else if (puregs == UART6)
+       {
+               CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART6_EN;
+               unum = 6;
+       }\r
+
+       /* Place UART in autoclock mode */
+       tmp32 = UARTCNTL->clkmode & ~UART_CLKMODE_MASK(unum);
+       UARTCNTL->clkmode = (tmp32 |\r
+               UART_CLKMODE_LOAD(UART_CLKMODE_AUTO, (unum)));\r
+\r
+       /* UART baud rate generator isn't used, so just set it to divider\r
+          by 1 */\r
+       puregs->lcr |= UART_LCR_DIVLATCH_EN;\r
+       puregs->dll_fifo = 1;\r
+       puregs->dlm_ier = 0;\r
+       puregs->lcr &= ~UART_LCR_DIVLATCH_EN;\r
+\r
+       /* Setup default UART state for N81 with FIFO mode */
+       puregs->lcr = UART_LCR_WLEN_8BITS;\r
+
+       /* set baudrate */
+       serial_setbrg();
+\r
+       /* Clear FIFOs and set FIFO level */\r
+       puregs->iir_fcr = (UART_FCR_RXFIFO_TL16 |\r
+               UART_FCR_TXFIFO_TL0 | UART_FCR_FIFO_CTRL |\r
+               UART_FCR_FIFO_EN | UART_FCR_TXFIFO_FLUSH |\r
+               UART_FCR_RXFIFO_FLUSH);\r
+       tmp32 = puregs->iir_fcr;\r
+       tmp32 = puregs->lsr;\r
+\r
+       /* Use automatic clocking */\r
+//     tmp32 = UARTCNTL->clkmode & UART_CLKMODE_MASK(unum + 3);\r
+//     UARTCNTL->clkmode = tmp32 | UART_CLKMODE_LOAD(\r
+//             UART_CLKMODE_AUTO, (unum + 3));  // TBD delete me\r
+
+       return 0;
+}
+
+/*
+ * Read a single byte from the serial port.
+ */
+int serial_getc (void)
+{
+       /* Wait for a character from the UART */
+       while ((CFG_UART_SEL->lsr & UART_LSR_RDR) == 0);
+
+       return (int) (CFG_UART_SEL->dll_fifo & 0xFF);
+}
+
+/*
+ * Output a single byte to the serial port.
+ */
+void serial_putc (const char c)
+{
+       /* Wait for FIFO to become empty */
+       while ((CFG_UART_SEL->lsr & UART_LSR_THRE) == 0);
+
+       CFG_UART_SEL->dll_fifo = (u32) c;\r
+
+       /* If \n, also do \r */
+       if (c == '\n')
+       {
+               serial_putc ('\r');
+       }
+}
+
+/*
+ * Test whether a character is in the RX buffer
+ */
+int serial_tstc (void)
+{
+       /* Wait for a character from the UART */
+       if ((CFG_UART_SEL->lsr & UART_LSR_RDR) == 0)
+       {
+               return 0;
+       }
+
+       return 1;
+}
+#endif
+
+/*
+ * Put a string to the UART
+ */
+void serial_puts (const char *s)
+{
+       while (*s)
+       {
+               serial_putc (*s++);
+       }
+}
+
diff --git a/board/nxp/ea3250/Makefile b/board/nxp/ea3250/Makefile
new file mode 100644 (file)
index 0000000..135a524
--- /dev/null
@@ -0,0 +1,52 @@
+#
+# Copyright (C) 2008 by NXP Semiconductors
+# All rights reserved.
+#
+# 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    = $(obj)lib$(BOARD).a
+
+COBJS  := ea3250.o net.o
+COBJS  += lowlevelsys_init.o
+SOBJS  := lowlevel_init.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/nxp/ea3250/config.mk b/board/nxp/ea3250/config.mk
new file mode 100644 (file)
index 0000000..ece1d73
--- /dev/null
@@ -0,0 +1,37 @@
+#
+# 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
+#
+
+# Embedded Artists LPC3250 OEM Board with or without S1L
+#
+
+#
+# 64 MB SDRAM @ 0x80000000
+#
+# Linux-Kernel is @ 0x80008000, entry 0x80008000
+# params @ 0x80000100
+# optionally with a ramdisk at 0x80300000
+#
+# we load ourself to 0x00000000 or 0x83FC0000
+#
+# download area is 0x80f00000
+#
+
+CONFIG_SYS_TEXT_BASE = 0x83FA0000
+
diff --git a/board/nxp/ea3250/ea3250.c b/board/nxp/ea3250/ea3250.c
new file mode 100644 (file)
index 0000000..99ef996
--- /dev/null
@@ -0,0 +1,418 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Based on code by Kevin Wells
+ * @Descr: Embedded Artists LPC3250 OEM Board support functions
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <configs/ea3250.h>
+#include <asm/mach-types.h>
+#include <lpc3250.h>
+#include <net.h>
+#include "ea3250_prv.h"
+               
+DECLARE_GLOBAL_DATA_PTR;
+
+/* ISP1301 USB transceiver I2C registers */
+#define        ISP1301_MODE_CONTROL_1          0x04    /* u8 read, set, +1 clear */
+
+#define        MC1_SPEED_REG           (1 << 0)
+#define        MC1_SUSPEND_REG         (1 << 1)
+#define        MC1_DAT_SE0             (1 << 2)
+#define        MC1_TRANSPARENT         (1 << 3)
+#define        MC1_BDIS_ACON_EN        (1 << 4)
+#define        MC1_OE_INT_EN           (1 << 5)
+#define        MC1_UART_EN             (1 << 6)
+#define        MC1_MASK                0x7f
+
+#define        ISP1301_MODE_CONTROL_2          0x12    /* u8 read, set, +1 clear */
+
+#define        MC2_GLOBAL_PWR_DN       (1 << 0)
+#define        MC2_SPD_SUSP_CTRL       (1 << 1)
+#define        MC2_BI_DI               (1 << 2)
+#define        MC2_TRANSP_BDIR0        (1 << 3)
+#define        MC2_TRANSP_BDIR1        (1 << 4)
+#define        MC2_AUDIO_EN            (1 << 5)
+#define        MC2_PSW_EN              (1 << 6)
+#define        MC2_EN2V7               (1 << 7)
+
+#define        ISP1301_OTG_CONTROL_1           0x06    /* u8 read, set, +1 clear */
+#      define  OTG1_DP_PULLUP          (1 << 0)
+#      define  OTG1_DM_PULLUP          (1 << 1)
+#      define  OTG1_DP_PULLDOWN        (1 << 2)
+#      define  OTG1_DM_PULLDOWN        (1 << 3)
+#      define  OTG1_ID_PULLDOWN        (1 << 4)
+#      define  OTG1_VBUS_DRV           (1 << 5)
+#      define  OTG1_VBUS_DISCHRG       (1 << 6)
+#      define  OTG1_VBUS_CHRG          (1 << 7)
+#define        ISP1301_OTG_STATUS              0x10    /* u8 readonly */
+#      define  OTG_B_SESS_END          (1 << 6)
+#      define  OTG_B_SESS_VLD          (1 << 7)
+
+#define ISP1301_I2C_ADDR 0x2D
+
+#define ISP1301_I2C_MODE_CONTROL_1 0x4
+#define ISP1301_I2C_MODE_CONTROL_2 0x12
+#define ISP1301_I2C_OTG_CONTROL_1 0x6
+#define ISP1301_I2C_OTG_CONTROL_2 0x10
+#define ISP1301_I2C_INTERRUPT_SOURCE 0x8
+#define ISP1301_I2C_INTERRUPT_LATCH 0xA
+#define ISP1301_I2C_INTERRUPT_FALLING 0xC
+#define ISP1301_I2C_INTERRUPT_RISING 0xE
+#define ISP1301_I2C_REG_CLEAR_ADDR 1
+
+
+#define I2C_START_BIT (1 << 8)
+#define I2C_STOP_BIT  (1 << 9)
+
+#define I2C_READ      0x01
+#define I2C_WRITE     0x00
+#define DUMMY_BYTE    0x55
+
+/*
+ * Dummy function to handle errors for EABI incompatibility
+ */
+void raise(void)
+{
+}
+
+/*
+ * Dummy function to handle errors for EABI incompatibility
+ */
+void abort(void)
+{
+}
+
+void reset_timer (void)
+{
+       unsigned int clkdlycnt, tbaseclk;
+
+       /* Reset timer */
+       TIMER_CNTR0->tcr = TIMER_CNTR_TCR_RESET;
+       TIMER_CNTR0->tcr = 0;
+       TIMER_CNTR0->tc = 0;
+
+       /* Clear and enable match function */
+       TIMER_CNTR0->ir = TIMER_CNTR_MTCH_BIT(0);
+
+       /* Count mode is PCLK edge */
+       TIMER_CNTR0->ctcr = TIMER_CNTR_SET_MODE(TIMER_CNTR_CTCR_TIMER_MODE);
+
+       /* Set prescale counter value for a 1mS tick */
+       tbaseclk = sys_get_rate(CLKPWR_PERIPH_CLK);
+       clkdlycnt = (tbaseclk / CONFIG_SYS_HZ);
+       TIMER_CNTR0->pr = clkdlycnt - 1;
+
+       /* Enable the timer */
+       TIMER_CNTR0->tcr = TIMER_CNTR_TCR_EN;
+}
+
+ulong get_timer (ulong base)
+{
+       ulong tcr = TIMER_CNTR0->tc;
+       return tcr - base;
+}
+
+void timer_init(void)
+{
+       /* Enable timer system clock */
+       CLKPWR->clkpwr_timers_pwms_clk_ctrl_1 |=
+               CLKPWR_TMRPWMCLK_TIMER0_EN;
+
+       reset_timer();
+}
+
+void udelay(unsigned long usec)
+{
+       unsigned long tbaseclk;
+
+       /* Enable timer system clock */
+       CLKPWR->clkpwr_timers_pwms_clk_ctrl_1 |=
+               CLKPWR_TMRPWMCLK_TIMER1_EN;
+
+       /* Reset timer */
+       TIMER_CNTR1->tcr = TIMER_CNTR_TCR_RESET;
+       TIMER_CNTR1->tcr = 0;
+       TIMER_CNTR1->tc = 0;
+       TIMER_CNTR1->pr = 0;
+
+       /* Clear and enable match function */
+       TIMER_CNTR1->ir = TIMER_CNTR_MTCH_BIT(0);
+
+       /* Count mode is PCLK edge */
+       TIMER_CNTR1->ctcr = TIMER_CNTR_SET_MODE(TIMER_CNTR_CTCR_TIMER_MODE);
+
+       /* Set prescale counter value for a 1uS tick */
+       tbaseclk = sys_get_rate(CLKPWR_PERIPH_CLK);
+       tbaseclk = (tbaseclk / 1000000) - 1;
+       TIMER_CNTR1->pr = tbaseclk;
+
+       /* Set match for number of usecs */
+       TIMER_CNTR1->mr[0] = usec;
+
+       /* Interrupt on match 0 */
+       TIMER_CNTR1->mcr = TIMER_CNTR_MCR_MTCH(0);
+
+       /* Enable the timer */
+       TIMER_CNTR1->tcr = TIMER_CNTR_TCR_EN;
+
+       /* Loop until match occurs */
+       while ((TIMER_CNTR1->ir & TIMER_CNTR_MTCH_BIT(0)) == 0);
+
+       /* Stop timer */
+       TIMER_CNTR1->tcr = 0;
+
+       /* Disable timer system clock */
+       CLKPWR->clkpwr_timers_pwms_clk_ctrl_1 &=
+               ~CLKPWR_TMRPWMCLK_TIMER1_EN;
+}
+
+/*
+ * Miscellaneous platform dependent initialisations
+ */
+int board_init (void)
+{
+       /* arch number of Logic-Board - MACH_TYPE_LPC3XXX */
+       gd->bd->bi_arch_number = MACH_TYPE_UBOOTSYS;
+
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = CONFIG_ENV_ADDR;
+
+       return 0;
+}
+
+int dram_init (void)
+{
+       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+
+       /* 64M */
+       gd->bd->bi_dram[0].size = 0x04000000; /* 64M */
+
+       return 0;
+}
+
+
+static int i2c_wait_reset(int timeout)
+{
+       while(timeout > 0 && (OTG->otg_i2c.otg_i2c_ctrl & I2C_RESET))
+       {
+               udelay(1000);
+               timeout--;
+       }
+
+       return (timeout <= 0);  
+}
+
+
+static int isp1301_get_value(int reg)
+{
+       int n = 0;
+
+       /* send isp1301 address */
+       OTG->otg_i2c.otg_i2c_txrx = ((ISP1301_I2C_ADDR << 1) | I2C_START_BIT);   
+
+       /* register (offset) to read from */
+       OTG->otg_i2c.otg_i2c_txrx = reg;   
+
+       /* repeat start */
+       OTG->otg_i2c.otg_i2c_txrx = ((ISP1301_I2C_ADDR << 1) | I2C_START_BIT | I2C_READ);
+       OTG->otg_i2c.otg_i2c_txrx = (I2C_STOP_BIT | DUMMY_BYTE);
+
+       while (((OTG->otg_i2c.otg_i2c_stat & I2C_TDI) != I2C_TDI) && n++ < 100000);
+
+       if (n>= 100000)
+       {
+               printf("isp1301_get_value: ERROR TDI not set\n");
+       }
+
+       /* clear TDI */
+       OTG->otg_i2c.otg_i2c_stat |= I2C_TDI;
+
+       return (OTG->otg_i2c.otg_i2c_txrx & 0xff);
+}
+
+static int isp1301_set_value(int reg, int value)
+{
+       int n = 0;
+
+       /* send isp1301 address */
+       OTG->otg_i2c.otg_i2c_txrx = ((ISP1301_I2C_ADDR << 1) | I2C_START_BIT);   
+
+       /* offset to write to */
+       OTG->otg_i2c.otg_i2c_txrx = (reg | I2C_WRITE);   
+       /* value to write */
+       OTG->otg_i2c.otg_i2c_txrx = (value | I2C_STOP_BIT);  
+  
+       /* wait for transmit done (TDI) */
+       while (((OTG->otg_i2c.otg_i2c_stat & I2C_TDI) != I2C_TDI) && n++ < 100000);
+
+       if (n>= 100000)
+       {
+               printf("isp1301_set_value: ERROR TDI not set\n");
+               return -1;              
+       }
+  
+       /* clear TDI */
+       OTG->otg_i2c.otg_i2c_stat |= I2C_TDI;     
+
+       return 0;
+}
+
+static void isp1301_configure(void)
+{
+       OTG->otg_i2c.otg_i2c_clk_hi = 0x3f;
+       OTG->otg_i2c.otg_i2c_clk_lo = 0x3f; 
+
+       OTG->otg_i2c.otg_i2c_ctrl |= I2C_RESET; 
+       i2c_wait_reset(100);
+
+       /* LPC32XX only supports DAT_SE0 USB mode */
+       /* This sequence is important */
+
+       /* Disable transparent UART mode first */
+       isp1301_set_value((ISP1301_I2C_MODE_CONTROL_1 |
+               ISP1301_I2C_REG_CLEAR_ADDR), MC1_UART_EN);
+
+       isp1301_set_value((ISP1301_I2C_MODE_CONTROL_1 |
+               ISP1301_I2C_REG_CLEAR_ADDR), ~MC1_SPEED_REG);
+       isp1301_set_value(ISP1301_I2C_MODE_CONTROL_1, MC1_SPEED_REG);
+       isp1301_set_value((ISP1301_I2C_MODE_CONTROL_2 | ISP1301_I2C_REG_CLEAR_ADDR), ~0);
+       isp1301_set_value(ISP1301_I2C_MODE_CONTROL_2, 
+               (MC2_BI_DI | MC2_PSW_EN | MC2_SPD_SUSP_CTRL));
+
+       isp1301_set_value((ISP1301_I2C_OTG_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR), ~0);
+       isp1301_set_value(ISP1301_I2C_MODE_CONTROL_1, MC1_DAT_SE0);
+       isp1301_set_value(ISP1301_I2C_OTG_CONTROL_1, 
+               (OTG1_DM_PULLDOWN | OTG1_DP_PULLDOWN));
+       isp1301_set_value((ISP1301_I2C_OTG_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR),
+               (OTG1_DM_PULLUP | OTG1_DP_PULLUP));
+       isp1301_set_value((ISP1301_I2C_INTERRUPT_LATCH | ISP1301_I2C_REG_CLEAR_ADDR), ~0);
+       isp1301_set_value((ISP1301_I2C_INTERRUPT_FALLING | ISP1301_I2C_REG_CLEAR_ADDR), ~0);
+       isp1301_set_value((ISP1301_I2C_INTERRUPT_RISING | ISP1301_I2C_REG_CLEAR_ADDR), ~0);
+
+       /* Enable usb_need_clk clock after transceiver is initialized */
+       CLKPWR->clkpwr_usb_ctrl |= (CLKPWR_USBCTRL_USBDVND_EN);
+
+
+       printf("\nISP1301 Vendor ID  : 0x%04x\n", 
+               (isp1301_get_value(0x00) | (isp1301_get_value(0x01) << 8)));
+       printf("ISP1301 Product ID : 0x%04x\n", 
+               (isp1301_get_value(0x02) | (isp1301_get_value(0x03) << 8)));
+       printf("ISP1301 Version ID : 0x%04x\n", 
+               (isp1301_get_value(0x14) | (isp1301_get_value(0x15) << 8)));
+       
+}
+
+static void usbpll_setup(void)
+{
+       int n = 0;
+
+       /* make sure clocks are disabled */
+       CLKPWR->clkpwr_usb_ctrl &= ~(CLKPWR_USBCTRL_CLK_EN1 | CLKPWR_USBCTRL_CLK_EN2);
+
+
+       /* start PLL clock input */
+       CLKPWR->clkpwr_usb_ctrl |= CLKPWR_USBCTRL_CLK_EN1;
+
+
+       /* 
+         * Setup PLL.  
+         *
+         */
+       CLKPWR->clkpwr_usb_ctrl |= CLKPWR_USBCTRL_FDBK_PLUS1(192-1);
+       CLKPWR->clkpwr_usb_ctrl |= CLKPWR_USBCTRL_POSTDIV_2POW(0x01);
+       CLKPWR->clkpwr_usb_ctrl |= CLKPWR_USBCTRL_PLL_PWRUP;
+       
+       while ((CLKPWR->clkpwr_usb_ctrl & CLKPWR_USBCTRL_PLL_STS) == 0)
+       {
+               if (n++ >= 100000)
+               {
+                       printf("usbpll_setup: ERROR PLL doesn't lock\n");
+                       break;
+               }
+       }
+
+       /* enable PLL output */
+       CLKPWR->clkpwr_usb_ctrl |= CLKPWR_USBCTRL_CLK_EN2;              
+}
+
+
+int usb_board_init(void)
+{
+       /* enable AHB slave USB clock */
+       CLKPWR->clkpwr_usb_ctrl |= 
+               (CLKPWR_USBCTRL_HCLK_EN | CLKPWR_USBCTRL_BUS_KEEPER);
+
+       /* enable I2C clock in OTG block if it isn't */
+       if ((OTG->otg_clk_sts & OTG_CLK_I2C_EN) != OTG_CLK_I2C_EN)
+       {
+               OTG->otg_clk_ctrl = OTG_CLK_I2C_EN;
+
+               while (OTG->otg_clk_sts != OTG_CLK_I2C_EN);
+       }
+
+       /* Configure ISP1301 */
+       isp1301_configure();
+
+       /* setup USB clocks and PLL */
+       usbpll_setup();
+
+       /* enable usb_host_need_clk */
+       CLKPWR->clkpwr_usb_ctrl |= CLKPWR_USBCTRL_USBHSTND_EN;
+
+       /* enable all needed USB clocks */
+       OTG->otg_clk_ctrl = (OTG_CLK_AHB_EN|OTG_CLK_OTG_EN
+               |OTG_CLK_I2C_EN|OTG_CLK_HOST_EN);
+
+       while ((OTG->otg_clk_ctrl & (OTG_CLK_AHB_EN|OTG_CLK_OTG_EN
+               |OTG_CLK_I2C_EN|OTG_CLK_HOST_EN)) !=
+              (OTG_CLK_AHB_EN|OTG_CLK_OTG_EN
+               |OTG_CLK_I2C_EN|OTG_CLK_HOST_EN)) ;
+       
+       OTG->otg_sts_ctrl |= OTG_HOST_EN;
+       isp1301_set_value(ISP1301_I2C_OTG_CONTROL_1, OTG1_VBUS_DRV);
+
+       return 0;
+}
+
+int usb_board_stop(void)
+{
+       /* vbus off */
+       isp1301_set_value(
+               (ISP1301_I2C_OTG_CONTROL_1| ISP1301_I2C_REG_CLEAR_ADDR), 
+               OTG1_VBUS_DRV);
+
+       OTG->otg_sts_ctrl &= ~OTG_HOST_EN;
+
+       CLKPWR->clkpwr_usb_ctrl &= ~CLKPWR_USBCTRL_HCLK_EN;
+
+       return 0;
+}
+
+int usb_board_init_fail(void)
+{
+       usb_board_stop();
+
+       return 0;
+}
diff --git a/board/nxp/ea3250/ea3250_prv.h b/board/nxp/ea3250/ea3250_prv.h
new file mode 100644 (file)
index 0000000..5370a37
--- /dev/null
@@ -0,0 +1,43 @@
+/***********************************************************************\r
+ * $Id::$\r
+ *\r
+ * Project: Embedded Artists LPC3250 OEM Board definitions\r
+ *\r
+ * Description:\r
+ *     This file contains board specific information such as the\r
+ *     chip select wait states, and other board specific information.\r
+ *\r
+ ***********************************************************************\r
+ * Software that is described herein is for illustrative purposes only\r
+ * which provides customers with programming information regarding the\r
+ * products. This software is supplied "AS IS" without any warranties.\r
+ * NXP Semiconductors assumes no responsibility or liability for the\r
+ * use of the software, conveys no license or title under any patent,\r
+ * copyright, or mask work right to the product. NXP Semiconductors\r
+ * reserves the right to make changes in the software without\r
+ * notification. NXP Semiconductors also make no representation or\r
+ * warranty that such application will be suitable for the specified\r
+ * use without further testing or modification.\r
+ **********************************************************************/\r
+\r
+#ifndef EA3250_PRV_H\r
+#define EA3250_PRV_H\r
+
+\r
+// Enable the following define to setup for RMII mode\r
+#define USE_PHY_RMII\r
+\r
+// PHY address (configured via PHY ADRx pins)\r
+#define PHYDEF_PHYADDR           0x0001\r
+\r
+// DP83848 Ethernet Phy Extended Register
+#define DP83848_PHY_STATUS     0x10
+
+// Maximum ethernet frame size, maximum RX and TX packets\r
+#define ENET_MAXF_SIZE             1536\r
+#define ENET_MAX_TX_PACKETS        16\r
+#define ENET_MAX_RX_PACKETS        16
+\r
+\r
+\r
+#endif /* EA3250_PRV_H */\r
diff --git a/board/nxp/ea3250/lowlevel_init.S b/board/nxp/ea3250/lowlevel_init.S
new file mode 100644 (file)
index 0000000..de947f7
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Based on code by Kevin Wells
+ * @Descr: Embedded Artists LPC3250 OEM Board low level init code
+ *
+ * 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>
+
+#define IRAM_STK_TEMP 0x0003C000
+.globl ea3250_sys_init
+.globl dcache_kill
+
+.globl lowlevel_init
+lowlevel_init:
+       /*
+        * Setup basic stack and save return address
+        */
+       ldr     sp, =IRAM_STK_TEMP
+       stmia   sp, {lr}
+
+       /*
+        * Initialize EA3250 board
+        */
+       bl      ea3250_sys_init
+
+       ldmia   sp, {r0}
+       mov     pc, r0
+
diff --git a/board/nxp/ea3250/lowlevelsys_init.c b/board/nxp/ea3250/lowlevelsys_init.c
new file mode 100644 (file)
index 0000000..ed63bf9
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Based on code by Kevin Wells
+ * @Descr: Embedded Artists LPC3250 OEM Board support functions
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <configs/ea3250.h>
+#include <asm/mach-types.h>
+#include <lpc3250.h>
+#include <net.h>
+#include "ea3250_prv.h"
+
+/*
+ * Miscellaneous platform dependent initializations
+ */
+void ea3250_sys_init(void)
+{
+}
+
diff --git a/board/nxp/ea3250/net.c b/board/nxp/ea3250/net.c
new file mode 100644 (file)
index 0000000..29f3bd3
--- /dev/null
@@ -0,0 +1,551 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Based on code by Kevin Wells
+ * @Descr: Embedded Artists LPC3250 OEM Board net interface support functions
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <common.h>
+#include <command.h>
+#include <net.h>
+#include <lpc3250.h>
+#include <configs/ea3250.h>
+#include "ea3250_prv.h"
+#include "miiphy.h"
+
+static unsigned long g_dmabase;\r
+static unsigned long gdma_size;\r
+static TXRX_DESC_T *pTXDesc;\r
+static unsigned long *pTXStatus;\r
+static unsigned long pTXVBuffs [ENET_MAX_TX_PACKETS];\r
+static TXRX_DESC_T *pRXDesc;\r
+static RX_STATUS_T *pRXStatus;\r
+static unsigned long pRXVBuffs [ENET_MAX_RX_PACKETS];
+#ifndef USE_IRAM_FOR_ETH_BUFFERS
+static unsigned long ethbuffs[4096];\r
+#endif
+
+
+static void msDelay(unsigned long ms)\r
+{\r
+       udelay(ms * 1000);
+}\r
+\r
+//------------------------------------------------------------------------------\r
+static int RMII_Write (unsigned long PhyReg, unsigned long Value)\r
+{\r
+       unsigned long mst = 250;\r
+       int sts = 0;\r
+\r
+       // Write value at PHY address and register\r
+       ENETMAC->madr = (PHYDEF_PHYADDR << 8) | PhyReg;\r
+       ENETMAC->mwtd = Value;\r
+\r
+       // Wait for unbusy status\r
+       while (mst > 0)\r
+       {\r
+               if ((ENETMAC->mind & MIND_BUSY) == 0)\r
+               {\r
+                       mst = 0;\r
+                       sts = 1;\r
+               }\r
+               else\r
+               {\r
+                       mst--;\r
+                       msDelay(1);\r
+               }\r
+       }\r
+\r
+       return sts;\r
+}\r
+\r
+//------------------------------------------------------------------------------\r
+int RMII_Read(unsigned long PhyReg, unsigned long *data) \r
+{\r
+       unsigned long mst = 250;\r
+       int sts = 0;\r
+\r
+       // Read value at PHY address and register\r
+       ENETMAC->madr = (PHYDEF_PHYADDR << 8) | PhyReg;\r
+       ENETMAC->mcmd = MCMD_READ;\r
+\r
+       // Wait for unbusy status\r
+       while (mst > 0)\r
+       {\r
+               if ((ENETMAC->mind & MIND_BUSY) == 0)\r
+               {\r
+                       mst = 0;\r
+                       *data = ENETMAC->mrdd;\r
+                       sts = 1;\r
+               }\r
+               else\r
+               {\r
+                       mst--;\r
+                       msDelay(1);\r
+               }\r
+       }\r
+\r
+       ENETMAC->mcmd = 0;\r
+\r
+       return sts;\r
+}\r
+\r
+//------------------------------------------------------------------------------\r
+int HYPHYReset(void)\r
+{\r
+       int goodacc;\r
+       unsigned long tmp1, mst;\r
+\r
+       // Reset the PHY and wait for reset to complete\r
+       goodacc = RMII_Write(PHY_BMCR, PHY_BMCR_RESET);\r
+       if (goodacc == 0)\r
+       {\r
+               return 0;\r
+       }\r
+       mst = 400;\r
+       goodacc = 0;\r
+       while (mst > 0)\r
+       {\r
+               RMII_Read(PHY_BMCR, &tmp1);\r
+               if ((tmp1 & PHY_BMCR_RESET) == 0)\r
+               {\r
+                       mst = 0;\r
+                       goodacc = 1;\r
+               }\r
+               else\r
+               {\r
+                       mst--;\r
+                       msDelay(1);\r
+               }\r
+       }\r
+\r
+       return goodacc;\r
+}\r
+\r
+static int phy_get_link_status (void)
+{
+        unsigned long status;
+
+        /* Status is read once to clear old link state */
+        RMII_Read(PHY_BMSR,&status);
+
+        /*
+        * Wait if the link is up, and autonegotiation is in progress
+        * (ie - we're capable and it's not done)
+        */
+        status = 0;
+        RMII_Read(PHY_BMSR,&status);
+        if ((status & PHY_BMSR_LS) && (status & PHY_BMSR_AUTN_ABLE)
+            && !(status & PHY_BMSR_AUTN_COMP)) {
+                int i = 0;
+
+                while (!(status & PHY_BMSR_AUTN_COMP)) {
+                        /* Timeout reached */
+                        if (i > 1000) {
+                                printf("Timeout\n");
+                                return 1;
+                        }
+                        i++;
+                        msDelay(1);   /* 1 ms */
+                        RMII_Read(PHY_BMSR,&status);
+                }
+                return 0;
+        } else {
+                if (status & PHY_BMSR_LS)
+                        return 0;
+                else
+                        return 1;
+        }
+        return 1;
+}
+
+//------------------------------------------------------------------------------\r
+int txrx_setup(void)\r
+{\r
+       int idx;\r
+       unsigned long *pTXStatusL, pbase1, pbase2, pbase3;\r
+       TXRX_DESC_T *pTXRXDesc;\r
+       RX_STATUS_T *pRXStatusL;\r
+\r
+       // Get physical address and size of DMA buffers
+#ifdef USE_IRAM_FOR_ETH_BUFFERS
+       g_dmabase = (unsigned long) IRAM_ETH_BUFF_BASE;
+       gdma_size = IRAM_ETH_BUFF_SIZE;
+#else
+       g_dmabase = (unsigned long) &ethbuffs;
+       gdma_size = sizeof(ethbuffs);
+#endif
+\r
+       // Setup base pointers\r
+       pbase1 = g_dmabase;     // Start of descriptors\r
+       pbase2 = pbase1 + 256;  // Start of statuses\r
+       pbase3 = pbase1 + 1024; // Start of buffers\r
+\r
+       // Setup pointers to TX structures\r
+       ENETMAC->txdescriptor =  pbase1;\r
+       ENETMAC->txstatus = pbase2;\r
+       ENETMAC->txdescriptornumber = (ENET_MAX_TX_PACKETS - 1);\r
+\r
+       // Save base address of TX descriptor table and TX status\r
+       pTXRXDesc = (TXRX_DESC_T *) pbase1;\r
+       pTXStatusL = (unsigned long *) pbase2;\r
+       pTXDesc = pTXRXDesc;\r
+       pTXStatus = pTXStatusL;\r
+\r
+       // Build TX descriptors\r
+       for (idx = 0; idx < ENET_MAX_TX_PACKETS; idx++)\r
+       {\r
+               pTXRXDesc->packet = pbase3;\r
+               pTXRXDesc->control = 0;\r
+               *pTXStatusL = 0;\r
+\r
+               // Save virtual address of buffer\r
+#ifdef USE_IRAM_FOR_ETH_BUFFERS
+               pTXVBuffs [idx] = (unsigned long) pbase3;\r
+#else
+#pragma error "NOT supported"
+#endif
+\r
+               // Next descriptor and status\r
+               pTXRXDesc++;\r
+               pTXStatusL++;\r
+               pbase1 += sizeof (TXRX_DESC_T);\r
+               pbase2 += sizeof (unsigned long);\r
+               pbase3 += ENET_MAXF_SIZE;\r
+       }\r
+\r
+       // Setup pointers to RX structures\r
+       ENETMAC->rxdescriptor = pbase1;\r
+       ENETMAC->rxstatus = pbase2;\r
+       ENETMAC->rxdescriptornumber = (ENET_MAX_RX_PACKETS - 1);\r
+\r
+       // Save base address of RX descriptor table and RX status\r
+       pRXDesc = pTXRXDesc;\r
+       pRXStatus = pRXStatusL = (RX_STATUS_T *) pTXStatusL;\r
+\r
+       // Build RX descriptors\r
+       for (idx = 0; idx < ENET_MAX_TX_PACKETS; idx++)\r
+       {\r
+               pTXRXDesc->packet = pbase3;\r
+               pTXRXDesc->control = 0x80000000 | (ENET_MAXF_SIZE - 1);\r
+               pRXStatusL->statusinfo = 0;\r
+               pRXStatusL->statushashcrc = 0;\r
+\r
+               // Save virtual address of buffer\r
+#ifdef USE_IRAM_FOR_ETH_BUFFERS
+               pRXVBuffs [idx] = (unsigned long) pbase3;
+#else
+#pragma error "NOT supported"
+#endif\r
+\r
+               // Next descriptor and status\r
+               pTXRXDesc++;\r
+               pRXStatusL++;\r
+               pbase1 += sizeof (TXRX_DESC_T);\r
+               pbase2 += sizeof (unsigned long);\r
+               pbase3 += ENET_MAXF_SIZE;\r
+       }\r
+\r
+    return 1;\r
+}\r
+\r
+//------------------------------------------------------------------------------\r
+int HWInit(bd_t * bd)\r
+{\r
+       int btemp;\r
+       unsigned int duplex, speed;
+       unsigned long tmp1, mst = 250;\r
+
+       // Enable MAC interface\r
+       CLKPWR->clkpwr_macclk_ctrl = (CLKPWR_MACCTRL_HRCCLK_EN |\r
+               CLKPWR_MACCTRL_MMIOCLK_EN | CLKPWR_MACCTRL_DMACLK_EN |\r
+#ifdef USE_PHY_RMII\r
+               CLKPWR_MACCTRL_USE_RMII_PINS);\r
+#else\r
+               CLKPWR_MACCTRL_USE_MII_PINS);\r
+#endif\r
+\r
+       // Set RMII management clock rate. This clock should be slower\r
+       // than 12.5MHz (for NXP PHYs only). For a divider of 28, the\r
+       // clock rate when HCLK is 150MHz will be 5.4MHz\r
+       ENETMAC->mcfg = MCFG_CLOCK_SELECT(MCFG_CLOCK_HOST_DIV_28);\r
+\r
+       // Reset all MAC logic\r
+       ENETMAC->mac1 = (MAC1_SOFT_RESET | MAC1_SIMULATION_RESET |\r
+               MAC1_RESET_MCS_TX | MAC1_RESET_TX | MAC1_RESET_MCS_RX |\r
+               MAC1_RESET_RX);\r
+       ENETMAC->command = (COMMAND_REG_RESET | COMMAND_TXRESET |\r
+               COMMAND_RXRESET);\r
+       msDelay(10);\r
+\r
+       // Initial MAC initialization\r
+       ENETMAC->mac1 = MAC1_PASS_ALL_RX_FRAMES;\r
+       ENETMAC->mac2 = (MAC2_PAD_CRC_ENABLE | MAC2_CRC_ENABLE);\r
+       ENETMAC->maxf = ENET_MAXF_SIZE;\r
+\r
+       // Maximum number of retries, 0x37 collision window, gap */\r
+       ENETMAC->clrt = (CLRT_LOAD_RETRY_MAX(0xF) |\r
+               CLRT_LOAD_COLLISION_WINDOW(0x37));\r
+       ENETMAC->ipgr = IPGR_LOAD_PART2(0x12);\r
+\r
+#ifdef USE_PHY_RMII\r
+       // RMII setup\r
+       ENETMAC->command = (COMMAND_RMII | COMMAND_PASSRUNTFRAME);\r
+       ENETMAC->supp = SUPP_RESET_RMII;\r
+       msDelay(10);\r
+#else\r
+       // MII setup\r
+       ENETMAC->command = COMMAND_PASSRUNTFRAME;\r
+#endif\r
+       // Enable rate auto-negotiation for the link\r
+       if (RMII_Write(PHY_BMCR,\r
+               (PHY_BMCR_100MB | PHY_BMCR_AUTON)) == 0)\r
+       {\r
+               return 0;\r
+       }\r
+        
+       mst = 1000;
+        btemp = 1;
+        while(mst > 0)
+        {
+                /* Wait for Link status to set UP or Timeout */
+                if(phy_get_link_status() == 0) {
+                        mst = 0;
+                        btemp = 0;
+                        printf("ENET:auto-negotiation complete#$\n");
+                }
+                else {
+                        mst--;
+                        msDelay(1);
+                }
+        }
+        if(btemp) {
+                printf("ENET:auto-negotiation failed#$\n");
+                return 0;
+        }
+
+        /* Read PHY Status Register to determine Ethernet Configuration */
+        tmp1 = 0;
+        RMII_Read (DP83848_PHY_STATUS,&tmp1);
+        duplex = (tmp1 & 0x0004) >> 2;
+        speed = (tmp1 & 0x0002) >> 1;
+
+       // Configure Full/Half Duplex mode\r
+       if (duplex == 1)\r
+       {\r
+               // 10MBase full duplex is supported\r
+               ENETMAC->mac2 |= MAC2_FULL_DUPLEX;\r
+               ENETMAC->command |= COMMAND_FULLDUPLEX;\r
+               ENETMAC->ipgt = IPGT_LOAD(0x15);\r
+               printf("ENET:FULL DUPLEX\n");\r
+       }\r
+       else\r
+       {\r
+               ENETMAC->ipgt = IPGT_LOAD(0x12);\r
+               printf("ENET:HALF DUPLEX\n");\r
+       }\r
+\r
+       // Configure 100MBit/10MBit mode\r
+       if (speed == 0)\r
+       {\r
+               // 100MBase mode\r
+               ENETMAC->supp = SUPP_SPEED;\r
+               printf("ENET:100MBase\n");\r
+       }\r
+       else\r
+       {\r
+               // 10MBase mode\r
+               ENETMAC->supp = 0;\r
+               printf("ENET:10Base\n");\r
+       }\r
+\r
+       // Save station address\r
+       ENETMAC->sa [2] = (unsigned long) (bd->bi_enetaddr[0] | (bd->bi_enetaddr[1] << 8));\r
+       ENETMAC->sa [1] = (unsigned long) (bd->bi_enetaddr[2] | (bd->bi_enetaddr[3] << 8));\r
+       ENETMAC->sa [0] = (unsigned long) (bd->bi_enetaddr[4] | (bd->bi_enetaddr[5] << 8));\r
+\r
+       // Setup TX and RX descriptors\r
+       txrx_setup();\r
+\r
+       // Enable broadcast and matching address packets\r
+       ENETMAC->rxfliterctrl = (RXFLTRW_ACCEPTUBROADCAST |\r
+               RXFLTRW_ACCEPTPERFECT);\r
+\r
+       // Clear and enable interrupts\r
+       ENETMAC->intclear = 0xFFFF;\r
+       ENETMAC->intenable = 0;\r
+\r
+       // Enable receive and transmit mode of MAC ethernet core\r
+       ENETMAC->command |= (COMMAND_RXENABLE | COMMAND_TXENABLE);\r
+       ENETMAC->mac1 |= MAC1_RECV_ENABLE;\r
+\r
+       // Perform a 'dummy' send of the first ethernet frame with a size of 0\r
+       // to 'prime' the MAC. The first packet after a reset seems to wait\r
+       // until at least 2 packets are ready to go.\r
+       tmp1 = 0;\r
+       eth_send(&tmp1, 4);\r
+\r
+       return 1;\r
+}\r
+\r
+//------------------------------------------------------------------------------\r
+int HWDeInit(void)\r
+{\r
+       // Reset PHY\r
+       (void) HYPHYReset();\r
+\r
+       // Reset all MAC logic\r
+       ENETMAC->mac1 = (MAC1_SOFT_RESET | MAC1_SIMULATION_RESET |\r
+               MAC1_RESET_MCS_TX | MAC1_RESET_TX | MAC1_RESET_MCS_RX |\r
+               MAC1_RESET_RX);\r
+       ENETMAC->command = (COMMAND_REG_RESET | COMMAND_TXRESET |\r
+               COMMAND_RXRESET);\r
+       msDelay(2);\r
+\r
+       // Disable MAC clocks, but keep MAC interface active\r
+#ifdef USE_PHY_RMII\r
+       CLKPWR->clkpwr_macclk_ctrl = CLKPWR_MACCTRL_USE_RMII_PINS;\r
+#else\r
+       CLKPWR->clkpwr_macclk_ctrl = CLKPWR_MACCTRL_USE_MII_PINS;\r
+#endif\r
+\r
+       return 1;\r
+}\r
+
+void eth_halt (void)
+{
+       HWDeInit();
+}
+
+int eth_init (bd_t * bd)
+{
+       int rc;
+
+       char *s, *e;
+       int i;
+
+       s = getenv ("ethaddr");
+       for (i = 0; i < 6; ++i) {
+               bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;
+               if (s)
+                       s = (*e) ? e + 1 : e;
+       }
+
+\r
+       printf ("\tHW MAC address:  "
+               "%02X:%02X:%02X:%02X:%02X:%02X\n",
+               bd->bi_enetaddr[0], bd->bi_enetaddr[1],
+               bd->bi_enetaddr[2], bd->bi_enetaddr[3],
+               bd->bi_enetaddr[4], bd->bi_enetaddr[5] );
+
+       rc = HWInit(bd);\r
+\r
+       // De-init if an error occurred\r
+       if (rc == 0)\r
+       {
+               printf ("ENET init failure\n");\r
+               HWDeInit();\r
+               return -1;
+       }\r
+\r
+       return 0;\r
+}
+
+/* Get a data block via Ethernet */
+int eth_rx (void)
+{
+       unsigned long idx, length;\r
+
+       // Determine if a frame has been received\r
+       length = 0;\r
+       idx = ENETMAC->rxconsumeindex;\r
+       if (ENETMAC->rxproduceindex != idx)\r
+       {
+               // Clear interrupt\r
+               ENETMAC->intclear = MACINT_RXDONEINTEN;\r
+\r
+               // Frame received, get size of RX packet\r
+               length = (pRXStatus[idx].statusinfo & 0x7FF);\r
+
+               /* Pass the packet up to the protocol layer */
+               if (length > 0)
+               {
+                       memcpy((void *) NetRxPackets[0], (void *) pRXVBuffs [idx], length);\r
+                       NetReceive (NetRxPackets[0], (unsigned short) length);
+               }
+
+               // Return DMA buffer\r
+               idx++;\r
+               if (idx >= ENET_MAX_TX_PACKETS)\r
+               {\r
+                       idx = 0;\r
+               }\r
+               ENETMAC->rxconsumeindex = (unsigned long) idx;\r
+       }\r
+\r
+       return (int) length;
+}
+
+/* Send a data block via Ethernet. */
+int eth_send (volatile void *packet, int length)
+{
+       unsigned long idx, cidx, fb;
+
+       // Determine number of free buffers and wait for a buffer if needed\r
+       fb = 0;\r
+       while (fb == 0)\r
+       {\r
+               idx = ENETMAC->txproduceindex;\r
+               cidx = ENETMAC->txconsumeindex;\r
+\r
+               if (idx == cidx)\r
+               {\r
+                       // Producer and consumer are the same, all buffers are free\r
+                       fb = ENET_MAX_TX_PACKETS;\r
+               }\r
+               else if (cidx > idx)\r
+               {\r
+                       fb = (ENET_MAX_TX_PACKETS - 1) -\r
+                               ((idx + ENET_MAX_TX_PACKETS) - cidx);\r
+               }\r
+               else\r
+               {\r
+                       fb = (ENET_MAX_TX_PACKETS - 1) - (cidx - idx);\r
+               }\r
+       }\r
+\r
+       // Update descriptor with new frame size\r
+       pTXDesc[idx].control = (length | 0x40000000);\r
+\r
+       // Move data to buffer\r
+       memcpy((void *) pTXVBuffs [idx], (void *)packet, length);\r
+\r
+       // Get next index for transmit data DMA buffer and descriptor\r
+       idx++;\r
+       if (idx >= ENET_MAX_TX_PACKETS)\r
+       {\r
+               idx = 0;\r
+       }\r
+       ENETMAC->txproduceindex = idx;\r
+\r
+       return 0;
+}
+
diff --git a/board/nxp/ea3250/u-boot.lds b/board/nxp/ea3250/u-boot.lds
new file mode 100644 (file)
index 0000000..381da60
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x83FA0000;
+
+       . = ALIGN(4);
+       .text      :
+       {
+         arch/arm/cpu/arm926ejs/start.o        (.text)
+         *(.text)
+       }
+
+       . = ALIGN(4);
+       .rodata : { *(.rodata) }
+       .ARM.extab      : { *(.ARM.extab* .gnu.linkonce.armextab.*) }
+       __exidx_start = .;
+       .ARM.exidx      : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
+       __exidx_end = .;
+
+       . = ALIGN(4);
+       .data : { *(.data) }
+
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       . = .;
+       __u_boot_cmd_start = .;
+       .u_boot_cmd : { *(.u_boot_cmd) }
+       __u_boot_cmd_end = .;
+
+       . = ALIGN(4);
+       __bss_start = .;
+       .bss (NOLOAD) : { *(.bss) }
+       _end = .;
+}
diff --git a/board/nxp/fdi3250/Makefile b/board/nxp/fdi3250/Makefile
new file mode 100644 (file)
index 0000000..90cfb7e
--- /dev/null
@@ -0,0 +1,52 @@
+#
+# Copyright (C) 2010 by NXP Semiconductors
+# All rights reserved.
+#
+# 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    = $(obj)lib$(BOARD).a
+
+COBJS  := fdi3250.o net.o
+COBJS  += lowlevelsys_init.o
+SOBJS  := lowlevel_init.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/nxp/fdi3250/config.mk b/board/nxp/fdi3250/config.mk
new file mode 100644 (file)
index 0000000..19ae57d
--- /dev/null
@@ -0,0 +1,37 @@
+#
+# 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
+#
+
+# Embedded Artists LPC3250 OEM Board with or without S1L
+#
+
+#
+# 32 MB SDRAM @ 0x80000000
+#
+# Linux-Kernel is @ 0x80008000, entry 0x80008000
+# params @ 0x80000100
+# optionally with a ramdisk at 0x80300000
+#
+# we load ourself to 0x00000000 or 0x83FC0000
+#
+# download area is 0x80f00000
+#
+
+CONFIG_SYS_TEXT_BASE = 0x81F80000
+
diff --git a/board/nxp/fdi3250/fdi3250.c b/board/nxp/fdi3250/fdi3250.c
new file mode 100644 (file)
index 0000000..7f5ee10
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2010 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <configs/fdi3250.h>
+#include <asm/mach-types.h>
+#include <lpc3250.h>
+#include <net.h>
+#include "fdi3250_prv.h"
+               
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * Dummy function to handle errors for EABI incompatibility
+ */
+void raise(void)
+{
+}
+
+/*
+ * Dummy function to handle errors for EABI incompatibility
+ */
+void abort(void)
+{
+}
+
+void reset_timer (void)
+{
+       unsigned int clkdlycnt, tbaseclk;
+
+       /* Reset timer */
+       TIMER_CNTR0->tcr = TIMER_CNTR_TCR_RESET;
+       TIMER_CNTR0->tcr = 0;
+       TIMER_CNTR0->tc = 0;
+
+       /* Clear and enable match function */
+       TIMER_CNTR0->ir = TIMER_CNTR_MTCH_BIT(0);
+
+       /* Count mode is PCLK edge */
+       TIMER_CNTR0->ctcr = TIMER_CNTR_SET_MODE(TIMER_CNTR_CTCR_TIMER_MODE);
+
+       /* Set prescale counter value for a 1mS tick */
+       tbaseclk = sys_get_rate(CLKPWR_PERIPH_CLK);
+       clkdlycnt = (tbaseclk / CONFIG_SYS_HZ);
+       TIMER_CNTR0->pr = clkdlycnt - 1;
+
+       /* Enable the timer */
+       TIMER_CNTR0->tcr = TIMER_CNTR_TCR_EN;
+}
+
+ulong get_timer (ulong base)
+{
+       ulong tcr = TIMER_CNTR0->tc;
+       return tcr - base;
+}
+
+void timer_init(void)
+{
+       /* Enable timer system clock */
+       CLKPWR->clkpwr_timers_pwms_clk_ctrl_1 |=
+               CLKPWR_TMRPWMCLK_TIMER0_EN;
+
+       reset_timer();
+}
+
+void udelay(unsigned long usec)
+{
+       unsigned long tbaseclk;
+
+       /* Enable timer system clock */
+       CLKPWR->clkpwr_timers_pwms_clk_ctrl_1 |=
+               CLKPWR_TMRPWMCLK_TIMER1_EN;
+
+       /* Reset timer */
+       TIMER_CNTR1->tcr = TIMER_CNTR_TCR_RESET;
+       TIMER_CNTR1->tcr = 0;
+       TIMER_CNTR1->tc = 0;
+       TIMER_CNTR1->pr = 0;
+
+       /* Clear and enable match function */
+       TIMER_CNTR1->ir = TIMER_CNTR_MTCH_BIT(0);
+
+       /* Count mode is PCLK edge */
+       TIMER_CNTR1->ctcr = TIMER_CNTR_SET_MODE(TIMER_CNTR_CTCR_TIMER_MODE);
+
+       /* Set prescale counter value for a 1uS tick */
+       tbaseclk = sys_get_rate(CLKPWR_PERIPH_CLK);
+       tbaseclk = (tbaseclk / 1000000) - 1;
+       TIMER_CNTR1->pr = tbaseclk;
+
+       /* Set match for number of usecs */
+       TIMER_CNTR1->mr[0] = usec;
+
+       /* Interrupt on match 0 */
+       TIMER_CNTR1->mcr = TIMER_CNTR_MCR_MTCH(0);
+
+       /* Enable the timer */
+       TIMER_CNTR1->tcr = TIMER_CNTR_TCR_EN;
+
+       /* Loop until match occurs */
+       while ((TIMER_CNTR1->ir & TIMER_CNTR_MTCH_BIT(0)) == 0);
+
+       /* Stop timer */
+       TIMER_CNTR1->tcr = 0;
+
+       /* Disable timer system clock */
+       CLKPWR->clkpwr_timers_pwms_clk_ctrl_1 &=
+               ~CLKPWR_TMRPWMCLK_TIMER1_EN;
+}
+
+/*
+ * Miscellaneous platform dependent initialisations
+ */
+int board_init (void)
+{
+       /* arch number of Logic-Board - MACH_TYPE_LPC3XXX */
+       gd->bd->bi_arch_number = MACH_TYPE_UBOOTSYS;
+
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = CONFIG_ENV_ADDR;
+
+       return 0;
+}
+
+int dram_init (void)
+{
+       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+
+       /* 32M, change this for 64M boards */
+       gd->bd->bi_dram[0].size = 0x02000000; /* 32M */
+
+       return 0;
+}
+
diff --git a/board/nxp/fdi3250/fdi3250_prv.h b/board/nxp/fdi3250/fdi3250_prv.h
new file mode 100644 (file)
index 0000000..f2d09c9
--- /dev/null
@@ -0,0 +1,38 @@
+/***********************************************************************
+ * $Id::$
+ *
+ * Project: Embedded Artists LPC3250 OEM Board definitions
+ *
+ * Description:
+ *     This file contains board specific information such as the
+ *     chip select wait states, and other board specific information.
+ *
+ ***********************************************************************
+ * Software that is described herein is for illustrative purposes only
+ * which provides customers with programming information regarding the
+ * products. This software is supplied "AS IS" without any warranties.
+ * NXP Semiconductors assumes no responsibility or liability for the
+ * use of the software, conveys no license or title under any patent,
+ * copyright, or mask work right to the product. NXP Semiconductors
+ * reserves the right to make changes in the software without
+ * notification. NXP Semiconductors also make no representation or
+ * warranty that such application will be suitable for the specified
+ * use without further testing or modification.
+ **********************************************************************/
+
+#ifndef FDI3250_PRV_H
+#define FDI3250_PRV_H
+
+
+// Enable the following define to setup for RMII mode
+#define USE_PHY_RMII
+
+// PHY address (configured via PHY ADRx pins)
+#define PHYDEF_PHYADDR           0x0001
+
+// Maximum ethernet frame size, maximum RX and TX packets
+#define ENET_MAXF_SIZE             1536
+#define ENET_MAX_TX_PACKETS        16
+#define ENET_MAX_RX_PACKETS        16
+
+#endif /* FDI3250_PRV_H */
diff --git a/board/nxp/fdi3250/lowlevel_init.S b/board/nxp/fdi3250/lowlevel_init.S
new file mode 100644 (file)
index 0000000..04757aa
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2010 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * 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>
+
+#define IRAM_STK_TEMP 0x0003C000
+.globl arm9dimm3250_sys_init
+.globl dcache_kill
+
+.globl lowlevel_init
+lowlevel_init:
+       /*
+        * Setup basic stack and save return address
+        */
+       ldr     sp, =IRAM_STK_TEMP
+       stmia   sp, {lr}
+
+       /*
+        * Initialize ARM9DIMM3250 board
+        */
+       bl      arm9dimm3250_sys_init
+
+       ldmia   sp, {r0}
+       mov     pc, r0
+
diff --git a/board/nxp/fdi3250/lowlevelsys_init.c b/board/nxp/fdi3250/lowlevelsys_init.c
new file mode 100644 (file)
index 0000000..8ae8fb3
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2010 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <configs/fdi3250.h>
+#include <asm/mach-types.h>
+#include <lpc3250.h>
+#include <net.h>
+#include "fdi3250_prv.h"
+
+/*
+ * Miscellaneous platform dependent initializations
+ */
+void arm9dimm3250_sys_init(void)
+{
+}
+
diff --git a/board/nxp/fdi3250/net.c b/board/nxp/fdi3250/net.c
new file mode 100644 (file)
index 0000000..55215e2
--- /dev/null
@@ -0,0 +1,549 @@
+/*
+ * Copyright (C) 2010 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <common.h>
+#include <command.h>
+#include <net.h>
+#include <lpc3250.h>
+#include <configs/fdi3250.h>
+#include "fdi3250_prv.h"
+#include "miiphy.h"
+
+static unsigned long g_dmabase;
+static unsigned long gdma_size;
+static TXRX_DESC_T *pTXDesc;
+static unsigned long *pTXStatus;
+static unsigned long pTXVBuffs [ENET_MAX_TX_PACKETS];
+static TXRX_DESC_T *pRXDesc;
+static RX_STATUS_T *pRXStatus;
+static unsigned long pRXVBuffs [ENET_MAX_RX_PACKETS];
+#ifndef USE_IRAM_FOR_ETH_BUFFERS
+static unsigned long ethbuffs[4096];
+#endif
+
+#define DP83848_PHY_STATUS     0x10
+
+static void msDelay(unsigned long ms)
+{
+       udelay(ms * 1000);
+}
+
+//------------------------------------------------------------------------------
+static int RMII_Write (unsigned long PhyReg, unsigned long Value)
+{
+       unsigned long mst = 250;
+       int sts = 0;
+
+       // Write value at PHY address and register
+       ENETMAC->madr = (PHYDEF_PHYADDR << 8) | PhyReg;
+       ENETMAC->mwtd = Value;
+
+       // Wait for unbusy status
+       while (mst > 0)
+       {
+               if ((ENETMAC->mind & MIND_BUSY) == 0)
+               {
+                       mst = 0;
+                       sts = 1;
+               }
+               else
+               {
+                       mst--;
+                       msDelay(1);
+               }
+       }
+
+       return sts;
+}
+
+//------------------------------------------------------------------------------
+int RMII_Read(unsigned long PhyReg, unsigned long *data) 
+{
+       unsigned long mst = 250;
+       int sts = 0;
+
+       // Read value at PHY address and register
+       ENETMAC->madr = (PHYDEF_PHYADDR << 8) | PhyReg;
+       ENETMAC->mcmd = MCMD_READ;
+
+       // Wait for unbusy status
+       while (mst > 0)
+       {
+               if ((ENETMAC->mind & MIND_BUSY) == 0)
+               {
+                       mst = 0;
+                       *data = ENETMAC->mrdd;
+                       sts = 1;
+               }
+               else
+               {
+                       mst--;
+                       msDelay(1);
+               }
+       }
+
+       ENETMAC->mcmd = 0;
+
+       return sts;
+}
+
+//------------------------------------------------------------------------------
+int HYPHYReset(void)
+{
+       int goodacc;
+       unsigned long tmp1, mst;
+
+       // Reset the PHY and wait for reset to complete
+       goodacc = RMII_Write(PHY_BMCR, PHY_BMCR_RESET);
+       if (goodacc == 0)
+       {
+               return 0;
+       }
+       mst = 400;
+       goodacc = 0;
+       while (mst > 0)
+       {
+               RMII_Read(PHY_BMCR, &tmp1);
+               if ((tmp1 & PHY_BMCR_RESET) == 0)
+               {
+                       mst = 0;
+                       goodacc = 1;
+               }
+               else
+               {
+                       mst--;
+                       msDelay(1);
+               }
+       }
+
+       return goodacc;
+}
+
+static int phy_get_link_status (void)
+{
+        unsigned long status;
+
+        /* Status is read once to clear old link state */
+        RMII_Read(PHY_BMSR,&status);
+
+        /*
+        * Wait if the link is up, and autonegotiation is in progress
+        * (ie - we're capable and it's not done)
+        */
+        status = 0;
+        RMII_Read(PHY_BMSR,&status);
+        if ((status & PHY_BMSR_LS) && (status & PHY_BMSR_AUTN_ABLE)
+            && !(status & PHY_BMSR_AUTN_COMP)) {
+                int i = 0;
+
+                while (!(status & PHY_BMSR_AUTN_COMP)) {
+                        /* Timeout reached */
+                        if (i > 1000) {
+                                printf("Timeout\n");
+                                return 1;
+                        }
+                        i++;
+                        msDelay(1);   /* 1 ms */
+                        RMII_Read(PHY_BMSR,&status);
+                }
+                return 0;
+        } else {
+                if (status & PHY_BMSR_LS)
+                        return 0;
+                else
+                        return 1;
+        }
+        return 1;
+}
+
+//------------------------------------------------------------------------------
+int txrx_setup(void)
+{
+       int idx;
+       unsigned long *pTXStatusL, pbase1, pbase2, pbase3;
+       TXRX_DESC_T *pTXRXDesc;
+       RX_STATUS_T *pRXStatusL;
+
+       // Get physical address and size of DMA buffers
+#ifdef USE_IRAM_FOR_ETH_BUFFERS
+       g_dmabase = (unsigned long) IRAM_ETH_BUFF_BASE;
+       gdma_size = IRAM_ETH_BUFF_SIZE;
+#else
+       g_dmabase = (unsigned long) &ethbuffs;
+       gdma_size = sizeof(ethbuffs);
+#endif
+
+       // Setup base pointers
+       pbase1 = g_dmabase;     // Start of descriptors
+       pbase2 = pbase1 + 256;  // Start of statuses
+       pbase3 = pbase1 + 1024; // Start of buffers
+
+       // Setup pointers to TX structures
+       ENETMAC->txdescriptor =  pbase1;
+       ENETMAC->txstatus = pbase2;
+       ENETMAC->txdescriptornumber = (ENET_MAX_TX_PACKETS - 1);
+
+       // Save base address of TX descriptor table and TX status
+       pTXRXDesc = (TXRX_DESC_T *) pbase1;
+       pTXStatusL = (unsigned long *) pbase2;
+       pTXDesc = pTXRXDesc;
+       pTXStatus = pTXStatusL;
+
+       // Build TX descriptors
+       for (idx = 0; idx < ENET_MAX_TX_PACKETS; idx++)
+       {
+               pTXRXDesc->packet = pbase3;
+               pTXRXDesc->control = 0;
+               *pTXStatusL = 0;
+
+               // Save virtual address of buffer
+#ifdef USE_IRAM_FOR_ETH_BUFFERS
+               pTXVBuffs [idx] = (unsigned long) pbase3;
+#else
+#pragma error "NOT supported"
+#endif
+
+               // Next descriptor and status
+               pTXRXDesc++;
+               pTXStatusL++;
+               pbase1 += sizeof (TXRX_DESC_T);
+               pbase2 += sizeof (unsigned long);
+               pbase3 += ENET_MAXF_SIZE;
+       }
+
+       // Setup pointers to RX structures
+       ENETMAC->rxdescriptor = pbase1;
+       ENETMAC->rxstatus = pbase2;
+       ENETMAC->rxdescriptornumber = (ENET_MAX_RX_PACKETS - 1);
+
+       // Save base address of RX descriptor table and RX status
+       pRXDesc = pTXRXDesc;
+       pRXStatus = pRXStatusL = (RX_STATUS_T *) pTXStatusL;
+
+       // Build RX descriptors
+       for (idx = 0; idx < ENET_MAX_TX_PACKETS; idx++)
+       {
+               pTXRXDesc->packet = pbase3;
+               pTXRXDesc->control = 0x80000000 | (ENET_MAXF_SIZE - 1);
+               pRXStatusL->statusinfo = 0;
+               pRXStatusL->statushashcrc = 0;
+
+               // Save virtual address of buffer
+#ifdef USE_IRAM_FOR_ETH_BUFFERS
+               pRXVBuffs [idx] = (unsigned long) pbase3;
+#else
+#pragma error "NOT supported"
+#endif
+
+               // Next descriptor and status
+               pTXRXDesc++;
+               pRXStatusL++;
+               pbase1 += sizeof (TXRX_DESC_T);
+               pbase2 += sizeof (unsigned long);
+               pbase3 += ENET_MAXF_SIZE;
+       }
+
+    return 1;
+}
+
+//------------------------------------------------------------------------------
+int HWInit(bd_t * bd)
+{
+       int btemp;
+       unsigned int duplex, speed;
+       unsigned long tmp1, mst = 250;
+
+       // Enable MAC interface
+       CLKPWR->clkpwr_macclk_ctrl = (CLKPWR_MACCTRL_HRCCLK_EN |
+               CLKPWR_MACCTRL_MMIOCLK_EN | CLKPWR_MACCTRL_DMACLK_EN |
+#ifdef USE_PHY_RMII
+               CLKPWR_MACCTRL_USE_RMII_PINS);
+#else
+               CLKPWR_MACCTRL_USE_MII_PINS);
+#endif
+
+       // Set RMII management clock rate. This clock should be slower
+       // than 12.5MHz (for NXP PHYs only). For a divider of 28, the
+       // clock rate when HCLK is 150MHz will be 5.4MHz
+       ENETMAC->mcfg = MCFG_CLOCK_SELECT(MCFG_CLOCK_HOST_DIV_28);
+
+       // Reset all MAC logic
+       ENETMAC->mac1 = (MAC1_SOFT_RESET | MAC1_SIMULATION_RESET |
+               MAC1_RESET_MCS_TX | MAC1_RESET_TX | MAC1_RESET_MCS_RX |
+               MAC1_RESET_RX);
+       ENETMAC->command = (COMMAND_REG_RESET | COMMAND_TXRESET |
+               COMMAND_RXRESET);
+       msDelay(10);
+
+       // Initial MAC initialization
+       ENETMAC->mac1 = MAC1_PASS_ALL_RX_FRAMES;
+       ENETMAC->mac2 = (MAC2_PAD_CRC_ENABLE | MAC2_CRC_ENABLE);
+       ENETMAC->maxf = ENET_MAXF_SIZE;
+
+       // Maximum number of retries, 0x37 collision window, gap */
+       ENETMAC->clrt = (CLRT_LOAD_RETRY_MAX(0xF) |
+               CLRT_LOAD_COLLISION_WINDOW(0x37));
+       ENETMAC->ipgr = IPGR_LOAD_PART2(0x12);
+
+#ifdef USE_PHY_RMII
+       // RMII setup
+       ENETMAC->command = (COMMAND_RMII | COMMAND_PASSRUNTFRAME);
+       ENETMAC->supp = SUPP_RESET_RMII;
+       msDelay(10);
+#else
+       // MII setup
+       ENETMAC->command = COMMAND_PASSRUNTFRAME;
+#endif
+       // Enable rate auto-negotiation for the link
+       if (RMII_Write(PHY_BMCR,
+               (PHY_BMCR_100MB | PHY_BMCR_AUTON)) == 0)
+       {
+               return 0;
+       }
+        
+       mst = 1000;
+        btemp = 1;
+        while(mst > 0)
+        {
+                /* Wait for Link status to set UP or Timeout */
+                if(phy_get_link_status() == 0) {
+                        mst = 0;
+                        btemp = 0;
+                        printf("ENET:auto-negotiation complete#$\n");
+                }
+                else {
+                        mst--;
+                        msDelay(1);
+                }
+        }
+        if(btemp) {
+                printf("ENET:auto-negotiation failed#$\n");
+                return 0;
+        }
+
+        /* Read PHY Status Register to determine Ethernet Configuration */
+        tmp1 = 0;
+        RMII_Read (DP83848_PHY_STATUS,&tmp1);
+        duplex = (tmp1 & 0x0004) >> 2;
+        speed = (tmp1 & 0x0002) >> 1;
+
+       // Configure Full/Half Duplex mode
+       if (duplex == 1)
+       {
+               // 10MBase full duplex is supported
+               ENETMAC->mac2 |= MAC2_FULL_DUPLEX;
+               ENETMAC->command |= COMMAND_FULLDUPLEX;
+               ENETMAC->ipgt = IPGT_LOAD(0x15);
+               printf("ENET:FULL DUPLEX\n");
+       }
+       else
+       {
+               ENETMAC->ipgt = IPGT_LOAD(0x12);
+               printf("ENET:HALF DUPLEX\n");
+       }
+
+       // Configure 100MBit/10MBit mode
+       if (speed == 0)
+       {
+               // 100MBase mode
+               ENETMAC->supp = SUPP_SPEED;
+               printf("ENET:100MBase\n");
+       }
+       else
+       {
+               // 10MBase mode
+               ENETMAC->supp = 0;
+               printf("ENET:10Base\n");
+       }
+
+       // Save station address
+       ENETMAC->sa [2] = (unsigned long) (bd->bi_enetaddr[0] | (bd->bi_enetaddr[1] << 8));
+       ENETMAC->sa [1] = (unsigned long) (bd->bi_enetaddr[2] | (bd->bi_enetaddr[3] << 8));
+       ENETMAC->sa [0] = (unsigned long) (bd->bi_enetaddr[4] | (bd->bi_enetaddr[5] << 8));
+
+       // Setup TX and RX descriptors
+       txrx_setup();
+
+       // Enable broadcast and matching address packets
+       ENETMAC->rxfliterctrl = (RXFLTRW_ACCEPTUBROADCAST |
+               RXFLTRW_ACCEPTPERFECT);
+
+       // Clear and enable interrupts
+       ENETMAC->intclear = 0xFFFF;
+       ENETMAC->intenable = 0;
+
+       // Enable receive and transmit mode of MAC ethernet core
+       ENETMAC->command |= (COMMAND_RXENABLE | COMMAND_TXENABLE);
+       ENETMAC->mac1 |= MAC1_RECV_ENABLE;
+
+       // Perform a 'dummy' send of the first ethernet frame with a size of 0
+       // to 'prime' the MAC. The first packet after a reset seems to wait
+       // until at least 2 packets are ready to go.
+       tmp1 = 0;
+       eth_send(&tmp1, 4);
+
+       return 1;
+}
+
+//------------------------------------------------------------------------------
+int HWDeInit(void)
+{
+       // Reset PHY
+       (void) HYPHYReset();
+
+       // Reset all MAC logic
+       ENETMAC->mac1 = (MAC1_SOFT_RESET | MAC1_SIMULATION_RESET |
+               MAC1_RESET_MCS_TX | MAC1_RESET_TX | MAC1_RESET_MCS_RX |
+               MAC1_RESET_RX);
+       ENETMAC->command = (COMMAND_REG_RESET | COMMAND_TXRESET |
+               COMMAND_RXRESET);
+       msDelay(2);
+
+       // Disable MAC clocks, but keep MAC interface active
+#ifdef USE_PHY_RMII
+       CLKPWR->clkpwr_macclk_ctrl = CLKPWR_MACCTRL_USE_RMII_PINS;
+#else
+       CLKPWR->clkpwr_macclk_ctrl = CLKPWR_MACCTRL_USE_MII_PINS;
+#endif
+
+       return 1;
+}
+
+void eth_halt (void)
+{
+       HWDeInit();
+}
+
+int eth_init (bd_t * bd)
+{
+       int rc;
+
+       char *s, *e;
+       int i;
+
+       s = getenv ("ethaddr");
+       for (i = 0; i < 6; ++i) {
+               bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;
+               if (s)
+                       s = (*e) ? e + 1 : e;
+       }
+
+
+       printf ("\tHW MAC address:  "
+               "%02X:%02X:%02X:%02X:%02X:%02X\n",
+               bd->bi_enetaddr[0], bd->bi_enetaddr[1],
+               bd->bi_enetaddr[2], bd->bi_enetaddr[3],
+               bd->bi_enetaddr[4], bd->bi_enetaddr[5] );
+
+       rc = HWInit(bd);
+
+       // De-init if an error occurred
+       if (rc == 0)
+       {
+               printf ("ENET init failure\n");
+               HWDeInit();
+               return -1;
+       }
+
+       return 0;
+}
+
+/* Get a data block via Ethernet */
+int eth_rx (void)
+{
+       unsigned long idx, length;
+
+       // Determine if a frame has been received
+       length = 0;
+       idx = ENETMAC->rxconsumeindex;
+       if (ENETMAC->rxproduceindex != idx)
+       {
+               // Clear interrupt
+               ENETMAC->intclear = MACINT_RXDONEINTEN;
+
+               // Frame received, get size of RX packet
+               length = (pRXStatus[idx].statusinfo & 0x7FF);
+
+               /* Pass the packet up to the protocol layer */
+               if (length > 0)
+               {
+                       memcpy((void *) NetRxPackets[0], (void *) pRXVBuffs [idx], length);
+                       NetReceive (NetRxPackets[0], (unsigned short) length);
+               }
+
+               // Return DMA buffer
+               idx++;
+               if (idx >= ENET_MAX_TX_PACKETS)
+               {
+                       idx = 0;
+               }
+               ENETMAC->rxconsumeindex = (unsigned long) idx;
+       }
+
+       return (int) length;
+}
+
+/* Send a data block via Ethernet. */
+int eth_send (volatile void *packet, int length)
+{
+       unsigned long idx, cidx, fb;
+
+       // Determine number of free buffers and wait for a buffer if needed
+       fb = 0;
+       while (fb == 0)
+       {
+               idx = ENETMAC->txproduceindex;
+               cidx = ENETMAC->txconsumeindex;
+
+               if (idx == cidx)
+               {
+                       // Producer and consumer are the same, all buffers are free
+                       fb = ENET_MAX_TX_PACKETS;
+               }
+               else if (cidx > idx)
+               {
+                       fb = (ENET_MAX_TX_PACKETS - 1) -
+                               ((idx + ENET_MAX_TX_PACKETS) - cidx);
+               }
+               else
+               {
+                       fb = (ENET_MAX_TX_PACKETS - 1) - (cidx - idx);
+               }
+       }
+
+       // Update descriptor with new frame size
+       pTXDesc[idx].control = (length | 0x40000000);
+
+       // Move data to buffer
+       memcpy((void *) pTXVBuffs [idx], (void *)packet, length);
+
+       // Get next index for transmit data DMA buffer and descriptor
+       idx++;
+       if (idx >= ENET_MAX_TX_PACKETS)
+       {
+               idx = 0;
+       }
+       ENETMAC->txproduceindex = idx;
+
+       return 0;
+}
+
diff --git a/board/nxp/fdi3250/u-boot.lds b/board/nxp/fdi3250/u-boot.lds
new file mode 100644 (file)
index 0000000..3cdd26e
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x81F80000;
+
+       . = ALIGN(4);
+       .text      :
+       {
+         arch/arm/cpu/arm926ejs/start.o        (.text)
+         *(.text)
+       }
+
+       . = ALIGN(4);
+       .rodata : { *(.rodata) }
+       .ARM.extab      : { *(.ARM.extab* .gnu.linkonce.armextab.*) }
+       __exidx_start = .;
+       .ARM.exidx      : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
+       __exidx_end = .;
+
+       . = ALIGN(4);
+       .data : { *(.data) }
+
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       . = .;
+       __u_boot_cmd_start = .;
+       .u_boot_cmd : { *(.u_boot_cmd) }
+       __u_boot_cmd_end = .;
+
+       . = ALIGN(4);
+       __bss_start = .;
+       .bss (NOLOAD) : { *(.bss) }
+       _end = .;
+}
diff --git a/board/nxp/phy3250/#Makefile# b/board/nxp/phy3250/#Makefile#
new file mode 100644 (file)
index 0000000..b368b0a
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# Copyright (C) 2008 by NXP Semiconductors
+# All rights reserved.
+#
+# 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    = $(obj)lib$(BOARD).a
+
+COBJS  := phy3250.o net.o
+COBJS  += lowlevelsys_init.o
+SOBJS  := lowlevel_init.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(call cmd_link_o_target, $(OBJS) $(SOBJS))
+
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/nxp/phy3250/#config.mk# b/board/nxp/phy3250/#config.mk#
new file mode 100644 (file)
index 0000000..2268c77
--- /dev/null
@@ -0,0 +1,37 @@
+#
+# 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
+#
+
+# Phytec 3250 board with or without S1L
+#
+
+#
+# 64 or 128 MB SDRAM @ 0x80000000
+#
+# Linux-Kernel is @ 0x80008000, entry 0x80008000
+# params @ 0x80000100
+# optionally with a ramdisk at 0x80300000
+#
+# we load ourself to 0x00000000 or 0x83FC0000
+#
+# download area is 0x80f00000
+#
+
+CONFIG_SYS_TEXT_BASE = 0x83F80000
+
diff --git a/board/nxp/phy3250/Makefile b/board/nxp/phy3250/Makefile
new file mode 100644 (file)
index 0000000..afdd0ea
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# Copyright (C) 2008 by NXP Semiconductors
+# All rights reserved.
+#
+# 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    = $(obj)lib$(BOARD).o
+
+COBJS  := phy3250.o net.o
+COBJS  += lowlevelsys_init.o
+SOBJS  := lowlevel_init.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(call cmd_link_o_target, $(OBJS) $(SOBJS))
+
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/nxp/phy3250/config.mk b/board/nxp/phy3250/config.mk
new file mode 100644 (file)
index 0000000..2268c77
--- /dev/null
@@ -0,0 +1,37 @@
+#
+# 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
+#
+
+# Phytec 3250 board with or without S1L
+#
+
+#
+# 64 or 128 MB SDRAM @ 0x80000000
+#
+# Linux-Kernel is @ 0x80008000, entry 0x80008000
+# params @ 0x80000100
+# optionally with a ramdisk at 0x80300000
+#
+# we load ourself to 0x00000000 or 0x83FC0000
+#
+# download area is 0x80f00000
+#
+
+CONFIG_SYS_TEXT_BASE = 0x83F80000
+
diff --git a/board/nxp/phy3250/lowlevel_init.S b/board/nxp/phy3250/lowlevel_init.S
new file mode 100644 (file)
index 0000000..4f8ba26
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: Phytec 3250 board low level init code
+ *
+ * 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>
+
+#define IRAM_STK_TEMP 0x0003C000
+.globl phy3250_sys_init
+.globl dcache_kill
+
+.globl lowlevel_init
+lowlevel_init:
+       /*
+        * Setup basic stack and save return address
+        */
+       ldr     sp, =IRAM_STK_TEMP
+       stmia   sp, {lr}
+
+       /*
+        * Initialize Phytec 3250 board
+        */
+       bl      phy3250_sys_init
+
+       ldmia   sp, {r0}
+       mov     pc, r0
+
diff --git a/board/nxp/phy3250/lowlevelsys_init.c b/board/nxp/phy3250/lowlevelsys_init.c
new file mode 100644 (file)
index 0000000..0564f6e
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: Phytec 3250 board support functions
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <configs/phy3250.h>
+#include <asm/mach-types.h>
+#include <lpc3250.h>
+#include <net.h>
+
+/*
+ * Miscellaneous platform dependent initializations
+ */
+void phy3250_sys_init(void)
+{
+}
+
diff --git a/board/nxp/phy3250/net.c b/board/nxp/phy3250/net.c
new file mode 100644 (file)
index 0000000..17e50b0
--- /dev/null
@@ -0,0 +1,547 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: Phytec 3250 net interface support functions
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <common.h>
+#include <command.h>
+#include <net.h>
+#include <lpc3250.h>
+#include <configs/phy3250.h>
+#include "phy3250_prv.h"
+#include "miiphy.h"
+
+static unsigned long g_dmabase;\r
+static unsigned long gdma_size;\r
+static TXRX_DESC_T *pTXDesc;\r
+static unsigned long *pTXStatus;\r
+static unsigned long pTXVBuffs [ENET_MAX_TX_PACKETS];\r
+static TXRX_DESC_T *pRXDesc;\r
+static RX_STATUS_T *pRXStatus;\r
+static unsigned long pRXVBuffs [ENET_MAX_RX_PACKETS];
+#ifndef USE_IRAM_FOR_ETH_BUFFERS
+static unsigned long ethbuffs[4096];\r
+#endif
+extern PHY_HW_T phyhwdesc;\r
+\r
+static void msDelay(unsigned long ms)\r
+{\r
+       udelay(ms * 1000);
+}\r
+\r
+//------------------------------------------------------------------------------\r
+static int RMII_Write (unsigned long PhyReg, unsigned long Value)\r
+{\r
+       unsigned long mst = 250;\r
+       int sts = 0;\r
+\r
+       // Write value at PHY address and register\r
+       ENETMAC->madr = (PHYDEF_PHYADDR << 8) | PhyReg;\r
+       ENETMAC->mwtd = Value;\r
+\r
+       // Wait for unbusy status\r
+       while (mst > 0)\r
+       {\r
+               if ((ENETMAC->mind & MIND_BUSY) == 0)\r
+               {\r
+                       mst = 0;\r
+                       sts = 1;\r
+               }\r
+               else\r
+               {\r
+                       mst--;\r
+                       msDelay(1);\r
+               }\r
+       }\r
+\r
+       return sts;\r
+}\r
+\r
+//------------------------------------------------------------------------------\r
+static int RMII_Read(unsigned long PhyReg, unsigned long *data) \r
+{\r
+       unsigned long mst = 250;\r
+       int sts = 0;\r
+\r
+       // Read value at PHY address and register\r
+       ENETMAC->madr = (PHYDEF_PHYADDR << 8) | PhyReg;\r
+       ENETMAC->mcmd = MCMD_READ;\r
+\r
+       // Wait for unbusy status\r
+       while (mst > 0)\r
+       {\r
+               if ((ENETMAC->mind & MIND_BUSY) == 0)\r
+               {\r
+                       mst = 0;\r
+                       *data = ENETMAC->mrdd;\r
+                       sts = 1;\r
+               }\r
+               else\r
+               {\r
+                       mst--;\r
+                       msDelay(1);\r
+               }\r
+       }\r
+\r
+       ENETMAC->mcmd = 0;\r
+\r
+       return sts;\r
+}\r
+
+static int phy_get_link_status (void)
+{
+       unsigned long status;
+
+       /* Status is read once to clear old link state */
+       RMII_Read(MII_BMSR,&status);
+
+       /*
+        * Wait if the link is up, and autonegotiation is in progress
+        * (ie - we're capable and it's not done)
+        */
+       status = 0;
+       RMII_Read(MII_BMSR,&status);
+       if ((status & BMSR_LSTATUS) && (status & BMSR_ANEGCAPABLE)
+                       && !(status & BMSR_ANEGCOMPLETE)) {
+               int i = 0;
+
+               while (!(status & BMSR_ANEGCOMPLETE)) {
+                       /*
+                        * Timeout reached ?
+                        */
+                       if (i > 1000) {
+                               /* Time Out Occur */
+                               printf("Timeout\n");
+                               return 1;
+                       }
+                       i++;
+                       msDelay(1);   /* 1 ms */
+                       RMII_Read(MII_BMSR,&status);
+               }
+               return 0;
+       } else {
+               if (status & BMSR_LSTATUS)
+                       return 0;
+               else
+                       return 1;
+       }
+       return 1;
+}
+
+//------------------------------------------------------------------------------\r
+static int txrx_setup(void)\r
+{\r
+       int idx;\r
+       unsigned long *pTXStatusL, pbase1, pbase2, pbase3;\r
+       TXRX_DESC_T *pTXRXDesc;\r
+       RX_STATUS_T *pRXStatusL;\r
+\r
+       // Get physical address and size of DMA buffers
+#ifdef USE_IRAM_FOR_ETH_BUFFERS
+       g_dmabase = (unsigned long) IRAM_ETH_BUFF_BASE;
+       gdma_size = IRAM_ETH_BUFF_SIZE;
+#else
+       g_dmabase = (unsigned long) &ethbuffs;
+       gdma_size = sizeof(ethbuffs);
+#endif
+\r
+       // Setup base pointers\r
+       pbase1 = g_dmabase;     // Start of descriptors\r
+       pbase2 = pbase1 + 256;  // Start of statuses\r
+       pbase3 = pbase1 + 1024; // Start of buffers\r
+\r
+       // Setup pointers to TX structures\r
+       ENETMAC->txdescriptor =  pbase1;\r
+       ENETMAC->txstatus = pbase2;\r
+       ENETMAC->txdescriptornumber = (ENET_MAX_TX_PACKETS - 1);\r
+\r
+       // Save base address of TX descriptor table and TX status\r
+       pTXRXDesc = (TXRX_DESC_T *) pbase1;\r
+       pTXStatusL = (unsigned long *) pbase2;\r
+       pTXDesc = pTXRXDesc;\r
+       pTXStatus = pTXStatusL;\r
+\r
+       // Build TX descriptors\r
+       for (idx = 0; idx < ENET_MAX_TX_PACKETS; idx++)\r
+       {\r
+               pTXRXDesc->packet = pbase3;\r
+               pTXRXDesc->control = 0;\r
+               *pTXStatusL = 0;\r
+\r
+               // Save virtual address of buffer\r
+#ifdef USE_IRAM_FOR_ETH_BUFFERS
+               pTXVBuffs [idx] = (unsigned long) pbase3;\r
+#else
+#pragma error "NOT supported"
+#endif
+\r
+               // Next descriptor and status\r
+               pTXRXDesc++;\r
+               pTXStatusL++;\r
+               pbase1 += sizeof (TXRX_DESC_T);\r
+               pbase2 += sizeof (unsigned long);\r
+               pbase3 += ENET_MAXF_SIZE;\r
+       }\r
+\r
+       // Setup pointers to RX structures\r
+       ENETMAC->rxdescriptor = pbase1;\r
+       ENETMAC->rxstatus = pbase2;\r
+       ENETMAC->rxdescriptornumber = (ENET_MAX_RX_PACKETS - 1);\r
+\r
+       // Save base address of RX descriptor table and RX status\r
+       pRXDesc = pTXRXDesc;\r
+       pRXStatus = pRXStatusL = (RX_STATUS_T *) pTXStatusL;\r
+\r
+       // Build RX descriptors\r
+       for (idx = 0; idx < ENET_MAX_TX_PACKETS; idx++)\r
+       {\r
+               pTXRXDesc->packet = pbase3;\r
+               pTXRXDesc->control = 0x80000000 | (ENET_MAXF_SIZE - 1);\r
+               pRXStatusL->statusinfo = 0;\r
+               pRXStatusL->statushashcrc = 0;\r
+\r
+               // Save virtual address of buffer\r
+#ifdef USE_IRAM_FOR_ETH_BUFFERS
+               pRXVBuffs [idx] = (unsigned long) pbase3;
+#else
+#pragma error "NOT supported"
+#endif\r
+\r
+               // Next descriptor and status\r
+               pTXRXDesc++;\r
+               pRXStatusL++;\r
+               pbase1 += sizeof (TXRX_DESC_T);\r
+               pbase2 += sizeof (unsigned long);\r
+               pbase3 += ENET_MAXF_SIZE;\r
+       }\r
+\r
+    return 1;\r
+}\r
+\r
+
+
+/* Get a data block via Ethernet */
+static int eth_recv (struct eth_device *dev)
+{
+       unsigned long idx, length;\r
+
+       // Determine if a frame has been received\r
+       length = 0;\r
+       idx = ENETMAC->rxconsumeindex;\r
+       if (ENETMAC->rxproduceindex != idx)\r
+       {
+               // Clear interrupt\r
+               ENETMAC->intclear = MACINT_RXDONEINTEN;\r
+\r
+               // Frame received, get size of RX packet\r
+               length = (pRXStatus[idx].statusinfo & 0x7FF);\r
+
+               /* Pass the packet up to the protocol layer */
+               if (length > 0)
+               {
+                       memcpy((void *) NetRxPackets[0], (void *) pRXVBuffs [idx], length);\r
+                       NetReceive (NetRxPackets[0], (unsigned short) length);
+               }
+
+               // Return DMA buffer\r
+               idx++;\r
+               if (idx >= ENET_MAX_TX_PACKETS)\r
+               {\r
+                       idx = 0;\r
+               }\r
+               ENETMAC->rxconsumeindex = (unsigned long) idx;\r
+       }\r
+\r
+       return (int) length;
+}
+
+
+/* Send a data block via Ethernet. */
+static int eth_tx (struct eth_device *dev,volatile void *packet, int length)
+{
+       unsigned long idx, cidx, fb;
+
+       // Determine number of free buffers and wait for a buffer if needed\r
+       fb = 0;\r
+       while (fb == 0)\r
+       {\r
+               idx = ENETMAC->txproduceindex;\r
+               cidx = ENETMAC->txconsumeindex;\r
+\r
+               if (idx == cidx)\r
+               {\r
+                       // Producer and consumer are the same, all buffers are free\r
+                       fb = ENET_MAX_TX_PACKETS;\r
+               }\r
+               else if (cidx > idx)\r
+               {\r
+                       fb = (ENET_MAX_TX_PACKETS - 1) -\r
+                               ((idx + ENET_MAX_TX_PACKETS) - cidx);\r
+               }\r
+               else\r
+               {\r
+                       fb = (ENET_MAX_TX_PACKETS - 1) - (cidx - idx);\r
+               }\r
+       }\r
+\r
+       // Update descriptor with new frame size\r
+       pTXDesc[idx].control = (length | 0x40000000);\r
+\r
+       // Move data to buffer\r
+       memcpy((void *) pTXVBuffs [idx], (void *) packet, length);\r
+\r
+       // Get next index for transmit data DMA buffer and descriptor\r
+       idx++;\r
+       if (idx >= ENET_MAX_TX_PACKETS)\r
+       {\r
+               idx = 0;\r
+       }\r
+       ENETMAC->txproduceindex = idx;\r
+\r
+       return 0;
+}
+
+//------------------------------------------------------------------------------\r
+static int HWInit(struct eth_device *dev, bd_t *bis)\r
+{\r
+       int btemp;
+       unsigned int duplex, speed;
+       unsigned long tmp1, mst = 250;
+       unsigned char bi_enetaddr[6];
+       int val = 0;
+
+       // Enable MAC interface\r
+       CLKPWR->clkpwr_macclk_ctrl = (CLKPWR_MACCTRL_HRCCLK_EN |\r
+               CLKPWR_MACCTRL_MMIOCLK_EN | CLKPWR_MACCTRL_DMACLK_EN |\r
+#ifdef USE_PHY_RMII\r
+               CLKPWR_MACCTRL_USE_RMII_PINS);\r
+#else\r
+               CLKPWR_MACCTRL_USE_MII_PINS);\r
+#endif\r
+\r
+       // Set RMII management clock rate. This clock should be slower\r
+       // than 12.5MHz (for NXP PHYs only). For a divider of 28, the\r
+       // clock rate when HCLK is 150MHz will be 5.4MHz\r
+       ENETMAC->mcfg = MCFG_CLOCK_SELECT(MCFG_CLOCK_HOST_DIV_28);\r
+\r
+       // Reset all MAC logic\r
+       ENETMAC->mac1 = (MAC1_SOFT_RESET | MAC1_SIMULATION_RESET |\r
+               MAC1_RESET_MCS_TX | MAC1_RESET_TX | MAC1_RESET_MCS_RX |\r
+               MAC1_RESET_RX);\r
+       ENETMAC->command = (COMMAND_REG_RESET | COMMAND_TXRESET |\r
+               COMMAND_RXRESET);\r
+       msDelay(10);\r
+\r
+       // Initial MAC initialization\r
+       ENETMAC->mac1 = MAC1_PASS_ALL_RX_FRAMES;\r
+       ENETMAC->mac2 = (MAC2_PAD_CRC_ENABLE | MAC2_CRC_ENABLE);\r
+       ENETMAC->maxf = ENET_MAXF_SIZE;\r
+\r
+       // Maximum number of retries, 0x37 collision window, gap */\r
+       ENETMAC->clrt = (CLRT_LOAD_RETRY_MAX(0xF) |\r
+               CLRT_LOAD_COLLISION_WINDOW(0x37));\r
+       ENETMAC->ipgr = IPGR_LOAD_PART2(0x12);\r
+\r
+#ifdef USE_PHY_RMII\r
+       // RMII setup\r
+       ENETMAC->command = (COMMAND_RMII | COMMAND_PASSRUNTFRAME);\r
+       ENETMAC->supp = SUPP_RESET_RMII;\r
+       msDelay(10);\r
+#else\r
+       // MII setup\r
+       ENETMAC->command = COMMAND_PASSRUNTFRAME;\r
+#endif\r
+
+       mst = 1000;
+       btemp = 1;
+       while(mst > 0)
+       {
+               /* Wait for Link status to set UP or Timeout */
+               if(phy_get_link_status() == 0) {
+                       mst = 0;
+                       btemp = 0;
+                       printf("ENET:auto-negotiation complete\n");
+               }
+               else {
+                       mst--;
+                       msDelay(1);
+               }
+       }
+       if(btemp) {
+               printf("ENET:auto-negotiation failed.\n");
+               return 0;
+       }
+
+       /*
+        *  Read Vendor specific PHY Ctrl/Status Register to determine
+        *  Ethernet Configuration
+        */
+       tmp1 = 0;
+       RMII_Read (LAN8700_PHY_STATUS,&tmp1);
+       val = (tmp1 & 0x1c) >> 2;
+       switch (val) {
+               case 1:
+                       /* 10Mbps Half Duplex */
+                       duplex = 0;
+                       speed = 0;
+                       break;
+               case 5:
+                       /* 10Mbps Full Duplex */
+                       duplex = 1;
+                       speed = 0;
+                       break;
+               case 2:
+                       /* 100Mbps Half Duplex */
+                       duplex = 0;
+                       speed = 1;
+                       break;
+               case 6:
+                       /* 100Mbps Full Duplex */
+                       duplex = 1;
+                       speed = 1;
+                       break;
+       }
+
+       // Configure Full/Half Duplex mode\r
+       if (duplex == 1)\r
+       {\r
+               // 10MBase full duplex is supported\r
+               ENETMAC->mac2 |= MAC2_FULL_DUPLEX;\r
+               ENETMAC->command |= COMMAND_FULLDUPLEX;\r
+               ENETMAC->ipgt = IPGT_LOAD(0x15);\r
+               printf("ENET:FULL DUPLEX\n");\r
+       }\r
+       else\r
+       {\r
+               ENETMAC->ipgt = IPGT_LOAD(0x12);\r
+               printf("ENET:HALF DUPLEX\n");\r
+       }\r
+\r
+       // Configure 100MBit/10MBit mode\r
+       if (speed == 1)\r
+       {\r
+               // 100MBase mode\r
+               ENETMAC->supp = SUPP_SPEED;\r
+               printf("ENET:100MBase\n");\r
+       }\r
+       else\r
+       {\r
+               // 10MBase mode\r
+               ENETMAC->supp = 0;\r
+               printf("ENET:10Base\n");\r
+       }\r
+\r
+          eth_getenv_enetaddr("ethaddr",bi_enetaddr);
+       // Save station address\r
+       ENETMAC->sa [2] = (unsigned long) (bi_enetaddr[0] | (bi_enetaddr[1] << 8));\r
+       ENETMAC->sa [1] = (unsigned long) (bi_enetaddr[2] | (bi_enetaddr[3] << 8));\r
+       ENETMAC->sa [0] = (unsigned long) (bi_enetaddr[4] | (bi_enetaddr[5] << 8));\r
+\r
+       // Setup TX and RX descriptors\r
+       txrx_setup();\r
+\r
+       // Enable broadcast and matching address packets\r
+       ENETMAC->rxfliterctrl = (RXFLTRW_ACCEPTUBROADCAST |\r
+               RXFLTRW_ACCEPTPERFECT);\r
+\r
+       // Clear and enable interrupts\r
+       ENETMAC->intclear = 0xFFFF;\r
+       ENETMAC->intenable = 0;\r
+\r
+       // Enable receive and transmit mode of MAC ethernet core\r
+       ENETMAC->command |= (COMMAND_RXENABLE | COMMAND_TXENABLE);\r
+       ENETMAC->mac1 |= MAC1_RECV_ENABLE;\r
+\r
+       // Perform a 'dummy' send of the first ethernet frame with a size of 0\r
+       // to 'prime' the MAC. The first packet after a reset seems to wait\r
+       // until at least 2 packets are ready to go.\r
+       tmp1 = 0;\r
+       eth_tx(dev,&tmp1, 4);\r
+\r
+       return 1;\r
+}\r
+\r
+//------------------------------------------------------------------------------\r
+static int HWDeInit(void)\r
+{\r
+       // Reset all MAC logic\r
+       ENETMAC->mac1 = (MAC1_SOFT_RESET | MAC1_SIMULATION_RESET |\r
+               MAC1_RESET_MCS_TX | MAC1_RESET_TX | MAC1_RESET_MCS_RX |\r
+               MAC1_RESET_RX);\r
+       ENETMAC->command = (COMMAND_REG_RESET | COMMAND_TXRESET |\r
+               COMMAND_RXRESET);\r
+       msDelay(2);\r
+\r
+       // Disable MAC clocks, but keep MAC interface active\r
+#ifdef USE_PHY_RMII\r
+       CLKPWR->clkpwr_macclk_ctrl = CLKPWR_MACCTRL_USE_RMII_PINS;\r
+#else\r
+       CLKPWR->clkpwr_macclk_ctrl = CLKPWR_MACCTRL_USE_MII_PINS;\r
+#endif\r
+\r
+       return 1;\r
+}\r
+
+static int eth_stop (struct eth_device *dev)
+{
+       HWDeInit();
+}
+
+
+int board_eth_init (bd_t *bd)
+{
+       int rc;
+       unsigned char bi_enetaddr[6];
+       struct eth_device *dev;
+
+
+       dev = malloc(sizeof(*dev));
+       if(!dev) {
+         return 0;
+       }
+       memset(dev, 0, sizeof(*dev));
+
+       // Set MAC address from hardware\r
+       dev->enetaddr[0] = phyhwdesc.mac[0];\r
+       dev->enetaddr[1] = phyhwdesc.mac[1];\r
+       dev->enetaddr[2] = phyhwdesc.mac[2];\r
+       dev->enetaddr[3] = phyhwdesc.mac[3];\r
+       dev->enetaddr[4] = phyhwdesc.mac[4];\r
+       dev->enetaddr[5] = phyhwdesc.mac[5];\r
+       printf ("\tHW MAC address:  "
+               "%02X:%02X:%02X:%02X:%02X:%02X\n",
+               dev->enetaddr[0], dev->enetaddr[1],
+               dev->enetaddr[2], dev->enetaddr[3],
+               dev->enetaddr[4], dev->enetaddr[5] );
+
+
+         dev->init = HWInit;
+         dev->halt = eth_stop;
+         dev->send = eth_tx;
+         dev->recv = eth_recv;
+         
+         eth_register(dev);
+\r
+       return 0;\r
+}
+
diff --git a/board/nxp/phy3250/phy3250.c b/board/nxp/phy3250/phy3250.c
new file mode 100644 (file)
index 0000000..68a2f0c
--- /dev/null
@@ -0,0 +1,406 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: Phytec 3250 board support functions
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <configs/phy3250.h>
+#include <asm/mach-types.h>
+#include <lpc3250.h>
+#include <net.h>
+#include "phy3250_prv.h"
+               
+DECLARE_GLOBAL_DATA_PTR;
+
+/* Initialize NOR Flash configuration */
+#ifdef CONFIG_FLASH_CFI_LEGACY
+ulong board_flash_get_legacy (ulong base, int banknum, flash_info_t * info)
+{
+       /*
+        * PHY3250 board contains two 16-bit SPANSION NOR flash
+        * to make a single 32 bit NOR flash. 
+        */
+       if (banknum == 0) {     /* non-CFI boot flash */
+               info->portwidth = FLASH_CFI_32BIT;
+               info->chipwidth = FLASH_CFI_BY16;
+               info->interface = FLASH_CFI_X16;
+               return 1;
+       } else
+               return 0;
+}
+#endif
+
+/*
+ * Dummy function to handle errors for EABI incompatibility
+ */
+void abort(void)
+{
+}
+
+void reset_timer (void)
+{
+       unsigned int clkdlycnt, tbaseclk;
+
+       /* Reset timer */
+       TIMER_CNTR0->tcr = TIMER_CNTR_TCR_RESET;
+       TIMER_CNTR0->tcr = 0;
+       TIMER_CNTR0->tc = 0;
+
+       /* Clear and enable match function */
+       TIMER_CNTR0->ir = TIMER_CNTR_MTCH_BIT(0);
+
+       /* Count mode is PCLK edge */
+       TIMER_CNTR0->ctcr = TIMER_CNTR_SET_MODE(TIMER_CNTR_CTCR_TIMER_MODE);
+
+       /* Set prescale counter value for a 1mS tick */
+       tbaseclk = sys_get_rate(CLKPWR_PERIPH_CLK);
+       clkdlycnt = (tbaseclk / CONFIG_SYS_HZ);
+       TIMER_CNTR0->pr = clkdlycnt - 1;
+
+       /* Enable the timer */
+       TIMER_CNTR0->tcr = TIMER_CNTR_TCR_EN;
+}
+
+ulong get_timer (ulong base)
+{
+       ulong tcr = TIMER_CNTR0->tc;
+       return tcr - base;
+}
+
+int timer_init(void)
+{
+       /* Enable timer system clock */
+       CLKPWR->clkpwr_timers_pwms_clk_ctrl_1 |=
+               CLKPWR_TMRPWMCLK_TIMER0_EN;
+
+       reset_timer();
+       return 0;
+}
+
+void __udelay(unsigned long usec)
+{
+       unsigned long tbaseclk;
+
+       /* Enable timer system clock */
+       CLKPWR->clkpwr_timers_pwms_clk_ctrl_1 |=
+               CLKPWR_TMRPWMCLK_TIMER1_EN;
+
+       /* Reset timer */
+       TIMER_CNTR1->tcr = TIMER_CNTR_TCR_RESET;
+       TIMER_CNTR1->tcr = 0;
+       TIMER_CNTR1->tc = 0;
+       TIMER_CNTR1->pr = 0;
+
+       /* Clear and enable match function */
+       TIMER_CNTR1->ir = TIMER_CNTR_MTCH_BIT(0);
+
+       /* Count mode is PCLK edge */
+       TIMER_CNTR1->ctcr = TIMER_CNTR_SET_MODE(TIMER_CNTR_CTCR_TIMER_MODE);
+
+       /* Set prescale counter value for a 1uS tick */
+       tbaseclk = sys_get_rate(CLKPWR_PERIPH_CLK);
+       tbaseclk = (tbaseclk / 1000000) - 1;
+       TIMER_CNTR1->pr = tbaseclk;
+
+       /* Set match for number of usecs */
+       TIMER_CNTR1->mr[0] = usec;
+
+       /* Interrupt on match 0 */
+       TIMER_CNTR1->mcr = TIMER_CNTR_MCR_MTCH(0);
+
+       /* Enable the timer */
+       TIMER_CNTR1->tcr = TIMER_CNTR_TCR_EN;
+
+       /* Loop until match occurs */
+       while ((TIMER_CNTR1->ir & TIMER_CNTR_MTCH_BIT(0)) == 0);
+
+       /* Stop timer */
+       TIMER_CNTR1->tcr = 0;
+
+       /* Disable timer system clock */
+       CLKPWR->clkpwr_timers_pwms_clk_ctrl_1 &=
+               ~CLKPWR_TMRPWMCLK_TIMER1_EN;
+}
+
+/*
+ * Miscellaneous platform dependent initialisations
+ */
+int misc_init_r(void)
+{
+       char enetaddr[18];
+       char *addr;
+       int i = 0;
+
+       sprintf(enetaddr, "%02X:%02X:%02X:%02X:%02X:%02X",
+                       phyhwdesc.mac[0],
+                       phyhwdesc.mac[1],
+                       phyhwdesc.mac[2],
+                       phyhwdesc.mac[3],
+                       phyhwdesc.mac[4],
+                       phyhwdesc.mac[5]);
+       setenv("ethaddr",enetaddr);
+
+       return 1;
+}
+
+PHY_HW_T phyhwdesc;
+
+static int ssp_read(void *buffer,
+                       int max_fifo)
+{
+       volatile unsigned long tmp1;
+       int count = 0;
+       u_char *data8 = (u_char *) buffer;
+
+       while ((max_fifo > 0) && ((SSP0->sr & SSP_SR_RNE) != 0))
+       {
+               tmp1 = SSP0->data;
+               *data8 = (u_char) tmp1;
+               data8++;
+
+               /* Increment data count and decrement buffer size count */
+               count++;
+               max_fifo--;
+       }
+
+       return count;
+}
+
+static int ssp_write(void *buffer,
+                 int n_fifo)
+{
+       int count = 0;
+       u_char *data8 = (u_char *) buffer;
+
+       /* Loop until transmit ring buffer is full or until n_bytes
+          expires */
+       while ((n_fifo > 0) && ((SSP0->sr & SSP_SR_TNF) != 0))
+       {
+               SSP0->data = (unsigned long) * data8;
+               data8++;
+
+               /* Increment data count and decrement buffer size count */
+               count++;
+               n_fifo--;
+       }
+
+       return count;
+}
+
+static void ssp_set_clock(unsigned long target_clock)
+{
+       unsigned long control, prescale, cr0_div, cmp_clk, ssp_clk;
+
+       /* Get clock for SSP */
+       ssp_clk = sys_get_rate(CLKPWR_HCLK);
+
+       /* Find closest divider to get at or under the target frequency.
+          Use smallest prescaler possible and rely on the divider to get
+          the closest target frequency */
+       cr0_div = 0;
+       cmp_clk = 0xFFFFFFFF;
+       prescale = 2;
+       while (cmp_clk > target_clock)
+       {
+               cmp_clk = ssp_clk / ((cr0_div + 1) * prescale);
+               if (cmp_clk > target_clock)
+               {
+                       cr0_div++;
+                       if (cr0_div > 0xFF)
+                       {
+                               cr0_div = 0;
+                               prescale += 2;
+                       }
+               }
+       }
+
+       /* Write computed prescaler and divider back to register */
+       control = SSP0->cr0 &= ~(SSP_CR0_SCR(0xFF));
+       SSP0->cr0 = control | SSP_CR0_SCR(cr0_div - 1);
+       SSP0->cpsr = prescale;
+}
+
+/*
+ * Initialize SSP0 for interface to the serial EEPROM
+ */
+static void phy3250_ssp0_init(void)
+{
+       volatile unsigned long tmp;
+
+       /* Enable SSP0 clock */
+       CLKPWR->clkpwr_ssp_blk_ctrl |= CLKPWR_SSPCTRL_SSPCLK0_EN;
+
+       SSP0->cr0 = (SSP_CR0_DSS(8) | SSP_CR0_FRF_SPI);
+       SSP0->cr1 |= SSP_CR1_SSP_ENABLE;
+
+       /* Empty FIFO */
+       while ((SSP0->sr & SSP_SR_RNE) != 0)
+       {
+               tmp = SSP0->data;
+       }
+
+       ssp_set_clock(500000);
+
+       /* Clear latched interrupts */
+       SSP0->icr = (SSP_ICR_RORIC | SSP_ICR_RTIC);
+
+       /* Disable interrupts */
+       SSP0->imsc = 0; // TBD (SSP_IMSC_RORIM | SSP_IMSC_RTIM | SSP_IMSC_RXIM);
+}
+
+static int phy3250_sspxfer(u_char *out,
+                               u_char *in,
+                               int bytes)
+{
+  int rbytes = 0, xfrd = 0;
+
+       /* Assert chip select */
+       GPIO->p3_outp_clr = OUTP_STATE_GPIO(5);
+       ssp_write(out, bytes);
+       while (rbytes < bytes)
+       {
+               rbytes += ssp_read(&in [rbytes], 1);
+       }
+
+       GPIO->p3_outp_set = OUTP_STATE_GPIO(5);
+       xfrd = 1;
+
+       return xfrd;
+}
+
+static u_char phy3250_sspread(int index)
+{      
+       u_char datai [8], datao [8];
+       u_char byte = 0;
+
+       /* Read byte */
+       datao [0] = SEEPROM_READ;
+       datao [1] = (u_char)((index >> 8) & 0xFF);
+       datao [2] = (u_char)((index >> 0) & 0xFF);
+       datao [3] = 0xFF;
+       phy3250_sspxfer(datao, datai, 4);
+       byte = datai [3];
+
+       return byte;
+}
+
+void phy3250_get_board_info(void)
+{
+       u_char *p8;
+       int idx;
+
+       /* Initialize SSP0 */
+       phy3250_ssp0_init();
+
+       /* Read data from EEPROM - this needs to be done here as the
+          SDRAM configuration depends on these settings. */
+       p8 = (u_char *) & phyhwdesc;
+       for (idx = 0; idx < sizeof(phyhwdesc); idx++)
+       {
+               *p8 = phy3250_sspread(PHY3250_SEEPROM_CFGOFS + idx);
+               p8++;
+       }
+
+       if (phyhwdesc.fieldvval != PHY_HW_VER_VAL)
+       {
+               /* Set some defaults */
+               phyhwdesc.dramcfg = (PHYHW_DRAM_TYPE_LPSDRAM | PHYHW_DRAM_SIZE_64M);
+               phyhwdesc.syscfg = PHYHW_SDIO_POP;
+               phyhwdesc.fieldvval = PHY_HW_VER_VAL;
+
+               /* Default MAC address in index order of 0:1:2:3:4:5 */
+               phyhwdesc.mac [0] = 0x00;
+               phyhwdesc.mac [1] = 0x01;
+               phyhwdesc.mac [2] = 0x90;
+               phyhwdesc.mac [3] = 0x00;
+               phyhwdesc.mac [4] = 0xC0;
+               phyhwdesc.mac [5] = 0x81;
+               phyhwdesc.mac [6] = 0x00;
+               phyhwdesc.mac [7] = 0x00;
+       }
+}
+
+int board_init (void)
+{      
+       phy3250_get_board_info();
+
+       /* arch number of Logic-Board - MACH_TYPE_LPC3XXX */
+       gd->bd->bi_arch_number = MACH_TYPE_UBOOTSYS;
+
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = CONFIG_ENV_ADDR;
+
+#ifdef CONFIG_SYS_FLASH_CFI
+       /* Use 32-bit memory interface for NOR Flash */
+       EMC->emcstatic_regs[0].emcstaticconfig = 0x82;
+       /* 
+        * After Setting a higher clock speed, change the NOR timings to 
+        * optimum value to get maximum bandwidth
+        */
+       EMC->emcstatic_regs[0].emcstaticwaitwen = 0x0;
+       EMC->emcstatic_regs[0].emcstaticwait0en = 0x0;
+       EMC->emcstatic_regs[0].emcstaticwaitrd = 0xb;
+       EMC->emcstatic_regs[0].emcstaticpage = 0xb;
+       EMC->emcstatic_regs[0].emcstaticwr = 0x3;
+       EMC->emcstatic_regs[0].emcstaticturn = 0x1;
+#endif
+
+       return 0;
+}
+
+int dram_init (void)
+{
+       unsigned long sz = phyhwdesc.dramcfg & PHYHW_DRAM_SIZE_MASK;
+
+       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+
+       if (sz == PHYHW_DRAM_SIZE_16M)
+       {
+               /* 16M available */
+               gd->bd->bi_dram[0].size = 0x01000000; /* 16M */
+               gd->ram_size = 0x01000000;
+       }
+       else if (sz == PHYHW_DRAM_SIZE_32M)
+       {
+               /* 32M available */
+               gd->bd->bi_dram[0].size = 0x02000000; /* 32M */
+               gd->ram_size = 0x02000000;
+       }
+       else if (sz == PHYHW_DRAM_SIZE_64M)
+       {
+               /* 64M available */
+               gd->bd->bi_dram[0].size = 0x04000000; /* 64M */
+               gd->ram_size = 0x04000000;
+       }
+       else
+       {
+               /* 128M available */
+               gd->bd->bi_dram[0].size = 0x08000000; /* 128M */
+               gd->ram_size = 0x04000000;
+       }
+
+       return 0;
+}
+
+
diff --git a/board/nxp/phy3250/phy3250_prv.h b/board/nxp/phy3250/phy3250_prv.h
new file mode 100644 (file)
index 0000000..d955bb2
--- /dev/null
@@ -0,0 +1,128 @@
+/***********************************************************************\r
+ * $Id:: phy3250_board.h 970 2008-07-28 21:01:39Z wellsk               $\r
+ *\r
+ * Project: Phytec 3250 board definitions\r
+ *\r
+ * Description:\r
+ *     This file contains board specific information such as the\r
+ *     chip select wait states, and other board specific information.\r
+ *\r
+ ***********************************************************************\r
+ * Software that is described herein is for illustrative purposes only\r
+ * which provides customers with programming information regarding the\r
+ * products. This software is supplied "AS IS" without any warranties.\r
+ * NXP Semiconductors assumes no responsibility or liability for the\r
+ * use of the software, conveys no license or title under any patent,\r
+ * copyright, or mask work right to the product. NXP Semiconductors\r
+ * reserves the right to make changes in the software without\r
+ * notification. NXP Semiconductors also make no representation or\r
+ * warranty that such application will be suitable for the specified\r
+ * use without further testing or modification.\r
+ **********************************************************************/\r
+\r
+#ifndef PHY3250_PRV_H\r
+#define PHY3250_PRV_H\r
+\r
+/* Structure used to define the hardware for the Phytec board */\r
+typedef struct\r
+{\r
+  unsigned long dramcfg;    /* DRAM config word */\r
+  unsigned long syscfg;     /* Configuration word */\r
+  /* MAC address, use lower 6 bytes only, index 0 is first byte */\r
+  u_char  mac[8];     /* Only the first 6 are used */\r
+  unsigned long rsvd [5];   /* Reserved, must be 0 */\r
+  unsigned long fieldvval;  /* Must be PHY_HW_VER_VAL */\r
+} PHY_HW_T;\r
+extern PHY_HW_T phyhwdesc;\r
+\r
+/* Phytec hardware verification value for configuation field */\r
+#define PHY_HW_VER_VAL 0x000A3250\r
+\r
+/***********************************************************************\r
+ * DRAM config word (dramcfg) bits\r
+ * Bits        Value             Description\r
+ * 1..0        00                Low power SDRAM\r
+ * 1..0        01                SDRAM\r
+ * 1..0        1x                Reserved\r
+ * 4..2        000               SDRAM 16M,  16 bits x 2 devices, 0xa5\r
+ * 4..2        001               SDRAM 32M,  16 bits x 2 devices, 0xa9\r
+ * 4..2        010               SDRAM 64M,  16 bits x 2 devices, 0xad\r
+ * 4..2        011               SDRAM 128M, 16 bits x 2 devices, 0xb1\r
+ * 31..5       0                 Reserved\r
+ **********************************************************************/\r
+/* Mask for get the DRAM type */\r
+#define PHYHW_DRAM_TYPE_MASK       0x3\r
+/* DRAM types (2 bits) */\r
+#define PHYHW_DRAM_TYPE_LPSDRAM    0x0\r
+#define PHYHW_DRAM_TYPE_SDRAM      0x1\r
+#define PHYHW_DRAM_TYPE_LPDDR      0x2\r
+#define PHYHW_DRAM_TYPE_DDR        0x3\r
+/* DRAM configuration mask */\r
+#define PHYHW_DRAM_SIZE_MASK       _SBF(2, 0x3)\r
+/* DRAM configurations (3 bits) */\r
+#define PHYHW_DRAM_SIZE_16M        _SBF(2, 0x0)\r
+#define PHYHW_DRAM_SIZE_32M        _SBF(2, 0x1)\r
+#define PHYHW_DRAM_SIZE_64M        _SBF(2, 0x2)\r
+#define PHYHW_DRAM_SIZE_128M       _SBF(2, 0x3)\r
+\r
+/***********************************************************************\r
+ * Configuation word (syscfg) bits\r
+ * Bits        Value             Description\r
+ * 0           0                 SDIO not populated\r
+ * 0           1                 SDIO populated\r
+ * 31..1       0                 Reserved\r
+ **********************************************************************/\r
+/* SDIO populated bit */\r
+#define PHYHW_SDIO_POP             _BIT(0)\r
+\r
+/***********************************************************************\r
+ * NAND timing information\r
+ **********************************************************************/\r
+/* NAND256R3A2CZA6 device */\r
+#define PHY_NAND_TCEA_DELAY   22222222\r
+#define PHY_NAND_BUSY_DELAY   10000000\r
+#define PHY_NAND_NAND_TA      33333333\r
+#define PHY_NAND_RD_HIGH      66666666\r
+#define PHY_NAND_RD_LOW       33333333\r
+#define PHY_NAND_WR_HIGH      50000000\r
+#define PHY_NAND_WR_LOW       25000000\r
+\r
+/***********************************************************************\r
+ * Functions\r
+ **********************************************************************/\r
+\r
+/* Serial EEPROM commands (SPI via SSP) */\r
+#define SEEPROM_WREN          0x06\r
+#define SEEPROM_WRDI          0x04\r
+#define SEEPROM_RDSR          0x05\r
+#define SEEPROM_WRSR          0x01\r
+#define SEEPROM_READ          0x03\r
+#define SEEPROM_WRITE         0x02\r
+\r
+/* Size of serial EEPROM */\r
+#define PHY3250_SEEPROM_SIZE  0x8000\r
+\r
+/* Offset into serial EEPROM where board configuration information is\r
+   saved */\r
+#define PHY3250_SEEPROM_CFGOFS (PHY3250_SEEPROM_SIZE - 0x100)\r
+
+
+
+\r
+// Enable the following define to setup for RMII mode\r
+#define USE_PHY_RMII\r
+\r
+// PHY address (configured via PHY ADRx pins)\r
+#define PHYDEF_PHYADDR           0x00\r
+
+// LAN8700 Ethernet Phy Ctrl/Status Register
+#define LAN8700_PHY_STATUS     0x1F
+
+// Maximum ethernet frame size, maximum RX and TX packets\r
+#define ENET_MAXF_SIZE             1536\r
+#define ENET_MAX_TX_PACKETS        16\r
+#define ENET_MAX_RX_PACKETS        16
+\r
+\r
+\r
+#endif /* PHY3250_PRV_H */\r
diff --git a/board/nxp/phy3250/u-boot.lds b/board/nxp/phy3250/u-boot.lds
new file mode 100644 (file)
index 0000000..cc396bf
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x83F80000;
+
+       . = ALIGN(4);
+       .text      :
+       {
+         arch/arm/cpu/arm926ejs/start.o        (.text)
+         *(.text)
+       }
+
+       . = ALIGN(4);
+       .rodata : { *(.rodata) }
+
+       .ARM.extab      : { *(.ARM.extab* .gnu.linkonce.armextab.*) }
+       __exidx_start = .;
+       .ARM.exidx      : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
+       __exidx_end = .;
+
+       . = ALIGN(4);
+       .data : { *(.data) }
+
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       . = .;
+       __u_boot_cmd_start = .;
+       .u_boot_cmd : { *(.u_boot_cmd) }
+       __u_boot_cmd_end = .;
+
+       . = ALIGN(4);
+       __bss_start = .;
+       .bss (NOLOAD) : { *(.bss) }
+       _end = .;
+}
diff --git a/cpu/arm926ejs/lpc3250/Makefile b/cpu/arm926ejs/lpc3250/Makefile
new file mode 100644 (file)
index 0000000..f3ddadc
--- /dev/null
@@ -0,0 +1,46 @@
+#
+# Copyright (C) 2008 by NXP Semiconductors
+# All rights reserved.
+#
+# 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    = $(obj)lib$(SOC).a
+
+COBJS-y        += serial.o cpu.o clkpwr.o
+
+SRCS    := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
+OBJS    := $(addprefix $(obj),$(SOBJS) $(COBJS-y))
+
+all:   $(obj).depend $(LIB)
+
+$(LIB):        $(OBJS)
+       $(call cmd_link_o_target, $(OBJS) $(SOBJS))
+
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/cpu/arm926ejs/lpc3250/clkpwr.c b/cpu/arm926ejs/lpc3250/clkpwr.c
new file mode 100644 (file)
index 0000000..cec6a3d
--- /dev/null
@@ -0,0 +1,360 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC3250 clock and power query functions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <common.h>
+#include <lpc3250.h>
+#include <div64.h>
+
+//DECLARE_GLOBAL_DATA_PTR;
+
+
+/* CLK divider values for HCLK based on selected register value */\r
+static unsigned int hclkdivs[4] =\r
+{\r
+  1, 2, 4, 4\r
+};
+
+/* Post divider values for PLLs based on selected register value */\r
+static unsigned int pll_postdivs[4] =\r
+{\r
+  1, 2, 4, 8\r
+};
+
+/*
+ * Structure used for setting up the HCLK PLL
+ */\r
+typedef struct\r
+{\r
+  /* (0) = analog off, (!0) = on */\r
+  int analog_on;\r
+  /* (0) = CCO clock sent to post divider, (!0) = PLL input clock sent\r
+  to post div */\r
+  int cco_bypass_b15;\r
+  /* (0) = PLL out from post divider, (!0) = PLL out bypasses post\r
+  divider */\r
+  int direct_output_b14;\r
+  /* (0) = use CCO clock, (!0) = use FCLKOUT */\r
+  int fdbk_div_ctrl_b13;\r
+  /* Must be 1, 2, 4, or 8 */\r
+  int pll_p;\r
+  /* Must be 1, 2, 3, or 4 */\r
+  int pll_n;\r
+  /* Feedback multiplier 1-256 */\r
+  unsigned int pll_m;\r
+} CLKPWR_HCLK_PLL_SETUP_T;
+
+/*
+ * Determine if PLL rate is valid
+ */\r
+static unsigned int clkpwr_check_pll_setup(unsigned int ifreq,\r
+                                               CLKPWR_HCLK_PLL_SETUP_T *pllsetup)\r
+{\r
+  unsigned long long i64freq, p, m, n, fcco, fref,
+               cfreq, div_cfreq, div_fcco, div_fref;\r
+  int mode;\r
+\r
+  /* PLL requirements */\r
+  /* ifreq must be >= 1MHz and <= 20MHz */\r
+  /* FCCO must be >= 156MHz and <= 320MHz */\r
+  /* FREF must be >= 1MHz and <= 27MHz. */\r
+  /* Assume the passed input data is not valid */\r
+
+       fcco = fref = cfreq = 0;
+       div_cfreq = div_fcco = div_fref = 0;
+\r
+  /* Work with 64-bit values to prevent overflow */\r
+  i64freq = (unsigned long long) ifreq;\r
+  m = (unsigned long long) pllsetup->pll_m;\r
+  n = (unsigned long long) pllsetup->pll_n;\r
+  p = (unsigned long long) pllsetup->pll_p;\r
+\r
+  /* Get components of the PLL register */\r
+  mode = (pllsetup->cco_bypass_b15 << 2) |\r
+         (pllsetup->direct_output_b14 << 1) |\r
+         pllsetup->fdbk_div_ctrl_b13;\r
+
+  switch (mode)\r
+  {\r
+    case 0x0: /* Non-integer mode */\r
+      cfreq = m * i64freq;
+      div_cfreq = 2 * p * n;
+      fcco = m * i64freq;
+      div_fcco = n;
+      fref = i64freq;
+      div_fref = n;
+      break;\r
+\r
+    case 0x1: /* integer mode */\r
+      cfreq = m * i64freq;
+      div_cfreq = n;
+      fcco = m * i64freq;
+      div_fcco = 2 * p * n;
+      fref = i64freq;
+      div_fref = n;
+      break;\r
+\r
+    case 0x2:\r
+    case 0x3: /* Direct mode */\r
+      cfreq = m * i64freq;
+      div_cfreq = n;\r
+      fcco = m * i64freq;\r
+      div_fcco = n;
+      fref = i64freq;
+      div_fref = n;\r
+      break;\r
+\r
+    case 0x4:\r
+    case 0x5: /* Bypass mode */\r
+      cfreq = i64freq;
+      div_cfreq = 2 * p;\r
+      fcco = 156000000;\r
+      fref = 1000000;\r
+      break;\r
+\r
+    case 0x6:\r
+    case 0x7: /* Direct bypass mode */\r
+      cfreq = i64freq;\r
+      fcco = 156000000;\r
+      fref = 1000000;\r
+      break;\r
+  }\r
+\r
+  if (div_cfreq != 0)
+         do_div(cfreq, div_cfreq);
+  
+  if (div_fcco != 0)
+         do_div(fcco, div_fcco);
+
+  if (div_fref != 0)
+         do_div(fref, div_fref);
+
+  if ((fcco < 156000000) || (fcco > 320000000))\r
+  {\r
+    /* not a valid range */\r
+    cfreq = 0;\r
+  }\r
+\r
+  if ((fref < 1000000) || (fref > 27000000))\r
+  {\r
+    /* not a valid range */\r
+    cfreq = 0;\r
+  }\r
+\r
+  return (int) cfreq;\r
+}\r
+\r
+/*
+ * Get PLL values and compute PLL rate
+ */\r
+static unsigned int clkpwr_pll_rate_from_val(unsigned int osc_rate,\r
+                                               unsigned int val)\r
+{\r
+  CLKPWR_HCLK_PLL_SETUP_T pllcfg;\r
+\r
+  /* Get components of the PLL register */\r
+  pllcfg.cco_bypass_b15 = 0;\r
+  pllcfg.direct_output_b14 = 0;\r
+  pllcfg.fdbk_div_ctrl_b13 = 0;\r
+  if ((val & CLKPWR_HCLKPLL_CCO_BYPASS) != 0)\r
+  {\r
+    pllcfg.cco_bypass_b15 = 1;\r
+  }\r
+  if ((val & CLKPWR_HCLKPLL_POSTDIV_BYPASS) != 0)\r
+  {\r
+    pllcfg.direct_output_b14 = 1;\r
+  }\r
+  if ((val & CLKPWR_HCLKPLL_FDBK_SEL_FCLK) != 0)\r
+  {\r
+    pllcfg.fdbk_div_ctrl_b13 = 1;\r
+  }\r
+  pllcfg.pll_m = 1 + ((val >> 1) & 0xFF);\r
+  pllcfg.pll_n = 1 + ((val >> 9) & 0x3);\r
+  pllcfg.pll_p = pll_postdivs[((val >> 11) & 0x3)];\r
+\r
+  return clkpwr_check_pll_setup(osc_rate, &pllcfg);\r
+}\r
+\r
+/*
+ * Get PLL rate from USB or HCLK PLL
+ */\r
+static unsigned int clkpwr_pll_rate(unsigned int osc_rate,\r
+                               unsigned int *pPllreg)\r
+{\r
+  return clkpwr_pll_rate_from_val(osc_rate, *pPllreg);\r
+}
+
+/*
+ * Clock rate fetch function
+ */
+unsigned int sys_get_rate(CLKPWR_BASE_CLOCK_T clkid)
+{
+       unsigned int sys_clk, ddr_clock, ddr_hclk_div, hclkpll_clk;
+       unsigned int periph_clk, tmp, hclk1_clk, arm1_clk;
+       unsigned int hclk_clk, arm_clk, clkrate;\r
+\r
+       /* Is PLL397 oscillator being used? */\r
+       if ((CLKPWR->clkpwr_sysclk_ctrl & CLKPWR_SYSCTRL_USEPLL397) != 0)\r
+       {\r
+               /* PLL397 is used */\r
+               sys_clk = CLOCK_OSC_FREQ * 397;\r
+       }\r
+       else\r
+       {\r
+               sys_clk = MAIN_OSC_FREQ;\r
+       }\r
+\r
+       /* Compute HCLK DDR divider */\r
+       ddr_hclk_div = 0;\r
+       if ((CLKPWR->clkpwr_sdramclk_ctrl & CLKPWR_SDRCLK_USE_DDR) != 0)\r
+       {\r
+               /* DDR is being used */\r
+               if ((CLKPWR->clkpwr_hclk_div & CLKPWR_HCLKDIV_DDRCLK_NORM) != 0)\r
+               {\r
+                       ddr_hclk_div = 1;\r
+               }\r
+               else if ((CLKPWR->clkpwr_hclk_div &\r
+                       CLKPWR_HCLKDIV_DDRCLK_HALF) != 0)\r
+               {\r
+                       ddr_hclk_div = 2;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               /* SDRAM is being used */\r
+               tmp = CLKPWR->clkpwr_hclk_div & CLKPWR_HCLKDIV_DIV_2POW(0x3);\r
+               ddr_hclk_div = hclkdivs[tmp] - 1;\r
+       }\r
+\r
+       /* Is the device in run mode? */\r
+       if ((CLKPWR->clkpwr_pwr_ctrl & CLKPWR_SELECT_RUN_MODE) != 0)\r
+       {\r
+               /* In run mode */\r
+\r
+               /* Compute HCLK PLL rate */\r
+               hclkpll_clk = clkpwr_pll_rate(sys_clk,\r
+                       (unsigned int *) &CLKPWR->clkpwr_hclkpll_ctrl);\r
+\r
+               /* Base DDR rate */\r
+               ddr_clock = hclkpll_clk;\r
+\r
+               /* Base peripheral clock rate */\r
+               tmp = 1 + ((CLKPWR->clkpwr_hclk_div >> 2) & 0x1F);\r
+               periph_clk = hclkpll_clk / tmp;\r
+\r
+               /* Base HCLK rate (when not using peripheral clock */\r
+               hclk1_clk = hclkpll_clk /\r
+                       hclkdivs[CLKPWR_HCLKDIV_DIV_2POW(CLKPWR->clkpwr_hclk_div)];\r
+\r
+               /* Base ARM clock (when not using peripheral clock */\r
+               arm1_clk = hclkpll_clk;\r
+       }\r
+       else\r
+       {\r
+               /* In direct-run mode */\r
+\r
+               /* Base DDR rate */\r
+               ddr_clock = sys_clk;\r
+\r
+               /* Base peripheral clock rate */\r
+               periph_clk = sys_clk;\r
+\r
+               /* Base HCLK rate (when not using peripheral clock */\r
+               hclk1_clk = sys_clk;\r
+\r
+               /* Base ARM clock (when not using peripheral clock */\r
+               arm1_clk = sys_clk;\r
+       }\r
+\r
+       /* Compute SDRAM/DDR clock */\r
+       ddr_clock = ddr_clock / (ddr_hclk_div + 1);\r
+\r
+       /* Compute HCLK and ARM clock rates */\r
+       if ((CLKPWR->clkpwr_pwr_ctrl & CLKPWR_CTRL_FORCE_PCLK) != 0)\r
+       {\r
+               /* HCLK and ARM clock run from peripheral clock */\r
+               hclk_clk = periph_clk;\r
+               arm_clk = periph_clk;\r
+       }\r
+       else\r
+       {\r
+               /* Normal clock is used for HCLK and ARM clock */\r
+               hclk_clk = hclk1_clk;\r
+               arm_clk = arm1_clk;\r
+       }\r
+\r
+       /* Determine rates */\r
+       switch (clkid)\r
+       {\r
+               case CLKPWR_MAINOSC_CLK:\r
+                       /* Main oscillator rate */\r
+                       clkrate = MAIN_OSC_FREQ;\r
+                       break;\r
+\r
+               case CLKPWR_RTC_CLK:\r
+                       /* RTC oscillator rate */\r
+                       clkrate = CLOCK_OSC_FREQ;\r
+                       break;\r
+\r
+               case CLKPWR_SYSCLK:\r
+                       /* System oscillator (main osc or PLL397) rate */\r
+                       clkrate = sys_clk;\r
+                       break;\r
+\r
+               case CLKPWR_ARM_CLK:\r
+                       clkrate = arm_clk;\r
+                       break;\r
+\r
+               case CLKPWR_HCLK:\r
+                       clkrate = hclk_clk;\r
+                       break;\r
+\r
+               case CLKPWR_PERIPH_CLK:\r
+                       clkrate = periph_clk;\r
+                       break;\r
+\r
+               case CLKPWR_USB_HCLK_SYS:\r
+                       clkrate = 0; // Not supported\r
+                       break;\r
+\r
+               case CLKPWR_48M_CLK:\r
+                       clkrate = 0; // Not supported\r
+                       break;\r
+\r
+               case CLKPWR_DDR_CLK:\r
+                       clkrate = ddr_clock;\r
+                       break;\r
+\r
+               case CLKPWR_MSSD_CLK:\r
+                       clkrate = hclk_clk;\r
+                       break;\r
+\r
+               default:\r
+                       clkrate = 0;\r
+                       break;\r
+       }\r
+\r
+       return clkrate;\r
+}
+
+
+
diff --git a/cpu/arm926ejs/lpc3250/config.mk b/cpu/arm926ejs/lpc3250/config.mk
new file mode 100644 (file)
index 0000000..da754f4
--- /dev/null
@@ -0,0 +1,8 @@
+PLATFORM_CPPFLAGS += -march=armv5te 
+PLATFORM_CPPFLAGS += $(call cc-option,-mtune=arm926ejs,)
+
+PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common -ffixed-r8
+
+PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
+
+
diff --git a/cpu/arm926ejs/lpc3250/cpu.c b/cpu/arm926ejs/lpc3250/cpu.c
new file mode 100644 (file)
index 0000000..87b871e
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/*
+ * CPU specific code
+ */
+
+#include <common.h>
+#include <command.h>
+#include <arm926ejs.h>
+#include <lpc3250.h>
+
+/*
+ * Use the watchdog timer to reset the system
+ */
+void reset_cpu(ulong addr)
+{
+       /* Enable the WDT clock */
+       CLKPWR->clkpwr_timer_clk_ctrl |= CLKPWR_PWMCLK_WDOG_EN;
+
+       /* Force RESETOUT_N active */
+       WDT->wdtim_pulse = 13000;
+       WDT->wdtim_mctrl = 0x70;
+
+       /* Wait forever */
+       while (1);
+}
diff --git a/cpu/arm926ejs/lpc3250/serial.c b/cpu/arm926ejs/lpc3250/serial.c
new file mode 100644 (file)
index 0000000..eee12fd
--- /dev/null
@@ -0,0 +1,466 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC3250 serial port functions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <common.h>
+#include <lpc3250.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * ABS function
+ */
+int serial_abs(int v1, int v2)
+{
+  if (v1 > v2)
+  {
+    return v1 - v2;
+  }
+
+  return v2 - v1;
+}
+
+/*
+ * Find the best UART clock divider to get the desired port rate
+ */
+void serial_getdiv(u32 baudrate,
+                       unsigned int *xdiv,
+                       unsigned int *ydiv)
+{
+       unsigned int clkrate, savedclkrate, diff, basepclk;
+       int idxx, idyy;
+
+       /* Get the clock rate for the UART block */
+       basepclk = sys_get_rate(CLKPWR_PERIPH_CLK) >> 4;
+
+       /* Find the best divider */
+       *xdiv = *ydiv = 0;
+       savedclkrate = 0;
+       diff = 0xFFFFFFFF;
+       for (idxx = 1; idxx < 0xFF; idxx++)
+       {
+               for (idyy = idxx; idyy < 0xFF; idyy++)
+               {
+                       clkrate = (basepclk * idxx) / idyy;
+                       if (serial_abs(clkrate, baudrate) < diff)
+                       {
+                               diff = serial_abs(clkrate, baudrate);
+                               savedclkrate = clkrate;
+                               *xdiv = idxx;
+                               *ydiv = idyy;
+                       }
+               }
+       }
+}
+
+#ifdef USE_HIGH_SPEED_UART
+void hsuart_getdiv(u32 baudrate,
+                       unsigned int *xdiv)
+{
+       unsigned int basepclk, div, goodrate, hsu_rate, l_hsu_rate, comprate;
+       unsigned int rate_diff;
+
+       /* Find the closest divider to get the desired clock rate */
+       basepclk = sys_get_rate(CLKPWR_PERIPH_CLK);
+       div = basepclk / baudrate;
+       goodrate = hsu_rate = (div / 14) - 1;
+       if (hsu_rate != 0)
+               hsu_rate--;
+
+       /* Tweak divider */
+       l_hsu_rate = hsu_rate + 3;
+       rate_diff = 0xFFFFFFFF;
+
+       while (hsu_rate < l_hsu_rate) {
+               comprate = basepclk / ((hsu_rate + 1) * 14);
+               if (serial_abs(comprate, baudrate) < rate_diff) {
+                       goodrate = hsu_rate;
+                       rate_diff = serial_abs(comprate,baudrate);
+               }
+
+               hsu_rate++;
+       }
+       if (hsu_rate > 0xFF)
+               hsu_rate = 0xFF;
+
+       /* Save computed divider */
+       *xdiv = goodrate;
+}
+
+void serial_setbrg (void)
+{
+       unsigned int xdiv, ydiv;
+       unsigned int divider;
+       UART_REGS_T *puregs = (UART_REGS_T *) CFG_UART_SEL;
+       HSUART_REGS_T *phsuregs = (HSUART_REGS_T *) CFG_UART_SEL;
+
+       if (CFG_UART_SEL == UART1) {
+               /* Find closest high speed baud rate for desired clock frequency */
+               hsuart_getdiv(gd->baudrate, &divider);
+               phsuregs->rate = divider;
+
+               // Disable flow control
+               phsuregs->ctrl &= ~((1<<14)|(1<<18));
+       } else {
+               /* Find closest baud rate for desired clock frequency */
+               serial_getdiv(gd->baudrate, &xdiv, &ydiv);
+
+               /* Set clock x/y divider for the UART */
+               if (puregs == UART3)
+               {
+                       CLKPWR->clkpwr_uart3_clk_ctrl =
+                       CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+               }
+               else if (puregs == UART4)
+               {
+                       CLKPWR->clkpwr_uart4_clk_ctrl =
+                       CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+               }
+               else if (puregs == UART5)
+               {
+                       CLKPWR->clkpwr_uart5_clk_ctrl =
+                       CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+               }
+               else if (puregs == UART6)
+               {
+                       CLKPWR->clkpwr_uart6_clk_ctrl =
+                       CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+               }
+       }
+}
+
+/*
+ * Initialise the serial port with the given baudrate. The settings
+ * are always 8 data bits, no parity, 1 stop bit, no start bits.
+ *
+ */
+int serial_init (void)
+{
+       volatile unsigned int tmp32;
+       int unum;
+       UART_REGS_T *puregs = (UART_REGS_T *) CFG_UART_SEL;
+       HSUART_REGS_T *phsuregs = (HSUART_REGS_T *) CFG_UART_SEL;
+
+       /* UART setup */
+       if (phsuregs == UART1) {
+               /* set baudrate */
+               serial_setbrg();
+
+               /* By default, HSUART is set to loopback mode in S1L.
+                * Disable loopback to work */
+               UARTCNTL->loop &= ~_BIT(0);
+
+               /* setup the buffers */
+               phsuregs->ctrl = ((2<<19) /*HSU_HRTS_TRIG_32B*/ |
+                                                                                       (3<<16) /* HSU_TMO_INACT_16B*/ |
+                                                                                       (0x14<<9) /* HSU_OFFSET(0x14)*/ |
+                                                                                       (4<<2) /* HSU_RX_TL32B */ |
+                                                                                       (0<<0) /* HSU_TX_TL0B */);
+       } else {
+               /* Enable UART system clock */
+               if (puregs == UART3)
+               {
+                       CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART3_EN;
+                       unum = 3;
+               }
+               else if (puregs == UART4)
+               {
+                       CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART4_EN;
+                       unum = 4;
+               }
+               else if (puregs == UART5)
+               {
+                       CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART5_EN;
+                       unum = 5;
+               }
+               else if (puregs == UART6)
+               {
+                       CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART6_EN;
+                       unum = 6;
+               }
+
+               /* Place UART in autoclock mode */
+               tmp32 = UARTCNTL->clkmode & UART_CLKMODE_MASK(unum);
+               UARTCNTL->clkmode = (tmp32 |
+               UART_CLKMODE_LOAD(UART_CLKMODE_AUTO, (unum)));
+
+               /* UART baud rate generator isn't used, so just set it to divider
+                               by 1 */
+               puregs->lcr |= UART_LCR_DIVLATCH_EN;
+               puregs->dll_fifo = 1;
+               puregs->dlm_ier = 0;
+               puregs->lcr &= ~UART_LCR_DIVLATCH_EN;
+
+               /* Setup default UART state for N81 with FIFO mode */
+               puregs->lcr = UART_LCR_WLEN_8BITS;
+
+               /* set baudrate */
+               serial_setbrg();
+
+               /* Clear FIFOs and set FIFO level */
+               puregs->iir_fcr = (UART_FCR_RXFIFO_TL16 |
+                                                                                       UART_FCR_TXFIFO_TL0 | UART_FCR_FIFO_CTRL |
+                                                                                       UART_FCR_FIFO_EN | UART_FCR_TXFIFO_FLUSH |
+                                                                                       UART_FCR_RXFIFO_FLUSH);
+               tmp32 = puregs->iir_fcr;
+               tmp32 = puregs->lsr;
+
+               /* Use automatic clocking */
+               //      tmp32 = UARTCNTL->clkmode & UART_CLKMODE_MASK(unum + 3);
+               //      UARTCNTL->clkmode = tmp32 | UART_CLKMODE_LOAD(
+               //              UART_CLKMODE_AUTO, (unum + 3));  // TBD delete me
+       }
+
+       return 0;
+}
+
+/*
+ * Read a single byte from the serial port.
+ */
+int serial_getc (void)
+{
+       HSUART_REGS_T *phsuregs = (HSUART_REGS_T *) CFG_UART_SEL;
+       UART_REGS_T *puregs = (UART_REGS_T *) CFG_UART_SEL;
+
+       if (phsuregs == UART1) {
+               // Wait for a character to come in
+               while ((phsuregs->level & 0xFF) == 0)
+               {}
+               // Send the received character back
+               return ((unsigned char)(phsuregs->txrx_fifo));
+       } else {
+               /* Wait for a character from the UART */
+               while ((puregs->lsr & UART_LSR_RDR) == 0);
+
+               return (int) (puregs->dll_fifo & 0xFF);
+       }
+}
+
+/*
+ * Output a single byte to the serial port.
+ */
+void serial_putc (const char c)
+{
+       HSUART_REGS_T *phsuregs = (HSUART_REGS_T *) CFG_UART_SEL;
+       UART_REGS_T *puregs = (UART_REGS_T *) CFG_UART_SEL;
+
+       if (phsuregs == UART1) {
+               // Send out the character
+               phsuregs->txrx_fifo = c;
+
+               // Wait for character to be sent (goes from non-zero to 0)
+               while ((phsuregs->level & 0xFF00) != 0);
+       } else {
+               /* Wait for FIFO to become empty */
+               while ((puregs->lsr & UART_LSR_THRE) == 0);
+
+               puregs->dll_fifo = (u32) c;
+       }
+
+       /* If \n, also do \r */
+       if (c == '\n')
+       {
+               serial_putc ('\r');
+       }
+}
+
+/*
+ * Test whether a character is in the RX buffer
+ */
+int serial_tstc (void)
+{
+       HSUART_REGS_T *phsuregs = (HSUART_REGS_T *) CFG_UART_SEL;
+       UART_REGS_T *puregs = (UART_REGS_T *) CFG_UART_SEL;
+
+       if (phsuregs == UART1) {
+               /* Wait for a character from the UART */
+               if ((phsuregs->level & 0xFF) == 0)
+               {
+                       // No characters waiting
+                       return 0;
+               }
+       } else {
+               /* Wait for a character from the UART */
+               if ((puregs->lsr & UART_LSR_RDR) == 0)
+               {
+                       return 0;
+               }
+       }
+
+       // Got here, must be a character waiting
+       return 1;
+}
+
+#else
+void serial_setbrg (void)
+{
+       unsigned int xdiv, ydiv;
+
+       /* Find closest baud rate for desired clock frequency */
+       serial_getdiv(gd->baudrate, &xdiv, &ydiv);
+
+       /* Set clock x/y divider for the UART */
+       if (CFG_UART_SEL == UART3)
+       {
+               CLKPWR->clkpwr_uart3_clk_ctrl =
+                       CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+       }
+       else if (CFG_UART_SEL == UART4)
+       {
+               CLKPWR->clkpwr_uart4_clk_ctrl =
+                       CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+       }
+       else if (CFG_UART_SEL == UART5)
+       {
+               CLKPWR->clkpwr_uart5_clk_ctrl =
+                       CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+       }
+       else if (CFG_UART_SEL == UART6)
+       {
+               CLKPWR->clkpwr_uart6_clk_ctrl =
+                       CLKPWR_UART_X_DIV(xdiv) | CLKPWR_UART_Y_DIV(ydiv);
+       }
+}
+
+/*
+ * Initialise the serial port with the given baudrate. The settings
+ * are always 8 data bits, no parity, 1 stop bit, no start bits.
+ *
+ */
+int serial_init (void)
+{
+       volatile unsigned int tmp32;
+       int unum;
+       UART_REGS_T *puregs = (UART_REGS_T *) CFG_UART_SEL;
+
+       /* UART setup */
+
+       /* Enable UART system clock */
+       if (puregs == UART3)
+       {
+               CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART3_EN;
+               unum = 3;
+       }
+       else if (puregs == UART4)
+       {
+               CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART4_EN;
+               unum = 4;
+       }
+       else if (puregs == UART5)
+       {
+               CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART5_EN;
+               unum = 5;
+       }
+       else if (puregs == UART6)
+       {
+               CLKPWR->clkpwr_uart_clk_ctrl |= CLKPWR_UARTCLKCTRL_UART6_EN;
+               unum = 6;
+       }
+
+       /* Place UART in autoclock mode */
+       tmp32 = UARTCNTL->clkmode & ~UART_CLKMODE_MASK(unum);
+       UARTCNTL->clkmode = (tmp32 |
+               UART_CLKMODE_LOAD(UART_CLKMODE_AUTO, (unum)));
+
+       /* UART baud rate generator isn't used, so just set it to divider
+          by 1 */
+       puregs->lcr |= UART_LCR_DIVLATCH_EN;
+       puregs->dll_fifo = 1;
+       puregs->dlm_ier = 0;
+       puregs->lcr &= ~UART_LCR_DIVLATCH_EN;
+
+       /* Setup default UART state for N81 with FIFO mode */
+       puregs->lcr = UART_LCR_WLEN_8BITS;
+
+       /* set baudrate */
+       serial_setbrg();
+
+       /* Clear FIFOs and set FIFO level */
+       puregs->iir_fcr = (UART_FCR_RXFIFO_TL16 |
+                                                                               UART_FCR_TXFIFO_TL0 | UART_FCR_FIFO_CTRL |
+                                                                               UART_FCR_FIFO_EN | UART_FCR_TXFIFO_FLUSH |
+                                                                               UART_FCR_RXFIFO_FLUSH);
+       tmp32 = puregs->iir_fcr;
+       tmp32 = puregs->lsr;
+
+       /* Use automatic clocking */
+       //      tmp32 = UARTCNTL->clkmode & UART_CLKMODE_MASK(unum + 3);
+       //      UARTCNTL->clkmode = tmp32 | UART_CLKMODE_LOAD(
+       //              UART_CLKMODE_AUTO, (unum + 3));  // TBD delete me
+
+       return 0;
+}
+
+/*
+ * Read a single byte from the serial port.
+ */
+int serial_getc (void)
+{
+       /* Wait for a character from the UART */
+       while ((CFG_UART_SEL->lsr & UART_LSR_RDR) == 0);
+
+       return (int) (CFG_UART_SEL->dll_fifo & 0xFF);
+}
+
+/*
+ * Output a single byte to the serial port.
+ */
+void serial_putc (const char c)
+{
+       /* Wait for FIFO to become empty */
+       while ((CFG_UART_SEL->lsr & UART_LSR_THRE) == 0);
+
+       CFG_UART_SEL->dll_fifo = (u32) c;
+
+       /* If \n, also do \r */
+       if (c == '\n')
+       {
+               serial_putc ('\r');
+       }
+}
+
+/*
+ * Test whether a character is in the RX buffer
+ */
+int serial_tstc (void)
+{
+       /* Wait for a character from the UART */
+       if ((CFG_UART_SEL->lsr & UART_LSR_RDR) == 0)
+       {
+               return 0;
+       }
+
+       return 1;
+}
+#endif
+
+/*
+ * Put a string to the UART
+ */
+void serial_puts (const char *s)
+{
+       while (*s)
+       {
+               serial_putc (*s++);
+       }
+}
+
index 5d864b5..28c2722 100644 (file)
@@ -26,6 +26,7 @@ include $(TOPDIR)/config.mk
 LIB    := $(obj)libdma.o
 
 COBJS-$(CONFIG_FSLDMAFEC) += MCD_tasksInit.o MCD_dmaApi.o MCD_tasks.o
+COBJS-$(CONFIG_SYS_LPC32XX_DMA) += lpc32xx_dma.o
 COBJS-$(CONFIG_APBH_DMA) += apbh_dma.o
 COBJS-$(CONFIG_FSL_DMA) += fsl_dma.o
 COBJS-$(CONFIG_OMAP3_DMA) += omap3_dma.o
diff --git a/drivers/dma/lpc32xx_dma.c b/drivers/dma/lpc32xx_dma.c
new file mode 100644 (file)
index 0000000..5d9421d
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ * 
+ * @Author: Kevin Wells
+ * @Descr: LPC3250 DMA controller interface support functions
+ *  
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *  
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *  
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <lpc3250.h>
+#include <asm/io.h>
+
+
+/* Some optimization stuff */
+#ifndef unlikely
+#define likely(x)      __builtin_expect(!!(x), 1)
+#define unlikely(x)    __builtin_expect(!!(x), 0)
+#endif
+
+#define DMA_CLK_ENABLE      1
+/**********************************************************************
+* DMA controller register structures
+**********************************************************************/
+static uint32_t alloc_ch;
+
+int lpc32xx_dma_get_channel(void)
+{
+       int i;
+       uint32_t status = 0;
+
+       if (!alloc_ch) { /* First time caller */
+               CLKPWR->clkpwr_dmaclk_ctrl |= DMA_CLK_ENABLE;
+               /* Make sure DMA controller and all channels are disabled.
+               *        Controller is in little-endian mode. Disable sync signals */
+               dma_base->config = 0;
+               dma_base->sync = 0;
+
+               /* Clear interrupt and error statuses */
+               dma_base->int_tc_clear = 0xFF;
+               dma_base->raw_tc_stat = 0xFF;
+               dma_base->int_err_clear = 0xFF;
+               dma_base->raw_err_stat = 0xFF;
+
+               /* Enable DMA controller */
+               dma_base->config = DMAC_CTRL_ENABLE;
+       }
+
+       for (i = 0; i < DMA_NO_OF_CHANNELS && (status & _BIT(i)); i++)
+              ;
+
+       /* Check if all the available channles are busy */
+       if (unlikely(i == DMA_NO_OF_CHANNELS)) return -1;
+       alloc_ch |= _BIT(i);
+       return i;
+}
+
+int lpc32xx_dma_start_xfer(int channel, const dmac_ll_t *desc, uint32_t config)
+{
+       if (unlikely((_BIT(channel) & alloc_ch) == 0)) {
+               printf ("ERR: Request for xfer on "
+                      "unallocated channel %d\r\n", channel);
+               BUG();
+       }
+       dma_base->int_tc_clear = _BIT(channel);
+       dma_base->int_err_clear = _BIT(channel);
+       dma_base->dma_chan[channel].src_addr = desc->dma_src;
+       dma_base->dma_chan[channel].dest_addr = desc->dma_dest;
+       dma_base->dma_chan[channel].lli = desc->next_lli;
+       dma_base->dma_chan[channel].control = desc->next_ctrl;
+       dma_base->dma_chan[channel].config_ch = config;
+
+       return 0;
+}
+
+int lpc32xx_dma_wait_status(int channel)
+{
+       while((
+             (dma_base->raw_tc_stat | dma_base->raw_err_stat) &
+             _BIT(channel)) == 0
+            ) ;
+
+       if (unlikely(dma_base->raw_err_stat & _BIT(channel))) {
+               dma_base->int_err_clear |= _BIT(channel);
+               dma_base->raw_err_stat |= _BIT(channel);
+               return -1;
+       }
+       dma_base->int_tc_clear |= _BIT(channel);
+       dma_base->raw_tc_stat |= _BIT(channel);
+       return 0;
+}
+
+void lpc32xx_dma_put_channel(int channel)
+{
+       /* Check if given channel no is valid */
+       if (channel >= DMA_NO_OF_CHANNELS || channel < 0)
+               return ;
+       alloc_ch &= ~_BIT(channel);
+
+       /* Shut down channel */
+       dma_base->dma_chan [channel].control = 0;
+       dma_base->dma_chan [channel].config_ch = 0;
+       dma_base->sync &= ~_BIT(channel);
+
+       if (!alloc_ch) {
+               /* Disable DMA controller */
+               dma_base->config &= ~DMAC_CTRL_ENABLE;
+
+               /* If all channels are free disable the clock */
+               CLKPWR->clkpwr_dmaclk_ctrl &= ~DMA_CLK_ENABLE;
+       }
+}
+
index 36ee454..f32adf8 100644 (file)
@@ -62,6 +62,7 @@ COBJS-$(CONFIG_NAND_S3C64XX) += s3c64xx.o
 COBJS-$(CONFIG_NAND_SPEAR) += spr_nand.o
 COBJS-$(CONFIG_NAND_OMAP_GPMC) += omap_gpmc.o
 COBJS-$(CONFIG_NAND_PLAT) += nand_plat.o
+COBJS-$(CONFIG_SYS_LPC32XX_NAND) += lpc32xx_nand.o
 endif
 
 COBJS  := $(COBJS-y)
diff --git a/drivers/mtd/nand/lpc32xx_nand.c b/drivers/mtd/nand/lpc32xx_nand.c
new file mode 100644 (file)
index 0000000..e6821eb
--- /dev/null
@@ -0,0 +1,402 @@
+/*
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC3250 SLC NAND controller interface support functions
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include "lpc3250.h"
+#include <nand.h>
+#include <asm/errno.h>
+#include <asm/io.h>
+
+#define        NAND_ALE_OFFS   4
+#define        NAND_CLE_OFFS   8
+
+#define NAND_LARGE_BLOCK_PAGE_SIZE     2048
+#define NAND_SMALL_BLOCK_PAGE_SIZE     512
+
+static struct nand_ecclayout lpc32xx_nand_oob_16 = {
+        .eccbytes = 6,
+        .eccpos = {10, 11, 12, 13, 14, 15},
+        .oobfree = {
+                {.offset = 0,
+                 . length = 4},
+                {.offset = 6,
+                 . length = 4}
+               }
+};
+
+extern int nand_correct_data(struct mtd_info *mtd, u_char *dat,
+                             u_char *read_ecc, u_char *calc_ecc);
+/*
+ * DMA Descriptors
+ * For Large Block: 17 descriptors = ((16 Data and ECC Read) + 1 Spare Area)
+ * For Small Block: 5 descriptors = ((4 Data and ECC Read) + 1 Spare Area)
+ */
+static dmac_ll_t dmalist[(CONFIG_SYS_NAND_ECCSIZE/256) * 2 + 1];
+static uint32_t ecc_buffer[8]; /* MAX ECC size */
+static int dmachan = -1;
+#define XFER_PENDING ((SLCNAND->slc_stat & SLCSTAT_DMA_FIFO) | SLCNAND->slc_tc)
+
+static void lpc32xx_nand_init(void)
+{
+       /* Enable clocks to the SLC NAND controller */
+       CLKPWR->clkpwr_nand_clk_ctrl = (CLKPWR_NANDCLK_SEL_SLC |
+                                       CLKPWR_NANDCLK_SLCCLK_EN);
+
+        /* Reset SLC NAND controller & clear ECC */
+        SLCNAND->slc_ctrl = (SLCCTRL_SW_RESET | SLCCTRL_ECC_CLEAR);
+
+        /* 8-bit bus, no DMA, CE normal */
+        SLCNAND->slc_cfg = 0;
+
+        /* Interrupts disabled and cleared */
+        SLCNAND->slc_ien = 0;
+        SLCNAND->slc_icr = (SLCSTAT_INT_TC | SLCSTAT_INT_RDY_EN);
+
+        SLCNAND->slc_tac = LPC32XX_SLC_NAND_TIMING;
+}
+
+static void lpc32xx_nand_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
+{
+       struct nand_chip *this = mtd->priv;
+       ulong  IO_ADDR_W;
+
+       if (ctrl & NAND_CTRL_CHANGE) {
+               IO_ADDR_W = (ulong) this->IO_ADDR_W;
+               IO_ADDR_W &= ~(NAND_CLE_OFFS | NAND_ALE_OFFS);
+
+               if ( ctrl & NAND_CLE ) {
+                       IO_ADDR_W |= NAND_CLE_OFFS;
+               }
+               else if ( ctrl & NAND_ALE ) {
+                       IO_ADDR_W |= NAND_ALE_OFFS;
+               }
+
+               if ( ctrl & NAND_NCE ) {
+                       SLCNAND->slc_cfg |= SLCCFG_CE_LOW;
+               }
+               else {
+                       SLCNAND->slc_cfg &= ~SLCCFG_CE_LOW;
+               }
+
+               this->IO_ADDR_W = (void *) IO_ADDR_W;
+       }
+
+       if (cmd != NAND_CMD_NONE) {
+               writel(cmd, this->IO_ADDR_W);
+       }
+}
+
+static int lpc32xx_nand_ready(struct mtd_info *mtd)
+{
+       /* Check the SLC NAND controller status */
+       return (SLCNAND->slc_stat & SLCSTAT_NAND_READY);
+}
+
+static u_char lpc32xx_read_byte(struct mtd_info *mtd)
+{
+       struct nand_chip *this = mtd->priv;
+       unsigned long *pReg = (unsigned long *) this->IO_ADDR_R;
+       volatile unsigned long tmp32;
+       tmp32 = *pReg;
+       return (u_char) tmp32;
+}
+
+/*
+ * lpc32xx_verify_buf - [DEFAULT] Verify chip data against buffer
+ * mtd:        MTD device structure
+ * buf:        buffer containing the data to compare
+ * len:        number of bytes to compare
+ *
+ * Default verify function for 8bit buswith
+ */
+static int lpc32xx_verify_buf(struct mtd_info *mtd, const u_char *buf, int len)
+{
+       int i;
+       struct nand_chip *this = mtd->priv;
+       unsigned long *pReg = (unsigned long *) this->IO_ADDR_R;
+       volatile unsigned long tmp32;
+
+       for (i=0; i<len; i++) {
+               tmp32 = *pReg;
+               if (buf[i] != (u_char) tmp32)
+                       return -EFAULT;
+       }
+       return 0;
+}
+
+/* Prepares DMA descriptors for NAND RD/WR operations */
+/* If the size is < 256 Bytes then it is assumed to be
+ * an OOB transfer */
+static void lpc32xx_nand_dma_configure(struct nand_chip *chip,
+               const void * buffer, int size, int read)
+{
+       uint32_t i, dmasrc, ctrl, ecc_ctrl, oob_ctrl, dmadst;
+       void __iomem * base = chip->IO_ADDR_R;
+       uint32_t *ecc_gen = ecc_buffer;
+
+       /*
+        * CTRL descriptor entry for reading ECC
+        * Copy Multiple times to sync DMA with Flash Controller
+        */
+       ecc_ctrl =  (0x5 |
+                       DMAC_CHAN_SRC_BURST_1 |
+                       DMAC_CHAN_DEST_BURST_1 |
+                       DMAC_CHAN_SRC_WIDTH_32 |
+                       DMAC_CHAN_DEST_WIDTH_32 |
+                       DMAC_CHAN_DEST_AHB1);
+
+       /* CTRL descriptor entry for reading/writing Data */
+       ctrl =  64 | /* 256/4 */
+                       DMAC_CHAN_SRC_BURST_4 |
+                       DMAC_CHAN_DEST_BURST_4 |
+                       DMAC_CHAN_SRC_WIDTH_32 |
+                       DMAC_CHAN_DEST_WIDTH_32 |
+                       DMAC_CHAN_DEST_AHB1;
+
+       /* CTRL descriptor entry for reading/writing Spare Area */
+       oob_ctrl =  ((CONFIG_SYS_NAND_OOBSIZE / 4) |
+                       DMAC_CHAN_SRC_BURST_4 |
+                       DMAC_CHAN_DEST_BURST_4 |
+                       DMAC_CHAN_SRC_WIDTH_32 |
+                       DMAC_CHAN_DEST_WIDTH_32 |
+                       DMAC_CHAN_DEST_AHB1);
+
+       if (read) {
+               dmasrc = (uint32_t) (base + offsetof(SLCNAND_REGS_T, slc_dma_data));
+               dmadst = (uint32_t) (buffer);
+               ctrl |= DMAC_CHAN_DEST_AUTOINC;
+       } else {
+               dmadst = (uint32_t) (base + offsetof(SLCNAND_REGS_T, slc_dma_data));
+               dmasrc = (uint32_t) (buffer);
+               ctrl |= DMAC_CHAN_SRC_AUTOINC;
+       }
+
+       /*
+        * Write Operation Sequence for Small Block NAND
+        * ----------------------------------------------------------
+        * 1. X'fer 256 bytes of data from Memory to Flash.
+        * 2. Copy generated ECC data from Register to Spare Area
+        * 3. X'fer next 256 bytes of data from Memory to Flash.
+        * 4. Copy generated ECC data from Register to Spare Area.
+        * 5. X'fer 16 byets of Spare area from Memory to Flash.
+        * Read Operation Sequence for Small Block NAND
+        * ----------------------------------------------------------
+        * 1. X'fer 256 bytes of data from Flash to Memory.
+        * 2. Copy generated ECC data from Register to ECC calc Buffer.
+        * 3. X'fer next 256 bytes of data from Flash to Memory.
+        * 4. Copy generated ECC data from Register to ECC calc Buffer.
+        * 5. X'fer 16 bytes of Spare area from Flash to Memory.
+        * Write Operation Sequence for Large Block NAND
+        * ----------------------------------------------------------
+        * 1. Steps(1-4) of Write Operations repeate for four times
+        * which generates 16 DMA descriptors to X'fer 2048 bytes of
+        * data & 32 bytes of ECC data.
+        * 2. X'fer 64 bytes of Spare area from Memory to Flash.
+        * Read Operation Sequence for Large Block NAND
+        * ----------------------------------------------------------
+        * 1. Steps(1-4) of Read Operations repeate for four times
+        * which generates 16 DMA descriptors to X'fer 2048 bytes of
+        * data & 32 bytes of ECC data.
+        * 2. X'fer 64 bytes of Spare area from Flash to Memory.
+        */
+
+       for (i = 0; i < size/256; i++) {
+               dmalist[i*2].dma_src = (read ?(dmasrc) :(dmasrc + (i*256)));
+               dmalist[i*2].dma_dest = (read ?(dmadst + (i*256)) :dmadst);
+               dmalist[i*2].next_lli = (uint32_t) & dmalist[(i*2)+1];
+               dmalist[i*2].next_ctrl = ctrl;
+
+               dmalist[(i*2) + 1].dma_src = (uint32_t)
+                       (base + offsetof(SLCNAND_REGS_T, slc_ecc));
+               dmalist[(i*2) + 1].dma_dest =  (uint32_t) & ecc_gen[i];
+               dmalist[(i*2) + 1].next_lli = (uint32_t) & dmalist[(i*2)+2];
+               dmalist[(i*2) + 1].next_ctrl = ecc_ctrl;
+       }
+
+       if (i) { /* Data only transfer */
+               dmalist[(i*2) - 1].next_lli = 0;
+               dmalist[(i*2) - 1].next_ctrl |= DMAC_CHAN_INT_TC_EN;
+               return ;
+       }
+
+       /* OOB only transfer */
+       if (read) {
+               dmasrc = (uint32_t) (base + offsetof(SLCNAND_REGS_T, slc_dma_data));
+               dmadst = (uint32_t) (buffer);
+               oob_ctrl |= DMAC_CHAN_DEST_AUTOINC;
+       } else {
+               dmadst = (uint32_t) (base + offsetof(SLCNAND_REGS_T, slc_dma_data));
+               dmasrc = (uint32_t) (buffer);
+               oob_ctrl |= DMAC_CHAN_SRC_AUTOINC;
+       }
+
+       /* Read/ Write Spare Area Data To/From Flash */
+       dmalist[i*2].dma_src = dmasrc;
+       dmalist[i*2].dma_dest = dmadst;
+       dmalist[i*2].next_lli = 0;
+       dmalist[i*2].next_ctrl = (oob_ctrl | DMAC_CHAN_INT_TC_EN);
+}
+
+static void lpc32xx_nand_xfer(struct mtd_info *mtd, const u_char *buf, int len, int read)
+{
+       struct nand_chip *chip = mtd->priv;
+       uint32_t config;
+
+       /* DMA Channel Configuration */
+       config = (read ? DMAC_CHAN_FLOW_D_P2M : DMAC_CHAN_FLOW_D_M2P) |
+               (read ? DMAC_DEST_PERIP(0) : DMAC_DEST_PERIP(DMA_PERID_NAND1)) |
+               (read ? DMAC_SRC_PERIP(DMA_PERID_NAND1) : DMAC_SRC_PERIP(0)) |
+               DMAC_CHAN_ENABLE;
+
+       /* Prepare DMA descriptors */
+       lpc32xx_nand_dma_configure(chip, buf, len, read);
+
+       /* Setup SLC controller and start transfer */
+       if (read)
+               SLCNAND->slc_cfg |= SLCCFG_DMA_DIR;
+       else  /* NAND_ECC_WRITE */
+               SLCNAND->slc_cfg &= ~SLCCFG_DMA_DIR;
+       SLCNAND->slc_cfg |= SLCCFG_DMA_BURST;
+
+       /* Write length for new transfers */
+       if (!XFER_PENDING)
+               SLCNAND->slc_tc = len +
+                       (len != mtd->oobsize ? mtd->oobsize : 0);
+
+       SLCNAND->slc_ctrl |= SLCCTRL_DMA_START;
+
+       /* Start DMA transfers */
+       lpc32xx_dma_start_xfer(dmachan, dmalist, config);
+
+       /* Wait for NAND to be ready */
+       while(!lpc32xx_nand_ready(mtd));
+
+       /* Wait till DMA transfer is DONE */
+       if (lpc32xx_dma_wait_status(dmachan)) {
+               printk(KERN_ERR "NAND DMA transfer error!\r\n");
+       }
+
+       /* Stop DMA & HW ECC */
+       SLCNAND->slc_ctrl &= ~SLCCTRL_DMA_START;
+       SLCNAND->slc_cfg &= ~(SLCCFG_DMA_DIR | SLCCFG_DMA_BURST |
+                               SLCCFG_ECC_EN | SLCCFG_DMA_ECC);
+}
+
+static uint32_t slc_ecc_copy_to_buffer(uint8_t * spare,
+               const uint32_t * ecc, int count)
+{
+       int i;
+       for (i = 0; i < (count * 3); i += 3) {
+               uint32_t ce = ecc[i/3];
+               ce = ~(ce << 2) & 0xFFFFFF;
+               spare[i+2] = (uint8_t)(ce & 0xFF); ce >>= 8;
+               spare[i+1] = (uint8_t)(ce & 0xFF); ce >>= 8;
+               spare[i]   = (uint8_t)(ce & 0xFF);
+       }
+       return 0;
+}
+
+static int lpc32xx_ecc_calculate(struct mtd_info *mtd, const uint8_t *dat,
+                                            uint8_t *ecc_code)
+{
+       return slc_ecc_copy_to_buffer(ecc_code, ecc_buffer,
+                       CONFIG_SYS_NAND_ECCSIZE == NAND_LARGE_BLOCK_PAGE_SIZE ? 8 : 2);
+}
+
+/*
+ * Enables and prepares SLC NAND controller
+ * for doing data transfers with H/W ECC enabled.
+ */
+static void lpc32xx_hwecc_enable(struct mtd_info *mtd, int mode)
+{
+       /* Clear ECC */
+       SLCNAND->slc_ctrl = SLCCTRL_ECC_CLEAR;
+
+       /* Setup SLC controller for H/W ECC operations */
+       SLCNAND->slc_cfg |= (SLCCFG_ECC_EN | SLCCFG_DMA_ECC);
+}
+
+/*
+ * lpc32xx_write_buf - [DEFAULT] write buffer to chip
+ * mtd:        MTD device structure
+ * buf:        data buffer
+ * len:        number of bytes to write
+ *
+ * Default write function for 8bit buswith
+ */
+static void lpc32xx_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
+{
+       lpc32xx_nand_xfer(mtd, buf, len, 0);
+}
+
+/*
+ * lpc32xx_read_buf - [DEFAULT] read chip data into buffer
+ * mtd:        MTD device structure
+ * buf:        buffer to store date
+ * len:        number of bytes to read
+ *
+ * Default read function for 8bit buswith
+ */
+static void lpc32xx_read_buf(struct mtd_info *mtd, u_char *buf, int len)
+{
+       lpc32xx_nand_xfer(mtd, buf, len, 1);
+}
+
+int board_nand_init(struct nand_chip *nand)
+{
+       /* Initial NAND interface */
+       lpc32xx_nand_init();
+
+       /* Acquire a channel for our use */
+       dmachan = lpc32xx_dma_get_channel();
+       if (unlikely(dmachan < 0)){
+               printk(KERN_INFO "Unable to get a free DMA "
+                               "channel for NAND transfers\r\n");
+               return -1;
+       }
+
+       /* ECC mode and size */
+       nand->ecc.mode = NAND_ECC_HW;
+       nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;
+       nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;
+
+       if(CONFIG_SYS_NAND_ECCSIZE != NAND_LARGE_BLOCK_PAGE_SIZE)
+               nand->ecc.layout = &lpc32xx_nand_oob_16;
+
+       nand->ecc.calculate = lpc32xx_ecc_calculate;
+       nand->ecc.correct = nand_correct_data;
+       nand->ecc.hwctl = lpc32xx_hwecc_enable;
+       nand->cmd_ctrl = lpc32xx_nand_hwcontrol;
+       nand->dev_ready = lpc32xx_nand_ready;
+       nand->chip_delay = 2000;
+
+       nand->read_buf = lpc32xx_read_buf;
+       nand->write_buf = lpc32xx_write_buf;
+       nand->read_byte = lpc32xx_read_byte;
+       nand->verify_buf = lpc32xx_verify_buf;
+
+       return 0;
+}
diff --git a/include/configs/ea3250.h b/include/configs/ea3250.h
new file mode 100644 (file)
index 0000000..0b47bfe
--- /dev/null
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2009 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: Phytec 3250 board configuration file
+ *
+ * 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
+ */
+
+/*
+ * Embedded Artists  LPC3250 OEM Board configuation data
+ */
+
+#ifndef __EA3250_H__
+#define __EA3250_H__
+
+/*
+ * Ethernet buffer support in uncached IRAM and buffer size
+ */
+#define USE_IRAM_FOR_ETH_BUFFERS
+#define IRAM_ETH_BUFF_BASE 0x08010000 /* Uncached IRAM */
+#define IRAM_ETH_BUFF_SIZE 0x00010000
+
+/*
+ * Linux machine type
+ */
+#define MACH_TYPE_EA3250 (2512)
+#define MACH_TYPE_UBOOTSYS MACH_TYPE_EA3250
+
+/*
+ * System UART selection, valid selections include UART3, UART4,
+ * UART5, and UART6
+ */
+#define CFG_UART_SEL UART5
+
+/*
+ * SDRAM physical Memory Map
+ */
+#define CONFIG_NR_DRAM_BANKS    1
+#define PHYS_SDRAM_1           0x80000000 /* SDRAM Bank #1 */
+
+/*
+ * NOR FLASH not supported
+ */
+#define CONFIG_SYS_NO_FLASH
+#undef CONFIG_ENV_IS_IN_FLASH
+
+/*
+ * 1KHz clock tick
+ */
+#define CONFIG_SYS_HZ          1000
+
+/*
+ * ARM926ejs options
+ */
+#define CONFIG_ARM926EJS          1 /* This is an arm926ejs CPU core  */
+
+/*
+ *
+ * u-boot specific options
+ *
+ */
+
+/*
+ * Address and size of Environment Data
+ */
+#define CONFIG_ENV_IS_IN_NAND  1
+#define CONFIG_ENV_SIZE                0x40000    /* 2 blocks */
+#define CONFIG_ENV_OFFSET      0x100000   /* Blocks 8/9  */
+#define CONFIG_ENV_ADDR                0x80000100 /* Passed to kernel here */
+
+/*
+ * Area and size for malloc
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 128 * 1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128
+
+/*
+ * Stack sizes
+ *
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (32*1024) /* 32K stack */
+
+/*
+ * ATAG support
+ */
+#define CONFIG_CMDLINE_TAG             1
+#define CONFIG_SETUP_MEMORY_TAGS       1
+#define CONFIG_INITRD_TAG              1
+
+/*
+ * Default baud rate and baud rate table, console config
+ */
+#define CONFIG_CONS_INDEX         1
+#define CONFIG_BAUDRATE                115200
+#define CONFIG_SYS_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * Default load address for programs
+ */
+#define CONFIG_SYS_LOAD_ADDR   0x80100000 /* default load address */
+
+/*
+ * Default boot delay is 3 seconds
+ */
+#define CONFIG_BOOTDELAY 3
+#define CONFIG_ZERO_BOOTDELAY_CHECK    /* check for keypress on bootdelay==0 */
+
+/*
+ * Interrupts are not supported in this boot loader
+ */
+#undef CONFIG_USE_IRQ
+
+/*
+ * Use verbose help
+ */
+#define CONFIG_SYS_LONGHELP
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_ECHO /* ECHO command */
+#define CONFIG_CMD_CACHE /* Cache support */
+#define CONFIG_CMD_RUN
+#define CONFIG_CMD_LOADB
+#define CONFIG_CMD_LOADS
+#define CONFIG_CMD_SAVES
+#define CONFIG_CMD_MEMORY
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_BDI
+#define CONFIG_CMD_SAVEENV
+#define CONFIG_CMD_ELF
+#define CONFIG_CMD_FAT
+#undef CONFIG_CMD_MISC
+
+/*
+ * USB Host (OHCI) Support
+ */
+#define CONFIG_CMD_USB
+#define CONFIG_USB_OHCI_NEW 1
+#define LITTLEENDIAN
+#define CONFIG_SYS_USB_OHCI_REGS_BASE 0x31020000
+#define CONFIG_SYS_USB_OHCI_SLOT_NAME "lpc3250"
+#define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS 15
+#define CONFIG_USB_STORAGE 1
+#define CONFIG_SYS_USB_OHCI_BOARD_INIT
+
+#define CONFIG_DOS_PARTITION 1
+#define CONFIG_MAC_PARTITION 1
+
+
+/*
+ * Prompt, command buffer
+ */
+#define        CONFIG_SYS_CBSIZE               256             /* Console I/O Buffer Size      */
+#define        CONFIG_SYS_PROMPT       "uboot> "       /* Monitor Command Prompt       */
+#define        CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define        CONFIG_SYS_MAXARGS              16              /* max number of command args   */
+#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE       /* Boot Argument Buffer Size    */
+
+/*
+ * Default range for the memory tests
+ */
+#define CONFIG_SYS_MEMTEST_START 0x80010000
+#define CONFIG_SYS_MEMTEST_END 0x81000000
+
+/*
+ * Support for NAND FLASH, environment store in NAND at block 100
+ */
+#define CONFIG_CMD_NAND
+#define CONFIG_SYS_LPC32XX_NAND    /* Enable SLC NAND controller driver */
+#define CONFIG_SYS_MAX_NAND_DEVICE 1
+#define CONFIG_SYS_NAND_BASE 0x20020000 /* SLC NAND controller */
+#define CFG_ENV_IS_IN_NAND
+#define LPC32XX_SLC_NAND_TIMING (SLCTAC_WDR(14) | \
+                    SLCTAC_WWIDTH(5) | \
+                    SLCTAC_WHOLD(2) | \
+                    SLCTAC_WSETUP(1) | \
+                    SLCTAC_RDR(14) | \
+                    SLCTAC_RWIDTH(4) | \
+                    SLCTAC_RHOLD(2) | \
+                    SLCTAC_RSETUP(1))
+
+/*
+ * NAND H/W ECC specific settings
+ */
+#define CONFIG_SYS_LPC32XX_DMA            /* DMA support required */
+#define CONFIG_SYS_NAND_ECCSIZE      2048 /* ECC generated per page */
+#define CONFIG_SYS_NAND_ECCBYTES       24 /* 3 Bytes ECC per 256 Bytes */
+#define CONFIG_SYS_NAND_OOBSIZE        64 /* OOB size in bytes */
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Support for various capabilities
+ */
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+
+/*
+ * Network setup
+ */
+#define CONFIG_NETMASK         255.255.255.0
+#define CONFIG_IPADDR          192.168.1.101
+#define CONFIG_SERVERIP                192.168.1.41
+#define CONFIG_ETHADDR         00:1a:f1:00:00:00
+#define CONFIG_GATEWAYIP       192.168.1.1
+
+#define CONFIG_BOOTFILE                uImage
+#define CONFIG_LOADADDR                0x80100000
+#define CONFIG_ROOTPATH                /home/user/ltib/rootfs
+
+/* Boot arguments for JFFS2 root file system in NAND */
+#define MTDROOTCOMMAND "mtdboot="                              \
+       "setenv bootargs "                                      \
+       "console=ttyS0,115200n8 "                               \
+       "root=/dev/mtdblock3 rw rootfstype=jffs2 "              \
+       "ip=${ipaddr} ethaddr=${ethaddr}\0"
+
+/* Boot arguments for NFS based root file system */
+#define NFSROOTCOMMAND "nfsboot="                              \
+       "setenv bootargs "                                      \
+       "console=ttyS0,115200n8 "                               \
+       "root=/dev/nfs3 rw nfsroot=${serverip}:${rootpath} "    \
+       "ip=${ipaddr} ethaddr=${ethaddr}\0"
+
+/* Boot arguments for ramdisk image loaded via TFTP */
+#define RDROOTCOMMAND "ramdiskboot="                           \
+       "setenv bootargs "                                      \
+       "console=ttyS0,115200n8 "                               \
+       "root=/dev/ram0 rw "                                    \
+       "ip=${ipaddr} ethaddr=${ethaddr}\0"
+
+/* Kernel boot using tftp with static IP */
+#define TFTPSTATICIPKERNELBOOT "tftpstatickernel="             \
+       "tftpboot ${loadaddr} ${serverip}:${bootfile}\0"
+
+/* Kernel boot using tftp with DHCP obtained IP Address */
+#define TFTPDHCPKERNELBOOT "tftpdhcpkernel=dhcp\0"
+
+/*Kernel boot from NAND */
+#define MTDKERNELBOOT "mtdkernel=nboot.jffs2 ${loadaddr} "     \
+       "0 0x00140000\0"
+
+/* Command to burn kernel image into NAND FLASH */
+#define MTDKERNELBURN "mtdkernelburn="                         \
+       "nand erase 0x00140000 0x00400000;"                     \
+       "nand write.jffs2 ${loadaddr} 0x00140000 0x00400000\0"
+
+/* Root filesystem image name and load address */
+#define ROOTFSNAME "rootfile=rootfs.jffs2\0"
+#define ROOTFSLOADADDR "rootloadaddr=0x82000000\0"
+#define ROOTFSLOADSIZE "rootloadsize=0x01000000\0"
+
+/* Load JFFS2 root file system using TFTP with static IP */
+#define TFTPSTATICROOTFSLOAD "tftpstaticloadroot="             \
+       "tftpboot ${rootloadaddr} ${serverip}:${rootfile}\0"
+
+/* Load JFFS2 root file system using TFTP with DHCP */
+#define TFTPDHCPROOTFSLOAD "tftpdhcploadroot="                 \
+       "dhcp ${rootloadaddr} ${serverip}:${rootfile}\0"
+
+/* Command to load root file system into RAM (ramdisk) */
+#define RDROOTFSLOAD "ramdiskload="                            \
+       "nand read.jffs2 ${rootloadaddr} 0x00540000 "           \
+       "${rootloadsize}\0"
+
+/* Command to burn root file system image into NAND FLASH */
+#define MTDROOTBURN "mtdrootburn="                             \
+       "nand erase 0x00540000 0x07AC0000;"                     \
+       "nand write.jffs2 ${rootloadaddr} 0x00540000"           \
+       " ${rootloadsize}\0"
+
+/*
+ * Other preset environment variables and example bootargs string
+ */
+#define CONFIG_EXTRA_ENV_SETTINGS                              \
+       MTDROOTCOMMAND                                          \
+       NFSROOTCOMMAND                                          \
+       RDROOTCOMMAND                                           \
+       TFTPSTATICIPKERNELBOOT                                  \
+       TFTPDHCPKERNELBOOT                                      \
+       MTDKERNELBOOT                                           \
+       MTDKERNELBURN                                           \
+       ROOTFSNAME                                              \
+       ROOTFSLOADADDR                                          \
+       ROOTFSLOADSIZE                                          \
+       TFTPSTATICROOTFSLOAD                                    \
+       TFTPDHCPROOTFSLOAD                                      \
+       RDROOTFSLOAD                                            \
+       MTDROOTBURN
+
+/* Default boot command */
+#define CONFIG_BOOTCOMMAND                                     \
+       "run nfsboot;run tftpstatickernel; bootm ${loadaddr}"
+
+/*
+ * BOOTP options
+ */
+#define CONFIG_BOOTP_SUBNETMASK
+#define CONFIG_BOOTP_GATEWAY
+#define CONFIG_BOOTP_BOOTPATH
+#define CONFIG_BOOTP_HOSTNAME
+#define CONFIG_BOOTP_BOOTFILESIZE
+
+
+#endif  /* __EA3250_H__*/
+
diff --git a/include/configs/fdi3250.h b/include/configs/fdi3250.h
new file mode 100644 (file)
index 0000000..37ff45b
--- /dev/null
@@ -0,0 +1,313 @@
+/*
+ * Copyright (C) 2010 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * 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
+ */
+
+/*
+ * FDI LPC3250 Board configuation data
+ */
+
+#ifndef __FDI3250_H__
+#define __FDI3250_H__
+
+/*
+ * Ethernet buffer support in uncached IRAM and buffer size
+ */
+#define USE_IRAM_FOR_ETH_BUFFERS
+#define IRAM_ETH_BUFF_BASE 0x08010000 /* Uncached IRAM */
+#define IRAM_ETH_BUFF_SIZE 0x00010000
+
+/*
+ * Linux machine type
+ */
+#define MACH_TYPE_FDI3250 (2513)
+#define MACH_TYPE_UBOOTSYS MACH_TYPE_FDI3250
+
+/*
+ * System UART selection, valid selections include UART1 via UART7
+ */
+#define CFG_UART_SEL UART1
+#define USE_HIGH_SPEED_UART /* Only enable for 1, 2, or 7 */
+
+/*
+ * SDRAM physical Memory Map
+ */
+#define CONFIG_NR_DRAM_BANKS    1
+#define PHYS_SDRAM_1           0x80000000 /* SDRAM Bank #1 */
+
+/*
+ * NOR FLASH not supported
+ */
+#define CONFIG_SYS_NO_FLASH
+#undef CONFIG_ENV_IS_IN_FLASH
+
+/*
+ * 1KHz clock tick
+ */
+#define CONFIG_SYS_HZ          1000
+
+/*
+ * ARM926ejs options
+ */
+#define CONFIG_ARM926EJS          1 /* This is an arm926ejs CPU core  */
+
+/*
+ *
+ * u-boot specific options
+ *
+ */
+
+/*
+ * Address and size of Environment Data
+ */
+#define CONFIG_ENV_IS_IN_NAND  1
+#define CONFIG_ENV_SIZE                0x40000    /* 2 blocks */
+#define CONFIG_ENV_OFFSET      0x100000   /* Blocks 8/9 */
+#define CONFIG_ENV_ADDR                0x80000100 /* Passed to kernel here */
+
+/*
+ * Area and size for malloc
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 128 * 1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128
+
+/*
+ * Stack sizes
+ *
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (32*1024) /* 32K stack */
+
+/*
+ * ATAG support
+ */
+#define CONFIG_CMDLINE_TAG             1
+#define CONFIG_SETUP_MEMORY_TAGS       1
+#define CONFIG_INITRD_TAG              1
+
+/*
+ * Default baud rate and baud rate table, console config
+ */
+#define CONFIG_CONS_INDEX         1
+#define CONFIG_BAUDRATE                115200
+#define CONFIG_SYS_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * Default load address for programs
+ */
+#define CONFIG_SYS_LOAD_ADDR   0x80100000 /* default load address */
+
+/*
+ * Default boot delay is 3 seconds
+ */
+#define CONFIG_BOOTDELAY 3
+#define CONFIG_ZERO_BOOTDELAY_CHECK    /* check for keypress on bootdelay==0 */
+
+/*
+ * Interrupts are not supported in this boot loader
+ */
+#undef CONFIG_USE_IRQ
+
+/*
+ * Use verbose help
+ */
+#define CONFIG_SYS_LONGHELP
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_ECHO /* ECHO command */
+#define CONFIG_CMD_CACHE /* Cache support */
+#define CONFIG_CMD_RUN
+#define CONFIG_CMD_LOADB
+#define CONFIG_CMD_LOADS
+#define CONFIG_CMD_SAVES
+#define CONFIG_CMD_MEMORY
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_BDI
+#define CONFIG_CMD_SAVEENV
+#define CONFIG_CMD_ELF
+#define CONFIG_CMD_FAT
+#undef CONFIG_CMD_MISC
+
+/*
+ * Prompt, command buffer
+ */
+#define        CONFIG_SYS_CBSIZE               256             /* Console I/O Buffer Size      */
+#define        CONFIG_SYS_PROMPT       "uboot> "       /* Monitor Command Prompt       */
+#define        CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define        CONFIG_SYS_MAXARGS              16              /* max number of command args   */
+#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE       /* Boot Argument Buffer Size    */
+
+/*
+ * Default range for the memory tests
+ */
+#define CONFIG_SYS_MEMTEST_START 0x80010000
+#define CONFIG_SYS_MEMTEST_END 0x81000000
+
+/*
+ * Support for NAND FLASH, environment store in NAND at block 100
+ */
+#define CONFIG_CMD_NAND
+#define CONFIG_SYS_LPC32XX_NAND    /* Enable SLC NAND controller driver */
+#define CONFIG_SYS_MAX_NAND_DEVICE 1
+#define CONFIG_SYS_NAND_BASE 0x20020000 /* SLC NAND controller */
+#define CFG_ENV_IS_IN_NAND
+#define LPC32XX_SLC_NAND_TIMING (SLCTAC_WDR(14) | \
+                    SLCTAC_WWIDTH(5) | \
+                    SLCTAC_WHOLD(2) | \
+                    SLCTAC_WSETUP(1) | \
+                    SLCTAC_RDR(14) | \
+                    SLCTAC_RWIDTH(4) | \
+                    SLCTAC_RHOLD(2) | \
+                    SLCTAC_RSETUP(1))
+
+/*
+ * NAND H/W ECC specific settings
+ */
+#define CONFIG_SYS_LPC32XX_DMA            /* DMA support required */
+#define CONFIG_SYS_NAND_ECCSIZE      2048 /* ECC generated per page */
+#define CONFIG_SYS_NAND_ECCBYTES       24 /* 3 Bytes ECC per 256 Bytes */
+#define CONFIG_SYS_NAND_OOBSIZE        64 /* OOB size in bytes */
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Support for various capabilities
+ */
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+
+/*
+ * Network setup
+ */
+#define CONFIG_NETMASK         255.255.255.0
+#define CONFIG_IPADDR          192.168.1.101
+#define CONFIG_SERVERIP                192.168.1.41
+#define CONFIG_ETHADDR         00:1a:f1:00:00:00
+#define CONFIG_GATEWAYIP       192.168.1.1
+
+#define CONFIG_BOOTFILE                uImage
+#define CONFIG_LOADADDR                0x80100000
+#define CONFIG_ROOTPATH                /home/user/ltib/rootfs
+
+/* Boot arguments for JFFS2 root file system in NAND */
+#define MTDROOTCOMMAND "mtdboot="                              \
+       "setenv bootargs "                                      \
+       "console=ttyTX0,115200n8 "                              \
+       "root=/dev/mtdblock3 rw rootfstype=jffs2 "              \
+       "ip=${ipaddr} ethaddr=${ethaddr}\0"
+
+/* Boot arguments for NFS based root file system */
+#define NFSROOTCOMMAND "nfsboot="                              \
+       "setenv bootargs "                                      \
+       "console=ttyTX0,115200n8 "                              \
+       "root=/dev/nfs rw nfsroot=${serverip}:${rootpath} "     \
+       "ip=${ipaddr} ethaddr=${ethaddr}\0"
+
+/* Boot arguments for ramdisk image loaded via TFTP */
+#define RDROOTCOMMAND "ramdiskboot="                           \
+       "setenv bootargs "                                      \
+       "console=ttyTX0,115200n8 "                              \
+       "root=/dev/ram0 rw "                                    \
+       "ip=${ipaddr} ethaddr=${ethaddr}\0"
+
+/* Kernel boot using tftp with static IP */
+#define TFTPSTATICIPKERNELBOOT "tftpstatickernel="             \
+       "tftpboot ${loadaddr} ${serverip}:${bootfile}\0"
+
+/* Kernel boot using tftp with DHCP obtained IP Address */
+#define TFTPDHCPKERNELBOOT "tftpdhcpkernel=dhcp\0"
+
+/*Kernel boot from NAND */
+#define MTDKERNELBOOT "mtdkernel=nboot.jffs2 ${loadaddr} "     \
+       "0 0x00140000\0"
+
+/* Command to burn kernel image into NAND FLASH */
+#define MTDKERNELBURN "mtdkernelburn="                         \
+       "nand erase 0x00140000 0x00400000;"                     \
+       "nand write.jffs2 ${loadaddr} 0x00140000 0x00400000\0"
+
+/* Root filesystem image name and load address */
+#define ROOTFSNAME "rootfile=rootfs.jffs2\0"
+#define ROOTFSLOADADDR "rootloadaddr=0x81000000\0"
+#define ROOTFSLOADSIZE "rootloadsize=0x01000000\0"
+
+/* Load JFFS2 root file system using TFTP with static IP */
+#define TFTPSTATICROOTFSLOAD "tftpstaticloadroot="             \
+       "tftpboot ${rootloadaddr} ${serverip}:${rootfile}\0"
+
+/* Load JFFS2 root file system using TFTP with DHCP */
+#define TFTPDHCPROOTFSLOAD "tftpdhcploadroot="                 \
+       "dhcp ${rootloadaddr} ${serverip}:${rootfile}\0"
+
+/* Command to load root file system into RAM (ramdisk) */
+#define RDROOTFSLOAD "ramdiskload="                            \
+       "nand read.jffs2 ${rootloadaddr} 0x00540000 "           \
+       "${rootloadsize}\0"
+
+/* Command to burn root file system image into NAND FLASH */
+#define MTDROOTBURN "mtdrootburn="                             \
+       "nand erase 0x00540000 0x0FAC0000;"                     \
+       "nand write.jffs2 ${rootloadaddr} 0x00540000"           \
+       " ${rootloadsize}\0"
+
+/*
+ * Other preset environment variables and example bootargs string
+ */
+#define CONFIG_EXTRA_ENV_SETTINGS                              \
+       MTDROOTCOMMAND                                          \
+       NFSROOTCOMMAND                                          \
+       RDROOTCOMMAND                                           \
+       TFTPSTATICIPKERNELBOOT                                  \
+       TFTPDHCPKERNELBOOT                                      \
+       MTDKERNELBOOT                                           \
+       MTDKERNELBURN                                           \
+       ROOTFSNAME                                              \
+       ROOTFSLOADADDR                                          \
+       ROOTFSLOADSIZE                                          \
+       TFTPSTATICROOTFSLOAD                                    \
+       TFTPDHCPROOTFSLOAD                                      \
+       RDROOTFSLOAD                                            \
+       MTDROOTBURN
+
+/* Default boot command */
+#define CONFIG_BOOTCOMMAND                                     \
+       "run nfsboot;run tftpstatickernel; bootm ${loadaddr}"
+
+/*
+ * BOOTP options
+ */
+#define CONFIG_BOOTP_SUBNETMASK
+#define CONFIG_BOOTP_GATEWAY
+#define CONFIG_BOOTP_BOOTPATH
+#define CONFIG_BOOTP_HOSTNAME
+#define CONFIG_BOOTP_BOOTFILESIZE
+
+#endif  /* __FDI3250_H__*/
+
diff --git a/include/configs/phy3250.h b/include/configs/phy3250.h
new file mode 100644 (file)
index 0000000..d3a794a
--- /dev/null
@@ -0,0 +1,337 @@
+/*
+ * Copyright (C) 2009 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: Phytec 3250 board configuration file
+ *
+ * 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
+ */
+
+/*
+ * Phytec 3250 board configuation data
+ */
+
+#ifndef __PHY3250_H__
+#define __PHY3250_H__
+
+
+//#define DEBUG
+/*
+ * Ethernet buffer support in uncached IRAM and buffer size
+ */
+#define USE_IRAM_FOR_ETH_BUFFERS
+#define IRAM_ETH_BUFF_BASE 0x08010000 /* Uncached IRAM */
+#define IRAM_ETH_BUFF_SIZE 0x00010000
+
+/*
+ * Linux machine type
+ */
+#define MACH_TYPE_UBOOTSYS MACH_TYPE_PHY3250
+
+/*
+ * System UART selection, valid selections include UART3, UART4,
+ * UART5, and UART6
+ */
+#define CFG_UART_SEL UART5
+
+/*
+ * SDRAM physical Memory Map
+ */
+#define CONFIG_NR_DRAM_BANKS    1
+#define PHYS_SDRAM_1           0x80000000 /* SDRAM Bank #1 */
+
+#define CONFIG_SYS_SDRAM_BASE  PHYS_SDRAM_1
+#define CONFIG_SYS_TEXT_BASE  0x83F80000
+/*
+ * NOR FLASH not supported
+ */
+/* NOR Flash (Spansion S29AL008D) */
+#define CONFIG_FLASH_CFI_LEGACY         
+#define CONFIG_SYS_FLASH_CFI
+#define CONFIG_FLASH_CFI_DRIVER
+#define CONFIG_SYS_FLASH_BASE          (0xE0000000)
+#define CONFIG_SYS_MAX_FLASH_BANKS     (1)
+#define CONFIG_SYS_MAX_FLASH_SECT      19
+#define CONFIG_SYS_FLASH_BANKS_LIST    { CONFIG_SYS_FLASH_BASE }
+#define CONFIG_SYS_FLASH_LEGACY_512Kx16        1
+#define CONFIG_SYS_FLASH_CFI_WIDTH     FLASH_CFI_16BIT
+
+/* Uncomment below line if you want to store environment in NOR */
+/* #define CONFIG_ENV_IS_IN_FLASH */
+
+/*
+ * 1KHz clock tick
+ */
+#define CONFIG_SYS_HZ          1000
+
+/*
+ * ARM926ejs options
+ */
+#define CONFIG_ARM926EJS          1 /* This is an arm926ejs CPU core  */
+
+/*
+ *
+ * u-boot specific options
+ *
+ */
+
+/*
+ * Address and size of Environment Data
+ */
+#ifdef CONFIG_ENV_IS_IN_FLASH
+#define CONFIG_ENV_SECT_SIZE   0x8000
+#define CONFIG_ENV_SIZE                (CONFIG_ENV_SECT_SIZE)
+#define CONFIG_ENV_ADDR                (0xE0008000) /* Sector 3 (0x8000 - 0xFFFF) */
+#else
+#define CONFIG_ENV_IS_IN_NAND  1
+#define CONFIG_ENV_SIZE                0x10000 /* 4 blocks */
+#define CONFIG_ENV_OFFSET      0x1F4000 /* Block 125 */
+#define CONFIG_ENV_ADDR                0x80000100 /* Passed to kernel here */
+#endif
+
+/*
+ * Area and size for malloc
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 128 * 1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128
+
+/*
+ * Stack sizes
+ *
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (32*1024) /* 32K stack */
+
+/* 3 words are left on the stack for the abort handler */
+#define CONFIG_SYS_INIT_SP_ADDR 0x0003C000
+/*
+ * ATAG support
+ */
+#define CONFIG_CMDLINE_TAG             1
+#define CONFIG_SETUP_MEMORY_TAGS       1
+#define CONFIG_INITRD_TAG              1
+
+/*
+ * Default baud rate and baud rate table, console config
+ */
+#define CONFIG_CONS_INDEX         1
+#define CONFIG_BAUDRATE                115200
+#define CONFIG_SYS_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * Default load address for programs
+ */
+#define CONFIG_SYS_LOAD_ADDR   0x80100000 /* default load address */
+
+/*
+ * Default boot delay is 3 seconds
+ */
+#define CONFIG_BOOTDELAY 3
+#define CONFIG_ZERO_BOOTDELAY_CHECK    /* check for keypress on bootdelay==0 */
+
+/*
+ * Interrupts are not supported in this boot loader
+ */
+#undef CONFIG_USE_IRQ
+
+/*
+ * Use verbose help
+ */
+#define CONFIG_SYS_LONGHELP
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_ECHO /* ECHO command */
+#define CONFIG_CMD_CACHE /* Cache support */
+#define CONFIG_CMD_RUN
+#define CONFIG_CMD_LOADB
+#define CONFIG_CMD_LOADS
+#define CONFIG_CMD_SAVES
+#define CONFIG_CMD_MEMORY
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_BDI
+#define CONFIG_CMD_SAVEENV
+#define CONFIG_CMD_ELF
+#define CONFIG_MISC_INIT_R
+#undef CONFIG_CMD_MISC
+
+/*
+ * Prompt, command buffer
+ */
+#define        CONFIG_SYS_CBSIZE               256             /* Console I/O Buffer Size      */
+#define        CONFIG_SYS_PROMPT       "uboot> "       /* Monitor Command Prompt       */
+#define        CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define        CONFIG_SYS_MAXARGS              16              /* max number of command args   */
+#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE       /* Boot Argument Buffer Size    */
+
+/*
+ * Default range for the memory tests
+ */
+#define CONFIG_SYS_MEMTEST_START 0x80010000
+#define CONFIG_SYS_MEMTEST_END 0x81000000
+
+/*
+ * Support for NAND FLASH, environment store in NAND at block 100
+ */
+#define CONFIG_CMD_NAND
+#define CONFIG_SYS_LPC32XX_NAND    /* Enable SLC NAND controller driver */
+#define CONFIG_SYS_MAX_NAND_DEVICE 1
+#define CONFIG_SYS_NAND_BASE 0x20020000 /* SLC NAND controller */
+#define CFG_ENV_IS_IN_NAND
+#define LPC32XX_SLC_NAND_TIMING (SLCTAC_WDR(14) | \
+                    SLCTAC_WWIDTH(9) | \
+                    SLCTAC_WHOLD(3) | \
+                    SLCTAC_WSETUP(4) | \
+                    SLCTAC_RDR(14) | \
+                    SLCTAC_RWIDTH(9) | \
+                    SLCTAC_RHOLD(3) | \
+                    SLCTAC_RSETUP(4))
+
+/*
+ * NAND H/W ECC specific settings
+ */
+#define CONFIG_SYS_LPC32XX_DMA            /* DMA supporte required */
+#define CONFIG_SYS_NAND_ECCSIZE       512 /* ECC generated per page */
+#define CONFIG_SYS_NAND_ECCBYTES        6 /* 3 Bytes ECC per 256 Bytes */
+#define CONFIG_SYS_NAND_OOBSIZE        16 /* OOB size in bytes */
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Support for various capabilities
+ */
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+
+/*
+ * Network setup
+ */
+#define CONFIG_NETMASK         255.255.255.0
+#define CONFIG_IPADDR          192.168.1.101
+#define CONFIG_SERVERIP                192.168.1.41
+#define CONFIG_GATEWAYIP       192.168.1.1
+
+#define CONFIG_BOOTFILE                "uImage"
+#define CONFIG_LOADADDR                0x80100000
+#define CONFIG_ROOTPATH                "/home/user/ltib/rootfs"
+
+/* Boot arguments for JFFS2 root file system in NAND */
+#define MTDROOTCOMMAND "mtdboot="                              \
+       "setenv bootargs "                                      \
+       "console=ttyS0,115200n8 "                               \
+       "root=/dev/mtdblock4 rw rootfstype=jffs2 "              \
+       "ip=${ipaddr} ethaddr=${ethaddr}\0"
+
+/* Boot arguments for NFS based root file system */
+#define NFSROOTCOMMAND "nfsboot="                              \
+       "setenv bootargs "                                      \
+       "console=ttyS0,115200n8 "                               \
+       "root=/dev/nfs3 rw nfsroot=${serverip}:${rootpath} "    \
+       "ip=${ipaddr} ethaddr=${ethaddr}\0"
+
+/* Boot arguments for ramdisk image loaded via TFTP */
+#define RDROOTCOMMAND "ramdiskboot="                           \
+       "setenv bootargs "                                      \
+       "console=ttyS0,115200n8 "                               \
+       "root=/dev/ram0 rw "                                    \
+       "ip=${ipaddr} ethaddr=${ethaddr}\0"
+
+/* Kernel boot using tftp with static IP */
+#define TFTPSTATICIPKERNELBOOT "tftpstatickernel="             \
+       "tftpboot ${loadaddr} ${serverip}:${bootfile}\0"
+
+/* Kernel boot using tftp with DHCP obtained IP Address */
+#define TFTPDHCPKERNELBOOT "tftpdhcpkernel=dhcp\0"
+
+/*Kernel boot from NAND */
+#define MTDKERNELBOOT "mtdkernel=nboot.jffs2 ${loadaddr} "     \
+       "0 0x00204000\0"
+
+/* Command to burn kernel image into NAND FLASH */
+#define MTDKERNELBURN "mtdkernelburn="                         \
+       "nand erase 0x00204000 0x00400000;"                     \
+       "nand write.jffs2 ${loadaddr} 0x00204000 0x00400000\0"
+
+/* Root filesystem image name and load address */
+#define ROOTFSNAME "rootfile=rootfs.jffs2\0"
+#define ROOTFSLOADADDR "rootloadaddr=0x82000000\0"
+#define ROOTFSLOADSIZE "rootloadsize=0x01000000\0"
+
+/* Load JFFS2 root file system using TFTP with static IP */
+#define TFTPSTATICROOTFSLOAD "tftpstaticloadroot="             \
+       "tftpboot ${rootloadaddr} ${serverip}:${rootfile}\0"
+
+/* Load JFFS2 root file system using TFTP with DHCP */
+#define TFTPDHCPROOTFSLOAD "tftpdhcploadroot="                 \
+       "dhcp ${rootloadaddr} ${serverip}:${rootfile}\0"
+
+/* Command to load root file system into RAM (ramdisk) */
+#define RDROOTFSLOAD "ramdiskload="                            \
+       "nand read.jffs2 ${rootloadaddr} 0x00604000 "           \
+       "${rootloadsize}\0"
+
+/* Command to burn root file system image into NAND FLASH */
+#define MTDROOTBURN "mtdrootburn="                             \
+       "nand erase 0x00604000 0x039FC000;"                     \
+       "nand write.jffs2 ${rootloadaddr} 0x00604000"           \
+       " ${rootloadsize}\0"
+
+/*
+ * Other preset environment variables and example bootargs string
+ */
+#define CONFIG_EXTRA_ENV_SETTINGS                              \
+       MTDROOTCOMMAND                                          \
+       NFSROOTCOMMAND                                          \
+       RDROOTCOMMAND                                           \
+       TFTPSTATICIPKERNELBOOT                                  \
+       TFTPDHCPKERNELBOOT                                      \
+       MTDKERNELBOOT                                           \
+       MTDKERNELBURN                                           \
+       ROOTFSNAME                                              \
+       ROOTFSLOADADDR                                          \
+       ROOTFSLOADSIZE                                          \
+       TFTPSTATICROOTFSLOAD                                    \
+       TFTPDHCPROOTFSLOAD                                      \
+       RDROOTFSLOAD                                            \
+       MTDROOTBURN
+
+/* Default boot command */
+#define CONFIG_BOOTCOMMAND                                     \
+       "run nfsboot;run tftpstatickernel; bootm ${loadaddr}"
+
+/*
+ * BOOTP options
+ */
+#define CONFIG_BOOTP_SUBNETMASK
+#define CONFIG_BOOTP_GATEWAY
+#define CONFIG_BOOTP_BOOTPATH
+#define CONFIG_BOOTP_HOSTNAME
+#define CONFIG_BOOTP_BOOTFILESIZE
+
+#endif  /* __PHY3250_H__*/
+
diff --git a/include/lpc3250.h b/include/lpc3250.h
new file mode 100644 (file)
index 0000000..4820968
--- /dev/null
@@ -0,0 +1,2396 @@
+/***********************************************************************
+ *
+ * Copyright (C) 2008 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: Definitions for LPC3250 chip
+ * @References: NXP LPC3250 User's Guide
+ *
+ * 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 __LPC3250_H
+#define __LPC3250_H
+
+/*\r
+ * AHB physical address bases used in u-boot\r
+ */\r
+#define SSP0_BASE       0x20084000     /* SSP0 registers base */\r
+#define MLC_BASE       0x200A8000      /* MLC NAND Flash registers base*/\r
+#define ETHERNET_BASE  0x31060000      /* Ethernet ctrl register base*/\r
+#define EMC_BASE        0x31080000     /* EMC registers base*/\r
+#define SLC_BASE       0x20020000      /* SLC NAND Flash registers base*/\r
+#define SD_BASE                0x20098000      /* SD card interface registers base*/\r
+#define DMA_BASE       0x31000000      /* DMA controller registers base*/
+#define USB_OTG_BASE   0x31020000      /*USB OTG registers base*/
+#define OTG_I2C_BASE   0x31020300      /*USB I2C registers base*/\r
+\r
+/*\r
+ * FAB physical address bases used in u-boot\r
+ */\r
+#define TIMER0_BASE     0x40044000\r
+#define TIMER1_BASE     0x4004C000\r
+#define CLK_PM_BASE    0x40004000      /* System control registers base*/\r
+#define WDTIM_BASE     0x4003C000      /* Watchdog timer registers base*/\r
+#define UART_CTRL_BASE 0x40054000      /* general UART ctrl regs base*/\r
+#define GPIO_BASE      0x40028000      /* GPIO registers base*/\r
+\r
+/*\r
+ * APB physical address bases used in u-boot\r
+ */\r
+#define UART3_BASE     0x40080000      /* UART 3 registers base*/\r
+#define UART4_BASE     0x40088000      /* UART 4 registers base*/\r
+#define UART5_BASE     0x40090000      /* UART 5 registers base*/\r
+#define UART6_BASE     0x40098000      /* UART 6 registers base*/\r
+\r
+/*\r
+ * Internal memory physical address bases used in u-boot\r
+ */\r
+#define IRAM_BASE       0x08000000     /* Internal RAM address */\r
+\r
+/*\r
+ * External Static Memory Bank Address Space physical address bases\r
+ */\r
+#define EMC_CS0_BASE   0xE0000000\r
+#define EMC_CS1_BASE   0xE1000000\r
+#define EMC_CS2_BASE   0xE2000000\r
+#define EMC_CS3_BASE   0xE3000000\r
+\r
+/*\r
+ * External SDRAM Memory Bank Address Space Bases\r
+ */\r
+#define EMC_DYCS0_BASE 0x80000000      /* SDRAM DYCS0 base address */\r
+#define EMC_DYCS1_BASE 0xA0000000      /* SDRAM DYCS1 base address */\r
+\r
+/*\r
+ * Clock and crystal information\r
+ */\r
+#define MAIN_OSC_FREQ  13000000\r
+#define CLOCK_OSC_FREQ 32768\r
+
+/* bit position macro */\r
+#define _BIT(n)                (0x1 << (n))
+
+#define _SBF(f,v) (((unsigned long)(v)) << (f))\r
+
+/*
+ * Standard UART register structures
+ */\r
+typedef struct\r
+{\r
+       volatile unsigned int dll_fifo;     /* UART data FIFO/holding/dll reg */\r
+       volatile unsigned int dlm_ier;      /* UART high divisor/int enable reg */\r
+       volatile unsigned int iir_fcr;      /* UART int pending/FIFO contrl reg */\r
+       volatile unsigned int lcr;          /* UART line control reg */\r
+       volatile unsigned int modem_ctrl;   /* UART modem control reg */\r
+       volatile unsigned int lsr;          /* UART line status reg */\r
+       volatile unsigned int modem_status; /* UART modem status reg */\r
+       volatile unsigned int rxlev;        /* UART RX FIFO level reg */\r
+} UART_REGS_T;\r
+\r
+/*
+ * UART control structure
+ */\r
+typedef struct\r
+{\r
+       volatile unsigned int ctrl;         /* General UART control register */\r
+       volatile unsigned int clkmode;      /* UART clock control register */\r
+       volatile unsigned int loop;         /* UART loopmode enable/disable */\r
+} UART_CNTL_REGS_T;
+\r
+/*\r
+ * UART dll and dlm register definitions\r
+ */\r
+#define UART_LOAD_DM(div)          ((div) & 0xFF)\r
+\r
+/*\r
+ * UART ier register definitions\r
+ */\r
+/* Bit for enabling the modem status interrupt */\r
+#define UART_IER_MODEM_STS         _BIT(3)\r
+/* Bit for enabling the RX line status interrupt(s) */\r
+#define UART_IER_RXLINE_STS        _BIT(2)\r
+/* Bit for enabling the transmit holding register empty interrupt */\r
+#define UART_IER_THRE              _BIT(1)\r
+/* Bit for enabling the receive data available (RDA) interrupt */\r
+#define UART_IER_RDA               _BIT(0)\r
+\r
+/*\r
+ * UART iir register definitions\r
+ */\r
+/* Bit for masking interrupt pending status */\r
+#define UART_IIR_INT_PENDING       _BIT(0)\r
+/* Mask for getting interrupt source */\r
+#define UART_IIR_INT_MASK          0xE\r
+/* Interrupt sources */\r
+#define UART_IIR_MODEM_STS         0x0\r
+#define UART_IIR_INTSRC_THRE       0x2\r
+#define UART_IIR_INTSRC_RDA        0x4\r
+#define UART_IIR_INTSRC_RXLINE     0x6\r
+#define UART_IIR_INTSRC_CTI        0xC /* Character timeout */\r
+/* Interrupt bits mask word */\r
+#define UART_IIR_INTSRC_MASK       0xE\r
+\r
+/*\r
+ * UART fcr register definitions\r
+ */\r
+/* Receive FIFO trigger level selections */\r
+#define UART_FCR_RXFIFO_TL16       0x0\r
+#define UART_FCR_RXFIFO_TL32       _BIT(6)\r
+#define UART_FCR_RXFIFO_TL48       _BIT(7)\r
+#define UART_FCR_RXFIFO_TL60       (_BIT(7) | _BIT(6))\r
+/* Transmit FIFO trigger level selections */\r
+#define UART_FCR_TXFIFO_TL0        0x0\r
+#define UART_FCR_TXFIFO_TL4        _BIT(4)\r
+#define UART_FCR_TXFIFO_TL8        _BIT(5)\r
+#define UART_FCR_TXFIFO_TL16       (_BIT(5) | _BIT(4))\r
+/* Enable FIFO bit - must be set with UART_FCR_FIFO_EN */\r
+#define UART_FCR_FIFO_CTRL         _BIT(3)\r
+/* Clear TX FIFO bit */\r
+#define UART_FCR_TXFIFO_FLUSH      _BIT(2)\r
+/* Clear RX FIFO bit */\r
+#define UART_FCR_RXFIFO_FLUSH      _BIT(1)\r
+/* Enable FIFO bit - must be set with UART_FCR_FIFO_CTRL */\r
+#define UART_FCR_FIFO_EN           _BIT(0)\r
+\r
+/*\r
+ * UART lcr register definitions\r
+ */\r
+/* Bit for enabling divisor latch and IER register */\r
+#define UART_LCR_DIVLATCH_EN       _BIT(7)\r
+/* Bit for enabling break transmission (forces TX low) */\r
+#define UART_LCR_BREAK_EN          _BIT(6)\r
+/* Parity selection */\r
+#define UART_LCR_PARITY_ODD        0x0\r
+#define UART_LCR_PARITY_EVEN       _BIT(4)\r
+#define UART_LCR_PARITY_FORCE1     _BIT(5)\r
+#define UART_LCR_PARITY_FORCE0     (_BIT(5) | _BIT(4))\r
+/* Parity selection mask */\r
+#define UART_LCR_PARITY_MASK       (_BIT(5) | _BIT(4))\r
+/* Parity enable bit */\r
+#define UART_LCR_PARITY_ENABLE     _BIT(3)\r
+/* Stop bit selection */\r
+#define UART_LCR_STOP1BIT          0x0\r
+#define UART_LCR_STOP2BITS         _BIT(2)\r
+/* Word length selections */\r
+#define UART_LCR_WLEN_5BITS        0x0\r
+#define UART_LCR_WLEN_6BITS        _BIT(0)\r
+#define UART_LCR_WLEN_7BITS        _BIT(1)\r
+#define UART_LCR_WLEN_8BITS        (_BIT(1) | _BIT(0))\r
+/* Word length mask */\r
+#define UART_LCR_WLEN_MASK         (_BIT(1) | _BIT(0))\r
+\r
+/*\r
+ * UART modem_ctrl register definitions\r
+ */\r
+/* Bit for enabling modem loopback mode */\r
+#define UART_MDMC_LOOPB_EN         _BIT(4)\r
+/* Bit for driving RTS low */\r
+#define UART_MDMC_RTS_LOW          _BIT(1)\r
+/* Bit for driving DTR low */\r
+#define UART_MDMC_DTR_LOW          _BIT(0)\r
+\r
+/*\r
+ * UART lsr register definitions\r
+ */\r
+/* Bit for masking FIFO RX error status */\r
+#define UART_LSR_FIFORX_ERR        _BIT(7)\r
+/* Bit for masking transmitter empty status */\r
+#define UART_LSR_TEMT              _BIT(6)\r
+/* Bit for masking transmit FIFO trip point status */\r
+#define UART_LSR_THRE              _BIT(5)\r
+/* Bit for masking break interrupt status */\r
+#define UART_LSR_BI                _BIT(4)\r
+/* Bit for masking framing error status */\r
+#define UART_LSR_FR                _BIT(3)\r
+/* Bit for masking parity error status */\r
+#define UART_LSR_PE                _BIT(2)\r
+/* Bit for masking RX FIFO overrun error status */\r
+#define UART_LSR_OE                _BIT(1)\r
+/* Bit for masking RX FIFO empty status */\r
+#define UART_LSR_RDR               _BIT(0)\r
+\r
+/*\r
+ * UART modem_status register definitions\r
+ */\r
+/* Bit for masking data carrier detect state */\r
+#define UART_MDMS_DCD              _BIT(7)\r
+/* Bit for masking ring indicator state */\r
+#define UART_MDMS_RI               _BIT(6)\r
+/* Bit for masking data set ready state */\r
+#define UART_MDMS_DSR              _BIT(5)\r
+/* Bit for masking clear to send state */\r
+#define UART_MDMS_CTS              _BIT(4)\r
+/* Bit for detecting state change on DCD */\r
+#define UART_MDMS_DCD_CHG          _BIT(3)\r
+/* Bit for detecting state change on RI */\r
+#define UART_MDMS_RI_CHG           _BIT(2)\r
+/* Bit for detecting state change on DSR */\r
+#define UART_MDMS_DSR_CHG          _BIT(1)\r
+/* Bit for detecting state change on CTS */\r
+#define UART_MDMS_CTS_CHG          _BIT(0)\r
+\r
+/*\r
+ * UART rxlev register definitions\r
+ */\r
+/* Macro for masking off the receive FIFO level */\r
+#define UART_RXLEV(n)              ((n) & 0x7F)\r
+\r
+/*\r
+ * UART ctrl register definitions\r
+*/\r
+/* UART3 modem control pin enable bit */\r
+#define UART_U3_MD_CTRL_EN         _BIT(11)\r
+/* IRRX6 inversion enable bit */\r
+#define UART_IRRX6_INV_EN          _BIT(10)\r
+/* IRRX6 RX mask while TX enabled enable bit */\r
+#define UART_HDPX_EN               _BIT(9)\r
+/* UART6 IRA modulator bypass bit */\r
+#define UART_UART6_IRDAMOD_BYPASS  _BIT(5)\r
+/* IRTX6 inversion enable bit */\r
+#define RT_IRTX6_INV_EN            _BIT(4)\r
+/* IRRX6 inversion enable bit */\r
+#define RT_IRTX6_INV_MIR_EN        _BIT(3)\r
+/* IR RX length, 3/16th pulse length with a 115Kbps clock */\r
+#define RT_RX_IRPULSE_3_16_115K    _BIT(2)\r
+/* IR TX length, 3/16th pulse length with a 115Kbps clock */\r
+#define RT_TX_IRPULSE_3_16_115K    _BIT(1)\r
+/* UART5 mirror route to the USB D+ and D- pins bit */\r
+#define UART_U5_ROUTE_TO_USB       _BIT(0)\r
+\r
+/*\r
+ * UART clkmode register definitions\r
+ */\r
+/* Macro return the UART clock enabled field, shifted */\r
+#define UART_ENABLED_CLOCKS(n)     (((n) >> 16) & 0x7F)\r
+/* Macro returning a selected enabled UART clock bit */\r
+#define UART_ENABLED_CLOCK(n, u)   (((n) >> (16 + (u))) & 0x1)\r
+/* Bit that indicates if any UARTS are being clocked */\r
+#define UART_ENABLED_CLKS_ANY      _BIT(14)\r
+/* Defnies for setting a IARTs clock mode */\r
+#define UART_CLKMODE_OFF           0x0    /* Clocks are off */\r
+#define UART_CLKMODE_ON            0x1    /* Clocks are on */\r
+#define UART_CLKMODE_AUTO          0x2    /* Clocks are automatic */\r
+/* Clock mode mask for a UART, for UARTs 6 to 3 only */\r
+#define UART_CLKMODE_MASK(u)      (0x3 << ((((u) - 3) * 2) + 4))\r
+/* Macro for loading a UARTs clock mode, for UARTs 6 to 3 only */\r
+#define UART_CLKMODE_LOAD(m, u)   ((m) << ((((u) - 3) * 2) + 4))
+
+/*
+ * Macros pointing to UART base and control registers
+ */\r
+#define UART3 ((UART_REGS_T *)(UART3_BASE))\r
+#define UART4 ((UART_REGS_T *)(UART4_BASE))\r
+#define UART5 ((UART_REGS_T *)(UART5_BASE))\r
+#define UART6 ((UART_REGS_T *)(UART6_BASE))\r
+#define UARTCNTL ((UART_CNTL_REGS_T *) (UART_CTRL_BASE))
+\r
+
+
+
+
+
+
+
+
+
+
+\r
+/**********************************************************************\r
+* Clock and Power control register structures\r
+**********************************************************************/\r
+\r
+/*
+ * Clock and Power control module register structure
+ */\r
+typedef struct\r
+{\r
+  volatile unsigned int reserved1 [5];\r
+  volatile unsigned int clkpwr_bootmap;\r
+  volatile unsigned int clkpwr_p01_er;\r
+  volatile unsigned int clkpwr_usbclk_pdiv;\r
+  volatile unsigned int clkpwr_int_er;\r
+  volatile unsigned int clkpwr_int_rs;\r
+  volatile unsigned int clkpwr_int_sr;\r
+  volatile unsigned int clkpwr_int_ap;\r
+  volatile unsigned int clkpwr_pin_er;\r
+  volatile unsigned int clkpwr_pin_rs;\r
+  volatile unsigned int clkpwr_pin_sr;\r
+  volatile unsigned int clkpwr_pin_ap;\r
+  volatile unsigned int clkpwr_hclk_div;\r
+  volatile unsigned int clkpwr_pwr_ctrl;\r
+  volatile unsigned int clkpwr_pll397_ctrl;\r
+  volatile unsigned int clkpwr_main_osc_ctrl;\r
+  volatile unsigned int clkpwr_sysclk_ctrl;\r
+  volatile unsigned int clkpwr_lcdclk_ctrl;\r
+  volatile unsigned int clkpwr_hclkpll_ctrl;\r
+  volatile unsigned int reserved2;\r
+  volatile unsigned int clkpwr_adc_clk_ctrl_1;\r
+  volatile unsigned int clkpwr_usb_ctrl;\r
+  volatile unsigned int clkpwr_sdramclk_ctrl;\r
+  volatile unsigned int clkpwr_ddr_lap_nom;\r
+  volatile unsigned int clkpwr_ddr_lap_count;\r
+  volatile unsigned int clkpwr_ddr_cal_delay;\r
+  volatile unsigned int clkpwr_ssp_blk_ctrl;\r
+  volatile unsigned int clkpwr_i2s_clk_ctrl;\r
+  volatile unsigned int clkpwr_ms_ctrl;\r
+  volatile unsigned int reserved4 [3];\r
+  volatile unsigned int clkpwr_macclk_ctrl;\r
+  volatile unsigned int reserved5 [4];\r
+  volatile unsigned int clkpwr_test_clk_sel;\r
+  volatile unsigned int clkpwr_sw_int;\r
+  volatile unsigned int clkpwr_i2c_clk_ctrl;\r
+  volatile unsigned int clkpwr_key_clk_ctrl;\r
+  volatile unsigned int clkpwr_adc_clk_ctrl;\r
+  volatile unsigned int clkpwr_pwm_clk_ctrl;\r
+  volatile unsigned int clkpwr_timer_clk_ctrl;\r
+  volatile unsigned int clkpwr_timers_pwms_clk_ctrl_1;\r
+  volatile unsigned int clkpwr_spi_clk_ctrl;\r
+  volatile unsigned int clkpwr_nand_clk_ctrl;\r
+  volatile unsigned int reserved7;\r
+  volatile unsigned int clkpwr_uart3_clk_ctrl;\r
+  volatile unsigned int clkpwr_uart4_clk_ctrl;\r
+  volatile unsigned int clkpwr_uart5_clk_ctrl;\r
+  volatile unsigned int clkpwr_uart6_clk_ctrl;\r
+  volatile unsigned int clkpwr_irda_clk_ctrl;\r
+  volatile unsigned int clkpwr_uart_clk_ctrl;\r
+  volatile unsigned int clkpwr_dmaclk_ctrl;\r
+  volatile unsigned int clkpwr_autoclock;\r
+} CLKPWR_REGS_T;
+
+
+/*\r
+ * clkpwr_hclk_div register definitions\r
+ */\r
+/* HCLK Divider DDRAM clock stop (used for SDRAM only) */\r
+#define CLKPWR_HCLKDIV_DDRCLK_STOP (0x0 << 7)\r
+/* HCLK Divider DDRAM clock is the same speed as the ARM */\r
+#define CLKPWR_HCLKDIV_DDRCLK_NORM (0x1 << 7)\r
+/* HCLK Divider DDRAM clock is half the speed as the ARM */\r
+#define CLKPWR_HCLKDIV_DDRCLK_HALF (0x2 << 7)\r
+/* HCLK Divider PERIPH_CLK divider, for a value of n, the divider is\r
+   (1+n), maximum value of n is 32 */\r
+#define CLKPWR_HCLKDIV_PCLK_DIV(n) (((n) & 0x1F) << 2)\r
+/* HCLK Divider, for a value of n, the divider is (2^n), maximum\r
+   value of n is 2 for a divider of 4 */\r
+#define CLKPWR_HCLKDIV_DIV_2POW(n) ((n) & 0x3)
+
+/*\r
+ * clkpwr_pwr_ctrl register definitions\r
+ */\r
+/* Force HCLK and ARMCLK to run from PERIPH_CLK to save power */\r
+#define CLKPWR_CTRL_FORCE_PCLK      _BIT(10)\r
+/* SDRAM self refresh request */\r
+#define CLKPWR_SDRAM_SELF_RFSH      _BIT(9)\r
+/* Update SDRAM self refresh request */\r
+#define CLKPWR_UPD_SDRAM_SELF_RFSH  _BIT(8)\r
+/* Enable auto exit SDRAM self refresh */\r
+#define CLKPWR_AUTO_SDRAM_SELF_RFSH _BIT(7)\r
+/* Highcore pin level (when CLKPWR_HIGHCORE_GPIO_EN is set) */\r
+#define CLKPWR_HIGHCORE_STATE_BIT   _BIT(5)\r
+/* SYSCLKEN pin level (when CLKPWR_SYSCLKEN_GPIO_EN is set) */\r
+#define CLKPWR_SYSCLKEN_STATE_BIT   _BIT(4)\r
+/* Enable SYSCLKEN pin as a GPIO bit */\r
+#define CLKPWR_SYSCLKEN_GPIO_EN     _BIT(3)\r
+/* Selects direct run mode (0) or run mode (1) */\r
+#define CLKPWR_SELECT_RUN_MODE      _BIT(2)\r
+/* Enable Highcore pin as a GPIO bit */\r
+#define CLKPWR_HIGHCORE_GPIO_EN     _BIT(1)\r
+/* Enable Highcore pin as a GPIO bit */\r
+#define CLKPWR_STOP_MODE_CTRL       _BIT(0)
+
+/*\r
+ * clkpwr_sysclk_ctrl register definitions\r
+ */
+/* Number used by the clock switching circuitry to decide how long a\r
+   bad phase must be present before clock switching is triggered */\r
+#define CLKPWR_SYSCTRL_BP_TRIG(n)   (((n) & 0x3FF) << 2)\r
+/* Mask for bad phase bits */\r
+#define CLKPWR_SYSCTRL_BP_MASK      (0x3FF << 2)\r
+/* (1) = Use main oscillator, (1) = use PLL397 oscillator */\r
+#define CLKPWR_SYSCTRL_USEPLL397    _BIT(1)\r
+/* Read only status mask bit of the select oscillator, (0) = main\r
+   oscillator, (1) = PLL397 oscillator */\r
+#define CLKPWR_SYSCTRL_SYSCLKMUX    _BIT(0)
+
+/*\r
+ * clkpwr_hclkpll_ctrl register definitions\r
+ */\r
+/* Bit to start (1) or stop (0) the main HCLK PLL */\r
+#define CLKPWR_HCLKPLL_POWER_UP    _BIT(16)\r
+/* Main HCLK PLL CCO bypass control (0) = CCO clock to post divider,\r
+   (1) = Bypass CCO and route PLL clock to post divider */\r
+#define CLKPWR_HCLKPLL_CCO_BYPASS  _BIT(15)\r
+/* Main HCLK PLL post divider bypass control (0) = use post divider,\r
+   (1) = Bypass post divider */\r
+#define CLKPWR_HCLKPLL_POSTDIV_BYPASS _BIT(14)\r
+/* Main HCLK PLL feedback divider path control, (0) = feedback\r
+   divider clocked by CCO, (1) = feedback divider clocked by FCLKOUT */\r
+#define CLKPWR_HCLKPLL_FDBK_SEL_FCLK _BIT(13)\r
+/* Main HCLK PLL post divider setting, for a value of n, the divider\r
+   is 2^n, maximum value of n is 3 */\r
+#define CLKPWR_HCLKPLL_POSTDIV_2POW(n) (((n) & 0x3) << 11)\r
+/* Main HCLK PLL pre divider setting, for a value of n, the divider\r
+   is (1+n), maximum value of n is 3 */\r
+#define CLKPWR_HCLKPLL_PREDIV_PLUS1(n) (((n) & 0x3) << 9)\r
+/* Main HCLK PLL feedback setting, for a value of n, the feedback\r
+   is (1+n), maximum value of n is 255 */\r
+#define CLKPWR_HCLKPLL_PLLM(n)     (((n) & 0xFF) << 1)\r
+/* Read only status mask bit of the PLL lock state, (0) = PLL is not\r
+   locked, (1) = PLL is locked */\r
+#define CLKPWR_HCLKPLL_PLL_STS     _BIT(0)
+
+
+/**********************************************************************
+* clkpwr_usb_ctrl register definitions
+**********************************************************************/
+/* USB slave HCLK clock disable (0) / enable (1) bit */
+#define CLKPWR_USBCTRL_HCLK_EN     _BIT(24)
+/* USB I2C enable, (0) = automatic USB I2C enable, (1) = disable (by
+   driving '0' to the OE_TP_N pad */
+#define CLKPWR_USBCTRL_USBI2C_EN   _BIT(23)
+/* USB_DEV_NEED_CLK enable, (0) = USB_DEV_NEED_CLK not let into clock
+   switch, (1) = USB_DEV_NEED_CLK let into clock switch */
+#define CLKPWR_USBCTRL_USBDVND_EN  _BIT(22)
+/* USB_HOST_NEED_CLK enable, (0) = USB_HOST_NEED_CLK not let into clock
+   switch, (1) = USB_HOST_NEED_CLK let into clock switch */
+#define CLKPWR_USBCTRL_USBHSTND_EN _BIT(21)
+/* USB_DAT_VP and USB_SE0_VM pull-up added to pad */
+#define CLKPWR_USBCTRL_PU_ADD      (0x0 << 19)
+/* USB_DAT_VP and USB_SE0_VM bus keeper mode */
+#define CLKPWR_USBCTRL_BUS_KEEPER  (0x1 << 19)
+/* USB_DAT_VP and USB_SE0_VM pull-down added to pad */
+#define CLKPWR_USBCTRL_PD_ADD      (0x3 << 19)
+/* USB (CLKEN2) clock disable (0) / enable (1) bit */
+#define CLKPWR_USBCTRL_CLK_EN2     _BIT(18)
+/* USB (CLKEN1) clock disable (0) / enable (1) bit */
+#define CLKPWR_USBCTRL_CLK_EN1     _BIT(17)
+/* USB PLL Power up (1) / power down (0) bit */
+#define CLKPWR_USBCTRL_PLL_PWRUP   _BIT(16)
+/* USB PLL CCO bypass bit, (0) = use post divider, (1) = bypass */
+#define CLKPWR_USBCTRL_CCO_BYPASS  _BIT(15)
+/* USB PLL direct output bit, (0) = use post divider as PLL output,
+   (1) = bypass post divider */
+#define CLKPWR_USBCTRL_POSTDIV_BYPASS _BIT(14)
+/* USB PLL feedback divider path control, (0) = feedback
+   divider clocked by CCO, (1) = feedback divider clocked by FCLKOUT */
+#define CLKPWR_USBCTRL_FDBK_SEL_FCLK _BIT(13)
+/* USB PLL post divider setting, for a value of n, the divider is 2^n,
+   maximum value of n is 3 */
+#define CLKPWR_USBCTRL_POSTDIV_2POW(n) (((n) & 0x3) << 11)
+/* USB PLL pre divider setting, for a value of n, the divider
+   is (1+n), maximum value of n is 3 */
+#define CLKPWR_USBCTRL_PREDIV_PLUS1(n) (((n) & 0x3) << 9)
+/* USB PLL feedback setting, for a value of n, the feedback
+   is (1+n), maximum value of n is 255 */
+#define CLKPWR_USBCTRL_FDBK_PLUS1(n) (((n) & 0xFF) << 1)
+/* Read only status mask bit of the USB PLL lock state, (0) = PLL is
+   not locked, (1) = PLL is locked */
+#define CLKPWR_USBCTRL_PLL_STS     _BIT(0)
+
+
+
+/*\r
+ * clkpwr_sdramclk_ctrl register definitions\r
+ */\r
+/* SDRAM RAM_CLK fast slew rate control selection bit */\r
+#define CLKPWR_SDRCLK_FASTSLEW_CLK _BIT(22)\r
+/* SDRAM grouping fast slew rate control selection bit */\r
+#define CLKPWR_SDRCLK_FASTSLEW     _BIT(21)\r
+/* SDRAM data fast slew rate control selection bit */\r
+#define CLKPWR_SDRCLK_FASTSLEW_DAT _BIT(20)\r
+/* SDRAM/DDR controller reset bit */\r
+#define CLKPWR_SDRCLK_SW_DDR_RESET _BIT(19)\r
+/* Select HCLK delay calibration value, n = 0 to 31 at .25nS per tick */\r
+#define CLKPWR_SDRCLK_HCLK_DLY(n)  (((n) & 0x1F) << 14)\r
+/* SDRAM/DDR delay circuitry address status bit */\r
+#define CLKPWR_SDRCLK_DLY_ADDR_STS _BIT(13)\r
+/* Sensitivity factor for DDR SDRAM cal, n = 0 to 7 */\r
+#define CLKPWR_SDRCLK_SENS_FACT(n) (((n) & 0x7) << 10)\r
+/* Use calibrated settings for DDR SDRAM bit */\r
+#define CLKPWR_SDRCLK_USE_CAL      _BIT(9)\r
+/* Perform a DDR delay calibration bit */\r
+#define CLKPWR_SDRCLK_DO_CAL       _BIT(8)\r
+/* Enable auto DDR cal on RTC tick bit */\r
+#define CLKPWR_SDRCLK_CAL_ON_RTC   _BIT(7)\r
+/* Select DQS input delay value, n = 0 to 31 at .25nS per tick */\r
+#define CLKPWR_SDRCLK_DQS_DLY(n)   (((n) & 0x1F) << 2)\r
+/* Use DDR (1) or SDRAM (0) bit */\r
+#define CLKPWR_SDRCLK_USE_DDR      _BIT(1)\r
+/* SDRAM/DDR clock disable bit */\r
+#define CLKPWR_SDRCLK_CLK_DIS      _BIT(0)
+
+/**********************************************************************\r
+* clkpwr_timers_pwms_clk_ctrl_1 register definitions\r
+**********************************************************************/\r
+/* Timer 3 clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_TMRPWMCLK_TIMER3_EN 0x20\r
+/* Timer 2 clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_TMRPWMCLK_TIMER2_EN 0x10\r
+/* Timer 1 clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_TMRPWMCLK_TIMER1_EN 0x08\r
+/* Timer 0 clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_TMRPWMCLK_TIMER0_EN 0x04\r
+/* PWM 4 clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_TMRPWMCLK_PWM4_EN   0x02\r
+/* PWM 3 clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_TMRPWMCLK_PWM3_EN   0x01
+
+/**********************************************************************
+ * clkpwr_nand_clk_ctrl register definitions
+ **********************************************************************/
+/* NAND FLASH controller interrupt select, (0) = SLC, (1) = MLC */
+#define CLKPWR_NANDCLK_INTSEL_MLC  0x20
+
+/* Enable DMA_REQ on NAND_RnB for MLC */
+#define CLKPWR_NANDCLK_DMA_RNB     0x10
+
+/* Enable DMA_REQ on NAND_INT for MLC */
+#define CLKPWR_NANDCLK_DMA_INT     0x08
+
+/* NAND FLASH controller select, (0) = MLC, (1) = SLC */
+#define CLKPWR_NANDCLK_SEL_SLC     0x04
+
+/* NAND FLASH MLC clock enable, (0) = disable, (1) = enable */
+#define CLKPWR_NANDCLK_MLCCLK_EN   0x02
+
+/* NAND FLASH SLC clock enable, (0) = disable, (1) = enable */
+#define CLKPWR_NANDCLK_SLCCLK_EN   0x01
+
+/*\r
+ * clkpwr_uart3_clk_ctrl, clkpwr_uart4_clk_ctrl, clkpwr_uart5_clk_ctrl\r
+ * and clkpwr_uart6_clk_ctrl register definitions\r
+ */\r
+/* Macro for loading UART 'Y' divider value */\r
+#define CLKPWR_UART_Y_DIV(y)       ((y) & 0xFF)\r
+/* Macro for loading UART 'X' divider value */\r
+#define CLKPWR_UART_X_DIV(x)       (((x) & 0xFF) << 8)\r
+/* Bit for using HCLK as the UART X/Y divider input, or PERIPH_CLK */\r
+#define CLKPWR_UART_USE_HCLK       _BIT(16)\r
+\r
+/*\r
+ * clkpwr_uart_clk_ctrl register definitions\r
+ */\r
+/* UART6 clock disable (0) / enable (1) bit */\r
+#define CLKPWR_UARTCLKCTRL_UART6_EN _BIT(3)\r
+/* UART5 clock disable (0) / enable (1) bit */\r
+#define CLKPWR_UARTCLKCTRL_UART5_EN _BIT(2)\r
+/* UART4 clock disable (0) / enable (1) bit */\r
+#define CLKPWR_UARTCLKCTRL_UART4_EN _BIT(1)\r
+/* UART3 clock disable (0) / enable (1) bit */\r
+#define CLKPWR_UARTCLKCTRL_UART3_EN _BIT(0)
+
+/**********************************************************************\r
+* clkpwr_ssp_blk_ctrl register definitions\r
+**********************************************************************/\r
+/* SSP1 RX DMA selection, (0) = SSP1RX not connected/SPI2 connected,\r
+   (1) = SSP1RX connected/SPI2 not connected */\r
+#define CLKPWR_SSPCTRL_DMA_SSP1RX  _BIT(5)\r
+/* SSP1 TX DMA selection, (0) = SSP1TX not connected/SPI1 connected,\r
+   (1) = SSP1TX connected/SPI1 not connected */\r
+#define CLKPWR_SSPCTRL_DMA_SSP1TX  _BIT(4)\r
+/* SSP0 RX DMA selection, (0) = SSP1RX not connected/SPI2 connected,\r
+   (1) = SSP1RX connected/SPI3 not connected */\r
+#define CLKPWR_SSPCTRL_DMA_SSP0RX  _BIT(3)\r
+/* SSP0 TX DMA selection, (0) = SSP1TX not connected/SPI1 connected,\r
+   (1) = SSP1TX connected/SPI4 not connected */\r
+#define CLKPWR_SSPCTRL_DMA_SSP0TX  _BIT(2)\r
+/* SSP0 clock disable (0) / enable (1) bit */\r
+#define CLKPWR_SSPCTRL_SSPCLK1_EN  _BIT(1)\r
+/* SSP0 clock disable (0) / enable (1) bit */\r
+#define CLKPWR_SSPCTRL_SSPCLK0_EN  _BIT(0)
+
+
+/**********************************************************************\r
+* clkpwr_timer_clk_ctrl register definitions\r
+**********************************************************************/\r
+/* High speed timer clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_PWMCLK_HSTIMER_EN   0x2\r
+/* Watchdog timer clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_PWMCLK_WDOG_EN      0x1
+
+
+/**********************************************************************\r
+* clkpwr_macclk_ctrl register definitions\r
+**********************************************************************/\r
+/* Disables ethernet MAC pins */\r
+#define CLKPWR_MACCTRL_NO_ENET_PIS 0x00\r
+/* Ethernet MAC pins setup for MII */\r
+#define CLKPWR_MACCTRL_USE_MII_PINS 0x08\r
+/* Ethernet MAC pins setup for RMII */\r
+#define CLKPWR_MACCTRL_USE_RMII_PINS 0x18\r
+/* Mask for MAC pins selection */\r
+#define CLKPWR_MACCTRL_PINS_MSK    0x18\r
+/* Ethernet MAC DMA clock disable (0) / enable (1) bit */\r
+#define CLKPWR_MACCTRL_DMACLK_EN   _BIT(2)\r
+/* Ethernet MAC MMIO clock disable (0) / enable (1) bit */\r
+#define CLKPWR_MACCTRL_MMIOCLK_EN  _BIT(1)\r
+/* Ethernet MAC host registers clock disable (0) / enable (1) bit */\r
+#define CLKPWR_MACCTRL_HRCCLK_EN   _BIT(0)\r
+
+
+/**********************************************************************\r
+* clkpwr_timers_pwms_clk_ctrl_1 register definitions\r
+**********************************************************************/\r
+/* Timer 3 clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_TMRPWMCLK_TIMER3_EN 0x20\r
+/* Timer 2 clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_TMRPWMCLK_TIMER2_EN 0x10\r
+/* Timer 1 clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_TMRPWMCLK_TIMER1_EN 0x08\r
+/* Timer 0 clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_TMRPWMCLK_TIMER0_EN 0x04\r
+/* PWM 4 clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_TMRPWMCLK_PWM4_EN   0x02\r
+/* PWM 3 clock enable, (0) = disable, (1) = enable */\r
+#define CLKPWR_TMRPWMCLK_PWM3_EN   0x01
+
+
+/*
+ * Macro pointing to Clock and Power control registers
+ */\r
+#define CLKPWR ((CLKPWR_REGS_T *)(CLK_PM_BASE))
+
+/*
+ * Main system clocks
+ */\r
+typedef enum\r
+{\r
+  /* Main oscillator clock */\r
+  CLKPWR_MAINOSC_CLK,\r
+  /* RTC clock */\r
+  CLKPWR_RTC_CLK,\r
+  /* System clock (Main oscillator or PLL397) */\r
+  CLKPWR_SYSCLK,\r
+  /* ARM clock, either HCLK(PLL), SYSCLK, or PERIPH_CLK */\r
+  CLKPWR_ARM_CLK,\r
+  /* HCLK (HCLKPLL divided, SYSCLK, or PERIPH_CLK) */\r
+  CLKPWR_HCLK,\r
+  /* Peripheral clock (HCLKPLL divided or SYSCLK) */\r
+  CLKPWR_PERIPH_CLK,\r
+  /* USB HCLK SYS*/\r
+  CLKPWR_USB_HCLK_SYS,\r
+  /* USB PLL clock */\r
+  CLKPWR_48M_CLK,\r
+  /* DDR clock (HCLKPLL divided or SYSCLK) */\r
+  CLKPWR_DDR_CLK,\r
+  /* Sd card controller */\r
+  CLKPWR_MSSD_CLK,\r
+  CLKPWR_BASE_INVALID\r
+} CLKPWR_BASE_CLOCK_T;
+
+/*
+ * Clock rate fetch function
+ */
+unsigned int sys_get_rate(CLKPWR_BASE_CLOCK_T clkid);
+
+
+
+
+\r
+/**********************************************************************\r
+* Timer/counter register structures\r
+**********************************************************************/\r
+\r
+/* Timer module register structures */\r
+typedef struct\r
+{\r
+  volatile unsigned int ir;          /* Timer interrupt status reg */\r
+  volatile unsigned int tcr;         /* Timer control register */\r
+  volatile unsigned int tc;          /* Timer counter value reg */\r
+  volatile unsigned int pr;          /* Timer prescale register */\r
+  volatile unsigned int pc;          /* Timer prescale counter reg */\r
+  volatile unsigned int mcr;         /* Timer Match control reg */\r
+  volatile unsigned int mr[4];       /* Timer Match registers */\r
+  volatile unsigned int ccr;         /* Timer Capture control reg */\r
+  volatile unsigned int cr[4];       /* Timer Capture registers */\r
+  volatile unsigned int emr;         /* Timer External match reg */\r
+  volatile unsigned int rsvd2[12];   /* Reserved */\r
+  volatile unsigned int ctcr;        /* Timer Count control reg */\r
+} TIMER_CNTR_REGS_T;\r
+\r
+/**********************************************************************\r
+* ir register definitions\r
+* Write a '1' to clear interrupt, reading a '1' indicates active int\r
+**********************************************************************/\r
+/* Macro for getting a timer match interrupt bit */\r
+#define TIMER_CNTR_MTCH_BIT(n)     (1 << ((n) & 0x3))\r
+\r
+/* Macro for getting a capture event interrupt bit */\r
+#define TIMER_CNTR_CAPT_BIT(n)     (1 << (4 + ((n) & 0x3)))\r
+\r
+/**********************************************************************\r
+* tcr register definitions\r
+**********************************************************************/\r
+/* Timer/counter enable bit */\r
+#define TIMER_CNTR_TCR_EN          0x1\r
+\r
+/* Timer/counter reset bit */\r
+#define TIMER_CNTR_TCR_RESET       0x2\r
+\r
+/**********************************************************************\r
+* mcr register definitions\r
+**********************************************************************/\r
+/* Bit location for interrupt on MRx match, n = 0 to 3 */\r
+#define TIMER_CNTR_MCR_MTCH(n)     (0x1 << ((n) * 3))\r
+\r
+/* Bit location for reset on MRx match, n = 0 to 3 */\r
+#define TIMER_CNTR_MCR_RESET(n)    (0x1 << (((n) * 3) + 1))\r
+\r
+/* Bit location for stop on MRx match, n = 0 to 3 */\r
+#define TIMER_CNTR_MCR_STOP(n)     (0x1 << (((n) * 3) + 2))\r
+\r
+/**********************************************************************\r
+* ccr register definitions\r
+**********************************************************************/\r
+/* Bit location for CAP.n on CRx rising edge, n = 0 to 3 */\r
+#define TIMER_CNTR_CCR_CAPNRE(n)   (0x1 << ((n) * 3))\r
+\r
+/* Bit location for CAP.n on CRx falling edge, n = 0 to 3 */\r
+#define TIMER_CNTR_CCR_CAPNFE(n)   (0x1 << (((n) * 3) + 1))\r
+\r
+/* Bit location for CAP.n on CRx interrupt enable, n = 0 to 3 */\r
+#define TIMER_CNTR_CCR_CAPNI(n)    (0x1 << (((n) * 3) + 2))\r
+\r
+/**********************************************************************\r
+* emr register definitions\r
+**********************************************************************/\r
+/* Bit location for output state change of MAT.n when external match\r
+   happens, n = 0 to 3 */\r
+#define TIMER_CNTR_EMR_DRIVE(n)    (1 << (n))\r
+\r
+/* Macro for setting MAT.n soutput state */\r
+#define TIMER_CNTR_EMR_DRIVE_SET(n, s) (((s) & 0x1) << (n))\r
+\r
+/* Output state change of MAT.n when external match happens */\r
+#define TIMER_CNTR_EMR_NOTHING     0x0\r
+#define TIMER_CNTR_EMR_LOW         0x1\r
+#define TIMER_CNTR_EMR_HIGH        0x2\r
+#define TIMER_CNTR_EMR_TOGGLE      0x3\r
+\r
+/* Macro for setting for the MAT.n change state bits */\r
+#define TIMER_CNTR_EMR_EMC_SET(n, s) (((s) & 0x3) << (4 + ((n) * 2)))\r
+\r
+/* Mask for the MAT.n change state bits */\r
+#define TIMER_CNTR_EMR_EMC_MASK(n) (0x3 << (4 + ((n) * 2)))\r
+\r
+/**********************************************************************\r
+* ctcr register definitions\r
+**********************************************************************/\r
+/* Mask to get the Counter/timer mode bits */\r
+#define TIMER_CNTR_CTCR_MODE_MASK  0x3\r
+\r
+/* Mask to get the count input select bits */\r
+#define TIMER_CNTR_CTCR_INPUT_MASK 0xC\r
+\r
+/* Counter/timer modes */\r
+#define TIMER_CNTR_CTCR_TIMER_MODE 0x0\r
+#define TIMER_CNTR_CTCR_TCINC_MODE 0x1\r
+#define TIMER_CNTR_CTCR_TCDEC_MODE 0x2\r
+#define TIMER_CNTR_CTCR_TCBOTH_MODE 0x3\r
+\r
+/* Count input selections */\r
+#define TIMER_CNTR_CTCR_INPUT_CAP0 0x0\r
+#define TIMER_CNTR_CTCR_INPUT_CAP1 0x1\r
+#define TIMER_CNTR_CTCR_INPUT_CAP2 0x2\r
+#define TIMER_CNTR_CTCR_INPUT_CAP3 0x3\r
+\r
+/* Macro for setting the counter/timer mode */\r
+#define TIMER_CNTR_SET_MODE(n)     ((n) & 0x3)\r
+\r
+/* Macro for setting the count input select */\r
+#define TIMER_CNTR_SET_INPUT(n)    (((n) & 0x3) << 2)\r
+\r
+/* Macros pointing to timer registers */\r
+#define TIMER_CNTR0 ((TIMER_CNTR_REGS_T *)(TIMER0_BASE))\r
+#define TIMER_CNTR1 ((TIMER_CNTR_REGS_T *)(TIMER1_BASE))\r
+#define TIMER_CNTR2 ((TIMER_CNTR_REGS_T *)(TIMER2_BASE))\r
+#define TIMER_CNTR3 ((TIMER_CNTR_REGS_T *)(TIMER3_BASE))
+
+
+
+
+
+/* WDT module register structures */\r
+typedef struct\r
+{\r
+  volatile unsigned int wdtim_int;      /* WDT interrupt status register */\r
+  volatile unsigned int wdtim_ctrl;     /* WDT control register */\r
+  volatile unsigned int wdtim_counter;  /* WDT counter value register */\r
+  volatile unsigned int wdtim_mctrl;    /* WDT match control register */\r
+  volatile unsigned int wdtim_match0;   /* WDT match 0 register */\r
+  volatile unsigned int wdtim_emr;      /* WDT external match control reg */\r
+  volatile unsigned int wdtim_pulse;    /* WDT reset pulse length register */\r
+  volatile unsigned int wdtim_res;      /* WDT reset source register */\r
+} WDT_REGS_T;
+
+/**********************************************************************\r
+* wdtim_int register definitions\r
+**********************************************************************/\r
+/* Interrupt flag for MATCH 0 interrupt */\r
+#define WDT_MATCH_INT           _BIT(0)\r
+\r
+/**********************************************************************\r
+* wdtim_ctrl register definitions\r
+**********************************************************************/\r
+#define WDT_COUNT_ENAB          _BIT(0) /* Timer Counter enable */\r
+#define WDT_RESET_COUNT         _BIT(1) /* Timer Counter reset */\r
+#define WDT_PAUSE_EN            _BIT(2) /* Timer Cntr stopped in debug*/\r
+\r
+/**********************************************************************\r
+* wdtim_mctrl register definitions\r
+**********************************************************************/\r
+#define WDT_MR0_INT             _BIT(0) /* Enable WDT int on MR0 */\r
+#define WDT_RESET_COUNT0        _BIT(1) /* Enable WDT reset on MR0 */\r
+#define WDT_STOP_COUNT0         _BIT(2) /* Enable WDT stop on MR0 */\r
+#define WDT_M_RES1              _BIT(3) /* M_RES1 control */\r
+#define WDT_M_RES2              _BIT(4) /* M_RES2 control */\r
+#define WDT_RESFRC1             _BIT(5) /* RESFRC1 control */\r
+#define WDT_RESFRC2             _BIT(6) /* RESFRC2 control */\r
+\r
+/* Macro pointing to WDT registers */\r
+#define WDT ((WDT_REGS_T *)(WDTIM_BASE))
+
+
+
+/* SLC NAND controller module register structures */\r
+typedef struct\r
+{\r
+  volatile unsigned int slc_data;      /* SLC NAND data reg */\r
+  volatile unsigned int slc_addr;      /* SLC NAND address register */\r
+  volatile unsigned int slc_cmd;       /* SLC NAND command reg */\r
+  volatile unsigned int slc_stop;      /* SLC NAND stop register */\r
+  volatile unsigned int slc_ctrl;      /* SLC NAND control reg */\r
+  volatile unsigned int slc_cfg;       /* SLC NAND config register */\r
+  volatile unsigned int slc_stat;      /* SLC NAND status register */\r
+  volatile unsigned int slc_int_stat;  /* SLC NAND int status register */\r
+  volatile unsigned int slc_ien;       /* SLC NAND int enable register */\r
+  volatile unsigned int slc_isr;       /* SLC NAND int set register */\r
+  volatile unsigned int slc_icr;       /* SLC NAND int clear register */\r
+  volatile unsigned int slc_tac;       /* SLC NAND timing register */\r
+  volatile unsigned int slc_tc;        /* SLC NAND transfer count reg */\r
+  volatile unsigned int slc_ecc;       /* SLC NAND parity register */\r
+  volatile unsigned int slc_dma_data;  /* SLC NAND DMA data register */\r
+} SLCNAND_REGS_T;\r
+\r
+/**********************************************************************\r
+* slc_ctrl register definitions\r
+**********************************************************************/\r
+#define SLCCTRL_SW_RESET    _BIT(2) /* Reset the NAND controller bit */\r
+#define SLCCTRL_ECC_CLEAR   _BIT(1) /* Reset ECC bit */\r
+#define SLCCTRL_DMA_START   _BIT(0) /* Start DMA channel bit */\r
+\r
+/**********************************************************************\r
+* slc_cfg register definitions\r
+**********************************************************************/\r
+#define SLCCFG_CE_LOW       _BIT(5) /* Force CE low bit */\r
+#define SLCCFG_DMA_ECC      _BIT(4) /* Enable DMA ECC bit */\r
+#define SLCCFG_ECC_EN       _BIT(3) /* ECC enable bit */\r
+#define SLCCFG_DMA_BURST    _BIT(2) /* DMA burst bit */\r
+#define SLCCFG_DMA_DIR      _BIT(1) /* DMA write(0)/read(1) bit */\r
+#define SLCCFG_WIDTH        _BIT(0) /* External device width, 0=8bit */\r
+\r
+/**********************************************************************\r
+* slc_stat register definitions\r
+**********************************************************************/\r
+#define SLCSTAT_DMA_FIFO    _BIT(2) /* DMA FIFO has data bit */\r
+#define SLCSTAT_SLC_FIFO    _BIT(1) /* SLC FIFO has data bit */\r
+#define SLCSTAT_NAND_READY  _BIT(0) /* NAND device is ready bit */\r
+\r
+/**********************************************************************\r
+* slc_int_stat, slc_ien, slc_isr, and slc_icr register definitions\r
+**********************************************************************/\r
+#define SLCSTAT_INT_TC      _BIT(1) /* Transfer count bit */\r
+#define SLCSTAT_INT_RDY_EN  _BIT(0) /* Ready interrupt bit */\r
+\r
+/**********************************************************************\r
+* slc_tac register definitions\r
+**********************************************************************/\r
+/* Clock setting for RDY write sample wait time in 2*n clocks */\r
+#define SLCTAC_WDR(n)       (((n) & 0xF) << 28)\r
+/* Write pulse width in clocks cycles, 1 to 16 clocks */\r
+#define SLCTAC_WWIDTH(n)    (((n) & 0xF) << 24)\r
+/* Write hold time of control and data signals, 1 to 16 clocks */\r
+#define SLCTAC_WHOLD(n)     (((n) & 0xF) << 20)\r
+/* Write setup time of control and data signals, 1 to 16 clocks */\r
+#define SLCTAC_WSETUP(n)    (((n) & 0xF) << 16)\r
+/* Clock setting for RDY read sample wait time in 2*n clocks */\r
+#define SLCTAC_RDR(n)       (((n) & 0xF) << 12)\r
+/* Read pulse width in clocks cycles, 1 to 16 clocks */\r
+#define SLCTAC_RWIDTH(n)    (((n) & 0xF) << 8)\r
+/* Read hold time of control and data signals, 1 to 16 clocks */\r
+#define SLCTAC_RHOLD(n)     (((n) & 0xF) << 4)\r
+/* Read setup time of control and data signals, 1 to 16 clocks */\r
+#define SLCTAC_RSETUP(n)    (((n) & 0xF) << 0)
+
+/* Macro pointing to SLC NAND controller registers */\r
+#define SLCNAND ((SLCNAND_REGS_T *)(SLC_BASE))
+
+
+
+
+
+
+
+
+
+
+\r
+/**********************************************************************\r
+* Ethernet MAC controller register structures\r
+**********************************************************************/\r
+\r
+/* Ethernet MAC controller module register structures */\r
+typedef struct\r
+{\r
+  /* MAC registers */\r
+  volatile unsigned long mac1;\r
+  volatile unsigned long mac2;\r
+  volatile unsigned long ipgt;\r
+  volatile unsigned long ipgr;\r
+  volatile unsigned long clrt;\r
+  volatile unsigned long maxf;\r
+  volatile unsigned long supp;\r
+  volatile unsigned long test;\r
+  volatile unsigned long mcfg;\r
+  volatile unsigned long mcmd;\r
+  volatile unsigned long madr;\r
+  volatile unsigned long mwtd;\r
+  volatile unsigned long mrdd;\r
+  volatile unsigned long mind;\r
+  volatile unsigned long reserved1 [2];\r
+  volatile unsigned long sa [3];\r
+  volatile unsigned long reserved2 [45];\r
+  /* Control registers */\r
+  volatile unsigned long command;\r
+  volatile unsigned long status;\r
+  volatile unsigned long rxdescriptor;\r
+  volatile unsigned long rxstatus;\r
+  volatile unsigned long rxdescriptornumber;\r
+  volatile unsigned long rxproduceindex;\r
+  volatile unsigned long rxconsumeindex;\r
+  volatile unsigned long txdescriptor;\r
+  volatile unsigned long txstatus;\r
+  volatile unsigned long txdescriptornumber;\r
+  volatile unsigned long txproduceindex;\r
+  volatile unsigned long txconsumeindex;\r
+  volatile unsigned long reserved3 [10];\r
+  volatile unsigned long tsv0;\r
+  volatile unsigned long tsv1;\r
+  volatile unsigned long rsv;\r
+  volatile unsigned long reserved4 [3];\r
+  volatile unsigned long flowcontrolcounter;\r
+  volatile unsigned long flowcontrolstatus;\r
+  volatile unsigned long reserved5 [34];\r
+  /* RX filter registers */\r
+  volatile unsigned long rxfliterctrl;\r
+  volatile unsigned long rxfilterwolstatus;\r
+  volatile unsigned long rxfilterwolclear;\r
+  volatile unsigned long reserved6;\r
+  volatile unsigned long hashfilterL;\r
+  volatile unsigned long hashfilterh;\r
+  volatile unsigned long reserved7 [882];\r
+  /* Module control registers */\r
+  volatile unsigned long intstatus;\r
+  volatile unsigned long intenable;\r
+  volatile unsigned long intclear;\r
+  volatile unsigned long Intset;\r
+  volatile unsigned long reserved8;\r
+  volatile unsigned long powerdown;\r
+  volatile unsigned long reserved9;\r
+} ETHERNET_REGS_T;\r
+\r
+/* Structure of a TX/RX descriptor */\r
+typedef struct\r
+{\r
+  volatile unsigned long packet;\r
+  volatile unsigned long control;\r
+} TXRX_DESC_T;\r
+\r
+/* Structure of a RX status entry */\r
+typedef struct\r
+{\r
+  volatile unsigned long statusinfo;\r
+  volatile unsigned long statushashcrc;\r
+} RX_STATUS_T;\r
+\r
+/**********************************************************************\r
+* mac1 register definitions\r
+**********************************************************************/\r
+/* Set this to allow receive frames to be received. Internally the\r
+   MAC synchronize this control bit to the incoming receive stream */\r
+#define MAC1_RECV_ENABLE               _BIT(0)\r
+/* When enabled (set to \921\92), the MAC will pass all frames regardless\r
+   of type (normal vs. Control). When disabled, the MAC does not pass\r
+   valid Control frames */\r
+#define MAC1_PASS_ALL_RX_FRAMES        _BIT(1)\r
+/* When enabled (set to \921\92), the MAC acts upon received PAUSE Flow\r
+   Control frames. When disabled, received PAUSE Flow Control frames\r
+   are ignored */\r
+#define MAC1_RX_FLOW_CONTROL           _BIT(2)\r
+/* When enabled (set to \921\92), PAUSE Flow Control frames are allowed\r
+   to be transmitted. When disabled, Flow Control frames are blocked */\r
+#define MAC1_TX_FLOW_CONTROL           _BIT(3)\r
+/* Setting this bit will cause the MAC Transmit interface to be\r
+   looped back to the MAC Receive interface. Clearing this bit\r
+   results in normal operation */\r
+#define MAC1_LOOPBACK                  _BIT(4)\r
+/* Setting this bit will put the Transmit Function logic in reset */\r
+#define MAC1_RESET_TX                  _BIT(8)\r
+/* Setting this bit resets the MAC Control Sublayer / Transmit logic.\r
+   The MCS logic implements flow control */\r
+#define MAC1_RESET_MCS_TX              _BIT(9)\r
+/* Setting this bit will put the Ethernet receive logic in reset */\r
+#define MAC1_RESET_RX                  _BIT(10)\r
+/* Setting this bit resets the MAC Control Sublayer / Receive logic.\r
+   The MCS logic implements flow control */\r
+#define MAC1_RESET_MCS_RX              _BIT(11)\r
+/* Setting this bit will cause a reset to the random number generator\r
+   within the Transmit Function */\r
+#define MAC1_SIMULATION_RESET          _BIT(14)\r
+/* Setting this bit will put all modules within the MAC in reset\r
+   except the Host Interface */\r
+#define MAC1_SOFT_RESET                _BIT(15)\r
+\r
+/**********************************************************************\r
+* mac2 register definitions\r
+**********************************************************************/\r
+/* When enabled (set to \921\92), the MAC operates in Full-Duplex mode.\r
+   When disabled the MAC operates in Half-Duplex mode */\r
+#define MAC2_FULL_DUPLEX               _BIT(0)\r
+/* When enabled (set to \921\92), both transmit and receive frame lengths\r
+   are compared to the Length/Type field. If the Length/Type field\r
+   represents a length then the check is performed. Mismatches are\r
+   reported in the StatusInfo word for each received frame */\r
+#define MAC2_FRAME_LENGTH_CHECKING     _BIT(1)\r
+/* When enabled (set to \921\92), frames of any length are transmitted\r
+   and received */\r
+#define MAC2_HUGH_LENGTH_CHECKING      _BIT(2)\r
+/* This bit determines the number of bytes, if any, of proprietary\r
+   header information that exist on the front of IEEE 802.3 frames.\r
+   When 1, four bytes of header (ignored by the CRC function) are\r
+   added. When 0, there is no proprietary header */\r
+#define MAC2_DELAYED_CRC               _BIT(3)\r
+/* Set this bit to append a CRC to every frame whether padding was\r
+   required or not. Must be set if PAD/CRC ENABLE is set. Clear this\r
+   bit if frames presented to the MAC contain a CRC */\r
+#define MAC2_CRC_ENABLE                _BIT(4)\r
+/* Set this bit to have the MAC pad all short frames. Clear this bit\r
+   if frames presented to the MAC have a valid length. This bit is used\r
+   in conjunction with AUTO PAD ENABLE and VLAN PAD ENABLE */\r
+#define MAC2_PAD_CRC_ENABLE            _BIT(5)\r
+/* Set this bit to cause the MAC to pad all short frames to 64 bytes\r
+   and append a valid CRC. Note: This bit is ignored if\r
+   MAC2_PAD_CRC_ENABLE is cleared */\r
+#define MAC2_VLAN_PAD_ENABLE           _BIT(6)\r
+/* Set this bit to cause the MAC to automatically detect the type of\r
+   frame, either tagged or un-tagged, by comparing the two octets\r
+   following the source address with 0x8100 (VLAN Protocol ID) and\r
+   pad accordingly. Table 14\96273 - Pad Operation provides a description\r
+   of the pad function based on the configuration of this register.\r
+   Note: This bit is ignored if PAD / CRC ENABLE is cleared */\r
+#define MAC2_AUTO_DETECT_PAD_ENABLE    _BIT(7)\r
+/* When enabled (set to \921\92), the MAC will verify the content of the\r
+   preamble to ensure it contains 0x55 and is error-free. A packet\r
+   with an incorrect preamble is discarded. When disabled, no preamble\r
+   checking is performed */\r
+#define MAC2_PURE_PREAMBLE_ENFORCEMENT _BIT(8)\r
+/* When enabled (set to \921\92), the MAC only allows receive packets\r
+   which contain preamble fields less than 12 bytes in length. When\r
+   disabled, the MAC allows any length preamble as per the Standard */\r
+#define MAC2_LONG_PREAMBLE_ENFORCEMENT _BIT(9)\r
+/* When enabled (set to \921\92), the MAC will immediately retransmit\r
+   following a collision rather than using the Binary Exponential\r
+   Backoff algorithm as specified in the Standard */\r
+#define MAC2_NO_BACKOFF                _BIT(12)\r
+/* When enabled (set to \921\92), after the MAC incidentally causes a\r
+   collision during back pressure, it will immediately retransmit\r
+   without backoff, reducing the chance of further collisions and\r
+   ensuring transmit packets get sent */\r
+#define MAC2_BACK_PRESSURE             _BIT(13)\r
+/* When enabled (set to \921\92) the MAC will defer to carrier indefinitely\r
+   as per the Standard. When disabled, the MAC will abort when the\r
+   excessive deferral limit is reached */\r
+#define MAC2_EXCESS_DEFER              _BIT(14)\r
+\r
+/**********************************************************************\r
+* ipgt register definitions\r
+**********************************************************************/\r
+/* This is a programmable field representing the nibble time offset\r
+   of the minimum possible period between the end of any transmitted\r
+   packet to the beginning of the next. In Full-Duplex mode, the\r
+   register value should be the desired period in nibble times minus 3.\r
+   In Half-Duplex mode, the register value should be the desired\r
+   period in nibble times minus 6. In Full-Duplex the recommended\r
+   setting is 0x15 (21d), which represents the minimum IPG of 960 ns\r
+   (in 100 Mbps mode) or 9.6 ?s (in 10 Mbps mode). In Half-Duplex the\r
+   recommended setting is 0x12 (18d), which also represents the minimum\r
+   IPG of 960 ns (in 100 Mbps mode) or 9.6 ?s (in 10 Mbps mode) */\r
+#define IPGT_LOAD(n)                   ((n) & 0x7F)\r
+\r
+/**********************************************************************\r
+* ipgr register definitions\r
+**********************************************************************/\r
+/* This is a programmable field representing the Non-Back-to-Back\r
+   Inter-Packet-Gap. The recommended value is 0x12 (18d), which\r
+   represents the minimum IPG of 960 ns (in 100 Mbps mode) or 9.6 ?s\r
+   (in 10 Mbps mode) */\r
+#define IPGR_LOAD_PART2(n)             ((n) & 0x7F)\r
+/* This is a programmable field representing the optional carrierSense\r
+   window referenced in IEEE 802.3/4.2.3.2.1 'Carrier Deference'. If\r
+   carrier is detected during the timing of IPGR1, the MAC defers to\r
+   carrier. If, however, carrier becomes active after IPGR1, the MAC\r
+   continues timing IPGR2 and transmits, knowingly causing a collision,\r
+   thus ensuring fair access to medium. Its range of values is 0x0 to\r
+   IPGR2. The recommended value is 0xC (12d) */\r
+#define IPGR_LOAD_PART1(n)             (((n) & 0x7F) << 8)\r
+\r
+/**********************************************************************\r
+* clrt register definitions\r
+**********************************************************************/\r
+/* This is a programmable field specifying the number of\r
+   retransmission attempts following a collision before aborting the\r
+   packet due to excessive collisions. The Standard specifies the\r
+   attemptLimit to be 0xF (15d). See IEEE 802.3/4.2.3.2.5. */\r
+#define CLRT_LOAD_RETRY_MAX(n)         ((n) & 0xF)\r
+/* This is a programmable field representing the slot time or\r
+   collision window during which collisions occur in properly\r
+   configured networks. The default value of 0x37 (55d) represents a\r
+   56 byte window following the preamble and SFD. */\r
+#define CLRT_LOAD_COLLISION_WINDOW(n)  (((n) & 0x3F) << 8)\r
+\r
+/**********************************************************************\r
+* maxf register definitions\r
+**********************************************************************/\r
+/* This field resets to the value 0x0600, which represents a maximum\r
+   receive frame of 1536 octets. An untagged maximum size Ethernet\r
+   frame is 1518 octets. A tagged frame adds four octets for a total\r
+   of 1522 octets. If a shorter maximum length restriction is desired,\r
+   program this 16 bit field. */\r
+#define MAXF_LOAD_MAX_FRAME_LEN(n)     ((n) & 0xFFFF)\r
+\r
+/**********************************************************************\r
+* supp register definitions\r
+**********************************************************************/\r
+/* This bit configures the Reduced MII logic for the current operating\r
+   speed. When set, 100 Mbps mode is selected. When cleared, 10 Mbps\r
+   mode is selected */\r
+#define SUPP_SPEED                     _BIT(8)\r
+/* Reset Reduced MII Logic */\r
+#define SUPP_RESET_RMII                _BIT(11)\r
+\r
+/**********************************************************************\r
+* test register definitions\r
+**********************************************************************/\r
+/* This bit reduces the effective PAUSE quanta from 64 byte-times to\r
+   1 byte-time. */\r
+#define TEST_SHORTCUT_PAUSE_QUANTA     _BIT(0)\r
+/* This bit causes the MAC Control sublayer to inhibit transmissions,\r
+   just as if a PAUSE Receive Control frame with a nonzero pause time\r
+   parameter was received. */\r
+#define TEST_PAUSE                     _BIT(1)\r
+/* Setting this bit will cause the MAC to assert backpressure on the\r
+   link. Backpressure causes preamble to be transmitted, raising\r
+   carrier sense. A transmit packet from the system will be sent\r
+   during backpressure. */\r
+#define TEST_BACKPRESSURE              _BIT(2)\r
+\r
+/**********************************************************************\r
+* mcfg register definitions\r
+**********************************************************************/\r
+/* Set this bit to cause the MII Management hardware to perform read\r
+   cycles across a range of PHYs. When set, the MII Management\r
+   hardware will perform read cycles from address 1 through the value\r
+   set in PHY ADDRESS[4:0]. Clear this bit to allow continuous reads\r
+   of the same PHY. */\r
+#define MCFG_SCAN_INCREMENT            _BIT(0)\r
+/* Set this bit to cause the MII Management hardware to perform\r
+   read/write cycles without the 32 bit preamble field. Clear this bit\r
+   to cause normal cycles to be performed. Some PHYs support\r
+   suppressed preamble. */\r
+#define MCFG_SUPPRESS_PREAMBLE         _BIT(1)\r
+/* This field is used by the clock divide logic in creating the MII\r
+   Management Clock (MDC) which IEEE 802.3u defines to be no faster\r
+   than 2.5 MHz. Some PHYs support clock rates up to 12.5 MHz,\r
+   however. Refer to Table 14\96280 below for the definition of values\r
+   for this field. */\r
+#define MCFG_CLOCK_SELECT(n)           (((n) & 0x7) << 2)\r
+/* MCFG_CLOCK_SELECT macro load values */\r
+#define MCFG_CLOCK_HOST_DIV_4          0\r
+#define MCFG_CLOCK_HOST_DIV_6          2\r
+#define MCFG_CLOCK_HOST_DIV_8          3\r
+#define MCFG_CLOCK_HOST_DIV_10         4\r
+#define MCFG_CLOCK_HOST_DIV_14         5\r
+#define MCFG_CLOCK_HOST_DIV_20         6\r
+#define MCFG_CLOCK_HOST_DIV_28         7\r
+/* This bit resets the MII Management hardware */\r
+#define MCFG_RESET_MII_MGMT            _BIT(15)\r
+\r
+/**********************************************************************\r
+* mcmd register definitions\r
+**********************************************************************/\r
+/* This bit causes the MII Management hardware to perform a single\r
+   Read cycle. The Read data is returned in Register MRDD (MII Mgmt\r
+   Read Data). */\r
+#define MCMD_READ                      _BIT(0)\r
+/* This bit causes the MII Management hardware to perform Read cycles\r
+   continuously. This is useful for monitoring Link Fail for example */\r
+#define MCMD_SCAN                      _BIT(1)\r
+\r
+/**********************************************************************\r
+* madr register definitions\r
+**********************************************************************/\r
+/* This field represents the 5 bit Register Address field of Mgmt\r
+   cycles. Up to 32 registers can be accessed. */\r
+#define MADR_REGISTER_ADDRESS(n)       ((n) & 0x1F)\r
+/* This field represents the 5 bit PHY Address field of Mgmt\r
+   cycles. Up to 31 PHYs can be addressed (0 is reserved). */\r
+#define MADR_PHY_0ADDRESS(n)           (((n) & 0x1F) << 8)\r
+\r
+/**********************************************************************\r
+* mwtd register definitions\r
+**********************************************************************/\r
+/* When written, an MII Mgmt write cycle is performed using the 16 bit\r
+   data and the pre-configured PHY and Register addresses from the\r
+   MII Mgmt Address register (MADR). */\r
+#define MWDT_WRITE(n)                  ((n) & 0xFFFF)\r
+\r
+/**********************************************************************\r
+* mrdd register definitions\r
+**********************************************************************/\r
+/* Read mask for MUU read */\r
+#define MRDD_READ_MASK                 0xFFFF\r
+\r
+/**********************************************************************\r
+* mind register definitions\r
+**********************************************************************/\r
+/* When \921\92 is returned - indicates MII Mgmt is currently performing\r
+   an MII Mgmt Read or Write cycle. */\r
+#define MIND_BUSY                      _BIT(0)\r
+/* When \921\92 is returned - indicates a scan operation (continuous MII\r
+   Mgmt Read cycles) is in progress. */\r
+#define MIND_SCANNING                  _BIT(1)\r
+/* When \921\92 is returned - indicates MII Mgmt Read cycle has not\r
+   completed and the Read Data is not yet valid. */\r
+#define MIND_NOT_VALID                 _BIT(2)\r
+/* When \921\92 is returned - indicates that an MII Mgmt link fail has\r
+   occurred.*/\r
+#define MIND_MII_LINK_FAIL             _BIT(3)\r
+\r
+/**********************************************************************\r
+* command register definitions\r
+**********************************************************************/\r
+/* Enable receive */\r
+#define COMMAND_RXENABLE               _BIT(0)\r
+/* Enable transmit */\r
+#define COMMAND_TXENABLE               _BIT(1)\r
+/* When a \921\92 is written, all datapaths and the host registers are\r
+   reset. The MAC needs to be reset separately. */\r
+#define COMMAND_REG_RESET              _BIT(3)\r
+/* When a \921\92 is written, the transmit datapath is reset. */\r
+#define COMMAND_TXRESET                _BIT(4)\r
+/* When a \921\92 is written, the receive datapath is reset. */\r
+#define COMMAND_RXRESET                _BIT(5)\r
+/* When set to \921\92, passes runt frames smaller than 64 bytes to\r
+   memory unless they have a CRC error. If \920\92 runt frames are\r
+   filtered out. */\r
+#define COMMAND_PASSRUNTFRAME          _BIT(6)\r
+/* When set to \921\92, disables receive filtering i.e. all frames\r
+   received are written to memory. */\r
+#define COMMAND_PASSRXFILTER           _BIT(7)\r
+/* Enable IEEE 802.3 / clause 31 flow control sending pause\r
+   frames in full duplex and continuous preamble in half duplex. */\r
+#define COMMAND_TXFLOWCONTROL          _BIT(8)\r
+/* When set to \921\92, RMII mode is selected; if \920\92, MII mode is\r
+   selected. */\r
+#define COMMAND_RMII                   _BIT(9)\r
+/* When set to \921\92, indicates full duplex operation. */\r
+#define COMMAND_FULLDUPLEX             _BIT(10)\r
+\r
+/**********************************************************************\r
+* status register definitions\r
+**********************************************************************/\r
+/* If 1, the receive channel is active. If 0, the receive channel is\r
+   inactive. */\r
+#define STATUS_RXACTIVE                _BIT(0)\r
+/* If 1, the transmit channel is active. If 0, the transmit channel is\r
+   inactive. */\r
+#define STATUS_TXACTIVE                _BIT(1)\r
+\r
+/**********************************************************************\r
+* tsv0 register definitions\r
+**********************************************************************/\r
+/* The attached CRC in the packet did not match the internally\r
+   generated CRC. */\r
+#define TSV0_CRC_ERROR                 _BIT(0)\r
+/* Indicates the frame length field does not match the actual\r
+   number of data items and is not a type field. */\r
+#define TSV0_LENGTH_CHECK_ERROR        _BIT(1)\r
+/* Indicates that frame type/length field was larger tha 1500 bytes. */\r
+#define TSV0_LENGTH_OUT_OF_RANGE       _BIT(2)\r
+/* Transmission of packet was completed. */\r
+#define TSV0_DONE                      _BIT(3)\r
+/* Packet\92s destination was a multicast address. */\r
+#define TSV0_MULTICAST                 _BIT(4)\r
+/* Packet\92s destination was a broadcast address. */\r
+#define TSV0_BROADCAST                 _BIT(5)\r
+/* Packet was deferred for at least one attempt, but less than\r
+   an excessive defer. */\r
+#define TSV0_PACKET_DEFER              _BIT(6)\r
+/* Packet was deferred in excess of 6071 nibble times in\r
+   100 Mbps or 24287 bit times in 10 Mbps mode. */\r
+#define TSV0_ESCESSIVE_DEFER           _BIT(7)\r
+/* Packet was aborted due to exceeding of maximum allowed\r
+   number of collisions. */\r
+#define TSV0_ESCESSIVE_COLLISION       _BIT(8)\r
+/* Collision occurred beyond collision window, 512 bit times. */\r
+#define TSV0_LATE_COLLISION            _BIT(9)\r
+/* Byte count in frame was greater than can be represented\r
+   in the transmit byte count field in TSV1. */\r
+#define TSV0_GIANT                     _BIT(10)\r
+/* Host side caused buffer underrun. */\r
+#define TSV0_UNDERRUN                  _BIT(11)\r
+/* Macro: The total number of bytes transferred including\r
+   collided attempts. */\r
+#define TSV0_TOTAL_BYTES(n)            (((n) >> 12) & 0xFFFF)\r
+/* The frame was a control frame. */\r
+#define TSV0_CONTROL_FRAME             _BIT(28)\r
+/* The frame was a control frame with a valid PAUSE opcode. */\r
+#define TSV0_PAUSE                     _BIT(29)\r
+/* Carrier-sense method backpressure was previously applied. */\r
+#define TSV0_BACKPRESSURE              _BIT(30)\r
+/* Frame\92s length/type field contained 0x8100 which is the\r
+   VLAN protocol identifier. */\r
+#define TSV0_VLAN                      _BIT(31)\r
+\r
+/**********************************************************************\r
+* tsv1 register definitions\r
+**********************************************************************/\r
+/* Macro: The total number of bytes in the frame, not counting the\r
+   collided bytes. */\r
+#define TSV1_TRANSMIT_BYTE_COUNT(n)    ((n) & 0xFFFF)\r
+/* Macro: Number of collisions the current packet incurred during\r
+   transmission attempts. The maximum number of collisions\r
+   (16) cannot be represented. */\r
+#define TSV1_COLLISION_COUNT(n)        (((n) >> 16) & 0xF)\r
+\r
+/**********************************************************************\r
+* rsv register definitions\r
+**********************************************************************/\r
+/* Macro: Indicates length of received frame. */\r
+#define RSV_RECEIVED_BYTE_COUNT(n)     ((n) & 0xFFFF)\r
+/* Indicates that a packet was dropped. */\r
+#define RSV_RXDV_EVENT_IGNORED         _BIT(16)\r
+/* Indicates that the last receive event seen was not long\r
+   enough to be a valid packet. */\r
+#define RSV_RXDV_EVENT_PREVIOUSLY_SEEN _BIT(17)\r
+/* Indicates that at some time since the last receive statistics,\r
+   a carrier event was detected. */\r
+#define RSV_CARRIER_EVNT_PREVIOUS_SEEN _BIT(18)\r
+/* Indicates that MII data does not represent a valid receive\r
+   code. */\r
+#define RSV_RECEIVE_CODE_VIOLATION     _BIT(19)\r
+/* The attached CRC in the packet did not match the internally\r
+   generated CRC. */\r
+#define RSV_CRC_ERROR                  _BIT(20)\r
+/* Indicates the