diff packages/hal/arm/cl7211/current/tests/dram_test.c @ 50:a0774359f013 ecos-sw-1999-11-02

Merge from eCos master repository on 1999-11-02-17:02:15-GMT
author jlarmour
date Tue, 02 Nov 1999 20:57:07 +0000
parents
children
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/hal/arm/cl7211/current/tests/dram_test.c
@@ -0,0 +1,316 @@
+//==========================================================================
+//
+//        dram_test.c
+//
+//        Cirrus EB72xx eval board DRAM test code
+//
+//==========================================================================
+//####COPYRIGHTBEGIN####
+//
+// -------------------------------------------
+// The contents of this file are subject to the Cygnus eCos Public License
+// Version 1.0 (the "License"); you may not use this file except in
+// compliance with the License.  You may obtain a copy of the License at
+// http://sourceware.cygnus.com/ecos
+// 
+// Software distributed under the License is distributed on an "AS IS"
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the
+// License for the specific language governing rights and limitations under
+// the License.
+// 
+// The Original Code is eCos - Embedded Cygnus Operating System, released
+// September 30, 1998.
+// 
+// The Initial Developer of the Original Code is Cygnus.  Portions created
+// by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions.  All Rights Reserved.
+// -------------------------------------------
+//
+//####COPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):     gthomas
+// Contributors:  gthomas
+// Date:          1999-10-22
+// Description:   Tool used to test DRAM on eval boards
+//####DESCRIPTIONEND####
+
+#include <pkgconf/kernel.h>   // Configuration header
+#include <cyg/kernel/kapi.h>
+#include <cyg/infra/diag.h>
+
+#include <cyg/hal/hal_cl7211.h>  // Board definitions
+
+#ifndef FALSE
+#define FALSE 0
+#define TRUE  1
+#endif
+
+#define STACK_SIZE 4096
+static char stack[STACK_SIZE];
+static cyg_thread thread_data;
+static cyg_handle_t thread_handle;
+
+extern char _end;
+int total_errors;
+int run_errors;
+int error_count;
+#define MAX_ERRORS   5
+#define NUM_RUNS     25
+#define REFRESH_TIME 5
+
+int decay_time[] = { 50, 100, 200, 500, 1000 };
+#define NUM_DECAY sizeof(decay_time)/sizeof(decay_time[0])
+
+// FUNCTIONS
+
+static void
+cyg_test_exit(void)
+{
+    while (TRUE) ;
+}
+
+static void
+new_test(void)
+{
+    error_count = 0;
+}
+
+static void
+report_error(void *addr, cyg_uint32 actual, cyg_uint32 expected)
+{
+    total_errors++;
+    run_errors++;
+    if (++error_count > MAX_ERRORS) return;
+    diag_printf("   0x%08x: expected - 0x%08x, actual - 0x%08x\n", 
+                addr, expected, actual);
+}
+
+// Fill longwords with their own address and verify
+
+static void
+addr_test(cyg_uint32 start, cyg_uint32 end)
+{
+    cyg_uint32 *mp;
+
+    new_test();
+    diag_printf("-- Address test\n");
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        *mp = (cyg_uint32)mp;
+    }
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        if (*mp != (cyg_uint32)mp) {
+            report_error(mp, *mp, (cyg_uint32)mp);
+        }
+    }
+}
+
+// Fill longwords with zeros
+
+static void
+zeros_test(cyg_uint32 start, cyg_uint32 end)
+{
+    cyg_uint32 *mp;
+
+    new_test();
+    diag_printf("-- Zeros test\n");
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        *mp = (cyg_uint32)0;
+    }
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        if (*mp != (cyg_uint32)0) {
+            report_error(mp, *mp, (cyg_uint32)0);
+        }
+    }
+}
+
+// Fill longwords with all ones
+
+static void
+ones_test(cyg_uint32 start, cyg_uint32 end)
+{
+    cyg_uint32 *mp;
+
+    new_test();
+    diag_printf("-- Ones test\n");
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        *mp = (cyg_uint32)0xFFFFFFFF;
+    }
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        if (*mp != (cyg_uint32)0xFFFFFFFF) {
+            report_error(mp, *mp, (cyg_uint32)0xFFFFFFFF);
+        }
+    }
+}
+
+// Fill longwords with a "walking" bit
+
+static void
+walking_bit_test(cyg_uint32 start, cyg_uint32 end)
+{
+    cyg_uint32 *mp;
+    cyg_uint32 bit;
+
+    new_test();
+    diag_printf("-- Walking test\n");
+    bit = 1;
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        *mp = (cyg_uint32)bit;
+        bit <<= 1;
+        if (bit == 0) bit = 1;
+    }
+    bit = 1;
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        if (*mp != (cyg_uint32)bit) {
+            report_error(mp, *mp, (cyg_uint32)bit);
+        }
+        bit <<= 1;
+        if (bit == 0) bit = 1;
+    }
+}
+
+// Fill longwords with an alternating pattern
+
+static void
+pattern_test(cyg_uint32 start, cyg_uint32 end)
+{
+    cyg_uint32 *mp;
+    cyg_uint32 pat;
+
+    new_test();
+    diag_printf("-- Pattern test\n");
+    pat = 0x55555555;
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        *mp = (cyg_uint32)pat;
+    }
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        if (*mp != (cyg_uint32)pat) {
+            report_error(mp, *mp, (cyg_uint32)pat);
+        }
+    }
+    pat = 0xAAAAAAAA;
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        *mp = (cyg_uint32)pat;
+    }
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        if (*mp != (cyg_uint32)pat) {
+            report_error(mp, *mp, (cyg_uint32)pat);
+        }
+    }
+}
+
+// Verify if refresh works
+
+static void
+refresh_test(cyg_uint32 start, cyg_uint32 end)
+{
+    cyg_uint32 *mp;
+    cyg_uint32 pat;
+
+    new_test();
+    diag_printf("-- Refresh test\n");
+    pat = 0x55555555;
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        *mp = (cyg_uint32)pat;
+    }
+    cyg_thread_delay(REFRESH_TIME*100);
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        if (*mp != (cyg_uint32)pat) {
+            report_error(mp, *mp, (cyg_uint32)pat);
+        }
+    }
+    pat = 0xAAAAAAAA;
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        *mp = (cyg_uint32)pat;
+    }
+    cyg_thread_delay(REFRESH_TIME*100);
+    for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+        if (*mp != (cyg_uint32)pat) {
+            report_error(mp, *mp, (cyg_uint32)pat);
+        }
+    }
+}
+
+// See how long we can "sleep" before refresh fails
+
+static void
+decay_test(cyg_uint32 start, cyg_uint32 end)
+{
+    cyg_uint32 *mp;
+    cyg_uint32 pat;
+    int i;
+
+    diag_printf("-- Decay test\n");
+    for (i = 0;  i < NUM_DECAY;  i++) {
+        diag_printf("    ... %d.%02d sec delay\n", decay_time[i]/100, decay_time[i]%100);
+        new_test();
+        pat = 0x55555555;
+        for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+            *mp = (cyg_uint32)pat;
+        }
+        cyg_thread_delay(decay_time[i]);
+        for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+            if (*mp != (cyg_uint32)pat) {
+                report_error(mp, *mp, (cyg_uint32)pat);
+            }
+        }
+        pat = 0xAAAAAAAA;
+        for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+            *mp = (cyg_uint32)pat;
+        }
+        cyg_thread_delay(decay_time[i]);
+        for (mp = (cyg_uint32 *)start;  mp < (cyg_uint32 *)end;  mp++) {
+            if (*mp != (cyg_uint32)pat) {
+                report_error(mp, *mp, (cyg_uint32)pat);
+            }
+        }
+        diag_printf("    ... %d errors\n", error_count);
+    }
+}
+
+
+static void
+dram_exercise(cyg_addrword_t p)
+{
+    cyg_uint32 start_DRAM, end_DRAM;
+    int i;
+
+    end_DRAM = 0x01000000;
+    end_DRAM = 0x00F80000;
+    start_DRAM = ((cyg_uint32)&_end + 0x0000FFFF) & 0xFFFF0000;
+    diag_printf("DRAM test - start: 0x%08x, end: 0x%08x\n", start_DRAM, end_DRAM);
+
+    for (i = 0;  i < NUM_RUNS;  i++) {
+        diag_printf("\n*** Start run #%d of %d\n", i+1, NUM_RUNS);
+        run_errors = 0;
+        addr_test(start_DRAM, end_DRAM);
+        ones_test(start_DRAM, end_DRAM);
+        zeros_test(start_DRAM, end_DRAM);
+        walking_bit_test(start_DRAM, end_DRAM);
+        pattern_test(start_DRAM, end_DRAM);
+        refresh_test(start_DRAM, end_DRAM);
+        decay_test(start_DRAM, end_DRAM);
+        diag_printf("\n*** End run, %d errors, %d total errors\n", run_errors, total_errors);
+    }
+
+    diag_printf("All done!\n");
+    cyg_test_exit();
+}
+
+externC void
+cyg_start( void )
+{
+    // Create a main thread, so we can run the scheduler and have time 'pass'
+    cyg_thread_create(10,                // Priority - just a number
+                      dram_exercise,     // entry
+                      0,                 // entry parameter
+                      "DRAM test",       // Name
+                      &stack[0],         // Stack
+                      STACK_SIZE,        // Size
+                      &thread_handle,    // Handle
+                      &thread_data       // Thread data structure
+            );
+    cyg_thread_resume(thread_handle);  // Start it
+    cyg_scheduler_start();
+} // cyg_package_start()
+