blob: 36882a7a1aff162205ffa8250803acf62f0db5c6 [file] [log] [blame]
// Copyright 2021 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 HPS_UTILS_H_
#define HPS_UTILS_H_
#include <optional>
#include <string>
#include <base/files/file_path.h>
#include <base/strings/stringprintf.h>
#include "hps/dev.h"
#include "hps/hps_reg.h"
namespace hps {
constexpr int kVersionOffset = 20;
// Read the version number from the MCU firmware version file.
// Returns false on failure.
bool ReadVersionFromFile(const base::FilePath& path, uint32_t* version);
// Convert the register to the name of the register
const char* HpsRegToString(const HpsReg reg);
// Return a pretty printed register value,
// or empty string if there is nothing pretty to print
std::string HpsRegValToString(HpsReg reg, uint16_t val);
// Iterate through all HPS registers from `start` to `end` (inclusive), reading
// their values and writing their contents to `callback`. `callback` should be a
// functor that accepts std::string.
// TODO(skyostil): Add support for >16 bit registers.
template <typename Callback>
int DumpHpsRegisters(DevInterface& dev,
Callback callback,
int start = 0,
int end = static_cast<int>(HpsReg::kLargestRegister)) {
int failures = 0;
for (int i = start; i <= end; i++) {
auto reg = static_cast<HpsReg>(i);
std::optional<uint16_t> result = dev.ReadReg(reg);
if (!result) {
callback(base::StringPrintf("Register %3d: error (%s)", i,
HpsRegToString(reg)));
failures++;
} else {
callback(base::StringPrintf(
"Register %3d: 0x%04x (%s) %s", i, result.value(),
HpsRegToString(reg), HpsRegValToString(reg, result.value()).c_str()));
}
}
return failures;
}
} // namespace hps
#endif // HPS_UTILS_H_