summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2012-07-20 16:33:03 -0700
committerGerrit <chrome-bot@google.com>2012-07-22 13:17:03 -0700
commit7143c4544c4076a6b8f6d65d79d6524d34dea7b7 (patch)
treebe6ebde6d82dde473ff51c880cb9bc7f7785c973
parent360d91573a12994ec9fa0e2790ea89a0cd2c5b32 (diff)
downloadchrome-ec-7143c4544c4076a6b8f6d65d79d6524d34dea7b7.tar.gz
Clean up ectool
Assorted minor cleanup; make protocol a bit more efficient, and add a missing line of output to flash protect status. BUG=none TEST=ectool flashprotect; should print valid bits = 0x3f on link Change-Id: I9bea78506b3ed367df731d358982d3e2febb13af Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/28097 Reviewed-by: Vic Yang <victoryang@chromium.org>
-rw-r--r--util/comm-lpc.c64
-rw-r--r--util/ectool.c1
2 files changed, 28 insertions, 37 deletions
diff --git a/util/comm-lpc.c b/util/comm-lpc.c
index 2e4fe0f08d..23c92e3b22 100644
--- a/util/comm-lpc.c
+++ b/util/comm-lpc.c
@@ -103,10 +103,6 @@ static int ec_command_old(int command, const void *indata, int insize,
uint8_t *d;
int i;
- const int cmd_addr = EC_LPC_ADDR_HOST_CMD;
- const int data_addr = EC_LPC_ADDR_HOST_DATA;
- const int param_addr = EC_LPC_ADDR_OLD_PARAM;
-
if (insize > EC_OLD_PARAM_SIZE) {
fprintf(stderr, "Data size too big\n");
return -EC_RES_ERROR;
@@ -116,7 +112,7 @@ static int ec_command_old(int command, const void *indata, int insize,
if (outsize > EC_OLD_PARAM_SIZE)
outsize = EC_OLD_PARAM_SIZE;
- if (wait_for_ec(cmd_addr, 1000000)) {
+ if (wait_for_ec(EC_LPC_ADDR_HOST_CMD, 1000000)) {
fprintf(stderr, "Timeout waiting for EC ready\n");
return -EC_RES_ERROR;
}
@@ -124,17 +120,17 @@ static int ec_command_old(int command, const void *indata, int insize,
/* Write data, if any */
/* TODO: optimized copy using outl() */
for (i = 0, d = (uint8_t *)indata; i < insize; i++, d++)
- outb(*d, param_addr + i);
+ outb(*d, EC_LPC_ADDR_OLD_PARAM + i);
- outb(command, cmd_addr);
+ outb(command, EC_LPC_ADDR_HOST_CMD);
- if (wait_for_ec(cmd_addr, 1000000)) {
+ if (wait_for_ec(EC_LPC_ADDR_HOST_CMD, 1000000)) {
fprintf(stderr, "Timeout waiting for EC response\n");
return -EC_RES_ERROR;
}
/* Check result */
- i = inb(data_addr);
+ i = inb(EC_LPC_ADDR_HOST_DATA);
if (i) {
fprintf(stderr, "EC returned error result code %d\n", i);
return -i;
@@ -143,7 +139,7 @@ static int ec_command_old(int command, const void *indata, int insize,
/* Read data, if any */
/* TODO: optimized copy using outl() */
for (i = 0, d = (uint8_t *)outdata; i < outsize; i++, d++)
- *d = inb(param_addr + i);
+ *d = inb(EC_LPC_ADDR_OLD_PARAM + i);
/*
* LPC protocol doesn't have a way to communicate the true output
@@ -155,11 +151,6 @@ static int ec_command_old(int command, const void *indata, int insize,
int ec_command(int command, int version, const void *indata, int insize,
void *outdata, int outsize) {
- const int cmd_addr = EC_LPC_ADDR_HOST_CMD;
- const int data_addr = EC_LPC_ADDR_HOST_DATA;
- const int args_addr = EC_LPC_ADDR_HOST_ARGS;
- const int param_addr = EC_LPC_ADDR_HOST_PARAM;
-
struct ec_lpc_host_args args;
const uint8_t *d;
uint8_t *dout;
@@ -176,31 +167,29 @@ int ec_command(int command, int version, const void *indata, int insize,
args.command_version = version;
args.data_size = insize;
- /* Calculate checksum */
+ /* Initialize checksum */
csum = command + args.flags + args.command_version + args.data_size;
- for (i = 0, d = (const uint8_t *)indata; i < insize; i++, d++)
+
+ /* Write data and update checksum */
+ for (i = 0, d = (uint8_t *)indata; i < insize; i++, d++) {
+ outb(*d, EC_LPC_ADDR_HOST_PARAM + i);
csum += *d;
+ }
+ /* Finalize checksum and write args */
args.checksum = (uint8_t)csum;
-
- /* Write args */
for (i = 0, d = (const uint8_t *)&args; i < sizeof(args); i++, d++)
- outb(*d, args_addr + i);
-
- /* Write data, if any */
- /* TODO: optimized copy using outl() */
- for (i = 0, d = (uint8_t *)indata; i < insize; i++, d++)
- outb(*d, param_addr + i);
+ outb(*d, EC_LPC_ADDR_HOST_ARGS + i);
- outb(command, cmd_addr);
+ outb(command, EC_LPC_ADDR_HOST_CMD);
- if (wait_for_ec(cmd_addr, 1000000)) {
+ if (wait_for_ec(EC_LPC_ADDR_HOST_CMD, 1000000)) {
fprintf(stderr, "Timeout waiting for EC response\n");
return -EC_RES_ERROR;
}
/* Check result */
- i = inb(data_addr);
+ i = inb(EC_LPC_ADDR_HOST_DATA);
if (i) {
fprintf(stderr, "EC returned error result code %d\n", i);
return -i;
@@ -208,7 +197,7 @@ int ec_command(int command, int version, const void *indata, int insize,
/* Read back args */
for (i = 0, dout = (uint8_t *)&args; i < sizeof(args); i++, dout++)
- *dout = inb(args_addr + i);
+ *dout = inb(EC_LPC_ADDR_HOST_ARGS + i);
/*
* If EC didn't modify args flags, then somehow we sent a new-style
@@ -225,16 +214,17 @@ int ec_command(int command, int version, const void *indata, int insize,
return -EC_RES_INVALID_RESPONSE;
}
- /* Read data, if any */
- /* TODO: optimized copy using outl() */
- for (i = 0, dout = (uint8_t *)outdata; i < args.data_size; i++, dout++)
- *dout = inb(param_addr + i);
-
- /* Verify checksum */
+ /* Start calculating response checksum */
csum = command + args.flags + args.command_version + args.data_size;
- for (i = 0, d = (const uint8_t *)outdata; i < args.data_size; i++, d++)
- csum += *d;
+ /* Read response and update checksum */
+ for (i = 0, dout = (uint8_t *)outdata; i < args.data_size;
+ i++, dout++) {
+ *dout = inb(EC_LPC_ADDR_HOST_PARAM + i);
+ csum += *dout;
+ }
+
+ /* Verify checksum */
if (args.checksum != (uint8_t)csum) {
fprintf(stderr, "EC response has invalid checksum\n");
return -EC_RES_INVALID_CHECKSUM;
diff --git a/util/ectool.c b/util/ectool.c
index 5302d036d7..a304c84076 100644
--- a/util/ectool.c
+++ b/util/ectool.c
@@ -630,6 +630,7 @@ int cmd_flash_protect(int argc, char *argv[])
/* Print returned flags */
print_flash_protect_flags("Flash protect flags:", r.flags);
+ print_flash_protect_flags("Valid flags: ", r.valid_flags);
print_flash_protect_flags("Writable flags: ", r.writable_flags);
/* Check if we got all the flags we asked for */