]> git.sur5r.net Git - u-boot/commitdiff
Move AT91RM9200DK board support under board/atmel
authorHaavard Skinnemoen <hskinnemoen at>
Fri, 22 Feb 2008 11:40:50 +0000 (11:40 +0000)
committerubuntu <ubuntu@us710-oe.cambridge.arm.com>
Thu, 14 Feb 2008 10:07:46 +0000 (10:07 +0000)
We already have a vendor subdir for Atmel, so we should use it.

Signed-off-by: Haavard Skinnemoen <hskinnemoen <at> atmel.com>
15 files changed:
Makefile
board/at91rm9200dk/Makefile [deleted file]
board/at91rm9200dk/at91rm9200dk.c [deleted file]
board/at91rm9200dk/config.mk [deleted file]
board/at91rm9200dk/flash.c [deleted file]
board/at91rm9200dk/led.c [deleted file]
board/at91rm9200dk/mux.c [deleted file]
board/at91rm9200dk/u-boot.lds [deleted file]
board/atmel/at91rm9200dk/Makefile [new file with mode: 0755]
board/atmel/at91rm9200dk/at91rm9200dk.c [new file with mode: 0644]
board/atmel/at91rm9200dk/config.mk [new file with mode: 0644]
board/atmel/at91rm9200dk/flash.c [new file with mode: 0644]
board/atmel/at91rm9200dk/led.c [new file with mode: 0644]
board/atmel/at91rm9200dk/mux.c [new file with mode: 0644]
board/atmel/at91rm9200dk/u-boot.lds [new file with mode: 0644]

