@@ -121,16 +121,25 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
121121 USART_TypeDef * uart_rx = pinmap_peripheral (obj -> pin_rx , PinMap_UART_RX );
122122 USART_TypeDef * uart_rts = pinmap_peripheral (obj -> pin_rts , PinMap_UART_RTS );
123123 USART_TypeDef * uart_cts = pinmap_peripheral (obj -> pin_cts , PinMap_UART_CTS );
124+ /* Check if pins are swapped */
125+ #if defined(UART_ADVFEATURE_SWAP_INIT )
126+ USART_TypeDef * uart_tx_swap = pinmap_peripheral (obj -> pin_tx , PinMap_UART_RX );
127+ USART_TypeDef * uart_rx_swap = pinmap_peripheral (obj -> pin_rx , PinMap_UART_TX );
128+ #else
129+ /* Pin swap not supported */
130+ USART_TypeDef * uart_tx_swap = NP ;
131+ USART_TypeDef * uart_rx_swap = NP ;
132+ #endif
124133
125134 /* Pin Tx must not be NP */
126- if (uart_tx == NP ) {
135+ if (( uart_tx == NP ) && ( uart_tx_swap == NP ) ) {
127136 if (obj != & serial_debug ) {
128137 core_debug ("ERROR: [U(S)ART] Tx pin has no peripheral!\n" );
129138 }
130139 return ;
131140 }
132141 /* Pin Rx must not be NP if not half-duplex */
133- if ((obj -> pin_rx != NC ) && (uart_rx == NP )) {
142+ if ((obj -> pin_rx != NC ) && (uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
134143 if (obj != & serial_debug ) {
135144 core_debug ("ERROR: [U(S)ART] Rx pin has no peripheral!\n" );
136145 }
@@ -156,6 +165,10 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
156165 * and assign it to the object
157166 */
158167 obj -> uart = pinmap_merge_peripheral (uart_tx , uart_rx );
168+ if (obj -> uart == NP ) {
169+ /* Regular pins not matched, check if they can be swapped */
170+ obj -> uart = pinmap_merge_peripheral (uart_tx_swap , uart_rx_swap );
171+ }
159172 /* We also merge RTS/CTS and assert all pins belong to the same instance */
160173 obj -> uart = pinmap_merge_peripheral (obj -> uart , uart_rts );
161174 obj -> uart = pinmap_merge_peripheral (obj -> uart , uart_cts );
@@ -328,10 +341,26 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
328341#endif
329342
330343 /* Configure UART GPIO pins */
331- pinmap_pinout (obj -> pin_tx , PinMap_UART_TX );
332- if (uart_rx != NP ) {
333- pinmap_pinout (obj -> pin_rx , PinMap_UART_RX );
344+ #if defined(UART_ADVFEATURE_SWAP_INIT )
345+ uint32_t pin_swap = UART_ADVFEATURE_SWAP_DISABLE ;
346+ #endif
347+ if (uart_tx != NP ) {
348+ /* Regular GPIO */
349+ pinmap_pinout (obj -> pin_tx , PinMap_UART_TX );
350+ if (uart_rx != NP ) {
351+ pinmap_pinout (obj -> pin_rx , PinMap_UART_RX );
352+ }
353+ }
354+ #if defined(UART_ADVFEATURE_SWAP_INIT )
355+ else if (uart_tx_swap != NP ) {
356+ /* Swapped GPIO */
357+ pinmap_pinout (obj -> pin_tx , PinMap_UART_RX );
358+ if (uart_rx_swap != NP ) {
359+ pinmap_pinout (obj -> pin_rx , PinMap_UART_TX );
360+ }
361+ pin_swap = UART_ADVFEATURE_SWAP_ENABLE ;
334362 }
363+ #endif
335364
336365 /* Configure flow control */
337366 uint32_t flow_control = UART_HWCONTROL_NONE ;
@@ -354,8 +383,10 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
354383 huart -> Init .Mode = UART_MODE_TX_RX ;
355384 huart -> Init .HwFlowCtl = flow_control ;
356385 huart -> Init .OverSampling = UART_OVERSAMPLING_16 ;
357- #if !defined(STM32F1xx ) && !defined(STM32F2xx ) && !defined(STM32F4xx )\
358- && !defined(STM32L1xx )
386+ #if defined(UART_ADVFEATURE_SWAP_INIT )
387+ huart -> AdvancedInit .AdvFeatureInit = UART_ADVFEATURE_SWAP_INIT ;
388+ huart -> AdvancedInit .Swap = pin_swap ;
389+ #elif defined(UART_ADVFEATURE_NO_INIT )
359390 huart -> AdvancedInit .AdvFeatureInit = UART_ADVFEATURE_NO_INIT ;
360391#endif
361392#ifdef UART_ONE_BIT_SAMPLE_DISABLE
@@ -391,7 +422,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
391422 HAL_UARTEx_DisableStopMode (huart );
392423 }
393424 /* Trying default LPUART clock source */
394- if (uart_rx == NP ) {
425+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
395426 if (HAL_HalfDuplex_Init (huart ) == HAL_OK ) {
396427 return ;
397428 }
@@ -416,7 +447,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
416447 __HAL_RCC_LPUART3_CONFIG (RCC_LPUART3CLKSOURCE_LSE );
417448 }
418449#endif
419- if (uart_rx == NP ) {
450+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
420451 if (HAL_HalfDuplex_Init (huart ) == HAL_OK ) {
421452 return ;
422453 }
@@ -438,7 +469,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
438469 __HAL_RCC_LPUART3_CONFIG (RCC_LPUART3CLKSOURCE_HSI );
439470 }
440471#endif
441- if (uart_rx == NP ) {
472+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
442473 if (HAL_HalfDuplex_Init (huart ) == HAL_OK ) {
443474 return ;
444475 }
@@ -465,7 +496,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
465496 __HAL_RCC_LPUART3_CONFIG (RCC_LPUART3CLKSOURCE_PCLK1 );
466497 }
467498#endif
468- if (uart_rx == NP ) {
499+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
469500 if (HAL_HalfDuplex_Init (huart ) == HAL_OK ) {
470501 return ;
471502 }
@@ -490,7 +521,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
490521 }
491522#endif
492523
493- if (uart_rx == NP ) {
524+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
494525 if (HAL_HalfDuplex_Init (huart ) != HAL_OK ) {
495526 return ;
496527 }
0 commit comments