diff --git a/binaries/g45memtest b/binaries/g45memtest index 3857de2dd5906f51be11a3fbeac481c91c0abad5..df9294a330846fd01d9fbd65b02bdd28774e192f 100755 Binary files a/binaries/g45memtest and b/binaries/g45memtest differ diff --git a/patches/g45memtest/0001-board-9g45ek-fix-ddr-config-for-WRS-V3.patch b/patches/g45memtest/0001-board-9g45ek-fix-ddr-config-for-WRS-V3.patch index 455cec744f8ce05f6b61767f15a36739f3abf660..6cd9ecea4da494275c69da3b063488b2b802d154 100644 --- a/patches/g45memtest/0001-board-9g45ek-fix-ddr-config-for-WRS-V3.patch +++ b/patches/g45memtest/0001-board-9g45ek-fix-ddr-config-for-WRS-V3.patch @@ -1,7 +1,7 @@ -From f87ac48aaf4ec7726391b87577fceede1b561228 Mon Sep 17 00:00:00 2001 +From 6c56f4f07d953d33a90584dd15360f8d572483a4 Mon Sep 17 00:00:00 2001 From: Alessandro Rubini <rubini@gnudd.com> Date: Thu, 15 Sep 2011 23:41:14 +0200 -Subject: [PATCH 1/6] board 9g45ek: fix ddr config for WRS-V3 +Subject: [PATCH 01/19] board 9g45ek: fix ddr config for WRS-V3 --- board/at91sam9g45ek/at91sam9g45ek.c | 2 +- @@ -81,5 +81,5 @@ index 550aea4..a4a168f 100644 #define AT91C_DDRC2_NR_12 (0x1 << 2) // (HDDRSDRC2) 12 Bits #define AT91C_DDRC2_NR_13 (0x2 << 2) // (HDDRSDRC2) 13 Bits -- -1.7.7.2 +1.7.9.5 diff --git a/patches/g45memtest/0002-printf-added-files-from-pptp-unchanged.patch b/patches/g45memtest/0002-printf-added-files-from-pptp-unchanged.patch index 194c973cbb42507f827f9877f8172566b6878cc7..801085ed63450e572eb1578d4b1e8e5495be4340 100644 --- a/patches/g45memtest/0002-printf-added-files-from-pptp-unchanged.patch +++ b/patches/g45memtest/0002-printf-added-files-from-pptp-unchanged.patch @@ -1,12 +1,12 @@ -From c27eea873f4a7dd9bea3da51b8e4aba27b9e52fc Mon Sep 17 00:00:00 2001 +From b257bbfacdfa9475ca0a812a64d6ab59de9ea440 Mon Sep 17 00:00:00 2001 From: Alessandro Rubini <rubini@gnudd.com> Date: Tue, 6 Mar 2012 10:18:59 +0100 -Subject: [PATCH 2/6] printf: added files from pptp, unchanged +Subject: [PATCH 02/19] printf: added files from pptp, unchanged --- lib/diag-printf.c | 34 ++++++++++++++++++++++++++ lib/printf-mini.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 103 insertions(+), 0 deletions(-) + 2 files changed, 103 insertions(+) create mode 100644 lib/diag-printf.c create mode 100644 lib/printf-mini.c @@ -126,5 +126,5 @@ index 0000000..d68c848 + return str - buf; +} -- -1.7.7.2 +1.7.9.5 diff --git a/patches/g45memtest/0003-printf-fixes-and-addition-to-makefile.patch b/patches/g45memtest/0003-printf-fixes-and-addition-to-makefile.patch index ba2a46249793a63156488c7b39fb4512d086b965..111648dbdcf778ce395a73456ee5cf365b04f2de 100644 --- a/patches/g45memtest/0003-printf-fixes-and-addition-to-makefile.patch +++ b/patches/g45memtest/0003-printf-fixes-and-addition-to-makefile.patch @@ -1,7 +1,7 @@ -From 3ebc7c415750ffcd7cf4241010027773609e6919 Mon Sep 17 00:00:00 2001 +From dc2e9ac1fcca99e6c4924714f26cf85a87e3259c Mon Sep 17 00:00:00 2001 From: Alessandro Rubini <rubini@gnudd.com> Date: Tue, 6 Mar 2012 10:37:27 +0100 -Subject: [PATCH 3/6] printf: fixes and addition to makefile +Subject: [PATCH 03/19] printf: fixes and addition to makefile --- include/pp_printf.h | 9 +++++++++ @@ -78,5 +78,5 @@ index 2a46204..8810324 100644 #include "main.h" #include "dbgu.h" -- -1.7.7.2 +1.7.9.5 diff --git a/patches/g45memtest/0004-version-add-tmpconfig-to-ignore-list.patch b/patches/g45memtest/0004-version-add-tmpconfig-to-ignore-list.patch new file mode 100644 index 0000000000000000000000000000000000000000..dfe50a9a36304470236f3cb7015e4922d7a579e5 --- /dev/null +++ b/patches/g45memtest/0004-version-add-tmpconfig-to-ignore-list.patch @@ -0,0 +1,21 @@ +From 391890df3ca410003b51bf45a4b17a5a8e22a588 Mon Sep 17 00:00:00 2001 +From: Benoit Rat <benoit@sevensols.com> +Date: Fri, 23 Mar 2012 13:42:57 +0100 +Subject: [PATCH 04/19] version: add tmpconfig to ignore list + +--- + .gitignore | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/.gitignore b/.gitignore +index d78652e..a973a59 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -21,3 +21,4 @@ binaries + *.o + tags + *.swp ++.tmpconfig* +-- +1.7.9.5 + diff --git a/patches/g45memtest/0005-version-Improve-tracking-bin-versions-adding-git-ver.patch b/patches/g45memtest/0005-version-Improve-tracking-bin-versions-adding-git-ver.patch new file mode 100644 index 0000000000000000000000000000000000000000..fb3cbe3c373f2eb95971adf4b863d07b108b25b2 --- /dev/null +++ b/patches/g45memtest/0005-version-Improve-tracking-bin-versions-adding-git-ver.patch @@ -0,0 +1,91 @@ +From c28fc11363fb86c25b447817a6554874ad65f09a Mon Sep 17 00:00:00 2001 +From: Benoit Rat <benoit@sevensols.com> +Date: Wed, 28 Mar 2012 18:54:06 +0200 +Subject: [PATCH 05/19] version: Improve tracking bin versions adding git + version in Makefile + +--- + .gitignore | 1 + + Makefile | 25 ++++++++++++++++++++++++- + main.c | 6 ++++++ + 3 files changed, 31 insertions(+), 1 deletion(-) + +diff --git a/.gitignore b/.gitignore +index a973a59..8b91fe5 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -22,3 +22,4 @@ binaries + tags + *.swp + .tmpconfig* ++version.c +diff --git a/Makefile b/Makefile +index 6216632..c61ee3e 100644 +--- a/Makefile ++++ b/Makefile +@@ -220,7 +220,7 @@ include driver/driver.mk + + SRCS := $(COBJS-y:.o=.c) + +-OBJS := $(SOBJS-y) $(COBJS-y) ++OBJS := $(SOBJS-y) $(COBJS-y) version.o + + INCL=board/$(BOARD) + +@@ -273,6 +273,29 @@ PHONY:=all gen_bin + + all: PrintFlags gen_bin ChkFileSize + ++## If not git is found ++ifeq ($(shell git status -s | grep -v "fatal*"),) ++version.c: $(SOBJS-y) $(COBJS-y) ++ @echo "/**" > $@ ++ @echo " * File automatically generated by Makefile (DO NOT MODIFIED)\n *\n * To use this you in a c code just add the following lines:\n * " >> $@ ++ @echo "\textern const char build_time[];\n\textern const char git_user[];\n\textren const char git_revision[];\n * " >> $@ ++ @echo "**/" >> $@ ++ @echo 'const char build_time[] = __DATE__ " @ " __TIME__ ;' >> $@ ++ @echo "const char git_user[] = \"$(shell id -nu)\";" >> $@ ++ @echo "const char git_revision[] = \"\";" >> $@ ++ @echo "" >> $@ ++else ++version.c: $(SOBJS-y) $(COBJS-y) .git/HEAD .git/index ++ @echo "/**" > $@ ++ @echo " * File automatically generated by Makefile (DO NOT MODIFIED)\n *\n * To use this you in a c code just add the following lines:\n * " >> $@ ++ @echo "\textern const char build_time[];\n\textern const char git_user[];\n\textren const char git_revision[];\n * " >> $@ ++ @echo "**/" >> $@ ++ @echo 'const char build_time[] = __DATE__ " @ " __TIME__ ;' >> $@ ++ @echo "const char git_user[] = \"$(shell git config --get user.name)\";" >> $@ ++ @echo "const char git_revision[] = \"$(shell git rev-parse HEAD)$(shell if git status -s > /dev/null; then echo '+'; fi;)\";" >> $@ ++ @echo "" >> $@ ++endif ++ + PrintFlags: + @echo as FLAGS + @echo ======== +diff --git a/main.c b/main.c +index 8810324..0ea1716 100644 +--- a/main.c ++++ b/main.c +@@ -83,6 +83,10 @@ void Wait(unsigned int count) + /*------------------------------------------------------------------------------*/ + int main(void) + { ++ extern const char build_time[]; ++ extern const char git_user[]; ++ extern const char git_revision[]; ++ + /* + * ================== 1st step: Hardware Initialization ================= + * +@@ -92,6 +96,8 @@ int main(void) + hw_init(); + #endif + ++ pp_printf("Compiled by %s (%s)\r\ngit rev:%s\r\n\r\n",git_user,build_time,git_revision); ++ + #ifdef CONFIG_USER_HW_INIT + user_hw_init(); + #endif +-- +1.7.9.5 + diff --git a/patches/g45memtest/0006-leds-Correct-FPGA-LED-problems-and-add-CPU-LED-durin.patch b/patches/g45memtest/0006-leds-Correct-FPGA-LED-problems-and-add-CPU-LED-durin.patch new file mode 100644 index 0000000000000000000000000000000000000000..a05cd56f732b63834017b83a759d43a7aebc2cf5 --- /dev/null +++ b/patches/g45memtest/0006-leds-Correct-FPGA-LED-problems-and-add-CPU-LED-durin.patch @@ -0,0 +1,35 @@ +From 4a94ffdd4e78d50d24669f2646b3648bc93a51c4 Mon Sep 17 00:00:00 2001 +From: Benoit Rat <benoit@sevensols.com> +Date: Wed, 28 Mar 2012 19:19:46 +0200 +Subject: [PATCH 06/19] leds: Correct FPGA LED problems, and add CPU LED + during booting + +--- + board/at91sam9g45ek/at91sam9g45ek.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/board/at91sam9g45ek/at91sam9g45ek.c b/board/at91sam9g45ek/at91sam9g45ek.c +index 8569231..83c2c29 100644 +--- a/board/at91sam9g45ek/at91sam9g45ek.c ++++ b/board/at91sam9g45ek/at91sam9g45ek.c +@@ -80,6 +80,17 @@ void hw_init(void) + }; + + /* ++ * Configure LED GPIOs ++ */ ++ const struct pio_desc led_gpio[] = { ++ {"D11", AT91C_PIN_PA(0), 0, PIO_OPENDRAIN, PIO_OUTPUT}, //Switch on D11 when booting start. ++ {"D12", AT91C_PIN_PA(1), 1, PIO_OPENDRAIN, PIO_OUTPUT}, //Setup D12 such to use when the programs end loading. ++ {"DDone", AT91C_PIN_PA(2), 0, PIO_DEFAULT, PIO_INPUT}, //Setup FPGA LED Done in read mode ++ {"DInit", AT91C_PIN_PA(3), 0, PIO_DEFAULT, PIO_INPUT} //Setup FPGA LED Init in read mode ++ }; ++ pio_setup(led_gpio); ++ ++ /* + * Disable watchdog + */ + writel(AT91C_WDTC_WDDIS, AT91C_BASE_WDTC + WDTC_WDMR); +-- +1.7.9.5 + diff --git a/patches/g45memtest/0007-ddr-Fix-ba-offset-bug-and-improve-configuration.patch b/patches/g45memtest/0007-ddr-Fix-ba-offset-bug-and-improve-configuration.patch new file mode 100644 index 0000000000000000000000000000000000000000..c33e6ca7e63a4c1a9fcb6b9600529fd3a4c60f23 --- /dev/null +++ b/patches/g45memtest/0007-ddr-Fix-ba-offset-bug-and-improve-configuration.patch @@ -0,0 +1,211 @@ +From e5b1d890e842647f0a70af8381d5114a7ca8635d Mon Sep 17 00:00:00 2001 +From: Benoit Rat <benoit@sevensols.com> +Date: Mon, 19 Mar 2012 17:49:43 +0100 +Subject: [PATCH 07/19] ddr: Fix ba offset bug and improve configuration + +--- + board/at91sam9g45ek/at91sam9g45ek.c | 34 ++++++++++++++++++---------------- + driver/ddramc.c | 20 +++++++++++++------- + include/AT91SAM9G45_inc.h | 5 ++++- + include/DDR2_MT47H_inc.h | 35 +++++++++++++++++++++++++++++++++++ + include/ddramc.h | 2 +- + 5 files changed, 71 insertions(+), 25 deletions(-) + create mode 100644 include/DDR2_MT47H_inc.h + +diff --git a/board/at91sam9g45ek/at91sam9g45ek.c b/board/at91sam9g45ek/at91sam9g45ek.c +index 83c2c29..e6b8f9c 100644 +--- a/board/at91sam9g45ek/at91sam9g45ek.c ++++ b/board/at91sam9g45ek/at91sam9g45ek.c +@@ -151,7 +151,7 @@ void hw_init(void) + /* + * Configure DDRAM Controller + */ +- ddramc_hw_init(); ++ ddramc_hw_init(); + #endif /* CONFIG_DDR2 */ + } + #endif /* CONFIG_HW_INIT */ +@@ -163,36 +163,38 @@ static SDdramConfig ddram_config; + /* \fn ddramc_hw_init */ + /* \brief This function performs DDRAMC HW initialization */ + /*------------------------------------------------------------------------------*/ +-void ddramc_hw_init(void) ++ ++ ++void ddramc_hw_init() + { + ddram_config.ddramc_mdr = + (AT91C_DDRC2_DBW_16_BITS | AT91C_DDRC2_MD_DDR2_SDRAM); + +- ddram_config.ddramc_cr = (AT91C_DDRC2_NC_DDR10_SDR9 | // 10 column bits (1K) +- AT91C_DDRC2_NR_13 | // 13 row bits (8K) ++ ddram_config.ddramc_cr = (AT91C_DDRC2_NC_XX | // see include/DDR2_MT47H_inc.h ++ AT91C_DDRC2_NR_XX | // see include/DDR2_MT47H_inc.h + AT91C_DDRC2_CAS_3 | // CAS Latency 3 + AT91C_DDRC2_DLL_RESET_DISABLED); // DLL not reset + + ddram_config.ddramc_rtr = 0x24B; + +- ddram_config.ddramc_t0pr = (AT91C_DDRC2_TRAS_6 | // 6 * 7.5 = 45 ns +- AT91C_DDRC2_TRCD_2 | // 2 * 7.5 = 22.5 ns +- AT91C_DDRC2_TWR_2 | // 2 * 7.5 = 15 ns +- AT91C_DDRC2_TRC_8 | // 8 * 7.5 = 75 ns +- AT91C_DDRC2_TRP_2 | // 2 * 7.5 = 22.5 ns +- AT91C_DDRC2_TRRD_1 | // 1 * 7.5 = 7.5 ns +- AT91C_DDRC2_TWTR_1 | // 1 clock cycle +- AT91C_DDRC2_TMRD_2); // 2 clock cycles ++ ddram_config.ddramc_t0pr = (AT91C_DDRC2_TRAS_6 | // 6 * 7.5 = 45 ns ++ AT91C_DDRC2_TRCD_2 | // 2 * 7.5 = 15 ns ++ AT91C_DDRC2_TWR_2 | // 2 * 7.5 = 15 ns ++ AT91C_DDRC2_TRC_8 | // 8 * 7.5 = 75 ns ++ AT91C_DDRC2_TRP_2 | // 2 * 7.5 = 22.5 ns ++ AT91C_DDRC2_TRRD_XX | // see include/DDR2_MT47H_inc.h ++ AT91C_DDRC2_TWTR_1 | // 1 clock cycle ++ AT91C_DDRC2_TMRD_2); // 2 clock cycles + + ddram_config.ddramc_t1pr = (AT91C_DDRC2_TXP_2 | // 2 * 7.5 = 15 ns + 200 << 16 | // 200 clock cycles, TXSRD: Exit self refresh delay to Read command + 16 << 8 | // 16 * 7.5 = 120 ns TXSNR: Exit self refresh delay to non read command + AT91C_DDRC2_TRFC_14 << 0); // 14 * 7.5 = 142 ns (must be 140 ns for 1Gb DDR) + +- ddram_config.ddramc_t2pr = (AT91C_DDRC2_TRTP_1 | // 1 * 7.5 = 7.5 ns +- AT91C_DDRC2_TRPA_0 | // 0 * 7.5 = 0 ns +- AT91C_DDRC2_TXARDS_7 | // 7 clock cycles +- AT91C_DDRC2_TXARD_2); // 2 clock cycles ++ ddram_config.ddramc_t2pr = (AT91C_DDRC2_TRTP_1 | // 1 * 7.5 = 7.5 ns ++ AT91C_DDRC2_TRPA_XX | // see include/DDR2_MT47H_inc.h ++ AT91C_DDRC2_TXARDS_XX | // see include/DDR2_MT47H_inc.h ++ AT91C_DDRC2_TXARD_2); // 2 clock cycles + + // ENABLE DDR2 clock + writel(AT91C_PMC_DDR, AT91C_BASE_PMC + PMC_SCER); +diff --git a/driver/ddramc.c b/driver/ddramc.c +index e2824ff..f6fdfe8 100644 +--- a/driver/ddramc.c ++++ b/driver/ddramc.c +@@ -75,10 +75,16 @@ int ddram_init(unsigned int ddram_controller_address, + ba_offset = (ddram_config->ddramc_cr & AT91C_DDRC2_NC) + 9; // number of column bits for DDR + if (ddram_decod_seq(ddram_config->ddramc_cr)) + ba_offset += ((ddram_config->ddramc_cr & AT91C_DDRC2_NR) >> 2) + 11; // number of row bits +- ba_offset += (ddram_config->ddramc_mdr & AT91C_DDRC2_DBW) ? 1 : 2; // bus width +- +- dbg_log(3, " ba_offset = %x ... ", ba_offset); +- ++ ba_offset += (ddram_config->ddramc_mdr & AT91C_DDRC2_DBW) ? 1 : 2; // bus width ++ ++ dbg_log(1,"DDR2 Config: %x (NC=%d, NR=%d, CAS=%d, ba_offset = %x)\n\r", ++ ddram_config->ddramc_cr , ++ (ddram_config->ddramc_cr & AT91C_DDRC2_NC) + 9, ++ ((ddram_config->ddramc_cr & AT91C_DDRC2_NR) >> 2) + 11, ++ (ddram_config->ddramc_cr & AT91C_DDRC2_CAS) >> 4, ++ ba_offset ++ ); ++ + // Step 1: Program the memory device type + write_ddramc(ddram_controller_address, HDDRSDRC2_MDR, + ddram_config->ddramc_mdr); +@@ -126,7 +132,7 @@ int ddram_init(unsigned int ddram_controller_address, + write_ddramc(ddram_controller_address, HDDRSDRC2_MR, + AT91C_DDRC2_MODE_EXT_LMR_CMD); + /* Perform a write access to DDR address so that BA[1] is set to 1 and BA[0] is set to 0. */ +- *((unsigned int *)(ddram_address + 0x4000000 /* (0x2 << ba_offset) */)) = 0; ++ *((unsigned int *)(ddram_address + (0x2 << ba_offset))) = 0; + + // wait 2 cycles min (of tCK) = 15 ns min + Wait(2); +@@ -135,7 +141,7 @@ int ddram_init(unsigned int ddram_controller_address, + /* Perform a write access to DDR address so that BA[1] is set to 1 and BA[0] is set to 1. */ + write_ddramc(ddram_controller_address, HDDRSDRC2_MR, + AT91C_DDRC2_MODE_EXT_LMR_CMD); +- *((unsigned int *)(ddram_address + 0x6000000 /* (0x3 << ba_offset) */)) = 0; ++ *((unsigned int *)(ddram_address + (0x3 << ba_offset))) = 0; + + // wait 2 cycles min (of tCK) = 15 ns min + Wait(2); +@@ -144,7 +150,7 @@ int ddram_init(unsigned int ddram_controller_address, + /* Perform a write access to DDR address so that BA[1] is set to 0 and BA[0] is set to 1. */ + write_ddramc(ddram_controller_address, HDDRSDRC2_MR, + AT91C_DDRC2_MODE_EXT_LMR_CMD); +- *((unsigned int *)(ddram_address + 0x2000000 /* (0x1 << ba_offset) */)) = 0; ++ *((unsigned int *)(ddram_address + (0x1 << ba_offset))) = 0; + + // wait 200 cycles min (of tCK) = 1500 ns min + Wait(100); +diff --git a/include/AT91SAM9G45_inc.h b/include/AT91SAM9G45_inc.h +index a4a168f..a73fcd3 100644 +--- a/include/AT91SAM9G45_inc.h ++++ b/include/AT91SAM9G45_inc.h +@@ -267,7 +267,7 @@ + #define AT91C_DDRC2_NC_DDR10_SDR9 (0x1) // (HDDRSDRC2) DDR 10 Bits | SDR 9 Bits + #define AT91C_DDRC2_NC_DDR11_SDR10 (0x2) // (HDDRSDRC2) DDR 11 Bits | SDR 10 Bits + #define AT91C_DDRC2_NC_DDR12_SDR11 (0x3) // (HDDRSDRC2) DDR 12 Bits | SDR 11 Bits +-#define AT91C_DDRC2_NR AT91C_DDRC2_NR_13 // (HDDRSDRC2) Number of Row Bits ++#define AT91C_DDRC2_NR (0x3 << 2) // (HDDRSDRC2) Number of Row Bits (MASK) + #define AT91C_DDRC2_NR_11 (0x0 << 2) // (HDDRSDRC2) 11 Bits + #define AT91C_DDRC2_NR_12 (0x1 << 2) // (HDDRSDRC2) 12 Bits + #define AT91C_DDRC2_NR_13 (0x2 << 2) // (HDDRSDRC2) 13 Bits +@@ -6350,3 +6350,6 @@ + #define BOARD_SD_MCI_ID_USE 0 + + #define CHIP_SRAM0_BASEADDR 0x300000 ++ ++//Hacks to include our DDR without modifying the whole board ++#include "DDR2_MT47H_inc.h" +\ No newline at end of file +diff --git a/include/DDR2_MT47H_inc.h b/include/DDR2_MT47H_inc.h +new file mode 100644 +index 0000000..75b3af3 +--- /dev/null ++++ b/include/DDR2_MT47H_inc.h +@@ -0,0 +1,35 @@ ++/** ++* Small hacks to make the at91bootstrap works with our DDR memories ++* ++* Author: Benoit RAT ++* ++**/ ++#ifndef WRS318V3 ++#define WRS318V3 1 //Version 3.1 ++ ++#define MT47H32M16HR 0x025E ++#ifdef MT47H32M16HR ++ //Then define new value ++ #define AT91C_DDRC2_NC_XX AT91C_DDRC2_NC_DDR10_SDR9 // 10 column bits (1K) ++ #define AT91C_DDRC2_NR_XX AT91C_DDRC2_NR_13 // 13 row bits (8K) ++ #define AT91C_DDRC2_TRRD_XX AT91C_DDRC2_TRRD_2 // 2 * 7.5 > 10 ns ++ ++ #if MT47H32M16HR == 0x025E //for -25E ++ #define AT91C_DDRC2_TRPA_XX AT91C_DDRC2_TRPA_2 // 2 * 7.5 = 15 ns ++ #define AT91C_DDRC2_TXARDS_XX AT91C_DDRC2_TXARDS_8 // ++ #endif ++ ++ #if MT47H32M16HR == 0x0030 //for -3 ++ #define AT91C_DDRC2_TRPA_XX AT91C_DDRC2_TRPA_3 // 3 * 7.5 = 22.5 ns ++ #define AT91C_DDRC2_TXARDS_XX AT91C_DDRC2_TXARDS_7 // ++ #endif ++#else //Original values for AT ++ #define AT91C_DDRC2_NC_XX AT91C_DDRC2_NC_DDR10_SDR9 // 10 column bits (1K) ++ #define AT91C_DDRC2_NR_XX AT91C_DDRC2_NR_13 ++ #define AT91C_DDRC2_TRPA_XX AT91C_DDRC2_TRPA_0 ++ #define AT91C_DDRC2_TXARDS_XX AT91C_DDRC2_TXARDS_7 ++ #define AT91C_DDRC2_TRRD_XX AT91C_DDRC2_TRRD_1 ++#endif ++ ++ ++#endif +\ No newline at end of file +diff --git a/include/ddramc.h b/include/ddramc.h +index 3e7a30a..527436f 100644 +--- a/include/ddramc.h ++++ b/include/ddramc.h +@@ -45,6 +45,6 @@ typedef struct SDdramConfig { + extern int ddram_init(unsigned int ddram_controller_address, + unsigned int ddram_address, + struct SDdramConfig *ddram_config); +-extern void ddramc_hw_init(void); ++extern void ddramc_hw_init(); + + #endif /*SDRAMC_H_ */ +-- +1.7.9.5 + diff --git a/patches/g45memtest/0008-boot-disable-watchdog-asap.patch b/patches/g45memtest/0008-boot-disable-watchdog-asap.patch new file mode 100644 index 0000000000000000000000000000000000000000..6d570abeeae729891e4415d39f900bfd4bb9e703 --- /dev/null +++ b/patches/g45memtest/0008-boot-disable-watchdog-asap.patch @@ -0,0 +1,28 @@ +From 3c96273023f759800c3cb3309ac1ef8a83fe7f04 Mon Sep 17 00:00:00 2001 +From: Alessandro Rubini <rubini@gnudd.com> +Date: Tue, 10 Apr 2012 13:00:22 +0200 +Subject: [PATCH 08/19] boot: disable watchdog asap + +--- + crt0_gnu.S | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/crt0_gnu.S b/crt0_gnu.S +index c00b717..0a9079b 100644 +--- a/crt0_gnu.S ++++ b/crt0_gnu.S +@@ -105,6 +105,11 @@ _relocate_to_sram: + ldr pc, =_setup_clocks + #endif /* CONFIG_FLASH */ + ++ /* disable watchdog */ ++ ldr r1, =0xFFFFFD44 ++ mov r2, #0x00008000 ++ str r2, [r1] ++ + ldr r4, = lowlevel_clock_init + mov lr, pc + bx r4 +-- +1.7.9.5 + diff --git a/patches/g45memtest/0009-boot-added-flip_leds-count-in-assembler.patch b/patches/g45memtest/0009-boot-added-flip_leds-count-in-assembler.patch new file mode 100644 index 0000000000000000000000000000000000000000..94d33c5c1cd54f24d04a20c377a730a8c2f80b66 --- /dev/null +++ b/patches/g45memtest/0009-boot-added-flip_leds-count-in-assembler.patch @@ -0,0 +1,52 @@ +From a6f38ea81c99fca8ad2c67b0b03d97c16fe97d94 Mon Sep 17 00:00:00 2001 +From: Alessandro Rubini <rubini@gnudd.com> +Date: Tue, 10 Apr 2012 13:04:09 +0200 +Subject: [PATCH 09/19] boot: added flip_leds(count) in assembler + +--- + crt0_gnu.S | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +diff --git a/crt0_gnu.S b/crt0_gnu.S +index 0a9079b..784c9ce 100644 +--- a/crt0_gnu.S ++++ b/crt0_gnu.S +@@ -74,6 +74,35 @@ irq_vector: + b irq_vector + fiq_vector: + b fiq_vector ++ ++/* ++ * First of all, write a procedure, that can be called from C or asm, ++ * to flip leds a number of times, after a small delay ++ */ ++ ++flip_leds: /* input: r0 is the count of flips */ ++ ++ /* a delay */ ++ ldr r1, =200 ++1: subs r1, r1, #1 ++ bne 1b ++ ++ ldr r1, =0xfffff200 /* PIOA */ ++ mov r2, #3 /* bit 0 and 1: both leds */ ++ ++ str r2, [r1] /* enable */ ++ str r2, [r1, #0x10] /* output enable */ ++ cmp r0, #0 ++ beq 2f ++0: str r2, [r1, #0x34] /* output clear (led on) */ ++ str r2, [r1, #0x30] /* output set (led off) */ ++ subs r0, r0, #1 ++ bne 0b ++ ++2: bx lr ++ ++.ltorg ++ + reset_vector: + + /* Init the stack */ +-- +1.7.9.5 + diff --git a/patches/g45memtest/0010-boot-Run-a-test-pattern-between-clock-configuration.patch b/patches/g45memtest/0010-boot-Run-a-test-pattern-between-clock-configuration.patch new file mode 100644 index 0000000000000000000000000000000000000000..35272acfd3a0101ec6c5d75e376962c4279788f4 --- /dev/null +++ b/patches/g45memtest/0010-boot-Run-a-test-pattern-between-clock-configuration.patch @@ -0,0 +1,45 @@ +From b24256ae1eab66b12e361dc0e7873d081275ac24 Mon Sep 17 00:00:00 2001 +From: Alessandro Rubini <rubini@gnudd.com> +Date: Tue, 10 Apr 2012 13:40:59 +0200 +Subject: [PATCH 10/19] boot: Run a test pattern between clock configuration + +--- + crt0_gnu.S | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/crt0_gnu.S b/crt0_gnu.S +index 784c9ce..bc54989 100644 +--- a/crt0_gnu.S ++++ b/crt0_gnu.S +@@ -79,7 +79,6 @@ fiq_vector: + * First of all, write a procedure, that can be called from C or asm, + * to flip leds a number of times, after a small delay + */ +- + flip_leds: /* input: r0 is the count of flips */ + + /* a delay */ +@@ -139,10 +138,20 @@ _relocate_to_sram: + mov r2, #0x00008000 + str r2, [r1] + ++ /* test 4x the flip_leds procedure */ ++ mov r0, #0x4 ++ bl flip_leds ++ ++ /* Call the lowlevel clock init function in ./driver/pmc.c */ + ldr r4, = lowlevel_clock_init + mov lr, pc + bx r4 + ++ /* test 8x the flip_leds procedure */ ++ mov r0, #0x8 ++ bl flip_leds ++ ++ + #if 0 + _setup_clocks: + /* Test if main oscillator is enabled */ +-- +1.7.9.5 + diff --git a/patches/g45memtest/0011-boot-Correct-crash-due-to-an-Atmel-bug-during-boot-w.patch b/patches/g45memtest/0011-boot-Correct-crash-due-to-an-Atmel-bug-during-boot-w.patch new file mode 100644 index 0000000000000000000000000000000000000000..7e620702b177f43edd1166257a888ff9f4b3233c --- /dev/null +++ b/patches/g45memtest/0011-boot-Correct-crash-due-to-an-Atmel-bug-during-boot-w.patch @@ -0,0 +1,26 @@ +From 00b15b66a2bde319a0e4ba592a26f921d542cfca Mon Sep 17 00:00:00 2001 +From: Benoit Rat <benoit@sevensols.com> +Date: Wed, 11 Apr 2012 17:25:28 +0200 +Subject: [PATCH 11/19] boot: Correct crash due to an Atmel bug during boot + when PLL clock is already used as master clock + +--- + driver/pmc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/driver/pmc.c b/driver/pmc.c +index 1a09b9c..189d1c9 100644 +--- a/driver/pmc.c ++++ b/driver/pmc.c +@@ -96,7 +96,7 @@ void lowlevel_clock_init() + /* + * After stablization, switch to 12MHz Main Oscillator + */ +- if ((read_pmc(PMC_MCKR) & AT91C_PMC_CSS) != AT91C_PMC_CSS_SLOW_CLK) { ++ if ((read_pmc(PMC_MCKR) & AT91C_PMC_CSS) == AT91C_PMC_CSS_SLOW_CLK) { + write_pmc(PMC_MCKR, AT91C_PMC_CSS_MAIN_CLK | AT91C_PMC_PRES_CLK); + while (!(read_pmc(PMC_SR) & AT91C_PMC_MCKRDY)) + ; +-- +1.7.9.5 + diff --git a/patches/g45memtest/0012-Improve-makefile-to-only-take-the-gitversion-of-curr.patch b/patches/g45memtest/0012-Improve-makefile-to-only-take-the-gitversion-of-curr.patch new file mode 100644 index 0000000000000000000000000000000000000000..6efa6017bbbaa74cb7fa8a3cc15870d3e216d342 --- /dev/null +++ b/patches/g45memtest/0012-Improve-makefile-to-only-take-the-gitversion-of-curr.patch @@ -0,0 +1,26 @@ +From 8083ba2049c07ce9f939819ce3016912d256019f Mon Sep 17 00:00:00 2001 +From: Benoit Rat <benoit@sevensols.com> +Date: Wed, 11 Apr 2012 17:25:28 +0200 +Subject: [PATCH 12/19] Improve makefile to only take the gitversion of + current directory + +--- + Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile b/Makefile +index c61ee3e..fd7f16e 100644 +--- a/Makefile ++++ b/Makefile +@@ -292,7 +292,7 @@ version.c: $(SOBJS-y) $(COBJS-y) .git/HEAD .git/index + @echo "**/" >> $@ + @echo 'const char build_time[] = __DATE__ " @ " __TIME__ ;' >> $@ + @echo "const char git_user[] = \"$(shell git config --get user.name)\";" >> $@ +- @echo "const char git_revision[] = \"$(shell git rev-parse HEAD)$(shell if git status -s > /dev/null; then echo '+'; fi;)\";" >> $@ ++ @echo "const char git_revision[] = \"$(shell git log --abbrev-commit --pretty=oneline -1 . | cut -d" " -f1)$(shell if git status -s > /dev/null; then echo '+'; fi;)\";" >> $@ + @echo "" >> $@ + endif + +-- +1.7.9.5 + diff --git a/patches/g45memtest/0013-add-simple-script-to-compile-for-DF-and-NF.patch b/patches/g45memtest/0013-add-simple-script-to-compile-for-DF-and-NF.patch new file mode 100644 index 0000000000000000000000000000000000000000..8fbafcd3d8472425614683b93ed8ae3b969e1fec --- /dev/null +++ b/patches/g45memtest/0013-add-simple-script-to-compile-for-DF-and-NF.patch @@ -0,0 +1,40 @@ +From eaa9bd4511b69b6097726b68957fa7da5a44323f Mon Sep 17 00:00:00 2001 +From: Benoit Rat <benoit@sevensols.com> +Date: Fri, 11 May 2012 12:36:25 +0200 +Subject: [PATCH 13/19] add simple script to compile for DF and NF + +--- + build.sh | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + create mode 100755 build.sh + +diff --git a/build.sh b/build.sh +new file mode 100755 +index 0000000..a9711d9 +--- /dev/null ++++ b/build.sh +@@ -0,0 +1,21 @@ ++#!/bin/bash ++ ++showhelp() ++{ ++ echo "Usage: $0 [options]" ++ echo "options:" ++ echo " --help: show this little help" ++ echo " --df: compile only for dataflash" ++ echo " --nf: compile only for nandflash" ++} ++ ++ ++ ++case "$1" in ++ --help) showhelp;; ++ --nf) yes "" | make at91sam9g45nf_defconfig > /dev/null; make;; ++ --df) yes "" | make at91sam9g45df_defconfig > /dev/null; make;; ++ *) yes "" | make at91sam9g45df_defconfig > /dev/null; make; yes "" | make at91sam9g45nf_defconfig > /dev/null; make;; ++esac ++ ++ +-- +1.7.9.5 + diff --git a/patches/g45memtest/0014-Correct-a-bug-in-makefile.patch b/patches/g45memtest/0014-Correct-a-bug-in-makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..333625172615ae57a9690a00822d074f6a38a3ff --- /dev/null +++ b/patches/g45memtest/0014-Correct-a-bug-in-makefile.patch @@ -0,0 +1,33 @@ +From 5006567aeb801664a861ffe05337943c89dcae60 Mon Sep 17 00:00:00 2001 +From: Benoit Rat <benoit@sevensols.com> +Date: Fri, 11 May 2012 12:48:13 +0200 +Subject: [PATCH 14/19] Correct a bug in makefile + +--- + Makefile | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/Makefile b/Makefile +index fd7f16e..88dfffc 100644 +--- a/Makefile ++++ b/Makefile +@@ -285,14 +285,14 @@ version.c: $(SOBJS-y) $(COBJS-y) + @echo "const char git_revision[] = \"\";" >> $@ + @echo "" >> $@ + else +-version.c: $(SOBJS-y) $(COBJS-y) .git/HEAD .git/index ++version.c: $(SOBJS-y) $(COBJS-y) .git/HEAD .git/index Makefile + @echo "/**" > $@ + @echo " * File automatically generated by Makefile (DO NOT MODIFIED)\n *\n * To use this you in a c code just add the following lines:\n * " >> $@ + @echo "\textern const char build_time[];\n\textern const char git_user[];\n\textren const char git_revision[];\n * " >> $@ + @echo "**/" >> $@ + @echo 'const char build_time[] = __DATE__ " @ " __TIME__ ;' >> $@ + @echo "const char git_user[] = \"$(shell git config --get user.name)\";" >> $@ +- @echo "const char git_revision[] = \"$(shell git log --abbrev-commit --pretty=oneline -1 . | cut -d" " -f1)$(shell if git status -s > /dev/null; then echo '+'; fi;)\";" >> $@ ++ @echo "const char git_revision[] = \"$(shell git log --abbrev-commit --pretty=oneline -1 . | cut -d" " -f1)$(shell if git status -s > /dev/null; then echo '+'; else echo ''; fi;)\";" >> $@ + @echo "" >> $@ + endif + +-- +1.7.9.5 + diff --git a/patches/g45memtest/0004-memtest.c-copied-from-barebox-our-version.patch b/patches/g45memtest/0015-memtest-copied-from-barebox-our-version.patch similarity index 98% rename from patches/g45memtest/0004-memtest.c-copied-from-barebox-our-version.patch rename to patches/g45memtest/0015-memtest-copied-from-barebox-our-version.patch index 69b48b5f36d47a59cfd5a930615b642fdd4f9bc0..bd57eced3a11e492ff07b1acd285ba616cc71594 100644 --- a/patches/g45memtest/0004-memtest.c-copied-from-barebox-our-version.patch +++ b/patches/g45memtest/0015-memtest-copied-from-barebox-our-version.patch @@ -1,11 +1,11 @@ -From 425ef2fa1550b9e480167f8b125adb897f281798 Mon Sep 17 00:00:00 2001 +From 80b81d783772a87000356f126cb47dc429a95f3d Mon Sep 17 00:00:00 2001 From: Alessandro Rubini <rubini@gnudd.com> Date: Tue, 6 Mar 2012 10:42:17 +0100 -Subject: [PATCH 4/6] memtest.c: copied from barebox (our version) +Subject: [PATCH 15/19] memtest: copied from barebox (our version) --- lib/memtest.c | 355 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 files changed, 355 insertions(+), 0 deletions(-) + 1 file changed, 355 insertions(+) create mode 100644 lib/memtest.c diff --git a/lib/memtest.c b/lib/memtest.c @@ -370,5 +370,5 @@ index 0000000..d9c8b3d +BAREBOX_CMD_END + -- -1.7.7.2 +1.7.9.5 diff --git a/patches/g45memtest/0005-memtest-fix-it-and-add-to-makefile.patch b/patches/g45memtest/0016-memtest-fix-it-and-add-to-makefile.patch similarity index 96% rename from patches/g45memtest/0005-memtest-fix-it-and-add-to-makefile.patch rename to patches/g45memtest/0016-memtest-fix-it-and-add-to-makefile.patch index 664f344276392635479e51dd72d641f11984a820..986cf657553612d8098aad99ebf3fcd63b77e60e 100644 --- a/patches/g45memtest/0005-memtest-fix-it-and-add-to-makefile.patch +++ b/patches/g45memtest/0016-memtest-fix-it-and-add-to-makefile.patch @@ -1,11 +1,11 @@ -From 74e27efd703fbafab08c28c7f7d0eb1aaae7db8e Mon Sep 17 00:00:00 2001 +From fa3b681d37c9787473f4ed8fc33205471696db8d Mon Sep 17 00:00:00 2001 From: Alessandro Rubini <rubini@gnudd.com> Date: Tue, 6 Mar 2012 11:38:53 +0100 -Subject: [PATCH 5/6] memtest: fix it and add to makefile +Subject: [PATCH 16/19] memtest: fix it and add to makefile --- lib/libc.mk | 1 + - lib/memtest.c | 85 +++++++++++++++++++++++--------------------------------- + lib/memtest.c | 85 ++++++++++++++++++++++++--------------------------------- 2 files changed, 36 insertions(+), 50 deletions(-) diff --git a/lib/libc.mk b/lib/libc.mk @@ -191,5 +191,5 @@ index d9c8b3d..52542c9 100644 -BAREBOX_CMD_END - -- -1.7.7.2 +1.7.9.5 diff --git a/patches/g45memtest/0006-main-call-memtest.patch b/patches/g45memtest/0017-main-call-memtest.patch similarity index 83% rename from patches/g45memtest/0006-main-call-memtest.patch rename to patches/g45memtest/0017-main-call-memtest.patch index ae7bc26f619d14f7eb19441abeb5ff6d75ed6711..66b7ebadb6421602b75e73753383e141c48bfa50 100644 --- a/patches/g45memtest/0006-main-call-memtest.patch +++ b/patches/g45memtest/0017-main-call-memtest.patch @@ -1,25 +1,26 @@ -From cf60a3a806e75315e39610d40607d76efcc5816c Mon Sep 17 00:00:00 2001 +From 5f895df9f30230375cbbf2320a7c8af00d852fc2 Mon Sep 17 00:00:00 2001 From: Alessandro Rubini <rubini@gnudd.com> Date: Tue, 6 Mar 2012 11:39:13 +0100 -Subject: [PATCH 6/6] main: call memtest +Subject: [PATCH 17/19] main: call memtest --- - main.c | 92 +++------------------------------------------------------------- - 1 files changed, 4 insertions(+), 88 deletions(-) + main.c | 93 ++++------------------------------------------------------------ + 1 file changed, 5 insertions(+), 88 deletions(-) diff --git a/main.c b/main.c -index 8810324..e4a6956 100644 +index 0ea1716..60f3fe7 100644 --- a/main.c +++ b/main.c -@@ -83,6 +83,7 @@ void Wait(unsigned int count) - /*------------------------------------------------------------------------------*/ - int main(void) - { -+ extern void mem_test(unsigned long ini, unsigned long end); +@@ -86,6 +86,8 @@ int main(void) + extern const char build_time[]; + extern const char git_user[]; + extern const char git_revision[]; ++ ++ extern void mem_test(unsigned long ini, unsigned long end); + /* * ================== 1st step: Hardware Initialization ================= - * -@@ -101,92 +102,7 @@ int main(void) +@@ -107,92 +109,7 @@ int main(void) load_1wire_info(); #endif @@ -116,5 +117,5 @@ index 8810324..e4a6956 100644 + return 0; /* not reached */ } -- -1.7.7.2 +1.7.9.5 diff --git a/patches/g45memtest/0018-memtest-Improve-DDR-check-with-basic-dataline-adress.patch b/patches/g45memtest/0018-memtest-Improve-DDR-check-with-basic-dataline-adress.patch new file mode 100644 index 0000000000000000000000000000000000000000..f48dd71f98c8d44ca28e3ccbe5921d42b7006ba9 --- /dev/null +++ b/patches/g45memtest/0018-memtest-Improve-DDR-check-with-basic-dataline-adress.patch @@ -0,0 +1,618 @@ +From 65c1e3949e8a8c6dfc82bcdb778ff1eb7bf82a14 Mon Sep 17 00:00:00 2001 +From: Benoit Rat <benoit@sevensols.com> +Date: Mon, 2 Apr 2012 14:10:36 +0200 +Subject: [PATCH 18/19] memtest: Improve DDR check with basic dataline, + adressline and integrity tests + +--- + lib/memtest.c | 523 +++++++++++++++++++++++++++++++++------------------------ + 1 file changed, 304 insertions(+), 219 deletions(-) + +diff --git a/lib/memtest.c b/lib/memtest.c +index 52542c9..4366171 100644 +--- a/lib/memtest.c ++++ b/lib/memtest.c +@@ -25,6 +25,8 @@ + + #include <pp_printf.h> + #include <dbgu.h> ++#include <debug.h> ++//#include <stdlib.h> + + /* BEGIN HACKS - to compile barebox code out of barebox */ + typedef unsigned char uchar; +@@ -39,16 +41,106 @@ typedef volatile unsigned char vu_char; + #define printf pp_printf + #define puts dbgu_print + ++#ifdef DEBUG ++#define pr_debug(fmt, arg...) printf(fmt, ##arg) ++#else ++#define pr_debug(fmt, arg...) do {} while(0) ++#endif ++#define debug(fmt, arg...) pr_debug(fmt, ##arg) ++ + static inline int ctrlc(void) {return 0;} + static inline void __putc(int c) {printf("%c", c);} + ++#define CONFIG_CMD_MTEST_ALTERNATIVE ++ + /* END HACKS - to compile barebox code out of barebox */ + ++ ++/** ++* Check integrity of the memory with various patterns ++**/ ++int mem_test_integrity(ulong _start, ulong _end, ulong pattern) ++{ ++ vu_long *addr; ++ vu_long *start = (vu_long *)_start; ++ vu_long *end = (vu_long *)_end; ++ ulong val; ++ ulong readback; ++ ulong incr; ++ ulong iter; ++ ulong pattern_next; ++ ulong val_next; ++ int rcode; ++ ++ incr = 1; ++ iter=1; ++ ++ for (addr=start,val=pattern; addr<end; addr++) { ++ *addr = val; ++ val += incr; ++ } ++ ++ ++ for (;;) { ++ if (ctrlc()) { ++ putchar('\n'); ++ return 1; ++ } ++ ++ ++ /* ++ * Flip the pattern each time to make lots of zeros and ++ * then, the next time, lots of ones. We decrement ++ * the "negative" patterns and increment the "positive" ++ * patterns to preserve this feature. ++ */ ++ if(pattern & 0x80000000) { ++ pattern_next = -pattern; /* complement & increment */ ++ } ++ else { ++ pattern_next = ~pattern; ++ } ++ ++ ++ ++ printf ("#0x%08lx: Pattern 0x%08lX ...",iter,pattern); ++ ++ for (addr=start,val=pattern, val_next=pattern_next; addr<end; addr++) { ++ readback = *addr; ++ if (readback != val) { ++ printf ("\r\nMem error @ 0x%08X: " ++ "found 0x%08lX, expected 0x%08lX\r\n", ++ (uint)addr, readback, val); ++ rcode = 1; ++ } ++ ++ //Write the the next value to read ++ *addr=val_next; ++ ++ //Increment actual read value and decrement write value. ++ val += incr; ++ val_next -= incr; ++ } ++ ++ printf("\tOK\r\n"); ++ iter++; ++ pattern=pattern_next; ++ incr = -incr; ++ ++ } ++ return rcode; ++} ++ ++ ++ ++ + /* + * Perform a memory test. A more complete alternative test can be + * configured using CONFIG_CMD_MTEST_ALTERNATIVE. The complete test + * loops until interrupted by ctrl-c or by a failure of one of the + * sub-tests. ++ * ++ * ref: http://www.barrgroup.com/Embedded-Systems/How-To/Memory-Test-Suite-C + */ + #ifdef CONFIG_CMD_MTEST_ALTERNATIVE + int mem_test(ulong _start, ulong _end, ulong pattern_unused) +@@ -57,6 +149,7 @@ int mem_test(ulong _start, ulong _end, ulong pattern_unused) + vu_long *end = (vu_long *)_end; + vu_long *addr; + ulong val; ++ ulong nErr; + ulong readback; + vu_long addr_mask; + vu_long offset; +@@ -71,7 +164,7 @@ int mem_test(ulong _start, ulong _end, ulong pattern_unused) + vu_long *dummy = start; + #endif + int j; +- int iterations = 1; ++ + + static const ulong bitpattern[] = { + 0x00000001, /* single bit */ +@@ -84,257 +177,249 @@ int mem_test(ulong _start, ulong _end, ulong pattern_unused) + 0xaaaaaaaa, /* alternating 1/0 */ + }; + ++ ++ printf ("\rTesting DDR: 0x%08lX" ++ " > 0x%08lX\n\r", ++ _start, _end); ++ ++ + /* XXX: enforce alignment of start and end? */ +- for (;;) { +- if (ctrlc()) { +- putchar ('\n'); +- return 1; +- } ++ if (ctrlc()) { ++ putchar ('\n'); ++ return 1; ++ } + +- printf("Iteration: %6d\r", iterations); +- iterations++; + +- /* +- * Data line test: write a pattern to the first +- * location, write the 1's complement to a 'parking' +- * address (changes the state of the data bus so a +- * floating bus doen't give a false OK), and then +- * read the value back. Note that we read it back +- * into a variable because the next time we read it, +- * it might be right (been there, tough to explain to +- * the quality guys why it prints a failure when the +- * "is" and "should be" are obviously the same in the +- * error message). +- * +- * Rather than exhaustively testing, we test some +- * patterns by shifting '1' bits through a field of +- * '0's and '0' bits through a field of '1's (i.e. +- * pattern and ~pattern). +- */ +- addr = start; +- /* XXX */ +- if (addr == dummy) ++addr; +- for (j = 0; j < sizeof(bitpattern)/sizeof(bitpattern[0]); j++) { +- val = bitpattern[j]; +- for(; val != 0; val <<= 1) { ++ printf ("Testing Data line...\n\r"); ++ ++ ++ /* ++ * Data line test: write a pattern to the first ++ * location, write the 1's complement to a 'parking' ++ * address (changes the state of the data bus so a ++ * floating bus doen't give a false OK), and then ++ * read the value back. Note that we read it back ++ * into a variable because the next time we read it, ++ * it might be right (been there, tough to explain to ++ * the quality guys why it prints a failure when the ++ * "is" and "should be" are obviously the same in the ++ * error message). ++ * ++ * Rather than exhaustively testing, we test some ++ * patterns by shifting '1' bits through a field of ++ * '0's and '0' bits through a field of '1's (i.e. ++ * pattern and ~pattern). ++ */ ++ addr = start; ++ nErr=0; ++ /* XXX */ ++ if (addr == dummy) ++addr; ++ for (j = 0; j < sizeof(bitpattern)/sizeof(bitpattern[0]); j++) { ++ val = bitpattern[j]; ++ for(; val != 0; val <<= 1) { + *addr = val; + *dummy = ~val; /* clear the test data off of the bus */ + readback = *addr; + if(readback != val) { +- printf ("FAILURE (data line): " +- "expected 0x%08lx, actual 0x%08lx at address 0x%p\r\n", +- val, readback, addr); ++ nErr++; ++ printf ("FAILURE (data line) : " ++ "expected 0x%08x, actual 0x%08x @ 0x%08x\n\r", ++ val, readback, addr); + } ++ else nErr--; ++ + *addr = ~val; + *dummy = val; + readback = *addr; + if(readback != ~val) { +- printf ("FAILURE (data line): " +- "Is 0x%08lx, should be 0x%08lx at address 0x%p\r\n", +- readback, ~val, addr); ++ printf ("FAILURE (data line)~ : " ++ "expected 0x%08x, actual 0x%08x @ 0x%08x\n\r", ++ ~val, readback, addr); ++ nErr++; + } +- } ++ else nErr--; + } ++ if(nErr>64) break; ++ } ++ ++ printf ("\tOK: data line\n\r"); + +- /* +- * Based on code whose Original Author and Copyright +- * information follows: Copyright (c) 1998 by Michael +- * Barr. This software is placed into the public +- * domain and may be used for any purpose. However, +- * this notice must not be changed or removed and no +- * warranty is either expressed or implied by its +- * publication or distribution. +- */ + +- /* +- * Address line test +- * +- * Description: Test the address bus wiring in a +- * memory region by performing a walking +- * 1's test on the relevant bits of the +- * address and checking for aliasing. +- * This test will find single-bit +- * address failures such as stuck -high, +- * stuck-low, and shorted pins. The base +- * address and size of the region are +- * selected by the caller. +- * +- * Notes: For best results, the selected base +- * address should have enough LSB 0's to +- * guarantee single address bit changes. +- * For example, to test a 64-Kbyte +- * region, select a base address on a +- * 64-Kbyte boundary. Also, select the +- * region size as a power-of-two if at +- * all possible. +- * +- * Returns: 0 if the test succeeds, 1 if the test fails. +- * +- * ## NOTE ## Be sure to specify start and end +- * addresses such that addr_mask has +- * lots of bits set. For example an +- * address range of 01000000 02000000 is +- * bad while a range of 01000000 +- * 01ffffff is perfect. +- */ +- addr_mask = ((ulong)end - (ulong)start)/sizeof(vu_long); +- pattern = (vu_long) 0xaaaaaaaa; +- anti_pattern = (vu_long) 0x55555555; ++ /* ++ * Based on code whose Original Author and Copyright ++ * information follows: Copyright (c) 1998 by Michael ++ * Barr. This software is placed into the public ++ * domain and may be used for any purpose. However, ++ * this notice must not be changed or removed and no ++ * warranty is either expressed or implied by its ++ * publication or distribution. ++ */ + +- debug("%s:%d: addr mask = 0x%.8lx\r\n", +- __FUNCTION__, __LINE__, +- addr_mask); +- /* +- * Write the default pattern at each of the +- * power-of-two offsets. +- */ +- for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) +- start[offset] = pattern; ++ /* ++ * Address line test ++ * ++ * Description: Test the address bus wiring in a ++ * memory region by performing a walking ++ * 1's test on the relevant bits of the ++ * address and checking for aliasing. ++ * This test will find single-bit ++ * address failures such as stuck -high, ++ * stuck-low, and shorted pins. The base ++ * address and size of the region are ++ * selected by the caller. ++ * ++ * Notes: For best results, the selected base ++ * address should have enough LSB 0's to ++ * guarantee single address bit changes. ++ * For example, to test a 64-Kbyte ++ * region, select a base address on a ++ * 64-Kbyte boundary. Also, select the ++ * region size as a power-of-two if at ++ * all possible. ++ * ++ * Returns: 0 if the test succeeds, 1 if the test fails. ++ * ++ * ## NOTE ## Be sure to specify start and end ++ * addresses such that addr_mask has ++ * lots of bits set. For example an ++ * address range of 01000000 02000000 is ++ * bad while a range of 01000000 ++ * 01ffffff is perfect. ++ */ + +- /* +- * Check for address bits stuck high. +- */ +- test_offset = 0; +- start[test_offset] = anti_pattern; +- +- for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) { +- temp = start[offset]; +- if (temp != pattern) { +- printf ("FAILURE: Address bit stuck high @ 0x%.8lx:" +- " expected 0x%.8lx, actual 0x%.8lx\r\n", +- (ulong)&start[offset], pattern, temp); +- return 1; +- } +- } +- start[test_offset] = pattern; ++ printf ("Testing addressline (addr mask = 0x%.8lx) ... \n\r",addr_mask); + +- /* +- * Check for addr bits stuck low or shorted. +- */ +- for (test_offset = 1; (test_offset & addr_mask) != 0; test_offset <<= 1) { +- start[test_offset] = anti_pattern; +- +- for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) { +- temp = start[offset]; +- if ((temp != pattern) && (offset != test_offset)) { +- printf ("FAILURE: Address bit stuck low or shorted @" +- " 0x%.8lx: expected 0x%.8lx, actual 0x%.8lx\r\n", +- (ulong)&start[offset], pattern, temp); +- return 1; +- } +- } +- start[test_offset] = pattern; +- } ++ addr_mask = ((ulong)end - (ulong)start)/sizeof(vu_long); ++ pattern = (vu_long) 0xaaaaaaaa; ++ anti_pattern = (vu_long) 0x55555555; + +- /* +- * Description: Test the integrity of a physical +- * memory device by performing an +- * increment/decrement test over the +- * entire region. In the process every +- * storage bit in the device is tested +- * as a zero and a one. The base address +- * and the size of the region are +- * selected by the caller. +- * +- * Returns: 0 if the test succeeds, 1 if the test fails. +- */ +- num_words = ((ulong)end - (ulong)start)/sizeof(vu_long) + 1; ++ debug("%s:%d: addr mask = 0x%.8lx\r\n", ++ __FUNCTION__, __LINE__, ++ addr_mask); ++ /* ++ * Write the default pattern at each of the ++ * power-of-two offsets. ++ */ ++ for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) ++ start[offset] = pattern; + +- /* +- * Fill memory with a known pattern. +- */ +- for (pattern = 1, offset = 0; offset < num_words; pattern++, offset++) { +- start[offset] = pattern; +- } ++ /* ++ * Check for address bits stuck high. ++ */ ++ test_offset = 0; ++ start[test_offset] = anti_pattern; + +- /* +- * Check each location and invert it for the second pass. +- */ +- for (pattern = 1, offset = 0; offset < num_words; pattern++, offset++) { +- temp = start[offset]; +- if (temp != pattern) { +- printf ("FAILURE (read/write) @ 0x%.8lx:" +- " expected 0x%.8lx, actual 0x%.8lx)\r\n", +- (ulong)&start[offset], pattern, temp); +- return 1; +- } ++ for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) { ++ temp = start[offset]; ++ if (temp != pattern) { ++ printf ("FAILURE: Address bit stuck high @ 0x%.8lx:" ++ " expected 0x%.8lx, actual 0x%.8lx\r\n", ++ (ulong)&start[offset], pattern, temp); ++ return 1; ++ } ++ } ++ start[test_offset] = pattern; + +- anti_pattern = ~pattern; +- start[offset] = anti_pattern; +- } ++ /* ++ * Check for addr bits stuck low or shorted. ++ */ ++ for (test_offset = 1; (test_offset & addr_mask) != 0; test_offset <<= 1) { ++ start[test_offset] = anti_pattern; + +- /* +- * Check each location for the inverted pattern and zero it. +- */ +- for (pattern = 1, offset = 0; offset < num_words; pattern++, offset++) { +- anti_pattern = ~pattern; +- temp = start[offset]; +- if (temp != anti_pattern) { +- printf ("FAILURE (read/write): @ 0x%.8lx:" +- " expected 0x%.8lx, actual 0x%.8lx)\r\n", +- (ulong)&start[offset], anti_pattern, temp); +- return 1; +- } +- start[offset] = 0; ++ for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) { ++ temp = start[offset]; ++ if ((temp != pattern) && (offset != test_offset)) { ++ printf ("FAILURE: Address bit stuck low or shorted @" ++ " 0x%.8lx: expected 0x%.8lx, actual 0x%.8lx\r\n", ++ (ulong)&start[offset], pattern, temp); ++ return 1; + } ++ } ++ start[test_offset] = pattern; + } + +-} +-#else +-int mem_test(ulong _start, ulong _end, ulong pattern) +-{ +- vu_long *addr; +- vu_long *start = (vu_long *)_start; +- vu_long *end = (vu_long *)_end; +- ulong val; +- ulong readback; +- ulong incr; +- int rcode; ++ printf ("OK: address line\n\r"); + +- incr = 1; +- for (;;) { +- if (ctrlc()) { +- putchar('\n'); +- return 1; +- } + +- printf ("\rPattern 0x%08lX Writing..." +- "%12s" +- "\b\b\b\b\b\b\b\b\b\b", +- pattern, ""); ++ /* ++ * Description: Test the integrity of a physical ++ * memory device by performing an ++ * increment/decrement test over the ++ * entire region. In the process every ++ * storage bit in the device is tested ++ * as a zero and a one. The base address ++ * and the size of the region are ++ * selected by the caller. ++ * ++ * Returns: 0 if the test succeeds, 1 if the test fails. ++ */ ++ num_words = ((ulong)end - (ulong)start)/sizeof(vu_long); + +- for (addr=start,val=pattern; addr<end; addr++) { +- *addr = val; +- val += incr; +- } ++ printf ("Testing memory integrity: hold a counter ... \n\r"); ++ /* ++ * Fill memory with a known pattern. ++ */ ++ for (pattern = 1, offset = 0; offset < num_words; pattern++, offset++) { ++ start[offset] = pattern; ++ } + +- puts ("Reading..."); ++ /* ++ * Check each location and invert it for the second pass. ++ */ ++ for (pattern = 1, offset = 0; offset < num_words; pattern++, offset++) { ++ temp = start[offset]; ++ if (temp != pattern) { ++ printf ("FAILURE (read/write) @ 0x%.8lx:" ++ " expected 0x%.8lx, actual 0x%.8lx)\r\n", ++ (ulong)&start[offset], pattern, temp); ++ return 1; ++ } + +- for (addr=start,val=pattern; addr<end; addr++) { +- readback = *addr; +- if (readback != val) { +- printf ("\r\nMem error @ 0x%08X: " +- "found 0x%08lX, expected 0x%08lX\r\n", +- (uint)addr, readback, val); +- rcode = 1; +- } +- val += incr; +- } ++ anti_pattern = ~pattern; ++ start[offset] = anti_pattern; ++ } + +- /* +- * Flip the pattern each time to make lots of zeros and +- * then, the next time, lots of ones. We decrement +- * the "negative" patterns and increment the "positive" +- * patterns to preserve this feature. +- */ +- if(pattern & 0x80000000) { +- pattern = -pattern; /* complement & increment */ +- } +- else { +- pattern = ~pattern; +- } +- incr = -incr; ++ printf ("OK: memory integrity (counter)\n\r"); ++ printf ("Testing memory integrity: hold an anti-counter\n\r"); ++ ++ /* ++ * Check each location for the inverted pattern and zero it. ++ */ ++ for (pattern = 1, offset = 0; offset < num_words; pattern++, offset++) { ++ anti_pattern = ~pattern; ++ temp = start[offset]; ++ if (temp != anti_pattern) { ++ printf ("FAILURE (read/write): @ 0x%.8lx:" ++ " expected 0x%.8lx, actual 0x%.8lx)\r\n", ++ (ulong)&start[offset], anti_pattern, temp); ++ return 1; ++ } ++ start[offset] = 0; + } +- return rcode; ++ ++ printf ("OK: memory integrity (anti-counter)\n\r"); ++ printf ("OK: bus line, address line and integrity are OK\n\r\n\r"); ++ printf ("Now it will continue to check integrity with various patterns. (Ctrl+C to exit)...\n\r"); ++ ++ return mem_test_integrity(_start,_end,pattern_unused); ++ ++} ++#else ++/** ++* Small test that check different patterns on the whole range of memory ++* only check integrity (holding some values), not shortcut address! ++**/ ++int mem_test(ulong _start, ulong _end, ulong pattern) ++{ ++ ++ printf ("\rTesting Range: 0x%08lX" ++ " > 0x%08lX\n\r", ++ _start, _end); ++ ++ return mem_test_integrity(_start,_end,pattern); ++ + } + #endif ++ ++ ++ +-- +1.7.9.5 + diff --git a/patches/g45memtest/0019-memtest-Add-CPU-LED-switching-to-memtest.patch b/patches/g45memtest/0019-memtest-Add-CPU-LED-switching-to-memtest.patch new file mode 100644 index 0000000000000000000000000000000000000000..e01945dac94edba4c769caf8a35ace1a1799dcb4 --- /dev/null +++ b/patches/g45memtest/0019-memtest-Add-CPU-LED-switching-to-memtest.patch @@ -0,0 +1,44 @@ +From 78f344309e4fa491efd1240f481d15c00f6d47b2 Mon Sep 17 00:00:00 2001 +From: Benoit Rat <benoit@sevensols.com> +Date: Mon, 2 Apr 2012 15:43:17 +0200 +Subject: [PATCH 19/19] memtest: Add CPU LED switching to memtest + +--- + lib/memtest.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/lib/memtest.c b/lib/memtest.c +index 4366171..20c5e45 100644 +--- a/lib/memtest.c ++++ b/lib/memtest.c +@@ -26,6 +26,7 @@ + #include <pp_printf.h> + #include <dbgu.h> + #include <debug.h> ++#include <gpio.h> + //#include <stdlib.h> + + /* BEGIN HACKS - to compile barebox code out of barebox */ +@@ -120,6 +121,8 @@ int mem_test_integrity(ulong _start, ulong _end, ulong pattern) + //Increment actual read value and decrement write value. + val += incr; + val_next -= incr; ++ ++ if((*addr % (1024*100)) == 0) pio_set_value(AT91C_PIN_PA(0),*addr % (2048*100)); //Blinking light while testing + } + + printf("\tOK\r\n"); +@@ -401,6 +404,10 @@ int mem_test(ulong _start, ulong _end, ulong pattern_unused) + printf ("OK: bus line, address line and integrity are OK\n\r\n\r"); + printf ("Now it will continue to check integrity with various patterns. (Ctrl+C to exit)...\n\r"); + ++ pio_set_value(AT91C_PIN_PA(0),1); ++ pio_set_value(AT91C_PIN_PA(1),0); ++ ++ + return mem_test_integrity(_start,_end,pattern_unused); + + } +-- +1.7.9.5 + diff --git a/patches/g45memtest/README.md b/patches/g45memtest/README.md new file mode 100644 index 0000000000000000000000000000000000000000..3a64d670c5ec661a595c2c599babb6727b2f1511 --- /dev/null +++ b/patches/g45memtest/README.md @@ -0,0 +1,18 @@ +G45 memtest +============ + +The test is inspired from the one in barebox +It has been improved[^1] and now check: + * Data lines + * Address lines + * Memory integrity + * holding counters + * holding anti-counters + * Random patterns + + +You can find the source on my github: https://github.com/neub/wrs-sw-at91bootstrap/tree/memtest + + +[^1]: http://www.barrgroup.com/Embedded-Systems/How-To/Memory-Test-Suite-C +