summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorRong Chang <rongchang@chromium.org>2012-04-26 18:22:00 +0800
committerRong Chang <rongchang@chromium.org>2012-04-27 16:06:49 +0800
commit6eafff7ed3978e300666d57e1cb1a55939569966 (patch)
tree149089435daa911d67466363bfd8de172a04e6e4 /util
parent31190cf21594f4ada3558693dab50ec6abb0d6b4 (diff)
downloadchrome-ec-6eafff7ed3978e300666d57e1cb1a55939569966.tar.gz
Fix ectool battery command corrupts characters
Signed-off-by: Rong Chang <rongchang@chromium.org> BUG=chrome-os-partner:9152 TEST=manual run latest ectool with old EC image Change-Id: I09d4f6e8fcc131da227fc5a9c48291b08dfb6d19
Diffstat (limited to 'util')
-rw-r--r--util/ectool.c83
1 files changed, 66 insertions, 17 deletions
diff --git a/util/ectool.c b/util/ectool.c
index 8b3b000fa5..bf4b20a030 100644
--- a/util/ectool.c
+++ b/util/ectool.c
@@ -3,6 +3,7 @@
* found in the LICENSE file.
*/
+#include <ctype.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -263,6 +264,25 @@ int read_mapped_string(uint8_t offset, char *buf)
}
+int is_string_printable(const char *buf)
+{
+ while (*buf) {
+ if (isprint(*buf))
+ return 0;
+ buf++;
+ }
+
+ return 1;
+}
+
+
+/* Check SBS numerical value range */
+int is_battery_range(int val)
+{
+ return (val >= 0 && val <= 65535) ? 1 : 0;
+}
+
+
void print_help(const char *prog)
{
printf("Usage: %s <command> [params]\n\n", prog);
@@ -1312,41 +1332,70 @@ int cmd_switches(int argc, char *argv[])
int cmd_battery(int argc, char *argv[])
{
char batt_text[EC_LPC_MEMMAP_TEXT_MAX];
- int rv;
+ int rv, val;
printf("Battery info:\n");
rv = read_mapped_string(EC_LPC_MEMMAP_BATT_MFGR, batt_text);
- if (rv)
+ if (rv) {
+ if (!is_string_printable(batt_text))
+ goto cmd_error;
printf(" OEM name: %s\n", batt_text);
+ }
rv = read_mapped_string(EC_LPC_MEMMAP_BATT_MODEL, batt_text);
- if (rv)
+ if (rv) {
+ if (!is_string_printable(batt_text))
+ goto cmd_error;
printf(" Model number: %s\n", batt_text);
+ }
rv = read_mapped_string(EC_LPC_MEMMAP_BATT_TYPE, batt_text);
- if (rv)
+ if (rv) {
+ if (!is_string_printable(batt_text))
+ goto cmd_error;
printf(" Chemistry : %s\n", batt_text);
+ }
rv = read_mapped_string(EC_LPC_MEMMAP_BATT_SERIAL, batt_text);
- if (rv)
+ if (rv) {
+ if (!is_string_printable(batt_text))
+ goto cmd_error;
printf(" Serial number: %s\n", batt_text);
+ }
+
+ val = read_mapped_mem32(EC_LPC_MEMMAP_BATT_DCAP);
+ if (!is_battery_range(val))
+ goto cmd_error;
+ printf(" Design capacity: %u mAh\n", val);
+
+ val = read_mapped_mem32(EC_LPC_MEMMAP_BATT_LFCC);
+ if (!is_battery_range(val))
+ goto cmd_error;
+ printf(" Last full charge: %u mAh\n", val);
- printf(" Design capacity: %u mAh\n",
- read_mapped_mem32(EC_LPC_MEMMAP_BATT_DCAP));
- printf(" Last full charge: %u mAh\n",
- read_mapped_mem32(EC_LPC_MEMMAP_BATT_LFCC));
- printf(" Design output voltage %u mV\n",
- read_mapped_mem32(EC_LPC_MEMMAP_BATT_DVLT));
+ val = read_mapped_mem32(EC_LPC_MEMMAP_BATT_DVLT);
+ if (!is_battery_range(val))
+ goto cmd_error;
+ printf(" Design output voltage %u mV\n", val);
+
+ val = read_mapped_mem32(EC_LPC_MEMMAP_BATT_DCAP);
+ if (!is_battery_range(val))
+ goto cmd_error;
printf(" Design capacity warning %u mAh\n",
- read_mapped_mem32(EC_LPC_MEMMAP_BATT_DCAP) *
- BATTERY_LEVEL_WARNING / 100);
+ val * BATTERY_LEVEL_WARNING / 100);
printf(" Design capacity low %u mAh\n",
- read_mapped_mem32(EC_LPC_MEMMAP_BATT_DCAP) *
- BATTERY_LEVEL_LOW / 100);
- printf(" Cycle count %u\n",
- read_mapped_mem32(EC_LPC_MEMMAP_BATT_CCNT));
+ val * BATTERY_LEVEL_LOW / 100);
+
+ val = read_mapped_mem32(EC_LPC_MEMMAP_BATT_CCNT);
+ if (!is_battery_range(val))
+ goto cmd_error;
+ printf(" Cycle count %u\n", val);
+
return 0;
+cmd_error:
+ fprintf(stderr, "Bad battery info value. Check protocol version.");
+ return -1;
}
int cmd_chipinfo(int argc, char *argv[])