u-boot: Add support for Boundary Devices Neon board.
authorFlorian Boor <florian.boor@kernelconcepts.de>
Mon, 8 Oct 2007 15:00:21 +0000 (15:00 +0000)
committerFlorian Boor <florian.boor@kernelconcepts.de>
Mon, 8 Oct 2007 15:00:21 +0000 (15:00 +0000)
packages/uboot/u-boot-1.1.2/u-boot-1.1.2-neon.patch [new file with mode: 0644]
packages/uboot/u-boot_1.1.2.bb

diff --git a/packages/uboot/u-boot-1.1.2/u-boot-1.1.2-neon.patch b/packages/uboot/u-boot-1.1.2/u-boot-1.1.2-neon.patch
new file mode 100644 (file)
index 0000000..ed959d4
--- /dev/null
@@ -0,0 +1,19204 @@
+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 (&regs->revision) & 0xff;
++      if (temp != 0x10)
++              dbg ("spec %d.%d", (temp >> 4), (temp & 0x0f));
++
++      temp = readl (&regs->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 (&regs->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 (&regs->intrstatus));
++      ohci_dump_intr_mask ("intrenable", readl (&regs->intrenable));
++
++      maybe_print_eds ("ed_periodcurrent", readl (&regs->ed_periodcurrent));
++
++      maybe_print_eds ("ed_controlhead", readl (&regs->ed_controlhead));
++      maybe_print_eds ("ed_controlcurrent", readl (&regs->ed_controlcurrent));
++
++      maybe_print_eds ("ed_bulkhead", readl (&regs->ed_bulkhead));
++      maybe_print_eds ("ed_bulkcurrent", readl (&regs->ed_bulkcurrent));
++
++      maybe_print_eds ("donehead", readl (&regs->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 (&regs->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, &regs->intrdisable);
++              stat = dl_done_list (&gohci, dl_reverse_done_list (&gohci));
++              writel (OHCI_INTR_WDH, &regs->intrenable);
++dbg("wdh: %x\n", stat );
++              goto out ;
++      }
++
++      if (ints & OHCI_INTR_SO) {
++              dbg("USB Schedule overrun\n");
++              writel (OHCI_INTR_SO, &regs->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, &regs->intrdisable);
++              if (ohci->ed_rm_list[frame] != NULL)
++                      writel (OHCI_INTR_SF, &regs->intrenable);
++              if( -1 == stat )
++                      stat = 0xff;
++dbg("sf\n" );
++      }
++      if( 0 == ints )
++              stat = 0 ;
++out:
++      writel (ints, &regs->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\r
++\r
++#if (PLATFORM_TYPE==NEONB)\r
++#define FLASH_BASE_ADDRESS 0x04000000\r
++#else\r
++#define FLASH_BASE_ADDRESS 0x0\r
++#endif\r
++\r
++\r
++#define FLASH_ID_CMD          ((0x0090<<16) + 0x0090)                 //read Identifier Codes\r
++#define FLASH_STATUS_CMD      ((0x0070<<16) + 0x0070)\r
++#define FLASH_STATUS_CLEAR_CMD        ((0x0050<<16) + 0x0050)\r
++#define FLASH_READ_CMD                ((0x00FF<<16) + 0x00FF)                 //Read Array/Reset\r
++#define FLASH_ERASE_CMD               ((0x0020<<16) + 0x0020)                 //Block Erase\r
++#define FLASH_CONFIRM_CMD     ((0x00D0<<16) + 0x00D0)                 //Block Erase and Program Resume\r
++//#define FLASH_WRITE_CMD             ((0x0040<<16) + 0x0040)                 //Program word\r
++#define FLASH_WRITE_TO_BUFFER_CMD     ((0x00E8<<16) + 0x00E8)                 //Program word\r
++\r
++#define FLASH_SUCCESS_RSP     ((0x0080<<16) + 0x0080)\r
++\r
++#define stmicro_manCode ((0x0020<<16) + 0x0020)\r
++#define intel_manCode ((0x0089<<16) + 0x0089)\r
++#define SECT_SIZE (1<<18)             //256k\r
++\r
++#define f320j3a_devCode ((0x0016<<16) + 0x0016)\r
++#define f320j3a_NUM_SECTORS 32                //for 8M flash\r
++#define f320j3a_SIZE (f320j3a_NUM_SECTORS*SECT_SIZE)\r
++\r
++#define f640j3a_devCode ((0x0017<<16) + 0x0017)\r
++#define f640j3a_NUM_SECTORS 64                //for 16M flash (8 meg on 16bit boards)\r
++#define f640j3a_SIZE (f640j3a_NUM_SECTORS*SECT_SIZE)\r
++\r
++#define f128j3a_devCode ((0x0018<<16) + 0x0018)\r
++#define f128j3a_NUM_SECTORS 128               //for 32M flash\r
++#define f128j3a_SIZE (f128j3a_NUM_SECTORS*SECT_SIZE)\r
++// *****************************\r
++#define MANCODE 0\r
++#define DEVCODE 4\r
++\r
++\r
++\r
++#define rRet          r6\r
++#define rRamSectorEnd r7\r
++#define rRamSector    rNum1\r
++#define rRamEnd               rNum2\r
++#define rFlashBase    sl      //r10\r
++#define rFlashSector  fp      //r11\r
++\r
++#define CMD_BURN 0\r
++#define CMD_VERIFY 1\r
++#define CMD_BURNALL 2\r
++\r
++.macro delayCnt rTemp,cnt\r
++      mov     \rTemp,#\cnt\r
++90:   subs    \rTemp,\rTemp,#1\r
++      bne     90b\r
++.endm\r
++// *********************************\r
++//default delay is for write recovery before read, allow 400 MHZ cpu\r
++.macro delay\r
++      delayCnt r4,((40/10)*COUNT_MULT)\r
++.endm\r
++\r
++\r
++\r
++.macro FLASH_GPIO_WAIT_FOR_IDLE\r
++      .if  FLASH_GPIO_STATUS\r
++      bl FlashGpioWaitForIdle\r
++      .endif\r
++.endm\r
++\r
++.macro DEFINE_FLASH_GPIO_WAIT_FOR_IDLE\r
++      .if  FLASH_GPIO_STATUS\r
++FlashGpioWaitForIdle:\r
++//500 ns delay for STS going low\r
++      delayCnt r4,((500/10)*COUNT_MULT)       //500ns /10ns (for 100MHZ cpu cycle time) * 4 (100MHZ cpu)\r
++      mov     r5,#0x300000\r
++      BigMov  r4,GPIO_BASE\r
++91:   ldr     r2,[r4,#GPLR0]\r
++      and     r2,r2,#3\r
++      cmp     r2,#3\r
++      subnes  r5,r5,#1\r
++      bne     91b\r
++      mov     pc,lr                   //return\r
++      .endif\r
++.endm\r
++\r
++//out: z-1 timeout\r
++.macro        waitForReady istr,ildr,mask,inc\r
++      BigMov  r2,FLASH_STATUS_CMD&\mask\r
++      \istr   r2,[r1,#-\inc]\r
++\r
++      FLASH_GPIO_WAIT_FOR_IDLE\r
++      BigMov  r3,FLASH_SUCCESS_RSP&\mask\r
++\r
++      mov     r5,#0x300000*COUNT_MULT\r
++      .if  FLASH_GPIO_STATUS\r
++      b       92f\r
++      .endif\r
++\r
++71:\r
++      delayCnt r4,((500/10)*COUNT_MULT)\r
++92:   \ildr   r4,[r1,#-\inc]  //!!! read status\r
++      and     r4,r4,r3\r
++      cmp     r4,r3\r
++      subnes  r5,r5,#1\r
++      bne     71b\r
++\r
++      BigMov  r2,FLASH_READ_CMD&\mask\r
++      \istr   r2,[r1,#-\inc]\r
++      delay\r
++      teq     r5,#0\r
++.endm\r
++\r
++\r
++\r
++//out: z-1 timeout\r
++.macro        WaitForEraseDone istr,ildr,mask\r
++      FLASH_GPIO_WAIT_FOR_IDLE\r
++      BigMov  r3,FLASH_SUCCESS_RSP&\mask\r
++      mov     r5,#0x10000\r
++92:\r
++      delayCnt r4,0x3000\r
++      \ildr   r4,[rFlashSector]\r
++      and     r4,r4,r3\r
++      cmp     r4,r3\r
++      subnes  r5,r5,#1\r
++      bne     92b\r
++\r
++      BigMov  r2,FLASH_READ_CMD&\mask\r
++      \istr   r2,[rFlashSector,#0]\r
++      delay\r
++      teq     r5,#0\r
++.endm\r
++// ***********************************\r
++\r
++//r5 - command - CMD_BURN or CMD_BURNALL\r
++//rRet(r6) succesful burn return address\r
++//rRamSectorEnd(r7) - but not an input, just how it is used\r
++//rRamSector(r8) - start\r
++//rRamEnd(r9) - end\r
++//rFlashBase(sl,r10) - flash base\r
++//rFlashSector(fp,r11) - starting flash sector\r
++//rDBG(sp,r13)\r
++//lr - return address on failure\r
++\r
++.macro        BurnRtn istr,ildr,mask,shift,sizeShift,inc,plait\r
++      str     r5,[rDBG,#DBG_TEMP]\r
++      BigMov  r0,FLASH_STATUS_CLEAR_CMD&\mask\r
++      \istr   r0,[rFlashBase,#0]\r
++      delay\r
++      BigMov  r0,FLASH_ID_CMD&\mask\r
++      \istr   r0,[rFlashBase,#0]\r
++      delay\r
++      BigMov  r4,intel_manCode&\mask\r
++      BigMov  r1,stmicro_manCode&\mask\r
++      BigMov  r5,f320j3a_devCode&\mask\r
++      \ildr   r2,[rFlashBase,#MANCODE>>\shift]\r
++      \ildr   r3,[rFlashBase,#DEVCODE>>\shift]\r
++\r
++      BigMov  r0,FLASH_READ_CMD&\mask\r
++      \istr   r0,[rFlashBase,#0]\r
++      delayCnt r0,((40/10)*COUNT_MULT)\r
++\r
++      mov     r0,#f320j3a_SIZE>>\sizeShift\r
++      cmp     r3,r5\r
++\r
++      BigMovNe r5,f128j3a_devCode&\mask\r
++      movne   r0,#f128j3a_SIZE>>\sizeShift\r
++      cmpne   r3,r5\r
++\r
++      BigMovNe r5,f640j3a_devCode&\mask\r
++      movne   r0,#f640j3a_SIZE>>\sizeShift\r
++      cmpne   r3,r5\r
++\r
++      cmpeq   r2,r4\r
++      cmpne   r2,r1\r
++      movne   r0,#MANCODE>>2\r
++      movne   r1,#DEVCODE>>2\r
++      movne   pc,lr                   //return if unrecognized chip\r
++\r
++      sub     r1,rRamEnd,rRamSector\r
++      sub     r2,rFlashSector,rFlashBase\r
++      add     r1,r1,r2\r
++      cmp     r1,r0\r
++      movhi   pc,lr                   //return if trying to write too much\r
++\r
++      ldrb    r5,[rDBG,#DBG_TEMP]\r
++      cmp     r5,#CMD_BURNALL\r
++      streq   r0,[rDBG,#DBG_TEMP]     //r0 is size of flash\r
++\r
++      FLASH_GPIO_WAIT_FOR_IDLE\r
++1:\r
++      bl      PrintSector\r
++\r
++//Now see if block needs erased\r
++      add     rRamSectorEnd,rRamSector,#SECT_SIZE>>\shift\r
++      cmp     rRamSectorEnd,rRamEnd\r
++      movhi   rRamSectorEnd,rRamEnd\r
++      b       3f\r
++2:\r
++      ldr     r2,[r0],#4      //read ram\r
++      ldr     r3,[r1],#4      //read flash\r
++      and     r4,r3,r2\r
++      cmp     r4,r2\r
++      bne     10f\r
++3:    cmp     r0,rRamSectorEnd\r
++      blo     2b\r
++\r
++\r
++      ldr     r2,[rDBG,#DBG_TEMP]\r
++      movs    r2,r2\r
++      beq     20f\r
++      add     r0,rFlashSector,#SECT_SIZE>>\shift\r
++      b       62f\r
++61:\r
++      ldr     r2,[r1],#4      //read flash\r
++      adds    r2,r2,#1\r
++      bne     10f\r
++62:   cmp     r1,r0\r
++      blo     61b\r
++      b       19f             //erase not needed\r
++\r
++//erase\r
++10:\r
++      BigMov  r3,FLASH_READ_CMD&\mask\r
++      \istr   r3,[rFlashBase,#0]\r
++      delay\r
++      ldr     r3,[r1,#-4]     //read flash\r
++      and     r4,r3,r2\r
++      cmp     r4,r2\r
++      beq     3b              //br if (we signal) glitch caused a spurious status register read\r
++\r
++      BigMov  r0,FLASH_ERASE_CMD&\mask\r
++      \istr   r0,[rFlashSector]\r
++      BigMov  r0,FLASH_CONFIRM_CMD&\mask\r
++      \istr   r0,[rFlashSector]\r
++      bl      PrintErasing\r
++\r
++      WaitForEraseDone \istr,\ildr,\mask\r
++      beq     Timeout         //br if erase timed out\r
++\r
++      .if (\plait)\r
++      BigMov  r0,FLASH_ERASE_CMD&\mask\r
++      \istr   r0,[rFlashSector,#2]\r
++      BigMov  r0,FLASH_CONFIRM_CMD&\mask\r
++      \istr   r0,[rFlashSector,#2]\r
++      bl      PrintErasing\r
++\r
++      WaitForEraseDone \istr,\ildr,\mask\r
++      beq     Timeout         //br if erase timed out\r
++      .endif\r
++\r
++19:   cmp     rRamSector,rRamSectorEnd\r
++      bhs     42f\r
++\r
++//programming\r
++20:\r
++      bl      PrintProgramming\r
++21:\r
++      ldr     r2,[r0],#4      //read ram\r
++      ldr     r3,[r1],#4      //read flash\r
++      cmp     r2,r3\r
++      bne     22f\r
++28:\r
++      cmp     r0,rRamSectorEnd\r
++      blo     21b\r
++      b       30f             //goto verify\r
++\r
++22:\r
++      sub     r1,r1,#4\r
++      sub     r0,r0,#4\r
++      and     r2,r1,#0x3f>>\shift                     //align to a 64 byte boundary (32 per device)\r
++      sub     r1,r1,r2\r
++      sub     r0,r0,r2\r
++\r
++      BigMov  r2,FLASH_WRITE_TO_BUFFER_CMD&\mask\r
++      \istr   r2,[r1]         //!!! write_to_buffer\r
++\r
++      sub     r3,rRamSectorEnd,r0\r
++      mov     r3,r3,LSR #2-\shift\r
++      sub     r3,r3,#1\r
++      cmp     r3,#0x0f\r
++      movhi   r3,#0x0f\r
++      orr     r2,r3,r3,LSL #16\r
++      \istr   r2,[r1]         //!!! word cnt -1\r
++25:   \ildr   r2,[r0],#\inc\r
++      \istr   r2,[r1],#\inc   //!!! words\r
++      subs    r3,r3,#1\r
++      bpl     25b\r
++      BigMov  r2,FLASH_CONFIRM_CMD&\mask\r
++      \istr   r2,[r1,#-\inc]  //!!! confirm\r
++\r
++      waitForReady \istr,\ildr,\mask,\inc\r
++\r
++      .if (\plait)\r
++      beq     88f\r
++      sub     r1,r1,#\inc\r
++      sub     r0,r0,#\inc\r
++      and     r2,r1,#0x3f>>\shift                     //align to a 64 byte boundary (32 per device)\r
++      sub     r1,r1,r2\r
++      sub     r0,r0,r2\r
++\r
++      BigMov  r2,FLASH_WRITE_TO_BUFFER_CMD&\mask\r
++      \istr   r2,[r1,#2]!             //!!! write_to_buffer\r
++      sub     r3,rRamSectorEnd,r0\r
++      add     r0,r0,#2\r
++      mov     r3,r3,LSR #2-\shift\r
++      sub     r3,r3,#1\r
++      cmp     r3,#0x0f\r
++      movhi   r3,#0x0f\r
++      orr     r2,r3,r3,LSL #16\r
++      \istr   r2,[r1]         //!!! word cnt -1\r
++85:   \ildr   r2,[r0],#\inc\r
++      \istr   r2,[r1],#\inc   //!!! words\r
++      subs    r3,r3,#1\r
++      bpl     85b\r
++      BigMov  r2,FLASH_CONFIRM_CMD&\mask\r
++      \istr   r2,[r1,#-\inc]  //!!! confirm\r
++\r
++      waitForReady \istr,\ildr,\mask,\inc\r
++      sub     r0,r0,#2\r
++      sub     r1,r1,#2\r
++\r
++      bne     28b\r
++88:\r
++\r
++      .else\r
++      bne     28b\r
++      .endif\r
++      sub     rRamSector,r0,#0x40>>\shift     //whoops, timeout\r
++      sub     rFlashSector,r1,#0x40>>\shift\r
++      b       Timeout\r
++\r
++\r
++\r
++//verify\r
++30:\r
++      bl      PrintVerifying\r
++31:\r
++      ldr     r2,[r0],#4      //read ram\r
++      ldr     r3,[r1],#4      //read flash\r
++      cmp     r2,r3\r
++      bne     33f\r
++32:   cmp     r0,rRamSectorEnd\r
++      blo     31b\r
++42:\r
++      add     rRamSector,rRamSector,#SECT_SIZE>>\shift\r
++      add     rFlashSector,rFlashSector,#SECT_SIZE>>\shift\r
++      cmp     rRamSector,rRamEnd\r
++      blo     1b              //goto next sector\r
++\r
++      ldr     r2,[rDBG,#DBG_TEMP]\r
++      add     r2,r2,rFlashBase\r
++      cmp     rFlashSector,r2\r
++      blo     1b\r
++\r
++      b       PrintSuccess\r
++33:\r
++      BigMov  r3,FLASH_READ_CMD&\mask\r
++      \istr   r3,[rFlashBase,#0]\r
++      delay\r
++      ldr     r3,[r1,#-4]     //read flash\r
++      cmp     r2,r3\r
++      beq     32b             //br if (we signal) glitch caused a spurious status register read\r
++      b       ReturnError\r
++.endm\r
+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__\r
++#define __PLATFORMTYPES_H__ 1\r
++#define NEON                                          1\r
++#define NEONB                                         2\r
++#define BD2003                                                3\r
++#define GAME_WITH_SMC                         4\r
++#define GAME_CONTROLLER                               5\r
++#define GAME_CONTROLLER_PLAITED_A1    6\r
++#define BOUNDARY_OLD_BOARD                    7  //lcd pin reordering for rgb problem, don't use VLIO(gp18 is turnstile)\r
++#define OLD_GAME_CONTROLLER                   8\r
++#define HALOGEN                                               9\r
++\r
++#if (PLATFORM_TYPE==NEONB)\r
++#define PHYS_FLASH_BASE 0x04000000\r
++#else\r
++#define PHYS_FLASH_BASE 0x0\r
++#endif\r
++\r
++#endif\r
+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"\r
++#define DA320X240 0\r
++#define DA640X240 1\r
++#define DA800X480 2\r
++#define DA640X480 3\r
++#define DA240X320 4\r
++#define DA800X600 5\r
++#define DA1024X768 6\r
++#define DP480X320 7\r
++#define DP320X240 8\r
++#define DL122X32  9\r
++#define UNKNOWN   0xcc\r
++\r
++#ifdef __ARMASM\r
++      GBLS DEF_P\r
++#endif\r
++\r
++#if DISPLAY_TYPE==DA320X240                   //5.7 inch display\r
++#define DEF_P DA320X240_P\r
++#define DEF_DISPLAY_INDEX 0\r
++#else\r
++#if DISPLAY_TYPE==DA640X240           //6.2 inch display\r
++#define DEF_P DA640X240_P\r
++#define DEF_DISPLAY_INDEX 1\r
++#else\r
++#if DISPLAY_TYPE==DA800X480           //7 or 9 inch display\r
++#define DEF_P DA800X480_P\r
++#define DEF_DISPLAY_INDEX 2\r
++#else\r
++#if DISPLAY_TYPE==DA640X480           //10.4 inch display\r
++#define DEF_P DA640X480_P\r
++#define DEF_DISPLAY_INDEX 3\r
++#else\r
++#if DISPLAY_TYPE==DA240X320           //3.5 inch display\r
++#define DEF_P DA240X320_P\r
++#define DEF_DISPLAY_INDEX 4\r
++#else\r
++#if DISPLAY_TYPE==DA800X600\r
++#define DEF_P DA800X600_P\r
++#define DEF_DISPLAY_INDEX 5\r
++#else\r
++#if DISPLAY_TYPE==DA1024X768\r
++#define DEF_P DA1024X768_P\r
++#define DEF_DISPLAY_INDEX 6\r
++#else\r
++#if DISPLAY_TYPE==DP480X320           //5.7 inch display\r
++#define DEF_P DP480X320_P\r
++#define DEF_DISPLAY_INDEX 7\r
++#else\r
++#if DISPLAY_TYPE==DP320X240   //5.7 inch display\r
++#define DEF_P DP320X240_P\r
++#define DEF_DISPLAY_INDEX 8\r
++#else\r
++#if DISPLAY_TYPE==DL122X32\r
++#define DEF_P DL122X32_P\r
++#define DEF_DISPLAY_INDEX 9\r
++#else\r
++#if DISPLAY_TYPE==UNKNOWN\r
++#define DEF_P DA320X240_P\r
++#define DEF_DISPLAY_INDEX 0xcc\r
++\r
++#else\r
++#define DEF_P DA320X240_P\r
++#define DEF_DISPLAY_INDEX 0\r
++#warning "No display selected, defaulting to DA320X240"\r
++\r
++#endif                //0xcc\r
++#endif                //9\r
++#endif                //8\r
++#endif                //7\r
++#endif                //6\r
++#endif                //5\r
++#endif                //4\r
++#endif                //3\r
++#endif                //2\r
++#endif                //1\r
++#endif                //0\r
++\r
+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/patches/series u-boot-1.1.2-neon/patches/series
+--- u-boot-1.1.2/patches/series        1970-01-01 01:00:00.000000000 +0100
++++ u-boot-1.1.2-neon/patches/series   2007-08-11 21:01:36.000000000 +0200
+@@ -0,0 +1,2 @@
++arm_flags.patch -p1
++u-boot-2006-06-03.patch.gz -p1
+Binary files u-boot-1.1.2/patches/u-boot-2006-06-03.patch.gz and u-boot-1.1.2-neon/patches/u-boot-2006-06-03.patch.gz differ
+diff -u -r --new-file u-boot-1.1.2/.pc/applied-patches u-boot-1.1.2-neon/.pc/applied-patches
+--- u-boot-1.1.2/.pc/applied-patches   1970-01-01 01:00:00.000000000 +0100
++++ u-boot-1.1.2-neon/.pc/applied-patches      2007-08-11 21:01:36.000000000 +0200
+@@ -0,0 +1 @@
++arm_flags.patch
+diff -u -r --new-file u-boot-1.1.2/.pc/arm_flags.patch/cpu/pxa/config.mk u-boot-1.1.2-neon/.pc/arm_flags.patch/cpu/pxa/config.mk
+--- u-boot-1.1.2/.pc/arm_flags.patch/cpu/pxa/config.mk 1970-01-01 01:00:00.000000000 +0100
++++ u-boot-1.1.2-neon/.pc/arm_flags.patch/cpu/pxa/config.mk    2003-05-23 14:36:21.000000000 +0200
+@@ -0,0 +1,28 @@
++#
++# (C) Copyright 2002
++# Sysgo Real-Time Solutions, GmbH <www.elinos.com>
++# Marius Groeger <mgroeger@sysgo.de>
++#
++# See file CREDITS for list of people who contributed to this
++# project.
++#
++# This program is free software; you can redistribute it and/or
++# modify it under the terms of the GNU General Public License as
++# published by the Free Software Foundation; either version 2 of
++# the License, or (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++# MA 02111-1307 USA
++#
++
++PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common -ffixed-r8 \
++      -mshort-load-bytes -msoft-float
++
++PLATFORM_CPPFLAGS += -mapcs-32 -march=armv4 -mtune=strongarm1100
+diff -u -r --new-file u-boot-1.1.2/.pc/.version u-boot-1.1.2-neon/.pc/.version
+--- u-boot-1.1.2/.pc/.version  1970-01-01 01:00:00.000000000 +0100
++++ u-boot-1.1.2-neon/.pc/.version     2007-08-11 21:01:36.000000000 +0200
+@@ -0,0 +1 @@
++2
+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(&timestamp));
+       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
index 02fff45..82b169c 100644 (file)
@@ -1,4 +1,4 @@
-PR = "r1"
+PR = "r2"
 require u-boot.inc
 
 SRC_URI = "ftp://ftp.denx.de/pub/u-boot/u-boot-${PV}.tar.bz2 \
@@ -10,6 +10,7 @@ SRC_URI_append_mnci   = "file://mnci.patch;patch=1 \
                          file://command-names.patch;patch=1"
 
 SRC_URI_append_magicbox  = "file://u-boot-emetec.patch;patch=1 "
+SRC_URI_append_bd-neon = "file://u-boot-1.1.2-neon.patch;patch=1"
 
 # TODO: SRC_URI_append_rt3000