| // 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_ |