1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-21 10:26:06 +03:00

HW Serial swap and pin setting work only on a few pins, return false on failure.

This commit is contained in:
Dirk O. Kaar 2021-03-28 21:57:46 +02:00
parent eedb009c6d
commit 2cf76ba784
3 changed files with 54 additions and 28 deletions

View File

@ -101,31 +101,31 @@ public:
return uart_get_rx_buffer_size(_uart); return uart_get_rx_buffer_size(_uart);
} }
void swap() bool swap()
{ {
swap(1); return swap(1);
} }
void swap(uint8_t tx_pin) //toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX bool swap(uint8_t tx_pin) //toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX
{ {
uart_swap(_uart, tx_pin); return uart_swap(_uart, tx_pin);
} }
/* /*
* Toggle between use of GPIO1 and GPIO2 as TX on UART 0. * Toggle between use of GPIO1 and GPIO2 as TX on UART 0.
* Note: UART 1 can't be used if GPIO2 is used with UART 0! * Note: UART 1 can't be used if GPIO2 is used with UART 0!
*/ */
void set_tx(uint8_t tx_pin) bool set_tx(uint8_t tx_pin)
{ {
uart_set_tx(_uart, tx_pin); return uart_set_tx(_uart, tx_pin);
} }
/* /*
* UART 0 possible options are (1, 3), (2, 3) or (15, 13) * UART 0 possible options are (1, 3), (2, 3) or (15, 13)
* UART 1 allows only TX on 2 if UART 0 is not (2, 3) * UART 1 allows only TX on 2 if UART 0 is not (2, 3)
*/ */
void pins(uint8_t tx, uint8_t rx) bool pins(uint8_t tx, uint8_t rx)
{ {
uart_set_pins(_uart, tx, rx); return uart_set_pins(_uart, tx, rx);
} }
int available(void) override; int available(void) override;

View File

@ -760,11 +760,11 @@ uart_uninit(uart_t* uart)
free(uart); free(uart);
} }
void bool
uart_swap(uart_t* uart, int tx_pin) uart_swap(uart_t* uart, int tx_pin)
{ {
if(uart == NULL) if(uart == NULL)
return; return false;
switch(uart->uart_nr) switch(uart->uart_nr)
{ {
@ -788,6 +788,7 @@ uart_swap(uart_t* uart, int tx_pin)
pinMode(uart->rx_pin, FUNCTION_4); //RX pinMode(uart->rx_pin, FUNCTION_4); //RX
IOSWAP |= (1 << IOSWAPU0); IOSWAP |= (1 << IOSWAPU0);
return true;
} }
else else
{ {
@ -808,6 +809,7 @@ uart_swap(uart_t* uart, int tx_pin)
pinMode(3, SPECIAL); //RX pinMode(3, SPECIAL); //RX
IOSWAP &= ~(1 << IOSWAPU0); IOSWAP &= ~(1 << IOSWAPU0);
return true;
} }
break; break;
case UART1: case UART1:
@ -816,13 +818,14 @@ uart_swap(uart_t* uart, int tx_pin)
default: default:
break; break;
} }
return false;
} }
void bool
uart_set_tx(uart_t* uart, int tx_pin) uart_set_tx(uart_t* uart, int tx_pin)
{ {
if(uart == NULL) if(uart == NULL)
return; return false;
switch(uart->uart_nr) switch(uart->uart_nr)
{ {
@ -834,12 +837,14 @@ uart_set_tx(uart_t* uart, int tx_pin)
pinMode(uart->tx_pin, INPUT); pinMode(uart->tx_pin, INPUT);
uart->tx_pin = 2; uart->tx_pin = 2;
pinMode(uart->tx_pin, FUNCTION_4); pinMode(uart->tx_pin, FUNCTION_4);
return true;
} }
else if (uart->tx_pin == 2 && tx_pin != 2) else if (uart->tx_pin == 2 && tx_pin != 2)
{ {
pinMode(uart->tx_pin, INPUT); pinMode(uart->tx_pin, INPUT);
uart->tx_pin = 1; uart->tx_pin = 1;
pinMode(uart->tx_pin, SPECIAL); pinMode(uart->tx_pin, SPECIAL);
return true;
} }
} }
@ -850,33 +855,54 @@ uart_set_tx(uart_t* uart, int tx_pin)
default: default:
break; break;
} }
return false;
} }
void bool
uart_set_pins(uart_t* uart, int tx, int rx) uart_set_pins(uart_t* uart, int tx, int rx)
{ {
if(uart == NULL) if(uart == NULL)
return; return false;
if(uart->uart_nr == UART0) // Only UART0 allows pin changes if(uart->uart_nr != UART0) // Only UART0 allows pin changes
return false;
if(uart->tx_enabled && uart->tx_pin != tx)
{ {
if(uart->tx_enabled && uart->tx_pin != tx) if( rx == 13 && tx == 15)
{ {
if( rx == 13 && tx == 15) if (!uart_swap(uart, 15))
return false;
}
else if (rx == 3 && (tx == 1 || tx == 2))
{
if (uart->rx_pin != rx)
{ {
uart_swap(uart, 15); if (!uart_swap(uart, tx))
return false;
} }
else if (rx == 3 && (tx == 1 || tx == 2)) else
{ {
if (uart->rx_pin != rx) if (!uart_set_tx(uart, tx))
uart_swap(uart, tx); return false;
else
uart_set_tx(uart, tx);
} }
} }
if(uart->rx_enabled && uart->rx_pin != rx && rx == 13 && tx == 15) else
uart_swap(uart, 15); return false;
} }
if (uart->rx_enabled && uart->rx_pin != rx)
{
if (rx == 13 && tx == 15)
{
if (!uart_swap(uart, 15))
return false;
}
else
return false;
}
return true;
} }

View File

@ -116,9 +116,9 @@ typedef struct uart_ uart_t;
uart_t* uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx_size, bool invert); uart_t* uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx_size, bool invert);
void uart_uninit(uart_t* uart); void uart_uninit(uart_t* uart);
void uart_swap(uart_t* uart, int tx_pin); bool uart_swap(uart_t* uart, int tx_pin);
void uart_set_tx(uart_t* uart, int tx_pin); bool uart_set_tx(uart_t* uart, int tx_pin);
void uart_set_pins(uart_t* uart, int tx, int rx); bool uart_set_pins(uart_t* uart, int tx, int rx);
bool uart_tx_enabled(uart_t* uart); bool uart_tx_enabled(uart_t* uart);
bool uart_rx_enabled(uart_t* uart); bool uart_rx_enabled(uart_t* uart);