diff options
author | wdenk <wdenk> | 2004-07-11 17:40:54 +0000 |
---|---|---|
committer | wdenk <wdenk> | 2004-07-11 17:40:54 +0000 |
commit | 56523f12830227fc18437bf935fefdb10fe25cca (patch) | |
tree | 11ad0e08e2284224ebde36161e184450510b9f03 /common/cmd_mem.c | |
parent | 857cad37a41c431582a74be56f858ee0476cd0d9 (diff) | |
download | u-boot-56523f12830227fc18437bf935fefdb10fe25cca.zip u-boot-56523f12830227fc18437bf935fefdb10fe25cca.tar.gz u-boot-56523f12830227fc18437bf935fefdb10fe25cca.tar.bz2 |
* Patch by Martin Krause, 30 Jun 2004:
Add support for TQM5200 board
* Patch by Martin Krause, 29 Jun 2004:
Add loopw command: infinite write loop on address range
Diffstat (limited to 'common/cmd_mem.c')
-rw-r--r-- | common/cmd_mem.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/common/cmd_mem.c b/common/cmd_mem.c index aeacb8e..2bdbc9d 100644 --- a/common/cmd_mem.c +++ b/common/cmd_mem.c @@ -550,6 +550,81 @@ int do_mem_loop (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } } +#ifdef CONFIG_LOOPW +int do_mem_loopw (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + ulong addr, length, i, data; + int size; + volatile uint *longp; + volatile ushort *shortp; + volatile u_char *cp; + + if (argc < 4) { + printf ("Usage:\n%s\n", cmdtp->usage); + return 1; + } + + /* Check for a size spefication. + * Defaults to long if no or incorrect specification. + */ + if ((size = cmd_get_data_size(argv[0], 4)) < 0) + return 1; + + /* Address is always specified. + */ + addr = simple_strtoul(argv[1], NULL, 16); + + /* Length is the number of objects, not number of bytes. + */ + length = simple_strtoul(argv[2], NULL, 16); + + /* data to write */ + data = simple_strtoul(argv[3], NULL, 16); + + /* We want to optimize the loops to run as fast as possible. + * If we have only one object, just run infinite loops. + */ + if (length == 1) { + if (size == 4) { + longp = (uint *)addr; + for (;;) + *longp = data; + } + if (size == 2) { + shortp = (ushort *)addr; + for (;;) + *shortp = data; + } + cp = (u_char *)addr; + for (;;) + *cp = data; + } + + if (size == 4) { + for (;;) { + longp = (uint *)addr; + i = length; + while (i-- > 0) + *longp++ = data; + } + } + if (size == 2) { + for (;;) { + shortp = (ushort *)addr; + i = length; + while (i-- > 0) + *shortp++ = data; + } + } + for (;;) { + cp = (u_char *)addr; + i = length; + while (i-- > 0) + *cp++ = data; + } +} +#endif /* CONFIG_LOOPW */ + /* * Perform a memory test. A more complete alternative test can be * configured using CFG_ALT_MEMTEST. The complete test loops until @@ -1123,6 +1198,15 @@ U_BOOT_CMD( " - loop on a set of addresses\n" ); +#ifdef CONFIG_LOOPW +U_BOOT_CMD( + loopw, 4, 1, do_mem_loopw, + "loopw - infinite write loop on address range\n", + "[.b, .w, .l] address number_of_objects data_to_write\n" + " - loop on a set of addresses\n" +); +#endif /* CONFIG_LOOPW */ + U_BOOT_CMD( mtest, 4, 1, do_mem_mtest, "mtest - simple RAM test\n", |