// Copyright 2019 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.
library fuchsia.hardware.spi;

using fuchsia.hardware.sharedmemory;
using zx;

const MAX_TRANSFER_SIZE uint32 = 8196; // arbitrary - to be removed
protocol Device {
    /// Half-duplex transmit data to a SPI device; always transmits the entire buffer on success.
    TransmitVector(struct {
        data vector<uint8>:MAX_TRANSFER_SIZE;
    }) -> (struct {
        status zx.status;
    });
    /// Half-duplex receive data from a SPI device; always reads the full size requested.
    ReceiveVector(struct {
        size uint32;
    }) -> (struct {
        status zx.status;
        data vector<uint8>:MAX_TRANSFER_SIZE;
    });
    /// Full-duplex SPI transaction. Received data will exactly equal the length of the transmit
    /// buffer.
    ExchangeVector(struct {
        txdata vector<uint8>:MAX_TRANSFER_SIZE;
    }) -> (struct {
        status zx.status;
        rxdata vector<uint8>:MAX_TRANSFER_SIZE;
    });

    /// Returns true if the device can call |AssertCs()| and |DeassertCs()|.
    CanAssertCs() -> (struct {
        can bool;
    });

    /// Assert CS for this device.
    /// Returns ZX_ERR_NOT_SUPPORTED if there is more than one device on the bus.
    AssertCs() -> (struct {
        status zx.status;
    });
    /// Deassert CS for this device.
    /// Returns ZX_ERR_BAD_STATE if CS is already deasserted.
    /// Returns ZX_ERR_NOT_SUPPORTED if there is more than one device on the bus.
    DeassertCs() -> (struct {
        status zx.status;
    });

    compose fuchsia.hardware.sharedmemory.SharedVmoIo;
    compose fuchsia.hardware.sharedmemory.SharedVmoRegister;
};
