-
Notifications
You must be signed in to change notification settings - Fork 0
/
spi.rs
102 lines (82 loc) · 2.77 KB
/
spi.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//! Low-level I2C API abstraction.
//!
//! Provides a common I2C trait for adaptation between specifications and implementations.
use super::Error;
/// SPI context abstraction.
///
/// This hides runtime implementation details to simplify implementing I2C contexts.
/// Hopefully one day generation is improved so we don't _need_ this any more
pub trait Spi {
fn init(
&mut self,
dev: u32,
baud: u32,
mosi: i32,
miso: i32,
sck: i32,
cs: i32,
) -> Result<i32, Error>;
fn deinit(&mut self, handle: i32) -> Result<(), Error>;
fn read<'a>(&mut self, handle: i32, data: &mut [u8]) -> Result<(), Error>;
fn write<'a>(&mut self, handle: i32, data: &[u8]) -> Result<(), Error>;
fn transfer<'a>(&mut self, handle: i32, read: &mut [u8], write: &[u8]) -> Result<(), Error>;
fn transfer_inplace<'a>(&mut self, handle: i32, data: &mut [u8]) -> Result<(), Error>;
}
/// Blanket I2c implementation for references to I2c types
impl<T: Spi> Spi for &mut T {
fn init(
&mut self,
dev: u32,
baud: u32,
mosi: i32,
miso: i32,
sck: i32,
cs: i32,
) -> Result<i32, Error> {
<T as Spi>::init(self, dev, baud, mosi, miso, sck, cs)
}
fn deinit(&mut self, handle: i32) -> Result<(), Error> {
<T as Spi>::deinit(self, handle)
}
fn read<'a>(&mut self, handle: i32, data: &mut [u8]) -> Result<(), Error> {
<T as Spi>::read(self, handle, data)
}
fn write<'a>(&mut self, handle: i32, data: &[u8]) -> Result<(), Error> {
<T as Spi>::write(self, handle, data)
}
fn transfer<'a>(&mut self, handle: i32, read: &mut [u8], write: &[u8]) -> Result<(), Error> {
<T as Spi>::transfer(self, handle, read, write)
}
fn transfer_inplace<'a>(&mut self, handle: i32, data: &mut [u8]) -> Result<(), Error> {
<T as Spi>::transfer_inplace(self, handle, data)
}
}
pub struct NullSpi;
impl Spi for NullSpi {
fn init(
&mut self,
_dev: u32,
_baud: u32,
_mosi: i32,
_miso: i32,
_sck: i32,
_cs: i32,
) -> Result<i32, Error> {
Err(Error::Unsupported)
}
fn deinit(&mut self, _handle: i32) -> Result<(), Error> {
Err(Error::Unsupported)
}
fn read<'a>(&mut self, _handle: i32, _data: &mut [u8]) -> Result<(), Error> {
Err(Error::Unsupported)
}
fn write<'a>(&mut self, _handle: i32, _data: &[u8]) -> Result<(), Error> {
Err(Error::Unsupported)
}
fn transfer<'a>(&mut self, _handle: i32, _read: &mut [u8], _write: &[u8]) -> Result<(), Error> {
Err(Error::Unsupported)
}
fn transfer_inplace<'a>(&mut self, _handle: i32, _data: &mut [u8]) -> Result<(), Error> {
Err(Error::Unsupported)
}
}