@@ -34,6 +34,10 @@ pub struct Transfer<B, C: Channel, T> {
34
34
35
35
impl < B , C : Channel , T > Transfer < B , C , T > {
36
36
/// Start a DMA write transfer.
37
+ ///
38
+ /// # Panics
39
+ ///
40
+ /// Panics if the buffer is longer than 65535 words.
37
41
pub fn start_write ( mut buffer : B , mut channel : C , target : T ) -> Self
38
42
where
39
43
B : WriteBuffer + ' static ,
@@ -42,6 +46,7 @@ impl<B, C: Channel, T> Transfer<B, C, T> {
42
46
// NOTE(unsafe) cannot call `&mut self` methods on `buffer` because its
43
47
// concrete type is unknown here
44
48
let ( ptr, len) = unsafe { buffer. write_buffer ( ) } ;
49
+ let len = u16 ( len) . expect ( "buffer is too large" ) ;
45
50
46
51
channel. set_memory_address ( ptr as u32 , Increment :: Enable ) ;
47
52
channel. set_transfer_length ( len) ;
@@ -52,6 +57,10 @@ impl<B, C: Channel, T> Transfer<B, C, T> {
52
57
}
53
58
54
59
/// Start a DMA read transfer.
60
+ ///
61
+ /// # Panics
62
+ ///
63
+ /// Panics if the buffer is longer than 65535 words.
55
64
pub fn start_read ( buffer : B , mut channel : C , target : T ) -> Self
56
65
where
57
66
B : ReadBuffer + ' static ,
@@ -60,6 +69,7 @@ impl<B, C: Channel, T> Transfer<B, C, T> {
60
69
// NOTE(unsafe) cannot call `&mut self` methods on `buffer` because its
61
70
// concrete type is unknown here
62
71
let ( ptr, len) = unsafe { buffer. read_buffer ( ) } ;
72
+ let len = u16 ( len) . expect ( "buffer is too large" ) ;
63
73
64
74
channel. set_memory_address ( ptr as u32 , Increment :: Enable ) ;
65
75
channel. set_transfer_length ( len) ;
@@ -97,7 +107,7 @@ impl<B, C: Channel, T> Transfer<B, C, T> {
97
107
/// Is this transfer complete?
98
108
pub fn is_complete ( & self ) -> bool {
99
109
let inner = self . inner . as_ref ( ) . unwrap ( ) ;
100
- inner. channel . event_occured ( Event :: TransferComplete )
110
+ inner. channel . event_occurred ( Event :: TransferComplete )
101
111
}
102
112
103
113
/// Stop this transfer and return ownership over its parts
@@ -420,7 +430,7 @@ pub enum Event {
420
430
/// Trait implemented by all DMA channels
421
431
pub trait Channel : private:: Channel {
422
432
/// Is the interrupt flag for the given event set?
423
- fn event_occured ( & self , event : Event ) -> bool ;
433
+ fn event_occurred ( & self , event : Event ) -> bool ;
424
434
/// Clear the interrupt flag for the given event
425
435
fn clear_event ( & mut self , event : Event ) ;
426
436
@@ -471,14 +481,17 @@ pub trait Channel: private::Channel {
471
481
/// # Panics
472
482
///
473
483
/// Panics if this channel is enabled.
474
- fn set_transfer_length ( & mut self , len : usize ) {
484
+ fn set_transfer_length ( & mut self , len : u16 ) {
475
485
assert ! ( !self . is_enabled( ) ) ;
476
486
477
- let len = u16 ( len) . expect ( "DMA transfer length too large" ) ;
478
487
self . ch ( ) . ndtr . write ( |w| w. ndt ( ) . bits ( len) ) ;
479
488
}
480
489
481
- /// Set the word size
490
+ /// Set the word size.
491
+ ///
492
+ /// # Panics
493
+ ///
494
+ /// Panics if the word size is not one of 8, 16, or 32 bits.
482
495
fn set_word_size < W > ( & mut self ) {
483
496
use cr:: PSIZE_A :: * ;
484
497
@@ -621,7 +634,7 @@ macro_rules! dma {
621
634
}
622
635
623
636
impl Channel for $Ci {
624
- fn event_occured ( & self , event: Event ) -> bool {
637
+ fn event_occurred ( & self , event: Event ) -> bool {
625
638
use Event :: * ;
626
639
627
640
// NOTE(unsafe) atomic read
0 commit comments