@@ -725,57 +725,87 @@ void serial_rx_abort_asynch(serial_t *obj)
725
725
* Set HW Control Flow
726
726
* @param obj The serial object
727
727
* @param type The Control Flow type (FlowControlNone, FlowControlRTS, FlowControlCTS, FlowControlRTSCTS)
728
- * @param rxflow Pin for the rxflow
729
- * @param txflow Pin for the txflow
728
+ * @param pinmap Pointer to strucure which holds static pinmap
730
729
*/
731
- void serial_set_flow_control (serial_t * obj , FlowControl type , PinName rxflow , PinName txflow )
730
+ #if EXPLICIT_PINMAP_READY
731
+ #define SERIAL_SET_FC_DIRECT serial_set_flow_control_direct
732
+ void serial_set_flow_control_direct (serial_t * obj , FlowControl type , const serial_fc_pinmap_t * pinmap )
733
+ #else
734
+ #define SERIAL_SET_FC_DIRECT _serial_set_flow_control_direct
735
+ static void _serial_set_flow_control_direct (serial_t * obj , FlowControl type , const serial_fc_pinmap_t * pinmap )
736
+ #endif
732
737
{
733
738
struct serial_s * obj_s = SERIAL_S (obj );
734
739
735
- // Checked used UART name (UART_1, UART_2, ...)
736
- UARTName uart_rts = (UARTName )pinmap_peripheral (rxflow , PinMap_UART_RTS );
737
- UARTName uart_cts = (UARTName )pinmap_peripheral (txflow , PinMap_UART_CTS );
738
- if (((UARTName )pinmap_merge (uart_rts , obj_s -> uart ) == (UARTName )NC ) || ((UARTName )pinmap_merge (uart_cts , obj_s -> uart ) == (UARTName )NC )) {
739
- MBED_ASSERT (0 );
740
- return ;
741
- }
742
-
743
740
if (type == FlowControlNone ) {
744
741
// Disable hardware flow control
745
742
obj_s -> hw_flow_ctl = UART_HWCONTROL_NONE ;
746
743
}
747
744
if (type == FlowControlRTS ) {
748
745
// Enable RTS
749
- MBED_ASSERT (uart_rts != (UARTName )NC );
746
+ MBED_ASSERT (pinmap -> rx_flow_pin != (UARTName )NC );
750
747
obj_s -> hw_flow_ctl = UART_HWCONTROL_RTS ;
751
- obj_s -> pin_rts = rxflow ;
748
+ obj_s -> pin_rts = pinmap -> rx_flow_pin ;
752
749
// Enable the pin for RTS function
753
- pinmap_pinout (rxflow , PinMap_UART_RTS );
750
+ pin_function (pinmap -> rx_flow_pin , pinmap -> rx_flow_function );
751
+ pin_mode (pinmap -> rx_flow_pin , PullNone );
754
752
}
755
753
if (type == FlowControlCTS ) {
756
754
// Enable CTS
757
- MBED_ASSERT (uart_cts != (UARTName )NC );
755
+ MBED_ASSERT (pinmap -> tx_flow_pin != (UARTName )NC );
758
756
obj_s -> hw_flow_ctl = UART_HWCONTROL_CTS ;
759
- obj_s -> pin_cts = txflow ;
757
+ obj_s -> pin_cts = pinmap -> tx_flow_pin ;
760
758
// Enable the pin for CTS function
761
- pinmap_pinout (txflow , PinMap_UART_CTS );
759
+ pin_function (pinmap -> tx_flow_pin , pinmap -> tx_flow_function );
760
+ pin_mode (pinmap -> tx_flow_pin , PullNone );
762
761
}
763
762
if (type == FlowControlRTSCTS ) {
764
763
// Enable CTS & RTS
765
- MBED_ASSERT (uart_rts != (UARTName )NC );
766
- MBED_ASSERT (uart_cts != (UARTName )NC );
764
+ MBED_ASSERT (pinmap -> rx_flow_pin != (UARTName )NC );
765
+ MBED_ASSERT (pinmap -> tx_flow_pin != (UARTName )NC );
767
766
obj_s -> hw_flow_ctl = UART_HWCONTROL_RTS_CTS ;
768
- obj_s -> pin_rts = rxflow ;
769
- obj_s -> pin_cts = txflow ;
767
+ obj_s -> pin_rts = pinmap -> rx_flow_pin ; ;
768
+ obj_s -> pin_cts = pinmap -> tx_flow_pin ; ;
770
769
// Enable the pin for CTS function
771
- pinmap_pinout (txflow , PinMap_UART_CTS );
770
+ pin_function (pinmap -> tx_flow_pin , pinmap -> tx_flow_function );
771
+ pin_mode (pinmap -> tx_flow_pin , PullNone );
772
772
// Enable the pin for RTS function
773
- pinmap_pinout (rxflow , PinMap_UART_RTS );
773
+ pin_function (pinmap -> rx_flow_pin , pinmap -> rx_flow_function );
774
+ pin_mode (pinmap -> rx_flow_pin , PullNone );
774
775
}
775
776
776
777
init_uart (obj );
777
778
}
778
779
780
+ /**
781
+ * Set HW Control Flow
782
+ * @param obj The serial object
783
+ * @param type The Control Flow type (FlowControlNone, FlowControlRTS, FlowControlCTS, FlowControlRTSCTS)
784
+ * @param rxflow Pin for the rxflow
785
+ * @param txflow Pin for the txflow
786
+ */
787
+ void serial_set_flow_control (serial_t * obj , FlowControl type , PinName rxflow , PinName txflow )
788
+ {
789
+ struct serial_s * obj_s = SERIAL_S (obj );
790
+
791
+ UARTName uart_rts = (UARTName )pinmap_peripheral (rxflow , PinMap_UART_RTS );
792
+ UARTName uart_cts = (UARTName )pinmap_peripheral (txflow , PinMap_UART_CTS );
793
+
794
+ if (((UARTName )pinmap_merge (uart_rts , obj_s -> uart ) == (UARTName )NC ) || ((UARTName )pinmap_merge (uart_cts , obj_s -> uart ) == (UARTName )NC )) {
795
+ MBED_ASSERT (0 );
796
+ return ;
797
+ }
798
+
799
+ int peripheral = (int )pinmap_merge (uart_rts , uart_cts );
800
+
801
+ int tx_flow_function = (int )pinmap_find_function (txflow , PinMap_UART_CTS );
802
+ int rx_flow_function = (int )pinmap_find_function (rxflow , PinMap_UART_RTS );
803
+
804
+ const serial_fc_pinmap_t explicit_uart_fc_pinmap = {peripheral , txflow , tx_flow_function , rxflow , rx_flow_function };
805
+
806
+ SERIAL_SET_FC_DIRECT (obj , type , & explicit_uart_fc_pinmap );
807
+ }
808
+
779
809
#endif /* DEVICE_SERIAL_FC */
780
810
781
811
#endif /* DEVICE_SERIAL */
0 commit comments