blob: 700041230fd70ed01413e3c4344815b08e3e4e80 [file] [log] [blame]
/* Copyright 2018 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef RUNTIME_PROBE_FUNCTIONS_ECTOOL_I2CREAD_H_
#define RUNTIME_PROBE_FUNCTIONS_ECTOOL_I2CREAD_H_
#include <memory>
#include <string>
#include <base/values.h>
#include "runtime_probe/probe_function.h"
namespace runtime_probe {
/* Execute "ectool i2cread" command.
* TODO(b/120826467) : Access /dev/cros_ec directly.
*
* This probe function takes the following arguments:
* size: Return bits, it can be either 8 or 16.
* port: The port of the I2C connected to EC.
* addr: The I2C address
* offset: The register offset.
* key: The key of saved output. Output will be saved in string.
*
* More details can be found under command "ectool i2cread help"
*/
class EctoolI2Cread : public ProbeFunction {
public:
static constexpr auto function_name = "ectool_i2cread";
/* Define a parser for this function.
*
* @args dict_value: a JSON dictionary to parse arguments from.
*
* @return pointer to new `EctoolI2Cread` instance on success, nullptr
* otherwise.
*/
static std::unique_ptr<ProbeFunction> FromDictionaryValue(
const base::DictionaryValue& dict_value) {
std::unique_ptr<EctoolI2Cread> instance{new EctoolI2Cread()};
if (dict_value.size() != 5) {
LOG(ERROR) << function_name << " expect 5 arguments.";
return nullptr;
}
bool result = true;
result &= PARSE_ARGUMENT(size);
result &= PARSE_ARGUMENT(port);
result &= PARSE_ARGUMENT(addr);
result &= PARSE_ARGUMENT(offset);
result &= PARSE_ARGUMENT(key);
if (result)
return instance;
return nullptr;
}
DataType Eval() const override;
private:
int addr_;
std::string key_;
int offset_;
int port_;
int size_;
static ProbeFunction::Register<EctoolI2Cread> register_;
};
/* Register the EctoolI2Cread */
REGISTER_PROBE_FUNCTION(EctoolI2Cread);
} // namespace runtime_probe
#endif // RUNTIME_PROBE_FUNCTIONS_ECTOOL_I2CREAD_H_