index ec8661ad89863b047e2982713c431e42619807f9..1f63b8bc44f43be672f0d0dfa60f8129629d0824 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2302,7 +2302,7 @@ xtract_omap1610xxx = $(subst _cs0boot,,$(subst _cs3boot,,$(subst _cs_autoboot,,$
 xtract_omap730p2 = $(subst _cs0boot,,$(subst _cs3boot,, $(subst _config,,$1)))
 
 at91rm9200dk_config    :       unconfig
-       @$(MKCONFIG) $(@:_config=) arm arm920t at91rm9200dk NULL at91rm9200
+       @$(MKCONFIG) $(@:_config=) arm arm920t at91rm9200dk atmel at91rm9200
 
 cmc_pu2_config :       unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t cmc_pu2 NULL at91rm9200
diff --git a/board/at91rm9200dk/Makefile b/board/at91rm9200dk/Makefile
deleted file mode 100755 (executable)
index 01f3bc3..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# (C) Copyright 2003-2006
-# 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    = $(obj)lib$(BOARD).a
-
-COBJS  := at91rm9200dk.o flash.o led.o mux.o
-
-SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
-OBJS   := $(addprefix $(obj),$(COBJS))
-SOBJS  := $(addprefix $(obj),$(SOBJS))
-
-$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
-       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
-
-clean:
-       rm -f $(SOBJS) $(OBJS)
-
-distclean:     clean
-       rm -f $(LIB) core *.bak .depend
-
-#########################################################################
-
-# defines $(obj).depend target
-include $(SRCTREE)/rules.mk
-
-sinclude $(obj).depend
-
-#########################################################################
diff --git a/board/at91rm9200dk/at91rm9200dk.c b/board/at91rm9200dk/at91rm9200dk.c
deleted file mode 100644 (file)
index c564f73..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * (C) Copyright 2002
- * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
- * Marius Groeger <mgroeger@sysgo.de>
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#include <common.h>
-#include <asm/arch/AT91RM9200.h>
-#include <at91rm9200_net.h>
-#include <dm9161.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-/* ------------------------------------------------------------------------- */
-/*
- * Miscelaneous platform dependent initialisations
- */
-
-int board_init (void)
-{
-       /* Enable Ctrlc */
-       console_init_f ();
-
-       /* Correct IRDA resistor problem */
-       /* Set PA23_TXD in Output */
-       ((AT91PS_PIO) AT91C_BASE_PIOA)->PIO_OER = AT91C_PA23_TXD2;
-
-       /* memory and cpu-speed are setup before relocation */
-       /* so we do _nothing_ here */
-
-       /* arch number of AT91RM9200DK-Board */
-       gd->bd->bi_arch_number = MACH_TYPE_AT91RM9200;
-       /* adress of boot parameters */
-       gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
-
-       return 0;
-}
-
-int dram_init (void)
-{
-       gd->bd->bi_dram[0].start = PHYS_SDRAM;
-       gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;
-       return 0;
-}
-
-#ifdef CONFIG_DRIVER_ETHER
-#if defined(CONFIG_CMD_NET)
-
-/*
- * Name:
- *     at91rm9200_GetPhyInterface
- * Description:
- *     Initialise the interface functions to the PHY
- * Arguments:
- *     None
- * Return value:
- *     None
- */
-void at91rm9200_GetPhyInterface(AT91PS_PhyOps p_phyops)
-{
-       p_phyops->Init = dm9161_InitPhy;
-       p_phyops->IsPhyConnected = dm9161_IsPhyConnected;
-       p_phyops->GetLinkSpeed = dm9161_GetLinkSpeed;
-       p_phyops->AutoNegotiate = dm9161_AutoNegotiate;
-}
-
-#endif
-#endif /* CONFIG_DRIVER_ETHER */
-
-/*
- * Disk On Chip (NAND) Millenium initialization.
- * The NAND lives in the CS2* space
- */
-#if defined(CONFIG_CMD_NAND)
-extern ulong nand_probe (ulong physadr);
-
-#define AT91_SMARTMEDIA_BASE 0x40000000        /* physical address to access memory on NCS3 */
-void nand_init (void)
-{
-       /* Setup Smart Media, fitst enable the address range of CS3 */
-       *AT91C_EBI_CSA |= AT91C_EBI_CS3A_SMC_SmartMedia;
-       /* set the bus interface characteristics based on
-          tDS Data Set up Time 30 - ns
-          tDH Data Hold Time 20 - ns
-          tALS ALE Set up Time 20 - ns
-          16ns at 60 MHz ~= 3  */
-/*memory mapping structures */
-#define SM_ID_RWH      (5 << 28)
-#define SM_RWH         (1 << 28)
-#define SM_RWS         (0 << 24)
-#define SM_TDF         (1 << 8)
-#define SM_NWS         (3)
-       AT91C_BASE_SMC2->SMC2_CSR[3] = (SM_RWH | SM_RWS |
-               AT91C_SMC2_ACSS_STANDARD | AT91C_SMC2_DBW_8 |
-               SM_TDF | AT91C_SMC2_WSEN | SM_NWS);
-
-       /* enable the SMOE line PC0=SMCE, A21=CLE, A22=ALE */
-       *AT91C_PIOC_ASR = AT91C_PC0_BFCK | AT91C_PC1_BFRDY_SMOE |
-               AT91C_PC3_BFBAA_SMWE;
-       *AT91C_PIOC_PDR = AT91C_PC0_BFCK | AT91C_PC1_BFRDY_SMOE |
-               AT91C_PC3_BFBAA_SMWE;
-
-       /* Configure PC2 as input (signal READY of the SmartMedia) */
-       *AT91C_PIOC_PER = AT91C_PC2_BFAVD;      /* enable direct output enable */
-       *AT91C_PIOC_ODR = AT91C_PC2_BFAVD;      /* disable output */
-
-       /* Configure PB1 as input (signal Card Detect of the SmartMedia) */
-       *AT91C_PIOB_PER = AT91C_PIO_PB1;        /* enable direct output enable */
-       *AT91C_PIOB_ODR = AT91C_PIO_PB1;        /* disable output */
-
-       /* PIOB and PIOC clock enabling */
-       *AT91C_PMC_PCER = 1 << AT91C_ID_PIOB;
-       *AT91C_PMC_PCER = 1 << AT91C_ID_PIOC;
-
-       if (*AT91C_PIOB_PDSR & AT91C_PIO_PB1)
-               printf ("  No SmartMedia card inserted\n");
-#ifdef DEBUG
-       printf ("  SmartMedia card inserted\n");
-
-       printf ("Probing at 0x%.8x\n", AT91_SMARTMEDIA_BASE);
-#endif
-       printf ("%4lu MB\n", nand_probe(AT91_SMARTMEDIA_BASE) >> 20);
-}
-#endif
diff --git a/board/at91rm9200dk/config.mk b/board/at91rm9200dk/config.mk
deleted file mode 100644 (file)
index 9ce161e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-TEXT_BASE = 0x21f00000
diff --git a/board/at91rm9200dk/flash.c b/board/at91rm9200dk/flash.c
deleted file mode 100644 (file)
index 0513d61..0000000
+++ /dev/null
@@ -1,502 +0,0 @@
-/*
- * (C) Copyright 2002
- * Lineo, Inc. <www.lineo.com>
- * Bernhard Kuhn <bkuhn@lineo.com>
- *
- * (C) Copyright 2002
- * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
- * Alex Zuepke <azu@sysgo.de>
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#include <common.h>
-
-ulong myflush(void);
-
-
-/* Flash Organization Structure */
-typedef struct OrgDef
-{
-       unsigned int sector_number;
-       unsigned int sector_size;
-} OrgDef;
-
-
-/* Flash Organizations */
-OrgDef OrgAT49BV16x4[] =
-{
-       {  8,  8*1024 },        /*   8 *  8 kBytes sectors */
-       {  2, 32*1024 },        /*   2 * 32 kBytes sectors */
-       { 30, 64*1024 },        /*  30 * 64 kBytes sectors */
-};
-
-OrgDef OrgAT49BV16x4A[] =
-{
-       {  8,  8*1024 },        /*   8 *  8 kBytes sectors */
-       { 31, 64*1024 },        /*  31 * 64 kBytes sectors */
-};
-
-OrgDef OrgAT49BV6416[] =
-{
-       {   8,  8*1024 },       /*   8 *  8 kBytes sectors */
-       { 127, 64*1024 },       /* 127 * 64 kBytes sectors */
-};
-
-flash_info_t    flash_info[CFG_MAX_FLASH_BANKS];
-
-/* AT49BV1614A Codes */
-#define FLASH_CODE1            0xAA
-#define FLASH_CODE2            0x55
-#define ID_IN_CODE             0x90
-#define ID_OUT_CODE            0xF0
-
-
-#define CMD_READ_ARRAY         0x00F0
-#define CMD_UNLOCK1            0x00AA
-#define CMD_UNLOCK2            0x0055
-#define CMD_ERASE_SETUP                0x0080
-#define CMD_ERASE_CONFIRM      0x0030
-#define CMD_PROGRAM            0x00A0
-#define CMD_UNLOCK_BYPASS      0x0020
-#define CMD_SECTOR_UNLOCK      0x0070
-
-#define MEM_FLASH_ADDR1                (*(volatile u16 *)(CFG_FLASH_BASE + (0x00005555<<1)))
-#define MEM_FLASH_ADDR2                (*(volatile u16 *)(CFG_FLASH_BASE + (0x00002AAA<<1)))
-
-#define BIT_ERASE_DONE         0x0080
-#define BIT_RDY_MASK           0x0080
-#define BIT_PROGRAM_ERROR      0x0020
-#define BIT_TIMEOUT            0x80000000 /* our flag */
-
-#define READY 1
-#define ERR   2
-#define TMO   4
-
-/*-----------------------------------------------------------------------
- */
-void flash_identification (flash_info_t * info)
-{
-       volatile u16 manuf_code, device_code, add_device_code;
-
-       MEM_FLASH_ADDR1 = FLASH_CODE1;
-       MEM_FLASH_ADDR2 = FLASH_CODE2;
-       MEM_FLASH_ADDR1 = ID_IN_CODE;
-
-       manuf_code = *(volatile u16 *) CFG_FLASH_BASE;
-       device_code = *(volatile u16 *) (CFG_FLASH_BASE + 2);
-       add_device_code = *(volatile u16 *) (CFG_FLASH_BASE + (3 << 1));
-
-       MEM_FLASH_ADDR1 = FLASH_CODE1;
-       MEM_FLASH_ADDR2 = FLASH_CODE2;
-       MEM_FLASH_ADDR1 = ID_OUT_CODE;
-
-       /* Vendor type */
-       info->flash_id = ATM_MANUFACT & FLASH_VENDMASK;
-       printf ("Atmel: ");
-
-       if ((device_code & FLASH_TYPEMASK) == (ATM_ID_BV1614 & FLASH_TYPEMASK)) {
-
-               if ((add_device_code & FLASH_TYPEMASK) ==
-                       (ATM_ID_BV1614A & FLASH_TYPEMASK)) {
-                       info->flash_id |= ATM_ID_BV1614A & FLASH_TYPEMASK;
-                       printf ("AT49BV1614A (16Mbit)\n");
-               } else {                                /* AT49BV1614 Flash */
-                       info->flash_id |= ATM_ID_BV1614 & FLASH_TYPEMASK;
-                       printf ("AT49BV1614 (16Mbit)\n");
-               }
-
-       } else if ((device_code & FLASH_TYPEMASK) == (ATM_ID_BV6416 & FLASH_TYPEMASK)) {
-               info->flash_id |= ATM_ID_BV6416 & FLASH_TYPEMASK;
-               printf ("AT49BV6416 (64Mbit)\n");
-       }
-}
-
-ushort flash_number_sector(OrgDef *pOrgDef, unsigned int nb_blocks)
-{
-       int i, nb_sectors = 0;
-
-       for (i=0; i<nb_blocks; i++){
-               nb_sectors += pOrgDef[i].sector_number;
-       }
-
-       return nb_sectors;
-}
-
-void flash_unlock_sector(flash_info_t * info, unsigned int sector)
-{
-       volatile u16 *addr = (volatile u16 *) (info->start[sector]);
-
-       MEM_FLASH_ADDR1 = CMD_UNLOCK1;
-       *addr = CMD_SECTOR_UNLOCK;
-}
-
-
-ulong flash_init (void)
-{
-       int i, j, k;
-       unsigned int flash_nb_blocks, sector;
-       unsigned int start_address;
-       OrgDef *pOrgDef;
-
-       ulong size = 0;
-
-       for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {
-               ulong flashbase = 0;
-
-               flash_identification (&flash_info[i]);
-
-               if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
-                       (ATM_ID_BV1614 & FLASH_TYPEMASK)) {
-
-                       pOrgDef = OrgAT49BV16x4;
-                       flash_nb_blocks = sizeof (OrgAT49BV16x4) / sizeof (OrgDef);
-               } else if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
-                       (ATM_ID_BV1614A & FLASH_TYPEMASK)){     /* AT49BV1614A Flash */
-
-                       pOrgDef = OrgAT49BV16x4A;
-                       flash_nb_blocks = sizeof (OrgAT49BV16x4A) / sizeof (OrgDef);
-               } else if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
-                       (ATM_ID_BV6416 & FLASH_TYPEMASK)){      /* AT49BV6416 Flash */
-
-                       pOrgDef = OrgAT49BV6416;
-                       flash_nb_blocks = sizeof (OrgAT49BV6416) / sizeof (OrgDef);
-               } else {
-                       flash_nb_blocks = 0;
-                       pOrgDef = OrgAT49BV16x4;
-               }
-
-               flash_info[i].sector_count = flash_number_sector(pOrgDef, flash_nb_blocks);
-               memset (flash_info[i].protect, 0, flash_info[i].sector_count);
-
-               if (i == 0)
-                       flashbase = PHYS_FLASH_1;
-               else
-                       panic ("configured too many flash banks!\n");
-
-               sector = 0;
-               start_address = flashbase;
-               flash_info[i].size = 0;
-
-               for (j = 0; j < flash_nb_blocks; j++) {
-                       for (k = 0; k < pOrgDef[j].sector_number; k++) {
-                               flash_info[i].start[sector++] = start_address;
-                               start_address += pOrgDef[j].sector_size;
-                               flash_info[i].size += pOrgDef[j].sector_size;
-                       }
-               }
-
-               size += flash_info[i].size;
-
-               if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
-                       (ATM_ID_BV6416 & FLASH_TYPEMASK)){      /* AT49BV6416 Flash */
-
-                       /* Unlock all sectors at reset */
-                       for (j=0; j<flash_info[i].sector_count; j++){
-                               flash_unlock_sector(&flash_info[i], j);
-                       }
-               }
-       }
-
-       /* Protect binary boot image */
-       flash_protect (FLAG_PROTECT_SET,
-                      CFG_FLASH_BASE,
-                      CFG_FLASH_BASE + CFG_BOOT_SIZE - 1, &flash_info[0]);
-
-       /* Protect environment variables */
-       flash_protect (FLAG_PROTECT_SET,
-                      CFG_ENV_ADDR,
-                      CFG_ENV_ADDR + CFG_ENV_SIZE - 1, &flash_info[0]);
-
-       /* Protect U-Boot gzipped image */
-       flash_protect (FLAG_PROTECT_SET,
-                      CFG_U_BOOT_BASE,
-                      CFG_U_BOOT_BASE + CFG_U_BOOT_SIZE - 1, &flash_info[0]);
-
-       return size;
-}
-
-/*-----------------------------------------------------------------------
- */
-void flash_print_info (flash_info_t * info)
-{
-       int i;
-
-       switch (info->flash_id & FLASH_VENDMASK) {
-       case (ATM_MANUFACT & FLASH_VENDMASK):
-               printf ("Atmel: ");
-               break;
-       default:
-               printf ("Unknown Vendor ");
-               break;
-       }
-
-       switch (info->flash_id & FLASH_TYPEMASK) {
-       case (ATM_ID_BV1614 & FLASH_TYPEMASK):
-               printf ("AT49BV1614 (16Mbit)\n");
-               break;
-       case (ATM_ID_BV1614A & FLASH_TYPEMASK):
-               printf ("AT49BV1614A (16Mbit)\n");
-               break;
-       case (ATM_ID_BV6416 & FLASH_TYPEMASK):
-               printf ("AT49BV6416 (64Mbit)\n");
-               break;
-       default:
-               printf ("Unknown Chip Type\n");
-               return;
-       }
-
-       printf ("  Size: %ld MB in %d Sectors\n",
-               info->size >> 20, info->sector_count);
-
-       printf ("  Sector Start Addresses:");
-       for (i = 0; i < info->sector_count; i++) {
-               if ((i % 5) == 0) {
-                       printf ("\n   ");
-               }
-               printf (" %08lX%s", info->start[i],
-                       info->protect[i] ? " (RO)" : "     ");
-       }
-       printf ("\n");
-}
-
-/*-----------------------------------------------------------------------
- */
-
-int flash_erase (flash_info_t * info, int s_first, int s_last)
-{
-       ulong result;
-       int iflag, cflag, prot, sect;
-       int rc = ERR_OK;
-       int chip1;
-
-       /* first look for protection bits */
-
-       if (info->flash_id == FLASH_UNKNOWN)
-               return ERR_UNKNOWN_FLASH_TYPE;
-
-       if ((s_first < 0) || (s_first > s_last)) {
-               return ERR_INVAL;
-       }
-
-       if ((info->flash_id & FLASH_VENDMASK) !=
-               (ATM_MANUFACT & FLASH_VENDMASK)) {
-               return ERR_UNKNOWN_FLASH_VENDOR;
-       }
-
-       prot = 0;
-       for (sect = s_first; sect <= s_last; ++sect) {
-               if (info->protect[sect]) {
-                       prot++;
-               }
-       }
-       if (prot)
-               return ERR_PROTECTED;
-
-       /*
-        * Disable interrupts which might cause a timeout
-        * here. Remember that our exception vectors are
-        * at address 0 in the flash, and we don't want a
-        * (ticker) exception to happen while the flash
-        * chip is in programming mode.
-        */
-       cflag = icache_status ();
-       icache_disable ();
-       iflag = disable_interrupts ();
-
-       /* Start erase on unprotected sectors */
-       for (sect = s_first; sect <= s_last && !ctrlc (); sect++) {
-               printf ("Erasing sector %2d ... ", sect);
-
-               /* arm simple, non interrupt dependent timer */
-               reset_timer_masked ();
-
-               if (info->protect[sect] == 0) { /* not protected */
-                       volatile u16 *addr = (volatile u16 *) (info->start[sect]);
-
-                       MEM_FLASH_ADDR1 = CMD_UNLOCK1;
-                       MEM_FLASH_ADDR2 = CMD_UNLOCK2;
-                       MEM_FLASH_ADDR1 = CMD_ERASE_SETUP;
-
-                       MEM_FLASH_ADDR1 = CMD_UNLOCK1;
-                       MEM_FLASH_ADDR2 = CMD_UNLOCK2;
-                       *addr = CMD_ERASE_CONFIRM;
-
-                       /* wait until flash is ready */
-                       chip1 = 0;
-
-                       do {
-                               result = *addr;
-
-                               /* check timeout */
-                               if (get_timer_masked () > CFG_FLASH_ERASE_TOUT) {
-                                       MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
-                                       chip1 = TMO;
-                                       break;
-                               }
-
-                               if (!chip1 && (result & 0xFFFF) & BIT_ERASE_DONE)
-                                       chip1 = READY;
-
-                       } while (!chip1);
-
-                       MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
-
-                       if (chip1 == ERR) {
-                               rc = ERR_PROG_ERROR;
-                               goto outahere;
-                       }
-                       if (chip1 == TMO) {
-                               rc = ERR_TIMOUT;
-                               goto outahere;
-                       }
-
-                       printf ("ok.\n");
-               } else {                        /* it was protected */
-                       printf ("protected!\n");
-               }
-       }
-
-       if (ctrlc ())
-               printf ("User Interrupt!\n");
-
-outahere:
-       /* allow flash to settle - wait 10 ms */
-       udelay_masked (10000);
-
-       if (iflag)
-               enable_interrupts ();
-
-       if (cflag)
-               icache_enable ();
-
-       return rc;
-}
-
-/*-----------------------------------------------------------------------
- * Copy memory to flash
- */
-
-static int write_word (flash_info_t * info, ulong dest, ulong data)
-{
-       volatile u16 *addr = (volatile u16 *) dest;
-       ulong result;
-       int rc = ERR_OK;
-       int cflag, iflag;
-       int chip1;
-
-       /*
-        * Check if Flash is (sufficiently) erased
-        */
-       result = *addr;
-       if ((result & data) != data)
-               return ERR_NOT_ERASED;
-
-       /*
-        * Disable interrupts which might cause a timeout
-        * here. Remember that our exception vectors are
-        * at address 0 in the flash, and we don't want a
-        * (ticker) exception to happen while the flash
-        * chip is in programming mode.
-        */
-       cflag = icache_status ();
-       icache_disable ();
-       iflag = disable_interrupts ();
-
-       MEM_FLASH_ADDR1 = CMD_UNLOCK1;
-       MEM_FLASH_ADDR2 = CMD_UNLOCK2;
-       MEM_FLASH_ADDR1 = CMD_PROGRAM;
-       *addr = data;
-
-       /* arm simple, non interrupt dependent timer */
-       reset_timer_masked ();
-
-       /* wait until flash is ready */
-       chip1 = 0;
-       do {
-               result = *addr;
-
-               /* check timeout */
-               if (get_timer_masked () > CFG_FLASH_ERASE_TOUT) {
-                       chip1 = ERR | TMO;
-                       break;
-               }
-               if (!chip1 && ((result & 0x80) == (data & 0x80)))
-                       chip1 = READY;
-
-       } while (!chip1);
-
-       *addr = CMD_READ_ARRAY;
-
-       if (chip1 == ERR || *addr != data)
-               rc = ERR_PROG_ERROR;
-
-       if (iflag)
-               enable_interrupts ();
-
-       if (cflag)
-               icache_enable ();
-
-       return rc;
-}
-
-/*-----------------------------------------------------------------------
- * Copy memory to flash.
- */
-
-int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
-{
-       ulong wp, data;
-       int rc;
-
-       if (addr & 1) {
-               printf ("unaligned destination not supported\n");
-               return ERR_ALIGN;
-       };
-
-       if ((int) src & 1) {
-               printf ("unaligned source not supported\n");
-               return ERR_ALIGN;
-       };
-
-       wp = addr;
-
-       while (cnt >= 2) {
-               data = *((volatile u16 *) src);
-               if ((rc = write_word (info, wp, data)) != 0) {
-                       return (rc);
-               }
-               src += 2;
-               wp += 2;
-               cnt -= 2;
-       }
-
-       if (cnt == 1) {
-               data = (*((volatile u8 *) src)) | (*((volatile u8 *) (wp + 1)) <<
-                                                                                  8);
-               if ((rc = write_word (info, wp, data)) != 0) {
-                       return (rc);
-               }
-               src += 1;
-               wp += 1;
-               cnt -= 1;
-       };
-
-       return ERR_OK;
-}
diff --git a/board/at91rm9200dk/led.c b/board/at91rm9200dk/led.c
deleted file mode 100644 (file)
index 47a3bfc..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * (C) Copyright 2006
- * Atmel Nordic AB <www.atmel.com>
- * Ulf Samuelsson <ulf@atmel.com>
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#include <common.h>
-#include <asm/arch/AT91RM9200.h>
-
-#define        GREEN_LED       AT91C_PIO_PB0
-#define        YELLOW_LED      AT91C_PIO_PB1
-#define        RED_LED AT91C_PIO_PB2
-
-void   green_LED_on(void)
-{
-       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
-       PIOB->PIO_CODR          = GREEN_LED;
-}
-
-void    yellow_LED_on(void)
-{
-       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
-       PIOB->PIO_CODR          = YELLOW_LED;
-}
-
-void    red_LED_on(void)
-{
-       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
-       PIOB->PIO_CODR          = RED_LED;
-}
-
-void   green_LED_off(void)
-{
-       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
-       PIOB->PIO_SODR          = GREEN_LED;
-}
-
-void   yellow_LED_off(void)
-{
-       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
-       PIOB->PIO_SODR          = YELLOW_LED;
-}
-
-void   red_LED_off(void)
-{
-       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
-       PIOB->PIO_SODR          = RED_LED;
-}
-
-
-void coloured_LED_init (void)
-{
-       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
-       AT91PS_PMC      PMC     = AT91C_BASE_PMC;
-       PMC->PMC_PCER           = (1 << AT91C_ID_PIOB); /* Enable PIOB clock */
-       /* Disable peripherals on LEDs */
-       PIOB->PIO_PER           = AT91C_PIO_PB2 | AT91C_PIO_PB1 | AT91C_PIO_PB0;
-       /* Enable pins as outputs */
-       PIOB->PIO_OER           = AT91C_PIO_PB2 | AT91C_PIO_PB1 | AT91C_PIO_PB0;
-       /* Turn all LEDs OFF */
-       PIOB->PIO_SODR          = AT91C_PIO_PB2 | AT91C_PIO_PB1 | AT91C_PIO_PB0;
-}
diff --git a/board/at91rm9200dk/mux.c b/board/at91rm9200dk/mux.c
deleted file mode 100644 (file)
index 767d280..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <config.h>
-#include <common.h>
-#include <asm/hardware.h>
-#include <dataflash.h>
-
-int AT91F_GetMuxStatus(void) {
-#ifdef DATAFLASH_MMC_SELECT
-       AT91C_BASE_PIOB->PIO_PER = DATAFLASH_MMC_SELECT; /* Set in PIO mode */
-       AT91C_BASE_PIOB->PIO_OER = DATAFLASH_MMC_SELECT; /* Configure in output */
-
-
-       if(AT91C_BASE_PIOB->PIO_ODSR & DATAFLASH_MMC_SELECT) {
-               return 1;
-       } else {
-               return 0;
-       }
-#endif
-       return 0;
-}
-
-void AT91F_SelectMMC(void) {
-#ifdef DATAFLASH_MMC_SELECT
-       AT91C_BASE_PIOB->PIO_PER = DATAFLASH_MMC_SELECT;        /* Set in PIO mode */
-       AT91C_BASE_PIOB->PIO_OER = DATAFLASH_MMC_SELECT;        /* Configure in output */
-       /* Set Output */
-       AT91C_BASE_PIOB->PIO_SODR = DATAFLASH_MMC_SELECT;
-#endif
-}
-
-void AT91F_SelectSPI(void) {
-#ifdef DATAFLASH_MMC_SELECT
-       AT91C_BASE_PIOB->PIO_PER = DATAFLASH_MMC_SELECT;        /* Set in PIO mode */
-       AT91C_BASE_PIOB->PIO_OER = DATAFLASH_MMC_SELECT;        /* Configure in output */
-       /* Clear Output */
-       AT91C_BASE_PIOB->PIO_CODR = DATAFLASH_MMC_SELECT;
-#endif
-}
diff --git a/board/at91rm9200dk/u-boot.lds b/board/at91rm9200dk/u-boot.lds
deleted file mode 100644 (file)
index 14cd228..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * (C) Copyright 2002
- * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
-/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
-OUTPUT_ARCH(arm)
-ENTRY(_start)
-SECTIONS
-{
-       . = 0x00000000;
-
-       . = ALIGN(4);
-       .text      :
-       {
-         cpu/arm920t/start.o   (.text)
-         *(.text)
-       }
-
-       . = ALIGN(4);
-       .rodata : { *(.rodata) }
-
-       . = ALIGN(4);
-       .data : { *(.data) }
-
-       . = ALIGN(4);
-       .got : { *(.got) }
-
-       . = .;
-       __u_boot_cmd_start = .;
-       .u_boot_cmd : { *(.u_boot_cmd) }
-       __u_boot_cmd_end = .;
-
-       . = ALIGN(4);
-       __bss_start = .;
-       .bss (NOLOAD) : { *(.bss) }
-       _end = .;
-}
diff --git a/board/atmel/at91rm9200dk/Makefile b/board/atmel/at91rm9200dk/Makefile
new file mode 100755 (executable)
index 0000000..01f3bc3
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# (C) Copyright 2003-2006
+# 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    = $(obj)lib$(BOARD).a
+
+COBJS  := at91rm9200dk.o flash.o led.o mux.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/atmel/at91rm9200dk/at91rm9200dk.c b/board/atmel/at91rm9200dk/at91rm9200dk.c
new file mode 100644 (file)
index 0000000..c564f73
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * (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 <asm/arch/AT91RM9200.h>
+#include <at91rm9200_net.h>
+#include <dm9161.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* ------------------------------------------------------------------------- */
+/*
+ * Miscelaneous platform dependent initialisations
+ */
+
+int board_init (void)
+{
+       /* Enable Ctrlc */
+       console_init_f ();
+
+       /* Correct IRDA resistor problem */
+       /* Set PA23_TXD in Output */
+       ((AT91PS_PIO) AT91C_BASE_PIOA)->PIO_OER = AT91C_PA23_TXD2;
+
+       /* memory and cpu-speed are setup before relocation */
+       /* so we do _nothing_ here */
+
+       /* arch number of AT91RM9200DK-Board */
+       gd->bd->bi_arch_number = MACH_TYPE_AT91RM9200;
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
+
+       return 0;
+}
+
+int dram_init (void)
+{
+       gd->bd->bi_dram[0].start = PHYS_SDRAM;
+       gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;
+       return 0;
+}
+
+#ifdef CONFIG_DRIVER_ETHER
+#if defined(CONFIG_CMD_NET)
+
+/*
+ * Name:
+ *     at91rm9200_GetPhyInterface
+ * Description:
+ *     Initialise the interface functions to the PHY
+ * Arguments:
+ *     None
+ * Return value:
+ *     None
+ */
+void at91rm9200_GetPhyInterface(AT91PS_PhyOps p_phyops)
+{
+       p_phyops->Init = dm9161_InitPhy;
+       p_phyops->IsPhyConnected = dm9161_IsPhyConnected;
+       p_phyops->GetLinkSpeed = dm9161_GetLinkSpeed;
+       p_phyops->AutoNegotiate = dm9161_AutoNegotiate;
+}
+
+#endif
+#endif /* CONFIG_DRIVER_ETHER */
+
+/*
+ * Disk On Chip (NAND) Millenium initialization.
+ * The NAND lives in the CS2* space
+ */
+#if defined(CONFIG_CMD_NAND)
+extern ulong nand_probe (ulong physadr);
+
+#define AT91_SMARTMEDIA_BASE 0x40000000        /* physical address to access memory on NCS3 */
+void nand_init (void)
+{
+       /* Setup Smart Media, fitst enable the address range of CS3 */
+       *AT91C_EBI_CSA |= AT91C_EBI_CS3A_SMC_SmartMedia;
+       /* set the bus interface characteristics based on
+          tDS Data Set up Time 30 - ns
+          tDH Data Hold Time 20 - ns
+          tALS ALE Set up Time 20 - ns
+          16ns at 60 MHz ~= 3  */
+/*memory mapping structures */
+#define SM_ID_RWH      (5 << 28)
+#define SM_RWH         (1 << 28)
+#define SM_RWS         (0 << 24)
+#define SM_TDF         (1 << 8)
+#define SM_NWS         (3)
+       AT91C_BASE_SMC2->SMC2_CSR[3] = (SM_RWH | SM_RWS |
+               AT91C_SMC2_ACSS_STANDARD | AT91C_SMC2_DBW_8 |
+               SM_TDF | AT91C_SMC2_WSEN | SM_NWS);
+
+       /* enable the SMOE line PC0=SMCE, A21=CLE, A22=ALE */
+       *AT91C_PIOC_ASR = AT91C_PC0_BFCK | AT91C_PC1_BFRDY_SMOE |
+               AT91C_PC3_BFBAA_SMWE;
+       *AT91C_PIOC_PDR = AT91C_PC0_BFCK | AT91C_PC1_BFRDY_SMOE |
+               AT91C_PC3_BFBAA_SMWE;
+
+       /* Configure PC2 as input (signal READY of the SmartMedia) */
+       *AT91C_PIOC_PER = AT91C_PC2_BFAVD;      /* enable direct output enable */
+       *AT91C_PIOC_ODR = AT91C_PC2_BFAVD;      /* disable output */
+
+       /* Configure PB1 as input (signal Card Detect of the SmartMedia) */
+       *AT91C_PIOB_PER = AT91C_PIO_PB1;        /* enable direct output enable */
+       *AT91C_PIOB_ODR = AT91C_PIO_PB1;        /* disable output */
+
+       /* PIOB and PIOC clock enabling */
+       *AT91C_PMC_PCER = 1 << AT91C_ID_PIOB;
+       *AT91C_PMC_PCER = 1 << AT91C_ID_PIOC;
+
+       if (*AT91C_PIOB_PDSR & AT91C_PIO_PB1)
+               printf ("  No SmartMedia card inserted\n");
+#ifdef DEBUG
+       printf ("  SmartMedia card inserted\n");
+
+       printf ("Probing at 0x%.8x\n", AT91_SMARTMEDIA_BASE);
+#endif
+       printf ("%4lu MB\n", nand_probe(AT91_SMARTMEDIA_BASE) >> 20);
+}
+#endif
diff --git a/board/atmel/at91rm9200dk/config.mk b/board/atmel/at91rm9200dk/config.mk
new file mode 100644 (file)
index 0000000..9ce161e
--- /dev/null
@@ -0,0 +1 @@
+TEXT_BASE = 0x21f00000
diff --git a/board/atmel/at91rm9200dk/flash.c b/board/atmel/at91rm9200dk/flash.c
new file mode 100644 (file)
index 0000000..0513d61
--- /dev/null
@@ -0,0 +1,502 @@
+/*
+ * (C) Copyright 2002
+ * Lineo, Inc. <www.lineo.com>
+ * Bernhard Kuhn <bkuhn@lineo.com>
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Alex Zuepke <azu@sysgo.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+
+ulong myflush(void);
+
+
+/* Flash Organization Structure */
+typedef struct OrgDef
+{
+       unsigned int sector_number;
+       unsigned int sector_size;
+} OrgDef;
+
+
+/* Flash Organizations */
+OrgDef OrgAT49BV16x4[] =
+{
+       {  8,  8*1024 },        /*   8 *  8 kBytes sectors */
+       {  2, 32*1024 },        /*   2 * 32 kBytes sectors */
+       { 30, 64*1024 },        /*  30 * 64 kBytes sectors */
+};
+
+OrgDef OrgAT49BV16x4A[] =
+{
+       {  8,  8*1024 },        /*   8 *  8 kBytes sectors */
+       { 31, 64*1024 },        /*  31 * 64 kBytes sectors */
+};
+
+OrgDef OrgAT49BV6416[] =
+{
+       {   8,  8*1024 },       /*   8 *  8 kBytes sectors */
+       { 127, 64*1024 },       /* 127 * 64 kBytes sectors */
+};
+
+flash_info_t    flash_info[CFG_MAX_FLASH_BANKS];
+
+/* AT49BV1614A Codes */
+#define FLASH_CODE1            0xAA
+#define FLASH_CODE2            0x55
+#define ID_IN_CODE             0x90
+#define ID_OUT_CODE            0xF0
+
+
+#define CMD_READ_ARRAY         0x00F0
+#define CMD_UNLOCK1            0x00AA
+#define CMD_UNLOCK2            0x0055
+#define CMD_ERASE_SETUP                0x0080
+#define CMD_ERASE_CONFIRM      0x0030
+#define CMD_PROGRAM            0x00A0
+#define CMD_UNLOCK_BYPASS      0x0020
+#define CMD_SECTOR_UNLOCK      0x0070
+
+#define MEM_FLASH_ADDR1                (*(volatile u16 *)(CFG_FLASH_BASE + (0x00005555<<1)))
+#define MEM_FLASH_ADDR2                (*(volatile u16 *)(CFG_FLASH_BASE + (0x00002AAA<<1)))
+
+#define BIT_ERASE_DONE         0x0080
+#define BIT_RDY_MASK           0x0080
+#define BIT_PROGRAM_ERROR      0x0020
+#define BIT_TIMEOUT            0x80000000 /* our flag */
+
+#define READY 1
+#define ERR   2
+#define TMO   4
+
+/*-----------------------------------------------------------------------
+ */
+void flash_identification (flash_info_t * info)
+{
+       volatile u16 manuf_code, device_code, add_device_code;
+
+       MEM_FLASH_ADDR1 = FLASH_CODE1;
+       MEM_FLASH_ADDR2 = FLASH_CODE2;
+       MEM_FLASH_ADDR1 = ID_IN_CODE;
+
+       manuf_code = *(volatile u16 *) CFG_FLASH_BASE;
+       device_code = *(volatile u16 *) (CFG_FLASH_BASE + 2);
+       add_device_code = *(volatile u16 *) (CFG_FLASH_BASE + (3 << 1));
+
+       MEM_FLASH_ADDR1 = FLASH_CODE1;
+       MEM_FLASH_ADDR2 = FLASH_CODE2;
+       MEM_FLASH_ADDR1 = ID_OUT_CODE;
+
+       /* Vendor type */
+       info->flash_id = ATM_MANUFACT & FLASH_VENDMASK;
+       printf ("Atmel: ");
+
+       if ((device_code & FLASH_TYPEMASK) == (ATM_ID_BV1614 & FLASH_TYPEMASK)) {
+
+               if ((add_device_code & FLASH_TYPEMASK) ==
+                       (ATM_ID_BV1614A & FLASH_TYPEMASK)) {
+                       info->flash_id |= ATM_ID_BV1614A & FLASH_TYPEMASK;
+                       printf ("AT49BV1614A (16Mbit)\n");
+               } else {                                /* AT49BV1614 Flash */
+                       info->flash_id |= ATM_ID_BV1614 & FLASH_TYPEMASK;
+                       printf ("AT49BV1614 (16Mbit)\n");
+               }
+
+       } else if ((device_code & FLASH_TYPEMASK) == (ATM_ID_BV6416 & FLASH_TYPEMASK)) {
+               info->flash_id |= ATM_ID_BV6416 & FLASH_TYPEMASK;
+               printf ("AT49BV6416 (64Mbit)\n");
+       }
+}
+
+ushort flash_number_sector(OrgDef *pOrgDef, unsigned int nb_blocks)
+{
+       int i, nb_sectors = 0;
+
+       for (i=0; i<nb_blocks; i++){
+               nb_sectors += pOrgDef[i].sector_number;
+       }
+
+       return nb_sectors;
+}
+
+void flash_unlock_sector(flash_info_t * info, unsigned int sector)
+{
+       volatile u16 *addr = (volatile u16 *) (info->start[sector]);
+
+       MEM_FLASH_ADDR1 = CMD_UNLOCK1;
+       *addr = CMD_SECTOR_UNLOCK;
+}
+
+
+ulong flash_init (void)
+{
+       int i, j, k;
+       unsigned int flash_nb_blocks, sector;
+       unsigned int start_address;
+       OrgDef *pOrgDef;
+
+       ulong size = 0;
+
+       for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {
+               ulong flashbase = 0;
+
+               flash_identification (&flash_info[i]);
+
+               if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
+                       (ATM_ID_BV1614 & FLASH_TYPEMASK)) {
+
+                       pOrgDef = OrgAT49BV16x4;
+                       flash_nb_blocks = sizeof (OrgAT49BV16x4) / sizeof (OrgDef);
+               } else if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
+                       (ATM_ID_BV1614A & FLASH_TYPEMASK)){     /* AT49BV1614A Flash */
+
+                       pOrgDef = OrgAT49BV16x4A;
+                       flash_nb_blocks = sizeof (OrgAT49BV16x4A) / sizeof (OrgDef);
+               } else if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
+                       (ATM_ID_BV6416 & FLASH_TYPEMASK)){      /* AT49BV6416 Flash */
+
+                       pOrgDef = OrgAT49BV6416;
+                       flash_nb_blocks = sizeof (OrgAT49BV6416) / sizeof (OrgDef);
+               } else {
+                       flash_nb_blocks = 0;
+                       pOrgDef = OrgAT49BV16x4;
+               }
+
+               flash_info[i].sector_count = flash_number_sector(pOrgDef, flash_nb_blocks);
+               memset (flash_info[i].protect, 0, flash_info[i].sector_count);
+
+               if (i == 0)
+                       flashbase = PHYS_FLASH_1;
+               else
+                       panic ("configured too many flash banks!\n");
+
+               sector = 0;
+               start_address = flashbase;
+               flash_info[i].size = 0;
+
+               for (j = 0; j < flash_nb_blocks; j++) {
+                       for (k = 0; k < pOrgDef[j].sector_number; k++) {
+                               flash_info[i].start[sector++] = start_address;
+                               start_address += pOrgDef[j].sector_size;
+                               flash_info[i].size += pOrgDef[j].sector_size;
+                       }
+               }
+
+               size += flash_info[i].size;
+
+               if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
+                       (ATM_ID_BV6416 & FLASH_TYPEMASK)){      /* AT49BV6416 Flash */
+
+                       /* Unlock all sectors at reset */
+                       for (j=0; j<flash_info[i].sector_count; j++){
+                               flash_unlock_sector(&flash_info[i], j);
+                       }
+               }
+       }
+
+       /* Protect binary boot image */
+       flash_protect (FLAG_PROTECT_SET,
+                      CFG_FLASH_BASE,
+                      CFG_FLASH_BASE + CFG_BOOT_SIZE - 1, &flash_info[0]);
+
+       /* Protect environment variables */
+       flash_protect (FLAG_PROTECT_SET,
+                      CFG_ENV_ADDR,
+                      CFG_ENV_ADDR + CFG_ENV_SIZE - 1, &flash_info[0]);
+
+       /* Protect U-Boot gzipped image */
+       flash_protect (FLAG_PROTECT_SET,
+                      CFG_U_BOOT_BASE,
+                      CFG_U_BOOT_BASE + CFG_U_BOOT_SIZE - 1, &flash_info[0]);
+
+       return size;
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info (flash_info_t * info)
+{
+       int i;
+
+       switch (info->flash_id & FLASH_VENDMASK) {
+       case (ATM_MANUFACT & FLASH_VENDMASK):
+               printf ("Atmel: ");
+               break;
+       default:
+               printf ("Unknown Vendor ");
+               break;
+       }
+
+       switch (info->flash_id & FLASH_TYPEMASK) {
+       case (ATM_ID_BV1614 & FLASH_TYPEMASK):
+               printf ("AT49BV1614 (16Mbit)\n");
+               break;
+       case (ATM_ID_BV1614A & FLASH_TYPEMASK):
+               printf ("AT49BV1614A (16Mbit)\n");
+               break;
+       case (ATM_ID_BV6416 & FLASH_TYPEMASK):
+               printf ("AT49BV6416 (64Mbit)\n");
+               break;
+       default:
+               printf ("Unknown Chip Type\n");
+               return;
+       }
+
+       printf ("  Size: %ld MB in %d Sectors\n",
+               info->size >> 20, info->sector_count);
+
+       printf ("  Sector Start Addresses:");
+       for (i = 0; i < info->sector_count; i++) {
+               if ((i % 5) == 0) {
+                       printf ("\n   ");
+               }
+               printf (" %08lX%s", info->start[i],
+                       info->protect[i] ? " (RO)" : "     ");
+       }
+       printf ("\n");
+}
+
+/*-----------------------------------------------------------------------
+ */
+
+int flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+       ulong result;
+       int iflag, cflag, prot, sect;
+       int rc = ERR_OK;
+       int chip1;
+
+       /* first look for protection bits */
+
+       if (info->flash_id == FLASH_UNKNOWN)
+               return ERR_UNKNOWN_FLASH_TYPE;
+
+       if ((s_first < 0) || (s_first > s_last)) {
+               return ERR_INVAL;
+       }
+
+       if ((info->flash_id & FLASH_VENDMASK) !=
+               (ATM_MANUFACT & FLASH_VENDMASK)) {
+               return ERR_UNKNOWN_FLASH_VENDOR;
+       }
+
+       prot = 0;
+       for (sect = s_first; sect <= s_last; ++sect) {
+               if (info->protect[sect]) {
+                       prot++;
+               }
+       }
+       if (prot)
+               return ERR_PROTECTED;
+
+       /*
+        * Disable interrupts which might cause a timeout
+        * here. Remember that our exception vectors are
+        * at address 0 in the flash, and we don't want a
+        * (ticker) exception to happen while the flash
+        * chip is in programming mode.
+        */
+       cflag = icache_status ();
+       icache_disable ();
+       iflag = disable_interrupts ();
+
+       /* Start erase on unprotected sectors */
+       for (sect = s_first; sect <= s_last && !ctrlc (); sect++) {
+               printf ("Erasing sector %2d ... ", sect);
+
+               /* arm simple, non interrupt dependent timer */
+               reset_timer_masked ();
+
+               if (info->protect[sect] == 0) { /* not protected */
+                       volatile u16 *addr = (volatile u16 *) (info->start[sect]);
+
+                       MEM_FLASH_ADDR1 = CMD_UNLOCK1;
+                       MEM_FLASH_ADDR2 = CMD_UNLOCK2;
+                       MEM_FLASH_ADDR1 = CMD_ERASE_SETUP;
+
+                       MEM_FLASH_ADDR1 = CMD_UNLOCK1;
+                       MEM_FLASH_ADDR2 = CMD_UNLOCK2;
+                       *addr = CMD_ERASE_CONFIRM;
+
+                       /* wait until flash is ready */
+                       chip1 = 0;
+
+                       do {
+                               result = *addr;
+
+                               /* check timeout */
+                               if (get_timer_masked () > CFG_FLASH_ERASE_TOUT) {
+                                       MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
+                                       chip1 = TMO;
+                                       break;
+                               }
+
+                               if (!chip1 && (result & 0xFFFF) & BIT_ERASE_DONE)
+                                       chip1 = READY;
+
+                       } while (!chip1);
+
+                       MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
+
+                       if (chip1 == ERR) {
+                               rc = ERR_PROG_ERROR;
+                               goto outahere;
+                       }
+                       if (chip1 == TMO) {
+                               rc = ERR_TIMOUT;
+                               goto outahere;
+                       }
+
+                       printf ("ok.\n");
+               } else {                        /* it was protected */
+                       printf ("protected!\n");
+               }
+       }
+
+       if (ctrlc ())
+               printf ("User Interrupt!\n");
+
+outahere:
+       /* allow flash to settle - wait 10 ms */
+       udelay_masked (10000);
+
+       if (iflag)
+               enable_interrupts ();
+
+       if (cflag)
+               icache_enable ();
+
+       return rc;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash
+ */
+
+static int write_word (flash_info_t * info, ulong dest, ulong data)
+{
+       volatile u16 *addr = (volatile u16 *) dest;
+       ulong result;
+       int rc = ERR_OK;
+       int cflag, iflag;
+       int chip1;
+
+       /*
+        * Check if Flash is (sufficiently) erased
+        */
+       result = *addr;
+       if ((result & data) != data)
+               return ERR_NOT_ERASED;
+
+       /*
+        * Disable interrupts which might cause a timeout
+        * here. Remember that our exception vectors are
+        * at address 0 in the flash, and we don't want a
+        * (ticker) exception to happen while the flash
+        * chip is in programming mode.
+        */
+       cflag = icache_status ();
+       icache_disable ();
+       iflag = disable_interrupts ();
+
+       MEM_FLASH_ADDR1 = CMD_UNLOCK1;
+       MEM_FLASH_ADDR2 = CMD_UNLOCK2;
+       MEM_FLASH_ADDR1 = CMD_PROGRAM;
+       *addr = data;
+
+       /* arm simple, non interrupt dependent timer */
+       reset_timer_masked ();
+
+       /* wait until flash is ready */
+       chip1 = 0;
+       do {
+               result = *addr;
+
+               /* check timeout */
+               if (get_timer_masked () > CFG_FLASH_ERASE_TOUT) {
+                       chip1 = ERR | TMO;
+                       break;
+               }
+               if (!chip1 && ((result & 0x80) == (data & 0x80)))
+                       chip1 = READY;
+
+       } while (!chip1);
+
+       *addr = CMD_READ_ARRAY;
+
+       if (chip1 == ERR || *addr != data)
+               rc = ERR_PROG_ERROR;
+
+       if (iflag)
+               enable_interrupts ();
+
+       if (cflag)
+               icache_enable ();
+
+       return rc;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash.
+ */
+
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+       ulong wp, data;
+       int rc;
+
+       if (addr & 1) {
+               printf ("unaligned destination not supported\n");
+               return ERR_ALIGN;
+       };
+
+       if ((int) src & 1) {
+               printf ("unaligned source not supported\n");
+               return ERR_ALIGN;
+       };
+
+       wp = addr;
+
+       while (cnt >= 2) {
+               data = *((volatile u16 *) src);
+               if ((rc = write_word (info, wp, data)) != 0) {
+                       return (rc);
+               }
+               src += 2;
+               wp += 2;
+               cnt -= 2;
+       }
+
+       if (cnt == 1) {
+               data = (*((volatile u8 *) src)) | (*((volatile u8 *) (wp + 1)) <<
+                                                                                  8);
+               if ((rc = write_word (info, wp, data)) != 0) {
+                       return (rc);
+               }
+               src += 1;
+               wp += 1;
+               cnt -= 1;
+       };
+
+       return ERR_OK;
+}
diff --git a/board/atmel/at91rm9200dk/led.c b/board/atmel/at91rm9200dk/led.c
new file mode 100644 (file)
index 0000000..47a3bfc
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * (C) Copyright 2006
+ * Atmel Nordic AB <www.atmel.com>
+ * Ulf Samuelsson <ulf@atmel.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/arch/AT91RM9200.h>
+
+#define        GREEN_LED       AT91C_PIO_PB0
+#define        YELLOW_LED      AT91C_PIO_PB1
+#define        RED_LED AT91C_PIO_PB2
+
+void   green_LED_on(void)
+{
+       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
+       PIOB->PIO_CODR          = GREEN_LED;
+}
+
+void    yellow_LED_on(void)
+{
+       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
+       PIOB->PIO_CODR          = YELLOW_LED;
+}
+
+void    red_LED_on(void)
+{
+       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
+       PIOB->PIO_CODR          = RED_LED;
+}
+
+void   green_LED_off(void)
+{
+       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
+       PIOB->PIO_SODR          = GREEN_LED;
+}
+
+void   yellow_LED_off(void)
+{
+       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
+       PIOB->PIO_SODR          = YELLOW_LED;
+}
+
+void   red_LED_off(void)
+{
+       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
+       PIOB->PIO_SODR          = RED_LED;
+}
+
+
+void coloured_LED_init (void)
+{
+       AT91PS_PIO      PIOB    = AT91C_BASE_PIOB;
+       AT91PS_PMC      PMC     = AT91C_BASE_PMC;
+       PMC->PMC_PCER           = (1 << AT91C_ID_PIOB); /* Enable PIOB clock */
+       /* Disable peripherals on LEDs */
+       PIOB->PIO_PER           = AT91C_PIO_PB2 | AT91C_PIO_PB1 | AT91C_PIO_PB0;
+       /* Enable pins as outputs */
+       PIOB->PIO_OER           = AT91C_PIO_PB2 | AT91C_PIO_PB1 | AT91C_PIO_PB0;
+       /* Turn all LEDs OFF */
+       PIOB->PIO_SODR          = AT91C_PIO_PB2 | AT91C_PIO_PB1 | AT91C_PIO_PB0;
+}
diff --git a/board/atmel/at91rm9200dk/mux.c b/board/atmel/at91rm9200dk/mux.c
new file mode 100644 (file)
index 0000000..767d280
--- /dev/null
@@ -0,0 +1,37 @@
+#include <config.h>
+#include <common.h>
+#include <asm/hardware.h>
+#include <dataflash.h>
+
+int AT91F_GetMuxStatus(void) {
+#ifdef DATAFLASH_MMC_SELECT
+       AT91C_BASE_PIOB->PIO_PER = DATAFLASH_MMC_SELECT; /* Set in PIO mode */
+       AT91C_BASE_PIOB->PIO_OER = DATAFLASH_MMC_SELECT; /* Configure in output */
+
+
+       if(AT91C_BASE_PIOB->PIO_ODSR & DATAFLASH_MMC_SELECT) {
+               return 1;
+       } else {
+               return 0;
+       }
+#endif
+       return 0;
+}
+
+void AT91F_SelectMMC(void) {
+#ifdef DATAFLASH_MMC_SELECT
+       AT91C_BASE_PIOB->PIO_PER = DATAFLASH_MMC_SELECT;        /* Set in PIO mode */
+       AT91C_BASE_PIOB->PIO_OER = DATAFLASH_MMC_SELECT;        /* Configure in output */
+       /* Set Output */
+       AT91C_BASE_PIOB->PIO_SODR = DATAFLASH_MMC_SELECT;
+#endif
+}
+
+void AT91F_SelectSPI(void) {
+#ifdef DATAFLASH_MMC_SELECT
+       AT91C_BASE_PIOB->PIO_PER = DATAFLASH_MMC_SELECT;        /* Set in PIO mode */
+       AT91C_BASE_PIOB->PIO_OER = DATAFLASH_MMC_SELECT;        /* Configure in output */
+       /* Clear Output */
+       AT91C_BASE_PIOB->PIO_CODR = DATAFLASH_MMC_SELECT;
+#endif
+}
diff --git a/board/atmel/at91rm9200dk/u-boot.lds b/board/atmel/at91rm9200dk/u-boot.lds
new file mode 100644 (file)
index 0000000..14cd228
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x00000000;
+
+       . = ALIGN(4);
+       .text      :
+       {
+         cpu/arm920t/start.o   (.text)
+         *(.text)
+       }
+
+       . = ALIGN(4);
+       .rodata : { *(.rodata) }
+
+       . = ALIGN(4);
+       .data : { *(.data) }
+
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       . = .;
+       __u_boot_cmd_start = .;
+       .u_boot_cmd : { *(.u_boot_cmd) }
+       __u_boot_cmd_end = .;
+
+       . = ALIGN(4);
+       __bss_start = .;
+       .bss (NOLOAD) : { *(.bss) }
+       _end = .;
+}