blob: 630c3621ff3c28b8a1d0544bc95d3ab22f62c40d [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 {
17
Evan Benn12e9e2d2021-09-21 03:18:4118bool DevInterface::Read(uint8_t cmd, uint8_t* data, size_t len) {
19 if (this->ReadDevice(cmd, data, len)) {
Evan Benn67b14822021-11-01 04:18:2520 VLOG(2) << base::StringPrintf("Read: cmd: 0x%x len: %zd OK", cmd, len);
Evan Benn12e9e2d2021-09-21 03:18:4121 return true;
22 }
Evan Benn67b14822021-11-01 04:18:2523 VLOG(2) << base::StringPrintf("Read: cmd: 0x%x len: %zd FAILED", cmd, len);
Evan Benn12e9e2d2021-09-21 03:18:4124 return false;
25}
26
27bool DevInterface::Write(uint8_t cmd, const uint8_t* data, size_t len) {
28 if (this->WriteDevice(cmd, data, len)) {
Evan Benn67b14822021-11-01 04:18:2529 VLOG(2) << base::StringPrintf("Write: 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("Write: cmd: 0x%x len: %zd FAILED", cmd, len);
Evan Benn12e9e2d2021-09-21 03:18:4133 return false;
34}
35
Andrew McRae485619fb2021-05-09 03:46:4036/*
37 * Read 1 register.
38 * Returns value read, or -1 for error.
39 */
Evan Benn054a7302021-11-26 04:27:0640std::optional<uint16_t> DevInterface::ReadReg(HpsReg r) {
Andrew McRae485619fb2021-05-09 03:46:4041 uint8_t res[2];
42
Evan Bennfaf6f922021-08-19 00:54:2143 // TODO(evanbenn) MCP hal requires a retry on kBankReady
44 // b/191716856
45 for (int i = 0; i < 2; i++) {
Evan Benn12e9e2d2021-09-21 03:18:4146 if (this->ReadDevice(I2cReg(r), res, sizeof(res))) {
Evan Benn054a7302021-11-26 04:27:0647 uint16_t ret = static_cast<uint16_t>(res[0] << 8) | res[1];
Evan Benn67b14822021-11-01 04:18:2548 VLOG(2) << base::StringPrintf("ReadReg: %s : 0x%.4x OK",
49 HpsRegToString(r), ret);
Evan Benn4c908a22021-09-15 05:28:3450 return ret;
Andrew McRae485619fb2021-05-09 03:46:4051 }
52 }
Evan Benn4c908a22021-09-15 05:28:3453 VLOG(2) << "ReadReg: " << HpsRegToString(r) << " FAILED";
Evan Benn054a7302021-11-26 04:27:0654 return std::nullopt;
Andrew McRae485619fb2021-05-09 03:46:4055}
56
57/*
58 * Write 1 register.
59 * Returns false on failure.
60 */
Evan Benn3168af12021-09-20 00:03:3161bool DevInterface::WriteReg(HpsReg r, uint16_t data) {
Andrew McRae485619fb2021-05-09 03:46:4062 uint8_t buf[2];
Evan Bennfaf6f922021-08-19 00:54:2163
Andrew McRae485619fb2021-05-09 03:46:4064 buf[0] = data >> 8;
65 buf[1] = data & 0xFF;
Evan Bennfaf6f922021-08-19 00:54:2166
67 if (this->WriteDevice(I2cReg(r), buf, sizeof(buf))) {
Evan Benn67b14822021-11-01 04:18:2568 VLOG(2) << base::StringPrintf("WriteReg: %s : 0x%.4x OK", HpsRegToString(r),
69 data);
Evan Bennfaf6f922021-08-19 00:54:2170 return true;
71 } else {
Evan Benn67b14822021-11-01 04:18:2572 VLOG(2) << base::StringPrintf("WriteReg: %s : 0x%.4x FAILED",
73 HpsRegToString(r), data);
Evan Bennfaf6f922021-08-19 00:54:2174 return false;
Andrew McRae485619fb2021-05-09 03:46:4075 }
Andrew McRae485619fb2021-05-09 03:46:4076}
Evan Bennfaf6f922021-08-19 00:54:2177
Andrew McRae95669e62021-07-01 08:15:2478/*
79 * Return the maximum download block size (in bytes).
80 * Default is 256 bytes.
81 */
82size_t DevInterface::BlockSizeBytes() {
83 return 256;
84}
Andrew McRae485619fb2021-05-09 03:46:4085
86} // namespace hps