@@ -146,7 +146,8 @@ impl<'d, M: Mode> UsartTx<'d, M> {
146146 tx_dma : Peri < ' d , impl Channel > ,
147147 config : Config ,
148148 ) -> Self {
149- Usart :: < M > :: init :: < T > ( Some ( tx. into ( ) ) , None , config) ;
149+ let tx_func = tx. pin_func ( ) ;
150+ Usart :: < M > :: init :: < T > ( Some ( ( tx. into ( ) , tx_func) ) , None , config) ;
150151 Self :: new_inner ( T :: info ( ) , Some ( tx_dma. into ( ) ) )
151152 }
152153
@@ -179,7 +180,8 @@ impl<'d, M: Mode> UsartTx<'d, M> {
179180
180181impl < ' d > UsartTx < ' d , Blocking > {
181182 pub fn new_blocking < T : Instance > ( _usart : Peri < ' d , T > , tx : Peri < ' d , impl TxPin < T > > , config : Config ) -> Self {
182- Usart :: < Blocking > :: init :: < T > ( Some ( tx. into ( ) ) , None , config) ;
183+ let tx_func = tx. pin_func ( ) ;
184+ Usart :: < Blocking > :: init :: < T > ( Some ( ( tx. into ( ) , tx_func) ) , None , config) ;
183185 Self :: new_inner ( T :: info ( ) , None )
184186 }
185187}
@@ -208,7 +210,8 @@ impl<'d, M: Mode> UsartRx<'d, M> {
208210 rx_dma : Peri < ' d , impl Channel > ,
209211 config : Config ,
210212 ) -> Self {
211- Usart :: < M > :: init :: < T > ( None , Some ( rx. into ( ) ) , config) ;
213+ let rx_func = rx. pin_func ( ) ;
214+ Usart :: < M > :: init :: < T > ( None , Some ( ( rx. into ( ) , rx_func) ) , config) ;
212215 Self :: new_inner ( T :: info ( ) , T :: dma_state ( ) , has_irq, Some ( rx_dma. into ( ) ) )
213216 }
214217
@@ -280,7 +283,8 @@ impl<'d, M: Mode> UsartRx<'d, M> {
280283
281284impl < ' d > UsartRx < ' d , Blocking > {
282285 pub fn new_blocking < T : Instance > ( _usart : Peri < ' d , T > , rx : Peri < ' d , impl RxPin < T > > , config : Config ) -> Self {
283- Usart :: < Blocking > :: init :: < T > ( None , Some ( rx. into ( ) ) , config) ;
286+ let rx_func = rx. pin_func ( ) ;
287+ Usart :: < Blocking > :: init :: < T > ( None , Some ( ( rx. into ( ) , rx_func) ) , config) ;
284288 Self :: new_inner ( T :: info ( ) , T :: dma_state ( ) , false , None )
285289 }
286290}
@@ -405,7 +409,10 @@ impl<'d> Usart<'d, Blocking> {
405409 rx : Peri < ' d , impl RxPin < T > > ,
406410 config : Config ,
407411 ) -> Self {
408- Self :: new_inner ( usart, tx. into ( ) , rx. into ( ) , false , None , None , config)
412+ let tx_func = tx. pin_func ( ) ;
413+ let rx_func = rx. pin_func ( ) ;
414+
415+ Self :: new_inner ( usart, tx. into ( ) , tx_func, rx. into ( ) , rx_func, false , None , None , config)
409416 }
410417}
411418
@@ -419,10 +426,15 @@ impl<'d> Usart<'d, Async> {
419426 rx_dma : Peri < ' d , impl RxChannel < T > > ,
420427 config : Config ,
421428 ) -> Self {
429+ let tx_func = tx. pin_func ( ) ;
430+ let rx_func = rx. pin_func ( ) ;
431+
422432 Self :: new_inner (
423433 uart,
424434 tx. into ( ) ,
435+ tx_func,
425436 rx. into ( ) ,
437+ rx_func,
426438 true ,
427439 Some ( tx_dma. into ( ) ) ,
428440 Some ( rx_dma. into ( ) ) ,
@@ -435,20 +447,26 @@ impl<'d, M: Mode> Usart<'d, M> {
435447 fn new_inner < T : Instance > (
436448 _usart : Peri < ' d , T > ,
437449 mut tx : Peri < ' d , AnyPin > ,
450+ tx_func : PioFunc ,
438451 mut rx : Peri < ' d , AnyPin > ,
452+ rx_func : PioFunc ,
439453 has_irq : bool ,
440454 tx_dma : Option < Peri < ' d , AnyChannel > > ,
441455 rx_dma : Option < Peri < ' d , AnyChannel > > ,
442456 config : Config ,
443457 ) -> Self {
444- Self :: init :: < T > ( Some ( tx. reborrow ( ) ) , Some ( rx. reborrow ( ) ) , config) ;
458+ Self :: init :: < T > ( Some ( ( tx. reborrow ( ) , tx_func ) ) , Some ( ( rx. reborrow ( ) , rx_func ) ) , config) ;
445459 Self {
446460 tx : UsartTx :: new_inner ( T :: info ( ) , tx_dma) ,
447461 rx : UsartRx :: new_inner ( T :: info ( ) , T :: dma_state ( ) , has_irq, rx_dma) ,
448462 }
449463 }
450464
451- fn init < T : Instance > ( tx : Option < Peri < ' _ , AnyPin > > , rx : Option < Peri < ' _ , AnyPin > > , config : Config ) {
465+ fn init < T : Instance > (
466+ tx : Option < ( Peri < ' _ , AnyPin > , PioFunc ) > ,
467+ rx : Option < ( Peri < ' _ , AnyPin > , PioFunc ) > ,
468+ config : Config ,
469+ ) {
452470 Self :: configure_flexcomm ( T :: info ( ) . fc_reg , T :: instance_number ( ) ) ;
453471 Self :: configure_clock :: < T > ( & config) ;
454472 Self :: pin_config :: < T > ( tx, rx) ;
@@ -553,10 +571,10 @@ impl<'d, M: Mode> Usart<'d, M> {
553571 . modify ( |w| w. set_brgval ( ( brg_value - 1 ) as u16 ) ) ;
554572 }
555573
556- fn pin_config < T : Instance > ( tx : Option < Peri < ' _ , AnyPin > > , rx : Option < Peri < ' _ , AnyPin > > ) {
557- if let Some ( tx_pin) = tx {
574+ fn pin_config < T : Instance > ( tx : Option < ( Peri < ' _ , AnyPin > , PioFunc ) > , rx : Option < ( Peri < ' _ , AnyPin > , PioFunc ) > ) {
575+ if let Some ( ( tx_pin, func ) ) = tx {
558576 tx_pin. pio ( ) . modify ( |w| {
559- w. set_func ( T :: tx_pin_func ( ) ) ;
577+ w. set_func ( func ) ;
560578 w. set_mode ( iocon:: vals:: PioMode :: INACTIVE ) ;
561579 w. set_slew ( iocon:: vals:: PioSlew :: STANDARD ) ;
562580 w. set_invert ( false ) ;
@@ -565,9 +583,9 @@ impl<'d, M: Mode> Usart<'d, M> {
565583 } ) ;
566584 }
567585
568- if let Some ( rx_pin) = rx {
586+ if let Some ( ( rx_pin, func ) ) = rx {
569587 rx_pin. pio ( ) . modify ( |w| {
570- w. set_func ( T :: rx_pin_func ( ) ) ;
588+ w. set_func ( func ) ;
571589 w. set_mode ( iocon:: vals:: PioMode :: INACTIVE ) ;
572590 w. set_slew ( iocon:: vals:: PioSlew :: STANDARD ) ;
573591 w. set_invert ( false ) ;
@@ -810,8 +828,6 @@ trait SealedInstance {
810828 fn info ( ) -> & ' static Info ;
811829 fn dma_state ( ) -> & ' static DmaState ;
812830 fn instance_number ( ) -> usize ;
813- fn tx_pin_func ( ) -> PioFunc ;
814- fn rx_pin_func ( ) -> PioFunc ;
815831}
816832
817833/// UART instance.
@@ -822,7 +838,7 @@ pub trait Instance: SealedInstance + PeripheralType {
822838}
823839
824840macro_rules! impl_instance {
825- ( $inst: ident, $fc: ident, $tx_pin : ident , $rx_pin : ident , $ fc_num: expr) => {
841+ ( $inst: ident, $fc: ident, $fc_num: expr) => {
826842 impl $crate:: usart:: inner:: SealedInstance for $crate:: peripherals:: $inst {
827843 fn info( ) -> & ' static Info {
828844 static INFO : Info = Info {
@@ -844,60 +860,79 @@ macro_rules! impl_instance {
844860 fn instance_number( ) -> usize {
845861 $fc_num
846862 }
847- #[ inline]
848- fn tx_pin_func( ) -> PioFunc {
849- PioFunc :: $tx_pin
850- }
851- #[ inline]
852- fn rx_pin_func( ) -> PioFunc {
853- PioFunc :: $rx_pin
854- }
855863 }
856864 impl $crate:: usart:: Instance for $crate:: peripherals:: $inst {
857865 type Interrupt = crate :: interrupt:: typelevel:: $fc;
858866 }
859867 } ;
860868}
861869
862- impl_instance ! ( USART0 , FLEXCOMM0 , ALT1 , ALT1 , 0 ) ;
863- impl_instance ! ( USART1 , FLEXCOMM1 , ALT2 , ALT2 , 1 ) ;
864- impl_instance ! ( USART2 , FLEXCOMM2 , ALT1 , ALT1 , 2 ) ;
865- impl_instance ! ( USART3 , FLEXCOMM3 , ALT1 , ALT1 , 3 ) ;
866- impl_instance ! ( USART4 , FLEXCOMM4 , ALT1 , ALT2 , 4 ) ;
867- impl_instance ! ( USART5 , FLEXCOMM5 , ALT3 , ALT3 , 5 ) ;
868- impl_instance ! ( USART6 , FLEXCOMM6 , ALT2 , ALT2 , 6 ) ;
869- impl_instance ! ( USART7 , FLEXCOMM7 , ALT7 , ALT7 , 7 ) ;
870+ impl_instance ! ( USART0 , FLEXCOMM0 , 0 ) ;
871+ impl_instance ! ( USART1 , FLEXCOMM1 , 1 ) ;
872+ impl_instance ! ( USART2 , FLEXCOMM2 , 2 ) ;
873+ impl_instance ! ( USART3 , FLEXCOMM3 , 3 ) ;
874+ impl_instance ! ( USART4 , FLEXCOMM4 , 4 ) ;
875+ impl_instance ! ( USART5 , FLEXCOMM5 , 5 ) ;
876+ impl_instance ! ( USART6 , FLEXCOMM6 , 6 ) ;
877+ impl_instance ! ( USART7 , FLEXCOMM7 , 7 ) ;
878+
879+ pub ( crate ) trait SealedTxPin < T : Instance > : crate :: gpio:: Pin {
880+ fn pin_func ( & self ) -> PioFunc ;
881+ }
882+
883+ pub ( crate ) trait SealedRxPin < T : Instance > : crate :: gpio:: Pin {
884+ fn pin_func ( & self ) -> PioFunc ;
885+ }
870886
871887/// Trait for TX pins.
872- pub trait TxPin < T : Instance > : crate :: gpio:: Pin { }
888+ #[ allow( private_bounds) ]
889+ pub trait TxPin < T : Instance > : SealedTxPin < T > + crate :: gpio:: Pin { }
890+
873891/// Trait for RX pins.
874- pub trait RxPin < T : Instance > : crate :: gpio:: Pin { }
892+ #[ allow( private_bounds) ]
893+ pub trait RxPin < T : Instance > : SealedRxPin < T > + crate :: gpio:: Pin { }
894+
895+ macro_rules! impl_tx_pin {
896+ ( $pin: ident, $instance: ident, $func: ident) => {
897+ impl SealedTxPin <crate :: peripherals:: $instance> for crate :: peripherals:: $pin {
898+ fn pin_func( & self ) -> PioFunc {
899+ PioFunc :: $func
900+ }
901+ }
875902
876- macro_rules! impl_pin {
877- ( $pin: ident, $instance: ident, Tx ) => {
878903 impl TxPin <crate :: peripherals:: $instance> for crate :: peripherals:: $pin { }
879904 } ;
880- ( $pin: ident, $instance: ident, Rx ) => {
905+ }
906+
907+ macro_rules! impl_rx_pin {
908+ ( $pin: ident, $instance: ident, $func: ident) => {
909+ impl SealedRxPin <crate :: peripherals:: $instance> for crate :: peripherals:: $pin {
910+ fn pin_func( & self ) -> PioFunc {
911+ PioFunc :: $func
912+ }
913+ }
914+
881915 impl RxPin <crate :: peripherals:: $instance> for crate :: peripherals:: $pin { }
882916 } ;
883917}
884918
885- impl_pin ! ( PIO1_6 , USART0 , Tx ) ;
886- impl_pin ! ( PIO1_5 , USART0 , Rx ) ;
887- impl_pin ! ( PIO1_11 , USART1 , Tx ) ;
888- impl_pin ! ( PIO1_10 , USART1 , Rx ) ;
889- impl_pin ! ( PIO0_27 , USART2 , Tx ) ;
890- impl_pin ! ( PIO1_24 , USART2 , Rx ) ;
891- impl_pin ! ( PIO0_2 , USART3 , Tx ) ;
892- impl_pin ! ( PIO0_3 , USART3 , Rx ) ;
893- impl_pin ! ( PIO0_16 , USART4 , Tx ) ;
894- impl_pin ! ( PIO0_5 , USART4 , Rx ) ;
895- impl_pin ! ( PIO0_9 , USART5 , Tx ) ;
896- impl_pin ! ( PIO0_8 , USART5 , Rx ) ;
897- impl_pin ! ( PIO1_16 , USART6 , Tx ) ;
898- impl_pin ! ( PIO1_13 , USART6 , Rx ) ;
899- impl_pin ! ( PIO0_19 , USART7 , Tx ) ;
900- impl_pin ! ( PIO0_20 , USART7 , Rx ) ;
919+ impl_tx_pin ! ( PIO1_6 , USART0 , ALT1 ) ;
920+ impl_tx_pin ! ( PIO1_11 , USART1 , ALT2 ) ;
921+ impl_tx_pin ! ( PIO0_27 , USART2 , ALT1 ) ;
922+ impl_tx_pin ! ( PIO0_2 , USART3 , ALT1 ) ;
923+ impl_tx_pin ! ( PIO0_16 , USART4 , ALT1 ) ;
924+ impl_tx_pin ! ( PIO0_9 , USART5 , ALT3 ) ;
925+ impl_tx_pin ! ( PIO1_16 , USART6 , ALT2 ) ;
926+ impl_tx_pin ! ( PIO0_19 , USART7 , ALT7 ) ;
927+
928+ impl_rx_pin ! ( PIO1_5 , USART0 , ALT1 ) ;
929+ impl_rx_pin ! ( PIO1_10 , USART1 , ALT2 ) ;
930+ impl_rx_pin ! ( PIO1_24 , USART2 , ALT1 ) ;
931+ impl_rx_pin ! ( PIO0_3 , USART3 , ALT1 ) ;
932+ impl_rx_pin ! ( PIO0_5 , USART4 , ALT2 ) ;
933+ impl_rx_pin ! ( PIO0_8 , USART5 , ALT3 ) ;
934+ impl_rx_pin ! ( PIO1_13 , USART6 , ALT2 ) ;
935+ impl_rx_pin ! ( PIO0_20 , USART7 , ALT7 ) ;
901936
902937/// Trait for TX DMA channels.
903938pub trait TxChannel < T : Instance > : crate :: dma:: Channel { }
0 commit comments