// Copyright 2018 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.i2c;

using zx;

const MAX_TRANSFER_SIZE uint32 = 8196; // More than enough for I2C
const MAX_COUNT_SEGMENTS uint32 = 8; // Enough for all known transfer configurations.
const MAX_I2C_CHANNEL uint32 = 128; // Enough for every address to be used in 7-bit mode.
type SegmentType = strict enum {
    /// Flags the end of a serialized list of segments.
    END = 1;
    /// Segment to be read from the I2C device.
    READ = 2;
    /// Segment to be written to the I2C device.
    WRITE = 3;
};

/// Used to inform the i2c driver about an attached i2c device.
type I2CChannel = table {
    /// ID of the bus that this device is on.
    1: bus_id uint32;
    /// Adress of the device.
    2: address uint16;
    /// Class of the device.
    /// TODO(fxbug.dev/78198): remove this once x86 uses ACPI properly.
    3: i2c_class uint32;

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

    // Bus configuration.
    /// Are we in charge of the bus?
    7: is_bus_controller bool;
    /// Is this device using 10-bit addressing mode (if false, use 7-bit).
    8: is_ten_bit bool;
    /// Speed of the bus.
    9: bus_speed uint32;
};

/// Passed to the i2c driver in metadata as DEVICE_METADATA_I2C_CHANNELS.
type I2CBusMetadata = table {
    1: channels vector<I2CChannel>:MAX_I2C_CHANNEL;
};

/// Segment header for a serialized SubordinateTransfer.
/// TODO(fxbug.dev/32864): Avoid requiring serialization and have SubordinateTransfer take an argument of
/// `vector<Segment>:MAX_SEGMENTS` instead once we have better support in the C bindings or for C++.
@for_deprecated_c_bindings
type Segment = struct {
    type uint32;
    len uint32;
};

@for_deprecated_c_bindings
protocol Device {
    /// Send and receive data on the I2C device.
    SubordinateTransfer(struct {
        in vector<uint8>:MAX_TRANSFER_SIZE;
    }) -> (struct {
        s zx.status;
        out vector<uint8>:MAX_TRANSFER_SIZE;
    });
};

// `Device2` removes the simple layout restriction and fully specifies the format in FIDL instead
// of manually parsed structs as `Device` above.
protocol Device2 {
    /// Write and read segments of data for a particular I2C device.
    ///
    /// The `segments_is_write` vector specifies the type (write or read) of each segment.
    /// The `write_segments_data` vector of segments specifies the data to write for each write
    /// segment. Each segment itself is a vector of uint8s, so `write_segments_data` is a vector of
    /// vectors of uint8s.
    /// The `read_segments_length` vector specifies the length of the read segments.
    /// If there is no error, `read_segments_data` returns a vector of segments, with each segment
    /// data itself returned in vectors.
    ///
    /// For a simple I2C read, for instance 2 bytes write followed by one byte read,
    /// `segments_is_write` would be a vector with 2 elements: true, false and
    /// `write_segments_data` would be a vector with 1 element including the 2 bytes address of the
    /// read. Upon success `read_segments_data` would return a vector with one element, the byte
    /// read.
    Transfer(struct {
        segments_is_write vector<bool>:MAX_COUNT_SEGMENTS;
        write_segments_data vector<vector<uint8>:MAX_TRANSFER_SIZE>:MAX_COUNT_SEGMENTS;
        read_segments_length vector<uint8>:MAX_COUNT_SEGMENTS;
    }) -> (struct {
        read_segments_data vector<vector<uint8>:MAX_TRANSFER_SIZE>:MAX_COUNT_SEGMENTS;
    }) error zx.status;
};
