1
1
//! BDMA
2
+ //!
3
+ //! For RM0455 parts, only BDMA2 is implemented
2
4
3
5
use super :: {
4
6
config,
@@ -10,17 +12,30 @@ use core::marker::PhantomData;
10
12
11
13
use crate :: {
12
14
i2c:: I2c ,
13
- pac:: { self , BDMA , DMAMUX2 } ,
15
+ pac,
14
16
rcc:: { rec, rec:: ResetEnable } ,
15
17
//serial::{Rx, Tx},
18
+ spi,
16
19
} ;
17
20
21
+ #[ cfg( not( feature = "rm0455" ) ) ]
22
+ use crate :: pac:: { BDMA , DMAMUX2 } ;
23
+
24
+ #[ cfg( feature = "rm0455" ) ]
25
+ use crate :: pac:: { BDMA2 , DMAMUX2 } ;
26
+
18
27
use core:: ops:: Deref ;
19
28
29
+ #[ cfg( not( feature = "rm0455" ) ) ]
20
30
impl Sealed for BDMA { }
31
+ #[ cfg( feature = "rm0455" ) ]
32
+ impl Sealed for BDMA2 { }
21
33
22
34
/// Type aliases for register blocks
35
+ #[ cfg( not( feature = "rm0455" ) ) ]
23
36
pub type BDMARegisterBlock = pac:: bdma:: RegisterBlock ;
37
+ #[ cfg( feature = "rm0455" ) ]
38
+ pub type BDMARegisterBlock = pac:: bdma2:: RegisterBlock ;
24
39
pub type DMAMUXRegisterBlock = pac:: dmamux2:: RegisterBlock ;
25
40
26
41
/// Trait that represents an instance of a BDMA peripheral
@@ -36,6 +51,7 @@ pub trait Instance: Deref<Target = BDMARegisterBlock> + Sealed {
36
51
const DMA_MUX_STREAM_OFFSET : usize ;
37
52
}
38
53
54
+ #[ cfg( not( feature = "rm0455" ) ) ]
39
55
impl Instance for BDMA {
40
56
type Rec = rec:: Bdma ;
41
57
@@ -52,6 +68,23 @@ impl Instance for BDMA {
52
68
const DMA_MUX_STREAM_OFFSET : usize = 0 ;
53
69
}
54
70
71
+ #[ cfg( feature = "rm0455" ) ]
72
+ impl Instance for BDMA2 {
73
+ type Rec = rec:: Bdma ;
74
+
75
+ #[ inline( always) ]
76
+ fn ptr ( ) -> * const BDMARegisterBlock {
77
+ BDMA2 :: ptr ( )
78
+ }
79
+
80
+ #[ inline( always) ]
81
+ fn mux_ptr ( ) -> * const DMAMUXRegisterBlock {
82
+ DMAMUX2 :: ptr ( )
83
+ }
84
+
85
+ const DMA_MUX_STREAM_OFFSET : usize = 0 ;
86
+ }
87
+
55
88
/// BDMA interrupts
56
89
#[ derive( Debug , Clone , Copy ) ]
57
90
pub struct BdmaInterrupts {
@@ -562,20 +595,46 @@ bdma_stream!(
562
595
) ;
563
596
564
597
/// Type alias for the DMA Request Multiplexer
598
+ ///
599
+ /// TODO: Needs fixing upstream for RM0455
600
+ #[ cfg( not( feature = "rm0455" ) ) ]
565
601
pub type DMAReq = pac:: dmamux2:: ccr:: DMAREQ_ID_A ;
566
602
567
603
type P2M = PeripheralToMemory ;
568
604
type M2P = MemoryToPeripheral ;
569
605
606
+ #[ cfg( not( feature = "rm0455" ) ) ]
570
607
peripheral_target_address ! (
571
608
( pac:: LPUART1 , rdr, u8 , P2M , DMAReq :: LPUART1_RX_DMA ) ,
572
609
( pac:: LPUART1 , tdr, u8 , M2P , DMAReq :: LPUART1_TX_DMA ) ,
573
- ( pac:: SPI6 , rxdr, u8 , P2M , DMAReq :: SPI6_RX_DMA ) ,
574
- ( pac:: SPI6 , txdr, u8 , M2P , DMAReq :: SPI6_TX_DMA ) ,
610
+ (
611
+ SPI : pac:: SPI6 ,
612
+ rxdr,
613
+ txdr,
614
+ [ u8 , u16 ] ,
615
+ DMAReq :: SPI6_RX_DMA ,
616
+ DMAReq :: SPI6_TX_DMA
617
+ ) ,
575
618
( pac:: I2C4 , rxdr, u8 , P2M , DMAReq :: I2C4_RX_DMA ) ,
576
619
( pac:: I2C4 , txdr, u8 , M2P , DMAReq :: I2C4_TX_DMA ) ,
577
620
( INNER : I2c <pac:: I2C4 >, rxdr, u8 , P2M , DMAReq :: I2C4_RX_DMA ) ,
578
621
( INNER : I2c <pac:: I2C4 >, txdr, u8 , M2P , DMAReq :: I2C4_TX_DMA ) ,
622
+ ) ;
623
+
624
+ #[ cfg( not( feature = "rm0455" ) ) ]
625
+ peripheral_target_address ! (
579
626
( pac:: SAI4 , cha. dr, u32 , M2P , DMAReq :: SAI4_A_DMA ) ,
580
627
( pac:: SAI4 , chb. dr, u32 , P2M , DMAReq :: SAI4_B_DMA ) ,
581
628
) ;
629
+
630
+ // TODO: Remove when fixed upstream
631
+ #[ cfg( feature = "rm0455" ) ]
632
+ peripheral_target_address ! (
633
+ ( pac:: LPUART1 , rdr, u8 , P2M , 9 ) ,
634
+ ( pac:: LPUART1 , tdr, u8 , M2P , 10 ) ,
635
+ ( SPI : pac:: SPI6 , rxdr, txdr, [ u8 , u16 ] , 11 , 12 ) ,
636
+ ( pac:: I2C4 , rxdr, u8 , P2M , 13 ) ,
637
+ ( pac:: I2C4 , txdr, u8 , M2P , 14 ) ,
638
+ ( INNER : I2c <pac:: I2C4 >, rxdr, u8 , P2M , 13 ) ,
639
+ ( INNER : I2c <pac:: I2C4 >, txdr, u8 , M2P , 14 ) ,
640
+ ) ;
0 commit comments