| // 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. |
| @available(added=7) |
| library fuchsia.hardware.i2c; |
| |
| using zx; |
| |
| const I2C_10_BIT_ADDR_MASK uint32 = 0xF000; |
| const I2C_MAX_RW_OPS uint32 = 8; |
| const I2C_MAX_TOTAL_TRANSFER uint32 = 4096; |
| |
| /// See `Transact` below for usage. |
| type I2cOp = struct { |
| @buffer |
| data vector<uint8>:MAX; |
| is_read bool; |
| stop bool; |
| }; |
| |
| @transport("Banjo") |
| @banjo_layout("ddk-protocol") |
| @handle_wrappers |
| 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(struct { |
| op vector<I2cOp>:MAX; |
| }) -> (struct { |
| status zx.status; |
| op vector<I2cOp>:MAX; |
| }); |
| /// Returns the maximum transfer size for read and write operations on the channel. |
| GetMaxTransferSize() -> (struct { |
| s zx.status; |
| size uint64; |
| }); |
| }; |