|
23 | 23 | #include "soc/soc_caps.h"
|
24 | 24 | #include "soc/uart_struct.h"
|
25 | 25 |
|
| 26 | +#include "hal/gpio_hal.h" |
| 27 | +#include "esp_rom_gpio.h" |
| 28 | + |
26 | 29 | static int s_uart_debug_nr = 0;
|
27 | 30 |
|
28 | 31 | struct uart_struct_t {
|
@@ -69,6 +72,40 @@ static uart_t _uart_bus_array[] = {
|
69 | 72 |
|
70 | 73 | #endif
|
71 | 74 |
|
| 75 | +// IDF UART has no detach function. As consequence, after ending a UART, the previous pins continue |
| 76 | +// to work as RX/TX. It can be verified by changing the UART pins and writing to the UART. Output can |
| 77 | +// be seen in the previous pins and new pins as well. |
| 78 | +// Valid pin UART_PIN_NO_CHANGE is defined to (-1) |
| 79 | +// Negative Pin Number will keep it unmodified, thus this function can detach individual pins |
| 80 | +void uartDetachPins(uart_t* uart, int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin) |
| 81 | +{ |
| 82 | + if(uart == NULL) { |
| 83 | + return; |
| 84 | + } |
| 85 | + |
| 86 | + UART_MUTEX_LOCK(); |
| 87 | + if (txPin >= 0) { |
| 88 | + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[txPin], PIN_FUNC_GPIO); |
| 89 | + esp_rom_gpio_connect_out_signal(txPin, SIG_GPIO_OUT_IDX, false, false); |
| 90 | + } |
| 91 | + |
| 92 | + if (rxPin >= 0) { |
| 93 | + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rxPin], PIN_FUNC_GPIO); |
| 94 | + esp_rom_gpio_connect_in_signal(GPIO_FUNC_IN_LOW, UART_PERIPH_SIGNAL(uart->num, SOC_UART_RX_PIN_IDX), false); |
| 95 | + } |
| 96 | + |
| 97 | + if (rtsPin >= 0) { |
| 98 | + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rtsPin], PIN_FUNC_GPIO); |
| 99 | + esp_rom_gpio_connect_out_signal(rtsPin, SIG_GPIO_OUT_IDX, false, false); |
| 100 | + } |
| 101 | + |
| 102 | + if (ctsPin >= 0) { |
| 103 | + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[ctsPin], PIN_FUNC_GPIO); |
| 104 | + esp_rom_gpio_connect_in_signal(GPIO_FUNC_IN_LOW, UART_PERIPH_SIGNAL(uart->num, SOC_UART_CTS_PIN_IDX), false); |
| 105 | + } |
| 106 | + UART_MUTEX_UNLOCK(); |
| 107 | +} |
| 108 | + |
72 | 109 | // solves issue https://github.com/espressif/arduino-esp32/issues/6032
|
73 | 110 | // baudrate must be multiplied when CPU Frequency is lower than APB 80MHz
|
74 | 111 | uint32_t _get_effective_baudrate(uint32_t baudrate)
|
@@ -108,15 +145,16 @@ bool uartIsDriverInstalled(uart_t* uart)
|
108 | 145 |
|
109 | 146 | // Valid pin UART_PIN_NO_CHANGE is defined to (-1)
|
110 | 147 | // Negative Pin Number will keep it unmodified, thus this function can set individual pins
|
111 |
| -void uartSetPins(uart_t* uart, int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin) |
| 148 | +bool uartSetPins(uart_t* uart, int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin) |
112 | 149 | {
|
113 | 150 | if(uart == NULL) {
|
114 |
| - return; |
| 151 | + return false; |
115 | 152 | }
|
116 | 153 | UART_MUTEX_LOCK();
|
117 | 154 | // IDF uart_set_pin() will issue necessary Error Message and take care of all GPIO Number validation.
|
118 |
| - uart_set_pin(uart->num, txPin, rxPin, rtsPin, ctsPin); |
| 155 | + bool retCode = uart_set_pin(uart->num, txPin, rxPin, rtsPin, ctsPin) == ESP_OK; |
119 | 156 | UART_MUTEX_UNLOCK();
|
| 157 | + return retCode; |
120 | 158 | }
|
121 | 159 |
|
122 | 160 | //
|
|
0 commit comments