blob: c372e67825719e4031377ab62a9d77519fe6684b [file] [log] [blame]
// 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 uint32 MAX_TRANSFER_SIZE = 8196; // More than enough for I2C
const uint32 MAX_COUNT_SEGMENTS = 8; // Enough for all known transfer configurations.
enum SegmentType {
/// 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;
};
/// Segment header for a serialized SubordinateTransfer.
/// TODO(ZX-3029): 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++.
struct Segment {
uint32 type;
uint32 len;
};
[Layout = "Simple"]
protocol Device {
/// Send and receive data on the I2C device.
SubordinateTransfer(vector<uint8>:MAX_TRANSFER_SIZE in) -> (zx.status s,
vector<uint8>:MAX_TRANSFER_SIZE out);
};
// |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(vector<bool>:MAX_COUNT_SEGMENTS segments_is_write,
vector<vector<uint8>:MAX_TRANSFER_SIZE>:MAX_COUNT_SEGMENTS write_segments_data,
vector<uint8>:MAX_COUNT_SEGMENTS read_segments_length)
-> (vector<vector<uint8>:MAX_TRANSFER_SIZE>:MAX_COUNT_SEGMENTS read_segments_data)
error zx.status;
};