diff options
author | Dino Li <dino.li@ite.com.tw> | 2015-08-13 13:18:27 +0800 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-08-13 21:41:31 +0000 |
commit | df2e760a93885c01bc86d6e5a7099b00df4c824b (patch) | |
tree | 0f2bba9551b1d7a2707fa1f7907e9c8bb279abfb | |
parent | 5044ff7cd34f528b91f3fe891f956b789d973764 (diff) | |
download | chrome-ec-df2e760a93885c01bc86d6e5a7099b00df4c824b.tar.gz |
it8380dev: add console command "rwreg"
The console command "rwreg" for accessing EC/PNPCFG registers.
Signed-off-by: Dino Li <dino.li@ite.com.tw>
BRANCH=none
BUG=none
TEST=console "rwreg"
Change-Id: I6345b3f40c8992f06959f50625e11e5b89c6eae8
Reviewed-on: https://chromium-review.googlesource.com/293120
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Commit-Queue: Dino Li <dino.li@ite.com.tw>
Tested-by: Dino Li <dino.li@ite.com.tw>
-rw-r--r-- | chip/it83xx/system.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/chip/it83xx/system.c b/chip/it83xx/system.c index f0cb9ddd73..a26e1f1026 100644 --- a/chip/it83xx/system.c +++ b/chip/it83xx/system.c @@ -7,6 +7,7 @@ #include "console.h" #include "cpu.h" +#include "ec2i_chip.h" #include "flash.h" #include "registers.h" #include "system.h" @@ -192,3 +193,84 @@ uintptr_t system_get_fw_reset_vector(uintptr_t base) return reset_vector; } + +static int command_rw_ec_reg(int argc, char **argv) +{ + volatile uint8_t *addr; + uint8_t value = 0; + enum ec2i_message em; + enum logical_device_number ldn; + enum host_pnpcfg_index idx; + int i; + char *e; + + if ((argc < 2) || (argc > 3)) + return EC_ERROR_PARAM_COUNT; + + addr = (uint8_t *)strtoi(argv[1], &e, 0); + if (*e) + return EC_ERROR_PARAM1; + + if (argc == 3) { + value = (uint8_t)strtoi(argv[2], &e, 0); + if (*e) + return EC_ERROR_PARAM2; + } + + /* access PNPCFG registers */ + if (((uint32_t)addr & 0xffff0000) == 0xec210000) { + /* set LDN */ + ldn = ((uint32_t)addr & 0xff00) >> 8; + idx = (uint32_t)addr & 0xff; + if (ec2i_write(HOST_INDEX_LDN, ldn) == EC2I_WRITE_ERROR) + return EC_ERROR_UNKNOWN; + + /* ec2i write */ + if (argc == 3) { + if (ec2i_write(idx, value) == EC2I_WRITE_ERROR) + return EC_ERROR_UNKNOWN; + em = ec2i_read(idx); + if (em == EC2I_READ_ERROR) + return EC_ERROR_UNKNOWN; + value = em & 0xff; + ccprintf("LDN%02X IDX%02X = %02x", ldn, idx, value); + /* ec2i read */ + } else { + for (i = 0; i < 256; i++) { + em = ec2i_read(i); + if (em == EC2I_READ_ERROR) + return EC_ERROR_UNKNOWN; + value = em & 0xff; + if (0 == (i % 16)) + ccprintf("\nLDN%02X IDX%02X: %02x", + ldn, i, value); + else + ccprintf(" %02x", value); + } + } + /* access EC registers */ + } else { + /* write register */ + if (argc == 3) { + *addr = value; + ccprintf("%08X = %02x", addr, *addr); + /* read registers */ + } else { + for (i = 0; i < 256; i++) { + if (0 == (i % 16)) + ccprintf("\n%08X: %02x", addr+i, + addr[i]); + else + ccprintf(" %02x", addr[i]); + } + } + } + ccprintf("\n"); + cflush(); + return EC_SUCCESS; +} +DECLARE_CONSOLE_COMMAND(rwreg, command_rw_ec_reg, + "addr [value (byte)]", + "R/W EC/PNPCFG registers." + " addr 0xec21xxyy for R/W PNPCFG, xx is LDN yy is IDX", + NULL); |