// 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
const MAX_SPI_CHANNEL uint32 = 32; // arbitrary.
type SpiClockPhase = flexible enum {
    CLOCK_PHASE_FIRST = 0;
    CLOCK_PHASE_SECOND = 1;
};

/// Represents a single device on a SPI bus.
type SpiChannel = table {
    /// ID of the bus that this device is on.
    1: bus_id uint32;
    /// Chip select number for the device.
    2: cs uint32;

    /// Vendor ID. Used when binding via platform bus device IDs.
    3: vid uint32;
    /// Product ID. Used when binding via platform bus device IDs.
    4: pid uint32;
    /// Device ID. Used when binding via platform bus device IDs.
    5: did uint32;

    // Bus configuration.
    /// Chip select polarity: true == high, false == low.
    6: cs_polarity_high bool;
    /// Size in bits of a single word on the SPI bus.
    7: word_length_bits uint8;

    /// Are we in charge of the bus?
    8: is_bus_controller bool;
    /// Clock polarity. true == high, false == low.
    9: clock_polarity_high bool;
    ///  Clock phase.
   10: clock_phase SpiClockPhase;
};

/// Passed to the spi driver in metadata as DEVICE_METADATA_SPI_CHANNELS.
type SpiBusMetadata = table {
    1: channels vector<SpiChannel>:MAX_SPI_CHANNEL;
};

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;
};
