@@ -14,6 +14,7 @@ use core::{
14
14
ops:: { Deref , DerefMut } ,
15
15
sync:: atomic:: { compiler_fence, Ordering } ,
16
16
} ;
17
+ pub use stable_deref_trait:: StableDeref ;
17
18
18
19
use i2s:: { _EVENTS_RXPTRUPD, _EVENTS_STOPPED, _EVENTS_TXPTRUPD, _TASKS_START, _TASKS_STOP} ;
19
20
@@ -261,27 +262,26 @@ impl I2S {
261
262
_ => Channels :: Right ,
262
263
}
263
264
}
264
-
265
265
/// Receives data into the given `buffer` until it's filled.
266
266
/// Returns a value that represents the in-progress DMA transfer.
267
267
#[ allow( unused_mut) ]
268
- pub fn rx < Word , B > ( mut self , mut buffer : core :: pin :: Pin < B > ) -> Result < Transfer < B > , Error >
268
+ pub fn rx < Word , B > ( mut self , mut buffer : B ) -> Result < Transfer < B > , Error >
269
269
where
270
270
Word : SupportedWordSize ,
271
- B : DerefMut + ' static ,
272
- B :: Target : AsMut < [ Word ] > + Unpin + I2SBuffer ,
271
+ B : DerefMut + StableDeref + ' static + I2SBuffer ,
272
+ B :: Target : AsMut < [ Word ] > ,
273
273
{
274
- if buffer. as_mut ( ) . maxcnt ( ) > MAX_DMA_MAXCNT {
274
+ if buffer. maxcnt ( ) > MAX_DMA_MAXCNT {
275
275
return Err ( Error :: BufferTooLong ) ;
276
276
}
277
277
self . i2s
278
278
. rxd
279
279
. ptr
280
- . write ( |w| unsafe { w. ptr ( ) . bits ( buffer. as_mut ( ) . ptr ( ) ) } ) ;
280
+ . write ( |w| unsafe { w. ptr ( ) . bits ( buffer. ptr ( ) ) } ) ;
281
281
self . i2s
282
282
. rxtxd
283
283
. maxcnt
284
- . write ( |w| unsafe { w. bits ( buffer. as_mut ( ) . maxcnt ( ) ) } ) ;
284
+ . write ( |w| unsafe { w. bits ( buffer. maxcnt ( ) ) } ) ;
285
285
Ok ( Transfer {
286
286
inner : Some ( Inner { buffer, i2s : self } ) ,
287
287
} )
@@ -294,40 +294,38 @@ impl I2S {
294
294
#[ allow( unused_mut) ]
295
295
pub fn transfer < Word , TxB , RxB > (
296
296
mut self ,
297
- tx_buffer : core :: pin :: Pin < TxB > ,
298
- mut rx_buffer : core :: pin :: Pin < RxB > ,
297
+ tx_buffer : TxB ,
298
+ mut rx_buffer : RxB ,
299
299
) -> Result < TransferFullDuplex < TxB , RxB > , Error >
300
300
where
301
301
Word : SupportedWordSize ,
302
- TxB : Deref + ' static ,
303
- TxB :: Target : AsRef < [ Word ] > + I2SBuffer ,
304
- RxB : DerefMut + ' static ,
305
- RxB :: Target : AsMut < [ Word ] > + Unpin + I2SBuffer ,
302
+ TxB : Deref + StableDeref + ' static + I2SBuffer ,
303
+ TxB :: Target : AsRef < [ Word ] > ,
304
+ RxB : DerefMut + StableDeref + ' static + I2SBuffer ,
305
+ RxB :: Target : AsMut < [ Word ] > ,
306
306
{
307
- if ( tx_buffer. as_ref ( ) . ptr ( ) as usize ) < SRAM_LOWER
308
- || ( tx_buffer. as_ref ( ) . ptr ( ) as usize ) > SRAM_UPPER
309
- {
307
+ if ( tx_buffer. ptr ( ) as usize ) < SRAM_LOWER || ( tx_buffer. ptr ( ) as usize ) > SRAM_UPPER {
310
308
return Err ( Error :: DMABufferNotInDataMemory ) ;
311
309
}
312
- if tx_buffer. as_ref ( ) . maxcnt ( ) != rx_buffer. as_mut ( ) . maxcnt ( ) {
310
+ if tx_buffer. maxcnt ( ) != rx_buffer. maxcnt ( ) {
313
311
return Err ( Error :: BuffersDontMatch ) ;
314
312
}
315
- if tx_buffer. as_ref ( ) . maxcnt ( ) > MAX_DMA_MAXCNT {
313
+ if tx_buffer. maxcnt ( ) > MAX_DMA_MAXCNT {
316
314
return Err ( Error :: BufferTooLong ) ;
317
315
}
318
316
319
317
self . i2s
320
318
. txd
321
319
. ptr
322
- . write ( |w| unsafe { w. ptr ( ) . bits ( tx_buffer. as_ref ( ) . ptr ( ) ) } ) ;
320
+ . write ( |w| unsafe { w. ptr ( ) . bits ( tx_buffer. ptr ( ) ) } ) ;
323
321
self . i2s
324
322
. rxd
325
323
. ptr
326
- . write ( |w| unsafe { w. ptr ( ) . bits ( rx_buffer. as_mut ( ) . ptr ( ) ) } ) ;
324
+ . write ( |w| unsafe { w. ptr ( ) . bits ( rx_buffer. ptr ( ) ) } ) ;
327
325
self . i2s
328
326
. rxtxd
329
327
. maxcnt
330
- . write ( |w| unsafe { w. bits ( rx_buffer. as_mut ( ) . maxcnt ( ) ) } ) ;
328
+ . write ( |w| unsafe { w. bits ( rx_buffer. maxcnt ( ) ) } ) ;
331
329
332
330
self . start ( ) ;
333
331
@@ -343,30 +341,28 @@ impl I2S {
343
341
/// Transmits the given `tx_buffer`.
344
342
/// Returns a value that represents the in-progress DMA transfer.
345
343
#[ allow( unused_mut) ]
346
- pub fn tx < Word , B > ( mut self , buffer : core :: pin :: Pin < B > ) -> Result < Transfer < B > , Error >
344
+ pub fn tx < Word , B > ( mut self , buffer : B ) -> Result < Transfer < B > , Error >
347
345
where
348
346
Word : SupportedWordSize ,
349
- B : Deref + ' static ,
350
- B :: Target : AsRef < [ Word ] > + I2SBuffer ,
347
+ B : Deref + StableDeref + ' static + I2SBuffer ,
348
+ B :: Target : AsRef < [ Word ] > ,
351
349
{
352
- if ( buffer. as_ref ( ) . ptr ( ) as usize ) < SRAM_LOWER
353
- || ( buffer. as_ref ( ) . ptr ( ) as usize ) > SRAM_UPPER
354
- {
350
+ if ( buffer. ptr ( ) as usize ) < SRAM_LOWER || ( buffer. ptr ( ) as usize ) > SRAM_UPPER {
355
351
return Err ( Error :: DMABufferNotInDataMemory ) ;
356
352
}
357
353
358
- if buffer. as_ref ( ) . maxcnt ( ) > MAX_DMA_MAXCNT {
354
+ if buffer. maxcnt ( ) > MAX_DMA_MAXCNT {
359
355
return Err ( Error :: BufferTooLong ) ;
360
356
}
361
357
362
358
self . i2s
363
359
. txd
364
360
. ptr
365
- . write ( |w| unsafe { w. ptr ( ) . bits ( buffer. as_ref ( ) . ptr ( ) ) } ) ;
361
+ . write ( |w| unsafe { w. ptr ( ) . bits ( buffer. ptr ( ) ) } ) ;
366
362
self . i2s
367
363
. rxtxd
368
364
. maxcnt
369
- . write ( |w| unsafe { w. bits ( buffer. as_ref ( ) . maxcnt ( ) ) } ) ;
365
+ . write ( |w| unsafe { w. bits ( buffer. maxcnt ( ) ) } ) ;
370
366
371
367
Ok ( Transfer {
372
368
inner : Some ( Inner { buffer, i2s : self } ) ,
@@ -608,8 +604,68 @@ pub trait I2SBuffer: private::Sealed {
608
604
fn maxcnt ( & self ) -> u32 ;
609
605
}
610
606
611
- impl private:: Sealed for [ i8 ] { }
612
- impl I2SBuffer for [ i8 ] {
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 ] {
613
669
fn ptr ( & self ) -> u32 {
614
670
self . as_ptr ( ) as u32
615
671
}
@@ -618,8 +674,8 @@ impl I2SBuffer for [i8] {
618
674
}
619
675
}
620
676
621
- impl private:: Sealed for [ i16 ] { }
622
- impl I2SBuffer for [ i16 ] {
677
+ impl private:: Sealed for & mut [ i16 ] { }
678
+ impl I2SBuffer for & mut [ i16 ] {
623
679
fn ptr ( & self ) -> u32 {
624
680
self . as_ptr ( ) as u32
625
681
}
@@ -628,8 +684,8 @@ impl I2SBuffer for [i16] {
628
684
}
629
685
}
630
686
631
- impl private:: Sealed for [ i32 ] { }
632
- impl I2SBuffer for [ i32 ] {
687
+ impl private:: Sealed for & mut [ i32 ] { }
688
+ impl I2SBuffer for & mut [ i32 ] {
633
689
fn ptr ( & self ) -> u32 {
634
690
self . as_ptr ( ) as u32
635
691
}
@@ -638,8 +694,8 @@ impl I2SBuffer for [i32] {
638
694
}
639
695
}
640
696
641
- impl private:: Sealed for [ u8 ] { }
642
- impl I2SBuffer for [ u8 ] {
697
+ impl private:: Sealed for & mut [ u8 ] { }
698
+ impl I2SBuffer for & mut [ u8 ] {
643
699
fn ptr ( & self ) -> u32 {
644
700
self . as_ptr ( ) as u32
645
701
}
@@ -648,8 +704,8 @@ impl I2SBuffer for [u8] {
648
704
}
649
705
}
650
706
651
- impl private:: Sealed for [ u16 ] { }
652
- impl I2SBuffer for [ u16 ] {
707
+ impl private:: Sealed for & mut [ u16 ] { }
708
+ impl I2SBuffer for & mut [ u16 ] {
653
709
fn ptr ( & self ) -> u32 {
654
710
self . as_ptr ( ) as u32
655
711
}
@@ -658,8 +714,8 @@ impl I2SBuffer for [u16] {
658
714
}
659
715
}
660
716
661
- impl private:: Sealed for [ u32 ] { }
662
- impl I2SBuffer for [ u32 ] {
717
+ impl private:: Sealed for & mut [ u32 ] { }
718
+ impl I2SBuffer for & mut [ u32 ] {
663
719
fn ptr ( & self ) -> u32 {
664
720
self . as_ptr ( ) as u32
665
721
}
@@ -674,13 +730,13 @@ pub struct Transfer<B> {
674
730
}
675
731
676
732
struct Inner < B > {
677
- buffer : core :: pin :: Pin < B > ,
733
+ buffer : B ,
678
734
i2s : I2S ,
679
735
}
680
736
681
737
impl < B > Transfer < B > {
682
738
/// Blocks until the transfer is done and returns the buffer.
683
- pub fn wait ( mut self ) -> ( core :: pin :: Pin < B > , I2S ) {
739
+ pub fn wait ( mut self ) -> ( B , I2S ) {
684
740
let inner = self
685
741
. inner
686
742
. take ( )
@@ -707,14 +763,14 @@ pub struct TransferFullDuplex<TxB, RxB> {
707
763
}
708
764
709
765
struct InnerFullDuplex < TxB , RxB > {
710
- tx_buffer : core :: pin :: Pin < TxB > ,
711
- rx_buffer : core :: pin :: Pin < RxB > ,
766
+ tx_buffer : TxB ,
767
+ rx_buffer : RxB ,
712
768
i2s : I2S ,
713
769
}
714
770
715
771
impl < TxB , RxB > TransferFullDuplex < TxB , RxB > {
716
772
/// Blocks until the transfer is done and returns the buffer.
717
- pub fn wait ( mut self ) -> ( core :: pin :: Pin < TxB > , core :: pin :: Pin < RxB > , I2S ) {
773
+ pub fn wait ( mut self ) -> ( TxB , RxB , I2S ) {
718
774
let inner = self
719
775
. inner
720
776
. take ( )
0 commit comments