Skip to content

Commit fbf587e

Browse files
authored
Merge pull request #43 from berkowski/master
Added write_some and read_some methods to I2c and UART peripherals
2 parents 1df5d43 + 763824d commit fbf587e

File tree

4 files changed

+103
-13
lines changed

4 files changed

+103
-13
lines changed

src/aes.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,8 @@ impl<Target, Channel, Buffer> Transfer<Target, Channel, Buffer, dma::Ready>
595595
)
596596
-> Self
597597
{
598+
let num_words = buffer.as_slice().len() / 4;
599+
598600
let transfer = dma::Transfer::new(
599601
dma,
600602
target,
@@ -603,8 +605,9 @@ impl<Target, Channel, Buffer> Transfer<Target, Channel, Buffer, dma::Ready>
603605
// this should be fine.
604606
Pin::new(dma::PtrBuffer {
605607
ptr: buffer.as_slice().as_ptr() as *const u32,
606-
len: buffer.as_slice().len() / 4,
608+
len: num_words
607609
}),
610+
num_words,
608611
address,
609612
priority,
610613
dir,

src/dma.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -104,27 +104,29 @@ impl<T, C, B> Transfer<T, C, B, Ready>
104104
///
105105
/// Panics, if the buffer is not aligned to the word size.
106106
pub(crate) unsafe fn new<Word>(
107-
handle: &mut Handle,
108-
target: T,
109-
channel: C,
110-
buffer: Pin<B>,
111-
address: u32,
112-
priority: Priority,
113-
dir: Direction,
107+
handle: &mut Handle,
108+
target: T,
109+
channel: C,
110+
buffer: Pin<B>,
111+
num_words: usize,
112+
address: u32,
113+
priority: Priority,
114+
dir: Direction,
114115
)
115116
-> Self
116117
where
117118
B: Deref,
118119
B::Target: Buffer<Word>,
119120
Word: SupportedWordSize,
120121
{
121-
assert!(buffer.len() <= u16::max_value() as usize);
122+
assert!(buffer.len() >= num_words);
123+
assert!(num_words <= u16::max_value() as usize);
122124
assert_eq!(buffer.as_ptr().align_offset(mem::size_of::<Word>()), 0);
123125

124126
channel.select_target(handle, &target);
125127
channel.set_peripheral_address(handle, address);
126128
channel.set_memory_address(handle, buffer.as_ptr() as u32);
127-
channel.set_transfer_len(handle, buffer.len() as u16);
129+
channel.set_transfer_len(handle, num_words as u16);
128130
channel.configure::<Word>(handle, priority.0, dir.0);
129131

130132
Transfer {

src/i2c.rs

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ use as_slice::{
1818
use crate::hal::blocking::i2c::{Read, Write, WriteRead};
1919

2020
#[cfg(feature = "stm32l0x2")]
21-
use crate::dma;
21+
use crate::dma::{
22+
self,
23+
Buffer
24+
};
2225
use crate::gpio::gpioa::{PA10, PA9};
2326
use crate::gpio::gpiob::{PB6, PB7};
2427
use crate::gpio::{AltMode, OpenDrain, Output};
@@ -207,7 +210,7 @@ where
207210
}
208211

209212
#[cfg(feature = "stm32l0x2")]
210-
pub fn write_all<Channel, Buffer>(mut self,
213+
pub fn write_all<Channel, Buffer>(self,
211214
dma: &mut dma::Handle,
212215
channel: Channel,
213216
address: u8,
@@ -220,6 +223,26 @@ where
220223
Buffer: Deref + 'static,
221224
Buffer::Target: AsSlice<Element=u8>,
222225
{
226+
let num_words = buffer.len();
227+
self.write_some(dma, channel, address, buffer, num_words)
228+
}
229+
230+
#[cfg(feature = "stm32l0x2")]
231+
pub fn write_some<Channel, Buffer>(mut self,
232+
dma: &mut dma::Handle,
233+
channel: Channel,
234+
address: u8,
235+
buffer: Pin<Buffer>,
236+
num_words: usize,
237+
)
238+
-> Transfer<Self, Tx<I>, Channel, Buffer, dma::Ready>
239+
where
240+
Tx<I>: dma::Target<Channel>,
241+
Channel: dma::Channel,
242+
Buffer: Deref + 'static,
243+
Buffer::Target: AsSlice<Element=u8>,
244+
{
245+
assert!(buffer.len() >= num_words);
223246
self.start_transfer(address, buffer.as_slice().len(), RD_WRNW::WRITE);
224247

225248
// This token represents the transmission capability of I2C and this is
@@ -246,6 +269,7 @@ where
246269
token,
247270
channel,
248271
buffer,
272+
num_words,
249273
address,
250274
dma::Priority::high(),
251275
dma::Direction::memory_to_peripheral(),
@@ -259,7 +283,7 @@ where
259283
}
260284

261285
#[cfg(feature = "stm32l0x2")]
262-
pub fn read_all<Channel, Buffer>(mut self,
286+
pub fn read_all<Channel, Buffer>(self,
263287
dma: &mut dma::Handle,
264288
channel: Channel,
265289
address: u8,
@@ -272,6 +296,26 @@ where
272296
Buffer: DerefMut + 'static,
273297
Buffer::Target: AsMutSlice<Element=u8>,
274298
{
299+
let num_words = buffer.len();
300+
self.read_some(dma, channel, address, buffer, num_words)
301+
}
302+
303+
#[cfg(feature = "stm32l0x2")]
304+
pub fn read_some<Channel, Buffer>(mut self,
305+
dma: &mut dma::Handle,
306+
channel: Channel,
307+
address: u8,
308+
buffer: Pin<Buffer>,
309+
num_words: usize,
310+
)
311+
-> Transfer<Self, Rx<I>, Channel, Buffer, dma::Ready>
312+
where
313+
Rx<I>: dma::Target<Channel>,
314+
Channel: dma::Channel,
315+
Buffer: DerefMut + 'static,
316+
Buffer::Target: AsMutSlice<Element=u8>,
317+
{
318+
assert!(buffer.len() >= num_words);
275319
self.start_transfer(address, buffer.as_slice().len(), RD_WRNW::READ);
276320

277321
// See explanation of tokens in `write_all`.
@@ -280,6 +324,7 @@ where
280324
// Safe, because we're only taking the address of a register.
281325
let address = &unsafe { &*I::ptr() }.rxdr as *const _ as u32;
282326

327+
let num_words = buffer.len();
283328
// Safe, because the trait bounds of this method guarantee that the
284329
// buffer can be written to.
285330
let transfer = unsafe {
@@ -288,6 +333,7 @@ where
288333
token,
289334
channel,
290335
buffer,
336+
num_words,
291337
address,
292338
dma::Priority::high(),
293339
dma::Direction::peripheral_to_memory(),

src/serial.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ pub use crate::{
3232
pac::{LPUART1, USART1, USART4, USART5},
3333
};
3434

35+
#[cfg(any(feature = "stm32l0x2", feature = "stm32l0x3"))]
36+
use dma::Buffer;
37+
3538
/// Serial error
3639
#[derive(Debug)]
3740
pub enum Error {
@@ -374,6 +377,23 @@ macro_rules! usart {
374377
Buffer: DerefMut + 'static,
375378
Buffer::Target: AsMutSlice<Element=u8>,
376379
Channel: dma::Channel,
380+
{
381+
let num_words = (*buffer).len();
382+
self.read_some(dma, buffer, num_words, channel)
383+
}
384+
385+
pub fn read_some<Buffer, Channel>(self,
386+
dma: &mut dma::Handle,
387+
buffer: Pin<Buffer>,
388+
num_words: usize,
389+
channel: Channel,
390+
)
391+
-> dma::Transfer<Self, Channel, Buffer, dma::Ready>
392+
where
393+
Self: dma::Target<Channel>,
394+
Buffer: DerefMut + 'static,
395+
Buffer::Target: AsMutSlice<Element=u8>,
396+
Channel: dma::Channel,
377397
{
378398
// Safe, because we're only taking the address of a
379399
// register.
@@ -388,6 +408,7 @@ macro_rules! usart {
388408
self,
389409
channel,
390410
buffer,
411+
num_words,
391412
address,
392413
dma::Priority::high(),
393414
dma::Direction::peripheral_to_memory(),
@@ -491,6 +512,23 @@ macro_rules! usart {
491512
Buffer: Deref + 'static,
492513
Buffer::Target: AsSlice<Element=u8>,
493514
Channel: dma::Channel,
515+
{
516+
let num_words = (*buffer).len();
517+
self.write_some(dma, buffer, num_words, channel)
518+
}
519+
520+
pub fn write_some<Buffer, Channel>(self,
521+
dma: &mut dma::Handle,
522+
buffer: Pin<Buffer>,
523+
num_words: usize,
524+
channel: Channel,
525+
)
526+
-> dma::Transfer<Self, Channel, Buffer, dma::Ready>
527+
where
528+
Self: dma::Target<Channel>,
529+
Buffer: Deref + 'static,
530+
Buffer::Target: AsSlice<Element=u8>,
531+
Channel: dma::Channel,
494532
{
495533
// Safe, because we're only taking the address of a
496534
// register.
@@ -505,6 +543,7 @@ macro_rules! usart {
505543
self,
506544
channel,
507545
buffer,
546+
num_words,
508547
address,
509548
dma::Priority::high(),
510549
dma::Direction::memory_to_peripheral(),

0 commit comments

Comments
 (0)