blob: e155e7567c438aa3f04ee160513b7b5cbd6fbc06 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "register-util.h"
#include <fcntl.h>
#include <fidl/fuchsia.hardware.registers/cpp/wire.h>
#include <lib/fdio/fdio.h>
#include <lib/zx/channel.h>
#include <unistd.h>
#include <zircon/status.h>
int run(int argc, const char** argv, zx::channel channel) {
fidl::WireSyncClient<fuchsia_hardware_registers::Device> device(std::move(channel));
size_t address = strtoul(argv[2], nullptr, 16);
zx_status_t status = ZX_OK;
if (argc == 4) {
uint32_t value = static_cast<uint32_t>(strtoul(argv[3], nullptr, 16));
auto result = device->WriteRegister32(address, 0xFFFFFFFF, value);
if (result->is_error()) {
status = result->error_value();
}
if (status != ZX_OK) {
fprintf(stderr, "Write failed due to error %s\n", zx_status_get_string(status));
}
} else if (argc == 3) {
auto result = device->ReadRegister32(address, 0xFFFFFFFF);
if (result->is_error()) {
status = result->error_value();
}
if (status != ZX_OK) {
fprintf(stderr, "Read failed due to error %s\n", zx_status_get_string(status));
} else {
printf("Register 0x%08zx: 0x%08x", address, result->value()->value);
}
} else {
fprintf(stderr, "Invalid args\n");
status = ZX_ERR_NOT_SUPPORTED;
}
return status;
}