| // 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 ddk.protocol.i2c; |
| |
| using zx; |
| |
| const uint32 I2C_10_BIT_ADDR_MASK = 0xF000; |
| const uint32 I2C_MAX_RW_OPS = 8; |
| const uint32 I2C_MAX_TOTAL_TRANSFER = 4096; |
| |
| /// See `Transact` below for usage. |
| struct I2cOp { |
| vector<voidptr> data; |
| bool is_read; |
| bool stop; |
| }; |
| |
| [Layout = "ddk-protocol", HandleWrappers] |
| protocol I2c { |
| /// Writes and reads data on an i2c channel. Up to I2C_MAX_RW_OPS operations can be passed in |
| // with a maximum of I2C_MAX_TOTAL_TRANSFER total bytes transfered. |
| /// For write ops, i2c_op_t.data points to data to write. The data to write does not need to be |
| /// kept alive after this call. For read ops, i2c_op_t.data is ignored. Any combination of |
| /// reads and writes can be specified. At least the last op must have the stop flag set. |
| /// The results of the operations are returned asynchronously via the transact_cb. |
| /// The cookie parameter can be used to pass your own private data to the transact_cb callback. |
| [Async] |
| Transact(vector<I2cOp> op) -> (zx.status status, vector<I2cOp> op); |
| /// Returns the maximum transfer size for read and write operations on the channel. |
| GetMaxTransferSize() -> (zx.status s, usize size); |
| GetInterrupt(uint32 flags) -> (zx.status s, handle<interrupt> irq); |
| }; |