aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/u-boot
diff options
context:
space:
mode:
authorUlf Samuelsson <ulf.samuelsson@atmel.com>2010-10-17 23:06:39 +0200
committerUlf Samuelsson <ulf.samuelsson@atmel.com>2010-10-17 23:13:37 +0200
commitffd3f97c6b31917ca9d2401af78d420ec4ae42ae (patch)
tree88af226178f98074b0820a487d9a12a8e21e0283 /recipes/u-boot
parent98d0eb19cad0ed13d9ff1ec6791a46bc501161da (diff)
downloadopenembedded-ffd3f97c6b31917ca9d2401af78d420ec4ae42ae.tar.gz
Add u-boot-2009.11 support for AT91SAM9
Add support for dataflash for SAM9G45/M10 Add support for SD-Card Add mmc/mux command Workaround for problem with UBOOT_VERSION beeing overwritten Add CRC for dataflash environment Add generic function for adding debug variables
Diffstat (limited to 'recipes/u-boot')
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0002-Support-running-ATSAM9G45-M10-from-dataflash.patch117
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0003-Update-SAM9M10-G45-config-for-dataflash-support.patch110
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0004-Support-selecting-SPI-mode-in-dataflash-driver.patch116
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0005-mux-replace-verbose-dataflash_mmc_mux-command.patch28
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0006-libarm-board.c-Gets-overwritten-workaround.patch34
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0007-fat.c-Add-DEBUG-currently-disabled.patch26
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0008-env_dataflash.c-More-robust-handling.patch148
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0009-cmd_debug.c-Add-a-generic-function-for-debug-vars.patch168
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0010-debug.h-Add-header-for-debug-variables.patch60
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0011-common-Makefile-Add-cmd_debug.c-to-build.patch27
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0012-cmd_mci.c-Support-writing-out-AT91-mci-config.patch100
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0013-atmel_dataflash.c-Status-printout-depend-on-DEBUG.patch59
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0014-AT91-MCI-Add-support-for-SD-Card.patch740
-rw-r--r--recipes/u-boot/u-boot-2009.11/at91/0015-sam9m10g45ek-Add-configuration-file.patch113
-rw-r--r--recipes/u-boot/u-boot_2009.11.bb44
15 files changed, 1890 insertions, 0 deletions
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0002-Support-running-ATSAM9G45-M10-from-dataflash.patch b/recipes/u-boot/u-boot-2009.11/at91/0002-Support-running-ATSAM9G45-M10-from-dataflash.patch
new file mode 100644
index 0000000000..4880d67d51
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0002-Support-running-ATSAM9G45-M10-from-dataflash.patch
@@ -0,0 +1,117 @@
+From 05c663921ff0fab52cafd2ff23848fa4bfabc5ec Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf@grond.atmel.com>
+Date: Sat, 27 Feb 2010 08:58:44 +0100
+Subject: [PATCH] Support running ATSAM9G45/M10 from dataflash
+
+The current at91sam9g45 targets can build for dataflash
+but the target will still use NAND flash for the environment.
+
+This patch will add the first hooks to allow use of dataflash.
+The end result will use dataflash, but there are bit errors
+during transmission, so the CRC check will always fail.
+This will be fixed by later patches.
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ Makefile | 2 +-
+ board/atmel/at91sam9m10g45ek/Makefile | 1 +
+ board/atmel/at91sam9m10g45ek/partition.c | 40 +++++++++++++++++++++++++++
+ cpu/arm926ejs/at91/at91sam9m10g45_devices.c | 3 +-
+ 4 files changed, 43 insertions(+), 3 deletions(-)
+ create mode 100644 board/atmel/at91sam9m10g45ek/partition.c
+
+diff --git a/Makefile b/Makefile
+index f06a97c..0bfa61c 100644
+--- a/Makefile
++++ b/Makefile
+@@ -2876,7 +2876,7 @@ at91sam9g45ekes_config : unconfig
+ echo "#define CONFIG_SYS_USE_NANDFLASH 1" >>$(obj)include/config.h ; \
+ $(XECHO) "... with environment variable in NAND FLASH" ; \
+ else \
+- echo "#define CONFIG_ATMEL_SPI 1" >>$(obj)include/config.h ; \
++ echo "#define CONFIG_SYS_USE_DATAFLASH 1" >>$(obj)include/config.h ; \
+ $(XECHO) "... with environment variable in SPI DATAFLASH CS0" ; \
+ fi;
+ @$(MKCONFIG) -a at91sam9m10g45ek arm arm926ejs at91sam9m10g45ek atmel at91
+diff --git a/board/atmel/at91sam9m10g45ek/Makefile b/board/atmel/at91sam9m10g45ek/Makefile
+index 4caf1e4..914cc1a 100644
+--- a/board/atmel/at91sam9m10g45ek/Makefile
++++ b/board/atmel/at91sam9m10g45ek/Makefile
+@@ -31,6 +31,7 @@ LIB = $(obj)lib$(BOARD).a
+
+ COBJS-y += at91sam9m10g45ek.o
+ COBJS-y += led.o
++COBJS-$(CONFIG_HAS_DATAFLASH) += partition.o
+
+ SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
+ OBJS := $(addprefix $(obj),$(COBJS-y))
+diff --git a/board/atmel/at91sam9m10g45ek/partition.c b/board/atmel/at91sam9m10g45ek/partition.c
+new file mode 100644
+index 0000000..2629c67
+--- /dev/null
++++ b/board/atmel/at91sam9m10g45ek/partition.c
+@@ -0,0 +1,40 @@
++/*
++ * (C) Copyright 2008
++ * Ulf Samuelsson <ulf@atmel.com>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ */
++#include <common.h>
++#include <config.h>
++#include <asm/hardware.h>
++#include <dataflash.h>
++
++AT91S_DATAFLASH_INFO dataflash_info[CONFIG_SYS_MAX_DATAFLASH_BANKS];
++
++struct dataflash_addr cs[CONFIG_SYS_MAX_DATAFLASH_BANKS] = {
++ {CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */
++ {CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS1, 1}
++};
++
++/*define the area offsets*/
++dataflash_protect_t area_list[NB_DATAFLASH_AREA] = {
++ {0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"},
++ {0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"},
++ {0x00008400, 0x00041FFF, FLAG_PROTECT_SET, 0, "U-Boot"},
++ {0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"},
++ {0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"},
++};
+diff --git a/cpu/arm926ejs/at91/at91sam9m10g45_devices.c b/cpu/arm926ejs/at91/at91sam9m10g45_devices.c
+index 98d90f2..07717ea 100644
+--- a/cpu/arm926ejs/at91/at91sam9m10g45_devices.c
++++ b/cpu/arm926ejs/at91/at91sam9m10g45_devices.c
+@@ -75,7 +75,6 @@ void at91_serial_hw_init(void)
+ #endif
+ }
+
+-#ifdef CONFIG_ATMEL_SPI
+ void at91_spi0_hw_init(unsigned long cs_mask)
+ {
+ at91_set_A_periph(AT91_PIN_PB0, 0); /* SPI0_MISO */
+@@ -146,7 +145,7 @@ void at91_spi1_hw_init(unsigned long cs_mask)
+ }
+
+ }
+-#endif
++
+
+ #ifdef CONFIG_MACB
+ void at91_macb_hw_init(void)
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0003-Update-SAM9M10-G45-config-for-dataflash-support.patch b/recipes/u-boot/u-boot-2009.11/at91/0003-Update-SAM9M10-G45-config-for-dataflash-support.patch
new file mode 100644
index 0000000000..4b99c31d8e
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0003-Update-SAM9M10-G45-config-for-dataflash-support.patch
@@ -0,0 +1,110 @@
+From 238b17ddabab0f0452c4acdf2a52e4e41ddfc3c3 Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sat, 27 Feb 2010 09:09:54 +0100
+Subject: [PATCH] Update SAM9M10/G45 config for dataflash support
+
+Signed-off-by Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ include/configs/at91sam9m10g45ek.h | 36 +++++++++++++++++++++++++++---------
+ 1 files changed, 27 insertions(+), 9 deletions(-)
+
+diff --git a/include/configs/at91sam9m10g45ek.h b/include/configs/at91sam9m10g45ek.h
+index b460188..a60bb6b 100644
+--- a/include/configs/at91sam9m10g45ek.h
++++ b/include/configs/at91sam9m10g45ek.h
+@@ -3,7 +3,7 @@
+ * Stelian Pop <stelian.pop@leadtechdesign.com>
+ * Lead Tech Design <www.leadtechdesign.com>
+ *
+- * Configuation settings for the AT91SAM9M10G45EK board(and AT91SAM9G45EKES).
++ * Configuration settings for the AT91SAM9M10G45EK board(and AT91SAM9G45EKES).
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+@@ -44,8 +44,10 @@
+ #define CONFIG_SETUP_MEMORY_TAGS 1
+ #define CONFIG_INITRD_TAG 1
+
++#ifndef CONFIG_SYS_USE_BOOT_NORFLASH
+ #define CONFIG_SKIP_LOWLEVEL_INIT
+ #define CONFIG_SKIP_RELOCATE_UBOOT
++#endif
+
+ /*
+ * Hardware drivers
+@@ -93,8 +95,8 @@
+ #undef CONFIG_CMD_FPGA
+ #undef CONFIG_CMD_IMI
+ #undef CONFIG_CMD_IMLS
+-#undef CONFIG_CMD_AUTOSCRIPT
+ #undef CONFIG_CMD_LOADS
++#undef CONFIG_CMD_SOURCE
+
+ #define CONFIG_CMD_PING 1
+ #define CONFIG_CMD_DHCP 1
+@@ -112,22 +114,37 @@
+ #define CONFIG_CMD_SPI
+ #define CONFIG_SPI_FLASH 1
+ #define CONFIG_SPI_FLASH_ATMEL 1
+-#define CONFIG_SYS_MAX_DATAFLASH_BANKS 1
+ #endif
+
++#define CONFIG_ATMEL_DATAFLASH_SPI
++#define CONFIG_HAS_DATAFLASH 1
++#define CONFIG_SYS_SPI_WRITE_TOUT (5*CONFIG_SYS_HZ)
++#define CONFIG_SYS_MAX_DATAFLASH_BANKS 1
++#define CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS0 0xC0000000 /* CS0 */
++#define CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS1 0xD0000000 /* CS1 */
++#define AT91_SPI_CLK 15000000
++#define DATAFLASH_TCSS (0x1a << 16)
++#define DATAFLASH_TCHS (0x1 << 24)
++
++
+ /* NOR flash, if populated */
+ #ifndef CONFIG_CMD_NAND
+ #define CONFIG_SYS_NO_FLASH 1
+ #define CONFIG_SYS_64BIT_VSPRINTF /* needed for nand_util.c */
+-#else
++#endif
++
++#ifdef CONFIG_SYS_USE_NORFLASH
+ #define CONFIG_SYS_FLASH_CFI 1
+ #define CONFIG_FLASH_CFI_DRIVER 1
+ #define PHYS_FLASH_1 0x10000000
+ #define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+ #define CONFIG_SYS_MAX_FLASH_SECT 256
+ #define CONFIG_SYS_MAX_FLASH_BANKS 1
++#else
++#define CONFIG_SYS_NO_FLASH 1
+ #endif
+
++
+ /* NAND flash */
+ #ifdef CONFIG_CMD_NAND
+ #define CONFIG_NAND_MAX_CHIPS 1
+@@ -170,16 +187,17 @@
+ #ifdef CONFIG_SYS_USE_DATAFLASH
+
+ /* bootstrap + u-boot + env + linux in dataflash on CS0 */
+-#define CONFIG_ENV_IS_IN_SPI_FLASH 1
++#define CONFIG_ENV_IS_IN_DATAFLASH 1
++/* #define CONFIG_ENV_IS_IN_SPI_FLASH 1 */
+ #define CONFIG_SYS_MONITOR_BASE (0xC0000000 + 0x8400)
+ #define CONFIG_ENV_OFFSET 0x4200
+ #define CONFIG_ENV_ADDR (0xC0000000 + CONFIG_ENV_OFFSET)
+ #define CONFIG_ENV_SIZE 0x4200
+-#define CONFIG_ENV_SECT_SIZE 0x10000
+-#define CONFIG_BOOTCOMMAND "cp.b 0xC0042000 0x22000000 0x210000; bootm"
++#define CONFIG_ENV_SECT_SIZE 0x4200
++#define CONFIG_BOOTCOMMAND "cp.b 0xC0042000 0x72000000 0x290000; bootm 0x72000000"
+ #define CONFIG_BOOTARGS "console=ttyS0,115200 " \
+- "root=/dev/mtdblock0 " \
+- "mtdparts=atmel_nand:-(root) "\
++ "root=/dev/mtdblock1 " \
++ "mtdparts=atmel_nand:4M(unused)ro,-(root) "\
+ "rw rootfstype=jffs2"
+
+ #else /* CONFIG_SYS_USE_NANDFLASH */
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0004-Support-selecting-SPI-mode-in-dataflash-driver.patch b/recipes/u-boot/u-boot-2009.11/at91/0004-Support-selecting-SPI-mode-in-dataflash-driver.patch
new file mode 100644
index 0000000000..ec075d8ffb
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0004-Support-selecting-SPI-mode-in-dataflash-driver.patch
@@ -0,0 +1,116 @@
+From 33f977f42bfb2f62dff2b2441c06eb5265c61293 Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sat, 27 Feb 2010 09:49:43 +0100
+Subject: [PATCH] Support selecting SPI mode in dataflash driver
+
+By setting AT91_SPI_MODE in the config to
+AT91_SPI_MODE[3..0] you can select the SPI mode.
+when the dataflash driver is used.
+
+I.E
+.#define AT91_SPI_MODE AT91_SPI_MODE0
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ drivers/spi/atmel_dataflash_spi.c | 26 ++++++++++++++++++++++----
+ include/asm-arm/arch-at91/at91_spi.h | 8 ++++++++
+ 2 files changed, 30 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/spi/atmel_dataflash_spi.c b/drivers/spi/atmel_dataflash_spi.c
+index 3a648e6..5307e34 100644
+--- a/drivers/spi/atmel_dataflash_spi.c
++++ b/drivers/spi/atmel_dataflash_spi.c
+@@ -34,8 +34,15 @@
+ #define AT91_SPI_PCS2_DATAFLASH_CARD 0xB /* Chip Select 2: NPCS2%1011 */
+ #define AT91_SPI_PCS3_DATAFLASH_CARD 0x7 /* Chip Select 3: NPCS3%0111 */
+
++#ifndef AT91_SPI_MODE
++#define AT91_SPI_MODE AT91_SPI_MODE0
++#endif
++
+ void AT91F_SpiInit(void)
+ {
++ unsigned int mr,sr,imr;
++ unsigned int csr0, csr1, csr2, csr3;
++
+ /* Reset the SPI */
+ writel(AT91_SPI_SWRST, AT91_BASE_SPI + AT91_SPI_CR);
+
+@@ -44,7 +51,7 @@ void AT91F_SpiInit(void)
+ AT91_BASE_SPI + AT91_SPI_MR);
+
+ /* Configure CS0 */
+- writel(AT91_SPI_NCPHA |
++ writel(AT91_SPI_MODE |
+ (AT91_SPI_DLYBS & DATAFLASH_TCSS) |
+ (AT91_SPI_DLYBCT & DATAFLASH_TCHS) |
+ ((get_mck_clk_rate() / AT91_SPI_CLK) << 8),
+@@ -52,7 +59,7 @@ void AT91F_SpiInit(void)
+
+ #ifdef CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS1
+ /* Configure CS1 */
+- writel(AT91_SPI_NCPHA |
++ writel(AT91_SPI_MODE |
+ (AT91_SPI_DLYBS & DATAFLASH_TCSS) |
+ (AT91_SPI_DLYBCT & DATAFLASH_TCHS) |
+ ((get_mck_clk_rate() / AT91_SPI_CLK) << 8),
+@@ -60,7 +67,7 @@ void AT91F_SpiInit(void)
+ #endif
+ #ifdef CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS2
+ /* Configure CS2 */
+- writel(AT91_SPI_NCPHA |
++ writel(AT91_SPI_MODE |
+ (AT91_SPI_DLYBS & DATAFLASH_TCSS) |
+ (AT91_SPI_DLYBCT & DATAFLASH_TCHS) |
+ ((get_mck_clk_rate() / AT91_SPI_CLK) << 8),
+@@ -68,7 +75,7 @@ void AT91F_SpiInit(void)
+ #endif
+ #ifdef CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS3
+ /* Configure CS3 */
+- writel(AT91_SPI_NCPHA |
++ writel(AT91_SPI_MODE |
+ (AT91_SPI_DLYBS & DATAFLASH_TCSS) |
+ (AT91_SPI_DLYBCT & DATAFLASH_TCHS) |
+ ((get_mck_clk_rate() / AT91_SPI_CLK) << 8),
+@@ -84,7 +91,18 @@ void AT91F_SpiInit(void)
+ * Add tempo to get SPI in a safe state.
+ * Should not be needed for new silicon (Rev B)
+ */
++ printf("CPU running at %d Hz\n",get_cpu_clk_rate());
++ printf("MCK running at %d Hz\n",get_mck_clk_rate());
++ printf("SPI_MR 0x%08x\n",mr=readl(AT91_BASE_SPI + AT91_SPI_MR));
++ printf("SPI_SR 0x%08x\n",sr=readl(AT91_BASE_SPI + AT91_SPI_SR));
++ printf("SPI_IMR 0x%08x\n",imr=readl(AT91_BASE_SPI + AT91_SPI_IMR));
++ printf("SPI_CSR0 0x%08x\n",csr0=readl(AT91_BASE_SPI + AT91_SPI_CSR(0)));
++ printf("SPI_CSR1 0x%08x\n",csr1=readl(AT91_BASE_SPI + AT91_SPI_CSR(1)));
++ printf("SPI_CSR2 0x%08x\n",csr2=readl(AT91_BASE_SPI + AT91_SPI_CSR(2)));
++ printf("SPI_CSR3 0x%08x\n",csr3=readl(AT91_BASE_SPI + AT91_SPI_CSR(3)));
++ printf("SPI SPEED = %d Hz\n", get_mck_clk_rate()/ ((csr0 >> 8) & 0xff));
+ udelay(500000);
++
+ readl(AT91_BASE_SPI + AT91_SPI_SR);
+ readl(AT91_BASE_SPI + AT91_SPI_RDR);
+
+diff --git a/include/asm-arm/arch-at91/at91_spi.h b/include/asm-arm/arch-at91/at91_spi.h
+index 30643c6..8924996 100644
+--- a/include/asm-arm/arch-at91/at91_spi.h
++++ b/include/asm-arm/arch-at91/at91_spi.h
+@@ -62,7 +62,15 @@
+
+ #define AT91_SPI_CSR(n) (0x30 + ((n) * 4)) /* Chip Select Registers 0-3 */
+ #define AT91_SPI_CPOL (1 << 0) /* Clock Polarity */
++#define AT91_SPI_NCPOL (0 << 0) /* Clock Polarity */
+ #define AT91_SPI_NCPHA (1 << 1) /* Clock Phase */
++#define AT91_SPI_CPHA (0 << 1) /* Clock Phase */
++
++#define AT91_SPI_MODE0 (AT91_SPI_NCPOL | AT91_SPI_NCPHA)
++#define AT91_SPI_MODE1 (AT91_SPI_NCPOL | AT91_SPI_CPHA)
++#define AT91_SPI_MODE2 (AT91_SPI_CPOL | AT91_SPI_NCPHA)
++#define AT91_SPI_MODE3 (AT91_SPI_CPOL | AT91_SPI_CPHA)
++
+ #define AT91_SPI_CSAAT (1 << 3) /* Chip Select Active After Transfer [SAM9261 only] */
+ #define AT91_SPI_BITS (0xf << 4) /* Bits Per Transfer */
+ #define AT91_SPI_BITS_8 (0 << 4)
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0005-mux-replace-verbose-dataflash_mmc_mux-command.patch b/recipes/u-boot/u-boot-2009.11/at91/0005-mux-replace-verbose-dataflash_mmc_mux-command.patch
new file mode 100644
index 0000000000..35bee581ec
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0005-mux-replace-verbose-dataflash_mmc_mux-command.patch
@@ -0,0 +1,28 @@
+From 600ddf4971206a6c653c23ddbce48253f1e07dd2 Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sat, 13 Mar 2010 13:25:26 +0100
+Subject: [PATCH] mux: replace verbose dataflash_mmc_mux command
+
+Replace verbose 17 character command with the original thing
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ common/cmd_dataflash_mmc_mux.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/common/cmd_dataflash_mmc_mux.c b/common/cmd_dataflash_mmc_mux.c
+index 97e303e..2fc67d4 100644
+--- a/common/cmd_dataflash_mmc_mux.c
++++ b/common/cmd_dataflash_mmc_mux.c
+@@ -59,7 +59,7 @@ static int mmc_nspi (const char *s)
+
+ U_BOOT_CMD(
+ dataflash_mmc_mux, 2, 1, do_dataflash_mmc_mux,
+- "dataflash_mmc_mux\t- enable or disable MMC or SPI\n",
++ "mux\t- enable or disable MMC or SPI\n",
+ "[mmc, spi]\n"
+ " - enable or disable MMC or SPI"
+ );
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0006-libarm-board.c-Gets-overwritten-workaround.patch b/recipes/u-boot/u-boot-2009.11/at91/0006-libarm-board.c-Gets-overwritten-workaround.patch
new file mode 100644
index 0000000000..4463fc28a4
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0006-libarm-board.c-Gets-overwritten-workaround.patch
@@ -0,0 +1,34 @@
+From 1c72f37cbea8c1bb98d438108558a4e222c5ce2b Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sat, 13 Mar 2010 13:29:34 +0100
+Subject: [PATCH] libarm/board.c: Gets overwritten - workaround!
+
+U_BOOT_VERSION gets overwritten by something.
+Workaround, but no fix for the problem, by
+adding another variable which can get overwritten
+without problems.
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ lib_arm/board.c | 5 +++--
+ 1 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/lib_arm/board.c b/lib_arm/board.c
+index e148739..379e39b 100644
+--- a/lib_arm/board.c
++++ b/lib_arm/board.c
+@@ -74,8 +74,9 @@ extern void dataflash_print_info(void);
+ #define CONFIG_IDENT_STRING ""
+ #endif
+
+-const char version_string[] =
+- U_BOOT_VERSION" (" U_BOOT_DATE " - " U_BOOT_TIME ")"CONFIG_IDENT_STRING;
++const char dummy[] = "Is this overwritten ?";
++const char version_string[] =
++ U_BOOT_VERSION " (" U_BOOT_DATE " - " U_BOOT_TIME ")"CONFIG_IDENT_STRING;
+
+ #ifdef CONFIG_DRIVER_RTL8019
+ extern void rtl8019_get_enetaddr (uchar * addr);
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0007-fat.c-Add-DEBUG-currently-disabled.patch b/recipes/u-boot/u-boot-2009.11/at91/0007-fat.c-Add-DEBUG-currently-disabled.patch
new file mode 100644
index 0000000000..6a2fdb4cef
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0007-fat.c-Add-DEBUG-currently-disabled.patch
@@ -0,0 +1,26 @@
+From db9c87b27153d55cd1818d2f1a2772b8070b3715 Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sat, 13 Mar 2010 13:32:40 +0100
+Subject: [PATCH] fat.c: Add DEBUG (currently disabled)
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ fs/fat/fat.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/fs/fat/fat.c b/fs/fat/fat.c
+index 2445f1e..87e7f08 100644
+--- a/fs/fat/fat.c
++++ b/fs/fat/fat.c
+@@ -24,7 +24,7 @@
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+-
++//#define DEBUG
+ #include <common.h>
+ #include <config.h>
+ #include <fat.h>
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0008-env_dataflash.c-More-robust-handling.patch b/recipes/u-boot/u-boot-2009.11/at91/0008-env_dataflash.c-More-robust-handling.patch
new file mode 100644
index 0000000000..7c38c0c7c0
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0008-env_dataflash.c-More-robust-handling.patch
@@ -0,0 +1,148 @@
+From 50edf2024c826048652f29a350887946fba4a509 Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sat, 13 Mar 2010 23:56:39 +0100
+Subject: [PATCH] env_dataflash.c: More robust handling.
+
+1: When u-boot environment is in dataflash, it is safe to
+ assume that this is the boot flash.
+ We can then assume we are already reloacted to DRAM
+ and have plenty of memory.
+ No need to split reads into inefficient small chunks
+2: Reread memory on CRC error
+3: Validate writes to environment, and repeat.
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ common/env_dataflash.c | 85 +++++++++++++++++++++++++++++++----------------
+ 1 files changed, 56 insertions(+), 29 deletions(-)
+
+diff --git a/common/env_dataflash.c b/common/env_dataflash.c
+index 27a3bbc..a394baa 100644
+--- a/common/env_dataflash.c
++++ b/common/env_dataflash.c
+@@ -23,11 +23,18 @@
+ #include <linux/stddef.h>
+ #include <dataflash.h>
+
++#ifdef DEBUG
++#define pr_debug(fmt, args...) printf(fmt, ##args)
++#else
++#define pr_debug(...) do { } while(0)
++#endif
++
+ DECLARE_GLOBAL_DATA_PTR;
+
+ env_t *env_ptr = NULL;
+
+ char * env_name_spec = "dataflash";
++static env_t buf;
+
+ extern int read_dataflash (unsigned long addr, unsigned long size, char
+ *result);
+@@ -45,54 +52,74 @@ uchar env_get_char_spec (int index)
+ return (c);
+ }
+
++
+ void env_relocate_spec (void)
+ {
+- read_dataflash(CONFIG_ENV_ADDR, CONFIG_ENV_SIZE, (char *)env_ptr);
++ ulong new;
++ ulong i;
++ for(i = 0; i < 320; i++) {
++ read_dataflash(CONFIG_ENV_ADDR,sizeof(env_t), (char *)&buf);
++ new = crc32 (0, buf.data, sizeof(buf.data));
++ pr_debug("Stored CRC=[0x%08x], Read CRC=[0x%08x]\r\n",buf.crc,new);
++ if(new == buf.crc) {
++ pr_debug ("*** CRC in dataflash valid\n\n");
++ gd->env_addr = offsetof(env_t,data);
++ gd->env_valid = 1;
++ env_ptr = &buf;
++ return;
++ }
++ }
+ }
+
+ int saveenv(void)
+ {
+ /* env must be copied to do not alter env structure in memory*/
++ int error;
++ int i;
+ unsigned char temp[CONFIG_ENV_SIZE];
+- memcpy(temp, env_ptr, CONFIG_ENV_SIZE);
+- return write_dataflash(CONFIG_ENV_ADDR, (unsigned long)temp, CONFIG_ENV_SIZE);
++
++ for(i = 0; i < 4; i++) {
++ memcpy(temp, env_ptr, CONFIG_ENV_SIZE);
++ error = write_dataflash(CONFIG_ENV_ADDR, (unsigned long)temp, CONFIG_ENV_SIZE);
++ read_dataflash(CONFIG_ENV_ADDR,sizeof(env_t), (char *)&temp);
++ if (memcmp(env_ptr,temp,CONFIG_ENV_SIZE) == 0) return error;
++ pr_debug("Dataflash environment verify failed, retrying...\n");
++ }
++ pr_debug("Dataflash environment verify failed, aborting...\n");
++ return error;
+ }
+
+ /************************************************************************
+ * Initialize Environment use
+- *
+- * We are still running from ROM, so data use is limited
+- * Use a (moderately small) buffer on the stack
++ * When environment is in dataflash, it is OK to assume that we
++ * are booting from dataflash, and then u-boot is always executing
++ * from DRAM. Use a large buffer for faster/easier use
+ */
+ int env_init(void)
+ {
+- ulong crc, len, new;
+- unsigned off;
+- uchar buf[64];
++ unsigned int crc, new;
++ int i;
+ if (gd->env_valid == 0){
+ AT91F_DataflashInit(); /* prepare for DATAFLASH read/write */
++ for(i = 0; i < 24; i++) {
++ read_dataflash(CONFIG_ENV_ADDR,sizeof(env_t), (char *)&buf);
++ new = crc32 (0, buf.data, sizeof(buf.data));
++ pr_debug("Stored CRC=[0x%08x], Read CRC=[0x%08x]\r\n",buf.crc,new);
++ if(new == buf.crc) {
++ pr_debug ("*** CRC in dataflash valid\n");
++ gd->env_addr = offsetof(env_t,data);
++ gd->env_valid = 1;
++ return 0;
+
+- /* read old CRC */
+- read_dataflash(CONFIG_ENV_ADDR + offsetof(env_t, crc),
+- sizeof(ulong), (char *)&crc);
+- new = 0;
+- len = ENV_SIZE;
+- off = offsetof(env_t,data);
+- while (len > 0) {
+- int n = (len > sizeof(buf)) ? sizeof(buf) : len;
+- read_dataflash(CONFIG_ENV_ADDR + off, n, (char *)buf);
+- new = crc32 (new, buf, n);
+- len -= n;
+- off += n;
+- }
+- if (crc == new) {
+- gd->env_addr = offsetof(env_t,data);
+- gd->env_valid = 1;
+- } else {
+- gd->env_addr = (ulong)&default_environment[0];
+- gd->env_valid = 0;
++ }
+ }
++ pr_debug("*** CRC in dataflash not valid\n\n");
++ pr_debug("Stored CRC=[0x%08x], Read CRC=[0x%08x]\r\n",crc,new);
++ pr_debug("Buffer = [0x%08x]\n\n\r", (unsigned int) &buf);
++ pr_debug("Default = [0x%08x]\n\n\r", (unsigned int) default_environment);
++ pr_debug("Environment = [0x%08x]\n\n\r", (unsigned int) env_ptr);
++ gd->env_addr = (ulong)&default_environment[0];
++ gd->env_valid = 0;
+ }
+-
+ return (0);
+ }
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0009-cmd_debug.c-Add-a-generic-function-for-debug-vars.patch b/recipes/u-boot/u-boot-2009.11/at91/0009-cmd_debug.c-Add-a-generic-function-for-debug-vars.patch
new file mode 100644
index 0000000000..34828ebaaf
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0009-cmd_debug.c-Add-a-generic-function-for-debug-vars.patch
@@ -0,0 +1,168 @@
+From f96a5c1051eac6c5782d775a97f9651c5e10b7af Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sun, 14 Mar 2010 00:03:14 +0100
+Subject: [PATCH] cmd_debug.c: Add a generic function for debug vars
+
+This introduces a way for a module to register a debug variable.
+The debug command can then be used to turn on/off the debug
+variable or set it to a level
+* 0 (off)
+* 1 (on)
+* 2 (verbose)
+
+The value of all debug variables can be listed by just typing "debug"
+
+module will use the debug level for its debug variable
+to determine debug verbosity.
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ common/cmd_debug.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 files changed, 136 insertions(+), 0 deletions(-)
+ create mode 100644 common/cmd_debug.c
+
+diff --git a/common/cmd_debug.c b/common/cmd_debug.c
+new file mode 100644
+index 0000000..99f05a2
+--- /dev/null
++++ b/common/cmd_debug.c
+@@ -0,0 +1,136 @@
++/*
++ * (C) Copyright 2010
++ * Ulf Samuelsson <ulf.samuelsson@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 <command.h>
++#include <debug.h>
++
++#undef DEBUG
++#if defined(DEBUG)
++#define pr_debug(fmt, args...) printf(fmt, ##args)
++#else
++#define pr_debug(...) do { } while(0)
++#endif
++
++static struct debug_flag debug = {
++ .debug = 0,
++ .name = "all",
++ .next = NULL,
++};
++struct debug_flag *dbg_vars = &debug;
++
++static char *debug_variable (const char *s)
++{
++ struct debug_flag *vars;
++ vars = dbg_vars;
++ while(vars != NULL) {
++ if (strcmp (s, vars->name) == 0) {
++ return &vars->debug;
++ }
++ vars = vars->next;
++ }
++ return NULL;
++}
++
++static int debug_level (const char *s)
++{
++ if (strcmp (s, "0") == 0) {
++ return 0;
++ } else if (strcmp (s, "off") == 0) {
++ return 0;
++ } else if (strcmp (s, "1") == 0) {
++ return 1;
++ } else if (strcmp (s, "on") == 0) {
++ return 1;
++ } else if (strcmp (s, "2") == 0) {
++ return 2;
++ } else {
++ return -1;
++ }
++}
++
++int do_debug (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
++{
++ int value;
++ char *p;
++ struct debug_flag *dbg;
++ pr_debug("Arg count = %d\n",argc);
++ for (value = 0; value < argc; value++) {
++ pr_debug("argv[%d] = \"%s\"\n",value,argv[value]);
++ }
++ value = 1; /* Standard value, if we do not have a second parameter */
++ switch (argc) {
++ case 3: /* on / off */
++ value = debug_level(argv[2]);
++ if(value < 0) {
++ printf("Illegal debug variable: %s\n",p);
++ return -1;
++ }
++
++ case 2:
++ p = debug_variable (argv[1]);
++ if(p == NULL) {
++ printf("Illegal debug variable: %s\n",p);
++ return -1;
++ }
++ if(p == &debug.debug) { /* Set all debug variables */
++ dbg = dbg_vars;
++ while(dbg != NULL) {
++ dbg->debug = value;
++ dbg = dbg->next;
++ }
++ }
++ *p = value;
++ break;
++ default:
++ printf ("Usage:\n%s\n", cmdtp->usage);
++ printf ("Valid are: \n");
++ dbg = dbg_vars;
++ while(dbg != NULL) {
++ printf("\t%s\t = %d\n",dbg->name, dbg->debug);
++ dbg = dbg->next;
++ }
++ return 1;
++ }
++ return 0;
++}
++
++void register_debug_variable(struct debug_flag *dbg)
++{
++ struct debug_flag *vars;
++ vars = dbg_vars;
++ pr_debug("Registering \"%s_debug\" = %d\n",dbg->name,dbg->debug);
++ while(vars->next != NULL) {
++ vars = vars->next;
++ }
++ vars->next = dbg;
++ dbg->next = NULL;
++}
++
++
++U_BOOT_CMD(
++ debug, 3, 1, do_debug,
++ "debug\t- enable or disable debug\n",
++ "<var> [on|off|0|1|2]\n"
++ " - enable or disable debug"
++);
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0010-debug.h-Add-header-for-debug-variables.patch b/recipes/u-boot/u-boot-2009.11/at91/0010-debug.h-Add-header-for-debug-variables.patch
new file mode 100644
index 0000000000..0cdf4e88b1
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0010-debug.h-Add-header-for-debug-variables.patch
@@ -0,0 +1,60 @@
+From 13e1209feb63e1fd624fbb5a691dc4320f576cc8 Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sun, 14 Mar 2010 00:08:59 +0100
+Subject: [PATCH] debug.h: Add header for debug variables
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ include/debug.h | 40 ++++++++++++++++++++++++++++++++++++++++
+ 1 files changed, 40 insertions(+), 0 deletions(-)
+ create mode 100644 include/debug.h
+
+diff --git a/include/debug.h b/include/debug.h
+new file mode 100644
+index 0000000..5d72460
+--- /dev/null
++++ b/include/debug.h
+@@ -0,0 +1,40 @@
++/*
++ * Copyright (c) 2010
++ * Ulf Samuelsson. All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ * derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#ifndef __DEBUG_H__
++#define __DEBUG_H__
++
++struct debug_flag;
++
++struct debug_flag {
++ char debug;
++ char name[11];
++ struct debug_flag *next;
++};
++
++void register_debug_variable(struct debug_flag *dbg);
++
++#endif /* __DEBUG_H__ */
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0011-common-Makefile-Add-cmd_debug.c-to-build.patch b/recipes/u-boot/u-boot-2009.11/at91/0011-common-Makefile-Add-cmd_debug.c-to-build.patch
new file mode 100644
index 0000000000..a4b3a9bcfb
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0011-common-Makefile-Add-cmd_debug.c-to-build.patch
@@ -0,0 +1,27 @@
+From 81c5954a3932d46de7db92c7314060a491e20063 Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sun, 14 Mar 2010 00:12:35 +0100
+Subject: [PATCH] common/Makefile: Add cmd_debug.c to build
+
+Ensure cmd_debug.c is built if CONFIG_CMD_DEBUG is set
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ common/Makefile | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/common/Makefile b/common/Makefile
+index 47f6a71..a827be8 100644
+--- a/common/Makefile
++++ b/common/Makefile
+@@ -75,6 +75,7 @@ COBJS-$(CONFIG_CMD_CONSOLE) += cmd_console.o
+ COBJS-$(CONFIG_CMD_CPLBINFO) += cmd_cplbinfo.o
+ COBJS-$(CONFIG_DATAFLASH_MMC_SELECT) += cmd_dataflash_mmc_mux.o
+ COBJS-$(CONFIG_CMD_DATE) += cmd_date.o
++COBJS-$(CONFIG_CMD_DEBUG) += cmd_debug.o
+ ifdef CONFIG_4xx
+ COBJS-$(CONFIG_CMD_SETGETDCR) += cmd_dcr.o
+ endif
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0012-cmd_mci.c-Support-writing-out-AT91-mci-config.patch b/recipes/u-boot/u-boot-2009.11/at91/0012-cmd_mci.c-Support-writing-out-AT91-mci-config.patch
new file mode 100644
index 0000000000..90e9c96338
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0012-cmd_mci.c-Support-writing-out-AT91-mci-config.patch
@@ -0,0 +1,100 @@
+From f6871edd6ee8af5557543d4580c43431ddfdd167 Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sun, 14 Mar 2010 00:16:41 +0100
+Subject: [PATCH] cmd_mci.c: Support writing out AT91 mci config
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ common/Makefile | 1 +
+ common/cmd_mci.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 68 insertions(+), 0 deletions(-)
+ create mode 100644 common/cmd_mci.c
+
+diff --git a/common/Makefile b/common/Makefile
+index a827be8..e1a72a9 100644
+--- a/common/Makefile
++++ b/common/Makefile
+@@ -106,6 +106,7 @@ COBJS-$(CONFIG_CMD_LICENSE) += cmd_license.o
+ COBJS-y += cmd_load.o
+ COBJS-$(CONFIG_LOGBUFFER) += cmd_log.o
+ COBJS-$(CONFIG_ID_EEPROM) += cmd_mac.o
++COBJS-$(CONFIG_CMD_MCI) += cmd_mci.o
+ COBJS-$(CONFIG_CMD_MEMORY) += cmd_mem.o
+ COBJS-$(CONFIG_CMD_MFSL) += cmd_mfsl.o
+ COBJS-$(CONFIG_CMD_MG_DISK) += cmd_mgdisk.o
+diff --git a/common/cmd_mci.c b/common/cmd_mci.c
+new file mode 100644
+index 0000000..dea811b
+--- /dev/null
++++ b/common/cmd_mci.c
+@@ -0,0 +1,67 @@
++/*
++ * (C) Copyright 2000
++ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
++ *
++ * See file CREDITS for list of people who contributed to this
++ * project.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++#include <common.h>
++#include <command.h>
++#include <debug.h>
++
++#undef DEBUG
++#if defined(DEBUG)
++#define pr_debug(fmt, args...) printf(fmt, ##args)
++#else
++#define pr_debug(...) do { } while(0)
++#endif
++
++
++int do_mci (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
++{
++ int value;
++ char *p;
++ struct debug_flag *dbg;
++ pr_debug("Arg count = %d\n",argc);
++ for (value = 0; value < argc; value++) {
++ pr_debug("argv[%d] = \"%s\"\n",value,argv[value]);
++ }
++ switch (argc) {
++ case 2:
++ if (strcmp (s, "cid") == 0) {
++ printf("cid\n");
++ return 0;
++ } else if (strcmp (s, "csd") == 0) {
++ printf("csd\n");
++ return 0;
++ }
++ default:
++ printf ("Usage:\n%s\n", cmdtp->usage);
++ return 1;
++ }
++ return 0;
++}
++
++
++U_BOOT_CMD(
++ mci, 2, 1, do_mci,
++ "mci\t- display sd card info\n",
++ "[cid|csd]\n"
++ " - enable or disable debug"
++);
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0013-atmel_dataflash.c-Status-printout-depend-on-DEBUG.patch b/recipes/u-boot/u-boot-2009.11/at91/0013-atmel_dataflash.c-Status-printout-depend-on-DEBUG.patch
new file mode 100644
index 0000000000..030129be16
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0013-atmel_dataflash.c-Status-printout-depend-on-DEBUG.patch
@@ -0,0 +1,59 @@
+From 430af289fc8b48a53e4b899f64025d37689191df Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sun, 14 Mar 2010 00:20:07 +0100
+Subject: [PATCH] atmel_dataflash.c: Status printout depend on DEBUG
+
+Replace debug printf's with pr_debug, which
+only gets printed when DEBUG is set
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ drivers/spi/atmel_dataflash_spi.c | 25 +++++++++++++++----------
+ 1 files changed, 15 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/spi/atmel_dataflash_spi.c b/drivers/spi/atmel_dataflash_spi.c
+index 5307e34..f4bf916 100644
+--- a/drivers/spi/atmel_dataflash_spi.c
++++ b/drivers/spi/atmel_dataflash_spi.c
+@@ -28,6 +28,11 @@
+ #include <asm/arch/at91_spi.h>
+
+ #include <dataflash.h>
++#ifdef DEBUG
++#define pr_debug(fmt, args...) printf(fmt, ##args)
++#else
++#define pr_debug(...) do { } while(0)
++#endif
+
+ #define AT91_SPI_PCS0_DATAFLASH_CARD 0xE /* Chip Select 0: NPCS0%1110 */
+ #define AT91_SPI_PCS1_DATAFLASH_CARD 0xD /* Chip Select 1: NPCS1%1101 */
+@@ -91,16 +96,16 @@ void AT91F_SpiInit(void)
+ * Add tempo to get SPI in a safe state.
+ * Should not be needed for new silicon (Rev B)
+ */
+- printf("CPU running at %d Hz\n",get_cpu_clk_rate());
+- printf("MCK running at %d Hz\n",get_mck_clk_rate());
+- printf("SPI_MR 0x%08x\n",mr=readl(AT91_BASE_SPI + AT91_SPI_MR));
+- printf("SPI_SR 0x%08x\n",sr=readl(AT91_BASE_SPI + AT91_SPI_SR));
+- printf("SPI_IMR 0x%08x\n",imr=readl(AT91_BASE_SPI + AT91_SPI_IMR));
+- printf("SPI_CSR0 0x%08x\n",csr0=readl(AT91_BASE_SPI + AT91_SPI_CSR(0)));
+- printf("SPI_CSR1 0x%08x\n",csr1=readl(AT91_BASE_SPI + AT91_SPI_CSR(1)));
+- printf("SPI_CSR2 0x%08x\n",csr2=readl(AT91_BASE_SPI + AT91_SPI_CSR(2)));
+- printf("SPI_CSR3 0x%08x\n",csr3=readl(AT91_BASE_SPI + AT91_SPI_CSR(3)));
+- printf("SPI SPEED = %d Hz\n", get_mck_clk_rate()/ ((csr0 >> 8) & 0xff));
++ pr_debug("CPU running at %d Hz\n",get_cpu_clk_rate());
++ pr_debug("MCK running at %d Hz\n",get_mck_clk_rate());
++ pr_debug("SPI_MR 0x%08x\n",mr=readl(AT91_BASE_SPI + AT91_SPI_MR));
++ pr_debug("SPI_SR 0x%08x\n",sr=readl(AT91_BASE_SPI + AT91_SPI_SR));
++ pr_debug("SPI_IMR 0x%08x\n",imr=readl(AT91_BASE_SPI + AT91_SPI_IMR));
++ pr_debug("SPI_CSR0 0x%08x\n",csr0=readl(AT91_BASE_SPI + AT91_SPI_CSR(0)));
++ pr_debug("SPI_CSR1 0x%08x\n",csr1=readl(AT91_BASE_SPI + AT91_SPI_CSR(1)));
++ pr_debug("SPI_CSR2 0x%08x\n",csr2=readl(AT91_BASE_SPI + AT91_SPI_CSR(2)));
++ pr_debug("SPI_CSR3 0x%08x\n",csr3=readl(AT91_BASE_SPI + AT91_SPI_CSR(3)));
++ pr_debug("SPI SPEED = %d Hz\n", get_mck_clk_rate()/ ((csr0 >> 8) & 0xff));
+ udelay(500000);
+
+ readl(AT91_BASE_SPI + AT91_SPI_SR);
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0014-AT91-MCI-Add-support-for-SD-Card.patch b/recipes/u-boot/u-boot-2009.11/at91/0014-AT91-MCI-Add-support-for-SD-Card.patch
new file mode 100644
index 0000000000..c3fe6f797f
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0014-AT91-MCI-Add-support-for-SD-Card.patch
@@ -0,0 +1,740 @@
+From ae5aeb4f6bd5428e69b0c6a8f25d500d82dc6cde Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sun, 14 Mar 2010 00:24:22 +0100
+Subject: [PATCH] AT91 MCI: Add support for SD-Card
+
+Add support for at91 mci peripheral.
+This allows MMC/SD Cards to be used.
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c | 8 +-
+ cpu/arm926ejs/at91/at91sam9m10g45_devices.c | 14 +
+ cpu/arm926ejs/at91/clock.c | 5 +
+ drivers/mmc/atmel_mci.c | 393 ++++++++++++++++++++---
+ drivers/mmc/atmel_mci.h | 14 +
+ 5 files changed, 391 insertions(+), 43 deletions(-)
+
+diff --git a/board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c b/board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c
+index 45a14a9..dd54ccd 100644
+--- a/board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c
++++ b/board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c
+@@ -36,13 +36,14 @@
+ #include <asm/arch/hardware.h>
+ #include <lcd.h>
+ #include <atmel_lcdc.h>
++
+ #if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_MACB)
+ #include <net.h>
+ #endif
+ #include <netdev.h>
+
+ DECLARE_GLOBAL_DATA_PTR;
+-
++extern atmel_mci_init(void);
+ /* ------------------------------------------------------------------------- */
+ /*
+ * Miscelaneous platform dependent initialisations
+@@ -258,6 +259,11 @@ int board_init(void)
+ at91_spi0_hw_init(1 << 4);
+ #endif
+
++#if defined(CONFIG_MMC)
++ at91_mci0_hw_init();
++ atmel_mci_init();
++#endif
++
+ #ifdef CONFIG_MACB
+ at91sam9m10g45ek_macb_hw_init();
+ #endif
+diff --git a/cpu/arm926ejs/at91/at91sam9m10g45_devices.c b/cpu/arm926ejs/at91/at91sam9m10g45_devices.c
+index 07717ea..ad25e41 100644
+--- a/cpu/arm926ejs/at91/at91sam9m10g45_devices.c
++++ b/cpu/arm926ejs/at91/at91sam9m10g45_devices.c
+@@ -172,3 +172,17 @@ void at91_macb_hw_init(void)
+ #endif
+ }
+ #endif
++
++#if defined(CONFIG_MMC)
++void at91_mci0_hw_init()
++{
++ at91_set_A_periph(AT91_PIN_PA0, 0); /* MCI0_CK */
++ at91_set_A_periph(AT91_PIN_PA1, 0); /* MCI0_CDA */
++ at91_set_A_periph(AT91_PIN_PA2, 0); /* MCI0_DA0 */
++ at91_set_A_periph(AT91_PIN_PA3, 0); /* MCI0_DA1 */
++ at91_set_A_periph(AT91_PIN_PA4, 0); /* MCI0_DA2 */
++ at91_set_A_periph(AT91_PIN_PA5, 0); /* MCI0_DA3 */
++ at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9G45_ID_MCI0);
++}
++#endif
++
+diff --git a/cpu/arm926ejs/at91/clock.c b/cpu/arm926ejs/at91/clock.c
+index 574f488..3b5e66e 100644
+--- a/cpu/arm926ejs/at91/clock.c
++++ b/cpu/arm926ejs/at91/clock.c
+@@ -39,6 +39,11 @@ unsigned long get_mck_clk_rate(void)
+ return mck_rate_hz;
+ }
+
++inline unsigned long get_mci_clk_rate(void)
++{
++ return mck_rate_hz;
++}
++
+ unsigned long get_plla_clk_rate(void)
+ {
+ return plla_rate_hz;
+diff --git a/drivers/mmc/atmel_mci.c b/drivers/mmc/atmel_mci.c
+index 3946ffe..959bf6a 100644
+--- a/drivers/mmc/atmel_mci.c
++++ b/drivers/mmc/atmel_mci.c
+@@ -19,8 +19,10 @@
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
++#define DEBUG
+ #include <common.h>
+
++#include <fat.h>
+ #include <part.h>
+ #include <mmc.h>
+
+@@ -32,8 +34,18 @@
+
+ #include "atmel_mci.h"
+
+-#ifdef DEBUG
+-#define pr_debug(fmt, args...) printf(fmt, ##args)
++#if defined(CONFIG_CMD_DEBUG)
++#define DEBUG
++#include <debug.h>
++struct debug_flag mci_debug = {
++ .debug = 0,
++ .name = "mci",
++};
++#define pr_debugl(level, fmt, args...) if(mci_debug.debug >= level) printf(fmt, ##args)
++#define pr_debug(fmt, args...) if(mci_debug.debug > 0) printf(fmt, ##args)
++#elif defined(DEBUG)
++#define pr_debugl(level, fmt, args...) printf(fmt, ##args)
++#define pr_debug(fmt, args...) printf(fmt, ##args)
+ #else
+ #define pr_debug(...) do { } while(0)
+ #endif
+@@ -43,7 +55,7 @@
+ #endif
+
+ #ifndef CONFIG_SYS_MMC_CLK_PP
+-#define CONFIG_SYS_MMC_CLK_PP 5000000
++#define CONFIG_SYS_MMC_CLK_PP 15000000
+ #endif
+
+ #ifndef CONFIG_SYS_MMC_OP_COND
+@@ -53,10 +65,58 @@
+ #define MMC_DEFAULT_BLKLEN 512
+ #define MMC_DEFAULT_RCA 1
+
++#ifdef DEBUG
++char *cmd_name[56] = {
++ [0] = "GO_IDLE_STATE",
++ [1] = "SEND_OP_COND",
++ [2] = "ALL_SEND_CID",
++ [3] = "SET_RELATIVE_ADDR",
++ [4] = "SET_DSR",
++ [6] = "SWITCH",
++ [7] = "SELECT_CARD",
++ [8] = "SEND_EXT_CSD",
++ [9] = "SEND_CSD",
++ [10] = "SEND_CID",
++ [12] = "STOP_TRANSMISSION",
++ [13] = "SEND_STATUS",
++ [16] = "SET_BLOCKLEN",
++ [17] = "READ_SINGLE_BLOCK",
++ [18] = "READ_MULTIPLE_BLOCK",
++ [24] = "WRITE_SINGLE_BLOCK",
++ [25] = "WRITE_MULTIPLE_BLOCK",
++ [55] = "APP_CMD"
++};
++#endif
++char *month[13] = {
++ [ 1] = "Jan",
++ [ 2] = "Feb",
++ [ 3] = "Mar",
++ [ 4] = "Apr",
++ [ 5] = "May",
++ [ 6] = "Jun",
++ [ 7] = "Jul",
++ [ 8] = "Aug",
++ [ 9] = "Sep",
++ [10] = "Oct",
++ [11] = "Nov",
++ [12] = "Dec"
++};
++
++
++extern int get_mci_clk_rate(void);
++
+ static unsigned int mmc_rca;
+ static int mmc_card_is_sd;
+ static block_dev_desc_t mmc_blkdev;
+
++int atmel_mci_init(void)
++{
++#if defined(CONFIG_CMD_DEBUG)
++ register_debug_variable(&mci_debug);
++#endif
++ return 0;
++}
++
+ block_dev_desc_t *mmc_get_dev(int dev)
+ {
+ return &mmc_blkdev;
+@@ -114,9 +174,16 @@ mmc_cmd(unsigned long cmd, unsigned long arg,
+ unsigned long error_flags;
+ u32 status;
+
+- pr_debug("mmc: CMD%lu 0x%lx (flags 0x%lx)\n",
+- cmd, arg, flags);
++#ifdef DEBUG
++ char *name = NULL;
++ if(cmd <= 55)
++ name = cmd_name[cmd];
++ if (name == NULL)
++ name = "UNKNOWN";
+
++ pr_debugl(2,"mmc: %s [CMD%lu] 0x%lx (flags 0x%lx)\n",
++ name, cmd, arg, flags);
++#endif
+ error_flags = ERROR_FLAGS;
+ if (!(flags & RESP_NO_CRC))
+ error_flags |= MMCI_BIT(RCRCE);
+@@ -135,7 +202,7 @@ mmc_cmd(unsigned long cmd, unsigned long arg,
+ status = mmci_readl(SR);
+ } while (!(status & MMCI_BIT(CMDRDY)));
+
+- pr_debug("mmc: status 0x%08x\n", status);
++ pr_debugl(2,"mmc: status 0x%08x\n", status);
+
+ if (status & error_flags) {
+ printf("mmc: command %lu failed (status: 0x%08x)\n",
+@@ -144,13 +211,13 @@ mmc_cmd(unsigned long cmd, unsigned long arg,
+ }
+
+ if (response_words)
+- pr_debug("mmc: response:");
++ pr_debugl(2,"mmc: response:");
+
+ for (i = 0; i < response_words; i++) {
+ response[i] = mmci_readl(RSPR);
+- pr_debug(" %08lx", response[i]);
++ pr_debugl(2," %08lx", response[i]);
+ }
+- pr_debug("\n");
++ pr_debugl(2,"\n");
+
+ return 0;
+ }
+@@ -183,6 +250,8 @@ mmc_bread(int dev, unsigned long start, lbaint_t blkcnt,
+ void *buffer)
+ {
+ int ret, i = 0;
++
++ int timeout;
+ unsigned long resp[4];
+ unsigned long card_status, data;
+ unsigned long wordcount;
+@@ -203,22 +272,32 @@ mmc_bread(int dev, unsigned long start, lbaint_t blkcnt,
+ ret = mmc_cmd(MMC_CMD_SET_BLOCKLEN, mmc_blkdev.blksz, resp, R1 | NCR);
+ if (ret) goto out;
+
+- pr_debug("MCI_DTOR = %08lx\n", mmci_readl(DTOR));
++ pr_debugl(2, "MCI_DTOR = %08x\n", mmci_readl(DTOR));
+
+ for (i = 0; i < blkcnt; i++, start++) {
+ ret = mmc_cmd(MMC_CMD_READ_SINGLE_BLOCK,
+ start * mmc_blkdev.blksz, resp,
+ (R1 | NCR | TRCMD_START | TRDIR_READ
+ | TRTYP_BLOCK));
+- if (ret) goto out;
++ if (ret) {
++ pr_debugl(1,"\nmmc_bread: premature exit\n");
++ goto out;
++ }
+
+ ret = -EIO;
+ wordcount = 0;
+ do {
++ timeout = 0;
+ do {
+ status = mmci_readl(SR);
+ if (status & (ERROR_FLAGS | MMCI_BIT(OVRE)))
+ goto read_error;
++ timeout++;
++ if(timeout > 0x1000000) {
++ pr_debugl(1,"\nmmc: read timeout\n");
++ goto read_error;
++ }
++
+ } while (!(status & MMCI_BIT(RXRDY)));
+
+ if (status & MMCI_BIT(RXRDY)) {
+@@ -229,28 +308,50 @@ mmc_bread(int dev, unsigned long start, lbaint_t blkcnt,
+ }
+ } while(wordcount < (mmc_blkdev.blksz / 4));
+
+- pr_debug("mmc: read %u words, waiting for BLKE\n", wordcount);
+-
++ pr_debugl(2,"mmc: read %u dwords, waiting for BLKE\n", (unsigned int) wordcount);
++#ifndef CONFIG_ATMEL_HSMCI
+ do {
+ status = mmci_readl(SR);
+ } while (!(status & MMCI_BIT(BLKE)));
+-
+- putc('.');
++#endif
++ if(i%10 == 1) {
++ pr_debugl(1, ".");
++ }
++ udelay(1);
+ }
+
+ out:
++ pr_debugl(1,"\nmmc_bread ready\n");
+ /* Put the device back into Standby state */
+ mmc_cmd(MMC_CMD_SELECT_CARD, 0, resp, NCR);
+ return i;
+
+ read_error:
+- mmc_cmd(MMC_CMD_SEND_STATUS, mmc_rca << 16, &card_status, R1 | NCR);
+ printf("mmc: bread failed, status = %08x, card status = %08lx\n",
+ status, card_status);
++ mmc_cmd(MMC_CMD_SEND_STATUS, mmc_rca << 16, &card_status, R1 | NCR);
+ goto out;
+ }
+
+-static void mmc_parse_cid(struct mmc_cid *cid, unsigned long *resp)
++#if 0
++static void mmc_parse_cid_se(struct mmc_cid *cid, unsigned long *resp)
++{
++ cid->mid = resp[0] & 0xff;
++ cid->oid = (resp[0] >> 8) & 0xffff;
++ cid->pnm[0] = resp[0] >> 24;
++ cid->pnm[1] = resp[1];
++ cid->pnm[2] = resp[1] >> 8;
++ cid->pnm[3] = resp[1] >> 16;
++ cid->pnm[4] = resp[1] >> 24;
++ cid->pnm[5] = resp[2];
++ cid->pnm[6] = 0;
++ cid->prv = resp[2] >> 8;
++ cid->psn = (resp[2] >> 16) | (resp[3] << 16);
++ cid->mdt = (resp[3] >> 16) & 0x0ffff;
++
++}
++#endif
++static void mmc_parse_cid_be(struct mmc_cid *cid, unsigned long *resp)
+ {
+ cid->mid = resp[0] >> 24;
+ cid->oid = (resp[0] >> 8) & 0xffff;
+@@ -265,8 +366,24 @@ static void mmc_parse_cid(struct mmc_cid *cid, unsigned long *resp)
+ cid->psn = (resp[2] << 16) | (resp[3] >> 16);
+ cid->mdt = resp[3] >> 8;
+ }
+-
+-static void sd_parse_cid(struct mmc_cid *cid, unsigned long *resp)
++#if 0
++static void sd_parse_cid_le(struct mmc_cid *cid, unsigned long *resp)
++{
++ cid->mid = resp[0] & 0xff;
++ cid->oid = (resp[0] >> 8) & 0xffff;
++ cid->pnm[0] = resp[0] >> 24;
++ cid->pnm[1] = resp[1];
++ cid->pnm[2] = resp[1] >> 8;
++ cid->pnm[3] = resp[1] >> 16;
++ cid->pnm[4] = resp[1] >> 24;
++ cid->pnm[5] = 0;
++ cid->pnm[6] = 0;
++ cid->prv = resp[2] & 0xff;
++ cid->psn = (resp[2] >> 8) | (resp[3] << 24);
++ cid->mdt = (resp[3] >> 8) & 0x0ffff;
++}
++#endif
++static void sd_parse_cid_be(struct mmc_cid *cid, unsigned long *resp)
+ {
+ cid->mid = resp[0] >> 24;
+ cid->oid = (resp[0] >> 8) & 0xffff;
+@@ -281,6 +398,135 @@ static void sd_parse_cid(struct mmc_cid *cid, unsigned long *resp)
+ cid->psn = (resp[2] << 8) | (resp[3] >> 24);
+ cid->mdt = (resp[3] >> 8) & 0x0fff;
+ }
++#if 0
++static void sd_parse_cid_lx(struct mmc_cid *cid, unsigned char *resp)
++{
++
++ cid->mid = resp[0];
++ cid->oid = (resp[2] << 8) | resp[0];;
++ cid->pnm[0] = resp[3];
++ cid->pnm[1] = resp[4];
++ cid->pnm[2] = resp[5];
++ cid->pnm[3] = resp[6];
++ cid->pnm[4] = resp[7];
++ cid->pnm[5] = 0;
++ cid->pnm[6] = 0;
++ cid->prv = resp[8];
++ cid->psn =
++ (resp[ 9] * 0x00000001) |
++ (resp[10] * 0x00000100) |
++ (resp[11] * 0x00010000) |
++ (resp[12] * 0x01000000);
++ cid->mdt =
++ (resp[13] * 0x00000001) |
++ (resp[14] * 0x00000100);
++}
++#endif
++#define BM00 0x0000
++#define BM01 0x0001
++#define BM02 0x0003
++#define BM03 0x0007
++#define BM04 0x000f
++#define BM05 0x001f
++#define BM06 0x003f
++#define BM07 0x007f
++#define BM08 0x0ff
++#define BM09 0x01ff
++#define BM10 0x03ff
++#define BM11 0x07ff
++#define BM12 0x0fff
++
++static void mmc_parse_csd(unsigned long *resp, struct mmc_csd *csd)
++{
++ unsigned long *csd_raw = resp;
++ printf("CSD data: %08lx %08lx %08lx %08lx\n",
++ csd_raw[0], csd_raw[1], csd_raw[2], csd_raw[3]);
++
++ csd->csd_structure = ((resp[0] >> 30) & BM02);
++ csd->spec_vers = ((resp[0] >> 26) & BM04);
++ csd->rsvd1 = ((resp[0] >> 24) & BM02);
++ csd->taac = ((resp[0] >> 16) & BM08);
++ csd->nsac = ((resp[0] >> 8) & BM08);
++ csd->tran_speed = ((resp[0] >> 0) & BM08);
++
++ csd->ccc = ((resp[1] >> 20) & BM12);
++ csd->read_bl_len = ((resp[1] >> 16) & BM04);
++ csd->read_bl_partial = ((resp[1] >> 15) & BM01);
++ csd->write_blk_misalign = ((resp[1] >> 14) & BM01);
++ csd->read_blk_misalign = ((resp[1] >> 13) & BM01);
++ csd->dsr_imp = ((resp[1] >> 12) & BM01);
++ csd->rsvd2 = ((resp[1] >> 10) & BM02);
++ csd->c_size = (((resp[1] >> 0) & BM10) << 2) |
++ ((resp[2] >> 30) & BM02);
++
++ csd->vdd_r_curr_min = ((resp[2] >> 27) & BM03);
++ csd->vdd_r_curr_max = ((resp[2] >> 24) & BM03);
++ csd->vdd_w_curr_min = ((resp[2] >> 21) & BM03);
++ csd->vdd_w_curr_max = ((resp[2] >> 18) & BM03);
++ csd->c_size_mult = ((resp[2] >> 15) & BM03);
++
++ /* original: erase_blk_enable:1, sector_size:7, wp_grp_size:7 */
++ csd->sector_size = ((resp[2] >> 12) & BM05);
++ csd->erase_grp_size = ((resp[2] >> 6) & BM05);
++ csd->wp_grp_size = ((resp[2] >> 0) & BM05);
++
++ csd->wp_grp_enable = ((resp[3] >> 31) & BM01);
++
++ /* original: reserved for MultiMediaCompatability */
++ csd->default_ecc = ((resp[3] >> 29) & BM02);
++
++ csd->r2w_factor = ((resp[3] >> 26) & BM03);
++ csd->write_bl_len = ((resp[3] >> 22) & BM04);
++ csd->write_bl_partial = ((resp[3] >> 21) & BM01);
++ csd->rsvd3 = ((resp[3] >> 16) & BM05);
++ csd->file_format_grp = ((resp[3] >> 15) & BM01);
++ csd->copy = ((resp[3] >> 14) & BM01);
++ csd->perm_write_protect = ((resp[3] >> 13) & BM01);
++ csd->tmp_write_protect = ((resp[3] >> 12) & BM01);
++ csd->file_format = ((resp[3] >> 10) & BM02);
++ csd->ecc = ((resp[3] >> 8) & BM02);
++ csd->crc = ((resp[3] >> 1) & BM07);
++ csd->one = ((resp[3] >> 0) & BM01);
++
++ pr_debugl(2," csd_structure= 2:0x%08x\n", csd->csd_structure);
++ pr_debugl(2, "spec_vers= 4:0x%08x\n", csd->spec_vers);
++ pr_debugl(2, "rsvd1= 2:0x%08x\n", csd->rsvd1);
++ pr_debugl(2, "taac= 8:0x%08x\n", csd->taac);
++ pr_debugl(2, "nsac= 8:0x%08x\n", csd->nsac);
++ pr_debugl(2, "tran_speed= 8:0x%08x\n", csd->tran_speed);
++ pr_debugl(2, "ccc= 12:0x%08x\n", csd->ccc);
++ pr_debugl(2, "read_bl_len= 4:0x%08x\n", csd->read_bl_len);
++ pr_debugl(2, "read_bl_partial= 1:0x%08x\n", csd->read_bl_partial);
++ pr_debugl(2, "write_blk_misalign= 1:0x%08x\n", csd->write_blk_misalign);
++ pr_debugl(2, "read_blk_misalign= 1:0x%08x\n", csd->read_blk_misalign);
++ pr_debugl(2, "dsr_imp= 1:0x%08x\n", csd->dsr_imp);
++ pr_debugl(2, "rsvd2= 1:0x%08x\n", csd->rsvd2);
++ pr_debugl(2, "c_size= 12:0x%08x\n", csd->c_size);
++ pr_debugl(2, "vdd_r_curr_min= 3:0x%08x\n", csd->vdd_r_curr_min);
++ pr_debugl(2, "vdd_r_curr_max= 3:0x%08x\n", csd->vdd_r_curr_max);
++ pr_debugl(2, "vdd_w_curr_min= 3:0x%08x\n", csd->vdd_w_curr_min);
++ pr_debugl(2, "vdd_w_curr_max= 3:0x%08x\n", csd->vdd_w_curr_max);
++ pr_debugl(2, "c_size_mult= 3:0x%08x\n", csd->c_size_mult);
++ pr_debugl(2, "sector_size= 5:0x%08x\n", csd->sector_size);
++ pr_debugl(2, "erase_grp_size= 5:0x%08x\n", csd->erase_grp_size);
++ pr_debugl(2, "wp_grp_size= 5:0x%08x\n", csd->wp_grp_size);
++ pr_debugl(2, "wp_grp_enable= 1:0x%08x\n", csd->wp_grp_enable);
++ pr_debugl(2, "default_ecc= 0x%08x\n", csd->default_ecc);
++ pr_debugl(2, "r2w_factor= 0x%08x\n", csd->r2w_factor);
++ pr_debugl(2, "write_bl_len= 0x%08x\n", csd->write_bl_len);
++ pr_debugl(2, "write_bl_partial= 0x%08x\n", csd->write_bl_partial);
++ pr_debugl(2, "rsvd3= 0x%08x\n", csd->rsvd3);
++ pr_debugl(2, "file_format_grp= 1:0x%08x\n", csd->file_format_grp);
++ pr_debugl(2, "copy= 1:0x%08x\n", csd->copy);
++ pr_debugl(2, "perm_write_protect= 1:0x%08x\n", csd->perm_write_protect);
++ pr_debugl(2, "tmp_write_protect= 1:0x%08x\n", csd->tmp_write_protect);
++ pr_debugl(2, "file_format= 0x%08x\n", csd->file_format);
++ pr_debugl(2, "ecc= 0x%08x\n", csd->ecc);
++ pr_debugl(2, "crc= 0x%08x\n", csd->crc);
++ pr_debugl(2, "one= 0x%08x\n", csd->one);
++}
++
++
+
+ static void mmc_dump_cid(const struct mmc_cid *cid)
+ {
+@@ -290,15 +536,14 @@ static void mmc_dump_cid(const struct mmc_cid *cid)
+ printf("Product Revision: %u.%u\n",
+ cid->prv >> 4, cid->prv & 0x0f);
+ printf("Product Serial Number: %lu\n", cid->psn);
+- printf("Manufacturing Date: %02u/%02u\n",
+- cid->mdt >> 4, cid->mdt & 0x0f);
++ printf("Manufacturing Date: %s %4u\n",
++ month[cid->mdt & 0x0f], 2000u + ((cid->mdt >> 4) && 0xff));
++ pr_debug("mdt: %02x\n",cid->mdt);
+ }
+
+ static void mmc_dump_csd(const struct mmc_csd *csd)
+ {
+- unsigned long *csd_raw = (unsigned long *)csd;
+- printf("CSD data: %08lx %08lx %08lx %08lx\n",
+- csd_raw[0], csd_raw[1], csd_raw[2], csd_raw[3]);
++
+ printf("CSD structure version: 1.%u\n", csd->csd_structure);
+ printf("MMC System Spec version: %u\n", csd->spec_vers);
+ printf("Card command classes: %03x\n", csd->ccc);
+@@ -339,14 +584,19 @@ static int mmc_idle_cards(void)
+ return ret;
+
+ /* Keep the bus idle for 74 clock cycles */
+- return mmc_cmd(0, 0, NULL, INIT_CMD);
++ return mmc_cmd(MMC_CMD_GO_IDLE_STATE, 0, NULL, INIT_CMD);
+ }
+
+ static int sd_init_card(struct mmc_cid *cid, int verbose)
+ {
+ unsigned long resp[4];
+ int i, ret = 0;
+-
++#if 0
++ struct mmc_cid *cid_le;
++ struct mmc_cid *cid_be;
++ struct mmc_cid *cid_lx;
++#endif
++ unsigned char *p;
+ mmc_idle_cards();
+ for (i = 0; i < 1000; i++) {
+ ret = mmc_acmd(SD_CMD_APP_SEND_OP_COND, CONFIG_SYS_MMC_OP_COND,
+@@ -362,18 +612,45 @@ static int sd_init_card(struct mmc_cid *cid, int verbose)
+ ret = mmc_cmd(MMC_CMD_ALL_SEND_CID, 0, resp, R2 | NID);
+ if (ret)
+ return ret;
+- sd_parse_cid(cid, resp);
++#if 0
++ sd_parse_cid_le(cid_le, resp);
++ if (verbose)
++ mmc_dump_cid(cid_le);
++
++ sd_parse_cid_be(cid_be, resp);
++ if (verbose)
++ mmc_dump_cid(cid_be);
++
++ sd_parse_cid_lx(cid_lx, (unsigned char *) resp);
++ if (verbose)
++ mmc_dump_cid(cid_lx);
++#endif
++ sd_parse_cid_be(cid, resp);
+ if (verbose)
+ mmc_dump_cid(cid);
+
++ for(i = 0; i < 4; i++) {
++ pr_debug("CID[%d]: %08x\n",i,(unsigned int) resp[i]);
++ }
++ p = (unsigned char *) resp;
++ for(i = 0; i < 15; i++) {
++ pr_debug("%2d: '%c'\n",i,*p++);
++ }
++
+ /* Get RCA of the card that responded */
++ /* CMD3 */
+ ret = mmc_cmd(SD_CMD_SEND_RELATIVE_ADDR, 0, resp, R6 | NCR);
+ if (ret)
+ return ret;
+
+- mmc_rca = resp[0] >> 16;
++ pr_debug("RCA resp = 0x%08x\n",(unsigned int) resp[0]);
++ mmc_rca =
++ (((resp[0] >> 24) & 0xff) * 0x00000100) |
++ (((resp[0] >> 16) & 0xff) * 0x00000001);
++
++
+ if (verbose)
+- printf("SD Card detected (RCA %u)\n", mmc_rca);
++ printf("SD Card detected (RCA %u:0x%04x)\n", mmc_rca,mmc_rca);
+ mmc_card_is_sd = 1;
+ return 0;
+ }
+@@ -399,7 +676,8 @@ static int mmc_init_card(struct mmc_cid *cid, int verbose)
+ ret = mmc_cmd(MMC_CMD_ALL_SEND_CID, 0, resp, R2 | NID | OPEN_DRAIN);
+ if (ret)
+ return ret;
+- mmc_parse_cid(cid, resp);
++
++ mmc_parse_cid_be(cid, resp);
+ if (verbose)
+ mmc_dump_cid(cid);
+
+@@ -467,8 +745,9 @@ int mmc_legacy_init(int verbose)
+ {
+ struct mmc_cid cid;
+ struct mmc_csd csd;
+- unsigned int max_blksz;
+ int ret;
++ unsigned long resp[4];
++ int max_blksz;
+
+ /* Initialize controller */
+ mmci_writel(CR, MMCI_BIT(SWRST));
+@@ -488,9 +767,13 @@ int mmc_legacy_init(int verbose)
+ return ret;
+
+ /* Get CSD from the card */
+- ret = mmc_cmd(MMC_CMD_SEND_CSD, mmc_rca << 16, &csd, R2 | NCR);
++ /* CMD9 */
++ ret = mmc_cmd(MMC_CMD_SEND_CSD, mmc_rca << 16, resp, R2 | NCR);
+ if (ret)
+ return ret;
++
++ mmc_parse_csd(resp, &csd);
++
+ if (verbose)
+ mmc_dump_csd(&csd);
+
+@@ -498,15 +781,40 @@ int mmc_legacy_init(int verbose)
+
+ /* Initialize the blockdev structure */
+ mmc_blkdev.if_type = IF_TYPE_MMC;
++ mmc_blkdev.dev = 1;
+ mmc_blkdev.part_type = PART_TYPE_DOS;
+- mmc_blkdev.block_read = mmc_bread;
++ mmc_blkdev.target = 0;
++ mmc_blkdev.lun = 0;
++ mmc_blkdev.type = DEV_TYPE_HARDDISK;
++ mmc_blkdev.removable = 1;
++ mmc_blkdev.lba = (csd.c_size + 1) * (1 << (csd.c_size_mult + 2));
++ mmc_blkdev.blksz = MMC_DEFAULT_BLKLEN;
+ sprintf((char *)mmc_blkdev.vendor,
+- "Man %02x%04x Snr %08lx",
++ "Man %02x %04x Snr %08lx",
+ cid.mid, cid.oid, cid.psn);
+- strncpy((char *)mmc_blkdev.product, cid.pnm,
+- sizeof(mmc_blkdev.product));
++ sprintf((char *)mmc_blkdev.product, "%s",cid.pnm);
+ sprintf((char *)mmc_blkdev.revision, "%x %x",
+ cid.prv >> 4, cid.prv & 0x0f);
++ mmc_blkdev.block_read = mmc_bread;
++
++ pr_debugl(2,"c_size: %d, c_size_mult: %d, lba: %d\n",
++ csd.c_size,
++ csd.c_size_mult,
++ (int) mmc_blkdev.lba);
++
++ mci_set_mode(CONFIG_SYS_MMC_CLK_PP, mmc_blkdev.blksz);
++
++#if 0
++ pr_debugl(2,"mmc select card\n");
++ /* CMD7 */
++ ret = mmc_cmd(MMC_CMD_SELECT_CARD, mmc_rca << 16, resp, R1 | NCR);
++ if (ret) goto out;
++
++ /* CMD16 */
++ pr_debugl(2,"mmc set blocklen\n");
++ ret = mmc_cmd(MMC_CMD_SET_BLOCKLEN, mmc_blkdev.blksz, resp, R1 | NCR);
++ if (ret) goto out;
++#endif
+
+ /*
+ * If we can't use 512 byte blocks, refuse to deal with the
+@@ -514,20 +822,21 @@ int mmc_legacy_init(int verbose)
+ */
+ max_blksz = 1 << csd.read_bl_len;
+ if (max_blksz < 512 || (max_blksz > 512 && !csd.read_bl_partial)) {
+- printf("Card does not support 512 byte reads, aborting.\n");
+- return -ENODEV;
++ printf("Card does not support 512 byte reads, aborting.\n");
++ return -ENODEV;
++ } else {
++ mmc_blkdev.blksz = 512;
+ }
+- mmc_blkdev.blksz = 512;
+ mmc_blkdev.lba = (csd.c_size + 1) * (1 << (csd.c_size_mult + 2));
+
+- mci_set_mode(CONFIG_SYS_MMC_CLK_PP, mmc_blkdev.blksz);
+
+-#if 0
++#if 1
+ if (fat_register_device(&mmc_blkdev, 1))
+ printf("Could not register MMC fat device\n");
+ #else
++ pr_debugl(1,"mmc init part\n");
+ init_part(&mmc_blkdev);
+ #endif
+-
++ pr_debugl(1,"mmc init done\n");
+ return 0;
+ }
+diff --git a/drivers/mmc/atmel_mci.h b/drivers/mmc/atmel_mci.h
+index 5b4f5c9..2d716c0 100644
+--- a/drivers/mmc/atmel_mci.h
++++ b/drivers/mmc/atmel_mci.h
+@@ -29,6 +29,10 @@
+ #define MMCI_SDCR 0x000c
+ #define MMCI_ARGR 0x0010
+ #define MMCI_CMDR 0x0014
++#if defined(CONFIG_ATMEL_HSMCI)
++#define MMCI_BLKR 0x0018
++#define MMCI_CSTOR 0x001c
++#endif
+ #define MMCI_RSPR 0x0020
+ #define MMCI_RSPR1 0x0024
+ #define MMCI_RSPR2 0x0028
+@@ -40,6 +44,14 @@
+ #define MMCI_IDR 0x0048
+ #define MMCI_IMR 0x004c
+
++#if defined(CONFIG_ATMEL_HSMCI)
++#define MMCI_DMA 0x0050
++#define MMCI_CFG 0x0054
++#define MMCI_WPMR 0x00E4
++#define MMCI_WPSR 0x00E8
++#define MMCI_FIFO 0x0200
++#endif
++
+ /* Bitfields in CR */
+ #define MMCI_MCIEN_OFFSET 0
+ #define MMCI_MCIEN_SIZE 1
+@@ -198,4 +210,6 @@
+ #define mmci_writel(reg,value) \
+ writel((value), (void *)MMCI_BASE + MMCI_##reg)
+
++extern int atmel_mci_init(void);
++
+ #endif /* __CPU_AT32AP_ATMEL_MCI_H__ */
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot-2009.11/at91/0015-sam9m10g45ek-Add-configuration-file.patch b/recipes/u-boot/u-boot-2009.11/at91/0015-sam9m10g45ek-Add-configuration-file.patch
new file mode 100644
index 0000000000..fe128dce1d
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.11/at91/0015-sam9m10g45ek-Add-configuration-file.patch
@@ -0,0 +1,113 @@
+From 6002730900b2c062ce8433aba61cabbe7253eb17 Mon Sep 17 00:00:00 2001
+From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+Date: Sun, 14 Mar 2010 00:25:56 +0100
+Subject: [PATCH] sam9m10g45ek: Add configuration file
+
+Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
+---
+ include/configs/at91sam9m10g45ek.h | 47 +++++++++++++++++++++++++++++++----
+ 1 files changed, 41 insertions(+), 6 deletions(-)
+
+diff --git a/include/configs/at91sam9m10g45ek.h b/include/configs/at91sam9m10g45ek.h
+index a60bb6b..6ac56ca 100644
+--- a/include/configs/at91sam9m10g45ek.h
++++ b/include/configs/at91sam9m10g45ek.h
+@@ -26,7 +26,8 @@
+
+ #ifndef __CONFIG_H
+ #define __CONFIG_H
+-
++#define CONFIG_CMD_DEBUG 1
++#define CONFIG_SYS_ROOTFS_SD 1
+ /* ARM asynchronous clock */
+ #define AT91_MAIN_CLOCK 12000000 /* from 12 MHz crystal */
+ #define CONFIG_SYS_HZ 1000
+@@ -96,13 +97,28 @@
+ #undef CONFIG_CMD_IMI
+ #undef CONFIG_CMD_IMLS
+ #undef CONFIG_CMD_LOADS
+-#undef CONFIG_CMD_SOURCE
+
++#define CONFIG_CMD_SOURCE
++#undef CONFIG_CMD_XIMG
++#define CONFIG_CMD_ASKENV
++#define CONFIG_CMD_EXT2
++#define CONFIG_CMD_FAT
++#undef CONFIG_CMD_JFFS2
++#define CONFIG_CMD_MMC
+ #define CONFIG_CMD_PING 1
+ #define CONFIG_CMD_DHCP 1
+ #define CONFIG_CMD_NAND 1
+ #define CONFIG_CMD_USB 1
+
++/* MCI */
++#define MMCI_BASE AT91SAM9G45_BASE_MCI0
++#define CONFIG_MMC 1
++#define CONFIG_ATMEL_MCI 1
++#define CONFIG_ATMEL_HSMCI 1
++#define CONFIG_SYS_MMC_CLK_OD 1000000
++#define CONFIG_SUPPORT_VFAT
++
++
+ /* SDRAM */
+ #define CONFIG_NR_DRAM_BANKS 1
+ #define PHYS_SDRAM 0x70000000
+@@ -122,7 +138,8 @@
+ #define CONFIG_SYS_MAX_DATAFLASH_BANKS 1
+ #define CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS0 0xC0000000 /* CS0 */
+ #define CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS1 0xD0000000 /* CS1 */
+-#define AT91_SPI_CLK 15000000
++#define AT91_SPI_CLK 1000000
++#define AT91_SPI_MODE AT91_SPI_MODE3
+ #define DATAFLASH_TCSS (0x1a << 16)
+ #define DATAFLASH_TCHS (0x1 << 24)
+
+@@ -179,10 +196,11 @@
+ #define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS 2
+ #define CONFIG_USB_STORAGE 1
+
+-#define CONFIG_SYS_LOAD_ADDR 0x22000000 /* load address */
++
++#define CONFIG_SYS_LOAD_ADDR 0x72000000 /* load address */
+
+ #define CONFIG_SYS_MEMTEST_START PHYS_SDRAM
+-#define CONFIG_SYS_MEMTEST_END 0x23e00000
++#define CONFIG_SYS_MEMTEST_END PHYS_SDRAM + PHYS_SDRAM_SIZE
+
+ #ifdef CONFIG_SYS_USE_DATAFLASH
+
+@@ -192,13 +210,30 @@
+ #define CONFIG_SYS_MONITOR_BASE (0xC0000000 + 0x8400)
+ #define CONFIG_ENV_OFFSET 0x4200
+ #define CONFIG_ENV_ADDR (0xC0000000 + CONFIG_ENV_OFFSET)
++#if 1
+ #define CONFIG_ENV_SIZE 0x4200
+-#define CONFIG_ENV_SECT_SIZE 0x4200
++#define CONFIG_ENV_SECT_SIZE 0x420
++#else
++#define CONFIG_ENV_SIZE 0x420
++#define CONFIG_ENV_SECT_SIZE 0x420
++#endif
++
++#ifdef CONFIG_SYS_ROOTFS_SD
++#define CONFIG_BOOTCOMMAND "mmc init; fatload mmc 1:1 0x72000000 uImage; bootm 0x72000000"
++#define CONFIG_BOOTARGS "console=ttyS0,115200 " \
++ "root=/dev/mmcblk1p2 " \
++ "rootdelay=2 "\
++ "rootfstype=rootfs rw"
++#endif
++
++#ifdef CONFIG_SYS_ROOTFS_NAND
+ #define CONFIG_BOOTCOMMAND "cp.b 0xC0042000 0x72000000 0x290000; bootm 0x72000000"
+ #define CONFIG_BOOTARGS "console=ttyS0,115200 " \
+ "root=/dev/mtdblock1 " \
+ "mtdparts=atmel_nand:4M(unused)ro,-(root) "\
+ "rw rootfstype=jffs2"
++#endif
++
+
+ #else /* CONFIG_SYS_USE_NANDFLASH */
+
+--
+1.6.0.2
+
diff --git a/recipes/u-boot/u-boot_2009.11.bb b/recipes/u-boot/u-boot_2009.11.bb
new file mode 100644
index 0000000000..fd88679d50
--- /dev/null
+++ b/recipes/u-boot/u-boot_2009.11.bb
@@ -0,0 +1,44 @@
+PR = "r1"
+require u-boot.inc
+
+DEFAULT_PREFERENCE = "-1"
+DEFAULT_PREFERENCE_at91sam9g10ek = "2"
+DEFAULT_PREFERENCE_at91sam9g20ek = "2"
+DEFAULT_PREFERENCE_at91sam9g45ek = "2"
+DEFAULT_PREFERENCE_at91sam9m10ekes = "2"
+DEFAULT_PREFERENCE_at91sam9m10g45ek = "2"
+DEFAULT_PREFERENCE_at91sam9g45ek = "2"
+DEFAULT_PREFERENCE_at91sam9g45ekes = "2"
+
+
+SRC_URI = "ftp://ftp.denx.de/pub/u-boot/u-boot-${PV}.tar.bz2 "
+
+SRC_URI_append_at91 = "\
+ file://at91/0002-Support-running-ATSAM9G45-M10-from-dataflash.patch;patch=1 \
+ file://at91/0003-Update-SAM9M10-G45-config-for-dataflash-support.patch;patch=1 \
+ file://at91/0004-Support-selecting-SPI-mode-in-dataflash-driver.patch;patch=1 \
+ file://at91/0005-mux-replace-verbose-dataflash_mmc_mux-command.patch;patch=1 \
+ file://at91/0006-libarm-board.c-Gets-overwritten-workaround.patch;patch=1 \
+ file://at91/0007-fat.c-Add-DEBUG-currently-disabled.patch;patch=1 \
+ file://at91/0008-env_dataflash.c-More-robust-handling.patch;patch=1 \
+ file://at91/0009-cmd_debug.c-Add-a-generic-function-for-debug-vars.patch;patch=1 \
+ file://at91/0010-debug.h-Add-header-for-debug-variables.patch;patch=1 \
+ file://at91/0011-common-Makefile-Add-cmd_debug.c-to-build.patch;patch=1 \
+ file://at91/0012-cmd_mci.c-Support-writing-out-AT91-mci-config.patch;patch=1 \
+ file://at91/0013-atmel_dataflash.c-Status-printout-depend-on-DEBUG.patch;patch=1 \
+ file://at91/0014-AT91-MCI-Add-support-for-SD-Card.patch;patch=1 \
+ file://at91/0015-sam9m10g45ek-Add-configuration-file.patch;patch=1 \
+ "
+
+TARGET_LDFLAGS = ""
+
+inherit base
+
+do_compile () {
+ oe_runmake ${UBOOT_MACHINE}
+ oe_runmake all
+}
+
+SRC_URI[md5sum] = "d94700614225f53c853dfe714eb5fa47"
+SRC_URI[sha256sum] = "066615314fc90a314823ac975ca2a525a51fdad41802f4088a3a21ce073e8de6"
+