static int cmd_ec_battery(int argc, const char **argv) { char batt_text[EC_MEMMAP_TEXT_MAX + 1]; uint32_t val; if (!get_ec()) return -ENODEV; printf("Battery info:\n"); val = ec_readmem8(EC_MEMMAP_BATTERY_VERSION); if (val < 1) { fprintf(stderr, "Battery version %d is not supported\n", val); return -EINVAL; } memset(batt_text, 0, EC_MEMMAP_TEXT_MAX + 1); ec_readmem(EC_MEMMAP_BATT_MFGR, sizeof(batt_text), batt_text); printf(" OEM name: %s\n", batt_text); ec_readmem(EC_MEMMAP_BATT_MODEL, sizeof(batt_text), batt_text); printf(" Model number: %s\n", batt_text); printf(" Chemistry : %s\n", batt_text); ec_readmem(EC_MEMMAP_BATT_SERIAL, sizeof(batt_text), batt_text); printf(" Serial number: %s\n", batt_text); val = ec_readmem32(EC_MEMMAP_BATT_DCAP); printf(" Design capacity: %u mAh\n", val); val = ec_readmem32(EC_MEMMAP_BATT_LFCC); printf(" Last full charge: %u mAh\n", val); val = ec_readmem32(EC_MEMMAP_BATT_DVLT); printf(" Design output voltage %u mV\n", val); val = ec_readmem32(EC_MEMMAP_BATT_CCNT); printf(" Cycle count %u\n", val); val = ec_readmem32(EC_MEMMAP_BATT_VOLT); printf(" Present voltage %u mV\n", val); val = ec_readmem32(EC_MEMMAP_BATT_RATE); printf(" Present current %u mA\n", val); val = ec_readmem32(EC_MEMMAP_BATT_CAP); printf(" Remaining capacity %u mAh\n", val); val = ec_readmem8(EC_MEMMAP_BATT_FLAG); printf(" Flags 0x%02x", val); if (val & EC_BATT_FLAG_AC_PRESENT) printf(" AC_PRESENT"); if (val & EC_BATT_FLAG_BATT_PRESENT) printf(" BATT_PRESENT"); if (val & EC_BATT_FLAG_DISCHARGING) printf(" DISCHARGING"); if (val & EC_BATT_FLAG_CHARGING) printf(" CHARGING"); if (val & EC_BATT_FLAG_LEVEL_CRITICAL) printf(" LEVEL_CRITICAL"); printf("\n"); return 0; }
static uint32_t ec_readmem32(int offset) { uint32_t val; int ret; ret = ec_readmem(offset, sizeof(val), &val); return ret ? 0 : val; }
int main(int argc, char *argv[]) { int rv = 0, interfaces = COMM_ALL; int op = OP_UNKNOWN; uint8_t val = 0; if (argc != 2) { usage(argv); return -1; } if (!strcmp(argv[1], "check")) op = OP_CHECK; else if (!strcmp(argv[1], "update")) op = OP_UPDATE; else { op = OP_UNKNOWN; usage(argv); return -1; } if (acquire_gec_lock(GEC_LOCK_TIMEOUT_SECS) < 0) { printf("Could not acquire GEC lock.\n"); return -1; } if (comm_init(interfaces, NULL)) { 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; } rv = get_status(&fw_update.status); if (rv) { fw_update.rv = -1; log_msg(&fw_update, S1_READ_INFO, "Interface Error"); return S10_TERMINAL; } if (fw_update.status.fw_update_mode) { /* * Previous battery firmware update was interrupted, * and we may not detect the presence of AC correctly. * Therefore, lie about our AC status. */ fw_update.flags |= F_AC_PRESENT; printf("Assuming AC_PRESENT due to interrupted FW update\n"); } else { if (val & EC_BATT_FLAG_AC_PRESENT) { fw_update.flags |= F_AC_PRESENT; printf("AC_PRESENT\n"); } } rv = ec_readmem(EC_MEMMAP_BATT_LFCC, sizeof(val), &val); if (rv <= 0) { printf("EC Memmap read error:%d\n", rv); goto out; } if (val == 0) fw_update.flags |= F_LFCC_ZERO; if (op == OP_UPDATE) fw_update.flags |= F_UPDATE; fw_update.flags |= F_VERSION_CHECK; rv = ec_sb_firmware_update(&fw_update); printf("Battery Firmware Update:0x%02x %s\n%s\n", fw_update.flags, ((rv) ? "FAIL " : " "), fw_update.msg); /* Update battery firmware update interface to be protected */ if (!(fw_update.flags & F_NEED_UPDATE)) rv |= send_subcmd(EC_SB_FW_UPDATE_PROTECT); if (fw_update.flags & F_POWERD_DISABLED) rv |= restore_power_management(); out: release_gec_lock(); if (rv) return -1; else return fw_update.flags & (F_LFCC_ZERO | F_NEED_UPDATE); }