blob: 5ef02f070567ea57b830f70d786cac1ec4f5f290 [file] [log] [blame]
Andrew McRae485619fb2021-05-09 03:46:401// Copyright 2021 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5/*
6 * Device access interface common functions.
7 */
Evan Benn4c908a22021-09-15 05:28:348
Andrew McRae4b3e5342021-05-31 00:57:589#include "hps/dev.h"
Evan Benn4c908a22021-09-15 05:28:3410
11#include "base/logging.h"
Evan Benn67b14822021-11-01 04:18:2512#include <base/strings/stringprintf.h>
Andrew McRae4b3e5342021-05-31 00:57:5813#include "hps/hps_reg.h"
Evan Benn4c908a22021-09-15 05:28:3414#include "hps/utils.h"
Andrew McRae485619fb2021-05-09 03:46:4015
16namespace hps {
Evan Benn49c4e6d2021-12-23 03:22:5717namespace {
18
19class WakeLockNoOpImpl : public WakeLock {
20 public:
21 WakeLockNoOpImpl() = default;
22 ~WakeLockNoOpImpl() override = default;
23};
24
25} // namespace
Andrew McRae485619fb2021-05-09 03:46:4026
Evan Benn12e9e2d2021-09-21 03:18:4127bool DevInterface::Read(uint8_t cmd, uint8_t* data, size_t len) {
28 if (this->ReadDevice(cmd, data, len)) {
Evan Benn67b14822021-11-01 04:18:2529 VLOG(2) << base::StringPrintf("Read: cmd: 0x%x len: %zd OK", cmd, len);
Evan Benn12e9e2d2021-09-21 03:18:4130 return true;
31 }
Evan Benn67b14822021-11-01 04:18:2532 VLOG(2) << base::StringPrintf("Read: cmd: 0x%x len: %zd FAILED", cmd, len);
Evan Benn12e9e2d2021-09-21 03:18:4133 return false;
34}
35
36bool DevInterface::Write(uint8_t cmd, const uint8_t* data, size_t len) {
37 if (this->WriteDevice(cmd, data, len)) {
Evan Benn67b14822021-11-01 04:18:2538 VLOG(2) << base::StringPrintf("Write: cmd: 0x%x len: %zd OK", cmd, len);
Evan Benn12e9e2d2021-09-21 03:18:4139 return true;
40 }
Evan Benn67b14822021-11-01 04:18:2541 VLOG(2) << base::StringPrintf("Write: cmd: 0x%x len: %zd FAILED", cmd, len);
Evan Benn12e9e2d2021-09-21 03:18:4142 return false;
43}
44
Andrew McRae485619fb2021-05-09 03:46:4045/*
46 * Read 1 register.
47 * Returns value read, or -1 for error.
48 */
Evan Benn054a7302021-11-26 04:27:0649std::optional<uint16_t> DevInterface::ReadReg(HpsReg r) {
Andrew McRae485619fb2021-05-09 03:46:4050 uint8_t res[2];
51
Evan Bennfaf6f922021-08-19 00:54:2152 // TODO(evanbenn) MCP hal requires a retry on kBankReady
53 // b/191716856
54 for (int i = 0; i < 2; i++) {
Evan Benn12e9e2d2021-09-21 03:18:4155 if (this->ReadDevice(I2cReg(r), res, sizeof(res))) {
Evan Benn054a7302021-11-26 04:27:0656 uint16_t ret = static_cast<uint16_t>(res[0] << 8) | res[1];
Evan Benn67b14822021-11-01 04:18:2557 VLOG(2) << base::StringPrintf("ReadReg: %s : 0x%.4x OK",
58 HpsRegToString(r), ret);
Evan Benn4c908a22021-09-15 05:28:3459 return ret;
Andrew McRae485619fb2021-05-09 03:46:4060 }
61 }
Evan Benn4c908a22021-09-15 05:28:3462 VLOG(2) << "ReadReg: " << HpsRegToString(r) << " FAILED";
Evan Benn054a7302021-11-26 04:27:0663 return std::nullopt;
Andrew McRae485619fb2021-05-09 03:46:4064}
65
66/*
67 * Write 1 register.
68 * Returns false on failure.
69 */
Evan Benn3168af12021-09-20 00:03:3170bool DevInterface::WriteReg(HpsReg r, uint16_t data) {
Andrew McRae485619fb2021-05-09 03:46:4071 uint8_t buf[2];
Evan Bennfaf6f922021-08-19 00:54:2172
Andrew McRae485619fb2021-05-09 03:46:4073 buf[0] = data >> 8;
74 buf[1] = data & 0xFF;
Evan Bennfaf6f922021-08-19 00:54:2175
76 if (this->WriteDevice(I2cReg(r), buf, sizeof(buf))) {
Evan Benn67b14822021-11-01 04:18:2577 VLOG(2) << base::StringPrintf("WriteReg: %s : 0x%.4x OK", HpsRegToString(r),
78 data);
Evan Bennfaf6f922021-08-19 00:54:2179 return true;
80 } else {
Evan Benn67b14822021-11-01 04:18:2581 VLOG(2) << base::StringPrintf("WriteReg: %s : 0x%.4x FAILED",
82 HpsRegToString(r), data);
Evan Bennfaf6f922021-08-19 00:54:2183 return false;
Andrew McRae485619fb2021-05-09 03:46:4084 }
Andrew McRae485619fb2021-05-09 03:46:4085}
Evan Bennfaf6f922021-08-19 00:54:2186
Andrew McRae95669e62021-07-01 08:15:2487/*
88 * Return the maximum download block size (in bytes).
89 * Default is 256 bytes.
90 */
91size_t DevInterface::BlockSizeBytes() {
92 return 256;
93}
Andrew McRae485619fb2021-05-09 03:46:4094
Evan Benn49c4e6d2021-12-23 03:22:5795std::unique_ptr<WakeLock> DevInterface::CreateWakeLock() {
96 return std::make_unique<WakeLockNoOpImpl>();
97}
98
Andrew McRae485619fb2021-05-09 03:46:4099} // namespace hps