libs/kaptan-spi: add nonblocking transfer contract
This commit is contained in:
1 parent
95f94dfc81
commit
6d9cadfa8f
2 files changed
+54
No files matched your search
@@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "kaptan-spi"
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
repository.workspace = true
|
||||
rust-version.workspace = true
|
||||
version.workspace = true
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
@@ -0,0 +1,44 @@
|
||||
//! Non-blocking, chip-select-scoped SPI transfer contract.
|
||||
//!
|
||||
//! A selected device owns electrical chip-select behavior. A driver retains its
|
||||
//! transfer storage until a terminal completion event; implementations submit
|
||||
//! DMA or interrupt-driven work and never wait for a peripheral flag.
|
||||
|
||||
#![no_std]
|
||||
|
||||
/// Terminal outcome reported by a selected SPI device.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
pub enum SpiCompletion {
|
||||
/// The bound interrupt does not report a terminal event.
|
||||
NotPending,
|
||||
/// The submitted full-duplex transfer completed.
|
||||
Complete,
|
||||
/// The submitted transfer failed and its receive bytes are unusable.
|
||||
TransferFault,
|
||||
}
|
||||
|
||||
/// Owns one chip-select-scoped, non-blocking SPI route.
|
||||
///
|
||||
/// `start_transfer` begins a complete transfer and returns without waiting for
|
||||
/// a peripheral status flag. The caller owns both buffers until the board
|
||||
/// reports a terminal `SpiCompletion`; `complete_transfer` releases the route
|
||||
/// after that terminal outcome.
|
||||
pub trait SpiDevice {
|
||||
/// Failure to submit a transfer.
|
||||
type StartError;
|
||||
|
||||
/// Starts one complete full-duplex transfer.
|
||||
///
|
||||
/// Implementations assert chip select before submitting and deassert it on
|
||||
/// every terminal completion or submission failure. `receive` receives one
|
||||
/// octet for each `transmit` octet; the two ranges must have equal length.
|
||||
fn start_transfer(
|
||||
&mut self,
|
||||
transmit: &[u8],
|
||||
receive: &mut [u8],
|
||||
) -> Result<(), Self::StartError>;
|
||||
|
||||
/// Releases transport ownership after a hardware ISR acknowledged a
|
||||
/// terminal completion. This must not poll or wait.
|
||||
fn complete_transfer(&mut self, completion: SpiCompletion);
|
||||
}
|
||||
Reference in new issue
Block a user