@@ -101,10 +101,11 @@ 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, bool alternate_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, bool alternate_tx);
108
+ void uart_set_tx (uart_t * uart, bool alternate_tx);
108
109
109
110
void uart_ignore_char (char c);
110
111
void uart0_write_char (char c);
@@ -274,7 +275,7 @@ int uart_get_baudrate(uart_t* uart) {
274
275
return uart->baud_rate ;
275
276
}
276
277
277
- uart_t * uart_start_init (int uart_nr, int baudrate, byte config, byte mode) {
278
+ uart_t * uart_start_init (int uart_nr, int baudrate, byte config, byte mode, bool alternate_tx ) {
278
279
279
280
uart_t * uart = (uart_t *) os_malloc (sizeof (uart_t ));
280
281
@@ -289,8 +290,15 @@ uart_t* uart_start_init(int uart_nr, int baudrate, byte config, byte mode) {
289
290
uart->rxEnabled = (mode != SERIAL_TX_ONLY);
290
291
uart->txEnabled = (mode != SERIAL_RX_ONLY);
291
292
uart->rxPin = (uart->rxEnabled )?3 :255 ;
292
- uart->txPin = (uart->txEnabled )?1 :255 ;
293
- if (uart->rxEnabled ) pinMode (uart->rxPin , SPECIAL);
293
+ if (uart->rxEnabled ) {
294
+ if (alternate_tx) {
295
+ uart->txPin = 2 ;
296
+ pinMode (uart->rxPin , FUNCTION_4);
297
+ } else {
298
+ uart->txPin = 1 ;
299
+ pinMode (uart->rxPin , SPECIAL);
300
+ }
301
+ } else uart->txPin = 255 ;
294
302
if (uart->txEnabled ) pinMode (uart->txPin , SPECIAL);
295
303
IOSWAP &= ~(1 << IOSWAPU0);
296
304
break ;
@@ -299,7 +307,7 @@ uart_t* uart_start_init(int uart_nr, int baudrate, byte config, byte mode) {
299
307
uart->rxEnabled = false ;
300
308
uart->txEnabled = (mode != SERIAL_RX_ONLY);
301
309
uart->rxPin = 255 ;
302
- uart->txPin = (uart->txEnabled )?2 :255 ;
310
+ uart->txPin = (uart->txEnabled )?2 :255 ; // GPIO7 as TX not possible! See GPIO pins used by UART
303
311
if (uart->txEnabled ) pinMode (uart->txPin , SPECIAL);
304
312
break ;
305
313
case UART_NO:
@@ -360,40 +368,66 @@ void uart_uninit(uart_t* uart) {
360
368
os_free (uart);
361
369
}
362
370
363
- void uart_swap (uart_t * uart) {
371
+ void uart_swap (uart_t * uart, bool alternate_tx ) {
364
372
if (uart == 0 )
365
373
return ;
366
374
switch (uart->uart_nr ) {
367
375
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);
376
+ if (((uart->txPin == 1 || uart->txPin == 2 ) && uart->txEnabled ) || (uart->rxPin == 3 && uart->rxEnabled )) {
372
377
if (uart->txEnabled ){ // TX
373
- pinMode (1 , INPUT);
378
+ pinMode (uart-> txPin , INPUT);
374
379
uart->txPin = 15 ;
375
380
}
376
381
if (uart->rxEnabled ){ // RX
377
- pinMode (3 , INPUT);
382
+ pinMode (uart-> rxPin , INPUT);
378
383
uart->rxPin = 13 ;
379
384
}
385
+ if (uart->txEnabled ) pinMode (uart->txPin , FUNCTION_4); // TX
386
+ if (uart->rxEnabled ) pinMode (uart->rxPin , FUNCTION_4); // RX
387
+ IOSWAP |= (1 << IOSWAPU0);
380
388
} else {
381
- if (uart->txEnabled ) pinMode (1 , SPECIAL); // TX
382
- if (uart->rxEnabled ) pinMode (3 , SPECIAL); // RX
383
- IOSWAP &= ~(1 << IOSWAPU0);
384
389
if (uart->txEnabled ){ // TX
385
- pinMode (15 , INPUT);
386
- uart->txPin = 1 ;
390
+ pinMode (uart-> txPin , INPUT);
391
+ uart->txPin = (alternate_tx)? 2 : 1 ;
387
392
}
388
393
if (uart->rxEnabled ){ // RX
389
- pinMode (13 , INPUT); // RX
394
+ pinMode (uart-> rxPin , INPUT);
390
395
uart->rxPin = 3 ;
391
396
}
397
+ if (uart->txEnabled ) pinMode (uart->txPin , (alternate_tx)?FUNCTION_4:SPECIAL); // TX
398
+ if (uart->rxEnabled ) pinMode (3 , SPECIAL); // RX
399
+ IOSWAP &= ~(1 << IOSWAPU0);
392
400
}
393
401
394
402
break ;
395
403
case UART1:
396
- // current no swap possible! see GPIO pins used by UART
404
+ // Currently no swap possible! See GPIO pins used by UART
405
+ break ;
406
+ default :
407
+ break ;
408
+ }
409
+ }
410
+
411
+ void uart_set_tx (uart_t * uart, bool alternate_tx) {
412
+ if (uart == 0 )
413
+ return ;
414
+ switch (uart->uart_nr ) {
415
+ case UART0:
416
+ if (uart->txEnabled ) {
417
+ if (uart->txPin == 1 && alternate_tx) {
418
+ pinMode (uart->txPin , INPUT);
419
+ uart->txPin = 2 ;
420
+ pinMode (uart->txPin , FUNCTION_4);
421
+ } else if (uart->txPin == 2 && !alternate_tx) {
422
+ pinMode (uart->txPin , INPUT);
423
+ uart->txPin = 1 ;
424
+ pinMode (uart->txPin , SPECIAL);
425
+ }
426
+ }
427
+
428
+ break ;
429
+ case UART1:
430
+ // GPIO7 as TX not possible! See GPIO pins used by UART
397
431
break ;
398
432
default :
399
433
break ;
@@ -488,7 +522,7 @@ HardwareSerial::HardwareSerial(int uart_nr) :
488
522
_uart_nr(uart_nr), _uart(0 ), _tx_buffer(0 ), _rx_buffer(0 ) {
489
523
}
490
524
491
- void HardwareSerial::begin (unsigned long baud, byte config, byte mode) {
525
+ void HardwareSerial::begin (unsigned long baud, byte config, byte mode, bool alternate_tx ) {
492
526
InterruptLock il;
493
527
494
528
// disable debug for this interface
@@ -499,7 +533,7 @@ void HardwareSerial::begin(unsigned long baud, byte config, byte mode) {
499
533
if (_uart) {
500
534
os_free (_uart);
501
535
}
502
- _uart = uart_start_init (_uart_nr, baud, config, mode);
536
+ _uart = uart_start_init (_uart_nr, baud, config, mode, alternate_tx );
503
537
504
538
if (_uart == 0 ) {
505
539
return ;
@@ -538,10 +572,16 @@ void HardwareSerial::end() {
538
572
_tx_buffer = 0 ;
539
573
}
540
574
541
- void HardwareSerial::swap () {
575
+ void HardwareSerial::swap (bool alternate_tx) {
576
+ if (_uart == 0 )
577
+ return ;
578
+ uart_swap (_uart, alternate_tx);
579
+ }
580
+
581
+ void HardwareSerial::set_tx (bool alternate_tx) {
542
582
if (_uart == 0 )
543
583
return ;
544
- uart_swap (_uart);
584
+ uart_set_tx (_uart, alternate_tx );
545
585
}
546
586
547
587
void HardwareSerial::setDebugOutput (bool en) {
0 commit comments