1 | use embassy_hal_internal::PeripheralRef; |
2 | |
3 | use super::word::Word; |
4 | use super::{AnyChannel, Request, Transfer, TransferOptions}; |
5 | |
6 | /// Convenience wrapper, contains a channel and a request number. |
7 | /// |
8 | /// Commonly used in peripheral drivers that own DMA channels. |
9 | pub(crate) struct ChannelAndRequest<'d> { |
10 | pub channel: PeripheralRef<'d, AnyChannel>, |
11 | pub request: Request, |
12 | } |
13 | |
14 | impl<'d> ChannelAndRequest<'d> { |
15 | pub unsafe fn read<'a, W: Word>( |
16 | &'a mut self, |
17 | peri_addr: *mut W, |
18 | buf: &'a mut [W], |
19 | options: TransferOptions, |
20 | ) -> Transfer<'a> { |
21 | Transfer::new_read(&mut self.channel, self.request, peri_addr, buf, options) |
22 | } |
23 | |
24 | pub unsafe fn read_raw<'a, W: Word>( |
25 | &'a mut self, |
26 | peri_addr: *mut W, |
27 | buf: *mut [W], |
28 | options: TransferOptions, |
29 | ) -> Transfer<'a> { |
30 | Transfer::new_read_raw(&mut self.channel, self.request, peri_addr, buf, options) |
31 | } |
32 | |
33 | pub unsafe fn write<'a, W: Word>( |
34 | &'a mut self, |
35 | buf: &'a [W], |
36 | peri_addr: *mut W, |
37 | options: TransferOptions, |
38 | ) -> Transfer<'a> { |
39 | Transfer::new_write(&mut self.channel, self.request, buf, peri_addr, options) |
40 | } |
41 | |
42 | pub unsafe fn write_raw<'a, W: Word>( |
43 | &'a mut self, |
44 | buf: *const [W], |
45 | peri_addr: *mut W, |
46 | options: TransferOptions, |
47 | ) -> Transfer<'a> { |
48 | Transfer::new_write_raw(&mut self.channel, self.request, buf, peri_addr, options) |
49 | } |
50 | |
51 | #[allow (dead_code)] |
52 | pub unsafe fn write_repeated<'a, W: Word>( |
53 | &'a mut self, |
54 | repeated: &'a W, |
55 | count: usize, |
56 | peri_addr: *mut W, |
57 | options: TransferOptions, |
58 | ) -> Transfer<'a> { |
59 | Transfer::new_write_repeated(&mut self.channel, self.request, repeated, count, peri_addr, options) |
60 | } |
61 | } |
62 | |