@@ -101,10 +101,12 @@ void uart_disarm_tx_interrupt(uart_t* uart);
101
101
void uart_set_baudrate (uart_t * uart, int baud_rate);
102
102
int uart_get_baudrate (uart_t * uart);
103
103
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 );
105
105
void uart_finish_init (uart_t * uart);
106
106
void 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);
108
110
109
111
void uart_ignore_char (char c);
110
112
void uart0_write_char (char c);
@@ -274,7 +276,7 @@ int uart_get_baudrate(uart_t* uart) {
274
276
return uart->baud_rate ;
275
277
}
276
278
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 ) {
278
280
279
281
uart_t * uart = (uart_t *) os_malloc (sizeof (uart_t ));
280
282
@@ -289,8 +291,15 @@ uart_t* uart_start_init(int uart_nr, int baudrate, byte config, byte mode) {
289
291
uart->rxEnabled = (mode != SERIAL_TX_ONLY);
290
292
uart->txEnabled = (mode != SERIAL_RX_ONLY);
291
293
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 ;
294
303
if (uart->txEnabled ) pinMode (uart->txPin , SPECIAL);
295
304
IOSWAP &= ~(1 << IOSWAPU0);
296
305
break ;
@@ -299,7 +308,7 @@ uart_t* uart_start_init(int uart_nr, int baudrate, byte config, byte mode) {
299
308
uart->rxEnabled = false ;
300
309
uart->txEnabled = (mode != SERIAL_RX_ONLY);
301
310
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
303
312
if (uart->txEnabled ) pinMode (uart->txPin , SPECIAL);
304
313
break ;
305
314
case UART_NO:
@@ -360,46 +369,91 @@ void uart_uninit(uart_t* uart) {
360
369
os_free (uart);
361
370
}
362
371
363
- void uart_swap (uart_t * uart) {
372
+ void uart_swap (uart_t * uart, uint8_t use_tx ) {
364
373
if (uart == 0 )
365
374
return ;
366
375
switch (uart->uart_nr ) {
367
376
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 )) {
372
378
if (uart->txEnabled ){ // TX
373
- pinMode (1 , INPUT);
379
+ pinMode (uart-> txPin , INPUT);
374
380
uart->txPin = 15 ;
375
381
}
376
382
if (uart->rxEnabled ){ // RX
377
- pinMode (3 , INPUT);
383
+ pinMode (uart-> rxPin , INPUT);
378
384
uart->rxPin = 13 ;
379
385
}
386
+ if (uart->txEnabled ) pinMode (uart->txPin , FUNCTION_4); // TX
387
+ if (uart->rxEnabled ) pinMode (uart->rxPin , FUNCTION_4); // RX
388
+ IOSWAP |= (1 << IOSWAPU0);
380
389
} else {
381
- if (uart->txEnabled ) pinMode (1 , SPECIAL); // TX
382
- if (uart->rxEnabled ) pinMode (3 , SPECIAL); // RX
383
- IOSWAP &= ~(1 << IOSWAPU0);
384
390
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 ;
387
393
}
388
394
if (uart->rxEnabled ){ // RX
389
- pinMode (13 , INPUT); // RX
395
+ pinMode (uart-> rxPin , INPUT);
390
396
uart->rxPin = 3 ;
391
397
}
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
+ }
392
427
}
393
428
394
429
break ;
395
430
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
397
432
break ;
398
433
default :
399
434
break ;
400
435
}
401
436
}
402
437
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
+
403
457
// ####################################################################################################
404
458
// ####################################################################################################
405
459
// ####################################################################################################
@@ -488,7 +542,7 @@ HardwareSerial::HardwareSerial(int uart_nr) :
488
542
_uart_nr(uart_nr), _uart(0 ), _tx_buffer(0 ), _rx_buffer(0 ) {
489
543
}
490
544
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 ) {
492
546
InterruptLock il;
493
547
494
548
// disable debug for this interface
@@ -499,7 +553,7 @@ void HardwareSerial::begin(unsigned long baud, byte config, byte mode) {
499
553
if (_uart) {
500
554
os_free (_uart);
501
555
}
502
- _uart = uart_start_init (_uart_nr, baud, config, mode);
556
+ _uart = uart_start_init (_uart_nr, baud, config, mode, use_tx );
503
557
504
558
if (_uart == 0 ) {
505
559
return ;
@@ -538,10 +592,22 @@ void HardwareSerial::end() {
538
592
_tx_buffer = 0 ;
539
593
}
540
594
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) {
542
608
if (_uart == 0 )
543
609
return ;
544
- uart_swap (_uart);
610
+ uart_set_pins (_uart, tx, rx );
545
611
}
546
612
547
613
void HardwareSerial::setDebugOutput (bool en) {
0 commit comments