| // Copyright 2019 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.spiimpl; |
| |
| using zx; |
| |
| // Must match //sdk/fidl/fuchsia.hardware.sharedmemory/sharedmemory.fidl |
| type SpiVmoRight = strict enum : uint32 { |
| READ = 0x1; // The protocol implementation can read from this VMO (used for write requests). |
| WRITE = 0x2; // The protocol implementation can write to this VMO (used for read requests). |
| }; |
| |
| /// Low-level protocol for spi drivers. |
| @transport("Banjo") |
| @banjo_layout("ddk-protocol") |
| protocol SpiImpl { |
| /// Returns the number of chip select lines available or provided by the driver instance. |
| /// To be used as a limit on the acceptable values for the `chip_select' field in the Exchange() |
| /// and ExchangeVmo() methods. |
| GetChipSelectCount() -> (struct { |
| count uint32; |
| }); |
| |
| /// Perform a SPI bus transaction of the specified length. Either txdata or rxdata may be |
| /// NULL, in which case the transaction will be half-duplex in the appropriate direction. |
| /// Regardless, both vectors must have the same length. |
| Exchange(struct { |
| chip_select uint32; |
| txdata vector<uint8>:MAX; |
| }) -> (struct { |
| status zx.status; |
| rxdata vector<uint8>:MAX; |
| }); |
| |
| /// Lock the bus. |
| LockBus(struct { |
| chip_select uint32; |
| }) -> (struct { |
| status zx.status; |
| }); |
| /// Unlock the bus. |
| UnlockBus(struct { |
| chip_select uint32; |
| }) -> (struct { |
| status zx.status; |
| }); |
| |
| /// rights is a bit field containing SpiVmoRight values, and determines the read/write |
| /// permissions used by the implementation when pinning or mapping the VMO. |
| RegisterVmo(resource struct { |
| chip_select uint32; |
| vmo_id uint32; |
| vmo zx.handle:VMO; |
| offset uint64; |
| size uint64; |
| rights uint32; |
| }) -> (struct { |
| status zx.status; |
| }); |
| UnregisterVmo(struct { |
| chip_select uint32; |
| vmo_id uint32; |
| }) -> (resource struct { |
| status zx.status; |
| vmo zx.handle:VMO; |
| }); |
| |
| /// Release all VMOs registered to this chip_select. Called by the core driver after the client |
| /// has disconnected and the VMOs are no longer needed. |
| ReleaseRegisteredVmos(struct { |
| chip_select uint32; |
| }); |
| |
| TransmitVmo(struct { |
| chip_select uint32; |
| vmo_id uint32; |
| offset uint64; |
| size uint64; |
| }) -> (struct { |
| status zx.status; |
| }); |
| ReceiveVmo(struct { |
| chip_select uint32; |
| vmo_id uint32; |
| offset uint64; |
| size uint64; |
| }) -> (struct { |
| status zx.status; |
| }); |
| ExchangeVmo(struct { |
| chip_select uint32; |
| tx_vmo_id uint32; |
| tx_offset uint64; |
| rx_vmo_id uint32; |
| rx_offset uint64; |
| size uint64; |
| }) -> (struct { |
| status zx.status; |
| }); |
| }; |