diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2012-12-07 16:43:15 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-12-07 16:43:15 +0100 |
commit | 116c24e99e658dfe84b7d843f445e04de840e247 (patch) | |
tree | ad57b1a0bbf18570b7ac0a7da6c0e814825ffba2 /commands | |
parent | 0edc0a4678e142d3f3ab52b50bd5fc3d9187bd37 (diff) | |
parent | 019d2474e892ad9e6be3ceccbb61798a423565a2 (diff) | |
download | barebox-116c24e99e658dfe84b7d843f445e04de840e247.tar.gz barebox-116c24e99e658dfe84b7d843f445e04de840e247.tar.xz |
Merge branch 'for-next/mem-commands'
Diffstat (limited to 'commands')
-rw-r--r-- | commands/mem.c | 44 | ||||
-rw-r--r-- | commands/spi.c | 4 |
2 files changed, 36 insertions, 12 deletions
diff --git a/commands/mem.c b/commands/mem.c index 6fbc7cc4af..51aa04daa2 100644 --- a/commands/mem.c +++ b/commands/mem.c @@ -51,7 +51,7 @@ static char *DEVMEM = "/dev/mem"; */ #define DISP_LINE_LEN 16 -int memory_display(char *addr, loff_t offs, ulong nbytes, int size) +int memory_display(char *addr, loff_t offs, ulong nbytes, int size, int swab) { ulong linebytes, i; u_char *cp; @@ -73,9 +73,17 @@ int memory_display(char *addr, loff_t offs, ulong nbytes, int size) for (i = 0; i < linebytes; i += size) { if (size == 4) { - count -= printf(" %08x", (*uip++ = *((uint *)addr))); + u32 res; + res = (*uip++ = *((uint *)addr)); + if (swab) + res = __swab32(res); + count -= printf(" %08x", res); } else if (size == 2) { - count -= printf(" %04x", (*usp++ = *((ushort *)addr))); + u16 res; + res = (*usp++ = *((ushort *)addr)); + if (swab) + res = __swab16(res); + count -= printf(" %04x", res); } else { count -= printf(" %02x", (*ucp++ = *((u_char *)addr))); } @@ -128,7 +136,7 @@ static int open_and_lseek(const char *filename, int mode, loff_t pos) } static int mem_parse_options(int argc, char *argv[], char *optstr, int *mode, - char **sourcefile, char **destfile) + char **sourcefile, char **destfile, int *swab) { int opt; @@ -149,6 +157,9 @@ static int mem_parse_options(int argc, char *argv[], char *optstr, int *mode, case 'd': *destfile = optarg; break; + case 'x': + *swab = 1; + break; default: return -1; } @@ -165,11 +176,13 @@ static int do_mem_md(int argc, char *argv[]) int fd; char *filename = DEVMEM; int mode = O_RWSIZE_4; + int swab = 0; if (argc < 2) return COMMAND_ERROR_USAGE; - if (mem_parse_options(argc, argv, "bwls:", &mode, &filename, NULL) < 0) + if (mem_parse_options(argc, argv, "bwls:x", &mode, &filename, NULL, + &swab) < 0) return 1; if (optind < argc) { @@ -195,7 +208,8 @@ static int do_mem_md(int argc, char *argv[]) if (!r) goto out; - if ((ret = memory_display(rw_buf, start, r, mode >> O_RWSIZE_SHIFT))) + if ((ret = memory_display(rw_buf, start, r, + mode >> O_RWSIZE_SHIFT, swab))) goto out; start += r; @@ -216,6 +230,7 @@ static const __maybe_unused char cmd_md_help[] = " -b output in bytes\n" " -w output in halfwords (16bit)\n" " -l output in words (32bit)\n" +" -x swap bytes at output\n" "\n" "Memory regions:\n" "Memory regions can be specified in two different forms: start+size\n" @@ -240,8 +255,10 @@ static int do_mem_mw(int argc, char *argv[]) char *filename = DEVMEM; int mode = O_RWSIZE_4; loff_t adr; + int swab = 0; - if (mem_parse_options(argc, argv, "bwld:", &mode, NULL, &filename) < 0) + if (mem_parse_options(argc, argv, "bwld:x", &mode, NULL, &filename, + &swab) < 0) return 1; if (optind + 1 >= argc) @@ -264,10 +281,14 @@ static int do_mem_mw(int argc, char *argv[]) break; case O_RWSIZE_2: val16 = simple_strtoul(argv[optind], NULL, 0); + if (swab) + val16 = __swab16(val16); ret = write(fd, &val16, 2); break; case O_RWSIZE_4: val32 = simple_strtoul(argv[optind], NULL, 0); + if (swab) + val32 = __swab32(val32); ret = write(fd, &val32, 4); break; } @@ -309,7 +330,8 @@ static int do_mem_cmp(int argc, char *argv[]) int offset = 0; struct stat statbuf; - if (mem_parse_options(argc, argv, "bwls:d:", &mode, &sourcefile, &destfile) < 0) + if (mem_parse_options(argc, argv, "bwls:d:", &mode, &sourcefile, + &destfile, NULL) < 0) return 1; if (optind + 2 > argc) @@ -416,7 +438,8 @@ static int do_mem_cp(int argc, char *argv[]) struct stat statbuf; int ret = 0; - if (mem_parse_options(argc, argv, "bwls:d:", &mode, &sourcefile, &destfile) < 0) + if (mem_parse_options(argc, argv, "bwls:d:", &mode, &sourcefile, + &destfile, NULL) < 0) return 1; if (optind + 2 > argc) @@ -521,7 +544,8 @@ static int do_memset(int argc, char *argv[]) int ret = 1; char *file = DEVMEM; - if (mem_parse_options(argc, argv, "bwld:", &mode, NULL, &file) < 0) + if (mem_parse_options(argc, argv, "bwld:", &mode, NULL, &file, + NULL) < 0) return 1; if (optind + 3 > argc) diff --git a/commands/spi.c b/commands/spi.c index 899bf62608..2f6b430baa 100644 --- a/commands/spi.c +++ b/commands/spi.c @@ -101,12 +101,12 @@ static int do_spi(int argc, char *argv[]) printf("\n"); printf("wrote %i bytes\n", count); - memory_display(tx_buf, 0, count, byte_per_word); + memory_display(tx_buf, 0, count, byte_per_word, 0); printf("read %i bytes\n", read); } - memory_display(rx_buf, 0, read, byte_per_word); + memory_display(rx_buf, 0, read, byte_per_word, 0); out: free(rx_buf); |