@@ -10,11 +10,8 @@ use crate::{
10
10
pac:: generic:: Reg ,
11
11
target_constants:: { SRAM_LOWER , SRAM_UPPER } ,
12
12
} ;
13
- use core:: {
14
- ops:: { Deref , DerefMut } ,
15
- sync:: atomic:: { compiler_fence, Ordering } ,
16
- } ;
17
- pub use stable_deref_trait:: StableDeref ;
13
+ use core:: sync:: atomic:: { compiler_fence, Ordering } ;
14
+ use embedded_dma:: * ;
18
15
19
16
use i2s:: { _EVENTS_RXPTRUPD, _EVENTS_STOPPED, _EVENTS_TXPTRUPD, _TASKS_START, _TASKS_STOP} ;
20
17
@@ -23,7 +20,7 @@ pub struct I2S {
23
20
}
24
21
25
22
// I2S EasyDMA MAXCNT bit length = 14
26
- const MAX_DMA_MAXCNT : u32 = 16_384 ;
23
+ const MAX_DMA_MAXCNT : u32 = 1 << 14 ;
27
24
28
25
impl I2S {
29
26
/// Takes ownership of the raw I2S peripheral, returning a safe wrapper in controller mode.
@@ -265,23 +262,20 @@ impl I2S {
265
262
/// Receives data into the given `buffer` until it's filled.
266
263
/// Returns a value that represents the in-progress DMA transfer.
267
264
#[ allow( unused_mut) ]
268
- pub fn rx < Word , B > ( mut self , mut buffer : B ) -> Result < Transfer < B > , Error >
265
+ pub fn rx < W , B > ( mut self , mut buffer : B ) -> Result < Transfer < B > , Error >
269
266
where
270
- Word : SupportedWordSize ,
271
- B : DerefMut + StableDeref + ' static + I2SBuffer ,
272
- B :: Target : AsMut < [ Word ] > ,
267
+ B : WriteBuffer < Word = W > ,
273
268
{
274
- if buffer. maxcnt ( ) > MAX_DMA_MAXCNT {
269
+ let ( ptr, len) = unsafe { buffer. write_buffer ( ) } ;
270
+ let maxcnt = ( len / ( core:: mem:: size_of :: < u32 > ( ) / core:: mem:: size_of :: < W > ( ) ) ) as u32 ;
271
+ if maxcnt > MAX_DMA_MAXCNT {
275
272
return Err ( Error :: BufferTooLong ) ;
276
273
}
277
274
self . i2s
278
275
. rxd
279
276
. ptr
280
- . write ( |w| unsafe { w. ptr ( ) . bits ( buffer. ptr ( ) ) } ) ;
281
- self . i2s
282
- . rxtxd
283
- . maxcnt
284
- . write ( |w| unsafe { w. bits ( buffer. maxcnt ( ) ) } ) ;
277
+ . write ( |w| unsafe { w. ptr ( ) . bits ( ptr as u32 ) } ) ;
278
+ self . i2s . rxtxd . maxcnt . write ( |w| unsafe { w. bits ( maxcnt) } ) ;
285
279
Ok ( Transfer {
286
280
inner : Some ( Inner { buffer, i2s : self } ) ,
287
281
} )
@@ -292,42 +286,37 @@ impl I2S {
292
286
/// into the given `rx_buffer` until it is filled. The buffers must be of equal size.
293
287
/// Returns a value that represents the in-progress DMA transfer.
294
288
#[ allow( unused_mut) ]
295
- pub fn transfer < Word , TxB , RxB > (
289
+ pub fn transfer < W , TxB , RxB > (
296
290
mut self ,
297
291
tx_buffer : TxB ,
298
292
mut rx_buffer : RxB ,
299
293
) -> Result < TransferFullDuplex < TxB , RxB > , Error >
300
294
where
301
- Word : SupportedWordSize ,
302
- TxB : Deref + StableDeref + ' static + I2SBuffer ,
303
- TxB :: Target : AsRef < [ Word ] > ,
304
- RxB : DerefMut + StableDeref + ' static + I2SBuffer ,
305
- RxB :: Target : AsMut < [ Word ] > ,
295
+ TxB : ReadBuffer < Word = W > ,
296
+ RxB : WriteBuffer < Word = W > ,
306
297
{
307
- if ( tx_buffer . ptr ( ) as usize ) < SRAM_LOWER || ( tx_buffer . ptr ( ) as usize ) > SRAM_UPPER {
308
- return Err ( Error :: DMABufferNotInDataMemory ) ;
309
- }
310
- if tx_buffer . maxcnt ( ) != rx_buffer . maxcnt ( ) {
298
+ let ( rx_ptr , rx_len ) = unsafe { rx_buffer . write_buffer ( ) } ;
299
+ let ( tx_ptr , tx_len ) = unsafe { tx_buffer . read_buffer ( ) } ;
300
+ let maxcnt = ( tx_len / ( core :: mem :: size_of :: < u32 > ( ) / core :: mem :: size_of :: < W > ( ) ) ) as u32 ;
301
+ if tx_len != rx_len {
311
302
return Err ( Error :: BuffersDontMatch ) ;
312
303
}
313
- if tx_buffer . maxcnt ( ) > MAX_DMA_MAXCNT {
304
+ if maxcnt > MAX_DMA_MAXCNT {
314
305
return Err ( Error :: BufferTooLong ) ;
315
306
}
307
+ if ( tx_ptr as usize ) < SRAM_LOWER || ( tx_ptr as usize ) > SRAM_UPPER {
308
+ return Err ( Error :: DMABufferNotInDataMemory ) ;
309
+ }
316
310
317
311
self . i2s
318
312
. txd
319
313
. ptr
320
- . write ( |w| unsafe { w. ptr ( ) . bits ( tx_buffer . ptr ( ) ) } ) ;
314
+ . write ( |w| unsafe { w. ptr ( ) . bits ( tx_ptr as u32 ) } ) ;
321
315
self . i2s
322
316
. rxd
323
317
. ptr
324
- . write ( |w| unsafe { w. ptr ( ) . bits ( rx_buffer. ptr ( ) ) } ) ;
325
- self . i2s
326
- . rxtxd
327
- . maxcnt
328
- . write ( |w| unsafe { w. bits ( rx_buffer. maxcnt ( ) ) } ) ;
329
-
330
- self . start ( ) ;
318
+ . write ( |w| unsafe { w. ptr ( ) . bits ( rx_ptr as u32 ) } ) ;
319
+ self . i2s . rxtxd . maxcnt . write ( |w| unsafe { w. bits ( maxcnt) } ) ;
331
320
332
321
Ok ( TransferFullDuplex {
333
322
inner : Some ( InnerFullDuplex {
@@ -341,28 +330,24 @@ impl I2S {
341
330
/// Transmits the given `tx_buffer`.
342
331
/// Returns a value that represents the in-progress DMA transfer.
343
332
#[ allow( unused_mut) ]
344
- pub fn tx < Word , B > ( mut self , buffer : B ) -> Result < Transfer < B > , Error >
333
+ pub fn tx < W , B > ( mut self , buffer : B ) -> Result < Transfer < B > , Error >
345
334
where
346
- Word : SupportedWordSize ,
347
- B : Deref + StableDeref + ' static + I2SBuffer ,
348
- B :: Target : AsRef < [ Word ] > ,
335
+ B : ReadBuffer < Word = W > ,
349
336
{
350
- if ( buffer. ptr ( ) as usize ) < SRAM_LOWER || ( buffer. ptr ( ) as usize ) > SRAM_UPPER {
351
- return Err ( Error :: DMABufferNotInDataMemory ) ;
352
- }
353
-
354
- if buffer. maxcnt ( ) > MAX_DMA_MAXCNT {
337
+ let ( ptr, len) = unsafe { buffer. read_buffer ( ) } ;
338
+ let maxcnt = ( len / ( core:: mem:: size_of :: < u32 > ( ) / core:: mem:: size_of :: < W > ( ) ) ) as u32 ;
339
+ if maxcnt > MAX_DMA_MAXCNT {
355
340
return Err ( Error :: BufferTooLong ) ;
356
341
}
342
+ if ( ptr as usize ) < SRAM_LOWER || ( ptr as usize ) > SRAM_UPPER {
343
+ return Err ( Error :: DMABufferNotInDataMemory ) ;
344
+ }
357
345
358
346
self . i2s
359
347
. txd
360
348
. ptr
361
- . write ( |w| unsafe { w. ptr ( ) . bits ( buffer. ptr ( ) ) } ) ;
362
- self . i2s
363
- . rxtxd
364
- . maxcnt
365
- . write ( |w| unsafe { w. bits ( buffer. maxcnt ( ) ) } ) ;
349
+ . write ( |w| unsafe { w. ptr ( ) . bits ( ptr as u32 ) } ) ;
350
+ self . i2s . rxtxd . maxcnt . write ( |w| unsafe { w. bits ( maxcnt) } ) ;
366
351
367
352
Ok ( Transfer {
368
353
inner : Some ( Inner { buffer, i2s : self } ) ,
@@ -598,132 +583,6 @@ pub enum I2SEvent {
598
583
Stopped ,
599
584
}
600
585
601
- /// Trait to represent valid sample buffers.
602
- pub trait I2SBuffer : private:: Sealed {
603
- fn ptr ( & self ) -> u32 ;
604
- fn maxcnt ( & self ) -> u32 ;
605
- }
606
-
607
- impl private:: Sealed for & [ i8 ] { }
608
- impl I2SBuffer for & [ i8 ] {
609
- fn ptr ( & self ) -> u32 {
610
- self . as_ptr ( ) as u32
611
- }
612
- fn maxcnt ( & self ) -> u32 {
613
- self . len ( ) as u32 / 4
614
- }
615
- }
616
-
617
- impl private:: Sealed for & [ i16 ] { }
618
- impl I2SBuffer for & [ i16 ] {
619
- fn ptr ( & self ) -> u32 {
620
- self . as_ptr ( ) as u32
621
- }
622
- fn maxcnt ( & self ) -> u32 {
623
- self . len ( ) as u32 / 2
624
- }
625
- }
626
-
627
- impl private:: Sealed for & [ i32 ] { }
628
- impl I2SBuffer for & [ i32 ] {
629
- fn ptr ( & self ) -> u32 {
630
- self . as_ptr ( ) as u32
631
- }
632
- fn maxcnt ( & self ) -> u32 {
633
- self . len ( ) as u32
634
- }
635
- }
636
-
637
- impl private:: Sealed for & [ u8 ] { }
638
- impl I2SBuffer for & [ u8 ] {
639
- fn ptr ( & self ) -> u32 {
640
- self . as_ptr ( ) as u32
641
- }
642
- fn maxcnt ( & self ) -> u32 {
643
- self . len ( ) as u32 / 8
644
- }
645
- }
646
-
647
- impl private:: Sealed for & [ u16 ] { }
648
- impl I2SBuffer for & [ u16 ] {
649
- fn ptr ( & self ) -> u32 {
650
- self . as_ptr ( ) as u32
651
- }
652
- fn maxcnt ( & self ) -> u32 {
653
- self . len ( ) as u32 / 4
654
- }
655
- }
656
-
657
- impl private:: Sealed for & [ u32 ] { }
658
- impl I2SBuffer for & [ u32 ] {
659
- fn ptr ( & self ) -> u32 {
660
- self . as_ptr ( ) as u32
661
- }
662
- fn maxcnt ( & self ) -> u32 {
663
- self . len ( ) as u32 / 2
664
- }
665
- }
666
-
667
- impl private:: Sealed for & mut [ i8 ] { }
668
- impl I2SBuffer for & mut [ i8 ] {
669
- fn ptr ( & self ) -> u32 {
670
- self . as_ptr ( ) as u32
671
- }
672
- fn maxcnt ( & self ) -> u32 {
673
- self . len ( ) as u32 / 4
674
- }
675
- }
676
-
677
- impl private:: Sealed for & mut [ i16 ] { }
678
- impl I2SBuffer for & mut [ i16 ] {
679
- fn ptr ( & self ) -> u32 {
680
- self . as_ptr ( ) as u32
681
- }
682
- fn maxcnt ( & self ) -> u32 {
683
- self . len ( ) as u32 / 2
684
- }
685
- }
686
-
687
- impl private:: Sealed for & mut [ i32 ] { }
688
- impl I2SBuffer for & mut [ i32 ] {
689
- fn ptr ( & self ) -> u32 {
690
- self . as_ptr ( ) as u32
691
- }
692
- fn maxcnt ( & self ) -> u32 {
693
- self . len ( ) as u32
694
- }
695
- }
696
-
697
- impl private:: Sealed for & mut [ u8 ] { }
698
- impl I2SBuffer for & mut [ u8 ] {
699
- fn ptr ( & self ) -> u32 {
700
- self . as_ptr ( ) as u32
701
- }
702
- fn maxcnt ( & self ) -> u32 {
703
- self . len ( ) as u32 / 8
704
- }
705
- }
706
-
707
- impl private:: Sealed for & mut [ u16 ] { }
708
- impl I2SBuffer for & mut [ u16 ] {
709
- fn ptr ( & self ) -> u32 {
710
- self . as_ptr ( ) as u32
711
- }
712
- fn maxcnt ( & self ) -> u32 {
713
- self . len ( ) as u32 / 4
714
- }
715
- }
716
-
717
- impl private:: Sealed for & mut [ u32 ] { }
718
- impl I2SBuffer for & mut [ u32 ] {
719
- fn ptr ( & self ) -> u32 {
720
- self . as_ptr ( ) as u32
721
- }
722
- fn maxcnt ( & self ) -> u32 {
723
- self . len ( ) as u32 / 2
724
- }
725
- }
726
-
727
586
/// A DMA transfer
728
587
pub struct Transfer < B > {
729
588
inner : Option < Inner < B > > ,
@@ -791,22 +650,3 @@ impl<TxB, RxB> Drop for TransferFullDuplex<TxB, RxB> {
791
650
}
792
651
}
793
652
}
794
-
795
- pub trait SupportedWordSize : private:: Sealed { }
796
- impl private:: Sealed for i8 { }
797
- impl SupportedWordSize for i8 { }
798
- impl private:: Sealed for i16 { }
799
- impl SupportedWordSize for i16 { }
800
- impl private:: Sealed for i32 { }
801
- impl SupportedWordSize for i32 { }
802
- impl private:: Sealed for u8 { }
803
- impl SupportedWordSize for u8 { }
804
- impl private:: Sealed for u16 { }
805
- impl SupportedWordSize for u16 { }
806
- impl private:: Sealed for u32 { }
807
- impl SupportedWordSize for u32 { }
808
-
809
- mod private {
810
- /// Prevents code outside of the parent module from implementing traits.
811
- pub trait Sealed { }
812
- }
0 commit comments