summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSheng-Liang Song <ssl@chromium.org>2015-02-25 21:58:12 -0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-02-28 03:46:42 +0000
commit51910da94cfd68b323873271d55147e613b2ed16 (patch)
tree561b5ef7011620a191490901dc2a18cf74c38a68
parentd1939ee10155af38a869e5315e6374af73200e5f (diff)
downloadchrome-ec-51910da94cfd68b323873271d55147e613b2ed16.tar.gz
sb_firmware: clean up sb firmware update program
- battery firmware filename need match with gs:// filename - changed from "%04X" to "%04x" - A fix for LGC battery firmware update. - Add control flags: F_AC_PRESENT - 1 iff AC is connected. F_VERSION_CHECK - 1 if do version check - option to disk version check for stress test. - Add detail log messages - Remove old debug flag. BUG=chrome-os-partner:36310 BRANCH=none TEST=run ec_sb_firmware_update on glimmer Change-Id: Iebc15222a7a55a786291ce2d8931e70acc5b3c4d Signed-off-by: Sheng-Liang Song <ssl@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/253970 Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r--util/ec_sb_firmware_update.c108
1 files changed, 55 insertions, 53 deletions
diff --git a/util/ec_sb_firmware_update.c b/util/ec_sb_firmware_update.c
index 69c8d657c9..0cf0994f9a 100644
--- a/util/ec_sb_firmware_update.c
+++ b/util/ec_sb_firmware_update.c
@@ -16,15 +16,6 @@
#include "ec_commands.h"
#include <unistd.h>
-#define DPRINTF(fmt, ...) \
- do {\
- if (debug)\
- printf("SBFW: " fmt, ## __VA_ARGS__);\
- } while (0)
-
-/* Debug EC Smart Battery Firmwarwe Update */
-static int debug;
-
enum {
BEGIN_DELAY = 0,
SETUP_DELAY = 1,
@@ -33,6 +24,11 @@ enum {
NUM_DELAYS = 4
};
+enum {
+ F_AC_PRESENT = 1,/* AC Present */
+ F_VERSION_CHECK = 2 /* do firmware version check */
+};
+
const char *delay_names[NUM_DELAYS] = {
"BEGIN",
"SETUP",
@@ -57,6 +53,7 @@ enum fw_update_state {
#define MAX_FW_IMAGE_NAME_SIZE 80
struct fw_update_ctrl {
+ uint32_t flags; /* fw update control flags */
int size; /* size of battery firmware image */
char *ptr; /* current read pointer of the firmware image */
int offset; /* current block write offset */
@@ -112,24 +109,26 @@ static int get_key_value(const char *filename,
static void print_battery_firmware_image_hdr(
struct sb_fw_header *hdr)
{
- printf("%c%c%c%c hdr_ver:%04X major_minor:%04X\n",
+ printf("Latest Battery Firmware:\n");
+ printf("\t%c%c%c%c hdr_ver:%04x major_minor:%04x\n",
hdr->signature[0],
hdr->signature[1],
hdr->signature[2],
hdr->signature[3],
hdr->hdr_version, hdr->pkg_version_major_minor);
- printf("vendor_id:%04X battery_type:%04X fw_ver:%04X tbl_ver:%04X\n",
+ printf("\tmaker:0x%04x hwid:0x%04x fw_ver:0x%04x tbl_ver:0x%04x\n",
hdr->vendor_id, hdr->battery_type, hdr->fw_version,
hdr->data_table_version);
- printf("bin off:%08X size:%08X chk_sum:%02X\n",
+ printf("\tbinary offset:0x%08x size:0x%08x chk_sum:0x%02x\n",
hdr->fw_binary_offset, hdr->fw_binary_size, hdr->checksum);
}
static void print_info(struct sb_fw_update_info *info)
{
- printf("maker_id:0x%X hw_id:0x%X fw_ver:0x%X d_ver:0x%X\n",
+ printf("\nCurrent Battery Firmware:\n");
+ printf("\tmaker:0x%04x hwid:0x%04x fw_ver:0x%04x tbl_ver:0x%04x\n",
info->maker_id,
info->hardware_id,
info->fw_version,
@@ -253,13 +252,11 @@ static char *read_fw_image(struct fw_update_ctrl *fw_update)
fw_update->size = size;
fw_update->ptr = buf;
fw_update->fw_img_hdr = (struct sb_fw_header *)buf;
- if (debug)
- print_battery_firmware_image_hdr(fw_update->fw_img_hdr);
+ print_battery_firmware_image_hdr(fw_update->fw_img_hdr);
if (fw_update->fw_img_hdr->fw_binary_offset >= fw_update->size ||
fw_update->size < 256) {
- fprintf(stderr,
- "Load Firmware Image[%s] Error offset:%d size:%d\n",
+ printf("Load Firmware Image[%s] Error offset:%d size:%d\n",
fw_update->image_name,
fw_update->fw_img_hdr->fw_binary_offset,
fw_update->size);
@@ -308,8 +305,7 @@ static int get_info(struct sb_fw_update_info *info)
param, sizeof(struct ec_sb_fw_update_header),
resp, SB_FW_UPDATE_CMD_INFO_SIZE);
if (rv < 0) {
- fprintf(stderr,
- "Firmware Update Get Info Error\n");
+ printf("Firmware Update Get Info Error\n");
return -EC_RES_ERROR;
}
memcpy(info, resp->info.data, SB_FW_UPDATE_CMD_INFO_SIZE);
@@ -326,8 +322,7 @@ static int send_subcmd(int subcmd)
rv = ec_command(EC_CMD_SB_FW_UPDATE, 0,
param, sizeof(struct ec_sb_fw_update_header), NULL, 0);
if (rv < 0) {
- fprintf(stderr,
- "Firmware Update subcmd:%d Error\n", subcmd);
+ printf("Firmware Update subcmd:%d Error\n", subcmd);
return -EC_RES_ERROR;
}
return EC_RES_SUCCESS;
@@ -345,8 +340,7 @@ static int write_block(const uint8_t *ptr, int bsize)
rv = ec_command(EC_CMD_SB_FW_UPDATE, 0,
param, sizeof(struct ec_params_sb_fw_update), NULL, 0);
if (rv < 0) {
- fprintf(stderr,
- "Firmware Update Write Error offset@%p\n", ptr);
+ printf("Firmware Update Write Error offset@%p\n", ptr);
return -EC_RES_ERROR;
}
return EC_RES_SUCCESS;
@@ -381,9 +375,6 @@ static enum fw_update_state s0_read_status(struct fw_update_ctrl *fw_update)
return S10_TERMINAL;
}
- if (debug)
- print_status(&fw_update->status);
-
if (!((fw_update->status.abnormal_condition == 0)
&& (fw_update->status.fw_update_supported == 1))) {
log_msg(fw_update, S0_READ_STATUS, "Unsupported");
@@ -414,9 +405,10 @@ static enum fw_update_state s1_read_battery_info(
log_msg(fw_update, S1_READ_INFO, "Interface Error");
return S10_TERMINAL;
}
+ print_info(&fw_update->info);
sprintf(fw_update->image_name,
- "/lib/firmware/battery/maker.%04X.hwid.%04X.cfg",
+ "/lib/firmware/battery/maker.%04x.hwid.%04x.cfg",
fw_update->info.maker_id,
fw_update->info.hardware_id);
if (-1 == get_key_value(fw_update->image_name,
@@ -427,7 +419,7 @@ static enum fw_update_state s1_read_battery_info(
}
sprintf(fw_update->image_name,
- "/lib/firmware/battery/maker.%04X.hwid.%04X.bin",
+ "/lib/firmware/battery/maker.%04x.hwid.%04x.bin",
fw_update->info.maker_id,
fw_update->info.hardware_id);
@@ -437,9 +429,6 @@ static enum fw_update_state s1_read_battery_info(
return S10_TERMINAL;
}
- if (debug)
- print_info(&fw_update->info);
-
rv = get_status(&fw_update->status);
if (rv) {
fw_update->rv = -1;
@@ -449,21 +438,24 @@ static enum fw_update_state s1_read_battery_info(
rv = check_if_valid_fw(fw_update->fw_img_hdr, &fw_update->info);
if (rv == 0) {
- print_info(&fw_update->info);
- print_battery_firmware_image_hdr(fw_update->fw_img_hdr);
fw_update->rv = EC_RES_INVALID_PARAM;
log_msg(fw_update, S1_READ_INFO, "Invalid Firmware");
return S10_TERMINAL;
}
rv = check_if_need_update_fw(fw_update->fw_img_hdr, &fw_update->info);
- if (rv == 0) {
- print_info(&fw_update->info);
- print_battery_firmware_image_hdr(fw_update->fw_img_hdr);
+ if (rv == 0 && (fw_update->flags & F_VERSION_CHECK)) {
fw_update->rv = 0;
log_msg(fw_update, S1_READ_INFO, "Latest Firmware");
return S10_TERMINAL;
}
+
+ if (!(fw_update->flags & F_AC_PRESENT)) {
+ fw_update->rv = 0;
+ log_msg(fw_update, S1_READ_INFO,
+ "Require AC Adapter Counnected.");
+ return S10_TERMINAL;
+ }
return S2_WRITE_PREPARE;
}
@@ -521,9 +513,6 @@ static enum fw_update_state s5_read_status(struct fw_update_ctrl *fw_update)
fw_update->size -= fw_update->fw_img_hdr->fw_binary_offset;
fw_update->offset = 0;
- DPRINTF("Write size 0x%X total_size:0x%X\n",
- fw_update->step_size, fw_update->size);
-
return S6_WRITE_BLOCK;
}
@@ -700,36 +689,49 @@ int main(int argc, char *argv[])
{
int rv = 0, interfaces = COMM_LPC;
int protect = 1;
+ int version_check = 1;
+ uint8_t val = 0;
if (argc > 3) {
- fprintf(stderr,
- "Usage: %s [protect] [debug]\n"
- " protect: 0 or 1\n"
- " debug: 0 or 1\n", argv[0]);
+ printf("Usage: %s [protect] [version_check]\n"
+ " protect: 0 or 1, default 1\n"
+ " version_check: 0 or 1, default 1\n",
+ argv[0]);
return -1;
}
if (argc >= 2)
protect = atoi(argv[1]);
- if (argc == 3)
- debug = atoi(argv[2]);
- else
- debug = 0;
+ if (argc >= 3)
+ version_check = atoi(argv[2]);
if (acquire_gec_lock(GEC_LOCK_TIMEOUT_SECS) < 0) {
- fprintf(stderr, "Could not acquire GEC lock.\n");
- exit(1);
+ printf("Could not acquire GEC lock.\n");
+ return -1;
}
if (comm_init(interfaces, NULL)) {
- fprintf(stderr, "Couldn't find EC\n");
+ printf("Couldn't find EC\n");
goto out;
}
+ fw_update.flags = 0;
+ rv = ec_readmem(EC_MEMMAP_BATT_FLAG, sizeof(val), &val);
+ if (rv <= 0) {
+ printf("EC Memmap read error:%d\n", rv);
+ goto out;
+ }
+
+ if (version_check)
+ fw_update.flags |= F_VERSION_CHECK;
+
+ if (val & EC_BATT_FLAG_AC_PRESENT)
+ fw_update.flags |= F_AC_PRESENT;
+
rv = ec_sb_firmware_update(&fw_update);
- if (rv)
- printf("\n\nFirmware:%s Fail [%s]\n",
- fw_update.image_name,
+ printf("Battery Firmware Update:0x%02x %s%s\n",
+ fw_update.flags,
+ ((rv) ? "FAIL " : " "),
fw_update.msg);
/* Update battery firmware update interface to be protected */