diff options
author | Denys Dmytriyenko <denis@denix.org> | 2009-03-17 14:32:59 -0400 |
---|---|---|
committer | Denys Dmytriyenko <denis@denix.org> | 2009-03-17 14:32:59 -0400 |
commit | 709c4d66e0b107ca606941b988bad717c0b45d9b (patch) | |
tree | 37ee08b1eb308f3b2b6426d5793545c38396b838 /packages/u-boot/u-boot-1.1.2 | |
parent | fa6cd5a3b993f16c27de4ff82b42684516d433ba (diff) |
rename packages/ to recipes/ per earlier agreement
See links below for more details:
http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326
http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816
Signed-off-by: Denys Dmytriyenko <denis@denix.org>
Acked-by: Mike Westerhof <mwester@dls.net>
Acked-by: Philip Balister <philip@balister.org>
Acked-by: Khem Raj <raj.khem@gmail.com>
Acked-by: Marcin Juszkiewicz <hrw@openembedded.org>
Acked-by: Koen Kooi <koen@openembedded.org>
Acked-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'packages/u-boot/u-boot-1.1.2')
-rw-r--r-- | packages/u-boot/u-boot-1.1.2/arm_flags.patch | 15 | ||||
-rw-r--r-- | packages/u-boot/u-boot-1.1.2/cmd-arm-linux.patch | 122 | ||||
-rw-r--r-- | packages/u-boot/u-boot-1.1.2/command-names.patch | 340 | ||||
-rw-r--r-- | packages/u-boot/u-boot-1.1.2/mnci-jffs2.patch | 16 | ||||
-rw-r--r-- | packages/u-boot/u-boot-1.1.2/mnci.patch | 1007 | ||||
-rw-r--r-- | packages/u-boot/u-boot-1.1.2/oxnas.patch | 7257 | ||||
-rw-r--r-- | packages/u-boot/u-boot-1.1.2/u-boot-1.1.2-neon.patch | 19155 | ||||
-rw-r--r-- | packages/u-boot/u-boot-1.1.2/u-boot-emetec.patch | 2170 |
8 files changed, 0 insertions, 30082 deletions
diff --git a/packages/u-boot/u-boot-1.1.2/arm_flags.patch b/packages/u-boot/u-boot-1.1.2/arm_flags.patch deleted file mode 100644 index 48c7b78043..0000000000 --- a/packages/u-boot/u-boot-1.1.2/arm_flags.patch +++ /dev/null @@ -1,15 +0,0 @@ - -# -# Patch managed by http://www.holgerschurig.de/patcher.html -# - ---- u-boot-1.1.2/cpu/pxa/config.mk~armflags -+++ u-boot-1.1.2/cpu/pxa/config.mk -@@ -23,6 +23,6 @@ - # - - PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \ -- -mshort-load-bytes -msoft-float -+ -msoft-float - - PLATFORM_CPPFLAGS += -mapcs-32 -march=armv4 -mtune=strongarm1100 diff --git a/packages/u-boot/u-boot-1.1.2/cmd-arm-linux.patch b/packages/u-boot/u-boot-1.1.2/cmd-arm-linux.patch deleted file mode 100644 index e7ef37e061..0000000000 --- a/packages/u-boot/u-boot-1.1.2/cmd-arm-linux.patch +++ /dev/null @@ -1,122 +0,0 @@ - -# -# Patch managed by http://www.holgerschurig.de/patcher.html -# - ---- u-boot-1.1.2/include/cmd_confdefs.h~cmd-arm-linux -+++ u-boot-1.1.2/include/cmd_confdefs.h -@@ -92,6 +92,7 @@ - #define CFG_CMD_XIMG 0x0400000000000000ULL /* Load part of Multi Image */ - #define CFG_CMD_UNIVERSE 0x0800000000000000ULL /* Tundra Universe Support */ - #define CFG_CMD_EXT2 0x1000000000000000ULL /* EXT2 Support */ -+#define CFG_CMD_LINUX 0x2000000000000000ULL /* boot zImage directly */ - - #define CFG_CMD_ALL 0xFFFFFFFFFFFFFFFFULL /* ALL commands */ - ---- u-boot-1.1.2/lib_arm/armlinux.c~cmd-arm-linux -+++ u-boot-1.1.2/lib_arm/armlinux.c -@@ -271,6 +271,104 @@ - } - - -+#if (CONFIG_COMMANDS & CFG_CMD_LINUX) -+void do_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ ulong initrd_start = 0; -+ ulong initrd_end = 0; -+ ulong data; -+ void (*theKernel)(int zero, int arch, uint params); -+ bd_t *bd = gd->bd; -+ -+ -+#ifdef CONFIG_CMDLINE_TAG -+ char cmdline[128]; -+ char *s; -+#endif -+ -+#ifdef CONFIG_CMDLINE_TAG -+ if (argc > 1) { -+ ulong len; -+ int i; -+ -+ for (i=1, len=0 ; i<argc ; i+=1) { -+ if (i > 1) -+ cmdline[len++] = ' '; -+ strcpy (&cmdline[len], argv[i]); -+ len += strlen(argv[i]); -+ } -+ } else -+ if ((s = getenv("bootargs")) != NULL) { -+ strcpy(cmdline, s); -+ } else { -+ strcpy(cmdline, ""); -+ } -+#endif -+ -+ theKernel = (void (*)(int, int, uint))load_addr; -+ -+ SHOW_BOOT_PROGRESS (14); -+ -+#ifdef DEBUG -+ printf ("## Transferring control to Linux (at address %08lx) ...\n", -+ (ulong)theKernel); -+#endif -+ -+#if defined (CONFIG_SETUP_MEMORY_TAGS) || \ -+ defined (CONFIG_CMDLINE_TAG) || \ -+ defined (CONFIG_INITRD_TAG) || \ -+ defined (CONFIG_SERIAL_TAG) || \ -+ defined (CONFIG_REVISION_TAG) || \ -+ defined (CONFIG_LCD) || \ -+ defined (CONFIG_VFD) -+ setup_start_tag(bd); -+#ifdef CONFIG_SERIAL_TAG -+ setup_serial_tag(¶ms); -+#endif -+#ifdef CONFIG_REVISION_TAG -+ setup_revision_tag(¶ms); -+#endif -+#ifdef CONFIG_SETUP_MEMORY_TAGS -+ setup_memory_tags(bd); -+#endif -+#ifdef CONFIG_CMDLINE_TAG -+ setup_commandline_tag(bd, cmdline); -+#endif -+#ifdef CONFIG_INITRD_TAG -+ setup_initrd_tag(bd, initrd_start, initrd_end); -+#endif -+#if defined (CONFIG_VFD) || defined (CONFIG_LCD) -+ setup_videolfb_tag ((gd_t *) gd); -+#endif -+ setup_end_tag(bd); -+#endif -+ -+ /* we assume that the kernel is in place */ -+ printf("\nStarting kernel ...\n"); -+ -+#ifdef CONFIG_USB_DEVICE -+ { -+ extern void udc_disconnect (void); -+ udc_disconnect (); -+ } -+#endif -+ cleanup_before_linux(); -+ -+ //TODO: CONFIG_TAG_ADDR is now bd->bi_boot_params ? -+ theKernel(0, bd->bi_arch_number, bd->bi_boot_params); -+} -+ -+ -+U_BOOT_CMD( -+ linux, CFG_MAXARGS, 0, do_linux, -+ "linux - boot Linux zImage directly\n", -+ "[arg ...]\n - boot Linux zImage, passing arguments 'arg ...'\n" -+); -+#endif -+ -+ - #if defined (CONFIG_SETUP_MEMORY_TAGS) || \ - defined (CONFIG_CMDLINE_TAG) || \ - defined (CONFIG_INITRD_TAG) || \ diff --git a/packages/u-boot/u-boot-1.1.2/command-names.patch b/packages/u-boot/u-boot-1.1.2/command-names.patch deleted file mode 100644 index dd9a7fab44..0000000000 --- a/packages/u-boot/u-boot-1.1.2/command-names.patch +++ /dev/null @@ -1,340 +0,0 @@ - -# -# Patch managed by http://www.holgerschurig.de/patcher.html -# - ---- u-boot-1.1.2/common/cmd_mem.c~command-names -+++ u-boot-1.1.2/common/cmd_mem.c -@@ -1188,56 +1188,56 @@ - /**************************************************/ - #if (CONFIG_COMMANDS & CFG_CMD_MEMORY) - U_BOOT_CMD( -- md, 3, 1, do_mem_md, -- "md - memory display\n", -+ memdump, 3, 1, do_mem_md, -+ "memdump - memory display\n", - "[.b, .w, .l] address [# of objects]\n - memory display\n" - ); - - - U_BOOT_CMD( -- mm, 2, 1, do_mem_mm, -- "mm - memory modify (auto-incrementing)\n", -+ memmod, 2, 1, do_mem_mm, -+ "memmod - memory modify (auto-incrementing)\n", - "[.b, .w, .l] address\n" " - memory modify, auto increment address\n" - ); - - - U_BOOT_CMD( -- nm, 2, 1, do_mem_nm, -- "nm - memory modify (constant address)\n", -+ memchg, 2, 1, do_mem_nm, -+ "memchg - memory modify (constant address)\n", - "[.b, .w, .l] address\n - memory modify, read and keep address\n" - ); - - U_BOOT_CMD( -- mw, 4, 1, do_mem_mw, -- "mw - memory write (fill)\n", -+ memfill, 4, 1, do_mem_mw, -+ "memfill - fill write\n", - "[.b, .w, .l] address value [count]\n - write memory\n" - ); - - U_BOOT_CMD( -- cp, 4, 1, do_mem_cp, -- "cp - memory copy\n", -+ memcp, 4, 1, do_mem_cp, -+ "memcp - copy memory\n", - "[.b, .w, .l] source target count\n - copy memory\n" - ); - - U_BOOT_CMD( -- cmp, 4, 1, do_mem_cmp, -- "cmp - memory compare\n", -+ memcmp, 4, 1, do_mem_cmp, -+ "memcmp - compary memory\n", - "[.b, .w, .l] addr1 addr2 count\n - compare memory\n" - ); - - #ifndef CONFIG_CRC32_VERIFY - - U_BOOT_CMD( -- crc32, 4, 1, do_mem_crc, -- "crc32 - checksum calculation\n", -+ memcrc, 4, 1, do_mem_crc, -+ "memcrc - checksum memory\n", - "address count [addr]\n - compute CRC32 checksum [save at addr]\n" - ); - - #else /* CONFIG_CRC32_VERIFY */ - - U_BOOT_CMD( -- crc32, 5, 1, do_mem_crc, -- "crc32 - checksum calculation\n", -+ memcrc, 5, 1, do_mem_crc, -+ "memcrc - checksum memory\n", - "address count [addr]\n - compute CRC32 checksum [save at addr]\n" - "-v address count crc\n - verify crc of memory area\n" - ); -@@ -1245,31 +1245,31 @@ - #endif /* CONFIG_CRC32_VERIFY */ - - U_BOOT_CMD( -- base, 2, 1, do_mem_base, -- "base - print or set address offset\n", -+ membase, 2, 1, do_mem_base, -+ "membase - print/set memory offset\n", - "\n - print address offset for memory commands\n" -- "base off\n - set address offset for memory commands to 'off'\n" -+ "[offset]\n - set address offset for memory commands to 'offset'\n" - ); - - U_BOOT_CMD( -- loop, 3, 1, do_mem_loop, -- "loop - infinite loop on address range\n", -+ memloop, 3, 1, do_mem_loop, -+ "memloop - infinite loop on address range\n", - "[.b, .w, .l] address number_of_objects\n" - " - loop on a set of addresses\n" - ); - - #ifdef CONFIG_LOOPW - U_BOOT_CMD( -- loopw, 4, 1, do_mem_loopw, -- "loopw - infinite write loop on address range\n", -+ memloopw, 4, 1, do_mem_loopw, -+ "memloopw- infinite write loop on address range\n", - "[.b, .w, .l] address number_of_objects data_to_write\n" - " - loop on a set of addresses\n" - ); - #endif /* CONFIG_LOOPW */ - - U_BOOT_CMD( -- mtest, 4, 1, do_mem_mtest, -- "mtest - simple RAM test\n", -+ memtest, 4, 1, do_mem_mtest, -+ "memtest - simple RAM test\n", - "[start [end [pattern]]]\n" - " - simple RAM read/write test\n" - ); ---- u-boot-1.1.2/common/cmd_flash.c~command-names -+++ u-boot-1.1.2/common/cmd_flash.c -@@ -507,30 +507,30 @@ - ); - - U_BOOT_CMD( -- erase, 3, 1, do_flerase, -- "erase - erase FLASH memory\n", -+ flerase, 3, 1, do_flerase, -+ "flerase - erase FLASH memory\n", - "start end\n" - " - erase FLASH from addr 'start' to addr 'end'\n" -- "erase N:SF[-SL]\n - erase sectors SF-SL in FLASH bank # N\n" -- "erase bank N\n - erase FLASH bank # N\n" -- "erase all\n - erase all FLASH banks\n" -+ "flerase N:SF[-SL]\n - erase sectors SF-SL in FLASH bank # N\n" -+ "flerase bank N\n - erase FLASH bank # N\n" -+ "flerase all\n - erase all FLASH banks\n" - ); - - U_BOOT_CMD( -- protect, 4, 1, do_protect, -- "protect - enable or disable FLASH write protection\n", -+ flprot, 4, 1, do_protect, -+ "flprot - enable or disable FLASH write protection\n", - "on start end\n" - " - protect FLASH from addr 'start' to addr 'end'\n" -- "protect on N:SF[-SL]\n" -+ "flprot on N:SF[-SL]\n" - " - protect sectors SF-SL in FLASH bank # N\n" -- "protect on bank N\n - protect FLASH bank # N\n" -- "protect on all\n - protect all FLASH banks\n" -- "protect off start end\n" -+ "flprot on bank N\n - protect FLASH bank # N\n" -+ "flprot on all\n - protect all FLASH banks\n" -+ "flprot off start end\n" - " - make FLASH from addr 'start' to addr 'end' writable\n" -- "protect off N:SF[-SL]\n" -+ "flprot off N:SF[-SL]\n" - " - make sectors SF-SL writable in FLASH bank # N\n" -- "protect off bank N\n - make FLASH bank # N writable\n" -- "protect off all\n - make all FLASH banks writable\n" -+ "flprot off bank N\n - make FLASH bank # N writable\n" -+ "flprot off all\n - make all FLASH banks writable\n" - ); - - #endif /* CFG_CMD_FLASH */ ---- u-boot-1.1.2/common/cmd_bootm.c~command-names -+++ u-boot-1.1.2/common/cmd_bootm.c -@@ -446,8 +446,8 @@ - } - - U_BOOT_CMD( -- bootm, CFG_MAXARGS, 1, do_bootm, -- "bootm - boot application image from memory\n", -+ imgboot, CFG_MAXARGS, 1, do_bootm, -+ "imgboot - boot application image from memory\n", - "[addr [arg ...]]\n - boot application image stored in memory\n" - "\tpassing arguments 'arg ...'; when booting a Linux kernel,\n" - "\t'arg' can be the address of an initrd image\n" -@@ -1056,8 +1056,8 @@ - } - - U_BOOT_CMD( -- iminfo, CFG_MAXARGS, 1, do_iminfo, -- "iminfo - print header information for application image\n", -+ imginfo, CFG_MAXARGS, 1, do_iminfo, -+ "imginfo - print header information for application image\n", - "addr [addr ...]\n" - " - print header information for application image starting at\n" - " address 'addr' in memory; this includes verification of the\n" -@@ -1116,8 +1116,8 @@ - } - - U_BOOT_CMD( -- imls, 1, 1, do_imls, -- "imls - list all images found in flash\n", -+ imgls, 1, 1, do_imls, -+ "imgls - list all images found in flash\n", - "\n" - " - Prints information about all images found at sector\n" - " boundaries in flash.\n" ---- u-boot-1.1.2/common/cmd_jffs2.c~command-names -+++ u-boot-1.1.2/common/cmd_jffs2.c -@@ -259,8 +259,8 @@ - } - - U_BOOT_CMD( -- chpart, 2, 0, do_jffs2_chpart, -- "chpart\t- change active partition\n", -+ jffspart, 2, 0, do_jffs2_chpart, -+ "jffspart\t- change active partition\n", - " - change active partition\n" - ); - #endif /* CFG_JFFS_SINGLE_PART */ -@@ -268,22 +268,22 @@ - /***************************************************/ - - U_BOOT_CMD( -- fsload, 3, 0, do_jffs2_fsload, -- "fsload\t- load binary file from a filesystem image\n", -+ jffsload, 3, 0, do_jffs2_fsload, -+ "jffsload- load binary file from a filesystem image\n", - "[ off ] [ filename ]\n" - " - load binary file from flash bank\n" - " with offset 'off'\n" - ); - - U_BOOT_CMD( -- fsinfo, 1, 1, do_jffs2_fsinfo, -- "fsinfo\t- print information about filesystems\n", -+ jffsinfo, 1, 1, do_jffs2_fsinfo, -+ "jffsinfo- print information about filesystems\n", - " - print information about filesystems\n" - ); - - U_BOOT_CMD( -- ls, 2, 1, do_jffs2_ls, -- "ls\t- list files in a directory (default /)\n", -+ jffsls, 2, 1, do_jffs2_ls, -+ "jffsls\t- list files in a directory (default /)\n", - "[ directory ]\n" - " - list files in a directory.\n" - ); ---- u-boot-1.1.2/common/cmd_nvedit.c~command-names -+++ u-boot-1.1.2/common/cmd_nvedit.c -@@ -570,19 +570,19 @@ - /**************************************************/ - - U_BOOT_CMD( -- printenv, CFG_MAXARGS, 1, do_printenv, -- "printenv- print environment variables\n", -+ env, CFG_MAXARGS, 1, do_printenv, -+ "env - print environment variables\n", - "\n - print values of all environment variables\n" -- "printenv name ...\n" -+ "env name ...\n" - " - print value of environment variable 'name'\n" - ); - - U_BOOT_CMD( -- setenv, CFG_MAXARGS, 0, do_setenv, -- "setenv - set environment variables\n", -+ envset, CFG_MAXARGS, 0, do_setenv, -+ "envset - set environment variables\n", - "name value ...\n" - " - set environment variable 'name' to 'value ...'\n" -- "setenv name\n" -+ "envset name\n" - " - delete environment variable 'name'\n" - ); - -@@ -590,8 +590,8 @@ - ((CONFIG_COMMANDS & (CFG_CMD_ENV|CFG_CMD_FLASH)) == \ - (CFG_CMD_ENV|CFG_CMD_FLASH)) - U_BOOT_CMD( -- saveenv, 1, 0, do_saveenv, -- "saveenv - save environment variables to persistent storage\n", -+ envsave, 1, 0, do_saveenv, -+ "envsave - save environment variables to persistent storage\n", - NULL - ); - -@@ -600,16 +600,16 @@ - #if (CONFIG_COMMANDS & CFG_CMD_ASKENV) - - U_BOOT_CMD( -- askenv, CFG_MAXARGS, 1, do_askenv, -- "askenv - get environment variables from stdin\n", -+ envask, CFG_MAXARGS, 1, do_askenv, -+ "envask - get environment variables from stdin\n", - "name [message] [size]\n" - " - get environment variable 'name' from stdin (max 'size' chars)\n" -- "askenv name\n" -+ "envask name\n" - " - get environment variable 'name' from stdin\n" -- "askenv name size\n" -+ "envask name size\n" - " - get environment variable 'name' from stdin (max 'size' chars)\n" -- "askenv name [message] size\n" -- " - display 'message' string and get environment variable 'name'" -+ "envask name [message] size\n" -+ " - display 'message' string and get environment variable 'name' " - "from stdin (max 'size' chars)\n" - ); - #endif /* CFG_CMD_ASKENV */ -@@ -617,8 +617,8 @@ - #if (CONFIG_COMMANDS & CFG_CMD_RUN) - int do_run (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); - U_BOOT_CMD( -- run, CFG_MAXARGS, 1, do_run, -- "run - run commands in an environment variable\n", -+ envrun, CFG_MAXARGS, 1, do_run, -+ "envrun - run commands in an environment variable\n", - "var [...]\n" - " - run the commands in the environment variable(s) 'var'\n" - ); ---- u-boot-1.1.2/common/cmd_cache.c~command-names -+++ u-boot-1.1.2/common/cmd_cache.c -@@ -96,15 +96,15 @@ - - - U_BOOT_CMD( -- icache, 2, 1, do_icache, -- "icache - enable or disable instruction cache\n", -+ cachei, 2, 1, do_icache, -+ "cachei - enable or disable instruction cache\n", - "[on, off]\n" - " - enable or disable instruction cache\n" - ); - - U_BOOT_CMD( -- dcache, 2, 1, do_dcache, -- "dcache - enable or disable data cache\n", -+ cached, 2, 1, do_dcache, -+ "cached - enable or disable data cache\n", - "[on, off]\n" - " - enable or disable data (writethrough) cache\n" - ); diff --git a/packages/u-boot/u-boot-1.1.2/mnci-jffs2.patch b/packages/u-boot/u-boot-1.1.2/mnci-jffs2.patch deleted file mode 100644 index 8b2571ad99..0000000000 --- a/packages/u-boot/u-boot-1.1.2/mnci-jffs2.patch +++ /dev/null @@ -1,16 +0,0 @@ - -# -# Patch managed by http://www.holgerschurig.de/patcher.html -# - ---- u-boot-1.1.2/common/cmd_jffs2.c~mnci-jffs2 -+++ u-boot-1.1.2/common/cmd_jffs2.c -@@ -43,7 +43,7 @@ - extern int cramfs_ls (struct part_info *info, char *filename); - extern int cramfs_info (struct part_info *info); - --static int part_num=0; -+static int part_num=3; - - #ifndef CFG_JFFS_CUSTOM_PART - diff --git a/packages/u-boot/u-boot-1.1.2/mnci.patch b/packages/u-boot/u-boot-1.1.2/mnci.patch deleted file mode 100644 index d69cf8eb72..0000000000 --- a/packages/u-boot/u-boot-1.1.2/mnci.patch +++ /dev/null @@ -1,1007 +0,0 @@ - -# -# Patch managed by http://www.holgerschurig.de/patcher.html -# - ---- u-boot-1.1.2/CREDITS~mnci -+++ u-boot-1.1.2/CREDITS -@@ -360,6 +360,9 @@ - E: r.schwebel@pengutronix.de - D: Support for csb226, logodl and innokom boards (PXA2xx) - -+N: Holger Schurig -+D: Support for MNCI-RX "Ramses" -+ - N: Yasushi Shoji - E: yashi@atmark-techno.com - D: Support for Xilinx MicroBlaze, for Atmark Techno SUZAKU FPGA board ---- u-boot-1.1.2/MAINTAINERS~mnci -+++ u-boot-1.1.2/MAINTAINERS -@@ -396,6 +396,10 @@ - csb226 xscale - innokom xscale - -+Holger Schurig -+ -+ mnci xscale -+ - Andrea Scian <andrea.scian@dave-tech.it> - - B2 ARM7TDMI (S3C44B0X) ---- u-boot-1.1.2/Makefile~mnci -+++ u-boot-1.1.2/Makefile -@@ -1388,6 +1388,9 @@ - wepep250_config : unconfig - @./mkconfig $(@:_config=) arm pxa wepep250 - -+mnci_config : unconfig -+ @./mkconfig $(@:_config=) arm pxa mnci -+ - xaeniax_config : unconfig - @./mkconfig $(@:_config=) arm pxa xaeniax - ---- /dev/null -+++ u-boot-1.1.2/board/mnci/Makefile -@@ -0,0 +1,49 @@ -+# -+# (C) Copyright 2000 -+# Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+# (C) Copyright 2005 -+# M&N Solutions GmbH, Rosbach, Germany, Holger Schurig -+# -+# 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. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+# MA 02111-1307 USA -+# -+ -+include $(TOPDIR)/config.mk -+ -+LIB = lib$(BOARD).a -+ -+OBJS := mnci.o -+SOBJS := memsetup.o -+ -+$(LIB): $(OBJS) $(SOBJS) -+ $(AR) crv $@ $(OBJS) $(SOBJS) -+ -+clean: -+ rm -f $(SOBJS) $(OBJS -+ -+distclean: clean -+ rm -f $(LIB) core *.bak .depend -+ -+######################################################################### -+ -+.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) -+ $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ -+ -+-include .depend -+ -+######################################################################### ---- /dev/null -+++ u-boot-1.1.2/board/mnci/config.mk -@@ -0,0 +1 @@ -+TEXT_BASE = 0xa1fe0000 ---- /dev/null -+++ u-boot-1.1.2/board/mnci/u-boot.lds -@@ -0,0 +1,55 @@ -+/* -+ * (C) Copyright 2000 -+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -+OUTPUT_ARCH(arm) -+ENTRY(_start) -+SECTIONS -+{ -+ . = 0x00000000; -+ -+ . = ALIGN(4); -+ .text : -+ { -+ cpu/pxa/start.o (.text) -+ *(.text) -+ } -+ -+ . = ALIGN(4); -+ .rodata : { *(.rodata) } -+ -+ . = 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 : { *(.bss) } -+ _end = .; -+} ---- /dev/null -+++ u-boot-1.1.2/board/mnci/mnci.c -@@ -0,0 +1,174 @@ -+/* -+ * 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. -+ * -+ * 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 <asm/arch/pxa-regs.h> -+#include <asm/mach-types.h> -+ -+/** -+ * board_init: - setup some data structures -+ * -+ * @return: 0 in case of success -+ */ -+ -+int board_init (void) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ /* memory and cpu-speed are setup before relocation */ -+ /* so we do _nothing_ here */ -+ -+ gd->bd->bi_arch_number = MACH_TYPE_RAMSES; -+ gd->bd->bi_boot_params = 0xa0000100; -+#if 0 -+ gd->bd->bi_baudrate = 115200; -+#endif -+ -+#if 0 -+ CKEN |= CKEN2_AC97; -+ GCR = GCR_COLD_RST; -+#endif -+ -+ return 0; -+} -+ -+ -+int board_late_init(void) -+{ -+ setenv("stdout", "serial"); -+ setenv("stderr", "serial"); -+ return 0; -+} -+ -+ -+/** -+ * dram_init: - setup dynamic RAM -+ * -+ * @return: 0 in case of success -+ */ -+ -+int dram_init (void) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ gd->bd->bi_dram[0].start = PHYS_SDRAM_1; -+ gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; -+ -+ return 0; -+} -+ -+ -+ -+#ifdef CFG_JFFS_CUSTOM_PART -+ -+#include <jffs2/jffs2.h> -+ -+#define FLASH_DEBUG 1 -+ -+/* Some debug macros */ -+#if (FLASH_DEBUG > 2 ) -+#define PRINTK3(args...) printf(args) -+#else -+#define PRINTK3(args...) -+#endif -+ -+#if FLASH_DEBUG > 1 -+#define PRINTK2(args...) printf(args) -+#else -+#define PRINTK2(args...) -+#endif -+ -+#ifdef FLASH_DEBUG -+#define PRINTK(args...) printf(args) -+#else -+#define PRINTK(args...) -+#endif -+ -+ -+#define FLASH_BANK_SIZE 0x02000000 /* 32 MB (during development) */ -+#define MAIN_SECT_SIZE 0x00040000 /* 256k per sector */ -+ -+#ifndef CFG_FLASH_CFI -+flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; -+#endif -+ -+static struct part_info part; -+static int current_part = -1; -+ -+struct part_info* jffs2_part_info(int part_num) { -+ void *jffs2_priv_saved = part.jffs2_priv; -+ -+ PRINTK2("jffs2_part_info: part_num=%i\n",part_num); -+ -+ if (current_part == part_num) -+ return ∂ -+ -+ /* u-boot partition */ -+ if(part_num==0){ -+ memset(&part, 0, sizeof(part)); -+ -+ part.offset=(char*)0x00000000; -+ part.size=0x00040000; -+ -+ /* Mark the struct as ready */ -+ current_part = part_num; -+ -+ PRINTK("part.offset = 0x%08x\n",(unsigned int)part.offset); -+ PRINTK("part.size = 0x%08x\n",(unsigned int)part.size); -+ } -+ -+ /* primary Kernel partition */ -+ if(part_num==1){ -+ memset(&part, 0, sizeof(part)); -+ -+ part.offset=(char*)0x00040000; -+ part.size=0x00040000*4; -+ -+ /* Mark the struct as ready */ -+ current_part = part_num; -+ -+ PRINTK("part.offset = 0x%08x\n",(unsigned int)part.offset); -+ PRINTK("part.size = 0x%08x\n",(unsigned int)part.size); -+ } -+ -+ /* data partition */ -+ if(part_num==3){ -+ memset(&part, 0, sizeof(part)); -+ -+ part.offset=(char*)0x00140000; -+ part.size=FLASH_BANK_SIZE-0x00140000; -+ -+ /* Mark the struct as ready */ -+ current_part = part_num; -+ -+ PRINTK("part.offset = 0x%08x\n",(unsigned int)part.offset); -+ PRINTK("part.size = 0x%08x\n",(unsigned int)part.size); -+ } -+ -+ if (current_part == part_num) { -+ part.usr_priv = ¤t_part; -+ part.jffs2_priv = jffs2_priv_saved; -+ return ∂ -+ } -+ -+ PRINTK("jffs2_part_info: end of partition table\n"); -+ return 0; -+} -+#endif ---- /dev/null -+++ u-boot-1.1.2/include/configs/mnci.h -@@ -0,0 +1,309 @@ -+/* -+ * (C) Copyright 2005 -+ * Holger Schurig, M&N Solutions GmbH, Rosbach, Germany -+ * -+ * Configuration for the Auerswald Innokom CPU board. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#ifndef __CONFIG_H -+#define __CONFIG_H -+ -+#include <asm/arch/pxa-regs.h> -+ -+/* -+ * If we are developing, we might want to start armboot from ram -+ * so we MUST NOT initialize critical regs like mem-timing ... -+ */ -+#define CONFIG_INIT_CRITICAL /* undef for developing */ -+ -+/* -+ * define the following to enable debug blinks. A debug blink function -+ * must be defined in memsetup.S -+ */ -+#undef DEBUG_BLINK_ENABLE -+#undef DEBUG_BLINKC_ENABLE -+ -+/* -+ * High Level Configuration Options -+ * (easy to change) -+ */ -+#define CONFIG_PXA250 1 /* This is an PXA250 CPU */ -+ -+#undef CONFIG_LCD -+#ifdef CONFIG_LCD -+#define CONFIG_SHARP_LM8V31 -+#endif -+ -+#define CONFIG_MMC 1 -+#define BOARD_LATE_INIT 1 -+ -+#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */ -+ -+/* -+ * Size of malloc() pool -+ */ -+#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024) -+#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */ -+ -+/* -+ * MNCI memory map information -+ */ -+ -+#define MNCI_CS5_ETH_OFFSET 0x03400000 -+ -+ -+/* -+ * Hardware drivers -+ */ -+#if 0 -+#define CONFIG_DRIVER_SMC91111 -+#define CONFIG_SMC91111_BASE (PXA_CS5_PHYS + MNCI_CS5_ETH_OFFSET + 0x300) -+#define CONFIG_SMC_USE_32_BIT 1 -+//#define CONFIG_SMC_USE_IOFUNCS -+#endif -+ -+/* the following has to be set high -- suspect something is wrong with -+ * with the tftp timeout routines. FIXME!!! -+ */ -+#define CONFIG_NET_RETRY_COUNT 100 -+ -+/* -+ * select serial console configuration -+ */ -+#define CONFIG_FFUART 1 /* we use FFUART on MNCI */ -+ -+/* allow to overwrite serial and ethaddr */ -+//#define CONFIG_ENV_OVERWRITE -+ -+#define CONFIG_BAUDRATE 115200 -+ -+#define CONFIG_COMMANDS ( 0 \ -+ | CFG_CMD_ENV \ -+ | CFG_CMD_FLASH \ -+ | CFG_CMD_LINUX \ -+ | CFG_CMD_JFFS2 \ -+ | CFG_CMD_LOADB \ -+ | CFG_CMD_MEMORY \ -+ | CFG_CMD_MISC \ -+ | CFG_CMD_RUN \ -+ ) -+ -+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */ -+#include <cmd_confdefs.h> -+ -+#define CONFIG_BOOTDELAY 0 -+#define CONFIG_BOOTCOMMAND "linux" -+#define CONFIG_BOOTARGS "console=ttyS0,115200 rootfstype=jffs2 root=/dev/mtdblock2" -+//#define CONFIG_BOOTARGS "console=ttyS0,115200 root=/dev/nfsroot ip=192.168.233.14:192.168.233.1:192.168.233.1:255.255.255.0:ramses2:eth0:off" -+#define CONFIG_CMDLINE_TAG 1 -+#define CONFIG_SETUP_MEMORY_TAGS 1 -+#define CFG_CONSOLE_INFO_QUIET 1 -+#define CFG_JFFS_SINGLE_PART 1 -+ -+/* -+ * Current memory map for MNCI supplied Linux images: -+ * -+ * Flash: -+ * 0x00000 - 0x003ffff: bootloader -+ * 0x040000 - 0x013ffff: kernel -+ * 0x140000 - 0x1ffffff: file system -+ * -+ * RAM: -+ * 0xa0008000 - kernel is loaded -+ * 0xa1fe0000 - Uboot runs (48MB into RAM) -+ * -+ */ -+ -+#define MY_CONFIG_EXTRA_ENV_SETTINGS \ -+ "prog_boot_mmc=" \ -+ "mw.b 0xa0000000 0xff 0x40000; " \ -+ "if mmcinit && " \ -+ "fatload mmc 0 0xa0000000 u-boot.bin; " \ -+ "then " \ -+ "protect off 0x0 0x3ffff; " \ -+ "erase 0x0 0x3ffff; " \ -+ "cp.b 0xa0000000 0x0 0x40000; " \ -+ "reset;" \ -+ "fi\0" \ -+ "prog_uImage_mmc=" \ -+ "mw.b 0xa0000000 0xff 0x1C0000; " \ -+ "if mmcinit && " \ -+ "fatload mmc 0 0xa0000000 uImage; " \ -+ "then " \ -+ "protect off 0x40000 0x13ffff; " \ -+ "erase 0x40000 0x13ffff; " \ -+ "cp.b 0xa0000000 0x40000 0x1C0000; " \ -+ "fi\0" \ -+ "prog_jffs_mmc=" \ -+ "mw.b 0xa0000000 0xff 0x1e00000; " \ -+ "if mmcinit && " \ -+ "fatload mmc 0 0xa0000000 root.jffs; " \ -+ "then " \ -+ "protect off 0x200000 0x13fffff; " \ -+ "erase 0x200000 0x13fffff; " \ -+ "cp.b 0xa0000000 0x200000 0x1e00000; " \ -+ "fi\0" \ -+ "boot_mmc=" \ -+ "if mmcinit && " \ -+ "fatload mmc 0 0xa1000000 uImage && " \ -+ "then " \ -+ "bootm 0xa1000000; " \ -+ "fi\0" \ -+ "prog_boot_net=" \ -+ "mw.b 0xa0000000 0xff 0x100000; " \ -+ "if bootp 0xa0000000 u-boot.bin; " \ -+ "then " \ -+ "protect off 0x0 0x3ffff; " \ -+ "erase 0x0 0x3ffff; " \ -+ "cp.b 0xa0000000 0x0 0x40000; " \ -+ "reset; " \ -+ "fi\0" \ -+ "prog_uImage_net=" \ -+ "mw.b 0xa0000000 0xff 0x1C0000; " \ -+ "if bootp 0xa0000000 uImage; " \ -+ "then " \ -+ "protect off 0x40000 0x13ffff; " \ -+ "erase 0x40000 0x13ffff; " \ -+ "cp.b 0xa0000000 0x40000 0x1C0000; " \ -+ "fi\0" \ -+ "boot_uImage_net=" \ -+ "mw.b 0xa0000000 0xff 0x1C0000; " \ -+ "if bootp 0xa0000000 uImage; " \ -+ "then " \ -+ "bootm 0xa0000000; " \ -+ "fi\0" \ -+ "prog_jffs_net=" \ -+ "mw.b 0xa0000000 0xff 0x1e00000; " \ -+ "if bootp 0xa0000000 root.jffs; " \ -+ "then " \ -+ "protect off 0x200000 0x13fffff; " \ -+ "erase 0x200000 0x13fffff; " \ -+ "cp.b 0xa0000000 0x200000 0x1e00000; " \ -+ "fi\0" -+ -+#define CONFIG_EXTRA_ENV_SETTINGS \ -+ "bootargsnfs=console=ttyS0,115200 root=/dev/nfsroot ip=192.168.233.14:192.168.233.1:192.168.233.1:255.255.255.0:ramses2:eth0:off;\0" \ -+ "boot_nfs=" \ -+ "set bootargs $bootargsnfs; " \ -+ "linux\0" -+ -+ -+#if (CONFIG_COMMANDS & CFG_CMD_KGDB) -+#define CONFIG_KGDB_BAUDRATE 115200 /* speed to run kgdb serial port */ -+#define CONFIG_KGDB_SER_INDEX 2 /* which serial port to use */ -+#endif -+ -+/* -+ * Miscellaneous configurable options -+ */ -+//#define CFG_HUSH_PARSER 1 -+//#define CFG_PROMPT_HUSH_PS2 "> " -+ -+#define CFG_LONGHELP /* undef to save memory */ -+#define CFG_PROMPT "mnci> " /* Monitor Command Prompt */ -+#define CFG_CBSIZE 256 /* Console I/O Buffer Size */ -+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ -+#define CFG_MAXARGS 16 /* max number of command args */ -+#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ -+#define CFG_DEVICE_NULLDEV 1 -+ -+#define CFG_MEMTEST_START 0xa0400000 /* memtest works on */ -+#define CFG_MEMTEST_END 0xa0800000 /* 4 ... 8 MB in DRAM */ -+ -+#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */ -+ -+#define CFG_LOAD_ADDR 0x40000 /* default load address */ -+ -+#define CFG_HZ 3686400 /* incrementer freq: 3.6864 MHz */ -+#define CFG_CPUSPEED 0x141 /* set core clock to 400/200/100 MHz */ -+ -+//#define RTC 1 /* enable 32KHz osc */ -+ -+ /* valid baudrates */ -+#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } -+ -+#define CFG_MMC_BASE 0xF0000000 -+ -+/* -+ * Stack sizes -+ * -+ * The stack sizes are set up in start.S using the settings below -+ */ -+#define CONFIG_STACKSIZE (256*1024) /* regular stack */ -+#ifdef CONFIG_USE_IRQ -+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */ -+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */ -+#endif -+ -+ -+/* -+ * Environment -+ */ -+#define CFG_MONITOR_BASE 0 -+#define CFG_MONITOR_LEN 0x40000 -+ -+#define CFG_ENV_IS_IN_FLASH 1 -+#define CFG_ENV_ADDR 0x20000 -+#define CFG_ENV_SIZE 0x4000 -+#define CFG_ENV_SECT_SIZE 0x40000 -+ -+/* -+ * Physical Memory Map -+ */ -+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 banks of DRAM */ -+#define PHYS_SDRAM_1 0xa0000000 /* SDRAM Bank #1 */ -+#define PHYS_SDRAM_1_SIZE 0x08000000 /* 64 MB */ -+ -+#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */ -+#define PHYS_FLASH_2 0x02000000 /* Flash Bank #2 */ -+#define PHYS_FLASH_SIZE 0x02000000 /* 32 MB */ -+//#define PHYS_FLASH_BANK_SIZE 0x02000000 /* 32 MB Banks */ -+//#define PHYS_FLASH_SECT_SIZE 0x00040000 /* 256 KB sectors (x2) */ -+ -+#define CFG_DRAM_BASE PHYS_SDRAM_1 -+#define CFG_DRAM_SIZE PHYS_SDRAM_1_SIZE -+ -+#define CFG_FLASH_BASE PHYS_FLASH_1 -+ -+ -+/* -+ * JFFS2 Partitions -+ */ -+#define CFG_JFFS_CUSTOM_PART 1 /* see board/innokom/flash.c */ -+ -+ -+/* -+ * FLASH organization -+ */ -+#define CFG_FLASH_CFI -+#define CFG_FLASH_CFI_DRIVER 1 -+ -+#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */ -+#define CFG_MAX_FLASH_SECT 128 /* max number of sectors on one chip */ -+ -+#define CFG_FLASH_USE_BUFFER_WRITE 1 -+ -+/* timeout values are in ticks */ -+#define CFG_FLASH_ERASE_TOUT (25*CFG_HZ) /* Timeout for Flash Erase */ -+#define CFG_FLASH_WRITE_TOUT (25*CFG_HZ) /* Timeout for Flash Write */ -+ -+ -+#endif /* __CONFIG_H */ ---- /dev/null -+++ u-boot-1.1.2/board/mnci/memsetup.S -@@ -0,0 +1,359 @@ -+/* -+ * Memory & peripheral setup of the XScale PXA250 -+ * -+ * Written October 2002 by H.Schurig for M&N Logistik-Lösungen Online GmbH -+ * http://www.mn-logistik.de/unsupported/pxa250/ -+ * -+ * Number in Parentheses like (3-29) refer to pages in the -+ * -+ * Intel PXA250 and PXA210 -+ * Application Processor -+ * Developer's Manual -+ * February 2002 -+ * -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include <config.h> -+#include <version.h> -+#include <asm/arch/pxa-regs.h> -+ -+ -+/********************************************************************** -+ * -+ * reginit -+ * -+ * PURPOSE: initialize stuff using a addr/data pair table -+ * PARAMS: r0 - address the the table -+ * REGISTERS: r0, r1, r2, r3 -+ * CALLS: Nothing -+ * RETURNS: Nothing -+ **********************************************************************/ -+reginit: -+1: ldmia r0!, {r1,r2} @ load reg/value from regtable -+ cmp r1, #0 @ at end? -+ strne r2, [r1] @ if not, store value into reg -+ ldrne r3, [r1] @ if not, read it back (see PXA errata) -+ bne 1b @ if not, branch back -+ mov pc, lr -+ -+ -+/********************************************************************** -+ * -+ * memsetup -+ * -+ * PURPOSE: -+ * PARAMS: -+ * REGISTERS: -+ * CALLS: -+ * RETURNS: Nothing -+ **********************************************************************/ -+ -+.globl memsetup -+memsetup: -+ mov r11, lr -+ -+ adr r0, SystemUnitTable -+ bl reginit -+ -+ @ Steps 2a..4d -+ adr r0,MemTable1 -+ bl reginit -+ -+ @ Step 4e wait 200 usec -+ ldr r0, oscr_addr -+ ldr r1, [r0] -+ add r1,r1,#0x300 @ Current OSCR+0x300 -+1: -+ ldr r2, [r0] -+ cmp r1, r2 -+ bgt 1b -+ -+ @ TODO: data cache must be off, see Developers Manual, Section 6.12, -+ @ page 6-77, point 6. -+ -+ @ Step 4f attempt read access to trigger a number of refresh cycles -+ ldr r2, =CFG_DRAM_BASE -+.rept 8 -+ str r2, [r2] -+.endr -+ -+ @ TODO: re-enable data cache -+ -+ @ Steps 4g..4h -+ adr r0,MemTable2 -+ bl reginit -+ @ Done with memory setup -+ -+ -+ @ Check if we return from Sleep Mode via RCSR (3-33) -+ ldr r0, rcsr_addr -+ ldr r1, [r0] -+ and r1,r1,#0xf @ mask RCSR_HWR|RCSR_WDR|RCSR_SMR|RCSR_GPR -+ str r1, [r0] @ clear Reset Controll State Register -+ teq r1, #4 @ RCSR_SMR (Sleep Mode) -+ beq WakeUp -+ -+ @ Issue Frequency Change Sequence -+freqchange: -+ mov r0, #3 -+ mcr p14, 0, r0, c6, c0, 0 -+ mov pc, r11 -+ -+WakeUp: -+ @ retrieve the scratchpad value and jump to that address -+ ldr r0, pspr_addr -+ ldr pc, [r0] -+ -+ -+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -+ -+ -+SystemUnitTable: -+ @ (4-22) Mask all interrupts -+ .long ICMR, 0x00000000 @ PM -+ @ (4-22) Interrupts are IRQs, not FIQs -+ .long ICLR, 0x00000000 -+ @ (4-23) Only enabled and unmasked interrupts bring the CPU out of idle mode -+ .long ICCR, 0x00000001 -+ @ (4-41) Clear OS Timer Match bits -+ .long OSSR, 0x0000000f @ NO PM -+ @ (3-34) Set clock register (we change CP14,6 at the end of this function) -+ .long CCCR, 0x00000161 @ NO PM, 121 is slow, 241 is medium, 161 is fast -+ @ (3-38) Enable 32 kHz Oszillator -+ .long OSCC, 0x00000002 -+ -+ @ (3-36) Enable needed clocks -+ .long CKEN, 0x00000043 @ PM: FFUART, PWM0, PWM1 -+ -+ .long 0x17c00004,8 @ CPLD: PER_PWR_EN -+ -+// Bit GPIO Level Function Direct Altern Function -+// -------------------------------------------------- -+// 00000001 0 1 nc Input 0 normal GPIO -+// 00000002 1 1 nPFI Input 0 normal GPIO -+// 00000004 2 1 BAT_DATA Input 0 normal GPIO -+// 00000008 3 1 IRQ_KEY Input 0 normal GPIO -+// 00000010 4 0 IRQ_ETH Input 0 normal GPIO -+// 00000020 5 1 nc Input 0 normal GPIO -+// 00000040 6 0 MMC_CLK Output 1 MMC_CLK -+// 00000080 7 1 IRQ_GSM Input 0 normal GPIO -+// 00000100 8 1 nPCC_S1_CD Input 0 normal GPIO -+// 00000200 9 1 nMMC_CD Input 0 normal GPIO -+// 00000400 10 1 IRQ_RTC Input 0 normal GPIO -+// 00000800 11 0 nc 3M6 Output 1 3.6 MHz -+// 00001000 12 1 nc Input 0 normal GPIO -+// 00002000 13 1 IRQ_DOCK Input 0 normal GPIO -+// 00004000 14 1 nc Input 0 normal GPIO -+// 00008000 15 1 nc nCS1 Output 2 nCS1 -+ -+// 00010000 16 1 PWM0 Output 2 PWM0 -+// 00020000 17 1 PWM1 Output 2 PWM1 -+// 00040000 18 1 RDY Input 1 RDY -+// 00080000 19 1 nPCC_S0_IRQ Input 0 normal GPIO -+// 00100000 20 1 nc Input 0 normal GPIO -+// 00200000 21 1 AC97_IRQ Input 0 normal GPIO -+// 00400000 22 1 nPCC_S1_IRQ Input 0 normal GPIO -+// 00800000 23 1 nc IRQ_GSM Input 0 normal GPIO -+// 01000000 24 0 UART_INTB Input 0 normal GPIO -+// 02000000 25 0 UART_INTC Input 0 normal GPIO -+// 04000000 26 1 UART_INTD Input 0 normal GPIO -+// 08000000 27 0 nc cpldfree Input 0 normal GPIO -+// 10000000 28 1 AUD_BITCLK Input 1 97_BITCLK -+// 20000000 29 0 AUD_SDIN0 Input 1 97_SDATAIN0 -+// 40000000 30 0 AUD_SDOUT Output 2 97_SDATAOUT -+// 80000000 31 0 AUD_SYNC Output 2 97_SYNC -+ -+ .long GPSR0, 0x00008000 @ set nCS1 -+ .long GPDR0, 0xd0038840 @ out MMC_CLK, 3M6, nCS1, PWM0, PWM1 -+ .long GAFR0_L,0x80401000 @ MMC_CLK:1, 3M6:1, nCS1:2 -+ .long GAFR0_U,0xA500001a @ PWM0:2, PWM1:2, RDY:1 -+ @ 97_BITCLK:1, 97_SDATAIN0:1, 97_SDATAOUT:2, 97_SYNC:2 -+ .long PGSR0, 0x00028000 @ sleep set: nCS1, PWM1 -+ .long GRER0, 0x00000000 @ rising edge detect: none -+ .long GFER0, 0x00000000 @ falling edge detect: none -+ -+ -+// 00000001 32 0 USB_INT Input 0 normal GPIO -+// 00000002 33 1 nCS5 Output 2 nCS5 -+// 00000004 34 1 FF_RXD Input 1 FF_RXD -+// 00000008 35 1 FF_CTS Input 1 FF_CTS -+// 00000010 36 1 FF_DCD Input 1 FF_DCD -+// 00000020 37 1 FF_DSR Input 1 FF_DSR -+// 00000040 38 1 FF_RI Input 1 FF_RI -+// 00000080 39 0 FF_TXD Output 2 FF_TXD -+// 00000100 40 0 FF_DTR Output 2 FF_DTR -+// 00000200 41 0 FF_RTS Output 2 FF_RTS -+// 00000400 42 1 BT_RXD Input 1 BT_RXD -+// 00000800 43 1 BT_TXD Output 2 BT_TXD -+// 00001000 44 0 BT_CTS Input 1 BT_CTS -+// 00002000 45 1 BT_RTS Output 2 BT_RTS -+// 00004000 46 1 IR_RXD Input 1 ICP_RXD -+// 00008000 47 0 IR_TXD Output 2 ICP_TXD -+// 00010000 48 1 nPOE Output 2 nPOE -+// 00020000 49 1 nPWE Output 2 nPWE -+// 00040000 50 1 nPIOR Output 2 nPIOR -+// 00080000 51 1 nPIOW Output 2 nPIOW -+// 00100000 52 1 nPCE1 Output 2 nPCE1 -+// 00200000 53 1 nPCE2 Output 2 nPCE2 -+// 00400000 54 0 nPKTSEL Output 2 nPKTSEL -+// 00800000 55 1 nPREG Output 2 nPREG -+// 01000000 56 1 nPWAIT Input 1 nPWAIT -+// 02000000 57 1 nIOIS16 Input 1 nIOI16 -+// 04000000 58 0 LDD0 Output 2 LDD0 -+// 08000000 59 1 LDD1 Output 2 LDD1 -+// 10000000 60 0 LDD2 Output 2 LDD2 -+// 20000000 61 1 LDD3 Output 2 LDD3 -+// 40000000 62 0 LDD4 Output 2 LDD4 -+// 80000000 63 0 LDD5 Output 2 LDD5 -+ -+ .long GPSR1, 0x00020302 @ set nCS5, FF_RTS, FF_DTR, nPWE -+ .long GPCR1, 0x00000080 @ clear FF_TXD -+ .long GPDR1, 0xfcffab82 @ out: nCS5, FF_TXD, FF_DTR, FF_RTS, BT_TXD, -+ @ BT_RTS, IR_TXD, nPOE...nPREG, LDD0..LDD5 -+ .long GAFR1_L,0x999a9558 @ -+ .long GAFR1_U,0xaaa5aaaa @ -+ .long PGSR1, 0x00020002 @ sleep set: nCS5, nPWE -+ .long GRER1, 0x00000000 @ -+ .long GFER1, 0x00000000 @ -+ -+ -+ -+// 00000001 64 0 LDD6 Output 2 LDD6 -+// 00000002 65 1 LDD7 Output 2 LDD7 -+// 00000004 66 1 LDD8 Output 2 LDD8 -+// 00000008 67 0 LDD9 Output 2 LDD9 -+// 00000010 68 1 LDD10 Output 2 LDD10 -+// 00000020 69 0 LDD11 Output 2 LDD11 -+// 00000040 70 0 LDD12 Output 2 LDD12 -+// 00000080 71 1 LDD13 Output 2 LDD13 -+// 00000100 72 0 LDD14 Output 2 LDD14 -+// 00000200 73 0 LDD15 Output 2 LDD15 -+// 00000400 74 1 FCLK Output 2 FCLK -+// 00000800 75 1 LCLK Output 2 LCLK -+// 00001000 76 1 PCLK Output 2 PCLK -+// 00002000 77 0 BIAS Output 2 ACBIAS -+// 00004000 78 1 nCS2 Output 2 nCS2 -+// 00008000 79 1 nCS3 Output 2 nCS3 -+// 00010000 80 1 nCS4 Output 2 nCS4 -+// 00020000 81 1 nc Input 0 normal GPIO -+// 00040000 82 1 nc Input 0 normal GPIO -+// 00080000 83 1 nc Input 0 normal GPIO -+// 00100000 84 1 nc Input 0 normal GPIO -+ -+ .long GPSR2, 0x0001c000 @ set nCS2..4 -+ .long GPDR2, 0x0001FFFF @ out: LDD6..nCS4 -+ .long GAFR2_L,0xaaaaaaaa @ -+ .long GAFR2_U,0x00000002 @ -+ .long PGSR2, 0x0001c000 @ sleep set: nCS2..4 -+ .long GRER2, 0x00000000 @ -+ .long GFER2, 0x00000000 @ -+ -+ @ (3-25) Power Wakeup Registers -+ .long PWER, 0x00000008 @ wake up on IRQ_KEY -+ .long PRER, 0x00000008 @ detect rising edge on IRQ_KEY -+ .long PFER, 0x00000000 @ dont detect falling edges -+ -+ @ (3-28) Power Manager Edge Detect Status Register -+ .long PEDR, 0x00000008 @ clear edge detect status for IRQ_KEY -+ -+ @ (3-29) Sleep State Register -+ .long PSSR, 0x00000030 @ clear PH and RDH -+ -+ .long PWM_CTRL0, 0 -+ .long PWM_CTRL0, 0 -+ .long PWM_PERVAL0, 512 -+ .long PWM_PERVAL1, 512 -+ .long PWM_PWDUTY0, 440 -+ .long PWM_PWDUTY1, 450 -+ -+ @ End -+ .long 0,0 -+ -+ -+ -+ -+MemTable1: -+ @ Info on this sequence is in the OS Developers Guide, Section 10.0 on page 13 -+ @ also see Developers Manual, Section 6.12 on page 6-76 -+ -+ @ write MSC0, MSC1, MSC2 (6-44) -+ .long MSC0, 0x7ff0fdc3 @ f4c0 -+ .long MSC1, 0x29842981 -+ .long MSC2, 0x29842984 -+ -+ @ no synchronous static stuff here -+ .long SXCNFG, 0x00000000 @ (6-31) -+ -+ @ write MECR (6-60), MCMEMx (6-57), MCATTx (6-58), MCIOx (6-58) -+ .long MECR, 0x00000003 -+ .long MCMEM0, 0x00020418 -+ .long MCMEM1, 0x00020418 -+ .long MCATT0, 0x0002449D -+ .long MCATT1, 0x0002449D -+ .long MCIO0, 0x00014290 -+ .long MCIO1, 0x00014290 -+ -+ @ write FLYCNFG (that register is now undocumented) -+ -+ @ OS Developers Manual: write MDREFR (6-15), K0RUN and K0PIN are -+ @ set for synchronous static memory. The desired value of -+ @ K0DB2 can be programmed. KxFREE can be deasserted. APD must -+ @ remain deasserted and SLFRSH must remain asserted. -+ @ Developers Manual: write K0RUN and E0PIN. Configure K0DB2. Retain -+ @ the current values of APD and SLFRSH. DRI must contain a -+ @ valid value. Deassert KxFREE. -+ .long MDREFR, 0x00400016 @ 2d KxFREE & APD deasserted, SLFRSH asserted -+ -+ @ Developers Manual: in systems containing Synchronous Static Memory, write -+ @ to SXCNFG, including the enable bits. -+ @.long SXCNFG, 0x00000000 @ no Synchronous Static Memory -+ -+ @ Assert K1RUN and K2RUN and configure K1DB2 and K2DB2 -+ .long MDREFR, 0x00450016 @ 4a -+ .long MDREFR, 0x00050016 @ 4b deassert SLFRFH -+ .long MDREFR, 0x00058016 @ 4c assert E1PIN -+ .long MDCNFG, 0x0A000AC8 @ 4d without DE0/DE1 (6-10) -+ .long 0,0 -+ -+oscr_addr: -+ .long OSCR -+rcsr_addr: -+ .long RCSR -+pspr_addr: -+ .long PSPR -+ -+ -+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -+ -+ -+MemTable2: -+ .long MDCNFG, 0x0A000ACB @ 4d with DE0/DE1 -+ .long MDMRS, 0x00000000 @ 4h -+ .long MDREFR, 0x00118016 @ 5 (optional) turn APD on -+ .long 0x17C0002C, 0x00000011 @ MNCI: enable FFUART driver -+ .long 0x17c00034, 0x00000000 @ MNCI: enable flash write -+ .long 0x17c00028, 0x00000000 @ MNCI: turn off CF-Card enable -+ .long 0x17c00014, 0x00000000 @ MNCI: turn off CF-Card power -+ .long 0x10000000, 0x0000d803 @ MNCI: disable all LEDs, SCANNER_WAKE & SCANNER_TRIG on -+@ .long 0x10000000, 0x0000d80b @ MNCI: disable all LEDs, SCANNER_WAKE, SCANNER_TRIG & UARTB on -+ .long 0,0 diff --git a/packages/u-boot/u-boot-1.1.2/oxnas.patch b/packages/u-boot/u-boot-1.1.2/oxnas.patch deleted file mode 100644 index f1fff14822..0000000000 --- a/packages/u-boot/u-boot-1.1.2/oxnas.patch +++ /dev/null @@ -1,7257 +0,0 @@ -diff -Nurd u-boot-1.1.2/board/oxnas/config.mk u-boot-1.1.2-oxe810/board/oxnas/config.mk ---- u-boot-1.1.2/board/oxnas/config.mk 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/board/oxnas/config.mk 2008-06-11 17:55:18.000000000 +0200 -@@ -0,0 +1,26 @@ -+TEXT_BASE = 0x48d00000 -+CROSS_COMPILE = arm-linux- -+ -+PLL400 ?= 733333333 -+RPSCLK ?= 25000000 -+ -+NAS_VERSION ?= 810 -+FPGA ?= 0 -+FPGA_ARM_CLK ?= 25000000 -+ -+PROBE_MEM_SIZE ?= 1 -+MEM_SIZE ?= 64 # Memory size in megabytes if probing is not enabled -+MEM_ODT ?= 150 -+ -+USE_SATA ?= 1 -+USE_SATA_ENV ?= 1 -+USE_FLASH ?= 1 -+ -+LINUX_ROOT_RAIDED ?= 1 -+ -+USE_EXTERNAL_UART ?= 0 -+INTERNAL_UART ?= 2 -+ -+TEST_BRD ?= 0 # Only significant for OX800 -+ -+PLATFORM_CPPFLAGS += -DLINUX_ROOT_RAIDED=$(LINUX_ROOT_RAIDED) -DMEM_ODT=$(MEM_ODT) -DPROBE_MEM_SIZE=$(PROBE_MEM_SIZE) -DNAS_VERSION=$(NAS_VERSION) -DFPGA=$(FPGA) -DFPGA_ARM_CLK=$(FPGA_ARM_CLK) -DINTERNAL_UART=$(INTERNAL_UART) -DUSE_EXTERNAL_UART=$(USE_EXTERNAL_UART) -DMEM_SIZE=$(MEM_SIZE) -DPLL400=$(PLL400) -DRPSCLK=$(RPSCLK) -DTEST_BRD=$(TEST_BRD) -DUSE_SATA=$(USE_SATA) -DUSE_SATA_ENV=$(USE_SATA_ENV) -DUSE_FLASH=$(USE_FLASH) -diff -Nurd u-boot-1.1.2/board/oxnas/eth.c u-boot-1.1.2-oxe810/board/oxnas/eth.c ---- u-boot-1.1.2/board/oxnas/eth.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/board/oxnas/eth.c 2008-06-11 17:55:18.000000000 +0200 -@@ -0,0 +1,1666 @@ -+/* -+ * (C) Copyright 2005 -+ * Oxford Semiconductor Ltd -+ * -+ * 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 <malloc.h> -+#include <net.h> -+#include <asm/barrier.h> -+ -+//#define DEBUG_GMAC_INIT -+ -+// The number of bytes wasted at the start of a received packet buffer in order -+// to ensure the IP header will be aligned to a 32-bit boundary -+static const int ETHER_FRAME_ALIGN_WASTAGE = 2; -+static const int EXTRA_RX_SKB_SPACE = 32; // Otherwise GMAC spans over >1 skb -+static const int ETHER_MTU = 1500; -+ -+static const u32 MAC_BASE_OFFSET = 0x0000; -+static const u32 DMA_BASE_OFFSET = 0x1000; -+ -+static const int NUM_TX_DMA_DESCRIPTORS = 1; -+static const int NUM_RX_DMA_DESCRIPTORS = 32; -+ -+/* Generic MII registers. */ -+#define MII_BMCR 0x00 /* Basic mode control register */ -+#define MII_BMSR 0x01 /* Basic mode status register */ -+#define MII_PHYSID1 0x02 /* PHYS ID 1 */ -+#define MII_PHYSID2 0x03 /* PHYS ID 2 */ -+#define MII_ADVERTISE 0x04 /* Advertisement control reg */ -+#define MII_LPA 0x05 /* Link partner ability reg */ -+#define MII_EXPANSION 0x06 /* Expansion register */ -+#define MII_CTRL1000 0x09 /* 1000BASE-T control */ -+#define MII_STAT1000 0x0a /* 1000BASE-T status */ -+#define MII_ESTATUS 0x0f /* Extended Status */ -+ -+/* Basic mode control register. */ -+#define BMCR_RESV 0x003f /* Unused... */ -+#define BMCR_SPEED1000 0x0040 /* MSB of Speed (1000) */ -+#define BMCR_CTST 0x0080 /* Collision test */ -+#define BMCR_FULLDPLX 0x0100 /* Full duplex */ -+#define BMCR_ANRESTART 0x0200 /* Auto negotiation restart */ -+#define BMCR_ISOLATE 0x0400 /* Disconnect DP83840 from MII */ -+#define BMCR_PDOWN 0x0800 /* Powerdown the DP83840 */ -+#define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */ -+#define BMCR_SPEED100 0x2000 /* Select 100Mbps */ -+#define BMCR_LOOPBACK 0x4000 /* TXD loopback bits */ -+#define BMCR_RESET 0x8000 /* Reset the DP83840 */ -+ -+/* Basic mode status register. */ -+#define BMSR_ERCAP 0x0001 /* Ext-reg capability */ -+#define BMSR_JCD 0x0002 /* Jabber detected */ -+#define BMSR_LSTATUS 0x0004 /* Link status */ -+#define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */ -+#define BMSR_RFAULT 0x0010 /* Remote fault detected */ -+#define BMSR_ANEGCOMPLETE 0x0020 /* Auto-negotiation complete */ -+#define BMSR_RESV 0x00c0 /* Unused... */ -+#define BMSR_ESTATEN 0x0100 /* Extended Status in R15 */ -+#define BMSR_100FULL2 0x0200 /* Can do 100BASE-T2 HDX */ -+#define BMSR_100HALF2 0x0400 /* Can do 100BASE-T2 FDX */ -+#define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */ -+#define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */ -+#define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */ -+#define BMSR_100FULL 0x4000 /* Can do 100mbps, full-duplex */ -+#define BMSR_100BASE4 0x8000 /* Can do 100mbps, 4k packets */ -+ -+/* 1000BASE-T Status register */ -+#define LPA_1000LOCALRXOK 0x2000 /* Link partner local receiver status */ -+#define LPA_1000REMRXOK 0x1000 /* Link partner remote receiver status */ -+#define LPA_1000FULL 0x0800 /* Link partner 1000BASE-T full duplex */ -+#define LPA_1000HALF 0x0400 /* Link partner 1000BASE-T half duplex */ -+#define PHY_TYPE_NONE 0 -+#define PHY_TYPE_MICREL_KS8721BL 0x00221619 -+#define PHY_TYPE_VITESSE_VSC8201XVZ 0x000fc413 -+#define PHY_TYPE_REALTEK_RTL8211BGR 0x001cc912 -+#define PHY_TYPE_LSI_ET1011C 0x0282f013 -+ -+/* Specific PHY values */ -+#define VSC8201_MII_ACSR 0x1c // Vitesse VCS8201 gigabit PHY Auxillary Control and Status register -+#define VSC8201_MII_ACSR_MDPPS_BIT 2 // Mode/Duplex Pin Priority Select -+ -+#define ET1011C_MII_CONFIG 0x16 -+#define ET1011C_MII_CONFIG_IFMODESEL 0 -+#define ET1011C_MII_CONFIG_IFMODESEL_NUM_BITS 3 -+#define ET1011C_MII_CONFIG_SYSCLKEN 4 -+#define ET1011C_MII_CONFIG_TXCLKEN 5 -+#define ET1011C_MII_CONFIG_TBI_RATESEL 8 -+#define ET1011C_MII_CONFIG_CRS_TX_EN 15 -+ -+#define ET1011C_MII_CONFIG_IFMODESEL_GMII_MII 0 -+#define ET1011C_MII_CONFIG_IFMODESEL_TBI 1 -+#define ET1011C_MII_CONFIG_IFMODESEL_GMII_MII_GTX 2 -+ -+#define ET1011C_MII_LED2 0x1c -+#define ET1011C_MII_LED2_LED_TXRX 12 -+#define ET1011C_MII_LED2_LED_NUM_BITS 4 -+ -+#define ET1011C_MII_LED2_LED_TXRX_ON 0xe -+#define ET1011C_MII_LED2_LED_TXRX_ACTIVITY 0x7 -+ -+// Some typedefs to cope with std Linux types -+typedef void sk_buff_t; -+ -+// The in-memory descriptor structures -+typedef struct gmac_dma_desc -+{ -+ /** The encoded status field of the GMAC descriptor */ -+ u32 status; -+ /** The encoded length field of GMAC descriptor */ -+ u32 length; -+ /** Buffer 1 pointer field of GMAC descriptor */ -+ u32 buffer1; -+ /** Buffer 2 pointer or next descriptor pointer field of GMAC descriptor */ -+ u32 buffer2; -+ /** Not used for U-Boot */ -+ u32 skb; -+} __attribute ((packed)) gmac_dma_desc_t; -+ -+typedef struct gmac_desc_list_info -+{ -+ gmac_dma_desc_t* base_ptr; -+ int num_descriptors; -+ int empty_count; -+ int full_count; -+ int r_index; -+ int w_index; -+} gmac_desc_list_info_t; -+ -+// Private data structure for the GMAC driver -+typedef struct gmac_priv -+{ -+ /** Base address of GMAC MAC registers */ -+ u32 macBase; -+ /** Base address of GMAC DMA registers */ -+ u32 dmaBase; -+ -+ /** The number of descriptors in the gmac_dma_desc_t array holding both the -+ * TX and RX descriptors. The TX descriptors reside at the start of the -+ * array */ -+ unsigned total_num_descriptors; -+ -+ /** The address of the start of the descriptor array */ -+ gmac_dma_desc_t *desc_base_addr; -+ -+ /** Descriptor list management */ -+ gmac_desc_list_info_t tx_gmac_desc_list_info; -+ gmac_desc_list_info_t rx_gmac_desc_list_info; -+ -+ /** PHY info */ -+ u32 phy_type; -+ u32 phy_addr; -+ int phy_id; -+ int link_is_1000M; -+} gmac_priv_t; -+ -+/** -+ * MAC register indices -+ */ -+typedef enum gmac_mac_regs { -+ MAC_CONFIG_REG = 0, -+ MAC_FRAME_FILTER_REG = 1, -+ MAC_HASH_HIGH_REG = 2, -+ MAC_HASH_LOW_REG = 3, -+ MAC_GMII_ADR_REG = 4, -+ MAC_GMII_DATA_REG = 5, -+ MAC_FLOW_CNTL_REG = 6, -+ MAC_VLAN_TAG_REG = 7, -+ MAC_VERSION_REG = 8, -+ MAC_ADR0_HIGH_REG = 16, -+ MAC_ADR0_LOW_REG = 17, -+ MAC_ADR1_HIGH_REG = 18, -+ MAC_ADR1_LOW_REG = 19, -+ MAC_ADR2_HIGH_REG = 20, -+ MAC_ADR2_LOW_REG = 21, -+ MAC_ADR3_HIGH_REG = 22, -+ MAC_ADR3_LOW_REG = 23, -+ MAC_ADR4_HIGH_REG = 24, -+ MAC_ADR4_LOW_REG = 25, -+ MAC_ADR5_HIGH_REG = 26, -+ MAC_ADR5_LOW_REG = 27, -+ MAC_ADR6_HIGH_REG = 28, -+ MAC_ADR6_LOW_REG = 29, -+ MAC_ADR7_HIGH_REG = 30, -+ MAC_ADR7_LOW_REG = 31, -+ MAC_ADR8_HIGH_REG = 32, -+ MAC_ADR8_LOW_REG = 33, -+ MAC_ADR9_HIGH_REG = 34, -+ MAC_ADR9_LOW_REG = 35, -+ MAC_ADR10_HIGH_REG = 36, -+ MAC_ADR10_LOW_REG = 37, -+ MAC_ADR11_HIGH_REG = 38, -+ MAC_ADR11_LOW_REG = 39, -+ MAC_ADR12_HIGH_REG = 40, -+ MAC_ADR12_LOW_REG = 41, -+ MAC_ADR13_HIGH_REG = 42, -+ MAC_ADR13_LOW_REG = 43, -+ MAC_ADR14_HIGH_REG = 44, -+ MAC_ADR14_LOW_REG = 45, -+ MAC_ADR15_HIGH_REG = 46, -+ MAC_ADR15_LOW_REG = 47 -+} gmac_mac_regs_t; -+ -+ -+/** -+ * MAC register field definitions -+ */ -+typedef enum gmac_config_reg { -+ MAC_CONFIG_WD_BIT = 23, -+ MAC_CONFIG_JD_BIT = 22, -+ MAC_CONFIG_BE_BIT = 21, -+ MAC_CONFIG_JE_BIT = 20, -+ MAC_CONFIG_IFG_BIT = 17, -+ MAC_CONFIG_PS_BIT = 15, -+ MAC_CONFIG_DO_BIT = 13, -+ MAC_CONFIG_LM_BIT = 12, -+ MAC_CONFIG_DM_BIT = 11, -+ MAC_CONFIG_IPC_BIT = 10, -+ MAC_CONFIG_DR_BIT = 9, -+ MAC_CONFIG_ACS_BIT = 7, -+ MAC_CONFIG_BL_BIT = 5, -+ MAC_CONFIG_DC_BIT = 4, -+ MAC_CONFIG_TE_BIT = 3, -+ MAC_CONFIG_RE_BIT = 2 -+} gmac_config_reg_t; -+ -+#define MAC_CONFIG_IFG_NUM_BITS 3 -+#define MAC_CONFIG_BL_NUM_BITS 2 -+ -+typedef enum gmac_frame_filter_reg { -+ MAC_FRAME_FILTER_RA_BIT = 31, -+ MAC_FRAME_FILTER_SAF_BIT = 9, -+ MAC_FRAME_FILTER_SAIF_BIT = 8, -+ MAC_FRAME_FILTER_PCF_BIT = 6, -+ MAC_FRAME_FILTER_DBF_BIT = 5, -+ MAC_FRAME_FILTER_PM_BIT = 4, -+ MAC_FRAME_FILTER_DAIF_BIT = 3, -+ MAC_FRAME_FILTER_HMC_BIT = 2, -+ MAC_FRAME_FILTER_HUC_BIT = 1, -+ MAC_FRAME_FILTER_PR_BIT = 0 -+} gmac_frame_filter_reg_t; -+ -+#define MAC_FRAME_FILTER_PCF_NUM_BITS 2 -+ -+typedef enum gmac_hash_table_high_reg { -+ MAC_HASH_HIGH_HTH_BIT = 0 -+} gmac_hash_table_high_reg_t; -+ -+typedef enum gmac_hash_table_low_reg { -+ MAC_HASH_LOW_HTL_BIT = 0 -+} gmac_hash_table_low_reg_t; -+ -+typedef enum gmac_gmii_address_reg { -+ MAC_GMII_ADR_PA_BIT = 11, -+ MAC_GMII_ADR_GR_BIT = 6, -+ MAC_GMII_ADR_CR_BIT = 2, -+ MAC_GMII_ADR_GW_BIT = 1, -+ MAC_GMII_ADR_GB_BIT = 0 -+} gmac_gmii_address_reg_t; -+ -+#define MAC_GMII_ADR_PA_NUM_BITS 5 -+#define MAC_GMII_ADR_GR_NUM_BITS 5 -+#define MAC_GMII_ADR_CR_NUM_BITS 3 -+ -+typedef enum gmac_gmii_data_reg { -+ MAC_GMII_DATA_GD_BIT = 0 -+} gmac_gmii_data_reg_t; -+ -+#define MAC_GMII_DATA_GD_NUM_BITS 16 -+ -+typedef enum gmac_flow_control_reg { -+ MAC_FLOW_CNTL_PT_BIT = 16, -+ MAC_FLOW_CNTL_PLT_BIT = 4, -+ MAC_FLOW_CNTL_UP_BIT = 3, -+ MAC_FLOW_CNTL_RFE_BIT = 2, -+ MAC_FLOW_CNTL_TFE_BIT = 1, -+ MAC_FLOW_CNTL_FCB_BPA_BIT = 0 -+} gmac_flow_control_reg_t; -+ -+#define MAC_FLOW_CNTL_PT_NUM_BITS 16 -+#define MAC_FLOW_CNTL_PLT_NUM_BITS 2 -+ -+typedef enum gmac_vlan_tag_reg { -+ MAC_VLAN_TAG_LV_BIT = 0 -+} gmac_vlan_tag_reg_t; -+ -+#define MAC_VLAN_TAG_LV_NUM_BITS 16 -+ -+typedef enum gmac_version_reg { -+ MAC_VERSION_UD_BIT = 8, -+ MAC_VERSION_SD_BIT = 0 -+} gmac_version_reg_t; -+ -+#define MAC_VERSION_UD_NUM_BITS 8 -+#define MAC_VERSION_SD_NUM_BITS 8 -+ -+typedef enum gmac_mac_adr_0_high_reg { -+ MAC_ADR0_HIGH_MO_BIT = 31, -+ MAC_ADR0_HIGH_A_BIT = 0 -+} gmac_mac_adr_0_high_reg_t; -+ -+#define MAC_ADR0_HIGH_A_NUM_BITS 16 -+ -+typedef enum gmac_mac_adr_0_low_reg { -+ MAC_ADR0_LOW_A_BIT = 0 -+} gmac_mac_adr_0_low_reg_t; -+ -+typedef enum gmac_mac_adr_1_high_reg { -+ MAC_ADR1_HIGH_AE_BIT = 31, -+ MAC_ADR1_HIGH_SA_BIT = 30, -+ MAC_ADR1_HIGH_MBC_BIT = 24, -+ MAC_ADR1_HIGH_A_BIT = 0 -+} gmac_mac_adr_1_high_reg_t; -+ -+#define MAC_ADR1_HIGH_MBC_NUM_BITS 6 -+#define MAC_ADR1_HIGH_A_NUM_BITS 16 -+ -+typedef enum gmac_mac_adr_1_low_reg { -+ MAC_ADR1_LOW_A_BIT = 0 -+} gmac_mac_adr_1_low_reg_t; -+ -+ -+/** -+ * MMC register indices - registers accessed via the MAC accessor functions -+ */ -+typedef enum gmac_mmc_regs { -+ MMC_CONTROL_REG = 64, -+ MMC_RX_INT_REG = 65, -+ MMC_TX_INT_REG = 66, -+ MMC_RX_MASK_REG = 67, -+ MMC_TX_MASK_REG = 68 -+} gmac_mmc_regs_t; -+ -+/** -+ * DMA register indices -+ */ -+typedef enum gmac_dma_regs { -+ DMA_BUS_MODE_REG = 0, -+ DMA_TX_POLL_REG = 1, -+ DMA_RX_POLL_REG = 2, -+ DMA_RX_DESC_ADR_REG = 3, -+ DMA_TX_DESC_ADR_REG = 4, -+ DMA_STATUS_REG = 5, -+ DMA_OP_MODE_REG = 6, -+ DMA_INT_ENABLE_REG = 7, -+ DMA_MISSED_OVERFLOW_REG = 8, -+ DMA_CUR_TX_DESC_REG = 18, -+ DMA_CUR_RX_DESC_REG = 19, -+ DMA_CUR_TX_ADR_REG = 20, -+ DMA_CUR_RX_ADR_REG = 21 -+} gmac_dma_regs_t; -+ -+/** -+ * DMA register field definitions -+ */ -+ -+typedef enum gmac_dma_bus_mode_reg { -+ DMA_BUS_MODE_FB_BIT = 16, -+ DMA_BUS_MODE_PR_BIT = 14, -+ DMA_BUS_MODE_PBL_BIT = 8, -+ DMA_BUS_MODE_DSL_BIT = 2, -+ DMA_BUS_MODE_DA_BIT = 1, -+ DMA_BUS_MODE_SWR_BIT = 0 -+} gmac_dma_bus_mode_reg_t; -+ -+#define DMA_BUS_MODE_PR_NUM_BITS 2 -+#define DMA_BUS_MODE_PBL_NUM_BITS 6 -+#define DMA_BUS_MODE_DSL_NUM_BITS 5 -+ -+typedef enum gmac_dma_tx_poll_demand_reg { -+ DMA_TX_POLL_TPD_BIT = 0 -+} gmac_dma_tx_poll_demand_reg_t; -+ -+typedef enum gmac_dma_rx_poll_demand_reg { -+ DMA_RX_POLL_RPD_BIT = 0 -+} gmac_dma_rx_poll_demand_reg_t; -+ -+typedef enum gmac_dma_rx_desc_list_adr_reg { -+ DMA_RX_DESC_ADR_SRL_BIT = 0 -+} gmac_dma_rx_desc_list_adr_reg_t; -+ -+typedef enum gmac_dma_tx_desc_list_adr_reg { -+ DMA_TX_DESC_ADR_STL_BIT = 0 -+} gmac_dma_tx_desc_list_adr_reg_t; -+ -+typedef enum gmac_dma_status_reg { -+ DMA_STATUS_GPI_BIT = 28, -+ DMA_STATUS_GMI_BIT = 27, -+ DMA_STATUS_GLI_BIT = 26, -+ DMA_STATUS_EB_BIT = 23, -+ DMA_STATUS_TS_BIT = 20, -+ DMA_STATUS_RS_BIT = 17, -+ DMA_STATUS_NIS_BIT = 16, -+ DMA_STATUS_AIS_BIT = 15, -+ DMA_STATUS_ERI_BIT = 14, -+ DMA_STATUS_FBE_BIT = 13, -+ DMA_STATUS_ETI_BIT = 10, -+ DMA_STATUS_RWT_BIT = 9, -+ DMA_STATUS_RPS_BIT = 8, -+ DMA_STATUS_RU_BIT = 7, -+ DMA_STATUS_RI_BIT = 6, -+ DMA_STATUS_UNF_BIT = 5, -+ DMA_STATUS_OVF_BIT = 4, -+ DMA_STATUS_TJT_BIT = 3, -+ DMA_STATUS_TU_BIT = 2, -+ DMA_STATUS_TPS_BIT = 1, -+ DMA_STATUS_TI_BIT = 0 -+} gmac_dma_status_reg_t; -+ -+#define DMA_STATUS_EB_NUM_BITS 3 -+#define DMA_STATUS_TS_NUM_BITS 3 -+#define DMA_STATUS_RS_NUM_BITS 3 -+ -+typedef enum gmac_dma_op_mode_reg { -+ DMA_OP_MODE_SF_BIT = 21, -+ DMA_OP_MODE_FTF_BIT = 20, -+ DMA_OP_MODE_TTC_BIT = 14, -+ DMA_OP_MODE_ST_BIT = 13, -+ DMA_OP_MODE_RFD_BIT = 11, -+ DMA_OP_MODE_RFA_BIT = 9, -+ DMA_OP_MODE_EFC_BIT = 8, -+ DMA_OP_MODE_FEF_BIT = 7, -+ DMA_OP_MODE_FUF_BIT = 6, -+ DMA_OP_MODE_RTC_BIT = 3, -+ DMA_OP_MODE_OSF_BIT = 2, -+ DMA_OP_MODE_SR_BIT = 1 -+} gmac_dma_op_mode_reg_t; -+ -+#define DMA_OP_MODE_TTC_NUM_BITS 3 -+#define DMA_OP_MODE_RFD_NUM_BITS 2 -+#define DMA_OP_MODE_RFA_NUM_BITS 2 -+#define DMA_OP_MODE_RTC_NUM_BITS 2 -+ -+typedef enum gmac_dma_intr_enable_reg { -+ DMA_INT_ENABLE_NI_BIT = 16, -+ DMA_INT_ENABLE_AI_BIT = 15, -+ DMA_INT_ENABLE_ERE_BIT = 14, -+ DMA_INT_ENABLE_FBE_BIT = 13, -+ DMA_INT_ENABLE_ETE_BIT = 10, -+ DMA_INT_ENABLE_RW_BIT = 9, -+ DMA_INT_ENABLE_RS_BIT = 8, -+ DMA_INT_ENABLE_RU_BIT = 7, -+ DMA_INT_ENABLE_RI_BIT = 6, -+ DMA_INT_ENABLE_UN_BIT = 5, -+ DMA_INT_ENABLE_OV_BIT = 4, -+ DMA_INT_ENABLE_TJ_BIT = 3, -+ DMA_INT_ENABLE_TU_BIT = 2, -+ DMA_INT_ENABLE_TS_BIT = 1, -+ DMA_INT_ENABLE_TI_BIT = 0 -+} gmac_dma_intr_enable_reg_t; -+ -+typedef enum gmac_dma_missed_overflow_reg { -+ DMA_MISSED_OVERFLOW_OFOC_BIT = 28, // Overflow bit for FIFO Overflow Counter -+ DMA_MISSED_OVERFLOW_AMFC_BIT = 17, // Application Missed Frames Count -+ DMA_MISSED_OVERFLOW_OAMFO_BIT = 16, // Overflow bit for Application Missed Frames Count -+ DMA_MISSED_OVERFLOW_CMFC_BIT = 0 // Controller Missed Frames Count -+} gmac_dma_missed_overflow_reg_t; -+ -+#define DMA_MISSED_OVERFLOW_OAMFO_NUM_BITS 11 -+#define DMA_MISSED_OVERFLOW_CMFC_NUM_BITS 16 -+ -+typedef enum gmac_dma_current_tx_desc_reg { -+ DMA_CUR_TX_DESC_A_BIT = 0 -+} gmac_dma_current_tx_desc_reg_t; -+ -+typedef enum gmac_dma_current_rx_desc_reg { -+ DMA_CUR_RX_DESC_A_BIT = 0 -+} gmac_dma_current_rx_desc_reg_t; -+ -+typedef enum gmac_dma_current_tx_adr_reg { -+ DMA_CUR_TX_ADR_A_BIT = 0 -+} gmac_dma_current_tx_adr_reg_t; -+ -+typedef enum gmac_dma_current_rx_adr_reg { -+ DMA_CUR_RX_ADR_A_BIT = 0 -+} gmac_dma_current_rx_adr_reg_t; -+ -+/** -+ * Descriptor support -+ */ -+/** Descriptor status word field definitions */ -+typedef enum desc_status { -+ descOwnByDma = 0x80000000, /* descriptor is owned by DMA engine */ -+ -+ descFrameLengthMask = 0x3FFF0000, /* Receive descriptor frame length */ -+ descFrameLengthShift = 16, -+ -+ descError = 0x00008000, /* Error summary bit - OR of the following bits: v */ -+ -+ descRxTruncated = 0x00004000, /* Rx - no more descriptors for receive frame E */ -+ -+ descRxLengthError = 0x00001000, /* Rx - frame size not matching with length field */ -+ descRxDamaged = 0x00000800, /* Rx - frame was damaged due to buffer overflow E */ -+ descRxFirst = 0x00000200, /* Rx - first descriptor of the frame */ -+ descRxLast = 0x00000100, /* Rx - last descriptor of the frame */ -+ descRxLongFrame = 0x00000080, /* Rx - frame is longer than 1518 bytes E */ -+ descRxCollision = 0x00000040, /* Rx - late collision occurred during reception E */ -+ descRxFrameEther = 0x00000020, /* Rx - Frame type - Ethernet, otherwise 802.3 */ -+ descRxWatchdog = 0x00000010, /* Rx - watchdog timer expired during reception E */ -+ descRxMiiError = 0x00000008, /* Rx - error reported by MII interface E */ -+ descRxDribbling = 0x00000004, /* Rx - frame contains noninteger multiple of 8 bits */ -+ descRxCrc = 0x00000002, /* Rx - CRC error E */ -+ -+ descTxTimeout = 0x00004000, /* Tx - Transmit jabber timeout E */ -+ descTxLostCarrier = 0x00000800, /* Tx - carrier lost during tramsmission E */ -+ descTxNoCarrier = 0x00000400, /* Tx - no carrier signal from the tranceiver E */ -+ descTxLateCollision = 0x00000200, /* Tx - transmission aborted due to collision E */ -+ descTxExcCollisions = 0x00000100, /* Tx - transmission aborted after 16 collisions E */ -+ descTxVLANFrame = 0x00000080, /* Tx - VLAN-type frame */ -+ descTxCollMask = 0x00000078, /* Tx - Collision count */ -+ descTxCollShift = 3, -+ descTxExcDeferral = 0x00000004, /* Tx - excessive deferral E */ -+ descTxUnderflow = 0x00000002, /* Tx - late data arrival from the memory E */ -+ descTxDeferred = 0x00000001, /* Tx - frame transmision deferred */ -+} desc_status_t; -+ -+/** Descriptor length word field definitions */ -+typedef enum desc_length { -+ descTxIntEnable = 0x80000000, /* Tx - interrupt on completion */ -+ descTxLast = 0x40000000, /* Tx - Last segment of the frame */ -+ descTxFirst = 0x20000000, /* Tx - First segment of the frame */ -+ descTxDisableCrc = 0x04000000, /* Tx - Add CRC disabled (first segment only) */ -+ -+ descEndOfRing = 0x02000000, /* End of descriptors ring */ -+ descChain = 0x01000000, /* Second buffer address is chain address */ -+ descTxDisablePadd = 0x00800000, /* disable padding, added by - reyaz */ -+ -+ descSize2Mask = 0x003FF800, /* Buffer 2 size */ -+ descSize2Shift = 11, -+ descSize1Mask = 0x000007FF, /* Buffer 1 size */ -+ descSize1Shift = 0, -+} desc_length_t; -+ -+typedef enum rx_desc_status { -+ RX_DESC_STATUS_OWN_BIT = 31, -+ RX_DESC_STATUS_AFM_BIT = 30, -+ RX_DESC_STATUS_FL_BIT = 16, -+ RX_DESC_STATUS_ES_BIT = 15, -+ RX_DESC_STATUS_DE_BIT = 14, -+ RX_DESC_STATUS_SAF_BIT = 13, -+ RX_DESC_STATUS_LE_BIT = 12, -+ RX_DESC_STATUS_OE_BIT = 11, -+ RX_DESC_STATUS_IPC_BIT = 10, -+ RX_DESC_STATUS_FS_BIT = 9, -+ RX_DESC_STATUS_LS_BIT = 8, -+ RX_DESC_STATUS_VLAN_BIT = 7, -+ RX_DESC_STATUS_LC_BIT = 6, -+ RX_DESC_STATUS_FT_BIT = 5, -+ RX_DESC_STATUS_RWT_BIT = 4, -+ RX_DESC_STATUS_RE_BIT = 3, -+ RX_DESC_STATUS_DRE_BIT = 2, -+ RX_DESC_STATUS_CE_BIT = 1, -+ RX_DESC_STATUS_MAC_BIT = 0 -+} rx_desc_status_t; -+ -+#define RX_DESC_STATUS_FL_NUM_BITS 14 -+ -+typedef enum rx_desc_length { -+ RX_DESC_LENGTH_DIC_BIT = 31, -+ RX_DESC_LENGTH_RER_BIT = 25, -+ RX_DESC_LENGTH_RCH_BIT = 24, -+ RX_DESC_LENGTH_RBS2_BIT = 11, -+ RX_DESC_LENGTH_RBS1_BIT = 0, -+} rx_desc_length_t; -+ -+#define RX_DESC_LENGTH_RBS2_NUM_BITS 11 -+#define RX_DESC_LENGTH_RBS1_NUM_BITS 11 -+ -+typedef enum tx_desc_status { -+ TX_DESC_STATUS_OWN_BIT = 31, -+ TX_DESC_STATUS_ES_BIT = 15, -+ TX_DESC_STATUS_JT_BIT = 14, -+ TX_DESC_STATUS_FF_BIT = 13, -+ TX_DESC_STATUS_LOC_BIT = 11, -+ TX_DESC_STATUS_NC_BIT = 10, -+ TX_DESC_STATUS_LC_BIT = 9, -+ TX_DESC_STATUS_EC_BIT = 8, -+ TX_DESC_STATUS_VF_BIT = 7, -+ TX_DESC_STATUS_CC_BIT = 3, -+ TX_DESC_STATUS_ED_BIT = 2, -+ TX_DESC_STATUS_UF_BIT = 1, -+ TX_DESC_STATUS_DB_BIT = 0 -+} tx_desc_status_t; -+ -+#define TX_DESC_STATUS_CC_NUM_BITS 4 -+ -+typedef enum tx_desc_length { -+ TX_DESC_LENGTH_IC_BIT = 31, -+ TX_DESC_LENGTH_LS_BIT = 30, -+ TX_DESC_LENGTH_FS_BIT = 29, -+ TX_DESC_LENGTH_DC_BIT = 26, -+ TX_DESC_LENGTH_TER_BIT = 25, -+ TX_DESC_LENGTH_TCH_BIT = 24, -+ TX_DESC_LENGTH_DP_BIT = 23, -+ TX_DESC_LENGTH_TBS2_BIT = 11, -+ TX_DESC_LENGTH_TBS1_BIT = 0 -+} tx_desc_length_t; -+ -+#define TX_DESC_LENGTH_TBS2_NUM_BITS 11 -+#define TX_DESC_LENGTH_TBS1_NUM_BITS 11 -+ -+/** Return the number of descriptors available for the CPU to fill with new -+ * packet info */ -+static inline int available_for_write(gmac_desc_list_info_t* desc_list) -+{ -+ return desc_list->empty_count; -+} -+ -+/** Return non-zero if there is a descriptor available with a packet with which -+ * the GMAC DMA has finished */ -+static inline int tx_available_for_read(gmac_desc_list_info_t* desc_list) -+{ -+ return desc_list->full_count && -+ !((desc_list->base_ptr + desc_list->r_index)->status & (1UL << TX_DESC_STATUS_OWN_BIT)); -+} -+ -+/** Return non-zero if there is a descriptor available with a packet with which -+ * the GMAC DMA has finished */ -+static inline int rx_available_for_read(gmac_desc_list_info_t* desc_list) -+{ -+ return desc_list->full_count && -+ !((desc_list->base_ptr + desc_list->r_index)->status & (1UL << RX_DESC_STATUS_OWN_BIT)); -+} -+ -+/** -+ * @param A u32 containing the status from a received frame's DMA descriptor -+ * @return An int which is non-zero if a valid received frame is fully contained -+ * within the descriptor from whence the status came -+ */ -+static inline int is_rx_valid(u32 status) -+{ -+ return !(status & descError) && -+ (status & descRxFirst) && -+ (status & descRxLast); -+} -+ -+static inline int is_rx_dribbling(u32 status) -+{ -+ return status & descRxDribbling; -+} -+ -+static inline u32 get_rx_length(u32 status) -+{ -+ return (status & descFrameLengthMask) >> descFrameLengthShift; -+} -+ -+static inline int is_rx_collision_error(u32 status) -+{ -+ return status & (descRxDamaged | descRxCollision); -+} -+ -+static inline int is_rx_crc_error(u32 status) -+{ -+ return status & descRxCrc; -+} -+ -+static inline int is_rx_frame_error(u32 status) -+{ -+ return status & descRxDribbling; -+} -+ -+static inline int is_rx_length_error(u32 status) -+{ -+ return status & descRxLengthError; -+} -+ -+static inline int is_rx_long_frame(u32 status) -+{ -+ return status & descRxLongFrame; -+} -+ -+static inline int is_tx_valid(u32 status) -+{ -+ return !(status & descError); -+} -+ -+static inline int is_tx_collision_error(u32 status) -+{ -+ return (status & descTxCollMask) >> descTxCollShift; -+} -+ -+static inline int is_tx_aborted(u32 status) -+{ -+ return status & (descTxLateCollision | descTxExcCollisions); -+} -+ -+static inline int is_tx_carrier_error(u32 status) -+{ -+ return status & (descTxLostCarrier | descTxNoCarrier); -+} -+ -+/** -+ * GMAC private metadata -+ */ -+static gmac_priv_t priv_data; -+static gmac_priv_t* priv = &priv_data; -+ -+/** -+ * Descriptor list management -+ */ -+ -+static void init_rx_descriptor( -+ gmac_dma_desc_t* desc, -+ int end_of_ring, -+ int disable_ioc) -+{ -+ desc->status = 0; -+ desc->length = 0; -+ if (disable_ioc) { -+ desc->length |= (1UL << RX_DESC_LENGTH_DIC_BIT); -+ } -+ if (end_of_ring) { -+ desc->length |= (1UL << RX_DESC_LENGTH_RER_BIT); -+ } -+ desc->buffer1 = 0; -+ desc->buffer2 = 0; -+ desc->skb = 0; -+} -+ -+static void init_tx_descriptor( -+ gmac_dma_desc_t* desc, -+ int end_of_ring, -+ int enable_ioc, -+ int disable_crc, -+ int disable_padding) -+{ -+ desc->status = 0; -+ desc->length = 0; -+ if (enable_ioc) { -+ desc->length |= (1UL << TX_DESC_LENGTH_IC_BIT); -+ } -+ if (disable_crc) { -+ desc->length |= (1UL << TX_DESC_LENGTH_DC_BIT); -+ } -+ if (disable_padding) { -+ desc->length |= (1UL << TX_DESC_LENGTH_DP_BIT); -+ } -+ if (end_of_ring) { -+ desc->length |= (1UL << TX_DESC_LENGTH_TER_BIT); -+ } -+ desc->buffer1 = 0; -+ desc->buffer2 = 0; -+ desc->skb = 0; -+} -+ -+static void init_rx_desc_list( -+ gmac_desc_list_info_t* desc_list, -+ gmac_dma_desc_t* base_ptr, -+ int num_descriptors) -+{ -+ int i; -+ -+ desc_list->base_ptr = base_ptr; -+ desc_list->num_descriptors = num_descriptors; -+ desc_list->empty_count = num_descriptors; -+ desc_list->full_count = 0; -+ desc_list->r_index = 0; -+ desc_list->w_index = 0; -+ -+ for (i=0; i < (num_descriptors - 1); i++) { -+ init_rx_descriptor(base_ptr + i, 0, 0); -+ } -+ init_rx_descriptor(base_ptr + i, 1, 0); -+} -+ -+static void init_tx_desc_list( -+ gmac_desc_list_info_t* desc_list, -+ gmac_dma_desc_t* base_ptr, -+ int num_descriptors) -+{ -+ int i; -+ -+ desc_list->base_ptr = base_ptr; -+ desc_list->num_descriptors = num_descriptors; -+ desc_list->empty_count = num_descriptors; -+ desc_list->full_count = 0; -+ desc_list->r_index = 0; -+ desc_list->w_index = 0; -+ -+ for (i=0; i < (num_descriptors - 1); i++) { -+ init_tx_descriptor(base_ptr + i, 0, 1, 0, 0); -+ } -+ init_tx_descriptor(base_ptr + i, 1, 1, 0, 0); -+} -+ -+static void rx_take_ownership(gmac_desc_list_info_t* desc_list) -+{ -+ int i; -+ for (i=0; i < desc_list->num_descriptors; i++) { -+ (desc_list->base_ptr + i)->status &= ~(1UL << RX_DESC_STATUS_OWN_BIT); -+ } -+} -+ -+static void tx_take_ownership(gmac_desc_list_info_t* desc_list) -+{ -+ int i; -+ for (i=0; i < desc_list->num_descriptors; i++) { -+ (desc_list->base_ptr + i)->status &= ~(1UL << TX_DESC_STATUS_OWN_BIT); -+ } -+} -+ -+static int set_tx_descriptor( -+ gmac_priv_t* priv, -+ dma_addr_t dma_address, -+ u32 length, -+ sk_buff_t* skb) -+{ -+ int index; -+ gmac_dma_desc_t* tx; -+ -+ // Are sufficicent descriptors available for writing by the CPU? -+ if (!available_for_write(&priv->tx_gmac_desc_list_info)) { -+ return -1; -+ } -+ -+ // Get the index of the next TX descriptor available for writing by the CPU -+ index = priv->tx_gmac_desc_list_info.w_index; -+ -+ // Get a pointer to the next TX descriptor available for writing by the CPU -+ tx = priv->tx_gmac_desc_list_info.base_ptr + index; -+ -+ // Initialise the TX descriptor length field for the passed single buffer, -+ // without destroying any fields we wish to be persistent -+ -+ // No chained second buffer -+ tx->length &= ~(1UL << TX_DESC_LENGTH_TCH_BIT); -+ // Single descriptor holds entire packet -+ tx->length |= ((1UL << TX_DESC_LENGTH_LS_BIT) | (1UL << TX_DESC_LENGTH_FS_BIT)); -+ // Zero the second buffer length field -+ tx->length &= ~(((1UL << TX_DESC_LENGTH_TBS2_NUM_BITS) - 1) << TX_DESC_LENGTH_TBS2_BIT); -+ // Zero the first buffer length field -+ tx->length &= ~(((1UL << TX_DESC_LENGTH_TBS1_NUM_BITS) - 1) << TX_DESC_LENGTH_TBS1_BIT); -+ // Fill in the first buffer length -+ tx->length |= (length << TX_DESC_LENGTH_TBS1_BIT); -+ -+ // Initialise the first buffer pointer to the single passed buffer -+ tx->buffer1 = dma_address; -+ -+ // Remember the socket buffer associated with the single passed buffer -+ tx->skb = (u32)skb; -+ -+ // Update the index of the next descriptor available for writing by the CPU -+ priv->tx_gmac_desc_list_info.w_index = (tx->length & (1UL << TX_DESC_LENGTH_TER_BIT)) ? 0 : index + 1; -+ -+ // make sure all memory updates are complete before releasing the GMAC on the data. -+ wmb(); -+ -+ // Hand TX descriptor to the GMAC DMA by setting the status bit. -+ tx->status = (1UL << TX_DESC_STATUS_OWN_BIT); -+ -+ // Account for the number of descriptors used to hold the new packet -+ --priv->tx_gmac_desc_list_info.empty_count; -+ ++priv->tx_gmac_desc_list_info.full_count; -+ -+ return index; -+} -+ -+static int get_tx_descriptor( -+ gmac_priv_t* priv, -+ u32* status, -+ dma_addr_t* dma_address, -+ u32* length, -+ sk_buff_t** skb) -+{ -+ int index; -+ gmac_dma_desc_t *tx; -+ -+ // Is there at least one descriptor with which the GMAC DMA has finished? -+ if (!tx_available_for_read(&priv->tx_gmac_desc_list_info)) { -+ return -1; -+ } -+ -+ // Get the index of the descriptor released the longest time ago by the -+ // GMAC DMA -+ index = priv->tx_gmac_desc_list_info.r_index; -+ -+ // Get a pointer to the descriptor released the longest time ago by the -+ // GMAC DMA -+ tx = priv->tx_gmac_desc_list_info.base_ptr + index; -+ -+ // Extract the status field -+ if (status) { -+ *status = tx->status; -+ } -+ -+ // Extract the length field - only cope with the first buffer associated -+ // with the descriptor -+ if (length) { -+ *length = (tx->length >> TX_DESC_LENGTH_TBS1_BIT) & -+ ((1UL << TX_DESC_LENGTH_TBS1_NUM_BITS) - 1); -+ } -+ -+ // Extract the pointer to the buffer containing the packet - only cope with -+ // the first buffer associated with the descriptor -+ if (dma_address) { -+ *dma_address = tx->buffer1; -+ } -+ -+ // Extract the pointer to the socket buffer associated with the packet -+ if (skb) { -+ *skb = (sk_buff_t*)(tx->skb); -+ } -+ -+ // Update the index of the next descriptor with which the GMAC DMA may have -+ // finished -+ priv->tx_gmac_desc_list_info.r_index = (tx->length & (1UL << TX_DESC_LENGTH_TER_BIT)) ? 0 : index + 1; -+ -+ // Account for the number of descriptors freed to hold new packets -+ ++priv->tx_gmac_desc_list_info.empty_count; -+ --priv->tx_gmac_desc_list_info.full_count; -+ -+ return index; -+} -+ -+int set_rx_descriptor( -+ gmac_priv_t* priv, -+ dma_addr_t dma_address, -+ u32 length, -+ sk_buff_t* skb) -+{ -+ int index; -+ gmac_dma_desc_t* rx; -+ int num_descriptors_required; -+ -+ // Currently only support using a single descriptor to describe each packet -+ // queued with the GMAc DMA -+ num_descriptors_required = 1; -+ -+ // Are sufficicent descriptors available for writing by the CPU? -+ if (available_for_write(&priv->rx_gmac_desc_list_info) < num_descriptors_required) { -+ index = -1; -+ } else { -+ // Get the index of the next RX descriptor available for writing by the CPU -+ index = priv->rx_gmac_desc_list_info.w_index; -+ -+ // Get a pointer to the next RX descriptor available for writing by the CPU -+ rx = priv->rx_gmac_desc_list_info.base_ptr + index; -+ -+ // Initialise the RX descriptor length field for the passed single buffer, -+ // without destroying any fields we wish to be persistent -+ -+ // No chained second buffer -+ rx->length &= ~(1UL << RX_DESC_LENGTH_RCH_BIT); -+ // Zero the second buffer length field -+ rx->length &= ~(((1UL << RX_DESC_LENGTH_RBS2_NUM_BITS) - 1) << RX_DESC_LENGTH_RBS2_BIT); -+ // Zero the first buffer length field -+ rx->length &= ~(((1UL << RX_DESC_LENGTH_RBS1_NUM_BITS) - 1) << RX_DESC_LENGTH_RBS1_BIT); -+ // Fill in the first buffer length -+ rx->length |= (length << RX_DESC_LENGTH_RBS1_BIT); -+ -+ // Initialise the first buffer pointer to the single passed buffer -+ rx->buffer1 = dma_address; -+ -+ // Remember the socket buffer associated with the single passed buffer -+ rx->skb = (u32)skb; -+ -+ wmb(); -+ -+ // Initialise RX descriptor status to be owned by the GMAC DMA -+ rx->status = (1UL << RX_DESC_STATUS_OWN_BIT); -+ -+ // Update the index of the next descriptor available for writing by the CPU -+ priv->rx_gmac_desc_list_info.w_index = (rx->length & (1UL << RX_DESC_LENGTH_RER_BIT)) ? 0 : index + 1; -+ -+ // Account for the number of descriptors used to hold the new packet -+ priv->rx_gmac_desc_list_info.empty_count -= num_descriptors_required; -+ priv->rx_gmac_desc_list_info.full_count += num_descriptors_required; -+ } -+ -+ return index; -+} -+ -+int get_rx_descriptor( -+ gmac_priv_t* priv, -+ u32* status, -+ dma_addr_t* dma_address, -+ u32* length, -+ sk_buff_t** skb) -+{ -+ int index; -+ gmac_dma_desc_t *rx; -+ int num_descriptors_required; -+ -+ // Is there at least one descriptor with which the GMAC DMA has finished? -+ if (!rx_available_for_read(&priv->rx_gmac_desc_list_info)) { -+ return -1; -+ } -+ -+ // Currently can only cope with packets entirely contained within a single -+ // descriptor -+ num_descriptors_required = 1; -+ -+ // Get the index of the descriptor released the longest time ago by the -+ // GMAC DMA -+ index = priv->rx_gmac_desc_list_info.r_index; -+ -+ // Get a pointer to the descriptor released the longest time ago by the -+ // GMAC DMA -+ rx = priv->rx_gmac_desc_list_info.base_ptr + index; -+ -+ // Extract the status field -+ if (status) { -+ *status = rx->status; -+ } -+ -+ // Extract the length field - only cope with the first buffer associated -+ // with the descriptor -+ if (length) { -+ *length = (rx->length >> RX_DESC_LENGTH_RBS1_BIT) & -+ ((1UL << RX_DESC_LENGTH_RBS1_NUM_BITS) - 1); -+ } -+ -+ // Extract the pointer to the buffer containing the packet - only cope with -+ // the first buffer associated with the descriptor -+ if (dma_address) { -+ *dma_address = rx->buffer1; -+ } -+ -+ // Extract the pointer to the socket buffer associated with the packet -+ if (skb) { -+ *skb = (sk_buff_t*)(rx->skb); -+ } -+ -+ wmb(); -+ // Update the index of the next descriptor with which the GMAC DMA may have -+ // finished -+ priv->rx_gmac_desc_list_info.r_index = (rx->length & (1UL << RX_DESC_LENGTH_RER_BIT)) ? 0 : index + 1; -+ -+ // Account for the number of descriptors freed to hold new packets -+ priv->rx_gmac_desc_list_info.empty_count += num_descriptors_required; -+ priv->rx_gmac_desc_list_info.full_count -= num_descriptors_required; -+ -+ return index; -+} -+ -+/** -+ * GMAC register access functions -+ */ -+ -+/** -+ * MAC register access functions -+ */ -+ -+/** -+ * @param priv A gmac_priv_t* pointing to private device data -+ * @param reg_num An int specifying the index of the MAC register to access -+ */ -+static inline u32 mac_reg_read(gmac_priv_t* priv, int reg_num) -+{ -+ return *(volatile u32*)(priv->macBase + (reg_num << 2)); -+} -+ -+/** -+ * @param priv A gmac_priv_t* pointing to private device data -+ * @param reg_num An int specifying the index of the MAC register to access -+ */ -+static inline void mac_reg_write(gmac_priv_t* priv, int reg_num, u32 value) -+{ -+ *(volatile u32*)(priv->macBase + (reg_num << 2)) = value; -+ -+} -+ -+/** -+ * @param priv A gmac_priv_t* pointing to private device data -+ * @param reg_num An int specifying the index of the MAC register to access -+ * @param bits_to_clear A u32 specifying which bits of the specified register to -+ * clear. A set bit in this parameter will cause the matching bit in the -+ * register to be cleared -+ */ -+static inline void mac_reg_clear_mask(gmac_priv_t* priv, int reg_num, u32 bits_to_clear) -+{ -+ mac_reg_write(priv, reg_num, mac_reg_read(priv, reg_num) & ~bits_to_clear); -+} -+ -+/** -+ * @param priv A gmac_priv_t* pointing to private device data -+ * @param reg_num An int specifying the index of the MAC register to access -+ * @param bits_to_set A u32 specifying which bits of the specified register to -+ * set. A set bit in this parameter will cause the matching bit in the register -+ * to be set -+ */ -+static inline void mac_reg_set_mask(gmac_priv_t* priv, int reg_num, u32 bits_to_set) -+{ -+ mac_reg_write(priv, reg_num, mac_reg_read(priv, reg_num) | bits_to_set); -+} -+ -+ -+/** -+ * DMA register access functions -+ */ -+ -+/** -+ * @param priv A gmac_priv_t* pointing to private device data -+ * @param reg_num An int specifying the index of the DMA register to access -+ */ -+static inline u32 dma_reg_read(gmac_priv_t* priv, int reg_num) -+{ -+ return *(volatile u32*)(priv->dmaBase + (reg_num << 2)); -+} -+ -+/** -+ * @param priv A gmac_priv_t* pointing to private device data -+ * @param reg_num An int specifying the index of the DMA register to access -+ */ -+static inline void dma_reg_write(gmac_priv_t* priv, int reg_num, u32 value) -+{ -+ *(volatile u32*)(priv->dmaBase + (reg_num << 2)) = value; -+ wmb(); -+} -+ -+/** -+ * @param priv A gmac_priv_t* pointing to private device data -+ * @param reg_num An int specifying the index of the DMA register to access -+ * @param bits_to_clear A u32 specifying which bits of the specified register to -+ * clear. A set bit in this parameter will cause the matching bit in the -+ * register to be cleared -+ * @return An u32 containing the new value written to the register -+ */ -+static inline u32 dma_reg_clear_mask(gmac_priv_t* priv, int reg_num, u32 bits_to_clear) -+{ -+ u32 new_value = dma_reg_read(priv, reg_num) & ~bits_to_clear; -+ dma_reg_write(priv, reg_num, new_value); -+ return new_value; -+} -+ -+/** -+ * @param priv A gmac_priv_t* pointing to private device data -+ * @param reg_num An int specifying the index of the DMA register to access -+ * @param bits_to_set A u32 specifying which bits of the specified register to -+ * set. A set bit in this parameter will cause the matching bit in the register -+ * to be set -+ * @return An u32 containing the new value written to the register -+ */ -+static inline u32 dma_reg_set_mask(gmac_priv_t* priv, int reg_num, u32 bits_to_set) -+{ -+ u32 new_value = dma_reg_read(priv, reg_num) | bits_to_set; -+ dma_reg_write(priv, reg_num, new_value); -+ return new_value; -+} -+ -+static void eth_down(void) -+{ -+ // Stop transmitter, take ownership of all tx descriptors -+ dma_reg_clear_mask(priv, DMA_OP_MODE_REG, DMA_OP_MODE_ST_BIT); -+ if (priv->desc_base_addr) { -+ tx_take_ownership(&priv->tx_gmac_desc_list_info); -+ } -+ -+ // Stop receiver, take ownership of all rx descriptors -+ dma_reg_clear_mask(priv, DMA_OP_MODE_REG, DMA_OP_MODE_SR_BIT); -+ if (priv->desc_base_addr) { -+ rx_take_ownership(&priv->rx_gmac_desc_list_info); -+ } -+ -+ // Free descriptor resources. The TX descriptor will not have a packet -+ // buffer attached, as this is provided by the stack when transmission is -+ // required and ownership is not retained by the descriptor, as the stack -+ // waits for transmission to complete via polling -+ if (priv->desc_base_addr) { -+ // Free receive descriptors, accounting for buffer offset used to -+ // ensure IP header alignment -+ while (1) { -+ dma_addr_t dma_address; -+ if (get_rx_descriptor(priv, 0, &dma_address, 0, 0) < 0) { -+ break; -+ } -+ free((void*)(dma_address - ETHER_FRAME_ALIGN_WASTAGE)); -+ } -+ -+ // Free DMA descriptors' storage -+ free(priv->desc_base_addr); -+ -+ // Remember that we've freed the descriptors memory -+ priv->desc_base_addr = 0; -+ } -+} -+ -+/* -+ * Reads a register from the MII Management serial interface -+ */ -+int phy_read(int phyaddr, int phyreg) -+{ -+ int data = 0; -+ u32 addr = (phyaddr << MAC_GMII_ADR_PA_BIT) | -+ (phyreg << MAC_GMII_ADR_GR_BIT) | -+ (5 << MAC_GMII_ADR_CR_BIT) | -+ (1UL << MAC_GMII_ADR_GB_BIT); -+ -+ mac_reg_write(priv, MAC_GMII_ADR_REG, addr); -+ -+ for (;;) { -+ if (!(mac_reg_read(priv, MAC_GMII_ADR_REG) & (1UL << MAC_GMII_ADR_GB_BIT))) { -+ // Successfully read from PHY -+ data = mac_reg_read(priv, MAC_GMII_DATA_REG) & 0xFFFF; -+ break; -+ } -+ } -+ -+#ifdef DEBUG_GMAC_INIT -+ printf("phy_read() phyaddr=0x%x, phyreg=0x%x, phydata=0x%x\n", phyaddr, phyreg, data); -+#endif // DEBUG_GMAC_INIT -+ -+ return data; -+} -+ -+/* -+ * Writes a register to the MII Management serial interface -+ */ -+void phy_write(int phyaddr, int phyreg, int phydata) -+{ -+ u32 addr = (phyaddr << MAC_GMII_ADR_PA_BIT) | -+ (phyreg << MAC_GMII_ADR_GR_BIT) | -+ (5 << MAC_GMII_ADR_CR_BIT) | -+ (1UL << MAC_GMII_ADR_GW_BIT) | -+ (1UL << MAC_GMII_ADR_GB_BIT); -+ -+ mac_reg_write(priv, MAC_GMII_DATA_REG, phydata); -+ mac_reg_write(priv, MAC_GMII_ADR_REG, addr); -+ -+ for (;;) { -+ if (!(mac_reg_read(priv, MAC_GMII_ADR_REG) & (1UL << MAC_GMII_ADR_GB_BIT))) { -+ break; -+ } -+ } -+ -+#ifdef DEBUG_GMAC_INIT -+ printf("phy_write() phyaddr=0x%x, phyreg=0x%x, phydata=0x%x\n", phyaddr, phyreg, phydata); -+#endif // DEBUG_GMAC_INIT -+} -+ -+/* -+ * Finds and reports the PHY address -+ */ -+int phy_detect(void) -+{ -+ int found = 0; -+ int phyaddr; -+ -+ // Scan all 32 PHY addresses if necessary -+ priv->phy_type = 0; -+ for (phyaddr = 1; phyaddr < 33; ++phyaddr) { -+ unsigned int id1, id2; -+ -+ // Read the PHY identifiers -+ id1 = phy_read(phyaddr & 31, MII_PHYSID1); -+ id2 = phy_read(phyaddr & 31, MII_PHYSID2); -+ -+#ifdef DEBUG_GMAC_INIT -+ printf("phy_detect() PHY adr = %u -> phy_id1=0x%x, phy_id2=0x%x\n", phyaddr, id1, id2); -+#endif // DEBUG_GMAC_INIT -+ -+ // Make sure it is a valid identifier -+ if (id1 != 0x0000 && id1 != 0xffff && id1 != 0x8000 && -+ id2 != 0x0000 && id2 != 0xffff && id2 != 0x8000) { -+#ifdef DEBUG_GMAC_INIT -+ printf("phy_detect() Found PHY at address = %u\n", phyaddr); -+#endif // DEBUG_GMAC_INIT -+ -+ priv->phy_id = phyaddr & 31; -+ priv->phy_type = id1 << 16 | id2; -+ priv->phy_addr = phyaddr; -+ -+ found = 1; -+ break; -+ } -+ } -+ -+ return found; -+} -+ -+void start_phy_reset(void) -+{ -+ // Ask the PHY to reset -+ phy_write(priv->phy_addr, MII_BMCR, BMCR_RESET); -+} -+ -+int is_phy_reset_complete(void) -+{ -+ int complete = 0; -+ int bmcr; -+ -+ // Read back the status until it indicates reset, or we timeout -+ bmcr = phy_read(priv->phy_addr, MII_BMCR); -+ if (!(bmcr & BMCR_RESET)) { -+ complete = 1; -+ } -+ -+ return complete; -+} -+ -+void set_phy_type_rgmii(void) -+{ -+ // Use sysctrl to switch MAC link lines into either (G)MII or RGMII mode -+ *(volatile u32*)SYS_CTRL_GMAC_CTRL |= (1UL << SYS_CTRL_GMAC_RGMII); -+} -+ -+void phy_initialise(void) -+{ -+ switch (priv->phy_type) { -+ case PHY_TYPE_VITESSE_VSC8201XVZ: -+ { -+ // Allow s/w to override mode/duplex pin settings -+ u32 acsr = phy_read(priv->phy_id, VSC8201_MII_ACSR); -+ -+ printf("PHY is Vitesse VSC8201XVZ\n"); -+ acsr |= (1UL << VSC8201_MII_ACSR_MDPPS_BIT); -+ phy_write(priv->phy_id, VSC8201_MII_ACSR, acsr); -+ } -+ break; -+ case PHY_TYPE_REALTEK_RTL8211BGR: -+ printf("PHY is Realtek RTL8211BGR\n"); -+ set_phy_type_rgmii(); -+ break; -+ case PHY_TYPE_LSI_ET1011C: -+ { -+ u32 phy_reg; -+ -+ printf("PHY is LSI ET1011C\n"); -+ -+ // Configure clocks -+ phy_reg = phy_read(priv->phy_id, ET1011C_MII_CONFIG); -+ phy_reg &= ~(((1UL << ET1011C_MII_CONFIG_IFMODESEL_NUM_BITS) - 1) << ET1011C_MII_CONFIG_IFMODESEL); -+ phy_reg |= (ET1011C_MII_CONFIG_IFMODESEL_GMII_MII << ET1011C_MII_CONFIG_IFMODESEL); -+ phy_reg |= ((1UL << ET1011C_MII_CONFIG_SYSCLKEN) | -+ (1UL << ET1011C_MII_CONFIG_TXCLKEN) | -+ (1UL << ET1011C_MII_CONFIG_TBI_RATESEL) | -+ (1UL << ET1011C_MII_CONFIG_CRS_TX_EN)); -+ phy_write(priv->phy_id, ET1011C_MII_CONFIG, phy_reg); -+ -+ // Enable Tx/Rx LED -+ phy_reg = phy_read(priv->phy_id, ET1011C_MII_LED2); -+ phy_reg &= ~(((1UL << ET1011C_MII_LED2_LED_NUM_BITS) - 1) << ET1011C_MII_LED2_LED_TXRX); -+ phy_reg |= (ET1011C_MII_LED2_LED_TXRX_ACTIVITY << ET1011C_MII_LED2_LED_TXRX); -+ phy_write(priv->phy_id, ET1011C_MII_LED2, phy_reg); -+ } -+ break; -+ } -+} -+ -+int detect_link_speed(void) -+{ -+ u32 lpa2 = phy_read(priv->phy_id, MII_STAT1000); -+ -+ if (((lpa2 & LPA_1000FULL)) || -+ ((lpa2 & LPA_1000HALF))) { -+ priv->link_is_1000M = 1; -+ } else { -+ priv->link_is_1000M = 0; -+ } -+ -+ return 0; -+} -+ -+int is_autoneg_complete(void) -+{ -+ return phy_read(priv->phy_addr, MII_BMSR) & BMSR_ANEGCOMPLETE; -+} -+ -+int is_link_ok(void) -+{ -+ return phy_read(priv->phy_id, MII_BMSR) & BMSR_LSTATUS; -+} -+ -+int eth_init(bd_t *bd) -+{ -+ u32 version; -+ u32 reg_contents; -+ u8 *mac_addr; -+ int desc; -+ -+ // Set hardware device base addresses -+ priv->macBase = (MAC_BASE_PA + MAC_BASE_OFFSET); -+ priv->dmaBase = (MAC_BASE_PA + DMA_BASE_OFFSET); -+ -+#ifdef DEBUG_GMAC_INIT -+ printf("eth_init(): About to reset MAC core\n"); -+#endif // DEBUG_GMAC_INIT -+ // Ensure the MAC block is properly reset -+ *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_MAC_BIT); -+ *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_MAC_BIT); -+ -+ // Enable the clock to the MAC block -+ *(volatile u32*)SYS_CTRL_CKEN_SET_CTRL = (1UL << SYS_CTRL_CKEN_MAC_BIT); -+ -+ version = mac_reg_read(priv, MAC_VERSION_REG); -+#ifdef DEBUG_GMAC_INIT -+ printf("eth_init(): GMAC Synopsis version = 0x%x, vendor version = 0x%x\n", version & 0xff, (version >> 8) & 0xff); -+#endif // DEBUG_GMAC_INIT -+ -+ // Use simple mux for 25/125 Mhz clock switching -+ *(volatile u32*)SYS_CTRL_GMAC_CTRL |= (1UL << SYS_CTRL_GMAC_SIMPLE_MAX); -+ -+ // Enable GMII_GTXCLK to follow GMII_REFCLK - required for gigabit PHY -+ *(volatile u32*)SYS_CTRL_GMAC_CTRL |= (1UL << SYS_CTRL_GMAC_CKEN_GTX); -+ -+ // Disable all GMAC interrupts -+ dma_reg_write(priv, DMA_INT_ENABLE_REG, 0); -+ -+ // Reset the entire GMAC -+ dma_reg_write(priv, DMA_BUS_MODE_REG, 1UL << DMA_BUS_MODE_SWR_BIT); -+ -+ // Wait for the reset operation to complete -+ printf("Wait GMAC to reset"); -+ while (dma_reg_read(priv, DMA_BUS_MODE_REG) & (1UL << DMA_BUS_MODE_SWR_BIT)) { -+ udelay(250000); -+ printf("."); -+ } -+ printf("\n"); -+ -+ // Attempt to discover link speed from the PHY -+ if (!phy_detect()) { -+ printf("No PHY found\n"); -+ } else { -+ // Ensure the PHY is in a sensible state by resetting it -+ start_phy_reset(); -+ -+ // Read back the status until it indicates reset, or we timeout -+ printf("Wait for PHY reset"); -+ while (!is_phy_reset_complete()) { -+ udelay(250000); -+ printf("."); -+ } -+ printf("\n"); -+ -+ // Setup the PHY based on its type -+ phy_initialise(); -+ -+ printf("Wait for link to come up"); -+ while (!is_link_ok()) { -+ udelay(250000); -+ printf("."); -+ } -+ printf("Link up\n"); -+ -+ // Wait for PHY to have completed autonegotiation -+ printf("Wait for auto-negotiation to complete"); -+ while (!is_autoneg_complete()) { -+ udelay(250000); -+ printf("."); -+ } -+ printf("\n"); -+ -+ // Interrogate the PHY for the link speed -+ if (detect_link_speed()) { -+ printf("Failed to detect link speed\n"); -+ } else { -+ printf("Link is %s\n", priv->link_is_1000M ? "1000M" : "10M/100M"); -+ } -+ } -+ -+ // Form the MAC config register contents -+ reg_contents = 0; -+ if (!priv->link_is_1000M) { -+ reg_contents |= (1UL << MAC_CONFIG_PS_BIT); // Gigabit -+ } -+ reg_contents |= (1UL << MAC_CONFIG_DM_BIT); // Full duplex -+ reg_contents |= ((1UL << MAC_CONFIG_TE_BIT) | -+ (1UL << MAC_CONFIG_RE_BIT)); -+ mac_reg_write(priv, MAC_CONFIG_REG, reg_contents); -+ -+ // Form the MAC frame filter register contents -+ reg_contents = 0; -+ mac_reg_write(priv, MAC_FRAME_FILTER_REG, reg_contents); -+ -+ // Form the hash table registers contents -+ mac_reg_write(priv, MAC_HASH_HIGH_REG, 0); -+ mac_reg_write(priv, MAC_HASH_LOW_REG, 0); -+ -+ // Form the MAC flow control register contents -+ reg_contents = 0; -+ reg_contents |= ((1UL << MAC_FLOW_CNTL_RFE_BIT) | -+ (1UL << MAC_FLOW_CNTL_TFE_BIT)); -+ mac_reg_write(priv, MAC_FLOW_CNTL_REG, reg_contents); -+ -+ // Form the MAC VLAN tag register contents -+ reg_contents = 0; -+ mac_reg_write(priv, MAC_VLAN_TAG_REG, reg_contents); -+ -+ // Form the MAC addr0 high and low registers contents from the character -+ // string representation from the environment -+ mac_addr = getenv("ethaddr"); -+#ifdef DEBUG_GMAC_INIT -+ printf("eth_init(): Mac addr = %s\n", mac_addr); -+#endif // DEBUG_GMAC_INIT -+ reg_contents = simple_strtoul(mac_addr+0, 0, 16); -+ reg_contents |= (simple_strtoul(mac_addr+3, 0, 16) << 8); -+ reg_contents |= (simple_strtoul(mac_addr+6, 0, 16) << 16); -+ reg_contents |= (simple_strtoul(mac_addr+9, 0, 16) << 24); -+ mac_reg_write(priv, MAC_ADR0_LOW_REG, reg_contents); -+ reg_contents = simple_strtoul(mac_addr+12, 0, 16); -+ reg_contents |= (simple_strtoul(mac_addr+15, 0, 16) << 8); -+ mac_reg_write(priv, MAC_ADR0_HIGH_REG, reg_contents); -+ -+ // Disable all MMC interrupt sources -+ mac_reg_write(priv, MMC_RX_MASK_REG, ~0UL); -+ mac_reg_write(priv, MMC_TX_MASK_REG, ~0UL); -+ -+ // Remember how large the unified descriptor array is to be -+ priv->total_num_descriptors = NUM_RX_DMA_DESCRIPTORS + NUM_TX_DMA_DESCRIPTORS; -+ -+ // Need a consistent DMA mapping covering all the memory occupied by DMA -+ // unified descriptor array, as both CPU and DMA engine will be reading and -+ // writing descriptor fields. -+ priv->desc_base_addr = (gmac_dma_desc_t*)malloc(sizeof(gmac_dma_desc_t) * priv->total_num_descriptors); -+ if (!priv->desc_base_addr) { -+ printf("eth_init(): Failed to allocate memory for DMA descriptors\n"); -+ goto err_out; -+ } -+ -+ // Initialise the structures managing the TX descriptor list -+ init_tx_desc_list(&priv->tx_gmac_desc_list_info, -+ priv->desc_base_addr, -+ NUM_TX_DMA_DESCRIPTORS); -+ -+ // Initialise the structures managing the RX descriptor list -+ init_rx_desc_list(&priv->rx_gmac_desc_list_info, -+ priv->desc_base_addr + NUM_TX_DMA_DESCRIPTORS, -+ priv->total_num_descriptors - NUM_TX_DMA_DESCRIPTORS); -+ -+ // Prepare receive descriptors -+ desc = 0; -+ while (available_for_write(&priv->rx_gmac_desc_list_info)) { -+ // Allocate a new buffer for the descriptor which is large enough for -+ // any packet received from the link -+ dma_addr_t dma_address = (dma_addr_t)malloc(ETHER_MTU + ETHER_FRAME_ALIGN_WASTAGE + EXTRA_RX_SKB_SPACE); -+ if (!dma_address) { -+ printf("eth_init(): No memory for socket buffer\n"); -+ break; -+ } -+ -+ desc = set_rx_descriptor(priv, -+ dma_address + ETHER_FRAME_ALIGN_WASTAGE, -+ ETHER_MTU + EXTRA_RX_SKB_SPACE, -+ 0); -+ -+ if (desc < 0) { -+ // Release the buffer -+ free((void*)dma_address); -+ -+ printf("eth_init(): Error, no RX descriptor available\n"); -+ goto err_out; -+ } -+ } -+ -+ // Initialise the GMAC DMA bus mode register -+ dma_reg_write(priv, DMA_BUS_MODE_REG, ((0UL << DMA_BUS_MODE_FB_BIT) | -+ (0UL << DMA_BUS_MODE_PR_BIT) | -+ (32UL << DMA_BUS_MODE_PBL_BIT) | // AHB burst size -+ (1UL << DMA_BUS_MODE_DSL_BIT) | -+ (0UL << DMA_BUS_MODE_DA_BIT))); -+ -+ // Write the address of the start of the tx descriptor array -+ dma_reg_write(priv, DMA_TX_DESC_ADR_REG, (u32)priv->desc_base_addr); -+ -+ // Write the address of the start of the rx descriptor array -+ dma_reg_write(priv, DMA_RX_DESC_ADR_REG, -+ (u32)(priv->desc_base_addr + priv->tx_gmac_desc_list_info.num_descriptors)); -+ -+ // Clear any pending interrupt requests -+ dma_reg_write(priv, DMA_STATUS_REG, dma_reg_read(priv, DMA_STATUS_REG)); -+ -+ // Initialise the GMAC DMA operation mode register, starting both the -+ // transmitter and receiver -+ dma_reg_write(priv, DMA_OP_MODE_REG, ((1UL << DMA_OP_MODE_SF_BIT) | // Store and forward -+ (0UL << DMA_OP_MODE_TTC_BIT) | // Tx threshold -+ (1UL << DMA_OP_MODE_ST_BIT) | // Enable transmitter -+ (0UL << DMA_OP_MODE_RTC_BIT) | // Rx threshold -+ (1UL << DMA_OP_MODE_SR_BIT))); // Enable receiver -+ -+ // Success -+ return 1; -+ -+err_out: -+ eth_down(); -+ -+ return 0; -+} -+ -+void eth_halt(void) -+{ -+ eth_down(); -+ -+ // Disable the clock to the MAC block -+ *(volatile u32*)(SYS_CTRL_CKEN_CLR_CTRL) = (1UL << SYS_CTRL_CKEN_MAC_BIT); -+} -+ -+int eth_rx(void) -+{ -+ static const int MAX_LOOPS = 2000; // 2 seconds -+ -+ int length = 0; -+ dma_addr_t dma_address; -+ u32 desc_status; -+ int loops = 0; -+ -+ // Look for the first available received packet -+ while (loops++ < MAX_LOOPS) { -+ if (get_rx_descriptor(priv, &desc_status, &dma_address, 0, 0) >= 0) { -+ if (is_rx_valid(desc_status)) { -+ // Get the length of the packet within the buffer -+ length = get_rx_length(desc_status); -+ -+ // Pass packet up the network stack - will block until processing is -+ // completed -+ NetReceive((uchar*)dma_address, length); -+ } else { -+ printf("eth_rx() Received packet has bad desc_status = 0x%08x\n", desc_status); -+ } -+ -+ // Re-initialise the RX descriptor with its buffer - relies on always -+ // setting an RX descriptor directly after getting it -+ if (set_rx_descriptor(priv, dma_address, ETHER_MTU + EXTRA_RX_SKB_SPACE, 0) < 0) { -+ printf("eth_rx(): Failed to set RX descriptor\n"); -+ } -+ -+ break; -+ } -+ -+ // Wait a bit before trying again to get a descriptor -+ udelay(1000); // 1mS -+ } -+ -+ return length; -+} -+ -+int eth_send(volatile void *packet, int length) -+{ -+ // Transmit the new packet -+ while (1) { -+ // Get the TX descriptor -+ if (set_tx_descriptor(priv, (dma_addr_t)packet, length, 0) >= 0) { -+ // Tell the GMAC to poll for the updated descriptor -+ dma_reg_write(priv, DMA_TX_POLL_REG, 0); -+ break; -+ } -+ -+ // Wait a bit before trying again to get a descriptor -+ udelay(1000); // 1mS -+ } -+ -+ // Wait for the packet buffer to be finished with -+ while (get_tx_descriptor(priv, 0, 0, 0, 0) < 0) { -+ // Wait a bit before examining the descriptor again -+ udelay(1000); // 1mS -+ } -+ -+ return length; -+} -+ -diff -Nurd u-boot-1.1.2/board/oxnas/ide-810.c u-boot-1.1.2-oxe810/board/oxnas/ide-810.c ---- u-boot-1.1.2/board/oxnas/ide-810.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/board/oxnas/ide-810.c 2008-06-11 17:55:18.000000000 +0200 -@@ -0,0 +1,892 @@ -+/* -+ * (C) Copyright 2005 -+ * Oxford Semiconductor Ltd -+ * -+ * 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> -+ -+#define SATA_DMA_CHANNEL 0 -+ -+#define DMA_CTRL_STATUS (0x0) -+#define DMA_BASE_SRC_ADR (0x4) -+#define DMA_BASE_DST_ADR (0x8) -+#define DMA_BYTE_CNT (0xC) -+#define DMA_CURRENT_SRC_ADR (0x10) -+#define DMA_CURRENT_DST_ADR (0x14) -+#define DMA_CURRENT_BYTE_CNT (0x18) -+#define DMA_INTR_ID (0x1C) -+#define DMA_INTR_CLEAR_REG (DMA_CURRENT_SRC_ADR) -+ -+#define DMA_CALC_REG_ADR(channel, register) ((volatile u32*)(DMA_BASE_PA + ((channel) << 5) + (register))) -+ -+#define DMA_CTRL_STATUS_FAIR_SHARE_ARB (1 << 0) -+#define DMA_CTRL_STATUS_IN_PROGRESS (1 << 1) -+#define DMA_CTRL_STATUS_SRC_DREQ_MASK (0x0000003C) -+#define DMA_CTRL_STATUS_SRC_DREQ_SHIFT (2) -+#define DMA_CTRL_STATUS_DEST_DREQ_MASK (0x000003C0) -+#define DMA_CTRL_STATUS_DEST_DREQ_SHIFT (6) -+#define DMA_CTRL_STATUS_INTR (1 << 10) -+#define DMA_CTRL_STATUS_NXT_FREE (1 << 11) -+#define DMA_CTRL_STATUS_RESET (1 << 12) -+#define DMA_CTRL_STATUS_DIR_MASK (0x00006000) -+#define DMA_CTRL_STATUS_DIR_SHIFT (13) -+#define DMA_CTRL_STATUS_SRC_ADR_MODE (1 << 15) -+#define DMA_CTRL_STATUS_DEST_ADR_MODE (1 << 16) -+#define DMA_CTRL_STATUS_TRANSFER_MODE_A (1 << 17) -+#define DMA_CTRL_STATUS_TRANSFER_MODE_B (1 << 18) -+#define DMA_CTRL_STATUS_SRC_WIDTH_MASK (0x00380000) -+#define DMA_CTRL_STATUS_SRC_WIDTH_SHIFT (19) -+#define DMA_CTRL_STATUS_DEST_WIDTH_MASK (0x01C00000) -+#define DMA_CTRL_STATUS_DEST_WIDTH_SHIFT (22) -+#define DMA_CTRL_STATUS_PAUSE (1 << 25) -+#define DMA_CTRL_STATUS_INTERRUPT_ENABLE (1 << 26) -+#define DMA_CTRL_STATUS_SOURCE_ADDRESS_FIXED (1 << 27) -+#define DMA_CTRL_STATUS_DESTINATION_ADDRESS_FIXED (1 << 28) -+#define DMA_CTRL_STATUS_STARVE_LOW_PRIORITY (1 << 29) -+#define DMA_CTRL_STATUS_INTR_CLEAR_ENABLE (1 << 30) -+ -+#define DMA_BYTE_CNT_MASK ((1 << 21) - 1) -+#define DMA_BYTE_CNT_WR_EOT_MASK (1 << 30) -+#define DMA_BYTE_CNT_RD_EOT_MASK (1 << 31) -+ -+#define MAKE_FIELD(value, num_bits, bit_num) (((value) & ((1 << (num_bits)) - 1)) << (bit_num)) -+ -+typedef enum oxnas_dma_mode { -+ OXNAS_DMA_MODE_FIXED, -+ OXNAS_DMA_MODE_INC -+} oxnas_dma_mode_t; -+ -+typedef enum oxnas_dma_direction { -+ OXNAS_DMA_TO_DEVICE, -+ OXNAS_DMA_FROM_DEVICE -+} oxnas_dma_direction_t; -+ -+/* The available buses to which the DMA controller is attached */ -+typedef enum oxnas_dma_transfer_bus -+{ -+ OXNAS_DMA_SIDE_A, -+ OXNAS_DMA_SIDE_B -+} oxnas_dma_transfer_bus_t; -+ -+/* Direction of data flow between the DMA controller's pair of interfaces */ -+typedef enum oxnas_dma_transfer_direction -+{ -+ OXNAS_DMA_A_TO_A, -+ OXNAS_DMA_B_TO_A, -+ OXNAS_DMA_A_TO_B, -+ OXNAS_DMA_B_TO_B -+} oxnas_dma_transfer_direction_t; -+ -+/* The available data widths */ -+typedef enum oxnas_dma_transfer_width -+{ -+ OXNAS_DMA_TRANSFER_WIDTH_8BITS, -+ OXNAS_DMA_TRANSFER_WIDTH_16BITS, -+ OXNAS_DMA_TRANSFER_WIDTH_32BITS -+} oxnas_dma_transfer_width_t; -+ -+/* The mode of the DMA transfer */ -+typedef enum oxnas_dma_transfer_mode -+{ -+ OXNAS_DMA_TRANSFER_MODE_SINGLE, -+ OXNAS_DMA_TRANSFER_MODE_BURST -+} oxnas_dma_transfer_mode_t; -+ -+/* The available transfer targets */ -+typedef enum oxnas_dma_dreq -+{ -+ OXNAS_DMA_DREQ_SATA = 0, -+ OXNAS_DMA_DREQ_MEMORY = 15 -+} oxnas_dma_dreq_t; -+ -+typedef struct oxnas_dma_device_settings { -+ unsigned long address_; -+ unsigned fifo_size_; // Chained transfers must take account of FIFO offset at end of previous transfer -+ unsigned char dreq_; -+ unsigned read_eot_:1; -+ unsigned read_final_eot_:1; -+ unsigned write_eot_:1; -+ unsigned write_final_eot_:1; -+ unsigned bus_:1; -+ unsigned width_:2; -+ unsigned transfer_mode_:1; -+ unsigned address_mode_:1; -+ unsigned address_really_fixed_:1; -+} oxnas_dma_device_settings_t; -+ -+static const int MAX_NO_ERROR_LOOPS = 100000; /* 1 second in units of 10uS */ -+static const int MAX_DMA_XFER_LOOPS = 300000; /* 30 seconds in units of 100uS */ -+static const int MAX_DMA_ABORT_LOOPS = 10000; /* 0.1 second in units of 10uS */ -+static const int MAX_SRC_READ_LOOPS = 10000; /* 0.1 second in units of 10uS */ -+static const int MAX_SRC_WRITE_LOOPS = 10000; /* 0.1 second in units of 10uS */ -+static const int MAX_NOT_BUSY_LOOPS = 10000; /* 1 second in units of 100uS */ -+ -+/* The internal SATA drive on which we should attempt to find partitions */ -+static volatile u32* sata_regs_base[2] = -+{ -+ (volatile u32*)SATA_0_REGS_BASE, -+ (volatile u32*)SATA_1_REGS_BASE, -+ -+}; -+static u32 wr_sata_orb1[2] = { 0, 0 }; -+static u32 wr_sata_orb2[2] = { 0, 0 }; -+static u32 wr_sata_orb3[2] = { 0, 0 }; -+static u32 wr_sata_orb4[2] = { 0, 0 }; -+ -+static oxnas_dma_device_settings_t oxnas_sata_dma_settings = { -+ .address_ = SATA_DATA_BASE_PA, -+ .fifo_size_ = 16, -+ .dreq_ = OXNAS_DMA_DREQ_SATA, -+ .read_eot_ = 0, -+ .read_final_eot_ = 1, -+ .write_eot_ = 0, -+ .write_final_eot_ = 1, -+ .bus_ = OXNAS_DMA_SIDE_A, -+ .width_ = OXNAS_DMA_TRANSFER_WIDTH_32BITS, -+ .transfer_mode_ = OXNAS_DMA_TRANSFER_MODE_BURST, -+ .address_mode_ = OXNAS_DMA_MODE_FIXED, -+ .address_really_fixed_ = 0 -+}; -+ -+oxnas_dma_device_settings_t oxnas_ram_dma_settings = { -+ .address_ = 0, -+ .fifo_size_ = 0, -+ .dreq_ = OXNAS_DMA_DREQ_MEMORY, -+ .read_eot_ = 1, -+ .read_final_eot_ = 1, -+ .write_eot_ = 1, -+ .write_final_eot_ = 1, -+ .bus_ = OXNAS_DMA_SIDE_B, -+ .width_ = OXNAS_DMA_TRANSFER_WIDTH_32BITS, -+ .transfer_mode_ = OXNAS_DMA_TRANSFER_MODE_BURST, -+ .address_mode_ = OXNAS_DMA_MODE_FIXED, -+ .address_really_fixed_ = 1 -+}; -+ -+static void xfer_wr_shadow_to_orbs(int device) -+{ -+ *(sata_regs_base[device] + SATA_ORB1_OFF) = wr_sata_orb1[device]; -+ *(sata_regs_base[device] + SATA_ORB2_OFF) = wr_sata_orb2[device]; -+ *(sata_regs_base[device] + SATA_ORB3_OFF) = wr_sata_orb3[device]; -+ *(sata_regs_base[device] + SATA_ORB4_OFF) = wr_sata_orb4[device]; -+} -+ -+static inline void device_select(int device) -+{ -+ /* master/slave has no meaning to SATA core */ -+} -+ -+static int disk_present[CFG_IDE_MAXDEVICE]; -+ -+#include <ata.h> -+ -+unsigned char oxnas_sata_inb(int device, int port) -+{ -+ unsigned char val = 0; -+ -+ /* Only permit accesses to disks found to be present during ide_preinit() */ -+ if (!disk_present[device]) { -+ return ATA_STAT_FAULT; -+ } -+ -+ device_select(device); -+ -+ switch (port) { -+ case ATA_PORT_CTL: -+ val = (*(sata_regs_base[device] + SATA_ORB4_OFF) & (0xFFUL << SATA_CTL_BIT)) >> SATA_CTL_BIT; -+ break; -+ case ATA_PORT_FEATURE: -+ val = (*(sata_regs_base[device] + SATA_ORB2_OFF) & (0xFFUL << SATA_FEATURE_BIT)) >> SATA_FEATURE_BIT; -+ break; -+ case ATA_PORT_NSECT: -+ val = (*(sata_regs_base[device] + SATA_ORB2_OFF) & (0xFFUL << SATA_NSECT_BIT)) >> SATA_NSECT_BIT; -+ break; -+ case ATA_PORT_LBAL: -+ val = (*(sata_regs_base[device] + SATA_ORB3_OFF) & (0xFFUL << SATA_LBAL_BIT)) >> SATA_LBAL_BIT; -+ break; -+ case ATA_PORT_LBAM: -+ val = (*(sata_regs_base[device] + SATA_ORB3_OFF) & (0xFFUL << SATA_LBAM_BIT)) >> SATA_LBAM_BIT; -+ break; -+ case ATA_PORT_LBAH: -+ val = (*(sata_regs_base[device] + SATA_ORB3_OFF) & (0xFFUL << SATA_LBAH_BIT)) >> SATA_LBAH_BIT; -+ break; -+ case ATA_PORT_DEVICE: -+ val = (*(sata_regs_base[device] + SATA_ORB3_OFF) & (0xFFUL << SATA_HOB_LBAH_BIT)) >> SATA_HOB_LBAH_BIT; -+ val |= (*(sata_regs_base[device] + SATA_ORB1_OFF) & (0xFFUL << SATA_DEVICE_BIT)) >> SATA_DEVICE_BIT; -+ break; -+ case ATA_PORT_COMMAND: -+ val = (*(sata_regs_base[device] + SATA_ORB2_OFF) & (0xFFUL << SATA_COMMAND_BIT)) >> SATA_COMMAND_BIT; -+ val |= ATA_STAT_DRQ ; -+ break; -+ default: -+ printf("ide_inb() Unknown port = %d\n", port); -+ break; -+ } -+ -+// printf("inb: %d:%01x => %02x\n", device, port, val); -+ -+ return val; -+} -+ -+/** -+ * Possible that ATA status will not become no-error, so must have timeout -+ * @returns An int which is zero on error -+ */ -+static inline int wait_no_error(int device) -+{ -+ int status = 0; -+ -+ /* Check for ATA core error */ -+ if (*(sata_regs_base[device] + SATA_INT_STATUS_OFF) & (1 << SATA_INT_STATUS_ERROR_BIT)) { -+ printf("wait_no_error() SATA core flagged error\n"); -+ } else { -+ int loops = MAX_NO_ERROR_LOOPS; -+ do { -+ /* Check for ATA device error */ -+ if (!(oxnas_sata_inb(device, ATA_PORT_COMMAND) & (1 << ATA_STATUS_ERR_BIT))) { -+ status = 1; -+ break; -+ } -+ udelay(10); -+ } while (--loops); -+ -+ if (!loops) { -+ printf("wait_no_error() Timed out of wait for SATA no-error condition\n"); -+ } -+ } -+ -+ return status; -+} -+ -+/** -+ * Expect SATA command to always finish, perhaps with error -+ * @returns An int which is zero on error -+ */ -+static inline int wait_sata_command_not_busy(int device) -+{ -+ /* Wait for data to be available */ -+ int status = 0; -+ int loops = MAX_NOT_BUSY_LOOPS; -+ do { -+ if (!(*(sata_regs_base[device] + SATA_COMMAND_OFF) & (1 << SATA_CMD_BUSY_BIT) )) { -+ status = 1; -+ break; -+ } -+ udelay(100); -+ } while (--loops); -+ -+ if (!loops) { -+ printf("wait_sata_command_not_busy() Timed out of wait for SATA command to finish\n"); -+ } -+ -+ return status; -+} -+ -+void oxnas_sata_outb(int device, int port, unsigned char val) -+{ -+ typedef enum send_method { -+ SEND_NONE, -+ SEND_SIMPLE, -+ SEND_CMD, -+ SEND_CTL, -+ } send_method_t; -+ -+ /* Only permit accesses to disks found to be present during ide_preinit() */ -+ if (!disk_present[device]) { -+ return; -+ } -+ -+// printf("outb: %d:%01x <= %02x\n", device, port, val); -+ -+ device_select(device); -+ -+ send_method_t send_regs = SEND_NONE; -+ switch (port) { -+ case ATA_PORT_CTL: -+ wr_sata_orb4[device] &= ~(0xFFUL << SATA_CTL_BIT); -+ wr_sata_orb4[device] |= (val << SATA_CTL_BIT); -+ send_regs = SEND_CTL; -+ break; -+ case ATA_PORT_FEATURE: -+ wr_sata_orb2[device] &= ~(0xFFUL << SATA_FEATURE_BIT); -+ wr_sata_orb2[device] |= (val << SATA_FEATURE_BIT); -+ send_regs = SEND_SIMPLE; -+ break; -+ case ATA_PORT_NSECT: -+ wr_sata_orb2[device] &= ~(0xFFUL << SATA_NSECT_BIT); -+ wr_sata_orb2[device] |= (val << SATA_NSECT_BIT); -+ send_regs = SEND_SIMPLE; -+ break; -+ case ATA_PORT_LBAL: -+ wr_sata_orb3[device] &= ~(0xFFUL << SATA_LBAL_BIT); -+ wr_sata_orb3[device] |= (val << SATA_LBAL_BIT); -+ send_regs = SEND_SIMPLE; -+ break; -+ case ATA_PORT_LBAM: -+ wr_sata_orb3[device] &= ~(0xFFUL << SATA_LBAM_BIT); -+ wr_sata_orb3[device] |= (val << SATA_LBAM_BIT); -+ send_regs = SEND_SIMPLE; -+ break; -+ case ATA_PORT_LBAH: -+ wr_sata_orb3[device] &= ~(0xFFUL << SATA_LBAH_BIT); -+ wr_sata_orb3[device] |= (val << SATA_LBAH_BIT); -+ send_regs = SEND_SIMPLE; -+ break; -+ case ATA_PORT_DEVICE: -+ wr_sata_orb1[device] &= ~(0xFFUL << SATA_DEVICE_BIT); -+ wr_sata_orb1[device] |= ((val & 0xf0) << SATA_DEVICE_BIT); -+ wr_sata_orb3[device] &= ~(0xFFUL << SATA_HOB_LBAH_BIT); -+ wr_sata_orb3[device] |= ((val & 0x0f) << SATA_HOB_LBAH_BIT); -+ send_regs = SEND_SIMPLE; -+ break; -+ case ATA_PORT_COMMAND: -+ wr_sata_orb2[device] &= ~(0xFFUL << SATA_COMMAND_BIT); -+ wr_sata_orb2[device] |= (val << SATA_COMMAND_BIT); -+ send_regs = SEND_CMD; -+ break; -+ default: -+ printf("ide_outb() Unknown port = %d\n", port); -+ } -+ -+ u32 command; -+ switch (send_regs) { -+ case SEND_CMD: -+ wait_sata_command_not_busy(device); -+ command = *(sata_regs_base[device] + SATA_COMMAND_OFF); -+ command &= ~SATA_OPCODE_MASK; -+ command |= SATA_CMD_WRITE_TO_ORB_REGS; -+ xfer_wr_shadow_to_orbs(device); -+ wait_sata_command_not_busy(device); -+ *(sata_regs_base[device] + SATA_COMMAND_OFF) = command; -+ if (!wait_no_error(device)) { -+ printf("oxnas_sata_outb() Wait for ATA no-error timed-out\n"); -+ } -+ break; -+ case SEND_CTL: -+ wait_sata_command_not_busy(device); -+ command = *(sata_regs_base[device] + SATA_COMMAND_OFF); -+ command &= ~SATA_OPCODE_MASK; -+ command |= SATA_CMD_WRITE_TO_ORB_REGS_NO_COMMAND; -+ xfer_wr_shadow_to_orbs(device); -+ wait_sata_command_not_busy(device); -+ *(sata_regs_base[device] + SATA_COMMAND_OFF) = command; -+ if (!wait_no_error(device)) { -+ printf("oxnas_sata_outb() Wait for ATA no-error timed-out\n"); -+ } -+ break; -+ default: -+ break; -+ } -+} -+ -+static u32 encode_start(u32 ctrl_status) -+{ -+ return ctrl_status & ~DMA_CTRL_STATUS_PAUSE; -+} -+ -+static void dma_start(void) -+{ -+ *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS) = -+ encode_start(*(DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS))); -+} -+ -+static unsigned long encode_control_status( -+ oxnas_dma_device_settings_t* src_settings, -+ oxnas_dma_device_settings_t* dst_settings) -+{ -+ unsigned long ctrl_status; -+ oxnas_dma_transfer_direction_t direction; -+ -+ ctrl_status = DMA_CTRL_STATUS_PAUSE; // Paused -+ ctrl_status |= DMA_CTRL_STATUS_FAIR_SHARE_ARB; // High priority -+ ctrl_status |= (src_settings->dreq_ << DMA_CTRL_STATUS_SRC_DREQ_SHIFT); // Dreq -+ ctrl_status |= (dst_settings->dreq_ << DMA_CTRL_STATUS_DEST_DREQ_SHIFT); // Dreq -+ ctrl_status &= ~DMA_CTRL_STATUS_RESET; // !RESET -+ -+ // Use new interrupt clearing register -+ ctrl_status |= DMA_CTRL_STATUS_INTR_CLEAR_ENABLE; -+ -+ // Setup the transfer direction and burst/single mode for the two DMA busses -+ if (src_settings->bus_ == OXNAS_DMA_SIDE_A) { -+ // Set the burst/single mode for bus A based on src device's settings -+ if (src_settings->transfer_mode_ == OXNAS_DMA_TRANSFER_MODE_BURST) { -+ ctrl_status |= DMA_CTRL_STATUS_TRANSFER_MODE_A; -+ } else { -+ ctrl_status &= ~DMA_CTRL_STATUS_TRANSFER_MODE_A; -+ } -+ -+ if (dst_settings->bus_ == OXNAS_DMA_SIDE_A) { -+ direction = OXNAS_DMA_A_TO_A; -+ } else { -+ direction = OXNAS_DMA_A_TO_B; -+ -+ // Set the burst/single mode for bus B based on dst device's settings -+ if (dst_settings->transfer_mode_ == OXNAS_DMA_TRANSFER_MODE_BURST) { -+ ctrl_status |= DMA_CTRL_STATUS_TRANSFER_MODE_B; -+ } else { -+ ctrl_status &= ~DMA_CTRL_STATUS_TRANSFER_MODE_B; -+ } -+ } -+ } else { -+ // Set the burst/single mode for bus B based on src device's settings -+ if (src_settings->transfer_mode_ == OXNAS_DMA_TRANSFER_MODE_BURST) { -+ ctrl_status |= DMA_CTRL_STATUS_TRANSFER_MODE_B; -+ } else { -+ ctrl_status &= ~DMA_CTRL_STATUS_TRANSFER_MODE_B; -+ } -+ -+ if (dst_settings->bus_ == OXNAS_DMA_SIDE_A) { -+ direction = OXNAS_DMA_B_TO_A; -+ -+ // Set the burst/single mode for bus A based on dst device's settings -+ if (dst_settings->transfer_mode_ == OXNAS_DMA_TRANSFER_MODE_BURST) { -+ ctrl_status |= DMA_CTRL_STATUS_TRANSFER_MODE_A; -+ } else { -+ ctrl_status &= ~DMA_CTRL_STATUS_TRANSFER_MODE_A; -+ } -+ } else { -+ direction = OXNAS_DMA_B_TO_B; -+ } -+ } -+ ctrl_status |= (direction << DMA_CTRL_STATUS_DIR_SHIFT); -+ -+ // Setup source address mode fixed or increment -+ if (src_settings->address_mode_ == OXNAS_DMA_MODE_FIXED) { -+ // Fixed address -+ ctrl_status &= ~(DMA_CTRL_STATUS_SRC_ADR_MODE); -+ -+ // Set up whether fixed address is _really_ fixed -+ if (src_settings->address_really_fixed_) { -+ ctrl_status |= DMA_CTRL_STATUS_SOURCE_ADDRESS_FIXED; -+ } else { -+ ctrl_status &= ~DMA_CTRL_STATUS_SOURCE_ADDRESS_FIXED; -+ } -+ } else { -+ // Incrementing address -+ ctrl_status |= DMA_CTRL_STATUS_SRC_ADR_MODE; -+ ctrl_status &= ~DMA_CTRL_STATUS_SOURCE_ADDRESS_FIXED; -+ } -+ -+ // Setup destination address mode fixed or increment -+ if (dst_settings->address_mode_ == OXNAS_DMA_MODE_FIXED) { -+ // Fixed address -+ ctrl_status &= ~(DMA_CTRL_STATUS_DEST_ADR_MODE); -+ -+ // Set up whether fixed address is _really_ fixed -+ if (dst_settings->address_really_fixed_) { -+ ctrl_status |= DMA_CTRL_STATUS_DESTINATION_ADDRESS_FIXED; -+ } else { -+ ctrl_status &= ~DMA_CTRL_STATUS_DESTINATION_ADDRESS_FIXED; -+ } -+ } else { -+ // Incrementing address -+ ctrl_status |= DMA_CTRL_STATUS_DEST_ADR_MODE; -+ ctrl_status &= ~DMA_CTRL_STATUS_DESTINATION_ADDRESS_FIXED; -+ } -+ -+ // Set up the width of the transfers on the DMA buses -+ ctrl_status |= (src_settings->width_ << DMA_CTRL_STATUS_SRC_WIDTH_SHIFT); -+ ctrl_status |= (dst_settings->width_ << DMA_CTRL_STATUS_DEST_WIDTH_SHIFT); -+ -+ // Setup the priority arbitration scheme -+ ctrl_status &= ~DMA_CTRL_STATUS_STARVE_LOW_PRIORITY; // !Starve low priority -+ -+ return ctrl_status; -+} -+ -+static u32 encode_final_eot( -+ oxnas_dma_device_settings_t* src_settings, -+ oxnas_dma_device_settings_t* dst_settings, -+ unsigned long length) -+{ -+ // Write the length, with EOT configuration for a final transfer -+ unsigned long encoded = length; -+ if (dst_settings->write_final_eot_) { -+ encoded |= DMA_BYTE_CNT_WR_EOT_MASK; -+ } else { -+ encoded &= ~DMA_BYTE_CNT_WR_EOT_MASK; -+ } -+ if (src_settings->read_final_eot_) { -+ encoded |= DMA_BYTE_CNT_RD_EOT_MASK; -+ } else { -+ encoded &= ~DMA_BYTE_CNT_RD_EOT_MASK; -+ } -+ return encoded; -+} -+ -+static void dma_start_write(ulong* buffer, int num_bytes) -+{ -+ // Assemble complete memory settings -+ oxnas_dma_device_settings_t mem_settings = oxnas_ram_dma_settings; -+ mem_settings.address_ = (unsigned long)buffer; -+ mem_settings.address_mode_ = OXNAS_DMA_MODE_INC; -+ -+ *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS) = encode_control_status(&mem_settings, &oxnas_sata_dma_settings); -+ *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_BASE_SRC_ADR) = mem_settings.address_; -+ *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_BASE_DST_ADR) = oxnas_sata_dma_settings.address_; -+ *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_BYTE_CNT) = encode_final_eot(&mem_settings, &oxnas_sata_dma_settings, num_bytes); -+ -+ dma_start(); -+} -+ -+static void dma_start_read(ulong* buffer, int num_bytes) -+{ -+ // Assemble complete memory settings -+ oxnas_dma_device_settings_t mem_settings = oxnas_ram_dma_settings; -+ mem_settings.address_ = (unsigned long)buffer; -+ mem_settings.address_mode_ = OXNAS_DMA_MODE_INC; -+ -+ *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS) = encode_control_status(&oxnas_sata_dma_settings, &mem_settings); -+ *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_BASE_SRC_ADR) = oxnas_sata_dma_settings.address_; -+ *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_BASE_DST_ADR) = mem_settings.address_; -+ *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_BYTE_CNT) = encode_final_eot(&oxnas_sata_dma_settings, &mem_settings, num_bytes); -+ -+ dma_start(); -+} -+ -+static inline int dma_busy(void) -+{ -+ return (*DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS)) & DMA_CTRL_STATUS_IN_PROGRESS; -+} -+ -+static int wait_dma_not_busy(int device) -+{ -+ unsigned int cleanup_required = 0; -+ -+ /* Poll for DMA completion */ -+ int loops = MAX_DMA_XFER_LOOPS; -+ do { -+ if (!dma_busy()) { -+ break; -+ } -+ udelay(100); -+ } while (--loops); -+ -+ if (!loops) { -+ printf("wait_dma_not_busy() Timed out of wait for DMA not busy\n"); -+ cleanup_required = 1; -+ } -+ -+ if (cleanup_required) { -+ /* Abort DMA to make sure it has finished. */ -+ unsigned long ctrl_status = *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS); -+ ctrl_status |= DMA_CTRL_STATUS_RESET; -+ *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS) = ctrl_status; -+ -+ // Wait for the channel to become idle - should be quick as should -+ // finish after the next AHB single or burst transfer -+ loops = MAX_DMA_ABORT_LOOPS; -+ do { -+ if (!(*DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS) & DMA_CTRL_STATUS_IN_PROGRESS)) { -+ break; -+ } -+ udelay(10); -+ } while (--loops); -+ -+ if (!loops) { -+ printf("wait_dma_not_busy() Timed out of wait for DMA channel abort\n"); -+ } else { -+ /* Successfully cleanup the DMA channel */ -+ cleanup_required = 0; -+ } -+ -+ // Deassert reset for the channel -+ ctrl_status = *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS); -+ ctrl_status &= ~DMA_CTRL_STATUS_RESET; -+ *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS) = ctrl_status; -+ } -+ -+ return !cleanup_required; -+} -+ -+/** -+ * Possible that ATA status will not become not-busy, so must have timeout -+ */ -+static unsigned int wait_not_busy(int device, unsigned long timeout_secs) -+{ -+ int busy = 1; -+ unsigned long loops = (timeout_secs * 1000) / 50; -+ do { -+ // Test the ATA status register BUSY flag -+ if (!((*(sata_regs_base[device] + SATA_ORB2_OFF) >> SATA_COMMAND_BIT) & (1UL << ATA_STATUS_BSY_BIT))) { -+ /* Not busy, so stop polling */ -+ busy = 0; -+ break; -+ } -+ -+ // Wait for 50mS before sampling ATA status register again -+ udelay(50000); -+ } while (--loops); -+ -+ return busy; -+} -+ -+void oxnas_sata_output_data(int device, ulong *sect_buf, int words) -+{ -+ /* Only permit accesses to disks found to be present during ide_preinit() */ -+ if (!disk_present[device]) { -+ return; -+ } -+ -+ /* Select the required internal SATA drive */ -+ device_select(device); -+ -+ /* Start the DMA channel sending data from the passed buffer to the SATA core */ -+ dma_start_write(sect_buf, words << 2); -+ -+ /* Don't know why we need this delay, but without it the wait for DMA not -+ busy times soemtimes out, e.g. when saving environment to second disk */ -+ udelay(1000); -+ -+ /* Wait for DMA to finish */ -+ if (!wait_dma_not_busy(device)) { -+ printf("Timed out of wait for DMA channel for SATA device %d to have in-progress clear\n", device); -+ } -+ -+ /* Sata core should finish after DMA */ -+ if (wait_not_busy(device, 30)) { -+ printf("Timed out of wait for SATA device %d to have BUSY clear\n", device); -+ } -+ if (!wait_no_error(device)) { -+ printf("oxnas_sata_output_data() Wait for ATA no-error timed-out\n"); -+ } -+} -+ -+void oxnas_sata_input_data(int device, ulong *sect_buf, int words) -+{ -+ /* Only permit accesses to disks found to be present during ide_preinit() */ -+ if (!disk_present[device]) { -+ return; -+ } -+ -+ /* Select the required internal SATA drive */ -+ device_select(device); -+ -+ /* Start the DMA channel receiving data from the SATA core into the passed buffer */ -+ dma_start_read(sect_buf, words << 2); -+ -+ /* Sata core should finish before DMA */ -+ if (wait_not_busy(device, 30)) { -+ printf("Timed out of wait for SATA device %d to have BUSY clear\n", device); -+ } -+ if (!wait_no_error(device)) { -+ printf("oxnas_sata_output_data() Wait for ATA no-error timed-out\n"); -+ } -+ -+ /* Wait for DMA to finish */ -+ if (!wait_dma_not_busy(device)) { -+ printf("Timed out of wait for DMA channel for SATA device %d to have in-progress clear\n", device); -+ } -+} -+ -+static u32 scr_read(int device, unsigned int sc_reg) -+{ -+ /* Setup adr of required register. std regs start eight into async region */ -+ *(sata_regs_base[device] + SATA_LINK_RD_ADDR) = sc_reg*4 + SATA_STD_ASYNC_REGS_OFF; -+ -+ /* Wait for data to be available */ -+ int loops = MAX_SRC_READ_LOOPS; -+ do { -+ if (*(sata_regs_base[device] + SATA_LINK_CONTROL) & 1UL) { -+ break; -+ } -+ udelay(10); -+ } while (--loops); -+ -+ if (!loops) { -+ printf("scr_read() Timed out of wait for read completion\n"); -+ } -+ -+ /* Read the data from the async register */ -+ return *(sata_regs_base[device] + SATA_LINK_DATA); -+} -+ -+static void scr_write(int device, unsigned int sc_reg, u32 val) -+{ -+ /* Setup the data for the write */ -+ *(sata_regs_base[device] + SATA_LINK_DATA) = val; -+ -+ /* Setup adr of required register. std regs start eight into async region */ -+ *(sata_regs_base[device] + SATA_LINK_WR_ADDR) = sc_reg*4 + SATA_STD_ASYNC_REGS_OFF; -+ -+ /* Wait for data to be written */ -+ int loops = MAX_SRC_WRITE_LOOPS; -+ do { -+ if (*(sata_regs_base[device] + SATA_LINK_CONTROL) & 1UL) { -+ break; -+ } -+ udelay(10); -+ } while (--loops); -+ -+ if (!loops) { -+ printf("scr_write() Timed out of wait for write completion\n"); -+ } -+} -+ -+#define PHY_LOOP_COUNT 25 /* Wait for upto 5 seconds for PHY to be found */ -+static int phy_reset(int device) -+{ -+#ifdef FPGA -+ /* The FPGA thinks it can do 3G when infact only 1.5G is possible, so limit -+ it to Gen-1 SATA (1.5G) */ -+ scr_write(device, SATA_SCR_CONTROL, 0x311); /* Issue phy wake & core reset */ -+ scr_read(device, SATA_SCR_STATUS); /* Dummy read; flush */ -+ udelay(1000); -+ scr_write(device, SATA_SCR_CONTROL, 0x310); /* Issue phy wake & clear core reset */ -+#else -+ scr_write(device, SATA_SCR_CONTROL, 0x301); /* Issue phy wake & core reset */ -+ scr_read(device, SATA_SCR_STATUS); /* Dummy read; flush */ -+ udelay(1000); -+ scr_write(device, SATA_SCR_CONTROL, 0x300); /* Issue phy wake & clear core reset */ -+#endif -+ /* Wait for upto 5 seconds for PHY to become ready */ -+ int phy_status = 0; -+ int loops = 0; -+ do { -+ udelay(200000); -+ if ((scr_read(device, SATA_SCR_STATUS) & 0xf) != 1) { -+ phy_status = 1; -+ break; -+ } -+ printf("No SATA PHY found\n"); -+ } while (++loops < PHY_LOOP_COUNT); -+ -+ if (phy_status) { -+ udelay(500000); /* wait half a second */ -+ } -+ return phy_status; -+} -+ -+#define FIS_LOOP_COUNT 25 /* Wait for upto 5 seconds for FIS to be received */ -+static int wait_FIS(int device) -+{ -+ int status = 0; -+ int loops = 0; -+ -+ do { -+ udelay(200000); -+ if (oxnas_sata_inb(device, ATA_PORT_NSECT) > 0) { -+ status = 1; -+ break; -+ } -+ } while (++loops < FIS_LOOP_COUNT); -+ -+ return status; -+} -+ -+int ide_preinit(void) -+{ -+ int num_disks_found = 0; -+ -+ /* Initialise records of which disks are present to all present */ -+ int i; -+ for (i=0; i < CFG_IDE_MAXDEVICE; i++) { -+ disk_present[i] = 1; -+ } -+ -+//udelay(1000000); -+ /* Enable clocks to SATA and DMA cores */ -+ *(volatile u32*)SYS_CTRL_CKEN_SET_CTRL = (1UL << SYS_CTRL_CKEN_SATA_BIT); -+ *(volatile u32*)SYS_CTRL_CKEN_SET_CTRL = (1UL << SYS_CTRL_CKEN_DMA_BIT); -+ -+ /* Block reset SATA and DMA cores */ -+ *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_SATA_BIT) | -+ (1UL << SYS_CTRL_RSTEN_SATA_LINK_BIT) | -+ (1UL << SYS_CTRL_RSTEN_SATA_PHY_BIT) | -+ (1UL << SYS_CTRL_RSTEN_DMA_BIT); -+ udelay(50); -+ *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_SATA_PHY_BIT); -+ udelay(50); -+ *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_SATA_LINK_BIT) | -+ (1UL << SYS_CTRL_RSTEN_SATA_BIT); -+ udelay(50); -+ *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_DMA_BIT); -+ udelay(50); -+//udelay(1000000); -+ -+ /* disable and clear core interrupts */ -+ *((unsigned long*)SATA_HOST_REGS_BASE + SATA_INT_ENABLE_CLR_OFF) = ~0UL; -+ *((unsigned long*)SATA_HOST_REGS_BASE + SATA_INT_CLR_OFF) = ~0UL; -+ -+ int device; -+ for (device = 0; device < CFG_IDE_MAXDEVICE; device++) { -+ int found = 0; -+ int retries = 1; -+ -+ /* Disable SATA interrupts */ -+ *(sata_regs_base[device] + SATA_INT_ENABLE_CLR_OFF) = ~0UL; -+ -+ /* Clear any pending SATA interrupts */ -+ *(sata_regs_base[device] + SATA_INT_CLR_OFF) = ~0UL; -+ -+ do { -+ /* clear sector count register for FIS detection */ -+ oxnas_sata_outb(device, ATA_PORT_NSECT, 0); -+ -+ /* Get the PHY working */ -+ if (!phy_reset(device)) { -+ printf("SATA PHY not ready for device %d\n", device); -+ break; -+ } -+ -+ if (!wait_FIS(device)) { -+ printf("No FIS received from device %d\n", device); -+ } else { -+ if ((scr_read(device, SATA_SCR_STATUS) & 0xf) == 0x3) { -+ if (wait_not_busy(device, 30)) { -+ printf("Timed out of wait for SATA device %d to have BUSY clear\n", device); -+ } else { -+ ++num_disks_found; -+ found = 1; -+ } -+ } else { -+ printf("No SATA device %d found, PHY status = 0x%08x\n", -+ device, scr_read(device, SATA_SCR_STATUS)); -+ } -+ break; -+ } -+ } while (retries--) ; -+ -+ /* Record whether disk is present, so won't attempt to access it later */ -+ disk_present[device] = found; -+ } -+ -+ /* post disk detection clean-up */ -+ for (device = 0; device < CFG_IDE_MAXDEVICE; device++) { -+ if ( disk_present[device] ) { -+ /* set as ata-5 (28-bit) */ -+ *(sata_regs_base[device] + SATA_DRIVE_CONTROL_OFF) = 0UL; -+ -+ /* clear phy/link errors */ -+ scr_write(device, SATA_SCR_ERROR, ~0); -+ -+ /* clear host errors */ -+ *(sata_regs_base[device] + SATA_CONTROL_OFF) |= SATA_SCTL_CLR_ERR; -+ -+ /* clear interrupt register as this clears the error bit in the IDE -+ status register */ -+ *(sata_regs_base[device] + SATA_INT_CLR_OFF) = ~0UL; -+ } -+ } -+ -+ -+ return !num_disks_found; -+} -+ -diff -Nurd u-boot-1.1.2/board/oxnas/Makefile u-boot-1.1.2-oxe810/board/oxnas/Makefile ---- u-boot-1.1.2/board/oxnas/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/board/oxnas/Makefile 2008-06-11 17:55:18.000000000 +0200 -@@ -0,0 +1,51 @@ -+# -+# (C) Copyright 2000-2004 -+# Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+# -+# (C) Copyright 2004 -+# ARM Ltd. -+# Philippe Robin, <philippe.robin@arm.com> -+# -+# See file CREDITS for list of people who contributed to this -+# project. -+# -+# This program is free software; you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation; either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+# MA 02111-1307 USA -+# -+ -+include $(TOPDIR)/config.mk -+ -+LIB = lib$(BOARD).a -+ -+OBJS := oxnas.o eth.o ide-$(NAS_VERSION).o -+SOBJS := platform-$(NAS_VERSION).o -+ -+$(LIB): $(OBJS) $(SOBJS) -+ $(AR) crv $@ $^ -+ -+clean: -+ rm -f $(SOBJS) $(OBJS) -+ -+distclean: clean -+ rm -f $(LIB) core *.bak .depend -+ -+######################################################################### -+ -+.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) -+ $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ -+ -+-include .depend -+ -+######################################################################### -diff -Nurd u-boot-1.1.2/board/oxnas/oxnas.c u-boot-1.1.2-oxe810/board/oxnas/oxnas.c ---- u-boot-1.1.2/board/oxnas/oxnas.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/board/oxnas/oxnas.c 2008-06-11 17:55:18.000000000 +0200 -@@ -0,0 +1,280 @@ -+/* -+ * (C) Copyright 2005 -+ * Oxford Semiconductor Ltd -+ * -+ * 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> -+ -+#if defined(CONFIG_SHOW_BOOT_PROGRESS) -+void show_boot_progress(int progress) -+{ -+ printf("Boot reached stage %d\n", progress); -+} -+#endif -+ -+static inline void delay(unsigned long loops) -+{ -+ __asm__ volatile ("1:\n" -+ "subs %0, %1, #1\n" -+ "bne 1b":"=r" (loops):"0" (loops)); -+} -+ -+/* -+ * Miscellaneous platform dependent initialisations -+ */ -+ -+/** Expected Intel 28F320B3T CFI info */ -+// mfr_id: MANUFACTURER_INTEL, -> 0x0089 -+// dev_id: I28F320B3T, -> 0x8896 -+// name: "Intel 28F320B3T", -+// DevSize: SIZE_4MiB, -> 22 -+// CmdSet: P_ID_INTEL_STD, -> 0x0003 -+// NumEraseRegions: 2, -+// regions: { -> #define ERASEINFO(size,blocks) (size<<8)|(blocks-1) -+// ERASEINFO(0x10000, 63), -+// ERASEINFO(0x02000, 8), -+// } -+ -+#define FLASH_WORD_SIZE unsigned short -+ -+int board_init(void) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ gd->bd->bi_arch_number = MACH_TYPE_OXNAS; -+ gd->bd->bi_boot_params = PHYS_SDRAM_1_PA + 0x100; -+ gd->flags = 0; -+ -+ icache_enable(); -+ -+ /* Block reset Static core */ -+ *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_STATIC_BIT); -+ *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_STATIC_BIT); -+ -+ /* Enable clock to Static core */ -+ *(volatile u32*)SYS_CTRL_CKEN_SET_CTRL = (1UL << SYS_CTRL_CKEN_STATIC_BIT); -+ -+#ifdef CONFIG_OXNAS_ENABLE_PCI -+ /* Block reset PCI core */ -+ *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_PCI_BIT); -+ *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_PCI_BIT); -+ -+ /* Enable clock to PCI core */ -+ *(volatile u32*)SYS_CTRL_CKEN_SET_CTRL = (1UL << SYS_CTRL_CKEN_PCI_BIT); -+#endif // CONFIG_OXNAS_ENABLE_PCI -+ -+#ifdef CONFIG_OXNAS_MANUAL_STATIC_ARBITRATION -+ /* Assert manual static bus PCI arbitration request */ -+ *(volatile u32*)SYS_CTRL_PCI_CTRL1 |= (1UL << SYS_CTRL_PCI_CTRL1_PCI_STATIC_RQ_BIT); -+#endif // CONFIG_OXNAS_MANUAL_STATIC_ARBITRATION -+ -+#ifdef CONFIG_OXNAS_FEEDBACK_PCI_CLKS -+ /* Set PCI feedback clk GPIO pin as an output */ -+ *(volatile u32*)GPIO_1_SET_OE |= 0x800; -+ -+ /* Enable PCI feedback clk onto GPIO pin */ -+ *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_0 |= 0x00000800; -+#endif // CONFIG_OXNAS_FEEDBACK_PCI_CLKS -+ -+#ifndef CFG_NO_FLASH -+ /* Enable static bus onto GPIOs, only CS0 as CS1 conflicts with UART2 */ -+ *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_0 |= 0x002FF000; -+ -+ /* Setup the static bus CS0 to access FLASH */ -+ *(volatile u32*)STATIC_CONTROL_BANK0 = STATIC_BUS_FLASH_CONFIG; -+#endif // !CFG_NO_FLASH -+ -+ /* Set 33MHz PCI clock */ -+ *(volatile u32*)SYS_CTRL_CKCTRL_CTRL_ADDR = 5; -+ /* Enable full speed RPS clock */ -+ *(volatile u32*)SYS_CTRL_CKCTRL_CTRL_ADDR &= ~(1UL << SYS_CTRL_CKCTRL_SLOW_BIT); -+ -+#if (USE_EXTERNAL_UART == 0) -+#ifdef CONFIG_OXNAS_UART1 -+ /* Block reset UART1 */ -+ *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_UART1_BIT); -+ *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_UART1_BIT); -+ -+ /* Setup pin mux'ing for first internal UART */ -+ *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_0 &= ~0x80000000; -+ *(volatile u32*)SYS_CTRL_GPIO_SECSEL_CTRL_0 &= ~0x80000000; -+ *(volatile u32*)SYS_CTRL_GPIO_TERTSEL_CTRL_0 |= 0x80000000; // Route UART1 SOUT onto external pins -+ -+ *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_1 &= ~0x00000001; -+ *(volatile u32*)SYS_CTRL_GPIO_SECSEL_CTRL_1 &= ~0x00000001; -+ *(volatile u32*)SYS_CTRL_GPIO_TERTSEL_CTRL_1 |= 0x00000001; // Route UART1 SIN onto external pins -+ -+ *(volatile u32*)GPIO_1_SET_OE |= 0x80000000; // Make UART1 SOUT an o/p -+ *(volatile u32*)GPIO_2_CLR_OE |= 0x00000001; // Make UART1 SIN an i/p -+#endif // CONFIG_OXNAS_UART1 -+ -+#ifdef CONFIG_OXNAS_UART2 -+ // Block reset UART2 -+ *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_UART2_BIT); -+ *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_UART2_BIT); -+ -+ /* Setup pin mux'ing for second internal UART */ -+ *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_0 &= ~0x00500000; -+ *(volatile u32*)SYS_CTRL_GPIO_SECSEL_CTRL_0 &= ~0x00500000; -+ *(volatile u32*)SYS_CTRL_GPIO_TERTSEL_CTRL_0 |= 0x00500000; // Route UART2 SOUT and SIN onto external pins -+ -+ *(volatile u32*)GPIO_1_SET_OE |= 0x00100000; // Make UART2 SOUT an o/p -+ *(volatile u32*)GPIO_1_CLR_OE |= 0x00400000; // Make UART2 SIN an i/p -+#endif // CONFIG_OXNAS_UART2 -+ -+#ifdef CONFIG_OXNAS_UART3 -+ // Block reset UART3 -+ *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_UART3_BIT); -+ *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_UART3_BIT); -+ -+ // Route UART3 SIN/SOUT onto external pin -+ *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_0 &= ~0x000000C0; -+ *(volatile u32*)SYS_CTRL_GPIO_SECSEL_CTRL_0 &= ~0x000000C0; -+ *(volatile u32*)SYS_CTRL_GPIO_TERTSEL_CTRL_0 |= 0x000000C0; -+ -+ // Setup GPIO line directions for UART3 SIN/SOUT -+ *(volatile u32*)GPIO_1_SET_OE |= 0x00000080; -+ *(volatile u32*)GPIO_1_CLR_OE |= 0x00000040; -+#endif // CONFIG_ARCH_OXNAS_UART3 -+ -+#ifdef CONFIG_OXNAS_UART4 -+ // Block reset UART4 -+ *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_UART4_BIT); -+ *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_UART4_BIT); -+ -+ // Enable UART4 to override PCI functions onto GPIOs -+ *(volatile u32*)SYS_CTRL_UART_CTRL |= (1UL << SYS_CTRL_UART4_NOT_PCI_MODE); -+#endif // CONFIG_OXNAS_UART4 -+#endif // !USE_EXTERNAL_UART -+ -+ return 0; -+} -+ -+int board_late_init() -+{ -+ return 0; -+} -+ -+int misc_init_r(void) -+{ -+ return 0; -+} -+ -+int dram_init(void) -+{ -+#ifdef PROBE_MEM_SIZE -+ /* Determine the amount of SDRAM the DDR controller is configured for */ -+ volatile unsigned long * const ddr_config_reg_adr = (volatile unsigned long *)(0x45800000); -+ static const int DDR_SIZE_BIT = 17; -+ static const int DDR_SIZE_NUM_BITS = 4; -+ static const unsigned long DDR_SIZE_MASK = (((1UL << DDR_SIZE_NUM_BITS) - 1) << DDR_SIZE_BIT); -+ -+ unsigned long ddr_config_reg = *ddr_config_reg_adr; -+ int ddr_size_pow2 = (ddr_config_reg & DDR_SIZE_MASK) >> DDR_SIZE_BIT; -+ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ gd->bd->bi_dram[0].size = (1 << ddr_size_pow2) * 1024 * 1024; -+ -+ if ((gd->bd->bi_dram[0].size >> 20) == 256) { -+ /* Do we really have 256M, or are we working around the DDR controller's -+ * problem with 128M size? */ -+ volatile unsigned long * const PROBE_ADR_1 = (volatile unsigned long * const)PHYS_SDRAM_1_PA; -+ volatile unsigned long * const PROBE_ADR_2 = (volatile unsigned long * const)(PHYS_SDRAM_1_PA + (128*1024*1024)); -+ static const unsigned long PROBE_VAL_1 = 0xdeadbeef; -+ static const unsigned long PROBE_VAL_2 = 0x12345678; -+ -+ *PROBE_ADR_1 = PROBE_VAL_1; -+ *PROBE_ADR_2 = PROBE_VAL_2; -+ if (*PROBE_ADR_1 != PROBE_VAL_1) { -+ gd->bd->bi_dram[0].size = 128*1024*1024; -+ } -+ } -+#else // PROBE_MEM_SIZE -+ gd->bd->bi_dram[0].size = MEM_SIZE; -+#endif // PROBE_MEM_SIZE -+ -+ gd->bd->bi_dram[0].start = PHYS_SDRAM_1_PA; -+ -+ gd->bd->bi_sramstart = CFG_SRAM_BASE; -+ gd->bd->bi_sramsize = CFG_SRAM_SIZE; -+ -+ return 0; -+} -+ -+int reset_cpu(void) -+{ -+ printf("Resetting Oxsemi NAS..."); -+ -+ // Assert reset to cores as per power on defaults -+ *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = -+ (1UL << SYS_CTRL_RSTEN_COPRO_BIT) | -+ (1UL << SYS_CTRL_RSTEN_USBHS_BIT) | -+ (1UL << SYS_CTRL_RSTEN_USBHSPHY_BIT) | -+ (1UL << SYS_CTRL_RSTEN_MAC_BIT) | -+ (1UL << SYS_CTRL_RSTEN_PCI_BIT) | -+ (1UL << SYS_CTRL_RSTEN_DMA_BIT) | -+ (1UL << SYS_CTRL_RSTEN_DPE_BIT) | -+ (1UL << SYS_CTRL_RSTEN_SATA_BIT) | -+ (1UL << SYS_CTRL_RSTEN_SATA_LINK_BIT) | -+ (1UL << SYS_CTRL_RSTEN_SATA_PHY_BIT) | -+ (1UL << SYS_CTRL_RSTEN_STATIC_BIT) | -+ (1UL << SYS_CTRL_RSTEN_UART1_BIT) | -+ (1UL << SYS_CTRL_RSTEN_UART2_BIT) | -+ (1UL << SYS_CTRL_RSTEN_MISC_BIT) | -+ (1UL << SYS_CTRL_RSTEN_I2S_BIT) | -+ (1UL << SYS_CTRL_RSTEN_AHB_MON_BIT) | -+ (1UL << SYS_CTRL_RSTEN_UART3_BIT) | -+ (1UL << SYS_CTRL_RSTEN_UART4_BIT) | -+ (1UL << SYS_CTRL_RSTEN_SGDMA_BIT); -+ -+ // Release reset to cores as per power on defaults -+ *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_GPIO_BIT); -+ -+ // Disable clocks to cores as per power-on defaults -+ *(volatile u32*)SYS_CTRL_CKEN_CLR_CTRL = -+ (1UL << SYS_CTRL_CKEN_COPRO_BIT) | -+ (1UL << SYS_CTRL_CKEN_DMA_BIT) | -+ (1UL << SYS_CTRL_CKEN_DPE_BIT) | -+ (1UL << SYS_CTRL_CKEN_SATA_BIT) | -+ (1UL << SYS_CTRL_CKEN_I2S_BIT) | -+ (1UL << SYS_CTRL_CKEN_USBHS_BIT) | -+ (1UL << SYS_CTRL_CKEN_MAC_BIT) | -+ (1UL << SYS_CTRL_CKEN_STATIC_BIT); -+ -+ // Enable clocks to cores as per power-on defaults -+ *(volatile u32*)SYS_CTRL_CKEN_SET_CTRL = (1UL << SYS_CTRL_CKEN_PCI_BIT); -+ -+ // Set sys-control pin mux'ing as per power-on defaults -+ *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_0 = 0x800UL; -+ *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_1 = 0x0UL; -+ *(volatile u32*)SYS_CTRL_GPIO_SECSEL_CTRL_0 = 0x0UL; -+ *(volatile u32*)SYS_CTRL_GPIO_SECSEL_CTRL_1 = 0x0UL; -+ *(volatile u32*)SYS_CTRL_GPIO_TERTSEL_CTRL_0 = 0x0UL; -+ *(volatile u32*)SYS_CTRL_GPIO_TERTSEL_CTRL_1 = 0x0UL; -+ -+ // No need to save any state, as the ROM loader can determine whether reset -+ // is due to power cycling or programatic action, just hit the (self- -+ // clearing) CPU reset bit of the block reset register -+ *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_ARM_BIT); -+ -+ return 0; -+} -diff -Nurd u-boot-1.1.2/board/oxnas/platform-800.S u-boot-1.1.2-oxe810/board/oxnas/platform-800.S ---- u-boot-1.1.2/board/oxnas/platform-800.S 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/board/oxnas/platform-800.S 2008-06-11 17:55:18.000000000 +0200 -@@ -0,0 +1,254 @@ -+/* -+ * Board specific setup info -+ * -+ * (C) Copyright 2005 -+ * Oxford Semiconductor Ltd -+ * -+ * 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> -+ -+/* use estimate of processor speed to calculate number of cycles delay */ -+/* delay count is nominal (PLL200 frequency x delay time) / loop count -+ * expressing 200us as 200/1000000 and re-arranging gives the expression below -+ */ -+ -+#define DELAY_200US ((NOMINAL_ARMCLK / (5 * 1000000)) * 200) -+/* this is 8 cycles of ? so choose 8 resulting in 40 cycles */ -+#define DELAY_1S ((DELAY_200US) * 5000) -+#define DELAY_8 8 -+#define DELAY_200 200 -+ -+.globl platformsetup -+platformsetup: -+/* register allocations -+ * r0 - delay counter and scratch -+ * r1 - address register -+ * r2 - data register -+ * r3 - index to table pointer -+ * r4 - iteration counter. -+ * -+ * r5 - hold return address. -+ * lr - (R14) link register -+ * pc - (R15) program counter. -+ */ -+ -+#ifdef INITIALISE_SDRAM -+/* -+ * Check that not in SDRAM execution. Suicide if re-initialise DRAM. -+ * Controller function is linked to execute in SDRAM must be in ROM if not -+ * there. Check for wrong place. -+ */ -+ adrl r0, platformsetup /* Relative location of function start.*/ -+ ldr r1, _platformsetup -+ cmp r0, r1 -+ moveq pc, lr -+#else -+ mov pc, lr -+#endif -+ -+ /* Establish a working setup for the SDRAM */ -+ mov r6, lr -+ -+#ifdef OXNAS_OVERCLOCK -+ /* Delay so the broken JTAG can get control */ -+ ldr r0, =DELAY_1S -+ bl delay -+ -+ /* Configure the PLL to run faster */ -+ ldr r1, =SYS_CTRL_PLLSYS_CTRL -+ ldr r2, =SYS_CTRL_PLLSYS_KEY_CTRL -+ -+ /* 0xBEADFACE -> PLL_KEY */ -+ /* Bypass PLL */ -+ ldr r3, [r1] -+ ldr r5, =0x20000 -+ orr r3, r3, r5 -+ ldr r4, =0xbeadface -+ str r4, [r2] -+ str r3, [r1] -+ -+ /* 0xBEADFACE -> PLL_KEY */ -+ /* Set m,p and s for PLL at 400MHz */ -+ ldr r5, =0xffff0000 -+ and r3, r3, r5 -+ ldr r5, =OXNAS_OVERCLOCK -+ orr r3, r3, r5 -+ str r4, [r2] -+ str r3, [r1] -+ -+ /* Wait at least 300uS */ -+ ldr r0, =DELAY_200US -+ bl delay -+ ldr r0, =DELAY_200US -+ bl delay -+ -+ /* 0xBEADFACE -> PLL_KEY */ -+ /* Disable PLL bypass */ -+ ldr r5, =0xfffdffff -+ and r3, r3, r5 -+ str r4, [r2] -+ str r3, [r1] -+#endif // OXNAS_OVERCLOCK -+ -+ /* Assert reset to the DDR core */ -+ ldr r0, =SYS_CTRL_RSTEN_SET_CTRL -+ ldr r1, =1 -+ ldr r2, =SYS_CTRL_RSTEN_DDR_BIT -+ mov r1, r1, LSL r2 -+ str r1, [r0] -+ -+ /* Deassert reset to the DDR core */ -+ ldr r0, =SYS_CTRL_RSTEN_CLR_CTRL -+ str r1, [r0] -+ -+ /* Turn on the DDR core clock */ -+ ldr r0, =SYS_CTRL_CKEN_SET_CTRL -+ ldr r1, =1 -+ ldr r2, =SYS_CTRL_CKEN_DDR_BIT -+ mov r1, r1, LSL r2 -+ str r1, [r0] -+ -+ /* Start using the initialisation value list */ -+ adrl r3, init_table -+ -+ /* Copy next 6 entries from DDR init table*/ -+ ldr r4, =6 -+loop0: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ subs r4, r4, #1 -+ bne loop0 -+ -+ /* Delay for 200uS while DRAM controller stabilises. */ -+ ldr r0, =DELAY_200US -+ bl delay -+ -+#if !TEST_BRD -+ /* Copy next entry */ -+ ldr r4, =1 -+loopx: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ subs r4, r4, #1 -+ bne loopx -+ -+ /* Delay for 200uS while DRAM controller stabilises. */ -+ ldr r0, =DELAY_200US -+ bl delay -+#endif // TEST_BRD -+ -+ /* Copy next entry */ -+ ldr r4, =1 -+loop1: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ subs r4, r4, #1 -+ bne loop1 -+ -+ /* Delay for 200uS while DRAM controller stabilises. */ -+ ldr r0, =DELAY_200US -+ bl delay -+ -+ /* Copy next entry */ -+ ldr r4, =1 -+loop2: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ subs r4, r4, #1 -+ bne loop2 -+ -+ /* Delay for 200uS while DRAM controller stabilises. */ -+ ldr r0, =DELAY_200US -+ bl delay -+ -+ /* Copy next entry */ -+ ldr r4, =1 -+loop3: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ subs r4, r4, #1 -+ bne loop3 -+ -+ /* Delay for 200uS while DRAM controller stabilises. */ -+ ldr r0, =DELAY_200US -+ bl delay -+ -+ /* Copy next 5 entries */ -+ ldr r4, =5 -+loop4: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ subs r4, r4, #1 -+ bne loop4 -+ -+ /* SDRAM initialised so now exit. */ -+ mov lr, r6 -+ mov pc, lr -+ -+/* -+ * delay() -+ * -+ * uses 1 + r0 * 5 cycles -+ */ -+delay: -+ nop -+ nop -+ nop -+ subs r0, r0, #1 -+ bne delay -+ mov pc, lr -+ -+_platformsetup: -+ .word platformsetup -+ -+init_table: -+ /* Table of address, data for loading into the DRAM controller */ -+ /* Configure for a single DDR device */ -+ .word 0x4500002C, 0x08 -+ .word 0x45000038, 0x400 -+ .word 0x45800000, 0x80100000 -+ .word 0x45800004, 0x8000ffff // Enable DDR core and all clients -+ .word 0x45800024, 0x1e4 -+ .word 0x45800014, 0xe0000001 // DLL to automatic with starting value=1 -+/* 200uS delay */ -+#if !TEST_BRD -+ .word 0x45800014, 0xa0000003 // DLL to automatic with offset value=3 -+/* 200uS delay */ -+#endif // TEST_BRD -+#if (MEM_SIZE == 32) -+ .word 0x45800000, 0x801B030C -+#else -+ .word 0x45800000, 0x801D030C -+#endif // MEM_SIZE -+/* 200uS delay */ -+ .word 0x4580000c, 0x80280400 -+/* 200uS delay */ -+ .word 0x4580000c, 0x80210000 -+/* 200uS delay */ -+ .word 0x4580000c, 0x80200063 -+ .word 0x45800028, 0x0000001f // Enable all arbiter features -+ .word 0x45800018, 0x00000000 // Disable all monitoring -+ .word 0x45800010, 0xffffffff // Disable all read buffering, due to h/w bug -+ .word 0x4580002C, 0x00000000 // Do NOT disable HPROT, ie want write coherency -+ -+.ltorg -+ -diff -Nurd u-boot-1.1.2/board/oxnas/platform-810.S u-boot-1.1.2-oxe810/board/oxnas/platform-810.S ---- u-boot-1.1.2/board/oxnas/platform-810.S 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/board/oxnas/platform-810.S 2008-06-11 17:55:18.000000000 +0200 -@@ -0,0 +1,477 @@ -+/* -+ * Board specific setup info -+ * -+ * (C) Copyright 2005 -+ * Oxford Semiconductor Ltd -+ * -+ * 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> -+ -+/* use estimate of processor speed to calculate number of cycles delay */ -+/* delay count is nominal (PLL200 frequency x delay time) / loop count -+ * expressing 200us as 200/1000000 and re-arranging gives the expression below -+ */ -+ -+#define DELAY_200US ((NOMINAL_ARMCLK / (5 * 1000000)) * 200) -+#define DELAY_300US ((NOMINAL_ARMCLK / (5 * 1000000)) * 300) -+/* this is 8 cycles of ? so choose 8 resulting in 40 cycles */ -+#define DELAY_1S ((DELAY_200US) * 5000) -+#define DELAY_8 8 -+#define DELAY_200 200 -+ -+ -+.globl platformsetup -+platformsetup: -+/* register allocations -+ * r0 - delay counter and scratch -+ * r1 - address register -+ * r2 - data register -+ * r3 - index to table pointer -+ * r4 - iteration counter. -+ * -+ * r5 - hold return address. -+ * lr - (R14) link register -+ * pc - (R15) program counter. -+ */ -+ -+#ifdef INITIALISE_SDRAM -+/* -+ * Check that not in SDRAM execution. Suicide if re-initialise DRAM. -+ * Controller function is linked to execute in SDRAM must be in ROM if not -+ * there. Check for wrong place. -+ */ -+ adrl r0, platformsetup /* Relative location of function start.*/ -+ ldr r1, _platformsetup -+ cmp r0, r1 -+ moveq pc, lr -+#else -+ mov pc, lr -+#endif -+ -+#if (FPGA == 1) -+ /* Establish a working setup for the SDRAM */ -+ mov r6, lr -+ -+ /* Assert reset to the DDR core */ -+ ldr r0, =SYS_CTRL_RSTEN_SET_CTRL -+ ldr r1, =1 -+ ldr r2, =SYS_CTRL_RSTEN_DDR_BIT -+ mov r1, r1, LSL r2 -+ str r1, [r0] -+ -+ /* Deassert reset to the DDR core */ -+ ldr r0, =SYS_CTRL_RSTEN_CLR_CTRL -+ str r1, [r0] -+ -+ /* Turn on the DDR core clock */ -+ ldr r0, =SYS_CTRL_CKEN_SET_CTRL -+ ldr r1, =1 -+ ldr r2, =SYS_CTRL_CKEN_DDR_BIT -+ mov r1, r1, LSL r2 -+ str r1, [r0] -+ -+ /* Start using the initialisation value list */ -+ adrl r3, init_table -+ -+ /* Copy first 6 entries */ -+ ldr r4, =6 -+loop0: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ subs r4, r4, #1 -+ bne loop0 -+ -+ /* Delay for 200uS while DRAM controller stabilises. */ -+ ldr r0, =DELAY_200US -+ bl delay -+ -+ /* Copy next 4 entries */ -+ ldr r4, =4 -+loop1: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ subs r4, r4, #1 -+ bne loop1 -+ -+ /* Wait at least 200 clock cycles. */ -+ ldr r0, =DELAY_200 -+ bl delay -+ -+ /* Copy next 2 entries */ -+ ldr r4, =2 -+loop2: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ subs r4, r4, #1 -+ bne loop2 -+ -+ /* Wait at least 8 clock cycles. */ -+ ldr r0, =DELAY_8 -+ bl delay -+ -+ /* Copy next 9 entries */ -+ ldr r4, =9 -+loop3: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ subs r4, r4, #1 -+ bne loop3 -+ -+ /* SDRAM initialised so now exit. */ -+ mov lr, r6 -+ mov pc, lr -+ -+/* -+ * delay() -+ * -+ * uses 1 + r0 * 5 cycles -+ */ -+delay: -+ nop -+ nop -+ nop -+ subs r0, r0, #1 -+ bne delay -+ mov pc, lr -+ -+_platformsetup: -+ .word platformsetup -+#else // ASIC, (DDR-2) -+/* -+ * Check that not in SDRAM execution. Suicide if re-initialise DRAM. -+ * Controller function is linked to execute in SDRAM must be in ROM if not -+ * there. Check for wrong place. -+ */ -+ /* Establish a working setup for the SDRAM */ -+ mov r6, lr -+ -+#ifdef OVERCLOCK -+ /* -+ change clock speed on chip -+ */ -+ -+ /* read SYS_CTRL_PLLSYS_CTRL into r3*/ -+ mov r5, #0x45000000 -+ ldr r3, [r5, #72] -+ -+ /* load the value at dllkey (0xbeadface) into r7 */ -+ adrl r7, dllkey -+ ldr r7, [r7] -+ -+ /* pll_sys |= 0x20000; */ -+ orr r3, r3, #131072 /* 0x20000 */ -+ -+ /* write 0xbeadface into SYS_CTRL_PLLSYS_KEY_CTRL */ -+ str r7, [r5, #108] -+ -+ /* write pll_sys (bypass pll)*/ -+ str r3, [r5, #72] -+ -+ /* pll_sys &= 0xff000000; */ -+ mov r4, r3, lsr #16 -+ mov r4, r4, lsl #16 -+ -+ /* pll_sys |= 0x00F00061 */ -+ orr r4, r4, #15728640 /* 0xf00000 */ -+ orr r4, r4, #97 /* 0x61 */ -+#if 0 -+ orr r4, r4, #7864320 /* 0x780000 */ -+ orr r4, r4, #96 /* 0x60 */ -+#endif -+ -+ /* write 0xbeadface into SYS_CTRL_PLLSYS_KEY_CTRL */ -+ str r7, [r5, #108] -+ -+ /* write pll_sys (with new pll speeds) */ -+ str r4, [r5, #72] -+ -+ /* delay 300us */ -+ ldr r0, =DELAY_300US -+ bl delay -+ -+ /* clear bypass pll bit */ -+ bic r4, r4, #131072 /* 0x20000 */ -+ -+ /* write 0xbeadface into SYS_CTRL_PLLSYS_KEY_CTRL */ -+ str r7, [r5, #108] -+ -+ /* write pll_sys (with new pll speeds and pll un-bypassed) */ -+ str r4, [r5, #72] -+#endif /* OVERCLOCK */ -+ -+ /* Turn on the DDR core and phy clocks */ -+ ldr r0, =SYS_CTRL_CKEN_SET_CTRL -+ ldr r1, =1 -+ ldr r2, =SYS_CTRL_CKEN_DDR_BIT -+ mov r1, r1, LSL r2 -+ str r1, [r0] -+ ldr r1, =1 -+ ldr r2, =SYS_CTRL_CKEN_DDR_PHY_BIT -+ mov r1, r1, LSL r2 -+ str r1, [r0] -+ -+ /* Assert reset to the DDR core and phy */ -+ ldr r0, =SYS_CTRL_RSTEN_SET_CTRL -+ ldr r1, =1 -+ ldr r2, =SYS_CTRL_RSTEN_DDR_PHY_BIT -+ mov r1, r1, LSL r2 -+ str r1, [r0] -+ ldr r1, =1 -+ ldr r2, =SYS_CTRL_RSTEN_DDR_BIT -+ mov r1, r1, LSL r2 -+ str r1, [r0] -+ -+ /* Deassert reset to the DDR core and phy*/ -+ ldr r0, =SYS_CTRL_RSTEN_CLR_CTRL -+ ldr r1, =1 -+ ldr r2, =SYS_CTRL_RSTEN_DDR_PHY_BIT -+ mov r1, r1, LSL r2 -+ str r1, [r0] -+ ldr r1, =1 -+ ldr r2, =SYS_CTRL_RSTEN_DDR_BIT -+ mov r1, r1, LSL r2 -+ str r1, [r0] -+ -+ /* Start using the initialisation value list */ -+ adrl r3, init_table -+ -+ /* Copy first 14 entries of DDR core setup (section A)*/ -+ ldr r4, =14 -+loop0: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ subs r4, r4, #1 -+ bne loop0 -+ -+ /* Delay for 200uS while DDR controller stabilises. */ -+ ldr r0, =DELAY_200US -+ bl delay -+ -+ /* Copy next 13 entries of DDR device commands (section B)*/ -+ ldr r4, =13 -+loop1: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ -+ /* Wait at least 200 clock cycles between ram chip command writes */ -+ ldr r0, =DELAY_200 -+ bl delay -+ -+ subs r4, r4, #1 -+ bne loop1 -+ -+ /* Copy final DDR controller setup to set memory size/banks (section C)*/ -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ -+#if (PROBE_MEM_SIZE == 1) -+ /* Load the probe values into SDRAM */ -+ adrl r3, probe_table -+ mov r4, #4 -+.globl pl1 -+pl1: -+ ldmia r3!, {r1, r2} -+ str r2, [r1] -+ subs r4, r4, #1 -+ bne pl1 -+ -+ /* Get the current contents of the DDR controller core's config register */ -+ adrl r1, ddr_config_reg -+ ldr r1, [r1] -+ ldr r1, [r1] -+ -+ /* Zero the number of banks field - bit 23*/ -+ mov r2, #1 -+ bic r1, r1, r2, lsl #23 -+ -+ /* Zero the size field - bits 17-20 inclusive */ -+ mov r2, #15 -+ bic r1, r1, r2, lsl #17 -+ -+ /* First probe location tells us the SDRAM size */ -+ adrl r3, probe_table -+ ldr r0, [r3] -+ ldr r0, [r0] -+ -+ /* Is size 64MB? */ -+ ldr r2, [r3, #28] /* Get probe value 4 */ -+ cmp r0, r2 -+ moveq r4, #6 -+ orreq r1, r1, r4, lsl #17 -+ beq pl2 -+ -+ /* Is 128M or 256M so set banks to 8 */ -+ mov r4, #1 -+ orr r1, r1, r4, lsl #23 -+ -+ /* Is size 128MB? */ -+ ldr r2, [r3, #20] /* Get probe value 3 */ -+ cmp r0, r2 -+// moveq r4, #7 -+ moveq r4, #8 /* DDR controller does not work at 128M, use 256M instead -+ orreq r1, r1, r4, lsl #17 -+ beq pl2 -+ -+ /* Must be 256MB, or something is very wrong */ -+ mov r4, #8 -+ orr r1, r1, r4, lsl #17 -+ -+pl2: -+ /* Write the revised contents to the DDR controller core's config register */ -+ adrl r2, ddr_config_reg -+ ldr r2, [r2] -+ str r1, [r2] -+#endif -+ -+ /* SDRAM setup complete */ -+ mov lr, r6 -+ mov pc, lr -+ -+/* -+ * delay() -+ * -+ * uses 1 + r0 * 5 cycles -+ */ -+delay: -+ nop -+ nop -+ nop -+ subs r0, r0, #1 -+ bne delay -+ mov pc, lr -+ -+_platformsetup: -+ .word platformsetup -+#endif -+ -+ -+init_table: -+#if (FPGA == 1) -+ /* Table of address, data for loading into the DRAM controller on FPGA */ -+ .word 0x45800000, 0x000d0000 // Enable the DDR in SDR mode and width 32 bits -+ .word 0x45800034, 0x04442032 // SDR mode timings - #0 -+ .word 0x45800038, 0x570A0907 // SDR mode timings - #1 -+ .word 0x4580003C, 0x00000002 // SDR mode timings - #2 -+ .word 0x45800004, 0x80000000 // Enable DDR core, but not clients yet -+ .word 0x45800014, 0x80000001 // Enable CK and set DLL mode to manual -+/* 200uS delay */ -+ .word 0x4580000c, 0x80200000 // Assert CKE for all further commands -+ .word 0x4580000c, 0x80280400 // Issue precharge to all banks -+ .word 0x4580000c, 0x80200000 // NOP, as only DDR has real command here -+ .word 0x4580000c, 0x80200022 // Set burst length 4, sequential CAS 2 -+/* 200uS delay */ -+ .word 0x4580000c, 0x80280400 // Issue precharge to all banks -+ .word 0x4580000c, 0x80240000 // Issue auto-refresh command, CKE not asserted -+/* 200uS delay */ -+ .word 0x4580000c, 0x80240000 // Issue auto-refresh command, CKE not asserted -+ .word 0x4580000c, 0x80200000 // Assert CKE for all further commands -+ .word 0x4580000c, 0x80200022 // Set burst length 4, sequential CAS 2 -+ .word 0x45800000, 0x000d0186 // SDR, size and width and refresh rate, assuming -+ // 25Mhz clk to SDR, divide down to get 15.625uS -+ // refresh rate -+ .word 0x45800024, 0x00000124 // Set I/O drive strengths -+ .word 0x45800028, 0x0000001f // Enable all arbiter features -+ .word 0x45800018, 0x00000000 // Disable all monitoring -+ .word 0x45800010, 0xFFFFFFFF // Disable all read buffering -+ .word 0x45800004, 0x800000ff // Enable all client interfaces -+#else // ASIC DDR-2 -+ // SECTION A - DDR controller core configuration -+ .word 0x45800000, 0x802d0591 // enable in ddr-2 mode 16 bit wide -+ .word 0x45800034, 0x04442032 // ddr-2 mode timings -+ .word 0x45800038, 0x870f0b25 // ddr-2 mode timings -+ .word 0x4580003c, 0x00000a23 // ddr-2 mode timings -+ .word 0x45800054, 0x00072000 // phy-3 settings -+ .word 0x45800050, 0x00022828 // phy-2 settings, start -+ .word 0x45800050, 0x00032828 // phy-2 settings, on -+ .word 0x45800028, 0x0000001f // Enable all arbiter features -+ .word 0x45800018, 0x00000000 // Disable all monitoring -+ .word 0x45800010, 0xffff0000 // Enable all read buffering -+ .word 0x4580002c, 0x00ff00fd // no burst accl, no hprot on arm data -+ .word 0x45800040, 0x00000000 // enable burst and read cache -+ .word 0x45800044, 0xffff0000 // enable write behind prot, disable timeout -+ .word 0x45800004, 0x8000ffff // Enable all client interfaces -+/* 200uS delay after configuring DDR controller core */ -+ -+ // SECTION B - Memory device configuration -+ .word 0x4580000c, 0x807c0000 // exit something or other -+ .word 0x4580000c, 0x803c0000 // nop - wake up -+ .word 0x4580000c, 0x80280400 // precharge all -+ .word 0x4580000c, 0x80220000 // emr2 -+ .word 0x4580000c, 0x80230000 // emr3 -+ -+#if (MEM_ODT == 150) -+ .word 0x4580000c, 0x80210042 // enable dll, odt to 150 -+#elif (MEM_ODT == 75) -+ .word 0x4580000c, 0x80210006 // enable dll, odt to 75 -+#elif (MEM_ODT == 50) -+ .word 0x4580000c, 0x80210046 // enable dll, odt to 50 -+#else -+#error Unsupported memory on-die termination, set MEM_ODT to 50, 75, or 150 -+#endif -+ -+ .word 0x4580000c, 0x80200733 // set WR CL BL and reset dll -+ .word 0x4580000c, 0x80280400 // precharge all -+ .word 0x4580000c, 0x80240000 // auto refresh -+ .word 0x4580000c, 0x80240000 // auto refresh -+ .word 0x4580000c, 0x80200733 // set WR CL BL and reset dll -+ -+#if (MEM_ODT == 150) -+ .word 0x4580000c, 0x802103c2 // enable OCD -+ .word 0x4580000c, 0x80210042 // disable OCD -+#elif (MEM_ODT == 75) -+ .word 0x4580000c, 0x80210386 // enable OCD -+ .word 0x4580000c, 0x80210006 // disable OCD -+#elif (MEM_ODT == 50) -+ .word 0x4580000c, 0x802103c6 // enable OCD -+ .word 0x4580000c, 0x80210046 // disable OCD -+#else -+#error Unsupported memory on-die termination, set MEM_ODT to 50, 75, or 150 -+#endif -+ -+ // SECTION C - Final memory size/bank configuration -+#if (PROBE_MEM_SIZE == 1) -+ .word 0x45800000, 0x80b10591 // 256M, 8 banks, 1425 clocks for 7.8us refresh. -+#elif (MEM_SIZE == 64) -+ .word 0x45800000, 0x802d0591 // 64M, 4 banks, 1425 clocks for 7.8us refresh. -+#elif (MEM_SIZE == 128) -+ .word 0x45800000, 0x80af0591 // 128M, 8 banks, 1425 clocks for 7.8us refresh. -+#elif (MEM_SIZE == 256) -+ .word 0x45800000, 0x80b10591 // 256M, 8 banks, 1425 clocks for 7.8us refresh. -+#else -+#error Unsupported memory size, set MEM_SIZE to 64, 128 or 256 -+#endif -+ -+#endif // FPGA or ASIC -+dllkey: -+ .word 0xbeadface -+ -+ddr_config_reg: -+ .word 0x45800000 -+ -+probe_table: -+ .word 0x48000000, 0x12345678 -+ .word 0x48000040, 0xdeadbeef -+ .word 0x50000000, 0xfafafafa -+ .word 0x50000040, 0xabcdef01 -+ -+.ltorg -+ -diff -Nurd u-boot-1.1.2/board/oxnas/u-boot.lds u-boot-1.1.2-oxe810/board/oxnas/u-boot.lds ---- u-boot-1.1.2/board/oxnas/u-boot.lds 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/board/oxnas/u-boot.lds 2008-06-11 17:55:18.000000000 +0200 -@@ -0,0 +1,50 @@ -+/* -+ * (C) Copyright 2002 -+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de> -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -+OUTPUT_ARCH(arm) -+ENTRY(_start) -+SECTIONS -+{ -+ . = 0x00000000; -+ . = ALIGN(4); -+ .text : -+ { -+ cpu/arm926ejs/start.o (.text) -+ *(.text) -+ } -+ .rodata : { *(.rodata) } -+ . = ALIGN(4); -+ .data : { *(.data) } -+ . = ALIGN(4); -+ .got : { *(.got) } -+ -+ __u_boot_cmd_start = .; -+ .u_boot_cmd : { *(.u_boot_cmd) } -+ __u_boot_cmd_end = .; -+ -+ . = ALIGN(4); -+ __bss_start = .; -+ .bss : { *(.bss) } -+ _end = .; -+} -diff -Nurd u-boot-1.1.2/common/cmd_ext2.c u-boot-1.1.2-oxe810/common/cmd_ext2.c ---- u-boot-1.1.2/common/cmd_ext2.c 2004-12-16 18:34:53.000000000 +0100 -+++ u-boot-1.1.2-oxe810/common/cmd_ext2.c 2008-06-11 17:55:30.000000000 +0200 -@@ -223,7 +223,7 @@ - PRINTF("Using device %s%d, partition %d\n", argv[1], dev, part); - - if (part != 0) { -- if (get_partition_info (&dev_desc[dev], part, &info)) { -+ if (get_partition_info (dev_desc, part, &info)) { - printf ("** Bad partition %d **\n", part); - return(1); - } -diff -Nurd u-boot-1.1.2/common/cmd_ide.c u-boot-1.1.2-oxe810/common/cmd_ide.c ---- u-boot-1.1.2/common/cmd_ide.c 2004-12-31 10:32:50.000000000 +0100 -+++ u-boot-1.1.2-oxe810/common/cmd_ide.c 2008-06-11 17:55:30.000000000 +0200 -@@ -193,6 +193,13 @@ - static void set_pcmcia_timing (int pmode); - #endif - -+#ifdef CONFIG_OXNAS -+extern unsigned char oxnas_sata_inb(int dev, int port); -+extern void oxnas_sata_outb(int dev, int port, unsigned char val); -+extern void oxnas_sata_output_data(int dev, ulong *sect_buf, int words); -+extern void oxnas_sata_input_data(int dev, ulong *sect_buf, int words); -+#endif // CONFIG_OXNAS -+ - /* ------------------------------------------------------------------------- */ - - int do_ide (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -@@ -491,175 +498,103 @@ - return rcode; - } - --/* ------------------------------------------------------------------------- */ - --void ide_init (void) -+static int ide_probe(int device) - { -+ int found = 0; -+ -+ /* Select device */ -+ udelay(100000); /* 100 ms */ -+ ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device)); -+ udelay(100000); /* 100 ms */ - --#ifdef CONFIG_IDE_8xx_DIRECT -- DECLARE_GLOBAL_DATA_PTR; -- volatile immap_t *immr = (immap_t *)CFG_IMMR; -- volatile pcmconf8xx_t *pcmp = &(immr->im_pcmcia); --#endif - unsigned char c; -- int i, bus; --#ifdef CONFIG_AMIGAONEG3SE -- unsigned int max_bus_scan; -- unsigned int ata_reset_time; -- char *s; -+ int i = 0; -+ do { -+ udelay(10000); /* 10 ms */ -+ -+ c = ide_inb(device, ATA_STATUS); -+ if (++i > (ATA_RESET_TIME * 100)) { -+ PRINTF("ide_probe() timeout\n"); -+ ide_led((LED_IDE1 | LED_IDE2), 0); /* LED's off */ -+ return found; -+ } -+ if ((i >= 100) && ((i%100) == 0)) { -+ putc ('.'); -+ } -+ } while (c & ATA_STAT_BUSY); -+ -+ if (c & (ATA_STAT_BUSY | ATA_STAT_FAULT)) { -+ PRINTF("ide_probe() status = 0x%02X ", c); -+#ifndef CONFIG_ATAPI /* ATAPI Devices do not set DRDY */ -+ } else if ((c & ATA_STAT_READY) == 0) { -+ PRINTF("ide_probe() status = 0x%02X ", c); - #endif --#ifdef CONFIG_IDE_8xx_PCCARD -- extern int pcmcia_on (void); -- extern int ide_devices_found; /* Initialized in check_ide_device() */ --#endif /* CONFIG_IDE_8xx_PCCARD */ -+ } else { -+ found = 1; -+ } - --#ifdef CONFIG_IDE_PREINIT -- extern int ide_preinit (void); -- WATCHDOG_RESET(); -+ return found; -+} - -- if (ide_preinit ()) { -- puts ("ide_preinit failed\n"); -+void ide_init(void) -+{ -+ static int ide_init_called = 0; -+ int i, bus; -+ -+ if (ide_init_called) { - return; - } --#endif /* CONFIG_IDE_PREINIT */ -- --#ifdef CONFIG_IDE_8xx_PCCARD -- extern int pcmcia_on (void); -- extern int ide_devices_found; /* Initialized in check_ide_device() */ -+ ide_init_called = 1; - -+#ifdef CONFIG_IDE_PREINIT -+ extern int ide_preinit(void); - WATCHDOG_RESET(); - -- ide_devices_found = 0; -- /* initialize the PCMCIA IDE adapter card */ -- pcmcia_on(); -- if (!ide_devices_found) -+ printf("Initialising disks\n"); -+ if (ide_preinit()) { -+ puts ("ide_preinit failed\n"); - return; -- udelay (1000000); /* 1 s */ --#endif /* CONFIG_IDE_8xx_PCCARD */ -+ } -+#endif /* CONFIG_IDE_PREINIT */ - - WATCHDOG_RESET(); - --#ifdef CONFIG_IDE_8xx_DIRECT -- /* Initialize PIO timing tables */ -- for (i=0; i <= IDE_MAX_PIO_MODE; ++i) { -- pio_config_clk[i].t_setup = PCMCIA_MK_CLKS(pio_config_ns[i].t_setup, -- gd->bus_clk); -- pio_config_clk[i].t_length = PCMCIA_MK_CLKS(pio_config_ns[i].t_length, -- gd->bus_clk); -- pio_config_clk[i].t_hold = PCMCIA_MK_CLKS(pio_config_ns[i].t_hold, -- gd->bus_clk); -- PRINTF ("PIO Mode %d: setup=%2d ns/%d clk" -- " len=%3d ns/%d clk" -- " hold=%2d ns/%d clk\n", -- i, -- pio_config_ns[i].t_setup, pio_config_clk[i].t_setup, -- pio_config_ns[i].t_length, pio_config_clk[i].t_length, -- pio_config_ns[i].t_hold, pio_config_clk[i].t_hold); -- } --#endif /* CONFIG_IDE_8xx_DIRECT */ -- - /* Reset the IDE just to be sure. - * Light LED's to show - */ -- ide_led ((LED_IDE1 | LED_IDE2), 1); /* LED's on */ -- ide_reset (); /* ATAPI Drives seems to need a proper IDE Reset */ -- --#ifdef CONFIG_IDE_8xx_DIRECT -- /* PCMCIA / IDE initialization for common mem space */ -- pcmp->pcmc_pgcrb = 0; -- -- /* start in PIO mode 0 - most relaxed timings */ -- pio_mode = 0; -- set_pcmcia_timing (pio_mode); --#endif /* CONFIG_IDE_8xx_DIRECT */ -+ ide_led((LED_IDE1 | LED_IDE2), 1); /* LED's on */ -+ ide_reset(); /* ATAPI Drives seems to need a proper IDE Reset */ - - /* - * Wait for IDE to get ready. - * According to spec, this can take up to 31 seconds! - */ --#ifndef CONFIG_AMIGAONEG3SE -- for (bus=0; bus<CFG_IDE_MAXBUS; ++bus) { -- int dev = bus * (CFG_IDE_MAXDEVICE / CFG_IDE_MAXBUS); --#else -- s = getenv("ide_maxbus"); -- if (s) -- max_bus_scan = simple_strtol(s, NULL, 10); -- else -- max_bus_scan = CFG_IDE_MAXBUS; -- -- for (bus=0; bus<max_bus_scan; ++bus) { -- int dev = bus * (CFG_IDE_MAXDEVICE / max_bus_scan); --#endif -- --#ifdef CONFIG_IDE_8xx_PCCARD -- /* Skip non-ide devices from probing */ -- if ((ide_devices_found & (1 << bus)) == 0) { -- ide_led ((LED_IDE1 | LED_IDE2), 0); /* LED's off */ -- continue; -- } --#endif -- printf ("Bus %d: ", bus); -- -- ide_bus_ok[bus] = 0; -- -- /* Select device -- */ -- udelay (100000); /* 100 ms */ -- ide_outb (dev, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(dev)); -- udelay (100000); /* 100 ms */ --#ifdef CONFIG_AMIGAONEG3SE -- ata_reset_time = ATA_RESET_TIME; -- s = getenv("ide_reset_timeout"); -- if (s) ata_reset_time = 2*simple_strtol(s, NULL, 10); --#endif -- i = 0; -- do { -- udelay (10000); /* 10 ms */ -- -- c = ide_inb (dev, ATA_STATUS); -- i++; --#ifdef CONFIG_AMIGAONEG3SE -- if (i > (ata_reset_time * 100)) { --#else -- if (i > (ATA_RESET_TIME * 100)) { --#endif -- puts ("** Timeout **\n"); -- ide_led ((LED_IDE1 | LED_IDE2), 0); /* LED's off */ --#ifdef CONFIG_AMIGAONEG3SE -- /* If this is the second bus, the first one was OK */ -- if (bus != 0) { -- ide_bus_ok[bus] = 0; -- goto skip_bus; -- } --#endif -- return; -- } -- if ((i >= 100) && ((i%100)==0)) { -- putc ('.'); -- } -- } while (c & ATA_STAT_BUSY); -+ printf("Detecting SATA busses:\n"); -+ for (bus=0; bus < CFG_IDE_MAXBUS; ++bus) { -+ printf("Bus %d: ", bus); - -- if (c & (ATA_STAT_BUSY | ATA_STAT_FAULT)) { -- puts ("not available "); -- PRINTF ("Status = 0x%02X ", c); --#ifndef CONFIG_ATAPI /* ATAPI Devices do not set DRDY */ -- } else if ((c & ATA_STAT_READY) == 0) { -- puts ("not available "); -- PRINTF ("Status = 0x%02X ", c); --#endif -- } else { -- puts ("OK "); -- ide_bus_ok[bus] = 1; -- } -- WATCHDOG_RESET(); -- } -+ /* Try to discover if bus is present by probing first device on bus */ -+ int device = bus * (CFG_IDE_MAXDEVICE / CFG_IDE_MAXBUS); -+ ide_bus_ok[bus] = ide_probe(device); -+ if (ide_bus_ok[bus]) { -+ puts("Found first device OK\n"); -+ } else { -+ WATCHDOG_RESET(); -+ -+ /* Try second device on bus */ -+ ide_bus_ok[bus] = ide_probe(++device); -+ if (ide_bus_ok[bus]) { -+ puts("Found second device OK\n"); -+ } else { -+ puts("No devices found\n"); -+ } -+ } - --#ifdef CONFIG_AMIGAONEG3SE -- skip_bus: --#endif -- putc ('\n'); -+ WATCHDOG_RESET(); -+ } - -- ide_led ((LED_IDE1 | LED_IDE2), 0); /* LED's off */ -+ ide_led((LED_IDE1 | LED_IDE2), 0); /* LED's off */ - - curr_device = -1; - for (i=0; i<CFG_IDE_MAXDEVICE; ++i) { -@@ -675,13 +610,12 @@ - ide_dev_desc[i].block_read=ide_read; - if (!ide_bus_ok[IDE_BUS(i)]) - continue; -- ide_led (led, 1); /* LED on */ -+ ide_led(led, 1); /* LED on */ - ide_ident(&ide_dev_desc[i]); -- ide_led (led, 0); /* LED off */ -+ ide_led(led, 0); /* LED off */ - dev_print(&ide_dev_desc[i]); --/* ide_print (i); */ - if ((ide_dev_desc[i].lba > 0) && (ide_dev_desc[i].blksz > 0)) { -- init_part (&ide_dev_desc[i]); /* initialize partition type */ -+ init_part(&ide_dev_desc[i]); /* initialize partition type */ - if (curr_device < 0) - curr_device = i; - } -@@ -689,6 +623,11 @@ - WATCHDOG_RESET(); - } - -+int is_device_present(int device_number) -+{ -+ return ide_dev_desc[device_number].part_type != PART_TYPE_UNKNOWN; -+} -+ - /* ------------------------------------------------------------------------- */ - - block_dev_desc_t * ide_get_dev(int dev) -@@ -798,6 +737,11 @@ - EIEIO; - *((uchar *)(ATA_CURR_BASE(dev)+port)) = val; - } -+#elif defined(CONFIG_OXNAS) -+static void __inline__ ide_outb(int dev, int port, unsigned char val) -+{ -+ oxnas_sata_outb(dev, port, val); -+} - #else /* ! __PPC__ */ - static void __inline__ - ide_outb(int dev, int port, unsigned char val) -@@ -819,6 +763,11 @@ - dev, port, (ATA_CURR_BASE(dev)+port), val); - return (val); - } -+#elif defined(CONFIG_OXNAS) -+static unsigned char __inline__ ide_inb(int dev, int port) -+{ -+ return oxnas_sata_inb(dev, port); -+} - #else /* ! __PPC__ */ - static unsigned char __inline__ - ide_inb(int dev, int port) -@@ -921,6 +870,11 @@ - } - #endif /* CONFIG_HMI10 */ - } -+#elif defined(CONFIG_OXNAS) -+static void output_data(int dev, ulong *sect_buf, int words) -+{ -+ oxnas_sata_output_data(dev, sect_buf, words); -+} - #else /* ! __PPC__ */ - static void - output_data(int dev, ulong *sect_buf, int words) -@@ -968,6 +922,11 @@ - } - #endif /* CONFIG_HMI10 */ - } -+#elif defined(CONFIG_OXNAS) -+static void input_data(int dev, ulong *sect_buf, int words) -+{ -+ oxnas_sata_input_data(dev, sect_buf, words); -+} - #else /* ! __PPC__ */ - static void - input_data(int dev, ulong *sect_buf, int words) -@@ -1001,10 +960,36 @@ - - /* ------------------------------------------------------------------------- - */ -+#ifdef CONFIG_OXNAS -+static void byte_swap_and_trim(char* buf) -+{ -+ char *src = buf; -+ -+ // Swap bytes in 16-bit words -+ while ((*src != '\0') && (*(src+1) != '\0')) { -+ char tmp = *(src+1); -+ *(src+1) = *src; -+ *src = tmp; -+ src += 2; -+ } -+ -+ // Trim leading spaces -+ src = buf; -+ while (*src == ' ') { -+ ++src; -+ } -+ if (src != buf) { -+ memcpy(buf, src, strlen(src)); -+ buf[strlen(buf) - (src-buf)] = '\0'; -+ } -+} -+#endif // CONFIG_OXNAS -+ - static void ide_ident (block_dev_desc_t *dev_desc) - { - ulong iobuf[ATA_SECTORWORDS]; - unsigned char c; -+ unsigned int i; - hd_driveid_t *iop = (hd_driveid_t *)iobuf; - - #ifdef CONFIG_AMIGAONEG3SE -@@ -1023,6 +1008,10 @@ - device=dev_desc->dev; - printf (" Device %d: ", device); - -+ for ( i=0; i < ATA_SECTORWORDS; ++i) { -+ iobuf[i] = 0; -+ } -+ - #ifdef CONFIG_AMIGAONEG3SE - s = getenv("ide_maxbus"); - if (s) { -@@ -1110,20 +1099,22 @@ - - input_swap_data (device, iobuf, ATA_SECTORWORDS); - -- ident_cpy (dev_desc->revision, iop->fw_rev, sizeof(dev_desc->revision)); -- ident_cpy (dev_desc->vendor, iop->model, sizeof(dev_desc->vendor)); -- ident_cpy (dev_desc->product, iop->serial_no, sizeof(dev_desc->product)); -+ ident_cpy(dev_desc->revision, iop->fw_rev, sizeof(dev_desc->revision)); -+ ident_cpy(dev_desc->vendor, iop->model, sizeof(dev_desc->vendor)); -+ ident_cpy(dev_desc->product, iop->serial_no, sizeof(dev_desc->product)); -+ - #ifdef __LITTLE_ENDIAN - /* -- * firmware revision and model number have Big Endian Byte -+ * firmware revision, model number and product have Big Endian Byte - * order in Word. Convert both to little endian. - * - * See CF+ and CompactFlash Specification Revision 2.0: - * 6.2.1.6: Identfy Drive, Table 39 for more details - */ - -- strswab (dev_desc->revision); -- strswab (dev_desc->vendor); -+ byte_swap_and_trim(dev_desc->revision); -+ byte_swap_and_trim(dev_desc->vendor); -+ byte_swap_and_trim(dev_desc->product); - #endif /* __LITTLE_ENDIAN */ - - if ((iop->config & 0x0080)==0x0080) -diff -Nurd u-boot-1.1.2/common/cmd_ledfail.c u-boot-1.1.2-oxe810/common/cmd_ledfail.c ---- u-boot-1.1.2/common/cmd_ledfail.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/common/cmd_ledfail.c 2008-06-11 17:55:30.000000000 +0200 -@@ -0,0 +1,58 @@ -+ -+#include <common.h> -+#include <command.h> -+ -+#if (CONFIG_COMMANDS & CFG_CMD_LEDFAIL) -+#define FAILURE_LED (1 << (34-32)) -+ -+#define GPIO_B 0x44100000 -+#define WARN_GPIO_OUT_REG (GPIO_B + 0x10) -+#define WARN_GPIO_OUT_ENABLE_SET (GPIO_B + 0x1C) -+#define WARN_GPIO_OUT_ENABLE_CLR (GPIO_B + 0x20) -+ -+static void ledfail_light(void) -+{ -+ printf("Light LED\n"); -+ /* Light the failure LED - assumes active low drive */ -+ u_int32_t led_state = *((volatile u_int32_t *)WARN_GPIO_OUT_REG); -+ led_state = led_state & ~FAILURE_LED; -+ *((volatile u_int32_t *)WARN_GPIO_OUT_REG) = led_state; -+ -+ /* Enable GPIO for output */ -+ *((volatile u_int32_t *)WARN_GPIO_OUT_ENABLE_SET) = FAILURE_LED; -+} -+ -+static void ledfail_extinguish(void) -+{ -+ printf("Extinguish LED\n"); -+ /* Extinguish the failure LED - assumes active low drive */ -+ u_int32_t led_state = *((volatile u_int32_t *)WARN_GPIO_OUT_REG); -+ led_state = led_state | FAILURE_LED; -+ *((volatile u_int32_t *)WARN_GPIO_OUT_REG) = led_state; -+ -+ /* Clear the failure bit output enable in GPIO's */ -+ *((volatile u_int32_t *)WARN_GPIO_OUT_ENABLE_CLR) = FAILURE_LED; -+} -+ -+int do_ledfail(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -+{ -+ if (argc != 2) { -+ printf ("Usage:\n%s\n", cmdtp->usage); -+ return 1; -+ } -+ -+ ulong arg = simple_strtoul(argv[1], NULL, 10); -+ switch (arg) { -+ case 0: -+ ledfail_extinguish(); -+ break; -+ case 1: -+ ledfail_light(); -+ break; -+ } -+ -+ return 0; -+} -+ -+U_BOOT_CMD(ledfail, 2, 2, do_ledfail, "ledfail - Extinguish (0) or light (1) failure LED\n", NULL); -+#endif /* CFG_CMD_LEDFAIL */ -diff -Nurd u-boot-1.1.2/common/cmd_mem.c u-boot-1.1.2-oxe810/common/cmd_mem.c ---- u-boot-1.1.2/common/cmd_mem.c 2004-12-16 18:42:39.000000000 +0100 -+++ u-boot-1.1.2-oxe810/common/cmd_mem.c 2008-06-11 17:55:30.000000000 +0200 -@@ -731,13 +731,17 @@ - if (argc > 1) { - start = (ulong *)simple_strtoul(argv[1], NULL, 16); - } else { -- start = (ulong *)CFG_MEMTEST_START; -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ start = (ulong *)(gd->bd->bi_dram[0].start); - } - - if (argc > 2) { - end = (ulong *)simple_strtoul(argv[2], NULL, 16); - } else { -- end = (ulong *)(CFG_MEMTEST_END); -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ end = (ulong *)(start + gd->bd->bi_dram[0].size); - } - - if (argc > 3) { -diff -Nurd u-boot-1.1.2/common/cmd_nvedit.c u-boot-1.1.2-oxe810/common/cmd_nvedit.c ---- u-boot-1.1.2/common/cmd_nvedit.c 2004-09-30 00:55:14.000000000 +0200 -+++ u-boot-1.1.2-oxe810/common/cmd_nvedit.c 2008-06-11 17:55:30.000000000 +0200 -@@ -55,8 +55,9 @@ - !defined(CFG_ENV_IS_IN_FLASH) && \ - !defined(CFG_ENV_IS_IN_DATAFLASH) && \ - !defined(CFG_ENV_IS_IN_NAND) && \ -+ !defined(CFG_ENV_IS_IN_DISK) && \ - !defined(CFG_ENV_IS_NOWHERE) --# error Define one of CFG_ENV_IS_IN_{NVRAM|EEPROM|FLASH|DATAFLASH|NOWHERE} -+# error Define one of CFG_ENV_IS_IN_{NVRAM|EEPROM|FLASH|DATAFLASH|DISK|NOWHERE} - #endif - - #define XMK_STR(x) #x -@@ -483,7 +484,7 @@ - * or NULL if not found - */ - --char *getenv (uchar *name) -+char *getenv (const uchar *name) - { - int i, nxt; - -@@ -530,7 +531,9 @@ - return (-1); - } - --#if defined(CFG_ENV_IS_IN_NVRAM) || defined(CFG_ENV_IS_IN_EEPROM) || \ -+#if defined(CFG_ENV_IS_IN_NVRAM) || \ -+ defined(CFG_ENV_IS_IN_EEPROM) || \ -+ defined(CFG_ENV_IS_IN_DISK) || \ - ((CONFIG_COMMANDS & (CFG_CMD_ENV|CFG_CMD_FLASH)) == \ - (CFG_CMD_ENV|CFG_CMD_FLASH)) - int do_saveenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -@@ -586,7 +589,9 @@ - " - delete environment variable 'name'\n" - ); - --#if defined(CFG_ENV_IS_IN_NVRAM) || defined(CFG_ENV_IS_IN_EEPROM) || \ -+#if defined(CFG_ENV_IS_IN_NVRAM) || \ -+ defined(CFG_ENV_IS_IN_EEPROM) || \ -+ defined(CFG_ENV_IS_IN_DISK) || \ - ((CONFIG_COMMANDS & (CFG_CMD_ENV|CFG_CMD_FLASH)) == \ - (CFG_CMD_ENV|CFG_CMD_FLASH)) - U_BOOT_CMD( -diff -Nurd u-boot-1.1.2/common/env_common.c u-boot-1.1.2-oxe810/common/env_common.c ---- u-boot-1.1.2/common/env_common.c 2004-06-09 16:58:14.000000000 +0200 -+++ u-boot-1.1.2-oxe810/common/env_common.c 2008-06-11 17:55:30.000000000 +0200 -@@ -42,7 +42,7 @@ - extern void disable_nvram(void); - #endif - --#undef DEBUG_ENV -+//#undef DEBUG_ENV - #ifdef DEBUG_ENV - #define DEBUGF(fmt,args...) printf(fmt ,##args) - #else -diff -Nurd u-boot-1.1.2/common/env_disk.c u-boot-1.1.2-oxe810/common/env_disk.c ---- u-boot-1.1.2/common/env_disk.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/common/env_disk.c 2008-06-11 17:55:30.000000000 +0200 -@@ -0,0 +1,152 @@ -+/* -+ * (C) Copyright 2006 -+ * Oxford Semiconductor Ltd -+ * -+ * 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> -+ -+#if defined(CFG_ENV_IS_IN_DISK) -+ -+#include <command.h> -+#include <environment.h> -+#include <ide.h> -+ -+extern int is_device_present(int device_number); -+ -+/* Point to the environment as held in SRAM */ -+env_t *env_ptr = NULL; -+ -+char *env_name_spec = "Disk"; -+ -+/* The default environment compiled into U-Boot */ -+extern uchar default_environment[]; -+ -+uchar env_get_char_spec(int index) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ return *((uchar *)(gd->env_addr + index)); -+} -+ -+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) -+ -+void env_relocate_spec(void) -+{ -+ /* Compute the CRC of the environment in SRAM, copied from disk at boot */ -+ env_t *sram_env = (env_t*)CFG_ENV_ADDR; -+ ulong crc = crc32(0, sram_env->data, CFG_ENV_SIZE - offsetof(env_t, data)); -+ -+ /* Copy the SRAM environment and CRC to the working environment */ -+ memcpy(env_ptr->data, sram_env->data, CFG_ENV_SIZE - offsetof(env_t, data)); -+ env_ptr->crc = crc; -+} -+ -+int saveenv(void) -+{ -+ /* Compute the CRC of the working environment */ -+ env_ptr->crc = crc32(0, env_ptr->data, CFG_ENV_SIZE - offsetof(env_t, data)); -+ -+ /* Copy the working environment to the reserved area on each disk device */ -+ int status = 1; -+ int i; -+ for (i=0; i < CFG_IDE_MAXDEVICE; ++i) { -+ if (!is_device_present(i)) { -+ continue; -+ } -+ -+ /* Write environment to the main environment area on disk */ -+ unsigned long written = ide_write(i, CFG_ENV_DISK_SECTOR, CFG_ENV_SIZE/512, (ulong*)env_ptr); -+ if (written != CFG_ENV_SIZE/512) { -+ printf("Saving environment to disk %d primary image failed\n", i); -+ status = 0; -+ } else { -+ /* Write environment to the redundant environment area on disk */ -+ written = ide_write(i, CFG_ENV_DISK_REDUNDANT_SECTOR, CFG_ENV_SIZE/512, (ulong*)env_ptr); -+ if (written != CFG_ENV_SIZE/512) { -+ printf("Saving environment to disk %d secondary image failed\n", i); -+ status = 0; -+ } -+ } -+ } -+ -+ return status; -+} -+ -+static int check_sram_env_integrity(void) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ env_t *sram_env = (env_t*)CFG_ENV_ADDR; -+ ulong crc = crc32(0, sram_env->data, CFG_ENV_SIZE - offsetof(env_t, data)); -+ -+ if (crc == sram_env->crc) { -+ gd->env_addr = (ulong)sram_env->data; -+ gd->env_valid = 1; -+ } -+ -+ return gd->env_valid; -+} -+ -+int env_init(void) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ /* Have not yet found a valid environment */ -+ gd->env_valid = 0; -+ -+ /* Need SATA available to load environment from alternate disk locations */ -+ ide_init(); -+ -+ int i; -+ for (i=0; i < CFG_IDE_MAXDEVICE; ++i) { -+ if (!is_device_present(i)) { -+ continue; -+ } -+ -+ /* Read environment from the primary environment area on disk */ -+ unsigned long read = ide_read(i, CFG_ENV_DISK_SECTOR, CFG_ENV_SIZE/512, (ulong*)CFG_ENV_ADDR); -+ if (read == CFG_ENV_SIZE/512) { -+ /* Check integrity of primary environment data */ -+ if (check_sram_env_integrity()) { -+ printf("Environment successfully read from disk %d primary image\n", i); -+ break; -+ } -+ } -+ -+ /* Read environment from the secondary environment area on disk */ -+ read = ide_read(i, CFG_ENV_DISK_REDUNDANT_SECTOR, CFG_ENV_SIZE/512, (ulong*)CFG_ENV_ADDR); -+ if (read == CFG_ENV_SIZE/512) { -+ /* Check integrity of secondary environment data */ -+ if (check_sram_env_integrity()) { -+ printf("Environment successfully read from disk %d secondary image\n", i); -+ break; -+ } -+ } -+ } -+ -+ if (!gd->env_valid) { -+ printf("Failed to read valid environment from disk, using built-in default\n"); -+ gd->env_addr = (ulong)default_environment; -+ gd->env_valid = 0; -+ } -+ -+ return 0; -+} -+#endif // CFG_ENV_IS_IN_DISK -diff -Nurd u-boot-1.1.2/common/main.c u-boot-1.1.2-oxe810/common/main.c ---- u-boot-1.1.2/common/main.c 2004-04-23 22:32:06.000000000 +0200 -+++ u-boot-1.1.2-oxe810/common/main.c 2008-06-11 17:55:30.000000000 +0200 -@@ -182,7 +182,7 @@ - else { - for (i = 0; i < presskey_max - 1; i ++) - presskey [i] = presskey [i + 1]; -- -+do_recovery - presskey [i] = getc(); - } - } -@@ -369,6 +369,149 @@ - install_auto_complete(); - #endif - -+ -+#if defined(CONFIG_OXNAS) -+ /* Set the memory size given to Linux */ -+ { -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ /* Get a copy of the bootargs string from the runtime environment */ -+ char tempBuf[1024]; -+ char* cmd_string = strcpy(&tempBuf[0], getenv("bootargs")); -+ -+ /* Find the extent of memory token in the bootargs string */ -+ char* mem_token = strstr(cmd_string, "mem="); -+ char* mem_token_end = mem_token; -+ while ((*mem_token_end != ' ') && -+ (*mem_token_end != '\0')) { -+ ++mem_token_end; -+ } -+ -+ if ((*mem_token_end == '\0') && (mem_token != mem_token_end)) { -+ /* Memory token is last in bootargs string */ -+ if (mem_token != cmd_string) { -+ /* Is not the only token, so erase token and previous space" */ -+ *(mem_token-1) = '\0'; -+ } else { -+ /* Is the only token, so no previous space to erase */ -+ *mem_token = '\0'; -+ } -+ } else { -+ /* Memory token is at intermediate location in bootargs string */ -+ if (*mem_token_end == ' ') { -+ ++mem_token_end; -+ } -+ -+ /* Form the bootargs string without the memory token present */ -+ strcpy(mem_token, mem_token_end); -+ } -+ -+ /* How many MB of SDRAM are present */ -+ int megabytes = gd->bd->bi_dram[0].size >> 20; -+ -+ /* Append the memory token to the bootargs string */ -+ switch (megabytes) { -+ case 64: -+ cmd_string = strcat(cmd_string, " mem=64M"); -+ break; -+ case 128: -+ cmd_string = strcat(cmd_string, " mem=128M"); -+ break; -+ case 256: -+ cmd_string = strcat(cmd_string, " mem=256M"); -+ break; -+ default: -+ printf("Unsupported memory size, defaulting to 64M\n"); -+ cmd_string = strcat(cmd_string, " mem=64M"); -+ } -+ -+ /* Save the revised bootargs string to the runtime environment */ -+ setenv("bootargs", cmd_string); -+ } -+ -+/* Upgrade, recovery and power button monitor code -+*/ -+ int do_recovery = 0; /* default no recovery */ -+ -+ /* Read the upgrade flag from disk into memory */ -+ ide_init(); -+ run_command("ide read 48700000 ff 1", 0); -+ -+ char upgrade_mode = *(volatile char*)0x48700000; -+ char recovery_mode = *(volatile char*)0x48700001; -+ char controlled_pd_mode = *(volatile char*)0x48700002; -+ -+ if (recovery_mode == RECOVERY_MAGIC) { -+ do_recovery = 1; /* perform recovery */ -+ } -+ -+ if (controlled_pd_mode == CONTROLLED_POWER_DOWN_MAGIC) { -+ /* System in controlled pwer down mode */ -+ -+ /* Read the SRAM location for normal boot flag */ -+ char sram_data = *(volatile char*)(CFG_SRAM_BASE + CFG_SRAM_SIZE - POWER_ON_FLAG_SRAM_OFFSET); -+ char tempBuf[1024]; -+ char* cmd_string = strcpy(&tempBuf[0], getenv("bootargs")); -+ -+ if (sram_data == CONTROLLED_POWER_UP_MAGIC) { -+ /* The system has to remain in power down state */ -+ -+ /* Set appropriate boot args */ -+ cmd_string = strcat(cmd_string, " powermode=controlledpup"); -+ printf("Controlled Power UP requested\n"); -+ } else { -+ /* The system is moving to power up state from power down state */ -+ cmd_string = strcat(cmd_string, " powermode=controlledpdown"); -+ printf("Controlled Power DOWN requested\n"); -+ } -+ setenv("bootargs", cmd_string); -+ } -+ -+ /* branch off inot recovery or upadate */ -+ if (upgrade_mode == UPGRADE_MAGIC) { -+ /* Script to select first disk */ -+ parse_string_outer("set select0 ide dev 0", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP); -+ -+ /* Script to select second disk */ -+ parse_string_outer("set select1 ide dev 1", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP); -+ -+ /* Script for loading 256KB of upgrade rootfs image from hidden sectors */ -+ parse_string_outer("set loadf ide read 48700000 1770 200", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP); -+ -+ /* Script for loading 2MB of upgrade kernel image from hidden sectors */ -+ parse_string_outer("set loadk ide read 48800000 1970 1000", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP); -+ -+ /* Script to light failure LED */ -+ parse_string_outer("set lightled ledfail 1", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP); -+ -+ /* Script to extinguish failure LED */ -+ parse_string_outer("set extinguishled ledfail 0", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP); -+ -+ /* Script for booting Linux kernel image with mkimage-wrapped initrd */ -+ parse_string_outer("set boot bootm 48800000 48700000", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP); -+ -+ /* Set Linux bootargs to use rootfs in initial ramdisk */ -+ parse_string_outer("set bootargs mem=32M console=ttyS0,115200 root=/dev/ram0", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP); -+ -+ /* Validate, load and boot the first validate set of initrd and kernel -+ Theres alot of combos here due to disk/backup/fk arrangments, it'll -+ no doubt work on the first or second one though. */ -+ parse_string_outer("run select0 loadf loadk boot || " -+ "run lightled select1 loadf loadk extinguishled boot || " -+ "run lightled select0 loadf select1 loadk extinguishled boot || " -+ "run lightled select1 loadf select0 loadk extinguishled boot || " -+ "run lightled ", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP); -+ } else if (do_recovery) { -+ printf ("\nRecovery mode selected\n"); -+ -+ char tempBuf[1024]; -+ char* cmd_string = strcpy(&tempBuf[0], getenv("bootargs")); -+ cmd_string = strcat(cmd_string, " adminmode=recovery"); -+ setenv("bootargs", cmd_string); -+ } -+ -+#endif // CONFIG_OXNAS -+ - #ifdef CONFIG_PREBOOT - if ((p = getenv ("preboot")) != NULL) { - # ifdef CONFIG_AUTOBOOT_KEYED -diff -Nurd u-boot-1.1.2/common/Makefile u-boot-1.1.2-oxe810/common/Makefile ---- u-boot-1.1.2/common/Makefile 2004-12-16 18:35:57.000000000 +0100 -+++ u-boot-1.1.2-oxe810/common/Makefile 2008-06-11 17:55:30.000000000 +0200 -@@ -40,9 +40,10 @@ - cmd_nand.o cmd_net.o cmd_nvedit.o \ - cmd_pci.o cmd_pcmcia.o cmd_portio.o \ - cmd_reginfo.o cmd_reiser.o cmd_scsi.o cmd_spi.o cmd_universe.o cmd_usb.o cmd_vfd.o \ -+ cmd_ledfail.o \ - command.o console.o devices.o dlmalloc.o docecc.o \ - environment.o env_common.o \ -- env_nand.o env_dataflash.o env_flash.o env_eeprom.o env_nvram.o env_nowhere.o exports.o \ -+ env_nand.o env_dataflash.o env_flash.o env_eeprom.o env_nvram.o env_nowhere.o env_disk.o exports.o \ - flash.o fpga.o \ - hush.o kgdb.o lcd.o lists.o lynxkdi.o \ - memsize.o miiphybb.o miiphyutil.o \ -diff -Nurd u-boot-1.1.2/cpu/arm926ejs/config.mk u-boot-1.1.2-oxe810/cpu/arm926ejs/config.mk ---- u-boot-1.1.2/cpu/arm926ejs/config.mk 2003-08-30 00:00:47.000000000 +0200 -+++ u-boot-1.1.2-oxe810/cpu/arm926ejs/config.mk 2008-06-11 17:55:03.000000000 +0200 -@@ -21,7 +21,6 @@ - # MA 02111-1307 USA - # - --PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \ -- -mshort-load-bytes -msoft-float -+PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 - --PLATFORM_CPPFLAGS += -mapcs-32 -march=armv4 -+PLATFORM_CPPFLAGS += -march=armv5te -diff -Nurd u-boot-1.1.2/cpu/arm926ejs/interrupts.c u-boot-1.1.2-oxe810/cpu/arm926ejs/interrupts.c ---- u-boot-1.1.2/cpu/arm926ejs/interrupts.c 2004-03-23 22:43:08.000000000 +0100 -+++ u-boot-1.1.2-oxe810/cpu/arm926ejs/interrupts.c 2008-06-11 17:55:03.000000000 +0200 -@@ -41,7 +41,12 @@ - #include <asm/proc-armv/ptrace.h> - - extern void reset_cpu(ulong addr); -+ -+#ifdef CONFIG_OXNAS -+#define TIMER_LOAD_VAL 0xffffUL -+#else // CONFIG_OXNAS - #define TIMER_LOAD_VAL 0xffffffff -+#endif // CONFIG_OXNAS - - /* macro to read the 32 bit timer */ - #ifdef CONFIG_OMAP -@@ -53,6 +58,9 @@ - #ifdef CONFIG_VERSATILE - #define READ_TIMER (*(volatile ulong *)(CFG_TIMERBASE+4)) - #endif -+#ifdef CONFIG_OXNAS -+#define READ_TIMER ((*(volatile ushort *)(CFG_TIMERBASE+4)) & 0xFFFFUL) /* RPS timer value register has only 16 defined bits */ -+#endif - - #ifdef CONFIG_USE_IRQ - /* enable IRQ interrupts */ -@@ -212,6 +220,16 @@ - *(volatile ulong *)(CFG_TIMERBASE + 4) = CFG_TIMER_RELOAD; /* TimerValue */ - *(volatile ulong *)(CFG_TIMERBASE + 8) = 0x8C; - #endif /* CONFIG_VERSATILE */ -+#ifdef CONFIG_OXNAS -+ // Setup timer 1 load value -+ *(volatile ulong*)(CFG_TIMERBASE + 0) = TIMER_LOAD_VAL; -+ -+ // Setup timer 1 prescaler, periodic operation and start it -+ *(volatile ulong*)(CFG_TIMERBASE + 8) = -+ (TIMER_PRESCALE_ENUM << TIMER_PRESCALE_BIT) | -+ (TIMER_MODE_PERIODIC << TIMER_MODE_BIT) | -+ (TIMER_ENABLE_ENABLE << TIMER_ENABLE_BIT); -+#endif /* CONFIG_OXNAS */ - - /* init the timestamp and lastdec value */ - reset_timer_masked(); -diff -Nurd u-boot-1.1.2/cpu/arm926ejs/start.S u-boot-1.1.2-oxe810/cpu/arm926ejs/start.S ---- u-boot-1.1.2/cpu/arm926ejs/start.S 2004-06-09 02:11:01.000000000 +0200 -+++ u-boot-1.1.2-oxe810/cpu/arm926ejs/start.S 2008-06-11 17:55:03.000000000 +0200 -@@ -94,6 +94,11 @@ - _TEXT_BASE: - .word TEXT_BASE - -+#ifdef CONFIG_OXNAS -+_EXCEPTION_BASE: -+ .word EXCEPTION_BASE -+#endif -+ - .globl _armboot_start - _armboot_start: - .word _start -@@ -135,6 +140,18 @@ - orr r0,r0,#0xd3 - msr cpsr,r0 - -+#ifdef CONFIG_OXNAS -+ /* -+ * Copy exception table to relocated address in internal SRAM -+ */ -+ adr r0, _start /* Address of exception table in flash */ -+ ldr r1, _EXCEPTION_BASE /* Relocated address of exception table */ -+ ldmia r0!, {r3-r10} /* Copy exception table and jump values from */ -+ stmia r1!, {r3-r10} /* FLASH to relocated address */ -+ ldmia r0!, {r3-r10} -+ stmia r1!, {r3-r10} -+#endif -+ - /* - * we do sys-critical inits only at reboot, - * not when booting from ram! -@@ -143,21 +160,21 @@ - bl cpu_init_crit - #endif - --relocate: /* relocate U-Boot to RAM */ -- adr r0, _start /* r0 <- current position of code */ -- ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ -- cmp r0, r1 /* don't reloc during debug */ -- beq stack_setup -+relocate: /* relocate U-Boot to RAM */ -+ adr r0, _start /* current position of code */ -+ ldr r1, _TEXT_BASE /* relocated position of code */ -+ cmp r0, r1 -+ beq stack_setup - - ldr r2, _armboot_start - ldr r3, _bss_start -- sub r2, r3, r2 /* r2 <- size of armboot */ -- add r2, r0, r2 /* r2 <- source end address */ -+ sub r2, r3, r2 /* r2 <- size of armboot */ -+ add r2, r0, r2 /* r2 <- source end address */ - - copy_loop: -- ldmia r0!, {r3-r10} /* copy from source address [r0] */ -- stmia r1!, {r3-r10} /* copy to target address [r1] */ -- cmp r0, r2 /* until source end addreee [r2] */ -+ ldmia r0!, {r3-r10} /* copy from source address [r0] */ -+ stmia r1!, {r3-r10} /* copy to target address [r1] */ -+ cmp r0, r2 /* until source end addreee [r2] */ - ble copy_loop - - /* Set up the stack */ -@@ -212,7 +229,7 @@ - mrc p15, 0, r0, c1, c0, 0 - bic r0, r0, #0x00002300 /* clear bits 13, 9:8 (--V- --RS) */ - bic r0, r0, #0x00000087 /* clear bits 7, 2:0 (B--- -CAM) */ -- orr r0, r0, #0x00000002 /* set bit 2 (A) Align */ -+ orr r0, r0, #0x00000002 /* set bit 1 (A) Align */ - orr r0, r0, #0x00001000 /* set bit 12 (I) I-Cache */ - mcr p15, 0, r0, c1, c0, 0 - -@@ -391,6 +408,7 @@ - - #endif - -+#ifndef CONFIG_OXNAS - .align 5 - .globl reset_cpu - reset_cpu: -@@ -405,3 +423,4 @@ - - rstctl1: - .word 0xfffece10 -+#endif // !CONFIG_OXNAS -diff -Nurd u-boot-1.1.2/drivers/cfi_flash.c u-boot-1.1.2-oxe810/drivers/cfi_flash.c ---- u-boot-1.1.2/drivers/cfi_flash.c 2004-12-18 23:35:45.000000000 +0100 -+++ u-boot-1.1.2-oxe810/drivers/cfi_flash.c 2008-06-11 17:55:31.000000000 +0200 -@@ -1056,7 +1056,11 @@ - } - tmp = flash_read_long (info, 0, - FLASH_OFFSET_ERASE_REGIONS + -+#ifdef FORCE_TOP_BOOT_FLASH -+ (num_erase_regions - 1 - i) * 4); -+#else - i * 4); -+#endif - erase_region_size = - (tmp & 0xffff) ? ((tmp & 0xffff) * 256) : 128; - tmp >>= 16; -@@ -1104,6 +1108,7 @@ - cfiptr_t ctladdr; - cfiptr_t cptr; - int flag; -+ ulong start; - - ctladdr.cp = flash_make_addr (info, 0, 0); - cptr.cp = (uchar *) dest; -@@ -1151,6 +1156,15 @@ - break; - case FLASH_CFI_16BIT: - cptr.wp[0] = cword.w; -+ /* Wait for write to complete */ -+ start = get_timer (0); -+ while (cptr.wp[0] != cword.w) { -+ printf("."); -+ if (get_timer (start) > info->erase_blk_tout * CFG_HZ) { -+ printf ("Flash write timeout!");; -+ } -+ } -+ printf("\n"); - break; - case FLASH_CFI_32BIT: - cptr.lp[0] = cword.l; -diff -Nurd u-boot-1.1.2/drivers/ns16550.c u-boot-1.1.2-oxe810/drivers/ns16550.c ---- u-boot-1.1.2/drivers/ns16550.c 2004-06-07 01:13:57.000000000 +0200 -+++ u-boot-1.1.2-oxe810/drivers/ns16550.c 2008-06-11 17:55:31.000000000 +0200 -@@ -14,8 +14,25 @@ - #define MCRVAL (MCR_DTR | MCR_RTS) /* RTS/DTR */ - #define FCRVAL (FCR_FIFO_EN | FCR_RXSR | FCR_TXSR) /* Clear & enable FIFOs */ - -+#ifdef USE_UART_FRACTIONAL_DIVIDER -+static int oxnas_fractional_divider(NS16550_t com_port, int baud_divisor) -+{ -+ // Baud rate is passed around x16 -+ int real_divisor = baud_divisor >> 4; -+ // Top three bits of 8-bit dlf register hold the number of eigths -+ // for the fractional part of the divide ratio -+ com_port->dlf = (unsigned char)(((baud_divisor - (real_divisor << 4)) << 4) & 0xFF); -+ // Return the x1 divider for the normal divider register -+ return real_divisor; -+} -+#endif // USE_UART_FRACTIONAL_DIVIDER -+ - void NS16550_init (NS16550_t com_port, int baud_divisor) - { -+#ifdef USE_UART_FRACTIONAL_DIVIDER -+ baud_divisor = oxnas_fractional_divider(com_port, baud_divisor); -+#endif // USE_UART_FRACTIONAL_DIVIDER -+ - com_port->ier = 0x00; - #ifdef CONFIG_OMAP1510 - com_port->mdr1 = 0x7; /* mode select reset TL16C750*/ -@@ -33,6 +50,10 @@ - - void NS16550_reinit (NS16550_t com_port, int baud_divisor) - { -+#ifdef USE_UART_FRACTIONAL_DIVIDER -+ baud_divisor = oxnas_fractional_divider(com_port, baud_divisor); -+#endif // USE_UART_FRACTIONAL_DIVIDER -+ - com_port->ier = 0x00; - com_port->lcr = LCR_BKSE; - com_port->dll = baud_divisor & 0xff; -diff -Nurd u-boot-1.1.2/drivers/serial.c u-boot-1.1.2-oxe810/drivers/serial.c ---- u-boot-1.1.2/drivers/serial.c 2003-08-30 00:00:47.000000000 +0200 -+++ u-boot-1.1.2-oxe810/drivers/serial.c 2008-06-11 17:55:31.000000000 +0200 -@@ -59,7 +59,13 @@ - return (26); /* return 26 for base divisor */ - } - #endif -- return (CFG_NS16550_CLK / 16 / gd->baudrate); -+ -+#ifdef USE_UART_FRACTIONAL_DIVIDER -+ return (((CFG_NS16550_CLK << 4) / gd->baudrate) + 8) >> 4; -+#endif // USE_UART_FRACTIONAL_DIVIDER -+ -+ // Round to nearest integer -+ return (((CFG_NS16550_CLK / gd->baudrate) + 8 ) / 16); - } - - int serial_init (void) -diff -Nurd u-boot-1.1.2/examples/Makefile u-boot-1.1.2-oxe810/examples/Makefile ---- u-boot-1.1.2/examples/Makefile 2004-10-10 23:27:33.000000000 +0200 -+++ u-boot-1.1.2-oxe810/examples/Makefile 2008-06-11 17:55:30.000000000 +0200 -@@ -30,7 +30,8 @@ - endif - - ifeq ($(ARCH),arm) --LOAD_ADDR = 0xc100000 -+#LOAD_ADDR = 0xc100000 -+LOAD_ADDR = 0x4C004000 - endif - - ifeq ($(ARCH),mips) -@@ -58,6 +59,11 @@ - SREC = hello_world.srec - BIN = hello_world.bin hello_world - -+ifeq ($(ARCH),arm) -+SREC += mem_test.srec -+BIN += mem_test.bin mem_test -+endif -+ - ifeq ($(ARCH),i386) - SREC += 82559_eeprom.srec - BIN += 82559_eeprom.bin 82559_eeprom -@@ -115,10 +121,10 @@ - $(LD) -g $(EX_LDFLAGS) -Ttext $(LOAD_ADDR) \ - -o $@ -e $(<:.o=) $< $(LIB) \ - -L$(gcclibdir) -lgcc --%.srec: % -+%.srec: %.o - $(OBJCOPY) -O srec $< $@ 2>/dev/null - --%.bin: % -+%.bin: %.o - $(OBJCOPY) -O binary $< $@ 2>/dev/null - - ######################################################################### -diff -Nurd u-boot-1.1.2/examples/mem_test.c u-boot-1.1.2-oxe810/examples/mem_test.c ---- u-boot-1.1.2/examples/mem_test.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/examples/mem_test.c 2008-06-11 17:55:30.000000000 +0200 -@@ -0,0 +1,1322 @@ -+/* -+ * (C) Copyright 2006 -+ * Oxford Semiconductor Ltd, www.oxsemi.com -+ * 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 -+ */ -+ -+/********************* OPTIONS ********************************************************/ -+ -+#define ARM -+/* -+#define QUIET -+#define SHORT -+*/ -+ -+/********************* TEST DEFINITIONS ********************************************************/ -+ -+ -+#define NUM_PATTYPES 5 -+#define PATTYPE_A5 0 -+#define PATTYPE_5A 1 -+#define PATTYPE_NO_FF 2 -+#define PATTYPE_INCR 3 -+#define PATTYPE_DECR 4 -+ -+/* Number of words in a block (to ensure that neither data not ~data is 0xFFxx) */ -+ -+#ifdef SHORT -+ #define BLOCKWORDS (254*4) -+ #define BLOCKSIZE (256*4) -+#else -+ #define BLOCKWORDS (254*256*4) -+ #define BLOCKSIZE (256*256*4) -+#endif -+ -+#ifdef ARM -+ #include <common.h> -+ #include <exports.h> -+ -+ #define SDRAM_BASE 0x48000000 -+ #define SDRAM_TOP 0x49000000 -+ #define SDRAM_BLOCK 0x10000 -+// #define SDRAM_WRITE(ADDR, DATA) printf("Write 0x%08x to 0x%08x\n", (DATA), (ADDR)); -+// #define SDRAM_READ(ADDR, VAR) printf("Read from 0x%08x\n", (ADDR)); -+// #define SDRAM_WRITE(ADDR, DATA) printf("Write 0x%08x to 0x%08x\n", (DATA), (ADDR)); (*((volatile unsigned int *)(ADDR)) = (DATA)) -+// #define SDRAM_READ(ADDR, VAR) printf("Read from 0x%08x\n", (ADDR)); (*(VAR) = *((volatile unsigned int *)(ADDR))) -+ #define SDRAM_WRITE(ADDR, DATA) (*((volatile unsigned int *)(ADDR)) = (DATA)) -+ #define SDRAM_READ(ADDR, VAR) (*(VAR) = *((volatile unsigned int *)(ADDR))) -+#else -+ #include <stdio.h> -+ #include <stdlib.h> -+ /* Not so much space - just 2 blocks from addr 0... */ -+ #define SDRAM_BASE 0 -+ #define SDRAM_TOP (2 * BLOCKSIZE) -+ #define SDRAM_BLOCK 0x10000 -+ #ifdef QUIET -+ #define SDRAM_WRITE(ADDR, DATA) array[ADDR] = (DATA) -+ #define SDRAM_READ(ADDR, VAR) *((volatile unsigned int *)(VAR)) = array[ADDR] -+ #else -+ #define SDRAM_WRITE(ADDR, DATA) printf("WRITE(%08x)=%08x\n", ADDR, DATA); array[ADDR] = (DATA) -+ #define SDRAM_READ(ADDR, VAR) printf("READ (%08x)=%08x\n", ADDR, array[ADDR]); *((volatile unsigned int *)(VAR)) = array[ADDR] -+ #endif -+ unsigned volatile int array[SDRAM_TOP]; -+#endif -+ -+ -+#define SYSCTRL_PRIMSEL_LO 0x4500000C -+#define SYSCTRL_SECSEL_LO 0x45000014 -+#define SYSCTRL_TERSEL_LO 0x4500008C -+#define SYSCTRL_PRIMSEL_HI 0x45000010 -+#define SYSCTRL_SECSEL_HI 0x45000018 -+#define SYSCTRL_TERSEL_HI 0x45000090 -+ -+/* GPIO */ -+#define GPIOB_IO_VAL 0x44100000 -+#define GPIOB_OE_VAL 0x44100004 -+#define GPIOB_SET_OE 0x4410001C -+#define GPIOB_CLEAR_OE 0x44100020 -+#define GPIOB_OUTPUT_VAL 0x44100010 -+#define GPIOB_SET_OUTPUT 0x44100014 -+#define GPIOB_CLEAR_OUTPUT 0x44100018 -+#define GPIOB_BIT_34 0x00000004 -+ -+void configure_caches(void); -+void report_err(unsigned int address, unsigned int bad_data, unsigned int correct_data, unsigned int iteration); -+ -+/********************* TYPES.H ********************************************************/ -+ -+typedef unsigned int UINT, *PUINT; -+/* -+#ifndef __MY_BASIC_TYPES_H -+#define __MY_BASIC_TYPES_H -+ -+typedef signed char CHAR, *PCHAR; -+typedef unsigned char BYTE, UCHAR, *PBYTE, *PUCHAR; -+typedef signed short SHORT, *PSHORT; -+typedef unsigned short WORD, USHORT, *PWORD, *PUSHORT; -+typedef signed long LONG, *PLONG; -+typedef unsigned long DWORD, *PDWORD; -+typedef int BOOL, *PBOOL; -+typedef unsigned int UINT, *PUINT; -+typedef void VOID, *PVOID; -+ -+typedef float SINGLE,*PSINGLE; -+typedef double DOUBLE,*PDOUBLE; -+ -+ -+#define FALSE 0 -+#define TRUE 1 -+ -+#endif -+*/ -+ -+/********************* CHIP.H ********************************************************/ -+ -+// Address Map -+#define BOOT_ROM_BASE 0x00000000 -+#define USBHS_BASE 0x00200000 -+#define GMAC_BASE 0x00400000 -+#define PCI_BASE 0x00600000 -+#define PCI_DATA_BASE 0x00800000 -+#define STATIC0_BASE 0x01000000 -+#define STATIC1_BASE 0x01400000 -+#define STATIC2_BASE 0x01800000 -+#define STATIC_BASE 0x01C00000 -+#define SATA_DATA_BASE 0x02000000 -+#define DPE_DATA_BASE 0x03000000 -+#define GPIOA_BASE 0x04000000 -+#define GPIOB_BASE 0x04100000 -+#define UARTA_BASE 0x04200000 -+#define UARTB_BASE 0x04300000 -+#define I2C_MASTER_BASE 0x04400000 -+#define AUDIO_BASE 0x04500000 -+#define FAN_BASE 0x04600000 -+#define PWM_BASE 0x04700000 -+#define IR_RX_BASE 0x04800000 -+#define UARTC_BASE 0x04900000 -+#define UARTD_BASE 0x04A00000 -+#define SYS_CTRL_BASE 0x05000000 -+#define RPSA_BASE 0x05300000 -+#define ARM_RPS_BASE RPSA_BASE -+#define RPSC_BASE 0x05400000 -+#define AHB_MON_BASE 0x05500000 -+#define DMA_BASE 0x05600000 -+#define DPE_BASE 0x05700000 -+#define IBIW_BASE 0x05780000 -+#define DDR_BASE 0x05800000 -+#define SATA0_BASE 0x05900000 -+#define SATA1_BASE 0x05980000 -+#define DMA_CHKSUM_BASE 0x05A00000 -+#define COPRO_BASE 0x05B00000 -+#define SGDMA_BASE 0x05C00000 -+#define DDR_DATA_BASE 0x08000000 -+#define SRAM_BASE 0x0C000000 -+#define SRAM0_BASE 0x0C000000 -+#define SRAM1_BASE 0x0C002000 -+#define SRAM2_BASE 0x0C004000 -+#define SRAM3_BASE 0x0C006000 -+ -+// Virtual peripheral for TB sync -+#define TB_SYNC_BASE 0x05F00100 -+ -+ -+/********************* DMA.H ********************************************************/ -+ -+ -+// DMA Control register settings -+ -+#define DMA_FAIR_SHARE (1<<0) -+#define DMA_IN_PROGRESS (1<<1) -+ -+#define DMA_SDREQ_SATA (0<<2) -+#define DMA_SDREQ_DPE_OUT (2<<2) -+#define DMA_SDREQ_UARTA_RX (4<<2) -+#define DMA_SDREQ_AUDIO_RX (6<<2) -+#define DMA_SDREQ_MEM (0xF<<2) -+ -+#define DMA_DDREQ_SATA (0<<6) -+#define DMA_DDREQ_DPE_IN (1<<6) -+#define DMA_DDREQ_UARTA_TX (3<<6) -+#define DMA_DDREQ_AUDIO_TX (5<<6) -+#define DMA_DDREQ_MEM (0xF<<6) -+ -+#define DMA_INTERRUPT (1 << 10) -+#define DMA_NEXT_FREE (1 << 11) -+#define DMA_CH_RESET (1 << 12) -+ -+#define DMA_DIR_ATOA (0 << 13) -+#define DMA_DIR_BTOA (1 << 13) -+#define DMA_DIR_ATOB (2 << 13) -+#define DMA_DIR_BTOB (3 << 13) -+ -+#define DMA_BURST_A (1 << 17) -+#define DMA_BURST_B (1 << 18) -+ -+#define DMA_SWIDTH_8 (0 << 19) -+#define DMA_SWIDTH_16 (1 << 19) -+#define DMA_SWIDTH_32 (2 << 19) -+ -+#define DMA_DWIDTH_8 (0 << 22) -+#define DMA_DWIDTH_16 (1 << 22) -+#define DMA_DWIDTH_32 (2 << 22) -+ -+#define DMA_PAUSE (1 << 25) -+#define DMA_INT_ENABLE (1 << 26) -+#define DMA_STARVE_LO_PRIORITY (1 << 29) -+#define DMA_NEW_INT_CLEAR (1 << 30) -+ -+#define DMA_FIXED_SADDR ((0 << 15) | (1 << 27)) -+#define DMA_INCR_SADDR ((1 << 15) | (0 << 27)) -+#define DMA_SEMI_FIXED_SADDR ((0 << 15) | (0 << 27)) -+ -+#define DMA_FIXED_DADDR ((0 << 16) | (1 << 28)) -+#define DMA_INCR_DADDR ((1 << 16) | (0 << 28)) -+#define DMA_SEMI_FIXED_DADDR ((0 << 16) | (0 << 28)) -+ -+#define DMA_BASE_CTRL (DMA_BURST_A | DMA_BURST_B | DMA_INT_ENABLE | DMA_NEW_INT_CLEAR) -+ -+// Common base setups -+ -+#define DMA_CTRL_A32TOA32 ( DMA_BASE_CTRL | DMA_DIR_ATOA | DMA_SWIDTH_32 | DMA_DWIDTH_32 ) -+#define DMA_CTRL_B32TOA32 ( DMA_BASE_CTRL | DMA_DIR_BTOA | DMA_SWIDTH_32 | DMA_DWIDTH_32 ) -+#define DMA_CTRL_A32TOB32 ( DMA_BASE_CTRL | DMA_DIR_ATOB | DMA_SWIDTH_32 | DMA_DWIDTH_32 ) -+#define DMA_CTRL_B32TOB32 ( DMA_BASE_CTRL | DMA_DIR_BTOB | DMA_SWIDTH_32 | DMA_DWIDTH_32 ) -+ -+#define DMA_CTRL_A8TOB32 ( DMA_BASE_CTRL | DMA_DIR_ATOB | DMA_SWIDTH_8 | DMA_DWIDTH_32 ) -+#define DMA_CTRL_B32TOA8 ( DMA_BASE_CTRL | DMA_DIR_BTOA | DMA_SWIDTH_32 | DMA_DWIDTH_8 ) -+#define DMA_CTRL_A32TOB8 ( DMA_BASE_CTRL | DMA_DIR_ATOB | DMA_SWIDTH_32 | DMA_DWIDTH_8 ) -+ -+// Most likely transactions -+ -+#define DMA_CTRL_MEM_TO_MEM_AA ( DMA_CTRL_A32TOA32 | DMA_SDREQ_MEM | DMA_DDREQ_MEM | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_MEM_TO_MEM_AB ( DMA_CTRL_A32TOB32 | DMA_SDREQ_MEM | DMA_DDREQ_MEM | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_MEM_TO_MEM_BB ( DMA_CTRL_B32TOB32 | DMA_SDREQ_MEM | DMA_DDREQ_MEM | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_MEM_TO_MEM_BA ( DMA_CTRL_B32TOA32 | DMA_SDREQ_MEM | DMA_DDREQ_MEM | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_MEM_TO_MEM ( DMA_CTRL_MEM_TO_MEM_AB ) -+ -+//DMA A-A -+#define DMA_CTRL_SATA_TO_MEM_AA ( DMA_CTRL_A32TOA32 | DMA_SDREQ_SATA | DMA_DDREQ_MEM | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_MEM_TO_SATA_AA ( DMA_CTRL_A32TOA32 | DMA_SDREQ_MEM | DMA_DDREQ_SATA | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+ -+#define DMA_CTRL_SATA_TO_MEM ( DMA_CTRL_A32TOB32 | DMA_SDREQ_SATA | DMA_DDREQ_MEM | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_MEM_TO_SATA ( DMA_CTRL_B32TOA32 | DMA_SDREQ_MEM | DMA_DDREQ_SATA | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_SATA_TO_DPE ( DMA_CTRL_A32TOA32 | DMA_SDREQ_SATA | DMA_DDREQ_DPE_IN | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_DPE_TO_SATA ( DMA_CTRL_A32TOA32 | DMA_SDREQ_DPE_OUT | DMA_DDREQ_SATA | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_MEM_TO_DPE ( DMA_CTRL_B32TOA32 | DMA_SDREQ_MEM | DMA_DDREQ_DPE_IN | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_DPE_TO_MEM ( DMA_CTRL_A32TOB32 | DMA_SDREQ_DPE_OUT | DMA_DDREQ_MEM | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_PCI_TO_MEM ( DMA_CTRL_A32TOB32 | DMA_SDREQ_MEM | DMA_DDREQ_MEM | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+ -+#define DMA_CTRL_MEM_TO_PCI ( DMA_CTRL_B32TOA32 | DMA_SDREQ_MEM | DMA_DDREQ_MEM | DMA_INCR_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_MEM_TO_AUDIO ( DMA_CTRL_B32TOA32 | DMA_SDREQ_MEM | DMA_DDREQ_AUDIO_TX | DMA_INCR_SADDR | DMA_FIXED_DADDR ) -+#define DMA_CTRL_AUDIO_TO_MEM ( DMA_CTRL_A32TOB32 | DMA_SDREQ_AUDIO_RX | DMA_DDREQ_MEM | DMA_FIXED_SADDR | DMA_INCR_DADDR ) -+#define DMA_CTRL_MEM_TO_UART ( DMA_CTRL_B32TOA8 | DMA_SDREQ_MEM | DMA_DDREQ_UARTA_TX | DMA_INCR_SADDR | DMA_FIXED_DADDR ) -+#define DMA_CTRL_UART_TO_MEM ( DMA_CTRL_A8TOB32 | DMA_SDREQ_UARTA_RX | DMA_DDREQ_MEM | DMA_FIXED_SADDR | DMA_INCR_DADDR ) -+ -+// Byte count register flags -+ -+#define DMA_HBURST_EN (1<<28) -+#define DMA_WR_BUFFERABLE (1<<29) -+#define DMA_WR_EOT (1<<30) -+#define DMA_RD_EOT (1<<31) -+ -+ -+// Pause the DMA channel specified -+void PauseDMA( UINT channel ); -+ -+// UnPause the DMA channel specified -+void UnPauseDMA( UINT channel ); -+ -+// Configure a DMA -+void SetupDMA( UINT channel, -+ UINT src_addr, -+ UINT dest_addr, -+ UINT byte_count, -+ UINT control, -+ UINT flags ); -+ -+// Wait while the given DMA channel is busy -+void WaitWhileDMABusy( UINT channel ); -+ -+// Perform a memory to memory copy -+void DMAMemCopy ( UINT channel, -+ UINT src_addr, -+ UINT dest_addr, -+ UINT byte_count ); -+ -+ -+/****************************** MAIN ***********************************************/ -+#ifdef ARM -+int mem_test(int argc, char* argv[]) -+#else -+int main(int argc, char* argv[]) -+#endif -+{ -+ unsigned int i; -+ unsigned int iteration; -+ unsigned int block_base; -+ unsigned int datapattern; -+ unsigned int correct_data; -+ unsigned volatile int read_data; -+ unsigned int pattype, starting_pattype; -+ unsigned int end_addr; -+ unsigned int row, col, bank; -+ -+#ifdef ARM -+ /* Print the ABI version */ -+ app_startup(argv); -+ printf ("Example expects ABI version %d\n", XF_VERSION); -+ printf ("Actual U-Boot ABI version %d\n", (int)get_version()); -+ -+ printf("GPIO34 is output, low\n"); -+ * (volatile unsigned int *) GPIOB_CLEAR_OUTPUT = GPIOB_BIT_34; -+ * (volatile unsigned int *) GPIOB_SET_OE = GPIOB_BIT_34; -+#endif -+ -+// configure_caches(); -+//printf("Caches enabled\n"); -+ -+ /* ******************************************************************* */ -+ printf("DMA TEST.\n" ); -+ /* ******************************************************************* */ -+ -+ -+ #define DMA0_CTRL_STAT 0x45A00000 -+ #define DMA0_SRC_BASE 0x45A00004 -+ #define DMA0_DEST_BASE 0x45A00008 -+ #define DMA0_BYTE_COUNT 0x45A0000C -+ #define DMA0_CURRENT_BYTE 0x45A00018 -+ -+ printf("Test to top of 1st SDRAM" ); -+ #define BLOCK_BYTES 0x20000 -+ #define SDRAM_STOP SDRAM_TOP -+ -+ for (iteration=0; 1; iteration++) { -+ -+ if ((iteration % 5)==0) -+ printf("Iteration %d\n", iteration ); -+ -+// printf("Write pattern into first block.\n" ); -+ end_addr = SDRAM_BASE + BLOCK_BYTES; -+ for (i=SDRAM_BASE; i < end_addr; i=i+4) { -+ SDRAM_WRITE( i, i); -+ } -+ -+// printf("Clear last block and a few blocks more - easy to see on LA.\n" ); -+ end_addr = SDRAM_BASE + (BLOCK_BYTES << 3); -+ for (i=SDRAM_STOP - BLOCK_BYTES; i < end_addr; i=i+4) { -+ SDRAM_WRITE( i, 0); -+ } -+ -+ end_addr = SDRAM_STOP - BLOCK_BYTES; -+ for (i=SDRAM_BASE; i < end_addr; i=i+BLOCK_BYTES) { -+ -+// printf("DMA transfer from %08x to %08x.\n", i, i + BLOCK_BYTES ); -+#ifdef ARM -+ DMAMemCopy ( 0, i, i + BLOCK_BYTES, BLOCK_BYTES ); -+#endif -+// printf("...pending.\n" ); -+#ifdef ARM -+ WaitWhileDMABusy( 0 ); -+#endif -+// printf("...complete.\n" ); -+ } -+ -+// printf("Verify pattern in last block.\n" ); -+ end_addr = SDRAM_STOP; -+ correct_data = SDRAM_BASE; -+ for (i=SDRAM_STOP - BLOCK_BYTES; i < end_addr; i=i+4) { -+ SDRAM_READ( i, &read_data); -+ if (read_data != correct_data) -+ { -+ /* Expand out the report_err function to avoid the stack operations. */ -+ #ifdef ARM -+ /* ASSERT GPIO */ -+ * (volatile unsigned int *) GPIOB_SET_OUTPUT = GPIOB_BIT_34; -+ #endif -+ -+ /* REPORT ERROR */ -+ printf("Wrong on [%08x]= %08x should be %08x on iteration %d\n", i, read_data, correct_data, iteration ); -+ -+ /* WRITE TO ANOTHER LOCATION */ -+ SDRAM_WRITE(SDRAM_BASE, 0xFFFFFFFF); -+ -+ /* READ AGAIN */ -+ SDRAM_READ(i, &read_data); -+ if (read_data != correct_data) -+ printf("Again 1 [%08x]= %08x should be %08x\n", i, read_data, correct_data ); -+ -+ /* WRITE TO ANOTHER LOCATION */ -+ SDRAM_WRITE(SDRAM_BASE, 0xFFFFFFFF); -+ -+ /* READ AGAIN */ -+ SDRAM_READ(i, &read_data); -+ if (read_data != correct_data) -+ printf("Again 2 [%08x]= %08x should be %08x\n", i, read_data, correct_data ); -+ -+ /* WRITE TO ANOTHER LOCATION */ -+ SDRAM_WRITE(SDRAM_BASE, 0xFFFFFFFF); -+ -+ /* READ AGAIN */ -+ SDRAM_READ(i, &read_data); -+ if (read_data != correct_data) -+ printf("Again 3 [%08x]= %08x should be %08x\n", i, read_data, correct_data ); -+ -+ row = (((i >> 26) & 0x1) << 13) | (((i >> 23) & 0x3) << 11) | ((i >> 10) & 0x7FF); /* [26], [24:23], [20:10]*/ -+ col = (((i >> 27) & 0x1) << 10) | (((i >> 25) & 0x1) << 9) | (((i >> 22) & 0x1) << 8); /* [27], [25], [22]... */ -+ col |= (((i >> 6) & 0xF) << 4) | (((i >> 21) & 0x1) << 3) | (((i >> 1) & 0x3) << 1); /* ...[9:8], [21], [3:2], '0' */ -+ col |= 0x800; /* bit 11 set for auto-precharge */ -+ bank = (i >> 4) & 0x3; /* [5:4] */ -+ printf("Bank %08x\n", bank ); -+ printf("Row %08x\n", row ); -+ printf("Column %08x\n", col ); -+ #ifdef ARM -+ /* DEASSERT GPIO */ -+ * (volatile unsigned int *) GPIOB_CLEAR_OUTPUT = GPIOB_BIT_34; -+ #endif -+ } -+ -+ -+ correct_data += 4; -+ } -+ } -+ -+ -+ /* ******************************************************************* */ -+ printf("MEM_TEST2\n"); -+ /* ******************************************************************* */ -+ -+ -+ pattype=0; -+ iteration=0; -+ -+ for (;;) { -+ /* FOR EACH 64Kword==256KB BLOCK IN 16Mword=64MB (2 OFF 16M16) MEMORY... */ -+ -+#ifdef SHORT -+ if ((iteration % 5)==0) -+ printf("Iteration %d\n", iteration ); -+#else -+ if ((iteration % 1000)==0) -+ printf("Iteration %d\n", iteration ); -+#endif -+ -+ /* WRITE DATA BLOCKS */ -+ starting_pattype = pattype; /* Record for later */ -+ -+ for (block_base=SDRAM_BASE; block_base < SDRAM_TOP; block_base=block_base + BLOCKSIZE) { -+ switch (pattype) { -+ case PATTYPE_A5 : -+ /* Write alternating 1s and 0s... */ -+ end_addr = block_base + BLOCKWORDS; -+ for (i=block_base; i < end_addr; i=i+4) { -+ SDRAM_WRITE( i, 0xaa55aa55); -+ } -+ break; -+ case PATTYPE_5A : -+ /* Write alternating 1s and 0s (inverse of above)... */ -+ end_addr = block_base + BLOCKWORDS; -+ for (i=block_base; i < end_addr; i=i+4) { -+ SDRAM_WRITE( i, 0x55aa55aa); -+ } -+ break; -+ case PATTYPE_NO_FF : -+ /* Write data=address with bit[n+16]=~bit[n]... */ -+ datapattern = 0x0100FEFF; -+ /* In range 0x0100...0xFEFF so that -+ a. temp[15:8] is never 0xFF -+ b. Inverse of temp[15:8] is never 0xFF -+ */ -+ end_addr = block_base + BLOCKWORDS; -+ for (i=block_base; i < end_addr; i=i+4) { -+ SDRAM_WRITE( i, datapattern); -+ datapattern = datapattern + 0xFFFF; -+ } -+ break; -+ case PATTYPE_INCR : -+ /* Write data=address... */ -+ end_addr = block_base + BLOCKSIZE; -+ for (i=block_base; i < end_addr; i=i+4) { -+ SDRAM_WRITE( i, i); -+ } -+ break; -+ case PATTYPE_DECR : -+ /* Write data=~address... */ -+ end_addr = block_base + BLOCKSIZE; -+ for (i=block_base; i < end_addr; i=i+4) { -+ SDRAM_WRITE( i, ~i); -+ } -+ break; -+ } -+ } -+ -+ /* VERIFY DATA BLOCKS */ -+ pattype = starting_pattype; /* Reset to same as for writes */ -+ -+ for (block_base=SDRAM_BASE; block_base < SDRAM_TOP; block_base=block_base + BLOCKSIZE) { -+ switch (pattype) { -+ case PATTYPE_A5 : -+ correct_data = 0xaa55aa55; -+ end_addr = block_base + BLOCKWORDS; -+ for (i=block_base; i < end_addr; i=i+4) { -+ SDRAM_READ( i, &read_data); -+ if (read_data != correct_data) -+ report_err(i, read_data, correct_data, iteration); -+ } -+ break; -+ case PATTYPE_5A : -+ correct_data = 0x55aa55aa; -+ end_addr = block_base + BLOCKWORDS; -+ for (i=block_base; i < end_addr; i=i+4) { -+ SDRAM_READ( i, &read_data); -+ if (read_data != correct_data) -+ report_err(i, read_data, correct_data, iteration); -+ } -+ break; -+ case PATTYPE_NO_FF : -+ correct_data = 0x0100FEFF; -+ end_addr = block_base + BLOCKWORDS; -+ for (i=block_base; i < end_addr; i=i+4) { -+ SDRAM_READ( i, &read_data); -+ if (read_data != correct_data) -+ report_err(i, read_data, correct_data, iteration); -+ correct_data = correct_data + 0xFFFF; -+ } -+ break; -+ case PATTYPE_INCR : -+ end_addr = block_base + BLOCKSIZE; -+ for (i=block_base; i < end_addr; i=i+4) { -+ SDRAM_READ( i, &read_data); -+ if (read_data != i) -+ report_err(i, read_data, i, iteration); -+ } -+ break; -+ case PATTYPE_DECR : -+ end_addr = block_base + BLOCKSIZE; -+ for (i=block_base; i < end_addr; i=i+4) { -+ SDRAM_READ( i, &read_data); -+ if (read_data != ~i) -+ report_err(i, read_data, ~i, iteration); -+ } -+ break; -+ } -+ } -+ -+ pattype = pattype + 1; -+ if (pattype >= NUM_PATTYPES) { pattype = 0; } -+ ++iteration; -+ } -+ -+ return 0; -+} -+ -+/********************* REPORT ERROR FUNC ********************************************************/ -+ -+void report_err(unsigned int address, unsigned int bad_data, unsigned int correct_data, unsigned int iteration) -+{ -+ volatile unsigned int readvalue; -+ -+#ifdef ARM -+ /* ASSERT GPIO */ -+ * (volatile unsigned int *) GPIOB_SET_OUTPUT = GPIOB_BIT_34; -+#endif -+ -+ /* REPORT ERROR */ -+ printf("Wrong on [%08x]= %08x should be %08x on iteration %d\n", address, bad_data, correct_data, iteration ); -+ -+ /* WRITE TO ANOTHER LOCATION */ -+ SDRAM_WRITE(SDRAM_BASE, 0xFFFFFFFF); -+ -+ /* READ AGAIN */ -+ SDRAM_READ(address, &readvalue); -+ if (readvalue != correct_data) -+ printf("Again 1 [%08x]= %08x should be %08x\n", address, readvalue, correct_data ); -+ -+ /* WRITE TO ANOTHER LOCATION */ -+ SDRAM_WRITE(SDRAM_BASE, 0xFFFFFFFF); -+ -+ /* READ AGAIN */ -+ SDRAM_READ(address, &readvalue); -+ if (readvalue != correct_data) -+ printf("Again 2 [%08x]= %08x should be %08x\n", address, readvalue, correct_data ); -+ -+ /* WRITE TO ANOTHER LOCATION */ -+ SDRAM_WRITE(SDRAM_BASE, 0xFFFFFFFF); -+ -+ /* READ AGAIN */ -+ SDRAM_READ(address, &readvalue); -+ if (readvalue != correct_data) -+ printf("Again 3 [%08x]= %08x should be %08x\n", address, readvalue, correct_data ); -+ -+#ifdef ARM -+ /* DEASSERT GPIO */ -+ * (volatile unsigned int *) GPIOB_CLEAR_OUTPUT = GPIOB_BIT_34; -+#endif -+ -+} /* end of report_err */ -+ -+ -+ -+ -+/********************* DMA.C FUNCTIONS ********************************************************/ -+ -+void ResetDMA( UINT channel ) { -+ -+ // Clear and abort the dma channel -+ -+ volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5)); -+ dma[0] = (1 << 12); -+ dma[0] &= ~(1 << 12); -+} -+ -+ -+ -+ -+void PauseDMA( UINT channel ) { -+ -+ // Pause the DMA channel specified -+ -+ volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5)); -+ UINT rd; -+ -+ rd = dma[0]; -+ -+ rd |= DMA_PAUSE; -+ -+ dma[0] = rd; -+} -+ -+ -+ -+ -+void UnPauseDMA( UINT channel ) { -+ -+ // UnPause the DMA channel specified -+ -+ volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5)); -+ UINT rd; -+ -+ rd = dma[0]; -+ -+ rd &= ~DMA_PAUSE; -+ -+ dma[0] = rd; -+} -+ -+ -+ -+ -+void SetupDMA( UINT channel, -+ UINT src_addr, -+ UINT dest_addr, -+ UINT byte_count, -+ UINT control, -+ UINT flags ) { -+ -+ // Configure a DMA -+ -+ volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5)); -+ -+ dma[0] = control; -+ dma[1] = src_addr; -+ dma[2] = dest_addr; -+ dma[3] = byte_count | (flags & 0xF0000000); -+} -+ -+// EXAMPLE: -+// -+// DMA 2kB from SRAM to SATA core with a write EOT set, and HBURST enabled, using DMA channel 2 -+// Then wait for the DMA to complete -+// -+// SetupDMA ( 2 , 0x4C001100, BASE_SATA, 2048, DMA_CTRL_MEM_TO_SATA, WR_EOT | DMA_HBURST_EN ); -+// WaitWhileDMABusy( 2 ); -+ -+int DMABusy(UINT channel) -+{ -+ volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5)); -+ return (dma[0] & DMA_IN_PROGRESS ? 1 : 0); -+} -+ -+ -+void WaitWhileDMABusy( UINT channel ) // Wait while the given DMA channel is busy -+{ -+ volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5)); -+ while (dma[0] & DMA_IN_PROGRESS) ; // Do Nothing -+} -+ -+void DMAClearIRQ(UINT channel) -+{ -+ volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5)); -+ dma[4] = 1; // write any value to offset 0x10 (16 / 4 => 4) -+ -+} -+ -+void DMAMemCopy ( UINT channel, -+ UINT src_addr, -+ UINT dest_addr, -+ UINT byte_count ) { -+ -+ // Perform a memory to memory copy -+ -+ volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5)); -+ -+ // Choose fastest configuration possible for required transfer -+ -+ if (src_addr < SRAM_BASE) { -+ if (dest_addr < SRAM_BASE) { -+ dma[0] = DMA_CTRL_MEM_TO_MEM_AA; // Src and Dest must use A -+ } else { -+ dma[0] = DMA_CTRL_MEM_TO_MEM_AB; // Src must use A -+ } -+ } else { -+ if (dest_addr < SRAM_BASE) { -+ dma[0] = DMA_CTRL_MEM_TO_MEM_BA; // Dest must use A -+ } else { -+ dma[0] = DMA_CTRL_MEM_TO_MEM_AB; // No restriction -+ } -+ } -+ -+ dma[1] = src_addr; -+ dma[2] = dest_addr; -+ dma[3] = byte_count | DMA_WR_BUFFERABLE | DMA_HBURST_EN; -+ -+ WaitWhileDMABusy( channel ); -+} -+ -+ -+ -+ -+ -+ -+ -+#define CP15R1_M_ENABLE 0x0001 // MMU Enable -+#define CP15R1_A_ENABLE 0x0002 // Address alignment fault enable -+#define CP15R1_C_ENABLE 0x0004 // (data) cache enable -+#define CP15R1_W_ENABLE 0x0008 // write buffer enable -+#define CP15R1_PROG32 0x0010 // PROG32 -+#define CP15R1_DATA32 0x0020 // DATA32 -+#define CP15R1_L_ENABLE 0x0040 // Late abort on earlier CPUs -+#define CP15R1_BIGEND 0x0080 // Big-endian (=1), little-endian (=0) -+#define CP15R1_SYSTEM 0x0100 // System bit, modifies MMU protections -+#define CP15R1_ROM 0x0200 // ROM bit, modifies MMU protections -+#define CP15R1_F 0x0400 // Should Be Zero -+#define CP15R1_Z_ENABLE 0x0800 // Branch prediction enable on 810 -+#define CP15R1_I_ENABLE 0x1000 // Instruction cache enable -+#define CP15R1_RESERVED 0x00000078 -+#define CP15R2_RESERVED 0xFFFFC000 -+ -+#define NUM_DOMAINS 16 -+ -+#define DAV_NO_ACCESS 0 -+#define DAV_CLIENT 1 -+#define DAV_RESERVED 2 -+#define DAV_MANAGER 3 -+#define NUM_DOMAIN_ACCESS_VALUES 4 -+ -+#define AP_LEVEL_0 0 -+#define AP_LEVEL_1 0 -+#define AP_LEVEL_2 0 -+#define AP_LEVEL_3 0 -+#define NUM_ACCESS_PERMISSIONS 4 -+ -+#define FAULT_ID 0 -+ -+#define FLD_COURSE_ID 1 -+#define FLD_SECTION_ID 2 -+#define FLD_FINE_ID 3 -+ -+#define FD_USER_DATA_BIT 2 -+ -+#define FD_USER_DATA_NUM_BITS 30 -+ -+#define SD_BUFFERABLE_BIT 2 -+#define SD_CACHEABLE_BIT 3 -+#define SD_IMP_BIT 4 -+#define SD_DOMAIN_BIT 5 -+#define SD_AP_BIT 10 -+#define SD_ADDRESS_BIT 20 -+ -+#define SD_DOMAIN_NUM_BITS 4 -+#define SD_AP_NUM_BITS 2 -+ -+void CoPro15Regs_SetCP15Reg1(const unsigned long mask) { -+ asm volatile( -+ "MOV r0, %0;" -+ "MRC p15, 0, r1, c1, c0, 0;" -+ "ORR r1,r1,r0;" -+ "MCR p15, 0, r1, c1, c0, 0;" -+ : -+ : "r" (mask | CP15R1_RESERVED) -+ : "r0","r1"); -+} -+ -+void CoPro15Regs_ClearCP15Reg1(const unsigned long mask) { -+ asm volatile( -+ "MOV r0, %0;" -+ "MRC p15, 0, r1, c1, c0, 0;" -+ "BIC r1,r1,r0;" -+ "MCR p15, 0, r1, c1, c0, 0;" -+ : -+ : "r" (mask) -+ : "r0","r1"); -+} -+ -+unsigned long CoPro15Regs_GetCP15Reg1(const unsigned long mask) { -+ unsigned long value; -+ asm volatile( -+ "MRC p15, 0, r1, c1, c0, 0;" -+ "MOV r0, %1;" -+ "BIC %0,r1,r0; " -+ : "=r" (value) -+ : "r" (mask) -+ : "r0","r1"); -+ return value; -+} -+ -+unsigned long CoPro15Regs_GetCP15Reg2(void) { -+ unsigned long value; -+ asm volatile( -+ "MRC p15, 0, r0, c2, c0, 0;" -+ "MOV %0, r0;" -+ : "=r" (value) -+ : -+ : "r0"); -+ return value & CP15R2_RESERVED; -+} -+ -+unsigned long CoPro15Regs_GetCP15Reg3(void) { -+ unsigned long value; -+ asm volatile( -+ "MRC p15, 0, r0, c3, c0, 0;" -+ "MOV %0, r0;" -+ : "=r" (value) -+ : -+ : "r0"); -+ return value; -+} -+ -+void CoPro15Regs_SetCP15Reg3(unsigned long value) { -+ asm volatile( -+ "MOV r0, %0;" -+ "MCR p15, 0, r0, c3, c0, 0;" -+ : -+ : "r" (value) -+ : "r0"); -+} -+ -+void CoPro15Regs_SetCP15Reg2(unsigned long value) { -+ asm volatile( -+ "MOV r0, %0;" -+ "MCR p15, 0, r0, c2, c0, 0;" -+ : -+ : "r" (value & CP15R2_RESERVED) -+ : "r0"); -+} -+ -+void Cache_CleanDataCache(void) -+{ -+ // Clean the data cache - usually precedes a data cache invalidation. -+ // Forces the data cache content to be written to main memory - only -+ // required if using write-back data cache -+ asm volatile( -+ "MOV r3,pc;" -+ "LDR r1, =0;" -+ " MOV r4,pc;" -+ " LDR r0, =0;" -+ " ORR r2, r1, r0;" -+ " MCR p15, 0, r2, c7, c10, 2 ;" // I (BHC) think that this should be c10, 2 not c14, 1 -- See ARM ARM -+ " ADD r0, r0, #0x10;" -+ " CMP r0,#0x40;" -+ " BXNE r4;" -+ " ADD r1, r1, #0x04000000;" -+ " CMP r1, #0x0;" -+ "BXNE r3;" -+ : -+ : -+ : "r0","r1","r2","r3","r4"); -+} -+ -+void Cache_DrainWriteBuffer(void) -+{ -+ // Forces the write buffer to update to main memory -+ asm volatile( -+ "LDR r1, =0;" -+ "MCR p15, 0, r1, c7, c10, 4 ;" -+ : -+ : -+ : "r1"); -+} -+ -+void Cache_FlushPrefetchBuffer(void) -+{ -+ // Forces the CPU to flush the instruction prefetch buffer -+ asm volatile( -+ "LDR r1, =0;" -+ "MCR p15, 0, r1, c7, c5, 4 ;" -+ : -+ : -+ : "r1"); -+} -+ -+void Cache_InvalidateDataCache(void) -+{ -+ asm volatile( -+ "LDR r1, =0;" -+ "MCR p15, 0, r1, c7, c6, 0;" -+ : -+ : -+ : "r1"); -+} -+ -+void Cache_InvalidateInstructionCache(void) -+{ -+ asm volatile( -+ "LDR r1, =0;" -+ "MCR p15, 0, r1, c7, c5, 0;" -+ : -+ : -+ : "r1"); -+} -+ -+void Cache_InstOn(void) -+{ -+ // Invalidate the instruction cache, in case there's anything -+ // left from when it was last enabled -+ Cache_InvalidateInstructionCache(); -+ -+ // Enable the instruction cache -+ CoPro15Regs_SetCP15Reg1(CP15R1_I_ENABLE); -+} -+ -+void Cache_InstOff(void) -+{ -+ // Disable the instruction cache -+ CoPro15Regs_ClearCP15Reg1(CP15R1_I_ENABLE); -+} -+ -+void Cache_DataOn(void) -+{ -+ // Invalidate the data cache, in case there's anything left from when -+ // it was last enabled -+ Cache_InvalidateDataCache(); -+ -+ // Enable the data cache -+ CoPro15Regs_SetCP15Reg1(CP15R1_C_ENABLE); -+} -+ -+void Cache_DataOff(void) -+{ -+ // Ensure all data in data cache or write buffer is written to memory -+ Cache_CleanDataCache(); -+ Cache_DrainWriteBuffer(); -+ -+ // Disable the data cache -+ CoPro15Regs_ClearCP15Reg1(CP15R1_C_ENABLE); -+} -+ -+void Cache_WriteBufferOn(void) -+{ -+ // Enable the write buffer -+ CoPro15Regs_SetCP15Reg1(CP15R1_W_ENABLE); -+} -+ -+void Cache_WriteBufferOff(void) -+{ -+ // Ensure all data in the write buffer is written to memory -+ Cache_DrainWriteBuffer(); -+ -+ // Disable the write buffer -+ CoPro15Regs_ClearCP15Reg1(CP15R1_W_ENABLE); -+} -+ -+int MMU_SetDomainAccessValue( -+ int domainNumber, -+ int value) { -+ int status = 0; -+ if ((value < NUM_DOMAIN_ACCESS_VALUES) && (domainNumber < NUM_DOMAINS)) -+ { -+ // Insert the 2-bit domain field into the slot for the specified domain -+ unsigned long registerContents = CoPro15Regs_GetCP15Reg3(); -+ registerContents &= ~(3UL << (2*domainNumber)); -+ registerContents |= ((unsigned long)value << (2*domainNumber)); -+ CoPro15Regs_SetCP15Reg3(registerContents); -+ status = 1; -+ } -+ return status; -+} -+ -+void MMU_SetAlignmentChecked(int alignmentChecked) { -+ alignmentChecked ? CoPro15Regs_SetCP15Reg1(CP15R1_A_ENABLE) : CoPro15Regs_ClearCP15Reg1(CP15R1_A_ENABLE); -+} -+ -+void MMU_SetEnabled(int enabled) { -+ enabled ? CoPro15Regs_SetCP15Reg1(CP15R1_M_ENABLE) : CoPro15Regs_ClearCP15Reg1(CP15R1_M_ENABLE); -+} -+void MMU_InvalidateDataTLB(void) -+{ -+ asm volatile( -+ "MCR p15, 0, r0, c8, c6, 0;" -+ : -+ : -+ : "r0"); -+} -+ -+void MMU_InvalidateInstructionTLB(void) -+{ -+ asm volatile( -+ "MCR p15, 0, r0, c8, c5, 0;" -+ : -+ : -+ : "r0"); -+} -+ -+void MMU_SetROMPermission(int rOM_Permitted) { -+ rOM_Permitted ? CoPro15Regs_SetCP15Reg1(CP15R1_ROM) : CoPro15Regs_ClearCP15Reg1(CP15R1_ROM); -+} -+ -+void MMU_SetSystemPermission(int systemPermitted) { -+ systemPermitted ? CoPro15Regs_SetCP15Reg1(CP15R1_SYSTEM) : CoPro15Regs_ClearCP15Reg1(CP15R1_SYSTEM); -+} -+ -+void MMU_SetTranslationTableBaseAddress(unsigned long *baseAddress) { -+ CoPro15Regs_SetCP15Reg2((unsigned long)baseAddress); -+} -+ -+unsigned long SetBit( -+ unsigned long source, -+ int state, -+ int offset) -+{ -+ source = state ? (source | (1UL << offset)) : -+ (source & ~(1UL << offset)); -+ return source; -+} -+ -+unsigned long SetField( -+ unsigned long source, -+ unsigned long newFieldContents, -+ int offset, -+ int length) -+{ -+ unsigned long mask = (1UL << length) - 1; -+ source &= ~(mask << offset); -+ source |= ((newFieldContents & mask) << offset); -+ return source; -+} -+ -+unsigned long FD_SetUserData( -+ unsigned long userData, -+ unsigned long descriptor) -+{ -+ return SetField(descriptor, userData, FD_USER_DATA_BIT, FD_USER_DATA_NUM_BITS); -+} -+ -+unsigned long FLPT_CreateFaultDescriptor(unsigned long userData) -+{ -+ unsigned long descriptor = FAULT_ID; -+ descriptor = FD_SetUserData(userData, descriptor); -+ return descriptor; -+} -+ -+void FLPT_InsertFaultDescriptor( -+ unsigned long *tableBaseAdr, -+ int index, -+ unsigned long descriptor) -+{ -+ *(tableBaseAdr + index) = descriptor; -+} -+ -+unsigned long SD_SetAccessPermission( -+ int ap, -+ unsigned long descriptor) -+{ -+ return SetField(descriptor, ap, SD_AP_BIT, SD_AP_NUM_BITS); -+} -+ -+unsigned long SD_SetBaseAddress( -+ unsigned long baseAddress, -+ unsigned long descriptor) -+{ -+ unsigned long mask = ~0UL << SD_ADDRESS_BIT; -+ baseAddress &= mask; -+ descriptor &= ~mask; -+ descriptor |= baseAddress; -+ return descriptor; -+} -+ -+unsigned long SD_SetBufferable( -+ int bufferable, -+ unsigned long descriptor) -+{ -+ return SetBit(descriptor, bufferable, SD_BUFFERABLE_BIT); -+} -+ -+unsigned long SD_SetCacheable( -+ int cacheable, -+ unsigned long descriptor) -+{ -+ return SetBit(descriptor, cacheable, SD_CACHEABLE_BIT); -+} -+ -+unsigned long SD_SetDomain( -+ int domain, -+ unsigned long descriptor) -+{ -+ return SetField(descriptor, domain, SD_DOMAIN_BIT, SD_DOMAIN_NUM_BITS); -+} -+ -+unsigned long SD_SetImplementationDefined( -+ unsigned long implementationDefined, -+ unsigned long descriptor) -+{ -+ return SetBit(descriptor, implementationDefined, SD_IMP_BIT); -+} -+ -+unsigned long FLPT_CreateSectionDescriptor( -+ unsigned long baseAddress, -+ unsigned char domain, -+ int implementationDefined, -+ int ap, -+ int bufferable, -+ int cacheable) -+{ -+ unsigned long descriptor = FLD_SECTION_ID; -+ descriptor = SD_SetAccessPermission(ap, descriptor); -+ descriptor = SD_SetBaseAddress(baseAddress, descriptor); -+ descriptor = SD_SetBufferable(bufferable, descriptor); -+ descriptor = SD_SetCacheable(cacheable, descriptor); -+ descriptor = SD_SetDomain(domain, descriptor); -+ descriptor = SD_SetImplementationDefined(implementationDefined, descriptor); -+ return descriptor; -+} -+ -+void FLPT_InsertSectionDescriptor( -+ unsigned long *tableBaseAdr, -+ int index, -+ unsigned long descriptor) -+{ -+ *(tableBaseAdr + index) = descriptor; -+} -+ -+void FLPT_Zeroise( -+ unsigned long *base_adr, -+ int numberOfdescriptors) { -+ unsigned long faultDescriptor = FLPT_CreateFaultDescriptor(0); -+ int i; -+ for (i=0; i < numberOfdescriptors; i++) { -+ FLPT_InsertFaultDescriptor(base_adr, i, faultDescriptor); -+ } -+} -+ -+void configure_caches(void) -+{ -+ // Disable caches -+// Cache_DataOff(); -+printf("1"); -+ Cache_InstOff(); -+// Cache_WriteBufferOff(); -+ -+ // Disable MMU -+printf("2"); -+ MMU_SetEnabled(0); -+printf("3"); -+ MMU_InvalidateDataTLB(); -+printf("4"); -+ MMU_InvalidateInstructionTLB(); -+ -+ // Setup the MMU -+printf("5"); -+ MMU_SetAlignmentChecked(1); -+printf("6"); -+ MMU_SetROMPermission(0); -+printf("7"); -+ MMU_SetSystemPermission(1); -+ -+ // Allow client access to all protection domains -+ int i; -+ for (i=0; i < NUM_DOMAINS; i++) { -+ MMU_SetDomainAccessValue(i, DAV_CLIENT); -+ } -+printf("8"); -+ -+ // Allocate first level page table, which we'll populate only with section -+ // descriptors, which cover 1MB each. Table must be aligned to a 16KB -+ // boundary. -+ // We'll put it 4KB into the SRAM and it will occupy: -+ // 64 entries for SDRAM -+ // 1 entry for SRAM -+ // 16 entries for APB bridge A -+ // 16 entries for APB bridge B -+ // The largest memory address we need to map is that of the SRAM at -+ // 0x4c000000 -> (4c000000/2^20)*4 = offset 1300h from table start -> -+ // require at least 1300h/4 +1 entries in table = 1217 -+ unsigned long *firstLevelPageTableBaseAdr = (unsigned long*)SRAM_BASE; -+ FLPT_Zeroise(firstLevelPageTableBaseAdr, 4096); -+printf("9"); -+ -+ // Map entire adr space uncached, unbuffered, read/write, virtual == physical -+ unsigned megabytesPresent = 4096; -+ unsigned index = 0; -+ for (i=0; i < megabytesPresent; i++) { -+ FLPT_InsertSectionDescriptor( -+ firstLevelPageTableBaseAdr, -+ index, -+ FLPT_CreateSectionDescriptor( -+ index * 1024 * 1024, // Base address -+ 0, // Domain number -+ 0, // Implementation defined -+ AP_LEVEL_1, // Access permissions -+ 0, // Bufferable -+ 0)); // Cacheable -+ -+ ++index; -+ } -+printf("10"); -+ -+ // Map SDRAM as cached and buffered, read/write, virtual == physical -+ megabytesPresent = 64; -+ index = PHYS_SDRAM_1_PA / (1024 * 1024); -+ for (i=0; i < megabytesPresent; i++) { -+ FLPT_InsertSectionDescriptor( -+ firstLevelPageTableBaseAdr, -+ index, -+ FLPT_CreateSectionDescriptor( -+ index * 1024 * 1024, // Base address -+ 0, // Domain number -+ 0, // Implementation defined -+ AP_LEVEL_1, // Access permissions -+ 1, // Bufferable -+ 1)); // Cacheable -+ -+ ++index; -+ } -+printf("11"); -+ -+ // Map SRAM as cached and buffered, read/write, virtual == physical -+ megabytesPresent = 1; // Actually only 32KB -+ index = SRAM_BASE / (1024 * 1024); -+ for (i=0; i < megabytesPresent; i++) { -+ FLPT_InsertSectionDescriptor( -+ firstLevelPageTableBaseAdr, -+ index, -+ FLPT_CreateSectionDescriptor( -+ index * 1024 * 1024, // Base address -+ 0, // Domain number -+ 0, // Implementation defined -+ AP_LEVEL_1, // Access permissions -+ 1, // Bufferable -+ 1)); // Cacheable -+ -+ ++index; -+ } -+printf("12"); -+ -+ // Map APB bridge A address space as uncached, unbuffered, read/write, -+ // virtual == physical -+ megabytesPresent = 16; -+ index = APB_BRIDGE_A_BASE_PA / (1024 * 1024); -+ for (i=0; i < megabytesPresent; i++) { -+ FLPT_InsertSectionDescriptor( -+ firstLevelPageTableBaseAdr, -+ index, -+ FLPT_CreateSectionDescriptor( -+ index * 1024 * 1024, // Base address -+ 0, // Domain number -+ 0, // Implementation defined -+ AP_LEVEL_1, // Access permissions -+ 0, // Bufferable -+ 0)); // Cacheable -+ -+ ++index; -+ } -+printf("13"); -+ -+ // Map APB bridge B address space as uncached, unbuffered, read/write, -+ // virtual == physical -+ megabytesPresent = 16; -+ index = APB_BRIDGE_B_BASE_PA / (1024 * 1024); -+ for (i=0; i < megabytesPresent; i++) { -+ FLPT_InsertSectionDescriptor( -+ firstLevelPageTableBaseAdr, -+ index, -+ FLPT_CreateSectionDescriptor( -+ index * 1024 * 1024, // Base address -+ 0, // Domain number -+ 0, // Implementation defined -+ AP_LEVEL_1, // Access permissions -+ 0, // Bufferable -+ 0)); // Cacheable -+ -+ ++index; -+ } -+printf("14"); -+ -+ // Load base address of first level page table -+ MMU_SetTranslationTableBaseAddress(firstLevelPageTableBaseAdr); -+printf("15"); -+ -+ // Enable MMU -+ MMU_SetEnabled(1); -+printf("16"); -+ -+ // Enable caches -+ Cache_DataOn(); -+printf("17"); -+ Cache_InstOn(); -+printf("18"); -+ Cache_WriteBufferOn(); -+printf("19"); -+} -+ -diff -Nurd u-boot-1.1.2/include/asm-arm/barrier.h u-boot-1.1.2-oxe810/include/asm-arm/barrier.h ---- u-boot-1.1.2/include/asm-arm/barrier.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/include/asm-arm/barrier.h 2008-06-11 17:55:08.000000000 +0200 -@@ -0,0 +1,25 @@ -+#if !defined(__BARRIER_H__) -+#define __BARRIER_H__ -+ -+static inline void rmb(void) -+{ -+ asm volatile ("" : : : "memory"); -+} -+ -+/* -+ * wmb() Would normally need to ensure shared memory regions are marked as -+ * non-cacheable and non-bufferable, then the work to be done by wmb() is -+ * to ensure the compiler and any possible CPU out of order writes are -+ * flushed to memory, however we have no data cache and as far as I'm -+ * aware we can't use the MMU to set page properties, so in our case wmb() -+ * must cause the compiler to flush. -+ */ -+ -+static inline void wmb(void) -+{ -+ // Cause the compiler to flush any registers containing pending write data -+ // to memory -+ asm volatile ("" : : : "memory"); -+ -+} -+#endif // #if !defined(__BARRIER_H__) -diff -Nurd u-boot-1.1.2/include/asm-arm/global_data.h u-boot-1.1.2-oxe810/include/asm-arm/global_data.h ---- u-boot-1.1.2/include/asm-arm/global_data.h 2003-10-10 12:05:43.000000000 +0200 -+++ u-boot-1.1.2-oxe810/include/asm-arm/global_data.h 2008-06-11 17:55:08.000000000 +0200 -@@ -61,6 +61,7 @@ - #define GD_FLG_DEVINIT 0x00002 /* Devices have been initialized */ - #define GD_FLG_SILENT 0x00004 /* Silent mode */ - --#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8") -+#define DECLARE_GLOBAL_DATA_PTR register gd_t* volatile gd asm ("r8"); - - #endif /* __ASM_GBL_DATA_H */ -+ -diff -Nurd u-boot-1.1.2/include/asm-arm/mach-types.h u-boot-1.1.2-oxe810/include/asm-arm/mach-types.h ---- u-boot-1.1.2/include/asm-arm/mach-types.h 2004-10-10 20:41:14.000000000 +0200 -+++ u-boot-1.1.2-oxe810/include/asm-arm/mach-types.h 2008-06-11 17:55:08.000000000 +0200 -@@ -624,6 +624,7 @@ - #define MACH_TYPE_RMS100 611 - #define MACH_TYPE_KB9200 612 - #define MACH_TYPE_SX1 613 -+#define MACH_TYPE_OXNAS 1152 - - #ifdef CONFIG_ARCH_EBSA110 - # ifdef machine_arch_type -@@ -7945,6 +7946,18 @@ - # define machine_is_sx1() (0) - #endif - -+#ifdef CONFIG_MACH_OXNAS -+# ifdef machine_arch_type -+# undef machine_arch_type -+# define machine_arch_type __machine_arch_type -+# else -+# define machine_arch_type MACH_TYPE_OXNAS -+# endif -+# define machine_is_oxnas() (machine_arch_type == MACH_TYPE_OXNAS) -+#else -+# define machine_is_oxnas() (0) -+#endif -+ - /* - * These have not yet been registered - */ -diff -Nurd u-boot-1.1.2/include/asm-arm/u-boot.h u-boot-1.1.2-oxe810/include/asm-arm/u-boot.h ---- u-boot-1.1.2/include/asm-arm/u-boot.h 2002-11-03 01:33:10.000000000 +0100 -+++ u-boot-1.1.2-oxe810/include/asm-arm/u-boot.h 2008-06-11 17:55:08.000000000 +0200 -@@ -41,6 +41,8 @@ - ulong start; - ulong size; - } bi_dram[CONFIG_NR_DRAM_BANKS]; -+ unsigned long bi_sramstart; /* start of SRAM memory */ -+ unsigned long bi_sramsize; /* size of SRAM memory */ - } bd_t; - - #define bi_env_data bi_env->data -diff -Nurd u-boot-1.1.2/include/ata.h u-boot-1.1.2-oxe810/include/ata.h ---- u-boot-1.1.2/include/ata.h 2004-03-14 23:25:50.000000000 +0100 -+++ u-boot-1.1.2-oxe810/include/ata.h 2008-06-11 17:55:11.000000000 +0200 -@@ -80,7 +80,12 @@ - /* - * Device / Head Register Bits - */ -+#ifdef CONFIG_OXNAS -+#define ATA_DEVICE(x) (0) -+#else - #define ATA_DEVICE(x) ((x & 1)<<4) -+#endif // CONFIG_OXNAS -+ - #define ATA_LBA 0xE0 - - /* -diff -Nurd u-boot-1.1.2/include/cmd_confdefs.h u-boot-1.1.2-oxe810/include/cmd_confdefs.h ---- u-boot-1.1.2/include/cmd_confdefs.h 2004-12-16 18:59:53.000000000 +0100 -+++ u-boot-1.1.2-oxe810/include/cmd_confdefs.h 2008-06-11 17:55:11.000000000 +0200 -@@ -92,6 +92,7 @@ - #define CFG_CMD_XIMG 0x0400000000000000ULL /* Load part of Multi Image */ - #define CFG_CMD_UNIVERSE 0x0800000000000000ULL /* Tundra Universe Support */ - #define CFG_CMD_EXT2 0x1000000000000000ULL /* EXT2 Support */ -+#define CFG_CMD_LEDFAIL 0x2000000000000000ULL /* OXNAS Failure LED support */ - - #define CFG_CMD_ALL 0xFFFFFFFFFFFFFFFFULL /* ALL commands */ - -diff -Nurd u-boot-1.1.2/include/common.h u-boot-1.1.2-oxe810/include/common.h ---- u-boot-1.1.2/include/common.h 2004-12-13 10:49:01.000000000 +0100 -+++ u-boot-1.1.2-oxe810/include/common.h 2008-06-11 17:55:11.000000000 +0200 -@@ -204,7 +204,7 @@ - /* common/cmd_nvedit.c */ - int env_init (void); - void env_relocate (void); --char *getenv (uchar *); -+char *getenv (const uchar *); - int getenv_r (uchar *name, uchar *buf, unsigned len); - int saveenv (void); - #ifdef CONFIG_PPC /* ARM version to be fixed! */ -diff -Nurd u-boot-1.1.2/include/configs/oxnas.h u-boot-1.1.2-oxe810/include/configs/oxnas.h ---- u-boot-1.1.2/include/configs/oxnas.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-oxe810/include/configs/oxnas.h 2008-06-12 13:57:57.000000000 +0200 -@@ -0,0 +1,593 @@ -+/* -+ * (C) Copyright 2005 -+ * Oxford Semiconductor Ltd -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#ifndef __CONFIG_H -+#define __CONFIG_H -+ -+#define readb(p) (*(volatile u8 *)(p)) -+#define readl(p) (*(volatile u32 *)(p)) -+#define writeb(v, p) (*(volatile u8 *)(p)= (v)) -+#define writel(v, p) (*(volatile u32*)(p)=(v)) -+ -+#define CFG_FLASH_EMPTY_INFO -+ -+/** -+ * Architecture -+ */ -+#define CONFIG_ARM926EJS 1 -+#define CONFIG_OXNAS 1 -+#define CONFIG_OXNAS_ENABLE_PCI /* Enables PCI clock and takes out of reset - needed if require access to static bus */ -+#define CONFIG_OXNAS_FEEDBACK_PCI_CLKS /* Feedback PCI clock out 3 to drive PCI core clock - needed if require access to static bus */ -+#define CONFIG_OXNAS_MANUAL_STATIC_ARBITRATION -+#if (USE_SATA == 1) -+#define CONFIG_OXNAS_USE_SATA /* Define to include support for SATA disks */ -+#if (USE_SATA_ENV == 1) -+#define ENV_ON_SATA /* Define to have the U-Boot env. stored on SATA disk */ -+#endif // USE_SATA_ENV -+#endif // USE_SATA -+#if (USE_FLASH == 0) -+#define CFG_NO_FLASH /* Define to NOT include flash support on static bus*/ -+#endif //USE_FLASH -+ -+/* Won't be using any interrupts */ -+#undef CONFIG_USE_IRQ -+ -+/* Everything, incl board info, in Hz */ -+#undef CFG_CLKS_IN_HZ -+ -+#define CFG_HUSH_PARSER 1 -+#define CFG_PROMPT_HUSH_PS2 "> " -+ -+/* Miscellaneous configurable options */ -+#define CFG_LONGHELP /* undef to save memory */ -+#ifdef CFG_HUSH_PARSER -+#define CFG_PROMPT "$ " /* Monitor Command Prompt */ -+#else -+#define CFG_PROMPT "# " /* Monitor Command Prompt */ -+#endif -+#define CFG_CBSIZE 256 /* Console I/O Buffer Size */ -+ -+/* Print Buffer Size */ -+#define CFG_PBSIZE ((CFG_CBSIZE)+sizeof(CFG_PROMPT)+16) -+#define CFG_MAXARGS 16 /* max number of command args */ -+#define CFG_BARGSIZE (CFG_CBSIZE) /* Boot Argument Buffer Size */ -+ -+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */ -+#define CONFIG_SETUP_MEMORY_TAGS 1 -+#define CONFIG_MISC_INIT_R 1 /* call misc_init_r during start up */ -+#define CONFIG_INITRD_TAG 1 /* allow initrd tag to be generated */ -+ -+/* May want to do some setup prior to relocation */ -+#define CONFIG_INIT_CRITICAL -+ -+/* ARM specific late initialisation */ -+#define BOARD_LATE_INIT -+ -+/** -+ * Stack sizes -+ * -+ * The stack sizes are set up in start.S using the settings below -+ */ -+#define CONFIG_STACKSIZE (128*1024) /* regular stack */ -+#ifdef CONFIG_USE_IRQ -+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */ -+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */ -+#endif -+ -+/** -+ * RAM -+ */ -+#define CONFIG_NR_DRAM_BANKS 1 /* We have 1 bank of SDRAM */ -+#define PHYS_SDRAM_1_PA 0x48000000 /* SDRAM Bank #1 */ -+#if (NAS_VERSION == 810) -+#define PHYS_SDRAM_1_MAX_SIZE (256 * 1024 * 1024) -+#endif // NAS_VERSION -+#define CFG_SRAM_BASE ((PHYS_SDRAM_1_PA) + (PHYS_SDRAM_1_MAX_SIZE)) -+#if (NAS_VERSION == 810) -+#define CFG_SRAM_SIZE (128 * 1024) -+#endif // NAS_VERSION -+ -+#define INITIALISE_SDRAM -+ -+/* Default location from which bootm etc will load */ -+#define CFG_LOAD_ADDR (PHYS_SDRAM_1_PA) -+ -+/** -+ * Core addresses -+ */ -+#define MAC_BASE_PA 0x40400000 -+#define STATIC_CS0_BASE_PA 0x41000000 -+#define STATIC_CS1_BASE_PA 0x41400000 -+#define STATIC_CS2_BASE_PA 0x41800000 -+#define STATIC_CONTROL_BASE_PA 0x41C00000 -+#define SATA_DATA_BASE_PA 0x42000000 -+ -+#define APB_BRIDGE_A_BASE_PA 0x44000000 -+#define APB_BRIDGE_B_BASE_PA 0x45000000 -+ -+#define GPIO_1_PA ((APB_BRIDGE_A_BASE_PA) + 0x0) -+#define GPIO_2_PA ((APB_BRIDGE_A_BASE_PA) + 0x100000) -+ -+#define SYS_CONTROL_BASE_PA ((APB_BRIDGE_B_BASE_PA) + 0x0) -+#define DMA_BASE_PA ((APB_BRIDGE_B_BASE_PA) + 0x600000) -+#define RPS_BASE ((APB_BRIDGE_B_BASE_PA) + 0x300000) -+ -+/* Static bus registers */ -+#define STATIC_CONTROL_VERSION ((STATIC_CONTROL_BASE_PA) + 0x0) -+#define STATIC_CONTROL_BANK0 ((STATIC_CONTROL_BASE_PA) + 0x4) -+#define STATIC_CONTROL_BANK1 ((STATIC_CONTROL_BASE_PA) + 0x8) -+#define STATIC_CONTROL_BANK2 ((STATIC_CONTROL_BASE_PA) + 0xC) -+ -+/* Clock to the ARM/DDR */ -+#if (FPGA == 0) -+#define NOMINAL_ARMCLK ((PLL400) / 2) -+#define NOMINAL_SYSCLK ((PLL400) / 4) -+#else // !FPGA -+#define NOMINAL_ARMCLK (FPGA_ARM_CLK) -+#define NOMINAL_SYSCLK ((PLL400) / 4) -+#endif // !FPGA -+ -+/** -+ * Timer -+ */ -+#define CFG_TIMERBASE ((RPS_BASE) + 0x200) -+#define TIMER_PRESCALE_BIT 2 -+#define TIMER_PRESCALE_1_ENUM 0 -+#define TIMER_PRESCALE_16_ENUM 1 -+#define TIMER_PRESCALE_256_ENUM 2 -+#define TIMER_MODE_BIT 6 -+#define TIMER_MODE_FREE_RUNNING 0 -+#define TIMER_MODE_PERIODIC 1 -+#define TIMER_ENABLE_BIT 7 -+#define TIMER_ENABLE_DISABLE 0 -+#define TIMER_ENABLE_ENABLE 1 -+ -+#define TIMER_PRESCALE_ENUM (TIMER_PRESCALE_256_ENUM) -+#define CFG_HZ ((RPSCLK) / 256) -+ -+/** -+ * GPIO -+ */ -+#define GPIO_1_OE ((GPIO_1_PA) + 0x4) -+#define GPIO_1_SET_OE ((GPIO_1_PA) + 0x1C) -+#define GPIO_1_CLR_OE ((GPIO_1_PA) + 0x20) -+ -+#define GPIO_2_OE ((GPIO_2_PA) + 0x4) -+#define GPIO_2_SET_OE ((GPIO_2_PA) + 0x1C) -+#define GPIO_2_CLR_OE ((GPIO_2_PA) + 0x20) -+ -+/** -+ * Serial Configuration -+ */ -+#define EXT_UART_BASE 0x28000000 -+ -+#define UART_1_BASE (APB_BRIDGE_A_BASE_PA + 0x200000) -+#define UART_2_BASE (APB_BRIDGE_A_BASE_PA + 0x300000) -+#define UART_3_BASE (APB_BRIDGE_A_BASE_PA + 0x900000) -+#define UART_4_BASE (APB_BRIDGE_A_BASE_PA + 0xA00000) -+ -+#define CFG_NS16550 1 -+#define CFG_NS16550_SERIAL 1 -+#define CFG_NS16550_REG_SIZE 1 -+ -+#if (USE_EXTERNAL_UART != 0) -+#define CFG_NS16550_CLK 16000000 -+#define CFG_NS16550_COM1 (EXT_UART_BASE) -+#else // USE_EXTERNAL_UART -+#define CFG_NS16550_CLK (NOMINAL_SYSCLK) -+#define USE_UART_FRACTIONAL_DIVIDER -+#if (INTERNAL_UART == 1) -+#define CONFIG_OXNAS_UART1 -+#define CFG_NS16550_COM1 (UART_1_BASE) -+#elif (INTERNAL_UART == 2) -+#define CONFIG_OXNAS_UART2 -+#define CFG_NS16550_COM1 (UART_2_BASE) -+#elif (INTERNAL_UART == 3) -+#define CONFIG_OXNAS_UART3 -+#define CFG_NS16550_COM1 (UART_3_BASE) -+#else -+#define CONFIG_OXNAS_UART4 -+#define CFG_NS16550_COM1 (UART_4_BASE) -+#endif // CONFIG_OXNAS_UART -+#endif // USE_EXTERNAL_UART -+ -+#define CONFIG_CONS_INDEX 1 -+#define CONFIG_BAUDRATE 115200 -+#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } -+ -+/** -+ * Monitor commands -+ */ -+#define BASE_COMMANDS (CFG_CMD_IMI | \ -+ CFG_CMD_IMLS | \ -+ CFG_CMD_BDI | \ -+ CFG_CMD_NET | \ -+ CFG_CMD_PING | \ -+ CFG_CMD_ENV | \ -+ CFG_CMD_RUN | \ -+ CFG_CMD_MEMORY) -+ -+#ifdef CFG_NO_FLASH -+#define FLASH_COMMANDS (BASE_COMMANDS) -+#else -+#define FLASH_COMMANDS (BASE_COMMANDS | CFG_CMD_FLASH) -+#endif // CFG_NO_FLASH -+ -+#ifdef CONFIG_OXNAS_USE_SATA -+#define SATA_COMMANDS (FLASH_COMMANDS | CFG_CMD_IDE | CFG_CMD_EXT2 | CFG_CMD_LEDFAIL) -+#else -+#define SATA_COMMANDS (FLASH_COMMANDS) -+#endif // CONFIG_OXNAS_USE_SATA -+ -+#define CONFIG_COMMANDS SATA_COMMANDS -+ -+/* This must be included AFTER the definition of CONFIG_COMMANDS */ -+#include <cmd_confdefs.h> -+ -+/** -+ * Booting -+ */ -+#if (LINUX_ROOT_RAIDED == 1) -+#define LINUX_ROOT_DEVICE "root=/dev/md1" -+#else -+#define LINUX_ROOT_DEVICE "root=/dev/sda1" -+#endif -+#define CONFIG_BOOTARGS LINUX_ROOT_DEVICE " console=ttyS0,115200 elevator=cfq gmac.mac_adr=0x00,0x30,0xe0,0x00,0x00,0x01" -+ -+#ifdef CONFIG_OXNAS_USE_SATA -+#define CONFIG_BOOTDELAY 2 -+#define CONFIG_BOOTCOMMAND "run select0 load boot || run select0 load2 boot || run lightled select1 load extinguishled boot || run lightled select1 load2 extinguishled boot || lightled" -+#define CONFIG_EXTRA_ENV_SETTINGS \ -+ "select0=ide dev 0\0" \ -+ "select1=ide dev 1\0" \ -+ "load=ide read 0x48500000 12c 1644\0" \ -+ "load2=ide read 0x48500000 2a6e 1644\0" \ -+ "lightled=ledfail 1\0" \ -+ "extinguishled=ledfail 0\0" \ -+ "boot=bootm 48500000\0" -+#else // CONFIG_OXNAS_USE_SATA -+#define CONFIG_BOOTDELAY 15 -+#define CONFIG_BOOTCOMMAND "bootm 0x41020000" -+#endif // CONFIG_OXNAS_USE_SATA -+ -+//#define CONFIG_SHOW_BOOT_PROGRESS 1 -+ -+/** -+ * Networking -+ */ -+#define CONFIG_ETHADDR 00:30:e0:00:00:01 -+#define CONFIG_NETMASK 255.255.0.0 -+#define CONFIG_IPADDR 172.31.0.128 -+#define CONFIG_SERVERIP 172.31.0.100 -+#define CONFIG_BOOTFILE "uImage" -+#define CFG_AUTOLOAD "n" -+#define CONFIG_NET_RETRY_COUNT 30 -+ -+/** -+ * Flash support -+ */ -+#ifndef CFG_NO_FLASH -+ -+#define FORCE_TOP_BOOT_FLASH 1 -+ -+#define CFG_FLASH_CFI 1 -+#define CFG_FLASH_CFI_DRIVER 1 -+ -+#define NUM_FLASH_MAIN_BLOCKS 63 /* For Intel 28F320B3T */ -+#define NUM_FLASH_PARAM_BLOCKS 8 /* For Intel 28F320B3T */ -+#define FLASH_MAIN_BLOCK_SIZE (64*1024) /* For Intel 28F320B3T family */ -+#define FLASH_PARAM_BLOCK_SIZE (8*1024) /* For Intel 28F320B3T family */ -+ -+/* Assuming counts main blocks and parameter blocks, as the Intel/AMD detection */ -+/* I'm intending to copy would seem to indicate */ -+#define CFG_MAX_FLASH_SECT (NUM_FLASH_MAIN_BLOCKS + NUM_FLASH_PARAM_BLOCKS) -+ -+#define CFG_MAX_FLASH_BANKS 1 /* Assume counts flash devices */ -+#define FLASH_BASE_OFF 0 -+#define CFG_FLASH_BASE ((STATIC_CS0_BASE_PA) + (FLASH_BASE_OFF)) -+#define PHYS_FLASH_1 (CFG_FLASH_BASE) -+ -+#define CFG_FLASH_ERASE_TOUT (20*CFG_HZ) /* Timeout for Flash Erase */ -+#define CFG_FLASH_WRITE_TOUT (20*CFG_HZ) /* Timeout for Flash Write */ -+#define CFG_FLASH_WRITE_ATTEMPTS 5 -+ -+#define STATIC_BUS_FLASH_CONFIG 0x4f1f3f3f /* Slow ASIC settings */ -+ -+#endif // !CFG_NO_FLASH -+ -+/** -+ * Environment organization -+ */ -+#ifdef ENV_ON_SATA -+ -+/* Environment on SATA disk */ -+#define SIZE_TO_SECTORS(x) ((x) / 512) -+#define CFG_ENV_IS_IN_DISK -+#define CFG_ENV_SIZE (8*1024) -+#define ENVIRONMENT_OFFSET ((CFG_SRAM_SIZE) - (CFG_ENV_SIZE) - 1024) -+#define CFG_ENV_ADDR ((CFG_SRAM_BASE) + (ENVIRONMENT_OFFSET)) -+#define ROM_LOADER_LOAD_START_SECTOR 1 -+#define CFG_ENV_DISK_SECTOR ((ROM_LOADER_LOAD_START_SECTOR) + SIZE_TO_SECTORS(ENVIRONMENT_OFFSET)) -+#define ROM_LOADER_LOAD_REDUNDANT_START_SECTOR 10608 -+#define CFG_ENV_DISK_REDUNDANT_SECTOR ((ROM_LOADER_LOAD_REDUNDANT_START_SECTOR) + SIZE_TO_SECTORS(ENVIRONMENT_OFFSET)) -+ -+#else -+/** Flash based environment -+ * -+ * It appears that all flash env start/size info. has to be pre-defined. How -+ * this is supposed to work when the flash detection code could cope with all -+ * sorts of different flash is hard to see. -+ * It appears from the README that with bottom/top boot flashes with smaller -+ * parameter blocks available, the environment code will only use a single -+ * one of these smaller sectors for the environment, i.e. CFG_ENV_SECT_SIZE -+ * is the size of the environment. I hope this isn't really true. The defines -+ * below may well not work if this is the truth -+ */ -+#define CFG_ENV_IS_IN_FLASH -+/* Environment in flash device parameter blocks */ -+#define CFG_ENV_SECT_SIZE (8*1024) -+/* First parameter block for environment */ -+#define CFG_ENV_SIZE CFG_ENV_SECT_SIZE -+/* Second parameter block for backup environment */ -+#define CFG_ENV_SIZE_REDUND (CFG_ENV_SIZE) -+/* Main environment occupies first parameter block */ -+#define CFG_ENV_ADDR ((CFG_FLASH_BASE)+((NUM_FLASH_MAIN_BLOCKS)*(FLASH_MAIN_BLOCK_SIZE))) -+/* Backup environment occupies second parameter block */ -+#define CFG_ENV_ADDR_REDUND ((CFG_ENV_ADDR)+(CFG_ENV_SIZE)) -+ -+#endif // ENV_ON_SATA -+ -+#define CONFIG_ENV_OVERWRITE -+ -+/* Magic number that indicates rebooting into upgrade mode */ -+#define UPGRADE_MAGIC 0x31 /* ASCII '1' */ -+ -+/* Magic number that indicates user recovery on reboot */ -+/* Also defined in oxnas_user_recovery.agent */ -+#define RECOVERY_MAGIC 0x31 /* ASCII '1' */ -+ -+/* Magic number that indicates controlled power down on reboot */ -+/* Also defined in controlled_power_down.sh in init.d */ -+#define CONTROLLED_POWER_DOWN_MAGIC 0x31 /* ASCII '1' */ -+ -+/* This flag is set in SRAM location by Co Proc */ -+#define CONTROLLED_POWER_UP_MAGIC 0x31 /* ASCII '1' */ -+/* 9k + a quad from top */ -+/* Be carefule on changing the location of this flag -+ * u-boot has other things to write in SRAM too -+ */ -+#define POWER_ON_FLAG_SRAM_OFFSET 9220 -+ -+/* Size of malloc() pool */ -+#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024) -+#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */ -+ -+/** -+ * ASM startup control -+ */ -+/* Start of address within SRAM of loader's exception table. */ -+/* ROM-based exception table will redirect to here */ -+#define EXCEPTION_BASE (CFG_SRAM_BASE) -+ -+/** -+ * Disk related stuff -+ */ -+#define CONFIG_LBA48 -+#define CONFIG_DOS_PARTITION -+#define CFG_IDE_MAXDEVICE 2 -+#define CFG_IDE_MAXBUS 1 -+#define CONFIG_IDE_PREINIT -+#undef CONFIG_IDE_RESET -+#undef CONFIG_IDE_LED -+#define CFG_ATA_DATA_OFFSET 0 -+#define CFG_ATA_REG_OFFSET 0 -+#define CFG_ATA_ALT_OFFSET 0 -+ -+/** -+ * System block reset and clock control -+ */ -+#define SYS_CTRL_USB11_CTRL (SYS_CONTROL_BASE_PA + 0x00) -+#define SYS_CTRL_PCI_CTRL0 (SYS_CONTROL_BASE_PA + 0x04) -+#define SYS_CTRL_PCI_CTRL1 (SYS_CONTROL_BASE_PA + 0x08) -+#define SYS_CTRL_GPIO_PRIMSEL_CTRL_0 (SYS_CONTROL_BASE_PA + 0x0C) -+#define SYS_CTRL_GPIO_PRIMSEL_CTRL_1 (SYS_CONTROL_BASE_PA + 0x10) -+#define SYS_CTRL_GPIO_SECSEL_CTRL_0 (SYS_CONTROL_BASE_PA + 0x14) -+#define SYS_CTRL_GPIO_SECSEL_CTRL_1 (SYS_CONTROL_BASE_PA + 0x18) -+#define SYS_CTRL_GPIO_TERTSEL_CTRL_0 (SYS_CONTROL_BASE_PA + 0x8C) -+#define SYS_CTRL_GPIO_TERTSEL_CTRL_1 (SYS_CONTROL_BASE_PA + 0x90) -+#define SYS_CTRL_USB11_STAT (SYS_CONTROL_BASE_PA + 0x1c) -+#define SYS_CTRL_PCI_STAT (SYS_CONTROL_BASE_PA + 0x20) -+#define SYS_CTRL_CKEN_SET_CTRL (SYS_CONTROL_BASE_PA + 0x2C) -+#define SYS_CTRL_CKEN_CLR_CTRL (SYS_CONTROL_BASE_PA + 0x30) -+#define SYS_CTRL_RSTEN_SET_CTRL (SYS_CONTROL_BASE_PA + 0x34) -+#define SYS_CTRL_RSTEN_CLR_CTRL (SYS_CONTROL_BASE_PA + 0x38) -+#define SYS_CTRL_PLLSYS_CTRL (SYS_CONTROL_BASE_PA + 0x48) -+#define SYS_CTRL_PLLSYS_KEY_CTRL (SYS_CONTROL_BASE_PA + 0x6C) -+#define SYS_CTRL_GMAC_CTRL (SYS_CONTROL_BASE_PA + 0x78) -+#define SYS_CTRL_UART_CTRL (SYS_CONTROL_BASE_PA + 0x94) -+ -+#define SYS_CTRL_CKEN_COPRO_BIT 0 -+#define SYS_CTRL_CKEN_DMA_BIT 1 -+#define SYS_CTRL_CKEN_DPE_BIT 2 -+#define SYS_CTRL_CKEN_DDR_BIT 3 -+#define SYS_CTRL_CKEN_SATA_BIT 4 -+#define SYS_CTRL_CKEN_I2S_BIT 5 -+#define SYS_CTRL_CKEN_USBHS_BIT 6 -+#define SYS_CTRL_CKEN_MAC_BIT 7 -+#define SYS_CTRL_CKEN_PCI_BIT 8 -+#define SYS_CTRL_CKEN_STATIC_BIT 9 -+#define SYS_CTRL_CKEN_DDR_PHY_BIT 10 -+ -+#define SYS_CTRL_RSTEN_ARM_BIT 0 -+#define SYS_CTRL_RSTEN_COPRO_BIT 1 -+#define SYS_CTRL_RSTEN_USBHS_BIT 4 -+#define SYS_CTRL_RSTEN_USBHSPHY_BIT 5 -+#define SYS_CTRL_RSTEN_MAC_BIT 6 -+#define SYS_CTRL_RSTEN_PCI_BIT 7 -+#define SYS_CTRL_RSTEN_DMA_BIT 8 -+#define SYS_CTRL_RSTEN_DPE_BIT 9 -+#define SYS_CTRL_RSTEN_DDR_BIT 10 -+#define SYS_CTRL_RSTEN_SATA_BIT 11 -+#define SYS_CTRL_RSTEN_SATA_LINK_BIT 12 -+#define SYS_CTRL_RSTEN_SATA_PHY_BIT 13 -+#define SYS_CTRL_RSTEN_STATIC_BIT 15 -+#define SYS_CTRL_RSTEN_GPIO_BIT 16 -+#define SYS_CTRL_RSTEN_UART1_BIT 17 -+#define SYS_CTRL_RSTEN_UART2_BIT 18 -+#define SYS_CTRL_RSTEN_MISC_BIT 19 -+#define SYS_CTRL_RSTEN_I2S_BIT 20 -+#define SYS_CTRL_RSTEN_AHB_MON_BIT 21 -+#define SYS_CTRL_RSTEN_UART3_BIT 22 -+#define SYS_CTRL_RSTEN_UART4_BIT 23 -+#define SYS_CTRL_RSTEN_SGDMA_BIT 24 -+#define SYS_CTRL_RSTEN_DDR_PHY_BIT 25 -+#define SYS_CTRL_RSTEN_BUS_BIT 31 -+ -+#define SYS_CTRL_GMAC_RGMII 2 -+#define SYS_CTRL_GMAC_SIMPLE_MAX 1 -+#define SYS_CTRL_GMAC_CKEN_GTX 0 -+ -+#define SYS_CTRL_CKCTRL_CTRL_ADDR (SYS_CONTROL_BASE_PA + 0x64) -+ -+#define SYS_CTRL_CKCTRL_PCI_DIV_BIT 0 -+#define SYS_CTRL_CKCTRL_SLOW_BIT 8 -+ -+#define SYS_CTRL_UART2_DEQ_EN 0 -+#define SYS_CTRL_UART3_DEQ_EN 1 -+#define SYS_CTRL_UART3_IQ_EN 2 -+#define SYS_CTRL_UART4_IQ_EN 3 -+#define SYS_CTRL_UART4_NOT_PCI_MODE 4 -+ -+#define SYS_CTRL_PCI_CTRL1_PCI_STATIC_RQ_BIT 11 -+ -+/** -+ * SATA related definitions -+ */ -+#define ATA_PORT_CTL 0 -+#define ATA_PORT_FEATURE 1 -+#define ATA_PORT_NSECT 2 -+#define ATA_PORT_LBAL 3 -+#define ATA_PORT_LBAM 4 -+#define ATA_PORT_LBAH 5 -+#define ATA_PORT_DEVICE 6 -+#define ATA_PORT_COMMAND 7 -+ -+#define SATA_0_REGS_BASE (APB_BRIDGE_B_BASE_PA + 0x900000) -+#define SATA_1_REGS_BASE (APB_BRIDGE_B_BASE_PA + 0x910000) -+#define SATA_HOST_REGS_BASE (APB_BRIDGE_B_BASE_PA + 0x9e0000) -+ -+/* The offsets to the SATA registers */ -+#define SATA_ORB1_OFF 0 -+#define SATA_ORB2_OFF 1 -+#define SATA_ORB3_OFF 2 -+#define SATA_ORB4_OFF 3 -+#define SATA_ORB5_OFF 4 -+ -+#define SATA_FIS_ACCESS 11 -+#define SATA_INT_STATUS_OFF 12 /* Read only */ -+#define SATA_INT_CLR_OFF 12 /* Write only */ -+#define SATA_INT_ENABLE_OFF 13 /* Read only */ -+#define SATA_INT_ENABLE_SET_OFF 13 /* Write only */ -+#define SATA_INT_ENABLE_CLR_OFF 14 /* Write only */ -+#define SATA_VERSION_OFF 15 -+#define SATA_CONTROL_OFF 23 -+#define SATA_COMMAND_OFF 24 -+#define SATA_PORT_CONTROL_OFF 25 -+#define SATA_DRIVE_CONTROL_OFF 26 -+ -+/* The offsets to the link registers that are access in an asynchronous manner */ -+#define SATA_LINK_DATA 28 -+#define SATA_LINK_RD_ADDR 29 -+#define SATA_LINK_WR_ADDR 30 -+#define SATA_LINK_CONTROL 31 -+ -+/* SATA interrupt status register fields */ -+#define SATA_INT_STATUS_EOC_RAW_BIT ( 0 + 16) -+#define SATA_INT_STATUS_ERROR_BIT ( 2 + 16) -+#define SATA_INT_STATUS_EOADT_RAW_BIT ( 1 + 16) -+ -+/* SATA core command register commands */ -+#define SATA_CMD_WRITE_TO_ORB_REGS 2 -+#define SATA_CMD_WRITE_TO_ORB_REGS_NO_COMMAND 4 -+ -+#define SATA_CMD_BUSY_BIT 7 -+ -+#define SATA_SCTL_CLR_ERR 0x00000316UL -+ -+#define SATA_OPCODE_MASK 0x3 -+ -+#define SATA_LBAL_BIT 0 -+#define SATA_LBAM_BIT 8 -+#define SATA_LBAH_BIT 16 -+#define SATA_HOB_LBAH_BIT 24 -+#define SATA_DEVICE_BIT 24 -+#define SATA_NSECT_BIT 0 -+#define SATA_FEATURE_BIT 16 -+#define SATA_COMMAND_BIT 24 -+#define SATA_CTL_BIT 24 -+ -+/* ATA status (7) register field definitions */ -+#define ATA_STATUS_BSY_BIT 7 -+#define ATA_STATUS_DRDY_BIT 6 -+#define ATA_STATUS_DF_BIT 5 -+#define ATA_STATUS_DRQ_BIT 3 -+#define ATA_STATUS_ERR_BIT 0 -+ -+/* ATA device (6) register field definitions */ -+#define ATA_DEVICE_FIXED_MASK 0xA0 -+#define ATA_DEVICE_DRV_BIT 4 -+#define ATA_DEVICE_DRV_NUM_BITS 1 -+#define ATA_DEVICE_LBA_BIT 6 -+ -+/* ATA control (0) register field definitions */ -+#define ATA_CTL_SRST_BIT 2 -+ -+/* ATA Command register initiated commands */ -+#define ATA_CMD_INIT 0x91 -+#define ATA_CMD_IDENT 0xEC -+ -+#define SATA_STD_ASYNC_REGS_OFF 0x20 -+#define SATA_SCR_STATUS 0 -+#define SATA_SCR_ERROR 1 -+#define SATA_SCR_CONTROL 2 -+#define SATA_SCR_ACTIVE 3 -+#define SATA_SCR_NOTIFICAION 4 -+ -+#define SATA_BURST_BUF_FORCE_EOT_BIT 0 -+#define SATA_BURST_BUF_DATA_INJ_ENABLE_BIT 1 -+#define SATA_BURST_BUF_DIR_BIT 2 -+#define SATA_BURST_BUF_DATA_INJ_END_BIT 3 -+#define SATA_BURST_BUF_FIFO_DIS_BIT 4 -+#define SATA_BURST_BUF_DIS_DREQ_BIT 5 -+#define SATA_BURST_BUF_DREQ_BIT 6 -+ -+/* Button on GPIO 32 */ -+#define RECOVERY_BUTTON (0x00000001 << 0) -+#define RECOVERY_PRISEL_REG SYS_CTRL_GPIO_PRIMSEL_CTRL_1 -+#define RECOVERY_SECSEL_REG SYS_CTRL_GPIO_SECSEL_CTRL_1 -+#define RECOVERY_TERSEL_REG SYS_CTRL_GPIO_TERTSEL_CTRL_1 -+#define RECOVERY_CLR_OE_REG GPIO_2_CLR_OE -+#define RECOVERY_DEBOUNCE_REG GPIO_2_INPUT_DEBOUNCE_ENABLE -+#define RECOVERY_DATA GPIO_2_PA -+ -+#endif // CONFIG_H -diff -Nurd u-boot-1.1.2/include/_exports.h u-boot-1.1.2-oxe810/include/_exports.h ---- u-boot-1.1.2/include/_exports.h 2003-09-12 17:35:33.000000000 +0200 -+++ u-boot-1.1.2-oxe810/include/_exports.h 2008-06-11 17:55:11.000000000 +0200 -@@ -12,6 +12,7 @@ - EXPORT_FUNC(get_timer) - EXPORT_FUNC(vprintf) - EXPORT_FUNC(do_reset) -+EXPORT_FUNC(raise) - #if (CONFIG_COMMANDS & CFG_CMD_I2C) - EXPORT_FUNC(i2c_write) - EXPORT_FUNC(i2c_read) -diff -Nurd u-boot-1.1.2/include/flash.h u-boot-1.1.2-oxe810/include/flash.h ---- u-boot-1.1.2/include/flash.h 2004-12-16 19:01:48.000000000 +0100 -+++ u-boot-1.1.2-oxe810/include/flash.h 2008-06-11 17:55:11.000000000 +0200 -@@ -207,6 +207,7 @@ - #define ATM_ID_BV1614 0x000000C0 /* 49BV1614 ID */ - #define ATM_ID_BV1614A 0x000000C8 /* 49BV1614A ID */ - #define ATM_ID_BV6416 0x000000D6 /* 49BV6416 ID */ -+#define ATM_ID_BV322 0x000000c9 /* 49BV322A ID */ - - #define FUJI_ID_29F800BA 0x22582258 /* MBM29F800BA ID (8M) */ - #define FUJI_ID_29F800TA 0x22D622D6 /* MBM29F800TA ID (8M) */ -@@ -405,6 +406,7 @@ - #define FLASH_MAN_INTEL 0x00300000 - #define FLASH_MAN_MT 0x00400000 - #define FLASH_MAN_SHARP 0x00500000 -+#define FLASH_MAN_ATM 0x00070000 /* Atmel */ - - - #define FLASH_TYPEMASK 0x0000FFFF /* extract FLASH type information */ -diff -Nurd u-boot-1.1.2/include/ns16550.h u-boot-1.1.2-oxe810/include/ns16550.h ---- u-boot-1.1.2/include/ns16550.h 2004-06-07 01:13:57.000000000 +0200 -+++ u-boot-1.1.2-oxe810/include/ns16550.h 2008-06-11 17:55:11.000000000 +0200 -@@ -19,6 +19,10 @@ - unsigned char lsr; /* 5 */ - unsigned char msr; /* 6 */ - unsigned char scr; /* 7 */ -+#if defined(CONFIG_OXNAS) -+ unsigned char ext; /* 8 */ -+ unsigned char dlf; /* 9 */ -+#endif - #if defined(CONFIG_OMAP730) - unsigned char mdr1; /* 8 */ - unsigned char reg9; /* 9 */ -diff -Nurd u-boot-1.1.2/lib_arm/board.c u-boot-1.1.2-oxe810/lib_arm/board.c ---- u-boot-1.1.2/lib_arm/board.c 2004-08-02 00:48:22.000000000 +0200 -+++ u-boot-1.1.2-oxe810/lib_arm/board.c 2008-06-11 17:55:06.000000000 +0200 -@@ -39,6 +39,9 @@ - #include "../drivers/lan91c96.h" - #endif - -+DECLARE_GLOBAL_DATA_PTR -+ -+ - #if (CONFIG_COMMANDS & CFG_CMD_NAND) - void nand_init (void); - #endif -@@ -106,7 +109,6 @@ - - static int init_baudrate (void) - { -- DECLARE_GLOBAL_DATA_PTR; - - uchar tmp[64]; /* long enough for environment variables */ - int i = getenv_r ("baudrate", tmp, sizeof (tmp)); -@@ -142,16 +144,18 @@ - */ - static int display_dram_config (void) - { -- DECLARE_GLOBAL_DATA_PTR; - int i; - - puts ("RAM Configuration:\n"); - - for(i=0; i<CONFIG_NR_DRAM_BANKS; i++) { -- printf ("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start); -+ printf ("\tBank #%d: %08lx ", i, gd->bd->bi_dram[i].start); - print_size (gd->bd->bi_dram[i].size, "\n"); - } - -+ puts("SRAM Configuration:\n"); -+ printf("\t%dKB at 0x%08x\n", gd->bd->bi_sramsize >> 10, gd->bd->bi_sramstart); -+ - return (0); - } - -@@ -191,6 +195,12 @@ - cpu_init, /* basic cpu dependent setup */ - board_init, /* basic board dependent setup */ - interrupt_init, /* set up exceptions */ -+#ifdef CONFIG_OXNAS -+ /* Need early console to see SATA env. load messages */ -+ init_baudrate, /* initialze baudrate settings */ -+ serial_init, /* serial communications setup */ -+ console_init_f, /* stage 1 init of console */ -+#endif // CONFIG_OXNAS - env_init, /* initialize environment */ - init_baudrate, /* initialze baudrate settings */ - serial_init, /* serial communications setup */ -@@ -206,7 +216,6 @@ - - void start_armboot (void) - { -- DECLARE_GLOBAL_DATA_PTR; - - ulong size; - init_fnc_t **init_fnc_ptr; -@@ -232,9 +241,11 @@ - } - } - -+#ifndef CFG_NO_FLASH - /* configure available FLASH banks */ - size = flash_init (); - display_flash_config (size); -+#endif // CFG_NO_FLASH - - #ifdef CONFIG_VFD - # ifndef PAGE_SIZE -@@ -354,6 +365,12 @@ - { - puts ("### ERROR ### Please RESET the board ###\n"); - for (;;); -+} -+ -+void raise (int n) -+{ -+ puts ("### ERROR ### Please RESET the board ###\n"); -+ for (;;); - } - - #ifdef CONFIG_MODEM_SUPPORT -diff -Nurd u-boot-1.1.2/MAKEALL u-boot-1.1.2-oxe810/MAKEALL ---- u-boot-1.1.2/MAKEALL 2004-12-31 10:32:48.000000000 +0100 -+++ u-boot-1.1.2-oxe810/MAKEALL 2008-06-11 17:55:31.000000000 +0200 -@@ -154,7 +154,7 @@ - lpd7a400 mx1ads mx1fs2 omap1510inn \ - omap1610h2 omap1610inn omap730p2 scb9328 \ - smdk2400 smdk2410 trab VCMA9 \ -- versatile \ -+ versatile oxnas \ - " - - ######################################################################### -diff -Nurd u-boot-1.1.2/Makefile u-boot-1.1.2-oxe810/Makefile ---- u-boot-1.1.2/Makefile 2004-12-19 10:58:11.000000000 +0100 -+++ u-boot-1.1.2-oxe810/Makefile 2008-06-11 17:55:31.000000000 +0200 -@@ -1296,6 +1296,9 @@ - SX1_config : unconfig - @./mkconfig $(@:_config=) arm arm925t sx1 - -+oxnas_config : unconfig -+ @./mkconfig $(@:_config=) arm arm926ejs oxnas -+ - # TRAB default configuration: 8 MB Flash, 32 MB RAM - trab_config \ - trab_bigram_config \ -@@ -1561,11 +1564,12 @@ - clean: - find . -type f \ - \( -name 'core' -o -name '*.bak' -o -name '*~' \ -- -o -name '*.o' -o -name '*.a' \) -print \ -+ -o -name '*.o' -o -name '*.a' -o -name '.depend' \) -print \ - | xargs rm -f - rm -f examples/hello_world examples/timer \ - examples/eepro100_eeprom examples/sched \ -- examples/mem_to_mem_idma2intr examples/82559_eeprom -+ examples/mem_to_mem_idma2intr examples/82559_eeprom \ -+ examples/mem_test - rm -f tools/img2srec tools/mkimage tools/envcrc tools/gen_eth_addr - rm -f tools/mpc86x_clk tools/ncb - rm -f tools/easylogo/easylogo tools/bmp_logo -diff -Nurd u-boot-1.1.2/net/net.c u-boot-1.1.2-oxe810/net/net.c ---- u-boot-1.1.2/net/net.c 2004-10-12 00:51:14.000000000 +0200 -+++ u-boot-1.1.2-oxe810/net/net.c 2008-06-11 17:55:11.000000000 +0200 -@@ -225,7 +225,7 @@ - return; - - t = get_timer(0); -- -+ - /* check for arp timeout */ - if ((t - NetArpWaitTimerStart) > ARP_TIMEOUT * CFG_HZ) { - NetArpWaitTry++; -@@ -235,6 +235,7 @@ - NetArpWaitTry = 0; - NetStartAgain(); - } else { -+ puts ("\nARP Resend request\n"); - NetArpWaitTimerStart = t; - ArpRequest(); - } -@@ -738,7 +739,7 @@ - #if defined(CONFIG_NET_MULTI) - printf ("Using %s device\n", eth_get_name()); - #endif /* CONFIG_NET_MULTI */ -- NetSetTimeout (10 * CFG_HZ, PingTimeout); -+ NetSetTimeout (30 * CFG_HZ, PingTimeout); - NetSetHandler (PingHandler); - - PingSend(); -@@ -1384,7 +1385,7 @@ - */ - /* XXX point to ip packet */ - (*packetHandler)((uchar *)ip, 0, 0, 0); -- break; -+ return;/**break; BHC Changed to remove second invocation of ping handler below */ - #endif - default: - return; -@@ -1492,10 +1493,11 @@ - NetCksum(uchar * ptr, int len) - { - ulong xsum; -+ ushort *s = ptr; - - xsum = 0; - while (len-- > 0) -- xsum += *((ushort *)ptr)++; -+ xsum += *s++; - xsum = (xsum & 0xffff) + (xsum >> 16); - xsum = (xsum & 0xffff) + (xsum >> 16); - return (xsum & 0xffff); -diff -Nurd u-boot-1.1.2/net/tftp.c u-boot-1.1.2-oxe810/net/tftp.c ---- u-boot-1.1.2/net/tftp.c 2004-04-15 23:48:55.000000000 +0200 -+++ u-boot-1.1.2-oxe810/net/tftp.c 2008-06-11 17:55:11.000000000 +0200 -@@ -106,6 +106,7 @@ - volatile uchar * pkt; - volatile uchar * xp; - int len = 0; -+ volatile ushort * s; - - /* - * We will always be sending some sort of packet, so -@@ -117,7 +118,9 @@ - - case STATE_RRQ: - xp = pkt; -- *((ushort *)pkt)++ = htons(TFTP_RRQ); -+ s = (ushort *)pkt; -+ *s++ = htons(TFTP_RRQ); -+ pkt = (uchar *)s; - strcpy ((char *)pkt, tftp_filename); - pkt += strlen(tftp_filename) + 1; - strcpy ((char *)pkt, "octet"); -@@ -135,15 +138,19 @@ - case STATE_DATA: - case STATE_OACK: - xp = pkt; -- *((ushort *)pkt)++ = htons(TFTP_ACK); -- *((ushort *)pkt)++ = htons(TftpBlock); -+ s = (ushort *)pkt; -+ *s++ = htons(TFTP_ACK); -+ *s++ = htons(TftpBlock); -+ pkt = (uchar *)s; - len = pkt - xp; - break; - - case STATE_TOO_LARGE: - xp = pkt; -- *((ushort *)pkt)++ = htons(TFTP_ERROR); -- *((ushort *)pkt)++ = htons(3); -+ s = (ushort *)pkt; -+ *s++ = htons(TFTP_ERROR); -+ *s++ = htons(3); -+ pkt = (uchar *)s; - strcpy ((char *)pkt, "File too large"); - pkt += 14 /*strlen("File too large")*/ + 1; - len = pkt - xp; -@@ -151,8 +158,10 @@ - - case STATE_BAD_MAGIC: - xp = pkt; -- *((ushort *)pkt)++ = htons(TFTP_ERROR); -- *((ushort *)pkt)++ = htons(2); -+ s = (ushort *)pkt; -+ *s++ = htons(TFTP_ERROR); -+ *s++ = htons(2); -+ pkt = (uchar *)s; - strcpy ((char *)pkt, "File has bad magic"); - pkt += 18 /*strlen("File has bad magic")*/ + 1; - len = pkt - xp; -@@ -167,6 +176,7 @@ - TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len) - { - ushort proto; -+ ushort *s; - - if (dest != TftpOurPort) { - return; -@@ -180,7 +190,9 @@ - } - len -= 2; - /* warning: don't use increment (++) in ntohs() macros!! */ -- proto = *((ushort *)pkt)++; -+ s = (ushort *)pkt; -+ proto = *s++; -+ pkt = (uchar *)s; - switch (ntohs(proto)) { - - case TFTP_RRQ: diff --git a/packages/u-boot/u-boot-1.1.2/u-boot-1.1.2-neon.patch b/packages/u-boot/u-boot-1.1.2/u-boot-1.1.2-neon.patch deleted file mode 100644 index 3809a75f51..0000000000 --- a/packages/u-boot/u-boot-1.1.2/u-boot-1.1.2-neon.patch +++ /dev/null @@ -1,19155 +0,0 @@ -diff -u -r --new-file u-boot-1.1.2/board/bd2003/bd2003.c u-boot-1.1.2-neon/board/bd2003/bd2003.c ---- u-boot-1.1.2/board/bd2003/bd2003.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/bd2003/bd2003.c 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,94 @@ -+/* -+ * (C) Copyright 2002 -+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net -+ * -+ * (C) Copyright 2002 -+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com> -+ * Marius Groeger <mgroeger@sysgo.de> -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include <common.h> -+#include <config.h> -+#include <common.h> -+#include <version.h> -+#include <stdarg.h> -+#include <linux/types.h> -+#include <devices.h> -+#include <lcd.h> -+#include <lcd_panels.h> -+ -+/* ------------------------------------------------------------------------- */ -+/* -+ * LCD panel declarations -+ */ -+ -+vidinfo_t panel_info = { -+ vl_col: 1024, //this is corrected in SetPanelInfo -+ vl_row: 768, -+ vl_bpix: LCD_BPP, -+ vl_lcd_line_length: (320 * NBITS(LCD_BPP) ) >> 3 -+}; -+ -+void disable_lcd_panel( void ) -+{ -+} -+ -+ -+/* ------------------------------------------------------------------------- */ -+ -+ -+/* -+ * Miscelaneous platform dependent initialisations -+ */ -+ -+int board_init (void) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ /* memory and cpu-speed are setup before relocation */ -+ /* so we do _nothing_ here */ -+ -+ /* arch number of Neon Board */ -+ gd->bd->bi_arch_number = MACH_TYPE_BD2003 ; -+ -+ /* adress of boot parameters */ -+ gd->bd->bi_boot_params = 0xa0000100; -+ -+ return 0; -+} -+ -+int board_late_init(void) -+{ -+ setenv("stdout", "serial"); -+ setenv("stderr", "serial"); -+ return 0; -+} -+ -+ -+int dram_init (void) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ gd->bd->bi_dram[0].start = PHYS_SDRAM_1; -+ gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; -+ -+ return 0; -+} -diff -u -r --new-file u-boot-1.1.2/board/bd2003/config.mk u-boot-1.1.2-neon/board/bd2003/config.mk ---- u-boot-1.1.2/board/bd2003/config.mk 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/bd2003/config.mk 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,4 @@ -+#TEXT_BASE = 0xa1700000 -+TEXT_BASE = 0xA1F00000 -+#TEXT_BASE = 0 -+PXALCD = 1 -diff -u -r --new-file u-boot-1.1.2/board/bd2003/.cvsignore u-boot-1.1.2-neon/board/bd2003/.cvsignore ---- u-boot-1.1.2/board/bd2003/.cvsignore 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/bd2003/.cvsignore 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,2 @@ -+.depend -+ -diff -u -r --new-file u-boot-1.1.2/board/bd2003/flash.c u-boot-1.1.2-neon/board/bd2003/flash.c ---- u-boot-1.1.2/board/bd2003/flash.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/bd2003/flash.c 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,477 @@ -+/* -+ * (C) Copyright 2001 -+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net -+ * -+ * (C) Copyright 2001 -+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include <common.h> -+#include <linux/byteorder/swab.h> -+#include <asm/arch/pxa250Base.h> -+#include <asm/arch/pxaHardware.h> -+#include "lcd.h" -+ -+flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */ -+ -+/* Board support for 1 or 2 flash devices */ -+#define FLASH_PORT_WIDTH32 -+#undef FLASH_PORT_WIDTH16 -+ -+#ifdef FLASH_PORT_WIDTH16 -+#define FLASH_PORT_WIDTH ushort -+#define FLASH_PORT_WIDTHV vu_short -+#define SWAP(x) __swab16(x) -+#else -+#define FLASH_PORT_WIDTH ulong -+#define FLASH_PORT_WIDTHV vu_long -+#define SWAP(x) __swab32(x) -+#endif -+ -+#define FPW FLASH_PORT_WIDTH -+#define FPWV FLASH_PORT_WIDTHV -+ -+#define mb() __asm__ __volatile__ ("" : : : "memory") -+ -+/*----------------------------------------------------------------------- -+ * Functions -+ */ -+static ulong flash_get_size (FPW *addr, flash_info_t *info); -+static int write_data (flash_info_t *info, ulong dest, FPW data); -+static void flash_get_offsets (ulong base, flash_info_t *info); -+void inline spin_wheel_init(ulong addr, ulong cnt); -+void inline spin_wheel_done( int worked ); -+void inline spin_wheel (ulong numleft); -+ -+/*----------------------------------------------------------------------- -+ */ -+ulong bases[] = {PHYS_FLASH_1,PHYS_FLASH_2,1}; -+unsigned long flash_init (void) -+{ -+ int i=0; -+ int j=0; -+ ulong size = 0; -+ ulong base; -+ -+ while (i < CFG_MAX_FLASH_BANKS) { -+ base = bases[j++]; -+ flash_info[i].start[0] = 0; -+ if (base & 1) break; -+ if (flash_get_size ((FPW *) base, &flash_info[i])) { -+ flash_get_offsets (base, &flash_info[i]); -+ size += flash_info[i].size; -+ i++; -+ } -+ else { -+printf( "error reading flash size\n" ); -+ } -+ } -+ if (size>0) { -+ base = flash_info[0].start[0]; -+ // Protect monitor and environment sectors -+ flash_protect ( FLAG_PROTECT_SET, -+ base, -+ base + monitor_flash_len - 1, -+ &flash_info[0] ); -+ -+ flash_protect ( FLAG_PROTECT_SET, -+ base+CFG_ENV_OFFSET, -+ base+CFG_ENV_OFFSET + CFG_ENV_SIZE - 1, &flash_info[0] ); -+ } -+ -+ return size; -+} -+ -+/*----------------------------------------------------------------------- -+ */ -+static void flash_get_offsets (ulong base, flash_info_t *info) -+{ -+ int i; -+ -+ if (info->flash_id == FLASH_UNKNOWN) { -+ return; -+ } -+ -+ if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) { -+ for (i = 0; i < info->sector_count; i++) { -+ info->start[i] = base + (i * PHYS_FLASH_SECT_SIZE); -+ info->protect[i] = 0; -+ } -+ } -+} -+ -+/*----------------------------------------------------------------------- -+ */ -+void flash_print_info (flash_info_t *info) -+{ -+ int i; -+ -+ if (info->flash_id == FLASH_UNKNOWN) { -+ printf ("missing or unknown FLASH type\n"); -+ return; -+ } -+ -+ switch (info->flash_id & FLASH_VENDMASK) { -+ case FLASH_MAN_INTEL: -+ printf ("INTEL "); -+ break; -+ default: -+ printf ("Unknown Vendor "); -+ break; -+ } -+ -+ switch (info->flash_id & FLASH_TYPEMASK) { -+ case FLASH_28F128J3A: -+ printf ("28F128J3A\n"); -+ break; -+ default: -+ printf ("Unknown Chip Type\n"); -+ break; -+ } -+ -+ printf (" Size: %ld MB in %d Sectors\n", -+ info->size >> 20, info->sector_count); -+ -+ printf (" Sector Start Addresses:"); -+ for (i = 0; i < info->sector_count; ++i) { -+ if ((i % 5) == 0) -+ printf ("\n "); -+ printf (" %08lX%s", -+ info->start[i], -+ info->protect[i] ? " (RO)" : " "); -+ } -+ printf ("\n"); -+ return; -+} -+ -+/* -+ * The following code cannot be run from FLASH! -+ */ -+static ulong flash_get_size (FPW *addr, flash_info_t *info) -+{ -+ volatile FPW value; -+ volatile unsigned long *mc = (unsigned long *)MEMORY_CONTROL_BASE; -+ unsigned long val = 1<<3; -+ -+ info->flash_id = FLASH_UNKNOWN; -+ info->sector_count = 0; -+ info->size = 0; -+ -+ if (((ulong)addr) > 0x14000000) return 0; -+ val = mc[(MSC0>>2) +(((ulong)addr)>>27)]; -+ if (((ulong)addr) & 0x04000000) val = val>>16; -+ if ( val & (1<<3)) return 0; //if 16 bit bus then return -+ -+ /* Write auto select command: read Manufacturer ID */ -+ addr[0x5555] = (FPW) 0x00AA00AA; -+ addr[0x2AAA] = (FPW) 0x00550055; -+ addr[0x5555] = (FPW) 0x00900090; -+ -+ mb (); -+ value = addr[0]; -+ -+ switch (value) { -+ -+ case (FPW) 0: -+ case (FPW) INTEL_MANUFACT & 0xFF0000 : -+ case (FPW) INTEL_MANUFACT & 0x0000FF : -+ case (FPW) INTEL_MANUFACT: -+ info->flash_id = FLASH_MAN_INTEL; -+ break; -+ -+ default: -+printf( "Invalid flash manufacturer %x\n", value ); -+ addr[0] = (FPW) 0x00FF00FF; /* restore read mode */ -+ return (0); /* no or unknown flash */ -+ } -+ -+ mb (); -+ value = addr[1]; /* device ID */ -+ -+ switch (value) { -+ -+ case (FPW) 0: -+ case (FPW) INTEL_ID_28F128J3A & 0xFF0000 : -+ case (FPW) INTEL_ID_28F128J3A & 0x0000FF : -+ case (FPW) INTEL_ID_28F128J3A: -+ info->flash_id += FLASH_28F128J3A; -+ info->sector_count = 128; -+ info->size = 0x02000000; -+ break; /* => 16 MB */ -+ -+ default: -+printf( "Unknown flash device %x\n", value ); -+ info->flash_id = FLASH_UNKNOWN; -+ break; -+ } -+ -+ if (info->sector_count > CFG_MAX_FLASH_SECT) { -+ printf ("** ERROR: sector count %d > max (%d) **\n", -+ info->sector_count, CFG_MAX_FLASH_SECT); -+ info->sector_count = CFG_MAX_FLASH_SECT; -+ } -+ -+ addr[0] = (FPW) 0x00FF00FF; /* restore read mode */ -+ -+ return (info->size); -+} -+ -+ -+/*----------------------------------------------------------------------- -+ */ -+ -+int flash_erase (flash_info_t *info, int s_first, int s_last) -+{ -+ int flag, prot, sect; -+ ulong type, start, last; -+ int rcode = 0; -+ -+ if ((s_first < 0) || (s_first > s_last)) { -+ if (info->flash_id == FLASH_UNKNOWN) { -+ printf ("- missing\n"); -+ } else { -+ printf ("- no sectors to erase\n"); -+ } -+ return 1; -+ } -+ -+ type = (info->flash_id & FLASH_VENDMASK); -+ if ((type != FLASH_MAN_INTEL)) { -+ printf ("Can't erase unknown flash type %08lx - aborted\n", -+ info->flash_id); -+ return 1; -+ } -+ -+ prot = 0; -+ for (sect = s_first; sect <= s_last; ++sect) { -+ if (info->protect[sect]) { -+ prot++; -+ } -+ } -+ -+ if (prot) { -+ printf ("- Warning: %d protected sectors will not be erased!\n", -+ prot); -+ } else { -+ printf ("\n"); -+ } -+ -+ start = get_timer (0); -+ last = start; -+ -+ /* Disable interrupts which might cause a timeout here */ -+ flag = disable_interrupts (); -+ -+ /* Start erase on unprotected sectors */ -+ for (sect = s_first; sect <= s_last; sect++) { -+ if (info->protect[sect] == 0) { /* not protected */ -+ char temp[80]; -+ FPWV *addr = (FPWV *) (info->start[sect]); -+ FPW status; -+ -+ sprintf (temp, "Erasing sector %2d ... \r", sect); -+ lcd_puts( temp ); -+ -+ /* arm simple, non interrupt dependent timer */ -+ reset_timer_masked (); -+ -+ *addr = (FPW) 0x00500050; /* clear status register */ -+ *addr = (FPW) 0x00200020; /* erase setup */ -+ *addr = (FPW) 0x00D000D0; /* erase confirm */ -+ -+ while (((status = *addr) & (FPW) 0x00800080) != (FPW) 0x00800080) { -+ if (get_timer_masked () > CFG_FLASH_ERASE_TOUT) { -+ printf ("Timeout\n"); -+ *addr = (FPW) 0x00B000B0; /* suspend erase */ -+ *addr = (FPW) 0x00FF00FF; /* reset to read mode */ -+ rcode = 1; -+ break; -+ } -+ } -+ -+ *addr = 0x00500050; /* clear status register cmd. */ -+ *addr = 0x00FF00FF; /* resest to read mode */ -+ } -+ } -+ lcd_puts( "\r\n" ); -+ return rcode; -+} -+ -+/*----------------------------------------------------------------------- -+ * Copy memory to flash, returns: -+ * 0 - OK -+ * 1 - write timeout -+ * 2 - Flash not erased -+ * 4 - Flash not identified -+ */ -+ -+int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt) -+{ -+ ulong cp, wp; -+ FPW data; -+ int count, i, l, rc, port_width; -+ -+ rc = 0 ; -+ if (info->flash_id == FLASH_UNKNOWN) { -+ return 4; -+ } -+/* get lower word aligned address */ -+#ifdef FLASH_PORT_WIDTH16 -+ wp = (addr & ~1); -+ port_width = 2; -+#else -+ wp = (addr & ~3); -+ port_width = 4; -+#endif -+ -+ spin_wheel_init(addr,cnt); -+ -+ /* -+ * handle unaligned start bytes -+ */ -+ if ((l = addr - wp) != 0) { -+ data = 0; -+ for (i = 0, cp = wp; i < l; ++i, ++cp) { -+ data = (data << 8) | (*(uchar *) cp); -+ } -+ for (; i < port_width && cnt > 0; ++i) { -+ data = (data << 8) | *src++; -+ --cnt; -+ ++cp; -+ } -+ for (; cnt == 0 && i < port_width; ++i, ++cp) { -+ data = (data << 8) | (*(uchar *) cp); -+ } -+ -+ if ((rc = write_data (info, wp, SWAP (data))) != 0) { -+ goto out; -+ } -+ wp += port_width; -+ } -+ -+ /* -+ * handle word aligned part -+ */ -+ count = 0; -+ while (cnt >= port_width) { -+ data = 0; -+ for (i = 0; i < port_width; ++i) { -+ data = (data << 8) | *src++; -+ } -+ if ((rc = write_data (info, wp, SWAP (data))) != 0) { -+ goto out; -+ } -+ wp += port_width; -+ cnt -= port_width; -+ if (count++ > 0x800) { -+ spin_wheel (cnt); -+ count = 0; -+ } -+ } -+ -+ if (cnt) { -+ /* -+ * handle unaligned tail bytes -+ */ -+ data = 0; -+ for (i = 0, cp = wp; i < port_width && cnt > 0; ++i, ++cp) { -+ data = (data << 8) | *src++; -+ --cnt; -+ } -+ for (; i < port_width; ++i, ++cp) { -+ data = (data << 8) | (*(uchar *) cp); -+ } -+ -+ rc = write_data (info, wp, SWAP (data)); -+ } -+ -+out: -+ spin_wheel_done(0 == rc); -+ return rc ; -+} -+ -+/*----------------------------------------------------------------------- -+ * Write a word or halfword to Flash, returns: -+ * 0 - OK -+ * 1 - write timeout -+ * 2 - Flash not erased -+ */ -+static int write_data (flash_info_t *info, ulong dest, FPW data) -+{ -+ FPWV *addr = (FPWV *) dest; -+ FPW old = *addr ; -+ ulong status; -+ int flag; -+ -+ /* Check if Flash is (sufficiently) erased */ -+ if ((old & data) != data) { -+ printf ("not erased at %08lx (%lx)\n", (ulong) addr, old); -+ return (2); -+ } -+ -+ if( old != data ) -+ { -+ /* Disable interrupts which might cause a timeout here */ -+ flag = disable_interrupts (); -+ -+ *addr = (FPW) 0x00400040; /* write setup */ -+ *addr = data; -+ -+ /* arm simple, non interrupt dependent timer */ -+ reset_timer_masked (); -+ -+ /* wait while polling the status register */ -+ while (((status = *addr) & (FPW) 0x00800080) != (FPW) 0x00800080) { -+ if (get_timer_masked () > CFG_FLASH_WRITE_TOUT) { -+ *addr = (FPW) 0x00FF00FF; /* restore read mode */ -+ return (1); -+ } -+ } -+ *addr = (FPW) 0x00FF00FF; /* restore read mode */ -+ } /* need to program? */ -+ -+ -+ return (0); -+} -+ -+void inline spin_wheel_init(ulong addr, ulong cnt) -+{ -+ char temp[80]; -+ sprintf( temp, -+ "\nprogramming flash\n" -+ "%08lx->%08lx\n" -+ " ", addr, cnt ); -+ lcd_puts( temp ); -+} -+ -+void inline spin_wheel_done( int worked ) -+{ -+ if( worked ) -+ spin_wheel(0); -+ lcd_puts( worked ? "\ncompleted.\n" : "\nfailed!\n" ); -+} -+ -+void inline spin_wheel( ulong numleft ) -+{ -+ char temp[40]; -+ sprintf( temp, "\r %08lx", numleft ); -+ lcd_puts( temp ); -+} -diff -u -r --new-file u-boot-1.1.2/board/bd2003/init.script u-boot-1.1.2-neon/board/bd2003/init.script ---- u-boot-1.1.2/board/bd2003/init.script 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/bd2003/init.script 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,42 @@ -+if fatload mmc 0 a0000000 logo.bmp ; then -+ bmp info a0000000 ; -+ bmp display a0000000 ; -+else -+ lecho "No logo present" ; -+fi -+ -+if fatload mmc 0 a2000000 uimage ; then -+ lecho 'load Linux' -+ if fatload mmc 0 a2200000 mmcinitrd.u-boot ; then -+ echo 'using initrd' ; -+ lecho "Booting Linux" -+ set bootargs root=/dev/ram0 console=ttyS0,115200 debug=7 mtdparts=phys_mapped_flash:1024k(armboot),256k(params),-(rootfs1) -+ bootm a2000000 a2200000 -+ else -+ echo 'testing cramfs img' ; -+ if fatload mmc 0 a2200000 cramfs.img ; then -+ if cmp.b 00140000 a2200000 $filesize ; then -+ echo 'cramfs images match' ; -+ else -+ lecho 'filesystems differ...' ; -+ protect off all ; -+ erase 00140000 01ffffff ; -+ cp.b a2200000 00140000 $filesize ; -+ fi -+ -+ set bootargs console=ttyS0,115200 debug=7 mtdparts=phys_mapped_flash:1024k(armboot),256k(params),-(rootfs1) root=/dev/mtdblock3 rootfstype=cramfs -+ lecho "Booting Linux" -+ bootm a2000000 -+ fi -+ fi -+else -+ echo "No Linux kernel" ; -+fi -+ -+lecho 'No Linux, try CE' -+ -+if fatload mmc 0 A0030000 nk.nb0 ; then -+ g A0030000 ; -+else -+ echo "No WinCE image" ; -+fi -diff -u -r --new-file u-boot-1.1.2/board/bd2003/Makefile u-boot-1.1.2-neon/board/bd2003/Makefile ---- u-boot-1.1.2/board/bd2003/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/bd2003/Makefile 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,48 @@ -+ -+# -+# (C) Copyright 2000 -+# Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+# -+# See file CREDITS for list of people who contributed to this -+# project. -+# -+# This program is free software; you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation; either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+# MA 02111-1307 USA -+# -+ -+include $(TOPDIR)/config.mk -+ -+LIB = lib$(BOARD).a -+ -+OBJS := bd2003.o flash.o -+SOBJS := memsetup.o -+ -+$(LIB): $(OBJS) $(SOBJS) -+ $(AR) crv $@ $(OBJS) $(SOBJS) -+ -+clean: -+ rm -f $(SOBJS) $(OBJS) -+ -+distclean: clean -+ rm -f $(LIB) core *.bak .depend -+ -+######################################################################### -+ -+.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) -+ $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ -+ -+-include .depend -+ -+######################################################################### -diff -u -r --new-file u-boot-1.1.2/board/bd2003/memsetup.S u-boot-1.1.2-neon/board/bd2003/memsetup.S ---- u-boot-1.1.2/board/bd2003/memsetup.S 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/bd2003/memsetup.S 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,64 @@ -+/* -+ * Most of this taken from Redboot hal_platform_setup.h with cleanup -+ * -+ * NOTE: I haven't clean this up considerably, just enough to get it -+ * running. See hal_platform_setup.h for the source. See -+ * board/cradle/memsetup.S for another PXA250 setup that is -+ * much cleaner. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include <config.h> -+#include <version.h> -+ -+#define BAUDRATE 115200 -+#include <asm/arch/platformTypes.h> -+#include <configs/select.h> -+#include <asm/arch/pxaGpio.h> -+#include <asm/arch/pxaMacro3.h> -+ -+DRAM_SIZE: .long CFG_DRAM_SIZE -+ -+/* wait for coprocessor write complete */ -+ .macro CPWAIT reg -+ mrc p15,0,\reg,c2,c0,0 -+ mov \reg,\reg -+ sub pc,pc,#4 -+ .endm -+ -+ -+/* -+ * Memory setup -+ */ -+ -+.globl memsetup -+memsetup: -+ -+ mov r10, lr -+ -+ InitCS0_CS1 r0,sp -+ InitGPIO r0,sp -+ InitIC_Clocks r0,sp -+ InitUART r0,sp,UART_BASE,BAUDRATE -+ InitUART r0,sp,UART_BASE+0x600000,9600 -+ InitChangeCPUSpeed r0 -+ InitMemory r0,sp,r1 -+ -+ mov pc, lr -diff -u -r --new-file u-boot-1.1.2/board/bd2003/u-boot.lds u-boot-1.1.2-neon/board/bd2003/u-boot.lds ---- u-boot-1.1.2/board/bd2003/u-boot.lds 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/bd2003/u-boot.lds 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,56 @@ -+/* -+ * (C) Copyright 2000 -+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -+OUTPUT_ARCH(arm) -+ENTRY(_start) -+SECTIONS -+{ -+ . = 0x00000000; -+ -+ . = ALIGN(4); -+ .text : -+ { -+ cpu/pxa/start.o (.text) -+ cpu/pxa/ministart.o (.text) -+ *(.text) -+ } -+ -+ . = ALIGN(4); -+ .rodata : { *(.rodata) } -+ -+ . = 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 : { *(.bss) } -+ _end = .; -+} -diff -u -r --new-file u-boot-1.1.2/board/bd2003/u-bootmini.lds u-boot-1.1.2-neon/board/bd2003/u-bootmini.lds ---- u-boot-1.1.2/board/bd2003/u-bootmini.lds 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/bd2003/u-bootmini.lds 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,56 @@ -+/* -+ * (C) Copyright 2000 -+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -+OUTPUT_ARCH(arm) -+ENTRY(StartUp) -+SECTIONS -+{ -+ . = 0x00000000; -+ -+ . = ALIGN(4); -+ .text : -+ { -+ cpu/pxa/minidebug.o (.text) -+ cpu/pxa/ministart.o (.text) -+ *(.text) -+ } -+ -+ . = ALIGN(4); -+ .rodata : { *(.rodata) } -+ -+ . = 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 : { *(.bss) } -+ _end = .; -+} -diff -u -r --new-file u-boot-1.1.2/board/halogen/config.mk u-boot-1.1.2-neon/board/halogen/config.mk ---- u-boot-1.1.2/board/halogen/config.mk 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/halogen/config.mk 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,4 @@ -+#TEXT_BASE = 0xa1700000 -+TEXT_BASE = 0xA1F00000 -+#TEXT_BASE = 0 -+PXALCD = 1 -diff -u -r --new-file u-boot-1.1.2/board/halogen/.cvsignore u-boot-1.1.2-neon/board/halogen/.cvsignore ---- u-boot-1.1.2/board/halogen/.cvsignore 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/halogen/.cvsignore 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,2 @@ -+.depend -+ -diff -u -r --new-file u-boot-1.1.2/board/halogen/flash.c u-boot-1.1.2-neon/board/halogen/flash.c ---- u-boot-1.1.2/board/halogen/flash.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/halogen/flash.c 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,482 @@ -+/* -+ * (C) Copyright 2001 -+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net -+ * -+ * (C) Copyright 2001 -+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include <common.h> -+#include <linux/byteorder/swab.h> -+#include <asm/arch/pxa250Base.h> -+#include <asm/arch/pxaHardware.h> -+#include "lcd.h" -+ -+flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */ -+ -+/* Board support for 1 or 2 flash devices */ -+#define FLASH_PORT_WIDTH32 -+#undef FLASH_PORT_WIDTH16 -+ -+#ifdef FLASH_PORT_WIDTH16 -+#define FLASH_PORT_WIDTH ushort -+#define FLASH_PORT_WIDTHV vu_short -+#define SWAP(x) __swab16(x) -+#else -+#define FLASH_PORT_WIDTH ulong -+#define FLASH_PORT_WIDTHV vu_long -+#define SWAP(x) __swab32(x) -+#endif -+ -+#define FPW FLASH_PORT_WIDTH -+#define FPWV FLASH_PORT_WIDTHV -+ -+#define mb() __asm__ __volatile__ ("" : : : "memory") -+ -+/*----------------------------------------------------------------------- -+ * Functions -+ */ -+static ulong flash_get_size (FPW *addr, flash_info_t *info); -+static int write_data (flash_info_t *info, ulong dest, FPW data); -+static void flash_get_offsets (ulong base, flash_info_t *info); -+void inline spin_wheel_init(ulong addr, ulong cnt); -+void inline spin_wheel_done( int worked ); -+void inline spin_wheel (ulong numleft); -+ -+/*----------------------------------------------------------------------- -+ */ -+ulong bases[] = {PHYS_FLASH_1,PHYS_FLASH_2,1}; -+unsigned long flash_init (void) -+{ -+ int i=0; -+ int j=0; -+ ulong size = 0; -+ ulong base; -+ -+ while (i < CFG_MAX_FLASH_BANKS) { -+ base = bases[j++]; -+ flash_info[i].start[0] = 0; -+ if (base & 1) break; -+ if (flash_get_size ((FPW *) base, &flash_info[i])) { -+ flash_get_offsets (base, &flash_info[i]); -+ size += flash_info[i].size; -+ i++; -+ } -+ else { -+printf( "error reading flash size\n" ); -+ } -+ } -+ if (size>0) { -+ base = flash_info[0].start[0]; -+ // Protect monitor and environment sectors -+ flash_protect ( FLAG_PROTECT_SET, -+ base, -+ base + monitor_flash_len - 1, -+ &flash_info[0] ); -+ -+ flash_protect ( FLAG_PROTECT_SET, -+ base+CFG_ENV_OFFSET, -+ base+CFG_ENV_OFFSET + CFG_ENV_SIZE - 1, &flash_info[0] ); -+ } -+ -+ return size; -+} -+ -+/*----------------------------------------------------------------------- -+ */ -+static void flash_get_offsets (ulong base, flash_info_t *info) -+{ -+ int i; -+ -+ if (info->flash_id == FLASH_UNKNOWN) { -+ return; -+ } -+ -+ if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) { -+ for (i = 0; i < info->sector_count; i++) { -+ info->start[i] = base + (i * PHYS_FLASH_SECT_SIZE); -+ info->protect[i] = 0; -+ } -+ } -+} -+ -+/*----------------------------------------------------------------------- -+ */ -+void flash_print_info (flash_info_t *info) -+{ -+ int i; -+ -+ if (info->flash_id == FLASH_UNKNOWN) { -+ printf ("missing or unknown FLASH type\n"); -+ return; -+ } -+ -+ switch (info->flash_id & FLASH_VENDMASK) { -+ case FLASH_MAN_INTEL: -+ printf ("INTEL "); -+ break; -+ default: -+ printf ("Unknown Vendor "); -+ break; -+ } -+ -+ switch (info->flash_id & FLASH_TYPEMASK) { -+ case FLASH_28F128J3A: -+ printf ("28F128J3A\n"); -+ break; -+ default: -+ printf ("Unknown Chip Type\n"); -+ break; -+ } -+ -+ printf (" Size: %ld MB in %d Sectors\n", -+ info->size >> 20, info->sector_count); -+ -+ printf (" Sector Start Addresses:"); -+ for (i = 0; i < info->sector_count; ++i) { -+ if ((i % 5) == 0) -+ printf ("\n "); -+ printf (" %08lX%s", -+ info->start[i], -+ info->protect[i] ? " (RO)" : " "); -+ } -+ printf ("\n"); -+ return; -+} -+ -+/* -+ * The following code cannot be run from FLASH! -+ */ -+static ulong flash_get_size (FPW *addr, flash_info_t *info) -+{ -+ volatile FPW value; -+ volatile unsigned long *mc = (unsigned long *)MEMORY_CONTROL_BASE; -+ unsigned long val = 1<<3; -+ -+ info->flash_id = FLASH_UNKNOWN; -+ info->sector_count = 0; -+ info->size = 0; -+ -+ if (((ulong)addr) > 0x14000000) return 0; -+ val = mc[(MSC0>>2) +(((ulong)addr)>>27)]; -+ if (((ulong)addr) & 0x04000000) val = val>>16; -+ if ( val & (1<<3)) return 0; //if 16 bit bus then return -+ -+ /* Write auto select command: read Manufacturer ID */ -+ addr[0x5555] = (FPW) 0x00AA00AA; -+ addr[0x2AAA] = (FPW) 0x00550055; -+ addr[0x5555] = (FPW) 0x00900090; -+ -+ mb (); -+ value = addr[0]; -+ -+ switch (value) { -+ -+ case (FPW) 0: -+ case (FPW) STM_MANUFACT: -+ case (FPW) INTEL_MANUFACT & 0xFF0000 : -+ case (FPW) INTEL_MANUFACT & 0x0000FF : -+ case (FPW) INTEL_MANUFACT: -+ info->flash_id = FLASH_MAN_INTEL; -+ break; -+ -+ default: -+printf( "Invalid flash manufacturer %x\n", value ); -+ addr[0] = (FPW) 0x00FF00FF; /* restore read mode */ -+ return (0); /* no or unknown flash */ -+ } -+ -+ mb (); -+ value = addr[1]; /* device ID */ -+ -+ switch (value) { -+ -+ case (FPW) 0: -+ case (FPW) INTEL_ID_28F128J3A & 0xFF0000 : -+ case (FPW) INTEL_ID_28F128J3A & 0x0000FF : -+ case (FPW) INTEL_ID_28F128J3A: -+ info->flash_id += FLASH_28F128J3A; -+ info->sector_count = 128; -+ info->size = 0x01000000; -+ break; /* => 16 MB x 1 */ -+ case (FPW) INTEL_ID_28F320J3A: -+ info->flash_id += FLASH_28F320J3A; -+ info->sector_count = 32 ; -+ info->size = 0x400000 ; -+ break; /* => 4 MB x 1 */ -+ default: -+printf( "Unknown flash device %x\n", value ); -+ info->flash_id = FLASH_UNKNOWN; -+ break; -+ } -+ -+ if (info->sector_count > CFG_MAX_FLASH_SECT) { -+ printf ("** ERROR: sector count %d > max (%d) **\n", -+ info->sector_count, CFG_MAX_FLASH_SECT); -+ info->sector_count = CFG_MAX_FLASH_SECT; -+ } -+ -+ addr[0] = (FPW) 0x00FF00FF; /* restore read mode */ -+ -+ return (info->size); -+} -+ -+ -+/*----------------------------------------------------------------------- -+ */ -+ -+int flash_erase (flash_info_t *info, int s_first, int s_last) -+{ -+ int flag, prot, sect; -+ ulong type, start, last; -+ int rcode = 0; -+ -+ if ((s_first < 0) || (s_first > s_last)) { -+ if (info->flash_id == FLASH_UNKNOWN) { -+ printf ("- missing\n"); -+ } else { -+ printf ("- no sectors to erase\n"); -+ } -+ return 1; -+ } -+ -+ type = (info->flash_id & FLASH_VENDMASK); -+ if ((type != FLASH_MAN_INTEL)) { -+ printf ("Can't erase unknown flash type %08lx - aborted\n", -+ info->flash_id); -+ return 1; -+ } -+ -+ prot = 0; -+ for (sect = s_first; sect <= s_last; ++sect) { -+ if (info->protect[sect]) { -+ prot++; -+ } -+ } -+ -+ if (prot) { -+ printf ("- Warning: %d protected sectors will not be erased!\n", -+ prot); -+ } else { -+ printf ("\n"); -+ } -+ -+ start = get_timer (0); -+ last = start; -+ -+ /* Disable interrupts which might cause a timeout here */ -+ flag = disable_interrupts (); -+ -+ /* Start erase on unprotected sectors */ -+ for (sect = s_first; sect <= s_last; sect++) { -+ if (info->protect[sect] == 0) { /* not protected */ -+ char temp[80]; -+ FPWV *addr = (FPWV *) (info->start[sect]); -+ FPW status; -+ -+ sprintf (temp, "Erasing sector %2d ... \r", sect); -+ lcd_puts( temp ); -+ -+ /* arm simple, non interrupt dependent timer */ -+ reset_timer_masked (); -+ -+ *addr = (FPW) 0x00500050; /* clear status register */ -+ *addr = (FPW) 0x00200020; /* erase setup */ -+ *addr = (FPW) 0x00D000D0; /* erase confirm */ -+ -+ while (((status = *addr) & (FPW) 0x00800080) != (FPW) 0x00800080) { -+ if (get_timer_masked () > CFG_FLASH_ERASE_TOUT) { -+ printf ("Timeout\n"); -+ *addr = (FPW) 0x00B000B0; /* suspend erase */ -+ *addr = (FPW) 0x00FF00FF; /* reset to read mode */ -+ rcode = 1; -+ break; -+ } -+ } -+ -+ *addr = 0x00500050; /* clear status register cmd. */ -+ *addr = 0x00FF00FF; /* resest to read mode */ -+ } -+ } -+ lcd_puts( "\r\n" ); -+ return rcode; -+} -+ -+/*----------------------------------------------------------------------- -+ * Copy memory to flash, returns: -+ * 0 - OK -+ * 1 - write timeout -+ * 2 - Flash not erased -+ * 4 - Flash not identified -+ */ -+ -+int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt) -+{ -+ ulong cp, wp; -+ FPW data; -+ int count, i, l, rc, port_width; -+ -+ rc = 0 ; -+ if (info->flash_id == FLASH_UNKNOWN) { -+ return 4; -+ } -+/* get lower word aligned address */ -+#ifdef FLASH_PORT_WIDTH16 -+ wp = (addr & ~1); -+ port_width = 2; -+#else -+ wp = (addr & ~3); -+ port_width = 4; -+#endif -+ -+ spin_wheel_init(addr,cnt); -+ -+ /* -+ * handle unaligned start bytes -+ */ -+ if ((l = addr - wp) != 0) { -+ data = 0; -+ for (i = 0, cp = wp; i < l; ++i, ++cp) { -+ data = (data << 8) | (*(uchar *) cp); -+ } -+ for (; i < port_width && cnt > 0; ++i) { -+ data = (data << 8) | *src++; -+ --cnt; -+ ++cp; -+ } -+ for (; cnt == 0 && i < port_width; ++i, ++cp) { -+ data = (data << 8) | (*(uchar *) cp); -+ } -+ -+ if ((rc = write_data (info, wp, SWAP (data))) != 0) { -+ goto out; -+ } -+ wp += port_width; -+ } -+ -+ /* -+ * handle word aligned part -+ */ -+ count = 0; -+ while (cnt >= port_width) { -+ data = 0; -+ for (i = 0; i < port_width; ++i) { -+ data = (data << 8) | *src++; -+ } -+ if ((rc = write_data (info, wp, SWAP (data))) != 0) { -+ goto out; -+ } -+ wp += port_width; -+ cnt -= port_width; -+ if (count++ > 0x800) { -+ spin_wheel (cnt); -+ count = 0; -+ } -+ } -+ -+ if (cnt) { -+ /* -+ * handle unaligned tail bytes -+ */ -+ data = 0; -+ for (i = 0, cp = wp; i < port_width && cnt > 0; ++i, ++cp) { -+ data = (data << 8) | *src++; -+ --cnt; -+ } -+ for (; i < port_width; ++i, ++cp) { -+ data = (data << 8) | (*(uchar *) cp); -+ } -+ -+ rc = write_data (info, wp, SWAP (data)); -+ } -+ -+out: -+ spin_wheel_done(0 == rc); -+ return rc ; -+} -+ -+/*----------------------------------------------------------------------- -+ * Write a word or halfword to Flash, returns: -+ * 0 - OK -+ * 1 - write timeout -+ * 2 - Flash not erased -+ */ -+static int write_data (flash_info_t *info, ulong dest, FPW data) -+{ -+ FPWV *addr = (FPWV *) dest; -+ FPW old = *addr ; -+ ulong status; -+ int flag; -+ -+ /* Check if Flash is (sufficiently) erased */ -+ if ((old & data) != data) { -+ printf ("not erased at %08lx (%lx)\n", (ulong) addr, old); -+ return (2); -+ } -+ -+ if( old != data ) -+ { -+ /* Disable interrupts which might cause a timeout here */ -+ flag = disable_interrupts (); -+ -+ *addr = (FPW) 0x00400040; /* write setup */ -+ *addr = data; -+ -+ /* arm simple, non interrupt dependent timer */ -+ reset_timer_masked (); -+ -+ /* wait while polling the status register */ -+ while (((status = *addr) & (FPW) 0x00800080) != (FPW) 0x00800080) { -+ if (get_timer_masked () > CFG_FLASH_WRITE_TOUT) { -+ *addr = (FPW) 0x00FF00FF; /* restore read mode */ -+ return (1); -+ } -+ } -+ *addr = (FPW) 0x00FF00FF; /* restore read mode */ -+ } /* need to program? */ -+ -+ -+ return (0); -+} -+ -+void inline spin_wheel_init(ulong addr, ulong cnt) -+{ -+ char temp[80]; -+ sprintf( temp, -+ "\nprogramming flash\n" -+ "%08lx->%08lx\n" -+ " ", addr, cnt ); -+ lcd_puts( temp ); -+} -+ -+void inline spin_wheel_done( int worked ) -+{ -+ if( worked ) -+ spin_wheel(0); -+ lcd_puts( worked ? "\ncompleted.\n" : "\nfailed!\n" ); -+} -+ -+void inline spin_wheel( ulong numleft ) -+{ -+ char temp[40]; -+ sprintf( temp, "\r %08lx", numleft ); -+ lcd_puts( temp ); -+} -diff -u -r --new-file u-boot-1.1.2/board/halogen/halogen.c u-boot-1.1.2-neon/board/halogen/halogen.c ---- u-boot-1.1.2/board/halogen/halogen.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/halogen/halogen.c 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,94 @@ -+/* -+ * (C) Copyright 2002 -+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net -+ * -+ * (C) Copyright 2002 -+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com> -+ * Marius Groeger <mgroeger@sysgo.de> -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include <common.h> -+#include <config.h> -+#include <common.h> -+#include <version.h> -+#include <stdarg.h> -+#include <linux/types.h> -+#include <devices.h> -+#include <lcd.h> -+#include <lcd_panels.h> -+ -+/* ------------------------------------------------------------------------- */ -+/* -+ * LCD panel declarations -+ */ -+ -+vidinfo_t panel_info = { -+ vl_col: 1024, //this is corrected in SetPanelInfo -+ vl_row: 768, -+ vl_bpix: LCD_BPP, -+ vl_lcd_line_length: (320 * NBITS(LCD_BPP) ) >> 3 -+}; -+ -+void disable_lcd_panel( void ) -+{ -+} -+ -+ -+/* ------------------------------------------------------------------------- */ -+ -+ -+/* -+ * Miscelaneous platform dependent initialisations -+ */ -+ -+int board_init (void) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ /* memory and cpu-speed are setup before relocation */ -+ /* so we do _nothing_ here */ -+ -+ /* arch number of Neon Board */ -+ gd->bd->bi_arch_number = MACH_TYPE_HALOGEN ; -+ -+ /* adress of boot parameters */ -+ gd->bd->bi_boot_params = 0xa0000100; -+ -+ return 0; -+} -+ -+int board_late_init(void) -+{ -+ setenv("stdout", "serial"); -+ setenv("stderr", "serial"); -+ return 0; -+} -+ -+ -+int dram_init (void) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ gd->bd->bi_dram[0].start = PHYS_SDRAM_1; -+ gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; -+ -+ return 0; -+} -diff -u -r --new-file u-boot-1.1.2/board/halogen/init.script u-boot-1.1.2-neon/board/halogen/init.script ---- u-boot-1.1.2/board/halogen/init.script 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/halogen/init.script 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,42 @@ -+if fatload mmc 0 a0008000 logo*.bmp ; then -+ bmp info a0008000 ; -+ bmp display a0008000 ; -+else -+ lecho "No logo present" ; -+fi -+ -+if fatload mmc 0 a2000000 uim* ; then -+ lecho 'load Linux' -+ if fatload mmc 0 a2200000 mmcinitrd* ; then -+ echo 'using initrd' ; -+ lecho "Booting Linux" -+ set bootargs root=/dev/ram0 console=ttyS0,115200 debug=7 mtdparts=phys_mapped_flash:1024k(armboot),256k(params),-(rootfs1) -+ bootm a2000000 a2200000 -+ else -+ echo 'testing cramfs img' ; -+ if fatload mmc 0 a2200000 cramfs* ; then -+ if cmp.b 00140000 a2200000 $filesize ; then -+ echo 'cramfs images match' ; -+ else -+ lecho 'filesystems differ...' ; -+ protect off all ; -+ erase 00140000 01ffffff ; -+ cp.b a2200000 00140000 $filesize ; -+ fi -+ -+ set bootargs console=ttyS0,115200 debug=7 mtdparts=phys_mapped_flash:1024k(armboot),256k(params),-(rootfs1) root=/dev/mtdblock3 rootfstype=cramfs -+ lecho "Booting Linux" -+ bootm a2000000 -+ fi -+ fi -+else -+ echo "No Linux kernel" ; -+fi -+ -+lecho 'No Linux, try CE' -+ -+if fatload mmc 0 A0030000 nk*.nb0 ; then -+ g A0030000 ; -+else -+ echo "No WinCE image" ; -+fi -diff -u -r --new-file u-boot-1.1.2/board/halogen/Makefile u-boot-1.1.2-neon/board/halogen/Makefile ---- u-boot-1.1.2/board/halogen/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/halogen/Makefile 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,48 @@ -+ -+# -+# (C) Copyright 2000 -+# Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+# -+# See file CREDITS for list of people who contributed to this -+# project. -+# -+# This program is free software; you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation; either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+# MA 02111-1307 USA -+# -+ -+include $(TOPDIR)/config.mk -+ -+LIB = lib$(BOARD).a -+ -+OBJS := halogen.o flash.o -+SOBJS := memsetup.o -+ -+$(LIB): $(OBJS) $(SOBJS) -+ $(AR) crv $@ $(OBJS) $(SOBJS) -+ -+clean: -+ rm -f $(SOBJS) $(OBJS) -+ -+distclean: clean -+ rm -f $(LIB) core *.bak .depend -+ -+######################################################################### -+ -+.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) -+ $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ -+ -+-include .depend -+ -+######################################################################### -diff -u -r --new-file u-boot-1.1.2/board/halogen/memsetup.S u-boot-1.1.2-neon/board/halogen/memsetup.S ---- u-boot-1.1.2/board/halogen/memsetup.S 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/halogen/memsetup.S 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,64 @@ -+/* -+ * Most of this taken from Redboot hal_platform_setup.h with cleanup -+ * -+ * NOTE: I haven't clean this up considerably, just enough to get it -+ * running. See hal_platform_setup.h for the source. See -+ * board/cradle/memsetup.S for another PXA250 setup that is -+ * much cleaner. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include <config.h> -+#include <version.h> -+ -+#define BAUDRATE 115200 -+#include <asm/arch/platformTypes.h> -+#include <configs/select.h> -+#include <asm/arch/pxaGpio.h> -+#include <asm/arch/pxaMacro3.h> -+ -+DRAM_SIZE: .long CFG_DRAM_SIZE -+ -+/* wait for coprocessor write complete */ -+ .macro CPWAIT reg -+ mrc p15,0,\reg,c2,c0,0 -+ mov \reg,\reg -+ sub pc,pc,#4 -+ .endm -+ -+ -+/* -+ * Memory setup -+ */ -+ -+.globl memsetup -+memsetup: -+ -+ mov r10, lr -+ -+ InitCS0_CS1 r0,sp -+ InitGPIO r0,sp -+ InitIC_Clocks r0,sp -+ InitUART r0,sp,UART_BASE,BAUDRATE -+ InitUART r0,sp,UART_BASE+0x600000,9600 -+ InitChangeCPUSpeed r0 -+ InitMemory r0,sp,r1 -+ -+ mov pc, lr -diff -u -r --new-file u-boot-1.1.2/board/halogen/u-boot.lds u-boot-1.1.2-neon/board/halogen/u-boot.lds ---- u-boot-1.1.2/board/halogen/u-boot.lds 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/halogen/u-boot.lds 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,56 @@ -+/* -+ * (C) Copyright 2000 -+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -+OUTPUT_ARCH(arm) -+ENTRY(_start) -+SECTIONS -+{ -+ . = 0x00000000; -+ -+ . = ALIGN(4); -+ .text : -+ { -+ cpu/pxa/start.o (.text) -+ cpu/pxa/ministart.o (.text) -+ *(.text) -+ } -+ -+ . = ALIGN(4); -+ .rodata : { *(.rodata) } -+ -+ . = 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 : { *(.bss) } -+ _end = .; -+} -diff -u -r --new-file u-boot-1.1.2/board/halogen/u-bootmini.lds u-boot-1.1.2-neon/board/halogen/u-bootmini.lds ---- u-boot-1.1.2/board/halogen/u-bootmini.lds 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/halogen/u-bootmini.lds 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,56 @@ -+/* -+ * (C) Copyright 2000 -+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -+OUTPUT_ARCH(arm) -+ENTRY(StartUp) -+SECTIONS -+{ -+ . = 0x00000000; -+ -+ . = ALIGN(4); -+ .text : -+ { -+ cpu/pxa/minidebug.o (.text) -+ cpu/pxa/ministart.o (.text) -+ *(.text) -+ } -+ -+ . = ALIGN(4); -+ .rodata : { *(.rodata) } -+ -+ . = 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 : { *(.bss) } -+ _end = .; -+} -diff -u -r --new-file u-boot-1.1.2/board/neon/config.mk u-boot-1.1.2-neon/board/neon/config.mk ---- u-boot-1.1.2/board/neon/config.mk 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/neon/config.mk 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,4 @@ -+#TEXT_BASE = 0xa1700000 -+TEXT_BASE = 0xA1F00000 -+#TEXT_BASE = 0 -+#PXALCD = 1 -diff -u -r --new-file u-boot-1.1.2/board/neon/.cvsignore u-boot-1.1.2-neon/board/neon/.cvsignore ---- u-boot-1.1.2/board/neon/.cvsignore 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/neon/.cvsignore 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,2 @@ -+.depend -+ -diff -u -r --new-file u-boot-1.1.2/board/neon/flash.c u-boot-1.1.2-neon/board/neon/flash.c ---- u-boot-1.1.2/board/neon/flash.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/neon/flash.c 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,482 @@ -+/* -+ * (C) Copyright 2001 -+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net -+ * -+ * (C) Copyright 2001 -+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include <common.h> -+#include <linux/byteorder/swab.h> -+#include <asm/arch/pxa250Base.h> -+#include <asm/arch/pxaHardware.h> -+#include "lcd.h" -+ -+flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */ -+ -+/* Board support for 1 or 2 flash devices */ -+#define FLASH_PORT_WIDTH32 -+#undef FLASH_PORT_WIDTH16 -+ -+#ifdef FLASH_PORT_WIDTH16 -+#define FLASH_PORT_WIDTH ushort -+#define FLASH_PORT_WIDTHV vu_short -+#define SWAP(x) __swab16(x) -+#else -+#define FLASH_PORT_WIDTH ulong -+#define FLASH_PORT_WIDTHV vu_long -+#define SWAP(x) __swab32(x) -+#endif -+ -+#define FPW FLASH_PORT_WIDTH -+#define FPWV FLASH_PORT_WIDTHV -+ -+#define mb() __asm__ __volatile__ ("" : : : "memory") -+ -+/*----------------------------------------------------------------------- -+ * Functions -+ */ -+static ulong flash_get_size (FPW *addr, flash_info_t *info); -+static int write_data (flash_info_t *info, ulong dest, FPW data); -+static void flash_get_offsets (ulong base, flash_info_t *info); -+void inline spin_wheel_init(ulong addr, ulong cnt); -+void inline spin_wheel_done( int worked ); -+void inline spin_wheel (ulong numleft); -+ -+/*----------------------------------------------------------------------- -+ */ -+ulong bases[] = {PHYS_FLASH_1,PHYS_FLASH_2,1}; -+unsigned long flash_init (void) -+{ -+ int i=0; -+ int j=0; -+ ulong size = 0; -+ ulong base; -+ -+ while (i < CFG_MAX_FLASH_BANKS) { -+ base = bases[j++]; -+ flash_info[i].start[0] = 0; -+ if (base & 1) break; -+ if (flash_get_size ((FPW *) base, &flash_info[i])) { -+ flash_get_offsets (base, &flash_info[i]); -+ size += flash_info[i].size; -+ i++; -+ } -+ else { -+printf( "error reading flash size\n" ); -+ } -+ } -+ if (size>0) { -+ base = flash_info[0].start[0]; -+ // Protect monitor and environment sectors -+ flash_protect ( FLAG_PROTECT_SET, -+ base, -+ base + monitor_flash_len - 1, -+ &flash_info[0] ); -+ -+ flash_protect ( FLAG_PROTECT_SET, -+ base+CFG_ENV_OFFSET, -+ base+CFG_ENV_OFFSET + CFG_ENV_SIZE - 1, &flash_info[0] ); -+ } -+ -+ return size; -+} -+ -+/*----------------------------------------------------------------------- -+ */ -+static void flash_get_offsets (ulong base, flash_info_t *info) -+{ -+ int i; -+ -+ if (info->flash_id == FLASH_UNKNOWN) { -+ return; -+ } -+ -+ if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) { -+ for (i = 0; i < info->sector_count; i++) { -+ info->start[i] = base + (i * PHYS_FLASH_SECT_SIZE); -+ info->protect[i] = 0; -+ } -+ } -+} -+ -+/*----------------------------------------------------------------------- -+ */ -+void flash_print_info (flash_info_t *info) -+{ -+ int i; -+ -+ if (info->flash_id == FLASH_UNKNOWN) { -+ printf ("missing or unknown FLASH type\n"); -+ return; -+ } -+ -+ switch (info->flash_id & FLASH_VENDMASK) { -+ case FLASH_MAN_INTEL: -+ printf ("INTEL "); -+ break; -+ default: -+ printf ("Unknown Vendor "); -+ break; -+ } -+ -+ switch (info->flash_id & FLASH_TYPEMASK) { -+ case FLASH_28F128J3A: -+ printf ("28F128J3A\n"); -+ break; -+ default: -+ printf ("Unknown Chip Type\n"); -+ break; -+ } -+ -+ printf (" Size: %ld MB in %d Sectors\n", -+ info->size >> 20, info->sector_count); -+ -+ printf (" Sector Start Addresses:"); -+ for (i = 0; i < info->sector_count; ++i) { -+ if ((i % 5) == 0) -+ printf ("\n "); -+ printf (" %08lX%s", -+ info->start[i], -+ info->protect[i] ? " (RO)" : " "); -+ } -+ printf ("\n"); -+ return; -+} -+ -+/* -+ * The following code cannot be run from FLASH! -+ */ -+static ulong flash_get_size (FPW *addr, flash_info_t *info) -+{ -+ volatile FPW value; -+ volatile unsigned long *mc = (unsigned long *)MEMORY_CONTROL_BASE; -+ unsigned long val = 1<<3; -+ -+ info->flash_id = FLASH_UNKNOWN; -+ info->sector_count = 0; -+ info->size = 0; -+ -+ if (((ulong)addr) > 0x14000000) return 0; -+ val = mc[(MSC0>>2) +(((ulong)addr)>>27)]; -+ if (((ulong)addr) & 0x04000000) val = val>>16; -+ if ( val & (1<<3)) return 0; //if 16 bit bus then return -+ -+ /* Write auto select command: read Manufacturer ID */ -+ addr[0x5555] = (FPW) 0x00AA00AA; -+ addr[0x2AAA] = (FPW) 0x00550055; -+ addr[0x5555] = (FPW) 0x00900090; -+ -+ mb (); -+ value = addr[0]; -+ -+ switch (value) { -+ -+ case (FPW) 0: -+ case (FPW) STM_MANUFACT: -+ case (FPW) INTEL_MANUFACT & 0xFF0000 : -+ case (FPW) INTEL_MANUFACT & 0x0000FF : -+ case (FPW) INTEL_MANUFACT: -+ info->flash_id = FLASH_MAN_INTEL; -+ break; -+ -+ default: -+printf( "Invalid flash manufacturer %x\n", value ); -+ addr[0] = (FPW) 0x00FF00FF; /* restore read mode */ -+ return (0); /* no or unknown flash */ -+ } -+ -+ mb (); -+ value = addr[1]; /* device ID */ -+ -+ switch (value) { -+ -+ case (FPW) 0: -+ case (FPW) INTEL_ID_28F128J3A & 0xFF0000 : -+ case (FPW) INTEL_ID_28F128J3A & 0x0000FF : -+ case (FPW) INTEL_ID_28F128J3A: -+ info->flash_id += FLASH_28F128J3A; -+ info->sector_count = 128; -+ info->size = 0x02000000; -+ break; /* => 16 MB x 2 */ -+ case (FPW) INTEL_ID_28F320J3A: -+ info->flash_id += FLASH_28F320J3A; -+ info->sector_count = 32 ; -+ info->size = 0x800000 ; -+ break; /* => 4 MB x 2 */ -+ default: -+printf( "Unknown flash device %x\n", value ); -+ info->flash_id = FLASH_UNKNOWN; -+ break; -+ } -+ -+ if (info->sector_count > CFG_MAX_FLASH_SECT) { -+ printf ("** ERROR: sector count %d > max (%d) **\n", -+ info->sector_count, CFG_MAX_FLASH_SECT); -+ info->sector_count = CFG_MAX_FLASH_SECT; -+ } -+ -+ addr[0] = (FPW) 0x00FF00FF; /* restore read mode */ -+ -+ return (info->size); -+} -+ -+ -+/*----------------------------------------------------------------------- -+ */ -+ -+int flash_erase (flash_info_t *info, int s_first, int s_last) -+{ -+ int flag, prot, sect; -+ ulong type, start, last; -+ int rcode = 0; -+ -+ if ((s_first < 0) || (s_first > s_last)) { -+ if (info->flash_id == FLASH_UNKNOWN) { -+ printf ("- missing\n"); -+ } else { -+ printf ("- no sectors to erase\n"); -+ } -+ return 1; -+ } -+ -+ type = (info->flash_id & FLASH_VENDMASK); -+ if ((type != FLASH_MAN_INTEL)) { -+ printf ("Can't erase unknown flash type %08lx - aborted\n", -+ info->flash_id); -+ return 1; -+ } -+ -+ prot = 0; -+ for (sect = s_first; sect <= s_last; ++sect) { -+ if (info->protect[sect]) { -+ prot++; -+ } -+ } -+ -+ if (prot) { -+ printf ("- Warning: %d protected sectors will not be erased!\n", -+ prot); -+ } else { -+ printf ("\n"); -+ } -+ -+ start = get_timer (0); -+ last = start; -+ -+ /* Disable interrupts which might cause a timeout here */ -+ flag = disable_interrupts (); -+ -+ /* Start erase on unprotected sectors */ -+ for (sect = s_first; sect <= s_last; sect++) { -+ if (info->protect[sect] == 0) { /* not protected */ -+ char temp[80]; -+ FPWV *addr = (FPWV *) (info->start[sect]); -+ FPW status; -+ -+ sprintf (temp, "Erasing sector %2d ... \r", sect); -+ lcd_puts( temp ); -+ -+ /* arm simple, non interrupt dependent timer */ -+ reset_timer_masked (); -+ -+ *addr = (FPW) 0x00500050; /* clear status register */ -+ *addr = (FPW) 0x00200020; /* erase setup */ -+ *addr = (FPW) 0x00D000D0; /* erase confirm */ -+ -+ while (((status = *addr) & (FPW) 0x00800080) != (FPW) 0x00800080) { -+ if (get_timer_masked () > CFG_FLASH_ERASE_TOUT) { -+ printf ("Timeout\n"); -+ *addr = (FPW) 0x00B000B0; /* suspend erase */ -+ *addr = (FPW) 0x00FF00FF; /* reset to read mode */ -+ rcode = 1; -+ break; -+ } -+ } -+ -+ *addr = 0x00500050; /* clear status register cmd. */ -+ *addr = 0x00FF00FF; /* resest to read mode */ -+ } -+ } -+ lcd_puts( "\r\n" ); -+ return rcode; -+} -+ -+/*----------------------------------------------------------------------- -+ * Copy memory to flash, returns: -+ * 0 - OK -+ * 1 - write timeout -+ * 2 - Flash not erased -+ * 4 - Flash not identified -+ */ -+ -+int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt) -+{ -+ ulong cp, wp; -+ FPW data; -+ int count, i, l, rc, port_width; -+ -+ rc = 0 ; -+ if (info->flash_id == FLASH_UNKNOWN) { -+ return 4; -+ } -+/* get lower word aligned address */ -+#ifdef FLASH_PORT_WIDTH16 -+ wp = (addr & ~1); -+ port_width = 2; -+#else -+ wp = (addr & ~3); -+ port_width = 4; -+#endif -+ -+ spin_wheel_init(addr,cnt); -+ -+ /* -+ * handle unaligned start bytes -+ */ -+ if ((l = addr - wp) != 0) { -+ data = 0; -+ for (i = 0, cp = wp; i < l; ++i, ++cp) { -+ data = (data << 8) | (*(uchar *) cp); -+ } -+ for (; i < port_width && cnt > 0; ++i) { -+ data = (data << 8) | *src++; -+ --cnt; -+ ++cp; -+ } -+ for (; cnt == 0 && i < port_width; ++i, ++cp) { -+ data = (data << 8) | (*(uchar *) cp); -+ } -+ -+ if ((rc = write_data (info, wp, SWAP (data))) != 0) { -+ goto out; -+ } -+ wp += port_width; -+ } -+ -+ /* -+ * handle word aligned part -+ */ -+ count = 0; -+ while (cnt >= port_width) { -+ data = 0; -+ for (i = 0; i < port_width; ++i) { -+ data = (data << 8) | *src++; -+ } -+ if ((rc = write_data (info, wp, SWAP (data))) != 0) { -+ goto out; -+ } -+ wp += port_width; -+ cnt -= port_width; -+ if (count++ > 0x800) { -+ spin_wheel (cnt); -+ count = 0; -+ } -+ } -+ -+ if (cnt) { -+ /* -+ * handle unaligned tail bytes -+ */ -+ data = 0; -+ for (i = 0, cp = wp; i < port_width && cnt > 0; ++i, ++cp) { -+ data = (data << 8) | *src++; -+ --cnt; -+ } -+ for (; i < port_width; ++i, ++cp) { -+ data = (data << 8) | (*(uchar *) cp); -+ } -+ -+ rc = write_data (info, wp, SWAP (data)); -+ } -+ -+out: -+ spin_wheel_done(0 == rc); -+ return rc ; -+} -+ -+/*----------------------------------------------------------------------- -+ * Write a word or halfword to Flash, returns: -+ * 0 - OK -+ * 1 - write timeout -+ * 2 - Flash not erased -+ */ -+static int write_data (flash_info_t *info, ulong dest, FPW data) -+{ -+ FPWV *addr = (FPWV *) dest; -+ FPW old = *addr ; -+ ulong status; -+ int flag; -+ -+ /* Check if Flash is (sufficiently) erased */ -+ if ((old & data) != data) { -+ printf ("not erased at %08lx (%lx)\n", (ulong) addr, old); -+ return (2); -+ } -+ -+ if( old != data ) -+ { -+ /* Disable interrupts which might cause a timeout here */ -+ flag = disable_interrupts (); -+ -+ *addr = (FPW) 0x00400040; /* write setup */ -+ *addr = data; -+ -+ /* arm simple, non interrupt dependent timer */ -+ reset_timer_masked (); -+ -+ /* wait while polling the status register */ -+ while (((status = *addr) & (FPW) 0x00800080) != (FPW) 0x00800080) { -+ if (get_timer_masked () > CFG_FLASH_WRITE_TOUT) { -+ *addr = (FPW) 0x00FF00FF; /* restore read mode */ -+ return (1); -+ } -+ } -+ *addr = (FPW) 0x00FF00FF; /* restore read mode */ -+ } /* need to program? */ -+ -+ -+ return (0); -+} -+ -+void inline spin_wheel_init(ulong addr, ulong cnt) -+{ -+ char temp[80]; -+ sprintf( temp, -+ "\nprogramming flash\n" -+ "%08lx->%08lx\n" -+ " ", addr, cnt ); -+ lcd_puts( temp ); -+} -+ -+void inline spin_wheel_done( int worked ) -+{ -+ if( worked ) -+ spin_wheel(0); -+ lcd_puts( worked ? "\ncompleted.\n" : "\nfailed!\n" ); -+} -+ -+void inline spin_wheel( ulong numleft ) -+{ -+ char temp[40]; -+ sprintf( temp, "\r %08lx", numleft ); -+ lcd_puts( temp ); -+} -diff -u -r --new-file u-boot-1.1.2/board/neon/init.script u-boot-1.1.2-neon/board/neon/init.script ---- u-boot-1.1.2/board/neon/init.script 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/neon/init.script 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,42 @@ -+if fatload mmc 0 a0008000 logo*.bmp ; then -+ bmp info a0008000 ; -+ bmp display a0008000 ; -+else -+ lecho "No logo present" ; -+fi -+ -+if fatload mmc 0 a2000000 uim* ; then -+ lecho 'load Linux' -+ if fatload mmc 0 a2200000 mmcinitrd* ; then -+ echo 'using initrd' ; -+ lecho "Booting Linux" -+ set bootargs root=/dev/ram0 console=ttyS0,115200 debug=7 mtdparts=phys_mapped_flash:1024k(armboot),256k(params),-(rootfs1) -+ bootm a2000000 a2200000 -+ else -+ echo 'testing cramfs img' ; -+ if fatload mmc 0 a2200000 cramfs* ; then -+ if cmp.b 00140000 a2200000 $filesize ; then -+ echo 'cramfs images match' ; -+ else -+ lecho 'filesystems differ...' ; -+ protect off all ; -+ erase 00140000 01ffffff ; -+ cp.b a2200000 00140000 $filesize ; -+ fi -+ -+ set bootargs console=ttyS0,115200 debug=7 mtdparts=phys_mapped_flash:1024k(armboot),256k(params),-(rootfs1) root=/dev/mtdblock3 rootfstype=cramfs -+ lecho "Booting Linux" -+ bootm a2000000 -+ fi -+ fi -+else -+ echo "No Linux kernel" ; -+fi -+ -+lecho 'No Linux, try CE' -+ -+if fatload mmc 0 A0030000 nk*.nb0 ; then -+ g A0030000 ; -+else -+ echo "No WinCE image" ; -+fi -diff -u -r --new-file u-boot-1.1.2/board/neon/Makefile u-boot-1.1.2-neon/board/neon/Makefile ---- u-boot-1.1.2/board/neon/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/neon/Makefile 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,48 @@ -+ -+# -+# (C) Copyright 2000 -+# Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+# -+# See file CREDITS for list of people who contributed to this -+# project. -+# -+# This program is free software; you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation; either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+# MA 02111-1307 USA -+# -+ -+include $(TOPDIR)/config.mk -+ -+LIB = lib$(BOARD).a -+ -+OBJS := neon.o flash.o rtc_M41T81S.o -+SOBJS := memsetup.o -+ -+$(LIB): $(OBJS) $(SOBJS) -+ $(AR) crv $@ $(OBJS) $(SOBJS) -+ -+clean: -+ rm -f $(SOBJS) $(OBJS) -+ -+distclean: clean -+ rm -f $(LIB) core *.bak .depend -+ -+######################################################################### -+ -+.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) -+ $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ -+ -+-include .depend -+ -+######################################################################### -diff -u -r --new-file u-boot-1.1.2/board/neon/memsetup.S u-boot-1.1.2-neon/board/neon/memsetup.S ---- u-boot-1.1.2/board/neon/memsetup.S 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/neon/memsetup.S 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,64 @@ -+/* -+ * Most of this taken from Redboot hal_platform_setup.h with cleanup -+ * -+ * NOTE: I haven't clean this up considerably, just enough to get it -+ * running. See hal_platform_setup.h for the source. See -+ * board/cradle/memsetup.S for another PXA250 setup that is -+ * much cleaner. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include <config.h> -+#include <version.h> -+ -+#define BAUDRATE 115200 -+#include <asm/arch/platformTypes.h> -+#include <configs/select.h> -+#include <asm/arch/pxaGpio.h> -+#include <asm/arch/pxaMacro3.h> -+ -+DRAM_SIZE: .long CFG_DRAM_SIZE -+ -+/* wait for coprocessor write complete */ -+ .macro CPWAIT reg -+ mrc p15,0,\reg,c2,c0,0 -+ mov \reg,\reg -+ sub pc,pc,#4 -+ .endm -+ -+ -+/* -+ * Memory setup -+ */ -+ -+.globl memsetup -+memsetup: -+ -+ mov r10, lr -+ -+ InitCS0_CS1 r0,sp -+ InitGPIO r0,sp -+ InitIC_Clocks r0,sp -+ InitUART r0,sp,UART_BASE,BAUDRATE -+ InitUART r0,sp,UART_BASE+0x600000,9600 -+ InitChangeCPUSpeed r0 -+ InitMemory r0,sp,r1 -+ -+ mov pc, lr -diff -u -r --new-file u-boot-1.1.2/board/neon/neon.c u-boot-1.1.2-neon/board/neon/neon.c ---- u-boot-1.1.2/board/neon/neon.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/neon/neon.c 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,615 @@ -+/* -+ * (C) Copyright 2002 -+ * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net -+ * -+ * (C) Copyright 2002 -+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com> -+ * Marius Groeger <mgroeger@sysgo.de> -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include <common.h> -+#include <config.h> -+#include <common.h> -+#include <version.h> -+#include <stdarg.h> -+#include <linux/types.h> -+#include <devices.h> -+#include <lcd.h> -+#include <lcd_panels.h> -+ -+#define FASTCLOCK1 0x291A0201 //faster pixel clock: P2S = 1, P2 = 9 (/6) ( panel source 1, divide by 6) -+ // V2S = 1, V2 = 10 (/12) ( crt source 1, divide by 12) -+ // M2S = 0, MR = 2 (/4) (sdram source 1, divide by 4) -+ // M1S = 0, MR = 1 (/2) -+ // miscTimReg[5:4] == 0 (336 MHz) -+ // / 6 == 56 MHz -+ // -+#define FASTCLOCK2 0x291A0201 -+#define FASTCLOCK3 0x00080800 -+ -+#define SLOWCLOCK1 0x0A1A0201 //slow pixel clock: P2S = 0, P2 = 10 (/12) ( panel source 0, divide by 12) -+ // V2S = 1, V2 = 10 (/12) ( crt source 1, divide by 12) -+ // M2S = 0, MR = 2 (/4) (sdram source 1, divide by 4) -+ // M1S = 0, MR = 1 (/2) -+ // miscTimReg[5:4] == 0 (288 MHz) -+ // / 12 == 24 MHz -+ // -+#define SLOWCLOCK2 0x0A1A0A09 -+#define SLOWCLOCK3 0x00090900 -+ -+unsigned long const fbStart = 0x0C000000 ; -+unsigned long const fbMax = 0x00800000 ; // -+ -+unsigned long const mmioStart = 0xFE00000 ; -+unsigned long const mmioLength = 0x00200000 ; -+unsigned long const lcdPaletteRegs = 0xFE80400 ; -+unsigned long const crtPaletteRegs = 0xFE80C00 ; -+unsigned long paletteRegs = 0xFE80400 ; -+ -+const unsigned int sm501_list1[]={ -+ 0x0FE00000, -+ 0x00100000,0x00001002,0x00000000,0x00000000,0x07F127C0,0x05146732,0x40715128,0x00000000, -+ 0x00000000,0x00180002,0x00000002,0x00000002,0x00000000,0x00000000,0x0000001F,0x291A0201, -+ 0x0000001F,0x291A0201,0x00000007,0x291A0201,0x00018000,0x00000000,0x00000000,0x00000000, -+ 0x050100A0,0x00000000,0x00080800}; -+ -+const unsigned int sm501_list2[]={ 0x0fe80000, -+/* 80000 dispctrl */ 0x0F013100, // 0f0d0105 -+/* 80004 pan */ 0x00000000, -+/* 80008 colorkey */ 0x00000000, -+/* 8000C fbaddr */ 0x00000000, -+/* 80010 offsetww */ 0x00000000, // ((LCD_XRES)<<16)+(LCD_XRES), -+/* 80014 fbwidth */ 0x00000000, // (LCD_XRES<<16), -+/* 80018 fbheight */ 0x00000000, // (LCD_YRES<<16), -+/* 8001C tllocate */ 0x00000000, -+/* 80020 brlocate */ 0x00000000, // ((LCD_YRES-1)<<16)+(LCD_XRES-1), -+/* 80024 htotal */ 0x00000000, // ((LCD_BEGIN_OF_LINE_WAIT_COUNT+ -+/* */ // LCD_XRES+ -+/* */ // LCD_END_OF_LINE_WAIT_COUNT+ -+/* */ // LCD_HORIZONTAL_SYNC_PULSE_WIDTH-1)<<16) -+/* */ // +(LCD_XRES-1), -+/* 80028 hsync */ 0x00000000, // (LCD_HORIZONTAL_SYNC_PULSE_WIDTH<<16) -+/* */ // +(LCD_XRES+LCD_BEGIN_OF_LINE_WAIT_COUNT-1), -+/* 8002C vtotal */ 0x00000000, // ((LCD_BEGIN_FRAME_WAIT_COUNT+ -+/* */ // LCD_YRES+ -+/* */ // LCD_END_OF_FRAME_WAIT_COUNT+ -+/* */ // LCD_VERTICAL_SYNC_PULSE_WIDTH-1)<<16) -+/* */ // +(LCD_YRES-1), -+/* 80030 vsync */ 0x00000000, // (LCD_VERTICAL_SYNC_PULSE_WIDTH<<16) -+/* */ // +(LCD_YRES+LCD_BEGIN_FRAME_WAIT_COUNT-1) -+}; -+ -+static unsigned const miscCtrl = 0x00000004 ; -+static unsigned const curClockReg = 0x0000003C ; -+static unsigned const pm0ClockReg = 0x00000044 ; -+static unsigned const pm1ClockReg = 0x0000004C ; -+static unsigned const miscTimReg = 0x00000068 ; -+ -+static unsigned const dispctrlReg = 0x00080000 ; -+static unsigned const offsetReg = 0x00080010 ; // ((xres)<<16)+(xres), -+static unsigned const fbWidthReg = 0x00080014 ; // (xres<<16), -+static unsigned const fbHeightReg = 0x00080018 ; // (yres<<16), -+static unsigned const brLocateReg = 0x00080020 ; // ((yres-1)<<16)+(xres-1), -+static unsigned const hTotalReg = 0x00080024 ; // (left_margin+xres+right_margin+hsync_len-1) << 16 -+ // + xres -+static unsigned const hSyncReg = 0x00080028 ; // (hsync_len<<16) + (xres+left_margin-1) -+static unsigned const vTotalReg = 0x0008002c ; // (top_margin+yres+lower_margin+vsync_len-1) << 16 -+ // + yres-1 -+static unsigned const vSyncReg = 0x00080030 ; // (vsync_len<<16) + yres+top_margin-1 -+ -+/* -+ * CRT regs -+ */ -+static unsigned const crtctrlReg = 0x00080200 ; -+static unsigned const crtFbAddrReg = 0x00080204 ; -+static unsigned const crtFbOffsReg = 0x00080208 ; -+static unsigned const crtFbHTotReg = 0x0008020C ; -+static unsigned const crtFbHSynReg = 0x00080210 ; -+static unsigned const crtFbVTotReg = 0x00080214 ; -+static unsigned const crtFbVSynReg = 0x00080218 ; -+ -+#define DISPCRTL_ENABLE 4 -+ -+#define CLOCK_ACTIVEHIGH 0 -+#define CLOCK_ACTIVELOW (1<<14) -+#define CLOCK_ACTIVEMASK (1<<14) -+ -+#define LCDTYPE_TFT 0 -+#define LCDTYPE_STN12 (3<<18) -+#define LCDTYPE_MASK (3<<18) -+ -+#define READREG( addr ) *( (unsigned long volatile *)((addr)+mmioStart) ) -+#define STUFFREG( addr, value ) *( (unsigned long volatile *)((addr)+mmioStart) ) = (value) -+ -+const unsigned int sm501_list3[]={0x0fe80040, -+ 0x00010000,0x0703E360,0x00200400,0x00A81330,0x0385009C,0x02200240,0x00000000,0x00000000, -+ 0x00EDEDED,0x089C4040,0x0031E3B0}; -+ -+const unsigned int sm501_list4[]={0x0fe80080, -+ 0x00010000,0x05121880,0x28800C00,0x00108030,0x02090040,0x00840050,0x00000000,0x00000000, -+ 0x0141A200,0x020A0802,0x0088D109,0x20820040,0x10800000,0x30029200,0x00080821,0x01010400, -+ 0x44000120,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, -+ 0x00000000,0x00000000,0x00000000,0x00000000}; -+ -+const unsigned int sm501_list5[]={0x0fe800f0, -+ 0x0070F800,0x00780140,0x00000000,0x0000FFFF,0x00010000}; -+ -+struct itemEntry { -+ const int cnt; -+ const unsigned int* p; -+}; -+ -+const struct itemEntry lists[] = { -+ {sizeof(sm501_list1)>>2,sm501_list1}, -+ {sizeof(sm501_list2)>>2,sm501_list2}, -+ {sizeof(sm501_list3)>>2,sm501_list3}, -+ {sizeof(sm501_list4)>>2,sm501_list4}, -+ {sizeof(sm501_list5)>>2,sm501_list5} -+}; -+ -+int lcd_color_fg; -+int lcd_color_bg; -+ -+void *lcd_base; /* Start of framebuffer memory */ -+void *lcd_console_address; /* Start of console buffer */ -+ -+short console_col; -+short console_row; -+ -+ -+ulong calc_fbsize (void) -+{ -+ if( cur_lcd_panel ) -+ { -+ int line_length = (cur_lcd_panel->xres * NBITS (LCD_BPP)) / 8; -+ return ( cur_lcd_panel->yres * line_length ) + PAGE_SIZE ; -+ } -+ else -+ return 0 ; -+} -+ -+void lcd_setcolreg (ushort regno, ushort red, ushort green, ushort blue) -+{ -+ unsigned long *const palette = (unsigned long *)paletteRegs ; -+ unsigned long const rgb = ((unsigned long)red ) << 16 -+ | ((unsigned long)green ) << 8 -+ | blue ; -+ palette[regno] = rgb ; -+} -+ -+void lcd_ctrl_init (void *lcdbase) -+{ -+ unsigned short *fbMem; -+ char *panelName ; -+ -+ unsigned long val=0; -+ const struct itemEntry* l = lists; -+ int count = sizeof(lists)/sizeof(struct itemEntry); -+ printf( "sm501 init start\n"); -+ -+ while (count) { -+ int cnt = l->cnt-1; -+ const unsigned long* p = (unsigned long*)l->p; -+ volatile unsigned int* reg = (unsigned int*)(*p++); -+// printf( "set regs: %p, cnt:%x, from %p, l:%p\n", reg, cnt, p,l ); -+// while (reg==0) { -+// } -+ -+ while (cnt) { -+ val = *p++; -+// printf( "set reg: %p = %x from %p\n", reg, val, p ); -+ *reg++ = val; -+ cnt--; -+ } -+ count--; -+ l++; -+ } -+// printf( "sm501 init middle\n"); -+ -+ panelName = getenv( "panel" ); -+// printf( "after getenv\n"); -+ if( panelName ) -+ { -+ struct lcd_panel_info_t const *panel ; -+ panel = find_lcd_panel( panelName ); -+ if( panel ) -+ { -+ printf( "panel %s found: %u x %u\n", panelName, panel->xres, panel->yres ); -+// printf( "before set_lcd_panel\n"); -+ set_lcd_panel( panel ); -+// printf( "after set_lcd_panel\n"); -+ } -+ else -+ printf( "panel %s not found\n", panelName ); -+ } -+ -+ fbMem = (unsigned short *)fbStart ; -+ lcd_base = fbMem ; -+ -+/* -+Settings for Hitachi 5.7 -+ PANEL_HORIZONTAL_TOTAL, 01c00160); -+ PANEL_HORIZONTAL_SYNC, 00400161); -+ PANEL_VERTICAL_TOTAL, 0x010800f0); -+ PANEL_VERTICAL_SYNC, 0x00020104); -+ -+In bdlogo.bmp - offset 436 is pixel data -+ STUFFREG( hTotalReg, 0x01800140 ); -+ STUFFREG( hSyncReg, 0x0008014f ); -+ STUFFREG( vTotalReg, 0x010700F0 ); -+ STUFFREG( vSyncReg, 0x00020100 ); -+*/ -+ printf( "lcd_ctrl_init exit\n"); -+} -+ -+void lcd_enable (void) -+{ -+} -+ -+#define BIT29 (1<<29) -+ -+static void setClockReg( unsigned reg, unsigned long value ) -+{ -+ unsigned oldValue = READREG( reg ); -+ if( (oldValue & BIT29) != (value&BIT29) ) -+ { -+ oldValue = (oldValue & (~BIT29)) -+ | (value & BIT29); -+ STUFFREG( reg, oldValue ); -+ udelay(16000); -+ } -+ -+ if( oldValue != value ) -+ STUFFREG( reg, value ); -+} -+ -+vidinfo_t panel_info = { -+ vl_col: 320, //this is corrected in SetPanelInfo -+ vl_row: 240, -+ vl_bpix: LCD_BPP, -+ vl_lcd_line_length: (320 * NBITS(LCD_BPP) ) >> 3 -+}; -+ -+static void SetPanelInfo(struct lcd_panel_info_t const *panel) -+{ -+ panel_info.vl_col = panel->xres; -+ panel_info.vl_row = panel->yres; -+ panel_info.vl_bpix = LCD_BPP; -+ panel_info.vl_lcd_line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) >> 3; -+ printf("panel: %ix%ix%i\n",panel_info.vl_col,panel_info.vl_row,(1<<panel_info.vl_bpix)); -+} -+ -+static unsigned long clockRegs[] = { -+ SLOWCLOCK1, SLOWCLOCK2, -+ FASTCLOCK1, FASTCLOCK2 -+}; -+ -+static unsigned const numClockRegs = sizeof(clockRegs)/sizeof(clockRegs[0])/2 ; -+ -+/* -+ * The following tables were built by screen-scraping and sorting -+ * the tables in the SM501 manual: -+ * -+ * Fields are: -+ * frequency in Hz -+ * clock source (0 == 288MHz, 1 == 366 MHz) -+ * select bits (5 bits for panels, 4 bits for CRTs) -+ */ -+#define ENTRIESPERFREQ 3 -+unsigned long const panelFrequencies[] = { -+ 450000/2, 0<<29, 0x17<<24, -+ 525000/2, 1<<29, 0x17<<24, -+ 750000/2, 0<<29, 0x0f<<24, -+ 875000/2, 1<<29, 0x0f<<24, -+ 900000/2, 0<<29, 0x16<<24, -+ 1050000/2, 1<<29, 0x16<<24, -+ 1500000/2, 0<<29, 0x0e<<24, -+ 1750000/2, 1<<29, 0x0e<<24, -+ 1800000/2, 0<<29, 0x15<<24, -+ 2100000/2, 1<<29, 0x15<<24, -+ 2250000/2, 0<<29, 0x07<<24, -+ 2625000/2, 1<<29, 0x07<<24, -+ 3000000/2, 0<<29, 0x0d<<24, -+ 3500000/2, 1<<29, 0x0d<<24, -+ 3600000/2, 0<<29, 0x14<<24, -+ 4200000/2, 1<<29, 0x14<<24, -+ 4500000/2, 0<<29, 0x06<<24, -+ 5250000/2, 1<<29, 0x06<<24, -+ 6000000/2, 0<<29, 0x0c<<24, -+ 7000000/2, 1<<29, 0x0c<<24, -+ 7200000/2, 0<<29, 0x13<<24, -+ 8400000/2, 1<<29, 0x13<<24, -+ 9000000/2, 0<<29, 0x05<<24, -+ 10500000/2, 1<<29, 0x05<<24, -+ 12000000/2, 0<<29, 0x0b<<24, -+ 14000000/2, 1<<29, 0x0b<<24, -+ 14400000/2, 0<<29, 0x12<<24, -+ 16800000/2, 1<<29, 0x12<<24, -+ 18000000/2, 0<<29, 0x04<<24, -+ 21000000/2, 1<<29, 0x04<<24, -+ 24000000/2, 0<<29, 0x0a<<24, -+ 28000000/2, 1<<29, 0x0a<<24, -+ 28800000/2, 0<<29, 0x11<<24, -+ 33600000/2, 1<<29, 0x11<<24, -+ 36000000/2, 0<<29, 0x03<<24, -+ 42000000/2, 1<<29, 0x03<<24, -+ 48000000/2, 0<<29, 0x09<<24, -+ 56000000/2, 1<<29, 0x09<<24, -+ 57600000/2, 0<<29, 0x10<<24, -+ 67200000/2, 1<<29, 0x10<<24, -+ 72000000/2, 0<<29, 0x02<<24, -+ 84000000/2, 1<<29, 0x02<<24, -+ 96000000/2, 0<<29, 0x08<<24, -+ 112000000/2, 1<<29, 0x08<<24, -+ 144000000/2, 0<<29, 0x01<<24, -+ 168000000/2, 1<<29, 0x01<<24, -+ 288000000/2, 0<<29, 0x00<<24, -+ 336000000/2, 1<<29, 0x00<<24 -+}; -+#define numPanelFrequencies (sizeof(panelFrequencies)/sizeof(panelFrequencies[0])/ENTRIESPERFREQ) -+ -+unsigned long const crtFrequencies[] = { -+ 750000/2, 0<<20, 0x0f<<16, -+ 875000/2, 1<<20, 0x0f<<16, -+ 1500000/2, 0<<20, 0x0e<<16, -+ 1750000/2, 1<<20, 0x0e<<16, -+ 2250000/2, 0<<20, 0x07<<16, -+ 2625000/2, 1<<20, 0x07<<16, -+ 3000000/2, 0<<20, 0x0d<<16, -+ 3500000/2, 1<<20, 0x0d<<16, -+ 4500000/2, 0<<20, 0x06<<16, -+ 5250000/2, 1<<20, 0x06<<16, -+ 6000000/2, 0<<20, 0x0c<<16, -+ 7000000/2, 1<<20, 0x0c<<16, -+ 9000000/2, 0<<20, 0x05<<16, -+ 10500000/2, 1<<20, 0x05<<16, -+ 12000000/2, 0<<20, 0x0b<<16, -+ 14000000/2, 1<<20, 0x0b<<16, -+ 18000000/2, 0<<20, 0x04<<16, -+ 21000000/2, 1<<20, 0x04<<16, -+ 24000000/2, 0<<20, 0x0a<<16, -+ 28000000/2, 1<<20, 0x0a<<16, -+ 36000000/2, 0<<20, 0x03<<16, -+ 42000000/2, 1<<20, 0x03<<16, -+ 48000000/2, 0<<20, 0x09<<16, -+ 56000000/2, 1<<20, 0x09<<16, -+ 72000000/2, 0<<20, 0x02<<16, -+ 84000000/2, 1<<20, 0x02<<16, -+ 96000000/2, 0<<20, 0x08<<16, -+ 112000000/2, 1<<20, 0x08<<16, -+ 144000000/2, 0<<20, 0x01<<16, -+ 168000000/2, 1<<20, 0x01<<16, -+ 288000000/2, 0<<20, 0x00<<16, -+ 336000000/2, 1<<20, 0x00<<16 -+}; -+#define numCrtFrequencies (sizeof(crtFrequencies)/sizeof(crtFrequencies[0])/ENTRIESPERFREQ) -+ -+unsigned long const * const frequencies[] = { -+ panelFrequencies, -+ crtFrequencies -+}; -+ -+unsigned const numFrequencies[] = { -+ numPanelFrequencies, -+ numCrtFrequencies -+}; -+ -+static unsigned long const clockMasks[] = { -+ 0x3F<<24, -+ 0x1F<<16 -+}; -+ -+static void updateCRT( unsigned long const *freq, -+ struct lcd_panel_info_t const *panel ) -+{ -+ unsigned long reg ; -+ unsigned long crtCtrl = 0x00010304 ; // FIFO 3 or more, CRT Timing, CRT data, enable 8-bit -+ if( panel->act_high ) -+ crtCtrl |= (3<<14); // horizontal and vertical phase -+ STUFFREG( crtFbAddrReg, 0 ); -+ STUFFREG( crtFbOffsReg, ((panel->xres)<<16)+(panel->xres) ); -+ STUFFREG( crtFbHTotReg, (( panel->left_margin -+ +panel->xres -+ +panel->right_margin -+ +panel->hsync_len - 1) << 16 ) -+ + panel->xres-1 ); -+ STUFFREG( crtFbHSynReg, (panel->hsync_len<<16)+ (panel->xres+panel->left_margin-1) ); -+ STUFFREG( crtFbVTotReg, (( panel->upper_margin -+ +panel->yres -+ +panel->lower_margin -+ +panel->vsync_len-1 ) << 16 ) -+ + panel->yres-1 ); -+ STUFFREG( crtFbVSynReg,(panel->vsync_len<<16) -+ + panel->yres+panel->upper_margin-1 ); -+ STUFFREG( crtctrlReg, crtCtrl ); // enable -+ -+ reg = READREG( miscCtrl ) & ~0x1000 ; -+ STUFFREG( miscCtrl, reg ); -+} -+ -+void set_lcd_panel( struct lcd_panel_info_t const *panel ) -+{ -+ unsigned long dispctrl = READREG( dispctrlReg ); -+ dispctrl &= ~(CLOCK_ACTIVEMASK|LCDTYPE_MASK); -+ if( !panel->act_high ) -+ dispctrl |= CLOCK_ACTIVELOW ; -+ else -+ dispctrl &= ~CLOCK_ACTIVEMASK ; -+ -+ if( !panel->active ) -+ dispctrl |= LCDTYPE_STN12 ; -+ else -+ dispctrl &= ~LCDTYPE_MASK ; -+ -+ if (panel->crt==0) dispctrl |= 4; -+ -+ STUFFREG( offsetReg, ((panel->xres)<<16)+(panel->xres) ); -+ STUFFREG( fbWidthReg, (panel->xres<<16) ); -+ STUFFREG( fbHeightReg, (panel->yres<<16) ); -+ STUFFREG( brLocateReg, ((panel->yres-1)<<16)+(panel->xres-1) ); -+ STUFFREG( hTotalReg, (( panel->left_margin -+ +panel->xres -+ +panel->right_margin -+ +panel->hsync_len - 1) << 16 ) -+ + panel->xres-1 ); -+ STUFFREG( hSyncReg, (panel->hsync_len<<16)+ (panel->xres+panel->left_margin-1) ); -+ STUFFREG( vTotalReg, (( panel->upper_margin -+ +panel->yres -+ +panel->lower_margin -+ +panel->vsync_len-1 ) << 16 ) -+ + panel->yres-1 ); -+ STUFFREG( vSyncReg, (panel->vsync_len<<16) -+ + panel->yres+panel->upper_margin-1 ); -+ -+ if( panel->pixclock < numClockRegs ) -+ { -+ unsigned long const *clk = clockRegs+(panel->pixclock*2); -+ setClockReg( curClockReg, *clk ); -+ setClockReg( pm0ClockReg, *clk++ ); -+ setClockReg( pm1ClockReg, *clk ); -+ } -+ else -+ { -+ int const isCRT = (0 != panel->crt); -+ int crt ; -+ -+ for( crt = 0 ; crt < 2 ; crt++ ) -+ { -+ unsigned long reg ; -+ unsigned long const *freq = frequencies[crt]; -+ unsigned const count = numFrequencies[crt]; -+ -+ unsigned long f, diffl, diffh ; -+ int i ; -+ unsigned long low, high ; -+ -+ // -+ // linear scan for closest frequency -+ // -+ for( i = 0 ; i < count ; i++, freq += ENTRIESPERFREQ ) -+ { -+ if( *freq > panel->pixclock ) -+ break; -+ } -+ -+ low = (i > 0) -+ ? freq[0-ENTRIESPERFREQ] -+ : 0 ; -+ diffl = panel->pixclock - low ; -+ -+ high = (i < count ) -+ ? *freq -+ : 0xFFFFFFFF ; -+ diffh = high - panel->pixclock ; -+ -+ if( diffh < diffl ) -+ { -+ f = high ; -+ } -+ else -+ { -+ f = low ; -+ freq-- ; -+ } -+ -+ printf( "pixclock == %lu, frequency %u/%u -> %lu\n", -+ panel->pixclock, low, high, f ); -+ -+ reg = READREG( curClockReg ) & ~(clockMasks[crt]); -+ -+ // Clock source -+ printf( "source %u, divisor %u\n", freq[1], freq[2] ); -+ reg |= freq[1]; -+ reg |= freq[2]; -+ -+ setClockReg( curClockReg, reg ); -+ setClockReg( pm0ClockReg, reg ); -+ setClockReg( pm1ClockReg, reg ); -+ -+ if( isCRT ) -+ { -+ paletteRegs = crtPaletteRegs ; -+ updateCRT( freq, panel ); -+ } -+ else -+ paletteRegs = lcdPaletteRegs ; -+ } -+ } -+ STUFFREG( dispctrlReg, dispctrl ); -+ cur_lcd_panel = panel ; -+ SetPanelInfo(panel); -+} -+ -+void disable_lcd_panel( void ) -+{ -+ unsigned long dispctrl = READREG( dispctrlReg ); -+ unsigned long crtctrl = READREG( crtctrlReg ); -+ -+ dispctrl &= ~(DISPCRTL_ENABLE); -+ STUFFREG( dispctrlReg, dispctrl ); -+ -+ crtctrl &= ~(DISPCRTL_ENABLE); -+ STUFFREG( crtctrlReg, crtctrl ); -+} -+ -+/* ------------------------------------------------------------------------- */ -+ -+ -+/* -+ * Miscelaneous platform dependent initialisations -+ */ -+ -+int board_init (void) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ /* memory and cpu-speed are setup before relocation */ -+ /* so we do _nothing_ here */ -+ -+ /* arch number of Neon Board */ -+ gd->bd->bi_arch_number = MACH_TYPE_BD2003 ; -+ -+ /* adress of boot parameters */ -+ gd->bd->bi_boot_params = 0xa0000100; -+ -+ /* address of frame buffer */ -+ gd->fb_base = fbStart ; -+ -+ return 0; -+} -+ -+int board_late_init(void) -+{ -+ setenv("stdout", "serial"); -+ setenv("stderr", "serial"); -+ return 0; -+} -+ -+ -+int dram_init (void) -+{ -+ DECLARE_GLOBAL_DATA_PTR; -+ -+ gd->bd->bi_dram[0].start = PHYS_SDRAM_1; -+ gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; -+ -+ return 0; -+} -diff -u -r --new-file u-boot-1.1.2/board/neon/rtc_M41T81S.c u-boot-1.1.2-neon/board/neon/rtc_M41T81S.c ---- u-boot-1.1.2/board/neon/rtc_M41T81S.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/neon/rtc_M41T81S.c 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,663 @@ -+/* -+ * M41T81S: -+ * -+ * This module defines a single 'rtc' command to read/write or -+ * test the ST Micro Real Time Clock attached to the SM-501 -+ * I2C pins. -+ * -+ * If called with no parameters, it will display the current time -+ * to the console device and set the 'time' environment variable. -+ * -+ * If called with a single parameter of "test", it will read the -+ * current time, wait a second and read the current time again. -+ * It will return success (zero) if the RTC time appears to tick -+ * by 1 second. -+ * -+ * If called with one or two parameters that appear to fit an -+ * ISO 8601 time format (i.e. YYYY-MM-DD HH:MM:SS.00 ), it will -+ * set the date and time. -+ * -+ * Copyright (c) Boundary Devices, 2006 -+ * -+ */ -+#include "sm501.h" -+#include <config.h> -+#include <common.h> -+#include <version.h> -+#include <stdarg.h> -+#include <command.h> -+ -+int WriteI2C(int bVal); -+int ReadI2C(int ack); -+int I2CStart(int bSlaveAddress); -+void I2CStop(void); -+void I2CInit(void); -+ -+////////////////////////////////////////////////////////// -+ -+#define SM501_GPIO_DATA 0x10000 -+#define SM501_GPIO_DIR 0x10008 -+ -+#define INPUT 0 -+#define OUTPUT 1 -+ -+#define I2C_CLK 46 -+#define I2C_DATA 47 -+#define GPBIT_MASK(bitnum) (1<<(bitnum&0x1f)) -+#define GPBIT_TEST(bitnum) ( (ReadReg(SM501_GPIO_DATA + ((bitnum>>5)<<2))) & (1<<(bitnum&0x1f)) ) -+#define GPBIT_TESTBIT(c,bitnum) ( c & (1<<(bitnum&0x1f)) ) -+#define GPBIT_SET(x,bitnum,value) ( (value) ? ((x) | (1<<(bitnum&0x1f))) : ((x) & ~(1<<(bitnum&0x1f))) ) -+ -+//0.400 Mhz protocol = 1/.4 uSec = 10/4 uSec = 2.5 uSec -+//4 should be safe -+#define I2CWait 4 -+#define LongBusWait 8 -+#define StartBusWait 12 -+ -+typedef struct { -+ unsigned short wYear; -+ unsigned short wMonth; -+ unsigned short wDayOfWeek; -+ unsigned short wDay; -+ unsigned short wHour; -+ unsigned short wMinute; -+ unsigned short wSecond; -+ unsigned short wMilliseconds; -+} SYSTEMTIME ; -+ -+typedef SYSTEMTIME *LPSYSTEMTIME ; -+ -+void I2CInit(void) -+{ -+ int i; -+ -+ for(i=0; i<9; i++) -+ { -+ I2CStop(); -+ } -+} -+ -+ -+#define ReadReg(reg) READ_SM501_REG(reg) -+#define WriteReg(reg,data) STUFF_SM501_REG((reg), (data)) -+ -+void SetVal_ClkData(int clk,int data) -+{ -+#if (I2C_DATA>>5)==(I2C_CLK>>5) -+ ulong c = ReadReg( SM501_GPIO_DATA + ((I2C_DATA>>5)<<2) ); -+ c = GPBIT_SET(c, I2C_DATA, data); -+ c = GPBIT_SET(c, I2C_CLK, clk); -+ WriteReg(SM501_GPIO_DATA + ((I2C_DATA>>5)<<2), c); -+#else -+ ulong c = ReadReg( SM501_GPIO_DATA + ((I2C_DATA>>5)<<2) ); -+ c = GPBIT_SET(c, I2C_DATA, data); -+ WriteReg(SM501_GPIO_DATA + ((I2C_DATA>>5)<<2), c); -+ -+ c = ReadReg( SM501_GPIO_DATA + ((I2C_CLK>>5)<<2) ); -+ c = GPBIT_SET(c, I2C_CLK, clk); -+ WriteReg(SM501_GPIO_DATA + ((I2C_CLK>>5)<<2), c); -+#endif -+} -+ -+void SetDir_ClkData(int clk,int data) -+{ -+ ulong c,c1; -+#if (I2C_DATA>>5)==(I2C_CLK>>5) -+ c = ReadReg( SM501_GPIO_DIR + ((I2C_CLK>>5)<<2) ); -+ if (clk==OUTPUT) { -+ //will be low, and can then change data -+ c1 = GPBIT_SET(c, I2C_CLK, OUTPUT); -+ if (c!=c1) WriteReg( SM501_GPIO_DIR + ((I2C_CLK>>5)<<2), c1); -+ c = GPBIT_SET(c1, I2C_DATA, data); -+ } else { -+ //clk might be low currently, so change data 1st -+ c1 = GPBIT_SET(c, I2C_DATA, data); -+ if (c!=c1) WriteReg( SM501_GPIO_DIR + ((I2C_DATA>>5)<<2), c1); -+ c = GPBIT_SET(c1, I2C_CLK, INPUT); -+ } -+ if (c!=c1) WriteReg( SM501_GPIO_DIR + ((I2C_CLK>>5)<<2), c); -+#else -+ if (clk==OUTPUT) { -+ //will be low, and can then change data -+ c = ReadReg( SM501_GPIO_DIR + ((I2C_CLK>>5)<<2) ); -+ c1 = GPBIT_SET(c, I2C_CLK, OUTPUT); -+ if (c!=c1) WriteReg( SM501_GPIO_DIR + ((I2C_CLK>>5)<<2), c1); -+ -+ c1 = ReadReg( SM501_GPIO_DIR + ((I2C_DATA>>5)<<2) ); -+ c = GPBIT_SET(c1, I2C_DATA, data); -+ if (c!=c1) WriteReg( SM501_GPIO_DIR + ((I2C_DATA>>5)<<2), c); -+ } else { -+ //clk might be low currently, so change data 1st -+ c = ReadReg( SM501_GPIO_DIR + ((I2C_DATA>>5)<<2) ); -+ c1 = GPBIT_SET(c, I2C_DATA, data); -+ if (c!=c1) WriteReg( SM501_GPIO_DIR + ((I2C_DATA>>5)<<2), c1); -+ -+ c1 = ReadReg( SM501_GPIO_DIR + ((I2C_CLK>>5)<<2) ); -+ c = GPBIT_SET(c1, I2C_CLK, INPUT); -+ if (c!=c1) c1WriteReg( SM501_GPIO_DIR + ((I2C_CLK>>5)<<2), c); -+ } -+#endif -+} -+void SetDir_Clk(int clk) -+{ -+ ulong c = ReadReg( SM501_GPIO_DIR + ((I2C_CLK>>5)<<2) ); -+ c = GPBIT_SET(c, I2C_CLK, clk); -+ WriteReg( SM501_GPIO_DIR + ((I2C_CLK>>5)<<2), c); -+} -+ -+void I2CStop() -+{ -+ SetDir_Clk(OUTPUT); //low clock -+ udelay(I2CWait); -+ SetDir_ClkData(OUTPUT,OUTPUT); //low clock, low data -+ udelay(I2CWait); -+ -+ //Drive Write SCL High -+ SetDir_Clk(INPUT); //high clock -+ udelay(I2CWait); -+ -+ // Drive Write SDA High -+ SetDir_ClkData(INPUT,INPUT); //transition on data from low to high while clock is high is a stop control signal -+ udelay(LongBusWait); -+ -+} -+ -+ -+//return 0 for success -+int WriteI2C(int bVal) -+{ -+ -+ int mask; -+ int i; -+ -+ // Enable Write SDA and SCL, and Drv SCL low -+ SetDir_Clk(OUTPUT); //clock low -+ udelay(I2CWait); //hold time -+ -+ for (mask=0x80; mask; mask>>=1) -+ { -+ SetDir_ClkData(OUTPUT, (bVal & mask) ? INPUT : OUTPUT); // Write data bits to SDA -+ udelay(LongBusWait); -+ -+ SetDir_Clk(INPUT); // Drv CLK High -+ udelay(I2CWait); -+ -+ SetDir_Clk(OUTPUT); // Drv CLK Low -+ udelay(I2CWait); //hold time after clock goes low -+ } -+ -+ -+ SetDir_ClkData(OUTPUT,INPUT); // Disable Write SDA -+ udelay(LongBusWait); //wait for acknowledge to be placed on SDA -+ SetDir_Clk(INPUT); // Drive Clock High -+ -+ // Read SDA, until SDA==0 -+ for (i=0; i<255; i++) { -+ udelay(LongBusWait); -+ if (!GPBIT_TEST(I2C_DATA)) { -+ SetDir_Clk(OUTPUT); // Drv Clk LOW -+ return 0; //success -+ } -+ } -+ -+ printf( "WriteI2C(%i) failed\n", bVal ); -+ return -1; -+} -+ -+int ReadI2C(int ack) -+{ -+ int mask; -+ int byRet = 0; -+ -+// SetVal_ClkData(0,0); -+ SetDir_Clk(OUTPUT); //clock low -+ udelay(I2CWait); //hold time -+ -+ SetDir_ClkData(OUTPUT,INPUT); //clock low, data input -+ for (mask=0x80; mask; mask>>=1) -+ { -+ // Disable Write SDA, Drive SCL to LOW -+ SetDir_Clk(OUTPUT); //clock low -+ udelay(LongBusWait); -+ -+ // Enable Write SCL, Drive SCL to HIGH -+ SetDir_Clk(INPUT); //clock high -+ udelay(I2CWait); -+ -+ // Read data bits from SDA -+ if (GPBIT_TEST(I2C_DATA)) byRet |= mask; //sample data bit -+ } -+ -+ SetDir_Clk(OUTPUT); //clock low -+ udelay(I2CWait); //let them stop driving data line -+ -+ if (ack) { -+ SetDir_ClkData(OUTPUT,OUTPUT); //clock low, data low for ack -+ } -+ udelay(I2CWait); -+ SetDir_Clk(INPUT); //clock high -+ udelay(I2CWait); //wait ack/noack phase -+ return byRet; -+ -+} -+ -+int I2CStart(int SlaveAddress) -+{ -+ int ret; -+ udelay(I2CWait); -+ // Enable Write SDA and Write SCL, and drive them high -+ SetDir_ClkData(INPUT,INPUT); -+ SetVal_ClkData(0,0); //they float high anyway -+ udelay(StartBusWait); -+ -+ // Drive Data -+ SetDir_ClkData(INPUT,OUTPUT); //drive data low, (high to low transition on data, while clock high is start signal) -+ udelay(StartBusWait); -+ -+ ret = WriteI2C(SlaveAddress); -+ if (ret) { -+ printf( "I2CStart failed write of device address\n" ); -+ } -+ return ret; -+} -+ -+#define M41T81S_SlaveAddrWrite 0xd0 -+#define M41T81S_SlaveAddrRead 0xd1 -+ -+#define M_HUNDREDTHS 0 //00-99 BCD -+#define M_SECONDS 1 //00-59 BCD, bit 7 ST (oscillator is stopped bit) -+#define M_MINUTES 2 //00-59 BCD -+#define M_HOURS 3 //high 2 bits are CENTURY, low 6 BCD 00-23 -+#define M_WEEKDAY 4 //01-07 -+#define M_DAY 5 //01-31 BCD -+#define M_MONTH 6 //01-12 BCD -+#define M_YEAR 7 //00-99 BCD -+#define M_CALIBRATION 8 -+#define M_WATCHDOG 9 -+#define M_ALARM_MOTH 0x0a //01-12 BCD, high 3 bits enable -+#define M_ALARM_DAY 0x0b //01-31 BCD. high 2 bits RPT4, RPT5 -+#define M_ALARM_HOUR 0x0c //00-23 BCD, high 2 bits RPT3, HT -+#define M_ALARM_MINUTES 0x0d //00-59 BCD, high bit RPT2 -+#define M_ALARM_SECONDS 0x0e //00-59 BCD, high bit RPT1 -+#define M_FLAGS 0x0f //bit 7(WDF), 6(AF), 4(BL), 2(OF) -+#define M_SQW 0x13 //bit 7(RS3), 6(RS2), 5(RS1), 4(RS0) -+ -+//M_FLAGS bit mask definitions -+#define MF_WDF 0x80 //Watchdog flag -+#define MF_AF 0x40 //Alarm flag -+#define MF_BL 0x10 //Battery low -+#define MF_OF 0x04 //Oscillator fail -+static int bcd(int val,int low, int high) -+{ -+ int tens = val>>4; -+ int ones = val & 0xf; -+ if ((tens > 9) || (ones > 9)) return -1; -+ val = (tens*10) + ones; -+ if ((val < low) || (val > high)) return -1; -+ return val; -+} -+static unsigned char toBcd(int val) -+{ -+ int tens = val/10; -+ int rem = val - (tens*10); -+ if (tens >= 10) tens = tens % 10; -+ return (tens<<4) | rem; -+} -+ -+static int GetTime(LPSYSTEMTIME lpst) -+{ -+ unsigned char b[M_YEAR+1]; -+ unsigned char * p = b; -+ unsigned char flags; -+ int i; -+ I2CInit(); //send a bunch of stops -+ -+ if (I2CStart(M41T81S_SlaveAddrWrite)) return -1; -+ if (WriteI2C(M_ALARM_HOUR)) return -1; -+ if (I2CStart(M41T81S_SlaveAddrRead)) return -1; -+ -+ b[0] = (unsigned char)ReadI2C(0); //read Halt bit -+ I2CStop(); -+ -+ if (b[0] & 0x40) { -+ //halted, restart it -+ if (I2CStart(M41T81S_SlaveAddrWrite)) return -1; -+ if (WriteI2C(M_ALARM_HOUR)) return -1; -+ if (WriteI2C(b[0] & ~0x40)) return -1; //clear Halt bit -+ I2CStop(); -+ } -+ -+ if (I2CStart(M41T81S_SlaveAddrWrite)) return -1; -+ if (WriteI2C(M_HUNDREDTHS)) return -1; -+ if (I2CStart(M41T81S_SlaveAddrRead)) return -1; -+ for (i=0; i<M_YEAR; i++) *p++ = (unsigned char)ReadI2C(1); -+ *p++ = (unsigned char)ReadI2C(0); //read year -+ I2CStop(); -+ -+ if (I2CStart(M41T81S_SlaveAddrWrite)) return -1; -+ if (WriteI2C(M_FLAGS)) return -1; -+ if (I2CStart(M41T81S_SlaveAddrRead)) return -1; -+ flags = (unsigned char)ReadI2C(0); //read flags -+ I2CStop(); -+ -+ if (flags & MF_BL) { -+ printf( "M41T81S_GetTime: Battery low\n" ); -+ } -+ if (flags & MF_OF) { -+ printf( "M41T81S_GetTime: Oscillator failed\n" ); -+ -+ //stop oscillator -+ if (I2CStart(M41T81S_SlaveAddrWrite)) return -1; -+ if (WriteI2C(M_SECONDS)) return -1; -+ if (WriteI2C(b[M_SECONDS] | 0x80)) return -1; //set stop bit -+ I2CStop(); -+ -+ //start oscillator -+ if (I2CStart(M41T81S_SlaveAddrWrite)) return -1; -+ if (WriteI2C(M_SECONDS)) return -1; -+ if (WriteI2C(b[M_SECONDS] & ~0x80)) return -1; //clear stop bit -+ I2CStop(); -+ } -+ -+ -+ lpst->wYear = ( (b[M_YEAR] > 0x99) || ((b[M_YEAR]&0xf) > 0x9) ) ? 0 : -+ (bcd(b[M_YEAR],0,99) + ( (b[M_HOURS]&0x40) ? 2100 : 2000)); -+ lpst->wMonth = bcd(b[M_MONTH],1,12); -+ lpst->wDayOfWeek = bcd(b[M_WEEKDAY],1,7); -+ lpst->wDay = bcd(b[M_DAY],1,31); -+ lpst->wHour = bcd(b[M_HOURS]&0x3f,0,23); -+ lpst->wMinute = bcd(b[M_MINUTES],0,59); -+ lpst->wSecond = bcd(b[M_SECONDS]&0x7f,0,59); -+ lpst->wMilliseconds = bcd(b[M_HUNDREDTHS],0,99)*10; -+ -+ if (b[M_SECONDS] & 0x80) { -+ //oscillator is stopped, restart it -+ if (I2CStart(M41T81S_SlaveAddrWrite)) return -1; -+ if (WriteI2C(M_SECONDS)) return -1; -+ if (WriteI2C(b[M_SECONDS] & ~0x80)) return -1; //clear stop bit -+ I2CStop(); -+ } -+ -+/* -+ printf( "M41T81S_GetTime: Year:%u, Month:%u, Day:%u, Hour:%u, Minute:%u, second:%u, milli:%u\n", -+ lpst->wYear, lpst->wMonth,lpst->wDay, lpst->wHour, lpst->wMinute, lpst->wSecond,lpst->wMilliseconds ); -+*/ -+ if (flags & MF_OF) { -+ if (I2CStart(M41T81S_SlaveAddrWrite)) return -1; -+ if (WriteI2C(M_FLAGS)) return -1; -+ if (WriteI2C(flags & ~MF_OF)) return -1; //clear oscillator failed bit -+ I2CStop(); -+ } -+ return 0; -+} -+ -+static int SetTime(LPSYSTEMTIME lpst) -+{ -+ unsigned char b[M_YEAR+1]; -+ unsigned char flags; -+ int i; -+ if (lpst->wYear < 2004) { -+ lpst->wYear = 2004; //don't allow it to be set in the far past. -+ lpst->wMonth = 1; -+ lpst->wDay = 1; -+ lpst->wDayOfWeek = 4; //Thursday Jan. 1, 2004 -+ } -+ -+/* printf( "M41T81S_SetTime: Year:%u, Month:%u, Day:%u, Hour:%u, Minute:%u, second:%u, milli:%u\n", -+ lpst->wYear, lpst->wMonth,lpst->wDay, lpst->wHour, lpst->wMinute, lpst->wSecond,lpst->wMilliseconds ); -+*/ -+ b[M_HUNDREDTHS] = 0; //toBcd(lpst->wMilliseconds/10); -+ b[M_SECONDS] = toBcd(lpst->wSecond); -+ b[M_MINUTES] = toBcd(lpst->wMinute); -+ b[M_HOURS] = toBcd(lpst->wHour) | ( ((lpst->wYear % 200) >= 100) ? 0xc0 : 0x80); -+ b[M_WEEKDAY] = (unsigned char)lpst->wDayOfWeek; -+ b[M_DAY] = toBcd(lpst->wDay); -+ b[M_MONTH] = toBcd(lpst->wMonth); -+ b[M_YEAR] = toBcd( lpst->wYear % 100); -+ -+ if (I2CStart(M41T81S_SlaveAddrWrite)) return -1; -+ if (WriteI2C(M_HUNDREDTHS)) return -1; -+ -+ for (i=M_HUNDREDTHS; i<=M_YEAR; i++) { -+ if (WriteI2C(b[i])) return -1; -+ } -+ I2CStop(); -+ -+ if (I2CStart(M41T81S_SlaveAddrWrite)) return -1; -+ if (WriteI2C(M_FLAGS)) return -1; -+ if (I2CStart(M41T81S_SlaveAddrRead)) return -1; -+ flags = (unsigned char)ReadI2C(0); //read flags -+ I2CStop(); -+ -+/* printf( "M41T81S_SetTime: Year:%u, Month:%u, Day:%u, Weekday:%u, Hour:%u, Minute:%u, second:%u flags:%u\n", -+ lpst->wYear, lpst->wMonth, lpst->wDay, lpst->wDayOfWeek, lpst->wHour, lpst->wMinute, lpst->wSecond, flags ); -+*/ -+ -+ if (flags & MF_OF) { -+ if (I2CStart(M41T81S_SlaveAddrWrite)) return -1; -+ if (WriteI2C(M_FLAGS)) return -1; -+ if (WriteI2C(flags & ~MF_OF)) return -1; //clear oscillator failed bit -+ I2CStop(); -+ } -+ return 0; -+} -+ -+int M41T81S_GetTime(LPSYSTEMTIME lpst) -+{ -+ int ret; -+ int reg = (READ_SM501_REG(SMIR_POWER_MODE_CONTROL) & 1) ? SMIR_PWRM1_GATE : SMIR_PWRM0_GATE; -+ int gate = READ_SM501_REG(reg); -+ if ((gate & 0x40)==0) STUFF_SM501_REG(reg, gate | 0x40); -+ STUFF_SM501_REG(SMIR_GPIO_32_63_CONTROL, -+ READ_SM501_REG(SMIR_GPIO_32_63_CONTROL) -+ & ~(GPBIT_MASK(I2C_CLK)|GPBIT_MASK(I2C_DATA))); // set as gpio controlled -+ udelay(LongBusWait); -+ ret = GetTime(lpst); -+ udelay(I2CWait); -+ SetDir_ClkData(INPUT,INPUT); //high clock, high data, just for safety, should be input already -+ if ((gate & 0x40)==0){ -+ STUFF_SM501_REG( reg, -+ READ_SM501_REG( reg ) -+ & ~0x40 ); //disable gpio if was originally -+ } -+ -+ return ret; -+} -+int M41T81S_SetTime(LPSYSTEMTIME lpst) -+{ -+ int ret; -+ int reg = (READ_SM501_REG(SMIR_POWER_MODE_CONTROL) & 1) ? SMIR_PWRM1_GATE : SMIR_PWRM0_GATE; -+ int gate = READ_SM501_REG(reg); -+ if ((gate & 0x40)==0) STUFF_SM501_REG(reg, gate | 0x40); -+ STUFF_SM501_REG(SMIR_GPIO_32_63_CONTROL, -+ READ_SM501_REG(SMIR_GPIO_32_63_CONTROL) -+ & ~(GPBIT_MASK(I2C_CLK)|GPBIT_MASK(I2C_DATA))); // set as gpio controlled -+ udelay(LongBusWait); -+ ret = SetTime(lpst); -+ udelay(I2CWait); -+ SetDir_ClkData(INPUT,INPUT); //high clock, high data, just for safety, should be input already -+ if ((gate & 0x40)==0){ -+ STUFF_SM501_REG( reg, -+ READ_SM501_REG( reg ) -+ & ~0x40 ); //disable gpio if was originally -+ } -+ -+ return ret; -+} -+ -+static int badTime( LPSYSTEMTIME lpst ) -+{ -+ return ( 1 > lpst->wMonth) -+ || -+ ( 12 < lpst->wMonth) -+ || -+ ( 1 > lpst->wDay) -+ || -+ ( 12 < lpst->wDay) -+ || -+ ( 24 <= lpst->wHour) -+ || -+ ( 60 <= lpst->wMinute) -+ || -+ ( 60 <= lpst->wSecond) -+ || -+ ( 1000 <= lpst->wMilliseconds ); -+} -+ -+static unsigned diffMs( LPSYSTEMTIME lpst1, -+ LPSYSTEMTIME lpst2 ) -+{ -+ return ( (long)lpst2->wMilliseconds-(long)lpst1->wMilliseconds ) -+ + ( (long)lpst2->wSecond-(long)lpst1->wSecond)*1000 -+ + ( (long)lpst2->wMinute-(long)lpst1->wMinute)*60000 -+ + ( (long)lpst2->wHour-(long)lpst1->wHour)*3600000 ; -+} -+ -+static void printTime( LPSYSTEMTIME t ) -+{ -+ printf( "%04u-%02u-%02u %02u:%02u:%02u.%02u", -+ t->wYear, t->wMonth, t->wDay, -+ t->wHour, t->wMinute, t->wSecond, t->wMilliseconds/10 ); -+} -+ -+// returns zero for success -+static int parseTime( LPSYSTEMTIME t, -+ char const *dateString, -+ char const *timeString ) -+{ -+ int rval = 1 ; -+ char *nextIn ; -+ unsigned long inVal = simple_strtoul( dateString, &nextIn, 10 ); -+ if( ( 0 == inVal ) || ( 2999 < inVal ) || ( '-' != *nextIn ) ) -+ goto bail ; -+ -+ nextIn++ ; -+ t->wYear = inVal ; -+ -+ inVal = simple_strtoul( nextIn, &nextIn, 10 ); -+ if( ( 0 == inVal ) || ( 12 < inVal ) || ( '-' != *nextIn ) ) -+ goto bail ; -+ -+ nextIn++ ; -+ t->wMonth = inVal ; -+ -+ inVal = simple_strtoul( nextIn, &nextIn, 10 ); -+ if( ( 0 == inVal ) || ( 31 < inVal ) || ( '\0' != *nextIn ) ) -+ goto bail ; -+ -+ nextIn++ ; -+ t->wDay = inVal ; -+ -+ t->wHour = 0 ; t->wMinute = 0 ; t->wSecond = 0 ; t->wMilliseconds = 0 ; -+ -+ if( 0 != timeString ) -+ { -+ inVal = simple_strtoul( timeString, &nextIn, 10 ); -+ if( ( 23 < inVal ) || ( ':' != *nextIn ) ) -+ goto bail ; -+ -+ nextIn++ ; -+ t->wHour = inVal ; -+ -+ inVal = simple_strtoul( nextIn, &nextIn, 10 ); -+ if( ( 59 < inVal ) || ( ':' != *nextIn ) ) -+ goto bail ; -+ -+ nextIn++ ; -+ t->wMinute = inVal ; -+ -+ inVal = simple_strtoul( nextIn, &nextIn, 10 ); -+ if( ( 59 < inVal ) || ( '.' != *nextIn ) ) -+ goto bail ; -+ -+ nextIn++ ; -+ t->wSecond = inVal ; -+ -+ inVal = simple_strtoul( nextIn, &nextIn, 10 ); -+ if( ( 99 < inVal ) || ( '\0' != *nextIn ) ) -+ goto bail ; -+ -+ nextIn++ ; -+ t->wMilliseconds = inVal*10 ; -+ rval = 0 ; -+ } -+ else -+ rval = 0 ; -+ -+bail: -+ return rval ; -+} -+ -+int do_rtc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -+{ -+ int rval = 1 ; -+ -+ if( 1 == argc ) -+ { -+ SYSTEMTIME t ; -+ int rval = M41T81S_GetTime( &t ); -+ if( 0 == rval ) -+ { -+ printTime(&t); -+ } -+ } -+ else if( ( 2 == argc ) && ( 0 == strcmp( "test", argv[1] ) ) ) -+ { -+ SYSTEMTIME t ; -+ int rval = M41T81S_GetTime( &t ); -+ if( 0 == rval ){ -+ if( badTime(&t) ){ -+ printf( "time not initialized...initializing\n" ); -+ t.wYear = 2006 ; -+ t.wMonth = 6 ; -+ t.wDay = 3 ; -+ memset( &t, 0, sizeof(t) ); -+ rval = M41T81S_SetTime(&t); -+ } -+ } -+ -+ if( 0 == rval ) -+ { -+ SYSTEMTIME t2 ; -+ udelay( 1000000 ); // wait a sec -+ rval = M41T81S_GetTime( &t2 ); -+ if( 0 == rval ) -+ { -+ unsigned diff = diffMs(&t,&t2); -+ -+ if( ( diff < 800 ) || ( diff > 1200 ) ) -+ { -+ rval = 1 ; // clock not moving or moving too fast (bad oscillator?) -+ if( 0 == diff ) -+ printf( "check RTC oscillator\n" ); -+#ifdef DEBUG -+ printf( "rtc test failed!\n" -+ "difftime: %u\n", diff ); -+ printf( "t1: " ); printTime( &t ); printf( "\n" ); -+ printf( "t2: " ); printTime( &t2 ); printf( "\n" ); -+#endif -+ } -+ } -+ } -+ } -+ else if( ( 2 == argc ) || ( 3 == argc ) ) -+ { -+ SYSTEMTIME t ; -+ if( 0 == parseTime( &t, argv[1], ( 3 == argc ) ? argv[2] : 0 ) ) -+ { -+ rval = M41T81S_SetTime(&t); -+ } -+ else -+ printf( "Invalid time format: use YYYY-MM-DD HH:MM:SS\n" ); -+ } -+ -+ return rval ; -+} -+ -+U_BOOT_CMD( -+ rtc, 127, 0, do_rtc, -+ "rtc - get/set/test RTC\n", -+ NULL -+); -+ -+ -diff -u -r --new-file u-boot-1.1.2/board/neon/sm501.h u-boot-1.1.2-neon/board/neon/sm501.h ---- u-boot-1.1.2/board/neon/sm501.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/neon/sm501.h 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,22 @@ -+#ifndef __SM501_H__ -+#define __SM501_H__ -+ -+/* -+ * sm501.h -+ * -+ * Defines constants and macros for the SM-501 Graphics Controller. -+ * -+ */ -+ -+extern unsigned long const mmioStart ; -+extern unsigned long const mmioLength ; -+ -+#define SMIR_GPIO_32_63_CONTROL 0x0000c -+#define SMIR_PWRM0_GATE 0x00040 -+#define SMIR_PWRM1_GATE 0x00048 -+#define SMIR_POWER_MODE_CONTROL 0x00054 -+ -+#define READ_SM501_REG( addr ) *( (unsigned long volatile *)((addr)+mmioStart) ) -+#define STUFF_SM501_REG( addr, value ) *( (unsigned long volatile *)((addr)+mmioStart) ) = (value) -+ -+#endif -diff -u -r --new-file u-boot-1.1.2/board/neon/u-boot.lds u-boot-1.1.2-neon/board/neon/u-boot.lds ---- u-boot-1.1.2/board/neon/u-boot.lds 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/neon/u-boot.lds 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,56 @@ -+/* -+ * (C) Copyright 2000 -+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -+OUTPUT_ARCH(arm) -+ENTRY(_start) -+SECTIONS -+{ -+ . = 0x00000000; -+ -+ . = ALIGN(4); -+ .text : -+ { -+ cpu/pxa/start.o (.text) -+ cpu/pxa/ministart.o (.text) -+ *(.text) -+ } -+ -+ . = ALIGN(4); -+ .rodata : { *(.rodata) } -+ -+ . = 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 : { *(.bss) } -+ _end = .; -+} -diff -u -r --new-file u-boot-1.1.2/board/neon/u-bootmini.lds u-boot-1.1.2-neon/board/neon/u-bootmini.lds ---- u-boot-1.1.2/board/neon/u-bootmini.lds 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/board/neon/u-bootmini.lds 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,56 @@ -+/* -+ * (C) Copyright 2000 -+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -+OUTPUT_ARCH(arm) -+ENTRY(StartUp) -+SECTIONS -+{ -+ . = 0x00000000; -+ -+ . = ALIGN(4); -+ .text : -+ { -+ cpu/pxa/minidebug.o (.text) -+ cpu/pxa/ministart.o (.text) -+ *(.text) -+ } -+ -+ . = ALIGN(4); -+ .rodata : { *(.rodata) } -+ -+ . = 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 : { *(.bss) } -+ _end = .; -+} -diff -u -r --new-file u-boot-1.1.2/common/cmd_boot.c u-boot-1.1.2-neon/common/cmd_boot.c ---- u-boot-1.1.2/common/cmd_boot.c 2003-10-09 01:26:14.000000000 +0200 -+++ u-boot-1.1.2-neon/common/cmd_boot.c 2007-08-11 21:07:20.000000000 +0200 -@@ -59,6 +59,7 @@ - */ - argv[0] = (char *)gd; - #endif -+ *((ulong*)0x40e00014) |= (1<<25); //make gpio89 an output(ac97_reset) - #if !defined(CONFIG_NIOS) - rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]); - #else -diff -u -r --new-file u-boot-1.1.2/common/cmd_bootm.c u-boot-1.1.2-neon/common/cmd_bootm.c ---- u-boot-1.1.2/common/cmd_bootm.c 2004-11-21 01:06:34.000000000 +0100 -+++ u-boot-1.1.2-neon/common/cmd_bootm.c 2007-08-11 21:07:20.000000000 +0200 -@@ -29,8 +29,6 @@ - #include <command.h> - #include <image.h> - #include <malloc.h> --#include <zlib.h> --#include <bzlib.h> - #include <environment.h> - #include <asm/byteorder.h> - -@@ -73,10 +71,12 @@ - # define CHUNKSZ (64 * 1024) - #endif - -+#ifdef CONFIG_GZIP -+#include <zlib.h> - int gunzip (void *, int, unsigned char *, unsigned long *); -- - static void *zalloc(void *, unsigned, unsigned); - static void zfree(void *, void *, unsigned); -+#endif - - #if (CONFIG_COMMANDS & CFG_CMD_IMI) - static int image_info (unsigned long addr); -@@ -327,12 +327,17 @@ - break; - case IH_COMP_GZIP: - printf (" Uncompressing %s ... ", name); -+#ifdef CONFIG_GZIP - if (gunzip ((void *)ntohl(hdr->ih_load), unc_len, - (uchar *)data, &len) != 0) { - puts ("GUNZIP ERROR - must RESET board to recover\n"); - SHOW_BOOT_PROGRESS (-6); - do_reset (cmdtp, flag, argc, argv); - } -+#else -+ printf( "GUNZIP not supported\n" ); -+#endif -+ - break; - #ifdef CONFIG_BZIP2 - case IH_COMP_BZIP2: -@@ -1221,6 +1226,8 @@ - printf ("%s %s %s (%s)", arch, os, type, comp); - } - -+#ifdef CONFIG_GZIP -+ - #define ZALLOC_ALIGNMENT 16 - - static void *zalloc(void *x, unsigned items, unsigned size) -@@ -1302,6 +1309,8 @@ - - return (0); - } -+#endif // CONFIG_GZIP -+ - - #ifdef CONFIG_BZIP2 - void bz_internal_error(int errcode) -diff -u -r --new-file u-boot-1.1.2/common/cmd_fat.c u-boot-1.1.2-neon/common/cmd_fat.c ---- u-boot-1.1.2/common/cmd_fat.c 2004-08-28 23:09:15.000000000 +0200 -+++ u-boot-1.1.2-neon/common/cmd_fat.c 2007-08-11 21:07:20.000000000 +0200 -@@ -30,6 +30,13 @@ - #include <net.h> - #include <ata.h> - -+#define CONFIG_FATLOAD_TICKS -+#define CONFIG_FATLOAD_ADLER -+ -+#ifdef CONFIG_FATLOAD_ADLER -+#include <zlib.h> -+#endif -+ - #if (CONFIG_COMMANDS & CFG_CMD_FAT) - - #undef DEBUG -@@ -83,6 +90,11 @@ - int dev=0; - int part=1; - char *ep; -+#ifdef CONFIG_FATLOAD_TICKS -+ ulong ticks1 ; -+ ulong ticks2 ; -+ ulong ticks3 ; -+#endif - - if (argc < 5) { - printf ("usage: fatload <interface> <dev[:part]> <addr> <filename> [bytes]\n"); -@@ -110,6 +122,10 @@ - count = simple_strtoul (argv[5], NULL, 16); - else - count = 0; -+#ifdef CONFIG_FATLOAD_TICKS -+ ticks1 = get_timer( 0 ); -+#endif -+ - size = file_fat_read (argv[4], (unsigned char *) offset, count); - - if(size==-1) { -@@ -117,7 +133,21 @@ - return 1; - } - -- printf ("\n%ld bytes read\n", size); -+ printf ("\n%ld bytes read", size); -+ -+#ifdef CONFIG_FATLOAD_TICKS -+ ticks2 = get_timer( 0 ); -+ printf( " in %lu ticks, (%lu ms)", (ticks2-ticks1), (ticks2-ticks1)/(CFG_HZ/1000) ); -+#endif -+ -+#ifdef CONFIG_FATLOAD_ADLER -+ printf( ", adler == 0x" ); -+ printf( "%08lx", adler32(0, (Bytef *)offset, size ) ); -+ ticks3 = get_timer( 0 ); -+ printf( " in %lu ticks, (%lu ms)", (ticks3-ticks2), (ticks3-ticks2)/(CFG_HZ/1000) ); -+#endif -+ -+ printf( "\n" ); - - sprintf(buf, "%lX", size); - setenv("filesize", buf); -diff -u -r --new-file u-boot-1.1.2/common/cmd_flash.c u-boot-1.1.2-neon/common/cmd_flash.c ---- u-boot-1.1.2/common/cmd_flash.c 2004-12-31 10:32:50.000000000 +0100 -+++ u-boot-1.1.2-neon/common/cmd_flash.c 2007-08-11 21:07:20.000000000 +0200 -@@ -507,7 +507,7 @@ - ); - - U_BOOT_CMD( -- erase, 3, 1, do_flerase, -+ erase, 3, 0, do_flerase, - "erase - erase FLASH memory\n", - "start end\n" - " - erase FLASH from addr 'start' to addr 'end'\n" -diff -u -r --new-file u-boot-1.1.2/common/cmd_lcdpanel.c u-boot-1.1.2-neon/common/cmd_lcdpanel.c ---- u-boot-1.1.2/common/cmd_lcdpanel.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/common/cmd_lcdpanel.c 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,265 @@ -+/* -+ * Module cmd_lcdpanel.cpp -+ * -+ * This module defines ... -+ * -+ * -+ * Change History : -+ * -+ * $Log: cmd_lcdpanel.c,v $ -+ * Revision 1.8 2005/09/19 13:15:59 ericn -+ * -allow zeros in most fields -+ * -+ * Revision 1.7 2005/08/22 16:30:32 ericn -+ * -update panel env var w/lcdp command -+ * -+ * Revision 1.6 2005/07/18 03:05:53 ericn -+ * -allow cmdline config of CRT -+ * -+ * Revision 1.5 2005/07/06 05:26:54 ericn -+ * -make lcdinfo command conditional on PXALCD -+ * -+ * Revision 1.4 2005/07/04 18:49:01 ericn -+ * -added lcdi command -+ * -+ * Revision 1.3 2005/06/02 04:01:30 ericn -+ * -allow zero value of pixclock (meaning slow one) -+ * -+ * Revision 1.2 2005/04/30 20:32:44 ericn -+ * -added disable cmd -+ * -+ * Revision 1.1 2005/04/09 17:49:15 ericn -+ * -Initial import -+ * -+ * -+ * Copyright Boundary Devices, Inc. 2005 -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+ -+#include <common.h> -+#include <command.h> -+#if (CONFIG_COMMANDS & CFG_CMD_LCDPANEL) -+ -+#include <malloc.h> -+#include <lcd_panels.h> -+ -+extern char console_buffer[]; /* console I/O buffer */ -+ -+static void print_panel_info( struct lcd_panel_info_t const *panel ) -+{ -+ printf( "------------------------------------\n" -+ "name : %s\n", panel->name ); -+ printf( "pixclock : %u\n", panel->pixclock ); -+ printf( "xres : %u\n", panel->xres ); -+ printf( "yres : %u\n", panel->yres ); -+ printf( "act_high : %u\n", panel->act_high ); -+ printf( "hsync_len : %u\n", panel->hsync_len ); -+ printf( "left_margin : %u\n", panel->left_margin ); -+ printf( "right_margin : %u\n", panel->right_margin ); -+ printf( "vsync_len : %u\n", panel->vsync_len ); -+ printf( "upper_margin : %u\n", panel->upper_margin ); -+ printf( "lower_margin : %u\n", panel->lower_margin ); -+ printf( "active : %u\n", panel->active ); -+ printf( "CRT ? %u\n", panel->crt ); -+} -+ -+static struct lcd_panel_info_t const *prompt_for_panel( void ) -+{ -+ struct lcd_panel_info_t *panel = (struct lcd_panel_info_t *)malloc(sizeof(struct lcd_panel_info_t)); -+ int bytesRead ; -+ -+ memset( panel, 0, sizeof(*panel)); -+ -+ bytesRead = readline( "name: " ); -+ if( 0 < bytesRead ) -+ { -+ panel->name = strdup( console_buffer ); -+ bytesRead = readline( "pixclock: " ); -+ if( 0 < bytesRead ) -+ { -+ char *endp; -+ ulong value = simple_strtoul( console_buffer, &endp, 0 ); -+ if( endp > console_buffer ) -+ { -+ panel->pixclock = value ; -+ bytesRead = readline( "xres: " ); -+ if( ( 0 < bytesRead ) -+ && ( 0 != ( value = simple_strtoul( console_buffer, &endp, 0 ) ) ) -+ && ( endp > console_buffer ) ) -+ { -+ panel->xres = value ; -+ bytesRead = readline( "yres: " ); -+ if( ( 0 < bytesRead ) -+ && ( 0 != ( value = simple_strtoul( console_buffer, &endp, 0 ) ) ) -+ && ( endp > console_buffer ) ) -+ { -+ panel->yres = value ; -+ bytesRead = readline( "act_high: " ); -+ if( ( 0 < bytesRead ) -+ && ( 1 >= ( value = simple_strtoul( console_buffer, &endp, 0 ) ) ) -+ && ( endp > console_buffer ) ) -+ { -+ panel->act_high = value ; -+ bytesRead = readline( "hsync_len: " ); -+ if( ( 0 < bytesRead ) -+ && ( 0 != ( value = simple_strtoul( console_buffer, &endp, 0 ) ) ) -+ && ( endp > console_buffer ) ) -+ { -+ panel->hsync_len = value ; -+ bytesRead = readline( "left_margin: " ); -+ value = simple_strtoul( console_buffer, &endp, 0 ); -+ if( ( 0 < bytesRead ) -+ && ( endp > console_buffer ) ) -+ { -+ panel->left_margin = value ; -+ bytesRead = readline( "right_margin: " ); -+ value = simple_strtoul( console_buffer, &endp, 0 ); -+ if( ( 0 < bytesRead ) -+ && ( endp > console_buffer ) ) -+ { -+ panel->right_margin = value ; -+ bytesRead = readline( "vsync_len: " ); -+ value = simple_strtoul( console_buffer, &endp, 0 ); -+ if( ( 0 < bytesRead ) -+ && ( endp > console_buffer ) ) -+ { -+ panel->vsync_len = value ; -+ bytesRead = readline( "upper_margin: " ); -+ value = simple_strtoul( console_buffer, &endp, 0 ); -+ if( ( 0 < bytesRead ) -+ && ( endp > console_buffer ) ) -+ { -+ panel->upper_margin = value ; -+ bytesRead = readline( "lower_margin: " ); -+ value = simple_strtoul( console_buffer, &endp, 0 ); -+ if( ( 0 < bytesRead ) -+ && ( endp > console_buffer ) ) -+ { -+ panel->lower_margin = value ; -+ bytesRead = readline( "active (0|1) : " ); -+ value = simple_strtoul( console_buffer, &endp, 0 ); -+ if( ( 0 < bytesRead ) && ( endp > console_buffer ) ) -+ { -+ panel->active = value ; -+ bytesRead = readline( "crt (0|1) : " ); -+ value = simple_strtoul( console_buffer, &endp, 0 ); -+ if( ( 0 < bytesRead ) -+ && -+ ( endp > console_buffer ) ) -+ { -+ panel->crt = value ; -+ print_panel_info( panel ); -+ return panel ; -+ } -+ } -+ } -+ } -+ } -+ } -+ } -+ } -+ } -+ } -+ } -+ } -+ } -+ } -+ -+ free( panel ); -+ -+ return 0 ; -+} -+ -+static int lcdpanel(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -+{ -+ if ( 1 == argc ) { -+ if( cur_lcd_panel ) -+ print_panel_info( cur_lcd_panel ); -+ else -+ printf( "no panel defined\n" ); -+ } -+ else { -+ struct lcd_panel_info_t const *panel = find_lcd_panel( argv[1] ); -+ if( panel ) { -+ printf( "found panel %s\n", panel->name ); -+ set_lcd_panel( panel ); -+ setenv( "panel", panel->name ); -+ } -+ else if( '+' == *argv[1] ) { -+ panel = prompt_for_panel(); -+ if( panel ) -+ { -+ print_panel_info( panel ); -+ set_lcd_panel( panel ); -+ } -+ } -+ else if( '?' == *argv[1] ) -+ { -+ int i ; -+ for( i = 0 ; i < num_lcd_panels ; i++ ) -+ print_panel_info( lcd_panels+i ); -+ } -+ else if( '-' == *argv[1] ) -+ { -+ disable_lcd_panel(); -+ printf( "panel disabled\n" ); -+ } -+ else -+ printf( "panel %s not found\n", argv[1] ); -+ } -+ -+ return 0; -+} -+ -+ -+U_BOOT_CMD( -+ lcdpanel, 2, 0, lcdpanel, -+ "lcdpanel [panelName|?|+|-]\n" -+ " init lcd panel with panel name\n" -+ " ? will display the supported panels\n" -+ " + will prompt for panel details\n" -+ " - will disable the panel\n", -+ NULL -+); -+ -+#ifdef PXALCD -+#include <lcd.h> -+ -+static int lcdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -+{ -+ printf( "--> lcdinfo:\n" -+ "screen: %08lx\n" -+ "palette: %08lx/%u\n", -+ panel_info.pxa.screen, -+ panel_info.pxa.palette, -+ panel_info.pxa.palette_size ); -+ return 0 ; -+} -+ -+U_BOOT_CMD( -+ lcdinfo, 2, 0, lcdinfo, -+ "lcdinfo\n", -+ NULL -+); -+#endif -+ -+#endif /* CFG_CMD_LCDPANEL */ -+ -+ -+ -+ -diff -u -r --new-file u-boot-1.1.2/common/cmd_lcdpanel.h u-boot-1.1.2-neon/common/cmd_lcdpanel.h ---- u-boot-1.1.2/common/cmd_lcdpanel.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/common/cmd_lcdpanel.h 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,24 @@ -+#ifndef __CMD_LCDPANEL_H__ -+#define __CMD_LCDPANEL_H__ "$Id: cmd_lcdpanel.h,v 1.1 2005/04/09 17:49:16 ericn Exp $" -+ -+/* -+ * cmd_lcdpanel.h -+ * -+ * This header file declares ... -+ * -+ * -+ * Change History : -+ * -+ * $Log: cmd_lcdpanel.h,v $ -+ * Revision 1.1 2005/04/09 17:49:16 ericn -+ * -Initial import -+ * -+ * -+ * -+ * Copyright Boundary Devices, Inc. 2005 -+ */ -+ -+ -+ -+#endif -+ -diff -u -r --new-file u-boot-1.1.2/common/cmd_mmc.c u-boot-1.1.2-neon/common/cmd_mmc.c ---- u-boot-1.1.2/common/cmd_mmc.c 2003-07-01 23:07:07.000000000 +0200 -+++ u-boot-1.1.2-neon/common/cmd_mmc.c 2007-08-11 21:07:20.000000000 +0200 -@@ -43,4 +43,71 @@ - NULL - ); - -+int do_mmc_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -+{ -+ if( 5 == argc ) -+ { -+ unsigned long args[4]; -+ unsigned i ; -+ for( i = 1 ; i < 5 ; i++ ) -+ { -+ char *endp ; -+ args[i-1] = simple_strtoul(argv[i], &endp, 16 ); -+ if( 0 != *endp ) -+ { -+ printf( "arg[%u] is not a valid hex number\n", i ); -+ break; -+ } -+ } -+ -+ if( 5 == i ) -+ { -+ uchar *resp = mmc_cmd( (ushort)args[0], -+ (ushort)args[1], -+ (ushort)args[2], -+ (ushort)args[3] ); -+ ushort numWords = 0 ; -+ switch( args[3] ) -+ { -+ case MMC_CMDAT_R1: -+ case MMC_CMDAT_R3: -+ numWords = 3; -+ break; -+ -+ case MMC_CMDAT_R2: -+ numWords = 8; -+ break; -+ -+ default: -+ printf( "Invalid response type %lu, options are [1,2,3]\n", args[3] ); -+ break; -+ } -+ -+ if( resp ) -+ { -+ for( i = 0 ; i < numWords*2 ; i++ ) -+ { -+ printf( "%02X ", resp[i] ); -+ } -+ printf( "\n" ); -+ } -+ else -+ printf( "no response\n" ); -+ } -+ } -+ else -+ printf ("Usage:\n%s\n", cmdtp->usage); -+ -+ return 0; -+} -+ -+extern uchar * -+mmc_cmd(ushort cmd, ushort argh, ushort argl, ushort cmdat); -+ -+U_BOOT_CMD( -+ mmccmd, 5, 0, do_mmc_cmd, -+ "mmccmd - issue mmc command\n", -+ "mmccmd cmd# argh(hex) argl(hex) rsptype\n" -+); -+ - #endif /* CFG_CMD_MMC */ -diff -u -r --new-file u-boot-1.1.2/common/cmd_net.c u-boot-1.1.2-neon/common/cmd_net.c ---- u-boot-1.1.2/common/cmd_net.c 2004-06-09 14:42:26.000000000 +0200 -+++ u-boot-1.1.2-neon/common/cmd_net.c 2007-08-11 21:07:20.000000000 +0200 -@@ -46,6 +46,104 @@ - "[loadAddress] [bootfilename]\n" - ); - -+extern int get_rom_mac (char *v_rom_mac); -+extern int set_rom_mac (char const *v_rom_mac); -+ -+/* -+ * returns -1 if not valid hex -+ */ -+static int hexValue( char c ) -+{ -+ if( ( '0' <= c ) && ( '9' >= c ) ) -+ { -+ return c-'0' ; -+ } -+ else if( ( 'A' <= c ) && ( 'F' >= c ) ) -+ { -+ return c-'A'+10 ; -+ } -+ else if( ( 'a' <= c ) && ( 'f' >= c ) ) -+ { -+ return c-'a'+10 ; -+ } -+ else -+ return -1 ; -+} -+ -+// returns non-zero to indicate success -+static int parse_mac( char const *macString, // input -+ char *macaddr ) // output: not NULL-terminated -+{ -+ int i ; -+ for( i = 0 ; i < 6 ; i++ ) -+ { -+ char high, low, term ; -+ int highval, lowval ; -+ high = *macString++ ; -+ -+ if( ( 0 == high ) -+ || -+ ( 0 > ( highval = hexValue(high) ) ) ) -+ break ; -+ low = *macString++ ; -+ if( ( 0 == low ) -+ || -+ ( 0 > ( lowval = hexValue(low) ) ) ) -+ break ; -+ -+ term = *macString++ ; -+ if( 5 > i ) -+ { -+ if( ( '-' != term ) && ( ':' != term ) ) -+ break ; -+ } -+ else if( '\0' != term ) -+ break ; -+ -+ *macaddr++ = (highval<<4) | lowval ; -+ } -+ -+ return ( 6 == i ); -+} -+ -+int do_mac (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -+{ -+ if( 2 == argc ) -+ { -+ char mac[6]; -+ if( parse_mac( argv[1], mac ) ) -+ { -+ printf( "setting mac address to %02x:%02x:%02x:%02x:%02x:%02x\n", -+ mac[0],mac[1],mac[2],mac[3],mac[4],mac[5] ); -+ if( set_rom_mac( mac ) ) -+ printf( "done\n" ); -+ else -+ printf( "Error setting mac address\n" ); -+ } -+ else -+ printf( "Error parsing mac: use form NN:NN:NN:NN:NN:NN\n" ); -+ } -+ else -+ { -+ char mac[6]; -+ if( get_rom_mac( mac ) ) -+ printf( "mac address %02x:%02x:%02x:%02x:%02x:%02x\n", -+ mac[0],mac[1],mac[2],mac[3],mac[4],mac[5] ); -+ else if( 0xFF == mac[0] ) -+ printf( "MAC has not been programmed\n" ); -+ else -+ printf( "error reading mac\n" ); -+ } -+ return 0 ; -+} -+ -+U_BOOT_CMD( -+ mac, 3, 1, do_mac, -+ "mac\t- read/write mac address\n", -+ "- supply a parameter of the form NN:NN:NN:NN:NN:NN to set" -+); -+ -+ - int do_tftpb (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) - { - return netboot_common (TFTP, cmdtp, argc, argv); -diff -u -r --new-file u-boot-1.1.2/common/cmd_not.c u-boot-1.1.2-neon/common/cmd_not.c ---- u-boot-1.1.2/common/cmd_not.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/common/cmd_not.c 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,55 @@ -+/* -+ * (C) Copyright 2006 -+ * Eric Nelson, Boundary Devices -+ * -+ * 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 <config.h> -+#include <command.h> -+ -+#if (CONFIG_COMMANDS & CFG_CMD_NOT) -+ -+int do_not (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -+{ -+ int rval = 1 ; -+ if( 1 < argc ) -+ { -+ cmd_tbl_t *cmd = find_cmd(argv[1]); -+ if( cmd ) -+ { -+ rval = ( 0 == cmd->cmd(cmd, flag, argc-1, argv+1) ); -+ } -+ else -+ printf( "command %s not found\n", argv[1] ); -+ } -+ else -+ printf( "Usage not command [..params]\n" ); -+ -+ return rval ; -+} -+ -+U_BOOT_CMD( -+ not, 127, 0, do_not, -+ "not - negate a command\n", -+ NULL -+); -+ -+#endif /* CONFIG_COMMANDS & CFG_CMD_NOT */ -diff -u -r --new-file u-boot-1.1.2/common/cmd_nvedit.c u-boot-1.1.2-neon/common/cmd_nvedit.c ---- u-boot-1.1.2/common/cmd_nvedit.c 2004-09-30 00:55:14.000000000 +0200 -+++ u-boot-1.1.2-neon/common/cmd_nvedit.c 2007-08-11 21:07:20.000000000 +0200 -@@ -487,16 +487,21 @@ - { - int i, nxt; - -+// printf ("before WATCHDOG_RESET\n"); - WATCHDOG_RESET(); -+// printf ("after WATCHDOG_RESET\n"); - - for (i=0; env_get_char(i) != '\0'; i=nxt+1) { - int val; - -+// printf ("i= %i\n", i); - for (nxt=i; env_get_char(nxt) != '\0'; ++nxt) { - if (nxt >= CFG_ENV_SIZE) { - return (NULL); - } -+// putc(env_get_char(nxt)); - } -+// printf ("\n"); - if ((val=envmatch(name, i)) < 0) - continue; - return (env_get_addr(val)); -diff -u -r --new-file u-boot-1.1.2/common/command.c u-boot-1.1.2-neon/common/command.c ---- u-boot-1.1.2/common/command.c 2004-04-18 19:39:39.000000000 +0200 -+++ u-boot-1.1.2-neon/common/command.c 2007-08-11 21:07:20.000000000 +0200 -@@ -27,6 +27,9 @@ - - #include <common.h> - #include <command.h> -+#ifdef CONFIG_LCD -+#include "lcd.h" -+#endif - - int - do_version (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -@@ -74,6 +77,41 @@ - " - echo args to console; \\c suppresses newline\n" - ); - -+#ifdef CONFIG_LCD -+ -+int -+do_lecho (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -+{ -+ int i, putnl = 1; -+ -+ for (i = 1; i < argc; i++) { -+ char *p = argv[i], c; -+ -+ if (i > 1) -+ putc(' '); -+ while ((c = *p++) != '\0') { -+ if (c == '\\' && *p == 'c') { -+ putnl = 0; -+ p++; -+ } else { -+ lcd_putc(c); -+ } -+ } -+ } -+ -+ if (putnl) -+ lcd_putc('\n'); -+ return 0; -+} -+ -+U_BOOT_CMD( -+ lecho, CFG_MAXARGS, 1, do_lecho, -+ "lecho - echo args to lcd\n", -+ "[args..]\n" -+ " - echo args to lcd; \\c suppresses newline\n" -+); -+#endif -+ - #ifdef CFG_HUSH_PARSER - - int -diff -u -r --new-file u-boot-1.1.2/common/env_flash.c u-boot-1.1.2-neon/common/env_flash.c ---- u-boot-1.1.2/common/env_flash.c 2004-03-14 02:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/common/env_flash.c 2007-08-11 21:07:20.000000000 +0200 -@@ -83,6 +83,10 @@ - #define OBSOLETE_FLAG 0 - #endif /* CFG_ENV_ADDR_REDUND */ - -+#ifdef CFG_ENV_IS_IN_FLASH -+static env_t *flash_addr_new = (env_t *)CFG_ENV_ADDR ; -+#endif -+ - extern uchar default_environment[]; - extern int default_environment_size; - -diff -u -r --new-file u-boot-1.1.2/common/fnmatch.c u-boot-1.1.2-neon/common/fnmatch.c ---- u-boot-1.1.2/common/fnmatch.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/common/fnmatch.c 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,166 @@ -+/* -+ * (C) Copyright 2005 -+ * Boundary Devices -+ * -+ * 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 <config.h> -+#include <part.h> -+ -+/* Some file systems are case-insensitive. If FOLD_FN_CHAR is -+ #defined, it maps the character C onto its "canonical" form. In a -+ case-insensitive system, it would map all alphanumeric characters -+ to lower case. Under Windows NT, / and \ are both path component -+ separators, so FOLD_FN_CHAR would map them both to /. */ -+#define FOLD_FN_CHAR(c) (c) -+ -+ -+int fnmatch(const char *pattern, const char *string, int flags) -+{ -+ register const char *p = pattern, *n = string; -+ register char c; -+ -+ while ((c = *p++) != '\0') -+ { -+ switch (c) -+ { -+ case '?': -+ if (*n == '\0') -+ return FNM_NOMATCH; -+ else if ((flags & FNM_PATHNAME) && *n == '/') -+ return FNM_NOMATCH; -+ else if ((flags & FNM_PERIOD) && *n == '.' && -+ (n == string || ((flags & FNM_PATHNAME) && n[-1] == '/'))) -+ return FNM_NOMATCH; -+ break; -+ -+ case '\\': -+ if (!(flags & FNM_NOESCAPE)) -+ c = *p++; -+ if (FOLD_FN_CHAR (*n) != FOLD_FN_CHAR (c)) -+ return FNM_NOMATCH; -+ break; -+ -+ case '*': -+ if ((flags & FNM_PERIOD) && *n == '.' && -+ (n == string || ((flags & FNM_PATHNAME) && n[-1] == '/'))) -+ return FNM_NOMATCH; -+ -+ for (c = *p++; c == '?' || c == '*'; c = *p++, ++n) -+ if (((flags & FNM_PATHNAME) && *n == '/') || -+ (c == '?' && *n == '\0')) -+ return FNM_NOMATCH; -+ -+ if (c == '\0') -+ return 0; -+ -+ { -+ char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c; -+ for (--p; *n != '\0'; ++n) -+ if ((c == '[' || FOLD_FN_CHAR (*n) == FOLD_FN_CHAR (c1)) && -+ fnmatch(p, n, flags & ~FNM_PERIOD) == 0) -+ return 0; -+ return FNM_NOMATCH; -+ } -+ -+ case '[': -+ { -+ /* Nonzero if the sense of the character class is inverted. */ -+ register int not; -+ -+ if (*n == '\0') -+ return FNM_NOMATCH; -+ -+ if ((flags & FNM_PERIOD) && *n == '.' && -+ (n == string || ((flags & FNM_PATHNAME) && n[-1] == '/'))) -+ return FNM_NOMATCH; -+ -+ not = (*p == '!' || *p == '^'); -+ if (not) -+ ++p; -+ -+ c = *p++; -+ for (;;) -+ { -+ register char cstart = c, cend = c; -+ -+ if (!(flags & FNM_NOESCAPE) && c == '\\') -+ cstart = cend = *p++; -+ -+ if (c == '\0') -+ /* [ (unterminated) loses. */ -+ return FNM_NOMATCH; -+ -+ c = *p++; -+ -+ if ((flags & FNM_PATHNAME) && c == '/') -+ /* [/] can never match. */ -+ return FNM_NOMATCH; -+ -+ if (c == '-' && *p != ']') -+ { -+ cend = *p++; -+ if (!(flags & FNM_NOESCAPE) && cend == '\\') -+ cend = *p++; -+ if (cend == '\0') -+ return FNM_NOMATCH; -+ c = *p++; -+ } -+ -+ if (*n >= cstart && *n <= cend) -+ goto matched; -+ -+ if (c == ']') -+ break; -+ } -+ if (!not) -+ return FNM_NOMATCH; -+ break; -+ -+ matched:; -+ /* Skip the rest of the [...] that already matched. */ -+ while (c != ']') -+ { -+ if (c == '\0') -+ /* [... (unterminated) loses. */ -+ return FNM_NOMATCH; -+ -+ c = *p++; -+ if (!(flags & FNM_NOESCAPE) && c == '\\') -+ /* 1003.2d11 is unclear if this is right. %%% */ -+ ++p; -+ } -+ if (not) -+ return FNM_NOMATCH; -+ } -+ break; -+ -+ default: -+ if (FOLD_FN_CHAR (c) != FOLD_FN_CHAR (*n)) -+ return FNM_NOMATCH; -+ } -+ -+ ++n; -+ } -+ -+ if (*n == '\0') -+ return 0; -+ -+ return FNM_NOMATCH; -+} -+ -diff -u -r --new-file u-boot-1.1.2/common/lcd.c u-boot-1.1.2-neon/common/lcd.c ---- u-boot-1.1.2/common/lcd.c 2004-12-10 12:40:50.000000000 +0100 -+++ u-boot-1.1.2-neon/common/lcd.c 2007-08-11 21:07:20.000000000 +0200 -@@ -41,7 +41,7 @@ - #endif - #include <lcd.h> - --#if defined(CONFIG_PXA250) -+#if defined(CONFIG_PXA250) || defined(CONFIG_PXA270) - #include <asm/byteorder.h> - #endif - -@@ -94,8 +94,46 @@ - static int lcd_getfgcolor (void); - #endif /* NOT_USED_SO_FAR */ - --/************************************************************************/ -+static int luminance( int red, int green, int blue ) -+{ -+ // -+ // I've seen a couple of different algorithms here: -+ // (max+min)/2 -+/* -+ -+ int max = MAX( red, MAX( green, blue ) ); -+ int min = MIN( red, MIN( green, blue ) ); -+ return (max+min)/2 ; -+*/ -+ -+ // A more mathematically-correct version -+// return (int)(c.R*0.3 + c.G*0.59+ c.B*0.11); -+ -+ // Just return 'green' -+ // return green; -+ -+ // and one that uses shifts and adds to come close to the above -+ // -+ // red = 5/16= 0.3125 == 1/4 + 1/16 -+ // green = 9/16= 0.5625 == 1/2 + 1/16 -+ // blue = 1/8 = 0.125 -+ // -+ if( 0 < red ) -+ red = (red>>2) + (red>>4); -+ else -+ red = 0 ; -+ if( 0 < green ) -+ green = (green>>1) + (green>>4) ; -+ else -+ green = 0 ; -+ if( 0 < blue ) -+ blue = blue >> 3 ; -+ else -+ blue = 0 ; -+ return red+green+blue ; -+} - -+/************************************************************************/ - /*----------------------------------------------------------------------*/ - - static void console_scrollup (void) -@@ -221,10 +259,10 @@ - uchar *dest; - ushort off, row; - -- dest = (uchar *)(lcd_base + y * lcd_line_length + x * (1 << LCD_BPP) / 8); -+ dest = (uchar *)(lcd_base + y * panel_info.vl_lcd_line_length + x * (1 << LCD_BPP) / 8); - off = x * (1 << LCD_BPP) % 8; - -- for (row=0; row < VIDEO_FONT_HEIGHT; ++row, dest += lcd_line_length) { -+ for (row=0; row < VIDEO_FONT_HEIGHT; ++row, dest += panel_info.vl_lcd_line_length) { - uchar *s = str; - uchar *d = dest; - int i; -@@ -337,8 +375,6 @@ - - lcd_base = (void *)(gd->fb_base); - -- lcd_line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) / 8; -- - lcd_init (lcd_base); /* LCD initialization */ - - /* Device initialization */ -@@ -389,7 +425,7 @@ - /* set framebuffer to background color */ - memset ((char *)lcd_base, - COLOR_MASK(lcd_getbgcolor()), -- lcd_line_length*panel_info.vl_row); -+ panel_info.vl_lcd_line_length*panel_info.vl_row); - #endif - /* Paint the logo and retrieve LCD base address */ - debug ("[LCD] Drawing the logo...\n"); -@@ -500,12 +536,13 @@ - #ifdef CONFIG_LCD_LOGO - void bitmap_plot (int x, int y) - { -- ushort *cmap; -+ PALETTEVAL_TYPE *cmap; - ushort i, j; - uchar *bmap; - uchar *fb; - ushort *fb16; --#if defined(CONFIG_PXA250) -+ -+#if defined(PXALCD) - struct pxafb_info *fbi = &panel_info.pxa; - #elif defined(CONFIG_MPC823) - volatile immap_t *immr = (immap_t *) CFG_IMMR; -@@ -514,17 +551,18 @@ - - debug ("Logo: width %d height %d colors %d cmap %d\n", - BMP_LOGO_WIDTH, BMP_LOGO_HEIGHT, BMP_LOGO_COLORS, -- sizeof(bmp_logo_palette)/(sizeof(ushort))); -+ sizeof(bmp_logo_palette)/(sizeof(PALETTEVAL_TYPE))); - - bmap = &bmp_logo_bitmap[0]; -- fb = (char *)(lcd_base + y * lcd_line_length + x); -+ fb = (char *)(lcd_base + y * panel_info.vl_lcd_line_length + x); - - if (NBITS(panel_info.vl_bpix) < 12) { - /* Leave room for default color map */ --#if defined(CONFIG_PXA250) -- cmap = (ushort *)fbi->palette; -+#if defined(PXALCD) -+ cmap = (PALETTEVAL_TYPE *)fbi->palette; - #elif defined(CONFIG_MPC823) - cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]); -+#elif defined(CONFIG_SM501) - #endif - - WATCHDOG_RESET(); -@@ -532,10 +570,13 @@ - /* Set color map */ - for (i=0; i<(sizeof(bmp_logo_palette)/(sizeof(ushort))); ++i) { - ushort colreg = bmp_logo_palette[i]; --#ifdef CFG_INVERT_COLORS -- *cmap++ = 0xffff - colreg; -+#if defined(CONFIG_SM501) - #else -+ #ifdef CFG_INVERT_COLORS -+ *cmap++ = 0xffff - colreg; -+ #else - *cmap++ = colreg; -+ #endif - #endif - } - -@@ -548,7 +589,7 @@ - } - } - else { /* true color mode */ -- fb16 = (ushort *)(lcd_base + y * lcd_line_length + x); -+ fb16 = (ushort *)(lcd_base + y * panel_info.vl_lcd_line_length + x); - for (i=0; i<BMP_LOGO_HEIGHT; ++i) { - for (j=0; j<BMP_LOGO_WIDTH; j++) { - fb16[j] = bmp_logo_palette[(bmap[j])]; -@@ -570,7 +611,11 @@ - */ - int lcd_display_bitmap(ulong bmp_image, int x, int y) - { -- ushort *cmap; -+#if defined(CONFIG_SM501) -+ uchar *cmap ; -+#else -+ PALETTEVAL_TYPE *cmap; -+#endif - ushort i, j; - uchar *fb; - bmp_image_t *bmp=(bmp_image_t *)bmp_image; -@@ -579,7 +624,12 @@ - unsigned long width, height; - unsigned colors,bpix; - unsigned long compression; --#if defined(CONFIG_PXA250) -+ int maxLum = 0 ; -+ int bgCol = 0 ; -+ int minLum = 0xFFFF ; -+ int fgCol = 0 ; -+ -+#if defined(PXALCD) - struct pxafb_info *fbi = &panel_info.pxa; - #elif defined(CONFIG_MPC823) - volatile immap_t *immr = (immap_t *) CFG_IMMR; -@@ -590,7 +640,7 @@ - (bmp->header.signature[1]=='M'))) { - printf ("Error: no valid bmp image at %lx\n", bmp_image); - return 1; --} -+ } - - width = le32_to_cpu (bmp->header.width); - height = le32_to_cpu (bmp->header.height); -@@ -616,33 +666,64 @@ - (int)width, (int)height, (int)colors); - - if (bpix==8) { --#if defined(CONFIG_PXA250) -- cmap = (ushort *)fbi->palette; -+#if defined(PXALCD) -+ cmap = (PALETTEVAL_TYPE *)fbi->palette; - #elif defined(CONFIG_MPC823) - cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]); -+#elif defined(CONFIG_SM501) -+ cmap = (uchar *)paletteRegs ; - #else - # error "Don't know location of color map" - #endif - - /* Set color map */ - for (i=0; i<colors; ++i) { -+ int lum ; - bmp_color_table_entry_t cte = bmp->color_table[i]; -+#if defined(CONFIG_SM501) -+ *cmap++ = cte.blue ; -+ *cmap++ = cte.green ; -+ *cmap++ = cte.red ; -+ *cmap++ = 0 ; -+#elif defined(CONFIG_PXA270) && defined(PXALCD) -+ *cmap = 0xFF000000 ; -+ *cmap |= cte.red << 16 ; -+ *cmap |= cte.green << 8 ; -+ *cmap |= cte.blue ; -+ *cmap++ ; -+#else - ushort colreg = - ( ((cte.red) << 8) & 0xf800) | - ( ((cte.green) << 4) & 0x07e0) | - ( (cte.blue) & 0x001f) ; -- --#ifdef CFG_INVERT_COLORS -+ #ifdef CFG_INVERT_COLORS - *cmap = 0xffff - colreg; --#else -+ #else - *cmap = colreg; --#endif --#if defined(CONFIG_PXA250) -+ #endif -+ #if defined(PXALCD) - cmap++; --#elif defined(CONFIG_MPC823) -+ #elif defined(CONFIG_MPC823) - cmap--; -+ #endif - #endif -+ lum = luminance( cte.red, cte.green, cte.blue ); -+ if( lum > maxLum ) -+ { -+ maxLum = lum ; -+ bgCol = i ; -+ } -+ -+ if( lum < minLum ) -+ { -+ minLum = lum ; -+ fgCol = i ; -+ } - } -+ -+ printf( "bgcolor %u, fg %u\n", bgCol, fgCol ); -+ lcd_color_fg = fgCol ; -+ lcd_color_bg = bgCol ; - } - - padded_line = (width&0x3) ? ((width&~0x3)+4) : (width); -@@ -653,16 +734,16 @@ - - bmap = (uchar *)bmp + le32_to_cpu (bmp->header.data_offset); - fb = (uchar *) (lcd_base + -- (y + height - 1) * lcd_line_length + x); -+ (y + height - 1) * panel_info.vl_lcd_line_length + x); - for (i = 0; i < height; ++i) { - for (j = 0; j < width ; j++) --#if defined(CONFIG_PXA250) -+#if defined(CONFIG_PXA250) || defined(CONFIG_PXA270) - *(fb++)=*(bmap++); - #elif defined(CONFIG_MPC823) - *(fb++)=255-*(bmap++); - #endif -- bmap += (width - padded_line); -- fb -= (width + lcd_line_length); -+ bmap += (padded_line-width); -+ fb -= (width + panel_info.vl_lcd_line_length); - } - - return (0); -@@ -735,7 +816,7 @@ - #endif /* LCD_INFO */ - - #if defined(CONFIG_LCD_LOGO) && !defined(LCD_INFO_BELOW_LOGO) -- return ((void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length)); -+ return ((void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * panel_info.vl_lcd_line_length)); - #else - return ((void *)lcd_base); - #endif /* CONFIG_LCD_LOGO */ -diff -u -r --new-file u-boot-1.1.2/common/lcd_panels.c u-boot-1.1.2-neon/common/lcd_panels.c ---- u-boot-1.1.2/common/lcd_panels.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/common/lcd_panels.c 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,286 @@ -+/* -+ * Module lcd_panels.cpp -+ * -+ * This module defines the num_lcd_panels and lcd_panels -+ * constants as declared in lcd_panels.h -+ * -+ * Change History : -+ * -+ * $Log: lcd_panels.c,v $ -+ * Revision 1.9 2006/05/23 18:46:39 ericn -+ * -added hitachi_wxga panel -+ * -+ * Revision 1.8 2005/09/19 13:15:43 ericn -+ * -updated sharp_qvga timing -+ * -+ * Revision 1.7 2005/07/18 03:05:35 ericn -+ * -update crt1024x768 timings -+ * -+ * Revision 1.6 2005/07/07 03:42:22 tkisky -+ * -make my CRT 1024x768 display work -+ * -+ * Revision 1.5 2005/06/02 04:02:39 ericn -+ * -added qvga_portrait -+ * -+ * Revision 1.4 2005/05/15 18:59:00 tkisky -+ * -change polarity of hitachi_wvga -+ * -+ * Revision 1.3 2005/05/03 15:32:11 ericn -+ * -fast pixclock for hvga, remove redundant 1024x768 -+ * -+ * Revision 1.2 2005/04/30 20:33:22 ericn -+ * -added CRT support -+ * -+ * Revision 1.1 2005/04/09 17:49:17 ericn -+ * -Initial import -+ * -+ * -+ * Copyright Boundary Devices, Inc. 2005 -+ */ -+ -+ -+#include "lcd_panels.h" -+#include <common.h> -+ -+/* -+Settings for Hitachi 5.7 -+ PANEL_HORIZONTAL_TOTAL, 01c00160); // should be 34+320+1+64-1= 418 = 0x1A2 (Hex) -+ + 0x13f+16 -+ PANEL_HORIZONTAL_SYNC, 00400161); hsync_len == 64 lmargin=0x161-0x13f=34 -+ PANEL_VERTICAL_TOTAL, 0x010800f0); -+ PANEL_VERTICAL_SYNC, 0x00020104); vsync=2, upper_margin=0x0104-0xf0-1= 19 -+ -+In bdlogo.bmp - offset 436 is pixel data -+ -+Sharp 5.7 active -+ -+ STUFFREG( hTotalReg, 0x01800140 ); // should be 16+320+1+8-1 == 0x158 -+ + 0x13f (width-1) -+ STUFFREG( hSyncReg, 0x0008014f ); hsync_len == 8 lmargin=0x14f-0x13f=16 -+ STUFFREG( vTotalReg, 0x010700F0 ); -+ STUFFREG( vSyncReg, 0x00020100 ); vsync=2, upper_margin=0x0100-0xf0+1= 17 -+ -+static unsigned const hTotalReg = 0x00080024 ; // 015F0140 -+static unsigned const hSyncReg = 0x00080028 ; // 0008014f -+static unsigned const vTotalReg = 0x0008002c ; // 010700F0 -+static unsigned const vSyncReg = 0x00080030 ; // 000200FE -+ -+const unsigned int sm501_list2[]={0x0fe80000, -+dispctrl 0x0F013104, // 0f0d0105 -+pan 0x00000000, -+colorkey 0x00000000, -+fbaddr 0x00000000, -+offsetww ((LCD_XRES)<<16)+(LCD_XRES), -+fbwidth (LCD_XRES<<16), -+fbheight (LCD_YRES<<16), -+tllocate 0x00000000, -+brlocate ((LCD_YRES-1)<<16)+(LCD_XRES-1), -+htotal ((LCD_BEGIN_OF_LINE_WAIT_COUNT+ -+ LCD_XRES+ -+ LCD_END_OF_LINE_WAIT_COUNT+ -+ LCD_HORIZONTAL_SYNC_PULSE_WIDTH-1)<<16) -+ +(LCD_XRES-1), -+hsync (LCD_HORIZONTAL_SYNC_PULSE_WIDTH<<16) -+ +(LCD_XRES+LCD_BEGIN_OF_LINE_WAIT_COUNT-1), -+vtotal ((LCD_BEGIN_FRAME_WAIT_COUNT+ -+ LCD_YRES+ -+ LCD_END_OF_FRAME_WAIT_COUNT+ -+ LCD_VERTICAL_SYNC_PULSE_WIDTH-1)<<16) -+ +(LCD_YRES-1), -+vsync (LCD_VERTICAL_SYNC_PULSE_WIDTH<<16) -+ +(LCD_YRES+LCD_BEGIN_FRAME_WAIT_COUNT-1)}; -+*/ -+ -+static struct lcd_panel_info_t const lcd_panels_[] = { -+ -+ /* char const *name */ { "hitachi_qvga" -+ /* unsigned long pixclock */ , 0 -+ /* unsigned short xres */ , 320 -+ /* unsigned short yres */ , 240 -+ /* unsigned char act_high */ , 1 -+ /* unsigned char hsync_len */ , 64 -+ /* unsigned char left_margin */ , 1 -+ /* unsigned char right_margin */ , 16 -+ /* unsigned char vsync_len */ , 20 -+ /* unsigned char upper_margin */ , 8 -+ /* unsigned char lower_margin */ , 3 -+ /* unsigned char active */ , 1 -+ /* unsigned char crt */ , 0 } -+ -+ /* char const *name */ , { "sharp_qvga" -+ /* unsigned long pixclock */ , 0 -+ /* unsigned short xres */ , 320 /* , 320 */ -+ /* unsigned short yres */ , 240 /* , 240 */ -+ /* unsigned char act_high */ , 1 /* , 1 */ -+ /* unsigned char hsync_len */ , 20 /* , 8 */ -+ /* unsigned char left_margin */ , 1 /* , 16 */ -+ /* unsigned char right_margin */ , 30 /* , 1 */ -+ /* unsigned char vsync_len */ , 4 /* , 20 */ -+ /* unsigned char upper_margin */ , 17 /* , 17 */ -+ /* unsigned char lower_margin */ , 3 /* , 3 */ -+ /* unsigned char active */ , 1 /* , 1 */ -+ /* unsigned char crt */ , 0 } -+ -+ /* char const *name */ , { "qvga_portrait" -+ /* unsigned long pixclock */ , 0 -+ /* unsigned short xres */ , 240 -+ /* unsigned short yres */ , 320 -+ /* unsigned char act_high */ , 1 -+ /* unsigned char hsync_len */ , 64 -+ /* unsigned char left_margin */ , 34 -+ /* unsigned char right_margin */ , 1 -+ /* unsigned char vsync_len */ , 20 -+ /* unsigned char upper_margin */ , 8 -+ /* unsigned char lower_margin */ , 3 -+ /* unsigned char active */ , 1 -+ /* unsigned char crt */ , 0 -+ /* unsigned rotation */ , 90 } -+ -+ /* char const *name */ , { "hitachi_hvga" -+ /* unsigned long pixclock */ , 1 -+ /* unsigned short xres */ , 640 -+ /* unsigned short yres */ , 240 -+ /* unsigned char act_high */ , 1 -+ /* unsigned char hsync_len */ , 64 -+ /* unsigned char left_margin */ , 34 -+ /* unsigned char right_margin */ , 1 -+ /* unsigned char vsync_len */ , 20 -+ /* unsigned char upper_margin */ , 8 -+ /* unsigned char lower_margin */ , 3 -+ /* unsigned char active */ , 1 -+ /* unsigned char crt */ , 0 } -+ -+ /* char const *name */ , { "sharp_vga" -+ /* unsigned long pixclock */ , 1 -+ /* unsigned short xres */ , 640 -+ /* unsigned short yres */ , 480 -+ /* unsigned char act_high */ , 1 -+ /* unsigned char hsync_len */ , 64 -+ /* unsigned char left_margin */ , 60 -+ /* unsigned char right_margin */ , 60 -+ /* unsigned char vsync_len */ , 20 -+ /* unsigned char upper_margin */ , 34 -+ /* unsigned char lower_margin */ , 3 -+ /* unsigned char active */ , 1 -+ /* unsigned char crt */ , 0 } -+ -+ /* char const *name */ , { "hitachi_wvga" -+ /* unsigned long pixclock */ , 1 -+ /* unsigned short xres */ , 800 -+ /* unsigned short yres */ , 480 -+ /* unsigned char act_high */ , 1 -+ /* unsigned char hsync_len */ , 64 -+ /* unsigned char left_margin */ , 1 -+ /* unsigned char right_margin */ , 39 -+ /* unsigned char vsync_len */ , 20 -+ /* unsigned char upper_margin */ , 8 -+ /* unsigned char lower_margin */ , 3 -+ /* unsigned char active */ , 1 -+ /* unsigned char crt */ , 0 } -+// Note that you can use the nifty tool at the -+// following location to generate these values: -+// http://www.tkk.fi/Misc/Electronics/faq/vga2rgb/calc.html -+, { -+ name: "crt1024x768", -+ pixclock: 65000000, -+ xres: 1024, -+ yres: 768, -+ act_high : 0, -+ hsync_len: 136, -+ left_margin: 24, -+ right_margin: 160, -+ vsync_len: 6, -+ upper_margin: 3, -+ lower_margin: 29, -+ active : 0, -+ crt : 1 -+} -+, { -+ name: "hitachi_wxga", -+ pixclock: 1, -+ xres: 1024, -+ yres: 768, -+ act_high : 1, -+ hsync_len: 64, -+ left_margin: 1, -+ right_margin: 39, -+ vsync_len: 20, -+ upper_margin: 8, -+ lower_margin: 3, -+ active : 1, -+ crt : 0 -+} -+}; -+ -+/* -+. e -+typedef enum _polarity_t -+{ -+ POSITIVE, -+ NEGATIVE, -+} -+polarity_t; -+ -+typedef struct _mode_table_t -+{ -+ // Horizontal timing. -+ int horizontal_total; -+ int horizontal_display_end; -+ int horizontal_sync_start; -+ int horizontal_sync_width; -+ polarity_t horizontal_sync_polarity; -+ -+ // Vertical timing. -+ int vertical_total; -+ int vertical_display_end; -+ int vertical_sync_start; -+ int vertical_sync_height; -+ polarity_t vertical_sync_polarity; -+ -+ // Refresh timing. -+ long pixel_clock; -+ long horizontal_frequency; -+ long vertical_frequency; -+} -+mode_table_t; -+ -+ // 1024 x 768 -+ htotal dend hsstrt hsw hpolar vtot vdend vdstrt vsh vpolar pixclk hfreq vfreq -+{ 1344, 1024, 1048, 136, NEGATIVE, 806, 768, 771, 6, NEGATIVE, 65000000, 48363, 60 }, -+{ 1328, 1024, 1048, 136, NEGATIVE, 806, 768, 771, 6, NEGATIVE, 75000000, 56476, 70 }, -+{ 1312, 1024, 1040, 96, POSITIVE, 800, 768, 769, 3, POSITIVE, 78750000, 60023, 75 }, -+{ 1376, 1024, 1072, 96, POSITIVE, 808, 768, 769, 3, POSITIVE, 94500000, 68677, 85 }, -+ -+0FE80200/00010000 + CRT regs -+0FE80204/00180000 + -+0FE80208/08000800 + -+0FE8020C/05D003FF + -+0FE80210/00C80424 + -+0FE80214/032502FF + -+0FE80218/00060302 + -+0FE8021C/00000000 + -+0FE80220/00000000 + -+0FE80224/00400200 + -+0FE80228/00000000 + -+0FE8022C/00000000 + -+0FE80230/00000800 + -+0FE80234/00000000 + -+0FE80238/08000000 + -+0FE8023C/00000400 + -+*/ -+ -+struct lcd_panel_info_t const * const lcd_panels = lcd_panels_ ; -+unsigned const num_lcd_panels = sizeof(lcd_panels_)/sizeof(lcd_panels_[0]); -+ -+struct lcd_panel_info_t const *find_lcd_panel( char const * name ) -+{ -+ unsigned i ; -+ for( i = 0 ; i < num_lcd_panels ; i++ ) -+ { -+ if( 0 == strcmp( lcd_panels_[i].name, name ) ) -+ return lcd_panels_+i ; -+ } -+ return 0 ; -+} -+ -+struct lcd_panel_info_t const *cur_lcd_panel = 0 ; -diff -u -r --new-file u-boot-1.1.2/common/Makefile u-boot-1.1.2-neon/common/Makefile ---- u-boot-1.1.2/common/Makefile 2004-12-16 18:35:57.000000000 +0100 -+++ u-boot-1.1.2-neon/common/Makefile 2007-08-11 21:07:20.000000000 +0200 -@@ -35,16 +35,16 @@ - cmd_eeprom.o cmd_elf.o cmd_ext2.o \ - cmd_fat.o cmd_fdc.o cmd_fdos.o cmd_flash.o cmd_fpga.o \ - cmd_i2c.o cmd_ide.o cmd_immap.o cmd_itest.o cmd_jffs2.o \ -- cmd_load.o cmd_log.o \ -+ cmd_lcdpanel.o cmd_load.o cmd_log.o \ - cmd_mem.o cmd_mii.o cmd_misc.o cmd_mmc.o \ -- cmd_nand.o cmd_net.o cmd_nvedit.o \ -+ cmd_nand.o cmd_net.o cmd_not.o cmd_nvedit.o \ - cmd_pci.o cmd_pcmcia.o cmd_portio.o \ - cmd_reginfo.o cmd_reiser.o cmd_scsi.o cmd_spi.o cmd_universe.o cmd_usb.o cmd_vfd.o \ - command.o console.o devices.o dlmalloc.o docecc.o \ - environment.o env_common.o \ - env_nand.o env_dataflash.o env_flash.o env_eeprom.o env_nvram.o env_nowhere.o exports.o \ -- flash.o fpga.o \ -- hush.o kgdb.o lcd.o lists.o lynxkdi.o \ -+ flash.o fnmatch.o fpga.o \ -+ hush.o kgdb.o lcd.o lcd_panels.o lists.o lynxkdi.o \ - memsize.o miiphybb.o miiphyutil.o \ - s_record.o serial.o soft_i2c.o soft_spi.o spartan2.o \ - usb.o usb_kbd.o usb_storage.o \ -diff -u -r --new-file u-boot-1.1.2/config.mk u-boot-1.1.2-neon/config.mk ---- u-boot-1.1.2/config.mk 2004-10-10 00:21:30.000000000 +0200 -+++ u-boot-1.1.2-neon/config.mk 2007-08-11 21:07:20.000000000 +0200 -@@ -22,6 +22,7 @@ - # - - ######################################################################### -+sinclude select.mk # include DISPLAY_TYPE, HARDWARE_TYPE, SOFTWARE_TYPE, INCLUDE_MINIDEBUG - - # clean the slate ... - PLATFORM_RELFLAGS = -@@ -106,11 +107,15 @@ - OPTFLAGS= -Os #-fomit-frame-pointer - ifndef LDSCRIPT - #LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug -+ifeq ($(INCLUDE_MINIDEBUG),y) -+LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-bootmini.lds -+else - LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds - endif -+endif - OBJCFLAGS += --gap-fill=0xff - --gccincdir := $(shell $(CC) -print-file-name=include) -+gccincdir := "$(shell $(CC) -print-file-name=include)" - - CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS) \ - -D__KERNEL__ -DTEXT_BASE=$(TEXT_BASE) \ -@@ -170,11 +175,19 @@ - - ######################################################################### - -+ifdef LISTINGS -+%.s: %.S -+ $(CPP) $(AFLAGS) -Wa,-alh=$(basename $<).lst -o $@ $(CURDIR)/$< -+%.o: %.S -+ $(CC) $(AFLAGS) -c -Wa,-alh=$(basename $<).lst -o $@ $(CURDIR)/$< -+%.o: %.c -+ $(CC) $(CFLAGS) -c -Wa,-alh=$(basename $<).lst -o $@ $< -+else - %.s: %.S - $(CPP) $(AFLAGS) -o $@ $(CURDIR)/$< - %.o: %.S - $(CC) $(AFLAGS) -c -o $@ $(CURDIR)/$< - %.o: %.c - $(CC) $(CFLAGS) -c -o $@ $< -- -+endif - ######################################################################### -diff -u -r --new-file u-boot-1.1.2/Configure u-boot-1.1.2-neon/Configure ---- u-boot-1.1.2/Configure 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/Configure 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,170 @@ -+#!/bin/bash -+#======================================================================= -+DISPLAY_TYPE_CHOICES="DA640X240 DA320X240 DA800X480 DA640X480 DA240X320 DA800X600 DA1024X768 DP320X240 DP480X320 DL122X32" -+PLATFORM_TYPE_CHOICES="NEONB NEON HALOGEN BD2003 GAME_WITH_SMC GAME_CONTROLLER" -+# BOUNDARY_OLD_BOARD #lcd pin reordering for rgb problem, don't use VLIO(gp18 is turnstile) -+# OLD_GAME_CONTROLLER GAME_CONTROLLER_PLAITED_A1 -+REVISION_CHOICES="1 2" -+ -+SOFTWARE_TYPE_CHOICES="WINCE LINUX GAME" -+INCLUDE_MINIDEBUG_CHOICES="y n" -+CPU_CLOCK_CHOICES="100 200 300 400" -+CPU_CLOCK_PXA270_CHOICES="104 208 312 416 520 624" -+ -+CONFIG_H=include/configs/select.h -+CONFIG_MK=select.mk -+CONFIG_LOG=select.log -+ -+fail () -+{ -+ echo "" -+ echo "Configuration failed." -+ echo "" -+ exit 1 -+} -+ -+if [ -f $CONFIG_MK ] ; then -+. ./$CONFIG_LOG -+fi -+ -+ -+ -+#======================================================================= -+ -+ -+arg () { -+ VALUE="`echo X"$2" | sed -e 's/^X--[a-zA-Z_]*=//'`" -+ eval $1=\"$VALUE\" -+ eval $1_P='y' -+} -+ -+usage () { -+ echo "bad parameters" -+ exit 1 -+} -+ -+while [ $# -gt 0 ] ; do -+ case "$1" in -+ --DISPLAY_TYPE=*) arg DISPLAY_TYPE $1 ;; -+ --PLATFORM_TYPE=*) arg PLATFORM_TYPE $1 ;; -+ --SOFTWARE_TYPE=*) arg SOFTWARE_TYPE $1 ;; -+ --INCLUDE_MINIDEBUG=*) arg INCLUDE_MINIDEBUG $1 ;; -+ --CPU_CLOCK=*) arg CPU_CLOCK $1 ;; -+ *) usage ;; -+ esac -+ shift -+done -+ -+#======================================================================= -+ -+write_str () { -+ value=`eval echo '$'$1` -+ echo "$1=$value" >> $CONFIG_MK -+ echo "$1=\"$value\"" >> $CONFIG_LOG -+ if [ x$3 != x ] ; then -+ choices=`eval echo '$'$2` -+ str="" -+ for a in $choices ; do -+ if [ -n "$str" ] ; then str="$str && " ; fi -+ str="$str!defined($3$a)"; -+ done -+ echo "#if $str" >> $CONFIG_H -+ echo "#define $3$value" >> $CONFIG_H -+ echo "#endif" >> $CONFIG_H -+ else -+ echo "#ifndef $1" >> $CONFIG_H -+ echo "#define $1 $value" >> $CONFIG_H -+ echo "#endif" >> $CONFIG_H -+ fi -+} -+ -+prompt () { -+ eval $3=\"$2\" -+ /bin/echo -e "$1 [$2]: \c" -+ read tmp -+ if [ -n "$tmp" ] ; then eval $3=\"$tmp\" ; fi -+ if [ ! -t 1 ] ; then echo $3 ; fi -+} -+noprompt () { -+ eval $3=\"$2\" -+ /bin/echo -e "$1 [$2]: " -+ if [ ! -t 1 ] ; then echo $3 ; fi -+} -+ -+ -+ask_str () { -+ choices=`eval echo '$'$3` -+ default=`eval echo '$'$2` -+ ppp=`eval echo '$'$2_P` -+ ans="" -+ stop="0" -+ if [ x$ppp = x"y" ] ; then -+ noprompt "$1 ($choices)" "$default" answer -+ for a in $choices ; do -+ if [ x$a = x$answer ] ; then ans=$a; stop="1"; break; fi; -+ done -+ if [ $stop != "1" ] ; then default=""; fi; -+ fi -+ while [ $stop != "1" ] ; do -+ prompt "$1 ($choices)" "$default" answer -+ for a in $choices ; do -+ if [ x$a = x$answer ] ; then ans=$a; stop="1"; break; fi; -+ done -+ done -+ eval $2=\"$ans\" -+} -+#======================================================================= -+ -+echo "" -+echo " -------- U-Boot Boundary Devices Specific Configuration Script --------" -+echo "" -+echo "" -+ -+ask_str "Choose display type" DISPLAY_TYPE DISPLAY_TYPE_CHOICES -+ask_str "Choose hardware type" PLATFORM_TYPE PLATFORM_TYPE_CHOICES -+ if [ x$PLATFORM_TYPE = xHALOGEN ] ; then -+ask_str "Choose hardware revision" PLATFORM_REV REVISION_CHOICES -+ fi -+ask_str "Choose software type" SOFTWARE_TYPE SOFTWARE_TYPE_CHOICES -+ask_str "Include minidebug" INCLUDE_MINIDEBUG INCLUDE_MINIDEBUG_CHOICES -+ -+ if [ x$PLATFORM_TYPE = xHALOGEN ] ; then -+ask_str "CPU clock" CPU_CLOCK CPU_CLOCK_PXA270_CHOICES -+ else -+ask_str "CPU clock" CPU_CLOCK CPU_CLOCK_CHOICES -+ fi -+ -+rm -f $CONFIG_H $CONFIG_MK -+ -+cat << 'EOF' > $CONFIG_H -+/* -+ Automatically generated by 'make xxx_config' -- don't edit! -+*/ -+#include <asm/arch/platformTypes.h> -+EOF -+ -+cat << 'EOF' > $CONFIG_MK -+# -+# Automatically generated by 'make xxx_config' -- don't edit! -+# -+EOF -+ -+cat << 'EOF' > $CONFIG_LOG -+#!/bin/bash -+EOF -+ -+chmod 777 $CONFIG_LOG -+ -+write_str DISPLAY_TYPE DISPLAY_TYPE_CHOICES -+write_str PLATFORM_TYPE PLATFORM_TYPE_CHOICES -+ if [ x$PLATFORM_TYPE = xHALOGEN ] ; then -+write_str PLATFORM_REV REVISION_CHOICES -+ fi -+write_str SOFTWARE_TYPE SOFTWARE_TYPE_CHOICES -+write_str INCLUDE_MINIDEBUG INCLUDE_MINIDEBUG_CHOICES -+ if [ x$PLATFORM_TYPE = xHALOGEN ] ; then -+write_str CPU_CLOCK CPU_CLOCK_PXA270_CHOICES -+ else -+write_str CPU_CLOCK CPU_CLOCK_CHOICES -+ fi -+echo "Configuration successful." -diff -u -r --new-file u-boot-1.1.2/cpu/mpc8xx/lcd.c u-boot-1.1.2-neon/cpu/mpc8xx/lcd.c ---- u-boot-1.1.2/cpu/mpc8xx/lcd.c 2004-10-10 01:26:00.000000000 +0200 -+++ u-boot-1.1.2-neon/cpu/mpc8xx/lcd.c 2007-08-11 21:07:20.000000000 +0200 -@@ -255,7 +255,6 @@ - /*----------------------------------------------------------------------*/ - - --int lcd_line_length; - - int lcd_color_fg; - int lcd_color_bg; -diff -u -r --new-file u-boot-1.1.2/cpu/pxa/config.mk u-boot-1.1.2-neon/cpu/pxa/config.mk ---- u-boot-1.1.2/cpu/pxa/config.mk 2003-05-23 14:36:21.000000000 +0200 -+++ u-boot-1.1.2-neon/cpu/pxa/config.mk 2007-08-11 21:15:47.000000000 +0200 -@@ -21,8 +21,19 @@ - # Foundation, Inc., 59 Temple Place, Suite 330, Boston, - # MA 02111-1307 USA - # -- --PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \ -- -mshort-load-bytes -msoft-float -- --PLATFORM_CPPFLAGS += -mapcs-32 -march=armv4 -mtune=strongarm1100 -++sinclude ../../select.mk # include DISPLAY_TYPE, HARDWARE_TYPE, SOFTWARE_TYPE, INCLUDE_MINIDEBUG -++ -++PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 -++PLATFORM_CPPFLAGS += -mapcs-32 -march=armv4 -++GCC_MAJOR := $(shell $(CC) -v 2>&1 | grep version | cut -d' ' -f3 | cut -d'.' -f1) -++GCC_MINOR := $(shell $(CC) -v 2>&1 | grep version | cut -d' ' -f3 | cut -d'.' -f2) -++ -++ifneq ($(GCC_MAJOR),3) -++ PLATFORM_CPPFLAGS += -mtune=strongarm1100 -++ PLATFORM_RELFLAGS += -msoft-float -++else -++ PLATFORM_CPPFLAGS += -mtune=xscale -++ ifneq ($(GCC_MINOR),4) -++ PLATFORM_RELFLAGS += -msoft-float -++ endif -++endif -diff -u -r --new-file u-boot-1.1.2/cpu/pxa/cpu.c u-boot-1.1.2-neon/cpu/pxa/cpu.c ---- u-boot-1.1.2/cpu/pxa/cpu.c 2004-02-08 20:38:44.000000000 +0100 -+++ u-boot-1.1.2-neon/cpu/pxa/cpu.c 2007-08-11 21:07:20.000000000 +0200 -@@ -33,6 +33,7 @@ - #include <common.h> - #include <command.h> - #include <asm/arch/pxa-regs.h> -+#include <asm/arch/mmc.h> - - int cpu_init (void) - { -@@ -59,8 +60,12 @@ - - unsigned long i; - -+ MMC_STRPCL = MMC_STRPCL_STOP_CLK; -+ - disable_interrupts (); - -+ dcache_disable(); -+ - /* turn off I-cache */ - asm ("mrc p15, 0, %0, c1, c0, 0":"=r" (i)); - i &= ~0x1000; -@@ -129,21 +134,6 @@ - return (i & 0x1000); - } - --/* we will never enable dcache, because we have to setup MMU first */ --void dcache_enable (void) --{ -- return; --} -- --void dcache_disable (void) --{ -- return; --} -- --int dcache_status (void) --{ -- return 0; /* always off */ --} - - void set_GPIO_mode(int gpio_mode) - { -diff -u -r --new-file u-boot-1.1.2/cpu/pxa/Makefile u-boot-1.1.2-neon/cpu/pxa/Makefile ---- u-boot-1.1.2/cpu/pxa/Makefile 2003-06-16 00:40:43.000000000 +0200 -+++ u-boot-1.1.2-neon/cpu/pxa/Makefile 2007-08-11 21:07:20.000000000 +0200 -@@ -23,10 +23,45 @@ - - include $(TOPDIR)/config.mk - -+CPU_TYPE=xscale -+ -+ifeq ($(SOFTWARE_TYPE),WINCE) -+STACKS_VALID = -DCONFIG_STACKS_VALID -+else -+ -+ifeq ($(SOFTWARE_TYPE),GAME) -+STACKS_VALID = -DCONFIG_STACKS_VALID -+else -+STACKS_VALID = -+endif -+endif -+ARM_ELF_GCC ?= arm-elf-gcc -+ - LIB = lib$(CPU).a - --START = start.o --OBJS = serial.o interrupts.o cpu.o i2c.o pxafb.o mmc.o -+ifeq ($(INCLUDE_MINIDEBUG),y) -+START = minidebug.o ministart.o -+else -+START = start.o ministart.o -+endif -+OBJS = serial.o interrupts.o cpu.o i2c.o mmc.o -+ -+ifdef PXALCD -+ OBJS += pxafb.o -+endif -+ -+ifeq ($(PLATFORM_TYPE),HALOGEN) -+ OBJS += usb_ohci.o -+else -+ifeq ($(PLATFORM_TYPE),NEON) -+ OBJS += usb_ohci.o -+else -+ifeq ($(PLATFORM_TYPE),NEONB) -+ OBJS += usb_ohci.o -+else -+endif -+endif -+endif - - all: .depend $(START) $(LIB) - -@@ -35,9 +70,13 @@ - - ######################################################################### - --.depend: Makefile $(START:.o=.S) $(OBJS:.o=.c) -- $(CC) -M $(CFLAGS) $(START:.o=.S) $(OBJS:.o=.c) > $@ -+.depend: Makefile $(START) $(OBJS) -+ $(CC) -M $(CFLAGS) -DUBOOT=1 $(START:.o=.S) $(OBJS:.o=.c) > $@ - - sinclude .depend - -+minidebug.o : minidebug.S Makefile -+ $(ARM_ELF_GCC) -c $(D_GNUC) -DUBOOT=1 -DDISPLAY_TYPE=$(DISPLAY_TYPE) -DPLATFORM_TYPE=$(PLATFORM_TYPE) -DPLATFORM_REV=$(PLATFORM_REV) -DSOFTWARE_TYPE=$(SOFTWARE_TYPE) $(STACKS_VALID) -DCPU_CLOCK=$(CPU_CLOCK) \ -+ $(SOFT_FLOAT) -I$(TOPDIR)/include -mtune=$(CPU_TYPE) -mcpu=$(CPU_TYPE) -o $@ $< -+ - ######################################################################### -diff -u -r --new-file u-boot-1.1.2/cpu/pxa/minidebug.S u-boot-1.1.2-neon/cpu/pxa/minidebug.S ---- u-boot-1.1.2/cpu/pxa/minidebug.S 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/cpu/pxa/minidebug.S 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,3850 @@ -+ .nolist -+ .ifdef __ARMASM -+UBOOT EQU 0 -+CONFIG_UNSCRAMBLE_LCD EQU 0 -+LCD_REORDER_BLUE EQU 1 -+ .endif -+ -+#ifdef UBOOT -+#include <asm/arch/platformTypes.h> -+#include <configs/select.h> -+#include <asm/arch/pxaGpio.h> -+#include <asm/arch/pxaMacro3.h> -+#include <asm/arch/miniMac.inc> -+#include <asm/arch/burn.inc> -+#else -+#include "platformTypes.h" -+#include "pxaGpio.h" -+#include "pxaMacro3.h" -+#include "miniMac.inc" -+#include "burn.inc" -+ .ifdef __ARMASM -+ STARTUPTEXT -+ EXTERN HeadStart -+ .endif -+#endif -+ -+ .list -+ .global StartUp -+ -+ -+#define L1(a) ((CH_##a)) -+#define L2(a,b) ((CH_##a)+(CH_##b<<8)) -+#define L3(a,b,c) ((CH_##a)+(CH_##b<<8)+(CH_##c<<16)) -+#define L4(a,b,c,d) ((CH_##a)+(CH_##b<<8)+(CH_##c<<16)+(CH_##d<<24)) -+ -+#define C2(a,b) ((CH_##a<<8)+(CH_##b)) -+#define C3(a,b,c) ((CH_##a<<16)+(CH_##b<<8)+(CH_##c)) -+#define C4(a,b,c,d) ((CH_##a<<24)+(CH_##b<<16)+(CH_##c<<8)+(CH_##d)) -+ -+// ******************************************************************************************* -+// ******************************************************************************************* -+ -+ -+//.global _start -+//_start: -+StartUp: -+ b V_Reset //0 -+ b V_UndefinedInstr //4 -+ b V_SWI //8 -+ b V_PrefetchAbort //0x0c -+ b V_DataAbort //0x10 -+ b V_Unused //0x14, not used -+ b V_IRQ //0x18 -+// b V_FIQ //0x1c -+ -+//In Linux, all modes switch almost immediately to the SVC mode -+//and it is the only one with a valid stack -+//FIQ & SWI stacks are always assumed valid -+V_FIQ: -+ V_VectorEntrance V_rWork,V_rBranch,SIG_FIQ -+ -+join_fiq: -+ CheckBranch V_rWork,V_rBranch -+ V_VectorExitCC V_rWork,V_rBranch,eq,eqia -+ CheckLdr V_rWork,V_rBranch -+ V_VectorExitCC1 V_rWork,V_rBranch,cc,ccia -+join_fiq2: -+ sub sp,sp,#(DEBUG_SPACE-DBG_R0) //the extra 12 bytes already on stack are needed for indirect return for SDS bug -+ stmia sp,{r0,r1} -+ sub r1,V_rBranch,#8 //restore to SIG_xxx value -+ add r0,sp,#(DEBUG_SPACE-DBG_R0) -+ ldr V_rWork,[r0],#4 -+ ldr V_rBranch,[r0],#8 -+ str r0,[sp,#DBG_HSP-DBG_R0] -+ sub r0,sp,#DBG_R0 -+join_fiq3: -+ mov r1,r1,LSR #2 -+ and r1,r1,#0xf -+ b SaveRest2 -+V_Reset: -+//this is either a normal processor reset, or a debug exception in halt mode -+ mrs sp,cpsr -+ and sp,sp,#0x1f -+ cmp sp,#0x15 -+ bne 2f -+//this is a debug exception in halt mode -+ CP14_DCSR mrc,sp -+ and sp,sp,#0x1c -+ cmp sp,#0 //reset -+ cmpne sp,#5<<2 //vector trap (reset vector) -+ bne 10f //initialization already done -+ -+ BigMov sp,PWR_MANAGER_BASE -+ ldr sp,[sp,#RCSR] -+ tst sp,#2 -+ tsteq pc,#0xff000000 -+ bne 2f //br if watchdog reset or if not nCS0 address -+ -+//signal debugger that he can download into main instruction cache now -+ CP14_TX mcr,sp -+1: -+ CP14_TXRXCTRL mrc,r15 //r15 means update condition codes -+ bpl 1b -+ CP14_RX mrc,sp //just read and discard -+2: -+ CP14_DCSR mrc,sp -+ orr sp,sp,#1<<31 //set global debug enable bit -+ CP14_DCSR mcr,sp -+ -+// InitGPIO r0,sp -+// InitIC_Clocks r0,sp -+// InitUART r0,sp,UART_BASE,BAUDRATE -+// TransMacro L1(U) -+ b MainInitializationCode //this can be in the main instruction cache not locked -+ //because it is only executed upon reset -+ -+10: -+ cmp sp,#1<<2 //Instruction breakpoint -+ mov sp,r0 //save r0 -+ BigMov r0,DEBUG_BASE -+ str sp,[r0,#DBG_R0] -+ str r1,[r0,#DBG_R1] -+ str r2,[r0,#DBG_R2] -+SSDebug: -+ bne 11f -+//this is a breakpoint -+ ldr r1,[r0,#DBG_TRACE] -+ tst r1,#1 -+ beq 11f -+ cmn r1,#1 -+ moveq r1,#0 -+ CP15_IBCR1 mrc,sp -+ sub r2,lr,#3 -+ cmp sp,r2 -+ CP15_IBCR1 mcreq,r1 //remove breakpoint if single-stepping -+ beq 11f -+ CP15_IBCR0 mrc,sp -+ cmp sp,r2 -+ CP15_IBCR0 mcreq,r1 -+11: -+ mrs r2,spsr -+ sub lr,lr,#4 -+ -+ str r3,[r0,#DBG_R3] -+ ldrb r3,[r0,#DBG_Mode] -+SaveDebug: -+ CP14_DCSR mrc,sp -+// str sp,[r0,#DBG_Temp] //the mcr CP14_DCSR instruction below will trash sp in SDS (special debug state) -+ and r1,sp,#0x1c -+ orr sp,sp,#0x1c -+ CP14_DCSR mcr,sp -+ mov r1,r1,LSR #2 -+ add r1,r1,#SIG_DBG -+ b SaveR4andUp -+ -+V_UndefinedInstr: -+ VectorEntrance rWork,rBranch,SIG_UNDEFINED_INSTRUCTION -+ JOIN b -+V_IRQ: -+ VectorEntrance rWork,rBranch,SIG_IRQ -+ -+ .if STACKS_VALID -+ JOIN b -+ .else -+join_irq: -+ CheckBranch I_rWork,I_rBranch -+ I_VectorExitCC I_rWork,I_rBranch,eq,eqia -+ -+ CheckLdr I_rWork,I_rBranch -+ I_VectorExitCC1 I_rWork,I_rBranch,cc,ccia -+join_irq2: -+ strd r0,[I_rWork,#DBG_R0-DBG_MAGIC] -+ sub r0,I_rWork,#DBG_MAGIC -+ sub r1,I_rBranch,#8 //restore to SIG_xxx value -+ ldr I_rWork,[r0,#DBG_TEMP] -+ add sp,r0,#DBG_INDIRECT_R0+8 //sp is trashed, if stacks assumed invalid -+ str sp,[r0,#DBG_HSP] -+ b join_fiq3 -+ .endif -+ -+//sp is valid for this!!!!!, what a treat -+V_SWI: -+ V_VectorEntrance V_rWork,V_rBranch,SIG_SWI -+ b join_fiq -+ -+//monitor mode also has instruction breakpoint, bkpt instruction -+V_PrefetchAbort: -+ VectorEntrance rWork,rBranch,SIG_PREFETCH_ABORT -+ CP15_FSR mrc,rWork -+ tst rWork,#1<<9 -+ bne DEBUG_EVENT //br if a debug event, in monitor mode -+ -+//the 1st instruction after exiting special debug state can cause an abort or possibly the wrong instruction to execute. -+//the Immu is not turned on until the 2nd instruction. -+ tst rWork,#1<<10 -+ JOIN beq -+ and rWork,rWork,#0xf -+ cmp rWork,#0x6 -+ JOIN bne //br if not an external abort -+ -+ CP15_CONTROL mrc,rWork //get the control register -+ tst rWork,#1 //test MMU -+ -+ BigMov rWork,DEBUG_BASE+DBG_ABORT_PC -+ swpne rWork,lr,[rWork] //save lr as a flag so not infinite errors, if mmu on -+ cmpne rWork,lr -+ -+ .if STACKS_VALID -+ ldrne rBranch,[sp,#4] -+ ldrne rWork,[sp],#12 -+ subnes pc,lr,#4 //retry access -+ .else -+ BigMov rWork,DEBUG_BASE+DBG_MAGIC -+ ldrne rWork,[rWork,#DBG_TEMP-DBG_MAGIC] -+ subnes pc,lr,#4 //retry access -+ .endif -+ -+ add rBranch,rBranch,#8 -+ JOIN2 b -+ -+//stacks aren't kept valid -+//monitor mode also has data breakpoint, external debug break, trace-buffer full break -+V_DataAbort: -+ VectorEntrance rWork,rBranch,SIG_DATA_ABORT -+ CP15_FSR mrc,rWork -+ tst rWork,#1<<9 -+ JOIN beq -+ sub lr,lr,#4 //+8 of offending instruction for most data aborts instead of +4 -+DEBUG_EVENT: -+ BigMov rWork,DEBUG_BASE+DBG_MAGIC -+ strd r0,[rWork,#DBG_R0-DBG_MAGIC] -+ sub r0,rWork,#DBG_MAGIC -+ -+ .if STACKS_VALID -+ ldr rWork,[sp],#4 -+ ldr rBranch,[sp],#8 -+ .else -+ ldr rWork,[r0,#DBG_TEMP] -+ add sp,r0,#DBG_INDIRECT_R0+8 //sp is trashed, if stacks assumed invalid -+ .endif -+ str sp,[r0,#DBG_HSP] -+ CP14_DCSR mrc,sp -+ and sp,sp,#0x1c -+ cmp sp,#1<<2 //Instruction breakpoint -+ str r2,[r0,#DBG_R2] -+ b SSDebug -+ -+V_Unused: -+ mov sp,r0 //save r0 -+ BigMov r0,DEBUG_BASE -+ str sp,[r0,#DBG_R0] -+ str r1,[r0,#DBG_R1] -+ mov r1,#SIG_UNUSED -+// b SaveRest2 -+ -+//r0 - debug storage -+//r1 - reason for getting here -+SaveRest2: -+ str r2,[r0,#DBG_R2] -+ sub lr,lr,#4 -+ mrs r2,spsr -+ str r3,[r0,#DBG_R3] -+ ldrb r3,[r0,#DBG_Mode] -+//r2 - spsr -+//r3 - DBG_MODE - don't assume that ram is working upon reset -+SaveR4andUp: -+ str r4,[r0,#DBG_R4] -+ str lr,[r0,#DBG_PC] //return PC -+ str r2,[r0,#DBG_CPSR] //return CPSR -+ mrs r4,cpsr -+ str r4,[r0,#DBG_HCPSR] //mode to return to before exception return -+ -+ tst r2,#0xf -+ orreq r2,r2,#0xdf //if user mode, switch to system mode to access user registers, set I, F -+ orrne r2,r2,#0xc0 //set I, F -+ msr cpsr_c,r2 -+ -+ add r2,r0,#DBG_R5 -+ stmia r2,{r5,r6,r7,r8,r9,sl,fp,ip,sp,lr} -+// ********************************** -+// ********************************** -+ -+ mov rDBG,r0 -+ mov r6,r1 //reason -+ mov r5,r3 //DBG_MODE -+ strb r2,[rDBG,#DBG_LastSignal] -+ CP15_CONTROL mrc,r1 //get the control register -+ tst r1,#1 -+ BigMov rUart,UART_BASE //this is right if MMU is off -+ blne GetUartAddress //if MMU is on -+ b gdb_lastSignal1 -+ -+//r1 - CP15_CONTROL(r1) -+GetUartAddress: -+ tst r1,#1<<13 //assume 1:1 mapping for TTBR if relocation vector is off -+// see if identity mapping is enabled -+ CP15_TTBR mrc,r1 -+// using Big will generate no instructions if Wince, throwing off my reloc vector -+// BigAdd2Ne r1,(SDRAM_BASE_C_VIRTUAL-0xA0000000) -+ addne r1,r1,#(SDRAM_BASE_C_VIRTUAL-0xA0000000) //convert this physical address to a virtual address if relocation vector ON -+ -+ ldr r2,[r1,rUart,lsr #18] -+ sub r2,r2,rUart -+ cmp r2,#1<<20 -+ movcc pc,lr //identity mapping on -+ -+ mov r3,rUart -+ BigMov rUart,UART_VIRT_BASE -+1: ldr r2,[r1,rUart,lsr #18] -+ tst r2,#3 -+ beq 2f -+ sub r2,r2,r3 -+ cmp r2,#1<<20 -+ movcc pc,lr //br if found virtual address -+ adds rUart,rUart,#1<<20 -+ moveq rUart,#0xE0000000 -+ b 1b -+2: -+ BigOrr2 r3,0xc02 -+ str r3,[r1,rUart,lsr #18] //steal this unused entry -+// b cache_clean_invalidate_all -+ -+cache_clean_invalidate_all: -+//flush data cache, if data cache is enabled -+ CP15_CONTROL mrc,r0 //get the control register -+ tst r0,#4 -+ moveq pc,lr //return if disabled -+ -+// Set baseaddress as the 1st virtual address of a 32k range used only -+// to flush the data cache. baseaddress should be aligned on a 32 byte(cache-line) boundary. -+// If the virtual range beginning with baseaddress is used for any purpos other than flushing -+// the data cache, then cachelinecount must be doubled from 1024 to 2048 -+ mov r1,#cachelinecount -+ ldr r0,[rDBG,#DBG_PC] //I hope my return address is mapped -+ BigBic2 r0,0xffff -+1: -+ CP15_CF_ALLOC_LINE mcr,r0 //allocate a cache line for r0 -+ add r0,r0,#cachelinesize -+ subs r1,r1,#1 -+ bne 1b -+ -+// teq r2, #0 // if running only from cache, an invalidate could be fatal if not done from minicache -+ // and then, a return to caller would not be allowed, so invalidate is postponed -+// CP15_CF_INVAL_I mcrne,r0 -+ CP15_CF_DRAIN mcr,r0 -+ CP15_CF_INVAL_D mcr,r0 -+// The instruction cache is guaranteed to be invalidated at this point. The -+// next instruction sees the result of the invalidate command. -+ mov pc,lr -+ -+ -+//r0 - value to printm r9 - chksum -+PrintHexEndian: -+#if LITTLE_ENDIAN -+ mov r2,#8 -+1: mov r4,r0 -+ mov r3,lr -+2: tst r2,#1 -+ moveq r0,r4,LSR #4 -+ andne r0,r4,#0xf -+ andeq r0,r0,#0xf -+ movne r4,r4,ROR #8 -+ cmp r0,#0xA -+ addcs r0,r0,#L1(a)-0x0a -+ addcc r0,r0,#L1(0) -+ add r9,r9,r0 -+ bl Transmit -+ subs r2,r2,#1 -+ bne 2b -+ mov pc,r3 -+ -+PrintHexByteEndian: -+ mov r2,#2 -+ b 1b -+#else -+ mov r2,#8 -+ mov r4,r0 -+1: mov r3,lr -+2: mov r4,r4,ROR #28 -+ and r0,r4,#0xf -+ cmp r0,#0xA -+ addcs r0,r0,#L1(a)-0x0a -+ addcc r0,r0,#L1(0) -+ add r9,r9,r0 -+ bl Transmit -+ subs r2,r2,#1 -+ bne 2b -+ mov pc,r3 -+PrintHexByteEndian: -+ mov r4,r0,LSL #24 -+ mov r2,#2 -+ b 1b -+#endif -+ -+PrintHexByte: -+ mov r4,r0,LSL #24 -+ mov r2,#2 -+ b PrintHex1 -+ -+TransmitCRLF: -+ BigMov r0,L2(CR,LF) -+ b Transmit -+ -+ -+ .if STACKS_VALID -+ .else -+// ******************************************************* -+ RelocationVector 0 -+// ******************************************************* -+ .endif -+ -+ -+//IN: r0 - value to print -+//OUT: r0-r4 trashed -+PrintHex: -+ mov r2,#8 -+ mov r4,r0 -+PrintHex1: -+ mov r3,lr -+1: mov r4,r4,ROR #28 -+ and r0,r4,#0xf -+ cmp r0,#0xA -+ addcs r0,r0,#L1(A)-0x0a -+ addcc r0,r0,#L1(0) -+ bl Transmit -+ subs r2,r2,#1 -+ bne 1b -+ mov pc,r3 -+ -+ -+TransmitSPACE: -+ mov r0,#L1(SPACE) -+// b Transmit -+ -+//IN: r0 - character to transmit -+//OUT: r0 - last character transmitted, r1 - trashed -+Transmit1: -+Transmit: -+1: ldr r1,[rUart,#UART_LSR] -+ ands r1,r1,#0x20 -+ beq 1b -+ mov r1,r0 -+ and r1,r1,#0xff -+ str r1,[rUart,#UART_THR] -+ movs r1,r0,LSR #8 -+ movne r0,r1 -+ bne 1b -+ mov pc,lr //return -+ -+TransmitChkSum: -+ add r9,r9,r0 -+ b Transmit -+ -+ .if STACKS_VALID -+// ******************************************************* -+ RelocationVector 2 -+// ******************************************************* -+ .endif -+ -+//OUT: -+//z-0 good data in r0 -+//z-1 timeout, r0 is 0 -+//r1 - loop cnt time remaining -+Receive: -+ mov r1,#RECEIVE_LOOP_COUNT -+Receive1: -+1: ldr r0,[rUart,#UART_LSR] -+ ands r0,r0,#0x1 -+ ldrne r0,[rUart,#UART_RBR] -+ movne pc,lr //return -+ -+ subs r1,r1,#1 -+ bne 1b -+ mov pc,lr //return -+ -+ -+ -+ -+//IN: r2 - symbol # -+//OUT: r1:r0 - value, -+GetRegVal: -+ cmp r2,#SYM_FP0 -+ bcs GetSpecialReg -+#if DBG_R0 -+ add r1,rDBG,#DBG_R0 -+ ldr r0,[r1,r2,LSL #2] -+#else -+ ldr r0,[rDBG,r2,LSL #2] -+#endif -+ mov r1,#0 -+ mov pc,lr -+ -+// ******************************************************************** -+// ******************************************************************** -+// ******************************************************************** -+ -+ -+gdb_lastSignal: -+ ldrb r6,[rDBG,#DBG_LastSignal] -+ ldrb r5,[rDBG,#DBG_Mode] -+gdb_lastSignal1: -+ ldr r0,[rUart,#UART_LCR] -+ strb r0,[rDBG,#DBG_FFUART_LCR] -+ bic r0,r0,#0x80 //make sure DLAB is clear -+ str r0,[rUart,#UART_LCR] -+ -+ -+1: mov r9,#0 //chksum -+ mov r0,#L1(DOLLAR) -+ bl Transmit -+// mov r0,#L1(T) -+ mov r0,#L1(S) -+ bl TransmitChkSum -+ mov r0,r6 -+ bl PrintHexByteEndian -+// mov r0,#L1(F) -+// bl TransmitChkSum -+// mov r0,#L1(COLON) -+// bl TransmitChkSum -+// mov r2,#SYM_PC -+// bl GetRegVal -+// bl PrintHexEndian -+ -+ mov r0,#L1(POUND) -+ bl Transmit -+ and r0,r9,#0xff -+ bl PrintHexByteEndian -+ mov r3,#0 -+ mov r1,#RECEIVE_LOOP_COUNT -+10: -+ bl Receive1 //z-0 good data in r0, z-1 timeout, r0 is 0 -+ moveq rNum1,#0 -+ beq 12f //br if timeout -+ cmpne r6,#SIG_RESET //disable cr abort on power up -+// beq 10b //uncomment to stop <cr> from stopping -+ -+ cmp r0,#L1(PLUS) -+ beq WaitForDollarSign -+ cmp r0,#L1(DOLLAR) -+ beq ReadGDB -+ -+ cmp r0,#L1(MINUS) -+ beq 1b -+ tst r5,#1 -+ cmpeq r0,#GDB_EXIT_CHAR -+ bne 10b //br if in GDB mode or NOT <cr> -+ mov rNum1,#1 -+ -+//r6 -SIG_xxx -+12: -+ bl TransmitCRLF -+ cmp r6,#SIG_DBG -+ BigMov r0,L4(D,B,G,MINUS) -+ blcs Transmit1 -+ -+ mov r2,#0 -+ mov r3,#0 -+ mov r4,#0 -+ cmp r6,#SIG_RESET -+ cmpne r6,#SIG_DBG_RESET -+ BigMovEq r0,L4(R,e,s,e) -+ BigMovEq r2,L1(t) -+ cmp r6,#SIG_UNDEFINED_INSTRUCTION -+ BigMovEq r0,L4(U,n,d,e) -+ BigMovEq r2,L1(f) -+// BigMovEq r3,L1(d) -+ cmp r6,#SIG_SWI -+ BigMovEq r0,L3(S,w,i) -+ cmp r6,#SIG_PREFETCH_ABORT -+ BigMovEq r0,L4(P,r,e,f) -+ BigMovEq r2,L4(e,t,c,h) -+ cmp r6,#SIG_DATA_ABORT -+ BigMovEq r0,L4(D,a,t,a) -+ cmpne r6,#SIG_PREFETCH_ABORT -+ BigMovEq r3,L4(SPACE,A,b,o) -+ BigMovEq r4,L2(r,t) -+ cmp r6,#SIG_UNUSED -+ BigMovEq r0,L4(U,n,u,s) -+ BigMovEq r2,L2(e,d) -+ cmp r6,#SIG_IRQ -+ BigMovEq r0,L3(I,r,q) -+ cmp r6,#SIG_FIQ -+ BigMovEq r0,L3(F,i,q) -+ cmp r6,#SIG_DBG_INSTRUCTION_BKPT -+ BigMovEq r0,L4(I,n,s,t) -+ BigMovEq r2,L4(SPACE,B,r,k) -+ cmp r6,#SIG_DBG_DATA_BKPT -+ BigMovEq r0,L4(D,a,t,a) -+ BigMovEq r2,L4(SPACE,B,r,k) -+ cmp r6,#SIG_DBG_BKPT_SOFTWARE -+ BigMovEq r0,L4(B,k,p,t) -+ cmp r6,#SIG_DBG_EXTERNAL -+ BigMovEq r0,L4(E,x,t,e) -+ BigMovEq r2,L4(r,n,a,l) -+ cmp r6,#SIG_DBG_VECTOR_TRAP -+ BigMovEq r0,L4(V,e,c,t) -+ BigMovEq r2,L4(o,r,SPACE,T) -+ BigMovEq r3,L3(r,a,p) -+ cmp r6,#SIG_DBG_TRACE_BUFFER_FULL -+ BigMovEq r0,L4(T,r,a,c) -+ BigMovEq r2,L4(e,SPACE,F,u) -+ BigMovEq r3,L2(l,l) -+ cmp r6,#SIG_DBG_RESERVED -+ BigMovEq r0,L4(R,e,s,e) -+ BigMovEq r2,L4(r,v,e,d) -+ -+ bl Transmit1 -+ movs r0,r2 -+ blne Transmit1 -+ movs r0,r3 -+ blne Transmit1 -+ movs r0,r4 -+ blne Transmit1 -+ -+ bl TransmitSPACE -+ mov r2,#SYM_PC -+ bl GetRegVal -+ bl PrintHex -+// bl TransmitSPACE -+ bl TransmitCRLF -+ -+ rsbs r0,pc,#0x800 -+ BigMov r0,FLASH_READ_CMD -+ -+#if (PLATFORM_TYPE==NEONB) -+ BigMov r1,VIRTUAL_CS1 //remember, although instruction fetches are physical, data are still virtual -+#else -+ BigMov r1,VIRTUAL_CS0 //remember, although instruction fetches are physical, data are still virtual -+#endif -+ cmphs rUart,#0x41000000 -+ strhs r0,[r1] //if (pc is in minicache) & (rUart is in virtual memory) then -+ //make sure flash is in read mode, we are almost off the minicache -+ -+#if (PLATFORM_TYPE==NEONB) -+ adr lr,AfterPCPrint -+ add r1,r1,lr //virtual address of AfterPCPrint if in Linux for data fetch -+ cmp lr,#0x800 -+ BigOrr2Eq lr,FLASH_BASE_ADDRESS //if in low part of CS0 flash, try CS1 flash -+ BigMov r0,0xe3a00055 //instruction mov r0,#55 -+ cmp rUart,#0x41000000 -+ movlo r1,lr //use physical address of AfterPCPrint for data fetch -+ ldr r2,[r1] -+ cmp r2,r0 -+ moveq pc,lr //br if CS1 valid -+ b AfterPCPrint_error -+#else -+ b AfterPCPrint1 -+#endif -+ -+// ****************************************************************************************** -+//A MAIN goal is for all the code above this point to fit into the 2k mini instruction cache -+//So that if difficult errors occur and the flash isn't functioning properly, we can -+//at least get the PC printed out before a crash. -+// ****************************************************************************************** -+ -+ -+//IN: r2 - symbol #, z-1 if SYM_FP0 -+//OUT: r1:r0 - value, -+GetSpecialReg: -+ bne 2f -+//MRA{<cond>} <RdLo>,<RdHi>,acc0 -+ mra r0,r1,acc0 -+ mov pc,lr -+ -+ .if STACKS_VALID -+ .else -+//Must keep this aligned at 0x800 if Bal -+ mac_AfterPCPrint 1 -+ .endif -+ -+2: cmp r2,#SYM_FSR -+ CP15_FSR mrceq,r0 -+ cmp r2,#SYM_FAR -+ CP15_FAR mrceq,r0 -+ cmp r2,#SYM_DCSR -+ CP14_DCSR mrceq,r0 -+ cmp r2,#SYM_TTBR -+ CP15_TTBR mrceq,r0 -+ cmp r2,#SYM_CTRL -+ CP15_CONTROL mrceq,r0 -+ mov r1,#0 -+ mov pc,lr -+ -+//out: c-1 means hex char, r0 - character read, r1 - 0:15 if r0 is a hex character -+ReadHex: -+1: ldr r0,[rUart,#UART_LSR] -+ ands r0,r0,#0x1 -+ ldrne r0,[rUart,#UART_RBR] -+ beq 1b //br on timeout -+ rsbs r1,r0,#L1(9) //reverse subtract -+ subcss r1,r0,#L1(0) -+ movcs pc,lr -+ -+ rsbs r1,r0,#L1(f) //reverse subtract -+ subcss r1,r0,#L1(a) -+ addcs r1,r1,#10 -+ -+ movcs pc,lr -+ -+ rsbs r1,r0,#L1(F) //reverse subtract -+ subcss r1,r0,#L1(A) -+ addcs r1,r1,#10 -+ mov pc,lr -+ -+ .if STACKS_VALID -+//Must keep this aligned at 0x800 if Bal -+ mac_AfterPCPrint 0 -+ .endif -+ -+ -+//r2:r1:r0 value to print, r9 - chksum -+PrintHexEndian12: -+ .if 1 -+ orr r3,r0,r1 -+ orrs r3,r3,r2 -+ bne 1f -+ mov r3,lr -+ mov r0,#L1(0) -+ bl TransmitChkSum -+ mov r0,#L1(ASTERISK) -+ bl TransmitChkSum -+ mov r0,#29+24-1 -+ mov lr,r3 -+ b TransmitChkSum -+ .endif -+1: -+#if LITTLE_ENDIAN -+ mov r7,lr -+ mov r5,r1 -+ mov r6,r2 -+ bl PrintHexEndian //r0 -+ mov r0,r5 -+ bl PrintHexEndian //r1 -+ mov r0,r6 -+ mov lr,r7 -+ b PrintHexEndian //r2 -+ -+#else -+ mov r7,lr -+ mov r5,r0 -+ mov r6,r1 -+ mov r0,r2 -+ bl PrintHexEndian //r2 -+ mov r0,r6 -+ bl PrintHexEndian //r1 -+ mov r0,r5 -+ mov lr,r7 -+ b PrintHexEndian //r0 -+#endif -+ -+ -+MainInitializationCode: -+ cmp pc,#MEM_START -+ biclo sp,pc,#FLASH_BASE_ADDRESS -+ rsblos sp,sp,#0x4000 -+ movlo r1,#0 -+ blo InitializeCont2 //br if not ram and not from reset vector -+ -+//pc - 0-0x4000, 0x04000000-0x04004000, 0xa000000-0xffffffff -+ InitCS0_CS1 r0,sp -+ InitGPIO r0,sp -+ -+#if (PLATFORM_TYPE==NEONB) -+ adr lr,AfterPCPrint -+ cmp lr,#0x800 -+ bne InitializeCont1 -+ BigOrr2 lr,FLASH_BASE_ADDRESS //if in low part of CS0 flash, try CS1 flash -+ BigMov r0,0xe3a00055 //instruction mov r0,#55 -+ ldr r2,[lr] -+ cmp r2,r0 -+ addeq pc,lr,#InitializeCont-AfterPCPrint //br if CS1 valid -+#endif -+ b InitializeCont1 -+ -+//OUT: r0,r2 value, r7 trashed -+ReadHexEndian: -+ mov r3,lr -+ ReadHexE r2,r7 -+ mov r0,r2 -+ mov pc,r3 -+ -+ -+//OUT: r2:r1:r0 value -+ReadHexEndian12: -+ mov r3,lr -+ -+#if LITTLE_ENDIAN -+ ReadHexE r4,r7 -+ ReadHexE r5,r7 -+ ReadHexE r2,r7 -+ mov r0,r4 -+ mov r1,r5 -+#else -+ ReadHexE r2,r7 -+ ReadHexE r5,r7 -+ ReadHexE r4,r7 -+ mov r0,r4 -+ mov r1,r5 -+#endif -+ mov pc,r3 -+ -+ -+ -+ReadGDB: -+ mov r8,#0 -+ mov r9,#0 -+ mov rGdbNum3,#0 -+ mov rGdbChkSum,#0 -+1: bl Receive -+ beq 1b //br on timeout -+ cmp r0,#L1(G) -+ beq gdb_G -+// cmp r0,#L1(q) -+// beq gdb_q -+ mov rGdbCmd,r0 //r5 - command being requested -+ add rGdbChkSum,rGdbChkSum,r0 //update checksum -+ bl GetNumber -+ mov r6,r2 -+ mov r7,r0 -+ cmp r0,#L1(POUND) -+ beq 2f -+ cmp rGdbCmd,#L1(P) -+ beq gdb_P -+// cmp r0,#L1(COMMA) -+// cmpne r0,#L1(SEMICOLON) -+// cmpne r0,#L1(COLON) -+// cmpne r0,#L1(EQUAL) -+ bl GetNumber -+ mov r8,r2 -+ mov r9,r0 -+ cmp r0,#L1(POUND) -+ beq 2f -+ cmp rGdbCmd,#L1(M) -+ beq gdb_M -+ cmp rGdbCmd,#L1(X) -+ beq gdb_X -+ -+ bl GetNumber -+ mov rGdbNum3,r2 -+ cmp r0,#L1(POUND) -+ bne WaitForPound -+ -+//# found, check chksum -+2: bl ReadChksum -+ and rGdbChkSum,rGdbChkSum,#0xff -+ cmp rGdbChkSum,r2 -+ bne CheckSumError -+ mov r0,#L1(PLUS) -+ bl Transmit -+ -+ cmp rGdbCmd,#L1(g) -+ beq gdb_g -+ cmp rGdbCmd,#L1(p) -+ beq gdb_p -+ cmp rGdbCmd,#L1(m) -+ beq gdb_m -+ cmp rGdbCmd,#L1(c) -+ beq gdb_c -+ cmp rGdbCmd,#L1(C) -+ beq gdb_C -+ cmp rGdbCmd,#L1(s) -+ beq gdb_s -+ cmp rGdbCmd,#L1(S) -+ beq gdb_S -+ cmp rGdbCmd,#L1(z) -+ beq gdb_z -+ cmp rGdbCmd,#L1(Z) -+ beq gdb_Z -+ cmp rGdbCmd,#L1(t) -+ beq gdb_t -+ cmp rGdbCmd,#L1(QUESTION_MARK) -+ beq gdb_lastSignal -+ cmp rGdbCmd,#L1(D) -+ beq gdb_D -+//this is an unimplemented command -+UnImplemented: -+ BigMov r0,L4(DOLLAR,POUND,0,0) -+ bl Transmit1 -+ b WaitForDollarSign -+ -+ -+SendError01: -+ mov r9,#0 //chksum -+ mov r0,#L1(DOLLAR) -+ bl Transmit -+ mov r0,#L1(E) -+ bl TransmitChkSum -+ mov r0,#L1(0) -+ bl TransmitChkSum -+ mov r0,#L1(1) -+ bl TransmitChkSum -+ sub r5,pc,#.+8-SendError01 -+ b FinishPacket -+ -+ -+SendOK: -+ mov r9,#0 //chksum -+ mov r0,#L1(DOLLAR) -+ bl Transmit -+ mov r0,#L1(O) -+ bl TransmitChkSum -+ mov r0,#L1(K) -+ bl TransmitChkSum -+ sub r5,pc,#.+8-SendOK -+ b FinishPacket -+ -+CheckSumError: -+ mov r0,#L1(MINUS) -+ bl Transmit -+WaitForDollarSign: -+11: bl GetNumber //$ will branch to ReadGDB -+ b 11b -+WaitForPound: -+11: bl GetNumber -+ cmp r0,#L1(POUND) -+ bne 11b -+ bl ReadChksum -+ and rGdbChkSum,rGdbChkSum,#0xff -+ cmp rGdbChkSum,r2 -+ bne CheckSumError -+ mov r0,#L1(PLUS) -+ bl Transmit -+ b UnImplemented -+ -+ -+ -+FinishPacket: -+ mov r0,#L1(POUND) -+ bl Transmit -+ and r0,r9,#0xff -+ bl PrintHexByte -+10: mov r2,#5 -+11: bl ReadHex -+ cmp r0,#L1(DOLLAR) -+ beq ReadGDB -+ cmp r0,#L1(PLUS) -+ beq WaitForDollarSign -+ cmp r0,#L1(MINUS) -+ -+ -+ moveq pc,r5 //retransmit packet -+ cmp r0,#GDB_EXIT_CHAR -+ bne 10b -+ subs r2,r2,#1 -+ beq Prompt -+ b 11b -+ -+ .if 0 -+gdb_q: -+ mov r2,#0 -+ mov r3,#0 -+1: bl ReadHex -+ cmp r0,#L1(DOLLAR) -+ beq ReadGDB -+ cmp r0,#GDB_EXIT_CHAR -+ beq Prompt -+ cmp r0,#L1(POUND) -+ beq 2f -+ add rGdbChkSum,rGdbChkSum,r0 //update checksum -+ mov r1,r2,LSR #24 -+ orr r3,r1,r3,LSL #8 -+ orr r2,r0,r2,LSL #8 -+ b 1b -+2: -+ bl ReadChksum -+ and rGdbChkSum,rGdbChkSum,#0xff -+ cmp rGdbChkSum,r2 -+ bne CheckSumError -+ mov r0,#L1(PLUS) -+ bl Transmit -+ b UnImplemented -+ .endif -+ -+ -+//Detach command - gdb is exiting -+gdb_D: -+//clear break/watch points -+ b Prompt -+ -+//r6 - addr, r8 - PP, rGdbNum3 - mm -+gdb_t: -+ b UnImplemented -+ -+ -+//read general registers -+gdb_g: -+ mov r9,#0 //chksum -+ mov r0,#L1(DOLLAR) -+ bl Transmit -+ mov r8,#0 -+1: mov r2,r8 -+ bl GetRegVal -+ bl PrintHexEndian -+ add r8,r8,#1 -+ cmp r8,#SYM_PC+1 -+ bne 1b -+ -+ mov r2,#SYM_FP0 -+ bl GetRegVal -+ mov r8,#0 -+2: mov r2,#0 -+ bl PrintHexEndian12 //fp0-7 -+ mov r0,#0 -+ mov r1,#0 -+ add r8,r8,#1 -+ cmp r8,#8 -+ bne 2b -+ -+ bl PrintHexEndian //fps -+ -+ mov r2,#SYM_CPSR -+ bl GetRegVal -+ bl PrintHexEndian //cpsr -+ -+ sub r5,pc,#.+8-gdb_g -+ b FinishPacket -+ -+ -+//Read general register -+//r6 - reg # -+gdb_p: -+ mov r9,#0 //chksum -+ mov r0,#L1(DOLLAR) -+ bl Transmit -+ mov r2,r6 -+ cmp r6,#SYM_PC+1 -+ bcs 2f -+ -+1: bl GetRegVal -+3: bl PrintHexEndian -+4: sub r5,pc,#.+8-gdb_p -+ b FinishPacket -+2: cmp r6,#25 -+ mov r2,#SYM_CPSR -+ beq 1b -+ cmp r6,#24 //fps -+ mov r0,#0 -+ beq 3b -+ cmp r6,#16 //fp0 -+ mov r0,#0 -+ mov r1,#0 -+ mov r2,#SYM_FP0 -+ mov rGdbNum3,r6 -+ bleq GetRegVal -+ mov r2,#0 -+ bl PrintHexEndian12 //fp0-7 -+ mov r6,rGdbNum3 -+ b 4b -+ -+//read memory -+//r6 - addr, r8 - length -+gdb_m: -+ mov r9,#0 //chksum -+ mov r0,#L1(DOLLAR) -+ bl Transmit -+ mov r5,r6 -+ movs r7,r8 -+ beq 4f -+1: -+ tst r5,#3 -+ bne 3f -+ cmp r7,#4 -+ bcc 3f -+ ldr r0,[r5],#4 -+ bl PrintHexEndian -+ subs r7,r7,#4 -+ bne 1b -+ b 4f -+ -+3: ldrb r0,[r5],#1 -+ bl PrintHexByteEndian -+ subs r7,r7,#1 -+ bne 1b -+4: sub r5,pc,#.+8-gdb_m -+ b FinishPacket -+ -+ -+//continue -+//r6 - address, 0- current PC -+gdb_c: -+ mov r8,r6 -+//r8 - address, 0- current PC -+gdb_C: -+ movs rNum1,r8 -+ movne rValidCnt,#F_NUM1_MASK -+ moveq rValidCnt,#0 -+ tst rNum1,#3 -+ bne SendError01 -+ mov r4,#1 -+ b Go_Cmd1 -+ -+//step -+//r6 - address, 0- current PC -+gdb_s: -+ mov r8,r6 -+//r8 - address, 0- current PC -+gdb_S: -+ movs rNum1,r8 -+ movne rValidCnt,#F_NUM1_MASK -+ moveq rValidCnt,#0 -+ tst rNum1,#3 -+ bne SendError01 -+ mov r4,#1 -+ b Trace_Cmd1 -+ -+ -+ -+//watchpoints/breakpoints - remove -+//r6 - type, r8 - address -+gdb_z: -+ cmp r6,#0 //software breakpoint -+ cmpne r6,#1 //hardware breakpoint -+ bne UnImplemented -+// mov rNum1,r8 //same reg -+ bl BC_Do -+ b SendOK -+ -+ -+ -+//watchpoints/breakpoints - insert -+gdb_Z: -+ cmp r6,#0 //software breakpoint -+ cmpne r6,#1 //hardware breakpoint -+ bne UnImplemented -+// mov rNum1,r8 //same reg -+ bl BS_Do // z-0 if r0==rNum1, breakpoint was already set -+ cmpne r0,rNum1 -+ beq SendOK -+ b SendError01 -+ -+ -+//gdb routines below have not done checksum yet -+//write general registers -+gdb_G: -+ mov r8,#0 -+1: bl ReadHexEndian -+ mov r2,r8 -+ mov r1,#0 -+ bl StoreRegVal //r2 - symbol #, r1:r0 - value -+ add r8,r8,#1 -+ cmp r8,#SYM_PC+1 -+ bne 1b -+ -+ bl ReadHexEndian12 -+ mov r2,#SYM_FP0 -+ bl StoreRegVal //r2 - symbol #, r1:r0 - value -+ -+ mov r8,#1 -+2: bl ReadHexEndian12 -+ add r8,r8,#1 -+ cmp r8,#8 -+ bne 2b -+ -+ bl ReadHexEndian //fps -+ bl ReadHexEndian //cpsr -+ -+ mov r2,#SYM_CPSR -+ bl StoreRegVal //r2 - symbol #, r1:r0 - value -+FinishWritePacket: -+ bl FinishWriteP -+ b SendOK -+FinishWriteP: -+ mov r4,lr -+ bl ReadHex -+ cmp r0,#L1(POUND) -+ bne CheckSumError -+ bl ReadChksum -+ and rGdbChkSum,rGdbChkSum,#0xff -+ cmp rGdbChkSum,r2 -+ bne CheckSumError -+ mov r0,#L1(PLUS) -+ bl Transmit -+ mov pc,r4 -+ -+ -+ -+ -+//write general register -+//r6 - reg# -+gdb_P: -+ mov r8,r6 -+ cmp r6,#SYM_PC+1 -+ bcs 2f -+1: -+ bl ReadHexEndian -+4: mov r6,r0 -+ mov r7,r1 -+ bl FinishWriteP -+ mov r0,r6 -+ mov r1,r7 -+ mov r2,r8 -+ bl StoreRegVal //r2 - symbol #, r1:r0 - value -+ b SendOK -+ -+3: bl ReadHexEndian -+ b FinishWritePacket -+ -+2: cmp r6,#25 -+ mov r8,#SYM_CPSR -+ beq 1b -+ cmp r6,#24 //fps -+ beq 3b -+ bl ReadHexEndian12 -+ cmp r6,#16 //fp0 -+ bne FinishWritePacket -+ mov r8,#SYM_FP0 -+ b 4b -+ -+ -+//write memory -+//r6 - addr, r8 - length -+gdb_M: -+ movs r8,r8 -+ beq FinishWritePacket -+ -+1: tst r6,#3 -+ beq 3f -+2: bl ReadHexByteEndian -+ strb r2,[r6],#1 -+ subs r8,r8,#1 -+ bne 1b -+ b FinishWritePacket -+3: cmp r8,#4 -+ bcc 2b -+ bl ReadHexEndian -+ str r2,[r6],#4 -+ subs r8,r8,#4 -+ bne 3b -+ b FinishWritePacket -+ -+ -+//write memory binary with 0x7d, "$","#", escaped with 0x7d -+//r6 - addr, r8 - length -+gdb_X: -+ movs r8,r8 -+ beq FinishWritePacket -+ -+1: tst r6,#3 -+ beq 3f -+2: bl ReadByteEndian -+ strb r0,[r6],#1 -+ subs r8,r8,#1 -+ bne 1b -+ b FinishWritePacket -+3: cmp r8,#4 -+ bcc 2b -+ bl ReadEndian -+ str r0,[r6],#4 -+ subs r8,r8,#4 -+ bne 3b -+ b FinishWritePacket -+ -+ -+ -+ReadEndian: -+ mov r4,lr -+ mov r5,#4 -+1: bl ReadByteEndian -+ -+#if LITTLE_ENDIAN -+ mov r0,r0,LSL #24 -+ orr r2,r0,r2,LSR #8 -+#else -+ orr r2,r0,r2,LSL #8 -+#endif -+ -+ subs r5,r5,#1 -+ bne 1b -+ mov r0,r2 -+ mov pc,r4 -+ -+ -+ReadByteEndian: -+ mov r3,lr -+ bl ReadHex -+ add rGdbChkSum,rGdbChkSum,r0 //update checksum -+ cmp r0,#0x7d -+ beq 1f -+ cmp r0,#L1(DOLLAR) -+ cmpne r0,#L1(POUND) -+ beq CheckSumError -+ mov pc,r3 -+1: -+ bl ReadHex -+ add rGdbChkSum,rGdbChkSum,r0 //update checksum -+ mov pc,r3 -+ -+ -+ReadHexByteEndian: -+ mov r3,lr -+ bl ReadHex -+ bcc CheckSumError -+ add rGdbChkSum,rGdbChkSum,r0 //update checksum -+ mov r2,r1 -+ bl ReadHex -+ bcc CheckSumError -+ add rGdbChkSum,rGdbChkSum,r0 //update checksum -+ add r2,r1,r2,LSL #4 -+ mov pc,r3 -+ -+//OUT: r2 - checksum -+ReadChksum: -+ mov r3,lr -+ bl ReadHex -+ movcs r2,r1 -+ blcs ReadHex -+ addcs r2,r1,r2,LSL #4 -+ mvncc r2,#0 -+ mov pc,r3 -+ -+//out: r0 exit character, r2 - number, rGdbChkSum - updated -+GetNumber: -+ mov r2,#0 -+ mov r3,lr -+1: bl ReadHex -+ bcc 3f -+ add rGdbChkSum,rGdbChkSum,r0 //update checksum -+2: tst r2,#0xf0000000 -+ movne pc,r3 //return on number overflow -+ add r2,r1,r2,LSL #4 -+ b 1b -+3: cmp r0,#L1(DOLLAR) -+ beq ReadGDB -+ cmp r0,#GDB_EXIT_CHAR -+ beq Prompt -+ cmp r0,#L1(POUND) -+ addne rGdbChkSum,rGdbChkSum,r0 //update checksum -+ mov pc,r3 -+ -+// ***************************************************************** -+#if (PLATFORM_TYPE==NEONB) -+AfterPCPrint_error: -+ bl TransmitCRLF -+ BigMov r0,L4(F,l,a,s) -+ bl Transmit1 -+ BigMov r0,L4(h,SPACE,i,s) -+ bl Transmit1 -+ BigMov r0,L4(SPACE,i,n,v) -+ bl Transmit1 -+ BigMov r0,L4(a,l,i,d) -+ bl Transmit1 -+ bl TransmitCRLF -+#endif -+AfterPCPrint1: -+ mov rPrevNum1,#MEM_START -+ movs rNum1,rNum1 -+ tsteq r6,#7 //make sure it's a SIG_RESET, or SIG_DBG_RESET, and timeout -+ bne 1f -+ BigBic r0,pc,FLASH_BASE_ADDRESS -+ cmp r0,#0x4000 -+ blo Gl_Cmd //auto start program if running in flash -+1: -+ b R_Cmd -+// b Prompt2 -+ -+ -+Invalid: -+ bl TransmitCRLF -+ BigMov r0,L4(i,n,v,a) -+ bl Transmit1 -+ BigMov r0,L3(l,i,d) -+ bl Transmit1 -+ b Prompt -+Prompt1: -+ mov rPrevNum1,#MEM_START -+Prompt: -+1: bl TransmitCRLF -+Prompt2: -+ mov r0,#L1(PERIOD) -+ bl Transmit -+ bl TransmitSPACE -+ mov rFieldStart,#1 -+ bl ReadCommand -+ -+ mov r2,r0 //save exit character -+ cmp r0,#0x0d -+ blne Transmit -+ bl TransmitCRLF -+ -+ cmp rCommand,#0 -+ bne 2f -+ cmp r2,#0x0d -+ beq 1b -+ cmp r2,#L1(PLUS) -+ addeq rPrevNum1,rPrevNum1,#4 -+ beq Examine_Cmd -+ cmp r2,#L1(MINUS) -+ subeq rPrevNum1,rPrevNum1,#4 -+ beq Examine_Cmd -+ b 1b -+ -+2: tst rSymbol,#F_NUM1_MASK -+ mov r0,rNum1 -+ blne GetSymbolNumber -+ bne Invalid -+ mov rNum1,r0 -+ -+ tst rSymbol,#F_NUM2_MASK -+ mov r0,rNum2 -+ blne GetSymbolNumber -+ bne Invalid -+ mov rNum2,r0 -+ -+ cmp rCommand,#L1(E) -+ beq Examine_Cmd -+ cmp rCommand,#L1(D) -+ beq Deposit_Cmd -+ cmp rCommand,#L1(G) -+ beq Go_Cmd -+ cmp rCommand,#L1(R) -+ beq R_Cmd -+ cmp rCommand,#L1(T) -+ beq Trace_Cmd -+ BigMov r0,C2(D,L) -+ cmp rCommand,r0 -+ beq Download_Cmd -+ cmp rCommand,#L1(QUESTION_MARK) -+ beq Help_Cmd -+ -+ mov r0,r0,LSL #8 -+ orr r0,r0,#L1(W) -+ cmp rCommand,r0 -+ beq Download_Wireless_Cmd -+ -+ BigMov r0,C4(S,S,I,D) -+ cmp rCommand,r0 -+ beq SSID_Cmd -+ -+ BigMov r0,C3(M,A,C) -+ cmp rCommand,r0 -+ beq MAC_Cmd -+ -+ BigMov r0,C4(B,U,R,N) -+ cmp rCommand,r0 -+ beq Burn_Cmd -+ -+ BigMov r0,C2(B,B) -+ cmp rCommand,r0 -+ beq Burn2_Cmd -+ -+ BigMov r0,C4(B,A,L,L) //Burn all of flash, erase end. -+ cmp rCommand,r0 -+ beq BurnAll_Cmd -+ -+ cmp rCommand,#L1(V) -+ beq Verify_Cmd -+ -+ BigMov r0,C2(V,V) -+ cmp rCommand,r0 -+ beq Verify2_Cmd -+ -+ BigMov r0,C2(G,L) -+ cmp rCommand,r0 -+ beq Gl_Cmd //go linux!! -+ -+ BigEor2 r0,C2(G,L)^C2(G,G) -+ cmp rCommand,r0 -+ beq GG_Cmd //go without cache invalidate -+ -+ BigMov r0,C2(T,T) -+ cmp rCommand,r0 -+ beq TT_Cmd //Trace without cache invalidate -+ -+ BigMov r0,C2(B,S) -+ cmp rCommand,r0 -+ beq BS_Cmd -+ -+ BigEor2 r0,C2(B,S)^C2(B,E) -+ cmp rCommand,r0 -+ beq BE_Cmd -+ -+ BigEor2 r0,C2(B,E)^C2(B,C) -+ cmp rCommand,r0 -+ beq BC_Cmd -+ -+ BigEor2 r0,C2(B,C)^C2(W,C) -+ cmp rCommand,r0 -+ beq WC_Cmd -+ -+ BigEor2 r0,C2(W,C)^C2(W,W) -+ cmp rCommand,r0 -+ beq WW_Cmd -+ -+ BigEor2 r0,C2(W,W)^C2(W,R) -+ cmp rCommand,r0 -+ beq WR_Cmd -+ -+ mov r0,r0,LSL #8 -+ orr r0,r0,#L1(W) -+ cmp rCommand,r0 -+ beq WRW_Cmd -+ -+ BigMov r0,C3(M,M,U) -+ cmp rCommand,r0 -+ beq MMU_Cmd -+// mov r0,rCommand -+// bl PrintHex -+ b Invalid -+ -+//IN: rFieldStart - starting field (this is a blank counting field) -+//OUT: -+ReadCommand: -+ mov r3,lr -+ mov rSymbol,#0 -+ mov rField,rFieldStart -+ mov rValidCnt,#0 //low nibble: # of blanks before command -+ //next: # of chars in command -+ //next: # of blanks -+ //next: # of hex digits in num1 -+ //next: # of blanks -+ //next: # of hex digits in num2 -+ mov rCommand,#0 //command -+ mov rNum1,#0 //1st number -+ mov rNum2,#0 //2nd number -+ -+1: bl Receive -+ beq 1b //br on timeout -+ cmp r0,#L1(DOLLAR) -+ beq ReadGDB -+ cmp r0,#L1(PLUS) -+ cmpne r0,#L1(MINUS) -+ cmpne r0,#L1(AT_SIGN) -+ cmpeq rValidCnt,#0 -+ cmpne r0,#0x0d -+ moveq pc,r3 //return on -,+, 1st on line or <cr> -+ -+ cmp r0,#L1(SPACE) -+ bne 2f -+ bl Transmit -+ tst rValidCnt,#0x80000000 -+ eorne rValidCnt,rValidCnt,#0x80000000 //clear bit 31 to mark as blank field -+ movne rField,rField,LSL #F_INC -+//now we are in a counting blanks field -+ rsb r2,rField,rField,LSL #F_INC //get a field mask -+ and r1,rValidCnt,r2 -+ cmp r1,r2 -+ beq Invalid //br if field is full -+ add rValidCnt,rValidCnt,rField -+ b 1b -+2: -+ cmp r0,#0x08 //Backspace -+ cmpne r0,#0x7f //del or Backspace -+ bne 4f -+ cmp rValidCnt,#0 -+ beq 1b //br if nothing to remove -+ BigMov r0,L3(BACKSPACE,SPACE,BACKSPACE) -+ bl Transmit1 -+ sub rValidCnt,rValidCnt,rField -+ mov r0,#4 -+ tst rSymbol,rField -+ movne r0,#8 -+ cmp rField,#F_COMMAND -+ moveq rCommand,rCommand,LSR #8 -+ cmp rField,#F_NUM1 -+ moveq rNum1,rNum1,LSR r0 -+ cmp rField,#F_NUM2 -+ moveq rNum2,rNum2,LSR r0 -+ -+3: rsb r0,rField,rField,LSL #F_INC //get a field mask -+ tst rValidCnt,r0 -+ bne 1b //br if still more in this field -+ bic rSymbol,rSymbol,rField -+ cmp rField,rFieldStart -+ beq 1b -+//move back to lower field -+ mov rField,rField,LSR #F_INC -+ eors rValidCnt,rValidCnt,#0x80000000 -+ b 3b -+ -+4: bl Transmit -+ tst rValidCnt,#0x80000000 -+ orreq rValidCnt,rValidCnt,#0x80000000 //set bit 31 to mark as data field -+ moveq rField,rField,LSL #F_INC -+ cmp rField,#F_UNDEF -+ beq Invalid -+//now we are in a data field -+ rsbs r1,rField,#F_COMMAND -+ rsbges r1,r0,#L1(9) //reverse subtract -+ subges r1,r0,#L1(0) -+ movge rField,rField,LSL #F_INC+F_INC //advance to number field if in range "0"-"9" -+ -+ rsb r2,rField,rField,LSL #F_INC //get a field mask -+ and r1,rValidCnt,r2 -+ cmp r1,r2 -+ beq Invalid //field is full -+ add rValidCnt,rValidCnt,rField -+ -+ rsbs r1,r0,#L1(z) //reverse subtract -+ subges r1,r0,#L1(a) -+ andge r0,r0,#0xdf //convert to uppercase if was "a"-"z" -+ cmp rField,#F_COMMAND -+ bne 6f -+ tst rCommand,#0xff000000 -+ bne Invalid -+ add rCommand,r0,rCommand,LSL #8 -+ b 1b -+ -+6: tst rSymbol,rField -+ bne 15f -+ rsbs r1,r0,#L1(9) //reverse subtract -+ subges r1,r0,#L1(0) -+ bge 5f -+ rsbs r1,r0,#L1(F) //reverse subtract -+ subges r1,r0,#L1(A) -+ add r1,r1,#10 -+ bge 5f -+ orr rSymbol,rSymbol,rField -+//now if number started with "A"-"F", convert back to ascii -+ -+ cmp rField,#F_NUM1 -+ mov r1,rValidCnt,LSR #F_NUM1_BIT //# of nibbles +1 in rNum -+ movne r1,rValidCnt,LSR #F_NUM2_BIT -+ and r1,r1,#((1<<F_INC)-1) -+ -+ subs r1,r1,#1 //# of nibbles in rNum -+ beq 15f -+ -+ -+ -+ cmp r1,#3 -+ bcs Invalid //br if too many leading hex characters -+ mov r1,r1,LSL #2 //# of bits valid in rNum -+ cmp rField,#F_NUM1 -+ rsb lr,r1,#24 -+ moveq r2,rNum1,ROR r1 -+ movne r2,rNum2,ROR r1 -+ orr r2,r2,r0,LSL lr //save r0 character -+ -+ mov lr,#0 -+26: mov r0,r2,LSR #28 -+ cmp r0,#10 -+ addcs r0,r0,#L1(A)-10 -+ addcc r0,r0,#L1(0) -+ orr lr,r0,lr,LSL #8 -+ mov r2,r2,LSL #4 -+ subs r1,r1,#4 -+ bne 26b -+ -+ cmp rField,#F_NUM1 -+ mov r0,r2,LSR #24 //restore r0 -+ moveq rNum1,lr -+ movne rNum2,lr -+ b 15f -+ -+5: -+ cmp rField,#F_NUM1 -+ bne 7f -+ tst rNum1,#0xf0000000 -+ bne Invalid -+ add rNum1,r1,rNum1,LSL #4 -+ b 1b -+7: tst rNum2,#0xf0000000 -+ bne Invalid -+ add rNum2,r1,rNum2,LSL #4 -+ b 1b -+ -+15: -+ cmp rField,#F_NUM1 -+ bne 17f -+ tst rNum1,#0xff000000 -+ bne Invalid -+ add rNum1,r0,rNum1,LSL #8 -+ b 1b -+17: tst rNum2,#0xff000000 -+ bne Invalid -+ add rNum2,r0,rNum2,LSL #8 -+ b 1b -+ -+//rNum1 - 0 off, 1 on -+MMU_Cmd: -+ bl cache_clean_invalidate_all -+ tst rNum1,#1 -+//now enable/disable MMU, Data Cache -+ CP15_CONTROL mrc,r1 //get the control register -+ biceq r1,r1,#0x5 -+ orrne r1,r1,#0x5 -+ CP15_CONTROL mcr,r1 //set the control register -+ CPWAIT r0 -+ BigMov rUart,UART_BASE //this is right if MMU is off -+ blne GetUartAddress //if mmu is on -+ b Prompt -+ -+// ******************************************************************** -+// ******************************************************************** -+// ******************************************************************** -+// r3 - -1 : Trace, 0 : Go -+// r4 - 0 : normal, 1 : mark gdb mode -+// rNum2 - 0 : invalidate cache, 1 : don't invalidate cache -+//go without cache invalidate -+GG_Cmd: -+ mov r4,#0 -+ mov r3,#0 -+ mov rNum2,#1 -+ b Go2 -+Go_Cmd: -+ mov r4,#0 -+Go_Cmd1: -+ mov r3,#0 -+Go1: -+ bl cache_clean_invalidate_all -+ .if 0 -+ mov rNum2,#0 -+ .else -+ mov rNum2,#1 -+ .endif -+Go2: -+ -+ ldrb r2,[rDBG,#DBG_Mode] -+ and r2,r2,#0xfe -+ orr r2,r2,r4 -+ strb r2,[rDBG,#DBG_Mode] //mark gdb mode -+ -+ tst rValidCnt,#F_NUM1_MASK -+ strne rNum1,[rDBG,#DBG_PC] //return pc -+ ldreq rNum1,[rDBG,#DBG_PC] //return pc -+ orr r0,rNum1,#1 -+ CP15_IBCR0 mrc,rBCR0 -+ CP15_IBCR1 mrc,rBCR1 -+ cmp r0,rBCR0 -+ ldr r7,[rDBG,#DBG_CPSR] -+ mov r2,rBCR0 //save temporary -+ moveq rBCR0,#0 -+ cmp r0,rBCR1 -+ moveq rBCR1,#0 -+ -+ cmpne r0,r2 -+ streq r0,[rDBG,#DBG_TRACE] //this is the current instruction breakpoint value -+ beq 4f //br if a bkpt matches current instruction -+ cmp r3,#0 -+ str r3,[rDBG,#DBG_TRACE] //-1 : Trace, 0 : Go -+ beq 6f -+ -+ -+4: bl CalcNextPc //IN: rNum1: current PC, r7- cpsr; OUT: rNum1: next PC -+ tst r0,#1 -+ bne Invalid -+ orr r1,r0,#1 -+ -+ tst rBCR0,#1 -+ moveq rBCR0,r1 -+ beq 5f -+ tst rBCR1,#1 -+ moveq rBCR1,r1 -+ strne rBCR0,[rDBG,#DBG_TRACE] //need to steal this breakpoint momentarily -+ movne rBCR0,r1 -+5: -+ CP15_IBCR0 mcr,rBCR0 -+ CP15_IBCR1 mcr,rBCR1 -+ -+6: -+ ldrb r0,[rDBG,#DBG_FFUART_LCR] -+ str r0,[rUart,#UART_LCR] //restore value -+ add r0,rDBG,#DBG_R2 -+ -+ bl ClearStickyAbort -+ BigMov r1,UART_BASE //physical address -+ movs rNum2,rNum2,LSR #1 //carry flag 1 : don't invalidate cache -+ teq r1,rUart //this lets me know if identity mapping is used, or MMU is off, C & V are not affected by instruction -+ -+ ldmia r0,{r2,r3,r4,r5,r6,r7,r8,r9,sl,fp,ip,sp,lr} -+//z-0 return indirect, setup stack to contain real return address -+ ldrne r1,[r0,#DBG_PC-DBG_R2] -+ strne r1,[sp,#-4]! -+ -+ ldr r1,[r0,#DBG_HCPSR-DBG_R2] -+ orr r1,r1,#0xc0 //set I, F -+ msr cpsr_c,r1 -+// ldr r1,[r0,#DBG_CPSR-DBG_R2] //don't allow changing return mode for now... to messy -+// msr spsr,r1 -+ CP15_CF_DRAIN mcr,r1 //make sure data cache write buffers are drained -+ b InvalidateAndReturn //z-1 return direct, z-0 return indirect -+ -+ -+ -+ClearStickyAbort: -+ CP14_DCSR mrc,r1 -+ tst r1,#1<<5 -+ bic r1,r1,#1<<5 //clear sticky abort bit -+ CP14_DCSR mcrne,r1 -+ mov pc,lr -+TT_Cmd: -+ mov r4,#0 -+ mvn r3,#0 -+ mov rNum2,#1 -+ b Go2 -+ -+Trace_Cmd: -+ mov r4,#0 -+Trace_Cmd1: -+ mvn r3,#0 -+ b Go1 -+ -+ -+//IN: rNum1: current PC, r7- cpsr -+//OUT: r0: next PC -+//trashed: r1,r2,r3,r4,r6 -+CalcNextPc: -+ mov r4,lr -+ bl ClearStickyAbort -+ ldr r2,[rNum1] -+ add r0,rNum1,#4 -+ nop //let abort have time to signal -+ bl ClearStickyAbort -+ movne pc,r4 -+//1st check to see if condition codes allow instruction to execute -+1: -+ mov r3,r2,LSR #28 -+ msr CPSR_f,r7 -+ add pc,pc,r3,LSL #3 -+ nop -+ beq 2f //0-eq -+ mov pc,r4 -+ bne 2f //1-ne -+ mov pc,r4 -+ bcs 2f //2-cs -+ mov pc,r4 -+ bcc 2f //3-cc -+ mov pc,r4 -+ bmi 2f //4-mi -+ mov pc,r4 -+ bpl 2f //5-pl -+ mov pc,r4 -+ bvs 2f //6-vs -+ mov pc,r4 -+ bvc 2f //7-vc -+ mov pc,r4 -+ bhi 2f //8-hi -+ mov pc,r4 -+ bls 2f //9-ls -+ mov pc,r4 -+ bge 2f //a-ge -+ mov pc,r4 -+ blt 2f //b-lt -+ mov pc,r4 -+ bgt 2f //c-gt -+ mov pc,r4 -+ ble 2f //d-le -+ mov pc,r4 -+ b 2f //e-al -+ mov pc,r4 //just a spacer instruction, never executed -+ //f-nv -+ -+ and r3,r2,#0xfe000000 -+ cmp r3,#0xfa000000 -+ movne pc,r4 -+//BLX instruction changing into thumb mode -+ movs r3,r2,LSL #8 //mov H bit to carry flag -+ orrcs r3,r3,#1<<7 -+ add r0,r0,#4 -+ add r0,r0,r3,ASR #6 -+ mov pc,r4 -+ -+ -+//instruction WILL execute -+2: -+ mov r3,r2,LSR #25 -+ and r3,r3,#0x7 -+ and r1,r2,#0x0000f000 -+ cmp r1, #0x0000f000 -+ mov r1,r2,LSL #20 -+ mov r1,r1,LSR #20 //r1 gets low 12 bits of r2 -+ add pc,pc,r3,LSL #2 -+ nop -+ b 10f -+ b 11f -+ b 12f -+ b 13f -+ b 14f -+ b 15f -+ mov pc,r4 //6 -+ mov pc,r4 //7 -+//nnnn 000n -+10: -+ movne pc,r4 -+ and r3,r2,#0x01800000 -+ cmp r3, #0x01000000 -+ bne 51f -+ and r3,r2,#0x0ff00000 -+ cmp r3, #0x01200000 -+ andeq r3,r2,#0x000000d0 -+ cmpeq r3, #0x00000010 -+//B{L} <Rm> instruction -eq -+ andeq r3,r2,#0xf -+#if DBG_R0 -+ addeq r0,rDBG,#DBG_R0 -+ ldreq r0,[r0,r3,LSL #2] -+#else -+ ldreq r0,[rDBG,r3,LSL #2] -+#endif -+ -+ biceq r0,r0,#1 -+ mov pc,r4 -+ -+ -+51: tst r2,#1<<4 -+ bne 52f -+ add r0,r0,#4 //pc+8 -+ bl RegShiftImmed -+ b 50f -+52: -+ tst r2,#1<<7 -+ movne pc,r4 //return if LDR|STR<H|D|B|SB|SH>|MUL|MLA... -+//this is a shift by a register value -+ add r0,r0,#4 //pc+8 -+ bl RegShiftReg -+ b 50f -+ -+//nnnn 001n immediate -+11: -+ movne pc,r4 -+ and r3,r2,#0x01800000 -+ cmp r3, #0x01000000 -+ moveq pc,r4 //return if TST|TEQ|CMP|CMN|MRS|MSR|SMLA..... -+ and r6,r1,#0xff -+ mov r3,r1,LSR #7 -+ BIC r3,r3,#1 -+ mov r1,r6,ROR r3 -+ add r0,r0,#4 //pc+8 -+//r1 has 2nd operand -+50: -+ mov r3,r2,LSR #16 -+ and r3,r3,#0xf -+ cmp r3,#0xf -+ moveq r6,r0 //pc+8 -+#if DBG_R0 -+ addne r6,rDBG,#DBG_R0 -+ ldrne r6,[r6,r3,LSL #2] //<Rn> - r6 -+#else -+ ldrne r6,[rDBG,r3,LSL #2] //<Rn> - r6 -+#endif -+ -+//r6 has 1st operand -+ mov r3,r2,LSR #21 -+ and r3,r3,#0xf -+ msr CPSR_f,r7 -+ add pc,pc,r3,LSL #3 -+ nop -+ and r0,r6,r1 //0-AND -+ mov pc,r4 -+ eor r0,r6,r1 //1-EOR -+ mov pc,r4 -+ sub r0,r6,r1 //2-SUB -+ mov pc,r4 -+ rsb r0,r6,r1 //3-RSB -+ mov pc,r4 -+ add r0,r6,r1 //4-ADD -+ mov pc,r4 -+ adc r0,r6,r1 //5-ADC -+ mov pc,r4 -+ sbc r0,r6,r1 //6-SBC -+ mov pc,r4 -+ rsc r0,r6,r1 //7-RSC -+ mov pc,r4 -+ sub r0,r0,#4 //8-TST, cannot get here -+ mov pc,r4 -+ sub r0,r0,#4 //9-TEQ, cannot get here -+ mov pc,r4 -+ sub r0,r0,#4 //A-CMP, cannot get here -+ mov pc,r4 -+ sub r0,r0,#4 //B-CMN, cannot get here -+ mov pc,r4 -+ orr r0,r6,r1 //C-ORR -+ mov pc,r4 -+ mov r0,r1 //D-MOV -+ mov pc,r4 -+ bic r0,r6,r1 //E-BIC -+ mov pc,r4 -+ mvn r0,r1 //F-MVN -+ mov pc,r4 -+ -+//LDR -+12: -+13: -+ tsteq r2,#1<<22 //B bit 22 1 : Byte, 0: Word -+ movne pc,r4 -+ tst r2,#1<<20 //L bit 20 1 : LDR, 0:STR -+ moveq pc,r4 -+ -+ add r0,r0,#4 //pc+8 -+ tst r2,#1<<24 //P bit -+ moveq r1,#0 -+ beq 34f -+ tst r2,#1<<25 -+ beq 34f //branch if immediate12bits value is in r1 -+ bl RegShiftImmed -+34: -+ mov r3,r2,LSR #16 -+ and r3,r3,#0xf -+ cmp r3,#0xf -+ moveq r6,r0 //pc+8 -+#if DBG_R0 -+ addne r6,rDBG,#DBG_R0 -+ ldrne r6,[r6,r3,LSL #2] //<Rn> - r6 -+#else -+ ldrne r6,[rDBG,r3,LSL #2] //<Rn> - r6 -+#endif -+ -+ tst r2,#1<<23 //U bit Up/Down, Add/Sub -+ addne r6,r6,r1 -+ subeq r6,r6,r1 -+ ldr r0,[r6] -+ mov pc,r4 -+ -+ -+//LDM -+14: -+ and r3,r2,#(1<<15)+(1<<20) -+ cmp r3, #(1<<15)+(1<<20) -+ movne pc,r4 -+ -+//LDM to PC -eq -+ add r0,r0,#4 //pc+8 -+ mov r3,r2,LSR #16 -+ and r3,r3,#0xf -+ cmp r3,#0xf -+ moveq r1,r0 //pc+8, should never execute -+#if DBG_R0 -+ addne r1,rDBG,#DBG_R0 -+ ldrne r1,[r1,r3,LSL #2] //<Rn> - r1 -+#else -+ ldrne r1,[rDBG,r3,LSL #2] //<Rn> - r1 -+#endif -+ -+//r1 is already correct address for downward from base (U==0), included(P==0) -+ tst r2,#1<<23 //U bit -+ beq 4f -+ mov r6,r2,LSL #16 -+3: movs r6,r6,LSL #1 -+ addcs r1,r1,#4 -+ bne 3b -+ eor r2,r2,#1<<24 -+4: tst r2,#1<<24 //P bit -+ subne r1,r1,#4 -+ ldr r0,[r1] -+ mov pc,r4 -+ -+//B{L} instruction -+15: -+ mov r3,r2,LSL #8 -+ add r0,r0,#4 -+ add r0,r0,r3,ASR #6 -+ mov pc,r4 -+ -+//IN: r0 - pc+4, r2 instruction, r1 low 12 bits of instruction -+//OUT: r1 - shifted value, r2 - unchanged, r0 - pc+8 -+RegShiftImmed: -+ mov r1,r1,LSR #7 //Shift_imm - r1 -+ and r3,r2,#0xf -+ cmp r3,#0xf -+ moveq r6,r0 //pc+8 -+#if DBG_R0 -+ addne r6,rDBG,#DBG_R0 -+ ldrne r6,[r6,r3,LSL #2] //<Rm> - r6 -+#else -+ ldrne r6,[rDBG,r3,LSL #2] //<Rm> - r6 -+#endif -+ -+ tst r2,#1<<6 -+ bne 32f -+ tst r2,#1<<5 -+ bne 31f -+ mov r1,r6,LSL r1 //<Rm> shf Shift_imm - r1 -+ mov pc,lr -+ -+31: cmp r1,#0 -+ movne r1,r6,LSR r1 -+ mov pc,lr -+ -+32: tst r2,#1<<5 -+ bne 33f -+ cmp r1,#0 -+ moveq r1,#32 -+ mov r1,r6,ASR r1 -+ mov pc,lr -+ -+33: cmp r1,#0 -+ movne r1,r6,ROR r1 -+ movne pc,lr -+ -+ msr CPSR_f,r7 -+ mov r1,r6, RRX -+ mov pc,lr -+ -+ -+//IN: r2 instruction, r1 low 12 bits of instruction -+//OUT: r1 - shifted value, r2 - unchanged, r0 - pc+8 -+RegShiftReg: -+ mov r3,r1,LSR #8 -+ cmp r3,#0xf -+ moveq r1,r0 //pc+8 -+#if DBG_R0 -+ addne r1,rDBG,#DBG_R0 -+ ldrne r1,[r1,r3,LSL #2] //<Rs> - r1 -+#else -+ ldrne r1,[rDBG,r3,LSL #2] //<Rs> - r1 -+#endif -+ -+ and r3,r2,#0xf -+ cmp r3,#0xf -+ moveq r6,r0 //pc+8 -+#if DBG_R0 -+ addne r6,rDBG,#DBG_R0 -+ ldrne r6,[r6,r3,LSL #2] //<Rm> - r6 -+#else -+ ldrne r6,[rDBG,r3,LSL #2] //<Rm> - r6 -+#endif -+ tst r2,#1<<6 -+ bne 32f -+ tst r2,#1<<5 -+ moveq r1,r6,LSL r1 //<Rm> shf <Rs> - r1 -+ movne r1,r6,LSR r1 -+ mov pc,lr -+ -+32: tst r2,#1<<5 -+ moveq r1,r6,ASR r1 -+ movne r1,r6,ROR r1 -+ mov pc,lr -+ -+ -+ -+//IN: r0 - register name -+//OUT: r0 - location -+GetSymbolNumber: -+ BigMov r1,C2(R,0) -+ sub r2,r0,r1 -+ cmp r2,#10 -+ bcc 1f -+ -+ BigMov r1,C3(R,1,0) -+ sub r2,r0,r1 -+ cmp r2,#6 -+ bcc 2f -+ -+ BigMov r1,C3(F,P,0) -+ cmp r1,r0 -+ moveq r2,#SYM_FP0 -+ beq 1f -+ -+ BigMov r1,C2(S,L) -+ cmp r1,r0 -+ moveq r2,#SYM_SL -+ beq 1f -+ -+ BigMov r1,C2(F,P) -+ cmp r1,r0 -+ moveq r2,#SYM_FP -+ beq 1f -+ -+ BigEor2 r1,C2(F,P)^C2(I,P) -+ cmp r1,r0 -+ moveq r2,#SYM_IP -+ beq 1f -+ -+ BigEor2 r1,C2(I,P)^C2(S,P) -+ cmp r1,r0 -+ moveq r2,#SYM_SP -+ beq 1f -+ -+ BigMov r1,C2(L,R) -+ cmp r1,r0 -+ moveq r2,#SYM_LR -+ beq 1f -+ -+ BigMov r1,C2(P,C) -+ cmp r1,r0 -+ moveq r2,#SYM_PC -+ beq 1f -+ -+ BigMov r1,C4(C,P,S,R) -+ cmp r1,r0 -+ moveq r2,#SYM_CPSR -+ beq 1f -+ -+ BigMov r1,C3(F,S,R) -+ cmp r1,r0 -+ moveq r2,#SYM_FSR -+ beq 1f -+ -+ BigMov r1,C3(F,A,R) -+ cmp r1,r0 -+ moveq r2,#SYM_FAR -+ beq 1f -+ -+ BigMov r1,C4(D,C,S,R) -+ cmp r1,r0 -+ moveq r2,#SYM_DCSR -+ beq 1f -+ -+ BigMov r1,C4(T,T,B,R) -+ cmp r1,r0 -+ moveq r2,#SYM_TTBR -+ beq 1f -+ -+ BigMov r1,C4(C,T,R,L) -+ cmp r1,r0 -+ moveq r2,#SYM_CTRL -+ beq 1f -+ -+// BigMov r1,C3(F,P,S) -+// cmp r1,r0 -+// moveq r2,#SYM_FPS-SYM_F0 -+ movne pc,lr -+ -+ -+//3: add r2,r2,#SYM_F0-SYM_SL -+2: add r2,r2,#SYM_SL -+1: BigMov r0,DEBUG_SYM -+ add r0,r0,r2 -+ subs r2,r2,r2 -+ mov pc,lr -+ -+ -+ -+//IN: r0 - symbol address or number to print -+PrintHexOrSymbol: -+ BigAdd r1,r0,-DEBUG_SYM -+ cmp r1,#SYM_LAST+1 -+ bcs PrintHex -+ mov r0,#0 -+ -+//IN: r1 register #, r0 {31:16}- 2 characters to print after -+PrintRegName: -+ cmp r1,#SYM_SL -+ bcs 1f -+ add r0,r0,r1,LSL #8 -+ add r0,r0,#L2(NULL,0) -+// cmp r1,#10 -+// subge r0,r0,#10<<8 -+// movge r0,r0,LSL #8 -+// addge r0,r0,#L2(NULL,1) -+ add r0,r0,#L1(R) -+20: b Transmit1 -+1: BigOrr2Eq r0,L2(S,L) -+ cmp r1,#SYM_FP -+ BigOrr2Eq r0,L2(F,P) -+ cmp r1,#SYM_IP -+ BigOrr2Eq r0,L2(I,P) -+ cmp r1,#SYM_SP -+ BigOrr2Eq r0,L2(S,P) -+ cmp r1,#SYM_LR -+ BigOrr2Eq r0,L2(L,R) -+ cmp r1,#SYM_PC -+ BigOrr2Eq r0,L2(P,C) -+ ble 20b -+ cmp r1,#SYM_FP0 -+ -+ mov r0,r0,LSL #8 -+ BigOrr2Eq r0,L3(F,P,0) -+ cmp r1,#SYM_FSR -+ BigOrr2Eq r0,L3(F,S,R) -+ cmp r1,#SYM_FAR -+ BigOrr2Eq r0,L3(F,A,R) -+ -+ cmp r1,#SYM_CPSR -+ BigMovEq r0,L4(C,P,S,R) -+ cmp r1,#SYM_DCSR -+ BigMovEq r0,L4(D,C,S,R) -+ cmp r1,#SYM_TTBR -+ BigMovEq r0,L4(T,T,B,R) -+ cmp r1,#SYM_CTRL -+ BigMovEq r0,L4(C,T,R,L) -+ b Transmit1 -+ -+ -+//r2 - symbol # -+PrintRegVal: -+ mov r6,lr -+ bl GetRegVal -+ cmp r2,#SYM_FP0 -+ bne 1f -+ mov r5,r0 -+ mov r0,r1 -+ bl PrintHexByte //40 bits -+ mov r0,r5 -+1: mov lr,r6 -+ b PrintHex -+ -+ -+ -+ -+ -+//r2 - symbol #, r1:r0 - value -+StoreRegVal: -+ cmp r2,#SYM_FP0 -+ bcs 1f -+#if DBG_R0 -+ add r1,rDBG,#DBG_R0 -+ str r0,[r1,r2,LSL #2] -+#else -+ str r0,[rDBG,r2,LSL #2] -+#endif -+ mov pc,lr -+1: -+ bne 2f -+//MAR{<cond>} acc0,<RdLo>,<RdHi> -+ mar acc0,r0,r1 -+ mov pc,lr -+2: cmp r2,#SYM_FSR -+ CP15_FSR mcreq,r0 -+ cmp r2,#SYM_FAR -+ CP15_FAR mcreq,r0 -+ cmp r2,#SYM_DCSR -+ CP14_DCSR mcreq,r0 -+ cmp r2,#SYM_TTBR -+ CP15_TTBR mcreq,r0 -+ cmp r2,#SYM_CTRL -+ CP15_CONTROL mcreq,r0 -+ mov pc,lr -+ -+R_Cmd: -+ mov r7,#0 -+1: mov r1,r7 -+ BigMov r0,L4(NULL,NULL,COLON,SPACE) -+ bl PrintRegName -+ bl TransmitSPACE -+ mov r2,r7 -+ bl PrintRegVal -+ bl TransmitSPACE -+ bl TransmitSPACE -+ add r7,r7,#1 -+ tst r7,#3 -+ bleq TransmitCRLF -+ cmp r7,#SYM_LAST_RCMD+1 -+ bne 1b -+ b Prompt -+BS_Cmd: -+ tst rValidCnt,#F_NUM1_MASK -+ beq BE_Cmd -+ tst rSymbol,#F_NUM1_MASK -+ mov r0,rNum1 -+ blne GetSymValue -+ mov rNum1,r0 -+ bl BS_Do -+ beq Prompt -+ b BE_Cmd -+ -+//out: z-1 breakpoint just set -+// z-0 if r0==rNum1, breakpoint was already set -+BS_Do: -+ CP15_IBCR0 mrc,r0 -+ CP15_IBCR1 mrc,r1 -+ orr rNum1,rNum1,#1 -+ cmp r0,rNum1 -+ cmpne r1,rNum1 -+ beq 2f -+ tst r0,#1 -+ CP15_IBCR0 mcreq,rNum1 -+ moveq pc,lr -+ tst r1,#1 -+ CP15_IBCR1 mcreq,rNum1 -+ mov pc,lr -+ -+2: mov r0,rNum1 -+ movs r1,#1 -+ mov pc,lr -+ -+BC_Cmd: -+ tst rValidCnt,#F_NUM1_MASK -+ beq BE_Cmd -+ tst rSymbol,#F_NUM1_MASK -+ mov r0,rNum1 -+ blne GetSymValue -+ mov rNum1,r0 -+ bl BC_Do -+ beq Prompt -+ b BE_Cmd -+ -+//out: z-1 breakpoint just cleared -+BC_Do: -+ CP15_IBCR0 mrc,r0 -+ CP15_IBCR1 mrc,r1 -+ orr rNum1,rNum1,#1 -+ mov r2,#0 -+ cmp r0,rNum1 -+ CP15_IBCR0 mcreq,r2 -+ cmp r1,rNum1 -+ CP15_IBCR1 mcreq,r2 -+ cmpne r0,rNum1 -+ mov pc,lr -+ -+BE_Cmd: -+ BigMov r0,L4(B,K,P,T) -+ bl Transmit1 -+ bl TransmitSPACE -+ BigMov r0,L4(S,t,a,t) -+ bl Transmit1 -+ BigMov r0,L4(u,s,COLON,SPACE) -+ bl Transmit1 -+ CP15_IBCR0 mrc,r0 -+ tst r0,#1 -+ bic r0,r0,#1 -+ blne PrintHex -+ bl TransmitSPACE -+ -+ CP15_IBCR1 mrc,r0 -+ tst r0,#1 -+ bic r0,r0,#1 -+ blne PrintHex -+ b Prompt -+ -+WatchStatus: -+ BigMov r0,L4(W,A,T,C) -+ bl Transmit1 -+ BigMov r0,L2(H,SPACE) -+ bl Transmit1 -+ BigMov r0,L4(S,t,a,t) -+ bl Transmit1 -+ BigMov r0,L4(u,s,COLON,SPACE) -+ bl Transmit1 -+ CP15_DBCON mrc,r5 -+ tst r5,#0x0f -+ beq 10f -+ tst r5,#0x03 -+ bne 1f -+ tst r5,#0x100 -+ bne 10f //br if dbr1 is mask (nothing being watched) -+ b 4f -+1: -+ CP15_DBR0 mrc,r0 -+ bl PrintHex -+ bl 20f -+ tst r5,#0x100 -+ beq 3f -+ BigMov r0,L2(M,COLON) -+ bl Transmit1 -+ CP15_DBR1 mrc,r0 //read mask -+ bl PrintHex -+ b 10f -+3: -+ tst r5,#3<<2 -+ beq 10f -+4: -+ CP15_DBR1 mrc,r0 -+ bl PrintHex -+ mov r5,r5,LSR #2 -+ bl 20f -+10: b Prompt -+ -+ -+20: -+ BigMov r0,L4(SPACE,R,W,SPACE) -+ tst r5,#1 -+ beq 21f -+ tst r5,#2 -+ BigEor2Eq r0,L4(SPACE,R,W,SPACE)^L4(SPACE,SPACE,W,SPACE) //store only -+ BigEor2Ne r0,L4(SPACE,R,W,SPACE)^L4(SPACE,R,SPACE,SPACE) //load only -+21: -+ b Transmit1 -+ -+WC_Cmd: -+ mov r0,#0 -+ CP15_DBCON mcr,r0 -+ b Prompt -+WRW_Cmd: -+ mov r4,#2 -+ b WW_JOIN -+WR_Cmd: -+ mov r4,#3 -+ b WW_JOIN -+WW_Cmd: -+ mov r4,#1 -+WW_JOIN: -+ tst rValidCnt,#F_NUM1_MASK -+ beq WatchStatus -+ tst rSymbol,#F_NUM1_MASK -+ mov r0,rNum1 -+ blne GetSymValue -+ mov rNum1,r0 -+ -+ tst rValidCnt,#F_NUM2_MASK -+ beq 3f -+ tst rSymbol,#F_NUM2_MASK -+ mov r0,rNum2 -+ blne GetSymValue -+ mov rNum2,r0 -+ orr r4,r4,#0x100 //mask -+1: -+ mov r0,#0 -+ CP15_DBCON mcr,r0 -+ CP15_DBR0 mcr,rNum1 -+ CP15_DBR1 mcr,rNum2 -+2: -+ CP15_DBCON mcr,r4 -+ b Prompt -+3: -+ CP15_DBCON mrc,r5 -+ mov rNum2,#0 -+ tst r5,#0x100 -+ bne 1b //br if mask was used previously -+ tst r5,#0x0f -+ beq 1b -+ mov r0,#0 -+ CP15_DBCON mcr,r0 -+ tst r5,#3 -+ orreq r4,r5,r4 -+ bicne r5,r5,#3<<2 -+ orrne r4,r5,r4,LSL #2 -+ CP15_DBR0 mcreq,rNum1 -+ CP15_DBR1 mcrne,rNum1 -+ b 2b -+ -+ -+//IN: rNum2 address -+//OUT: r1:r0 val -+GetSymValue: -+ BigAdd r2,rNum2,-DEBUG_SYM -+ cmp r2,#SYM_LAST+1 -+ bcc GetRegVal -+ mov r0,rNum2 -+ mov r1,#0 -+ mov pc,lr -+//IN: rPrevNum1 address or symbol -+//OUT: r1:r0 val -+GetValue: -+ BigAdd r2,rPrevNum1,-DEBUG_SYM -+ cmp r2,#SYM_LAST+1 -+ bcc GetRegVal -+ ldr r0,[rPrevNum1] -+ mov r1,#0 -+ mov pc,lr -+ -+ -+//IN: rNum1 address -+PrintLocationOrRegVal: -+ BigAdd r2,rNum1,-DEBUG_SYM -+ cmp r2,#SYM_LAST+1 -+ bcc PrintRegVal -+ tst r5,#3 -+ tsteq rNum1,#3 -+ bne 1f -+ ldr r0,[rNum1] -+ b PrintHex -+1: ldrb r0,[rNum1] -+ b PrintHexByte -+ -+//IN: rPrevNum1 address, r1:r0 - value -+StoreLocationOrReg: -+ BigAdd r2,rPrevNum1,-DEBUG_SYM -+ cmp r2,#SYM_LAST+1 -+ bcc StoreRegVal -+ tst r5,#3 -+ tsteq rPrevNum1,#3 -+ bne 1f -+ str r0,[rPrevNum1] -+ mov pc,lr -+1: strb r0,[rPrevNum1] -+ mov pc,lr -+ -+GetChangeAmount: -+ BigAdd r0,rPrevNum1,-DEBUG_SYM -+ cmp r0,#SYM_LAST+1 -+ movcs r0,#4 -+ movcc r0,#1 -+ tst r5,#3 -+// tsteq rPrevNum1,#3 -+ movne r0,#1 -+ mov pc,lr -+ -+Examine_Cmd: -+ tst rValidCnt,#F_NUM1_MASK -+ moveq rNum1,rPrevNum1 -+ movne rPrevNum1,rNum1 -+ mov r5,rNum1 -+ tst rValidCnt,#F_NUM2_MASK -+ bne 12f -+1: mov r0,rNum1 -+ bl PrintHexOrSymbol -+ mov r0,#L1(FSLASH) -+ bl Transmit -+ -+ bl PrintLocationOrRegVal -+ -+ bl TransmitSPACE -+ mov rFieldStart,#1<<(F_INC+F_INC+F_INC+F_INC) //blank before num2 field -+ str r5,[rDBG,#DBG_TEMP] -+ bl ReadCommand -+ ldr r5,[rDBG,#DBG_TEMP] -+ mov r3,r0 //save exit character -+ mov r0,rNum2 -+ mov r1,#0 -+ tst rSymbol,#F_NUM2_MASK -+ beq 20f -+ blne GetSymbolNumber -+ bne Invalid -+ mov rNum2,r0 -+ bl GetSymValue -+ -+20: -+ cmp r3,#L1(PLUS) -+ cmpne r3,#L1(MINUS) -+ cmpne r3,#L1(AT_SIGN) -+ beq 2f -+ tst rValidCnt,#F_NUM2_MASK -+ beq Prompt -+ bl StoreLocationOrReg -+ mov r3,#L1(PLUS) -+ b 3f -+ -+2: mov r0,r3 -+ bl Transmit -+3: bl TransmitCRLF -+ bl GetChangeAmount -+ cmp r3,#L1(AT_SIGN) -+ beq 5f -+ cmp r3,#L1(PLUS) -+ addeq rPrevNum1,rPrevNum1,r0 -+ subne rPrevNum1,rPrevNum1,r0 -+4: mov rNum1,rPrevNum1 -+ b 1b -+ -+5: bl GetValue -+ mov rPrevNum1,r0 -+ mov r5,r0 -+ b 4b -+ -+11: sub r0,rNum1,r5 -+ cmp r0,#0x1000 -+ bhs Prompt //no more than 128 lines per examine command -+ bl TransmitCRLF -+12: mov r0,rNum1 -+ bl PrintHexOrSymbol -+ mov r0,#L1(FSLASH) -+ bl Transmit -+13: -+ bl GetChangeAmount -+ bcc 14f -+ add r0,rNum1,#3 -+ cmp r0,rNum2 -+ bhi 16f -+ tst r5,#3 -+ tsteq rNum1,#3 -+ bne 16f -+14: bl PrintLocationOrRegVal -+ bl GetChangeAmount -+15: add rNum1,rNum1,r0 -+ cmp rNum1,rNum2 -+ bhi Prompt -+ tst rNum1,#0x1f -+ beq 11b -+ bl TransmitSPACE -+ tst rNum1,#0x0f -+ bleq TransmitSPACE -+ b 13b -+16: -+ ldrb r0,[rNum1] -+ bl PrintHexByte -+ mov r0,#1 -+ b 15b -+ -+Deposit_Cmd: -+ tst rValidCnt,#F_NUM1_MASK -+ beq Invalid -+ tst rValidCnt,#F_NUM2_MASK -+ beq Invalid -+ mov r0,rNum2 -+ mov r1,#0 -+ tst rSymbol,#F_NUM2_MASK -+ blne GetSymValue -+ mov rPrevNum1,rNum1 -+ bl StoreLocationOrReg -+ b Prompt -+ -+ -+Download_Cmd: -+ tst rValidCnt,#F_NUM1_MASK -+ beq Invalid -+ tst rNum1,#3 -+ bne Invalid -+ cmp rNum1,#MEM_START -+ bcc Invalid //br if rNum1 is below ram start, -+ //NOTE: arm sets the carry to the opposite of most processors on subtract, compare -+ -+ mov rDest,rNum1 -+ mov rDestHead,rNum1 -+ mov rPrevNum1,rNum1 -+ mov rPrevCRC,#0 -+ mov rRunningCRC,#0 -+ mov rNak,#L1(C) //current NAK character -+ mov rBlockNum,#1 //block # to receive -+ -+#if DDEBUG -+ b 47f -+91: -+ cmp rBlockNum,#1 -+ beq 47f -+ mov r2,#L1(1) -+ b 45f -+92: -+ mov r2,#L1(2) -+ b 45f -+93: -+ mov r2,#L1(3) -+ b 45f -+94: -+ mov r2,#L1(4) -+ b 45f -+95: -+ mov r2,#L1(5) -+45: -+ BigMov r0,L3(CAN,CAN,CAN) //abort -+ bl Transmit1 -+46: bl Receive -+ bne 46b //branch until timeout -+ mov r0,r2 -+ bl Transmit -+ b Invalid -+#else -+91: -+92: -+93: -+94: -+95: -+#endif -+ -+47: -+ -+ mov r0,rNak -+15: -+ bl Transmit -+2: bl Receive -+ beq 91b //branch on timeout -+ -+ mov rPacketLength,#128-1 -+ cmp r0,#SOH -+ addne rPacketLength,rPacketLength,#1024-1-(128-1) -+ cmpne r0,#STX -+ beq 3f -+ cmp r0,#CAN -+ bne 16f -+ bl Receive -+ cmp r0,#CAN -+ bne 10f -+ b Invalid -+16: cmp r0,#EOT -+ bne 10f -+ mov r0,#ACK -+ bl Transmit -+ -+#if DDEBUG -+ mov rDestHead,rDest -+ mov r0,rDest -+ bl PrintHex -+ bl TransmitSPACE -+ mov r0,rBlockNum -+ bl PrintHex -+ -+ bl TransmitSPACE -+ mov r0,rRunningCRC -+ bl PrintHex -+ mov rDest,rDestHead -+#endif -+ -+// now verify that ram is STILL valid by recomputing the CRC -+ mov rCRC,#0 -+ mov r1,rPrevNum1 -+ b 83f -+82: -+ ldrb r0,[r1],#1 -+// -+ eor r0,rCRC,r0,LSL #24 -+ eor r0,r0,r0,LSR #4 //c is in high byte of r0 -+ and r0,r0,#0xff000000 -+ -+ mov rCRC,rCRC,LSL #8 -+ eor rCRC,rCRC,r0,LSL #4 -+ orr rCRC,rCRC,r0,LSR #8 -+ -+ eor rCRC,rCRC,r0,LSR #3 -+// -+83: cmp r1,rDest -+ bne 82b -+#if DDEBUG -+ bl TransmitSPACE -+ mov r0,rCRC -+ bl PrintHex -+#endif -+ -+ cmp rCRC,rRunningCRC -+ bne 84f -+ BigMov r0,L3(O,K,SPACE) -+ bl Transmit1 -+ mov r0,rPrevNum1 -+ mov rDestHead,rDest -+ bl PrintHex -+ mov r0,#L1(MINUS) -+ bl Transmit -+ mov r0,rDestHead -+ bl PrintHex -+ b Prompt -+84: -+ BigMov r0,L4(E,R,R,O) -+ bl Transmit1 -+ mov r0,#L1(R) -+ bl Transmit -+ b Prompt -+ -+3: bl Receive -+ beq 92b -+ mov r2,r0 -+ bl Receive -+ beq 93b -+ eor r0,r0,#0xff -+ cmp r0,r2 //check 1's complement blk # -+ bne 10f -+ cmp r2,rBlockNum //check blk # -+ bne 20f -+80: -+ mov rDestHead,rDest //rDestHead - start of buffer, rDest end of buffer -+ mov rPrevCRC,rRunningCRC -+ mov rCRC,#0 //crc -+ -+//alternative CRC calculation routines -+ .if 0 -+ BigMov r2,CRC_POLY -+4: bl Receive -+ beq 8f //branch on timeout -+ eor rCRC,rCRC,r0,LSL #24 -+ mov r1,#8 -+5: -+ movs rCRC,rCRC,LSL #1 -+ eorcs rCRC,rCRC,r2 -+ subs r1,r1,#1 -+ bne 5b -+ strb r0,[rDest],#1 -+ subs rPacketLength,rPacketLength,#1 -+ bge 4b -+ mov rCRC,rCRC,LSR #16 //CRC was only in the high half -+ -+ .endif -+ -+ -+ -+ .if 1 -+4: bl Receive -+ beq 8f //branch on timeout -+// -+//calculate CRC -+//unsigned int crc = 0; -+//unsigned int c = 0; -+//for (i=3; i<max; i++) -+//{ -+// c = crc ^ (buf[i]<<24); -+// c ^= (c >> 4); -+// c &= 0xff000000; -+// crc = (((crc<<8) ^ (c << 4)) | (c>>8)) ^ (c >> 3); -+//} -+//crc >>= 16; -+// -+ eor r1,rCRC,r0,LSL #24 -+ eor r1,r1,r1,LSR #4 -+ and r1,r1,#0xff000000 -+ -+ mov rCRC,rCRC,LSL #8 -+ eor rCRC,rCRC,r1,LSL #4 -+ orr rCRC,rCRC,r1,LSR #8 -+ eor rCRC,rCRC,r1,LSR #3 -+ -+//also save a running total CRC to use to verify RAM after download is complete -+// -+ eor r1,rRunningCRC,r0,LSL #24 -+ eor r1,r1,r1,LSR #4 //c is in high byte of r1 -+ and r1,r1,#0xff000000 -+ -+ mov rRunningCRC,rRunningCRC,LSL #8 -+ eor rRunningCRC,rRunningCRC,r1,LSL #4 -+ orr rRunningCRC,rRunningCRC,r1,LSR #8 -+ -+ eor rRunningCRC,rRunningCRC,r1,LSR #3 -+// -+#if LITTLE_ENDIAN -+ mov r0,r0,LSL #24 -+ orr r2,r0,r2,LSR #8 //this assumes a little endian memory system -+#else -+ orr r2,r0,r2,LSL #8 //this assumes a big endian memory system -+#endif -+ -+ tst rPacketLength,#3 -+ streq r2,[rDest],#4 -+ subs rPacketLength,rPacketLength,#1 -+ bge 4b -+ mov rCRC,rCRC,LSR #16 //CRC was only in the high half -+ .endif -+ -+ -+ -+ -+ bl Receive -+ beq 8f //branch on timeout -+ mov r2,r0 -+ bl Receive -+ beq 8f //branch on timeout -+ add r2,r0,r2,LSL #8 -+ cmp rCRC,r2 -+ bne 9f //branch on crc mismatch -+//packet is good -+ add rBlockNum,rBlockNum,#1 -+ and rBlockNum,rBlockNum,#0xff -+ mov rNak,#NAK -+ mov r0,#ACK -+ b 15b -+20: -+ sub r1,rBlockNum,#1 -+ and r1,r1,#0xff -+ cmp r1,r2 -+ bne 21f //br if not trying to transmit the packet I just ACKed -+ mov rDest,rDestHead //reset pointer to previous packet -+ mov rRunningCRC,rPrevCRC -+ mov rBlockNum,r1 //correct blk # -+ b 80b -+ -+21: BigMov r0,L3(CAN,CAN,CAN) //abort code -+ bl Transmit1 -+48: bl Receive -+ bne 48b //branch until timeout -+ -+#if DDEBUG -+ mov r0,r2 -+ bl PrintHex -+ bl TransmitSPACE -+ mov r0,rBlockNum -+ bl PrintHex -+#endif -+ -+ b Invalid //give up -+ -+ -+8: mov rDest,rDestHead //reset register -+ mov rRunningCRC,rPrevCRC -+ b 94b //send NAK -+9: -+#if DDEBUG //debug code -+ BigMov r0,L3(CAN,CAN,CAN) //abort code -+ bl Transmit1 -+44: bl Receive -+ bne 44b //branch until timeout -+ mov r0,r2 -+ bl PrintHex -+ bl TransmitSPACE -+ mov r0,rCRC -+ bl PrintHex -+ b Invalid -+#endif -+ -+ mov rDest,rDestHead -+ mov rRunningCRC,rPrevCRC -+ -+ -+10: bl Receive -+ bne 10b //branch until timeout -+ b 95b //send NAK and wait for packet -+ -+ -+ -+// ******************************************************************************************* -+// ******************************************************************************************* -+// ******************************************************************************************* -+// ******************************************************************************************* -+//Code above this point must fit in 2k mini cache or be burned on flash -+// -+//Code below this point need not be in the 2k mini-instruction cache, -+//it can be temporarily placed in the main instruction cache unlocked -+// ******************************************************************************************* -+ -+InitializeCont1: -+//pc - 0-0x4000, 0x04000000-0x04004000, 0xa000000-0xffffffff -+ InitIC_Clocks r0,sp -+ InitUART r0,sp,FFUART_BASE,BAUDRATE -+ InitUART r0,sp,BTUART_BASE,BAUDRATE -+ InitUART r0,sp,STUART_BASE,9600 -+ InitChangeCPUSpeed r0 -+ InitMemory r0,sp,r1 -+ BigMov r1,MACH_TYPE_SCANPASS -+ SaveRegisters r0,sp -+// ******************************************************* -+ InitMMU r0 -+ InitPWR r0,r1,sp //out: r1 RCSR -+InitializeCont2: -+ cmp pc,#MEM_START -+ bhs 89f //if in ram, must be mdebug -+ bic sp,pc,#FLASH_BASE_ADDRESS -+ cmp sp,#0x4000 -+ mov r2,#FUNC_REQ_GL -+ bhs 87f //br if not part of reset vector -+ tst r1,#RCSR_SLEEP_RESET -+ beq 89f //; Not sleep. -+ mov r2,#FUNC_REQ_WAKEUP -+87: adr r7,88f -+ adr lr,89f -+ mov r10,r1 //RCSR -+ b TryRoutine1 -+88: ldmia sp,{rPrevNum1,rUart,rDBG} -+89: -+ mov r2,lr -+ bl CalcMemEnd -+ mov r3,r0 -+ mov lr,r2 -+// ******************************************************* -+//0xnnnn0000 - 16k remapping of flash address 0 for relocated vector table -+//0xnnnn4000 - 16k 16k 1st level descriptors table -+//0xnnnn8000 - 16k 2 x 1k 2nd level descriptor tables -+//0xnnnnc000 - 16k 12k skipped, 4k debug data -+//end of ram -+ BigSub sp,r3,0x8000 -+ sub r2,sp,#0x4000 -+ mov r1,r2 -+ BigMov r0,0x0402 //section descriptor, ap-01, privileged r/w -+ //map virt to phys 1-to-1, non-cache, non-bufferable -+1: str r0,[r2],#4 -+ add r0,r0,#1<<20 -+ cmp r2,sp -+ bne 1b -+ -+ -+ add sp,r1,r3,LSR #(20-2) -+ add r1,r1,#((MEM_START>>20)&0xfff)<<2 //microsoft assembler bug propagates the sign bit -+ BigMov r0,(MEM_START&0xfff00000)+0x040A //cacheable (write through) -+2: str r0,[r1],#4 -+ cmp r1,sp -+ addne r0,r0,#1<<20 -+ bne 2b -+//r0 is physical address of last meg of memory -+ orr r1,r2,#1 //2nd level descriptor address (1k boundary), coarse page table -+ -+ .ifdef __ARMASM -+ GBLA TABLE_CNT -+ .endif -+ .if ((DEBUG_START&0xfff00000) - (0xffff0000&0xfff00000)) -+ .set TABLE_CNT,2 -+ str r1,[r2,#((DEBUG_START>>18)&0x3ffc)-0x4000] //r2 is the end of the 16k table -+ add r1,r1,#0x400 -+ -+ .else -+ .set TABLE_CNT,1 -+ .endif -+ -+ str r1,[r2,#-4] //map (0xfff00000) to 2nd level page table -+ //last meg of memory (contains relocated reset vector) -+ add sp,r2,#((256*TABLE_CNT)-16)<<2 //256 - 4byte entries each mapping 4k -+ -+//clear out 1 or 2 level 2 page tables -+ mov r1,#0 -+3: str r1,[r2],#4 -+ cmp r2,sp -+ bne 3b -+ -+ -+ BigMov r1,0x559 //map to flash in 1 - 64k page -+ add sp,sp,#16<<2 -+4: str r1,[r2],#4 -+ cmp r2,sp -+ bne 4b -+ -+ bic r0,r0,#0x000ff -+ orr r0,r0,#0x0000e //cacheable writeback 4k page -+// orr r0,r0,#0x0000a //cacheable writethru 4k page -+ orr r0,r0,#0x00aa0 //privileged r/w, user read -+ orr r0,r0,#0xff000 //last 4k of ram -+ -+ str r0,[r2,#((DEBUG_START>>10)&0x3fc)-(TABLE_CNT*0x400)] //debug variables, r2 is end of 1k tables -+ -+ BigMov r0,0xffffffff -+ CP15_DACR mcr,r0 -+ -+ BigSub r0,r3,0xc000 //MEM_END-0xc000 -+ CP15_TTBR mcr,r0 -+//enable MMU -+ CP15_TLB_UNLOCK_I mcr,r0 -+ CP15_TLB_UNLOCK_D mcr,r0 -+ CP15_TLB_INVAL_BOTH mcr,r0 -+ -+ CP15_CONTROL mrc,r1 //get the control register -+ orr r1,r1,#0x1 //set bit 0 - enable MMU -+ CPWAIT r0 -+ CP15_CONTROL mcr,r1 //set the control register -+ CPWAIT r0 -+ -+//enable the instruction cache -+ CP15_CF_UNLOCK_I mcr,r0 -+// CP15_CF_INVAL_I mcr,r0 //I might be running from cache only, don't invalidate -+ -+ orr r1,r1,#0x1000 //set bit 12 -- the I bit -+ CP15_CONTROL mcr,r1 //set the control register -+ CPWAIT r0 -+ -+//enable the data cache -+ CP15_CF_UNLOCK_D mcr,r0 -+ CP15_CF_INVAL_D mcr,r0 //this will also drain write buffer -+ CP15_CF_DRAIN mcr,r0 //make sure it is drained just to be very safe -+ -+ orr r1,r1,#0x4 //set bit 4 -- the D bit -+ CP15_CONTROL mcr,r1 //set the control register -+ CPWAIT r0 -+ -+ .if 0 -+//if not in halt mode, lock 64k of flash remap in instruction TLB(contains override relocated vector table) -+//halt mode uses the mini cache and physical addresses only for this -+ CP14_DCSR mrc,r0 -+ BigMov r1,0xffff0000 -+ tst r0,#0x40000000 -+//I am currently executing from flash, marked as uncacheable -+ CP15_TLB_LOCK_IENTRY mcreq,r1 //lock 64k if not in halt mode -+ CPWAIT r0 -+ .endif -+ -+//now lock debug data into data cache -+ BigMov r1,DEBUG_START -+ mov r2,#DEBUG_SPACE>>5 //3 or 4 cache lines to lock -+ CP15_TLB_LOCK_DENTRY mcr,r1 -+ mov sp,#1 -+ CP15_CF_LOCK_D_CSR mcr,sp //data cache is into lock mode -+ CPWAIT r0 -+5: pld [r1] -+ add r1,r1,#32 //lock and load -+ CP15_CF_DRAIN mcr,r0 -+ subs r2,r2,#1 -+ bne 5b -+ -+ mov sp,#0 -+ CP15_CF_LOCK_D_CSR mcr,sp //data cache is out of lock mode -+ CPWAIT r0 -+ -+ BigMov r0,0x3fff -+ CP15_CP_ACCESS mcr,r0 //enable access to all coprocessors -+//now disable MMU, Data Cache -+ .if 1 -+ CP15_CONTROL mrc,r1 //get the control register -+ bic r1,r1,#0x5 -+ CP15_CONTROL mcr,r1 //set the control register -+ CPWAIT r0 -+ .endif -+#if (DO_GPTEST==0) -+// TransMacro L1(U) -+ -+#if (PLATFORM_TYPE==BD2003) || (PLATFORM_TYPE==BOUNDARY_OLD_BOARD) || (PLATFORM_TYPE==OLD_GAME_CONTROLLER) || (PLATFORM_TYPE==HALOGEN) -+ sub r0,r3,#0x100000 //last meg-8k for video ram -+ sub r1,r3,#0x2000 //8K from end, last 4k is debug variables -+ str r1,[r1,#FDESC_FDADR] //next frame descriptor address, loop to self -+ str r0,[r1,#FDESC_FSADR] //start of frame -+ str r0,[r1,#FDESC_FIDR] //id of frame, anything I want -+ BigMov r2,SCREEN_WIDTH*SCREEN_HEIGHT*BYTES_PER_PIXEL -+ str r2,[r1,#FDESC_DCMD] //length of dma transfer -+ -+#if (BYTES_PER_PIXEL==2) -+ BigMov sp,(BLUE_VAL<<0)+(GREEN_VAL<<5)+(RED_VAL<<11) //rgb value -+ orr sp,sp,sp,LSL #16 -+79: str sp,[r0],#4 -+ subs r2,r2,#4 -+ bne 79b -+#else -+ BigMov r1,(BLUE_VAL<<0)+(GREEN_VAL<<6)+(RED_VAL<<12) //rgb value -+ orr r1,r1,r1,LSL #24 -+ -+ mov sp,r1,LSR #8 -+ orr sp,sp,sp,LSL #24 -+ -+ mov lr,sp,LSR #8 -+ orr lr,lr,lr,LSL #24 -+79: stmia r0!,{r1,sp,lr} -+ subs r2,r2,#12 -+ bne 79b -+ sub r1,r3,#0x2000 //8K from end, last 4k is debug variables -+#endif -+ -+ InitLCD r0,sp,r1 //r1 has descriptor address -+#endif -+ -+ -+// **************************** -+ mrs r1, CPSR -+ bic r2, r1,#PSR_MODE_MASK -+ orr r0, r2,#PSR_NOINTS_MASK+PSR_MODE_SVC //change to supervisor stack -+ msr CPSR_c, r0 -+ BigMov r0,SS_START+SS_SUPERVISOR -+ mov sp, r0 -+ -+ orr r2, r2, #PSR_NOINTS_MASK+PSR_MODE_IRQ //irq stack -+ msr CPSR_c, r2 -+ BigAdd sp, r0, SS_IRQ -+ -+ sub r2, r2, #PSR_MODE_IRQ-PSR_MODE_FIQ //fiq stack -+ msr CPSR_c, r2 -+ BigAdd sp, r0, SS_IRQ+SS_FIQ -+ -+ add r2, r2, #PSR_MODE_SYSTEM-PSR_MODE_FIQ //system(user mode) -+ msr CPSR_c, r2 -+ BigAdd sp, r0, SS_IRQ+SS_FIQ+SS_SYSTEM -+ -+ sub r2, r2, #PSR_MODE_SYSTEM-PSR_MODE_UNDEF //undefined stack -+ msr CPSR_c, r2 -+ BigAdd sp, r0, SS_IRQ+SS_FIQ+SS_SYSTEM+SS_UNDEFINED -+ -+ sub r2, r2, #PSR_MODE_UNDEF-PSR_MODE_ABORT //Abort stack -+ msr CPSR_c, r2 -+ BigAdd sp, r0, SS_IRQ+SS_FIQ+SS_SYSTEM+SS_UNDEFINED+SS_ABORT -+// -+ msr CPSR_c, r1 -+ sub r2, r2, #PSR_MODE_ABORT-PSR_MODE_SVC //supervisor stack -+ -+// **************************** -+ CP14_DCSR mrc,sp -+ tst sp,#1<<5 //test sticky abort bit -+ mov sp,r0 -+ BigMovEq r0,DEBUG_BASE+DBG_MAGIC -+ BigAddNe r0,r3,(-0x1000+((DEBUG_BASE+DBG_MAGIC)&0xfff)) //don't use virtual address if memory isn't working right -+ sub r0,r0,#DBG_MAGIC -+ -+ and r1,r1,#PSR_MODE_MASK -+ mov r3,#0 -+ cmp r1,#PSR_MODE_DEBUG -+ BigMov lr,0xa0008000 //default start pc -+ beq SaveDebug //br if a debug exception in halt mode -+ mov r1,#SIG_RESET -+ b SaveR4andUp -+#else -+//#define GPBIT 2 -+//#define GPL GPLR1 -+#define GPBIT 9 -+#define GPL GPLR0 -+#define GPMASK (1<<GPBIT) -+GPTest: -+ BigMov rUart,UART_BASE -+ BigMov fp,GPIO_BASE -+ mov r6,#GPMASK -+ str r6,[fp,#GPSR0] -+ -+2: bl TransmitCRLF -+ mov r3,#40 -+20: mov r2,#0x300000 -+ -+1: ldr r0,[fp] -+ and r0,r1,#GPMASK -+ cmp r0,r6 -+ subnes r2,r2,#1 -+ bne 1b //wait for desired state -+ -+ mov r1,#L1(0) -+ add r0,r1,r0,LSR #GPBIT -+ bl Transmit -+ -+ mov r0,#GPMASK -+ eors r6,r6,#GPMASK //get new desired state -+ streq r0,[fp,#GPCR0] -+ strne r0,[fp,#GPSR0] -+ subs r3,r3,#1 -+ bne 20b -+ b 2b -+#endif -+ -+ -+ -+ -+ .if 0 //macro tests -+ BigMov r0,-1 -+ BigMov r0,-5 -+ BigMov r0,0x0ffffff0 -+ BigMov r0,1 -+ BigMov r0,0xff -+ BigMov r0,0xf000000f -+ BigMov r0,0x80010003 -+ .endif -+ -+ -+TransLineR3: -+ mov r4,#0 -+TransLineR4: -+ mov r5,#0 -+TransLineR5: -+ mov r6,#0 -+TransLineR6: -+ mov r7,#0 -+TransLineR7: -+ mov fp,lr -+ mov r0,r2 -+ bl Transmit1 -+ -+ BigEor r0,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(SPACE,SPACE,MINUS,SPACE) -+ bl Transmit1 -+ -+ mov r0,r3 -+ bl Transmit1 -+ movs r0,r4 -+ blne Transmit1 -+ movs r0,r5 -+ blne Transmit1 -+ movs r0,r6 -+ blne Transmit1 -+ movs r0,r7 -+ blne Transmit1 -+ mov lr,fp -+ b TransmitCRLF -+ -+Help_Cmd: -+ BigMov rSP,L2(SPACE,SPACE) -+ orr rSP,rSP,rSP,LSL #16 -+ -+ BigEor r2,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(B,C,SPACE,SPACE) //BC -Breakpoint clear -+ BigEor r3,r2, L4(B,C,SPACE,SPACE)^L4(B,r,e,a) -+ BigMov r4, L4(k,p,o,i) -+ BigEor r5,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(n,t,SPACE,c) -+ BigMov r6, L4(l,e,a,r) -+ bl TransLineR6 -+ -+ BigEor2 r2,L4(B,C,SPACE,SPACE) ^L4(B,E,SPACE,SPACE) //BE -Breakpoint examine -+ BigEor2 r5,L4(n,t,SPACE,c) ^L4(n,t,SPACE,e) -+ BigMov r6, L4(x,a,m,i) -+ BigMov r7, L2(n,e) -+ bl TransLineR7 -+ -+ BigEor2 r2,L4(B,E,SPACE,SPACE) ^L4(B,S,SPACE,SPACE) //BS -Breakpoint set -+ BigEor2 r5,L4(n,t,SPACE,e) ^L4(n,t,SPACE,s) -+ BigMov r6, L2(e,t) -+ bl TransLineR6 -+ -+ BigEor2 r2,L4(B,S,SPACE,SPACE) ^L4(B,U,R,N) //BURN-Write to flash -+ BigMov r3, L4(W,r,i,t) -+ BigEor r4,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(e,SPACE,t,o) -+ BigMov r5, L4(SPACE,f,l,a) -+ BigMov r6, L2(s,h) -+ bl TransLineR6 -+ -+ BigEor r2,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(E,SPACE,SPACE,SPACE) //E -Examine -+ BigEor r3,r2, L4(E,SPACE,SPACE,SPACE)^L4(E,x,a,m) -+ BigMov r4, L3(i,n,e) -+ bl TransLineR4 -+ -+ BigEor r2,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(D,SPACE,SPACE,SPACE) //D -Deposit -+ BigEor r3,r2, L4(D,SPACE,SPACE,SPACE)^L4(D,e,p,o) -+ BigMov r4, L3(s,i,t) -+ bl TransLineR4 -+ -+ BigEor2 r2,L4(D,SPACE,SPACE,SPACE) ^L4(D,L,SPACE,SPACE) //DL -Download -+ BigEor2 r3,L4(D,e,p,o) ^L4(D,o,w,n) -+ BigMov r4, L4(l,o,a,d) -+ bl TransLineR4 -+ -+ BigEor2 r2,L4(D,L,SPACE,SPACE) ^L4(D,L,W,SPACE) //DLW -Download wireless -+ BigEor r5,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(SPACE,w,i,r) -+ BigMov r6, L4(e,l,e,s) -+ BigMov r7, L1(s) -+ bl TransLineR7 -+ -+ BigEor r2,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(G,SPACE,SPACE,SPACE) //G -Go -+ BigMov r3, L2(G,o) -+ bl TransLineR3 -+ -+ BigEor2 r2,L4(G,SPACE,SPACE,SPACE) ^L4(G,L,SPACE,SPACE) //GL -Go Linux -+ BigEor2 r3,L2(G,o) ^L4(G,o,SPACE,L) -+ BigMov r4, L4(i,n,u,x) -+ bl TransLineR4 -+ -+ BigEor2 r2,L4(G,L,SPACE,SPACE) ^L4(G,G,SPACE,SPACE) //GG -Go no cache clear -+ BigEor2 r3,L4(G,o,SPACE,L) ^L4(G,o,SPACE,n) -+ BigEor r4,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(o,SPACE,c,a) -+ BigEor r5,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(c,h,e,SPACE) -+ BigMov r6, L4(c,l,e,a) -+ BigMov r7, L1(r) -+ bl TransLineR7 -+ -+ BigEor r2,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(R,SPACE,SPACE,SPACE) //R -Registers -+ BigEor r3,r2, L4(R,SPACE,SPACE,SPACE)^L4(R,e,g,i) -+ BigMov r4, L4(s,t,e,r) -+ BigMov r5, L1(s) -+ bl TransLineR5 -+ -+ BigMov r2, L4(S,S,I,D) //SSID- Set SSID string -+ BigEor r3,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(S,e,t,SPACE) -+ mov r4,r2 -+ BigMov r5, L4(SPACE,s,t,r) -+ BigMov r6, L3(i,n,g) -+ bl TransLineR6 -+ -+ BigEor r2,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(T,SPACE,SPACE,SPACE) //T -Trace -+ BigEor r3,r2, L4(T,SPACE,SPACE,SPACE)^L4(T,r,a,c) -+ BigMov r4,L1(e) -+ bl TransLineR4 -+ -+ BigEor2 r2,L4(T,SPACE,SPACE,SPACE) ^L4(T,T,SPACE,SPACE) //TT -Trace -+ BigEor2 r4,L1(e) ^L4(e,SPACE,n,o) -+ BigEor r5,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(SPACE,c,a,c) -+ BigEor r6,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(h,e,SPACE,c) -+ BigMov r7, L4(l,e,a,r) -+ bl TransLineR7 -+ -+ BigEor r2,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(V,SPACE,SPACE,SPACE) //V -Verify -+ BigEor r3,r2, L4(V,SPACE,SPACE,SPACE)^L4(V,e,r,i) -+ BigMov r4, L2(f,y) -+ bl TransLineR4 -+ -+ BigEor r2,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(W,C,SPACE,SPACE) //WC -Watch clear -+ BigEor r3,r2, L4(W,C,SPACE,SPACE)^L4(W,a,t,c) -+ BigEor r4,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(h,SPACE,c,l) -+ BigMov r5, L3(e,a,r) -+ bl TransLineR5 -+ -+ BigEor2 r2,L4(W,C,SPACE,SPACE) ^L4(W,R,SPACE,SPACE) //WR -Watch read -+ BigEor2 r4,L4(h,SPACE,c,l) ^L4(h,SPACE,r,e) -+ BigMov r5, L2(a,d) -+ bl TransLineR5 -+ -+ BigEor2 r2,L4(W,R,SPACE,SPACE) ^L4(W,R,W,SPACE) //WRW -Watch read/write -+ BigEor2 r5,L2(a,d) ^L4(a,d,FSLASH,w) -+ BigMov r6, L4(r,i,t,e) -+ bl TransLineR6 -+ -+ BigEor r2,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(W,W,SPACE,SPACE) //WW -Watch write -+ BigEor2 r4,L4(h,SPACE,r,e) ^L4(h,SPACE,w,r) -+ BigMov r5, L3(i,t,e) -+ bl TransLineR5 -+ -+ BigEor r2,rSP,L4(SPACE,SPACE,SPACE,SPACE)^L4(QUESTION_MARK,SPACE,SPACE,SPACE) //? -Help -+ BigMov r3, L4(H,e,l,p) -+ bl TransLineR3 -+ -+ b Prompt -+ -+//.global CalcMemEnd -+CalcMemEnd: -+ CalcMemSize r1,r0,MEMORY_CONTROL_BASE //out: r0 - mem size -+ BigAdd2 r0,MEM_START //32 meg -+ mov pc,lr -+ -+ -+//rRamSector - start (rNum1) -+//rRamEnd - end (rNum2) -+Verify_Cmd: -+ mov r5,#CMD_VERIFY -+ b Burn1 -+Verify2_Cmd: -+ mov r5,#CMD_VERIFY -+ b Burn2 -+BurnAll_Cmd: -+ mov r5,#CMD_BURNALL -+ b Burn1 -+Burn2_Cmd: -+ mov r5,#CMD_BURN -+Burn2: -+ BigMov r4,FLASH_BASE_ADDRESS+(16<<20) -+ b BurnContinue -+Burn_Cmd: -+ mov r5,#CMD_BURN -+Burn1: -+ BigMov r4,FLASH_BASE_ADDRESS -+BurnContinue: -+ tst rValidCnt,#F_NUM1_MASK -+ tstne rValidCnt,#F_NUM2_MASK -+ beq Invalid -+ tst rRamSector,#3 -+ bne Invalid -+ tst rRamEnd,#3 -+ bne Invalid -+ cmp rRamSector,rRamEnd -+ bhs Invalid -+ cmp rRamSector,#MEM_START -+ blo Invalid //br if rRamSector is below ram start, -+ bl CalcMemEnd -+ mov r1,r4 -+ cmp rRamEnd,r0 -+ bhi Invalid //br if rRamEnd is above ram end, -+ sub lr,rRamEnd,rRamSector -+ cmp lr,#f128j3a_SIZE -+ bhi Invalid -+ -+ mvn r2,#0 -+ tst rRamEnd,#1 -+ strneb r2,[rRamEnd],#1 -+ tst rRamEnd,#2 -+ strneh r2,[rRamEnd],#2 -+ -+//1st verify that flash needs burned -+ mov lr,rRamSector -+1: ldr r2,[lr],#4 -+ ldr r3,[r1],#4 -+ cmp r2,r3 -+ bne 2f -+ cmp lr,rRamEnd -+ blo 1b -+ -+ cmp r5,#CMD_BURNALL -+ beq 3f -+ BigMov r0,L4(V,e,r,i) -+ bl Transmit1 -+ BigMov r0,L4(f,i,e,d) -+ bl Transmit1 -+ b Prompt -+2: -+ sub r1,r1,#4 -+ cmp r5,#CMD_VERIFY -+ bne 3f -+ sub r0,lr,#4 -+20: -+ bl Burn_error -+ b Prompt -+3: -+ mov rFlashSector,r1,LSR #18 -+ mov rFlashSector,rFlashSector,LSL #18 //round to 256k boundary -+ add rRamSector,rRamSector,rFlashSector -+ sub rRamSector,rRamSector,r4 -+ BigMov r3,MEMORY_CONTROL_BASE -+ tst rFlashSector,#1<<26 -+ ldr r1,[r3,#MSC0] -+ movne r1,r1,LSR #16 //nCS1 being used for flash -+ tst r1,#1<<3 //bit 3 - 1 means 16 bit mode -+ adr r4,Burn_Rtn32 -+ ldr r3,[r4] -+ BigMov r2,0xe58d5054 //NOTE: when 1st instruction of Burn_Rtn32 changes (or DBG_TEMP value), this must change as well -+ adrne r4,Burn_Rtn16 -+ -+ cmp r4,#MEM_START -+ bhs 10f -+//I must move the burn code, unless I'm only running from cache -+ cmp r2,r3 -+ bne 10f -+ tst r1,#1<<3 //bit 3 - 1 means 16 bit mode -+ BigAdd r1,r0,(-0x1000+((DEBUG_BASE+DBG_START)&0xfe0)-32) -+ moveq r3,#((Burn_Rtn_End-Burn_Rtn32)+0x1f)&(~0x1f) //round to 32 byte (cache line)boundary -+ movne r3,#((Burn_Rtn_End-Burn_Rtn16)+0x1f)&(~0x1f) //round to 32 byte (cache line)boundary -+ add r2,r4,r3 -+ sub r1,r1,r3 -+ mov r0,r1 -+4: ldr r3,[r4],#4 -+ str r3,[r1],#4 -+ cmp r4,r2 -+ blo 4b -+ -+ mov r4,r0 -+5: -+ CP15_CF_INVAL_ILINE mcr,r4 -+ add r4,r4,#32 -+ cmp r4,r1 -+ blo 5b -+ -+ CP15_CF_INVAL_BTB mcr,r4 -+ -+ CP15_CF_DRAIN mcr,r4 //data cache is disabled, but it should still drain first -+ CPWAIT r1 -+ -+ BigMov rFlashBase,FLASH_BASE_ADDRESS -+ mov rRet,#0 -+ blx r0 -+ b 20b //unknow Man/dev Id if it returns from here -+ -+10: -+//I'm running from ram, or from cache only -+ BigMov rFlashBase,FLASH_BASE_ADDRESS -+ adr rRet,11f -+ blx r4 -+ b 20b //unknow Man/dev Id if it returns from here -+11: b Prompt -+ -+ -+ -+ -+//BurnRtn istr,ildr,mask,shift,inc,plait -+Burn_Rtn32: -+ BurnRtn str,ldr,0xffffffff,0,0,4,0 -+Burn_Rtn16: -+#if 1 -+ BigMov r0,FLASH_STATUS_CLEAR_CMD&0xffff -+ strh r0,[rFlashBase,#0] -+ delay -+ BigMov r0,FLASH_ID_CMD&0xffff -+ strh r0,[rFlashBase,#0] -+ delay -+ ldrh r2,[rFlashBase,#2] -+ -+ BigMov r0,FLASH_READ_CMD&0xffff -+ strh r0,[rFlashBase,#0] -+ delayCnt r0,((40/10)*COUNT_MULT) -+ cmp r2,#0x16 -+ cmpne r2,#0x17 -+ cmpne r2,#0x18 -+ beq 99f -+//(PLATFORM_TYPE==GAME_CONTROLLER_PLAITED_A1) -+ BurnRtn strh,ldrh, 0xffff,0,1,4,1 //the plait version (a1 jumpered to a high address line) -+99: -+ BurnRtn strh,ldrh, 0xffff,1,1,2,0 //the non-plait version (a1 correct) -+#else -+ -+#if (PLATFORM_TYPE==GAME_CONTROLLER_PLAITED_A1) -+ BurnRtn strh,ldrh, 0xffff,0,1,4,1 //the plait version (a1 jumpered to a high address line) -+#else -+99: -+ BurnRtn strh,ldrh, 0xffff,1,1,2,0 //the non-plait version (a1 correct) -+#endif -+ -+#endif -+ -+Timeout: -+ BigMov r0,L4(T,i,m,e) -+ bl TransmitR -+ BigMov r0,L4(d,SPACE,o,u) -+ bl TransmitR -+ BigMov r0,L2(t,SPACE) -+ bl TransmitR -+ -+ mov r0,rRamSector -+ mov r1,rFlashSector -+ ldr r2,[r0] -+ ldr r3,[r1] -+ bl Burn_error -+ b Burn_return -+ -+ReturnError: -+ sub r0,r0,#4 -+ sub r1,r1,#4 -+ bl Burn_error -+ b Burn_return -+ -+PrintSector: -+ mov r5,lr -+ bl TransmitR_CRLF -+ BigMov r0,L4(S,e,c,t) -+ bl TransmitR -+ BigMov r0,L3(o,r,SPACE) -+ bl TransmitR -+ mov r0,rFlashSector -+ bl PrintHexR -+ mov r0,#L1(SPACE) -+ bl TransmitR -+ mov r0,rRamSector -+ mov r1,rFlashSector -+ mov pc,r5 -+ -+PrintErasing: -+ mov r5,lr -+ BigMov r0,L4(E,r,a,s) -+ bl TransmitR -+ BigMov r0,L4(i,n,g,SPACE) -+ mov lr,r5 -+ b TransmitR -+ -+PrintProgramming: -+ mov r5,lr -+ BigMov r0,L4(P,r,o,g) -+ bl TransmitR -+ BigMov r0,L4(r,a,m,m) -+ bl TransmitR -+ BigMov r0,L4(i,n,g,SPACE) -+ bl TransmitR -+ mov r0,rRamSector -+ mov r1,rFlashSector -+ mov pc,r5 -+ -+PrintVerifying: -+ mov r5,lr -+ BigMov r0,L4(V,e,r,i) -+ bl TransmitR -+ BigMov r0,L4(f,y,i,n) -+ bl TransmitR -+ BigMov r0,L4(g,PERIOD,PERIOD,PERIOD) -+ bl TransmitR -+ mov r0,rRamSector -+ mov r1,rFlashSector -+ mov pc,r5 -+ -+PrintSuccess: -+ bl TransmitR_CRLF -+ BigMov r0,L4(S,u,c,c) -+ bl TransmitR -+ BigMov r0,L3(e,s,s) -+ bl TransmitR -+// b Burn_return -+ -+Burn_return: -+ bl TransmitR_CRLF -+ bl WaitTxEmpty -+ movs rRet,rRet -+ CP15_CF_INVAL_BOTH mcreq,r1 //invalidate if return is reset vector -+ CPWAIT r1 -+ mov pc,rRet -+ -+Burn_error: -+ mov r8,lr -+ mov r5,r1 -+ mov sl,r2 -+ mov r7,r3 -+ bl PrintHexR -+ mov r0,#L1(COLON) -+ bl TransmitR -+ mov r0,sl -+ bl PrintHexR -+ bl TransmitSPACER -+ -+ mov r0,r5 -+ bl PrintHexR -+ mov r0,#L1(COLON) -+ bl TransmitR -+ mov r0,r7 -+ mov lr,r8 -+ b PrintHexR -+ -+ DEFINE_FLASH_GPIO_WAIT_FOR_IDLE -+ -+ -+WaitTxEmpty: -+1: ldr r1,[rUart,#UART_LSR] -+ ands r1,r1,#0x40 -+ beq 1b -+ mov pc,lr //return -+ -+TransmitSPACER: -+ mov r0,#L1(SPACE) -+ b TransmitR -+TransmitR_CRLF: -+ BigMov r1,L2(CR,LF) -+trR: -+ mov r0,r1 -+//IN: r0 - character to transmit -+//OUT: r0 - last character transmitted, r1 - trashed -+TransmitR: -+1: ldr r1,[rUart,#UART_LSR] -+ ands r1,r1,#0x20 -+ beq 1b -+ mov r1,r0 -+ and r1,r1,#0xff -+ str r1,[rUart,#UART_THR] -+ movs r1,r0,LSR #8 -+ bne trR -+ mov pc,lr //return -+//IN: r0 - value to print -+//OUT: r0-r4 trashed -+PrintHexR: -+ mov r2,#8 -+ mov r4,r0 -+ mov r3,lr -+1: mov r4,r4,ROR #28 -+ and r0,r4,#0xf -+ cmp r0,#0xA -+ addcs r0,r0,#L1(A)-0x0a -+ addcc r0,r0,#L1(0) -+ bl TransmitR -+ subs r2,r2,#1 -+ bne 1b -+ mov pc,r3 -+ -+Burn_Rtn_End: -+ -+ -+SSID_Cmd: -+ BigMov r0,L4(I,d,COLON,SPACE) -+ bl Transmit1 -+ bl CalcMemEnd -+ BigAdd r5,r0,(-0x1000+((DEBUG_BASE+DBG_START)&0xfff)-32) -+ mov r6,#31 -+1: bl Receive -+ beq 1b //br on timeout -+ cmp r0,#CR -+ beq 2f -+ strb r0,[r5],#1 -+ bl Transmit1 -+ subs r6,r6,#1 -+ bne 1b -+2: mov r0,#0 -+ strb r0,[r5],#1 -+ b Prompt -+ -+MAC_Cmd: -+ mov r2,#FUNC_REQ_MAC -+ b join_cmd -+Download_Wireless_Cmd: -+ tst rValidCnt,#F_NUM1_MASK -+ beq Invalid -+ tst rNum1,#3 -+ bne Invalid -+ cmp rNum1,#MEM_START -+ bcc Invalid //br if rNum1 is below ram start, -+ //NOTE: arm sets the carry to the opposite of most processors on subtract, compare -+ mov r2,#FUNC_REQ_DLW -+join_cmd: -+ bl TryRoutine -+ ldmia sp,{rPrevNum1,rUart,rDBG} -+ bl SetupATAG //dlw is now overwriting ATAG space, so set it again -+ b Prompt -+ -+//struct tag_mem32 { -+// u32 size; -+// u32 start; /* physical start address */ -+//}; -+ -+//out: r2,r7 - saved, r0 - CalcMemEnd return value -+SetupATAG: -+ mov r3,lr -+ bl CalcMemEnd -+ mov lr,r3 -+ BigMov r1,TAGGED_LIST -+ BigMov r3,2 -+ BigMov r4,ATAG_CORE -+ BigMov r5,4 -+ BigEor r6,r4,(ATAG_MEM^ATAG_CORE) -+ stmia r1!,{r3,r4,r5,r6} -+ BigMov r4,MEM_START -+ BigMov r5,0 -+ sub r3,r0,r4 -+ stmia r1,{r3,r4,r5} -+ mov pc,lr -+ -+ -+Gl_Cmd: -+ mov r2,#FUNC_REQ_PIC -+ bl TryRoutine -+ ldmia sp,{rPrevNum1,rUart,rDBG} -+ -+ BigMov r1,MACH_TYPE_SCANPASS -+ str r1,[rDBG,#DBG_R1] -+ mov r2,#FUNC_REQ_GL -+ bl TryRoutine -+ ldmia sp,{rPrevNum1,rUart,rDBG} -+ movs rNum1,r4 -+ bne Go_Cmd -+ b Prompt -+ -+//r2- function select -+TryRoutine: -+ mov r10,#0 -+ mov r7,lr -+ bl TryRoutine1 -+ b Invalid -+//r10- RCSR -+//r2- function select -+//r7- main return -+//lr- error return -+TryRoutine1: -+ adr r0,MiniDebugEnd -+ ldr r1,[r0] -+ BigMov r3,0xe1a08000 -+ cmp r1,r3 -+ movne pc,lr //failure return -+ bl SetupATAG //out: r0 - calcMemEnd return value -+ mov lr,r7 -+ -+ BigAdd r1,r0,(-0x1000+((DEBUG_BASE+DBG_START)&0xfff)-32) //@ssid -+ mov r0,r1 -+ stmdb r0!,{rPrevNum1,rUart,rDBG} -+ mov sp,r0 -+ mov fp,r0 -+ mov r0,rNum1 -+ adr r4,MiniDebugEnd -+ mov r3,#DEF_DISPLAY_INDEX -+ b HeadStart -+ -+ .ifdef __ARMASM -+ DUP 6,0xffffffff -+ align 256 -+ .else -+ .balignl 256,0xffffffff -+ .endif -+ -+MiniDebugEnd: -+//This is defined in head.S or minidebug.lds -+//HeadStart: -diff -u -r --new-file u-boot-1.1.2/cpu/pxa/ministart.S u-boot-1.1.2-neon/cpu/pxa/ministart.S ---- u-boot-1.1.2/cpu/pxa/ministart.S 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/cpu/pxa/ministart.S 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,270 @@ -+/* -+ * armboot - Startup Code for XScale -+ * -+ * Copyright (C) 1998 Dan Malek <dmalek@jlc.net> -+ * Copyright (C) 1999 Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se> -+ * Copyright (C) 2000 Wolfgang Denk <wd@denx.de> -+ * Copyright (C) 2001 Alex Zuepke <azu@sysgo.de> -+ * Copyright (C) 2002 Kyle Harris <kharris@nexus-tech.net> -+ * Copyright (C) 2003 Robert Schwebel <r.schwebel@pengutronix.de> -+ * Copyright (C) 2003 Kai-Uwe Bloem <kai-uwe.bloem@auerswald.de> -+ * -+ * See file CREDITS for list of people who contributed to this -+ * project. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include <config.h> -+#include <version.h> -+#include <asm/arch/pxaMacro.h> -+ -+#define Mode_SVC 0x13 -+#define NoIntsMask 0xc0 -+.globl _bss_start -+.globl _bss_end -+ -+//defined globals -+.globl HeadStart -+.globl _armboot_start -+ -+//r3 - display type -+HeadStart: -+ mov r8,r0 //there is a check for this instruction before jumping here -+ -+// ******************************************************************** -+// Set processor into Supervisior mode (SVC) and disable IRQ & FIQ -+// -+ mrs r0, CPSR -+ bic r0, r0,#0x1f -+ orr r0, r0,#(Mode_SVC | NoIntsMask) -+ msr cpsr_c, r0 -+//exit SDS, if currently active -+ msr SPSR, r0 -+ adr lr,1f -+ movs pc,lr -+1: -+ b relocate -+// ******************************************************************** -+_armboot_start: -+_TEXT_BASE: .word TEXT_BASE -+ -+_start_armboot: .word start_armboot -+/* -+ * These are defined in the board-specific linker script. -+ */ -+_bss_start: .word __bss_start -+_bss_end: .word _end -+ -+#ifdef CONFIG_USE_IRQ -+/* IRQ stack memory (calculated at run-time) */ -+.globl IRQ_STACK_START -+IRQ_STACK_START: -+ .word 0x0badc0de -+ -+/* IRQ stack memory (calculated at run-time) */ -+.globl FIQ_STACK_START -+FIQ_STACK_START: -+ .word 0x0badc0de -+#endif -+ -+relocate: /* relocate U-Boot to RAM */ -+ adr r0, HeadStart /* r0 <- current position of code */ -+ bic r0,r0,#0xff -+ bic r0,r0,#0xff00 //64k aligned -+ ldr r1, _TEXT_BASE -+ cmp r0, r1 /* don't reloc during debug */ -+ beq stack_setup -+ -+ ldr r2, _bss_start -+ -+copy_loop: -+ ldmia r0!, {r3-r10} /* copy from source address [r0] */ -+ stmia r1!, {r3-r10} /* copy to target address [r1] */ -+ cmp r1, r2 /* until dest end addreee [r2] */ -+ ble copy_loop -+ -+ /* Set up the stack */ -+stack_setup: -+ ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */ -+ BigSub2 r0,(CFG_MALLOC_LEN+CFG_GBL_DATA_SIZE+CFG_MMU_SPACE_RESERVED) //malloc area,bdinfo -+#ifdef CONFIG_USE_IRQ -+ sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) -+#endif -+ sub sp, r0, #12 /* leave 3 words for abort-stack */ -+ -+clear_bss: -+ ldr r0, _bss_start /* find start of bss segment */ -+ ldr r1, _bss_end /* stop here */ -+ mov r2, #0x00000000 /* clear */ -+ -+clbss_l:str r2, [r0] /* clear loop... */ -+ add r0, r0, #4 -+ cmp r0, r1 -+ bne clbss_l -+ bl dcache_enable -+ -+ ldr pc, _start_armboot -+ -+ -+FlushCache: -+ CP15_CONTROL mrc,r0 -+ tst r0, #4 //is data cache enabled -+ beq 2f -+// b 2f -+ mov r1, #2048 -+ add r0,pc,#0x20000 //make sure I don't alloc a line in this subroutine -+ BigBic2 r0, 0xffff -+1: CP15_CF_ALLOC_LINE mcr,r0 -+ add r0, r0, #0x20 -+ subs r1, r1, #1 -+ bne 1b -+ -+ CP15_CF_DRAIN mcr,r0 -+ CPWAIT r0 -+2: CP15_CF_INVAL_BOTH mcr,r0 -+ CPWAIT r0 -+ mov pc, lr -+ -+ -+ -+//void dcache_disable (void) -+.globl dcache_disable -+dcache_disable: -+ mov r3,lr -+ bl FlushCache -+ CP15_CONTROL mrc,r1 -+ -+ BigBic2 r1, 0x2805 //disable high vector, branch target buffer, disable data cache, MMU -+ .balignl 32,0xe1a00000 //cacheline boundary (32 bytes) -+ //Needed so that if new flash is burnt -+ //and flash != ram copy, -+ //mov pc, r3 will be in cache and execute correctly -+ //(r3 is 0) return to the reset vector -+ CP15_CONTROL mcr,r1 -+ CPWAIT r0 -+ mov pc, r3 -+ -+ -+//int dcache_status (void) -+.globl dcache_status -+dcache_status: -+ CP15_CONTROL mrc,r0 //get the control register -+ and r0,r0,#1 -+ mov pc,lr -+ -+#define MEM_START1 0xa0000000 -+#define MEM_END1 0xa4000000 -+//void dcache_enable (void) -+.globl dcache_enable -+dcache_enable: -+ stmdb sp!,{r5,r6,lr} -+ bl FlushCache -+#if !defined(CFG_MMU_SPACE_RESERVED) || (CFG_MMU_SPACE_RESERVED<(1<<14)) -+ mov r0,#1<<15 //16k plus alignment of 16k -+ bl malloc -+ add r6,r0,#(1<<14) //16k alignment -+ BigBic2 r6,(1<<14)-1 -+#else -+ ldr r6, _TEXT_BASE /* upper 128 KiB: relocated uboot */ -+ BigSub2 r6,(CFG_MMU_SPACE_RESERVED) //malloc area,bdinfo -+#endif -+ mov r2,r6 -+ add r5,r6,#(1<<14) //16k 1st level page table -+ BigMov r0,0x0402 //section descriptor, ap-01, privileged r/w -+ //map virt to phys 1-to-1, non-cache, non-bufferable -+1: str r0,[r2],#4 -+ add r0,r0,#1<<20 -+ cmp r2,r5 -+ bne 1b -+ -+ -+ mov r3,#MEM_END1 -+ add r5,r6,r3,LSR #(20-2) -+ add r1,r6,#(MEM_START1>>20)<<2 -+ BigMov r0,(MEM_START1&0xfff00000)+0x040A //cacheable (write through) -+2: str r0,[r1],#4 -+ cmp r1,r5 -+ addne r0,r0,#1<<20 -+ bne 2b -+ -+ BigMov r0,0xffffffff -+ CP15_DACR mcr,r0 -+ -+ CP15_TTBR mcr,r6 -+//enable MMU -+ CP15_TLB_UNLOCK_I mcr,r0 -+ CP15_TLB_UNLOCK_D mcr,r0 -+ CP15_TLB_INVAL_BOTH mcr,r0 -+ -+ CP15_CONTROL mrc,r1 //get the control register -+ BigOrr2 r1,0x201 // enable MMU, r bit -+ BigBic2 r1,0x100 // disable S bit, ap -0 means read only by all -+ CPWAIT r0 -+ CP15_CONTROL mcr,r1 //set the control register -+ CPWAIT r0 -+ -+//enable the instruction cache -+ CP15_CF_UNLOCK_I mcr,r0 -+// CP15_CF_INVAL_I mcr,r0 //I might be running from cache only, don't invalidate -+ -+ orr r1,r1,#0x1000 //set bit 12 -- the I bit -+ CP15_CONTROL mcr,r1 //set the control register -+ CPWAIT r0 -+ -+//enable the data cache -+// CP15_CF_UNLOCK_D mcr,r0 -+ CP15_CF_INVAL_D mcr,r0 //this will also drain write buffer -+ CP15_CF_DRAIN mcr,r0 //make sure it is drained just to be very safe -+ -+ orr r1,r1,#0x4 //set bit 4 -- the D bit -+ CP15_CONTROL mcr,r1 //set the control register -+ CPWAIT r0 -+ -+ BigMov r0,0x3fff -+ CP15_CP_ACCESS mcr,r0 //enable access to all coprocessors -+ ldmia sp!,{r5,r6,pc} -+ -+ -+ -+/****************************************************************************/ -+/* */ -+/* Reset function: the PXA250 doesn't have a reset function, so we have to */ -+/* perform a watchdog timeout for a soft reset. */ -+/* */ -+/****************************************************************************/ -+.globl reset_cpu -+ /* FIXME: this code is PXA250 specific. How is this handled on */ -+ /* other XScale processors? */ -+ -+reset_cpu: -+ BigMov r0,0x40a00000 //OSTIMER_BASE -+ /* We set OWE:WME (watchdog enable) and wait until timeout happens */ -+ -+ ldr r1, [r0, #OWER] -+ orr r1, r1, #0x0001 /* bit0: WME */ -+ str r1, [r0, #OWER] -+ -+ /* OS timer does only wrap every 1165 seconds, so we have to set */ -+ /* the match register as well. */ -+ -+ ldr r1, [r0, #OSCR] /* read OS timer */ -+ add r1, r1, #0x800 /* let OSMR3 match after */ -+ add r1, r1, #0x800 /* 4096*(1/3.6864MHz)=1ms */ -+ str r1, [r0, #OSMR3] -+ -+reset_endless: -+ b reset_endless -diff -u -r --new-file u-boot-1.1.2/cpu/pxa/mmc.c u-boot-1.1.2-neon/cpu/pxa/mmc.c ---- u-boot-1.1.2/cpu/pxa/mmc.c 2003-10-16 01:53:52.000000000 +0200 -+++ u-boot-1.1.2-neon/cpu/pxa/mmc.c 2007-08-11 21:07:20.000000000 +0200 -@@ -27,6 +27,7 @@ - #include <asm/errno.h> - #include <asm/arch/hardware.h> - #include <part.h> -+#include <command.h> - - #ifdef CONFIG_MMC - -@@ -47,9 +48,19 @@ - static uchar mmc_buf[MMC_BLOCK_SIZE]; - static mmc_csd_t mmc_csd; - static int mmc_ready = 0; -+static int isSD = 0 ; -+static int startBlock = 0 ; -+static ushort RCA = MMC_DEFAULT_RCA ; -+static struct partition part ; - -+static void stop_clock( void ) -+{ -+ MMC_STRPCL = MMC_STRPCL_STOP_CLK; -+ MMC_I_MASK = ~MMC_I_MASK_CLK_IS_OFF; -+ while (!(MMC_I_REG & MMC_I_REG_CLK_IS_OFF)); -+} - --static uchar * -+uchar * - /****************************************************/ - mmc_cmd(ushort cmd, ushort argh, ushort argl, ushort cmdat) - /****************************************************/ -@@ -59,9 +70,8 @@ - int words, i; - - debug("mmc_cmd %x %x %x %x\n", cmd, argh, argl, cmdat); -- MMC_STRPCL = MMC_STRPCL_STOP_CLK; -- MMC_I_MASK = ~MMC_I_MASK_CLK_IS_OFF; -- while (!(MMC_I_REG & MMC_I_REG_CLK_IS_OFF)); -+ stop_clock(); -+ - MMC_CMD = cmd; - MMC_ARGH = argh; - MMC_ARGL = argl; -@@ -71,9 +81,10 @@ - while (!(MMC_I_REG & MMC_I_REG_END_CMD_RES)); - - status = MMC_STAT; -- debug("MMC status %x\n", status); -+ debug("MMC status %lx\n", status); - if (status & MMC_STAT_TIME_OUT_RESPONSE) - { -+ printf( "mmc_cmd timeout: cmd: 0x%x, args: 0x%04x%04x, status 0x%lx\n", cmd, argh, argl, status ); - return 0; - } - -@@ -85,7 +96,7 @@ - break; - - case MMC_CMDAT_R2: -- words = 8; -+ words = 9; - break; - - default: -@@ -109,6 +120,22 @@ - return resp; - } - -+static void mmc_setblklen( ulong blklen ) -+{ -+ static ulong prevLen = -1UL ; -+ if( blklen != prevLen ) -+ { -+ ushort argh, argl ; -+ -+ argh = blklen >> 16; -+ argl = blklen & 0xffff; -+ -+ /* set block len */ -+ mmc_cmd( MMC_CMD_SET_BLOCKLEN, argh, argl, MMC_CMDAT_R1); -+ prevLen = blklen ; -+ } -+} -+ - int - /****************************************************/ - mmc_block_read(uchar *dst, ulong src, ulong len) -@@ -117,20 +144,18 @@ - uchar *resp; - ushort argh, argl; - ulong status; -+ unsigned char volatile *rxFIFO = (unsigned char *)&(MMC_RXFIFO); - - if (len == 0) - { - return 0; - } - -- debug("mmc_block_rd dst %lx src %lx len %d\n", (ulong)dst, src, len); -+ debug("mmc_block_rd dst %lx src %lx len %ld\n", (ulong)dst, src, len); - -- argh = len >> 16; -- argl = len & 0xffff; -- -- /* set block len */ -- resp = mmc_cmd(MMC_CMD_SET_BLOCKLEN, argh, argl, MMC_CMDAT_R1); -+ mmc_setblklen( len ); - -+ src += (startBlock*MMC_BLOCK_SIZE); - /* send read command */ - argh = src >> 16; - argl = src & 0xffff; -@@ -147,15 +172,14 @@ - { - if (MMC_I_REG & MMC_I_REG_RXFIFO_RD_REQ) - { -- *dst++ = MMC_RXFIFO; -- len--; -- } -- status = MMC_STAT; -- if (status & MMC_STAT_ERRORS) -- { -- printf("MMC_STAT error %lx\n", status); -- return -1; -+ int i, bytes = min(32,len); -+ len -= bytes; -+ -+ for (i=0; i<bytes; i++) -+ *dst++ = *rxFIFO ; - } -+ else if (MMC_STAT & MMC_STAT_ERRORS) -+ break; - } - MMC_I_MASK = ~MMC_I_MASK_DATA_TRAN_DONE; - while (!(MMC_I_REG & MMC_I_REG_DATA_TRAN_DONE)); -@@ -338,7 +362,7 @@ - aligned_end = mmc_block_address & end; - - /* all block aligned accesses */ -- debug("src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n", -+ debug("src %p dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n", - src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end); - if (part_start) - { -@@ -357,22 +381,22 @@ - dst += part_len; - src += part_len; - } -- debug("src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n", -+ debug("src %p dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n", - src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end); - for (; dst < aligned_end; src += mmc_block_size, dst += mmc_block_size) - { -- debug("al src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n", -+ debug("al src %p dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n", - src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end); - if ((mmc_block_write(dst, (uchar *)src, mmc_block_size)) < 0) - { - return -1; - } - } -- debug("src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n", -+ debug("src %p dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n", - src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end); - if (part_end && dst < end) - { -- debug("pe src %lx dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n", -+ debug("pe src %p dst %lx end %lx pstart %lx pend %lx astart %lx aend %lx\n", - src, (ulong)dst, end, part_start, part_end, aligned_start, aligned_end); - if ((mmc_block_read(mmc_buf, aligned_end, mmc_block_size)) < 0) - { -@@ -392,13 +416,324 @@ - mmc_bread(int dev_num, ulong blknr, ulong blkcnt, ulong *dst) - /****************************************************/ - { -+ debug( "read %lu blocks at block #%lu\n", blkcnt, blknr ); -+ -+ if( 0 < blkcnt ) -+ { -+ if( 0 != getenv( "mblock" ) ) -+ { - int mmc_block_size = MMC_BLOCK_SIZE; - ulong src = blknr * mmc_block_size + CFG_MMC_BASE; - - mmc_read(src, (uchar *)dst, blkcnt*mmc_block_size); -+ } -+ else -+ { -+ ulong src = (blknr+startBlock) * MMC_BLOCK_SIZE ; -+ ulong status ; -+ uchar *dstb = (uchar *)dst ; -+ unsigned char volatile *rxFIFO = (unsigned char *)&(MMC_RXFIFO); -+ -+ MMC_RDTO = 0xffff; -+ MMC_BLKLEN = MMC_BLOCK_SIZE ; -+ MMC_NOB = blkcnt ; -+ -+ mmc_setblklen( MMC_BLOCK_SIZE ); -+ mmc_cmd( MMC_CMD_RD_BLK_MULTI, -+ src >> 16, -+ src & 0xFFFF, -+ MMC_CMDAT_R1|MMC_CMDAT_READ|MMC_CMDAT_BLOCK|MMC_CMDAT_DATA_EN ); -+ -+ // read the data -+ for( blknr = 0 ; blknr < blkcnt ; blknr++ ) -+ { -+ unsigned len = MMC_BLOCK_SIZE ; -+ -+ while (len) -+ { -+ int i ; -+ MMC_I_MASK = ~MMC_I_MASK_RXFIFO_RD_REQ; -+ while( (MMC_I_REG & MMC_I_REG_RXFIFO_RD_REQ) == 0 ) -+ { -+ } -+ -+ for (i = 0; i < 32 ; i++ ) -+ { -+ *dstb++ = *rxFIFO ; -+ } -+ len -= 32 ; -+ } -+ } // for each block -+ -+ MMC_I_MASK = ~MMC_I_MASK_DATA_TRAN_DONE; -+ while (!(MMC_I_REG & MMC_I_REG_DATA_TRAN_DONE)); -+ status = MMC_STAT; -+ if (status & MMC_STAT_ERRORS) -+ { -+ printf("MMC_STAT error %lx\n", status); -+ return -1; -+ } -+// printf( "completed mread... now stop\n" ); -+ -+ mmc_cmd( MMC_CMD_STOP, 0, 0, MMC_CMDAT_R1); -+ -+ } // multi-block read -+ } // or why bother? - return blkcnt; - } - -+static void dumpResponse( uchar *resp, unsigned bytes ) -+{ -+ debug( "rsp: " ); -+ if( resp ) -+ { -+ while( bytes-- ) -+ debug( "%02X ", *resp++ ); -+ debug( "\n" ); -+ } -+ else -+ debug( "NULL\n" ); -+} -+ -+int SDCard_test( void ) -+{ -+ unsigned short response ; -+ unsigned long ignore ; -+ unsigned char *resp ; -+ -+ mmc_cmd(0, 0, 0, 0); -+ -+ resp = mmc_cmd(SD_APP_CMD55, 0, 0, MMC_CMDAT_R1); -+ if( !resp ) -+ { -+ printf( "SDInitErr1\n" ); -+ return -ENODEV ; -+ } -+ -+ resp = mmc_cmd(SD_APP_CMD41, 0x0020, 0, MMC_CMDAT_INIT|MMC_CMDAT_R1); -+ if( !resp ) -+ { -+ printf( "SDInitErr2\n" ); -+ return -ENODEV ; -+ } -+ -+ memcpy( &response, resp, sizeof( response ) ); -+ -+ while (response != 0x3f80)//continue doing ACMD1 until busy bit in response is set -+ { -+ //CMD55 APP_CMD -+ MMC_STRPCL = 0x00000001;//stop clock -+ while ((MMC_STAT & 0x00000100) == 0x00000100); //wait for clock to stop -+ MMC_CMD = 0x00000037;//CMD55 index APP_CMD -+ MMC_ARGH = 0x00000000;//relative card address 0x0 -+ MMC_ARGL = 0x00000000;//stuff bits -+ MMC_CMDAT = 0x00000001;//expect response 1 -+ MMC_STRPCL = 0x00000002;//start clock -+ while ((MMC_STAT & 0x00002000) == 0x00000000);//wait for end_cmd_res -+ //read response FIFO -+ response = MMC_RES & 0x0000ffff ; -+ ignore = MMC_RES ; -+ ignore = MMC_RES ; -+ -+ //ACMD41 -+ MMC_STRPCL = 0x00000001;//stop clock -+ while ((MMC_STAT & 0x00000100) == 0x00000100); //wait for clock to stop -+ MMC_CMD = 0x00000029;//ACMD41 index SD_APP_SEND_OP_COND -+ MMC_ARGH = 0x00000020;//set voltage limit of system in command argument -+ MMC_ARGL = 0x00000000; -+ MMC_CMDAT = 0x00000003;//expect response 3 -+ MMC_STRPCL = 0x00000002;//start clock -+ while ((MMC_STAT & 0x00002000) == 0x00000000);//wait for end_cmd_res -+ -+ //read response FIFO -+ response = MMC_RES & 0x0000ffff ; -+ ignore = MMC_RES ; -+ ignore = MMC_RES ; -+ } -+ -+ return 0 ; -+} -+ -+#ifdef DEBUG -+static void print_mmc_csd( struct mmc_csd *csd ) -+{ -+ printf( "ecc: %u\n", csd->ecc ); -+ printf( "file_format: %u\n", csd->file_format ); -+ printf( "tmp_write_protect: %u\n", csd->tmp_write_protect ); -+ printf( "perm_write_protect: %u\n", csd->perm_write_protect ); -+ printf( "copy: %u\n", csd->copy ); -+ printf( "file_format_grp: %u\n", csd->file_format_grp ); -+ printf( "content_prot_app: %u\n", csd->content_prot_app ); -+ printf( "rsvd3: %u\n", csd->rsvd3 ); -+ printf( "write_bl_partial: %u\n", csd->write_bl_partial ); -+ printf( "write_bl_len: %u\n", csd->write_bl_len ); -+ printf( "r2w_factor: %u\n", csd->r2w_factor ); -+ printf( "default_ecc: %u\n", csd->default_ecc ); -+ printf( "wp_grp_enable: %u\n", csd->wp_grp_enable ); -+ printf( "wp_grp_size: %u\n", csd->wp_grp_size ); -+ printf( "erase_grp_mult: %u\n", csd->erase_grp_mult ); -+ printf( "erase_grp_size: %u\n", csd->erase_grp_size ); -+ printf( "c_size_mult1: %u\n", csd->c_size_mult1 ); -+ printf( "vdd_w_curr_max: %u\n", csd->vdd_w_curr_max ); -+ printf( "vdd_w_curr_min: %u\n", csd->vdd_w_curr_min ); -+ printf( "vdd_r_curr_max: %u\n", csd->vdd_r_curr_max ); -+ printf( "vdd_r_curr_min: %u\n", csd->vdd_r_curr_min ); -+ printf( "c_size: %u\n", csd->c_size ); -+ printf( "rsvd2: %u\n", csd->rsvd2 ); -+ printf( "dsr_imp: %u\n", csd->dsr_imp ); -+ printf( "read_blk_misalign: %u\n", csd->read_blk_misalign ); -+ printf( "write_blk_misalign: %u\n", csd->write_blk_misalign ); -+ printf( "read_bl_partial: %u\n", csd->read_bl_partial ); -+ printf( "read_bl_len: %u\n", csd->read_bl_len ); -+ printf( "ccc: %u\n", csd->ccc ); -+ printf( "tran_speed %u\n", csd->tran_speed ); -+ printf( "nsac; %u\n", csd->nsac ); -+ printf( "taac; %u\n", csd->taac ); -+ printf( "rsvd1: %u\n", csd->rsvd1 ); -+ printf( "spec_vers: %u\n", csd->spec_vers ); -+ printf( "csd_structure: %u\n", csd->csd_structure ); -+} -+#endif -+ -+#define DOS_PART_MAGIC_OFFSET 0x1fe -+#define DOS_FS_TYPE_OFFSET 0x36 -+#define MSDOS_LABEL_MAGIC1 0x55 -+#define MSDOS_LABEL_MAGIC2 0xAA -+ -+struct bpb { // see http://staff.washington.edu/dittrich/misc/fatgen103.pdf -+ unsigned char jump[3]; -+ char oemName[8]; -+ unsigned short bytesPerSector ; -+ unsigned char sectorsPerCluster ; -+ unsigned short reservedSectorCount ; -+ unsigned char numFats ; -+ unsigned short rootEntCount ; -+ unsigned short totalSec16 ; -+ unsigned char media ; // 0xF8 -+ unsigned short fatSz16 ; -+ unsigned short secPerTrack ; -+ unsigned short numHeads ; -+ unsigned long hiddenSectors ; -+ unsigned long totalSectors32 ; -+ unsigned char driveNum ; -+ unsigned char reserved1 ; // 0x00 -+ unsigned char bootSig ; // 0x29 -+ unsigned long volumeId ; -+ char volumeLabel[11]; -+ char fileSysType[8]; -+} __attribute__((packed)); -+ -+#define isprint(__c) (((__c)>=0x20)&&((__c)<=0x7f)) -+ -+static int find_mbr( int max_blocks ) -+{ -+ int i ; -+ ulong addr = 0 ; -+ -+printf( "---- searching %d blocks for MBR\n", max_blocks ); -+ -+ for( i = 0 ; i < 10 ; i++, addr += MMC_BLOCK_SIZE ) -+ { -+ uchar data[MMC_BLOCK_SIZE]; -+ if( 0 == mmc_block_read(data, addr, sizeof(data) )) -+ { -+ memcpy( &part, data+0x1be, sizeof(part)); -+ if( ( data[DOS_PART_MAGIC_OFFSET] == MSDOS_LABEL_MAGIC1 ) -+ && -+ ( data[DOS_PART_MAGIC_OFFSET + 1] == MSDOS_LABEL_MAGIC2 ) ) -+ { -+ if( ( ('\x00' == part.boot_ind ) -+ || -+ ('\x80' == part.boot_ind ) ) -+ && -+ ( 10 > part.head ) -+ && -+ ( part.end_head >= part.head ) ) -+ { -+ printf( "partition info found at block %u\n", i ); -+ printf( "boot:%02x head:%02x sec:%02x cyl:%02x sys:%02x endh:%02x ends:%02x endc:%02x start:%08x, count:%08x\n", -+ part.boot_ind, part.head, part.sector, part.cyl, -+ part.sys_ind, part.end_head, part.end_sector, part.end_cyl, -+ part.start_sect, part.nr_sects ); -+ printf( "MBR found at block %d\n", i ); -+ return part.start_sect ; -+ } -+ else { -+ struct bpb const *bootParams = (struct bpb *)data ; -+ unsigned j ; -+ for( j = 0 ; j < sizeof(data); j++ ) -+ { -+ if( 0 == ( j & 0x0f ) ) -+ printf( "%04x ", j ); -+ printf( "%02x ", data[j] ); -+ if( 7 == ( j & 7 ) ) -+ printf( " " ); -+ if( 0x0f == ( j & 0x0f ) ) -+ { -+ unsigned b ; -+ for( b = j-15 ; b <= j ; b++ ) -+ { -+ uchar c = data[b]; -+ if( isprint(c) ) -+ printf( "%c", c ); -+ else -+ printf( "." ); -+ if( 7 == ( b & 7 ) ) -+ printf( " " ); -+ } -+ printf( "\n" ); -+ } -+ } -+ printf( "Invalid MBR\n" ); -+ printf( "---> Boot Parameter block\n" ); -+ printf( "jump %02x %02x %02x\n", bootParams->jump[0],bootParams->jump[1],bootParams->jump[2]); -+ printf( "bytesPerSector: %04x\n", bootParams->bytesPerSector ); -+ printf( "sectorsPerCluster: %02x\n", bootParams->sectorsPerCluster ); -+ printf( "reservedSectors %04x\n", bootParams->reservedSectorCount ); -+ printf( "numFats: %02x\n", bootParams->numFats ); -+ printf( "rootEntCount: %04x\n", bootParams->rootEntCount ); -+ printf( "totalSec16: %04x\n", bootParams->totalSec16 ); -+ printf( "media: %02x\n", bootParams->media ); -+ printf( "fatsz16: %04x", bootParams->fatSz16 ); -+ printf( "secPerTrack: %04x\n", bootParams->secPerTrack ); -+ printf( "numHeads = %04x\n", bootParams->numHeads ); -+ printf( "hidden = %08lx\n", bootParams->hiddenSectors ); -+ printf( "totalSec32 = %08lx\n", bootParams->totalSectors32 ); -+ printf( "drive #%u\n", bootParams->driveNum ); -+ printf( "reserved1: %02x\n", bootParams->reserved1 ); -+ printf( "bootSig: %02x\n", bootParams->bootSig ); -+ printf( "volume: %08lx\n", bootParams->volumeId ); -+ part.boot_ind = 0 ; -+ part.head = 0 ; -+ part.sector = 2 ; -+ part.cyl = 0 ; -+ part.sys_ind = 6 ; -+ part.end_head = bootParams->numHeads ; -+ part.end_sector = 0xe0 ; -+ part.end_cyl = 0xc9 ; -+ part.start_sect = 0 ; -+ part.nr_sects = bootParams->totalSectors32 ; -+ printf( "partition info found at block %u\n", i ); -+ printf( "boot:%02x head:%02x sec:%02x cyl:%02x sys:%02x endh:%02x ends:%02x endc:%02x start:%08x, count:%08x\n", -+ part.boot_ind, part.head, part.sector, part.cyl, -+ part.sys_ind, part.end_head, part.end_sector, part.end_cyl, -+ part.start_sect, part.nr_sects ); -+ printf( "MBR found at block %d\n", i ); -+ return 0 ; -+ } -+ } -+ } -+ else -+ { -+ printf( "!!! Error reading mmc block %u\n", i ); -+ break; -+ } -+ } -+ -+ printf( "MBR not found!\n" ); -+ return -1 ; -+} -+ - int - /****************************************************/ - mmc_init(int verbose) -@@ -406,7 +741,8 @@ - { - int retries, rc = -ENODEV; - uchar *resp; -- -+ mmc_cid_t *cid ; -+ mmc_csd_t *csd ; - #ifdef CONFIG_LUBBOCK - set_GPIO_mode( GPIO6_MMCCLK_MD ); - set_GPIO_mode( GPIO8_MMCCS0_MD ); -@@ -419,23 +755,63 @@ - MMC_RESTO = MMC_RES_TO_MAX; - MMC_SPI = MMC_SPI_DISABLE; - -+ if( 0 == SDCard_test() ) -+ { -+ printf( "SD card detected!\n" ); -+ isSD = 1 ; -+ } -+ else -+ { -+ isSD = 0 ; -+ - /* reset */ -- retries = 10; -- resp = mmc_cmd(0, 0, 0, 0); -+ mmc_cmd(0, 0, 0, 0); - resp = mmc_cmd(1, 0x00ff, 0xc000, MMC_CMDAT_INIT|MMC_CMDAT_BUSY|MMC_CMDAT_R3); -- while (retries-- && resp && !(resp[4] & 0x80)) -+ if( 0 == resp ) -+ { -+ printf( "MMC CMD1 error\n" ); -+ return -1 ; -+ } -+ -+ printf( "init: " ); dumpResponse( resp, 6 ); -+ retries = 0 ; -+ do - { -- debug("resp %x %x\n", resp[0], resp[1]); -- udelay(50); -+ udelay(100); - resp = mmc_cmd(1, 0x00ff, 0xff00, MMC_CMDAT_BUSY|MMC_CMDAT_R3); -+ debug( "cmd1: " ); dumpResponse( resp, 6 ); -+ retries++ ; -+ } while( resp && ( 0 == ( resp[4] & 0x80 ) ) ); -+ -+ if( 0 == resp ) -+ { -+ printf( "MMC CMD1 error2\n" ); -+ return -1 ; -+ } -+ -+ do { -+ udelay(100); -+ resp = mmc_cmd(1, 0x00ff, 0xff00, MMC_CMDAT_BUSY|MMC_CMDAT_R3); -+ debug( "cmd1: " ); dumpResponse( resp, 6 ); -+ retries++ ; -+ } while( resp && ( 0 != ( resp[4] & 0x80 ) ) ); -+ -+ printf( "after busy: %s, %d retries\n", -+ resp ? "have INIT response" -+ : "no INIT response", -+ retries ); - } - - /* try to get card id */ - resp = mmc_cmd(2, 0, 0, MMC_CMDAT_R2); -- if (resp) -+ if( !resp ) - { -+ printf( "Bad CMDAT_R2 response\n" ); -+ return -1 ; -+ } -+ - /* TODO configure mmc driver depending on card attributes */ -- mmc_cid_t *cid = (mmc_cid_t *)resp; -+ cid = (mmc_cid_t *)resp; - if (verbose) - { - printf("MMC found. Card desciption is:\n"); -@@ -449,6 +825,12 @@ - printf("Month = %d\n",cid->month); - printf("Year = %d\n",1997 + cid->year); - } -+ sprintf(mmc_dev.product,"%s",cid->name); -+ sprintf(mmc_dev.vendor,"Man %02x%02x%02x Snr %02x%02x%02x", -+ cid->id[0], cid->id[1], cid->id[2], -+ cid->sn[0], cid->sn[1], cid->sn[2]); -+ sprintf(mmc_dev.revision,"%x %x",cid->hwrev, cid->fwrev); -+ - /* fill in device description */ - mmc_dev.if_type = IF_TYPE_MMC; - mmc_dev.dev = 0; -@@ -457,30 +839,118 @@ - /* FIXME fill in the correct size (is set to 32MByte) */ - mmc_dev.blksz = 512; - mmc_dev.lba = 0x10000; -- sprintf(mmc_dev.vendor,"Man %02x%02x%02x Snr %02x%02x%02x", -- cid->id[0], cid->id[1], cid->id[2], -- cid->sn[0], cid->sn[1], cid->sn[2]); -- sprintf(mmc_dev.product,"%s",cid->name); -- sprintf(mmc_dev.revision,"%x %x",cid->hwrev, cid->fwrev); - mmc_dev.removable = 0; - mmc_dev.block_read = mmc_bread; - - /* MMC exists, get CSD too */ - resp = mmc_cmd(MMC_CMD_SET_RCA, MMC_DEFAULT_RCA, 0, MMC_CMDAT_R1); -- resp = mmc_cmd(MMC_CMD_SEND_CSD, MMC_DEFAULT_RCA, 0, MMC_CMDAT_R2); -- if (resp) -+ -+ if( resp ) - { -- mmc_csd_t *csd = (mmc_csd_t *)resp; -- memcpy(&mmc_csd, csd, sizeof(csd)); -- rc = 0; -- mmc_ready = 1; -- /* FIXME add verbose printout for csd */ -+ if( isSD ) -+ RCA = ((ushort)resp[4] << 8 ) | resp[3]; -+ else -+ RCA = MMC_DEFAULT_RCA ; - } -+ else -+ { -+ printf( "no SET_RCA response\n" ); -+ return -1 ; - } - -+#if 0 -+/* -+ * According to a Toshiba doc, the following is supposed to give -+ * the size of the 'protected' area (so we can ignore it). -+ -+ * Unfortunately, I can't get the numbers to add up, so we walk -+ * til we find an MBR instead. -+ */ -+ if( isSD ) -+ { -+ printf( "sending CMD55\n" ); -+ resp = mmc_cmd(SD_APP_CMD55, RCA, 0, MMC_CMDAT_R1); -+ if( !resp ) -+ { -+ printf( "Error 0x%04x sending APP CMD\n", MMC_STAT ); -+ return -1 ; -+ } -+ else -+ { -+ printf( "have CMD55 response\n" ); -+ memset( resp, 0, 20 ); -+ } -+ -+ resp = mmc_cmd(SD_STATUS, RCA, 0, MMC_CMDAT_R1 ); -+ if( resp ) -+ { -+ sd_status_t *status ; -+ int i ; -+ printf( "SDSTATUS returned\n" ); -+ for( i = 0 ; i < 16 ; i++ ) -+ printf( "%02x ", resp[i] ); -+ printf( "\n" ); -+ status = (sd_status_t *)resp ; -+ printf( "bus_width: %u\n", status->bus_width ); -+ printf( "secured_mode: %u\n", status->secured_mode ); -+ printf( "unused0: %x\n", status->unused0 ); -+ printf( "card_type: %x\n", status->card_type ); -+ printf( "prot_size: %lx\n", status->prot_size ); -+ } -+ else -+ { -+ printf( "Error reading SD_STATUS\n" ); -+ return -1 ; -+ } -+ } -+#endif -+ -+ MMC_STRPCL = MMC_STRPCL_STOP_CLK; -+ MMC_I_MASK = ~MMC_I_MASK_CLK_IS_OFF; -+ while (!(MMC_I_REG & MMC_I_REG_CLK_IS_OFF)); -+ - MMC_CLKRT = 0; /* 20 MHz */ -- resp = mmc_cmd(7, MMC_DEFAULT_RCA, 0, MMC_CMDAT_R1); -+ resp = mmc_cmd(7, RCA, 0, MMC_CMDAT_R1); -+ if( !resp ) -+ { -+ printf( "Error selecting RCA %x\n", RCA ); -+ return -1 ; -+ } -+ -+ resp = mmc_cmd(7, 0, 0, MMC_CMDAT_R1); -+ if( !resp ) -+ { -+ // this is normal -+ } -+ -+ resp = mmc_cmd(MMC_CMD_SEND_CSD, RCA, 0, MMC_CMDAT_R2); -+ if (!resp) -+ { -+ printf( "Error reading CSD\n" ); -+ return -1 ; -+ } -+ -+ csd = (mmc_csd_t *)resp; -+ memcpy(&mmc_csd, csd, sizeof(*csd)); -+ rc = 0; -+ -+#ifdef DEBUG -+ dumpResponse( resp, sizeof( *csd ) ); -+ print_mmc_csd( csd ); -+#endif -+ -+ resp = mmc_cmd(7, RCA, 0, MMC_CMDAT_R1); -+ if( !resp ) -+ { -+ printf( "Error selecting RCA %x\n", RCA ); -+ return -1 ; -+ } -+ -+ mmc_ready = 1; -+ startBlock = find_mbr(mmc_csd.c_size); - -+ printf( "registering device: startBlock == %d, isSD ? %s\n", -+ startBlock, isSD ? "yes" : "no" ); - fat_register_device(&mmc_dev,1); /* partitions start counting with 1 */ - - return rc; -@@ -503,4 +973,41 @@ - return 0; - } - -+#if (CONFIG_COMMANDS & CFG_CMD_MMC) -+ -+int do_mmc_detect (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -+{ -+ unsigned long gplr1 = GPLR1 ; -+ int rval = ( 0 != (gplr1 & 0x10) ); -+#ifdef DEBUG -+ printf ("Checking for MMC card: %lx, %d\n", gplr1, rval ); -+#endif -+ return rval ; -+} -+ -+U_BOOT_CMD( -+ mmcdet, 1, 0, do_mmc_detect, -+ "mmcdet - detect mmc card\n", -+ NULL -+); -+ -+int do_mmc_wp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) -+{ -+ unsigned long gplr1 = GPLR1 ; -+ int rval = ( 0 == (gplr1 & 0x40) ); -+#ifdef DEBUG -+ printf ("Checking MMC write protect: %lx, %d\n", gplr1, rval ); -+#endif -+ return rval ; -+} -+ -+U_BOOT_CMD( -+ mmcwp, 1, 0, do_mmc_wp, -+ "mmcwp - detect mmc write protect\n", -+ NULL -+); -+ -+#endif -+ - #endif -+ -diff -u -r --new-file u-boot-1.1.2/cpu/pxa/pxafb.c u-boot-1.1.2-neon/cpu/pxa/pxafb.c ---- u-boot-1.1.2/cpu/pxa/pxafb.c 2004-10-10 01:26:00.000000000 +0200 -+++ u-boot-1.1.2-neon/cpu/pxa/pxafb.c 2007-08-11 21:07:20.000000000 +0200 -@@ -36,6 +36,10 @@ - #include <lcd.h> - #include <asm/arch/pxa-regs.h> - -+#ifdef CFG_CMD_LCDPANEL -+#include <lcd_panels.h> -+#endif -+ - /* #define DEBUG */ - - #ifdef CONFIG_LCD -@@ -147,6 +151,38 @@ - #endif /* CONFIG_HITACHI_SX14 */ - - /*----------------------------------------------------------------------*/ -+#ifdef CONFIG_SHARP_QVGA -+/* Sharp 1/4 VGA LCD */ -+#define LCD_BPP LCD_COLOR8 -+ -+/* you have to set lccr0 and lccr3 (including pcd) */ -+#define REG_LCCR0 0x003008F8 -+#define REG_LCCR3 (0x0040FF0C|(LCD_BPP<<24)) -+ -+vidinfo_t panel_info = { -+ vl_col: 320, -+ vl_row: 240, -+ vl_width: 167, -+ vl_height: 109, -+ vl_clkp: CFG_HIGH, -+ vl_oep: CFG_HIGH, -+ vl_hsp: CFG_HIGH, -+ vl_vsp: CFG_HIGH, -+ vl_dp: CFG_HIGH, -+ vl_bpix: LCD_BPP, -+ vl_lbw: 1, -+ vl_splt: 0, -+ vl_clor: 1, -+ vl_tft: 1, -+ vl_hpw: 64, -+ vl_blw: 34, -+ vl_elw: 1, -+ vl_vpw: 20, -+ vl_bfw: 8, -+ vl_efw: 3, -+}; -+#endif /* CONFIG_SHARP_QVGA */ -+ - - #if LCD_BPP == LCD_COLOR8 - void lcd_setcolreg (ushort regno, ushort red, ushort green, ushort blue); -@@ -163,7 +199,6 @@ - void lcd_ctrl_init (void *lcdbase); - void lcd_enable (void); - --int lcd_line_length; - int lcd_color_fg; - int lcd_color_bg; - -@@ -185,10 +220,28 @@ - - void lcd_ctrl_init (void *lcdbase) - { -+#ifdef CFG_CMD_LCDPANEL -+ char const *panelName = getenv( "panel" ); -+ if( panelName ) -+ { -+ struct lcd_panel_info_t const *panel ; -+ panel = find_lcd_panel( panelName ); -+ if( panel ) -+ { -+ printf( "panel %s found: %u x %u\n", panelName, panel->xres, panel->yres ); -+ panel_info.pxa.screen = (u_long)lcdbase; -+ set_lcd_panel( panel ); -+ } -+ else -+ printf( "panel %s not found\n", panelName ); -+ } -+#else - pxafb_init_mem(lcdbase, &panel_info); - pxafb_init(&panel_info); - pxafb_setup_gpio(&panel_info); - pxafb_enable_controller(&panel_info); -+#endif -+ - } - - /*----------------------------------------------------------------------*/ -@@ -204,6 +257,7 @@ - void - lcd_setcolreg (ushort regno, ushort red, ushort green, ushort blue) - { -+#if defined( CONFIG_PXA250 ) - struct pxafb_info *fbi = &panel_info.pxa; - unsigned short *palette = (unsigned short *)fbi->palette; - u_int val; -@@ -219,7 +273,22 @@ - palette[regno] = val; - #endif - } -+#elif defined( CONFIG_PXA270 ) -+ struct pxafb_info *fbi = &panel_info.pxa; -+ u32 *palette = (u32 *)fbi->palette; -+ u32 val; -+ -+ if (regno < fbi->palette_size) { -+ val = 0xFF000000 ; // transparency -+ val |= (red << 16); -+ val |= (green << 8); -+ val |= blue ; - -+ palette[regno] = val; -+ } -+#else -+#error no processor defined -+#endif - debug ("setcolreg: reg %2d @ %p: R=%02X G=%02X B=%02X => %04X\n", - regno, &palette[regno], - red, green, blue, -@@ -284,7 +353,7 @@ - fbi->screen = (u_long)lcdbase; - - fbi->palette_size = NBITS(vid->vl_bpix) == 8 ? 256 : 16; -- palette_mem_size = fbi->palette_size * sizeof(u16); -+ palette_mem_size = fbi->palette_size * sizeof(PALETTEVAL_TYPE); - - debug("palette_mem_size = 0x%08lx\n", (u_long) palette_mem_size); - /* locate palette and descs at end of page following fb */ -@@ -376,11 +445,16 @@ - static int pxafb_init (vidinfo_t *vid) - { - struct pxafb_info *fbi = &vid->pxa; -+ unsigned long const REG_LCCR3 = 0x0040FF0C|(LCD_BPP<<24); - - debug("Configuring PXA LCD\n"); - -- fbi->reg_lccr0 = REG_LCCR0; -- fbi->reg_lccr3 = REG_LCCR3; -+#if defined( CONFIG_PXA270 ) -+ LCCR4 = 0x00010000 ; -+#endif -+ -+ fbi->reg_lccr0 = 0x003008F8; -+ fbi->reg_lccr3 = REG_LCCR3 ; - - debug("vid: vl_col=%d hslen=%d lm=%d rm=%d\n", - vid->vl_col, vid->vl_hpw, -@@ -429,7 +503,7 @@ - - fbi->dmadesc_palette->fsadr = fbi->palette; - fbi->dmadesc_palette->fidr = 0; -- fbi->dmadesc_palette->ldcmd = (fbi->palette_size * 2) | LDCMD_PAL; -+ fbi->dmadesc_palette->ldcmd = (fbi->palette_size * sizeof(PALETTEVAL_TYPE)) | LDCMD_PAL; - - if( NBITS(vid->vl_bpix) < 12) - { -@@ -465,6 +539,39 @@ - return 0; - } - -+ -+#ifdef CFG_CMD_LCDPANEL -+ -+void set_lcd_panel( struct lcd_panel_info_t const *panel ) -+{ -+ panel_info.vl_col = panel->xres ; -+ panel_info.vl_row = panel->yres ; -+ panel_info.vl_clkp = panel->act_high ; -+ panel_info.vl_oep = panel->act_high ; -+ panel_info.vl_hsp = panel->act_high ; -+ panel_info.vl_vsp = panel->act_high ; -+ panel_info.vl_dp = panel->act_high ; -+ panel_info.vl_bpix = LCD_BPP ; -+ panel_info.vl_lcd_line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) >> 3; -+ panel_info.vl_lbw = 1 ; -+ panel_info.vl_splt = 0 ; -+ panel_info.vl_clor = 1 ; -+ panel_info.vl_tft = panel->active ; -+ panel_info.vl_hpw = panel->hsync_len ; -+ panel_info.vl_blw = panel->left_margin ; -+ panel_info.vl_elw = panel->right_margin ; -+ panel_info.vl_vpw = panel->vsync_len ; -+ panel_info.vl_bfw = panel->upper_margin ; -+ panel_info.vl_efw = panel->lower_margin ; -+ -+ pxafb_init_mem( (void *)panel_info.pxa.screen, &panel_info); -+ pxafb_init(&panel_info); -+ pxafb_setup_gpio(&panel_info); -+ pxafb_enable_controller(&panel_info); -+} -+ -+#endif // dynamic LCD panel support -+ - /************************************************************************/ - /************************************************************************/ - -diff -u -r --new-file u-boot-1.1.2/cpu/pxa/sm501_usb.h u-boot-1.1.2-neon/cpu/pxa/sm501_usb.h ---- u-boot-1.1.2/cpu/pxa/sm501_usb.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/cpu/pxa/sm501_usb.h 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,66 @@ -+#ifndef SM501_USB_INCLUDED -+#define SM501_USB_INCLUDED -+ -+ #if defined(CONFIG_SM501) -+ #define USB_GATE_MODE0 __REG(0xFE00040) -+ #define USB_GATE_MODE1 __REG(0xFE00048) -+ #define ENABLE_USBH (1<<11) -+ -+ /* -+ * USB Host Controller -+ */ -+ #define USBH_BASE 0xFE40000 -+ #define UHCREV __REG(0xFE40000) -+ #define UHCHCON __REG(0xFE40004) -+ #define UHCCOMS __REG(0xFE40008) -+ #define UHCINTS __REG(0xFE4000C) -+ #define UHCINTE __REG(0xFE40010) -+ #define UHCINTD __REG(0xFE40014) -+ #define UHCHCCA __REG(0xFE40018) -+ #define UHCPCED __REG(0xFE4001C) -+ #define UHCCHED __REG(0xFE40020) -+ #define UHCCCED __REG(0xFE40024) -+ #define UHCBHED __REG(0xFE40028) -+ #define UHCBCED __REG(0xFE4002C) -+ #define UHCDHEAD __REG(0xFE40030) -+ #define UHCFMI __REG(0xFE40034) -+ #define UHCFMR __REG(0xFE40038) -+ #define UHCFMN __REG(0xFE4003C) -+ #define UHCPERS __REG(0xFE40040) -+ #define UHCLST __REG(0xFE40044) -+ #define UHCRHDA __REG(0xFE40048) -+ #define UHCRHDB __REG(0xFE4004C) -+ #define UHCRHS __REG(0xFE40050) -+ #define UHCRHPS1 __REG(0xFE40054) -+ #define UHCRHPS2 __REG(0xFE40058) -+ #define UHCRHPS3 __REG(0xFE4005C) -+ #define UHCSTAT __REG(0xFE40060) -+ #define UHCHR __REG(0xFE40064) -+ #define UHCHIE __REG(0xFE40068) -+ #define UHCHIT __REG(0xFE4006C) -+ -+ #define UHCHR_FSBIR (1<<0) -+ #define UHCHR_FHR (1<<1) -+ #define UHCHR_CGR (1<<2) -+ #define UHCHR_SSDC (1<<3) -+ #define UHCHR_UIT (1<<4) -+ #define UHCHR_SSE (1<<5) -+ #define UHCHR_PSPL (1<<6) -+ #define UHCHR_PCPL (1<<7) -+ #define UHCHR_SSEP0 (1<<9) -+ #define UHCHR_SSEP1 (1<<10) -+ #define UHCHR_SSEP2 (1<<11) -+ -+ #define UHCHIE_UPRIE (1<<13) -+ #define UHCHIE_UPS2IE (1<<12) -+ #define UHCHIE_UPS1IE (1<<11) -+ #define UHCHIE_TAIE (1<<10) -+ #define UHCHIE_HBAIE (1<<8) -+ #define UHCHIE_RWIE (1<<7) -+ -+ #define UHCCOMS_HCR 1 -+ #define UHCRHS_LPS 1 -+ #define UHCHR_SSE (1<<5) -+ -+ #endif -+#endif -diff -u -r --new-file u-boot-1.1.2/cpu/pxa/start.S u-boot-1.1.2-neon/cpu/pxa/start.S ---- u-boot-1.1.2/cpu/pxa/start.S 2004-06-09 02:11:02.000000000 +0200 -+++ u-boot-1.1.2-neon/cpu/pxa/start.S 2007-08-11 21:07:20.000000000 +0200 -@@ -61,23 +61,10 @@ - * - jump to second stage - */ - --_TEXT_BASE: -- .word TEXT_BASE - --.globl _armboot_start --_armboot_start: -- .word _start -+_textBase: -+ .word TEXT_BASE - --/* -- * These are defined in the board-specific linker script. -- */ --.globl _bss_start --_bss_start: -- .word __bss_start -- --.globl _bss_end --_bss_end: -- .word _end - - #ifdef CONFIG_USE_IRQ - /* IRQ stack memory (calculated at run-time) */ -@@ -111,47 +98,9 @@ - #ifdef CONFIG_INIT_CRITICAL - bl cpu_init_crit /* we do sys-critical inits */ - #endif -+ b HeadStart - --relocate: /* relocate U-Boot to RAM */ -- adr r0, _start /* r0 <- current position of code */ -- ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ -- cmp r0, r1 /* don't reloc during debug */ -- beq stack_setup -- -- ldr r2, _armboot_start -- ldr r3, _bss_start -- sub r2, r3, r2 /* r2 <- size of armboot */ -- add r2, r0, r2 /* r2 <- source end address */ -- --copy_loop: -- ldmia r0!, {r3-r10} /* copy from source address [r0] */ -- stmia r1!, {r3-r10} /* copy to target address [r1] */ -- cmp r0, r2 /* until source end addreee [r2] */ -- ble copy_loop -- -- /* Set up the stack */ --stack_setup: -- ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */ -- sub r0, r0, #CFG_MALLOC_LEN /* malloc area */ -- sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */ --#ifdef CONFIG_USE_IRQ -- sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) --#endif -- sub sp, r0, #12 /* leave 3 words for abort-stack */ -- --clear_bss: -- ldr r0, _bss_start /* find start of bss segment */ -- ldr r1, _bss_end /* stop here */ -- mov r2, #0x00000000 /* clear */ - --clbss_l:str r2, [r0] /* clear loop... */ -- add r0, r0, #4 -- cmp r0, r1 -- bne clbss_l -- -- ldr pc, _start_armboot -- --_start_armboot: .word start_armboot - - - /****************************************************************************/ -@@ -167,16 +116,7 @@ - IC_BASE: .word 0x40d00000 - #define ICMR 0x04 - --/* Reset-Controller */ --RST_BASE: .word 0x40f00030 --#define RCSR 0x00 -- --/* Operating System Timer */ --OSTIMER_BASE: .word 0x40a00000 --#define OSMR3 0x0C --#define OSCR 0x10 --#define OWER 0x18 --#define OIER 0x1C -+ - - /* Clock Manager Registers */ - #ifdef CFG_CPUSPEED -@@ -288,7 +228,7 @@ - stmia sp, {r0 - r12} /* Calling r0-r12 */ - add r8, sp, #S_PC - -- ldr r2, _armboot_start -+ ldr r2, _textBase - sub r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN) - sub r2, r2, #(CFG_GBL_DATA_SIZE+8) @ set base 2 words into abort stack - ldmia r2, {r2 - r4} /* get pc, cpsr, old_r0 */ -@@ -325,7 +265,7 @@ - .endm - - .macro get_bad_stack -- ldr r13, _armboot_start @ setup our mode stack -+ ldr r13, _textBase @ setup our mode stack - sub r13, r13, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN) - sub r13, r13, #(CFG_GBL_DATA_SIZE+8) @ reserved a couple spots in abort stack - -@@ -416,36 +356,3 @@ - - #endif - --/****************************************************************************/ --/* */ --/* Reset function: the PXA250 doesn't have a reset function, so we have to */ --/* perform a watchdog timeout for a soft reset. */ --/* */ --/****************************************************************************/ -- -- .align 5 --.globl reset_cpu -- -- /* FIXME: this code is PXA250 specific. How is this handled on */ -- /* other XScale processors? */ -- --reset_cpu: -- -- /* We set OWE:WME (watchdog enable) and wait until timeout happens */ -- -- ldr r0, OSTIMER_BASE -- ldr r1, [r0, #OWER] -- orr r1, r1, #0x0001 /* bit0: WME */ -- str r1, [r0, #OWER] -- -- /* OS timer does only wrap every 1165 seconds, so we have to set */ -- /* the match register as well. */ -- -- ldr r1, [r0, #OSCR] /* read OS timer */ -- add r1, r1, #0x800 /* let OSMR3 match after */ -- add r1, r1, #0x800 /* 4096*(1/3.6864MHz)=1ms */ -- str r1, [r0, #OSMR3] -- --reset_endless: -- -- b reset_endless -diff -u -r --new-file u-boot-1.1.2/cpu/pxa/usb_ohci.c u-boot-1.1.2-neon/cpu/pxa/usb_ohci.c ---- u-boot-1.1.2/cpu/pxa/usb_ohci.c 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/cpu/pxa/usb_ohci.c 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,1679 @@ -+/* -+ * URB OHCI HCD (Host Controller Driver) for USB on the S3C2400. -+ * -+ * (C) Copyright 2003 -+ * 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 -+ * -+ * Note: Part of this code has been derived from linux -+ * -+ */ -+/* -+ * IMPORTANT NOTES -+ * 1 - you MUST define LITTLEENDIAN in the configuration file for the -+ * board or this driver will NOT work! -+ * 2 - this driver is intended for use with USB Mass Storage Devices -+ * (BBB) ONLY. There is NO support for Interrupt or Isochronous pipes! -+ */ -+ -+#include <common.h> -+/* #include <pci.h> no PCI on the S3C24X0 */ -+ -+#ifdef CONFIG_USB_OHCI -+ -+#include <asm/arch/pxa-regs.h> -+ -+#include <malloc.h> -+#include <usb.h> -+#include "usb_ohci.h" -+ -+#if defined( CONFIG_SM501 ) -+#include "sm501_usb.h" -+#endif -+ -+// #define OHCI_USE_NPS /* force NoPowerSwitching mode */ -+// #define OHCI_VERBOSE_DEBUG /* not always helpful */ -+ -+ -+/* For initializing controller (mask in an HCFS mode too) */ -+#define OHCI_CONTROL_INIT \ -+ (OHCI_CTRL_CBSR & 0x3) | OHCI_CTRL_IE | OHCI_CTRL_PLE -+ -+#define readl(a) (*((vu_long *)(a))) -+#define writel(a, b) (*((vu_long *)(b)) = ((vu_long)a)) -+ -+#define min_t(type,x,y) ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; }) -+ -+//#define DEBUG -+#ifdef DEBUG -+#define dbg(format, arg...) printf("DEBUG: " format "\n", ## arg) -+#else -+#define dbg(format, arg...) do {} while(0) -+#endif /* DEBUG */ -+#define err(format, arg...) printf("ERROR: " format "\n", ## arg) -+#define SHOW_INFO -+#ifdef SHOW_INFO -+#define info(format, arg...) printf("INFO: " format "\n", ## arg) -+#else -+#define info(format, arg...) do {} while(0) -+#endif -+ -+#define m16_swap(x) swap_16(x) -+#define m32_swap(x) swap_32(x) -+ -+/* global ohci_t */ -+static ohci_t gohci; -+/* this must be aligned to a 256 byte boundary */ -+struct ohci_hcca ghcca[1]; -+/* a pointer to the aligned storage */ -+struct ohci_hcca *phcca; -+/* this allocates EDs for all possible endpoints */ -+struct ohci_device ohci_dev; -+/* urb_priv */ -+urb_priv_t urb_priv; -+/* RHSC flag */ -+int got_rhsc; -+/* device which was disconnected */ -+struct usb_device *devgone; -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* AMD-756 (D2 rev) reports corrupt register contents in some cases. -+ * The erratum (#4) description is incorrect. AMD's workaround waits -+ * till some bits (mostly reserved) are clear; ok for all revs. -+ */ -+#define OHCI_QUIRK_AMD756 0xabcd -+#define read_roothub(hc, register, mask) ({ \ -+ u32 temp = readl (&hc->regs->roothub.register); \ -+ if (hc->flags & OHCI_QUIRK_AMD756) \ -+ while (temp & mask) \ -+ temp = readl (&hc->regs->roothub.register); \ -+ temp; }) -+ -+static u32 roothub_a (struct ohci *hc) -+ { return read_roothub (hc, a, 0xfc0fe000); } -+static inline u32 roothub_b (struct ohci *hc) -+ { return readl (&hc->regs->roothub.b); } -+static inline u32 roothub_status (struct ohci *hc) -+ { return readl (&hc->regs->roothub.status); } -+static u32 roothub_portstatus (struct ohci *hc, int i) -+ { return read_roothub (hc, portstatus [i], 0xffe0fce0); } -+ -+ -+/* forward declaration */ -+static int hc_interrupt (void); -+static void -+td_submit_job (struct usb_device * dev, unsigned long pipe, void * buffer, -+ int transfer_len, struct devrequest * setup, urb_priv_t * urb, int interval); -+ -+/*-------------------------------------------------------------------------* -+ * URB support functions -+ *-------------------------------------------------------------------------*/ -+ -+/* free HCD-private data associated with this URB */ -+ -+static void urb_free_priv (urb_priv_t * urb) -+{ -+ int i; -+ int last; -+ struct td * td; -+ -+ last = urb->length - 1; -+ if (last >= 0) { -+ for (i = 0; i <= last; i++) { -+ td = urb->td[i]; -+ if (td) { -+ td->usb_dev = NULL; -+ urb->td[i] = NULL; -+ } -+ } -+ } -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+#ifdef DEBUG -+static int sohci_get_current_frame_number (struct usb_device * dev); -+ -+/* debug| print the main components of an URB -+ * small: 0) header + data packets 1) just header */ -+ -+static void pkt_print (struct usb_device * dev, unsigned long pipe, void * buffer, -+ int transfer_len, struct devrequest * setup, char * str, int small) -+{ -+ urb_priv_t * purb = &urb_priv; -+ -+ dbg("%s URB:[%4x] dev:%2d,ep:%2d-%c,type:%s,len:%d/%d stat:%#lx", -+ str, -+ sohci_get_current_frame_number (dev), -+ usb_pipedevice (pipe), -+ usb_pipeendpoint (pipe), -+ usb_pipeout (pipe)? 'O': 'I', -+ usb_pipetype (pipe) < 2? (usb_pipeint (pipe)? "INTR": "ISOC"): -+ (usb_pipecontrol (pipe)? "CTRL": "BULK"), -+ purb->actual_length, -+ transfer_len, dev->status); -+#ifdef OHCI_VERBOSE_DEBUG -+ if (!small) { -+ int i, len; -+ -+ if (usb_pipecontrol (pipe)) { -+ printf (__FILE__ ": cmd(8):"); -+ for (i = 0; i < 8 ; i++) -+ printf (" %02x", ((__u8 *) setup) [i]); -+ printf ("\n"); -+ } -+ if (transfer_len > 0 && buffer) { -+ printf (__FILE__ ": data(%d/%d):", -+ purb->actual_length, -+ transfer_len); -+ len = usb_pipeout (pipe)? -+ transfer_len: purb->actual_length; -+ for (i = 0; i < 16 && i < len; i++) -+ printf (" %02x", ((__u8 *) buffer) [i]); -+ printf ("%s\n", i < len? "...": ""); -+ } -+ } -+#endif -+} -+ -+/* just for debugging; prints non-empty branches of the int ed tree inclusive iso eds*/ -+void ep_print_int_eds (ohci_t *ohci, char * str) { -+ int i, j; -+ __u32 * ed_p; -+ for (i= 0; i < 32; i++) { -+ j = 5; -+ ed_p = &(ohci->hcca->int_table [i]); -+ if (*ed_p == 0) -+ continue; -+ printf (__FILE__ ": %s branch int %2d(%2x):", str, i, i); -+ while (*ed_p != 0 && j--) { -+ ed_t *ed = (ed_t *)m32_swap(ed_p); -+ printf (" ed: %4x;", ed->hwINFO); -+ ed_p = &ed->hwNextED; -+ } -+ printf ("\n"); -+ } -+} -+ -+static void ohci_dump_intr_mask (char *label, __u32 mask) -+{ -+ dbg ("%s: 0x%08x%s%s%s%s%s%s%s%s%s", -+ label, -+ mask, -+ (mask & OHCI_INTR_MIE) ? " MIE" : "", -+ (mask & OHCI_INTR_OC) ? " OC" : "", -+ (mask & OHCI_INTR_RHSC) ? " RHSC" : "", -+ (mask & OHCI_INTR_FNO) ? " FNO" : "", -+ (mask & OHCI_INTR_UE) ? " UE" : "", -+ (mask & OHCI_INTR_RD) ? " RD" : "", -+ (mask & OHCI_INTR_SF) ? " SF" : "", -+ (mask & OHCI_INTR_WDH) ? " WDH" : "", -+ (mask & OHCI_INTR_SO) ? " SO" : "" -+ ); -+} -+ -+static void maybe_print_eds (char *label, __u32 value) -+{ -+ ed_t *edp = (ed_t *)value; -+ -+ if (value) { -+ dbg ("%s %08x", label, value); -+ dbg ("%08x", edp->hwINFO); -+ dbg ("%08x", edp->hwTailP); -+ dbg ("%08x", edp->hwHeadP); -+ dbg ("%08x", edp->hwNextED); -+ } -+} -+ -+static char * hcfs2string (int state) -+{ -+ switch (state) { -+ case OHCI_USB_RESET: return "reset"; -+ case OHCI_USB_RESUME: return "resume"; -+ case OHCI_USB_OPER: return "operational"; -+ case OHCI_USB_SUSPEND: return "suspend"; -+ } -+ return "?"; -+} -+ -+/* dump control and status registers */ -+static void ohci_dump_status (ohci_t *controller) -+{ -+ struct ohci_regs *regs = controller->regs; -+ __u32 temp; -+ -+ temp = readl (®s->revision) & 0xff; -+ if (temp != 0x10) -+ dbg ("spec %d.%d", (temp >> 4), (temp & 0x0f)); -+ -+ temp = readl (®s->control); -+ dbg ("control: 0x%08x%s%s%s HCFS=%s%s%s%s%s CBSR=%d", temp, -+ (temp & OHCI_CTRL_RWE) ? " RWE" : "", -+ (temp & OHCI_CTRL_RWC) ? " RWC" : "", -+ (temp & OHCI_CTRL_IR) ? " IR" : "", -+ hcfs2string (temp & OHCI_CTRL_HCFS), -+ (temp & OHCI_CTRL_BLE) ? " BLE" : "", -+ (temp & OHCI_CTRL_CLE) ? " CLE" : "", -+ (temp & OHCI_CTRL_IE) ? " IE" : "", -+ (temp & OHCI_CTRL_PLE) ? " PLE" : "", -+ temp & OHCI_CTRL_CBSR -+ ); -+ -+ temp = readl (®s->cmdstatus); -+ dbg ("cmdstatus: 0x%08x SOC=%d%s%s%s%s", temp, -+ (temp & OHCI_SOC) >> 16, -+ (temp & OHCI_OCR) ? " OCR" : "", -+ (temp & OHCI_BLF) ? " BLF" : "", -+ (temp & OHCI_CLF) ? " CLF" : "", -+ (temp & OHCI_HCR) ? " HCR" : "" -+ ); -+ -+ ohci_dump_intr_mask ("intrstatus", readl (®s->intrstatus)); -+ ohci_dump_intr_mask ("intrenable", readl (®s->intrenable)); -+ -+ maybe_print_eds ("ed_periodcurrent", readl (®s->ed_periodcurrent)); -+ -+ maybe_print_eds ("ed_controlhead", readl (®s->ed_controlhead)); -+ maybe_print_eds ("ed_controlcurrent", readl (®s->ed_controlcurrent)); -+ -+ maybe_print_eds ("ed_bulkhead", readl (®s->ed_bulkhead)); -+ maybe_print_eds ("ed_bulkcurrent", readl (®s->ed_bulkcurrent)); -+ -+ maybe_print_eds ("donehead", readl (®s->donehead)); -+} -+ -+static void ohci_dump_roothub (ohci_t *controller, int verbose) -+{ -+ __u32 temp, ndp, i; -+ -+ temp = roothub_a (controller); -+ ndp = (temp & RH_A_NDP); -+ -+ if (verbose) { -+ dbg ("roothub.a: %08x POTPGT=%d%s%s%s%s%s NDP=%d", temp, -+ ((temp & RH_A_POTPGT) >> 24) & 0xff, -+ (temp & RH_A_NOCP) ? " NOCP" : "", -+ (temp & RH_A_OCPM) ? " OCPM" : "", -+ (temp & RH_A_DT) ? " DT" : "", -+ (temp & RH_A_NPS) ? " NPS" : "", -+ (temp & RH_A_PSM) ? " PSM" : "", -+ ndp -+ ); -+ temp = roothub_b (controller); -+ dbg ("roothub.b: %08x PPCM=%04x DR=%04x", -+ temp, -+ (temp & RH_B_PPCM) >> 16, -+ (temp & RH_B_DR) -+ ); -+ temp = roothub_status (controller); -+ dbg ("roothub.status: %08x%s%s%s%s%s%s", -+ temp, -+ (temp & RH_HS_CRWE) ? " CRWE" : "", -+ (temp & RH_HS_OCIC) ? " OCIC" : "", -+ (temp & RH_HS_LPSC) ? " LPSC" : "", -+ (temp & RH_HS_DRWE) ? " DRWE" : "", -+ (temp & RH_HS_OCI) ? " OCI" : "", -+ (temp & RH_HS_LPS) ? " LPS" : "" -+ ); -+ } -+ -+ for (i = 0; i < ndp; i++) { -+ temp = roothub_portstatus (controller, i); -+ dbg ("roothub.portstatus [%d] = 0x%08x%s%s%s%s%s%s%s%s%s%s%s%s", -+ i, -+ temp, -+ (temp & RH_PS_PRSC) ? " PRSC" : "", -+ (temp & RH_PS_OCIC) ? " OCIC" : "", -+ (temp & RH_PS_PSSC) ? " PSSC" : "", -+ (temp & RH_PS_PESC) ? " PESC" : "", -+ (temp & RH_PS_CSC) ? " CSC" : "", -+ -+ (temp & RH_PS_LSDA) ? " LSDA" : "", -+ (temp & RH_PS_PPS) ? " PPS" : "", -+ (temp & RH_PS_PRS) ? " PRS" : "", -+ (temp & RH_PS_POCI) ? " POCI" : "", -+ (temp & RH_PS_PSS) ? " PSS" : "", -+ -+ (temp & RH_PS_PES) ? " PES" : "", -+ (temp & RH_PS_CCS) ? " CCS" : "" -+ ); -+ } -+} -+ -+static void ohci_dump (ohci_t *controller, int verbose) -+{ -+ dbg ("OHCI controller usb-%s state", controller->slot_name); -+ -+ /* dumps some of the state we know about */ -+ ohci_dump_status (controller); -+ if (verbose) -+ ep_print_int_eds (controller, "hcca"); -+ dbg ("hcca frame #%04x", controller->hcca->frame_no); -+ ohci_dump_roothub (controller, 1); -+} -+ -+ -+#endif /* DEBUG */ -+ -+/*-------------------------------------------------------------------------* -+ * Interface functions (URB) -+ *-------------------------------------------------------------------------*/ -+ -+/* get a transfer request */ -+ -+int sohci_submit_job(struct usb_device *dev, unsigned long pipe, void *buffer, -+ int transfer_len, struct devrequest *setup, int interval) -+{ -+ ohci_t *ohci; -+ ed_t * ed; -+ urb_priv_t *purb_priv; -+ int i, size = 0; -+ -+ ohci = &gohci; -+ -+ /* when controller's hung, permit only roothub cleanup attempts -+ * such as powering down ports */ -+ if (ohci->disabled) { -+ err("sohci_submit_job: EPIPE"); -+ return -1; -+ } -+ -+ /* every endpoint has a ed, locate and fill it */ -+ if (!(ed = ep_add_ed (dev, pipe))) { -+ err("sohci_submit_job: ENOMEM"); -+ return -1; -+ } -+ -+ /* for the private part of the URB we need the number of TDs (size) */ -+ switch (usb_pipetype (pipe)) { -+ case PIPE_BULK: /* one TD for every 4096 Byte */ -+ size = (transfer_len - 1) / 4096 + 1; -+ break; -+ case PIPE_CONTROL: /* 1 TD for setup, 1 for ACK and 1 for every 4096 B */ -+ size = (transfer_len == 0)? 2: -+ (transfer_len - 1) / 4096 + 3; -+ break; -+ } -+ -+ if (size >= (N_URB_TD - 1)) { -+ err("need %d TDs, only have %d", size, N_URB_TD); -+ return -1; -+ } -+ purb_priv = &urb_priv; -+ purb_priv->pipe = pipe; -+ -+ /* fill the private part of the URB */ -+ purb_priv->length = size; -+ purb_priv->ed = ed; -+ purb_priv->actual_length = 0; -+ -+ /* allocate the TDs */ -+ /* note that td[0] was allocated in ep_add_ed */ -+ for (i = 0; i < size; i++) { -+ purb_priv->td[i] = td_alloc (dev); -+ if (!purb_priv->td[i]) { -+ purb_priv->length = i; -+ urb_free_priv (purb_priv); -+ err("sohci_submit_job: ENOMEM"); -+ return -1; -+ } -+ } -+ -+ if (ed->state == ED_NEW || (ed->state & ED_DEL)) { -+ urb_free_priv (purb_priv); -+ err("sohci_submit_job: EINVAL"); -+ return -1; -+ } -+ -+ /* link the ed into a chain if is not already */ -+ if (ed->state != ED_OPER) -+ ep_link (ohci, ed); -+ -+ /* fill the TDs and link it to the ed */ -+ td_submit_job(dev, pipe, buffer, transfer_len, setup, purb_priv, interval); -+ -+ return 0; -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+#ifdef DEBUG -+/* tell us the current USB frame number */ -+ -+static int sohci_get_current_frame_number (struct usb_device *usb_dev) -+{ -+ ohci_t *ohci = &gohci; -+ -+ return m16_swap (ohci->hcca->frame_no); -+} -+#endif -+ -+/*-------------------------------------------------------------------------* -+ * ED handling functions -+ *-------------------------------------------------------------------------*/ -+ -+/* link an ed into one of the HC chains */ -+ -+static int ep_link (ohci_t *ohci, ed_t *edi) -+{ -+ volatile ed_t *ed = edi; -+ -+ ed->state = ED_OPER; -+ -+ switch (ed->type) { -+ case PIPE_CONTROL: -+ ed->hwNextED = 0; -+ if (ohci->ed_controltail == NULL) { -+ writel (ed, &ohci->regs->ed_controlhead); -+ } else { -+ ohci->ed_controltail->hwNextED = m32_swap (ed); -+ } -+ ed->ed_prev = ohci->ed_controltail; -+ if (!ohci->ed_controltail && !ohci->ed_rm_list[0] && -+ !ohci->ed_rm_list[1] && !ohci->sleeping) { -+ ohci->hc_control |= OHCI_CTRL_CLE; -+ writel (ohci->hc_control, &ohci->regs->control); -+ } -+ ohci->ed_controltail = edi; -+ break; -+ -+ case PIPE_BULK: -+ ed->hwNextED = 0; -+ if (ohci->ed_bulktail == NULL) { -+ writel (ed, &ohci->regs->ed_bulkhead); -+ } else { -+ ohci->ed_bulktail->hwNextED = m32_swap (ed); -+ } -+ ed->ed_prev = ohci->ed_bulktail; -+ if (!ohci->ed_bulktail && !ohci->ed_rm_list[0] && -+ !ohci->ed_rm_list[1] && !ohci->sleeping) { -+ ohci->hc_control |= OHCI_CTRL_BLE; -+ writel (ohci->hc_control, &ohci->regs->control); -+ } -+ ohci->ed_bulktail = edi; -+ break; -+ } -+ return 0; -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* unlink an ed from one of the HC chains. -+ * just the link to the ed is unlinked. -+ * the link from the ed still points to another operational ed or 0 -+ * so the HC can eventually finish the processing of the unlinked ed */ -+ -+static int ep_unlink (ohci_t *ohci, ed_t *ed) -+{ -+ ed->hwINFO |= m32_swap (OHCI_ED_SKIP); -+ -+ switch (ed->type) { -+ case PIPE_CONTROL: -+ if (ed->ed_prev == NULL) { -+ if (!ed->hwNextED) { -+ ohci->hc_control &= ~OHCI_CTRL_CLE; -+ writel (ohci->hc_control, &ohci->regs->control); -+ } -+ writel (m32_swap (*((__u32 *)&ed->hwNextED)), &ohci->regs->ed_controlhead); -+ } else { -+ ed->ed_prev->hwNextED = ed->hwNextED; -+ } -+ if (ohci->ed_controltail == ed) { -+ ohci->ed_controltail = ed->ed_prev; -+ } else { -+ ((ed_t *)m32_swap (*((__u32 *)&ed->hwNextED)))->ed_prev = ed->ed_prev; -+ } -+ break; -+ -+ case PIPE_BULK: -+ if (ed->ed_prev == NULL) { -+ if (!ed->hwNextED) { -+ ohci->hc_control &= ~OHCI_CTRL_BLE; -+ writel (ohci->hc_control, &ohci->regs->control); -+ } -+ writel (m32_swap (*((__u32 *)&ed->hwNextED)), &ohci->regs->ed_bulkhead); -+ } else { -+ ed->ed_prev->hwNextED = ed->hwNextED; -+ } -+ if (ohci->ed_bulktail == ed) { -+ ohci->ed_bulktail = ed->ed_prev; -+ } else { -+ ((ed_t *)m32_swap (*((__u32 *)&ed->hwNextED)))->ed_prev = ed->ed_prev; -+ } -+ break; -+ } -+ ed->state = ED_UNLINK; -+ return 0; -+} -+ -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* add/reinit an endpoint; this should be done once at the usb_set_configuration command, -+ * but the USB stack is a little bit stateless so we do it at every transaction -+ * if the state of the ed is ED_NEW then a dummy td is added and the state is changed to ED_UNLINK -+ * in all other cases the state is left unchanged -+ * the ed info fields are setted anyway even though most of them should not change */ -+ -+static ed_t * ep_add_ed (struct usb_device *usb_dev, unsigned long pipe) -+{ -+ td_t *td; -+ ed_t *ed_ret; -+ volatile ed_t *ed; -+ -+ ed = ed_ret = &ohci_dev.ed[(usb_pipeendpoint (pipe) << 1) | -+ (usb_pipecontrol (pipe)? 0: usb_pipeout (pipe))]; -+ -+ if ((ed->state & ED_DEL) || (ed->state & ED_URB_DEL)) { -+ err("ep_add_ed: pending delete"); -+ /* pending delete request */ -+ return NULL; -+ } -+ -+ if (ed->state == ED_NEW) { -+ ed->hwINFO = m32_swap (OHCI_ED_SKIP); /* skip ed */ -+ /* dummy td; end of td list for ed */ -+ td = td_alloc (usb_dev); -+ ed->hwTailP = m32_swap (td); -+ ed->hwHeadP = ed->hwTailP; -+ ed->state = ED_UNLINK; -+ ed->type = usb_pipetype (pipe); -+ ohci_dev.ed_cnt++; -+ } -+ -+ ed->hwINFO = m32_swap (usb_pipedevice (pipe) -+ | usb_pipeendpoint (pipe) << 7 -+ | (usb_pipeisoc (pipe)? 0x8000: 0) -+ | (usb_pipecontrol (pipe)? 0: (usb_pipeout (pipe)? 0x800: 0x1000)) -+ | usb_pipeslow (pipe) << 13 -+ | usb_maxpacket (usb_dev, pipe) << 16); -+ -+ return ed_ret; -+} -+ -+/*-------------------------------------------------------------------------* -+ * TD handling functions -+ *-------------------------------------------------------------------------*/ -+ -+/* enqueue next TD for this URB (OHCI spec 5.2.8.2) */ -+ -+static void td_fill (ohci_t *ohci, unsigned int info, -+ void *data, int len, -+ struct usb_device *dev, int index, urb_priv_t *urb_priv) -+{ -+ volatile td_t *td, *td_pt; -+#ifdef OHCI_FILL_TRACE -+ int i; -+#endif -+ -+ if (index > urb_priv->length) { -+ err("index > length"); -+ return; -+ } -+ /* use this td as the next dummy */ -+ td_pt = urb_priv->td [index]; -+ td_pt->hwNextTD = 0; -+ -+ /* fill the old dummy TD */ -+ td = urb_priv->td [index] = (td_t *)(m32_swap (urb_priv->ed->hwTailP) & ~0xf); -+ -+ td->ed = urb_priv->ed; -+ td->next_dl_td = NULL; -+ td->index = index; -+ td->data = (__u32)data; -+#ifdef OHCI_FILL_TRACE -+ if ((usb_pipetype(urb_priv->pipe) == PIPE_BULK) && usb_pipeout(urb_priv->pipe)) { -+ for (i = 0; i < len; i++) -+ printf("td->data[%d] %#2x ",i, ((unsigned char *)td->data)[i]); -+ printf("\n"); -+ } -+#endif -+ if (!len) -+ data = 0; -+ -+ td->hwINFO = m32_swap (info); -+ td->hwCBP = m32_swap (data); -+ if (data) -+ td->hwBE = m32_swap (data + len - 1); -+ else -+ td->hwBE = 0; -+ td->hwNextTD = m32_swap (td_pt); -+ td->hwPSW [0] = m16_swap (((__u32)data & 0x0FFF) | 0xE000); -+ -+ /* append to queue */ -+ td->ed->hwTailP = td->hwNextTD; -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* prepare all TDs of a transfer */ -+ -+static void td_submit_job (struct usb_device *dev, unsigned long pipe, void *buffer, -+ int transfer_len, struct devrequest *setup, urb_priv_t *urb, int interval) -+{ -+ ohci_t *ohci = &gohci; -+ int data_len = transfer_len; -+ void *data; -+ int cnt = 0; -+ __u32 info = 0; -+ unsigned int toggle = 0; -+ -+ /* OHCI handles the DATA-toggles itself, we just use the USB-toggle bits for reseting */ -+ if(usb_gettoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe))) { -+ toggle = TD_T_TOGGLE; -+ } else { -+ toggle = TD_T_DATA0; -+ usb_settoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe), 1); -+ } -+ urb->td_cnt = 0; -+ if (data_len) -+ data = buffer; -+ else -+ data = 0; -+ -+ switch (usb_pipetype (pipe)) { -+ case PIPE_BULK: -+ info = usb_pipeout (pipe)? -+ TD_CC | TD_DP_OUT : TD_CC | TD_DP_IN ; -+ while(data_len > 4096) { -+ td_fill (ohci, info | (cnt? TD_T_TOGGLE:toggle), data, 4096, dev, cnt, urb); -+ data += 4096; data_len -= 4096; cnt++; -+ } -+ info = usb_pipeout (pipe)? -+ TD_CC | TD_DP_OUT : TD_CC | TD_R | TD_DP_IN ; -+ td_fill (ohci, info | (cnt? TD_T_TOGGLE:toggle), data, data_len, dev, cnt, urb); -+ cnt++; -+ -+ if (!ohci->sleeping) -+ writel (OHCI_BLF, &ohci->regs->cmdstatus); /* start bulk list */ -+ break; -+ -+ case PIPE_CONTROL: -+ info = TD_CC | TD_DP_SETUP | TD_T_DATA0; -+ td_fill (ohci, info, setup, 8, dev, cnt++, urb); -+ if (data_len > 0) { -+ info = usb_pipeout (pipe)? -+ TD_CC | TD_R | TD_DP_OUT | TD_T_DATA1 : TD_CC | TD_R | TD_DP_IN | TD_T_DATA1; -+ /* NOTE: mishandles transfers >8K, some >4K */ -+ td_fill (ohci, info, data, data_len, dev, cnt++, urb); -+ } -+ info = usb_pipeout (pipe)? -+ TD_CC | TD_DP_IN | TD_T_DATA1: TD_CC | TD_DP_OUT | TD_T_DATA1; -+ td_fill (ohci, info, data, 0, dev, cnt++, urb); -+ if (!ohci->sleeping) -+ writel (OHCI_CLF, &ohci->regs->cmdstatus); /* start Control list */ -+ break; -+ } -+ if (urb->length != cnt) -+ dbg("TD LENGTH %d != CNT %d", urb->length, cnt); -+} -+ -+/*-------------------------------------------------------------------------* -+ * Done List handling functions -+ *-------------------------------------------------------------------------*/ -+ -+ -+/* calculate the transfer length and update the urb */ -+ -+static void dl_transfer_length(td_t * td) -+{ -+ __u32 tdINFO, tdBE, tdCBP; -+ urb_priv_t *lurb_priv = &urb_priv; -+ -+ tdINFO = m32_swap (td->hwINFO); -+ tdBE = m32_swap (td->hwBE); -+ tdCBP = m32_swap (td->hwCBP); -+ -+ -+ if (!(usb_pipetype (lurb_priv->pipe) == PIPE_CONTROL && -+ ((td->index == 0) || (td->index == lurb_priv->length - 1)))) { -+ if (tdBE != 0) { -+ if (td->hwCBP == 0) -+ lurb_priv->actual_length += tdBE - td->data + 1; -+ else -+ lurb_priv->actual_length += tdCBP - td->data; -+ } -+ } -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* replies to the request have to be on a FIFO basis so -+ * we reverse the reversed done-list */ -+ -+static td_t * dl_reverse_done_list (ohci_t *ohci) -+{ -+ __u32 td_list_hc; -+ td_t *td_rev = NULL; -+ td_t *td_list = NULL; -+ urb_priv_t *lurb_priv = NULL; -+ -+ td_list_hc = m32_swap (ohci->hcca->done_head) & 0xfffffff0; -+ ohci->hcca->done_head = 0; -+ -+ while (td_list_hc) { -+ td_list = (td_t *)td_list_hc; -+ -+ if (TD_CC_GET (m32_swap (td_list->hwINFO))) { -+ lurb_priv = &urb_priv; -+ dbg(" USB-error/status: %x : %p", -+ TD_CC_GET (m32_swap (td_list->hwINFO)), td_list); -+ if (td_list->ed->hwHeadP & m32_swap (0x1)) { -+ if (lurb_priv && ((td_list->index + 1) < lurb_priv->length)) { -+ td_list->ed->hwHeadP = -+ (lurb_priv->td[lurb_priv->length - 1]->hwNextTD & m32_swap (0xfffffff0)) | -+ (td_list->ed->hwHeadP & m32_swap (0x2)); -+ lurb_priv->td_cnt += lurb_priv->length - td_list->index - 1; -+ } else -+ td_list->ed->hwHeadP &= m32_swap (0xfffffff2); -+ } -+ } -+ -+ td_list->next_dl_td = td_rev; -+ td_rev = td_list; -+ td_list_hc = m32_swap (td_list->hwNextTD) & 0xfffffff0; -+ } -+ return td_list; -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* td done list */ -+static int dl_done_list (ohci_t *ohci, td_t *td_list) -+{ -+ td_t *td_list_next = NULL; -+ ed_t *ed; -+ int cc = 0; -+ int stat = 0; -+ /* urb_t *urb; */ -+ urb_priv_t *lurb_priv; -+ __u32 tdINFO, edHeadP, edTailP; -+ -+ while (td_list) { -+ td_list_next = td_list->next_dl_td; -+ -+ lurb_priv = &urb_priv; -+ tdINFO = m32_swap (td_list->hwINFO); -+ -+ ed = td_list->ed; -+ -+ dl_transfer_length(td_list); -+ -+ /* error code of transfer */ -+ cc = TD_CC_GET (tdINFO); -+ if (cc != 0) { -+ dbg("ConditionCode %#x", cc); -+ stat = cc_to_error[cc]; -+ } -+ -+ if (ed->state != ED_NEW) { -+ edHeadP = m32_swap (ed->hwHeadP) & 0xfffffff0; -+ edTailP = m32_swap (ed->hwTailP); -+ -+ /* unlink eds if they are not busy */ -+ if ((edHeadP == edTailP) && (ed->state == ED_OPER)) -+ ep_unlink (ohci, ed); -+ } -+ -+ td_list = td_list_next; -+ } -+ return stat; -+} -+ -+/*-------------------------------------------------------------------------* -+ * Virtual Root Hub -+ *-------------------------------------------------------------------------*/ -+ -+/* Device descriptor */ -+static __u8 root_hub_dev_des[] = -+{ -+ 0x12, /* __u8 bLength; */ -+ 0x01, /* __u8 bDescriptorType; Device */ -+ 0x10, /* __u16 bcdUSB; v1.1 */ -+ 0x01, -+ 0x09, /* __u8 bDeviceClass; HUB_CLASSCODE */ -+ 0x00, /* __u8 bDeviceSubClass; */ -+ 0x00, /* __u8 bDeviceProtocol; */ -+ 0x08, /* __u8 bMaxPacketSize0; 8 Bytes */ -+ 0x00, /* __u16 idVendor; */ -+ 0x00, -+ 0x00, /* __u16 idProduct; */ -+ 0x00, -+ 0x00, /* __u16 bcdDevice; */ -+ 0x00, -+ 0x00, /* __u8 iManufacturer; */ -+ 0x01, /* __u8 iProduct; */ -+ 0x00, /* __u8 iSerialNumber; */ -+ 0x01 /* __u8 bNumConfigurations; */ -+}; -+ -+ -+/* Configuration descriptor */ -+static __u8 root_hub_config_des[] = -+{ -+ 0x09, /* __u8 bLength; */ -+ 0x02, /* __u8 bDescriptorType; Configuration */ -+ 0x19, /* __u16 wTotalLength; */ -+ 0x00, -+ 0x01, /* __u8 bNumInterfaces; */ -+ 0x01, /* __u8 bConfigurationValue; */ -+ 0x00, /* __u8 iConfiguration; */ -+ 0x40, /* __u8 bmAttributes; -+ Bit 7: Bus-powered, 6: Self-powered, 5 Remote-wakwup, 4..0: resvd */ -+ 0x00, /* __u8 MaxPower; */ -+ -+ /* interface */ -+ 0x09, /* __u8 if_bLength; */ -+ 0x04, /* __u8 if_bDescriptorType; Interface */ -+ 0x00, /* __u8 if_bInterfaceNumber; */ -+ 0x00, /* __u8 if_bAlternateSetting; */ -+ 0x01, /* __u8 if_bNumEndpoints; */ -+ 0x09, /* __u8 if_bInterfaceClass; HUB_CLASSCODE */ -+ 0x00, /* __u8 if_bInterfaceSubClass; */ -+ 0x00, /* __u8 if_bInterfaceProtocol; */ -+ 0x00, /* __u8 if_iInterface; */ -+ -+ /* endpoint */ -+ 0x07, /* __u8 ep_bLength; */ -+ 0x05, /* __u8 ep_bDescriptorType; Endpoint */ -+ 0x81, /* __u8 ep_bEndpointAddress; IN Endpoint 1 */ -+ 0x03, /* __u8 ep_bmAttributes; Interrupt */ -+ 0x02, /* __u16 ep_wMaxPacketSize; ((MAX_ROOT_PORTS + 1) / 8 */ -+ 0x00, -+ 0xff /* __u8 ep_bInterval; 255 ms */ -+}; -+ -+static unsigned char root_hub_str_index0[] = -+{ -+ 0x04, /* __u8 bLength; */ -+ 0x03, /* __u8 bDescriptorType; String-descriptor */ -+ 0x09, /* __u8 lang ID */ -+ 0x04, /* __u8 lang ID */ -+}; -+ -+static unsigned char root_hub_str_index1[] = -+{ -+ 28, /* __u8 bLength; */ -+ 0x03, /* __u8 bDescriptorType; String-descriptor */ -+ 'O', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+ 'H', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+ 'C', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+ 'I', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+ ' ', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+ 'R', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+ 'o', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+ 'o', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+ 't', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+ ' ', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+ 'H', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+ 'u', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+ 'b', /* __u8 Unicode */ -+ 0, /* __u8 Unicode */ -+}; -+ -+/* Hub class-specific descriptor is constructed dynamically */ -+ -+ -+/*-------------------------------------------------------------------------*/ -+ -+#define OK(x) len = (x); break -+#ifdef DEBUG -+#define WR_RH_STAT(x) {info("WR:status %#8x", (x));writel((x), &gohci.regs->roothub.status);} -+#define WR_RH_PORTSTAT(x) {info("WR:portstatus[%d] %#8x", wIndex-1, (x));writel((x), &gohci.regs->roothub.portstatus[wIndex-1]);} -+#else -+#define WR_RH_STAT(x) writel((x), &gohci.regs->roothub.status) -+#define WR_RH_PORTSTAT(x) writel((x), &gohci.regs->roothub.portstatus[wIndex-1]) -+#endif -+#define RD_RH_STAT roothub_status(&gohci) -+#define RD_RH_PORTSTAT roothub_portstatus(&gohci,wIndex-1) -+ -+/* request to virtual root hub */ -+ -+int rh_check_port_status(ohci_t *controller) -+{ -+ __u32 temp, ndp, i; -+ int res; -+ -+ res = -1; -+ temp = roothub_a (controller); -+ ndp = (temp & RH_A_NDP); -+ for (i = 0; i < ndp; i++) { -+ temp = roothub_portstatus (controller, i); -+ /* check for a device disconnect */ -+ if (((temp & (RH_PS_PESC | RH_PS_CSC)) == -+ (RH_PS_PESC | RH_PS_CSC)) && -+ ((temp & RH_PS_CCS) == 0)) { -+ res = i; -+ break; -+ } -+ } -+ return res; -+} -+ -+static int ohci_submit_rh_msg(struct usb_device *dev, unsigned long pipe, -+ void *buffer, int transfer_len, struct devrequest *cmd) -+{ -+ void * data = buffer; -+ int leni = transfer_len; -+ int len = 0; -+ int stat = 0; -+ __u32 datab[4]; -+ __u8 *data_buf = (__u8 *)datab; -+ __u16 bmRType_bReq; -+ __u16 wValue; -+ __u16 wIndex; -+ __u16 wLength; -+ -+#ifdef DEBUG -+urb_priv.actual_length = 0; -+pkt_print(dev, pipe, buffer, transfer_len, cmd, "SUB(rh)", usb_pipein(pipe)); -+#else -+ wait_ms(1); -+#endif -+ if ((pipe & PIPE_INTERRUPT) == PIPE_INTERRUPT) { -+ info("Root-Hub submit IRQ: NOT implemented"); -+ return 0; -+ } -+ -+ bmRType_bReq = cmd->requesttype | (cmd->request << 8); -+ wValue = m16_swap (cmd->value); -+ wIndex = m16_swap (cmd->index); -+ wLength = m16_swap (cmd->length); -+ -+ info("Root-Hub: adr: %2x cmd(%1x): %08x %04x %04x %04x", -+ dev->devnum, 8, bmRType_bReq, wValue, wIndex, wLength); -+ -+ switch (bmRType_bReq) { -+ /* Request Destination: -+ without flags: Device, -+ RH_INTERFACE: interface, -+ RH_ENDPOINT: endpoint, -+ RH_CLASS means HUB here, -+ RH_OTHER | RH_CLASS almost ever means HUB_PORT here -+ */ -+ -+ case RH_GET_STATUS: -+ *(__u16 *) data_buf = m16_swap (1); OK (2); -+ case RH_GET_STATUS | RH_INTERFACE: -+ *(__u16 *) data_buf = m16_swap (0); OK (2); -+ case RH_GET_STATUS | RH_ENDPOINT: -+ *(__u16 *) data_buf = m16_swap (0); OK (2); -+ case RH_GET_STATUS | RH_CLASS: -+ *(__u32 *) data_buf = m32_swap ( -+ RD_RH_STAT & ~(RH_HS_CRWE | RH_HS_DRWE)); -+ OK (4); -+ case RH_GET_STATUS | RH_OTHER | RH_CLASS: -+ *(__u32 *) data_buf = m32_swap (RD_RH_PORTSTAT); OK (4); -+ -+ case RH_CLEAR_FEATURE | RH_ENDPOINT: -+ switch (wValue) { -+ case (RH_ENDPOINT_STALL): OK (0); -+ } -+ break; -+ -+ case RH_CLEAR_FEATURE | RH_CLASS: -+ switch (wValue) { -+ case RH_C_HUB_LOCAL_POWER: -+ OK(0); -+ case (RH_C_HUB_OVER_CURRENT): -+ WR_RH_STAT(RH_HS_OCIC); OK (0); -+ } -+ break; -+ -+ case RH_CLEAR_FEATURE | RH_OTHER | RH_CLASS: -+ switch (wValue) { -+ case (RH_PORT_ENABLE): -+ WR_RH_PORTSTAT (RH_PS_CCS ); OK (0); -+ case (RH_PORT_SUSPEND): -+ WR_RH_PORTSTAT (RH_PS_POCI); OK (0); -+ case (RH_PORT_POWER): -+ WR_RH_PORTSTAT (RH_PS_LSDA); OK (0); -+ case (RH_C_PORT_CONNECTION): -+ WR_RH_PORTSTAT (RH_PS_CSC ); OK (0); -+ case (RH_C_PORT_ENABLE): -+ WR_RH_PORTSTAT (RH_PS_PESC); OK (0); -+ case (RH_C_PORT_SUSPEND): -+ WR_RH_PORTSTAT (RH_PS_PSSC); OK (0); -+ case (RH_C_PORT_OVER_CURRENT): -+ WR_RH_PORTSTAT (RH_PS_OCIC); OK (0); -+ case (RH_C_PORT_RESET): -+ WR_RH_PORTSTAT (RH_PS_PRSC); OK (0); -+ } -+ break; -+ -+ case RH_SET_FEATURE | RH_OTHER | RH_CLASS: -+ switch (wValue) { -+ case (RH_PORT_SUSPEND): -+ WR_RH_PORTSTAT (RH_PS_PSS ); OK (0); -+ case (RH_PORT_RESET): /* BUG IN HUP CODE *********/ -+ if (RD_RH_PORTSTAT & RH_PS_CCS) -+ WR_RH_PORTSTAT (RH_PS_PRS); -+ OK (0); -+ case (RH_PORT_POWER): -+ WR_RH_PORTSTAT (RH_PS_PPS ); OK (0); -+ case (RH_PORT_ENABLE): /* BUG IN HUP CODE *********/ -+ if (RD_RH_PORTSTAT & RH_PS_CCS) -+ WR_RH_PORTSTAT (RH_PS_PES ); -+ OK (0); -+ } -+ break; -+ -+ case RH_SET_ADDRESS: gohci.rh.devnum = wValue; OK(0); -+ -+ case RH_GET_DESCRIPTOR: -+ switch ((wValue & 0xff00) >> 8) { -+ case (0x01): /* device descriptor */ -+ len = min_t(unsigned int, -+ leni, -+ min_t(unsigned int, -+ sizeof (root_hub_dev_des), -+ wLength)); -+ data_buf = root_hub_dev_des; OK(len); -+ case (0x02): /* configuration descriptor */ -+ len = min_t(unsigned int, -+ leni, -+ min_t(unsigned int, -+ sizeof (root_hub_config_des), -+ wLength)); -+ data_buf = root_hub_config_des; OK(len); -+ case (0x03): /* string descriptors */ -+ if(wValue==0x0300) { -+ len = min_t(unsigned int, -+ leni, -+ min_t(unsigned int, -+ sizeof (root_hub_str_index0), -+ wLength)); -+ data_buf = root_hub_str_index0; -+ OK(len); -+ } -+ if(wValue==0x0301) { -+ len = min_t(unsigned int, -+ leni, -+ min_t(unsigned int, -+ sizeof (root_hub_str_index1), -+ wLength)); -+ data_buf = root_hub_str_index1; -+ OK(len); -+ } -+ default: -+ stat = USB_ST_STALLED; -+ } -+ break; -+ -+ case RH_GET_DESCRIPTOR | RH_CLASS: -+ { -+ __u32 temp = roothub_a (&gohci); -+ -+ data_buf [0] = 9; /* min length; */ -+ data_buf [1] = 0x29; -+ data_buf [2] = temp & RH_A_NDP; -+ data_buf [3] = 0; -+ if (temp & RH_A_PSM) /* per-port power switching? */ -+ data_buf [3] |= 0x1; -+ if (temp & RH_A_NOCP) /* no overcurrent reporting? */ -+ data_buf [3] |= 0x10; -+ else if (temp & RH_A_OCPM) /* per-port overcurrent reporting? */ -+ data_buf [3] |= 0x8; -+ -+ /* corresponds to data_buf[4-7] */ -+ datab [1] = 0; -+ data_buf [5] = (temp & RH_A_POTPGT) >> 24; -+ temp = roothub_b (&gohci); -+ data_buf [7] = temp & RH_B_DR; -+ if (data_buf [2] < 7) { -+ data_buf [8] = 0xff; -+ } else { -+ data_buf [0] += 2; -+ data_buf [8] = (temp & RH_B_DR) >> 8; -+ data_buf [10] = data_buf [9] = 0xff; -+ } -+ -+ len = min_t(unsigned int, leni, -+ min_t(unsigned int, data_buf [0], wLength)); -+ OK (len); -+ } -+ -+ case RH_GET_CONFIGURATION: *(__u8 *) data_buf = 0x01; OK (1); -+ -+ case RH_SET_CONFIGURATION: WR_RH_STAT (0x10000); OK (0); -+ -+ default: -+ dbg ("unsupported root hub command"); -+ stat = USB_ST_STALLED; -+ } -+ -+#ifdef DEBUG -+ ohci_dump_roothub (&gohci, 1); -+#else -+ wait_ms(1); -+#endif -+ -+ len = min_t(int, len, leni); -+ if (data != data_buf) -+ memcpy (data, data_buf, len); -+ dev->act_len = len; -+ dev->status = stat; -+ -+#ifdef DEBUG -+ if (transfer_len) -+ urb_priv.actual_length = transfer_len; -+ pkt_print(dev, pipe, buffer, transfer_len, cmd, "RET(rh)", 0/*usb_pipein(pipe)*/); -+#else -+ wait_ms(1); -+#endif -+ -+ return stat; -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* common code for handling submit messages - used for all but root hub */ -+/* accesses. */ -+int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer, -+ int transfer_len, struct devrequest *setup, int interval) -+{ -+ int stat = 0; -+ int maxsize = usb_maxpacket(dev, pipe); -+ int timeout; -+ -+ /* device pulled? Shortcut the action. */ -+ if (devgone == dev) { -+ dev->status = USB_ST_CRC_ERR; -+ return 0; -+ } -+ -+#ifdef DEBUG -+ urb_priv.actual_length = 0; -+ pkt_print(dev, pipe, buffer, transfer_len, setup, "SUB", usb_pipein(pipe)); -+#else -+ wait_ms(1); -+#endif -+ if (!maxsize) { -+ err("submit_common_message: pipesize for pipe %lx is zero", -+ pipe); -+ return -1; -+ } -+ -+ if (sohci_submit_job(dev, pipe, buffer, transfer_len, setup, interval) < 0) { -+ err("sohci_submit_job failed"); -+ return -1; -+ } -+ -+ wait_ms(10); -+ /* ohci_dump_status(&gohci); */ -+ -+ /* allow more time for a BULK device to react - some are slow */ -+#define BULK_TO 5000 /* timeout in milliseconds */ -+ if (usb_pipetype (pipe) == PIPE_BULK) -+ timeout = BULK_TO; -+ else -+ timeout = 100; -+ -+ /* wait for it to complete */ -+ for (;;) { -+ /* check whether the controller is done */ -+ stat = hc_interrupt(); -+ if (stat < 0) { -+ stat = USB_ST_CRC_ERR; -+ break; -+ } -+ if (stat >= 0 && stat != 0xff) { -+ /* 0xff is returned for an SF-interrupt */ -+ break; -+ } -+ if (--timeout) { -+ wait_ms(1); -+ } else { -+ err("CTL:TIMEOUT "); -+ stat = USB_ST_CRC_ERR; -+ break; -+ } -+ } -+ /* we got an Root Hub Status Change interrupt */ -+ if (got_rhsc) { -+#ifdef DEBUG -+ ohci_dump_roothub (&gohci, 1); -+#endif -+ got_rhsc = 0; -+ /* abuse timeout */ -+ timeout = rh_check_port_status(&gohci); -+ if (timeout >= 0) { -+#if 0 /* this does nothing useful, but leave it here in case that changes */ -+ /* the called routine adds 1 to the passed value */ -+ usb_hub_port_connect_change(gohci.rh.dev, timeout - 1); -+#endif -+ /* -+ * XXX -+ * This is potentially dangerous because it assumes -+ * that only one device is ever plugged in! -+ */ -+ devgone = dev; -+ } -+ } -+ -+ dev->status = stat; -+ dev->act_len = transfer_len; -+ -+#ifdef DEBUG -+ pkt_print(dev, pipe, buffer, transfer_len, setup, "RET(ctlr)", usb_pipein(pipe)); -+#else -+ wait_ms(1); -+#endif -+ -+ /* free TDs in urb_priv */ -+ urb_free_priv (&urb_priv); -+ return 0; -+} -+ -+/* submit routines called from usb.c */ -+int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer, -+ int transfer_len) -+{ -+ info("submit_bulk_msg"); -+ return submit_common_msg(dev, pipe, buffer, transfer_len, NULL, 0); -+} -+ -+int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer, -+ int transfer_len, struct devrequest *setup) -+{ -+ int maxsize = usb_maxpacket(dev, pipe); -+ -+ info("submit_control_msg"); -+#ifdef DEBUG -+ urb_priv.actual_length = 0; -+ pkt_print(dev, pipe, buffer, transfer_len, setup, "SUB", usb_pipein(pipe)); -+#else -+ wait_ms(1); -+#endif -+ if (!maxsize) { -+ err("submit_control_message: pipesize for pipe %lx is zero", -+ pipe); -+ return -1; -+ } -+ if (((pipe >> 8) & 0x7f) == gohci.rh.devnum) { -+ gohci.rh.dev = dev; -+ /* root hub - redirect */ -+ return ohci_submit_rh_msg(dev, pipe, buffer, transfer_len, -+ setup); -+ } -+ -+ return submit_common_msg(dev, pipe, buffer, transfer_len, setup, 0); -+} -+ -+int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer, -+ int transfer_len, int interval) -+{ -+ info("submit_int_msg"); -+ return -1; -+} -+ -+/*-------------------------------------------------------------------------* -+ * HC functions -+ *-------------------------------------------------------------------------*/ -+ -+/* reset the HC and BUS */ -+ -+static int hc_reset (ohci_t *ohci) -+{ -+ int timeout = 30; -+ int smm_timeout = 50; /* 0,5 sec */ -+ -+ if (readl (&ohci->regs->control) & OHCI_CTRL_IR) { /* SMM owns the HC */ -+ writel (OHCI_OCR, &ohci->regs->cmdstatus); /* request ownership */ -+ info("USB HC TakeOver from SMM"); -+ while (readl (&ohci->regs->control) & OHCI_CTRL_IR) { -+ wait_ms (10); -+ if (--smm_timeout == 0) { -+ err("USB HC TakeOver failed!"); -+ return -1; -+ } -+ } -+ } -+ -+ /* Disable HC interrupts */ -+ writel (OHCI_INTR_MIE, &ohci->regs->intrdisable); -+ -+ dbg("USB HC reset_hc usb-%s: ctrl = 0x%X ;", -+ ohci->slot_name, -+ readl (&ohci->regs->control)); -+ -+ /* Reset USB (needed by some controllers) */ -+ writel (0, &ohci->regs->control); -+ -+ /* HC Reset requires max 10 us delay */ -+ writel (OHCI_HCR, &ohci->regs->cmdstatus); -+ while ((readl (&ohci->regs->cmdstatus) & OHCI_HCR) != 0) { -+ if (--timeout == 0) { -+ err("USB HC reset timed out!"); -+ return -1; -+ } -+ udelay (1); -+ } -+ return 0; -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* Start an OHCI controller, set the BUS operational -+ * enable interrupts -+ * connect the virtual root hub */ -+ -+static int hc_start (ohci_t * ohci) -+{ -+ __u32 mask; -+ unsigned int fminterval; -+ -+ ohci->disabled = 1; -+ -+ /* Tell the controller where the control and bulk lists are -+ * The lists are empty now. */ -+ -+ writel (0, &ohci->regs->ed_controlhead); -+ writel (0, &ohci->regs->ed_bulkhead); -+ -+ writel ((__u32)ohci->hcca, &ohci->regs->hcca); /* a reset clears this */ -+ -+ fminterval = 0x2edf; -+ writel ((fminterval * 9) / 10, &ohci->regs->periodicstart); -+ fminterval |= ((((fminterval - 210) * 6) / 7) << 16); -+ writel (fminterval, &ohci->regs->fminterval); -+ writel (0x628, &ohci->regs->lsthresh); -+ -+ /* start controller operations */ -+ ohci->hc_control = OHCI_CONTROL_INIT | OHCI_USB_OPER; -+ ohci->disabled = 0; -+ writel (ohci->hc_control, &ohci->regs->control); -+ -+ /* disable all interrupts */ -+ mask = (OHCI_INTR_SO | OHCI_INTR_WDH | OHCI_INTR_SF | OHCI_INTR_RD | -+ OHCI_INTR_UE | OHCI_INTR_FNO | OHCI_INTR_RHSC | -+ OHCI_INTR_OC | OHCI_INTR_MIE); -+ writel (mask, &ohci->regs->intrdisable); -+ /* clear all interrupts */ -+ mask &= ~OHCI_INTR_MIE; -+ writel (mask, &ohci->regs->intrstatus); -+ /* Choose the interrupts we care about now - but w/o MIE */ -+ mask = OHCI_INTR_RHSC | OHCI_INTR_UE | OHCI_INTR_WDH | OHCI_INTR_SO; -+ writel (mask, &ohci->regs->intrenable); -+ -+#ifdef OHCI_USE_NPS -+ /* required for AMD-756 and some Mac platforms */ -+ writel ((roothub_a (ohci) | RH_A_NPS) & ~RH_A_PSM, -+ &ohci->regs->roothub.a); -+ writel (RH_HS_LPSC, &ohci->regs->roothub.status); -+#endif /* OHCI_USE_NPS */ -+ -+#define mdelay(n) ({unsigned long msec=(n); while (msec--) udelay(1000);}) -+ /* POTPGT delay is bits 24-31, in 2 ms units. */ -+ mdelay ((roothub_a (ohci) >> 23) & 0x1fe); -+ -+ /* connect the virtual root hub */ -+ ohci->rh.devnum = 0; -+ -+printf( "---> Done with hc_start\n" ); -+ -+ return 0; -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* an interrupt happens */ -+ -+static int -+hc_interrupt (void) -+{ -+ ohci_t *ohci = &gohci; -+ struct ohci_regs *regs = ohci->regs; -+ int ints; -+ int stat = -1; -+ -+ if ((ohci->hcca->done_head != 0) && !(m32_swap (ohci->hcca->done_head) & 0x01)) { -+ ints = OHCI_INTR_WDH; -+ } else { -+ ints = readl (®s->intrstatus); -+ } -+ -+dbg("Interrupt: %x frame: %x", ints, ohci->hcca->frame_no); -+ -+ if (ints & OHCI_INTR_RHSC) { -+dbg("rhsc\n" ); -+ got_rhsc = 1; -+ } -+ -+ if (ints & OHCI_INTR_UE) { -+ ohci->disabled++; -+ err ("OHCI Unrecoverable Error, controller usb-%s disabled", -+ ohci->slot_name); -+ /* e.g. due to PCI Master/Target Abort */ -+ -+#ifdef DEBUG -+ ohci_dump (ohci, 1); -+#else -+ wait_ms(1); -+#endif -+ /* FIXME: be optimistic, hope that bug won't repeat often. */ -+ /* Make some non-interrupt context restart the controller. */ -+ /* Count and limit the retries though; either hardware or */ -+ /* software errors can go forever... */ -+ hc_reset (ohci); -+ return -1; -+ } -+ -+ if (ints & OHCI_INTR_WDH) { -+ wait_ms(1); -+ writel (OHCI_INTR_WDH, ®s->intrdisable); -+ stat = dl_done_list (&gohci, dl_reverse_done_list (&gohci)); -+ writel (OHCI_INTR_WDH, ®s->intrenable); -+dbg("wdh: %x\n", stat ); -+ goto out ; -+ } -+ -+ if (ints & OHCI_INTR_SO) { -+ dbg("USB Schedule overrun\n"); -+ writel (OHCI_INTR_SO, ®s->intrenable); -+ stat = -1; -+ } -+ -+ /* FIXME: this assumes SOF (1/ms) interrupts don't get lost... */ -+ if (ints & OHCI_INTR_SF) { -+ unsigned int frame = m16_swap (ohci->hcca->frame_no) & 1; -+ wait_ms(1); -+ writel (OHCI_INTR_SF, ®s->intrdisable); -+ if (ohci->ed_rm_list[frame] != NULL) -+ writel (OHCI_INTR_SF, ®s->intrenable); -+ if( -1 == stat ) -+ stat = 0xff; -+dbg("sf\n" ); -+ } -+ if( 0 == ints ) -+ stat = 0 ; -+out: -+ writel (ints, ®s->intrstatus); -+ return stat; -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* De-allocate all resources.. */ -+ -+static void hc_release_ohci (ohci_t *ohci) -+{ -+ dbg ("USB HC release ohci usb-%s", ohci->slot_name); -+ -+ if (!ohci->disabled) -+ hc_reset (ohci); -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* -+ * low level initalisation routine, called from usb.c -+ */ -+static char ohci_inited = 0; -+ -+int usb_lowlevel_init(void) -+{ -+#ifdef FIXME -+ S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER(); -+ S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO(); -+ /* -+ * Set the 48 MHz UPLL clocking. Values are taken from -+ * "PLL value selection guide", 6-23, s3c2400_UM.pdf. -+ */ -+ clk_power->UPLLCON = ((40 << 12) + (1 << 4) + 2); -+ gpio->MISCCR |= 0x8; /* 1 = use pads related USB for USB host */ -+ /* -+ * Enable USB host clock. -+ */ -+ clk_power->CLKCON |= (1 << 4); -+#endif -+#ifdef CONFIG_PXA27X -+ /* -+ * Section 20.6.1 of PXA Developer's reference manual -+ */ -+ GPCR3 |= 0x80 ; // GP103 low -+ -+ UHCHR |= UHCHR_SSEP2|UHCHR_SSEP1 ; // Port 2 and 3 not supported -+ UHCHR &= ~(UHCHR_SSE|UHCHR_SSEP0); -+ -+// UHCRHS &= ~UHCRHS_LPS ; -+// UHCCOMS &= ~UHCCOMS_HCR ; // reset -+ CKEN |= CKEN10_USBHOST ; -+ udelay(10); -+ UHCHR &= ~(UHCHR_FHR|UHCHR_SSE); -+#elif defined( CONFIG_SM501 ) -+ USB_GATE_MODE0 |= ENABLE_USBH ; -+ USB_GATE_MODE1 |= ENABLE_USBH ; -+#endif -+ -+ memset (&gohci, 0, sizeof (ohci_t)); -+ memset (&urb_priv, 0, sizeof (urb_priv_t)); -+ -+ /* align the storage */ -+ if ((__u32)&ghcca[0] & 0xff) { -+ err("HCCA not aligned!!"); -+ return -1; -+ } -+ phcca = &ghcca[0]; -+ info("aligned ghcca %p", phcca); -+ memset(&ohci_dev, 0, sizeof(struct ohci_device)); -+ if ((__u32)&ohci_dev.ed[0] & 0x7) { -+ err("EDs not aligned!!"); -+ return -1; -+ } -+ memset(gtd, 0, sizeof(td_t) * (NUM_TD + 1)); -+ if ((__u32)gtd & 0x7) { -+ err("TDs not aligned!!"); -+ return -1; -+ } -+ ptd = gtd; -+ gohci.hcca = phcca; -+ memset (phcca, 0, sizeof (struct ohci_hcca)); -+ -+ gohci.disabled = 1; -+ gohci.sleeping = 0; -+ gohci.irq = -1; -+ gohci.regs = (struct ohci_regs *)USBH_BASE ; -+ gohci.flags = 0; -+ gohci.slot_name = "s3c2400"; -+ -+ if (hc_reset (&gohci) < 0) { -+ err( "----> Error from hc_reset\n" ); -+ hc_release_ohci (&gohci); -+ /* Initialization failed */ -+#ifdef FIXME -+ clk_power->CLKCON &= ~(1 << 4); -+#endif -+#ifdef CONFIG_PXA27X -+ CKEN &= ~CKEN10_USBHOST ; -+#elif defined( CONFIG_SM501 ) -+#endif -+ return -1; -+ } -+ -+ /* FIXME this is a second HC reset; why?? */ -+ writel (gohci.hc_control = OHCI_USB_RESET, &gohci.regs->control); -+ wait_ms (10); -+ -+ if (hc_start (&gohci) < 0) { -+ err ("can't start usb-%s", gohci.slot_name); -+ hc_release_ohci (&gohci); -+ /* Initialization failed */ -+#ifdef FIXME -+ clk_power->CLKCON &= ~(1 << 4); -+#endif -+#ifdef CONFIG_PXA27X -+ CKEN &= ~CKEN10_USBHOST ; -+#elif defined( CONFIG_SM501 ) -+#endif -+ return -1; -+ } -+ -+#ifdef DEBUG -+ ohci_dump (&gohci, 1); -+#else -+ wait_ms(1); -+#endif -+printf( "----> end of low_level_init()\n" ); -+ ohci_inited = 1; -+ return 0; -+} -+ -+int usb_lowlevel_stop(void) -+{ -+ /* this gets called really early - before the controller has */ -+ /* even been initialized! */ -+ if (!ohci_inited) -+ return 0; -+ /* TODO release any interrupts, etc. */ -+ /* call hc_release_ohci() here ? */ -+ hc_reset (&gohci); -+ -+#ifdef CONFIG_PXA27X -+ /* -+ * Section 20.7.4.4 of PXA Developer's reference manual -+ */ -+ UHCCOMS |= UHCCOMS_HCR ; // reset -+ udelay(10); -+ UHCRHS |= UHCRHS_LPS ; -+ UHCHR |= UHCHR_SSE ; -+ CKEN &= ~CKEN10_USBHOST ; -+#elif defined( CONFIG_SM501 ) -+#endif -+ -+ return 0; -+} -+ -+#endif /* CONFIG_USB_OHCI */ -diff -u -r --new-file u-boot-1.1.2/cpu/pxa/usb_ohci.h u-boot-1.1.2-neon/cpu/pxa/usb_ohci.h ---- u-boot-1.1.2/cpu/pxa/usb_ohci.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/cpu/pxa/usb_ohci.h 2007-08-11 21:07:20.000000000 +0200 -@@ -0,0 +1,419 @@ -+/* -+ * URB OHCI HCD (Host Controller Driver) for USB. -+ * -+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> -+ * (C) Copyright 2000-2001 David Brownell <dbrownell@users.sourceforge.net> -+ * -+ * usb-ohci.h -+ */ -+ -+ -+static int cc_to_error[16] = { -+ -+/* mapping of the OHCI CC status to error codes */ -+ /* No Error */ 0, -+ /* CRC Error */ USB_ST_CRC_ERR, -+ /* Bit Stuff */ USB_ST_BIT_ERR, -+ /* Data Togg */ USB_ST_CRC_ERR, -+ /* Stall */ USB_ST_STALLED, -+ /* DevNotResp */ -1, -+ /* PIDCheck */ USB_ST_BIT_ERR, -+ /* UnExpPID */ USB_ST_BIT_ERR, -+ /* DataOver */ USB_ST_BUF_ERR, -+ /* DataUnder */ USB_ST_BUF_ERR, -+ /* reservd */ -1, -+ /* reservd */ -1, -+ /* BufferOver */ USB_ST_BUF_ERR, -+ /* BuffUnder */ USB_ST_BUF_ERR, -+ /* Not Access */ -1, -+ /* Not Access */ -1 -+}; -+ -+/* ED States */ -+ -+#define ED_NEW 0x00 -+#define ED_UNLINK 0x01 -+#define ED_OPER 0x02 -+#define ED_DEL 0x04 -+#define ED_URB_DEL 0x08 -+ -+/* usb_ohci_ed */ -+struct ed { -+ __u32 hwINFO; -+ __u32 hwTailP; -+ __u32 hwHeadP; -+ __u32 hwNextED; -+ -+ struct ed *ed_prev; -+ __u8 int_period; -+ __u8 int_branch; -+ __u8 int_load; -+ __u8 int_interval; -+ __u8 state; -+ __u8 type; -+ __u16 last_iso; -+ struct ed *ed_rm_list; -+ -+ struct usb_device *usb_dev; -+ __u32 unused[3]; -+} __attribute((aligned(16))); -+typedef struct ed ed_t; -+ -+ -+/* TD info field */ -+#define TD_CC 0xf0000000 -+#define TD_CC_GET(td_p) ((td_p >>28) & 0x0f) -+#define TD_CC_SET(td_p, cc) (td_p) = ((td_p) & 0x0fffffff) | (((cc) & 0x0f) << 28) -+#define TD_EC 0x0C000000 -+#define TD_T 0x03000000 -+#define TD_T_DATA0 0x02000000 -+#define TD_T_DATA1 0x03000000 -+#define TD_T_TOGGLE 0x00000000 -+#define TD_R 0x00040000 -+#define TD_DI 0x00E00000 -+#define TD_DI_SET(X) (((X) & 0x07)<< 21) -+#define TD_DP 0x00180000 -+#define TD_DP_SETUP 0x00000000 -+#define TD_DP_IN 0x00100000 -+#define TD_DP_OUT 0x00080000 -+ -+#define TD_ISO 0x00010000 -+#define TD_DEL 0x00020000 -+ -+/* CC Codes */ -+#define TD_CC_NOERROR 0x00 -+#define TD_CC_CRC 0x01 -+#define TD_CC_BITSTUFFING 0x02 -+#define TD_CC_DATATOGGLEM 0x03 -+#define TD_CC_STALL 0x04 -+#define TD_DEVNOTRESP 0x05 -+#define TD_PIDCHECKFAIL 0x06 -+#define TD_UNEXPECTEDPID 0x07 -+#define TD_DATAOVERRUN 0x08 -+#define TD_DATAUNDERRUN 0x09 -+#define TD_BUFFEROVERRUN 0x0C -+#define TD_BUFFERUNDERRUN 0x0D -+#define TD_NOTACCESSED 0x0F -+ -+ -+#define MAXPSW 1 -+ -+struct td { -+ __u32 hwINFO; -+ __u32 hwCBP; /* Current Buffer Pointer */ -+ __u32 hwNextTD; /* Next TD Pointer */ -+ __u32 hwBE; /* Memory Buffer End Pointer */ -+ -+ __u16 hwPSW[MAXPSW]; -+ __u8 unused; -+ __u8 index; -+ struct ed *ed; -+ struct td *next_dl_td; -+ struct usb_device *usb_dev; -+ int transfer_len; -+ __u32 data; -+ -+ __u32 unused2[2]; -+} __attribute((aligned(32))); -+typedef struct td td_t; -+ -+#define OHCI_ED_SKIP (1 << 14) -+ -+/* -+ * The HCCA (Host Controller Communications Area) is a 256 byte -+ * structure defined in the OHCI spec. that the host controller is -+ * told the base address of. It must be 256-byte aligned. -+ */ -+ -+#define NUM_INTS 32 /* part of the OHCI standard */ -+struct ohci_hcca { -+ __u32 int_table[NUM_INTS]; /* Interrupt ED table */ -+ __u16 frame_no; /* current frame number */ -+ __u16 pad1; /* set to 0 on each frame_no change */ -+ __u32 done_head; /* info returned for an interrupt */ -+ u8 reserved_for_hc[116]; -+} __attribute((aligned(256))); -+ -+ -+/* -+ * Maximum number of root hub ports. -+ */ -+#define MAX_ROOT_PORTS 15 /* maximum OHCI root hub ports */ -+ -+/* -+ * This is the structure of the OHCI controller's memory mapped I/O -+ * region. This is Memory Mapped I/O. You must use the readl() and -+ * writel() macros defined in asm/io.h to access these!! -+ */ -+struct ohci_regs { -+ /* control and status registers */ -+ __u32 revision; -+ __u32 control; -+ __u32 cmdstatus; -+ __u32 intrstatus; -+ __u32 intrenable; -+ __u32 intrdisable; -+ /* memory pointers */ -+ __u32 hcca; -+ __u32 ed_periodcurrent; -+ __u32 ed_controlhead; -+ __u32 ed_controlcurrent; -+ __u32 ed_bulkhead; -+ __u32 ed_bulkcurrent; -+ __u32 donehead; -+ /* frame counters */ -+ __u32 fminterval; -+ __u32 fmremaining; -+ __u32 fmnumber; -+ __u32 periodicstart; -+ __u32 lsthresh; -+ /* Root hub ports */ -+ struct ohci_roothub_regs { -+ __u32 a; -+ __u32 b; -+ __u32 status; -+ __u32 portstatus[MAX_ROOT_PORTS]; -+ } roothub; -+} __attribute((aligned(32))); -+ -+ -+/* OHCI CONTROL AND STATUS REGISTER MASKS */ -+ -+/* -+ * HcControl (control) register masks -+ */ -+#define OHCI_CTRL_CBSR (3 << 0) /* control/bulk service ratio */ -+#define OHCI_CTRL_PLE (1 << 2) /* periodic list enable */ -+#define OHCI_CTRL_IE (1 << 3) /* isochronous enable */ -+#define OHCI_CTRL_CLE (1 << 4) /* control list enable */ -+#define OHCI_CTRL_BLE (1 << 5) /* bulk list enable */ -+#define OHCI_CTRL_HCFS (3 << 6) /* host controller functional state */ -+#define OHCI_CTRL_IR (1 << 8) /* interrupt routing */ -+#define OHCI_CTRL_RWC (1 << 9) /* remote wakeup connected */ -+#define OHCI_CTRL_RWE (1 << 10) /* remote wakeup enable */ -+ -+/* pre-shifted values for HCFS */ -+# define OHCI_USB_RESET (0 << 6) -+# define OHCI_USB_RESUME (1 << 6) -+# define OHCI_USB_OPER (2 << 6) -+# define OHCI_USB_SUSPEND (3 << 6) -+ -+/* -+ * HcCommandStatus (cmdstatus) register masks -+ */ -+#define OHCI_HCR (1 << 0) /* host controller reset */ -+#define OHCI_CLF (1 << 1) /* control list filled */ -+#define OHCI_BLF (1 << 2) /* bulk list filled */ -+#define OHCI_OCR (1 << 3) /* ownership change request */ -+#define OHCI_SOC (3 << 16) /* scheduling overrun count */ -+ -+/* -+ * masks used with interrupt registers: -+ * HcInterruptStatus (intrstatus) -+ * HcInterruptEnable (intrenable) -+ * HcInterruptDisable (intrdisable) -+ */ -+#define OHCI_INTR_SO (1 << 0) /* scheduling overrun */ -+#define OHCI_INTR_WDH (1 << 1) /* writeback of done_head */ -+#define OHCI_INTR_SF (1 << 2) /* start frame */ -+#define OHCI_INTR_RD (1 << 3) /* resume detect */ -+#define OHCI_INTR_UE (1 << 4) /* unrecoverable error */ -+#define OHCI_INTR_FNO (1 << 5) /* frame number overflow */ -+#define OHCI_INTR_RHSC (1 << 6) /* root hub status change */ -+#define OHCI_INTR_OC (1 << 30) /* ownership change */ -+#define OHCI_INTR_MIE (1 << 31) /* master interrupt enable */ -+ -+ -+/* Virtual Root HUB */ -+struct virt_root_hub { -+ int devnum; /* Address of Root Hub endpoint */ -+ void *dev; /* was urb */ -+ void *int_addr; -+ int send; -+ int interval; -+}; -+ -+/* USB HUB CONSTANTS (not OHCI-specific; see hub.h) */ -+ -+/* destination of request */ -+#define RH_INTERFACE 0x01 -+#define RH_ENDPOINT 0x02 -+#define RH_OTHER 0x03 -+ -+#define RH_CLASS 0x20 -+#define RH_VENDOR 0x40 -+ -+/* Requests: bRequest << 8 | bmRequestType */ -+#define RH_GET_STATUS 0x0080 -+#define RH_CLEAR_FEATURE 0x0100 -+#define RH_SET_FEATURE 0x0300 -+#define RH_SET_ADDRESS 0x0500 -+#define RH_GET_DESCRIPTOR 0x0680 -+#define RH_SET_DESCRIPTOR 0x0700 -+#define RH_GET_CONFIGURATION 0x0880 -+#define RH_SET_CONFIGURATION 0x0900 -+#define RH_GET_STATE 0x0280 -+#define RH_GET_INTERFACE 0x0A80 -+#define RH_SET_INTERFACE 0x0B00 -+#define RH_SYNC_FRAME 0x0C80 -+/* Our Vendor Specific Request */ -+#define RH_SET_EP 0x2000 -+ -+ -+/* Hub port features */ -+#define RH_PORT_CONNECTION 0x00 -+#define RH_PORT_ENABLE 0x01 -+#define RH_PORT_SUSPEND 0x02 -+#define RH_PORT_OVER_CURRENT 0x03 -+#define RH_PORT_RESET 0x04 -+#define RH_PORT_POWER 0x08 -+#define RH_PORT_LOW_SPEED 0x09 -+ -+#define RH_C_PORT_CONNECTION 0x10 -+#define RH_C_PORT_ENABLE 0x11 -+#define RH_C_PORT_SUSPEND 0x12 -+#define RH_C_PORT_OVER_CURRENT 0x13 -+#define RH_C_PORT_RESET 0x14 -+ -+/* Hub features */ -+#define RH_C_HUB_LOCAL_POWER 0x00 -+#define RH_C_HUB_OVER_CURRENT 0x01 -+ -+#define RH_DEVICE_REMOTE_WAKEUP 0x00 -+#define RH_ENDPOINT_STALL 0x01 -+ -+#define RH_ACK 0x01 -+#define RH_REQ_ERR -1 -+#define RH_NACK 0x00 -+ -+ -+/* OHCI ROOT HUB REGISTER MASKS */ -+ -+/* roothub.portstatus [i] bits */ -+#define RH_PS_CCS 0x00000001 /* current connect status */ -+#define RH_PS_PES 0x00000002 /* port enable status*/ -+#define RH_PS_PSS 0x00000004 /* port suspend status */ -+#define RH_PS_POCI 0x00000008 /* port over current indicator */ -+#define RH_PS_PRS 0x00000010 /* port reset status */ -+#define RH_PS_PPS 0x00000100 /* port power status */ -+#define RH_PS_LSDA 0x00000200 /* low speed device attached */ -+#define RH_PS_CSC 0x00010000 /* connect status change */ -+#define RH_PS_PESC 0x00020000 /* port enable status change */ -+#define RH_PS_PSSC 0x00040000 /* port suspend status change */ -+#define RH_PS_OCIC 0x00080000 /* over current indicator change */ -+#define RH_PS_PRSC 0x00100000 /* port reset status change */ -+ -+/* roothub.status bits */ -+#define RH_HS_LPS 0x00000001 /* local power status */ -+#define RH_HS_OCI 0x00000002 /* over current indicator */ -+#define RH_HS_DRWE 0x00008000 /* device remote wakeup enable */ -+#define RH_HS_LPSC 0x00010000 /* local power status change */ -+#define RH_HS_OCIC 0x00020000 /* over current indicator change */ -+#define RH_HS_CRWE 0x80000000 /* clear remote wakeup enable */ -+ -+/* roothub.b masks */ -+#define RH_B_DR 0x0000ffff /* device removable flags */ -+#define RH_B_PPCM 0xffff0000 /* port power control mask */ -+ -+/* roothub.a masks */ -+#define RH_A_NDP (0xff << 0) /* number of downstream ports */ -+#define RH_A_PSM (1 << 8) /* power switching mode */ -+#define RH_A_NPS (1 << 9) /* no power switching */ -+#define RH_A_DT (1 << 10) /* device type (mbz) */ -+#define RH_A_OCPM (1 << 11) /* over current protection mode */ -+#define RH_A_NOCP (1 << 12) /* no over current protection */ -+#define RH_A_POTPGT (0xff << 24) /* power on to power good time */ -+ -+/* urb */ -+#define N_URB_TD 48 -+typedef struct -+{ -+ ed_t *ed; -+ __u16 length; /* number of tds associated with this request */ -+ __u16 td_cnt; /* number of tds already serviced */ -+ int state; -+ unsigned long pipe; -+ int actual_length; -+ td_t *td[N_URB_TD]; /* list pointer to all corresponding TDs associated with this request */ -+} urb_priv_t; -+#define URB_DEL 1 -+ -+/* -+ * This is the full ohci controller description -+ * -+ * Note how the "proper" USB information is just -+ * a subset of what the full implementation needs. (Linus) -+ */ -+ -+ -+typedef struct ohci { -+ struct ohci_hcca *hcca; /* hcca */ -+ /*dma_addr_t hcca_dma;*/ -+ -+ int irq; -+ int disabled; /* e.g. got a UE, we're hung */ -+ int sleeping; -+ unsigned long flags; /* for HC bugs */ -+ -+ struct ohci_regs *regs; /* OHCI controller's memory */ -+ -+ ed_t *ed_rm_list[2]; /* lists of all endpoints to be removed */ -+ ed_t *ed_bulktail; /* last endpoint of bulk list */ -+ ed_t *ed_controltail; /* last endpoint of control list */ -+ int intrstatus; -+ __u32 hc_control; /* copy of the hc control reg */ -+ struct usb_device *dev[32]; -+ struct virt_root_hub rh; -+ -+ const char *slot_name; -+} ohci_t; -+ -+#define NUM_EDS 8 /* num of preallocated endpoint descriptors */ -+ -+struct ohci_device { -+ ed_t ed[NUM_EDS]; -+ int ed_cnt; -+}; -+ -+/* hcd */ -+/* endpoint */ -+static int ep_link(ohci_t * ohci, ed_t * ed); -+static int ep_unlink(ohci_t * ohci, ed_t * ed); -+static ed_t * ep_add_ed(struct usb_device * usb_dev, unsigned long pipe); -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* we need more TDs than EDs */ -+#define NUM_TD 64 -+ -+/* +1 so we can align the storage */ -+td_t gtd[NUM_TD+1]; -+/* pointers to aligned storage */ -+td_t *ptd; -+ -+/* TDs ... */ -+static inline struct td * -+td_alloc (struct usb_device *usb_dev) -+{ -+ int i; -+ struct td *td; -+ -+ td = NULL; -+ for (i = 0; i < NUM_TD; i++) -+ { -+ if (ptd[i].usb_dev == NULL) -+ { -+ td = &ptd[i]; -+ td->usb_dev = usb_dev; -+ break; -+ } -+ } -+ -+ return td; -+} -+ -+static inline void -+ed_free (struct ed *ed) -+{ -+ ed->usb_dev = NULL; -+} -diff -u -r --new-file u-boot-1.1.2/.cvsignore u-boot-1.1.2-neon/.cvsignore ---- u-boot-1.1.2/.cvsignore 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/.cvsignore 2007-08-11 21:07:19.000000000 +0200 -@@ -0,0 +1,13 @@ -+*.map -+*.scr -+*.gz -+select.h -+*.log -+select.mk -+u-boot -+u-boot.bin -+u-boot.map -+u-boot.map.sorted -+u-boot.srec -+u-boot-binaries.zip -+ -diff -u -r --new-file u-boot-1.1.2/drivers/lan91c96.h u-boot-1.1.2-neon/drivers/lan91c96.h ---- u-boot-1.1.2/drivers/lan91c96.h 2004-06-07 00:11:41.000000000 +0200 -+++ u-boot-1.1.2-neon/drivers/lan91c96.h 2007-08-11 21:07:21.000000000 +0200 -@@ -76,7 +76,7 @@ - - #define SMC_IO_EXTENT 16 - --#ifdef CONFIG_PXA250 -+#if defined( CONFIG_PXA250 ) || defined( CONFIG_PXA270 ) - - #define SMC_inl(r) (*((volatile dword *)(SMC_BASE_ADDRESS+( r * 4 )))) - #define SMC_inw(r) (*((volatile word *)(SMC_BASE_ADDRESS+( r * 4 )))) -@@ -139,7 +139,7 @@ - }; \ - }) - --#else /* if not CONFIG_PXA250 */ -+#else /* if not CONFIG_PXA250 or CONFIG_PXA270 */ - - /* - * We have only 16 Bit PCMCIA access on Socket 0 -diff -u -r --new-file u-boot-1.1.2/drivers/smc91111.c u-boot-1.1.2-neon/drivers/smc91111.c ---- u-boot-1.1.2/drivers/smc91111.c 2004-11-22 23:20:09.000000000 +0100 -+++ u-boot-1.1.2-neon/drivers/smc91111.c 2007-08-11 21:07:21.000000000 +0200 -@@ -1583,6 +1583,101 @@ - return (0); - } - -+#define SMC_GET_INT_MASK() (SMC_inw( SMC91111_INT_REG ) >> 8) -+#define SMC_SET_INT_MASK(x) SMC_outw( (x) << 8, SMC91111_INT_REG ) -+#define SMC_CURRENT_BANK() SMC_inw( BANK_SELECT ) -+#define SMC_GET_CTL() SMC_inw( CTL_REG ) -+#define SMC_SET_CTL(x) SMC_outw( x, CTL_REG ) -+#define SMC_GET_MII() SMC_inw( MII_REG ) -+#define SMC_SET_MII(x) SMC_outw( x, MII_REG ) -+#define SMC_GET_PTR() SMC_inw( PTR_REG ) -+#define SMC_SET_PTR(x) SMC_outw( x, PTR_REG ) -+ -+static int writeEEprom(int i,unsigned short val,unsigned short ctl) -+{ -+ SMC_SELECT_BANK( 2 ); -+ SMC_SET_PTR( i ); -+ SMC_SELECT_BANK( 1 ); -+ SMC_outw( val, GP_REG ); -+ udelay(1); -+ SMC_SET_CTL( ctl | CTL_EEPROM_SELECT | CTL_STORE ); -+ int j=0; -+ do { -+ udelay(10); -+ j++; -+ if (j>=100000) return -1; -+ } while (SMC_GET_CTL() & CTL_STORE); -+ return 0; -+} -+ -+#define SMC_SET_MAC_ADDR(addr) \ -+ do { \ -+ SMC_outw( addr[0]|(addr[1] << 8), ADDR0_REG ); \ -+ SMC_outw( addr[2]|(addr[3] << 8), ADDR1_REG ); \ -+ SMC_outw( addr[4]|(addr[5] << 8), ADDR2_REG ); \ -+ } while (0) -+ -+int set_rom_mac (char const *mac) -+{ -+ unsigned short saved_bank = SMC_CURRENT_BANK(); -+ SMC_SELECT_BANK( 2 ); -+ -+ unsigned short saved_mask = SMC_GET_INT_MASK(); -+ SMC_SET_INT_MASK( 0 ); -+ -+ unsigned short saved_ptr = SMC_GET_PTR(); -+ -+ SMC_SELECT_BANK( 1 ); -+ -+ unsigned short saved_ctl = SMC_GET_CTL(); -+ -+ SMC_SET_MAC_ADDR(mac); -+ -+ SMC_SELECT_BANK( 3 ); -+ unsigned short mii_reg = SMC_GET_MII(); -+ -+ SMC_SET_MII(mii_reg & ~(0x0f)); -+ -+ SMC_SELECT_BANK( 1 ); -+ -+ SMC_SET_CTL( saved_ctl | CTL_EEPROM_SELECT ); -+ unsigned short cfg = CONFIG_DEFAULT -+ | CONFIG_NO_WAIT -+ | CONFIG_EPH_POWER_EN; -+ unsigned short bar = (unsigned short)( SMC_BASE_ADDRESS ); -+//a4, a10,a11,a12 must be all zeros -+ bar = (bar & 0xe000) | ((bar & 0x3e0)<<3) | (0x27); -+ int i=0; -+ while (i < 0x20) { -+ if (writeEEprom(i,cfg,saved_ctl)) break; -+ if (writeEEprom(i+1,bar,saved_ctl)) break; -+ if (writeEEprom(i+2,0,saved_ctl)) break; -+ if (writeEEprom(i+3,0,saved_ctl)) break; -+ i+=4; -+ } -+ -+ int j = 0; -+ if (i==0x20) { -+ while (j < 6) { -+ if (writeEEprom(i,mac[j]|(mac[j+1]<<8),saved_ctl)) break; -+ i++; j+=2; -+ } -+ } -+ -+ SMC_SET_CTL( saved_ctl ); -+ -+ SMC_SELECT_BANK( 2 ); -+ SMC_SET_PTR( saved_ptr ); -+ SMC_SET_INT_MASK( saved_mask ); -+ SMC_SELECT_BANK( saved_bank ); -+ -+ return 6 == j ; -+} -+ -+static char const invalidMac[6] = { -+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -+}; -+ - int get_rom_mac (char *v_rom_mac) - { - #ifdef HARDCODE_MAC /* used for testing or to supress run time warnings */ -@@ -1601,6 +1696,9 @@ - valid_mac |= v_rom_mac[i]; - } - -+ if( valid_mac ) -+ valid_mac = ( 0 != memcmp( invalidMac, v_rom_mac, sizeof(invalidMac) ) ); -+ - return (valid_mac ? 1 : 0); - #endif - } -diff -u -r --new-file u-boot-1.1.2/drivers/smc91111.h u-boot-1.1.2-neon/drivers/smc91111.h ---- u-boot-1.1.2/drivers/smc91111.h 2004-11-02 14:00:56.000000000 +0100 -+++ u-boot-1.1.2-neon/drivers/smc91111.h 2007-08-11 21:07:21.000000000 +0200 -@@ -74,7 +74,7 @@ - - #define SMC_IO_EXTENT 16 - --#ifdef CONFIG_PXA250 -+#if defined( CONFIG_PXA250 ) || defined( CONFIG_PXA270 ) - - #ifdef CONFIG_XSENGINE - #define SMC_inl(r) (*((volatile dword *)(SMC_BASE_ADDRESS+(r<<1)))) -@@ -176,7 +176,7 @@ - }; \ - }) - --#else /* if not CONFIG_PXA250 */ -+#else /* if not CONFIG_PXA250 or CONFIG_PXA270 */ - - #ifndef CONFIG_SMC_USE_IOFUNCS /* these macros don't work on some boards */ - /* -diff -u -r --new-file u-boot-1.1.2/examples/Makefile u-boot-1.1.2-neon/examples/Makefile ---- u-boot-1.1.2/examples/Makefile 2004-10-10 23:27:33.000000000 +0200 -+++ u-boot-1.1.2-neon/examples/Makefile 2007-08-11 21:07:21.000000000 +0200 -@@ -100,12 +100,12 @@ - LIBCOBJS= stubs.o - LIBOBJS = $(LIBAOBJS) $(LIBCOBJS) - --gcclibdir := $(shell dirname `$(CC) -print-libgcc-file-name`) --clibdir := $(shell dirname `$(CC) $(CFLAGS) -print-file-name=libc.a`) -+gcclibdir := $(shell dirname "`$(CC) -print-libgcc-file-name`") -+clibdir := $(shell dirname "`$(CC) $(CFLAGS) -print-file-name=libc.a`") - - CPPFLAGS += -I.. - --all: .depend $(LIB) $(SREC) $(BIN) -+all: .depend $(LIB) - - ######################################################################### - $(LIB): .depend $(LIBOBJS) -diff -u -r --new-file u-boot-1.1.2/fs/fat/fat.c u-boot-1.1.2-neon/fs/fat/fat.c ---- u-boot-1.1.2/fs/fat/fat.c 2004-12-16 18:57:26.000000000 +0100 -+++ u-boot-1.1.2-neon/fs/fat/fat.c 2007-08-11 21:07:21.000000000 +0200 -@@ -52,6 +52,8 @@ - #define DOS_PART_TBL_OFFSET 0x1be - #define DOS_PART_MAGIC_OFFSET 0x1fe - #define DOS_FS_TYPE_OFFSET 0x36 -+#define DOS_FS_TYPE_OFFSET_FAT_16 0x36 // Code relating to this constant was changed/added by Dubner 2005-05-20 -+#define DOS_FS_TYPE_OFFSET_FAT_32 0x52 // Code relating to this constant was changed/added by Dubner 2005-05-20 - - int disk_read (__u32 startblock, __u32 getsize, __u8 * bufptr) - { -@@ -83,7 +85,8 @@ - /* no signature found */ - return -1; - } -- if(!strncmp(&buffer[DOS_FS_TYPE_OFFSET],"FAT",3)) { -+ if(!strncmp(&buffer[DOS_FS_TYPE_OFFSET_FAT_16],"FAT",3) -+ || !strncmp (&buffer[DOS_FS_TYPE_OFFSET_FAT_32], "FAT", 3)) { - /* ok, we assume we are on a PBR only */ - cur_part = 1; - part_offset=0; -@@ -342,7 +345,7 @@ - newclust = get_fatent(mydata, endclust); - if((newclust -1)!=endclust) - goto getit; -- if (newclust <= 0x0001 || newclust >= 0xfff0) { -+ if (newclust <= 0x0001 ) { // || newclust >= 0xfff0) { - FAT_DPRINT("curclust: 0x%x\n", newclust); - FAT_DPRINT("Invalid FAT entry\n"); - return gotsize; -@@ -890,7 +893,7 @@ - dentptr++; - continue; - } -- if (strcmp (fnamecopy, s_name) && strcmp (fnamecopy, l_name)) { -+ if (fnmatch(fnamecopy, s_name,0) && fnmatch(fnamecopy, l_name,0)) { - FAT_DPRINT ("RootMismatch: |%s|%s|\n", s_name, l_name); - dentptr++; - continue; -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/BigMacro.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/BigMacro.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/BigMacro.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/BigMacro.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,325 @@ -+// -+// linux/include/asm-arm/BigMacro.h -+// -+// Author: Troy Kisky -+// Created: Jun 30, 2002 -+// Copyright: Boundary Devices -+// -+// This program is free software; you can redistribute it and/or modify -+// it under the terms of the GNU General Public License version 2 as -+// published by the Free Software Foundation. -+// -+ .nolist -+ -+//find set bit pair >= curbit -+//out: __nBit -+ .ifdef __ARMASM -+ GBLA __nBit -+ GBLA __nMask -+ GBLA __nVal -+; DCD __nV1 -+ -+.macro NextSetBitUp val,curBit -+ LCLA __nV1 -+ .set __nBit,(\curBit) -+ .set __nV1,(\val) -+ WHILE ( (__nBit < 30) :LAND: ( (__nV1 :AND: (0x03:SHL:__nBit))=0) ) -+ .set __nBit,(__nBit)+2 -+ WEND -+.endm -+ -+//find set bit pair <= curbit -+//out: __nBit -+.macro NextSetBitDown val,curBit -+ LCLA __nV1 -+ .set __nBit,(\curBit) -+ .set __nV1,(\val) -+ WHILE ( (__nBit <> 0) :LAND: ( (__nV1:AND:(0xc0:SHL:__nBit))=0) ) -+ .set __nBit,(__nBit)-2 -+ WEND -+.endm -+ .else -+ -+.macro NextSetBitUp val,curBit -+ .set __nBit,(\curBit) -+ .set __nV1,(\val) -+ .if ((__nV1) & (0x03<<(__nBit))) -+ .else -+ .if ((__nBit)-30) -+ NextSetBitUp __nV1,((__nBit)+2) -+ .endif -+ .endif -+ .set __nV1,0 -+.endm -+ -+//find set bit pair <= curbit -+//out: __nBit -+.macro NextSetBitDown val,curBit -+ .set __nBit,(\curBit) -+ .set __nV1,(\val) -+ .if ((__nV1)&(0xc0<<(__nBit))) -+ .else -+ .if (__nBit) -+ NextSetBitDown __nV1,((__nBit)-2) -+ .endif -+ .endif -+ .set __nV1,0 -+.endm -+ .endif -+ -+//OUT: __nMask -+.macro NextSetMask val -+ NextSetBitDown \val,24 -+ .if (__nBit>=20) -+ NextSetBitUp \val,__nBit -+ .set __nMask,(0xff<<((__nBit)-16)) -+ .set __nMask,(((__nMask)>>16)+(((__nMask)<<16)&0xffff0000)) -+ .else -+ .set __nMask,(0xff<<(__nBit)) -+ .endif -+ -+.endm -+ -+.macro Big2CC inst,dest,val -+ .set __nVal,(\val) -+ .if (__nVal)<>0 -+ NextSetMask __nVal -+ \inst \dest,\dest,#(__nVal)&(__nMask) -+ Big2CC \inst,\dest,(__nVal)&~(__nMask) -+ .endif -+.endm -+ -+.macro BigAnd2CC cc,dest,val -+ .set __nVal,(\val) -+ .if (~__nVal)<>0 -+ NextSetMask __nVal -+ .if (((__nVal)&~(__nMask))=0) -+ and\cc \dest,\dest,#(__nVal)&(__nMask) -+ .else -+ Big2CC bic\cc,\dest,~__nVal -+ .endif -+ .endif -+.endm -+ -+/////////////////////////////////////////////////////// -+.macro BigMovCC cc,dest, val -+ .set __nVal,(\val) -+ NextSetMask ~__nVal -+ .if (((~(__nVal))&~(__nMask)) > 0x255) -+ NextSetMask __nVal -+ mov\cc \dest,#(__nVal)&(__nMask) -+ .if (((__nVal)&0xffff) ^ (((__nVal)>>16)&0xffff))<>0 -+ Big2CC orr\cc,\dest,(__nVal)&~(__nMask) -+ .else -+ .set __nVal,(__nVal)&~(__nMask) -+ .if (__nVal)<>0 -+ NextSetMask __nVal -+ orr\cc \dest,\dest,#(__nVal)&(__nMask) -+ .set __nVal,(__nVal)&~(__nMask) -+ .if (__nVal)<>0 -+ orr\cc \dest,\dest,\dest,LSR #16 -+ .endif -+ .endif -+ .endif -+ .else -+ mvn\cc \dest,#(~(__nVal))&(__nMask) //complement of complement is original -+ Big2CC bic\cc,\dest,(~(__nVal))&~(__nMask) -+ .endif -+.endm -+ -+ -+.macro BigAddCC cc,dest,src,val -+ .set __nVal,(\val) -+ .if (__nVal)<>0 -+ NextSetMask -__nVal -+ .if (((-(__nVal))&~(__nMask)) > 0x255) -+ NextSetMask __nVal -+ add\cc \dest,\src,#(__nVal)&(__nMask) -+ Big2CC add\cc,\dest,(__nVal)&~(__nMask) -+ .else -+ sub\cc \dest,\src,#(-(__nVal))&(__nMask) -+ Big2CC sub\cc,\dest,(-(__nVal))&~(__nMask) -+ .endif -+ .else -+ mov\cc \dest,\src -+ .endif -+.endm -+ -+.macro BigSubCC cc,dest,src,val -+ .set __nVal,(\val) -+ BigAddCC \cc,\dest,\src,-__nVal -+.endm -+ -+.macro BigCC inst,cc,dest,src,val -+ .set __nVal,(\val) -+ .if (__nVal)<>0 -+ NextSetMask __nVal -+ \inst\cc \dest,\src,#(__nVal)&(__nMask) -+ Big2CC \inst\cc,\dest,(__nVal)&~(__nMask) -+ .else -+ mov\cc \dest,\src -+ .endif -+.endm -+ -+ -+.macro BigAndCC cc,dest,src,val -+ .set __nVal,(\val) -+ .if (~__nVal)<>0 -+ NextSetMask __nVal -+ .if (((__nVal)&~(__nMask))=0) -+ and\cc \dest,\src,#(__nVal)&(__nMask) -+ .else -+ BigCC bic,\cc,\dest,\src,~__nVal -+ .endif -+ .else -+ mov\cc \dest,\src -+ .endif -+.endm -+ -+///////////////////////////////////// -+//dest, value -+.macro BigAdd2 dest,val -+ Big2CC add,\dest,\val -+.endm -+.macro BigAdd2Eq dest,val -+ Big2CC addeq,\dest,\val -+.endm -+.macro BigAdd2Ne dest,val -+ Big2CC addne,\dest,\val -+.endm -+ -+.macro BigSub2 dest,val -+ Big2CC sub,\dest,\val -+.endm -+.macro BigSub2Eq dest,val -+ Big2CC subeq,\dest,\val -+.endm -+.macro BigSub2Ne dest,val -+ Big2CC subne,\dest,\val -+.endm -+ -+.macro BigOrr2 dest,val -+ Big2CC orr,\dest,\val -+.endm -+.macro BigOrr2Eq dest,val -+ Big2CC orreq,\dest,\val -+.endm -+.macro BigOrr2Ne dest,val -+ Big2CC orrne,\dest,\val -+.endm -+ -+.macro BigEor2 dest,val -+ Big2CC eor,\dest,\val -+.endm -+.macro BigEor2Eq dest,val -+ Big2CC eoreq,\dest,\val -+.endm -+.macro BigEor2Ne dest,val -+ Big2CC eorne,\dest,\val -+.endm -+.macro BigEor2Cs dest,val -+ Big2CC eorcs,\dest,\val -+.endm -+.macro BigEor2Cc dest,val -+ Big2CC eorcc,\dest,\val -+.endm -+ -+.macro BigBic2 dest,val -+ Big2CC bic,\dest,\val -+.endm -+.macro BigBic2Eq dest,val -+ Big2CC biceq,\dest,\val -+.endm -+.macro BigBic2Ne dest,val -+ Big2CC bicne,\dest,\val -+.endm -+ -+.macro BigAnd2 dest,val -+ BigAnd2CC al,\dest,\val -+.endm -+.macro BigAnd2Eq dest,val -+ BigAnd2CC eq,\dest,\val -+.endm -+.macro BigAnd2Ne dest,val -+ BigAnd2CC ne,\dest,\val -+.endm -+///////////////////////////////////// -+ -+.macro BigMov dest,val -+ BigMovCC al,\dest,\val -+.endm -+.macro BigMovEq dest,val -+ BigMovCC eq,\dest,\val -+.endm -+.macro BigMovNe dest,val -+ BigMovCC ne,\dest,\val -+.endm -+// dest,src,value -+.macro BigAdd dest,src,val -+ BigAddCC al,\dest,\src,\val -+.endm -+.macro BigAddEq dest,src,val -+ BigAddCC eq,\dest,\src,\val -+.endm -+.macro BigAddNe dest,src,val -+ BigAddCC ne,\dest,\src,\val -+.endm -+ -+.macro BigSub dest,src,val -+ BigSubCC al,\dest,\src,\val -+.endm -+.macro BigSubEq dest,src,val -+ BigSubCC eq,\dest,\src,\val -+.endm -+.macro BigSubNe dest,src,val -+ BigSubCC ne,\dest,\src,\val -+.endm -+ -+.macro BigOrr dest,src,val -+ BigCC orr,al,\dest,\src,\val -+.endm -+.macro BigOrrEq dest,src,val -+ BigCC orr,eq,\dest,\src,\val -+.endm -+.macro BigOrrNe dest,src,val -+ BigCC orr,ne,\dest,\src,\val -+.endm -+ -+.macro BigEor dest,src,val -+ BigCC eor,al,\dest,\src,\val -+.endm -+.macro BigEorEq dest,src,val -+ BigCC eor,eq,\dest,\src,\val -+.endm -+.macro BigEorNe dest,src,val -+ BigCC eor,ne,\dest,\src,\val -+.endm -+.macro BigEorCs dest,src,val -+ BigCC eor,cs,\dest,\src,\val -+.endm -+.macro BigEorCc dest,src,val -+ BigCC eor,cc,\dest,\src,\val -+.endm -+ -+.macro BigBic dest,src,val -+ BigCC bic,al,\dest,\src,\val -+.endm -+.macro BigBicEq dest,src,val -+ BigCC bic,eq,\dest,\src,\val -+.endm -+.macro BigBicNe dest,src,val -+ BigCC bic,ne,\dest,\src,\val -+.endm -+ -+.macro BigAnd dest,src,val -+ BigAndCC al,\dest,\src,\val -+.endm -+.macro BigAndEq dest,src,val -+ BigAndCC eq,\dest,\src,\val -+.endm -+.macro BigAndNe dest,src,val -+ BigAndCC ne,\dest,\src,\val -+.endm -+ -+// ******************************************************************************************* -+ .list -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/burn.inc u-boot-1.1.2-neon/include/asm-arm/arch-pxa/burn.inc ---- u-boot-1.1.2/include/asm-arm/arch-pxa/burn.inc 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/burn.inc 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,367 @@ -+#define FLASH_GPIO_STATUS 0 //1 means use gp to tell when flash is ready
-+
-+#if (PLATFORM_TYPE==NEONB)
-+#define FLASH_BASE_ADDRESS 0x04000000
-+#else
-+#define FLASH_BASE_ADDRESS 0x0
-+#endif
-+
-+
-+#define FLASH_ID_CMD ((0x0090<<16) + 0x0090) //read Identifier Codes
-+#define FLASH_STATUS_CMD ((0x0070<<16) + 0x0070)
-+#define FLASH_STATUS_CLEAR_CMD ((0x0050<<16) + 0x0050)
-+#define FLASH_READ_CMD ((0x00FF<<16) + 0x00FF) //Read Array/Reset
-+#define FLASH_ERASE_CMD ((0x0020<<16) + 0x0020) //Block Erase
-+#define FLASH_CONFIRM_CMD ((0x00D0<<16) + 0x00D0) //Block Erase and Program Resume
-+//#define FLASH_WRITE_CMD ((0x0040<<16) + 0x0040) //Program word
-+#define FLASH_WRITE_TO_BUFFER_CMD ((0x00E8<<16) + 0x00E8) //Program word
-+
-+#define FLASH_SUCCESS_RSP ((0x0080<<16) + 0x0080)
-+
-+#define stmicro_manCode ((0x0020<<16) + 0x0020)
-+#define intel_manCode ((0x0089<<16) + 0x0089)
-+#define SECT_SIZE (1<<18) //256k
-+
-+#define f320j3a_devCode ((0x0016<<16) + 0x0016)
-+#define f320j3a_NUM_SECTORS 32 //for 8M flash
-+#define f320j3a_SIZE (f320j3a_NUM_SECTORS*SECT_SIZE)
-+
-+#define f640j3a_devCode ((0x0017<<16) + 0x0017)
-+#define f640j3a_NUM_SECTORS 64 //for 16M flash (8 meg on 16bit boards)
-+#define f640j3a_SIZE (f640j3a_NUM_SECTORS*SECT_SIZE)
-+
-+#define f128j3a_devCode ((0x0018<<16) + 0x0018)
-+#define f128j3a_NUM_SECTORS 128 //for 32M flash
-+#define f128j3a_SIZE (f128j3a_NUM_SECTORS*SECT_SIZE)
-+// *****************************
-+#define MANCODE 0
-+#define DEVCODE 4
-+
-+
-+
-+#define rRet r6
-+#define rRamSectorEnd r7
-+#define rRamSector rNum1
-+#define rRamEnd rNum2
-+#define rFlashBase sl //r10
-+#define rFlashSector fp //r11
-+
-+#define CMD_BURN 0
-+#define CMD_VERIFY 1
-+#define CMD_BURNALL 2
-+
-+.macro delayCnt rTemp,cnt
-+ mov \rTemp,#\cnt
-+90: subs \rTemp,\rTemp,#1
-+ bne 90b
-+.endm
-+// *********************************
-+//default delay is for write recovery before read, allow 400 MHZ cpu
-+.macro delay
-+ delayCnt r4,((40/10)*COUNT_MULT)
-+.endm
-+
-+
-+
-+.macro FLASH_GPIO_WAIT_FOR_IDLE
-+ .if FLASH_GPIO_STATUS
-+ bl FlashGpioWaitForIdle
-+ .endif
-+.endm
-+
-+.macro DEFINE_FLASH_GPIO_WAIT_FOR_IDLE
-+ .if FLASH_GPIO_STATUS
-+FlashGpioWaitForIdle:
-+//500 ns delay for STS going low
-+ delayCnt r4,((500/10)*COUNT_MULT) //500ns /10ns (for 100MHZ cpu cycle time) * 4 (100MHZ cpu)
-+ mov r5,#0x300000
-+ BigMov r4,GPIO_BASE
-+91: ldr r2,[r4,#GPLR0]
-+ and r2,r2,#3
-+ cmp r2,#3
-+ subnes r5,r5,#1
-+ bne 91b
-+ mov pc,lr //return
-+ .endif
-+.endm
-+
-+//out: z-1 timeout
-+.macro waitForReady istr,ildr,mask,inc
-+ BigMov r2,FLASH_STATUS_CMD&\mask
-+ \istr r2,[r1,#-\inc]
-+
-+ FLASH_GPIO_WAIT_FOR_IDLE
-+ BigMov r3,FLASH_SUCCESS_RSP&\mask
-+
-+ mov r5,#0x300000*COUNT_MULT
-+ .if FLASH_GPIO_STATUS
-+ b 92f
-+ .endif
-+
-+71:
-+ delayCnt r4,((500/10)*COUNT_MULT)
-+92: \ildr r4,[r1,#-\inc] //!!! read status
-+ and r4,r4,r3
-+ cmp r4,r3
-+ subnes r5,r5,#1
-+ bne 71b
-+
-+ BigMov r2,FLASH_READ_CMD&\mask
-+ \istr r2,[r1,#-\inc]
-+ delay
-+ teq r5,#0
-+.endm
-+
-+
-+
-+//out: z-1 timeout
-+.macro WaitForEraseDone istr,ildr,mask
-+ FLASH_GPIO_WAIT_FOR_IDLE
-+ BigMov r3,FLASH_SUCCESS_RSP&\mask
-+ mov r5,#0x10000
-+92:
-+ delayCnt r4,0x3000
-+ \ildr r4,[rFlashSector]
-+ and r4,r4,r3
-+ cmp r4,r3
-+ subnes r5,r5,#1
-+ bne 92b
-+
-+ BigMov r2,FLASH_READ_CMD&\mask
-+ \istr r2,[rFlashSector,#0]
-+ delay
-+ teq r5,#0
-+.endm
-+// ***********************************
-+
-+//r5 - command - CMD_BURN or CMD_BURNALL
-+//rRet(r6) succesful burn return address
-+//rRamSectorEnd(r7) - but not an input, just how it is used
-+//rRamSector(r8) - start
-+//rRamEnd(r9) - end
-+//rFlashBase(sl,r10) - flash base
-+//rFlashSector(fp,r11) - starting flash sector
-+//rDBG(sp,r13)
-+//lr - return address on failure
-+
-+.macro BurnRtn istr,ildr,mask,shift,sizeShift,inc,plait
-+ str r5,[rDBG,#DBG_TEMP]
-+ BigMov r0,FLASH_STATUS_CLEAR_CMD&\mask
-+ \istr r0,[rFlashBase,#0]
-+ delay
-+ BigMov r0,FLASH_ID_CMD&\mask
-+ \istr r0,[rFlashBase,#0]
-+ delay
-+ BigMov r4,intel_manCode&\mask
-+ BigMov r1,stmicro_manCode&\mask
-+ BigMov r5,f320j3a_devCode&\mask
-+ \ildr r2,[rFlashBase,#MANCODE>>\shift]
-+ \ildr r3,[rFlashBase,#DEVCODE>>\shift]
-+
-+ BigMov r0,FLASH_READ_CMD&\mask
-+ \istr r0,[rFlashBase,#0]
-+ delayCnt r0,((40/10)*COUNT_MULT)
-+
-+ mov r0,#f320j3a_SIZE>>\sizeShift
-+ cmp r3,r5
-+
-+ BigMovNe r5,f128j3a_devCode&\mask
-+ movne r0,#f128j3a_SIZE>>\sizeShift
-+ cmpne r3,r5
-+
-+ BigMovNe r5,f640j3a_devCode&\mask
-+ movne r0,#f640j3a_SIZE>>\sizeShift
-+ cmpne r3,r5
-+
-+ cmpeq r2,r4
-+ cmpne r2,r1
-+ movne r0,#MANCODE>>2
-+ movne r1,#DEVCODE>>2
-+ movne pc,lr //return if unrecognized chip
-+
-+ sub r1,rRamEnd,rRamSector
-+ sub r2,rFlashSector,rFlashBase
-+ add r1,r1,r2
-+ cmp r1,r0
-+ movhi pc,lr //return if trying to write too much
-+
-+ ldrb r5,[rDBG,#DBG_TEMP]
-+ cmp r5,#CMD_BURNALL
-+ streq r0,[rDBG,#DBG_TEMP] //r0 is size of flash
-+
-+ FLASH_GPIO_WAIT_FOR_IDLE
-+1:
-+ bl PrintSector
-+
-+//Now see if block needs erased
-+ add rRamSectorEnd,rRamSector,#SECT_SIZE>>\shift
-+ cmp rRamSectorEnd,rRamEnd
-+ movhi rRamSectorEnd,rRamEnd
-+ b 3f
-+2:
-+ ldr r2,[r0],#4 //read ram
-+ ldr r3,[r1],#4 //read flash
-+ and r4,r3,r2
-+ cmp r4,r2
-+ bne 10f
-+3: cmp r0,rRamSectorEnd
-+ blo 2b
-+
-+
-+ ldr r2,[rDBG,#DBG_TEMP]
-+ movs r2,r2
-+ beq 20f
-+ add r0,rFlashSector,#SECT_SIZE>>\shift
-+ b 62f
-+61:
-+ ldr r2,[r1],#4 //read flash
-+ adds r2,r2,#1
-+ bne 10f
-+62: cmp r1,r0
-+ blo 61b
-+ b 19f //erase not needed
-+
-+//erase
-+10:
-+ BigMov r3,FLASH_READ_CMD&\mask
-+ \istr r3,[rFlashBase,#0]
-+ delay
-+ ldr r3,[r1,#-4] //read flash
-+ and r4,r3,r2
-+ cmp r4,r2
-+ beq 3b //br if (we signal) glitch caused a spurious status register read
-+
-+ BigMov r0,FLASH_ERASE_CMD&\mask
-+ \istr r0,[rFlashSector]
-+ BigMov r0,FLASH_CONFIRM_CMD&\mask
-+ \istr r0,[rFlashSector]
-+ bl PrintErasing
-+
-+ WaitForEraseDone \istr,\ildr,\mask
-+ beq Timeout //br if erase timed out
-+
-+ .if (\plait)
-+ BigMov r0,FLASH_ERASE_CMD&\mask
-+ \istr r0,[rFlashSector,#2]
-+ BigMov r0,FLASH_CONFIRM_CMD&\mask
-+ \istr r0,[rFlashSector,#2]
-+ bl PrintErasing
-+
-+ WaitForEraseDone \istr,\ildr,\mask
-+ beq Timeout //br if erase timed out
-+ .endif
-+
-+19: cmp rRamSector,rRamSectorEnd
-+ bhs 42f
-+
-+//programming
-+20:
-+ bl PrintProgramming
-+21:
-+ ldr r2,[r0],#4 //read ram
-+ ldr r3,[r1],#4 //read flash
-+ cmp r2,r3
-+ bne 22f
-+28:
-+ cmp r0,rRamSectorEnd
-+ blo 21b
-+ b 30f //goto verify
-+
-+22:
-+ sub r1,r1,#4
-+ sub r0,r0,#4
-+ and r2,r1,#0x3f>>\shift //align to a 64 byte boundary (32 per device)
-+ sub r1,r1,r2
-+ sub r0,r0,r2
-+
-+ BigMov r2,FLASH_WRITE_TO_BUFFER_CMD&\mask
-+ \istr r2,[r1] //!!! write_to_buffer
-+
-+ sub r3,rRamSectorEnd,r0
-+ mov r3,r3,LSR #2-\shift
-+ sub r3,r3,#1
-+ cmp r3,#0x0f
-+ movhi r3,#0x0f
-+ orr r2,r3,r3,LSL #16
-+ \istr r2,[r1] //!!! word cnt -1
-+25: \ildr r2,[r0],#\inc
-+ \istr r2,[r1],#\inc //!!! words
-+ subs r3,r3,#1
-+ bpl 25b
-+ BigMov r2,FLASH_CONFIRM_CMD&\mask
-+ \istr r2,[r1,#-\inc] //!!! confirm
-+
-+ waitForReady \istr,\ildr,\mask,\inc
-+
-+ .if (\plait)
-+ beq 88f
-+ sub r1,r1,#\inc
-+ sub r0,r0,#\inc
-+ and r2,r1,#0x3f>>\shift //align to a 64 byte boundary (32 per device)
-+ sub r1,r1,r2
-+ sub r0,r0,r2
-+
-+ BigMov r2,FLASH_WRITE_TO_BUFFER_CMD&\mask
-+ \istr r2,[r1,#2]! //!!! write_to_buffer
-+ sub r3,rRamSectorEnd,r0
-+ add r0,r0,#2
-+ mov r3,r3,LSR #2-\shift
-+ sub r3,r3,#1
-+ cmp r3,#0x0f
-+ movhi r3,#0x0f
-+ orr r2,r3,r3,LSL #16
-+ \istr r2,[r1] //!!! word cnt -1
-+85: \ildr r2,[r0],#\inc
-+ \istr r2,[r1],#\inc //!!! words
-+ subs r3,r3,#1
-+ bpl 85b
-+ BigMov r2,FLASH_CONFIRM_CMD&\mask
-+ \istr r2,[r1,#-\inc] //!!! confirm
-+
-+ waitForReady \istr,\ildr,\mask,\inc
-+ sub r0,r0,#2
-+ sub r1,r1,#2
-+
-+ bne 28b
-+88:
-+
-+ .else
-+ bne 28b
-+ .endif
-+ sub rRamSector,r0,#0x40>>\shift //whoops, timeout
-+ sub rFlashSector,r1,#0x40>>\shift
-+ b Timeout
-+
-+
-+
-+//verify
-+30:
-+ bl PrintVerifying
-+31:
-+ ldr r2,[r0],#4 //read ram
-+ ldr r3,[r1],#4 //read flash
-+ cmp r2,r3
-+ bne 33f
-+32: cmp r0,rRamSectorEnd
-+ blo 31b
-+42:
-+ add rRamSector,rRamSector,#SECT_SIZE>>\shift
-+ add rFlashSector,rFlashSector,#SECT_SIZE>>\shift
-+ cmp rRamSector,rRamEnd
-+ blo 1b //goto next sector
-+
-+ ldr r2,[rDBG,#DBG_TEMP]
-+ add r2,r2,rFlashBase
-+ cmp rFlashSector,r2
-+ blo 1b
-+
-+ b PrintSuccess
-+33:
-+ BigMov r3,FLASH_READ_CMD&\mask
-+ \istr r3,[rFlashBase,#0]
-+ delay
-+ ldr r3,[r1,#-4] //read flash
-+ cmp r2,r3
-+ beq 32b //br if (we signal) glitch caused a spurious status register read
-+ b ReturnError
-+.endm
-diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/miniMac.inc u-boot-1.1.2-neon/include/asm-arm/arch-pxa/miniMac.inc ---- u-boot-1.1.2/include/asm-arm/arch-pxa/miniMac.inc 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/miniMac.inc 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,476 @@ -+#include "platformTypes.h" -+#define SUB_LR_FALL_THRU_FOR_FIQ 1 //0 for branch -+#define LITTLE_ENDIAN 1 //describes memory system -+#define DDEBUG 0 -+#define DO_GPTEST 0 -+ -+#define MACH_TYPE_SCANPASS 332 -+ -+#define ATAG_CORE 0x54410001 -+#define ATAG_MEM 0x54410002 -+#define TAGGED_LIST 0xa0000100 -+ .ifdef __ARMASM -+ GBLA STACKS_VALID -+ GBLA CONFIG_STACKS_VALID -+ .set CONFIG_STACKS_VALID,1 -+ .endif -+ -+#if (SOFTWARE_TYPE==WINCE) -+ .set STACKS_VALID,1 -+ .ifdef __ARMASM -+ .else -+#ifndef CONFIG_STACKS_VALID -+#define CONFIG_STACKS_VALID 1 -+#endif -+ .endif -+ -+#define SDRAM_BASE_C_VIRTUAL 0xA0000000 //0x80000000 is cached mapped, 0xa0000000 is uncacheable -+#define UART_VIRT_BASE 0xAA100000 -+#define VMA_DEBUG (0xfff00000) -+#define VIRTUAL_CS0 0xa8000000 -+#define VIRTUAL_CS1 0xa8000000 -+ -+#else -+#ifdef CONFIG_STACKS_VALID -+ .set STACKS_VALID,1 -+#else -+ .set STACKS_VALID,0 -+#endif -+#define SDRAM_BASE_C_VIRTUAL 0xC0000000 -+#define UART_VIRT_BASE 0xf8100000 -+//#define VMA_DEBUG 0xff000000 -+//!!!!!for some reason the above base causes bizarre problems -+#define VMA_DEBUG (0xfff00000) -+#define VIRTUAL_CS0 0xff000000 -+#define VIRTUAL_CS1 0xff100000 -+#endif -+ -+#define V_rWork r2 -+#define V_rBranch r3 -+#define I_rWork r2 -+#define I_rBranch sp //r13 -+ -+#ifdef CONFIG_STACKS_VALID -+#define rWork V_rWork -+#define rBranch V_rBranch -+ -+#else -+#define rWork I_rWork -+#define rBranch I_rBranch -+#endif -+ -+ -+#if 0 -+#define RED_VAL 0x15 -+#define GREEN_VAL 0x2a -+#define BLUE_VAL 0x0a -+#else -+#define RED_VAL 0x0 -+#define GREEN_VAL 0x0 -+#define BLUE_VAL 0x0 -+#endif -+ -+//#define BAUDRATE 9600 -+//#define BAUDRATE 38400 -+//#define BAUDRATE 57600 -+//#define BAUDRATE 57600 -+#define BAUDRATE 115200 -+//#define BAUDRATE 230400 -+ -+#if (CPU_CLOCK==100) -+#define COUNT_MULT 1 -+#else -+#if (CPU_CLOCK==200) -+#define COUNT_MULT 2 -+#else -+#if (CPU_CLOCK==300) -+#define COUNT_MULT 3 -+#else -+#define COUNT_MULT 4 -+#endif -+#endif -+#endif -+ -+#if 1 //(SOFTWARE_TYPE==WINCE) -+#define RECEIVE_LOOP_COUNT 0x10000*COUNT_MULT -+#else -+#if (PLATFORM_TYPE==GAME_CONTROLLER_PLAITED_A1)||(PLATFORM_TYPE==GAME_CONTROLLER)||(PLATFORM_TYPE==GAME_WITH_SMC) -+#define RECEIVE_LOOP_COUNT 0x100000*COUNT_MULT -+#else -+#define RECEIVE_LOOP_COUNT 0x300000*3*COUNT_MULT -+#endif -+#endif -+ -+// ********************************************************** -+#define DBG_MAGIC 95 //this allows BigMov sp,DEBUG_BASE+DBG_MAGIC to generate just 1 instruction -+//#define DBG_START -95 -+#define DBG_START 0 -+#define DBG_R0 ((0<<2)+DBG_START) -+#define DBG_R1 ((1<<2)+DBG_START) -+#define DBG_R2 ((2<<2)+DBG_START) -+#define DBG_R3 ((3<<2)+DBG_START) -+#define DBG_R4 ((4<<2)+DBG_START) -+#define DBG_R5 ((5<<2)+DBG_START) -+#define DBG_R6 ((6<<2)+DBG_START) -+#define DBG_R7 ((7<<2)+DBG_START) -+#define DBG_R8 ((8<<2)+DBG_START) -+#define DBG_R9 ((9<<2)+DBG_START) -+#define DBG_SL ((10<<2)+DBG_START) -+#define DBG_FP ((11<<2)+DBG_START) -+#define DBG_IP ((12<<2)+DBG_START) -+#define DBG_SP ((13<<2)+DBG_START) -+#define DBG_LR ((14<<2)+DBG_START) -+#define DBG_PC ((15<<2)+DBG_START) -+#define DBG_CPSR ((16<<2)+DBG_START) //this and above have corresponding symbol #s -+ -+#define DBG_HCPSR ((17<<2)+DBG_START) //interrupt handler original CPSR -+#define DBG_TRACE ((18<<2)+DBG_START) -+#define DBG_LastSignal ((19<<2)+DBG_START) //only 1 byte -+#define DBG_Mode (((19<<2)+1)+DBG_START) //only 1 byte, bit 0 -1 means gdb mode for control breaks -+#define DBG_FFUART_LCR (((19<<2)+2)+DBG_START) //only 1 byte -+#define DBG_HSP ((20<<2)+DBG_START) //handler stack pointer on entry, for aborts -+#define DBG_TEMP ((21<<2)+DBG_START) -+//22 free -+#define DBG_ABORT_PC ((23<<2)+DBG_START) -+#define DBG_INDIRECT_R0 ((24<<2)+DBG_START) //it needs it's own space in case a debug interrupt -+#define DBG_INDIRECT_LR ((25<<2)+DBG_START) //happens in the return code, but memory is mapped if used -+#define DEBUG_SPACE (((23<<2)|0x1f)+1) //a multiple of 32 bytes -+ -+// ********************************************************* -+ -+#define DEBUG_START (VMA_DEBUG+0x3000-DEBUG_SPACE) //this saves on memory, but the else is easier to debug -+#define VMA_DEBUG_OFFSET (0xffff0000-VMA_DEBUG) -+#define DEBUG_BASE (DEBUG_START-DBG_START) -+#define DEBUG_SYM DEBUG_START -+ -+ -+#define SYM_R0 0 -+#define SYM_R1 1 -+#define SYM_R2 2 -+#define SYM_R3 3 -+#define SYM_R4 4 -+#define SYM_R5 5 -+#define SYM_R6 6 -+#define SYM_R7 7 -+#define SYM_R8 8 -+#define SYM_R9 9 -+#define SYM_SL 10 -+#define SYM_FP 11 -+#define SYM_IP 12 -+#define SYM_SP 13 -+#define SYM_LR 14 -+#define SYM_PC 15 -+#define SYM_CPSR 16 -+ -+//#define SYM_SPSR 17 //nice to have, but do it later -+//#define SYM_FPS 17 -+#define SYM_FP0 17 //40 bits, 5 -+#define SYM_FSR 18 -+#define SYM_FAR 19 -+#define SYM_DCSR 20 -+#define SYM_TTBR 21 -+#define SYM_CTRL 22 -+ -+#define SYM_LAST 22 -+ -+#define SYM_LAST_RCMD (SYM_FP0) //last symbol printed by R cmd -+ -+ -+ -+#define SIG_RESET 0 -+#define SIG_UNDEFINED_INSTRUCTION 1 -+#define SIG_SWI 2 -+#define SIG_PREFETCH_ABORT 3 -+#define SIG_DATA_ABORT 4 -+#define SIG_UNUSED 5 -+#define SIG_IRQ 6 -+#define SIG_FIQ 7 -+#define SIG_DBG 8 -+#define SIG_DBG_RESET 8+0 -+#define SIG_DBG_INSTRUCTION_BKPT 8+1 -+#define SIG_DBG_DATA_BKPT 8+2 -+#define SIG_DBG_BKPT_SOFTWARE 8+3 -+#define SIG_DBG_EXTERNAL 8+4 -+#define SIG_DBG_VECTOR_TRAP 8+5 -+#define SIG_DBG_TRACE_BUFFER_FULL 8+6 -+#define SIG_DBG_RESERVED 8+7 -+ -+#define GDB_EXIT_CHAR 0x0d -+// ****************************************************************** -+#define rFieldStart r4 -+#define rField r5 -+#define rValidCnt r6 -+#define rCommand r7 -+#define rNum1 r8 -+#define rNum2 r9 -+#define rSymbol sl //r10 -+#define rPrevNum1 fp //r11 -+#define rUart ip //r12 -+#define rDBG sp -+ -+//in Go routine, temporary -+#define rBCR0 sl //r10 -+#define rBCR1 fp //r11 -+ -+//in GDB routines -+#define rGdbCmd r5 -+#define rGdbNum1 r6 -+#define rGdbTermChar1 r7 -+#define rGdbNum2 r8 -+#define rGdbTermChar2 r9 -+#define rGdbNum3 sl //r10 -+#define rGdbChkSum fp //r11 -+ -+//in Download routine -+#define rDest r3 -+#define rPacketLength r4 -+#define rDestHead r5 -+#define rBlockNum r6 -+#define rNak r7 -+#define rCRC r8 -+#define rRunningCRC r9 -+#define rPrevCRC sl //r10 -+ -+#define rSP r8 //register which contains L4(' ',' ',' ',' '), all spaces -+// ******** -+ -+#define CR 0x0d -+#define LF 0x0a -+ -+// ****************************** -+#define F_INC 4 -+ -+#define F_NUM1_BIT (F_INC*3) -+#define F_NUM2_BIT (F_INC*5) -+ -+#define F_COMMAND 1<<(F_INC) -+#define F_NUM1 1<<(F_NUM1_BIT) -+#define F_NUM2 1<<(F_NUM2_BIT) -+#define F_UNDEF 1<<(F_INC*7) -+ -+#define F_COMMAND_MASK ((1<<F_INC)-1)<<(F_INC) -+#define F_NUM1_MASK ((1<<F_INC)-1)<<(F_INC*3) -+#define F_NUM2_MASK ((1<<F_INC)-1)<<(F_INC*5) -+// ****************************** -+#define cachelinecount 2048 //1024 if baseaddress not used for another purpose -+#define cachelinesize 32 -+//#define baseaddress 0 //physical memory does not have to exist here, but a valid descriptor table entry IS required -+ -+// ***************************** -+#define SOH 1 -+#define STX 2 -+#define EOT 4 -+#define ACK 6 -+#define NAK 0x15 -+#define CAN 0x18 -+ -+#define CRC_POLY 0x10210000 -+// ***************************** -+ -+// divide 0x1000 bytes among the stacks -+#define SS_SUPERVISOR 0x0800 -+#define SS_IRQ 0x0400 -+#define SS_FIQ 0x0100 -+#define SS_SYSTEM 0x0100 -+#define SS_UNDEFINED 0x0100 -+#define SS_ABORT 0x0100 -+#define SS_TOTAL (SS_SUPERVISOR+SS_IRQ+SS_FIQ+SS_SYSTEM+SS_UNDEFINED+SS_ABORT) -+#define SS_START 0x0a0008000-0x4400-SS_TOTAL //-17k, 16k for 1st level page table, 1k for 2nd level page table -+// ***************************** -+ -+ -+ -+ -+// ********************************* -+.macro mac_AfterPCPrint branch //vector table at 0xffff0000, br to vector table at VMA_DEBUG -+ .ifdef __ARMASM -+ LCLA cnt -+ .set cnt,$branch -+ WHILE cnt>0 -+ b 93f -+ .set cnt,cnt-1 -+ WEND -+ .else -+ .rept (\branch) -+ b 93f -+ .endr -+ .endif -+ -+AfterPCPrint: -+ mov r0,#0x55 -+ b AfterPCPrint1 -+InitializeCont: -+ b MainInitializationCode -+93: -+.endm -+ -+ -+.macro RelocationVector branch //vector table at 0xffff0000, br to vector table at VMA_DEBUG -+ //warning, do not use relocated vectors unless memory management is enabled and VMA_DEBUG is mapped -+ .ifdef __ARMASM -+ LCLA cnt -+ .set cnt,$branch -+ WHILE cnt>0 -+ b 71f -+ .set cnt,cnt-1 -+ WEND -+ .else -+ .rept (\branch) -+ b 71f -+ .endr -+ .endif -+ -+ mov pc,#0x00 //0 - reset always goes to 0 because it will be in physical memory mode for instructions -+ b .-VMA_DEBUG_OFFSET //4 - UndefinedInstr -+ b .-VMA_DEBUG_OFFSET //8 - SWI -+ b .-VMA_DEBUG_OFFSET //0x0c - PrefetchAbort -+ b .-VMA_DEBUG_OFFSET //0x10 - DataAbort -+ b .-VMA_DEBUG_OFFSET //0x14 - Unused -+ b .-VMA_DEBUG_OFFSET //0x18 - IRQ -+ .if SUB_LR_FALL_THRU_FOR_FIQ -+ sub lr,lr,#4 //0x1c - FIQ -+ .else -+ b .-VMA_DEBUG_OFFSET //0x1c - FIQ -+ .endif -+ -+//these instructions are always at this address -+//to minimize the effect of a mismatch of minicache and flash -+ReturnWithIndirection: -+ mov r0,r0 //!!!! make sure this instruction is in the 1st 4k of flash so that BigOrr2Ne is guaranteed to work -+ ldr pc,[sp],#4 -+ -+//c-0 invalidate caches, c-1 skip cache invalidate -+//z-1 return direct, z-0 return indirect -+InvalidateAndReturn: -+ adrne lr,ReturnWithIndirection -+ ldreq lr,[r0,#DBG_PC-DBG_R2] -+ BigOrr2Ne lr,VMA_DEBUG //this range is sure to give an external abort for errata on exiting SDS -+ -+//Invalidate the data/instruction cache and branch target buffer -+ -+ CP15_CF_INVAL_BOTH mcrcc,r1 -+ CPWAIT r1 -+ -+ ldr sp,[r0,#DBG_HSP-DBG_R2] -+ ldr r1,[r0,#DBG_R1-DBG_R2] -+ str r0,[r0,#DBG_ABORT_PC-DBG_R2] //reset error flag so abort can be retried -+ ldr r0,[r0,#DBG_R0-DBG_R2] -+ movs pc,lr -+71: -+.endm -+ -+.macro CheckBranch rTemp,rAddr -+ movs \rTemp,pc //don't redirect if running from flash -+ submi \rAddr, \rAddr, #0x00010000 -+ ldrmi \rTemp, [\rAddr], #8 -+ eormi \rTemp, \rTemp, #0xea000000 -+ tstmi \rTemp, #0xff000000 -+ moveq \rTemp, \rTemp, LSL #8 -+ addeq \rAddr, \rAddr, \rTemp, ASR #6 -+.endm -+.macro CheckLdr rTemp,rAddr //check for instruction LDR pc,[pc,#nnn] -+ eor \rTemp, \rTemp, #0x0f900000 -+ eor \rTemp, \rTemp, #0x000ff000 -+ cmp \rTemp, #0x1000 -+ ldrcc \rAddr,[\rAddr,\rTemp] -+.endm -+ -+//this is case where stacks are assumed valid -+.macro V_VectorEntrance Work,Branch,code -+ stmdb sp!,{\Work,\Branch,lr} -+ mov \Branch,#\code<<2 -+.endm -+.macro V_VectorExitCC Work,Branch,cc,ccia -+ str\cc \Branch,[sp,#8] -+ ldm\ccia sp!,{\Work,\Branch,pc} -+.endm -+.macro V_VectorExitCC1 Work,Branch,cc,ccia -+ str\cc \Branch,[sp,#8] -+ ldm\ccia sp!,{\Work,\Branch,pc} -+.endm -+ -+//this is case where stacks are assumed invalid -+.macro I_VectorEntrance Work,Branch,code -+ BigMov \Branch,DEBUG_BASE+DBG_MAGIC -+ str \Work,[\Branch,#DBG_TEMP-DBG_MAGIC] -+ mov \Branch, #\code<<2 -+.endm -+.macro I_VectorExitCC Work,Branch,cc,ccia -+ BigMovCC \cc,\Work,DEBUG_BASE+DBG_MAGIC -+ ldr\cc \Work,[\Work,#DBG_TEMP-DBG_MAGIC] -+ bx\cc \Branch -+.endm -+.macro I_VectorExitCC1 Work,Branch,cc,ccia -+ BigMov \Work,DEBUG_BASE+DBG_MAGIC -+ ldr\cc \Work,[\Work,#DBG_TEMP-DBG_MAGIC] -+ bx\cc \Branch -+.endm -+.macro VectorEntrance Work,Branch,code -+ .if STACKS_VALID -+ V_VectorEntrance \Work,\Branch,\code -+ .else -+ I_VectorEntrance \Work,\Branch,\code -+ .endif -+.endm -+.macro JOIN brcc -+ .if STACKS_VALID -+ \brcc join_fiq -+ .else -+ \brcc join_irq -+ .endif -+.endm -+.macro JOIN2 brcc -+ .if STACKS_VALID -+ \brcc join_fiq2 -+ .else -+ \brcc join_irq2 -+ .endif -+.endm -+// ***************************************************** -+ -+.macro SaveRegisters rBase,rTemp -+ CalcMemSize \rBase,\rTemp,MEMORY_CONTROL_BASE //out: \rTemp - mem size -+ BigAdd \rBase,\rTemp,MEM_START-0x1000+((DEBUG_BASE+DBG_MAGIC)&0xfff) //last 4k of memory -+ mov \rTemp,#0 -+//great, now memory should be working, let's save registers, only r0(rBase),sp(rTemp) have been lost -+//don't trust LDM,STM instructions in debug mode.... -+//or LDR w/Rd=PC, LDR w/RRX addressing mode, SWP, LDC, STC -+// ******************************************************* -+// ******************************************************* -+ str \rTemp,[\rBase,#DBG_START-32 -DBG_MAGIC] -+ str \rTemp,[\rBase,#DBG_R0 -DBG_MAGIC] -+ str r1, [\rBase,#DBG_R1 -DBG_MAGIC] -+ str r2, [\rBase,#DBG_R2 -DBG_MAGIC] -+ str r3, [\rBase,#DBG_R3 -DBG_MAGIC] -+ str \rTemp,[\rBase,#DBG_TRACE -DBG_MAGIC] -+ str \rTemp,[\rBase,#DBG_LastSignal-DBG_MAGIC] -+.endm -+.macro ReadHexE dest,rCnt1 -+ -+#if LITTLE_ENDIAN -+ mov \rCnt1,#4 -+ mov \dest,#0 -+1: bl ReadHex -+ bcc CheckSumError -+ add rGdbChkSum,rGdbChkSum,r0 //update checksum -+ mov r1,r1,LSL #28 -+ add \dest,r1,\dest,LSR #8 -+ -+ bl ReadHex -+ bcc CheckSumError -+ add rGdbChkSum,rGdbChkSum,r0 //update checksum -+ add \dest,\dest,r1,LSL #24 -+#else -+ mov \rCnt1,#8 -+ mov \dest,#0 -+1: bl ReadHex -+ bcc CheckSumError -+ add rGdbChkSum,rGdbChkSum,r0 //update checksum -+ add \dest,r1,\dest,LSL #4 -+#endif -+ subs \rCnt1,\rCnt1,#1 -+ bne 1b -+.endm -+ -+ -+ -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/mmc.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/mmc.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/mmc.h 2003-06-27 23:32:42.000000000 +0200 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/mmc.h 2007-08-11 21:07:21.000000000 +0200 -@@ -4,7 +4,7 @@ - * Author: Vladimir Shebordaev, Igor Oblakov - * Copyright: MontaVista Software Inc. - * -- * $Id: mmc_pxa.h,v 0.3.1.6 2002/09/25 19:25:48 ted Exp ted $ -+ * $Id: mmc.h,v 1.3 2005/04/16 17:05:19 ericn Exp $ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as -@@ -113,12 +113,17 @@ - #define MMC_CMD_SET_RCA 3 - #define MMC_CMD_SEND_CSD 9 - #define MMC_CMD_SEND_CID 10 -+#define MMC_CMD_STOP 12 - #define MMC_CMD_SEND_STATUS 13 - #define MMC_CMD_SET_BLOCKLEN 16 - #define MMC_CMD_READ_BLOCK 17 - #define MMC_CMD_RD_BLK_MULTI 18 - #define MMC_CMD_WRITE_BLOCK 24 - -+#define SD_APP_CMD55 55 /* 0x37 */ -+#define SD_APP_CMD41 41 /* 0x29 */ -+#define SD_STATUS 13 /* 0x0D */ -+ - #define MMC_MAX_BLOCK_SIZE 512 - - #define MMC_R1_IDLE_STATE 0x01 -@@ -197,4 +202,15 @@ - } mmc_csd_t; - - -+typedef struct sd_status { -+ ulong prot_size ; -+ ushort card_type ; -+ ushort bus_width:2, -+ secured_mode:1, -+ unused0: 13 ; -+} sd_status_t ; -+ -+extern uchar * -+mmc_cmd(ushort cmd, ushort argh, ushort argl, ushort cmdat); -+ - #endif /* __MMC_PXA_P_H__ */ -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/platformTypes.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/platformTypes.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/platformTypes.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/platformTypes.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,19 @@ -+#ifndef __PLATFORMTYPES_H__
-+#define __PLATFORMTYPES_H__ 1
-+#define NEON 1
-+#define NEONB 2
-+#define BD2003 3
-+#define GAME_WITH_SMC 4
-+#define GAME_CONTROLLER 5
-+#define GAME_CONTROLLER_PLAITED_A1 6
-+#define BOUNDARY_OLD_BOARD 7 //lcd pin reordering for rgb problem, don't use VLIO(gp18 is turnstile)
-+#define OLD_GAME_CONTROLLER 8
-+#define HALOGEN 9
-+
-+#if (PLATFORM_TYPE==NEONB)
-+#define PHYS_FLASH_BASE 0x04000000
-+#else
-+#define PHYS_FLASH_BASE 0x0
-+#endif
-+
-+#endif
-diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/pxa250Base.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxa250Base.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/pxa250Base.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxa250Base.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,60 @@ -+#ifndef __PXA250BASE_H__ -+#define __PXA250BASE_H__ 1 -+ -+#ifdef __ARMASM -+#define USE_PHYSICAL 1 -+#else -+#ifndef _MSC_VER -+#define USE_PHYSICAL 1 -+#endif -+#endif -+ -+ -+#ifndef USE_PHYSICAL -+#if EBOOT_PHYS -+#define USE_PHYSICAL 1 -+#endif -+#endif -+ -+#if USE_PHYSICAL -+#define PCMCIA_CARD0_IO 0x20000000 -+#define PCMCIA_CARD0_ATTR 0x28000000 -+#define PCMCIA_CARD0_MEM 0x2c000000 -+ -+#define PCMCIA_CARD1_IO 0x30000000 -+#define PCMCIA_CARD1_ATTR 0x38000000 -+#define PCMCIA_CARD1_MEM 0x3c000000 -+ -+#define FFUART_BASE 0x40100000 -+#define BTUART_BASE 0x40200000 -+#define STUART_BASE 0x40700000 -+#define UART_BASE FFUART_BASE -+//#define UART_BASE BTUART_BASE -+ -+#define OS_TIMER_BASE 0x40a00000 -+#define IC_BASE 0x40D00000 -+#define GPIO_BASE 0x40E00000 -+#define PWR_MANAGER_BASE 0x40F00000 -+#define CLK_MANAGER_BASE 0x41300000 -+#define LCD_CONTROL_BASE 0x44000000 -+#define MEMORY_CONTROL_BASE 0x48000000 -+ -+#define MEM_START 0xa0000000 -+ -+ -+#else -+#include "xsc1.h" -+ -+#define PCMCIA_CARD0_IO PCMCIA_S0_IO_U_VIRTUAL -+#define PCMCIA_CARD0_ATTR PCMCIA_S0_ATTR_U_VIRTUAL -+#define PCMCIA_CARD0_MEM PCMCIA_S0_CMN_U_VIRTUAL -+ -+#define PCMCIA_CARD1_IO PCMCIA_S1_IO_U_VIRTUAL -+#define PCMCIA_CARD1_ATTR PCMCIA_S1_ATTR_U_VIRTUAL -+#define PCMCIA_CARD1_MEM PCMCIA_S0_CMN_U_VIRTUAL -+ -+#define MEMORY_CONTROL_BASE MEMC_BASE_U_VIRTUAL -+#define GPIO_BASE GPIO_BASE_U_VIRTUAL -+#endif -+ -+#endif -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/pxaGpio25x.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaGpio25x.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/pxaGpio25x.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaGpio25x.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,218 @@ -+//gpios for PLATFORM_TYPE== NEON,NEONB,BD2003, or BOUNDARY_OLD_BOARD -+ -+#define LCD_CS_STATE HIGH -+ -+//CP - Clock and Power Management Unit -+//MMC - Multimedia Card Controller -+//MC - Memory Controller -+//SIU - System Integration Unit -+//SSP - Synchronous Serial Port -+//AC - Audio Controller (AC97) -+//FF - Full Function UART -+//BT - Blue Tooth UART -+//ST - standard UART Port -+//LCD - LCD Controller -+ SPEC_GP 0,IN,HIGH,0 // flash ready low 16, or magStripe T1 Clk(SMC) -+ SPEC_GP 1,IN,HIGH,0 //CP_RST, flash ready high 16, or magStripe T2 Clk(SMC) -+ -+#if (PLATFORM_TYPE==NEONB) -+ SPEC_GP 2,IN,HIGH,0 //USB client connection status -+ SPEC_GP 3,IN,HIGH,0 //float means USB Slave not ready to accept data -+ //out 1 means ready (D+ signal) -+ SPEC_GP 4,OUT,LOW,0 //low means don't provide 12 volts to I2C bus -+#else -+#if (PLATFORM_TYPE==NEON) -+ SPEC_GP 2,IN,HIGH,0 //USB client connection status -+ SPEC_GP 3,IN,HIGH,0 //float means USB Slave not ready to accept data -+ SPEC_GP 4,IN,HIGH,0 //UCB1400 irq on NEON board -+#else -+ SPEC_GP 2,OUT,LOW,0 //output to transistor (unused), OUT_DRY_CONTACT2 -+ SPEC_GP 3,OUT,HIGH,0 -+ SPEC_GP 4,IN,HIGH,0 //interrupt for USB irq 1 -+#endif -+#endif -+ -+ SPEC_GP 5,IN,HIGH,0 //interrupt for USB irq 2, or SM501 -+ SPEC_GP 6,OUT,HIGH,1 //MMC_CLK -+ SPEC_GP 7,OUT,LOW,0 //CP_48MHZ !!! red led, NEON:J13,pin3 -+ SPEC_GP 8,OUT,HIGH,1 //MMC_CCS0 -+ SPEC_GP 9,OUT,LOW,0 //MMC_CCS1, !!! doorlock, or OUT_DRY_CONTACT1 -+ SPEC_GP 10,IN,HIGH,0 //SIU_RTCCLK, Neon/Neonb data 1 for SDIO interrupt -+ -+#if (PLATFORM_TYPE==NEON) -+ SPEC_GP 11,OUT,HIGH,0 //CP_3600KHZ, NEON:J12,pin1 -+#else -+ SPEC_GP 11,IN,HIGH,0 //CP_3600KHZ, suspend USB slave -+#endif -+ SPEC_GP 12,IN,HIGH,0 //CP_32KHZ, suspend USB host -+ -+#if (PLATFORM_TYPE==NEON) || (PLATFORM_TYPE==NEONB) -+ SPEC_GP 13,OUT,HIGH,2 //MC_MBGNT -+ SPEC_GP 14,IN,HIGH,1 //MC_MBREQ -+#else -+ SPEC_GP 13,OUT,HIGH,0 //USB wakeup slave -+ SPEC_GP 14,IN,HIGH,0 //UCB1400 IRQ -+#endif -+ -+ -+#if (PLATFORM_TYPE==NEONB) -+ SPEC_GP 15,OUT,HIGH,2 //MC_nCS1, eeprom -+#else -+#if (PLATFORM_TYPE==NEON) -+ SPEC_GP 15,OUT,LOW,0 //MC_nCS1, NEON:J13, pin 1 -+#else -+ SPEC_GP 15,OUT,LOW,0 //MC_nCS1, !!! amber led -+#endif -+#endif -+ -+ -+#if (PLATFORM_TYPE==NEON) || (PLATFORM_TYPE==NEONB) -+ SPEC_GP 16,OUT,HIGH,0 //LCD backlight brightness control -+ SPEC_GP 17,OUT,HIGH,0 //LCD backlight ON/OFF -+#else -+ SPEC_GP 16,IN,HIGH,0 //SIU_PWM0, !!! feedback2, left in -+ SPEC_GP 17,IN,HIGH,0 //SIU_PWM1, !!! feedback1, right in -+#endif -+ -+#if (PLATFORM_TYPE==BOUNDARY_OLD_BOARD) -+ SPEC_GP 18,OUT,HIGH,0 //MC_RDY, !!! turnstile -+#else -+ SPEC_GP 18,IN,HIGH,1 //MC_RDY, VIO_READY -+#endif -+ -+#if (PLATFORM_TYPE==NEON) || (PLATFORM_TYPE==NEONB) -+ SPEC_GP 19,OUT,HIGH,0 //MC_DREQ1, nc -+#else -+ SPEC_GP 19,IN,HIGH,1 //MC_DREQ1, DMA request for USB DC -+#endif -+ -+#if (PLATFORM_TYPE==NEON) || (PLATFORM_TYPE==NEONB) -+ SPEC_GP 20,OUT,HIGH,1 //MC_DREQ0, nc -+#else -+ SPEC_GP 20,IN,HIGH,1 //MC_DREQ0, DMA request for USB HC -+#endif -+ -+ SPEC_GP 21,IN,HIGH,0 // pcmcia card detect -+ SPEC_GP 22,IN,HIGH,0 // pcmcia intr (active low) -+ -+#if (PLATFORM_TYPE==NEON) || (PLATFORM_TYPE==NEONB) -+ SPEC_GP 23,IN,LOW,0 //UCB1400 irq for NEONB, nc for NEW NEON -+#else -+ SPEC_GP 23,OUT,HIGH,0 //SSP_SCLK, nc -+#endif -+ -+#if (PLATFORM_TYPE==NEON) || (PLATFORM_TYPE==NEONB) -+ SPEC_GP 24,IN,LOW,0 //SSP_SFRM, SMSC interrupt (active high) -+#else -+ SPEC_GP 24,OUT,HIGH,0 //SSP_SFRM, nc -+#endif -+ -+ SPEC_GP 25,OUT,HIGH,0 //SSP_TXD, nc -+ SPEC_GP 26,OUT,HIGH,0 //SSP_RXD, nc -+ SPEC_GP 27,OUT,LOW,0 //SSP_EXTCLK, DC1 (SMC) -+ -+ SPEC_GP 28,IN,HIGH,1 //AC_BITCLK, ac97 bitclk -+ SPEC_GP 29,IN,HIGH,1 //AC_SDATAIN0, ac97 datain0 -+ SPEC_GP 30,OUT,HIGH,2 //AC_SDATAOUT, ac97 data out -+ SPEC_GP 31,OUT,HIGH,2 //AC_SYNC, ac97 sync -+//////////////////////////////////////////////////////////////////////////////////////////// -+ -+ -+ SPEC_GP 32,OUT,HIGH,0 //AC_SDATAIN1, wet contact -+ SPEC_GP 33,OUT,LOW,0 //MC_nCS5, green led (left), NEON:J13,pin 2 -+ SPEC_GP 34,IN,HIGH,1 //FF_RXD -+ SPEC_GP 35,IN,HIGH,1 //FF_CTS -+ SPEC_GP 36,IN,HIGH,0 //FF_DCD, MMC Card Detect -+ SPEC_GP 37,IN,HIGH,1 //FF_DSR -+ SPEC_GP 38,IN,HIGH,0 //FF_RI, MMC Write Protect, MMC/SDIO IRQ -+ SPEC_GP 39,OUT,HIGH,2 //FF_TXD -+ SPEC_GP 40,OUT,HIGH,2 //FF_DTR -+ SPEC_GP 41,OUT,HIGH,2 //FF_RTS -+ SPEC_GP 42,IN,HIGH,1 //BT_RXD -+ SPEC_GP 43,OUT,HIGH,2 //BT_TXD -+#if (PLATFORM_TYPE==NEON) -+ SPEC_GP 44,IN,HIGH,0 //BT_CTS, NEON:J12,pin 2 -+#else -+ SPEC_GP 44,OUT,HIGH,0 //BT_CTS, USB wakeup host -+#endif -+ SPEC_GP 45,OUT,LOW,0 //BT_RTS, HIGH 2 -+#if (PLATFORM_TYPE==NEON) -+ SPEC_GP 46,IN,HIGH,0 //ST_RXD, NEON:J12,pin 3 -+#else -+ SPEC_GP 46,IN,HIGH,2 //ST_RXD -+#endif -+ SPEC_GP 47,OUT,HIGH,1 //ST_TXD -+ SPEC_GP 48,OUT,HIGH,2 //MC_nPOE, pcmcia -+ SPEC_GP 49,OUT,HIGH,2 //MC_nPWE, pcmcia -+ SPEC_GP 50,OUT,HIGH,2 //MC_nPIOR, pcmcia -+ SPEC_GP 51,OUT,HIGH,2 //MC_nPIOW, pcmcia -+ SPEC_GP 52,OUT,HIGH,2 //MC_nPCE1, pcmcia -+ SPEC_GP 53,OUT,HIGH,2 //MC_nPCE2, pcmcia -+ SPEC_GP 54,OUT,HIGH,2 //MC_nPSKTSEL, nc -+ SPEC_GP 55,OUT,HIGH,2 //MC_nPREG, pcmcia attribe vs Io space -+ SPEC_GP 56,IN,HIGH,1 //MC_nPWAIT pcmcia busy -+ SPEC_GP 57,IN,HIGH,1 //MC_nIOIS16, pcmcia 16 bit wide -+ SPEC_GP 58,OUT,HIGH,ALT_LCD //LCD_LDD0, also GP_PIX_D0 -+ SPEC_GP 59,OUT,HIGH,ALT_LCD //LCD_LDD1, also GP_PIX_D1 -+ SPEC_GP 60,OUT,HIGH,ALT_LCD //LCD_LDD2, also GP_PIX_D2 -+ SPEC_GP 61,OUT,HIGH,ALT_LCD //LCD_LDD3, also GP_PIX_D3 -+ SPEC_GP 62,OUT,HIGH,ALT_LCD //LCD_LDD4, also GP_PIX_D4 -+ SPEC_GP 63,OUT,HIGH,ALT_LCD //LCD_LDD5, also GP_PIX_D5 -+ -+ -+//////////////////////////////////////////////////////////////////////////////////////////// -+ -+ -+ SPEC_GP 64,OUT,HIGH,ALT_LCD //LCD_LDD6, also GP_PIX_D6 -+ SPEC_GP 65,OUT,HIGH,ALT_LCD //LCD_LDD7, also GP_PIX_D7 -+ SPEC_GP 66,OUT,HIGH,ALT_LCD //LCD_LDD8, also GP_PIX_RESET -+ SPEC_GP 67,OUT,HIGH,ALT_LCD //LCD_LDD9 -+ SPEC_GP 68,OUT,HIGH,ALT_LCD //LCD_LDD10 -+ SPEC_GP 69,OUT,HIGH,ALT_LCD //LCD_LDD11 -+ SPEC_GP 70,OUT,HIGH,ALT_LCD //LCD_LDD12 -+ -+ SPEC_GP 71,OUT,HIGH,ALT_LCD //LCD_LDD13 -+ -+ SPEC_GP 72,OUT,HIGH,ALT_LCD //LCD_LDD14 -+ SPEC_GP 73,OUT,HIGH,ALT_LCD //LCD_LDD15 -+ SPEC_GP 74,OUT,HIGH,ALT_LCD //LCD_FCLK, also GP_PIX_READ -+ SPEC_GP 75,OUT,LCD_CS_STATE,ALT_LCD //LCD_LCLK, also GP_PIX_CS1 -+ SPEC_GP 76,OUT,LCD_CS_STATE,ALT_LCD //LCD_PCLK, also GP_PIX_CS0 -+ SPEC_GP 77,OUT,HIGH,ALT_LCD //LCD_ACBIAS, also GP_PIX_A0 -+ SPEC_GP 78,OUT,HIGH,2 //nCS2, DMA acknowledge channel 1 for USB, SMC91c111 Chip Select nDATACS -+ SPEC_GP 79,OUT,HIGH,2 //nCS3, DMA acknowledge channel 2 for USB, SM501 Chip Select -+ SPEC_GP 80,OUT,HIGH,2 //nCS4, USB chip select, SMC91c111 Chip Select -+ SPEC_GP 81,IN,LOW,0 //GND (pin F16), pxa255 has 9 extra gpios -+ SPEC_GP 82,IN,LOW,0 //GND (pin E16) -+ SPEC_GP 83,IN,LOW,0 //GND (pin E15) -+ SPEC_GP 84,IN,LOW,0 //GND (pin D16) -+ SPEC_GP 85,IN,LOW,0 //GND (pin F15) -+//to maintain compatibility with code written for the pxa250 -+//the meaning of gp86-gp89's direction bit is reversed, and alternate function is forced to the SDRAM/AC97 unit's control -+ SPEC_GP 86,IN,HIGH,0 //SDCS2 (pin G3) set as OUTPUT!!! -+ SPEC_GP 87,IN,HIGH,0 //SDCS3 (pin F2) set as OUTPUT!!! -+ SPEC_GP 88,IN,HIGH,0 //old RDnWR(pin D3) set as OUTPUT!!! -+ SPEC_GP 89,IN,LOW,0 //old ac97_reset(pin D10), set as OUTPUT!!! -+ SPEC_GP 90,IN,LOW,0 //undefined -+ SPEC_GP 91,IN,LOW,0 //undefined -+ SPEC_GP 92,IN,LOW,0 //undefined -+ SPEC_GP 93,IN,LOW,0 //undefined -+ SPEC_GP 94,IN,LOW,0 //undefined -+ SPEC_GP 95,IN,LOW,0 //undefined -+ -+// **************************************************************************** -+ CREATE_MASK_DIR DRVAL0, SPEC_, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 -+ CREATE_MASK_LEVEL SRVAL0, SPEC_, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 -+ CREATE_MASK_ALT AFVAL0, SPEC_, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 -+ CREATE_MASK_ALT AFVAL16,SPEC_,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 -+ -+ CREATE_MASK_DIR DRVAL32,SPEC_,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 -+ CREATE_MASK_LEVEL SRVAL32,SPEC_,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 -+ CREATE_MASK_ALT AFVAL32,SPEC_,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 -+ CREATE_MASK_ALT AFVAL48,SPEC_,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 -+ -+ CREATE_MASK_DIR DRVAL64,SPEC_,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95 -+ CREATE_MASK_LEVEL SRVAL64,SPEC_,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95 -+ CREATE_MASK_ALT AFVAL64,SPEC_,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 -+ CREATE_MASK_ALT AFVAL80,SPEC_,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95 -+ -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/pxaGpio27x.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaGpio27x.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/pxaGpio27x.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaGpio27x.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,221 @@ -+//gpios for HALOGEN -+ -+//CP - Clock and Power Management Unit -+//MMC - Multimedia Card Controller -+//MC - Memory Controller -+//SIU - System Integration Unit -+//SSP - Synchronous Serial Port -+//AC - Audio Controller (AC97) -+//FF - Full Function UART -+//BT - Blue Tooth UART -+//ST - standard UART Port -+//LCD - LCD Controller -+ -+ SPEC_GP 0,IN,HIGH,0 // -+ SPEC_GP 1,IN,HIGH,0 //nRESET_GPIO, usb client connect interrupt -+ -+ SPEC_GP 2,IN,HIGH,0 //SYS_EN -+ -+ SPEC_GP 3,IN,HIGH,0 //PWR_SCL, Rev 1 usb client enable, float means USB Slave not ready to accept data -+ //out 1 means ready -+ -+ SPEC_GP 4,IN,HIGH,0 //PWR_SDA -+ -+ SPEC_GP 5,IN,HIGH,0 //PWR_CAP 0 -+ SPEC_GP 6,IN,HIGH,0 //PWR_CAP 1 -+ SPEC_GP 7,IN,HIGH,0 //PWR_CAP 2 -+ SPEC_GP 8,IN,HIGH,0 //PWR_CAP 3 -+ SPEC_GP 9,OUT,HIGH,0 //NC -+#if (PLATFORM_REV==1) -+ SPEC_GP 10,OUT,HIGH,0 //NC, rev 1 doesn't have MMC write protect, or card detect -+#else -+ SPEC_GP 10,IN,HIGH,0 //MMC card detect -+#endif -+ -+ SPEC_GP 11,OUT,HIGH,0 //NC -+ SPEC_GP 12,OUT,HIGH,0 //NC -+ SPEC_GP 13,OUT,HIGH,0 //NC -+ -+ SPEC_GP 14,OUT,HIGH,0 //NC -+ SPEC_GP 15,OUT,HIGH,2 //nCS1, NC -+ -+ -+ SPEC_GP 16,OUT,LOW,0 //PWM0 backlight intensity, 0 brightest -+ SPEC_GP 17,OUT,HIGH,0 //NC -+ -+ SPEC_GP 18,IN,HIGH,1 //MC_RDY, VIO_READY -+ -+ SPEC_GP 19,OUT,HIGH,0 //NC -+ -+ SPEC_GP 20,OUT,HIGH,1 //MC_DREQ0, NC -+ -+ SPEC_GP 21,OUT,HIGH,0 //NC -+ SPEC_GP 22,OUT,HIGH,0 //NC -+ -+#if (PLATFORM_REV==1) -+ SPEC_GP 23,OUT,HIGH,0 //NC -+#else -+ SPEC_GP 23,IN,HIGH,0 //rev 2 UCB1400 int -+#endif -+ -+ SPEC_GP 24,IN,LOW,0 //LAN91c111 Interrupt pin (SMSC) -+ -+ SPEC_GP 25,OUT,HIGH,0 //SSP_TXD, nc -+ SPEC_GP 26,OUT,HIGH,0 //SSP_RXD, nc -+ SPEC_GP 27,OUT,HIGH,0 //NC -+ -+ SPEC_GP 28,IN,HIGH,1 //AC_BITCLK, ac97 bitclk -+ SPEC_GP 29,IN,HIGH,1 //AC_SDATAIN0, ac97 datain0 -+ SPEC_GP 30,OUT,HIGH,2 //AC_SDATAOUT, ac97 data out -+ SPEC_GP 31,OUT,HIGH,2 //AC_SYNC, ac97 sync -+//////////////////////////////////////////////////////////////////////////////////////////// -+ -+ -+ SPEC_GP 32,OUT,HIGH,2 //MMCLK -+ SPEC_GP 33,OUT,HIGH,0 //MC_nCS5, NC -+ SPEC_GP 34,IN,HIGH,1 //(in alt 1:FF_RXD) (out alt 1:USB_P2_2) 2 input, Session Valid -+ SPEC_GP 35,IN,HIGH,0 //(in alt 1:FF_CTS) (in alt 2:USB_P2_1) 1 input, SRP Detect -+#if (PLATFORM_REV==1) -+ SPEC_GP 36,OUT,HIGH,0 //(in alt 1:FF_DCD) -+#else -+ SPEC_GP 36,IN,HIGH,0 //(in alt 1:FF_DCD) (out alt 1:USB_P2_4) 4 output Vbus Enable -+#endif -+ SPEC_GP 37,OUT,HIGH,0 //(in alt 1:FF_DSR) (out alt 1:USB_P2_8) 8 output Vbus Pulsing Enable for SRP -+ -+ SPEC_GP 38,IN,HIGH,0 //(in alt 1:FF_RI) (in alt 3:USB_P2_3) //MMC Write Protect (rev 1 is NC),// 3 input, Vbus valid 4.4 Volts -+ SPEC_GP 39,OUT,HIGH,2 //(out alt 2:FF_TXD) (out alt 1:USB_P2_6) -+ -+#if (PLATFORM_REV==1) -+ SPEC_GP 40,OUT,HIGH,2 //(out alt 2:FF_DTR) -+#else -+ SPEC_GP 40,IN,HIGH,0 //(out alt 2:FF_DTR) (in alt 3:USB_P2_5) 5 input, Vbus valid 4.0 Volts -+#endif -+ -+ SPEC_GP 41,OUT,HIGH,2 //(out alt 2:FF_RTS) (in alt 2:USB_P2_7) 7 input OTG ID -+ SPEC_GP 42,IN,HIGH,1 //BT_RXD -+ SPEC_GP 43,OUT,HIGH,2 //BT_TXD -+ SPEC_GP 44,OUT,HIGH,0 //BT_CTS, NC -+ SPEC_GP 45,OUT,LOW,0 //BT_RTS, NC -+ SPEC_GP 46,IN,HIGH,2 //ST_RXD -+ SPEC_GP 47,OUT,HIGH,1 //ST_TXD -+ SPEC_GP 48,OUT,HIGH,2 //MC_nPOE,NC -+ SPEC_GP 49,OUT,HIGH,2 //MC_nPWE -+ SPEC_GP 50,OUT,HIGH,2 //MC_nPIOR, NC -+ SPEC_GP 51,OUT,HIGH,2 //MC_nPIOW, NC -+ SPEC_GP 52,OUT,HIGH,2 //MC_nPCE1, NC -+ SPEC_GP 53,OUT,HIGH,2 //MC_nPCE2, NC -+ SPEC_GP 54,OUT,HIGH,2 //MC_nPSKTSEL, nc -+ SPEC_GP 55,OUT,HIGH,2 //MC_nPREG, NC -+ SPEC_GP 56,IN,HIGH,1 //MC_nPWAIT NC -+ SPEC_GP 57,IN,HIGH,1 //MC_nIOIS16, NC -+ SPEC_GP 58,OUT,HIGH,ALT_LCD //LCD_LDD0 -+ SPEC_GP 59,OUT,HIGH,ALT_LCD //LCD_LDD1 -+ SPEC_GP 60,OUT,HIGH,ALT_LCD //LCD_LDD2 -+ SPEC_GP 61,OUT,HIGH,ALT_LCD //LCD_LDD3 -+ SPEC_GP 62,OUT,HIGH,ALT_LCD //LCD_LDD4 -+ SPEC_GP 63,OUT,HIGH,ALT_LCD //LCD_LDD5 -+ -+ -+//////////////////////////////////////////////////////////////////////////////////////////// -+ -+ -+ SPEC_GP 64,OUT,HIGH,ALT_LCD //LCD_LDD6 -+ SPEC_GP 65,OUT,HIGH,ALT_LCD //LCD_LDD7 -+ SPEC_GP 66,OUT,HIGH,ALT_LCD //LCD_LDD8 -+ SPEC_GP 67,OUT,HIGH,ALT_LCD //LCD_LDD9 -+ SPEC_GP 68,OUT,HIGH,ALT_LCD //LCD_LDD10 -+ SPEC_GP 69,OUT,HIGH,ALT_LCD //LCD_LDD11 -+ SPEC_GP 70,OUT,HIGH,ALT_LCD //LCD_LDD12 -+ -+ SPEC_GP 71,OUT,HIGH,ALT_LCD //LCD_LDD13 -+ -+ SPEC_GP 72,OUT,HIGH,ALT_LCD //LCD_LDD14 -+ SPEC_GP 73,OUT,HIGH,ALT_LCD //LCD_LDD15 -+ SPEC_GP 74,OUT,HIGH,ALT_LCD //LCD_FCLK, NC -+ SPEC_GP 75,OUT,HIGH,ALT_LCD //LCD_LCLK -+ SPEC_GP 76,OUT,HIGH,ALT_LCD //LCD_PCLK -+ SPEC_GP 77,OUT,HIGH,ALT_LCD //LCD_ACBIAS -+ SPEC_GP 78,OUT,HIGH,2 //nCS2, SMC91c111 Chip Select nDATACS -+ SPEC_GP 79,OUT,HIGH,2 //nCS3, NC -+ SPEC_GP 80,OUT,HIGH,2 //nCS4, SMC91c111 Chip Select -+ SPEC_GP 81,OUT,HIGH,0 //NC -+ SPEC_GP 82,OUT,HIGH,0 //NC -+ SPEC_GP 83,OUT,HIGH,0 //NC -+ SPEC_GP 84,OUT,HIGH,0 //NC -+ SPEC_GP 85,OUT,HIGH,0 //NC -+ SPEC_GP 86,OUT,HIGH,ALT_LCD //LDD16 -+ SPEC_GP 87,OUT,HIGH,ALT_LCD //LDD17 -+#if (PLATFORM_REV==1) -+ SPEC_GP 88,OUT,HIGH,0 //NC -+ SPEC_GP 89,OUT,HIGH,0 //NC -+#else -+ SPEC_GP 88,IN,HIGH,1 //port 1 usb power over current -+ SPEC_GP 89,OUT,HIGH,0 //port 1 usb power enable (driver needs to enable usb power (LOW,2) -+#endif -+ -+ SPEC_GP 90,OUT,HIGH,0 //NC -+ SPEC_GP 91,OUT,HIGH,0 //NC -+ SPEC_GP 92,OUT,HIGH,1 //MMDAT -+ SPEC_GP 93,OUT,HIGH,0 //NC -+ SPEC_GP 94,OUT,HIGH,0 //NC -+ SPEC_GP 95,OUT,HIGH,0 //NC -+ SPEC_GP 96,OUT,HIGH,0 //NC -+ SPEC_GP 97,OUT,HIGH,0 //NC -+ SPEC_GP 98,OUT,HIGH,0 //NC -+ SPEC_GP 99,OUT,HIGH,0 //NC -+ SPEC_GP 100,OUT,HIGH,0 //NC -+ SPEC_GP 101,OUT,HIGH,0 //NC -+ SPEC_GP 102,OUT,HIGH,0 //NC -+ SPEC_GP 103,OUT,HIGH,0 //port 1,USB Power Enable for REV 1 board (driver needs to enable usb power (LOW,0) -+ SPEC_GP 104,OUT,HIGH,0 //NC -+ -+#if (PLATFORM_REV==1) -+ SPEC_GP 105,IN,HIGH,0 //USB Overcurrent -+#else -+ SPEC_GP 105,OUT,HIGH,0 //NC -+#endif -+ -+ SPEC_GP 106,OUT,HIGH,0 //NC -+ SPEC_GP 107,OUT,HIGH,0 //NC -+ SPEC_GP 108,OUT,HIGH,0 //NC -+ SPEC_GP 109,OUT,HIGH,1 //MMDAT 1 -+ SPEC_GP 110,OUT,HIGH,1 //MMDAT 2 -+ SPEC_GP 111,OUT,HIGH,1 //MMDAT 3 -+ SPEC_GP 112,OUT,HIGH,1 //MMCMD -+ SPEC_GP 113,OUT,HIGH,2 //AC97 Reset, NC -+ SPEC_GP 114,OUT,HIGH,0 //NC -+ SPEC_GP 115,OUT,HIGH,0 //NC -+ SPEC_GP 116,OUT,HIGH,0 //NC -+ SPEC_GP 117,OUT,HIGH,1 //SCL (I2C) -+ SPEC_GP 118,OUT,HIGH,1 //SDA (I2C) -+ SPEC_GP 119,OUT,HIGH,0 //NC -+ SPEC_GP 120,OUT,HIGH,0 //NC -+ SPEC_GP 121,IN,LOW,0 //undefined -+ SPEC_GP 122,IN,LOW,0 //undefined -+ SPEC_GP 123,IN,LOW,0 //undefined -+ SPEC_GP 124,IN,LOW,0 //undefined -+ SPEC_GP 125,IN,LOW,0 //undefined -+ SPEC_GP 126,IN,LOW,0 //undefined -+ SPEC_GP 127,IN,LOW,0 //undefined -+ -+// **************************************************************************** -+ CREATE_MASK_DIR DRVAL0, SPEC_, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 -+ CREATE_MASK_LEVEL SRVAL0, SPEC_, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 -+ CREATE_MASK_ALT AFVAL0, SPEC_, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 -+ CREATE_MASK_ALT AFVAL16,SPEC_,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 -+ -+ CREATE_MASK_DIR DRVAL32,SPEC_,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 -+ CREATE_MASK_LEVEL SRVAL32,SPEC_,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 -+ CREATE_MASK_ALT AFVAL32,SPEC_,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 -+ CREATE_MASK_ALT AFVAL48,SPEC_,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 -+ -+ CREATE_MASK_DIR DRVAL64,SPEC_,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95 -+ CREATE_MASK_LEVEL SRVAL64,SPEC_,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95 -+ CREATE_MASK_ALT AFVAL64,SPEC_,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 -+ CREATE_MASK_ALT AFVAL80,SPEC_,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95 -+ -+ CREATE_MASK_DIR DRVAL96,SPEC_,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127 -+ CREATE_MASK_LEVEL SRVAL96,SPEC_,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127 -+ CREATE_MASK_ALT AFVAL96,SPEC_, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111 -+ CREATE_MASK_ALT AFVAL112,SPEC_,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127 -+ -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/pxaGpio.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaGpio.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/pxaGpio.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaGpio.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,142 @@ -+#include "platformTypes.h" -+ -+#define IN 0 -+#define OUT 1 -+ -+#define LOW 0 -+#define HIGH 1 -+ -+ .ifdef __ARMASM -+.macro SPEC_GP gp_,dir,level,alt -+SPEC_\gp_ EQU \dir+(\level<<8)+(\alt<<16) -+.endm -+ .else -+.macro SPEC_GP gp_,dir,level,alt -+ .set SPEC_\gp_,\dir+(\level<<8)+(\alt<<16) -+.endm -+ .endif -+// ***************************************************************************************** -+.macro CREATE_MASK_DIR name,prefix,p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31 -+ .ifdef __ARMASM -+ LCLA mask -+ .endif -+ .set mask,((\prefix\p0&1)<<(\p0&0x1f)) -+ .set mask,mask | ((\prefix\p1&1)<<(\p1&0x1f)) -+ .set mask,mask | ((\prefix\p2&1)<<(\p2&0x1f)) -+ .set mask,mask | ((\prefix\p3&1)<<(\p3&0x1f)) -+ .set mask,mask | ((\prefix\p4&1)<<(\p4&0x1f)) -+ .set mask,mask | ((\prefix\p5&1)<<(\p5&0x1f)) -+ .set mask,mask | ((\prefix\p6&1)<<(\p6&0x1f)) -+ .set mask,mask | ((\prefix\p7&1)<<(\p7&0x1f)) -+ .set mask,mask | ((\prefix\p8&1)<<(\p8&0x1f)) -+ .set mask,mask | ((\prefix\p9&1)<<(\p9&0x1f)) -+ .set mask,mask | ((\prefix\p10&1)<<(\p10&0x1f)) -+ .set mask,mask | ((\prefix\p11&1)<<(\p11&0x1f)) -+ .set mask,mask | ((\prefix\p12&1)<<(\p12&0x1f)) -+ .set mask,mask | ((\prefix\p13&1)<<(\p13&0x1f)) -+ .set mask,mask | ((\prefix\p14&1)<<(\p14&0x1f)) -+ .set mask,mask | ((\prefix\p15&1)<<(\p15&0x1f)) -+ .set mask,mask | ((\prefix\p16&1)<<(\p16&0x1f)) -+ .set mask,mask | ((\prefix\p17&1)<<(\p17&0x1f)) -+ .set mask,mask | ((\prefix\p18&1)<<(\p18&0x1f)) -+ .set mask,mask | ((\prefix\p19&1)<<(\p19&0x1f)) -+ .set mask,mask | ((\prefix\p20&1)<<(\p20&0x1f)) -+ .set mask,mask | ((\prefix\p21&1)<<(\p21&0x1f)) -+ .set mask,mask | ((\prefix\p22&1)<<(\p22&0x1f)) -+ .set mask,mask | ((\prefix\p23&1)<<(\p23&0x1f)) -+ .set mask,mask | ((\prefix\p24&1)<<(\p24&0x1f)) -+ .set mask,mask | ((\prefix\p25&1)<<(\p25&0x1f)) -+ .set mask,mask | ((\prefix\p26&1)<<(\p26&0x1f)) -+ .set mask,mask | ((\prefix\p27&1)<<(\p27&0x1f)) -+ .set mask,mask | ((\prefix\p28&1)<<(\p28&0x1f)) -+ .set mask,mask | ((\prefix\p29&1)<<(\p29&0x1f)) -+ .set mask,mask | ((\prefix\p30&1)<<(\p30&0x1f)) -+ .set mask,mask | ((\prefix\p31&1)<<(\p31&0x1f)) -+ .ifdef __ARMASM -+\name EQU mask -+ .else -+ .set \name,mask -+ .endif -+.endm -+ -+.macro CREATE_MASK_LEVEL name,prefix,p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31 -+ .ifdef __ARMASM -+ LCLA mask -+ .endif -+ .set mask,(((\prefix\p0>>8)&1)<<(\p0&0x1f)) -+ .set mask,mask | (((\prefix\p1>>8)&1)<<(\p1&0x1f)) -+ .set mask,mask | (((\prefix\p2>>8)&1)<<(\p2&0x1f)) -+ .set mask,mask | (((\prefix\p3>>8)&1)<<(\p3&0x1f)) -+ .set mask,mask | (((\prefix\p4>>8)&1)<<(\p4&0x1f)) -+ .set mask,mask | (((\prefix\p5>>8)&1)<<(\p5&0x1f)) -+ .set mask,mask | (((\prefix\p6>>8)&1)<<(\p6&0x1f)) -+ .set mask,mask | (((\prefix\p7>>8)&1)<<(\p7&0x1f)) -+ .set mask,mask | (((\prefix\p8>>8)&1)<<(\p8&0x1f)) -+ .set mask,mask | (((\prefix\p9>>8)&1)<<(\p9&0x1f)) -+ .set mask,mask | (((\prefix\p10>>8)&1)<<(\p10&0x1f)) -+ .set mask,mask | (((\prefix\p11>>8)&1)<<(\p11&0x1f)) -+ .set mask,mask | (((\prefix\p12>>8)&1)<<(\p12&0x1f)) -+ .set mask,mask | (((\prefix\p13>>8)&1)<<(\p13&0x1f)) -+ .set mask,mask | (((\prefix\p14>>8)&1)<<(\p14&0x1f)) -+ .set mask,mask | (((\prefix\p15>>8)&1)<<(\p15&0x1f)) -+ .set mask,mask | (((\prefix\p16>>8)&1)<<(\p16&0x1f)) -+ .set mask,mask | (((\prefix\p17>>8)&1)<<(\p17&0x1f)) -+ .set mask,mask | (((\prefix\p18>>8)&1)<<(\p18&0x1f)) -+ .set mask,mask | (((\prefix\p19>>8)&1)<<(\p19&0x1f)) -+ .set mask,mask | (((\prefix\p20>>8)&1)<<(\p20&0x1f)) -+ .set mask,mask | (((\prefix\p21>>8)&1)<<(\p21&0x1f)) -+ .set mask,mask | (((\prefix\p22>>8)&1)<<(\p22&0x1f)) -+ .set mask,mask | (((\prefix\p23>>8)&1)<<(\p23&0x1f)) -+ .set mask,mask | (((\prefix\p24>>8)&1)<<(\p24&0x1f)) -+ .set mask,mask | (((\prefix\p25>>8)&1)<<(\p25&0x1f)) -+ .set mask,mask | (((\prefix\p26>>8)&1)<<(\p26&0x1f)) -+ .set mask,mask | (((\prefix\p27>>8)&1)<<(\p27&0x1f)) -+ .set mask,mask | (((\prefix\p28>>8)&1)<<(\p28&0x1f)) -+ .set mask,mask | (((\prefix\p29>>8)&1)<<(\p29&0x1f)) -+ .set mask,mask | (((\prefix\p30>>8)&1)<<(\p30&0x1f)) -+ .set mask,mask | (((\prefix\p31>>8)&1)<<(\p31&0x1f)) -+ .ifdef __ARMASM -+\name EQU mask -+ .else -+ .set \name,mask -+ .endif -+.endm -+ -+.macro CREATE_MASK_ALT name,prefix,p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15 -+ .ifdef __ARMASM -+ LCLA mask -+ .endif -+ .set mask,(((\prefix\p0>>16)&3)<<((\p0&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p1>>16)&3)<<((\p1&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p2>>16)&3)<<((\p2&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p3>>16)&3)<<((\p3&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p4>>16)&3)<<((\p4&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p5>>16)&3)<<((\p5&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p6>>16)&3)<<((\p6&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p7>>16)&3)<<((\p7&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p8>>16)&3)<<((\p8&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p9>>16)&3)<<((\p9&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p10>>16)&3)<<((\p10&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p11>>16)&3)<<((\p11&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p12>>16)&3)<<((\p12&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p13>>16)&3)<<((\p13&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p14>>16)&3)<<((\p14&0x0f)<<1)) -+ .set mask,mask | (((\prefix\p15>>16)&3)<<((\p15&0x0f)<<1)) -+ .ifdef __ARMASM -+\name EQU mask -+ .else -+ .set \name,mask -+ .endif -+.endm -+ -+#if (PLATFORM_TYPE==NEON)||(PLATFORM_TYPE==NEONB)||(PLATFORM_TYPE==BD2003)||(PLATFORM_TYPE==BOUNDARY_OLD_BOARD) -+#define ALT_LCD 2 -+#include "pxaGpio25x.h" -+#else -+#if (PLATFORM_TYPE==HALOGEN) -+#define ALT_LCD 2 -+#include "pxaGpio27x.h" -+#else -+#include "pxaGpioGame.h" -+#endif -+#endif -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/pxaHardware.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaHardware.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/pxaHardware.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaHardware.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,288 @@ -+//#define GPIO_BASE 0x40E00000 -+#define GPLR0 0x00 //level -+#define GPLR1 0x04 -+#define GPLR2 0x08 -+#define GPLR3 0x100 //level -+ -+#define GPDR0 0x0c //direction -+#define GPDR1 0x10 -+#define GPDR2 0x14 -+#define GPDR3 0x10c //direction -+ -+#define GPSR0 0x18 //set -+#define GPSR1 0x1C -+#define GPSR2 0x20 -+#define GPSR3 0x118 //set -+ -+#define GPCR0 0x24 //clear -+#define GPCR1 0x28 -+#define GPCR2 0x2c -+#define GPCR3 0x124 //clear -+ -+#define GRER0 0x30 //enable rising edge detect -+#define GRER1 0x34 -+#define GRER2 0x38 -+#define GRER3 0x130 //enable rising edge detect -+ -+#define GFER0 0x3C //enable falling edge detect -+#define GFER1 0x40 -+#define GFER2 0x44 -+#define GFER3 0x13C //enable falling edge detect -+ -+#define GEDR0 0x48 //edge detect status -+#define GEDR1 0x4C -+#define GEDR2 0x50 -+#define GEDR3 0x148 //edge detect status -+ -+#define GAFR0_L 0x54 //alternate function -+#define GAFR0_U 0x58 -+#define GAFR1_L 0x5C -+#define GAFR1_U 0x60 -+#define GAFR2_L 0x64 -+#define GAFR2_U 0x68 -+#define GAFR3_L 0x6c -+#define GAFR3_U 0x70 -+ -+ -+#define UART_RBR 0 //read, DLAB-0 :RECEIVE_BUFFER -+#define UART_THR 0 //write, DLAB-0 :TRANSMIT_BUFFER -+#define UART_DLL 0 //r/w, DLAB-1 :DIVISOR_LOW -+#define UART_IER 4 //r/w, DLAB-0 :INTERRUPT_ENABLE -+#define UART_DLH 4 //r/w, DLAB-1 :DIVISOR_HIGH -+ -+#define UART_IIR 8 //read :INTERRUPT_INDENTIFICATION -+#define UART_FCR 8 //write :FIFO_CONTROL -+#define UART_LCR 0x0c //r/w :LINE_CONTROL -+#define UART_MCR 0x10 //r/w :MODEM_CONTROL -+#define UART_LSR 0x14 //read :LINE_STATUS -+#define UART_MSR 0x18 //read :MODEM_STATUS -+#define UART_SPR 0x1c //r/w :SCRATCH_PAD -+#define UART_ISR 0x20 //r/w :INFRARED -+ -+//#define IC_BASE 0x40D00000 -+#define ICIP 0x00 //IRQ pending status -+#define ICMR 0x04 //interrupt controller mask -+#define ICLR 0x08 //level, 0 - irq, 1 -fiq -+#define ICFP 0x0C //FIQ pending status -+#define ICPR 0x10 //all interrupts pending, no mask -+#define ICCR 0x14 //0 - ignore ICMR in idle mode, 1 - only unmasked interrupts will awaken processor -+ -+ -+#define __SKIP 8 -+#define ICL1_GPIO0 (8 - __SKIP) -+#define ICL1_GPIO1 (9 - __SKIP) -+#define ICL1_GPIO2_80 (10 - __SKIP) -+#define ICL1_USB (11 - __SKIP) -+#define ICL1_PMU (12 - __SKIP) -+#define ICL1_I2S (13 - __SKIP) -+#define ICL1_AC97 (14 - __SKIP) -+#define ICL1_LCD (17 - __SKIP) -+#define ICL1_I2C (18 - __SKIP) -+#define ICL1_ICP (19 - __SKIP) -+#define ICL1_STUART (20 - __SKIP) -+#define ICL1_BTUART (21 - __SKIP) -+#define ICL1_FFUART (22 - __SKIP) -+#define ICL1_MMC (23 - __SKIP) -+#define ICL1_SSP (24 - __SKIP) -+#define ICL1_DMA (25 - __SKIP) -+#define ICL1_OS_TIMER0 (26 - __SKIP) -+#define ICL1_OS_TIMER1 (27 - __SKIP) -+#define ICL1_OS_TIMER2 (28 - __SKIP) -+#define ICL1_OS_TIMER3 (29 - __SKIP) -+#define ICL1_RTC_TICK (30 - __SKIP) -+#define ICL1_RTC_ALARM_MATCH (31 - __SKIP) -+ -+//#define OS_TIMER_BASE 0x40a00000 -+#define OSMR0 0x00 -+#define OSMR1 0x04 -+#define OSMR2 0x08 -+#define OSMR3 0x0c -+#define OSCR 0x10 //OS timer Count register, increments at 3.6864 Mhz -+#define OSSR 0x14 //OS timer Status Register -+#define OWER 0x18 //OS timer Watchdog Match enable register -+#define OIER 0x1c -+ -+//3686400 ticks/seconds = 3.6864 ticks/usec = 1 tick/.271267361111 usec -+#define TICK_PER_USEC_WHOLE 3 -+#define TICK_PER_USEC_FRAC 0xAFB7E910 -+////////////////////////////////////////////////////////////////////////////////////////// -+ -+//#define PWR_MANAGER_BASE 0x40F00000 -+#define PMCR 0 -+#define PSSR 4 -+#define PSPR 8 -+#define PWER 0x0c -+#define PRER 0x10 -+#define PFER 0x14 -+#define PEDR 0x18 -+#define PCFR 0x1c -+#define PGSR0 0x20 -+#define PGSR1 0x24 -+#define PGSR2 0x28 -+#define RCSR 0x30 -+ -+#define PSSR_MASK 0x37 -+#define RCSR_MASK 0x0f -+#define RCSR_SLEEP_RESET 4 -+ -+//#define CLK_MANAGER_BASE 0x41300000 -+#define CCCR 0 -+#define CKEN 4 -+#define OSCC 8 -+ -+//#define MEMORY_CONTROL_BASE 0x48000000 -+#define MDCNFG 0 -+#define MDREFR 4 -+#define MSC0 8 -+#define MSC1 0x0c -+#define MSC2 0x10 -+#define MECR 0x14 -+#define SXCNFG 0x1c -+#define SXMRS 0x24 -+#define MCMEM0 0x28 -+#define MCMEM1 0x2c -+#define MCATT0 0x30 -+#define MCATT1 0x34 -+#define MCIO0 0x38 -+#define MCIO1 0x3c -+#define MDMRS 0x40 -+#define BOOT_DEF 0x44 -+ -+ -+//#define LCD_CONTROL_BASE 0x44000000 -+#define LCD_CR0 0 //master enable last -+#define LCD_CR1 4 -+#define LCD_CR2 8 -+#define LCD_CR3 0x0c -+#define LCD_FBR0 0x20 //Frame branch register -+#define LCD_FBR1 0x24 //Frame branch register -+#define LCD_SR 0x38 -+#define LCD_INT_ID 0x3c -+#define LCD_TMEDS 0x40 //TMED RGB seed -+#define LCD_TMEDC 0x44 //TMED control -+#define LCD_FDADR0 0x200 //frame descriptor address register -+#define LCD_FDADR1 0x210 //frame descriptor address register -+ -+#define LCD_FSADR0 0x204 //frame source address register -+#define LCD_FSADR1 0x214 //frame source address register -+ -+#define LCD_FIDR0 0x208 //frame ID register -+#define LCD_FIDR1 0x218 //frame ID register -+ -+#define LCD_DCMD0 0x20c //dma command -+#define LCD_DCMD1 0x21c //dma command -+ -+#define CRO_LDDALT 26 //LDDALT ;0 selects RGB 555, 1 selects RGB 565 -+#define CRO_OUC 25 //OUC ;0 underlays, 1 overlays -+#define CR0_CMDIM 24 //CMDIM ;command interrupt mask, 0 - enabled, 1 disabled -+#define CR0_RDSTM 23 //RDSTM ;read status interrupt mask, 0 - enabled, 1 disabled -+#define CR0_LCDT 22 //LCDT ;LCD Panel Type, 1 - internal frame buffer -+#define CR0_IM_OUTPUT_FIFO_UNDERRUN 21 //OUM IM stands for Interrupt Mask -+#define CR0_IM_BRANCH 20 //BSM0 -+#define CR0_PALETTE_DMA_REQUEST_DELAY 12 //PDD 8 bit field, 0-255 -+#define CR0_IM_LCD_QUICK_DISABLE 11 //QDM -+#define CR0_DISABLE 10 //DIS -+#define CR0_DOUBLE_PIXEL_DATA 9 //DPD -+#define CR0_ACTIVE_SELECT 7 //PAS -+#define CR0_IM_END_OF_FRAME 6 //EOFM0 -+#define CR0_IM_INPUT_FIFO_UNDERRUN 5 //IUM -+#define CR0_IM_START_OF_FRAME 4 //SOFM0 -+#define CR0_IM_DISABLE_DONE 3 //LDM -+#define CR0_DUAL_PANEL_SELECT 2 //SDS -+#define CR0_MONOCHROME_SELECT 1 //CMS -+#define CR0_ENABLE 0 //ENB -+ -+ -+ -+ -+#define CR1_BEGINNING_OF_LINE_WAIT 24 //8 bit field +1 -+#define CR1_END_OF_LINE_WAIT 16 //8 bit field +1 -+#define CR1_HORIZONTAL_SYNC_PULSE_WIDTH 10 //6 bit field +1 -+#define CR1_PIXELS_PER_LINE 0 //10 bit field +1 -+ -+ -+ -+#define CR2_BEGINNING_OF_FRAME_WAIT 24 //8 bit field -+#define CR2_END_OF_FRAME_WAIT 16 //8 bit field -+#define CR2_VERTICAL_SYNC_PULSE_WIDTH 10 //6 bit field +1 -+#define CR2_LINES_PER_PANEL 0 //10 bit field +1 -+ -+ -+#define CR3_PDFOR 30 -+#define CR3_DOUBLE_PCLK 27 -+#define CR3_BITS_PER_PIXEL 24 //3 bit field -+//0 - 1 bit -+//1 - 2 bits -+//2 - 4 bits -+//3 - 8 bits -+//4 - 16 bits, -+//5-7 reserved -+#define CR3_BIAS_POLARITY 23 -+#define CR3_PCLK_POLARITY 22 -+#define CR3_LCLK_POLARITY 21 -+#define CR3_FCLK_POLARITY 20 -+#define CR3_API 16 //4 bits field, ac bias transitions per interrupt, 0 disable -+#define CR3_ACBIAS_TOGGLE 8 //8 bit field +1 -+#define CR3_PCLK_DIVISOR 0 //8 bit field +1 -+ -+ -+ -+#define FBR_BRANCH_INT 1 -+#define FBR_BRANCH 0 -+ -+ -+#define SR_MISSED_INT 10 -+#define SR_BRANCH_INT 9 -+#define SR_END_OF_FRAME_INT 8 -+#define SR_QUICK_DISABLE_INT 7 -+#define SR_OUTPUT_FIFO_UNDERRUN 6 -+#define SR_INPUT_FIFO_UNDERRUN0 5 -+#define SR_INPUT_FIFO_UNDERRUN1 4 -+#define SR_ACBIAS_COUNT_INT 3 -+#define SR_BUS_ERROR 2 -+#define SR_START_OF_FRAME 1 -+#define SR_DISABLE_DONE 0 -+ -+#define TMEDS_BLUE 16 //8 bit field -+#define TMEDS_GREEN 8 //8 bit field -+#define TMEDS_RED 0 //8 bit field -+ -+ -+#define TMEDC_MATRIX2_SELECT 14 -+#define TMEDC_RESERVED 12 //2 bit field -+#define TMEDC_HORIZONTAL_BEAT_SUPPRESSION 8 //4 bit field -+#define TMEDC_VERTICAL_BEAT_SUPPRESSION 4 //4 bit field -+#define TMEDC_FRAME_NUMBER_ADJUST_EN 3 -+#define TMEDC_COLOR_OFFSET_ADJUST_EN 2 -+#define TMEDC_FRAME_NUMBER_ADJUST_MATRIX2 1 -+#define TMEDC_COLOR_OFFSET_ADJUST_MATRIX2 0 -+ -+ -+#define DCMD_PALETTE 26 -+#define DCMD_START_OF_FRAME_INTERRUPT 22 -+#define DCMD_END_OF_FRAME_INTERRUPT 21 -+#define DCMD_LENGTH 0 //21 bit field -+ -+ -+#define FDESC_FDADR 0 -+#define FDESC_FSADR 4 -+#define FDESC_FIDR 8 -+#define FDESC_DCMD 0x0c -+ -+#define PSR_MODE_MASK 0x1f -+#define PSR_MODE_USER 0x10 -+#define PSR_MODE_FIQ 0x11 -+#define PSR_MODE_IRQ 0x12 -+#define PSR_MODE_SVC 0x13 -+#define PSR_MODE_DEBUG 0x15 -+#define PSR_MODE_ABORT 0x17 -+#define PSR_MODE_UNDEF 0x1b -+#define PSR_MODE_SYSTEM 0x1f -+#define PSR_NOINTS_MASK 0xc0 -+ -+#define FUNC_REQ_GL 0 -+#define FUNC_REQ_DLW 1 -+#define FUNC_REQ_GAME 2 //not specifically referenced -+#define FUNC_REQ_MAC 3 -+#define FUNC_REQ_WAKEUP 4 -+#define FUNC_REQ_PIC 5 -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/pxaLcd2.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaLcd2.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/pxaLcd2.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaLcd2.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,78 @@ -+#include "pxaLcd.h"
-+#define DA320X240 0
-+#define DA640X240 1
-+#define DA800X480 2
-+#define DA640X480 3
-+#define DA240X320 4
-+#define DA800X600 5
-+#define DA1024X768 6
-+#define DP480X320 7
-+#define DP320X240 8
-+#define DL122X32 9
-+#define UNKNOWN 0xcc
-+
-+#ifdef __ARMASM
-+ GBLS DEF_P
-+#endif
-+
-+#if DISPLAY_TYPE==DA320X240 //5.7 inch display
-+#define DEF_P DA320X240_P
-+#define DEF_DISPLAY_INDEX 0
-+#else
-+#if DISPLAY_TYPE==DA640X240 //6.2 inch display
-+#define DEF_P DA640X240_P
-+#define DEF_DISPLAY_INDEX 1
-+#else
-+#if DISPLAY_TYPE==DA800X480 //7 or 9 inch display
-+#define DEF_P DA800X480_P
-+#define DEF_DISPLAY_INDEX 2
-+#else
-+#if DISPLAY_TYPE==DA640X480 //10.4 inch display
-+#define DEF_P DA640X480_P
-+#define DEF_DISPLAY_INDEX 3
-+#else
-+#if DISPLAY_TYPE==DA240X320 //3.5 inch display
-+#define DEF_P DA240X320_P
-+#define DEF_DISPLAY_INDEX 4
-+#else
-+#if DISPLAY_TYPE==DA800X600
-+#define DEF_P DA800X600_P
-+#define DEF_DISPLAY_INDEX 5
-+#else
-+#if DISPLAY_TYPE==DA1024X768
-+#define DEF_P DA1024X768_P
-+#define DEF_DISPLAY_INDEX 6
-+#else
-+#if DISPLAY_TYPE==DP480X320 //5.7 inch display
-+#define DEF_P DP480X320_P
-+#define DEF_DISPLAY_INDEX 7
-+#else
-+#if DISPLAY_TYPE==DP320X240 //5.7 inch display
-+#define DEF_P DP320X240_P
-+#define DEF_DISPLAY_INDEX 8
-+#else
-+#if DISPLAY_TYPE==DL122X32
-+#define DEF_P DL122X32_P
-+#define DEF_DISPLAY_INDEX 9
-+#else
-+#if DISPLAY_TYPE==UNKNOWN
-+#define DEF_P DA320X240_P
-+#define DEF_DISPLAY_INDEX 0xcc
-+
-+#else
-+#define DEF_P DA320X240_P
-+#define DEF_DISPLAY_INDEX 0
-+#warning "No display selected, defaulting to DA320X240"
-+
-+#endif //0xcc
-+#endif //9
-+#endif //8
-+#endif //7
-+#endif //6
-+#endif //5
-+#endif //4
-+#endif //3
-+#endif //2
-+#endif //1
-+#endif //0
-+
-diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/pxaLcd.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaLcd.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/pxaLcd.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaLcd.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,79 @@ -+#include "platformTypes.h" -+#define WINCE 1 -+#define LINUX 2 -+#define GAME 3 -+ -+#define PXAFB_BPP 16 -+ -+#define LCD_PANEL 0 -+#define CRT 1 -+ -+//pixel clock frequency = LCLK / (2*(PCD+1)) -+#if (PLATFORM_TYPE==HALOGEN) -+#define __BPP 18 -+#define BPP_FORMAT 6 -+#define PDFOR 3 -+#define BYTES_PER_PIXEL 3 -+#else -+#define __BPP 16 -+#define BPP_FORMAT 4 -+#define PDFOR 0 -+#define BYTES_PER_PIXEL 2 -+#endif -+ -+// **************************************************************************** -+// This is where different display settings reside -+// xres,xsyncWidth,xbegin,xend, yres,ysyncWidth,ybegin,yend, enable,unscramble,rotate,active,bpp,clkdiv,type -+//#define DA320X240_P 320, 64, 34, 1, 240, 20, 8, 3, 1,0,0,1,PXAFB_BPP,4,LCD_PANEL //0 -+#define DA320X240_P 320, 64, 34, 11, 240, 5, 8, 3, 1,0,0,1,PXAFB_BPP,4,LCD_PANEL //0 -+ -+#define DA640X240_P 640, 64, 34, 1, 240, 20, 8, 3, 1,1,0,1,PXAFB_BPP,2,LCD_PANEL //1 -+#define DA800X480_P 800, 64, 34, 1, 480, 20, 8, 3, 1,1,0,1,PXAFB_BPP,2,LCD_PANEL //2 -+#define DA640X480_P 640, 64, 34,105, 480, 20, 8,14, 1,1,0,1,PXAFB_BPP,2,LCD_PANEL //3 -+#define DA240X320_P 240, 64, 34, 1, 320, 20, 8, 3, 1,0,1,1,PXAFB_BPP,5,LCD_PANEL //4 -+#define DA800X600_P 800,0x9b,0x31,0x69, 600,0x04,0x01,0x17, 1,1,0,1,PXAFB_BPP,2,CRT //5 -+//#define DA1024X768_P 1024,0xc8,0x55,0xb4, 768,0x06,0x0b,0x1d, 1,1,0,1,PXAFB_BPP,2,CRT //6 -+//#define DA1024X768_P 1024,0xe4,0x3c,0x70, 768,0x0c,0x0b,0x20, 1,1,0,1,PXAFB_BPP,2,CRT //6 -+#define DA1024X768_P 1024,0xe4,0x3c,0x70, 768,0x0c,0x0b,0x20, 1,1,0,1,PXAFB_BPP,2,LCD_PANEL //6 -+#define DP480X320_P 480, 64, 34, 1, 320,20,8,3, 1,0,0,0,PXAFB_BPP,3,LCD_PANEL //7 -+#define DP320X240_P 320, 64, 34, 1, 240,20,8,3, 1,0,0,0,PXAFB_BPP,4,LCD_PANEL //8 -+#define DL122X32_P 320, 64, 34, 1, 240,20,8,3, 0,0,0,0,PXAFB_BPP,4,0 //9 -+ -+// ******************************************************************************** -+#if (PLATFORM_TYPE==BOUNDARY_OLD_BOARD) -+#define MOTHERBOARD_SCRAMBLED -+#endif -+ -+//#define CONFIG_UNSCRAMBLE_LCD -+#ifdef CONFIG_UNSCRAMBLE_LCD -+#if 1 //FL_ACTIVE(DEF_P) //passive cannot swap pin order -+#ifdef MOTHERBOARD_SCRAMBLED -+ -+#ifndef DAUGHTERBOARD_UNSCRAMBLE -+#define LCD_REORDER_BLUE 15,14, 8, 7, 6 -+#define LCD_REORDER_GREEN 13,12,11, 5, 4, 3 -+#define LCD_REORDER_RED 10, 9, 2, 1, 0 -+#endif -+ -+#else -+//motherboard is NOT scrambled -+#ifdef DAUGHTERBOARD_UNSCRAMBLE -+#define LCD_REORDER_BLUE 15,14,13,10, 9 -+#define LCD_REORDER_GREEN 8, 4, 3, 2, 12, 11 -+#define LCD_REORDER_RED 7, 6, 5, 1, 0 -+#endif -+#endif //#ifdef MOTHERBOARD_SCRAMBLED -+#endif //#if FL_ACTIVE(DEF_P) -+#endif //#ifdef CONFIG_UNSCRAMBLE_LCD -+ -+#ifndef LCD_REORDER_BLUE -+#if (BYTES_PER_PIXEL==2) -+#define LCD_REORDER_BLUE 0,1,2,3,4 -+#define LCD_REORDER_GREEN 5,6,7,8,9,10 -+#define LCD_REORDER_RED 11,12,13,14,15 -+#else -+#define LCD_REORDER_BLUE 0,1,2,3,4,5 -+#define LCD_REORDER_GREEN 6,7,8,9,10,11 -+#define LCD_REORDER_RED 12,13,14,15,16,17 -+#endif -+#endif -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/pxaMacro2.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaMacro2.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/pxaMacro2.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaMacro2.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,540 @@ -+#include "pxaMacro.h" -+// ************************************************************************************************ -+// ************************************************************************************************ -+ -+//In: c-0 try 64meg, c-1 try 32meg -+// or if 16 bit mode -+// c-0 try 32meg, c-1 try 16meg -+//Out: z-0 if 16 bit mode -+.macro InitRam rBase,rTemp -+ BigMov \rBase,MEMORY_CONTROL_BASE -+ ldr \rTemp,[\rBase,#BOOT_DEF] -+ tst \rTemp,#1 //bit 0 - 1 means 16 bit mode -+ BigMov \rTemp,M64_MDCNFG_VAL -+ BigEor2Cs \rTemp,(M64_MDCNFG_VAL)^(M32_MDCNFG_VAL) -+#if (!(PLATFORM_TYPE==NEONB)) && (!(PLATFORM_TYPE==HALOGEN)) -+ BigOrr2Ne \rTemp,(1<<2) //select 16 bit width -+#endif -+ str \rTemp,[\rBase,#MDCNFG] -+ -+ mov \rTemp,#0 -+ nop //pxa270 may need this for some reason, depending upon instruction alignment -+ str \rTemp,[\rBase,#MDMRS] -+ -+ -+ BigMov \rTemp,M64_MDREFR_VAL -+ BigEor2Cs \rTemp,(M64_MDREFR_VAL)^(M32_MDREFR_VAL) -+ str \rTemp,[\rBase,#MDREFR] -+.endm -+ -+ -+//In: z-1 - c-0 try 64meg, c-1 try 32meg -+// z-0 - c-0 try 32meg, c-1 try 16meg -+//out: rTemp - memory size -+.macro CheckRam rBase,rTemp,rTemp2 -+ // Issue read requests to disabled bank to start refresh -+ BigMov \rBase,MEM_START+0x0C000000 -+ ldr \rTemp, [\rBase] -+ mov \rTemp,#M32_MEM_SIZE -+ movcc \rTemp,#M64_MEM_SIZE -+#if (!(PLATFORM_TYPE==NEONB)) && (!(PLATFORM_TYPE==HALOGEN)) -+ movne \rTemp,\rTemp,LSR #1 -+#endif -+ BigMov \rBase,MEM_START -+#if 1 -+ mov \rTemp2,#0x24<<2 //0x24 seems to work, but keep it safe -+81: sub \rTemp2,\rTemp2,#1 -+ str \rTemp2,[\rBase] -+ movs \rTemp2,\rTemp2 //don't affect carry flag -+ bne 81b -+#endif -+ str \rTemp,[\rBase] -+ str \rBase,[\rBase,\rTemp,LSR #1] -+ ldr \rTemp2,[\rBase] -+ movcs \rTemp2,\rTemp //if 2nd time through, force match -+ cmp \rTemp2,\rTemp -+#if 1 -+ strne \rTemp2,[\rBase,#4] -+// teq \rTemp2,\rTemp2 -+#endif -+.endm -+ -+#define tEHEL 0 //R14 -+#define tAPA 3 //r15 25ns/10ns rounded up -+ -+#define RDFSelect 13 //R2 : tAVQV : 110ns/10ns = 11; 11-1=10=RDF -+//#define RDFSelect 10 //R2 : tAVQV : 110ns/10ns = 11; 11-1=10=RDF -+ //0-11 map to 0-11 -+ //12 -> 13, 13 ->15, 14->18, 15->23 -+ -+//#if (PLATFORM_TYPE==GAME_CONTROLLER_PLAITED_A1) -+#if (PLATFORM_TYPE==GAME_CONTROLLER_PLAITED_A1)||(PLATFORM_TYPE==GAME_CONTROLLER)||(PLATFORM_TYPE==GAME_WITH_SMC) -+#define BurstSelect 0 //if plaited bug, burst mode will no longer work. -+#else -+#define BurstSelect 2 //0->nonburst,1->SRAM,2->burst of4, 3->burst of 8, 4->variable latency i/o -+#endif -+ -+ -+#if (PLATFORM_TYPE==NEONB) -+//access time 70ns, 25ns after CS data becomes valid -+// RRR RDN RDF RBW RTX -+// gap between Address to -+// 1-fast chip selects data valid -+// 0-slow recovery 2nd burst access 1st access delay 16-bit bus non-burst(0), sram(1), 4cycle(2), 8cycle(3), VLIO(4) -+#define CS0_MSC (1<<15)+ (1<<12)+ (7<<8)+ ((7-1)<<4)+ 0 -+#define CS1_MSC (1<<15)+(((tEHEL+1)>>1)<<12)+((tAPA-1)<<8)+ (RDFSelect<<4)+ (BurstSelect) //fast device -+#else -+#define CS0_MSC (1<<15)+(((tEHEL+1)>>1)<<12)+((tAPA-1)<<8)+ (RDFSelect<<4)+ (BurstSelect) //fast device -+#define CS1_MSC (1<<15)+ (3<<12)+ (2<<8)+ ((3-1)<<4)+ (1<<3) + 4 //SMC chip -+//#define CS1_MSC (1<<15)+ (6<<12)+ ((11-1)<<8)+ ((4-1)<<4)+ (1<<3) + 4 //SMC chip -+#endif -+ -+.macro InitCS0_CS1 rBase,rTemp -+ BigMov \rBase,MEMORY_CONTROL_BASE -+ ldr \rTemp,[\rBase,#BOOT_DEF] -+ tst \rTemp,#1 //bit 0 - 1 means 16 bit mode -+ BigMov \rTemp,(CS0_MSC)|((CS1_MSC)<<16) -+/////// BigMov \rTemp,0x7ff07ff0 -+ orrne \rTemp,\rTemp,#1<<3 //16 bit bus -+ str \rTemp,[\rBase,#MSC0] -+.endm -+ -+ -+.macro InitMemory rBase,rTemp,rTemp2 -+ cmp pc,#MEM_START -+ bcs 92f //exit if running from ram -+#if 0 //1 to force smaller memory -+ subs \rTemp,\rTemp,\rTemp //set carry flag -+#endif -+ -+1: -+ InitRam \rBase, \rTemp //out: \rBase - MEMORY_CONTROL_BASE -+ -+#if (PLATFORM_TYPE==BOUNDARY_OLD_BOARD) -+#define CHIP_MODE 0 //don't use VIO_READY -+#else -+#define CHIP_MODE 4 //gp18 is VIO_READY -+#endif -+ -+// RRR RDN RDF RBW RTX -+// gap between Address to -+// 1-fast chip selects data valid -+// 0-slow recovery 2nd burst access 1st access delay 16-bit bus non-burst(0), sram(1), 4cycle(2), 8cycle(3), VLIO(4) -+#if 1 -+#define CS2_MSC (1<<15)+ (4<<12)+ ((6-2)<<8)+ ((4-1)<<4)+ (1<<3) + CHIP_MODE //for USB dma -+//#define CS2_MSC (1<<15)+ (7<<12)+ ((16-1)<<8)+ ((16-1)<<4)+ (1<<3) + CHIP_MODE //for USB dma -+ -+// vlio min 2 vlio min 3 -+#if (PLATFORM_TYPE==NEON) || (PLATFORM_TYPE==NEONB) -+#define CS3_MSC (1<<15)+ (1<<12)+ (2<<8)+ ((4-1)<<4)+ (0<<3) + 4 //SM501 -+#define CS4_MSC (1<<15)+ (3<<12)+ (2<<8)+ ((4-1)<<4)+ (0<<3) + 4 //SMC chip -+#else -+#if (PLATFORM_TYPE==HALOGEN) -+#define CS3_MSC (1<<15)+ (1<<12)+ (2<<8)+ ((4-1)<<4)+ (0<<3) + 4 //NC -+#define CS4_MSC (1<<15)+ (3<<12)+ (2<<8)+ ((5-1)<<4)+ (0<<3) + 4 //SMC chip -+#else -+#define CS3_MSC (1<<15)+ (4<<12)+ ((6-2)<<8)+ ((4-1)<<4)+ (1<<3) + CHIP_MODE //for USB dma -+//#define CS3_MSC (1<<15)+ (7<<12)+ ((16-1)<<8)+ ((16-1)<<4)+ (1<<3) + CHIP_MODE //for USB dma -+#define CS4_MSC (1<<15)+ (6<<12)+ ((11-1)<<8)+ ((4-1)<<4)+ (1<<3) + CHIP_MODE //for USB IO -+#endif -+#endif -+ -+#define CS5_MSC (0<<15)+ (7<<12)+ ((8-1)<<8)+ ((8-1)<<4)+ (1<<3) + (0) //for USB IO delay after CMD write -+#else -+#define CS2_MSC (1<<15)+ (7<<12)+ ((16-1)<<8)+ ((16-1)<<4)+ (1<<3) + CHIP_MODE //for USB dma -+#define CS3_MSC (1<<15)+ (7<<12)+ ((16-1)<<8)+ ((16-1)<<4)+ (1<<3) + CHIP_MODE //for USB dma -+#define CS4_MSC (1<<15)+ (7<<12)+ ((16-1)<<8)+ ((16-1)<<4)+ (1<<3) + CHIP_MODE //for USB IO -+#define CS5_MSC (0<<15)+ (7<<12)+ ((16-1)<<8)+ ((16-1)<<4)+ (1<<3) + (0) //for USB IO delay after CMD write -+#endif -+ BigMov \rTemp,(CS2_MSC)|((CS3_MSC)<<16) -+ str \rTemp,[\rBase,#MSC1] -+ BigMov \rTemp,(CS4_MSC)|((CS5_MSC)<<16) -+ str \rTemp,[\rBase,#MSC2] -+ -+ -+ -+#define PCMCIA_MEM_SETUP_ADDRESS 5 //0-127 -+#define PCMCIA_MEM_COMMAND_CODE 3 //0-31 -+#define PCMCIA_MEM_HOLD_ADDRESS 2 //0-63 -+ BigMov \rTemp,(PCMCIA_MEM_HOLD_ADDRESS<<14)+(PCMCIA_MEM_COMMAND_CODE<<7)+(PCMCIA_MEM_SETUP_ADDRESS<<0) -+ str \rTemp,[\rBase,#MCMEM0] -+ str \rTemp,[\rBase,#MCMEM1] -+#define PCMCIA_ATT_SETUP_ADDRESS 5 //0-127 -+#define PCMCIA_ATT_COMMAND_CODE 3 //0-31 -+#define PCMCIA_ATT_HOLD_ADDRESS 2 //0-63 -+ BigMov \rTemp,(PCMCIA_ATT_HOLD_ADDRESS<<14)+(PCMCIA_ATT_COMMAND_CODE<<7)+(PCMCIA_ATT_SETUP_ADDRESS<<0) -+ str \rTemp,[\rBase,#MCATT0] -+ str \rTemp,[\rBase,#MCATT1] -+#define PCMCIA_IO_SETUP_ADDRESS 5 //0-127 -+#define PCMCIA_IO_COMMAND_CODE 3 //0-31 -+#define PCMCIA_IO_HOLD_ADDRESS 2 //0-63 -+ BigMov \rTemp,(PCMCIA_IO_HOLD_ADDRESS<<14)+(PCMCIA_IO_COMMAND_CODE<<7)+(PCMCIA_IO_SETUP_ADDRESS<<0) -+ str \rTemp,[\rBase,#MCIO0] -+ str \rTemp,[\rBase,#MCIO1] -+ mov \rTemp,#2 -+ str \rTemp,[\rBase,#MECR] -+ -+ CheckRam \rBase, \rTemp, \rTemp2 -+ cmpne \rTemp,#0x0 //set carry flag, keep z-0 (memory size!=0) -+ bne 1b -+92: -+.endm -+ -+// ******************************************************************************************* -+// ******************************************************************************************* -+// ******************************************************************************************* -+// ******************************************************************************************* -+#define CKEN_PWM0 0 -+#define CKEN_PWM1 1 -+#define CKEN_AC97 2 -+#define CKEN_SSP 3 -+#define CKEN_HWUART 4 -+#define CKEN_STUART 5 -+#define CKEN_FFUART 6 -+#define CKEN_BTUART 7 -+#define CKEN_I2S 8 -+#define CKEN_USB 11 -+#define CKEN_MMC 12 -+#define CKEN_FICP 13 -+#define CKEN_I2C 14 -+#define CKEN_LCD 16 -+ -+#if (PLATFORM_TYPE==NEON) || (PLATFORM_TYPE==BD2003) || (PLATFORM_TYPE==BOUNDARY_OLD_BOARD) || (PLATFORM_TYPE==OLD_GAME_CONTROLLER) || (PLATFORM_TYPE==HALOGEN) -+#define __ENABLED_BTUART_MASK (1<<CKEN_BTUART) -+#define __ENABLED_STUART_MASK (1<<CKEN_STUART) -+#endif -+ -+#if (PLATFORM_TYPE==BD2003) || (PLATFORM_TYPE==BOUNDARY_OLD_BOARD) || (PLATFORM_TYPE==OLD_GAME_CONTROLLER) || (PLATFORM_TYPE==HALOGEN) -+#define __ENABLED_LCD_MASK (1<<CKEN_LCD) -+#endif -+ -+#ifndef __ENABLED_BTUART_MASK -+#define __ENABLED_BTUART_MASK 0 -+#endif -+ -+#ifndef __ENABLED_STUART_MASK -+#define __ENABLED_STUART_MASK 0 -+#endif -+ -+#ifndef __ENABLED_LCD_MASK -+#define __ENABLED_LCD_MASK 0 -+#endif -+ -+.macro InitIC_Clocks rBase,rTemp -+ BigMov \rBase,IC_BASE -+ mov \rTemp,#0 -+ str \rTemp,[\rBase,#ICMR] //disable all interrupts -+ -+ BigMov \rBase,CLK_MANAGER_BASE -+#if (PLATFORM_TYPE==HALOGEN) -+#define CKEN_MEMORY_CONTROLLER 22 -+#define CKEN_OS_TIMER 9 -+ -+#define CCCR_L_BIT 0 -+#define CCCR_2N_BIT 7 -+#define CCCR_A_BIT 25 -+ -+#define CLKCFG_TURBO_BIT 0 -+#define CLKCFG_FREQUENCY_CHANGE_BIT 1 -+#define CLKCFG_HALF_TURBO_BIT 2 -+#define CLKCFG_FAST_BUS_BIT 3 -+ -+#if (CPU_CLOCK==104) //13*8 = 104MHz -+#define CCCR_2N 2 -+#define CCCR_L 8 -+#define CCCR_A 0 -+#define CLKCFG_TURBO 0 -+#define CLKCFG_FAST_BUS 0 -+#else -+#if (CPU_CLOCK==208) //13*16 = 208MHz -+#define CCCR_2N 2 -+#define CCCR_L 16 -+#define CCCR_A 0 -+#define CLKCFG_TURBO 0 -+#define CLKCFG_FAST_BUS 0 -+#else -+#if (CPU_CLOCK==312) //312MHz -+#define CCCR_2N 3 -+#define CCCR_L 16 -+#define CCCR_A 0 -+#define CLKCFG_TURBO 1 -+#define CLKCFG_FAST_BUS 0 -+#else -+#if (CPU_CLOCK==416) //416MHz -+#define CCCR_2N 4 -+#define CCCR_L 16 -+#define CCCR_A 0 -+#define CLKCFG_TURBO 1 -+#define CLKCFG_FAST_BUS 1 -+#else -+#if (CPU_CLOCK==520) //520MHz -+#define CCCR_2N 5 -+#define CCCR_L 16 -+#define CCCR_A 0 -+#define CLKCFG_TURBO 1 -+#define CLKCFG_FAST_BUS 1 -+#else -+#if (CPU_CLOCK==624) //624MHz -+#define CCCR_2N 6 -+#define CCCR_L 16 -+#define CCCR_A 0 -+#define CLKCFG_TURBO 1 -+#define CLKCFG_FAST_BUS 1 -+ -+#else -+#warning CPU_CLOCK selection not made -+#endif -+#endif -+#endif -+#endif -+#endif -+#endif -+ BigMov \rTemp,(CCCR_L<<CCCR_L_BIT)+(CCCR_2N<<CCCR_2N_BIT)+(CCCR_A<<CCCR_A_BIT) -+ str \rTemp,[\rBase,#CCCR] -+ -+ BigMov \rTemp,(1<<CKEN_OS_TIMER)+(1<<CKEN_MEMORY_CONTROLLER)+(1<<CKEN_FFUART)+__ENABLED_BTUART_MASK+__ENABLED_STUART_MASK+__ENABLED_LCD_MASK -+ str \rTemp,[\rBase,#CKEN] -+ -+#else -+#define tRP 20 -+#define tRCD 20 -+#define tRAS 45 //45 ns -+#define tRC 65 -+// CRYSTALns 10000000/ 36864 //271ns -+ -+#define LSelect 1 //1 : *27 = 10.0469 ns memory clk time, 99.53 MHz -+ // tRP_clk = tRCD_clk= 1.99066 -> 2 clks -+ // tRAS_clk= 4.47899 -> 5 clks -+ // tRC_clk= 6.46966 -> 7 clks -+ //2 : *32 = 8.47711 ns, 117.96 MHz -+ // tRP_clk = tRCD_clk= 2.35929 -> 3 clks -+ // tRAS_clk=5.30841 -> 6 -+ // tRC_clk =7.66771 -> 8 clks -+ //3 : *36 = 7.5352 ns, 132.71 MHz -+ // tRP_clk = tRCD_clk= 2.65421 -> 3 clks -+ // tRAS_clk=5.97197 -> 6 -+ // tRC_clk = 8.62618 -> 9 clks -+ //4 : *40 = 6.78168ns, 147.46 MHz -+ // tRP_clk = tRCD_clk= 2.94912 -> 3 clks -+ // tRAS_clk=6.63522 -> 7 -+ // tRC_clk = 9.58465 -> 10 clks -+ //5 : *45 = 6.02816ns, 165.89 MHz -+ // tRP_clk = tRCD_clk= 3.31776 -> 4 clks -+ // tRAS_clk=7.46496 -> 8 -+ // tRC_clk = 10.7827 -> 11 clks -+//MSelect -+//1 : *1 -+//2 : *2 -+ -+//NSelect -+//2 : *1; -+//3 : *1.5; -+//4 : *2; -+//6 : *3 -+ -+#if (CPU_CLOCK==100) -+#define MSelect 1 //1 : *1 100MHz -+#define NSelect 4 //4 : *2; turbo 200 MHZ -+#define FCS_MASK 2 // turbo off -+#else -+#if (CPU_CLOCK==200) -+#define MSelect 2 //2 : *2 200 MHz -+#define NSelect 3 //3 : *1.5; turbo 300 MHZ -+#define FCS_MASK 2 // turbo off -+#else -+#if (CPU_CLOCK==300) -+#define MSelect 2 //2 : *2 200 MHz -+#define NSelect 3 //3 : *1.5; turbo 300 MHZ -+#define FCS_MASK 3 // turbo on -+#else -+#if (CPU_CLOCK==400) -+ -+#if 0 //only pxa255 runs with 200Mhz internal bus, pxa250 doesn't -+#define MSelect 2 //2 : *2 200 MHz -+#define NSelect 4 //4 : *2; turbo 400 MHZ -+#define FCS_MASK 3 // turbo on -+#else -+#define MSelect 3 //2 : *4 400 MHz -+#define NSelect 2 //4 : *1; turbo 400 MHZ -+#define FCS_MASK 2 // turbo off -+#endif -+ -+#else -+//////#WARNING CPU_CLOCK selection not made -+#endif -+#endif -+#endif -+#endif -+ -+ BigMov \rTemp,(NSelect<<7)+(MSelect<<5)+(LSelect) -+ str \rTemp,[\rBase,#CCCR] -+ -+ BigMov \rTemp,(1<<CKEN_FFUART)+__ENABLED_BTUART_MASK+__ENABLED_STUART_MASK+__ENABLED_LCD_MASK -+ str \rTemp,[\rBase,#CKEN] -+#endif //not HALOGEN -+ mov \rTemp,#0 //disable 32.768khz oscillator -+// mov \rTemp,#2 //enable 32.768khz oscillator -+ str \rTemp,[\rBase,#OSCC] -+.endm -+ -+.macro InitChangeCPUSpeed rTemp -+#if (PLATFORM_TYPE==HALOGEN) -+ mov \rTemp,#(CLKCFG_FAST_BUS<<CLKCFG_FAST_BUS_BIT)+(CLKCFG_TURBO<<CLKCFG_TURBO_BIT)+(1<<CLKCFG_FREQUENCY_CHANGE_BIT) -+ CP14_CCLKCFG mcr,\rTemp -+#else -+ mov \rTemp,#FCS_MASK -+ CP14_CCLKCFG mcr,\rTemp -+#endif -+.endm -+ -+// ******************************************************************************************* -+// ******************************************************************************************* -+ -+.macro InitUART rBase,rTemp,uartaddr,baudrate -+ BigMov \rBase,\uartaddr -+ -+ mov \rTemp,#0x83 //DLAB, 8-bit characters -+ str \rTemp,[\rBase,#UART_LCR] -+ mov \rTemp,#(14745600/((\baudrate)<<4))&0xff -+ str \rTemp,[\rBase,#UART_DLL] -+ mov \rTemp,#((14745600/((\baudrate)<<4))>>8) -+ str \rTemp,[\rBase,#UART_DLH] -+ -+ mov \rTemp,#3 //8-bit characters -+ str \rTemp,[\rBase,#UART_LCR] -+ -+ mov \rTemp,#0xc1 //enable fifo, 32 byte level -+ str \rTemp,[\rBase,#UART_FCR] -+ -+ mov \rTemp,#0x40 //UUE- UART unit enable -+ str \rTemp,[\rBase,#UART_IER] -+.endm -+.macro InitGPIO rBase,rTemp -+ BigMov \rBase,GPIO_BASE -+ -+ BigMov \rTemp,~SRVAL0 -+ str \rTemp,[\rBase,#GPCR0] -+ mvn \rTemp,\rTemp -+ str \rTemp,[\rBase,#GPSR0] -+ -+ BigMov \rTemp,~SRVAL32 -+ str \rTemp,[\rBase,#GPCR1] -+ mvn \rTemp,\rTemp -+ str \rTemp,[\rBase,#GPSR1] -+ -+ BigMov \rTemp,~SRVAL64 -+ str \rTemp,[\rBase,#GPCR2] -+ mvn \rTemp,\rTemp -+ str \rTemp,[\rBase,#GPSR2] -+#if (PLATFORM_TYPE==HALOGEN) -+ BigMov \rTemp,~SRVAL96 -+ str \rTemp,[\rBase,#GPCR3] -+ mvn \rTemp,\rTemp -+ str \rTemp,[\rBase,#GPSR3] -+#endif -+//////// -+ BigMov \rTemp,DRVAL0 -+ str \rTemp,[\rBase,#GPDR0] -+ -+ BigMov \rTemp,DRVAL32 -+ str \rTemp,[\rBase,#GPDR1] -+ -+ BigMov \rTemp,DRVAL64 -+ str \rTemp,[\rBase,#GPDR2] -+#if (PLATFORM_TYPE==HALOGEN) -+ BigMov \rTemp,DRVAL96 -+ str \rTemp,[\rBase,#GPDR3] -+#endif -+//////// -+ BigMov \rTemp,AFVAL0 -+ str \rTemp,[\rBase,#GAFR0_L] -+ BigMov \rTemp,AFVAL16 -+ str \rTemp,[\rBase,#GAFR0_U] -+ -+ BigMov \rTemp,AFVAL32 -+ str \rTemp,[\rBase,#GAFR1_L] -+ BigMov \rTemp,AFVAL48 -+ str \rTemp,[\rBase,#GAFR1_U] -+ -+ BigMov \rTemp,AFVAL64 -+ str \rTemp,[\rBase,#GAFR2_L] -+ BigMov \rTemp,AFVAL80 -+ str \rTemp,[\rBase,#GAFR2_U] -+#if (PLATFORM_TYPE==HALOGEN) -+ BigMov \rTemp,AFVAL96 -+ str \rTemp,[\rBase,#GAFR3_L] -+ BigMov \rTemp,AFVAL112 -+ str \rTemp,[\rBase,#GAFR3_U] -+#endif -+ BigMov \rBase,PWR_MANAGER_BASE -+ mov \rTemp,#0x30 -+ str \rTemp,[\rBase,#PSSR] -+.endm -+ -+ -+ -+.macro TransMacro val -+ BigMov r12,UART_BASE -+91: -+ BigMov r0,\val -+ bl Transmit -+ b 91b -+.endm -+// ******************************************************************************************* -+.macro InitMMU rBase,rTemp -+// mov r0,#PSR_NOINTS_MASK+PSR_MODE_SVC -+// msr cpsr_c,r0 -+// ******************************************************************** -+// Disable the MMU and gang regardless of why we are here. -+ BigMov \rBase,0x2001 //; enable access to all coprocessors -+ CP15_CP_ACCESS mcr,\rBase -+ CPWAIT \rBase -+ -+ mov \rBase,#0x00000078 //; get a zero to turn things off (must write bits[6:3] as 1's) -+ CP15_CONTROL mcr,\rBase //; Turn Off MMU, I&D Caches, WB. -+ CPWAIT \rBase -+ -+ mov \rBase,#0x00000000 //; get a zero to turn things off -+ cmp pc,#MEM_START -+ CP15_TLB_INVAL_BOTH mcr,\rBase //; flush (invalidate) I/D tlb's -+ CP15_CF_INVAL_BTB mcr,\rBase //invalidate Branch target buffer -+ CP15_CF_INVAL_D mcr,\rBase -+ CP15_CF_INVAL_I mcrcs,\rBase //I might be running from cache only, invalidate if in ram -+ CP15_CF_DRAIN mcr,\rBase //; Drain the write buffer -+ nop -+ nop -+ nop -+ mvn r0, #0 //; grant manager access to all domains -+ CP15_DACR mcr,\rBase -+.endm -+ -+//out rTemp1 reset reason -+.macro InitPWR rBase,rTemp1,rTemp2 -+ BigMov \rBase,PWR_MANAGER_BASE -+// ******************************************************************** -+ ldr \rTemp1,[\rBase,#RCSR] // Read & Init Reset Cause bits in RCSR. -+ and \rTemp1,\rTemp1,#RCSR_MASK // extract the reset cause bits -+ str \rTemp1,[\rBase,#RCSR] // clear the reset cause bits (they're sticky) -+// ******************************************************************** -+// Read and store PSSR, too - it will be reset later, after GPIOs are initialized. -+// Unclear when we'll need this information, but don't throw a good status away. -+// ldr \rTemp2, [\rBase,#PSSR] -+// extract the reset cause bits -+// and \rTemp2,\rTemp2,#PSSR_MASK //; r12 now holds the conditioned PSSR -+// orr \rTemp1,\rTemp1,\rTemp2,lsl #16 //; R10 now has RCSR in lower half and PSSR in upper. -+// ******************************************************************** -+// Reasons for being here: -+// 1) Hard Reset -+// 2) Wake from Sleep -+// 3) GPIO Reset -+// 4) Watchdog Reset -+// 5) Eboot Handoff -+// If Sleep_Reset: reinit all but RTC, PWRMAN, CLKS (except cp14)... so reinit: OST, INTC, GPIO -+// If GPIO_Reset: reinit all but MEMC.Config, RTC, CLKS (except cp14)... so reinit: treat like sleep -+// If Watchdog_Reset: reinit all but RTC.RTTR, CLK.OSCC... so reinit: treat like a hard reset, minus OSCC and RTTR init. -+// If Hard_Reset: reinit all -+.endm -+ -+// ******************************************************************************************* -+// ******************************************************************************************* -+ .list -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/pxaMacro3.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaMacro3.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/pxaMacro3.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaMacro3.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,74 @@ -+#include "pxaLcd2.h" -+#include "pxaMacro2.h" -+.macro DEFINE_SCREEN_WIDTH xres,xsyncWidth,xbegin,xend, yres,ysyncWidth,ybegin,yend, enable,unscramble,rotate,active,bpp,clkdiv,type -+ .ifdef __ARMASM -+ GBLA SCREEN_WIDTH -+ .endif -+ .set SCREEN_WIDTH,\xres -+.endm -+ -+.macro DEFINE_SCREEN_HEIGHT xres,xsyncWidth,xbegin,xend, yres,ysyncWidth,ybegin,yend, enable,unscramble,rotate,active,bpp,clkdiv,type -+ .ifdef __ARMASM -+ GBLA SCREEN_HEIGHT -+ .endif -+ .set SCREEN_HEIGHT,\yres -+.endm -+ -+ DEFINE_SCREEN_WIDTH DEF_P -+ DEFINE_SCREEN_HEIGHT DEF_P -+ -+.macro CR0_INIT_VAL reg,xres,xsyncWidth,xbegin,xend, yres,ysyncWidth,ybegin,yend, enable,unscramble,rotate,active,bpp,clkdiv,type -+ BigMov \reg,(\enable<<CR0_ENABLE)+(1<<CR0_IM_DISABLE_DONE)+(1<<CR0_IM_START_OF_FRAME)+\ -+ (1<<CR0_IM_INPUT_FIFO_UNDERRUN)+(1<<CR0_IM_END_OF_FRAME)+(\active<<CR0_ACTIVE_SELECT)+\ -+ (1<<CR0_IM_LCD_QUICK_DISABLE)+(1<<CR0_IM_BRANCH)+(1<<CR0_IM_OUTPUT_FIFO_UNDERRUN) -+.endm -+ -+.macro CR1_INIT_VAL reg,xres,xsyncWidth,xbegin,xend, yres,ysyncWidth,ybegin,yend, enable,unscramble,rotate,active,bpp,clkdiv,type -+ BigMov \reg,((\xres-1)<<CR1_PIXELS_PER_LINE)+((\xsyncWidth-1)<<CR1_HORIZONTAL_SYNC_PULSE_WIDTH)+\ -+ ((\xend-1)<<CR1_END_OF_LINE_WAIT)+((\xbegin-1)<<CR1_BEGINNING_OF_LINE_WAIT) -+.endm -+ -+.macro CR2_INIT_VAL reg,xres,xsyncWidth,xbegin,xend, yres,ysyncWidth,ybegin,yend, enable,unscramble,rotate,active,bpp,clkdiv,type -+ BigMov \reg,((\yres-1)<<CR2_LINES_PER_PANEL)+((\ysyncWidth-1)<<CR2_VERTICAL_SYNC_PULSE_WIDTH)+\ -+ (\yend<<CR2_END_OF_FRAME_WAIT)+(\ybegin<<CR2_BEGINNING_OF_FRAME_WAIT) -+.endm -+ -+.macro CR3_INIT_VAL reg,xres,xsyncWidth,xbegin,xend, yres,ysyncWidth,ybegin,yend, enable,unscramble,rotate,active,bpp,clkdiv,type -+//LCD Clock is same as memory clock -+ BigMov \reg,(\clkdiv<<CR3_PCLK_DIVISOR)+((256-1)<<CR3_ACBIAS_TOGGLE)+\ -+ (0<<CR3_API)+(0<<CR3_FCLK_POLARITY)+(0<<CR3_LCLK_POLARITY)+\ -+ (1<<CR3_PCLK_POLARITY)+(0<<CR3_BIAS_POLARITY)+\ -+ (BPP_FORMAT<<CR3_BITS_PER_PIXEL)+(0<<CR3_DOUBLE_PCLK)+(PDFOR<<CR3_PDFOR) -+.endm -+ -+#define TMEDS_INIT_VAL (0xaa<<TMEDS_BLUE)+(0x55<<TMEDS_GREEN)+(0x00<<TMEDS_RED) -+#define TMEDC_INIT_VAL (1<<TMEDC_MATRIX2_SELECT)+(3<<TMEDC_RESERVED)+(5<<TMEDC_HORIZONTAL_BEAT_SUPPRESSION)+(4<<TMEDC_VERTICAL_BEAT_SUPPRESSION)+(1<<TMEDC_FRAME_NUMBER_ADJUST_EN)+(1<<TMEDC_COLOR_OFFSET_ADJUST_EN)+(1<<TMEDC_FRAME_NUMBER_ADJUST_MATRIX2)+(1<<TMEDC_COLOR_OFFSET_ADJUST_MATRIX2) -+ -+ -+.macro InitLCD rBase,rTemp,rDescript -+ -+ BigMov \rBase,LCD_CONTROL_BASE -+ -+ CR1_INIT_VAL \rTemp,DEF_P -+ str \rTemp,[\rBase,#LCD_CR1] -+ -+ CR2_INIT_VAL \rTemp,DEF_P -+ str \rTemp,[\rBase,#LCD_CR2] -+ -+ CR3_INIT_VAL \rTemp,DEF_P -+ str \rTemp,[\rBase,#LCD_CR3] -+ -+ BigMov \rTemp,0 -+ str \rTemp,[\rBase,#LCD_FBR0] -+ str \rTemp,[\rBase,#LCD_FBR1] -+ -+ BigMov \rTemp,TMEDS_INIT_VAL -+ str \rTemp,[\rBase,#LCD_TMEDS] -+ BigMov \rTemp,TMEDC_INIT_VAL -+ str \rTemp,[\rBase,#LCD_TMEDC] -+ -+ str \rDescript,[\rBase,#LCD_FDADR0] -+ -+ CR0_INIT_VAL \rTemp,DEF_P -+ str \rTemp,[\rBase,#LCD_CR0] -+.endm -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/pxaMacro.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaMacro.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/pxaMacro.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxaMacro.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,343 @@ -+#include "pxa250Base.h" -+#include "pxaHardware.h" -+#include "BigMacro.h" -+ .nolist -+ -+//CP14 registers -+.macro CP14_PMNC ins,rx -+ \ins p14,0,\rx,c0,c0,0 -+.endm -+.macro CP14_CCNT ins,rx -+ \ins p14,0,\rx,c1,c0,0 -+.endm -+.macro CP14_PMN0 ins,rx -+ \ins p14,0,\rx,c2,c0,0 -+.endm -+.macro CP14_PMN1 ins,rx -+ \ins p14,0,\rx,c3,c0,0 -+.endm -+.macro CP14_CCLKCFG ins,rx -+ \ins p14,0,\rx,c6,c0,0 -+.endm -+.macro CP14_PWRMODE ins,rx -+ \ins p14,0,\rx,c7,c0,0 -+.endm -+.macro CP14_TX ins,rx -+ \ins p14,0,\rx,c8,c0,0 -+.endm -+.macro CP14_RX ins,rx -+ \ins p14,0,\rx,c9,c0,0 -+.endm -+.macro CP14_DCSR ins,rx -+ \ins p14,0,\rx,c10,c0,0 //debug control and status register -+.endm -+.macro CP14_TBREG ins,rx -+ \ins p14,0,\rx,c11,c0,0 //trace buffer register -+.endm -+.macro CP14_CHKPT0 ins,rx -+ \ins p14,0,\rx,c12,c0,0 //checkpoint register 0 -+.endm -+.macro CP14_CHKPT1 ins,rx -+ \ins p14,0,\rx,c13,c0,0 //checkpoint register 1 -+.endm -+.macro CP14_TXRXCTRL ins,rx -+ \ins p14,0,\rx,c14,c0,0 -+.endm -+ -+ -+//CP15 registers -+.macro CP15_ID ins,rx -+ \ins p15,0,\rx,c0,c0,0 -+.endm -+.macro CP15_CACHETYPE ins,rx -+ \ins p15,0,\rx,c0,c0,1 -+.endm -+.macro CP15_CONTROL ins,rx -+ \ins p15,0,\rx,c1,c0,0 -+.endm -+.macro CP15_AUXCONTROL ins,rx -+ \ins p15,0,\rx,c1,c0,1 -+.endm -+.macro CP15_TTBR ins,rx -+ \ins p15,0,\rx,c2,c0,0 //translation table base -+.endm -+.macro CP15_DACR ins,rx -+ \ins p15,0,\rx,c3,c0,0 //domain access control register -+.endm -+.macro CP15_FSR ins,rx -+ \ins p15,0,\rx,c5,c0,0 //fault status register -+.endm -+.macro CP15_FAR ins,rx -+ \ins p15,0,\rx,c6,c0,0 //fault address register -+.endm -+ -+.macro CP15_CF_ALLOC_LINE ins,rx -+ \ins p15,0,\rx,c7,c2,5 //allocate line in data cache -+.endm -+.macro CP15_CF_INVAL_I ins,rx -+ \ins p15,0,\rx,c7,c5,0 //invalidate instruction cache -+.endm -+.macro CP15_CF_INVAL_ILINE ins,rx -+ \ins p15,0,\rx,c7,c5,1 -+.endm -+.macro CP15_CF_INVAL_BTB ins,rx -+ \ins p15,0,\rx,c7,c5,6 //invalidate Branch target buffer -+.endm -+.macro CP15_CF_INVAL_D ins,rx -+ \ins p15,0,\rx,c7,c6,0 -+.endm -+.macro CP15_CF_INVAL_DLINE ins,rx -+ \ins p15,0,\rx,c7,c6,1 -+.endm -+.macro CP15_CF_INVAL_BOTH ins,rx -+ \ins p15,0,\rx,c7,c7,0 //invalidate instruction & data cache & BTB -+.endm -+.macro CP15_CF_CLEAN_DLINE ins,rx -+ \ins p15,0,\rx,c7,c10,1 -+.endm -+.macro CP15_CF_DRAIN ins,rx -+ \ins p15,0,\rx,c7,c10,4 -+.endm -+ -+.macro CP15_TLB_INVAL_I ins,rx -+ \ins p15,0,\rx,c8,c5,0 -+.endm -+.macro CP15_TLB_INVAL_IENTRY ins,rx -+ \ins p15,0,\rx,c8,c5,1 -+.endm -+.macro CP15_TLB_INVAL_D ins,rx -+ \ins p15,0,\rx,c8,c6,0 -+.endm -+.macro CP15_TLB_INVAL_DENTRY ins,rx -+ \ins p15,0,\rx,c8,c6,1 -+.endm -+.macro CP15_TLB_INVAL_BOTH ins,rx -+ \ins p15,0,\rx,c8,c7,0 -+.endm -+ -+.macro CP15_CF_LOCK_ILINE ins,rx -+ \ins p15,0,\rx,c9,c1,0 //mva to fetch and lock -+.endm -+.macro CP15_CF_UNLOCK_I ins,rx -+ \ins p15,0,\rx,c9,c1,1 //unlock all lines -+.endm -+.macro CP15_CF_LOCK_D_CSR ins,rx -+ \ins p15,0,\rx,c9,c2,0 -+.endm -+.macro CP15_CF_UNLOCK_D ins,rx -+ \ins p15,0,\rx,c9,c2,1 //unlock all lines in data cache -+.endm -+ -+.macro CP15_TLB_LOCK_IENTRY ins,rx -+ \ins p15,0,\rx,c10,c4,0 -+.endm -+.macro CP15_TLB_UNLOCK_I ins,rx -+ \ins p15,0,\rx,c10,c4,1 -+.endm -+.macro CP15_TLB_LOCK_DENTRY ins,rx -+ \ins p15,0,\rx,c10,c8,0 -+.endm -+.macro CP15_TLB_UNLOCK_D ins,rx -+ \ins p15,0,\rx,c10,c8,1 -+.endm -+ -+.macro CP15_PID ins,rx -+ \ins p15,0,\rx,c13,c0,0 -+.endm -+ -+.macro CP15_DBR0 ins,rx -+ \ins p15,0,\rx,c14,c0,0 //Data Breakpoint address register 0 -+.endm -+.macro CP15_DBR1 ins,rx -+ \ins p15,0,\rx,c14,c3,0 //Data Breakpoint address/mask register 1 -+.endm -+.macro CP15_DBCON ins,rx -+ \ins p15,0,\rx,c14,c4,0 //Data Breakpoint control register -+.endm -+.macro CP15_IBCR0 ins,rx -+ \ins p15,0,\rx,c14,c8,0 //Instruction Breakpoint Control Register 0 -+.endm -+.macro CP15_IBCR1 ins,rx -+ \ins p15,0,\rx,c14,c9,0 //Instruction Breakpoint Control Register 1 -+.endm -+ -+.macro CP15_CP_ACCESS ins,rx -+ \ins p15,0,\rx,c15,c1,0 //Coprocessor access register, set bit n to enable access to coprocessor n -+.endm -+ -+ -+.macro CPWAIT dest -+ CP15_ID mrc,\dest //read some register in CP15 -+ mov \dest,\dest //wait for the read to complete -+ sub pc,pc,#4 //branch to the next instruction, flushing the instruction pipeline -+.endm -+ -+// ******************************************************************************************* -+// ******************************************************************************************* -+// ******************************************************************************************* -+// ******************************************************************************************* -+// ******************************************************************************************* -+// ************************************************************************************************ -+// ******************************************************************************************* -+// ******************************************************************************************* -+// ******************************************************************************************* -+ -+#define numColumnAddrBits 9 -+#define numBankAddrBits 2 -+#define ClkSelect 1 //0 : tRP = 2, tRCD = 1, tRAS = 3, tRC = 4 -+ //1 : tRP = 2, tRCD = 2, tRAS = 5, tRC = 8 -+ //2 : tRP = 3, tRCD = 3, tRAS = 7, tRC = 10 -+ //3 : tRP = 3, tRCD = 3, tRAS = 7, tRC = 11 -+//64 meg option -+#define M64_numRowAddrBits 13 //for k4s561632a -+#define M64_SA1111_mask 0 //(1<<12) -+#define M64_DRI_cnt (((99530*64)>>M64_numRowAddrBits)>>5) //(# of cycles/ms * # of ms for entire refresh period)/ # of rows/refresh period /32 -+#define M64_MDCNFG_VAL 1+((numColumnAddrBits-8)<<3)+((M64_numRowAddrBits-11)<<5)+((numBankAddrBits-1)<<7)+(ClkSelect<<8)+(1<<11)+(M64_SA1111_mask) //DLATCH0, latch return data with return clock -+#define M64_MDREFR_VAL (1<<16)+(1<<15)+(M64_DRI_cnt&0xfff) //don't set bit 20: APD (buggy), bit 16: K1RUN, 15:E1PIN -+//#define M64_MDREFR_VAL (1<<20)+(1<<16)+(1<<15)+(M64_DRI_cnt&0xfff) //20: APD, bit 16: K1RUN, 15:E1PIN -+// 13 9 2 2 (4bytes per address)=2**26=64 MB -+#define M64_MEM_SIZE (1<<(M64_numRowAddrBits+numColumnAddrBits+numBankAddrBits+2)) -+#define M64_MEM_END ((MEM_START)+M64_MEM_SIZE) -+ -+//32 meg option -+#define M32_numRowAddrBits 12 //for MT48LC8M16A2 - 75 B -+#define M32_SA1111_mask 0 -+#define M32_DRI_cnt (((99530*64)>>M32_numRowAddrBits)>>5) //(# of cycles/ms * # of ms for entire refresh period)/ # of rows/refresh period /32 -+#define M32_MDCNFG_VAL 1+((numColumnAddrBits-8)<<3)+((M32_numRowAddrBits-11)<<5)+((numBankAddrBits-1)<<7)+(ClkSelect<<8)+(1<<11)+(M32_SA1111_mask) //DLATCH0, latch return data with return clock -+#define M32_MDREFR_VAL (1<<16)+(1<<15)+(M32_DRI_cnt&0xfff) //don't set bit 20: APD (buggy), bit 16: K1RUN, 15:E1PIN -+// 12 9 2 2 (4bytes per address)=2**25=32 MB -+#define M32_MEM_SIZE (1<<(M32_numRowAddrBits+numColumnAddrBits+numBankAddrBits+2)) -+#define M32_MEM_END ((MEM_START)+M32_MEM_SIZE) -+// ******************************************************************************************* -+//out: rTemp - memory size -+.macro CalcMemSize rBase,rTemp,mem_control_base -+ BigMov \rBase,\mem_control_base -+ ldr \rTemp,[\rBase,#MDCNFG] -+ movs \rTemp,\rTemp,LSR #2+1 //bit 2 - 1 means 16 bit mode, 0 means 32 bit mode, mov to carry flag -+ tst \rTemp,#1<<(5-3) //is number of row address bits 12 or 13 ? -+ moveq \rTemp,#M64_MEM_SIZE -+ movne \rTemp,#M32_MEM_SIZE -+ movcs \rTemp,\rTemp,LSR #1 //half as much if 16 bit mode -+.endm -+ -+ -+#define CH_NULL 0x00 -+#define CH_BACKSPACE 0x08 -+#define CH_LF 0x0a -+#define CH_CR 0x0d -+#define CH_CAN 0x18 -+#define CH_SPACE 0x20 //" " -+#define CH_EXCLAMATION 0x21 //! -+#define CH_DQUOTE 0x22 //" -+#define CH_POUND 0x23 //# -+#define CH_DOLLAR 0x24 //$ -+#define CH_PERCENT 0x25 //% -+#define CH_AMPERSAND 0x26 //& -+#define CH_SQUOTE 0x27 //' -+#define CH_OPEN_PAREN 0x28 //( -+#define CH_CLOSE_PAREN 0x29 //) -+#define CH_ASTERISK 0x2a //* -+#define CH_PLUS 0x2b //+ -+#define CH_COMMA 0x2c //, -+#define CH_HYPHEN 0x2d //- -+#define CH_MINUS 0x2d //- -+#define CH_PERIOD 0x2e //. -+#define CH_FSLASH 0x2f // / -+#define CH_0 0x30 -+#define CH_1 0x31 -+#define CH_2 0x32 -+#define CH_3 0x33 -+#define CH_4 0x34 -+#define CH_5 0x35 -+#define CH_6 0x36 -+#define CH_7 0x37 -+#define CH_8 0x38 -+#define CH_9 0x39 -+#define CH_COLON 0x3a //: -+#define CH_SEMICOLON 0x3b //; -+#define CH_LESS_THAN 0x3c //< -+#define CH_EQUAL 0x3d //= -+#define CH_GREATER_THAN 0x3e //> -+#define CH_QUESTION_MARK 0x3f //? -+#define CH_AT_SIGN 0x40 //@ -+ -+#define CH_A 0x41 -+#define CH_B 0x42 -+#define CH_C 0x43 -+#define CH_D 0x44 -+#define CH_E 0x45 -+#define CH_F 0x46 -+#define CH_G 0x47 -+#define CH_H 0x48 -+#define CH_I 0x49 -+#define CH_J 0x4a -+#define CH_K 0x4b -+#define CH_L 0x4c -+#define CH_M 0x4d -+#define CH_N 0x4e -+#define CH_O 0x4f -+#define CH_P 0x50 -+#define CH_Q 0x51 -+#define CH_R 0x52 -+#define CH_S 0x53 -+#define CH_T 0x54 -+#define CH_U 0x55 -+#define CH_V 0x56 -+#define CH_W 0x57 -+#define CH_X 0x58 -+#define CH_Y 0x59 -+#define CH_Z 0x5a -+#define CH_OPEN_SQUARE 0x5b //[ -+#define CH_BSLASH 0x5c //\.. -+#define CH_CLOSE_SQUARE 0x5d //] -+#define CH_CARET 0x5e //^ -+#define CH__ 0x5f //_ -+#define CH_OPEN_SQUOTE 0x60 //` -+ -+#define CH_a 0x61 -+#define CH_b 0x62 -+#define CH_c 0x63 -+#define CH_d 0x64 -+#define CH_e 0x65 -+#define CH_f 0x66 -+#define CH_g 0x67 -+#define CH_h 0x68 -+#define CH_i 0x69 -+#define CH_j 0x6a -+#define CH_k 0x6b -+#define CH_l 0x6c -+#define CH_m 0x6d -+#define CH_n 0x6e -+#define CH_o 0x6f -+#define CH_p 0x70 -+#define CH_q 0x71 -+#define CH_r 0x72 -+#define CH_s 0x73 -+#define CH_t 0x74 -+#define CH_u 0x75 -+#define CH_v 0x76 -+#define CH_w 0x77 -+#define CH_x 0x78 -+#define CH_y 0x79 -+#define CH_z 0x7a -+#define CH_OPEN_CURLY 0x7b //{ -+#define CH_VERTICAL_BAR 0x7c //| -+#define CH_CLOSE_CURLY 0x7d //} -+#define CH_TILDE 0x7e //~ -+#define CH_DELETE 0x7f -+ -+ -+.macro STARTUPTEXT -+ GBLS AreaName -+ AREA |.astart|,ALIGN=2,CODE -+AreaName SETS "|.astart|" -+.endm -+ -+.macro DUP count,val -+ LCLA cnt -+cnt SETA $count -+ WHILE ( cnt<>0) -+ DCD $val -+cnt SETA cnt-1 -+ WEND -+.endm -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/arch-pxa/pxa-regs.h u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxa-regs.h ---- u-boot-1.1.2/include/asm-arm/arch-pxa/pxa-regs.h 2003-06-27 23:32:42.000000000 +0200 -+++ u-boot-1.1.2-neon/include/asm-arm/arch-pxa/pxa-regs.h 2007-08-11 21:07:21.000000000 +0200 -@@ -107,6 +107,17 @@ - #define DCSR_RUN (1 << 31) /* Run Bit (read / write) */ - #define DCSR_NODESC (1 << 30) /* No-Descriptor Fetch (read / write) */ - #define DCSR_STOPIRQEN (1 << 29) /* Stop Interrupt Enable (read / write) */ -+ -+#if defined(CONFIG_PXA27X) -+#define DCSR_EORIRQEN (1 << 28) /* End of Receive Interrupt Enable (R/W) */ -+#define DCSR_EORJMPEN (1 << 27) /* Jump to next descriptor on EOR */ -+#define DCSR_EORSTOPEN (1 << 26) /* STOP on an EOR */ -+#define DCSR_SETCMPST (1 << 25) /* Set Descriptor Compare Status */ -+#define DCSR_CLRCMPST (1 << 24) /* Clear Descriptor Compare Status */ -+#define DCSR_CMPST (1 << 10) /* The Descriptor Compare Status */ -+#define DCSR_ENRINTR (1 << 9) /* The end of Receive */ -+#endif -+ - #define DCSR_REQPEND (1 << 8) /* Request Pending (read-only) */ - #define DCSR_STOPSTATE (1 << 3) /* Stop State (read-only) */ - #define DCSR_ENDINTR (1 << 2) /* End Interrupt (read / write) */ -@@ -156,6 +167,10 @@ - #define DRCMR38 __REG(0x40000198) /* Request to Channel Map Register for USB endpoint 14 Request */ - #define DRCMR39 __REG(0x4000019C) /* Reserved */ - -+#define DRCMR68 __REG(0x40001110) /* Request to Channel Map Register for Camera FIFO 0 Request */ -+#define DRCMR69 __REG(0x40001114) /* Request to Channel Map Register for Camera FIFO 1 Request */ -+#define DRCMR70 __REG(0x40001118) /* Request to Channel Map Register for Camera FIFO 2 Request */ -+ - #define DRCMRRXSADR DRCMR2 - #define DRCMRTXSADR DRCMR3 - #define DRCMRRXBTRBR DRCMR4 -@@ -424,6 +439,12 @@ - #define ISR __REG(0x40301698) /* I2C Status Register - ISR */ - #define ISAR __REG(0x403016A0) /* I2C Slave Address Register - ISAR */ - -+#define PWRIBMR __REG(0x40f00180) /* Power I2C Bus Monitor Register-IBMR */ -+#define PWRIDBR __REG(0x40f00188) /* Power I2C Data Buffer Register-IDBR */ -+#define PWRICR __REG(0x40f00190) /* Power I2C Control Register - ICR */ -+#define PWRISR __REG(0x40f00198) /* Power I2C Status Register - ISR */ -+#define PWRISAR __REG(0x40f001A0) /* Power I2C Slave Address Register-ISAR */ -+ - /* ----- Control register bits ---------------------------------------- */ - - #define ICR_START 0x1 /* start bit */ -@@ -460,11 +481,9 @@ - /* - * Serial Audio Controller - */ -- -- - /* FIXME the audio defines collide w/ the SA1111 defines. I don't like these -- * short defines because there is too much chance of namespace collision */ -- -+ * short defines because there is too much chance of namespace collision -+ */ - /*#define SACR0 __REG(0x40400000) / Global Control Register */ - /*#define SACR1 __REG(0x40400004) / Serial Audio I 2 S/MSB-Justified Control Register */ - /*#define SASR0 __REG(0x4040000C) / Serial Audio I 2 S/MSB-Justified Interface and FIFO Status Register */ -@@ -711,10 +730,68 @@ - #define USIR1_IR15 (1 << 7) /* Interrup request ep 15 */ - - -+#if defined(CONFIG_PXA27X) - /* -- * Fast Infrared Communication Port -+ * USB Host Controller - */ -+#define USBH_BASE 0x4C000000 -+#define UHCREV __REG(0x4C000000) -+#define UHCHCON __REG(0x4C000004) -+#define UHCCOMS __REG(0x4C000008) -+#define UHCINTS __REG(0x4C00000C) -+#define UHCINTE __REG(0x4C000010) -+#define UHCINTD __REG(0x4C000014) -+#define UHCHCCA __REG(0x4C000018) -+#define UHCPCED __REG(0x4C00001C) -+#define UHCCHED __REG(0x4C000020) -+#define UHCCCED __REG(0x4C000024) -+#define UHCBHED __REG(0x4C000028) -+#define UHCBCED __REG(0x4C00002C) -+#define UHCDHEAD __REG(0x4C000030) -+#define UHCFMI __REG(0x4C000034) -+#define UHCFMR __REG(0x4C000038) -+#define UHCFMN __REG(0x4C00003C) -+#define UHCPERS __REG(0x4C000040) -+#define UHCLST __REG(0x4C000044) -+#define UHCRHDA __REG(0x4C000048) -+#define UHCRHDB __REG(0x4C00004C) -+#define UHCRHS __REG(0x4C000050) -+#define UHCRHPS1 __REG(0x4C000054) -+#define UHCRHPS2 __REG(0x4C000058) -+#define UHCRHPS3 __REG(0x4C00005C) -+#define UHCSTAT __REG(0x4C000060) -+#define UHCHR __REG(0x4C000064) -+#define UHCHIE __REG(0x4C000068) -+#define UHCHIT __REG(0x4C00006C) -+ -+#define UHCHR_FSBIR (1<<0) -+#define UHCHR_FHR (1<<1) -+#define UHCHR_CGR (1<<2) -+#define UHCHR_SSDC (1<<3) -+#define UHCHR_UIT (1<<4) -+#define UHCHR_SSE (1<<5) -+#define UHCHR_PSPL (1<<6) -+#define UHCHR_PCPL (1<<7) -+#define UHCHR_SSEP0 (1<<9) -+#define UHCHR_SSEP1 (1<<10) -+#define UHCHR_SSEP2 (1<<11) -+ -+#define UHCHIE_UPRIE (1<<13) -+#define UHCHIE_UPS2IE (1<<12) -+#define UHCHIE_UPS1IE (1<<11) -+#define UHCHIE_TAIE (1<<10) -+#define UHCHIE_HBAIE (1<<8) -+#define UHCHIE_RWIE (1<<7) -+ -+#define UHCCOMS_HCR 1 -+#define UHCRHS_LPS 1 -+#define UHCHR_SSE (1<<5) -+ -+#endif - -+/* -+ * Fast Infrared Communication Port -+ */ - #define ICCR0 __REG(0x40800000) /* ICP Control Register 0 */ - #define ICCR1 __REG(0x40800004) /* ICP Control Register 1 */ - #define ICCR2 __REG(0x40800008) /* ICP Control Register 2 */ -@@ -731,7 +808,21 @@ - #define RTAR __REG(0x40900004) /* RTC Alarm Register */ - #define RTSR __REG(0x40900008) /* RTC Status Register */ - #define RTTR __REG(0x4090000C) /* RTC Timer Trim Register */ -- -+#define RDAR1 __REG(0x40900018) /* Wristwatch Day Alarm Reg 1 */ -+#define RDAR2 __REG(0x40900020) /* Wristwatch Day Alarm Reg 2 */ -+#define RYAR1 __REG(0x4090001C) /* Wristwatch Year Alarm Reg 1 */ -+#define RYAR2 __REG(0x40900024) /* Wristwatch Year Alarm Reg 2 */ -+#define SWAR1 __REG(0x4090002C) /* Stopwatch Alarm Register 1 */ -+#define SWAR2 __REG(0x40900030) /* Stopwatch Alarm Register 2 */ -+#define PIAR __REG(0x40900038) /* Periodic Interrupt Alarm Register */ -+#define RDCR __REG(0x40900010) /* RTC Day Count Register. */ -+#define RYCR __REG(0x40900014) /* RTC Year Count Register. */ -+#define SWCR __REG(0x40900028) /* Stopwatch Count Register */ -+#define RTCPICR __REG(0x40900034) /* Periodic Interrupt Counter Register */ -+ -+#define RTSR_PICE (1 << 15) /* Peridoc interrupt count enable */ -+#define RTSR_PIALE (1 << 14) /* Peridoc interrupt Alarm enable */ -+#define RTSR_PIAL (1 << 13) /* Peridoc interrupt Alarm status */ - #define RTSR_HZE (1 << 3) /* HZ interrupt enable */ - #define RTSR_ALE (1 << 2) /* RTC alarm interrupt enable */ - #define RTSR_HZ (1 << 1) /* HZ rising-edge detected */ -@@ -831,6 +922,37 @@ - /* More handy macros. The argument is a literal GPIO number. */ - - #define GPIO_bit(x) (1 << ((x) & 0x1f)) -+ -+#ifdef CONFIG_PXA27X -+ -+/* Interrupt Controller */ -+ -+#define ICIP2 __REG(0x40D0009C) /* Interrupt Controller IRQ Pending Register 2 */ -+#define ICMR2 __REG(0x40D000A0) /* Interrupt Controller Mask Register 2 */ -+#define ICLR2 __REG(0x40D000A4) /* Interrupt Controller Level Register 2 */ -+#define ICFP2 __REG(0x40D000A8) /* Interrupt Controller FIQ Pending Register 2 */ -+#define ICPR2 __REG(0x40D000AC) /* Interrupt Controller Pending Register 2 */ -+ -+#define _GPLR(x) __REG2(0x40E00000, ((x) & 0x60) >> 3) -+#define _GPDR(x) __REG2(0x40E0000C, ((x) & 0x60) >> 3) -+#define _GPSR(x) __REG2(0x40E00018, ((x) & 0x60) >> 3) -+#define _GPCR(x) __REG2(0x40E00024, ((x) & 0x60) >> 3) -+#define _GRER(x) __REG2(0x40E00030, ((x) & 0x60) >> 3) -+#define _GFER(x) __REG2(0x40E0003C, ((x) & 0x60) >> 3) -+#define _GEDR(x) __REG2(0x40E00048, ((x) & 0x60) >> 3) -+#define _GAFR(x) __REG2(0x40E00054, ((x) & 0x70) >> 2) -+ -+#define GPLR(x) ((((x) & 0x7f) < 96) ? _GPLR(x) : GPLR3) -+#define GPDR(x) ((((x) & 0x7f) < 96) ? _GPDR(x) : GPDR3) -+#define GPSR(x) ((((x) & 0x7f) < 96) ? _GPSR(x) : GPSR3) -+#define GPCR(x) ((((x) & 0x7f) < 96) ? _GPCR(x) : GPCR3) -+#define GRER(x) ((((x) & 0x7f) < 96) ? _GRER(x) : GRER3) -+#define GFER(x) ((((x) & 0x7f) < 96) ? _GFER(x) : GFER3) -+#define GEDR(x) ((((x) & 0x7f) < 96) ? _GEDR(x) : GEDR3) -+#define GAFR(x) ((((x) & 0x7f) < 96) ? _GAFR(x) : \ -+ ((((x) & 0x7f) < 112) ? GAFR3_L : GAFR3_U)) -+#else -+ - #define GPLR(x) __REG2(0x40E00000, ((x) & 0x60) >> 3) - #define GPDR(x) __REG2(0x40E0000C, ((x) & 0x60) >> 3) - #define GPSR(x) __REG2(0x40E00018, ((x) & 0x60) >> 3) -@@ -840,6 +962,8 @@ - #define GEDR(x) __REG2(0x40E00048, ((x) & 0x60) >> 3) - #define GAFR(x) __REG2(0x40E00054, ((x) & 0x70) >> 2) - -+#endif -+ - /* GPIO alternate function assignments */ - - #define GPIO1_RST 1 /* reset */ -@@ -1038,6 +1162,8 @@ - #define GPIO79_nCS_3_MD (79 | GPIO_ALT_FN_2_OUT) - #define GPIO80_nCS_4_MD (80 | GPIO_ALT_FN_2_OUT) - -+#define GPIO117_SCL (117 | GPIO_ALT_FN_1_OUT) -+#define GPIO118_SDA (118 | GPIO_ALT_FN_1_OUT) - - /* - * Power Manager -@@ -1054,8 +1180,62 @@ - #define PGSR0 __REG(0x40F00020) /* Power Manager GPIO Sleep State Register for GP[31-0] */ - #define PGSR1 __REG(0x40F00024) /* Power Manager GPIO Sleep State Register for GP[63-32] */ - #define PGSR2 __REG(0x40F00028) /* Power Manager GPIO Sleep State Register for GP[84-64] */ -+#define PGSR3 __REG(0x40F0002C) /* Power Manager GPIO Sleep State Register for GP[118-96] */ - #define RCSR __REG(0x40F00030) /* Reset Controller Status Register */ - -+#define PSLR __REG(0x40F00034) /* Power Manager Sleep Config Register */ -+#define PSTR __REG(0x40F00038) /* Power Manager Standby Config Register */ -+#define PSNR __REG(0x40F0003C) /* Power Manager Sense Config Register */ -+#define PVCR __REG(0x40F00040) /* Power Manager VoltageControl Register */ -+#define PKWR __REG(0x40F00050) /* Power Manager KB Wake-up Enable Reg */ -+#define PKSR __REG(0x40F00054) /* Power Manager KB Level-Detect Register */ -+#define PCMD(x) __REG(0x40F00080 + x*4) -+#define PCMD0 __REG(0x40F00080 + 0 * 4) -+#define PCMD1 __REG(0x40F00080 + 1 * 4) -+#define PCMD2 __REG(0x40F00080 + 2 * 4) -+#define PCMD3 __REG(0x40F00080 + 3 * 4) -+#define PCMD4 __REG(0x40F00080 + 4 * 4) -+#define PCMD5 __REG(0x40F00080 + 5 * 4) -+#define PCMD6 __REG(0x40F00080 + 6 * 4) -+#define PCMD7 __REG(0x40F00080 + 7 * 4) -+#define PCMD8 __REG(0x40F00080 + 8 * 4) -+#define PCMD9 __REG(0x40F00080 + 9 * 4) -+#define PCMD10 __REG(0x40F00080 + 10 * 4) -+#define PCMD11 __REG(0x40F00080 + 11 * 4) -+#define PCMD12 __REG(0x40F00080 + 12 * 4) -+#define PCMD13 __REG(0x40F00080 + 13 * 4) -+#define PCMD14 __REG(0x40F00080 + 14 * 4) -+#define PCMD15 __REG(0x40F00080 + 15 * 4) -+#define PCMD16 __REG(0x40F00080 + 16 * 4) -+#define PCMD17 __REG(0x40F00080 + 17 * 4) -+#define PCMD18 __REG(0x40F00080 + 18 * 4) -+#define PCMD19 __REG(0x40F00080 + 19 * 4) -+#define PCMD20 __REG(0x40F00080 + 20 * 4) -+#define PCMD21 __REG(0x40F00080 + 21 * 4) -+#define PCMD22 __REG(0x40F00080 + 22 * 4) -+#define PCMD23 __REG(0x40F00080 + 23 * 4) -+#define PCMD24 __REG(0x40F00080 + 24 * 4) -+#define PCMD25 __REG(0x40F00080 + 25 * 4) -+#define PCMD26 __REG(0x40F00080 + 26 * 4) -+#define PCMD27 __REG(0x40F00080 + 27 * 4) -+#define PCMD28 __REG(0x40F00080 + 28 * 4) -+#define PCMD29 __REG(0x40F00080 + 29 * 4) -+#define PCMD30 __REG(0x40F00080 + 30 * 4) -+#define PCMD31 __REG(0x40F00080 + 31 * 4) -+ -+#define PCMD_MBC (1<<12) -+#define PCMD_DCE (1<<11) -+#define PCMD_LC (1<<10) -+/* FIXME: PCMD_SQC need be checked. */ -+#define PCMD_SQC (3<<8) /* currently only bit 8 is changerable, */ -+ /* bit 9 should be 0 all day. */ -+#define PVCR_VCSA (0x1<<14) -+#define PVCR_CommandDelay (0xf80) -+/* define MACRO for Power Manager General Configuration Register (PCFR) */ -+#define PCFR_FVC (0x1 << 10) -+#define PCFR_PI2C_EN (0x1 << 6) -+ -+#define PSSR_OTGPH (1 << 6) /* OTG Peripheral control Hold */ - #define PSSR_RDH (1 << 5) /* Read Disable Hold */ - #define PSSR_PH (1 << 4) /* Peripheral Control Hold */ - #define PSSR_VFS (1 << 2) /* VDD Fault Status */ -@@ -1117,14 +1297,29 @@ - #define OSCC __REG(0x41300008) /* Oscillator Configuration Register */ - - #define CCCR_N_MASK 0x0380 /* Run Mode Frequency to Turbo Mode Frequency Multiplier */ -+#if !defined(CONFIG_PXA27X) - #define CCCR_M_MASK 0x0060 /* Memory Frequency to Run Mode Frequency Multiplier */ -+#endif - #define CCCR_L_MASK 0x001f /* Crystal Frequency to Memory Frequency Multiplier */ - -+#define CKEN24_CAMERA (1 << 24) /* Camera Interface Clock Enable */ -+#define CKEN23_SSP1 (1 << 23) /* SSP1 Unit Clock Enable */ -+#define CKEN22_MEMC (1 << 22) /* Memory Controller Clock Enable */ -+#define CKEN21_MEMSTK (1 << 21) /* Memory Stick Host Controller */ -+#define CKEN20_IM (1 << 20) /* Internal Memory Clock Enable */ -+#define CKEN19_KEYPAD (1 << 19) /* Keypad Interface Clock Enable */ -+#define CKEN18_USIM (1 << 18) /* USIM Unit Clock Enable */ -+#define CKEN17_MSL (1 << 17) /* MSL Unit Clock Enable */ - #define CKEN16_LCD (1 << 16) /* LCD Unit Clock Enable */ -+#define CKEN15_PWRI2C (1 << 15) /* PWR I2C Unit Clock Enable */ - #define CKEN14_I2C (1 << 14) /* I2C Unit Clock Enable */ - #define CKEN13_FICP (1 << 13) /* FICP Unit Clock Enable */ - #define CKEN12_MMC (1 << 12) /* MMC Unit Clock Enable */ - #define CKEN11_USB (1 << 11) /* USB Unit Clock Enable */ -+#if defined(CONFIG_PXA27X) -+#define CKEN10_USBHOST (1 << 10) /* USB Host Unit Clock Enable */ -+#define CKEN24_CAMERA (1 << 24) /* Camera Unit Clock Enable */ -+#endif - #define CKEN8_I2S (1 << 8) /* I2S Unit Clock Enable */ - #define CKEN7_BTUART (1 << 7) /* BTUART Unit Clock Enable */ - #define CKEN6_FFUART (1 << 6) /* FFUART Unit Clock Enable */ -@@ -1137,6 +1332,7 @@ - #define OSCC_OON (1 << 1) /* 32.768kHz OON (write-once only bit) */ - #define OSCC_OOK (1 << 0) /* 32.768kHz OOK (read-only bit) */ - -+#if !defined(CONFIG_PXA27X) - #define CCCR_L09 (0x1F) - #define CCCR_L27 (0x1) - #define CCCR_L32 (0x2) -@@ -1153,6 +1349,7 @@ - #define CCCR_N20 (0x4 << 7) - #define CCCR_N25 (0x5 << 7) - #define CCCR_N30 (0x6 << 7) -+#endif - - /* - * LCD -@@ -1164,7 +1361,8 @@ - #define LCCR3 __REG(0x4400000C) /* LCD Controller Control Register 3 */ - #define DFBR0 __REG(0x44000020) /* DMA Channel 0 Frame Branch Register */ - #define DFBR1 __REG(0x44000024) /* DMA Channel 1 Frame Branch Register */ --#define LCSR __REG(0x44000038) /* LCD Controller Status Register */ -+#define LCSR0 __REG(0x44000038) /* LCD Controller Status Register */ -+#define LCSR1 __REG(0x44000034) /* LCD Controller Status Register */ - #define LIIDR __REG(0x4400003C) /* LCD Controller Interrupt ID Register */ - #define TMEDRGBR __REG(0x44000040) /* TMED RGB Seed Register */ - #define TMEDCR __REG(0x44000044) /* TMED Control Register */ -@@ -1194,6 +1392,11 @@ - #define LCCR0_PDD_S 12 - #define LCCR0_BM (1 << 20) /* Branch mask */ - #define LCCR0_OUM (1 << 21) /* Output FIFO underrun mask */ -+#if defined(CONFIG_PXA27X) -+#define LCCR0_LCDT (1 << 22) /* LCD Panel Type */ -+#define LCCR0_RDSTM (1 << 23) /* Read Status Interrupt Mask */ -+#define LCCR0_CMDIM (1 << 24) /* Command Interrupt Mask */ -+#endif - - #define LCCR1_PPL Fld (10, 0) /* Pixels Per Line - 1 */ - #define LCCR1_DisWdth(Pixel) /* Display Width [1..800 pix.] */ \ -@@ -1257,6 +1460,11 @@ - #endif - #define LCCR3_DPC (1 << 27) /* double pixel clock mode */ - -+#define LCCR3_PDFOR_0 (0 << 30) -+#define LCCR3_PDFOR_1 (1 << 30) -+#define LCCR3_PDFOR_2 (2 << 30) -+#define LCCR3_PDFOR_3 (3 << 30) -+ - - #define LCCR3_PCD Fld (8, 0) /* Pixel Clock Divisor */ - #define LCCR3_PixClkDiv(Div) /* Pixel Clock Divisor */ \ -@@ -1265,7 +1473,7 @@ - - #define LCCR3_BPP Fld (3, 24) /* Bit Per Pixel */ - #define LCCR3_Bpp(Bpp) /* Bit Per Pixel */ \ -- (((Bpp) << FShft (LCCR3_BPP))) -+ ((((Bpp&0x7) << FShft (LCCR3_BPP)))|(((Bpp&0x8)<<26))) - - #define LCCR3_ACB Fld (8, 8) /* AC Bias */ - #define LCCR3_Acb(Acb) /* BAC Bias */ \ -@@ -1280,33 +1488,50 @@ - #define LCCR3_VrtSnchL (LCCR3_VSP*1) /* Vertical Synchronization pulse */ - /* active Low */ - --#define LCSR_LDD (1 << 0) /* LCD Disable Done */ --#define LCSR_SOF (1 << 1) /* Start of frame */ --#define LCSR_BER (1 << 2) /* Bus error */ --#define LCSR_ABC (1 << 3) /* AC Bias count */ --#define LCSR_IUL (1 << 4) /* input FIFO underrun Lower panel */ --#define LCSR_IUU (1 << 5) /* input FIFO underrun Upper panel */ --#define LCSR_OU (1 << 6) /* output FIFO underrun */ --#define LCSR_QD (1 << 7) /* quick disable */ --#define LCSR_EOF (1 << 8) /* end of frame */ --#define LCSR_BS (1 << 9) /* branch status */ --#define LCSR_SINT (1 << 10) /* subsequent interrupt */ -- --#define LDCMD_PAL (1 << 26) /* instructs DMA to load palette buffer */ -- --#define LCSR_LDD (1 << 0) /* LCD Disable Done */ --#define LCSR_SOF (1 << 1) /* Start of frame */ --#define LCSR_BER (1 << 2) /* Bus error */ --#define LCSR_ABC (1 << 3) /* AC Bias count */ --#define LCSR_IUL (1 << 4) /* input FIFO underrun Lower panel */ --#define LCSR_IUU (1 << 5) /* input FIFO underrun Upper panel */ --#define LCSR_OU (1 << 6) /* output FIFO underrun */ --#define LCSR_QD (1 << 7) /* quick disable */ --#define LCSR_EOF (1 << 8) /* end of frame */ --#define LCSR_BS (1 << 9) /* branch status */ --#define LCSR_SINT (1 << 10) /* subsequent interrupt */ -+#define LCSR0_LDD (1 << 0) /* LCD Disable Done */ -+#define LCSR0_SOF (1 << 1) /* Start of frame */ -+#define LCSR0_BER (1 << 2) /* Bus error */ -+#define LCSR0_ABC (1 << 3) /* AC Bias count */ -+#define LCSR0_IUL (1 << 4) /* input FIFO underrun Lower panel */ -+#define LCSR0_IUU (1 << 5) /* input FIFO underrun Upper panel */ -+#define LCSR0_OU (1 << 6) /* output FIFO underrun */ -+#define LCSR0_QD (1 << 7) /* quick disable */ -+#define LCSR0_EOF0 (1 << 8) /* end of frame */ -+#define LCSR0_BS (1 << 9) /* branch status */ -+#define LCSR0_SINT (1 << 10) /* subsequent interrupt */ -+ -+#define LCSR1_SOF1 (1 << 0) -+#define LCSR1_SOF2 (1 << 1) -+#define LCSR1_SOF3 (1 << 2) -+#define LCSR1_SOF4 (1 << 3) -+#define LCSR1_SOF5 (1 << 4) -+#define LCSR1_SOF6 (1 << 5) -+ -+#define LCSR1_EOF1 (1 << 8) -+#define LCSR1_EOF2 (1 << 9) -+#define LCSR1_EOF3 (1 << 10) -+#define LCSR1_EOF4 (1 << 11) -+#define LCSR1_EOF5 (1 << 12) -+#define LCSR1_EOF6 (1 << 13) -+ -+#define LCSR1_BS1 (1 << 16) -+#define LCSR1_BS2 (1 << 17) -+#define LCSR1_BS3 (1 << 18) -+#define LCSR1_BS4 (1 << 19) -+#define LCSR1_BS5 (1 << 20) -+#define LCSR1_BS6 (1 << 21) -+ -+#define LCSR1_IU2 (1 << 25) -+#define LCSR1_IU3 (1 << 26) -+#define LCSR1_IU4 (1 << 27) -+#define LCSR1_IU5 (1 << 28) -+#define LCSR1_IU6 (1 << 29) - - #define LDCMD_PAL (1 << 26) /* instructs DMA to load palette buffer */ -+#if defined(CONFIG_PXA27X) -+#define LDCMD_SOFINT (1 << 22) -+#define LDCMD_EOFINT (1 << 21) -+#endif - - /* - * Memory controller -@@ -1369,5 +1594,191 @@ - #define MDREFR_K0RUN (1 << 13) /* SDCLK0 Run Control/Status */ - #define MDREFR_E0PIN (1 << 12) /* SDCKE0 Level Control/Status */ - -+#if defined(CONFIG_PXA27X) - --#endif -+#define ARB_CNTRL __REG(0x48000048) /* Arbiter Control Register */ -+ -+#define ARB_DMA_SLV_PARK (1<<31) /* Be parked with DMA slave when idle */ -+#define ARB_CI_PARK (1<<30) /* Be parked with Camera Interface when idle */ -+#define ARB_EX_MEM_PARK (1<<29) /* Be parked with external MEMC when idle */ -+#define ARB_INT_MEM_PARK (1<<28) /* Be parked with internal MEMC when idle */ -+#define ARB_USB_PARK (1<<27) /* Be parked with USB when idle */ -+#define ARB_LCD_PARK (1<<26) /* Be parked with LCD when idle */ -+#define ARB_DMA_PARK (1<<25) /* Be parked with DMA when idle */ -+#define ARB_CORE_PARK (1<<24) /* Be parked with core when idle */ -+#define ARB_LOCK_FLAG (1<<23) /* Only Locking masters gain access to the bus */ -+ -+/* Interrupt Controller */ -+ -+#define ICIP2 __REG(0x40D0009C) /* Interrupt Controller IRQ Pending Register 2 */ -+#define ICMR2 __REG(0x40D000A0) /* Interrupt Controller Mask Register 2 */ -+#define ICLR2 __REG(0x40D000A4) /* Interrupt Controller Level Register 2 */ -+#define ICFP2 __REG(0x40D000A8) /* Interrupt Controller FIQ Pending Register 2 */ -+#define ICPR2 __REG(0x40D000AC) /* Interrupt Controller Pending Register 2 */ -+ -+/* General Purpose I/O */ -+ -+#define GAFR3_L __REG(0x40E0006C) /* GPIO Alternate Function Select Register GPIO<111:96> */ -+#define GAFR3_U __REG(0x40E00070) /* GPIO Alternate Function Select Register GPIO<127:112> */ -+#define GPLR3 __REG(0x40E00100) /* GPIO Pin-Level Register GPIO<127:96> */ -+#define GPDR3 __REG(0x40E0010C) /* GPIO Pin Direction Register GPIO<127:96> */ -+#define GPSR3 __REG(0x40E00118) /* GPIO Pin Output Set Register GPIO<127:96> */ -+#define GPCR3 __REG(0x40E00124) /* GPIO Pin Output Clear Register GPIO <127:96> */ -+#define GRER3 __REG(0x40E00130) /* GPIO Rising-Edge Detect Register GPIO<127:96> */ -+#define GFER3 __REG(0x40E0013C) /* GPIO Falling-Edge Detect Register GPIO<31:0> */ -+#define GEDR3 __REG(0x40E00148) /* GPIO Edge Detect Status Register GPIO<127:96> */ -+ -+/* Core Clock */ -+ -+#define CCSR __REG(0x4130000C) /* Core Clock Status Register */ -+ -+#define CKEN23_SSP1 (1 << 23) /* SSP1 Unit Clock Enable */ -+#define CKEN22_MEMC (1 << 22) /* Memory Controler */ -+#define CKEN21_MSHC (1 << 21) /* Memery Stick Host Controller */ -+#define CKEN20_IM (1 << 20) /* Internal Memory Clock Enable */ -+#define CKEN19_KEYPAD (1 << 19) /* Keypad Interface Clock Enable */ -+#define CKEN18_USIM (1 << 18) /* USIM Unit Clock Enable */ -+#define CKEN17_MSL (1 << 17) /* MSL Interface Unit Clock Enable */ -+#define CKEN15_PWR_I2C (1 << 15) /* PWR_I2C Unit Clock Enable */ -+#define CKEN9_OST (1 << 9) /* OS Timer Unit Clock Enable */ -+#define CKEN4_SSP3 (1 << 4) /* SSP3 Unit Clock Enable */ -+ -+/* Memory controller */ -+ -+#define MDREFR_K0DB4 (1 << 29) /* SDCLK[0] divide by 4 */ -+ -+/* LCD registers */ -+#define LCCR4 __REG(0x44000010) /* LCD Controller Control Register 4 */ -+#define LCCR5 __REG(0x44000014) /* LCD Controller Control Register 5 */ -+#define FBR0 __REG(0x44000020) /* DMA Channel 0 Frame Branch Register */ -+#define FBR1 __REG(0x44000024) /* DMA Channel 1 Frame Branch Register */ -+#define FBR2 __REG(0x44000028) /* DMA Channel 2 Frame Branch Register */ -+#define FBR3 __REG(0x4400002C) /* DMA Channel 3 Frame Branch Register */ -+#define FBR4 __REG(0x44000030) /* DMA Channel 4 Frame Branch Register */ -+#define FDADR2 __REG(0x44000220) /* DMA Channel 2 Frame Descriptor Address Register */ -+#define FSADR2 __REG(0x44000224) /* DMA Channel 2 Frame Source Address Register */ -+#define FIDR2 __REG(0x44000228) /* DMA Channel 2 Frame ID Register */ -+#define LDCMD2 __REG(0x4400022C) /* DMA Channel 2 Command Register */ -+#define FDADR3 __REG(0x44000230) /* DMA Channel 3 Frame Descriptor Address Register */ -+#define FSADR3 __REG(0x44000234) /* DMA Channel 3 Frame Source Address Register */ -+#define FIDR3 __REG(0x44000238) /* DMA Channel 3 Frame ID Register */ -+#define LDCMD3 __REG(0x4400023C) /* DMA Channel 3 Command Register */ -+#define FDADR4 __REG(0x44000240) /* DMA Channel 4 Frame Descriptor Address Register */ -+#define FSADR4 __REG(0x44000244) /* DMA Channel 4 Frame Source Address Register */ -+#define FIDR4 __REG(0x44000248) /* DMA Channel 4 Frame ID Register */ -+#define LDCMD4 __REG(0x4400024C) /* DMA Channel 4 Command Register */ -+#define FDADR5 __REG(0x44000250) /* DMA Channel 5 Frame Descriptor Address Register */ -+#define FSADR5 __REG(0x44000254) /* DMA Channel 5 Frame Source Address Register */ -+#define FIDR5 __REG(0x44000258) /* DMA Channel 5 Frame ID Register */ -+#define LDCMD5 __REG(0x4400025C) /* DMA Channel 5 Command Register */ -+ -+#define OVL1C1 __REG(0x44000050) /* Overlay 1 Control Register 1 */ -+#define OVL1C2 __REG(0x44000060) /* Overlay 1 Control Register 2 */ -+#define OVL2C1 __REG(0x44000070) /* Overlay 2 Control Register 1 */ -+#define OVL2C2 __REG(0x44000080) /* Overlay 2 Control Register 2 */ -+#define CCR __REG(0x44000090) /* Cursor Control Register */ -+ -+#define FBR5 __REG(0x44000110) /* DMA Channel 5 Frame Branch Register */ -+#define FBR6 __REG(0x44000114) /* DMA Channel 6 Frame Branch Register */ -+ -+#define LCCR0_LDDALT (1<<26) /* LDD Alternate mapping bit when base pixel is RGBT16 */ -+#define LCCR0_OUC (1<<25) /* Overlay Underlay Control Bit */ -+ -+#define LCCR5_SOFM1 (1<<0) /* Start Of Frame Mask for Overlay 1 (channel 1) */ -+#define LCCR5_SOFM2 (1<<1) /* Start Of Frame Mask for Overlay 2 (channel 2) */ -+#define LCCR5_SOFM3 (1<<2) /* Start Of Frame Mask for Overlay 2 (channel 3) */ -+#define LCCR5_SOFM4 (1<<3) /* Start Of Frame Mask for Overlay 2 (channel 4) */ -+#define LCCR5_SOFM5 (1<<4) /* Start Of Frame Mask for cursor (channel 5) */ -+#define LCCR5_SOFM6 (1<<5) /* Start Of Frame Mask for command data (channel 6) */ -+ -+#define LCCR5_EOFM1 (1<<8) /* End Of Frame Mask for Overlay 1 (channel 1) */ -+#define LCCR5_EOFM2 (1<<9) /* End Of Frame Mask for Overlay 2 (channel 2) */ -+#define LCCR5_EOFM3 (1<<10) /* End Of Frame Mask for Overlay 2 (channel 3) */ -+#define LCCR5_EOFM4 (1<<11) /* End Of Frame Mask for Overlay 2 (channel 4) */ -+#define LCCR5_EOFM5 (1<<12) /* End Of Frame Mask for cursor (channel 5) */ -+#define LCCR5_EOFM6 (1<<13) /* End Of Frame Mask for command data (channel 6) */ -+ -+#define LCCR5_BSM1 (1<<16) /* Branch mask for Overlay 1 (channel 1) */ -+#define LCCR5_BSM2 (1<<17) /* Branch mask for Overlay 2 (channel 2) */ -+#define LCCR5_BSM3 (1<<18) /* Branch mask for Overlay 2 (channel 3) */ -+#define LCCR5_BSM4 (1<<19) /* Branch mask for Overlay 2 (channel 4) */ -+#define LCCR5_BSM5 (1<<20) /* Branch mask for cursor (channel 5) */ -+#define LCCR5_BSM6 (1<<21) /* Branch mask for data command (channel 6) */ -+ -+#define LCCR5_IUM1 (1<<24) /* Input FIFO Underrun Mask for Overlay 1 */ -+#define LCCR5_IUM2 (1<<25) /* Input FIFO Underrun Mask for Overlay 2 */ -+#define LCCR5_IUM3 (1<<26) /* Input FIFO Underrun Mask for Overlay 2 */ -+#define LCCR5_IUM4 (1<<27) /* Input FIFO Underrun Mask for Overlay 2 */ -+#define LCCR5_IUM5 (1<<28) /* Input FIFO Underrun Mask for cursor */ -+#define LCCR5_IUM6 (1<<29) /* Input FIFO Underrun Mask for data command */ -+ -+#define OVL1C1_O1EN (1<<31) /* Enable bit for Overlay 1 */ -+#define OVL2C1_O2EN (1<<31) /* Enable bit for Overlay 2 */ -+#define CCR_CEN (1<<31) /* Enable bit for Cursor */ -+ -+/* Keypad controller */ -+ -+#define KPC __REG(0x41500000) /* Keypad Interface Control register */ -+#define KPDK __REG(0x41500008) /* Keypad Interface Direct Key register */ -+#define KPREC __REG(0x41500010) /* Keypad Intefcace Rotary Encoder register */ -+#define KPMK __REG(0x41500018) /* Keypad Intefcace Matrix Key register */ -+#define KPAS __REG(0x41500020) /* Keypad Interface Automatic Scan register */ -+#define KPASMKP0 __REG(0x41500028) /* Keypad Interface Automatic Scan Multiple Key Presser register 0 */ -+#define KPASMKP1 __REG(0x41500030) /* Keypad Interface Automatic Scan Multiple Key Presser register 1 */ -+#define KPASMKP2 __REG(0x41500038) /* Keypad Interface Automatic Scan Multiple Key Presser register 2 */ -+#define KPASMKP3 __REG(0x41500040) /* Keypad Interface Automatic Scan Multiple Key Presser register 3 */ -+#define KPKDI __REG(0x41500048) /* Keypad Interface Key Debounce Interval register */ -+ -+#define KPC_AS (0x1 << 30) /* Automatic Scan bit */ -+#define KPC_ASACT (0x1 << 29) /* Automatic Scan on Activity */ -+#define KPC_MI (0x1 << 22) /* Matrix interrupt bit */ -+#define KPC_IMKP (0x1 << 21) /* Ignore Multiple Key Press */ -+#define KPC_MS7 (0x1 << 20) /* Matrix scan line 7 */ -+#define KPC_MS6 (0x1 << 19) /* Matrix scan line 6 */ -+#define KPC_MS5 (0x1 << 18) /* Matrix scan line 5 */ -+#define KPC_MS4 (0x1 << 17) /* Matrix scan line 4 */ -+#define KPC_MS3 (0x1 << 16) /* Matrix scan line 3 */ -+#define KPC_MS2 (0x1 << 15) /* Matrix scan line 2 */ -+#define KPC_MS1 (0x1 << 14) /* Matrix scan line 1 */ -+#define KPC_MS0 (0x1 << 13) /* Matrix scan line 0 */ -+#define KPC_ME (0x1 << 12) /* Matrix Keypad Enable */ -+#define KPC_MIE (0x1 << 11) /* Matrix Interrupt Enable */ -+#define KPC_DK_DEB_SEL (0x1 << 9) /* Direct Key Debounce select */ -+#define KPC_DI (0x1 << 5) /* Direct key interrupt bit */ -+#define KPC_DEE0 (0x1 << 2) /* Rotary Encoder 0 Enable */ -+#define KPC_DE (0x1 << 1) /* Direct Keypad Enable */ -+#define KPC_DIE (0x1 << 0) /* Direct Keypad interrupt Enable */ -+ -+#define KPDK_DKP (0x1 << 31) -+#define KPDK_DK7 (0x1 << 7) -+#define KPDK_DK6 (0x1 << 6) -+#define KPDK_DK5 (0x1 << 5) -+#define KPDK_DK4 (0x1 << 4) -+#define KPDK_DK3 (0x1 << 3) -+#define KPDK_DK2 (0x1 << 2) -+#define KPDK_DK1 (0x1 << 1) -+#define KPDK_DK0 (0x1 << 0) -+ -+#define KPREC_OF1 (0x1 << 31) -+#define kPREC_UF1 (0x1 << 30) -+#define KPREC_OF0 (0x1 << 15) -+#define KPREC_UF0 (0x1 << 14) -+ -+#define KPMK_MKP (0x1 << 31) -+#define KPAS_SO (0x1 << 31) -+#define KPASMKPx_SO (0x1 << 31) -+ -+#define GPIO113_BIT (1 << 17)/* GPIO113 in GPSR, GPCR, bit 17 */ -+#define PSLR __REG(0x40F00034) -+#define PSTR __REG(0x40F00038) /* Power Manager Standby Configuration Reg */ -+#define PSNR __REG(0x40F0003C) /* Power Manager Sense Configuration Reg */ -+#define PVCR __REG(0x40F00040) /* Power Manager Voltage Change Control Reg */ -+#define PKWR __REG(0x40F00050) /* Power Manager KB Wake-Up Enable Reg */ -+#define PKSR __REG(0x40F00054) /* Power Manager KB Level-Detect Status Reg */ -+#define OSMR4 __REG(0x40A00080) /* */ -+#define OSCR4 __REG(0x40A00040) /* OS Timer Counter Register */ -+#define OMCR4 __REG(0x40A000C0) /* */ -+ -+#endif /* CONFIG_PXA27X */ -+ -+#endif /* _PXA_REGS_H_ */ -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/mach-types.h u-boot-1.1.2-neon/include/asm-arm/mach-types.h ---- u-boot-1.1.2/include/asm-arm/mach-types.h 2004-10-10 20:41:14.000000000 +0200 -+++ u-boot-1.1.2-neon/include/asm-arm/mach-types.h 2007-08-11 21:07:21.000000000 +0200 -@@ -624,6 +624,9 @@ - #define MACH_TYPE_RMS100 611 - #define MACH_TYPE_KB9200 612 - #define MACH_TYPE_SX1 613 -+#define MACH_TYPE_NEON 332 -+#define MACH_TYPE_BD2003 332 -+#define MACH_TYPE_HALOGEN 332 - - #ifdef CONFIG_ARCH_EBSA110 - # ifdef machine_arch_type -@@ -7945,6 +7948,42 @@ - # define machine_is_sx1() (0) - #endif - -+#ifdef CONFIG_ARCH_NEON -+# ifdef machine_arch_type -+# undef machine_arch_type -+# define machine_arch_type __machine_arch_type -+# else -+# define machine_arch_type MACH_TYPE_NEON -+# endif -+# define machine_is_neon() (machine_arch_type == MACH_TYPE_NEON) -+#else -+# define machine_is_neon() (0) -+#endif -+ -+#ifdef CONFIG_ARCH_BD2003 -+# ifdef machine_arch_type -+# undef machine_arch_type -+# define machine_arch_type __machine_arch_type -+# else -+# define machine_arch_type MACH_TYPE_BD2003 -+# endif -+# define machine_is_bd2003() (machine_arch_type == MACH_TYPE_BD2003) -+#else -+# define machine_is_bd2003() (0) -+#endif -+ -+#ifdef CONFIG_ARCH_HALOGEN -+# ifdef machine_arch_type -+# undef machine_arch_type -+# define machine_arch_type __machine_arch_type -+# else -+# define machine_arch_type MACH_TYPE_HALOGEN -+# endif -+# define machine_is_halogen() (machine_arch_type == MACH_TYPE_HALOGEN) -+#else -+# define machine_is_halogen() (0) -+#endif -+ - /* - * These have not yet been registered - */ -diff -u -r --new-file u-boot-1.1.2/include/asm-arm/processor.h u-boot-1.1.2-neon/include/asm-arm/processor.h ---- u-boot-1.1.2/include/asm-arm/processor.h 2003-06-26 00:26:36.000000000 +0200 -+++ u-boot-1.1.2-neon/include/asm-arm/processor.h 2007-08-11 21:07:21.000000000 +0200 -@@ -48,11 +48,22 @@ - #include <asm/proc/processor.h> - #include <asm/types.h> - -+#ifdef arm -+#warning arm defined by preprocessor -+#define armX arm -+#undef arm -+#endif -+ - union debug_insn { - u32 arm; - u16 thumb; - }; - -+#ifdef armX -+#define arm -+#undef armX -+#endif -+ - struct debug_entry { - u32 address; - union debug_insn insn; -diff -u -r --new-file u-boot-1.1.2/include/cmd_confdefs.h u-boot-1.1.2-neon/include/cmd_confdefs.h ---- u-boot-1.1.2/include/cmd_confdefs.h 2004-12-16 18:59:53.000000000 +0100 -+++ u-boot-1.1.2-neon/include/cmd_confdefs.h 2007-08-11 21:07:21.000000000 +0200 -@@ -92,6 +92,8 @@ - #define CFG_CMD_XIMG 0x0400000000000000ULL /* Load part of Multi Image */ - #define CFG_CMD_UNIVERSE 0x0800000000000000ULL /* Tundra Universe Support */ - #define CFG_CMD_EXT2 0x1000000000000000ULL /* EXT2 Support */ -+#define CFG_CMD_LCDPANEL 0x2000000000000000ULL /* Dynamic LCD Panel Support */ -+#define CFG_CMD_NOT 0x4000000000000000ULL /* Negate a command */ - - #define CFG_CMD_ALL 0xFFFFFFFFFFFFFFFFULL /* ALL commands */ - -diff -u -r --new-file u-boot-1.1.2/include/configs/bd2003.h u-boot-1.1.2-neon/include/configs/bd2003.h ---- u-boot-1.1.2/include/configs/bd2003.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/configs/bd2003.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,315 @@ -+#ifndef __CONFIG_H -+#define __CONFIG_H -+ -+/* -+ * bd2003.h -+ * -+ * This header file declares the configuration constants for the Boundary -+ * Devices BD2003 board. -+ * -+ * Change History : -+ * -+ * $Log: bd2003.h,v $ -+ * Revision 1.7 2005/07/18 01:51:59 tkisky -+ * -define display types -+ * -+ * Revision 1.6 2005/07/17 22:52:10 ericn -+ * -fix comment -+ * -+ * Revision 1.5 2005/07/17 22:36:37 ericn -+ * -merge w/boundaryLib -+ * -+ * Revision 1.4 2005/07/02 18:45:55 ericn -+ * -bring up-to-date -+ * -+ * Revision 1.3 2005/04/20 09:05:36 tkisky -+ * -include select.h -+ * -+ * Revision 1.2 2005/04/15 10:40:52 tkisky -+ * -remove LCD_XRES,LCD_YRES -+ * -+ * Revision 1.1 2005/04/09 17:49:24 ericn -+ * -Initial import -+ * -+ * -+ * 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 -+ * -+ * Copyright Boundary Devices, Inc. 2005 -+ */ -+ -+/* -+ * If we are developing, we might want to start armboot from ram -+ * so we MUST NOT initialize critical regs like mem-timing ... -+ */ -+#include "select.h" -+ -+#define CONFIG_INIT_CRITICAL /* undef for developing */ -+#define CONFIG_SETUP_MEMORY_TAGS 1 -+#define CONFIG_INITRD_TAG 1 -+ -+/* -+ * High Level Configuration Options -+ * (easy to change) -+ */ -+#define CONFIG_PXA250 1 /* This is an PXA250 CPU */ -+#define PXALCD 1 /* Using the PXA display controller */ -+#define CONFIG_LCD 1 -+ -+#define CONFIG_MMC 1 -+#define BOARD_LATE_INIT 1 -+ -+#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */ -+ -+/* -+ * Size of malloc() pool -+ */ -+#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024) -+#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */ -+#define CFG_MMU_SPACE_RESERVED (1<<14) -+ -+/* -+ * Hardware drivers -+ */ -+#define CONFIG_DRIVER_SMC91111 -+#define CONFIG_SMC91111_BASE 0x10000300 -+#define CONFIG_SMC_USE_32_BIT -+ -+/* -+ * select serial console configuration -+ */ -+#define CONFIG_FFUART 1 /* we use FFUART on BD2003 */ -+ -+/* allow to overwrite serial and ethaddr */ -+//#define CONFIG_ENV_OVERWRITE -+ -+#define CONFIG_BAUDRATE 115200 -+ -+#define SKIP_COMMANDS ( CFG_CMD_MISC \ -+ | CFG_CMD_BDI \ -+ | CFG_CMD_BOOTD \ -+ | CFG_CMD_LOADS \ -+ | CFG_CMD_LOADB \ -+ | CFG_CMD_ITEST \ -+ | CFG_CMD_FPGA \ -+ | CFG_CMD_ECHO \ -+ | CFG_CMD_DIAG \ -+ | CFG_CMD_DATE \ -+ | CFG_CMD_BOOTP \ -+ | CFG_CMD_NFS \ -+ ) -+// | CFG_CMD_FLASH -+// | CFG_CMD_DHCP -+// | CFG_CMD_NET -+// | CFG_CMD_MEMORY -+// | CFG_CMD_ENV -+ -+#define CONFIG_COMMANDS ( (CONFIG_CMD_DFL \ -+ | CFG_CMD_MMC \ -+ | CFG_CMD_FAT \ -+ | CFG_CMD_LCDPANEL \ -+ | CFG_CMD_FLASH \ -+ | CFG_CMD_DHCP \ -+ | CFG_CMD_ENV \ -+ | CFG_CMD_BMP) & ~(SKIP_COMMANDS) ) -+ -+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */ -+#include <cmd_confdefs.h> -+#define CONFIG_BOOTDELAY 3 -+#define CONFIG_BOOTCOMMAND "mmcinit; " \ -+ "fatload mmc 0 a0000000 init.scr ; autoscr a0000000 ; " -+#define CONFIG_BOOTARGS "console=ttyS0,115200 DEBUG=1 ENV=/etc/bashrc init=/linuxrc rw mtdparts=phys:1024k(armboot),256k(params),-(rootfs1) root=/dev/mtdblock3 rootfstype=cramfs" -+#define CONFIG_CMDLINE_TAG -+ -+#define CONFIG_GZIP -+ -+/* -+ * Choose one of the following: -+ * -+ * hitachi_qvga -+ * sharp_qvga -+ * hitachi_hvga -+ * sharp_vga -+ * hitachi_wvga - 7 or 9 inch -+ */ -+#ifndef DA320X240 -+#define DA320X240 0 -+#define DA640X240 1 -+#define DA800X480 2 -+#define DA640X480 3 -+#define DA240X320 4 -+#define DA800X600 5 -+#define DA1024X768 6 -+#define DP480X320 7 -+#define DP320X240 8 -+#define DL122X32 9 -+#endif -+ -+#if DISPLAY_TYPE == DA640X240 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=hitachi_hvga" "\0" -+#elif DISPLAY_TYPE == DA240X320 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=qvga_portrait" "\0" -+#elif DISPLAY_TYPE == DA320X240 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=hitachi_qvga" "\0" -+#elif DISPLAY_TYPE == DA8000X480 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=hitachi_wvga" "\0" -+#elif DISPLAY_TYPE == DA640X480 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=sharp_vga" "\0" -+#elif DISPLAY_TYPE == DA800X480 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=hitachi_wvga" "\0" -+#elif DISPLAY_TYPE == DA1024X768 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=crt1024x768" "\0" -+#else -+#error No display selected -+#endif -+ -+#define LCD_BPP LCD_COLOR8 -+ -+ -+#if (CONFIG_COMMANDS & CFG_CMD_KGDB) -+#define CONFIG_KGDB_BAUDRATE 230400 /* speed to run kgdb serial port */ -+#define CONFIG_KGDB_SER_INDEX 2 /* which serial port to use */ -+#endif -+ -+/* -+ * Miscellaneous configurable options -+ */ -+#define CFG_HUSH_PARSER 1 -+#define CFG_PROMPT_HUSH_PS2 "> " -+ -+#define CFG_LONGHELP /* undef to save memory */ -+#ifdef CFG_HUSH_PARSER -+#define CFG_PROMPT "$ " /* Monitor Command Prompt */ -+#else -+#define CFG_PROMPT "=> " /* Monitor Command Prompt */ -+#endif -+#define CFG_CBSIZE 256 /* Console I/O Buffer Size */ -+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ -+#define CFG_MAXARGS 16 /* max number of command args */ -+#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ -+#define CFG_DEVICE_NULLDEV 1 -+ -+#define CFG_MEMTEST_START 0xa0400000 /* memtest works on */ -+#define CFG_MEMTEST_END 0xa0800000 /* 4 ... 8 MB in DRAM */ -+ -+#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */ -+ -+#define CFG_LOAD_ADDR 0xa0030000 /* default load address */ -+ -+#define CFG_HZ 3686400 /* incrementer freq: 3.6864 MHz */ -+#define CFG_CPUSPEED 0x161 /* set core clock to 400/200/100 MHz */ -+ -+ /* valid baudrates */ -+#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } -+#define CFG_MMC_BASE 0xF0000000 -+ -+/* -+ * Stack sizes -+ * -+ * The stack sizes are set up in start.S using the settings below -+ */ -+#define CONFIG_STACKSIZE (128*1024) /* regular stack */ -+#ifdef CONFIG_USE_IRQ -+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */ -+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */ -+#endif -+ -+/* -+ * Physical Memory Map -+ */ -+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */ -+#define PHYS_SDRAM_1 0xa0000000 /* SDRAM Bank #1 */ -+#define PHYS_SDRAM_1_SIZE 0x02000000 /* 32 MB */ -+ -+#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */ -+#define PHYS_FLASH_2 0x04000000 /* Flash Bank #2 */ -+#define PHYS_FLASH_SIZE 0x02000000 /* 32 MB */ -+#define PHYS_FLASH_BANK_SIZE 0x02000000 /* 32 MB Banks */ -+#define PHYS_FLASH_SECT_SIZE 0x00040000 /* 256 KB sectors (x2) */ -+ -+#define CFG_DRAM_BASE 0xa0000000 -+#define CFG_DRAM_SIZE 0x04000000 -+ -+ -+/* -+ * Memory settings -+ */ -+#define CFG_MSC0_VAL 0x23F223F2 -+#define CFG_MSC1_VAL 0x3FF1A441 -+#define CFG_MSC2_VAL 0x7FF97FF1 -+#define CFG_MDCNFG_VAL 0x00001AC9 -+#define CFG_MDREFR_VAL 0x00018018 -+#define CFG_MDMRS_VAL 0x00000000 -+ -+/* -+ * FLASH and environment organization -+ */ -+#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */ -+#define CFG_MAX_FLASH_SECT 128 /* max number of sectors on one chip */ -+ -+/* timeout values are in ticks */ -+#define CFG_FLASH_ERASE_TOUT (25*CFG_HZ) /* Timeout for Flash Erase */ -+#define CFG_FLASH_WRITE_TOUT (25*CFG_HZ) /* Timeout for Flash Write */ -+ -+/* -+ * Environment is saved in flash at offset 1MB -+ */ -+#define CFG_ENV_IS_IN_FLASH 1 -+#define CFG_FLASH_BASE 0 -+#define CFG_ENV_ADDR ((CFG_FLASH_BASE)+0x100000) /* Addr of Environment Sector */ -+#define CFG_ENV_OFFSET ((CFG_ENV_ADDR)-(CFG_FLASH_BASE)) -+#define CFG_ENV_SIZE PHYS_FLASH_SECT_SIZE /* Total Size of Environment Sector */ -+ -+/* -+ * GPIO settings -+ */ -+#define CFG_GPSR0_VAL 0x00008000 -+#define CFG_GPSR1_VAL 0x00FC0382 -+#define CFG_GPSR2_VAL 0x0001FFFF -+#define CFG_GPCR0_VAL 0x00000000 -+#define CFG_GPCR1_VAL 0x00000000 -+#define CFG_GPCR2_VAL 0x00000000 -+#define CFG_GPDR0_VAL 0x0060A800 -+#define CFG_GPDR1_VAL 0x00FF0382 -+#define CFG_GPDR2_VAL 0x0001C000 -+#define CFG_GAFR0_L_VAL 0x98400000 -+#define CFG_GAFR0_U_VAL 0x00002950 -+#define CFG_GAFR1_L_VAL 0x000A9558 -+#define CFG_GAFR1_U_VAL 0x0005AAAA -+#define CFG_GAFR2_L_VAL 0xA0000000 -+#define CFG_GAFR2_U_VAL 0x00000002 -+ -+#define CFG_PSSR_VAL 0x20 -+ -+/* -+ * PCMCIA and CF Interfaces -+ */ -+#define CFG_MECR_VAL 0x00000000 -+#define CFG_MCMEM0_VAL 0x00010504 -+#define CFG_MCMEM1_VAL 0x00010504 -+#define CFG_MCATT0_VAL 0x00010504 -+#define CFG_MCATT1_VAL 0x00010504 -+#define CFG_MCIO0_VAL 0x00004715 -+#define CFG_MCIO1_VAL 0x00004715 -+ -+#ifndef __ASSEMBLY__ -+ -+extern unsigned long const fbStart ; -+extern unsigned long paletteRegs ; -+ -+#endif /* _ASMLANGUAGE */ -+ -+#endif -+ -diff -u -r --new-file u-boot-1.1.2/include/configs/.cvsignore u-boot-1.1.2-neon/include/configs/.cvsignore ---- u-boot-1.1.2/include/configs/.cvsignore 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/configs/.cvsignore 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1 @@ -+select.h -diff -u -r --new-file u-boot-1.1.2/include/configs/halogen.h u-boot-1.1.2-neon/include/configs/halogen.h ---- u-boot-1.1.2/include/configs/halogen.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/configs/halogen.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,325 @@ -+#ifndef __CONFIG_H -+#define __CONFIG_H -+ -+/* -+ * halogen.h -+ * -+ * This header file declares the configuration constants for the Boundary -+ * Devices Halogen (PXA-270) boards. -+ * -+ * Change History : -+ * -+ * $Log: halogen.h,v $ -+ * Revision 1.6 2005/07/18 01:51:59 tkisky -+ * -define display types -+ * -+ * Revision 1.5 2005/07/17 22:52:10 ericn -+ * -fix comment -+ * -+ * Revision 1.4 2005/07/17 22:36:37 ericn -+ * -merge w/boundaryLib -+ * -+ * Revision 1.3 2005/07/16 16:26:00 ericn -+ * -fix name, memsize -+ * -+ * Revision 1.2 2005/07/10 14:32:45 ericn -+ * -include USB -+ * -+ * Revision 1.1 2005/07/04 16:40:32 ericn -+ * -Initial import -+ * -+ * -+ * 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 -+ * -+ * Copyright Boundary Devices, Inc. 2005 -+ */ -+ -+/* -+ * If we are developing, we might want to start armboot from ram -+ * so we MUST NOT initialize critical regs like mem-timing ... -+ */ -+#include "select.h" -+ -+#define CONFIG_INIT_CRITICAL /* undef for developing */ -+#define CONFIG_SETUP_MEMORY_TAGS 1 -+#define CONFIG_INITRD_TAG 1 -+ -+/* -+ * High Level Configuration Options -+ * (easy to change) -+ */ -+#define CONFIG_PXA270 1 /* This is a PXA270 CPU */ -+#define CONFIG_PXA27X 1 /* Which is a PXA27X */ -+ -+#define PXALCD 1 /* Using the PXA display controller */ -+#define CONFIG_LCD 1 -+ -+#define CONFIG_MMC 1 -+#define BOARD_LATE_INIT 1 -+ -+#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */ -+ -+/* -+ * Size of malloc() pool -+ */ -+#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024) -+#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */ -+#define CFG_MMU_SPACE_RESERVED (1<<14) -+ -+/* -+ * Hardware drivers -+ */ -+#define CONFIG_DRIVER_SMC91111 -+#define CONFIG_SMC91111_BASE 0x10000300 -+#define CONFIG_SMC_USE_32_BIT -+ -+/************************************************************ -+ * USB support -+ ************************************************************/ -+#define LITTLEENDIAN 1 /* Needed by usb_ohci.c */ -+#define CFG_DEVICE_DEREGISTER 1 /* Needed by usb_kbd */ -+#define CONFIG_DOS_PARTITION 1 -+#define CONFIG_USB_OHCI 1 -+#define CONFIG_USB_KEYBOARD 1 -+#define CONFIG_USB_STORAGE 1 -+ -+/* -+ * select serial console configuration -+ */ -+#define CONFIG_FFUART 1 /* we use FFUART on HALOGEN */ -+ -+/* allow to overwrite serial and ethaddr */ -+//#define CONFIG_ENV_OVERWRITE -+ -+#define CONFIG_BAUDRATE 115200 -+ -+#define SKIP_COMMANDS ( CFG_CMD_MISC \ -+ | CFG_CMD_BDI \ -+ | CFG_CMD_BOOTD \ -+ | CFG_CMD_LOADS \ -+ | CFG_CMD_LOADB \ -+ | CFG_CMD_ITEST \ -+ | CFG_CMD_FPGA \ -+ | CFG_CMD_ECHO \ -+ | CFG_CMD_DIAG \ -+ | CFG_CMD_DATE \ -+ | CFG_CMD_BOOTP \ -+ | CFG_CMD_NFS \ -+ ) -+// | CFG_CMD_FLASH -+// | CFG_CMD_DHCP -+// | CFG_CMD_NET -+// | CFG_CMD_MEMORY -+// | CFG_CMD_ENV -+ -+#define CONFIG_COMMANDS ( (CONFIG_CMD_DFL \ -+ | CFG_CMD_MMC \ -+ | CFG_CMD_FAT \ -+ | CFG_CMD_LCDPANEL \ -+ | CFG_CMD_FLASH \ -+ | CFG_CMD_DHCP \ -+ | CFG_CMD_ENV \ -+ | CFG_CMD_USB \ -+ | CFG_CMD_BMP) & ~(SKIP_COMMANDS) ) -+ -+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */ -+#include <cmd_confdefs.h> -+#define CONFIG_BOOTDELAY 3 -+#define CONFIG_BOOTCOMMAND "mmcinit; " \ -+ "fatload mmc 0 a0000000 init.scr ; autoscr a0000000 ; " -+#define CONFIG_BOOTARGS "console=ttyS0,115200 DEBUG=1 ENV=/etc/bashrc init=/linuxrc rw mtdparts=phys:1024k(armboot),256k(params),-(rootfs1) root=/dev/mtdblock3 rootfstype=cramfs" -+#define CONFIG_CMDLINE_TAG -+ -+#define CONFIG_GZIP -+ -+/* -+ * Choose one of the following: -+ * -+ * hitachi_qvga -+ * sharp_qvga -+ * hitachi_hvga -+ * sharp_vga -+ * hitachi_wvga - 7 or 9 inch -+ */ -+#ifndef DA320X240 -+#define DA320X240 0 -+#define DA640X240 1 -+#define DA800X480 2 -+#define DA640X480 3 -+#define DA240X320 4 -+#define DA800X600 5 -+#define DA1024X768 6 -+#define DP480X320 7 -+#define DP320X240 8 -+#define DL122X32 9 -+#endif -+ -+#if DISPLAY_TYPE == DA640X240 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=hitachi_hvga" "\0" -+#elif DISPLAY_TYPE == DA240X320 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=qvga_portrait" "\0" -+#elif DISPLAY_TYPE == DA320X240 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=hitachi_qvga" "\0" -+#elif DISPLAY_TYPE == DA8000X480 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=hitachi_wvga" "\0" -+#elif DISPLAY_TYPE == DA640X480 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=sharp_vga" "\0" -+#elif DISPLAY_TYPE == DA800X480 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=hitachi_wvga" "\0" -+#elif DISPLAY_TYPE == DA1024X768 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=crt1024x768" "\0" -+#else -+#error No display selected -+#endif -+ -+#define LCD_BPP LCD_COLOR8 -+ -+ -+#if (CONFIG_COMMANDS & CFG_CMD_KGDB) -+#define CONFIG_KGDB_BAUDRATE 230400 /* speed to run kgdb serial port */ -+#define CONFIG_KGDB_SER_INDEX 2 /* which serial port to use */ -+#endif -+ -+/* -+ * Miscellaneous configurable options -+ */ -+#define CFG_HUSH_PARSER 1 -+#define CFG_PROMPT_HUSH_PS2 "> " -+ -+#define CFG_LONGHELP /* undef to save memory */ -+#ifdef CFG_HUSH_PARSER -+#define CFG_PROMPT "$ " /* Monitor Command Prompt */ -+#else -+#define CFG_PROMPT "=> " /* Monitor Command Prompt */ -+#endif -+#define CFG_CBSIZE 256 /* Console I/O Buffer Size */ -+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ -+#define CFG_MAXARGS 16 /* max number of command args */ -+#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ -+#define CFG_DEVICE_NULLDEV 1 -+ -+#define CFG_MEMTEST_START 0xa0400000 /* memtest works on */ -+#define CFG_MEMTEST_END 0xa0800000 /* 4 ... 8 MB in DRAM */ -+ -+#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */ -+ -+#define CFG_LOAD_ADDR 0xa0030000 /* default load address */ -+ -+#define CFG_HZ 3686400 /* incrementer freq: 3.6864 MHz */ -+#define CFG_CPUSPEED 0x161 /* set core clock to 400/200/100 MHz */ -+ -+ /* valid baudrates */ -+#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } -+#define CFG_MMC_BASE 0xF0000000 -+ -+/* -+ * Stack sizes -+ * -+ * The stack sizes are set up in start.S using the settings below -+ */ -+#define CONFIG_STACKSIZE (128*1024) /* regular stack */ -+#ifdef CONFIG_USE_IRQ -+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */ -+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */ -+#endif -+ -+/* -+ * Physical Memory Map -+ */ -+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */ -+#define PHYS_SDRAM_1 0xa0000000 /* SDRAM Bank #1 */ -+#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */ -+ -+#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */ -+#define PHYS_FLASH_2 0x04000000 /* Flash Bank #2 */ -+#define PHYS_FLASH_SIZE 0x02000000 /* 32 MB */ -+#define PHYS_FLASH_BANK_SIZE 0x02000000 /* 32 MB Banks */ -+#define PHYS_FLASH_SECT_SIZE 0x00040000 /* 256 KB sectors (x2) */ -+ -+#define CFG_DRAM_BASE 0xa0000000 -+#define CFG_DRAM_SIZE 0x04000000 -+ -+ -+/* -+ * Memory settings -+ */ -+#define CFG_MSC0_VAL 0x23F223F2 -+#define CFG_MSC1_VAL 0x3FF1A441 -+#define CFG_MSC2_VAL 0x7FF97FF1 -+#define CFG_MDCNFG_VAL 0x00001AC9 -+#define CFG_MDREFR_VAL 0x00018018 -+#define CFG_MDMRS_VAL 0x00000000 -+ -+/* -+ * FLASH and environment organization -+ */ -+#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */ -+#define CFG_MAX_FLASH_SECT 128 /* max number of sectors on one chip */ -+ -+/* timeout values are in ticks */ -+#define CFG_FLASH_ERASE_TOUT (25*CFG_HZ) /* Timeout for Flash Erase */ -+#define CFG_FLASH_WRITE_TOUT (25*CFG_HZ) /* Timeout for Flash Write */ -+ -+/* -+ * Environment is saved in flash at offset 1MB -+ */ -+#define CFG_ENV_IS_IN_FLASH 1 -+#define CFG_FLASH_BASE 0 -+#define CFG_ENV_ADDR ((CFG_FLASH_BASE)+0x100000) /* Addr of Environment Sector */ -+#define CFG_ENV_OFFSET ((CFG_ENV_ADDR)-(CFG_FLASH_BASE)) -+#define CFG_ENV_SIZE PHYS_FLASH_SECT_SIZE /* Total Size of Environment Sector */ -+ -+/* -+ * GPIO settings -+ */ -+#define CFG_GPSR0_VAL 0x00008000 -+#define CFG_GPSR1_VAL 0x00FC0382 -+#define CFG_GPSR2_VAL 0x0001FFFF -+#define CFG_GPCR0_VAL 0x00000000 -+#define CFG_GPCR1_VAL 0x00000000 -+#define CFG_GPCR2_VAL 0x00000000 -+#define CFG_GPDR0_VAL 0x0060A800 -+#define CFG_GPDR1_VAL 0x00FF0382 -+#define CFG_GPDR2_VAL 0x0001C000 -+#define CFG_GAFR0_L_VAL 0x98400000 -+#define CFG_GAFR0_U_VAL 0x00002950 -+#define CFG_GAFR1_L_VAL 0x000A9558 -+#define CFG_GAFR1_U_VAL 0x0005AAAA -+#define CFG_GAFR2_L_VAL 0xA0000000 -+#define CFG_GAFR2_U_VAL 0x00000002 -+ -+#define CFG_PSSR_VAL 0x20 -+ -+/* -+ * PCMCIA and CF Interfaces -+ */ -+#define CFG_MECR_VAL 0x00000000 -+#define CFG_MCMEM0_VAL 0x00010504 -+#define CFG_MCMEM1_VAL 0x00010504 -+#define CFG_MCATT0_VAL 0x00010504 -+#define CFG_MCATT1_VAL 0x00010504 -+#define CFG_MCIO0_VAL 0x00004715 -+#define CFG_MCIO1_VAL 0x00004715 -+ -+#ifndef __ASSEMBLY__ -+ -+extern unsigned long const fbStart ; -+extern unsigned long paletteRegs ; -+ -+#endif /* _ASMLANGUAGE */ -+ -+#endif -+ -diff -u -r --new-file u-boot-1.1.2/include/configs/neon.h u-boot-1.1.2-neon/include/configs/neon.h ---- u-boot-1.1.2/include/configs/neon.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/configs/neon.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,395 @@ -+#ifndef __CONFIG_H -+#define __CONFIG_H -+ -+/* -+ * neon.h -+ * -+ * This header file declares the configuration constants for the Boundary -+ * Devices Neon board. -+ * -+ * Change History : -+ * -+ * $Log: neon.h,v $ -+ * Revision 1.27 2006/05/30 15:52:17 ericn -+ * -clear screen after SD wait loop -+ * -+ * Revision 1.26 2006/05/27 22:11:50 ericn -+ * -include 'not', 'sleep' commands, wait for SD, <esc><esc><esc> for prompt -+ * -+ * Revision 1.25 2005/10/22 02:09:31 ericn -+ * -add CONFIG_SUPPORT_VFAT -+ * -+ * Revision 1.24 2005/07/23 19:35:42 ericn -+ * -fix name -+ * -+ * Revision 1.23 2005/07/23 17:13:25 ericn -+ * -add USB support -+ * -+ * Revision 1.22 2005/07/18 01:48:15 tkisky -+ * -define display types -+ * -+ * Revision 1.21 2005/07/17 22:52:10 ericn -+ * -fix comment -+ * -+ * Revision 1.20 2005/07/17 22:36:37 ericn -+ * -merge w/boundaryLib -+ * -+ * Revision 1.19 2005/07/02 18:46:16 ericn -+ * -Neon always has CONFIG_SM501 -+ * -+ * Revision 1.18 2005/07/02 14:57:11 ericn -+ * -include INITRD tag -+ * -+ * Revision 1.17 2005/06/02 04:55:06 ericn -+ * -auto-choose qvga_portrait for DA240X320 -+ * -+ * Revision 1.16 2005/06/02 04:10:30 ericn -+ * -save environment in flash -+ * -+ * Revision 1.15 2005/05/08 22:07:31 ericn -+ * -added 1024x768, 800x480 options -+ * -+ * Revision 1.14 2005/05/05 04:11:53 ericn -+ * -add flash commands, sharp_vga display selector -+ * -+ * Revision 1.13 2005/05/05 03:22:20 ericn -+ * -change default load addr to WinCE's -+ * -+ * Revision 1.12 2005/05/04 04:22:23 ericn -+ * -updated to allow DHCP -+ * -+ * Revision 1.11 2005/05/03 15:28:56 ericn -+ * -include DHCP support -+ * -+ * Revision 1.10 2005/05/02 15:14:26 ericn -+ * -add SMC driver, remove hard-coded MAC -+ * -+ * Revision 1.9 2005/05/01 15:21:41 ericn -+ * -change crtPalette -> paletteRegs -+ * -+ * Revision 1.8 2005/04/28 03:41:23 ericn -+ * -pass RAM qty to Linux -+ * -+ * Revision 1.7 2005/04/28 03:35:32 ericn -+ * -default to cramfs -+ * -+ * Revision 1.6 2005/04/22 01:57:39 ericn -+ * -fix default boot args -+ * -+ * Revision 1.5 2005/04/20 09:05:36 tkisky -+ * -include select.h -+ * -+ * Revision 1.4 2005/04/18 13:49:10 ericn -+ * -default wvga, use init.scr -+ * -+ * Revision 1.3 2005/04/18 03:58:48 ericn -+ * -added autoscr, hush parser support -+ * -+ * Revision 1.2 2005/04/15 10:41:35 tkisky -+ * -remove LCD_XRES,LCD_YRES, remove extra mmcinit -+ * -+ * Revision 1.1 2005/04/09 17:49:25 ericn -+ * -Initial import -+ * -+ * -+ * 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 -+ * -+ * Copyright Boundary Devices, Inc. 2005 -+ */ -+ -+/* -+ * If we are developing, we might want to start armboot from ram -+ * so we MUST NOT initialize critical regs like mem-timing ... -+ */ -+#include "select.h" -+ -+#define CONFIG_INIT_CRITICAL /* undef for developing */ -+#define CONFIG_SETUP_MEMORY_TAGS 1 -+#define CONFIG_INITRD_TAG 1 -+ -+/* -+ * High Level Configuration Options -+ * (easy to change) -+ */ -+#define CONFIG_PXA250 1 /* This is an PXA250 CPU */ -+#define CONFIG_NEON 1 /* on a Neon Board */ -+#define CONFIG_SM501 1 -+#define CONFIG_LCD 1 -+ -+#define CONFIG_MMC 1 -+#define BOARD_LATE_INIT 1 -+ -+#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */ -+ -+/* -+ * Size of malloc() pool -+ */ -+#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024) -+#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */ -+#define CFG_MMU_SPACE_RESERVED (1<<14) -+ -+/* -+ * Hardware drivers -+ */ -+#define CONFIG_DRIVER_SMC91111 -+#define CONFIG_SMC91111_BASE 0x10000300 -+#define CONFIG_SMC_USE_32_BIT -+ -+/************************************************************ -+ * USB support -+ ************************************************************/ -+#define LITTLEENDIAN 1 /* Needed by usb_ohci.c */ -+#define CFG_DEVICE_DEREGISTER 1 /* Needed by usb_kbd */ -+#define CONFIG_DOS_PARTITION 1 -+#define CONFIG_USB_OHCI 1 -+#define CONFIG_USB_KEYBOARD 1 -+#define CONFIG_USB_STORAGE 1 -+ -+/* -+ * select serial console configuration -+ */ -+#define CONFIG_FFUART 1 /* we use FFUART on NEON */ -+ -+/* allow to overwrite serial and ethaddr */ -+//#define CONFIG_ENV_OVERWRITE -+ -+#define CONFIG_BAUDRATE 115200 -+ -+#define SKIP_COMMANDS ( CFG_CMD_BDI \ -+ | CFG_CMD_BOOTD \ -+ | CFG_CMD_LOADS \ -+ | CFG_CMD_LOADB \ -+ | CFG_CMD_ITEST \ -+ | CFG_CMD_FPGA \ -+ | CFG_CMD_ECHO \ -+ | CFG_CMD_DIAG \ -+ | CFG_CMD_DATE \ -+ | CFG_CMD_BOOTP \ -+ | CFG_CMD_NFS \ -+ ) -+// | CFG_CMD_FLASH -+// | CFG_CMD_DHCP -+// | CFG_CMD_NET -+// | CFG_CMD_MEMORY -+// | CFG_CMD_ENV -+ -+#define CONFIG_SUPPORT_VFAT -+#define CONFIG_COMMANDS ( (CONFIG_CMD_DFL \ -+ | CFG_CMD_MMC \ -+ | CFG_CMD_FAT \ -+ | CFG_CMD_LCDPANEL \ -+ | CFG_CMD_FLASH \ -+ | CFG_CMD_DHCP \ -+ | CFG_CMD_ENV \ -+ | CFG_CMD_USB \ -+ | CFG_CMD_NOT \ -+ | CFG_CMD_MISC \ -+ | CFG_CMD_BMP) & ~(SKIP_COMMANDS) ) -+ -+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */ -+#include <cmd_confdefs.h> -+#define CONFIG_BOOTDELAY 3 -+#define CONFIG_BOOTCOMMAND "while not mmcdet ; do cls ; lecho \"insert SD card\" ; sleep 1 ; done ; cls" \ -+ "if mmcwp ; then lecho \"write protected\" ; else lecho \"not write protected\" ; fi ; " \ -+ "mmcinit; " \ -+ "if fatload mmc 0 a0000000 init.scr ; then autoscr a0000000 ; fi" -+#define CONFIG_BOOTARGS "console=ttyS0,115200 DEBUG=1 ENV=/etc/bashrc init=/linuxrc rw mtdparts=phys:1024k(armboot),256k(params),-(rootfs1) root=/dev/mtdblock3 rootfstype=cramfs" -+#define CONFIG_CMDLINE_TAG -+ -+#define CONFIG_GZIP -+ -+#define CONFIG_AUTOBOOT_KEYED /* Enable password protection */ -+#define CONFIG_AUTOBOOT_PROMPT "\nEnter password - autoboot in %d sec...\n" -+#define CONFIG_AUTOBOOT_DELAY_STR "\x1b\x1b\x1b" -+ -+/* -+ * Choose one of the following: -+ * -+ * hitachi_qvga -+ * sharp_qvga -+ * hitachi_hvga -+ * sharp_vga -+ * hitachi_wvga - 7 or 9 inch -+ */ -+#ifndef DA320X240 -+#define DA320X240 0 -+#define DA640X240 1 -+#define DA800X480 2 -+#define DA640X480 3 -+#define DA240X320 4 -+#define DA800X600 5 -+#define DA1024X768 6 -+#define DP480X320 7 -+#define DP320X240 8 -+#define DL122X32 9 -+#endif -+ -+#if DISPLAY_TYPE == DA640X240 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=hitachi_hvga" "\0" -+#elif DISPLAY_TYPE == DA240X320 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=qvga_portrait" "\0" -+#elif DISPLAY_TYPE == DA320X240 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=hitachi_qvga" "\0" -+#elif DISPLAY_TYPE == DA8000X480 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=hitachi_wvga" "\0" -+#elif DISPLAY_TYPE == DA640X480 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=sharp_vga" "\0" -+#elif DISPLAY_TYPE == DA800X480 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=hitachi_wvga" "\0" -+#elif DISPLAY_TYPE == DA1024X768 -+#define CONFIG_EXTRA_ENV_SETTINGS "panel=crt1024x768" "\0" -+#else -+#error No display selected -+#endif -+ -+#define LCD_BPP LCD_COLOR8 -+ -+ -+#if (CONFIG_COMMANDS & CFG_CMD_KGDB) -+#define CONFIG_KGDB_BAUDRATE 230400 /* speed to run kgdb serial port */ -+#define CONFIG_KGDB_SER_INDEX 2 /* which serial port to use */ -+#endif -+ -+/* -+ * Miscellaneous configurable options -+ */ -+#define CFG_HUSH_PARSER 1 -+#define CFG_PROMPT_HUSH_PS2 "> " -+ -+#define CFG_LONGHELP /* undef to save memory */ -+#ifdef CFG_HUSH_PARSER -+#define CFG_PROMPT "$ " /* Monitor Command Prompt */ -+#else -+#define CFG_PROMPT "=> " /* Monitor Command Prompt */ -+#endif -+#define CFG_CBSIZE 256 /* Console I/O Buffer Size */ -+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ -+#define CFG_MAXARGS 16 /* max number of command args */ -+#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ -+#define CFG_DEVICE_NULLDEV 1 -+ -+#define CFG_MEMTEST_START 0xa0400000 /* memtest works on */ -+#define CFG_MEMTEST_END 0xa0800000 /* 4 ... 8 MB in DRAM */ -+ -+#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */ -+ -+#define CFG_LOAD_ADDR 0xa0030000 /* default load address */ -+ -+#define CFG_HZ 3686400 /* incrementer freq: 3.6864 MHz */ -+#define CFG_CPUSPEED 0x161 /* set core clock to 400/200/100 MHz */ -+ -+ /* valid baudrates */ -+#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } -+#define CFG_MMC_BASE 0xF0000000 -+ -+/* -+ * Stack sizes -+ * -+ * The stack sizes are set up in start.S using the settings below -+ */ -+#define CONFIG_STACKSIZE (128*1024) /* regular stack */ -+#ifdef CONFIG_USE_IRQ -+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */ -+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */ -+#endif -+ -+/* -+ * Physical Memory Map -+ */ -+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */ -+#define PHYS_SDRAM_1 0xa0000000 /* SDRAM Bank #1 */ -+#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */ -+ -+#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */ -+#define PHYS_FLASH_2 0x04000000 /* Flash Bank #2 */ -+#define PHYS_FLASH_SIZE 0x02000000 /* 32 MB */ -+#define PHYS_FLASH_BANK_SIZE 0x02000000 /* 32 MB Banks */ -+#define PHYS_FLASH_SECT_SIZE 0x00040000 /* 256 KB sectors (x2) */ -+ -+#define CFG_DRAM_BASE 0xa0000000 -+#define CFG_DRAM_SIZE 0x04000000 -+ -+ -+/* -+ * Memory settings -+ */ -+#define CFG_MSC0_VAL 0x23F223F2 -+#define CFG_MSC1_VAL 0x3FF1A441 -+#define CFG_MSC2_VAL 0x7FF97FF1 -+#define CFG_MDCNFG_VAL 0x00001AC9 -+#define CFG_MDREFR_VAL 0x00018018 -+#define CFG_MDMRS_VAL 0x00000000 -+ -+/* -+ * FLASH and environment organization -+ */ -+#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */ -+#define CFG_MAX_FLASH_SECT 128 /* max number of sectors on one chip */ -+ -+/* timeout values are in ticks */ -+#define CFG_FLASH_ERASE_TOUT (25*CFG_HZ) /* Timeout for Flash Erase */ -+#define CFG_FLASH_WRITE_TOUT (25*CFG_HZ) /* Timeout for Flash Write */ -+ -+/* -+ * Environment is saved in flash at offset 1MB -+ */ -+#define CFG_ENV_IS_IN_FLASH 1 -+#define CFG_FLASH_BASE 0 -+#define CFG_ENV_ADDR ((CFG_FLASH_BASE)+0x100000) /* Addr of Environment Sector */ -+#define CFG_ENV_OFFSET ((CFG_ENV_ADDR)-(CFG_FLASH_BASE)) -+#define CFG_ENV_SIZE PHYS_FLASH_SECT_SIZE /* Total Size of Environment Sector */ -+ -+/* -+ * GPIO settings -+ */ -+#define CFG_GPSR0_VAL 0x00008000 -+#define CFG_GPSR1_VAL 0x00FC0382 -+#define CFG_GPSR2_VAL 0x0001FFFF -+#define CFG_GPCR0_VAL 0x00000000 -+#define CFG_GPCR1_VAL 0x00000000 -+#define CFG_GPCR2_VAL 0x00000000 -+#define CFG_GPDR0_VAL 0x0060A800 -+#define CFG_GPDR1_VAL 0x00FF0382 -+#define CFG_GPDR2_VAL 0x0001C000 -+#define CFG_GAFR0_L_VAL 0x98400000 -+#define CFG_GAFR0_U_VAL 0x00002950 -+#define CFG_GAFR1_L_VAL 0x000A9558 -+#define CFG_GAFR1_U_VAL 0x0005AAAA -+#define CFG_GAFR2_L_VAL 0xA0000000 -+#define CFG_GAFR2_U_VAL 0x00000002 -+ -+#define CFG_PSSR_VAL 0x20 -+ -+/* -+ * PCMCIA and CF Interfaces -+ */ -+#define CFG_MECR_VAL 0x00000000 -+#define CFG_MCMEM0_VAL 0x00010504 -+#define CFG_MCMEM1_VAL 0x00010504 -+#define CFG_MCATT0_VAL 0x00010504 -+#define CFG_MCATT1_VAL 0x00010504 -+#define CFG_MCIO0_VAL 0x00004715 -+#define CFG_MCIO1_VAL 0x00004715 -+ -+#ifndef __ASSEMBLY__ -+ -+extern unsigned long const fbStart ; -+extern unsigned long paletteRegs ; -+ -+#endif /* _ASMLANGUAGE */ -+ -+#endif -+ -diff -u -r --new-file u-boot-1.1.2/include/fat.h u-boot-1.1.2-neon/include/fat.h ---- u-boot-1.1.2/include/fat.h 2004-04-23 22:32:07.000000000 +0200 -+++ u-boot-1.1.2-neon/include/fat.h 2007-08-11 21:07:21.000000000 +0200 -@@ -177,13 +177,13 @@ - - /* Private filesystem parameters */ - typedef struct { -+ __u8 fatbuf[FATBUFSIZE]; /* Current FAT buffer */ - int fatsize; /* Size of FAT in bits */ - __u16 fatlength; /* Length of FAT in sectors */ - __u16 fat_sect; /* Starting sector of the FAT */ - __u16 rootdir_sect; /* Start sector of root directory */ - __u16 clust_size; /* Size of clusters in sectors */ - short data_begin; /* The sector of the first cluster, can be negative */ -- __u8 fatbuf[FATBUFSIZE]; /* Current FAT buffer */ - int fatbufnum; /* Used by get_fatent, init to -1 */ - } fsdata; - -diff -u -r --new-file u-boot-1.1.2/include/lcd.h u-boot-1.1.2-neon/include/lcd.h ---- u-boot-1.1.2/include/lcd.h 2004-10-10 01:26:01.000000000 +0200 -+++ u-boot-1.1.2-neon/include/lcd.h 2007-08-11 21:07:21.000000000 +0200 -@@ -31,7 +31,6 @@ - - extern char lcd_is_enabled; - --extern int lcd_line_length; - extern int lcd_color_fg; - extern int lcd_color_bg; - -@@ -53,6 +52,7 @@ - ushort vl_row; /* Number of rows (i.e. 480) */ - ushort vl_width; /* Width of display area in millimeters */ - ushort vl_height; /* Height of display area in millimeters */ -+ int vl_lcd_line_length; - - /* LCD configuration register */ - u_char vl_clkp; /* Clock polarity */ -@@ -77,7 +77,7 @@ - - extern vidinfo_t panel_info; - --#elif defined CONFIG_PXA250 -+#elif defined( PXALCD ) - /* - * PXA LCD DMA descriptor - */ -@@ -119,6 +119,7 @@ - ushort vl_row; /* Number of rows (i.e. 480) */ - ushort vl_width; /* Width of display area in millimeters */ - ushort vl_height; /* Height of display area in millimeters */ -+ int vl_lcd_line_length; - - /* LCD configuration register */ - u_char vl_clkp; /* Clock polarity */ -@@ -148,7 +149,29 @@ - - extern vidinfo_t panel_info; - --#endif /* CONFIG_MPC823 or CONFIG_PXA250 */ -+#if defined( CONFIG_PXA250 ) -+ #define PALETTEVAL_TYPE u16 -+#elif defined( CONFIG_PXA270 ) -+ #define PALETTEVAL_TYPE u32 -+#else -+#error no processor defined -+#endif -+ -+#elif defined( CONFIG_SM501 ) -+ -+/* -+ * LCD controller stucture for PXA CPU -+ */ -+typedef struct vidinfo { -+ ushort vl_col; /* Number of columns (i.e. 640) */ -+ ushort vl_row; /* Number of rows (i.e. 480) */ -+ int vl_lcd_line_length; -+ u_char vl_bpix; /* Bits per pixel, 0 = 1, 1 = 2, 2 = 4, 3 = 8, 4 = 16 */ -+} vidinfo_t; -+ -+extern vidinfo_t panel_info; -+ -+#endif /* CONFIG_MPC823 */ - - /* Video functions */ - -@@ -272,7 +295,7 @@ - #endif - - #define CONSOLE_COLS (panel_info.vl_col / VIDEO_FONT_WIDTH) --#define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * lcd_line_length) -+#define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * panel_info.vl_lcd_line_length) - #define CONSOLE_ROW_FIRST (lcd_console_address) - #define CONSOLE_ROW_SECOND (lcd_console_address + CONSOLE_ROW_SIZE) - #define CONSOLE_ROW_LAST (lcd_console_address + CONSOLE_SIZE \ -diff -u -r --new-file u-boot-1.1.2/include/lcd_panels.h u-boot-1.1.2-neon/include/lcd_panels.h ---- u-boot-1.1.2/include/lcd_panels.h 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/include/lcd_panels.h 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,83 @@ -+#ifndef __LCD_PANELS_H__ -+#define __LCD_PANELS_H__ "$Id: lcd_panels.h,v 1.3 2005/06/02 04:03:37 ericn Exp $" -+ -+/* -+ * lcd_panels.h -+ * -+ * This header file declares the lcd_panel_info_t -+ * data type and the num_lcd_panels and lcd_panels -+ * constants for use in initializing a variety of displays. -+ * -+ * Note that this is based on the pxafb_mach_info structure -+ * in linux-2.4.19/drivers/video/pxafb.h (Nico's patches), -+ * but differs in a couple of respects: -+ * -+ * Doesn't support the color-mapping stuff -+ * Includes an 'active' flag -+ * -+ * Doesn't include the lccr0 and lccr3 fields, since most of -+ * the fields in those registers are display controller options, -+ * not panel options, and the others (so far) can have reasonable -+ * defaults. When (if) we need to support a non-standard display, -+ * we can fill in the blanks with defaults in the previously -+ * supported displays and compute lccr0 and lccr3. -+ * -+ * Change History : -+ * -+ * $Log: lcd_panels.h,v $ -+ * Revision 1.3 2005/06/02 04:03:37 ericn -+ * -added rotation field -+ * -+ * Revision 1.2 2005/04/30 20:33:36 ericn -+ * -added CRT support -+ * -+ * Revision 1.1 2005/04/09 17:49:18 ericn -+ * -Initial import -+ * -+ * -+ * Copyright Boundary Devices, Inc. 2005 -+ */ -+ -+struct lcd_panel_info_t { -+ char const *name ; -+ unsigned long pixclock; -+ -+ unsigned short xres; -+ unsigned short yres; -+ -+ unsigned act_high ; // clock is active high -+ unsigned hsync_len; -+ unsigned left_margin; -+ unsigned right_margin; -+ unsigned vsync_len; -+ unsigned upper_margin; -+ unsigned lower_margin; -+ unsigned active ; // active matrix (TFT) LCD -+ unsigned crt ; // 1 == CRT, not LCD -+ unsigned rotation ; -+}; -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+extern unsigned const num_lcd_panels ; -+extern struct lcd_panel_info_t const * const lcd_panels ; -+ -+extern struct lcd_panel_info_t const *find_lcd_panel( char const * name ); -+ -+ -+// -+// Each platform needs to define this routine, and -+// set cur_lcd_panel within -+// -+void set_lcd_panel( struct lcd_panel_info_t const *panel ); -+extern struct lcd_panel_info_t const *cur_lcd_panel ; -+void disable_lcd_panel( void ); -+ -+#ifdef __CPLUSPLUS -+}; -+#endif -+ -+#endif -+ -diff -u -r --new-file u-boot-1.1.2/include/part.h u-boot-1.1.2-neon/include/part.h ---- u-boot-1.1.2/include/part.h 2004-04-18 19:39:40.000000000 +0200 -+++ u-boot-1.1.2-neon/include/part.h 2007-08-11 21:07:21.000000000 +0200 -@@ -24,6 +24,48 @@ - #define _PART_H - #include <ide.h> - -+enum { -+/* These three have identical behaviour; use the second one if DOS fdisk gets -+ confused about extended/logical partitions starting past cylinder 1023. */ -+ DOS_EXTENDED_PARTITION = 5, -+ LINUX_EXTENDED_PARTITION = 0x85, -+ WIN98_EXTENDED_PARTITION = 0x0f, -+ -+ LINUX_SWAP_PARTITION = 0x82, -+ LINUX_RAID_PARTITION = 0xfd, /* autodetect RAID partition */ -+ -+ SOLARIS_X86_PARTITION = LINUX_SWAP_PARTITION, -+ -+ DM6_PARTITION = 0x54, /* has DDO: use xlated geom & offset */ -+ EZD_PARTITION = 0x55, /* EZ-DRIVE */ -+ DM6_AUX1PARTITION = 0x51, /* no DDO: use xlated geom */ -+ DM6_AUX3PARTITION = 0x53, /* no DDO: use xlated geom */ -+ -+ FREEBSD_PARTITION = 0xa5, /* FreeBSD Partition ID */ -+ OPENBSD_PARTITION = 0xa6, /* OpenBSD Partition ID */ -+ NETBSD_PARTITION = 0xa9, /* NetBSD Partition ID */ -+ BSDI_PARTITION = 0xb7, /* BSDI Partition ID */ -+/* Ours is not to wonder why.. */ -+ BSD_PARTITION = FREEBSD_PARTITION, -+ MINIX_PARTITION = 0x81, /* Minix Partition ID */ -+ PLAN9_PARTITION = 0x39, /* Plan 9 Partition ID */ -+ UNIXWARE_PARTITION = 0x63, /* Partition ID, same as */ -+ /* GNU_HURD and SCO Unix */ -+}; -+ -+struct partition { -+ unsigned char boot_ind; /* 0x80 - active */ -+ unsigned char head; /* starting head */ -+ unsigned char sector; /* starting sector */ -+ unsigned char cyl; /* starting cylinder */ -+ unsigned char sys_ind; /* What partition type */ -+ unsigned char end_head; /* end head */ -+ unsigned char end_sector; /* end sector */ -+ unsigned char end_cyl; /* end cylinder */ -+ unsigned int start_sect; /* starting sector counting from 0 */ -+ unsigned int nr_sects; /* nr of sectors in partition */ -+} __attribute__((packed)); -+ - typedef struct block_dev_desc { - int if_type; /* type of the interface */ - int dev; /* device number */ -@@ -118,4 +160,15 @@ - int test_part_amiga (block_dev_desc_t *dev_desc); - #endif - -+/* Value returned by `fnmatch' if STRING does not match PATTERN. */ -+#define FNM_NOMATCH 1 -+ -+/* Bits set in the FLAGS argument to `fnmatch'. */ -+#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */ -+#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */ -+#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */ -+#define FNM_NOSYS (-1) -+ -+int fnmatch(const char *pattern, const char *string, int flags); -+ - #endif /* _PART_H */ -diff -u -r --new-file u-boot-1.1.2/lib_arm/armlinux.c u-boot-1.1.2-neon/lib_arm/armlinux.c ---- u-boot-1.1.2/lib_arm/armlinux.c 2004-10-10 01:26:01.000000000 +0200 -+++ u-boot-1.1.2-neon/lib_arm/armlinux.c 2007-08-11 21:07:21.000000000 +0200 -@@ -29,6 +29,7 @@ - #ifdef CONFIG_HAS_DATAFLASH - #include <dataflash.h> - #endif -+#include "lcd_panels.h" - - /*cmd_boot.c*/ - extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -@@ -88,6 +89,16 @@ - - #ifdef CONFIG_CMDLINE_TAG - char *commandline = getenv ("bootargs"); -+ if( ( 0 != cur_lcd_panel ) && ( 0 != cur_lcd_panel->rotation ) ) -+ { -+ char temp[80]; -+ int addedLen = sprintf( temp, " fbrotation=%u", cur_lcd_panel->rotation ); -+ unsigned cmdLen = strlen( commandline ); -+ char *bigger = (char *)malloc( cmdLen + addedLen + 1 ); -+ strcpy( bigger, commandline ); -+ strcpy( bigger+cmdLen, temp ); -+ commandline = bigger ; -+ } - #endif - - theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep); -@@ -365,6 +376,7 @@ - * We only use it to pass the address and size, the other entries - * in the tag_videolfb are not of interest. - */ -+#ifdef VESA_DISPLAY - params->hdr.tag = ATAG_VIDEOLFB; - params->hdr.size = tag_size (tag_videolfb); - -@@ -374,6 +386,7 @@ - params->u.videolfb.lfb_size = calc_fbsize(); - - params = tag_next (params); -+#endif - } - #endif /* CONFIG_VFD || CONFIG_LCD */ - -diff -u -r --new-file u-boot-1.1.2/lib_arm/board.c u-boot-1.1.2-neon/lib_arm/board.c ---- u-boot-1.1.2/lib_arm/board.c 2004-08-02 00:48:22.000000000 +0200 -+++ u-boot-1.1.2-neon/lib_arm/board.c 2007-08-11 21:07:21.000000000 +0200 -@@ -216,7 +216,10 @@ - #endif - - /* Pointer is writable since we allocated a register for it */ -- gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); -+#ifndef CFG_MMU_SPACE_RESERVED -+#define CFG_MMU_SPACE_RESERVED 0 -+#endif -+ gd = (gd_t*)(_armboot_start - CFG_MMU_SPACE_RESERVED - CFG_MALLOC_LEN - sizeof(gd_t)); - /* compiler optimization barrier needed for GCC >= 3.4 */ - __asm__ __volatile__("": : :"memory"); - -@@ -263,7 +266,7 @@ - #endif /* CONFIG_LCD */ - - /* armboot_start is defined in the board-specific linker script */ -- mem_malloc_init (_armboot_start - CFG_MALLOC_LEN); -+ mem_malloc_init (_armboot_start - CFG_MMU_SPACE_RESERVED - CFG_MALLOC_LEN); - - #if (CONFIG_COMMANDS & CFG_CMD_NAND) - puts ("NAND:"); -diff -u -r --new-file u-boot-1.1.2/make_all u-boot-1.1.2-neon/make_all ---- u-boot-1.1.2/make_all 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/make_all 2007-08-11 21:07:21.000000000 +0200 -@@ -0,0 +1,31 @@ -+#!/bin/sh -+halogen1_clock="416" -+halogen2_clock="416" -+bd2003_clock="400" -+neon_clock="400" -+neonb_clock="400" -+ -+SOFTWARE="LINUX" -+ -+targets="halogen1 halogen2 bd2003 neon neonb" -+for suff in $targets ; do -+ make distclean ; -+ REV="" -+ PLATFORM="$suff" -+ if [ $suff = "halogen1" ] ; then REV="1\n"; PLATFORM="halogen" -+ else -+ if [ $suff = "halogen2" ] ; then REV="2\n"; PLATFORM="halogen" -+ fi -+ fi -+ eval clock=\$$suff"_clock" -+ echo -e "DA640X240\n$REV$SOFTWARE\ny\n$clock\n" | make $PLATFORM"_config" ; -+ make u-boot.bin ; -+ mv u-boot.bin u-boot-$suff -+done -+ -+ -+for suff in $targets ; do -+ mv u-boot-$suff u-boot-$suff.bin -+done -+ -+zip u-boot-binaries.zip u-boot-*.bin -diff -u -r --new-file u-boot-1.1.2/Makefile u-boot-1.1.2-neon/Makefile ---- u-boot-1.1.2/Makefile 2004-12-19 10:58:11.000000000 +0100 -+++ u-boot-1.1.2-neon/Makefile 2007-08-11 21:17:14.000000000 +0200 -@@ -57,7 +57,7 @@ - CROSS_COMPILE = ppc_8xx- - endif - ifeq ($(ARCH),arm) --CROSS_COMPILE = arm-linux- -+CROSS_COMPILE = arm-elf- - endif - ifeq ($(ARCH),i386) - ifeq ($(HOSTARCH),i386) -@@ -89,6 +89,9 @@ - ######################################################################### - # U-Boot objects....order is important (i.e. start must be first) - -+ifeq ($(CPU),pxa) -+OBJS = -+else - OBJS = cpu/$(CPU)/start.o - ifeq ($(CPU),i386) - OBJS += cpu/$(CPU)/start16.o -@@ -100,6 +103,7 @@ - ifeq ($(CPU),mpc85xx) - OBJS += cpu/$(CPU)/resetvec.o - endif -+endif - - LIBS = lib_generic/libgeneric.a - LIBS += board/$(BOARDDIR)/lib$(BOARD).a -@@ -121,7 +125,8 @@ - .PHONY : $(LIBS) - - # Add GCC lib --PLATFORM_LIBS += --no-warn-mismatch -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc -+LIBGCC_DIRNAME := $(shell dirname "`$(CC) $(CFLAGS) -print-libgcc-file-name`") -+PLATFORM_LIBS += --no-warn-mismatch -L "$(LIBGCC_DIRNAME)" -lgcc - - - # The "tools" are needed early, so put this first -@@ -129,13 +134,14 @@ - SUBDIRS = tools \ - examples \ - post \ -- post/cpu -+ post/cpu \ -+ cpu/$(CPU) - .PHONY : $(SUBDIRS) - - ######################################################################### - ######################################################################### - --ALL = u-boot.srec u-boot.bin System.map -+ALL = u-boot.srec u-boot.bin System.map init.scr upgrade.scr - - all: $(ALL) - -@@ -192,6 +198,12 @@ - grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \ - sort > System.map - -+init.scr: board/$(BOARDDIR)/init.script -+ tools/mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "autoscript" -d $< $@ -+ -+upgrade.scr: upgrade.script -+ tools/mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "U-Boot upgrade script" -d $< $@ -+ - ######################################################################### - else - all install u-boot u-boot.srec depend dep: -@@ -203,6 +215,7 @@ - - unconfig: - @rm -f include/config.h include/config.mk board/*/config.tmp -+ @rm -f select.mk include/configs/select.h - - #======================================================================== - # PowerPC -@@ -1388,6 +1401,22 @@ - wepep250_config : unconfig - @./mkconfig $(@:_config=) arm pxa wepep250 - -+bd-neon_config : unconfig -+ @./mkconfig $(@:_config=) arm pxa neon -+ ./Configure --PLATFORM_TYPE=NEON -+ -+neonb_config : unconfig -+ @./mkconfig neon arm pxa neon -+ ./Configure --PLATFORM_TYPE=NEONB --SOFTWARE_TYPE=WINCE --DISPLAY_TYPE=DA640X240 -+ -+bd2003_config : unconfig -+ @./mkconfig $(@:_config=) arm pxa bd2003 -+ ./Configure --PLATFORM_TYPE=BD2003 -+ -+halogen_config : unconfig -+ @./mkconfig $(@:_config=) arm pxa halogen -+ ./Configure --PLATFORM_TYPE=HALOGEN -+ - xaeniax_config : unconfig - @./mkconfig $(@:_config=) arm pxa xaeniax - -@@ -1558,10 +1587,16 @@ - ######################################################################### - ######################################################################### - -+ifeq ($(HOSTOS),cygwin) -+FIND = /bin/find -+else -+FIND = find -+endif -+ - clean: -- find . -type f \ -+ $(FIND) . -type f \ - \( -name 'core' -o -name '*.bak' -o -name '*~' \ -- -o -name '*.o' -o -name '*.a' \) -print \ -+ -o -name '*.o' -o -name '*.a' -o -name '*.lst' \) -print \ - | xargs rm -f - rm -f examples/hello_world examples/timer \ - examples/eepro100_eeprom examples/sched \ -@@ -1575,7 +1610,7 @@ - rm -f board/trab/trab_fkt - - clobber: clean -- find . -type f \( -name .depend \ -+ $(FIND) . -type f \( -name .depend \ - -o -name '*.srec' -o -name '*.bin' -o -name u-boot.img \) \ - -print0 \ - | xargs -0 rm -f -@@ -1585,6 +1620,8 @@ - rm -f tools/crc32.c tools/environment.c tools/env/crc32.c - rm -f tools/inca-swap-bytes cpu/mpc824x/bedbug_603e.c - rm -f include/asm/proc include/asm/arch include/asm -+ cd tools && rm -f *.exe -+ rm -f include/configs/select.h select.mk select.log - - mrproper \ - distclean: clobber unconfig -diff -u -r --new-file u-boot-1.1.2/patches/arm_flags.patch u-boot-1.1.2-neon/patches/arm_flags.patch ---- u-boot-1.1.2/patches/arm_flags.patch 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/patches/arm_flags.patch 2007-08-11 21:01:36.000000000 +0200 -@@ -0,0 +1,15 @@ -+ -+# -+# Patch managed by http://www.holgerschurig.de/patcher.html -+# -+ -+--- u-boot-1.1.2/cpu/pxa/config.mk~armflags -++++ u-boot-1.1.2/cpu/pxa/config.mk -+@@ -23,6 +23,6 @@ -+ # -+ -+ PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \ -+- -mshort-load-bytes -msoft-float -++ -msoft-float -+ -+ PLATFORM_CPPFLAGS += -mapcs-32 -march=armv4 -mtune=strongarm1100 -diff -u -r --new-file u-boot-1.1.2/README u-boot-1.1.2-neon/README ---- u-boot-1.1.2/README 2004-12-16 22:44:03.000000000 +0100 -+++ u-boot-1.1.2-neon/README 2007-08-11 21:07:19.000000000 +0200 -@@ -608,6 +608,7 @@ - CFG_CMD_ITEST Integer/string test of 2 values - CFG_CMD_JFFS2 * JFFS2 Support - CFG_CMD_KGDB * kgdb -+ CFG_CMD_LCDPANEL * Dynamic LCD Panel support - CFG_CMD_LOADB loadb - CFG_CMD_LOADS loads - CFG_CMD_MEMORY md, mm, nm, mw, cp, cmp, crc, base, -@@ -812,6 +813,9 @@ - for differential drivers: 0x00001000 - for single ended drivers: 0x00005000 - -+- Dynamic LCD Panel support -+ Allows the choice of an LCD panel through the environment. -+ Also allows prompting for panel characteristics. - - - MMC Support: - The MMC controller on the Intel PXA is supported. To -diff -u -r --new-file u-boot-1.1.2/tools/mkimage.c u-boot-1.1.2-neon/tools/mkimage.c ---- u-boot-1.1.2/tools/mkimage.c 2004-11-21 01:06:36.000000000 +0100 -+++ u-boot-1.1.2-neon/tools/mkimage.c 2007-08-11 21:07:22.000000000 +0200 -@@ -618,10 +618,10 @@ - printf ("Image Name: %.*s\n", IH_NMLEN, hdr->ih_name); - printf ("Created: %s", ctime(×tamp)); - printf ("Image Type: "); print_type(hdr); -- printf ("Data Size: %d Bytes = %.2f kB = %.2f MB\n", -+ printf ("Data Size: %ld Bytes = %.2f kB = %.2f MB\n", - size, (double)size / 1.024e3, (double)size / 1.048576e6 ); -- printf ("Load Address: 0x%08X\n", ntohl(hdr->ih_load)); -- printf ("Entry Point: 0x%08X\n", ntohl(hdr->ih_ep)); -+ printf ("Load Address: 0x%08lX\n", ntohl(hdr->ih_load)); -+ printf ("Entry Point: 0x%08lX\n", ntohl(hdr->ih_ep)); - - if (hdr->ih_type == IH_TYPE_MULTI || hdr->ih_type == IH_TYPE_SCRIPT) { - int i, ptrs; -@@ -640,7 +640,7 @@ - for (i=0; len_ptr[i]; ++i) { - size = ntohl(len_ptr[i]); - -- printf (" Image %d: %8d Bytes = %4d kB = %d MB\n", -+ printf (" Image %d: %8ld Bytes = %4ld kB = %ld MB\n", - i, size, size>>10, size>>20); - if (hdr->ih_type == IH_TYPE_SCRIPT && i > 0) { - /* -@@ -648,7 +648,7 @@ - * if planning to do something with - * multiple files - */ -- printf (" Offset = %08X\n", pos); -+ printf (" Offset = %08lX\n", pos); - } - /* copy_file() will pad the first files to even word align */ - size += 3; -diff -u -r --new-file u-boot-1.1.2/upgrade.script u-boot-1.1.2-neon/upgrade.script ---- u-boot-1.1.2/upgrade.script 1970-01-01 01:00:00.000000000 +0100 -+++ u-boot-1.1.2-neon/upgrade.script 2007-08-11 21:07:22.000000000 +0200 -@@ -0,0 +1,32 @@ -+lecho "---------> upgrade to newest U-Boot" -+echo "---------> upgrade to newest U-Boot" -+if fatload mmc 0 a0008000 u-boot-*.bin ; then -+ if cmp.b 0 a0008000 $filesize ; then -+ fatload mmc 0 a0008000 *.bmp -+ bmp display a0008000 -+ lecho 'Already upgraded. Latest U-Boot is installed' ; -+ echo 'Already upgraded. Latest U-Boot is installed' ; -+ if mmcwp ; then -+ lecho "write protected" ; -+ else -+ lecho "not write protected" ; -+ fi -+ else -+ lecho 'Old U-Boot found. Upgrading' ; -+ echo 'Old U-Boot found. Upgrading' ; -+ protect off all ; -+ lecho 'Erasing' ; -+ echo 'Erasing' ; -+ erase 0 3FFFF ; -+ lecho 'Programming' ; -+ echo 'Programming' ; -+ cp.b a0008000 0 $filesize ; -+ lecho 'Done programming. Cycle power' ; -+ echo 'Done programming. Cycle power' ; -+ fi -+else -+ lecho 'Error loading new U-Boot from SD card' -+ echo 'Error loading new U-Boot from SD card' -+ lecho 'Should have u-boot-neon-something.bin' -+ echo 'Should have u-boot-neon-something.bin' -+fi -\ No newline at end of file diff --git a/packages/u-boot/u-boot-1.1.2/u-boot-emetec.patch b/packages/u-boot/u-boot-1.1.2/u-boot-emetec.patch deleted file mode 100644 index ab3f106e71..0000000000 --- a/packages/u-boot/u-boot-1.1.2/u-boot-emetec.patch +++ /dev/null @@ -1,2170 +0,0 @@ -diff -uNr u-boot-1.1.2/.pc/.version u-boot-emetec-1.1.2/.pc/.version
---- u-boot-1.1.2/.pc/.version 2007-04-20 00:01:06.000000000 +0300
-+++ u-boot-emetec-1.1.2/.pc/.version 1970-01-01 02:00:00.000000000 +0200
-@@ -1 +0,0 @@
--2
-diff -uNr u-boot-1.1.2/.pc/applied-patches u-boot-emetec-1.1.2/.pc/applied-patches
---- u-boot-1.1.2/.pc/applied-patches 2007-04-20 00:01:06.000000000 +0300
-+++ u-boot-emetec-1.1.2/.pc/applied-patches 1970-01-01 02:00:00.000000000 +0200
-@@ -1 +0,0 @@
--arm_flags.patch
-diff -uNr u-boot-1.1.2/.pc/arm_flags.patch/cpu/pxa/config.mk u-boot-emetec-1.1.2/.pc/arm_flags.patch/cpu/pxa/config.mk
---- u-boot-1.1.2/.pc/arm_flags.patch/cpu/pxa/config.mk 2003-05-23 15:36:21.000000000 +0300
-+++ u-boot-emetec-1.1.2/.pc/arm_flags.patch/cpu/pxa/config.mk 1970-01-01 02:00:00.000000000 +0200
-@@ -1,28 +0,0 @@
--#
--# (C) Copyright 2002
--# Sysgo Real-Time Solutions, GmbH <www.elinos.com>
--# Marius Groeger <mgroeger@sysgo.de>
--#
--# See file CREDITS for list of people who contributed to this
--# project.
--#
--# This program is free software; you can redistribute it and/or
--# modify it under the terms of the GNU General Public License as
--# published by the Free Software Foundation; either version 2 of
--# the License, or (at your option) any later version.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, write to the Free Software
--# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
--# MA 02111-1307 USA
--#
--
--PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \
-- -mshort-load-bytes -msoft-float
--
--PLATFORM_CPPFLAGS += -mapcs-32 -march=armv4 -mtune=strongarm1100
-diff -uNr u-boot-1.1.2/MAKEALL u-boot-emetec-1.1.2/MAKEALL
---- u-boot-1.1.2/MAKEALL 2004-12-31 11:32:48.000000000 +0200
-+++ u-boot-emetec-1.1.2/MAKEALL 2005-03-11 22:23:47.000000000 +0200
-@@ -69,7 +69,7 @@
- ml300 OCOTEA OCRTC ORSG \
- PCI405 PIP405 PLU405 PMC405 \
- PPChameleonEVB VOH405 W7OLMC W7OLMG \
-- WALNUT405 WUH405 XPEDITE1K \
-+ WALNUT405 WUH405 XPEDITE1K EMETEC405 \
- "
-
- #########################################################################
-diff -uNr u-boot-1.1.2/Makefile u-boot-emetec-1.1.2/Makefile
---- u-boot-1.1.2/Makefile 2004-12-19 11:58:11.000000000 +0200
-+++ u-boot-emetec-1.1.2/Makefile 2005-03-14 22:43:56.000000000 +0200
-@@ -54,7 +54,7 @@
- CROSS_COMPILE =
- else
- ifeq ($(ARCH),ppc)
--CROSS_COMPILE = ppc_8xx-
-+CROSS_COMPILE = ppc_4xx-
- endif
- ifeq ($(ARCH),arm)
- CROSS_COMPILE = arm-linux-
-@@ -127,7 +127,6 @@
- # The "tools" are needed early, so put this first
- # Don't include stuff already done in $(LIBS)
- SUBDIRS = tools \
-- examples \
- post \
- post/cpu
- .PHONY : $(SUBDIRS)
-@@ -838,6 +837,9 @@
-
- VOM405_config: unconfig
- @./mkconfig $(@:_config=) ppc ppc4xx vom405 esd
-+
-+EMETEC405_config: unconfig
-+ @./mkconfig $(@:_config=) ppc ppc4xx emetec405
-
- W7OLMC_config \
- W7OLMG_config: unconfig
-diff -uNr u-boot-1.1.2/board/emetec405/Makefile u-boot-emetec-1.1.2/board/emetec405/Makefile
---- u-boot-1.1.2/board/emetec405/Makefile 1970-01-01 02:00:00.000000000 +0200
-+++ u-boot-emetec-1.1.2/board/emetec405/Makefile 2005-04-26 22:34:53.000000000 +0300
-@@ -0,0 +1,46 @@
-+#
-+# (C) Copyright 2000
-+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
-+#
-+# See file CREDITS for list of people who contributed to this
-+# project.
-+#
-+# This program is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU General Public License as
-+# published by the Free Software Foundation; either version 2 of
-+# the License, or (at your option) any later version.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, write to the Free Software
-+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+# MA 02111-1307 USA
-+#
-+
-+include $(TOPDIR)/config.mk
-+
-+LIB = lib$(BOARD).a
-+
-+OBJS = $(BOARD).o flash.o
-+
-+$(LIB): $(OBJS) $(SOBJS)
-+ $(AR) crv $@ $(OBJS)
-+
-+clean:
-+ rm -f $(SOBJS) $(OBJS)
-+
-+distclean: clean
-+ rm -f $(LIB) core *.bak .depend
-+
-+#########################################################################
-+
-+.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
-+ $(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
-+
-+sinclude .depend
-+
-+#########################################################################
-diff -uNr u-boot-1.1.2/board/emetec405/config.mk u-boot-emetec-1.1.2/board/emetec405/config.mk
---- u-boot-1.1.2/board/emetec405/config.mk 1970-01-01 02:00:00.000000000 +0200
-+++ u-boot-emetec-1.1.2/board/emetec405/config.mk 2005-03-11 22:26:43.000000000 +0200
-@@ -0,0 +1,28 @@
-+#
-+# (C) Copyright 2000
-+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
-+#
-+# See file CREDITS for list of people who contributed to this
-+# project.
-+#
-+# This program is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU General Public License as
-+# published by the Free Software Foundation; either version 2 of
-+# the License, or (at your option) any later version.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, write to the Free Software
-+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+# MA 02111-1307 USA
-+#
-+
-+#
-+# emetec EMETEC405 boards
-+#
-+
-+TEXT_BASE = 0xFFFC0000
-diff -uNr u-boot-1.1.2/board/emetec405/emetec405.c u-boot-emetec-1.1.2/board/emetec405/emetec405.c
---- u-boot-1.1.2/board/emetec405/emetec405.c 1970-01-01 02:00:00.000000000 +0200
-+++ u-boot-emetec-1.1.2/board/emetec405/emetec405.c 2005-04-26 23:02:01.000000000 +0300
-@@ -0,0 +1,106 @@
-+/*
-+ * (C) Copyright 2001-2003
-+ * Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+#include <common.h>
-+#include <asm/processor.h>
-+#include <command.h>
-+#include <malloc.h>
-+
-+
-+int board_early_init_f (void)
-+{
-+ /*-------------------------------------------------------------------------+
-+ | Interrupt controller setup for the Walnut board.
-+ | Note: IRQ 0-15 405GP internally generated; active high; level sensitive
-+ | IRQ 16 405GP internally generated; active low; level sensitive
-+ | IRQ 17-24 RESERVED
-+ | IRQ 25 (EXT IRQ 0) FPGA; active high; level sensitive
-+ | IRQ 26 (EXT IRQ 1) SMI; active high; level sensitive
-+ | IRQ 27 (EXT IRQ 2) Not Used
-+ | IRQ 28 (EXT IRQ 3) PCI SLOT 3; active low; level sensitive
-+ | IRQ 29 (EXT IRQ 4) PCI SLOT 2; active low; level sensitive
-+ | IRQ 30 (EXT IRQ 5) PCI SLOT 1; active low; level sensitive
-+ | IRQ 31 (EXT IRQ 6) PCI SLOT 0; active low; level sensitive
-+ | Note for Walnut board:
-+ | An interrupt taken for the FPGA (IRQ 25) indicates that either
-+ | the Mouse, Keyboard, IRDA, or External Expansion caused the
-+ | interrupt. The FPGA must be read to determine which device
-+ | caused the interrupt. The default setting of the FPGA clears
-+ |
-+ +-------------------------------------------------------------------------*/
-+
-+ mtdcr (uicsr, 0xFFFFFFFF); /* clear all ints */
-+ mtdcr (uicer, 0x00000000); /* disable all ints */
-+ mtdcr (uiccr, 0x00000000); /* set all to be non-critical */
-+ mtdcr (uicpr, 0xFFFFFFE0); /* set int polarities */
-+ mtdcr (uictr, 0x10000000); /* set int trigger levels */
-+ mtdcr (uicvcr, 0x00000001); /* set vect base=0,INT0 highest priority */
-+ mtdcr (uicsr, 0xFFFFFFFF); /* clear all ints */
-+
-+ return 0;
-+}
-+
-+
-+int misc_init_f (void)
-+{
-+ return 0; /* dummy implementation */
-+}
-+
-+
-+int misc_init_r (void)
-+{
-+ return 0; /* dummy implementation */
-+}
-+
-+
-+/*
-+ * Check Board Identity:
-+ */
-+int checkboard (void)
-+{
-+ unsigned char str[64];
-+
-+ puts ("Board: MAGICBOX\n");
-+
-+ return 0;
-+}
-+
-+
-+long int initdram (int board_type)
-+{
-+ unsigned long val;
-+
-+ mtdcr(memcfga, mem_mb0cf);
-+ val = mfdcr(memcfgd);
-+
-+ return (4*1024*1024 << ((val & 0x000e0000) >> 17));
-+}
-+
-+
-+int testdram (void)
-+{
-+ printf ("test: 32 MB - ok\n");
-+
-+ return (0);
-+}
-+
-diff -uNr u-boot-1.1.2/board/emetec405/flash.c u-boot-emetec-1.1.2/board/emetec405/flash.c
---- u-boot-1.1.2/board/emetec405/flash.c 1970-01-01 02:00:00.000000000 +0200
-+++ u-boot-emetec-1.1.2/board/emetec405/flash.c 2005-05-25 10:14:13.000000000 +0300
-@@ -0,0 +1,544 @@
-+/*
-+ * (C) Copyright 2000
-+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+#include <common.h>
-+#include <ppc4xx.h>
-+#include <asm/processor.h>
-+
-+flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
-+
-+/*-----------------------------------------------------------------------
-+ * Functions
-+ */
-+static ulong flash_get_size (vu_long * addr, flash_info_t * info);
-+static void flash_get_offsets (ulong base, flash_info_t * info);
-+
-+/*-----------------------------------------------------------------------
-+ */
-+unsigned long flash_init (void)
-+{
-+ unsigned long size_b0;
-+ int i;
-+ uint pbcr;
-+ unsigned long base_b0;
-+ int size_val = 0;
-+
-+ /* Init: no FLASHes known */
-+ for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) {
-+ flash_info[i].flash_id = FLASH_UNKNOWN;
-+ }
-+
-+ /* Static FLASH Bank configuration here - FIXME XXX */
-+
-+ size_b0 = flash_get_size((vu_long *)FLASH_BASE0_PRELIM, &flash_info[0]);
-+
-+ if (flash_info[0].flash_id == FLASH_UNKNOWN) {
-+ printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n",
-+ size_b0, size_b0<<20);
-+ }
-+
-+ /* Setup offsets */
-+ flash_get_offsets (-size_b0, &flash_info[0]);
-+
-+ /* Re-do sizing to get full correct info */
-+ mtdcr(ebccfga, pb0cr);
-+ pbcr = mfdcr(ebccfgd);
-+ mtdcr(ebccfga, pb0cr);
-+ base_b0 = -size_b0;
-+ switch (size_b0) {
-+ case 1 << 20:
-+ size_val = 0;
-+ break;
-+ case 2 << 20:
-+ size_val = 1;
-+ break;
-+ case 4 << 20:
-+ size_val = 2;
-+ break;
-+ case 8 << 20:
-+ size_val = 3;
-+ break;
-+ case 16 << 20:
-+ size_val = 4;
-+ break;
-+ }
-+ pbcr = (pbcr & 0x0001ffff) | base_b0 | (size_val << 17);
-+ mtdcr(ebccfgd, pbcr);
-+
-+ /* Monitor protection ON by default */
-+ (void)flash_protect(FLAG_PROTECT_SET,
-+ -CFG_MONITOR_LEN,
-+ 0xffffffff,
-+ &flash_info[0]);
-+
-+ flash_info[0].size = size_b0;
-+
-+ return (size_b0);
-+}
-+
-+/*-----------------------------------------------------------------------
-+ */
-+static void flash_get_offsets (ulong base, flash_info_t *info)
-+{
-+ int i;
-+ short n;
-+
-+ base += info->size;
-+ i = info->sector_count;
-+
-+ switch (info->flash_id & FLASH_TYPEMASK)
-+ {
-+ case FLASH_STMW320DT :
-+ /* 1 x 16k boot sector */
-+ base -= 16 << 10;
-+ --i;
-+ info->start[i] = base;
-+ /* 2 x 8k boot sectors */
-+ for (n=0; n<2; ++n) {
-+ base -= 8 << 10;
-+ --i;
-+ info->start[i] = base;
-+ }
-+ /* 1 x 32k boot sector */
-+ base -= 32 << 10;
-+ --i;
-+ info->start[i] = base;
-+ break;
-+
-+ case FLASH_STMW640DT :
-+ /* 8 x 8k boot sectors */
-+ for (n=0; n<8; ++n) {
-+ base -= 8 << 10;
-+ --i;
-+ info->start[i] = base;
-+ }
-+ break;
-+ };
-+ /* 64k regular sectors */
-+ while (i > 0) {
-+ base -= 64 << 10;
-+ --i;
-+ info->start[i] = base;
-+ }
-+}
-+
-+/*-----------------------------------------------------------------------
-+ */
-+static ulong flash_get_size (vu_long *addr, flash_info_t *info)
-+{
-+ short i;
-+ short n;
-+ CFG_FLASH_WORD_SIZE value;
-+ ulong base = (ulong)addr;
-+ volatile CFG_FLASH_WORD_SIZE *addr2 = (CFG_FLASH_WORD_SIZE *)addr;
-+
-+ /* Write auto select command: read Manufacturer ID */
-+ addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00AA00AA;
-+ addr2[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE)0x00550055;
-+ addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00900090;
-+
-+ value = addr2[CFG_FLASH_READ0];
-+
-+ switch (value) {
-+ case (CFG_FLASH_WORD_SIZE)SST_MANUFACT:
-+ info->flash_id = FLASH_MAN_SST;
-+ break;
-+ case (CFG_FLASH_WORD_SIZE)STM_MANUFACT:
-+ info->flash_id = FLASH_MAN_STM;
-+ break;
-+ default:
-+ info->flash_id = FLASH_UNKNOWN;
-+ info->sector_count = 0;
-+ info->size = 0;
-+ return (0);
-+ }
-+
-+ value = addr2[CFG_FLASH_READ1]; /* device ID */
-+
-+ switch (value) {
-+ case (CFG_FLASH_WORD_SIZE)STM_ID_29W320DT:
-+ info->flash_id += FLASH_STMW320DT;
-+ info->sector_count = 67;
-+ info->size = 0x00400000;
-+
-+ /* set up sector start address table for FLASH_STMW320DT */
-+ /* set sector offsets for top boot block type */
-+ base += info->size;
-+ i = info->sector_count;
-+ /* 1 x 16k boot sector */
-+ base -= 16 << 10;
-+ --i;
-+ info->start[i] = base;
-+ /* 2 x 8k boot sectors */
-+ for (n=0; n<2; ++n) {
-+ base -= 8 << 10;
-+ --i;
-+ info->start[i] = base;
-+ };
-+ /* 1 x 32k boot sector */
-+ base -= 32 << 10;
-+ --i;
-+ info->start[i] = base;
-+
-+ /* 64k regular sectors */
-+ while (i > 0)
-+ {
-+ base -= 64 << 10;
-+ --i;
-+ info->start[i] = base;
-+ };
-+ break; /* => 4 MB */
-+
-+ case (CFG_FLASH_WORD_SIZE)STM_ID_29W640DT:
-+ info->flash_id += FLASH_STMW640DT;
-+ info->sector_count = 135;
-+ info->size = 0x00800000;
-+
-+ /* set up sector start address table for FLASH_STMW640DT */
-+ /* set sector offsets for top boot block type */
-+ base += info->size;
-+ i = info->sector_count;
-+ /* 8 x 8k boot sectors */
-+ for (n=0; n<8; ++n) {
-+ base -= 8 << 10;
-+ --i;
-+ info->start[i] = base;
-+ };
-+
-+ /* 64k regular sectors */
-+ while (i > 0)
-+ {
-+ base -= 64 << 10;
-+ --i;
-+ info->start[i] = base;
-+ };
-+
-+ break; /* => 8 MB */
-+ default:
-+ info->flash_id = FLASH_UNKNOWN;
-+ return (0); /* => no or unknown flash */
-+ }
-+
-+ /* check for protected sectors */
-+ for (i = 0; i < info->sector_count; i++) {
-+ /* read sector protection at sector address, (A7 .. A0) = 0x02 */
-+ /* D0 = 1 if protected */
-+ addr2 = (volatile CFG_FLASH_WORD_SIZE *)(info->start[i]);
-+ if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST)
-+ info->protect[i] = 0;
-+ else
-+ info->protect[i] = addr2[CFG_FLASH_READ2] & 1;
-+ }
-+
-+ /*
-+ * Prevent writes to uninitialized FLASH.
-+ */
-+ if (info->flash_id != FLASH_UNKNOWN) {
-+ addr2 = (CFG_FLASH_WORD_SIZE *)info->start[0];
-+ *addr2 = (CFG_FLASH_WORD_SIZE)0x00F000F0; /* reset bank */
-+ }
-+
-+ return (info->size);
-+}
-+
-+/*-----------------------------------------------------------------------
-+ */
-+void flash_print_info (flash_info_t *info)
-+{
-+ int i;
-+ int k;
-+ int size;
-+ int erased;
-+ volatile unsigned long *flash;
-+
-+ switch (info->flash_id & FLASH_TYPEMASK)
-+ {
-+ case FLASH_STMW320DT :
-+ printf ("ST M29W320DT (32 M, top sector)\n");
-+ break;
-+ case FLASH_STMW640DT :
-+ printf ("ST M29W640DT (64 M, top sector)\n");
-+ break;
-+ default :
-+ printf ("Missing or unknown FLASH type\n");
-+ return;
-+ };
-+ printf (" Size: %ld MB in %d Sectors\n", info->size >> 20, info->sector_count);
-+
-+ printf (" Sector Start Addresses:");
-+ for (i=0; i<info->sector_count; ++i) {
-+ /*
-+ * Check if whole sector is erased
-+ */
-+ if (i != (info->sector_count-1))
-+ size = info->start[i+1] - info->start[i];
-+ else
-+ size = info->start[0] + info->size - info->start[i];
-+ erased = 1;
-+ flash = (volatile unsigned long *)info->start[i];
-+ size = size >> 2; /* divide by 4 for longword access */
-+ for (k=0; k<size; k++)
-+ {
-+ if (*flash++ != 0xffffffff)
-+ {
-+ erased = 0;
-+ break;
-+ }
-+ }
-+
-+ if ((i % 5) == 0)
-+ printf ("\n ");
-+ printf (" %08lX%s%s",
-+ info->start[i],
-+ erased ? " E" : " ",
-+ info->protect[i] ? "RO " : " "
-+ );
-+ }
-+ printf ("\n");
-+ return;
-+}
-+
-+/*-----------------------------------------------------------------------
-+ */
-+
-+int flash_erase (flash_info_t *info, int s_first, int s_last)
-+{
-+ volatile CFG_FLASH_WORD_SIZE *addr = (CFG_FLASH_WORD_SIZE *)(info->start[0]);
-+ volatile CFG_FLASH_WORD_SIZE *addr2;
-+ int flag, prot, sect, l_sect;
-+ ulong start, now, last;
-+ int i;
-+
-+ if ((s_first < 0) || (s_first > s_last)) {
-+ if (info->flash_id == FLASH_UNKNOWN) {
-+ printf ("- missing\n");
-+ } else {
-+ printf ("- no sectors to erase\n");
-+ }
-+ return 1;
-+ }
-+
-+ if (info->flash_id == FLASH_UNKNOWN) {
-+ printf ("Can't erase unknown flash type - aborted\n");
-+ return 1;
-+ }
-+
-+ prot = 0;
-+ for (sect=s_first; sect<=s_last; ++sect) {
-+ if (info->protect[sect]) {
-+ prot++;
-+ }
-+ }
-+
-+ if (prot) {
-+ printf ("- Warning: %d protected sectors will not be erased!\n",
-+ prot);
-+ } else {
-+ printf ("\n");
-+ }
-+
-+ l_sect = -1;
-+
-+ /* Disable interrupts which might cause a timeout here */
-+ flag = disable_interrupts();
-+
-+ /* Start erase on unprotected sectors */
-+ for (sect = s_first; sect<=s_last; sect++) {
-+ if (info->protect[sect] == 0) { /* not protected */
-+ addr2 = (CFG_FLASH_WORD_SIZE *)(info->start[sect]);
-+ if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST) {
-+ addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00AA00AA;
-+ addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE)0x00550055;
-+ addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00800080;
-+ addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00AA00AA;
-+ addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE)0x00550055;
-+ addr2[0] = (CFG_FLASH_WORD_SIZE)0x00500050; /* block erase */
-+ for (i=0; i<50; i++)
-+ udelay(1000); /* wait 1 ms */
-+ } else {
-+ if (sect == s_first) {
-+ addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00AA00AA;
-+ addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE)0x00550055;
-+ addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00800080;
-+ addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00AA00AA;
-+ addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE)0x00550055;
-+ }
-+ addr2[0] = (CFG_FLASH_WORD_SIZE)0x00300030; /* sector erase */
-+ }
-+ l_sect = sect;
-+ }
-+ }
-+
-+ /* re-enable interrupts if necessary */
-+ if (flag)
-+ enable_interrupts();
-+
-+ /* wait at least 80us - let's wait 1 ms */
-+ udelay (1000);
-+
-+ /*
-+ * We wait for the last triggered sector
-+ */
-+ if (l_sect < 0)
-+ goto DONE;
-+
-+ start = get_timer (0);
-+ last = start;
-+ addr = (CFG_FLASH_WORD_SIZE *)(info->start[l_sect]);
-+ while ((addr[0] & (CFG_FLASH_WORD_SIZE)0x00800080) != (CFG_FLASH_WORD_SIZE)0x00800080) {
-+ if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
-+ printf ("Timeout\n");
-+ return 1;
-+ }
-+ /* show that we're waiting */
-+ if ((now - last) > 1000) { /* every second */
-+ putc ('.');
-+ last = now;
-+ }
-+ }
-+
-+DONE:
-+ /* reset to read mode */
-+ addr = (CFG_FLASH_WORD_SIZE *)info->start[0];
-+ addr[0] = (CFG_FLASH_WORD_SIZE)0x00F000F0; /* reset bank */
-+
-+ printf (" done\n");
-+ return 0;
-+}
-+
-+/*-----------------------------------------------------------------------
-+ * Copy memory to flash, returns:
-+ * 0 - OK
-+ * 1 - write timeout
-+ * 2 - Flash not erased
-+ */
-+
-+int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
-+{
-+ ulong cp, wp, data;
-+ int i, l, rc;
-+
-+ wp = (addr & ~3); /* get lower word aligned address */
-+
-+ /*
-+ * handle unaligned start bytes
-+ */
-+ if ((l = addr - wp) != 0) {
-+ data = 0;
-+ for (i=0, cp=wp; i<l; ++i, ++cp) {
-+ data = (data << 8) | (*(uchar *)cp);
-+ }
-+ for (; i<4 && cnt>0; ++i) {
-+ data = (data << 8) | *src++;
-+ --cnt;
-+ ++cp;
-+ }
-+ for (; cnt==0 && i<4; ++i, ++cp) {
-+ data = (data << 8) | (*(uchar *)cp);
-+ }
-+
-+ if ((rc = write_word(info, wp, data)) != 0) {
-+ return (rc);
-+ }
-+ wp += 4;
-+ }
-+
-+ /*
-+ * handle word aligned part
-+ */
-+ while (cnt >= 4) {
-+ data = 0;
-+ for (i=0; i<4; ++i) {
-+ data = (data << 8) | *src++;
-+ }
-+ if ((rc = write_word(info, wp, data)) != 0) {
-+ return (rc);
-+ }
-+ wp += 4;
-+ cnt -= 4;
-+ }
-+
-+ if (cnt == 0) {
-+ return (0);
-+ }
-+
-+ /*
-+ * handle unaligned tail bytes
-+ */
-+ data = 0;
-+ for (i=0, cp=wp; i<4 && cnt>0; ++i, ++cp) {
-+ data = (data << 8) | *src++;
-+ --cnt;
-+ }
-+ for (; i<4; ++i, ++cp) {
-+ data = (data << 8) | (*(uchar *)cp);
-+ }
-+
-+ return (write_word(info, wp, data));
-+}
-+
-+/*-----------------------------------------------------------------------
-+ * Write a word to Flash, returns:
-+ * 0 - OK
-+ * 1 - write timeout
-+ * 2 - Flash not erased
-+ */
-+static int write_word (flash_info_t *info, ulong dest, ulong data)
-+{
-+ volatile CFG_FLASH_WORD_SIZE *addr2 = (CFG_FLASH_WORD_SIZE *)(info->start[0]);
-+ volatile CFG_FLASH_WORD_SIZE *dest2 = (CFG_FLASH_WORD_SIZE *)dest;
-+ volatile CFG_FLASH_WORD_SIZE *data2 = (CFG_FLASH_WORD_SIZE *)&data;
-+ ulong start;
-+ int flag;
-+ int i;
-+
-+ /* Check if Flash is (sufficiently) erased */
-+ if ((*((volatile ulong *)dest) & data) != data) {
-+ return (2);
-+ }
-+ /* Disable interrupts which might cause a timeout here */
-+ flag = disable_interrupts();
-+
-+ for (i=0; i<4/sizeof(CFG_FLASH_WORD_SIZE); i++)
-+ {
-+ addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00AA00AA;
-+ addr2[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE)0x00550055;
-+ addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00A000A0;
-+
-+ dest2[i] = data2[i];
-+
-+ /* re-enable interrupts if necessary */
-+ if (flag)
-+ enable_interrupts();
-+
-+ /* data polling for D7 */
-+ start = get_timer (0);
-+ while ((dest2[i] & (CFG_FLASH_WORD_SIZE)0x00800080) !=
-+ (data2[i] & (CFG_FLASH_WORD_SIZE)0x00800080)) {
-+ if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
-+ return (1);
-+ }
-+ }
-+ }
-+
-+ return (0);
-+}
-diff -uNr u-boot-1.1.2/board/emetec405/pllmr.c u-boot-emetec-1.1.2/board/emetec405/pllmr.c
---- u-boot-1.1.2/board/emetec405/pllmr.c 1970-01-01 02:00:00.000000000 +0200
-+++ u-boot-emetec-1.1.2/board/emetec405/pllmr.c 2005-03-14 22:32:04.000000000 +0200
-@@ -0,0 +1,19 @@
-+#define PLL_CPUDIV_1 0x00000000
-+#define PLL_PLBDIV_2 0x00010000
-+#define PLL_OPBDIV_2 0x00001000
-+#define PLL_EXTBUSDIV_3 0x00000100
-+#define PLL_MALDIV_1 0x00000000
-+#define PLL_PCIDIV_4 0x00000003
-+
-+#define PLL_FBKDIV_8 0x00800000
-+#define PLL_FWDDIVA_4 0x00040000
-+#define PLL_FWDDIVB_4 0x00004000
-+#define PLL_TUNE_15_M_40 0x0000023E /* 14 < M <= 40 */
-+#define PLL_TUNE_VCO_LOW 0x00000000 /* 500MHz <= VCO <= 800MHz */
-+
-+#define PLLMR0_200_100_50_25 (PLL_CPUDIV_1 | PLL_PLBDIV_2 | \
-+ PLL_OPBDIV_2 | PLL_EXTBUSDIV_3 | \
-+ PLL_MALDIV_1 | PLL_PCIDIV_4)
-+#define PLLMR1_200_100_50_25 (PLL_FBKDIV_8 | \
-+ PLL_FWDDIVA_4 | PLL_FWDDIVB_4 | \
-+ PLL_TUNE_15_M_40 | PLL_TUNE_VCO_LOW)
-diff -uNr u-boot-1.1.2/board/emetec405/u-boot.lds u-boot-emetec-1.1.2/board/emetec405/u-boot.lds
---- u-boot-1.1.2/board/emetec405/u-boot.lds 1970-01-01 02:00:00.000000000 +0200
-+++ u-boot-emetec-1.1.2/board/emetec405/u-boot.lds 2003-09-12 11:41:39.000000000 +0300
-@@ -0,0 +1,147 @@
-+/*
-+ * (C) Copyright 2000
-+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+OUTPUT_ARCH(powerpc)
-+SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib);
-+/* Do we need any of these for elf?
-+ __DYNAMIC = 0; */
-+SECTIONS
-+{
-+ .resetvec 0xFFFFFFFC :
-+ {
-+ *(.resetvec)
-+ } = 0xffff
-+
-+ /* Read-only sections, merged into text segment: */
-+ . = + SIZEOF_HEADERS;
-+ .interp : { *(.interp) }
-+ .hash : { *(.hash) }
-+ .dynsym : { *(.dynsym) }
-+ .dynstr : { *(.dynstr) }
-+ .rel.text : { *(.rel.text) }
-+ .rela.text : { *(.rela.text) }
-+ .rel.data : { *(.rel.data) }
-+ .rela.data : { *(.rela.data) }
-+ .rel.rodata : { *(.rel.rodata) }
-+ .rela.rodata : { *(.rela.rodata) }
-+ .rel.got : { *(.rel.got) }
-+ .rela.got : { *(.rela.got) }
-+ .rel.ctors : { *(.rel.ctors) }
-+ .rela.ctors : { *(.rela.ctors) }
-+ .rel.dtors : { *(.rel.dtors) }
-+ .rela.dtors : { *(.rela.dtors) }
-+ .rel.bss : { *(.rel.bss) }
-+ .rela.bss : { *(.rela.bss) }
-+ .rel.plt : { *(.rel.plt) }
-+ .rela.plt : { *(.rela.plt) }
-+ .init : { *(.init) }
-+ .plt : { *(.plt) }
-+ .text :
-+ {
-+ /* WARNING - the following is hand-optimized to fit within */
-+ /* the sector layout of our flash chips! XXX FIXME XXX */
-+
-+ cpu/ppc4xx/start.o (.text)
-+ cpu/ppc4xx/traps.o (.text)
-+ cpu/ppc4xx/interrupts.o (.text)
-+ cpu/ppc4xx/serial.o (.text)
-+ cpu/ppc4xx/cpu_init.o (.text)
-+ cpu/ppc4xx/speed.o (.text)
-+ cpu/ppc4xx/405gp_enet.o (.text)
-+ common/dlmalloc.o (.text)
-+ lib_generic/crc32.o (.text)
-+ lib_ppc/extable.o (.text)
-+ lib_generic/zlib.o (.text)
-+
-+/* . = env_offset;*/
-+/* common/environment.o(.text)*/
-+
-+ *(.text)
-+ *(.fixup)
-+ *(.got1)
-+ }
-+ _etext = .;
-+ PROVIDE (etext = .);
-+ .rodata :
-+ {
-+ *(.rodata)
-+ *(.rodata1)
-+ *(.rodata.str1.4)
-+ }
-+ .fini : { *(.fini) } =0
-+ .ctors : { *(.ctors) }
-+ .dtors : { *(.dtors) }
-+
-+ /* Read-write section, merged into data segment: */
-+ . = (. + 0x00FF) & 0xFFFFFF00;
-+ _erotext = .;
-+ PROVIDE (erotext = .);
-+ .reloc :
-+ {
-+ *(.got)
-+ _GOT2_TABLE_ = .;
-+ *(.got2)
-+ _FIXUP_TABLE_ = .;
-+ *(.fixup)
-+ }
-+ __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-+ __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-+
-+ .data :
-+ {
-+ *(.data)
-+ *(.data1)
-+ *(.sdata)
-+ *(.sdata2)
-+ *(.dynamic)
-+ CONSTRUCTORS
-+ }
-+ _edata = .;
-+ PROVIDE (edata = .);
-+
-+ __u_boot_cmd_start = .;
-+ .u_boot_cmd : { *(.u_boot_cmd) }
-+ __u_boot_cmd_end = .;
-+
-+ __start___ex_table = .;
-+ __ex_table : { *(__ex_table) }
-+ __stop___ex_table = .;
-+
-+ . = ALIGN(256);
-+ __init_begin = .;
-+ .text.init : { *(.text.init) }
-+ .data.init : { *(.data.init) }
-+ . = ALIGN(256);
-+ __init_end = .;
-+
-+ __bss_start = .;
-+ .bss :
-+ {
-+ *(.sbss) *(.scommon)
-+ *(.dynbss)
-+ *(.bss)
-+ *(COMMON)
-+ }
-+ _end = . ;
-+ PROVIDE (end = .);
-+}
-diff -uNr u-boot-1.1.2/copy.sh u-boot-emetec-1.1.2/copy.sh
---- u-boot-1.1.2/copy.sh 1970-01-01 02:00:00.000000000 +0200
-+++ u-boot-emetec-1.1.2/copy.sh 2005-03-17 23:26:42.000000000 +0200
-@@ -0,0 +1,2 @@
-+cp u-boot.bin /home/admin/uboot/uboot_v6.bin
-+cp u-boot.srec /home/admin/uboot/uboot_v6.srec
-diff -uNr u-boot-1.1.2/cpu/ppc4xx/405gp_enet.c u-boot-emetec-1.1.2/cpu/ppc4xx/405gp_enet.c
---- u-boot-1.1.2/cpu/ppc4xx/405gp_enet.c 2004-07-02 17:36:35.000000000 +0300
-+++ u-boot-emetec-1.1.2/cpu/ppc4xx/405gp_enet.c 2005-05-06 18:07:02.000000000 +0300
-@@ -133,7 +133,7 @@
- /*-----------------------------------------------------------------------------+
- * Prototypes and externals.
- *-----------------------------------------------------------------------------*/
--static void enet_rcv (struct eth_device *dev, unsigned long malisr);
-+static void enet_rcv (struct eth_device *dev, unsigned long malisr);
-
- int enetInt (struct eth_device *dev);
- static void mal_err (struct eth_device *dev, unsigned long isr,
-@@ -190,11 +190,15 @@
- unsigned short reg_short;
-
- EMAC_405_HW_PST hw_p = dev->priv;
-+
-+ puts ("Test 1\n");
- /* before doing anything, figure out if we have a MAC address */
- /* if not, bail */
- if (memcmp (dev->enetaddr, "\0\0\0\0\0\0", 6) == 0)
- return -1;
-
-+ puts ("Test 2\n");
-+
- msr = mfmsr ();
- mtmsr (msr & ~(MSR_EE)); /* disable interrupts */
-
-@@ -1023,6 +1027,8 @@
- #else
- emac0_dev = dev;
- #endif
-+ // print device name
-+ printf("%s\n", dev->name);
-
- } /* end for each supported device */
-
-diff -uNr u-boot-1.1.2/cpu/pxa/config.mk u-boot-emetec-1.1.2/cpu/pxa/config.mk
---- u-boot-1.1.2/cpu/pxa/config.mk 2007-04-20 00:01:06.000000000 +0300
-+++ u-boot-emetec-1.1.2/cpu/pxa/config.mk 2003-05-23 15:36:21.000000000 +0300
-@@ -23,6 +23,6 @@
- #
-
- PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \
-- -msoft-float
-+ -mshort-load-bytes -msoft-float
-
- PLATFORM_CPPFLAGS += -mapcs-32 -march=armv4 -mtune=strongarm1100
-diff -uNr u-boot-1.1.2/include/configs/EMETEC405.h u-boot-emetec-1.1.2/include/configs/EMETEC405.h
---- u-boot-1.1.2/include/configs/EMETEC405.h 1970-01-01 02:00:00.000000000 +0200
-+++ u-boot-emetec-1.1.2/include/configs/EMETEC405.h 2005-05-25 10:08:39.000000000 +0300
-@@ -0,0 +1,349 @@
-+/*
-+ * (C) Copyright 2001-2003
-+ * Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+/*
-+ * board/config.h - configuration options, board specific
-+ */
-+
-+#ifndef __CONFIG_H
-+#define __CONFIG_H
-+
-+#define FLASH_8MB 1
-+/*
-+ * High Level Configuration Options
-+ * (easy to change)
-+ */
-+
-+#define CONFIG_405EP 1 /* This is a PPC405 CPU */
-+#define CONFIG_4xx 1 /* ...member of PPC4xx family */
-+#define CONFIG_EMETEC405 1 /* ...on a EMETEC405 board */
-+
-+#define CONFIG_BOARD_EARLY_INIT_F 1 /* call board_early_init_f() */
-+#define CONFIG_MISC_INIT_R 1 /* call misc_init_r() */
-+
-+#define CONFIG_SYS_CLK_FREQ 25000000 /* external frequency to pll */
-+
-+#define CONFIG_BAUDRATE 115200
-+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
-+
-+#undef CONFIG_BOOTARGS
-+#undef CONFIG_BOOTCOMMAND
-+#define CONFIG_EXTRA_ENV_SETTINGS \
-+ "ramargs=setenv bootargs console=ttyS0,115200 " \
-+ "root=/dev/ram rw\0" \
-+ "flash_mem=run ramargs;" \
-+ "bootm $(kernel_addr) $(ramdisk_addr)\0" \
-+ "kernel_addr=ffC00000\0" \
-+ "ramdisk_addr=ffCE0000\0" \
-+ ""
-+#define CONFIG_BOOTCOMMAND "run flash_mem"
-+
-+#define CFG_LOADS_BAUD_CHANGE 1 /* allow baudrate change */
-+
-+#define CONFIG_MII 1 /* MII PHY management */
-+#define CONFIG_PHY_ADDR 0 /* PHY address */
-+
-+#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
-+ CFG_CMD_NET | \
-+ CFG_CMD_DHCP | \
-+ CFG_CMD_IRQ | \
-+ CFG_CMD_ELF | \
-+ CFG_CMD_I2C | \
-+ CFG_CMD_PING | \
-+ CFG_CMD_EEPROM )
-+
-+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
-+#include <cmd_confdefs.h>
-+
-+#undef CONFIG_WATCHDOG /* watchdog disabled */
-+
-+#define CONFIG_SDRAM_BANK0 1 /* init onboard SDRAM bank 0 */
-+
-+/*
-+ * Miscellaneous configurable options
-+ */
-+#define CFG_LONGHELP /* undef to save memory */
-+#define CFG_PROMPT "=> " /* Monitor Command Prompt */
-+
-+#undef CFG_HUSH_PARSER /* use "hush" command parser */
-+#ifdef CFG_HUSH_PARSER
-+#define CFG_PROMPT_HUSH_PS2 "> "
-+#endif
-+
-+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
-+#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */
-+#else
-+#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
-+#endif
-+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
-+#define CFG_MAXARGS 16 /* max number of command args */
-+#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
-+
-+#define CFG_DEVICE_NULLDEV 1 /* include nulldev device */
-+
-+#define CFG_CONSOLE_INFO_QUIET 1 /* don't print console @ startup*/
-+
-+#define CFG_MEMTEST_START 0x0400000 /* memtest works on */
-+#define CFG_MEMTEST_END 0x0C00000 /* 4 ... 12 MB in DRAM */
-+
-+#undef CFG_EXT_SERIAL_CLOCK /* no external serial clock used */
-+#define CFG_IGNORE_405_UART_ERRATA_59 /* ignore ppc405gp errata #59 */
-+#define CFG_BASE_BAUD 691200
-+
-+/* The following table includes the supported baudrates */
-+#define CFG_BAUDRATE_TABLE \
-+ { 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, \
-+ 57600, 115200, 230400, 460800, 921600 }
-+
-+#define CFG_LOAD_ADDR 0x100000 /* default load address */
-+#define CFG_EXTBDINFO 1 /* To use extended board_into (bd_t) */
-+
-+#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */
-+
-+#define CONFIG_ZERO_BOOTDELAY_CHECK /* check for keypress on bootdelay==0 */
-+
-+#define CONFIG_VERSION_VARIABLE 1 /* include version env variable */
-+
-+#define CFG_RX_ETH_BUFFER 16 /* use 16 rx buffer on 405 emac */
-+
-+/* Ethernet stuff */
-+#define CONFIG_ENV_OVERWRITE /* Let the user to change the Ethernet MAC addresses */
-+#define CONFIG_ETHADDR 00:50:C2:1E:AF:FE
-+
-+#define CONFIG_IPADDR 192.168.0.50
-+#define CONFIG_NETMASK 255.255.255.0
-+#define CONFIG_SERVERIP 192.168.0.1
-+
-+/*-----------------------------------------------------------------------
-+ * PCI stuff
-+ *-----------------------------------------------------------------------
-+ */
-+#define PCI_HOST_ADAPTER 0 // configure as pci adapter
-+#define PCI_HOST_FORCE 1 // configure as pci host
-+#define PCI_HOST_AUTO 2 // detected via arbiter enable
-+
-+#define CONFIG_PCI // include pci support
-+#define CONFIG_PCI_HOST PCI_HOST_FORCE // select pci host function
-+#define CONFIG_PCI_PNP // do pci plug-and-play
-+
-+
-+#define CFG_PCI_SUBSYS_VENDORID 0x0000 // PCI Vendor ID: IBM
-+#define CFG_PCI_SUBSYS_DEVICEID 0x0000 // PCI Device ID: 405GP
-+#define CFG_PCI_PTM1LA 0x00000000 // point to sdram
-+#define CFG_PCI_PTM1MS 0x80000001 // 2GB, enable hard-wired to 1
-+#define CFG_PCI_PTM1PCI 0x00000000 // Host: use this pci address
-+#define CFG_PCI_PTM2LA 0x00000000 // disabled
-+#define CFG_PCI_PTM2MS 0x00000000 // disabled
-+#define CFG_PCI_PTM2PCI 0x00000000 // Host: use this pci address
-+
-+/*-----------------------------------------------------------------------
-+ * Start addresses for the final memory configuration
-+ * (Set up by the startup code)
-+ * Please note that CFG_SDRAM_BASE _must_ start at 0
-+ */
-+
-+/*
-+ * Flash configuration (8,16 or 32 MB)
-+ * TEXT base always at 0xFFF00000
-+ * ENV_ADDR always at 0xFFF40000
-+ * FLASH_BASE at 0xFE000000 for 32 MB
-+ * 0xFF000000 for 16 MB
-+ * 0xFF800000 for 8 MB
-+ * 0xFFC00000 for 4 MB
-+ */
-+
-+#define CFG_SDRAM_BASE 0x00000000
-+#define CFG_FLASH_BASE 0xFFFC0000
-+#define CFG_MONITOR_BASE CFG_FLASH_BASE
-+#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Monitor */
-+#define CFG_MALLOC_LEN (256 * 1024) /* Reserve 256 kB for malloc() */
-+
-+/*
-+ * For booting Linux, the board info and command line data
-+ * have to be in the first 8 MB of memory, since this is
-+ * the maximum mapped by the Linux kernel during initialization.
-+ */
-+#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */
-+/*-----------------------------------------------------------------------
-+ * FLASH organization
-+ */
-+#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
-+#define CFG_MAX_FLASH_SECT 256 /* max number of sectors on one chip */
-+
-+#define CFG_FLASH_ERASE_TOUT 120000 /* Timeout for Flash Erase (in ms) */
-+#define CFG_FLASH_WRITE_TOUT 1000 /* Timeout for Flash Write (in ms) */
-+
-+#define CFG_FLASH_WORD_SIZE unsigned short /* flash word size (width) */
-+#define CFG_FLASH_ADDR0 0x5555 /* 1st address for flash config cycles */
-+#define CFG_FLASH_ADDR1 0x2AAA /* 2nd address for flash config cycles */
-+/*
-+ * The following defines are added for buggy IOP480 byte interface.
-+ * All other boards should use the standard values (CPCI405 etc.)
-+ */
-+#define CFG_FLASH_READ0 0x0000 /* 0 is standard */
-+#define CFG_FLASH_READ1 0x0001 /* 1 is standard */
-+#define CFG_FLASH_READ2 0x0002 /* 2 is standard */
-+
-+#define CFG_FLASH_EMPTY_INFO /* print 'E' for empty sector on flinfo */
-+
-+/*
-+#define CFG_ENV_IS_IN_FLASH 1
-+//Address and size of Primary Environment Sector
-+#define CFG_ENV_ADDR 0xFFFFA000
-+#define CFG_ENV_SIZE 0x2000
-+*/
-+
-+/*-----------------------------------------------------------------------
-+ * Environment Variable setup
-+ */
-+#define CFG_ENV_IS_IN_EEPROM 1 // use EEPROM for environment vars
-+#define CFG_ENV_OFFSET 0x100 // environment starts at the beginning of the EEPROM
-+#define CFG_ENV_SIZE 0x700 // 2048 bytes may be used for env vars
-+
-+/*-----------------------------------------------------------------------
-+ * I2C EEPROM (CAT24WC16) for environment
-+ */
-+#define CONFIG_HARD_I2C // I2c with hardware support
-+#define CFG_I2C_SPEED 400000 // I2C speed and slave address
-+#define CFG_I2C_SLAVE 0x7F
-+
-+#define CFG_I2C_EEPROM_ADDR 0x50 // EEPROM CAT28WC08
-+#define CFG_I2C_EEPROM_ADDR_LEN 1 // Bytes of address
-+
-+#define CFG_I2C_EEPROM_ADDR_OVERFLOW 0x07
-+#define CFG_EEPROM_PAGE_WRITE_BITS 4 // The Catalyst CAT24WC08 has
-+ // 16 byte page write mode using
-+ // last 4 bits of the address
-+#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 10 // and takes up to 10 msec
-+#define CFG_EEPROM_PAGE_WRITE_ENABLE
-+
-+/*-----------------------------------------------------------------------
-+ * Cache Configuration
-+ */
-+#define CFG_DCACHE_SIZE 16384 /* For IBM 405 CPUs, older 405 ppc's */
-+ /* have only 8kB, 16kB is save here */
-+#define CFG_CACHELINE_SIZE 32 /* ... */
-+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
-+#define CFG_CACHELINE_SHIFT 5 /* log base 2 of the above value */
-+#endif
-+
-+/*
-+ * Init Memory Controller:
-+ *
-+ * BR0/1 and OR0/1 (FLASH)
-+ */
-+
-+#if FLASH_8MB == 1
-+#define FLASH_BASE0_PRELIM 0xFF800000 /* FLASH bank #0 */
-+#else
-+#define FLASH_BASE0_PRELIM 0xFFC00000 /* FLASH bank #0 */
-+#endif
-+
-+/*-----------------------------------------------------------------------
-+ * External Bus Controller (EBC) Setup
-+ */
-+
-+/* Memory Bank 0 (Flash Bank 0) initialization */
-+#if FLASH_8MB == 1
-+#define CFG_EBC_PB0AP 0x92015480
-+#define CFG_EBC_PB0CR 0xFFC5B000 /* BAS=0xFFC,BS=8MB,BU=R/W,BW=16bit */
-+#else
-+#define CFG_EBC_PB0AP 0x92015480
-+#define CFG_EBC_PB0CR 0xFFC5A000 /* BAS=0xFFC,BS=4MB,BU=R/W,BW=16bit */
-+#endif
-+
-+/*-----------------------------------------------------------------------
-+ * Definitions for initial stack pointer and data area (in data cache)
-+ */
-+/* use on chip memory ( OCM ) for temperary stack until sdram is tested */
-+#define CFG_TEMP_STACK_OCM 1
-+
-+/* On Chip Memory location */
-+#define CFG_OCM_DATA_ADDR 0xF8000000
-+#define CFG_OCM_DATA_SIZE 0x1000
-+#define CFG_INIT_RAM_ADDR CFG_OCM_DATA_ADDR /* inside of SDRAM */
-+#define CFG_INIT_RAM_END CFG_OCM_DATA_SIZE /* End of used area in RAM */
-+
-+#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
-+#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
-+#define CFG_INIT_SP_OFFSET CFG_GBL_DATA_OFFSET
-+
-+/*-----------------------------------------------------------------------
-+ * Definitions for GPIO setup (PPC405EP specific)
-+ *
-+ * GPIO0[0] - External Bus Controller BLAST output
-+ * GPIO0[1-9] - Instruction trace outputs -> GPIO
-+ * GPIO0[10-13] - External Bus Controller CS_1 - CS_4 outputs
-+ * GPIO0[14-16] - External Bus Controller ABUS3-ABUS5 outputs -> GPIO
-+ * GPIO0[17-23] - External Interrupts IRQ0 - IRQ6 inputs
-+ * GPIO0[24-27] - UART0 control signal inputs/outputs
-+ * GPIO0[28-29] - UART1 data signal input/output
-+ * GPIO0[30-31] - EMAC0 and EMAC1 reject packet inputs
-+ */
-+#define CFG_GPIO0_OSRH 0x40000550
-+#define CFG_GPIO0_OSRL 0x00000110
-+#define CFG_GPIO0_ISR1H 0x00000000
-+#define CFG_GPIO0_ISR1L 0x15555445
-+#define CFG_GPIO0_TSRH 0x00000000
-+#define CFG_GPIO0_TSRL 0x00000000
-+#define CFG_GPIO0_TCR 0xF7FE0014
-+
-+/*
-+ * Internal Definitions
-+ *
-+ * Boot Flags
-+ */
-+#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */
-+#define BOOTFLAG_WARM 0x02 /* Software reboot */
-+
-+#define PLL_CPUDIV_1 0x00000000
-+#define PLL_PLBDIV_2 0x00010000
-+#define PLL_OPBDIV_2 0x00001000
-+
-+#define PLL_EXTBUSDIV_4 0x00000200
-+
-+#define PLL_MALDIV_1 0x00000000
-+#define PLL_PCIDIV_2 0x00000001
-+#define PLL_PCIDIV_4 0x00000003
-+
-+#define PLL_FBKDIV_8 0x00800000
-+
-+#define PLL_FWDDIVA_4 0x00040000
-+#define PLL_FWDDIVB_4 0x00004000
-+#define PLL_TUNE_15_M_40 0x0000023E /* 14 < M <= 40 */
-+#define PLL_TUNE_VCO_LOW 0x00000000 /* 500MHz <= VCO <= 800MHz */
-+
-+#define PLLMR0_200_100_50_25 (PLL_CPUDIV_1 | PLL_PLBDIV_2 | \
-+ PLL_OPBDIV_2 | PLL_EXTBUSDIV_4 | \
-+ PLL_MALDIV_1 | PLL_PCIDIV_4)
-+#define PLLMR1_200_100_50_25 (PLL_FBKDIV_8 | \
-+ PLL_FWDDIVA_4 | PLL_FWDDIVB_4 | \
-+ PLL_TUNE_15_M_40 | PLL_TUNE_VCO_LOW)
-+/*
-+ * Default speed selection (cpu_plb_opb_ebc) in mhz.
-+ * This value will be set if iic boot eprom is disabled.
-+ */
-+#define PLLMR0_DEFAULT PLLMR0_200_100_50_25
-+#define PLLMR1_DEFAULT PLLMR1_200_100_50_25
-+
-+#endif /* __CONFIG_H */
-diff -uNr u-boot-1.1.2/include/configs/EMETEC405.h.old u-boot-emetec-1.1.2/include/configs/EMETEC405.h.old
---- u-boot-1.1.2/include/configs/EMETEC405.h.old 1970-01-01 02:00:00.000000000 +0200
-+++ u-boot-emetec-1.1.2/include/configs/EMETEC405.h.old 2005-03-17 23:00:33.000000000 +0200
-@@ -0,0 +1,349 @@
-+/*
-+ * (C) Copyright 2001-2003
-+ * Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+/*
-+ * board/config.h - configuration options, board specific
-+ */
-+
-+#ifndef __CONFIG_H
-+#define __CONFIG_H
-+
-+/*
-+ * High Level Configuration Options
-+ * (easy to change)
-+ */
-+
-+#define CONFIG_405EP 1 /* This is a PPC405 CPU */
-+#define CONFIG_4xx 1 /* ...member of PPC4xx family */
-+#define CONFIG_EMETEC405 1 /* ...on a EMETEC405 board */
-+
-+#define CONFIG_BOARD_EARLY_INIT_F 1 /* call board_early_init_f() */
-+#define CONFIG_MISC_INIT_R 1 /* call misc_init_r() */
-+
-+#define CONFIG_SYS_CLK_FREQ 25000000 /* external frequency to pll */
-+
-+#define CONFIG_BAUDRATE 115200
-+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
-+
-+#undef CONFIG_BOOTARGS
-+#undef CONFIG_BOOTCOMMAND
-+
-+#define CONFIG_PREBOOT /* enable preboot variable */
-+
-+#define CFG_LOADS_BAUD_CHANGE 1 /* allow baudrate change */
-+
-+#define CONFIG_MII 1 /* MII PHY management */
-+#define CONFIG_PHY_ADDR 0 /* PHY address */
-+#define CONFIG_LXT971_NO_SLEEP 1 /* disable sleep mode in LXT971 */
-+
-+/*
-+#define CONFIG_PHY_CLK_FREQ EMAC_STACR_CLK_66MHZ // 66 MHz OPB clock
-+*/
-+
-+#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
-+ CFG_CMD_DHCP | \
-+ CFG_CMD_IRQ | \
-+ CFG_CMD_ELF | \
-+ CFG_CMD_I2C | \
-+ CFG_CMD_MII | \
-+ CFG_CMD_PING | \
-+ CFG_CMD_EEPROM )
-+
-+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
-+#include <cmd_confdefs.h>
-+
-+#undef CONFIG_WATCHDOG /* watchdog disabled */
-+
-+#define CONFIG_SDRAM_BANK0 1 /* init onboard SDRAM bank 0 */
-+
-+/*
-+ * Miscellaneous configurable options
-+ */
-+#define CFG_LONGHELP /* undef to save memory */
-+#define CFG_PROMPT "=> " /* Monitor Command Prompt */
-+
-+#undef CFG_HUSH_PARSER /* use "hush" command parser */
-+#ifdef CFG_HUSH_PARSER
-+#define CFG_PROMPT_HUSH_PS2 "> "
-+#endif
-+
-+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
-+#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */
-+#else
-+#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
-+#endif
-+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
-+#define CFG_MAXARGS 16 /* max number of command args */
-+#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
-+
-+#define CFG_DEVICE_NULLDEV 1 /* include nulldev device */
-+
-+#define CFG_CONSOLE_INFO_QUIET 1 /* don't print console @ startup*/
-+
-+#define CFG_MEMTEST_START 0x0400000 /* memtest works on */
-+#define CFG_MEMTEST_END 0x0C00000 /* 4 ... 12 MB in DRAM */
-+
-+#undef CFG_EXT_SERIAL_CLOCK /* no external serial clock used */
-+#define CFG_IGNORE_405_UART_ERRATA_59 /* ignore ppc405gp errata #59 */
-+#define CFG_BASE_BAUD 691200
-+#undef CONFIG_UART1_CONSOLE /* define for uart1 as console */
-+
-+/* The following table includes the supported baudrates */
-+#define CFG_BAUDRATE_TABLE \
-+ { 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, \
-+ 57600, 115200, 230400, 460800, 921600 }
-+
-+#define CFG_LOAD_ADDR 0x100000 /* default load address */
-+#define CFG_EXTBDINFO 1 /* To use extended board_into (bd_t) */
-+
-+#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */
-+
-+#define CONFIG_ZERO_BOOTDELAY_CHECK /* check for keypress on bootdelay==0 */
-+
-+#define CONFIG_VERSION_VARIABLE 1 /* include version env variable */
-+
-+#define CFG_RX_ETH_BUFFER 16 /* use 16 rx buffer on 405 emac */
-+
-+/* Ethernet stuff */
-+#define CONFIG_ENV_OVERWRITE /* Let the user to change the Ethernet MAC addresses */
-+#define CONFIG_ETHADDR 00:50:C2:1E:AF:FE
-+#define CONFIG_HAS_ETH1
-+#define CONFIG_ETH1ADDR 00:50:C2:1E:AF:FD
-+
-+#define CONFIG_IPADDR 192.168.0.50
-+#define CONFIG_IP1ADDR 192.168.0.51
-+#define CONFIG_NETMASK 255.255.255.0
-+#define CONFIG_SERVERIP 192.168.0.1
-+
-+/*-----------------------------------------------------------------------
-+ * PCI stuff
-+ *-----------------------------------------------------------------------
-+ */
-+#define PCI_HOST_ADAPTER 0 /* configure as pci adapter */
-+#define PCI_HOST_FORCE 1 /* configure as pci host */
-+#define PCI_HOST_AUTO 2 /* detected via arbiter enable */
-+
-+#undef CONFIG_PCI /* include pci support */
-+#define CONFIG_PCI_HOST PCI_HOST_HOST /* select pci host function */
-+#undef CONFIG_PCI_PNP /* do pci plug-and-play */
-+ /* resource configuration */
-+
-+#undef CONFIG_PCI_SCAN_SHOW /* print pci devices @ startup */
-+
-+#define CFG_PCI_SUBSYS_VENDORID 0x12FE /* PCI Vendor ID: esd gmbh */
-+#define CFG_PCI_SUBSYS_DEVICEID 0x0405 /* PCI Device ID: CPCI-405 */
-+#define CFG_PCI_CLASSCODE 0x0b20 /* PCI Class Code: Processor/PPC*/
-+#define CFG_PCI_PTM1LA 0x00000000 /* point to sdram */
-+#define CFG_PCI_PTM1MS 0xfc000001 /* 64MB, enable hard-wired to 1 */
-+#define CFG_PCI_PTM1PCI 0x00000000 /* Host: use this pci address */
-+#define CFG_PCI_PTM2LA 0xffc00000 /* point to flash */
-+#define CFG_PCI_PTM2MS 0xffc00001 /* 4MB, enable */
-+#define CFG_PCI_PTM2PCI 0x04000000 /* Host: use this pci address */
-+
-+/*-----------------------------------------------------------------------
-+ * Start addresses for the final memory configuration
-+ * (Set up by the startup code)
-+ * Please note that CFG_SDRAM_BASE _must_ start at 0
-+ */
-+#define CFG_SDRAM_BASE 0x00000000
-+#define CFG_FLASH_BASE 0xFFFC0000
-+#define CFG_MONITOR_BASE CFG_FLASH_BASE
-+#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Monitor */
-+#define CFG_MALLOC_LEN (256 * 1024) /* Reserve 256 kB for malloc() */
-+
-+/*
-+ * For booting Linux, the board info and command line data
-+ * have to be in the first 8 MB of memory, since this is
-+ * the maximum mapped by the Linux kernel during initialization.
-+ */
-+#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */
-+/*-----------------------------------------------------------------------
-+ * FLASH organization
-+ */
-+#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
-+#define CFG_MAX_FLASH_SECT 256 /* max number of sectors on one chip */
-+
-+#define CFG_FLASH_ERASE_TOUT 120000 /* Timeout for Flash Erase (in ms) */
-+#define CFG_FLASH_WRITE_TOUT 1000 /* Timeout for Flash Write (in ms) */
-+
-+#define CFG_FLASH_WORD_SIZE unsigned short /* flash word size (width) */
-+#define CFG_FLASH_ADDR0 0x5555 /* 1st address for flash config cycles */
-+#define CFG_FLASH_ADDR1 0x2AAA /* 2nd address for flash config cycles */
-+/*
-+ * The following defines are added for buggy IOP480 byte interface.
-+ * All other boards should use the standard values (CPCI405 etc.)
-+ */
-+#define CFG_FLASH_READ0 0x0000 /* 0 is standard */
-+#define CFG_FLASH_READ1 0x0001 /* 1 is standard */
-+#define CFG_FLASH_READ2 0x0002 /* 2 is standard */
-+
-+#define CFG_FLASH_EMPTY_INFO /* print 'E' for empty sector on flinfo */
-+
-+#if 0 /* test-only */
-+#define CFG_JFFS2_FIRST_BANK 0 /* use for JFFS2 */
-+#define CFG_JFFS2_NUM_BANKS 1 /* ! second bank contains U-Boot */
-+#endif
-+
-+/*-----------------------------------------------------------------------
-+ * Environment Variable setup
-+ */
-+#define CFG_ENV_IS_IN_EEPROM 1 /* use EEPROM for environment vars */
-+#define CFG_ENV_OFFSET 0x100 /* environment starts at the beginning of the EEPROM */
-+#define CFG_ENV_SIZE 0x700 /* 2048 bytes may be used for env vars*/
-+ /* total size of a CAT24WC16 is 2048 bytes */
-+
-+#define CFG_NVRAM_BASE_ADDR 0xF0000500 /* NVRAM base address */
-+#define CFG_NVRAM_SIZE 242 /* NVRAM size */
-+
-+/*-----------------------------------------------------------------------
-+ * I2C EEPROM (CAT24WC16) for environment
-+ */
-+#define CONFIG_HARD_I2C /* I2c with hardware support */
-+#define CFG_I2C_SPEED 400000 /* I2C speed and slave address */
-+#define CFG_I2C_SLAVE 0x7F
-+
-+#define CFG_I2C_EEPROM_ADDR 0x50 /* EEPROM CAT28WC08 */
-+#define CFG_I2C_EEPROM_ADDR_LEN 1 /* Bytes of address */
-+/* mask of address bits that overflow into the "EEPROM chip address" */
-+#define CFG_I2C_EEPROM_ADDR_OVERFLOW 0x07
-+#define CFG_EEPROM_PAGE_WRITE_BITS 4 /* The Catalyst CAT24WC08 has */
-+ /* 16 byte page write mode using*/
-+ /* last 4 bits of the address */
-+#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 10 /* and takes up to 10 msec */
-+#define CFG_EEPROM_PAGE_WRITE_ENABLE
-+
-+/*-----------------------------------------------------------------------
-+ * Cache Configuration
-+ */
-+#define CFG_DCACHE_SIZE 16384 /* For IBM 405 CPUs, older 405 ppc's */
-+ /* have only 8kB, 16kB is save here */
-+#define CFG_CACHELINE_SIZE 32 /* ... */
-+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
-+#define CFG_CACHELINE_SHIFT 5 /* log base 2 of the above value */
-+#endif
-+
-+/*
-+ * Init Memory Controller:
-+ *
-+ * BR0/1 and OR0/1 (FLASH)
-+ */
-+
-+#define FLASH_BASE0_PRELIM 0xFFC00000 /* FLASH bank #0 */
-+
-+/*-----------------------------------------------------------------------
-+ * External Bus Controller (EBC) Setup
-+ */
-+
-+/* Memory Bank 0 (Flash Bank 0, NOR-FLASH) initialization */
-+#define CFG_EBC_PB0AP 0x92015480
-+#define CFG_EBC_PB0CR 0xFFC5A000 /* BAS=0xFFC,BS=4MB,BU=R/W,BW=16bit */
-+
-+#define DUART0_BA 0xF0000000 /* DUART Base Address */
-+#define DUART1_BA 0xF0000008 /* DUART Base Address */
-+#define DUART2_BA 0xF0000010 /* DUART Base Address */
-+#define DUART3_BA 0xF0000018 /* DUART Base Address */
-+
-+/*-----------------------------------------------------------------------
-+ * FPGA stuff
-+ */
-+#define CFG_FPGA_SPARTAN2 1 /* using Xilinx Spartan 2 now */
-+#define CFG_FPGA_MAX_SIZE 128*1024 /* 128kByte is enough for XC2S50E*/
-+
-+/* FPGA program pin configuration */
-+#define CFG_FPGA_PRG 0x04000000 /* FPGA program pin (ppc output) */
-+#define CFG_FPGA_CLK 0x02000000 /* FPGA clk pin (ppc output) */
-+#define CFG_FPGA_DATA 0x01000000 /* FPGA data pin (ppc output) */
-+#define CFG_FPGA_INIT 0x00010000 /* FPGA init pin (ppc input) */
-+#define CFG_FPGA_DONE 0x00008000 /* FPGA done pin (ppc input) */
-+
-+/*-----------------------------------------------------------------------
-+ * Definitions for initial stack pointer and data area (in data cache)
-+ */
-+/* use on chip memory ( OCM ) for temperary stack until sdram is tested */
-+#define CFG_TEMP_STACK_OCM 1
-+
-+/* On Chip Memory location */
-+#define CFG_OCM_DATA_ADDR 0xF8000000
-+#define CFG_OCM_DATA_SIZE 0x1000
-+#define CFG_INIT_RAM_ADDR CFG_OCM_DATA_ADDR /* inside of SDRAM */
-+#define CFG_INIT_RAM_END CFG_OCM_DATA_SIZE /* End of used area in RAM */
-+
-+#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
-+#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
-+#define CFG_INIT_SP_OFFSET CFG_GBL_DATA_OFFSET
-+
-+/*-----------------------------------------------------------------------
-+ * Definitions for GPIO setup (PPC405EP specific)
-+ *
-+ * GPIO0[0] - External Bus Controller BLAST output
-+ * GPIO0[1-9] - Instruction trace outputs -> GPIO
-+ * GPIO0[10-13] - External Bus Controller CS_1 - CS_4 outputs
-+ * GPIO0[14-16] - External Bus Controller ABUS3-ABUS5 outputs -> GPIO
-+ * GPIO0[17-23] - External Interrupts IRQ0 - IRQ6 inputs
-+ * GPIO0[24-27] - UART0 control signal inputs/outputs
-+ * GPIO0[28-29] - UART1 data signal input/output
-+ * GPIO0[30-31] - EMAC0 and EMAC1 reject packet inputs
-+ */
-+#define CFG_GPIO0_OSRH 0x40000550
-+#define CFG_GPIO0_OSRL 0x00000110
-+#define CFG_GPIO0_ISR1H 0x00000000
-+#define CFG_GPIO0_ISR1L 0x15555445
-+#define CFG_GPIO0_TSRH 0x00000000
-+#define CFG_GPIO0_TSRL 0x00000000
-+#define CFG_GPIO0_TCR 0xF7FE0014
-+
-+/*
-+ * Internal Definitions
-+ *
-+ * Boot Flags
-+ */
-+#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */
-+#define BOOTFLAG_WARM 0x02 /* Software reboot */
-+
-+#define PLL_CPUDIV_1 0x00000000
-+#define PLL_PLBDIV_2 0x00010000
-+#define PLL_OPBDIV_2 0x00001000
-+#define PLL_EXTBUSDIV_3 0x00000100
-+#define PLL_MALDIV_1 0x00000000
-+#define PLL_PCIDIV_4 0x00000003
-+
-+#define PLL_FBKDIV_8 0x00800000
-+#define PLL_FWDDIVA_4 0x00040000
-+#define PLL_FWDDIVB_4 0x00004000
-+#define PLL_TUNE_15_M_40 0x0000023E /* 14 < M <= 40 */
-+#define PLL_TUNE_VCO_LOW 0x00000000 /* 500MHz <= VCO <= 800MHz */
-+
-+#define PLLMR0_200_100_50_25 (PLL_CPUDIV_1 | PLL_PLBDIV_2 | \
-+ PLL_OPBDIV_2 | PLL_EXTBUSDIV_3 | \
-+ PLL_MALDIV_1 | PLL_PCIDIV_4)
-+#define PLLMR1_200_100_50_25 (PLL_FBKDIV_8 | \
-+ PLL_FWDDIVA_4 | PLL_FWDDIVB_4 | \
-+ PLL_TUNE_15_M_40 | PLL_TUNE_VCO_LOW)
-+/*
-+ * Default speed selection (cpu_plb_opb_ebc) in mhz.
-+ * This value will be set if iic boot eprom is disabled.
-+ */
-+#define PLLMR0_DEFAULT PLLMR0_200_100_50_25
-+#define PLLMR1_DEFAULT PLLMR1_200_100_50_25
-+
-+#endif /* __CONFIG_H */
-diff -uNr u-boot-1.1.2/include/configs/HUB405.h u-boot-emetec-1.1.2/include/configs/HUB405.h
---- u-boot-1.1.2/include/configs/HUB405.h 2004-12-31 11:32:53.000000000 +0200
-+++ u-boot-emetec-1.1.2/include/configs/HUB405.h 2005-03-11 22:19:12.000000000 +0200
-@@ -35,7 +35,7 @@
-
- #define CONFIG_405EP 1 /* This is a PPC405 CPU */
- #define CONFIG_4xx 1 /* ...member of PPC4xx family */
--#define CONFIG_HUB405 1 /* ...on a HUB405 board */
-+#define CONFIG_EMETEC405 1 /* ...on a EMETEC405 board */
-
- #define CONFIG_BOARD_EARLY_INIT_F 1 /* call board_early_init_f() */
- #define CONFIG_MISC_INIT_R 1 /* call misc_init_r() */
-diff -uNr u-boot-1.1.2/include/flash.h u-boot-emetec-1.1.2/include/flash.h
---- u-boot-1.1.2/include/flash.h 2004-12-16 20:01:48.000000000 +0200
-+++ u-boot-emetec-1.1.2/include/flash.h 2005-05-25 10:04:56.000000000 +0300
-@@ -229,7 +229,11 @@
-
- #define STM_ID_x800AB 0x005B005B /* M29W800AB ID (8M = 512K x 16 ) */
- #define STM_ID_29W320DT 0x22CA22CA /* M29W320DT ID (32 M, top boot sector) */
--#define STM_ID_29W320DB 0x22CB22CB /* M29W320DB ID (32 M, bottom boot sect) */
-+#define STM_ID_29W320DB 0x22CB22CB /* M29W320DB ID (32 M, bottom boot sect)*/
-+
-+#define STM_ID_29W640DT 0x22DE22DE /* M29W640DT ID (64 M, top boot sector) */
-+#define STM_ID_29W640DB 0x22DF22DF /* M29W640DB ID (64 M, bottom boot sect)*/
-+
- #define STM_ID_29W040B 0x00E300E3 /* M29W040B ID (4M = 512K x 8) */
-
- #define INTEL_ID_28F016S 0x66a066a0 /* 28F016S[VS] ID (16M = 512k x 16) */
-@@ -328,6 +332,8 @@
- #define FLASH_STM800AB 0x0051 /* STM M29WF800AB ( 8M = 512K x 16 ) */
- #define FLASH_STMW320DT 0x0052 /* STM M29W320DT (32 M, top boot sector) */
- #define FLASH_STMW320DB 0x0053 /* STM M29W320DB (32 M, bottom boot sect)*/
-+#define FLASH_STMW640DT 0x0054 /* STM M29W640DT (64 M, top boot sector) */
-+#define FLASH_STMW640DB 0x0055 /* STM M29W640DB (64 M, bottom boot sect)*/
- #define FLASH_STM320DB 0x00CB /* STM M29W320DB (4M = 64K x 64, bottom)*/
- #define FLASH_STM800DT 0x00D7 /* STM M29W800DT (1M = 64K x 16, top) */
- #define FLASH_STM800DB 0x005B /* STM M29W800DB (1M = 64K x 16, bottom)*/
-diff -uNr u-boot-1.1.2/include/net.h u-boot-emetec-1.1.2/include/net.h
---- u-boot-1.1.2/include/net.h 2004-10-10 00:56:21.000000000 +0300
-+++ u-boot-emetec-1.1.2/include/net.h 2005-04-27 23:16:40.000000000 +0300
-@@ -331,9 +331,9 @@
- #define NETLOOP_SUCCESS 3
- #define NETLOOP_FAIL 4
-
--#ifdef CONFIG_NET_MULTI
-+/* #ifdef CONFIG_NET_MULTI */
- extern int NetRestartWrap; /* Tried all network devices */
--#endif
-+/* #endif */
-
- typedef enum { BOOTP, RARP, ARP, TFTP, DHCP, PING, DNS, NFS, CDP, NETCONS } proto_t;
-
-diff -uNr u-boot-1.1.2/lib_ppc/board.c u-boot-emetec-1.1.2/lib_ppc/board.c
---- u-boot-1.1.2/lib_ppc/board.c 2004-12-31 11:32:54.000000000 +0200
-+++ u-boot-emetec-1.1.2/lib_ppc/board.c 2005-04-27 23:03:33.000000000 +0300
-@@ -970,7 +970,8 @@
- nand_init(); /* go init the NAND */
- #endif
-
--#if (CONFIG_COMMANDS & CFG_CMD_NET) && defined(CONFIG_NET_MULTI)
-+
-+#if (CONFIG_COMMANDS & CFG_CMD_NET) /* && defined(CONFIG_NET_MULTI) */
- WATCHDOG_RESET ();
- puts ("Net: ");
- eth_initialize (bd);
-diff -uNr u-boot-1.1.2/loadftp.sh u-boot-emetec-1.1.2/loadftp.sh
---- u-boot-1.1.2/loadftp.sh 1970-01-01 02:00:00.000000000 +0200
-+++ u-boot-emetec-1.1.2/loadftp.sh 2005-04-25 21:30:54.000000000 +0300
-@@ -0,0 +1 @@
-+cp u-boot.bin /home/ftp/uboot.bin
-diff -uNr u-boot-1.1.2/loadwww.sh u-boot-emetec-1.1.2/loadwww.sh
---- u-boot-1.1.2/loadwww.sh 1970-01-01 02:00:00.000000000 +0200
-+++ u-boot-emetec-1.1.2/loadwww.sh 2005-03-12 13:06:19.000000000 +0200
-@@ -0,0 +1,2 @@
-+#!/bin/bash
-+rsync -vzr --rsh='ssh -l admin -p 5522' /home/admin/uboot/ admin@mhaber.net:/home/admin/uboot
-diff -uNr u-boot-1.1.2/net/eth.c u-boot-emetec-1.1.2/net/eth.c
---- u-boot-1.1.2/net/eth.c 2004-12-16 19:49:38.000000000 +0200
-+++ u-boot-emetec-1.1.2/net/eth.c 2005-05-06 18:04:08.000000000 +0300
-@@ -25,7 +25,7 @@
- #include <command.h>
- #include <net.h>
-
--#if (CONFIG_COMMANDS & CFG_CMD_NET) && defined(CONFIG_NET_MULTI)
-+#if (CONFIG_COMMANDS & CFG_CMD_NET) /* && defined(CONFIG_NET_MULTI) */
-
- #ifdef CFG_GT_6426x
- extern int gt6426x_eth_initialize(bd_t *bis);
-@@ -126,10 +126,13 @@
- #ifdef CONFIG_DB64460
- mv6446x_eth_initialize(bis);
- #endif
-+
- #if defined(CONFIG_405GP) || defined(CONFIG_405EP) || \
- ( defined(CONFIG_440) && !defined(CONFIG_NET_MULTI) )
- ppc_4xx_eth_initialize(bis);
-+ eth_number=1;
- #endif
-+
- #if defined(CONFIG_440) && defined(CONFIG_NET_MULTI)
- ppc_440x_eth_initialize(bis);
- #endif
-@@ -197,6 +200,7 @@
- rtl8169_initialize(bis);
- #endif
-
-+#if defined(CONFIG_NET_MULTI)
- if (!eth_devices) {
- puts ("No ethernet found.\n");
- } else {
-@@ -248,7 +252,6 @@
- dev = dev->next;
- } while(dev != eth_devices);
-
--#ifdef CONFIG_NET_MULTI
- /* update current ethernet name */
- if (eth_current) {
- char *act = getenv("ethact");
-@@ -256,14 +259,14 @@
- setenv("ethact", eth_current->name);
- } else
- setenv("ethact", NULL);
--#endif
--
- putc ('\n');
- }
-+#endif
-
- return eth_number;
- }
-
-+#ifdef CONFIG_NET_MULTI
- void eth_set_enetaddr(int num, char *addr) {
- struct eth_device *dev;
- unsigned char enetaddr[6];
-@@ -362,21 +365,20 @@
-
- eth_current = eth_current->next;
-
--#ifdef CONFIG_NET_MULTI
-+//#ifdef CONFIG_NET_MULTI
- /* update current ethernet name */
- {
- char *act = getenv("ethact");
- if (act == NULL || strcmp(act, eth_current->name) != 0)
- setenv("ethact", eth_current->name);
- }
--#endif
-+//#endif
-
- if (first_failed == eth_current) {
- NetRestartWrap = 1;
- }
- }
-
--#ifdef CONFIG_NET_MULTI
- void eth_set_current(void)
- {
- char *act;
-@@ -397,10 +399,11 @@
-
- setenv("ethact", eth_current->name);
- }
--#endif
-
- char *eth_get_name (void)
- {
- return (eth_current ? eth_current->name : "unknown");
- }
- #endif
-+
-+#endif
-diff -uNr u-boot-1.1.2/net/net.c u-boot-emetec-1.1.2/net/net.c
---- u-boot-1.1.2/net/net.c 2004-10-12 01:51:14.000000000 +0300
-+++ u-boot-emetec-1.1.2/net/net.c 2005-04-27 23:34:20.000000000 +0300
-@@ -126,11 +126,11 @@
- { 0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc };
- #endif
- int NetState; /* Network loop state */
--#ifdef CONFIG_NET_MULTI
-+/* #ifdef CONFIG_NET_MULTI */
- int NetRestartWrap = 0; /* Tried all network devices */
- static int NetRestarted = 0; /* Network loop restarted */
- static int NetDevExists = 0; /* At least one device configured */
--#endif
-+/* #endif */
-
- /* XXX in both little & big endian machines 0xFFFF == ntohs(-1) */
- ushort NetOurVLAN = 0xFFFF; /* default is without VLAN */
-diff -uNr u-boot-1.1.2/patches/arm_flags.patch u-boot-emetec-1.1.2/patches/arm_flags.patch
---- u-boot-1.1.2/patches/arm_flags.patch 2007-04-20 00:01:06.000000000 +0300
-+++ u-boot-emetec-1.1.2/patches/arm_flags.patch 1970-01-01 02:00:00.000000000 +0200
-@@ -1,15 +0,0 @@
--
--#
--# Patch managed by http://www.holgerschurig.de/patcher.html
--#
--
----- u-boot-1.1.2/cpu/pxa/config.mk~armflags
--+++ u-boot-1.1.2/cpu/pxa/config.mk
--@@ -23,6 +23,6 @@
-- #
--
-- PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \
--- -mshort-load-bytes -msoft-float
--+ -msoft-float
--
-- PLATFORM_CPPFLAGS += -mapcs-32 -march=armv4 -mtune=strongarm1100
-diff -uNr u-boot-1.1.2/patches/series u-boot-emetec-1.1.2/patches/series
---- u-boot-1.1.2/patches/series 2007-04-20 00:01:06.000000000 +0300
-+++ u-boot-emetec-1.1.2/patches/series 1970-01-01 02:00:00.000000000 +0200
-@@ -1 +0,0 @@
--arm_flags.patch -p1
-diff -uNr u-boot-1.1.2/lib_ppc/board.c new-uboot-1.1.2/lib_ppc/board.c
---- u-boot-1.1.2/lib_ppc/board.c 2005-04-27 23:03:33.000000000 +0300
-+++ new-uboot-1.1.2/lib_ppc/board.c 2007-04-20 00:55:16.000000000 +0300
-@@ -347,6 +347,7 @@
-
- bd_t *bd;
- ulong len, addr, addr_sp;
-+ ulong *s;
- gd_t *id;
- init_fnc_t **init_fnc_ptr;
- #ifdef CONFIG_PRAM
-@@ -466,8 +467,10 @@
- */
- addr_sp -= 16;
- addr_sp &= ~0xF;
-- *((ulong *) addr_sp)-- = 0;
-- *((ulong *) addr_sp)-- = 0;
-+ s = (ulong *)addr_sp;
-+ *s-- = 0;
-+ *s-- = 0;
-+ addr_sp = (ulong)s;
- debug ("Stack Pointer at: %08lx\n", addr_sp);
-
- /*
-diff -uNr u-boot-1.1.2/net/net.c new-uboot-1.1.2/net/net.c
---- u-boot-1.1.2/net/net.c 2005-04-27 23:34:20.000000000 +0300
-+++ new-uboot-1.1.2/net/net.c 2007-04-20 01:00:26.000000000 +0300
-@@ -1491,14 +1491,17 @@
- unsigned
- NetCksum(uchar * ptr, int len)
- {
-- ulong xsum;
-
-- xsum = 0;
-- while (len-- > 0)
-- xsum += *((ushort *)ptr)++;
-- xsum = (xsum & 0xffff) + (xsum >> 16);
-- xsum = (xsum & 0xffff) + (xsum >> 16);
-- return (xsum & 0xffff);
-+ ulong xsum;
-+ ushort *p = (ushort *)ptr;
-+
-+ xsum = 0;
-+ while (len-- > 0)
-+ xsum += *p++;
-+ xsum = (xsum & 0xffff) + (xsum >> 16);
-+ xsum = (xsum & 0xffff) + (xsum >> 16);
-+ return (xsum & 0xffff);
-+
- }
-
- int
-diff -uNr u-boot-1.1.2/net/tftp.c new-uboot-1.1.2/net/tftp.c
---- u-boot-1.1.2/net/tftp.c 2004-04-16 00:48:55.000000000 +0300
-+++ new-uboot-1.1.2/net/tftp.c 2005-12-16 18:39:27.000000000 +0200
-@@ -58,7 +58,7 @@
- static char *tftp_filename;
-
- #ifdef CFG_DIRECT_FLASH_TFTP
--extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
-+extern flash_info_t flash_info[];
- #endif
-
- static __inline__ void
-@@ -78,7 +78,7 @@
- }
-
- if (rc) { /* Flash is destination for this packet */
-- rc = flash_write ((uchar *)src, (ulong)(load_addr+offset), len);
-+ rc = flash_write ((char *)src, (ulong)(load_addr+offset), len);
- if (rc) {
- flash_perror (rc);
- NetState = NETLOOP_FAIL;
-@@ -106,6 +106,7 @@
- volatile uchar * pkt;
- volatile uchar * xp;
- int len = 0;
-+ volatile ushort *s;
-
- /*
- * We will always be sending some sort of packet, so
-@@ -117,7 +118,9 @@
-
- case STATE_RRQ:
- xp = pkt;
-- *((ushort *)pkt)++ = htons(TFTP_RRQ);
-+ s = (ushort *)pkt;
-+ *s++ = htons(TFTP_RRQ);
-+ pkt = (uchar *)s;
- strcpy ((char *)pkt, tftp_filename);
- pkt += strlen(tftp_filename) + 1;
- strcpy ((char *)pkt, "octet");
-@@ -135,15 +138,19 @@
- case STATE_DATA:
- case STATE_OACK:
- xp = pkt;
-- *((ushort *)pkt)++ = htons(TFTP_ACK);
-- *((ushort *)pkt)++ = htons(TftpBlock);
-+ s = (ushort *)pkt;
-+ *s++ = htons(TFTP_ACK);
-+ *s++ = htons(TftpBlock);
-+ pkt = (uchar *)s;
- len = pkt - xp;
- break;
-
- case STATE_TOO_LARGE:
- xp = pkt;
-- *((ushort *)pkt)++ = htons(TFTP_ERROR);
-- *((ushort *)pkt)++ = htons(3);
-+ s = (ushort *)pkt;
-+ *s++ = htons(TFTP_ERROR);
-+ *s++ = htons(3);
-+ pkt = (uchar *)s;
- strcpy ((char *)pkt, "File too large");
- pkt += 14 /*strlen("File too large")*/ + 1;
- len = pkt - xp;
-@@ -151,8 +158,10 @@
-
- case STATE_BAD_MAGIC:
- xp = pkt;
-- *((ushort *)pkt)++ = htons(TFTP_ERROR);
-- *((ushort *)pkt)++ = htons(2);
-+ s = (ushort *)pkt;
-+ *s++ = htons(TFTP_ERROR);
-+ *s++ = htons(2);
-+ pkt = (uchar *)s;
- strcpy ((char *)pkt, "File has bad magic");
- pkt += 18 /*strlen("File has bad magic")*/ + 1;
- len = pkt - xp;
-@@ -167,6 +176,7 @@
- TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
- {
- ushort proto;
-+ ushort *s;
-
- if (dest != TftpOurPort) {
- return;
-@@ -180,7 +190,9 @@
- }
- len -= 2;
- /* warning: don't use increment (++) in ntohs() macros!! */
-- proto = *((ushort *)pkt)++;
-+ s = (ushort *)pkt;
-+ proto = *s++;
-+ pkt = (uchar *)s;
- switch (ntohs(proto)) {
-
- case TFTP_RRQ:
-@@ -301,14 +313,16 @@
- void
- TftpStart (void)
- {
-- if (BootFile[0] == '\0') {
-- IPaddr_t OurIP = ntohl(NetOurIP);
-+#ifdef CONFIG_TFTP_PORT
-+ char *ep; /* Environment pointer */
-+#endif
-
-+ if (BootFile[0] == '\0') {
- sprintf(default_filename, "%02lX%02lX%02lX%02lX.img",
-- OurIP & 0xFF,
-- (OurIP >> 8) & 0xFF,
-- (OurIP >> 16) & 0xFF,
-- (OurIP >> 24) & 0xFF );
-+ NetOurIP & 0xFF,
-+ (NetOurIP >> 8) & 0xFF,
-+ (NetOurIP >> 16) & 0xFF,
-+ (NetOurIP >> 24) & 0xFF );
- tftp_filename = default_filename;
-
- printf ("*** Warning: no boot file name; using '%s'\n",
-@@ -354,7 +368,16 @@
- TftpServerPort = WELL_KNOWN_PORT;
- TftpTimeoutCount = 0;
- TftpState = STATE_RRQ;
-+ /* Use a pseudo-random port unless a specific port is set */
- TftpOurPort = 1024 + (get_timer(0) % 3072);
-+#ifdef CONFIG_TFTP_PORT
-+ if ((ep = getenv("tftpdstp")) != NULL) {
-+ TftpServerPort = simple_strtol(ep, NULL, 10);
-+ }
-+ if ((ep = getenv("tftpsrcp")) != NULL) {
-+ TftpOurPort= simple_strtol(ep, NULL, 10);
-+ }
-+#endif
- TftpBlock = 0;
-
- /* zero out server ether in case the server ip has changed */
-diff -uNr u-boot-1.1.2/board/emetec405/flash.c new-uboot-1.1.2/board/emetec405/flash.c
---- u-boot-1.1.2/board/emetec405/flash.c 2007-04-20 00:40:26.000000000 +0300
-+++ new-uboot-1.1.2/board/emetec405/flash.c 2007-04-20 00:41:11.000000000 +0300
-@@ -31,6 +31,7 @@
- */
- static ulong flash_get_size (vu_long * addr, flash_info_t * info);
- static void flash_get_offsets (ulong base, flash_info_t * info);
-+static int write_word (flash_info_t *info, ulong dest, ulong data);
-
- /*-----------------------------------------------------------------------
- */
|