summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDino Li <dino.li@ite.com.tw>2015-08-13 13:18:27 +0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-08-13 21:41:31 +0000
commitdf2e760a93885c01bc86d6e5a7099b00df4c824b (patch)
tree0f2bba9551b1d7a2707fa1f7907e9c8bb279abfb
parent5044ff7cd34f528b91f3fe891f956b789d973764 (diff)
downloadchrome-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.c82
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);