storaged_info.cpp revision 4fc338e60bf1d85212f1540d109beb1b248c4830
14fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian/* 24fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * Copyright (C) 2016 The Android Open Source Project 34fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * 44fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * Licensed under the Apache License, Version 2.0 (the "License"); 54fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * you may not use this file except in compliance with the License. 64fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * You may obtain a copy of the License at 74fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * 84fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * http://www.apache.org/licenses/LICENSE-2.0 94fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * 104fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * Unless required by applicable law or agreed to in writing, software 114fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * distributed under the License is distributed on an "AS IS" BASIS, 124fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * See the License for the specific language governing permissions and 144fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian * limitations under the License. 154fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian */ 164fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 174fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian#define LOG_TAG "storaged" 184fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 194fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian#include <string.h> 204fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 214fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian#include <android-base/file.h> 224fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian#include <android-base/logging.h> 234fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian#include <android-base/parseint.h> 244fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian#include <log/log_event_list.h> 254fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 264fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian#include "storaged.h" 274fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 284fc338e60bf1d85212f1540d109beb1b248c4830Jin Qianusing namespace std; 294fc338e60bf1d85212f1540d109beb1b248c4830Jin Qianusing namespace android; 304fc338e60bf1d85212f1540d109beb1b248c4830Jin Qianusing namespace android::base; 314fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 324fc338e60bf1d85212f1540d109beb1b248c4830Jin Qianvoid storage_info_t::publish() 334fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian{ 344fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian if (eol == 0 && lifetime_a == 0 && lifetime_b == 0) { 354fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian return; 364fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian } 374fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 384fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian android_log_event_list(EVENTLOGTAG_EMMCINFO) 394fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian << version << eol << lifetime_a << lifetime_b 404fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian << LOG_ID_EVENTS; 414fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian} 424fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 434fc338e60bf1d85212f1540d109beb1b248c4830Jin Qianbool emmc_info_t::init() 444fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian{ 454fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian string buffer; 464fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian if (!ReadFileToString(ext_csd_file, &buffer) || 474fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian buffer.length() < (size_t)EXT_CSD_FILE_MIN_SIZE) { 484fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian return false; 494fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian } 504fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 514fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian string ver_str = buffer.substr(EXT_CSD_REV_IDX, sizeof(str_hex)); 524fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian uint8_t ext_csd_rev; 534fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian if (!ParseUint(ver_str, &ext_csd_rev)) { 544fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian LOG_TO(SYSTEM, ERROR) << "Failure on parsing EXT_CSD_REV."; 554fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian return false; 564fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian } 574fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 584fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian version = "emmc "; 594fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian version += (ext_csd_rev < ARRAY_SIZE(emmc_ver_str)) ? 604fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian emmc_ver_str[ext_csd_rev] : "Unknown"; 614fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 624fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian if (ext_csd_rev < 7) { 634fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian return false; 644fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian } 654fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 664fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian return update(); 674fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian} 684fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 694fc338e60bf1d85212f1540d109beb1b248c4830Jin Qianbool emmc_info_t::update() 704fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian{ 714fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian string buffer; 724fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian if (!ReadFileToString(ext_csd_file, &buffer) || 734fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian buffer.length() < (size_t)EXT_CSD_FILE_MIN_SIZE) { 744fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian return false; 754fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian } 764fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 774fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian string str = buffer.substr(EXT_PRE_EOL_INFO_IDX, sizeof(str_hex)); 784fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian if (!ParseUint(str, &eol)) { 794fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian LOG_TO(SYSTEM, ERROR) << "Failure on parsing EXT_PRE_EOL_INFO."; 804fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian return false; 814fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian } 824fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 834fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian str = buffer.substr(EXT_DEVICE_LIFE_TIME_EST_A_IDX, sizeof(str_hex)); 844fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian if (!ParseUint(str, &lifetime_a)) { 854fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian LOG_TO(SYSTEM, ERROR) 864fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian << "Failure on parsing EXT_DEVICE_LIFE_TIME_EST_TYP_A."; 874fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian return false; 884fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian } 894fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 904fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian str = buffer.substr(EXT_DEVICE_LIFE_TIME_EST_B_IDX, sizeof(str_hex)); 914fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian if (!ParseUint(str, &lifetime_b)) { 924fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian LOG_TO(SYSTEM, ERROR) 934fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian << "Failure on parsing EXT_DEVICE_LIFE_TIME_EST_TYP_B."; 944fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian return false; 954fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian } 964fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian 974fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian return true; 984fc338e60bf1d85212f1540d109beb1b248c4830Jin Qian} 99