@@ -101,10 +101,12 @@ void uart_disarm_tx_interrupt(uart_t* uart);
101101void uart_set_baudrate (uart_t * uart, int baud_rate);
102102int uart_get_baudrate (uart_t * uart);
103103
104- uart_t * uart_start_init (int uart_nr, int baudrate, byte config);
104+ uart_t * uart_start_init (int uart_nr, int baudrate, byte config, uint8_t use_tx );
105105void uart_finish_init (uart_t * uart);
106106void uart_uninit (uart_t * uart);
107- void uart_swap (uart_t * uart);
107+ void uart_swap (uart_t * uart, uint8_t use_tx);
108+ void uart_set_tx (uart_t * uart, uint8_t use_tx);
109+ void uart_set_pins (uart_t * uart, uint8_t tx, uint8_t rx);
108110
109111void uart_ignore_char (char c);
110112void uart0_write_char (char c);
@@ -274,7 +276,7 @@ int uart_get_baudrate(uart_t* uart) {
274276 return uart->baud_rate ;
275277}
276278
277- uart_t * uart_start_init (int uart_nr, int baudrate, byte config, byte mode) {
279+ uart_t * uart_start_init (int uart_nr, int baudrate, byte config, byte mode, uint8_t use_tx ) {
278280
279281 uart_t * uart = (uart_t *) os_malloc (sizeof (uart_t ));
280282
@@ -289,8 +291,15 @@ uart_t* uart_start_init(int uart_nr, int baudrate, byte config, byte mode) {
289291 uart->rxEnabled = (mode != SERIAL_TX_ONLY);
290292 uart->txEnabled = (mode != SERIAL_RX_ONLY);
291293 uart->rxPin = (uart->rxEnabled )?3 :255 ;
292- uart->txPin = (uart->txEnabled )?1 :255 ;
293- if (uart->rxEnabled ) pinMode (uart->rxPin , SPECIAL);
294+ if (uart->rxEnabled ) {
295+ if (use_tx == 2 ) {
296+ uart->txPin = 2 ;
297+ pinMode (uart->rxPin , FUNCTION_4);
298+ } else {
299+ uart->txPin = 1 ;
300+ pinMode (uart->rxPin , SPECIAL);
301+ }
302+ } else uart->txPin = 255 ;
294303 if (uart->txEnabled ) pinMode (uart->txPin , SPECIAL);
295304 IOSWAP &= ~(1 << IOSWAPU0);
296305 break ;
@@ -299,7 +308,7 @@ uart_t* uart_start_init(int uart_nr, int baudrate, byte config, byte mode) {
299308 uart->rxEnabled = false ;
300309 uart->txEnabled = (mode != SERIAL_RX_ONLY);
301310 uart->rxPin = 255 ;
302- uart->txPin = (uart->txEnabled )?2 :255 ;
311+ uart->txPin = (uart->txEnabled )?2 :255 ; // GPIO7 as TX not possible! See GPIO pins used by UART
303312 if (uart->txEnabled ) pinMode (uart->txPin , SPECIAL);
304313 break ;
305314 case UART_NO:
@@ -360,46 +369,91 @@ void uart_uninit(uart_t* uart) {
360369 os_free (uart);
361370}
362371
363- void uart_swap (uart_t * uart) {
372+ void uart_swap (uart_t * uart, uint8_t use_tx ) {
364373 if (uart == 0 )
365374 return ;
366375 switch (uart->uart_nr ) {
367376 case UART0:
368- if ((uart->txPin == 1 && uart->txEnabled ) || (uart->rxPin == 3 && uart->rxEnabled )) {
369- if (uart->txEnabled ) pinMode (15 , FUNCTION_4); // TX
370- if (uart->rxEnabled ) pinMode (13 , FUNCTION_4); // RX
371- IOSWAP |= (1 << IOSWAPU0);
377+ if (((uart->txPin == 1 || uart->txPin == 2 ) && uart->txEnabled ) || (uart->rxPin == 3 && uart->rxEnabled )) {
372378 if (uart->txEnabled ){ // TX
373- pinMode (1 , INPUT);
379+ pinMode (uart-> txPin , INPUT);
374380 uart->txPin = 15 ;
375381 }
376382 if (uart->rxEnabled ){ // RX
377- pinMode (3 , INPUT);
383+ pinMode (uart-> rxPin , INPUT);
378384 uart->rxPin = 13 ;
379385 }
386+ if (uart->txEnabled ) pinMode (uart->txPin , FUNCTION_4); // TX
387+ if (uart->rxEnabled ) pinMode (uart->rxPin , FUNCTION_4); // RX
388+ IOSWAP |= (1 << IOSWAPU0);
380389 } else {
381- if (uart->txEnabled ) pinMode (1 , SPECIAL); // TX
382- if (uart->rxEnabled ) pinMode (3 , SPECIAL); // RX
383- IOSWAP &= ~(1 << IOSWAPU0);
384390 if (uart->txEnabled ){ // TX
385- pinMode (15 , INPUT);
386- uart->txPin = 1 ;
391+ pinMode (uart-> txPin , INPUT);
392+ uart->txPin = (use_tx == 2 )? 2 : 1 ;
387393 }
388394 if (uart->rxEnabled ){ // RX
389- pinMode (13 , INPUT); // RX
395+ pinMode (uart-> rxPin , INPUT);
390396 uart->rxPin = 3 ;
391397 }
398+ if (uart->txEnabled ) pinMode (uart->txPin , (use_tx == 2 )?FUNCTION_4:SPECIAL); // TX
399+ if (uart->rxEnabled ) pinMode (3 , SPECIAL); // RX
400+ IOSWAP &= ~(1 << IOSWAPU0);
401+ }
402+
403+ break ;
404+ case UART1:
405+ // Currently no swap possible! See GPIO pins used by UART
406+ break ;
407+ default :
408+ break ;
409+ }
410+ }
411+
412+ void uart_set_tx (uart_t * uart, uint8_t use_tx) {
413+ if (uart == 0 )
414+ return ;
415+ switch (uart->uart_nr ) {
416+ case UART0:
417+ if (uart->txEnabled ) {
418+ if (uart->txPin == 1 && use_tx == 2 ) {
419+ pinMode (uart->txPin , INPUT);
420+ uart->txPin = 2 ;
421+ pinMode (uart->txPin , FUNCTION_4);
422+ } else if (uart->txPin == 2 && use_tx != 2 ) {
423+ pinMode (uart->txPin , INPUT);
424+ uart->txPin = 1 ;
425+ pinMode (uart->txPin , SPECIAL);
426+ }
392427 }
393428
394429 break ;
395430 case UART1:
396- // current no swap possible! see GPIO pins used by UART
431+ // GPIO7 as TX not possible! See GPIO pins used by UART
397432 break ;
398433 default :
399434 break ;
400435 }
401436}
402437
438+ void uart_set_pins (uart_t * uart, uint8_t tx, uint8_t rx) {
439+ if (uart == 0 )
440+ return ;
441+
442+ if (uart->uart_nr == UART0) { // Only UART0 allows pin changes
443+ if (uart->txEnabled && uart->txPin != tx) {
444+ if ( rx == 13 && tx == 15 ) {
445+ uart_swap (uart, 15 );
446+ } else if (rx == 3 && (tx == 1 || tx == 2 )) {
447+ if (uart->rxPin != rx) uart_swap (uart, tx);
448+ else uart_set_tx (uart, tx);
449+ }
450+ }
451+ if (uart->rxEnabled && uart->rxPin != rx && rx == 13 && tx == 15 ) {
452+ uart_swap (uart, 15 );
453+ }
454+ }
455+ }
456+
403457// ####################################################################################################
404458// ####################################################################################################
405459// ####################################################################################################
@@ -488,7 +542,7 @@ HardwareSerial::HardwareSerial(int uart_nr) :
488542 _uart_nr(uart_nr), _uart(0 ), _tx_buffer(0 ), _rx_buffer(0 ) {
489543}
490544
491- void HardwareSerial::begin (unsigned long baud, byte config, byte mode) {
545+ void HardwareSerial::begin (unsigned long baud, byte config, byte mode, uint8_t use_tx ) {
492546 InterruptLock il;
493547
494548 // disable debug for this interface
@@ -499,7 +553,7 @@ void HardwareSerial::begin(unsigned long baud, byte config, byte mode) {
499553 if (_uart) {
500554 os_free (_uart);
501555 }
502- _uart = uart_start_init (_uart_nr, baud, config, mode);
556+ _uart = uart_start_init (_uart_nr, baud, config, mode, use_tx );
503557
504558 if (_uart == 0 ) {
505559 return ;
@@ -538,10 +592,22 @@ void HardwareSerial::end() {
538592 _tx_buffer = 0 ;
539593}
540594
541- void HardwareSerial::swap () {
595+ void HardwareSerial::swap (uint8_t use_tx) {
596+ if (_uart == 0 )
597+ return ;
598+ uart_swap (_uart, use_tx);
599+ }
600+
601+ void HardwareSerial::set_tx (uint8_t use_tx) {
602+ if (_uart == 0 )
603+ return ;
604+ uart_set_tx (_uart, use_tx);
605+ }
606+
607+ void HardwareSerial::pins (uint8_t tx, uint8_t rx) {
542608 if (_uart == 0 )
543609 return ;
544- uart_swap (_uart);
610+ uart_set_pins (_uart, tx, rx );
545611}
546612
547613void HardwareSerial::setDebugOutput (bool en) {
0 commit comments