| // 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.i2cimpl; |
| |
| using zx; |
| |
| const I2C_IMPL_10_BIT_ADDR_MASK uint32 = 0xF000; |
| /// The maximum number of I2cImplOp's that may be passed to Transact. |
| const I2C_IMPL_MAX_RW_OPS uint32 = 8; |
| /// The maximum length of all read or all write transfers in bytes. |
| const I2C_IMPL_MAX_TOTAL_TRANSFER uint32 = 4096; |
| |
| /// See `Transact` below for usage. |
| type I2cImplOp = struct { |
| address uint16; |
| @buffer |
| @mutable |
| data vector<uint8>:MAX; |
| is_read bool; |
| stop bool; |
| }; |
| |
| /// Low-level protocol for i2c drivers. |
| @transport("Banjo") |
| @banjo_layout("ddk-protocol") |
| closed protocol I2cImpl { |
| strict GetMaxTransferSize() -> (struct { |
| s zx.Status; |
| size uint64; |
| }); |
| /// Sets the bitrate for the i2c bus in KHz units. |
| strict SetBitrate(struct { |
| bitrate uint32; |
| }) -> (struct { |
| s zx.Status; |
| }); |
| /// |Transact| assumes that all ops buf are not null. |
| /// |Transact| assumes that all ops length are not zero. |
| /// |Transact| assumes that at least the last op has stop set to true. |
| strict Transact(struct { |
| op vector<I2cImplOp>:MAX; |
| }) -> (struct { |
| status zx.Status; |
| }); |
| }; |