From 692f462c91285b7e5e7cee1df64968c2eb71cea6 Mon Sep 17 00:00:00 2001 From: Vadim Bendebury Date: Fri, 1 May 2015 16:40:37 -0700 Subject: [PATCH] cli: add ability to read/write memory of different bus width This adds an optional extra parameter to the 'rw' command. When the first argument is .b or .s, the access size becomes 8 pr 16 bits respectively. BRANCH=none BUG=none TEST=on the EC console: > rw 0x10000 read 0x10000 = 0x00000000 > rw .b 0x10000 0x55 write 0x10000 = 0x55 > rw 0x10000 read 0x10000 = 0x00000055 > rw .b 0x10000 read 0x10000 = 0x55 > rw .s 0x10002 read 0x10002 = 0x0000 > rw .s 0x10002 0x1234 write 0x10002 = 0x1234 > rw 0x10000 read 0x10000 = 0x12340055 > rw .b 0x10000 read 0x10000 = 0x55 > rw .b 0x10001 read 0x10001 = 0x00 > rw .b 0x10002 read 0x10002 = 0x34 > rw .b 0x10003 read 0x10003 = 0x12 > rw .s 0x10000 read 0x10000 = 0x0055 > rw .s 0x10002 read 0x10002 = 0x1234 > rw . 0x10002 Parameter 1 invalid Usage: rw addr [.{b|s}] [value] > Change-Id: Iad1a4b3e297253ffdbf13afeede8ade9451eb11a Signed-off-by: Vadim Bendebury Reviewed-on: https://chromium-review.googlesource.com/268897 Reviewed-by: Bill Richardson --- common/memory_commands.c | 75 +++++++++++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 16 deletions(-) diff --git a/common/memory_commands.c b/common/memory_commands.c index fb896a8d4b..a568435d10 100644 --- a/common/memory_commands.c +++ b/common/memory_commands.c @@ -55,37 +55,80 @@ static int command_read_word(int argc, char **argv) { volatile uint32_t *address; uint32_t value; + unsigned access_size = 4; + unsigned argc_offs = 0; char *e; if (argc < 2) return EC_ERROR_PARAM_COUNT; - address = (uint32_t *)(uintptr_t)strtoi(argv[1], &e, 0); + if (argc > 2) { + if ((argv[1][0] == '.') && (strlen(argv[1]) == 2)) { + argc_offs = 1; + switch (argv[1][1]) { + case 'b': + access_size = 1; + break; + case 's': + access_size = 2; + break; + default: + return EC_ERROR_PARAM1; + } + } + } + + address = (uint32_t *)(uintptr_t)strtoi(argv[1 + argc_offs], &e, 0); if (*e) - return EC_ERROR_PARAM1; + return EC_ERROR_PARAM1 + argc_offs; /* Just reading? */ - if (argc < 3) { - value = *address; - ccprintf("read 0x%p = 0x%08x\n", address, value); + if ((argc - argc_offs) < 3) { + switch (access_size) { + case 1: + ccprintf("read 0x%p = 0x%02x\n", + address, *((uint8_t *)address)); + break; + case 2: + ccprintf("read 0x%p = 0x%04x\n", + address, *((uint16_t *)address)); + break; + + default: + ccprintf("read 0x%p = 0x%08x\n", address, *address); + break; + } return EC_SUCCESS; } /* Writing! */ - value = strtoi(argv[2], &e, 0); + value = strtoi(argv[2 + argc_offs], &e, 0); if (*e) - return EC_ERROR_PARAM2; + return EC_ERROR_PARAM2 + argc_offs; - ccprintf("write 0x%p = 0x%08x\n", address, value); - cflush(); /* Flush before writing in case this crashes */ - - *address = value; + switch (access_size) { + case 1: + ccprintf("write 0x%p = 0x%02x\n", address, (uint8_t)value); + cflush(); /* Flush before writing in case this crashes */ + *((uint8_t *)address) = (uint8_t)value; + break; + case 2: + ccprintf("write 0x%p = 0x%04x\n", address, (uint16_t)value); + cflush(); + *((uint16_t *)address) = (uint16_t)value; + break; + default: + ccprintf("write 0x%p = 0x%02x\n", address, value); + cflush(); + *address = value; + break; + } return EC_SUCCESS; - } -DECLARE_CONSOLE_COMMAND(rw, command_read_word, - "addr [value]", - "Read or write a word in memory", - NULL); +DECLARE_CONSOLE_COMMAND + (rw, command_read_word, + "addr [.{b|s}] [value]", + "Read or write a word in memory optionally specifying the size", + NULL);